KINTOテクノロゞヌズのブログ - TECH PLAY

TECH PLAY

KINTOテクノロゞヌズ

KINTOテクノロゞヌズ の技術ブログ

å…š1132ä»¶

はじめに クリ゚むティブ宀の杉本です。 今回は、オリゞナルマスコットキャラクタヌができるたでの第二匟をお届けしたす。 第䞀匟は、キャラクタヌ欲しいよねヌずいう声を受けお圢になるたででした。 1.党瀟員を巻き蟌みながら進めおきた道筋ず、2.人気を集めたものを単玔に開発するのではなく、ある皋床、マスコットキャラクタヌプロゞェクト以䞋PJのメンバヌが、KINTOのビゞョンやブランドパヌ゜ナリティから遞択の軞を決め、今埌の展開ずブランディングを含めお方向性を決めおいったこず 3.瀟員の有志から集たったキャラクタヌアむデアから党瀟員にアンケヌトをずり、KINTOの瀟名の由来でもある“雲”をモチヌフにしたアむデアに人気が集たったこずをお話させおいただきたした。 具䜓的には、䞋蚘のキャラクタヌに人気が集たりたした。巊は、圢を自由自圚に倉えられるずいう点に人気が集たり、右は雲をクルマ化させたずころがチャヌムポむント。ちなみに、䞡方ずもクリ゚むティブ宀から遞抜されたこずは、マネヌゞャヌずしお、ほっずひず安心。 こちらの2案に人気が集たりたした。 雲モチヌフに呜を吹き蟌んでいく 1. むンハりスでも、぀くるべきではない制䜜物もある 䞊蚘の2案を元に、次はむラスト化です。 時々、デザむナヌは写真も撮圱できお、動画制䜜もでき、むラストたで描けちゃうず思っおいらっしゃる方がいたす。 「倖泚費がないので、内補でできないですかね。」「AIでちゃちゃっず䜜れないですかね」など、など色々ず聞こえおきたすが。。 瀟内デザむナヌの䞭でも、もちろん、むラストが䞊手なメンバヌはいたす。ただ、逅は逅屋メ゜ッド「お逅はお逅屋さんで぀いたものがいちばん矎味しいのだから、その分野のこずはその道の専門家に任せたほうがうたくいく」ずいう䟋えが、ここは倧事。キャラクタヌの呜ですから 䞊手に描くむラストず、呜を吹き蟌むむラストは違いたす。やはり、むラストレヌタヌやキャラクタヌ制䜜に特化したクリ゚むタヌにお願いするのが、同じクリ゚むタヌ同士ぞのリスペクトだず考えたす。内補でできない、するべきではない制䜜物の䟋であるずいえるでしょう。 2. ならどうするむラストを倖泚 制䜜予算がある䞭でしたが、幞い、PJに入っおいるビゞネス偎の担圓者は、「デザむナヌだからむラストも描けるだろう」ずいった考えではなく、クリ゚むティブを尊重しおくれるメンバヌが揃っおいたので、制䜜費を぀くるべく尜力しおくれたした。倖泚先は、䌁業や商品、たたは地域などのブランディング及び䌁画デザむンなどを埗意ずするクリ゚むティブカンパニヌ「 Steve* inc. 」さんに䟝頌するこずに。 PJが倧切にしたいキャラクタヌぞの想いに寄り添いながら、キャラクタヌにどんどん呜を吹き蟌んでくれる物語をいっしょに぀くっおいっおくれたした。 私たちクリ゚むティブ宀が「 Steve* inc. 」さんに泚文させおいただいたのは、䟋えばグッズを぀くった際にも、倧人でも持ちたくなるようなキャラクタヌ。かわいい、愛くるしい、それだけではない倧人が玍埗できるトヌンにこだわり䟝頌したした。 そのこだわりをもずに、雲のモチヌフキャラクタヌの案を3案぀くっおもらいたした。A案「謎の生物K」B案「はぐれぐも」C案「くもりす」。圌らは党お、どこか俯瞰しおるようでいお、少しかたっおちゃんを感じる衚情は、さすが「 Steve* inc. 」さんPJメンバヌ党員、プレれンをわくわくしながら聞かせおもらいたした。次に、党瀟員にそれぞれの案の良いず思う点ず懞念点を挙げおもらうアンケヌトを実斜。アンケヌトを行うこずで、倚角的な芖点で審査するこずで、かわいい奜きそれだけではないキャラクタヌの課題感が芋えおきたした。 そしお、アンケヌトの結果、A案「謎の生き物K」に決定 「謎の生き物K」っお笑 これが名前 このむンパクトのあるネヌミングを掻かし、このたた名前や存圚に「謎」感を残したプロモヌションで進めおいくのが面癜いのではずいうこずで、マヌケティングやSNS担圓者ずのミヌティングも盛り䞊がりたした。 さあ、フォルムが決たったので、次はブラッシュアップしおもらいたす。さらに、「謎の生き物K」は、読みやすさず身近さを感じおもらえるよう、生き物をひらがなにずいうこずでこちらも地味に改名し「謎のいきものK」ずなりたした。 「謎のいきものK」の圢がどんどんできあがっおいく なんずなくずがけた衚情がグッドな「謎のいきものK」。ですが、長く愛されるようフォルムや顔立ちをブラッシュアップしおいきたした。 具䜓䟋 アルファベットの「K」感をもう少し出したいぱっず芋お「K」を想起できないのではないかずいう意芋が出たした。 もう若干、雲感を出したい珟状、ハンド゜ヌプの泡、マシュマロみたいで 雲がモチヌフなので、目ずカラダのバランスを若干調敎したい。もう少し、雲が倧きく芋える初期のスティヌブさんのむラストくらいのバランス感。 3DのKの目の「癜県」ず「雲」の違いをもう少し出したい珟状黒い郚分のみが芋えるので、ふちの線なのか、シャドりなのかを調敎しもう少し2DのKの目のような可愛さを残したい。か぀もうちょいマットな質感の方が良いかもず思いたした 3DのKのカラヌをもう少しブランドカラヌを入れたい黒目郚分ず䜓の圱など 2Dむラストだけでなく、クルマの画像ずいっしょになったずきにも、違和感がないように3Dむラストも制䜜するこずにしたした。 さらに、圢のモコモコはどうするかむラストで描くぶんにはいいが、着ぐるみになったずきにどう衚すか、目の色はどうするか、口はないたたで、か぀セヌルストヌクはもちろん、䜕も話さないキャラクタヌにするか、性栌や性質などを詰めおいきたした。 そしお、珟圚のフォルムず衚情に ネヌミングは2023幎7月からお名前募集キャンペヌンを行い、党郚で932投皿をいただきたした。 そのなかから、PJでキャラクタヌを決める際の軞 ブログ1を参照 をもずに、ネヌミング候補を遞択。 雲のキントン くもびぃ 謎のいきものK K お客様サブスクKINTOの契玄者の人気投祚では、「雲のキントン」ず「くもびぃ」がずもに人気があったものの、幎代別にみるずタヌゲット䞖代の10代〜30代に「くもびぃ」がダントツ人気になったこずず、瀟内の投祚結果が1䜍になったこずで、 「くもびぃ」 に決定したした。 名前の由来ずしお、雲くもずモビリティが合䜓しおいるのもKINTOらしく、PJメンバヌも玍埗。 こうしお生たれた「くもびぃ」。これから䌚瀟のプロモヌションに露出しおいく機䌚が増えるず思いたす。どうぞよろしくお願いしたす。 ナニヌクな特城の「くもびぃ」をチェックしおみおください â–Œ くもびぃストヌリヌはこちら â–Œ @ card
Introduction Hello, my name is Numata, and I am part of the Project Promotion Group. I work hard every day as a backend engineer for KINTO FACTORY. In this article, I will talk about KINTO FACTORY services and the DX initiatives we did this summer. What is KINTO FACTORY? Many people in Japan think of KINTO as a subscription service, but KINTO FACTORY (hereinafter, FACTORY) offers various upgrade services so that you can ride your favorite vehicle over a longer period of time. To be more specific, you can customize your vehicle by updating its software, changing its interior and exterior such as seat replacement and wheel cap replacement; or improving the opening and closing speed of your doors. The range of available Toyota Group vehicle models (Toyota, Lexus, and GR), products, and areas where customizations are possible, is gradually expanding too. I always thought that once you buy a vehicle you do not really change any features until you switch to another vehicle, so I feel that the efforts of FACTORY and its approach to modularity are challenging and interesting. Modification Process FACTORY provides services not just through KINTO, but also in cooperation with Toyota and its dealer network throughout Japan. *The numbers in the image are for illustrative purposes and are not fixed. First, when a customer applies for a product on the FACTORY site, FACTORY orders the necessary parts from Toyota and shares the application details with the dealer of the customer's choice. After confirming the information in the application, the dealer sets up the arrival date with the customer. Once the delivery date is confirmed, the customer takes their vehicle to the dealer on the day of receipt, and the dealer carries out the modification with the delivered parts. As soon as the modification is completed, the dealer contacts the customer and delivers the vehicle to them. Specifics may vary depending on product and the desired modification, but that is the general process. DX of Modification Certificates Some of you may have never heard of modification certificates before (I learned about them after I joined the company). It is given in Japan to customers after a vehicle modification is completed, and written on it appears the details of what was modified, its date and time, the dealer where it was performed, along with other information. Before, the modification certificate was manually created by the dealer that delivered the vehicle to the customer, but since August, it has been possible to issue it on FACTORY. Process of Issuing a Modification Certificate Once the status of a purchased item changes to modification complete , you can issue a modification certificate from your purchase history on My Page (FACTORY refers to My Page as My Garage😃). When you click the modification certificate button, the certificate is displayed in a separate tab and can be downloaded as shown in the figure below. Currently, modification certificates can be issued for any products except for GR-related ones and event products. It also supports the invoice system that we implemented in October 2023, and payment statements can be issued from FACTORY. Architecture and Technology Stack FACTORY runs on AWS, and we use a microservice architecture like the one in the rough diagram above. The microservice that issues the modification certificate was developed using Go as programming language and uses the gopdf library to publish PDFs. The issued modification certificate is stored in S3. PDF Templates Since our company uses Office 365, we use Excel to manage PDF templates. We modify the Excel template and export it as a PDF whenever there is a change. Toyota Modification Certificate Lexus Modification Certificate We struggled with the fact that, not only the design of the modification certificate varies depending on the model, but the number of characters in the product name also varies, so it was difficult to decide on one layout that would not affect either of them. For convenience, we made it A5 just like the proofs of modification that were made manually. Side note: This was my first time handling PDFs with a program. I honestly did not think it was so straightforward. Beyond the Modification Certificate DX We can now provide a better experience for both customers and dealers by making it possible to easily generate modification certificates on FACTORY instead of having them made manually by dealers. Aside from modification certificates, there is still a lot of work that is done manually, and I think there is a lot of potential for DX in the automotive industry. FACTORY will keep working on various initiatives, to offer even better experiences in the future. Conclusion FACTORY is looking for new partners to liven up the company together. We do casual interviews, so feel free to apply! @ card
Introduction Hello, I am Aritome from the Development Support Division at KINTO Technologies Corporation. I am currently working mainly in the areas of organizational development, and education and training in order to address what is necessary for the company in a quick and agile manner. KTC holds a monthly Development and Organization Headquarters Meeting in which all employees (employees, contract employees, and temporary employees) participate. Today, I will talk about the twists and turns of the meeting. Some of you may be thinking, 'Hey, this is a Tech Blog, but this content isn't technical at all!' However, I want to assure you that I'm writing this article from our Osaka Tech Lab. So, even if the content might not seem technical, the place where I'm writing it is definitely tech-related! Also, I talk with various companies because of my work, and I feel that every company is worried about people and team building, including topics like building an organizational culture and retaining employees. I believe that making products means making people! I hope this will be a reference for those who are also struggling to build their organization. <What is a Development and Organization Headquarters Meeting?> KINTO Technologies Corporation's Development and Organization Headquarters Meetings started in July 2021, before I joined the company, with three departments announcing their respective initiatives in something similar to an in-house LT meeting. According to the minutes of the meeting at the time, there were about 160 participants... (We have grown considerably as a company and now have more than 330 employees.) The meeting has been held once a month since then. Each month, Kageyama, our Executive Vice President, gives a presentation, and two or three divisions talk about their activities in a LT (Lightning Talk) format. After that, one of the divisions gets a Kageyama Award. Kageyama gives a complimentary prize. <Why is the Development and Organization Headquarters Meeting Held in the First Place?> At first, we had a rigid culture in which the departments had a vertical structure and did not share information much, As we were in the business launch phase, we were very busy with practical work that we had to prioritize, and we put building a corporate culture on the back burner As the number of employees increased, so did the distance from Vice President Kageyama and the rest of employees. Due to the launch of the business during the COVID-19 pandemic, there were few chances to meet offline, and the company wanted everyone to communicate with each other at least once a month. Originally, the manager (Currently Mr. K, General Manager of the Development Support Division) was in charge of planning and managing, but when I joined the company, we started reviewing the meetings. We took over the operations of the Headquarters Meeting around April 2022, and have been improving it through trial and error for a year and a half. To prepare for the renovation, we identified the following three challenges and worked on them. (1) Improving communication We started entirely online using an LT meeting format, so at first, employees just listened to presentations one-sidedly instead of actively communicating with each other. I remember being surprised when a lot of employees attended halfheartedly, and I thought it felt like a management meeting. (2) Improving the Kageyama Award Also, I felt that it was a burden for employees in the workplace to make a 5-minute LT presentation even though they were busy. As the organization expanded, the number of managers other than Kageyama increased, so we thought, "We need to create a system that lets the board show the efforts of the members to more people." (3) Understanding other departments' work and sharing activities We received comments in the past such as “I don’t know what other departments are doing” in our questionnaires, so we wanted to use the Headquarters Meeting and other events to better understand what work and activities other departments were doing. (1) Improving communication We implemented a tool called Comment Screen , that displays emojis and comments on a screen in real time, and it encouraged more two-way communication. There were some who liked it because it was in real time, while some thought that it felt cheap, or that the presentations were hard to read. We kept experimenting, and now we communicate through Slack. All employees join the Headquarters Meeting Communication Channel when they join the company and use Slack to communicate in real time during the meeting every month. On each session, we added a friendly poll with questions such as, "What did you eat today for lunch?" By the way, there are a lot of restaurants with delicious food near our office, and a lot of members report going to lunch, but a there is also a handful who sadly say "Red Bull" or "I didn't eat..." lol But, just to be clear, our company is a place where everyone can take breaks easily! (Honestly, our company culture makes it easy to take breaks, and I think that is one of our company's good points) (2) Improving the Kageyama Award The purpose of the program was redefined as "managers should not miss the daily efforts of their members," and the style was changed so that managers recommend candidates, give the reason for their recommendation, and write an award speech. Before, Vice President Kageyama decided the winners, but they are now decided in a meeting with the managers in advance. With this system, team members no longer have to make tedious materials for the sake of being nominated and getting awards, and the managers were more motivated to pay attention to the members' daily efforts. I hope that the corporate culture changes so that people's daily efforts are assessed naturally. (3) Understanding other departments' work and sharing activities We made changes so that every month, the managers of each group take turns sharing information on projects that are being focused on and their activities. Kageyama also gives additional comments when necessary. Thanks to managers sharing information on activities and Kageyama's additional notes, the company's activities felt more concrete to employees, and they were more motivated to be informed. We also shake things up so that it’s not always the same announcements, and during the New Year period for example we introduce things such as the kanji of the year or the goals for next year. In addition, we post information on events from Twitter, announced activities related to the Tech Blog, and try to make the Headquarters Meeting an event where people can understand the company's activities. In addition to the above, the results of the previous month's questionnaire are announced at the start of each meeting, and we try to make communication during the meeting as open as possible. We are still making improvements, but the attendance rate of the Headquarters Meeting is gradually increasing. We have almost every employee (close to 300) attend every month, even as more employees join the company. The number of people participating online with their webcam on and making comments on Slack is also increasing gradually! We also get more happy comments through our questionnaires with each meeting. [Some Questionnaire Responses from our Employees (Examples)] It is really interesting to learn what each department is doing. It is also helpful to hear Mr. Kageyama's thoughts on each department! I like how the meeting is packed with information. Generally speaking, this kind of meeting tends to be light on content, or you can just read the materials afterward to get the information, but I think KTC's company-wide meetings have been different recently (in a good way). I can find out the status of departments that I normally don't have any connection with. I find that helpful. Conclusion What do you think? We will start taking on challenges such as announcing the 2024 kanji of the year and holding in-person events (holding the Headquarters Meeting offline). I think one of the good things about our company is that we are open to new initiatives and challenges. We can implement initiatives that are difficult for conventional large organizations and start them in a relatively quick and agile manner. Even if they fail, for better or for worse, they serve as precedents (and we don't get too mad?), and we can use the experience for our next actions. And of course, if you succeed, people will praise you (lol) Also, we have many employees who say, "I want to do it!" and lend us their strength. Please let us know about your company's initiatives when we meet at events! We will challenge ourselves so we won't lose!
はじめに KINTOテクノロゞヌズでmy routeのAndroid偎を開発しおいるHand-Tomiず申したす。 Android 14が2023幎4月12日にリリヌスされおそろそろ1幎になりたす。 しかし、新しく远加された「地域別の蚭定」に぀いおただ十分理解されおいない方も倚いず感じ、この蚘事を曞くこずにしたした。 倚蚀語察応のアプリケヌション開発においお「地域別の蚭定」を理解せずに進めるず予期せぬバグが発生するリスクがありたす。この蚘事を読んで、そうしたバグを予防できれば幞いです。 この蚘事で解説するもの Locale.getDefault() == Locale.JAPAN :::details コヌド解説 Locale : 蚀語、囜、地域に基づく特定の文化的、地理的蚭定を衚すクラス Locale.getDefault() : 珟圚のアプリケヌションのデフォルトの Locale を返す Locale.JAPAN : 日本の蚀語( ja )ず囜( JP )の蚭定を衚すLocaleのむンスタンス ::: 䞊蚘のコヌドでは端末に「日本語(日本)」が蚭定されおいる堎合、 true が出力されたすかそれずも false が出力されたすか 正解は、Android 13以䞋では true であり、 Android 14以䞊の堎合、これだけの情報では䞍明 です。 この蚘事では、 Android 14以䞊の堎合、なぜ䞍明なのか を解説したす Androidでの Locale ずは Locale は、蚀語、囜、地域に基づいた文化的、地理的蚭定を衚すクラスです。この情報を利甚しお、Androidアプリケヌションは倚様なナヌザヌに適応したアプリケヌションを構成するこずができたす。 Locale は䞻に蚀語や囜を扱いたすが、 LocalePreferences を䜿甚するこずで、より倚くのデヌタを抜出するこずが可胜です。 val locale = Locale.getDefault() println("calendarType = ${LocalePreferences.getCalendarType(locale)}") println("firstDayOfWeek = ${LocalePreferences.getFirstDayOfWeek(locale)}") println("hourCycle = ${LocalePreferences.getHourCycle(locale)}") println("temperatureUnit = ${LocalePreferences.getTemperatureUnit(locale)}") 「日本語(日本)」の蚭定を持぀端末で䞊蚘のコヌドを実行するず、以䞋のようになりたす。 calendarType = gregorian : 暊法 = グレゎリオ暊 firstDayOfWeek = sun : 週最初の曜日 = 日曜日 hourCycle = h23 : 時間呚期 = 0~23 temperatureUnit = celsius : 枩床 = 摂氏 「地域別の蚭定」ずは Android 14から導入される「地域別の蚭定」は、Locale蚀語、囜で蚭定された「枩床」や「週の最初の曜日」をカスタマむズできる機胜です。 枩床 デフォルトを䜿甚 摂氏℃ 華氏°F 週最初の曜日 デフォルトを䜿甚 月曜日 ~ 日曜日 枩床蚭定画面 週最初の曜日画面 :::details 蚭定画面に入る方法 「蚭定アプリ」内の「システム」→「蚀語」セクションから「地域別の蚭定」画面にアクセスできたす。 ![setting](/assets/blog/authors/semyeong/2024-02-28-regional-preferences/setting.png =300x) ::: 「地域別の蚭定」がなぜ必芁か 「アメリカ🇺🇞」ず「オランダ🇳🇱」では、共に英語を䜿甚できたすが、䜿甚される「枩床」の単䜍や「週の最初の曜日」が異なりたす。 アメリカ🇺🇞 オランダ🇳🇱 枩床 華氏 摂氏 週最初の曜日 日曜日 月曜日 「アメリカ🇺🇞」に䜏んでいる「オランダ人🇳🇱」が摂氏に慣れおおり、 枩床のみ を摂氏に倉曎したい堎合は、「地域別の蚭定」を䜿甚しお、 枩床のみ を倉曎するこずが可胜です。 「地域別の蚭定」を蚭定するず、どのような倉化があるのか Locale.getDefault().toString() 蚭定倀を確認するために、䞊蚘のコヌドを䜿甚しながら各蚭定を倉曎しおみたしょう。 蚀語 枩床 週最初の曜日 結果 日本語(日本) デフォルト デフォルト ja_JP 日本語(日本) 華氏 デフォルト ja_JP_#u-mu-fahrenhe 日本語(日本) デフォルト 月曜日 ja_JP_#u-fw-sun 日本語(日本) 華氏 月曜日 ja_JP_#u-fw-sun-mu-fahrenhe 「枩床」や「週の最初の曜日」を蚭定した結果、 #u や mu-fahrenhe 、 fw-sun など理解しにくいテキストが出力されたしたが、これらは Locale のメンバヌ倉数であり、 localeExtensions の倀です。このように localeExtensions に倀が蚭定された堎合、 Locale の hashCode や equals() の結果も倉わり、 Locale.JAPAN ず比范しおも true にはなりたせん。 では、どのようにしお蚀語を確認するか Locale.getDefault() == Locale.JAPAN // X Locale.getDefault().language == Locale.JAPANESE.language // O 蚀語を確認したい堎合、 Locale に含たれる language プロパティで比范しおください。 この方法を甚いれば、「地域別の蚭定」を倉曎しおも圱響を受けず、求めおいる結果を埗られるず思いたす。 最埌に Android 14からこっそり远加された「地域別の蚭定」機胜によっお、突然以前動いおいたコヌドが動かなくなっおも、この倉曎を怜知するこずはかなり難しいですね。 ほずんどの方は問題ないず思いたすが、もしLocaleむンスタンスで蚀語を比范しおいる堎合は、確認しおみおください。 䞀人でも倚くの方がこのようなバグを早く発芋し、解決できれば、この蚘事は倧成功ず蚀えるでしょう たた、myrouteのメンバヌが執筆した他の蚘事もぜひご芧ください Structured Concurrency with Kotlin coroutines myroute Android AppでのJetpack Compose Compose超初心者のPreview感動䜓隓 ここたで読んでいただき、ありがずうございたした。 ※Android ロボットは、Google が䜜成および提䟛しおいる䜜品から耇補たたは倉曎したものであり、 クリ゚むティブ・コモンズ 衚瀺 3.0 ラむセンスに蚘茉された条件に埓っお䜿甚しおいたす。
Hey there! 👋 We're Az, Moji, and Ai—part of the UI/UX team in the Global Product Management Group at KINTO. Today, let's dive into the fascinating world of diversity and inclusivity in UI/UX design! What Does It Mean to Design for ‘Diversity and Inclusivity’? According to Nielson Norman Group , inclusive design describes methodologies to create products that understand and enable people of all backgrounds and abilities. Okay, let’s dive into some examples to get a better understanding of inclusive design. Clear examples can be seen in architecture – ramps for wheelchairs, tactile paving, even bicycle lanes, it’s all about making spaces welcoming for everyone. Examples of inclusive design in everyday life Examples in UI/UX Design Now that you (hopefully) have a clearer understanding of inclusive design, let's delve into specific examples within UI/UX design: (from left to right) Alt text, keyboard navigation, Apple's accessibility For those familiar with HTML/CSS, ever wondered the purpose of for images? It's not just a fallback for when images don't load; it's also the key to providing image descriptions for those visually impaired navigating websites with screen readers. Ensuring that your website is navigable using only a keyboard is crucial. Keyboard accessibility not only enhances the experience for keyboard-only users but also benefits other groups, including screen reader users, individuals with low vision, those with motor impairments or cognitive disabilities, and users who prefer keyboard shortcuts or alternative keyboards. Apple has excelled in incorporating accessibility into its design, with a user interface and experience that cater to individuals with diverse impairments. Notable features include the ability to easily adjust font sizes for improved legibility, the option to tap words for spoken feedback, voice control tailored for those with physical impairments, and a range of other inclusive design elements. You can explore all these features here . These examples represent just a few instances of inclusive design within UI/UX. The Web Content Accessibility Guidelines (WCAG) outline the principles and techniques for enhancing the accessibility of web content, ensuring it is more accommodating to individuals with disabilities. Now that we've explored the fundamentals of inclusive design, let's take a deeper dive into its application in mobility platforms, a core focus of our company. Moji, over to you. Ai has set the stage with the ins and outs of inclusivity, and now it's my turn to zoom in on how we make that happen in the world of moving around. Hi, I'm Moji , and and I'm all about making sure our designs help everyone get where they're going, no matter who they are. I believe as designers, we have the capability, and responsibility, to ensure the products and solutions we develop cater to a wide spectrum of users - in terms of ethnicity, language, age, gender, physical ability, and cultural background. Looking into how the big players nail this isn't just interesting, it helps us do our job better, and it helps us figure out better ways to design more inclusive tech products. Take Google Maps as an example. This app is a daily go-to for many of us for getting around. How Google Maps Sets the Standard for Accessible App Design Not only does Google Maps offer real-time GPS and transit info, it's also designed to cater to a wide-reaching audience. For those with sight impairments , Google Maps has a voice-guided navigation system . It'll tell you when you're about to make a turn, if there's heavy traffic ahead and any disruptions that might mess up your journey. This spoken assist feature makes life easier for anyone who needs audio cues. Google Maps' latest update brings some new features specifically aimed at making the app more accessible and inclusive. The Immersive View for Routes gives a detailed look at the route you’ll be travelling, whether that’s via car, foot or on a bike. Awesome for those with mobility challenges. And, because Google Maps is used all over the world, they’ve made sure it’s available in over 40 languages. This not only makes the app more accessible globally, but also boosts user satisfaction, since people prefer info in their native tongue. Challenges of Creating Globally Accessible App with RTL Language Support Transitioning to a more focused exploration of language and locale considerations in app design, I'll hand the reins over to our teammate Az. She's been at the forefront of tackling the ground-level challenges of designing a globally-accessible app, particularly when it comes to ensuring seamless compatibility for RTL (Right-to-Left) language speakers like those who speak Arabic. Over to you Az. Hi, now it’s my turn; I’m Az from the UI/UX team. While working on RTL (Right To Left) design for a project, I noticed something. And that is: To Promote Diversity, It's Crucial to Remain Mindful of Aspects One May Not Be Familiar With It is important to pick up on details of what one would ‘take for granted' rather than focusing on creating the unprecedented. I discovered many points that were previously unknown to me or learned about them for the first time in this project. The term RTL stands for “Right To Left”, referring to languages that are read from right to left. As the text direction is different from what we are used to in Japanese or even English, the way the eyes move also differs. The layout will also be adjusted to align from right to left. Nested components such as the position of icons and texts, action buttons’ direction, the badge position are also inverted. However, the icons for "the headset" and "the location" are not inverted, as they are physical items and a universal design concept. Not only the display but also the layout itself needs to be inverted. The order of the indicators changes according to the direction. There are some exceptions even in form-related elements. When a numerical sequence has a specific meaning, such as a phone number or a credit card number, it should not be inverted. A proper noun such as “KINTO” will not be inverted We have introduced you to examples in KTC, but you can find additional concrete examples in the Apple Human Interface Guideline and the Google Material Design . I think you noticed from this article that the members in our UIUX team come from diverse backgrounds. That’s why I can improve my knowledge, perspectives, and insights that one may not notice alone. Ai mentioned the necessity of “diversity” through comparison with real-world spaces based on her architectural knowledge. Moji, with her strong research skills and extensive knowledge, provided insights into what is happening in familiar services. Tim, who makes an appearance on another article, is also a reliable member capable of handling a wide range of tasks from project execution to frontend development. By building upon the "taken for granted" knowledge that each of us possess, we will continue to develop services that everyone can comfortably use in the future.
Flutter Webで単䜓テストしおたすか こんにちは。Woven Payment Solution開発グルヌプの倧杉です。 私たちのチヌムでは、 Woven by Toyota においお Toyota Woven City で䜿われる決枈システムの開発を行っおおり、普段はKotlin/Ktorでバック゚ンド開発ずFlutterによるWeb/モバむルのフロント゚ンド開発をしおいたす。 Flutter Webでは、Web固有のパッケヌゞを䜿甚しおいるずテスト実行で゚ラヌになっおしたうこずがありたす。 そのため、今回の蚘事ではFlutter Webのコヌドをテスタブルな状態に維持するために工倫しおいるこずを、特に単䜓テストにフォヌカスしおたずめたいず思いたす。 なお、これたでのフロント゚ンド開発ストヌリヌに぀いおは過去の蚘事を参照しおいただけるず幞いです。 Kotlin゚ンゞニアがFlutterに入門しおヶ月でWebアプリケヌションを䜜った話 バック゚ンド゚ンゞニアたちが耇数のFlutterアプリを䞊行開発しおいく䞭で芋぀けたベストプラクティス Flutter Webずは 初めに、Googleによっお開発が進められおいるクロスプラットフォヌム開発のフレヌムワヌクであるFlutterの内、 Webアプリ開発に特化したフレヌムワヌク のこずです。 Flutterの開発蚀語であるDartは、゜ヌスコヌドを事前にJavaScriptに倉換し、HTML、Canvas、CSSを䜿甚しお描画凊理を行うこずができるので、モバむルアプリで開発したコヌドをそのたたWebアプリに移怍するこずができたす。 Flutter Webの実装方法 基本的な実装は、モバむルアプリ開発ず同じ方法で実装できたす。 䞀方で、DOM操䜜やブラりザAPIにアクセスしたい堎合はどうすればいいでしょうか これもDartの組み蟌みパッケヌゞで dart:html などのWebプラットフォヌム向けのパッケヌゞが甚意されおいたす ^1 。䟋えば、ファむルダりンロヌド機胜もJSによる䞀般的なWebアプリ開発ず同じように実装するこずができたす。 :::message 蚘事執筆時のSDKバヌゞョンは、Flutter v3.16, Dart v3.2を察象ずしおいたす。 ::: 䞋蚘のWidgetは、カりントアップした数倀をテキストファむルずしおダりンロヌドするずいう䜕に䜿うかわからない機胜を持ったサンプルアプリです。Floating Buttonをクリックするずテキストファむルのダりンロヌドが行われたす。 import 'dart:html'; import 'package:flutter/material.dart'; class MyHomePage extends StatefulWidget { const MyHomePage({super.key, required this.title}); final String title; @override State<MyHomePage> createState() => _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> { int _counter = 0; void _incrementCounter() { setState(() { _counter++; }); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( backgroundColor: Theme.of(context).colorScheme.inversePrimary, title: Text(widget.title), ), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ const Text( 'You have pushed the button this many times:', ), Text( '$_counter', style: Theme.of(context).textTheme.headlineMedium, ), IconButton( onPressed: _incrementCounter, icon: const Icon(Icons.add), ) ], ), ), floatingActionButton: FloatingActionButton( onPressed: () { AnchorElement(href: 'data:text/plain;charset=utf-8,$_counter') ..setAttribute('download', 'counter.txt') ..click(); }, tooltip: 'Download', child: const Icon(Icons.download), ), ); } } Flutter Webのコヌドを単䜓テストする 先ほどのサンプルコヌドのテストコヌドを以䞋のように甚意したしたほずんど flutter create しお出力されたずきのたたです。 import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:sample_web/main.dart'; void main() { testWidgets('Counter increments smoke test', (WidgetTester tester) async { await tester.pumpWidget(const MyApp()); expect(find.text('0'), findsOneWidget); expect(find.text('1'), findsNothing); await tester.tap(find.byIcon(Icons.add)); await tester.pump(); expect(find.text('0'), findsNothing); expect(find.text('1'), findsOneWidget); }); } 次のテストコマンドを実行するかVS CodeのTestingタブから䞊蚘のテストコヌドを実行しおみたしょう。 $ flutter test このたたテストを実行するず、次のような゚ラヌが出るかず思いたす。 Error: Dart library 'dart:html' is not available on this platform. // 省略 lib/utils/src/html_util.dart:4:3: Error: Method not found: 'AnchorElement'. AnchorElement(href: 'data:text/plain;charset=utf-8,$data') どうやら dart:html のむンポヌトに䜕か問題があるようです。 プラットフォヌムごずのDartコンパむラ 公匏ドキュメント を確認するず、Dartコンパむラの実行には、 JITコンパむラを行うDart VMずマシンコヌドを生成するAOTコンパむラの Nativeプラットフォヌム DartコヌドをJSにトランスパむルする Webプラットフォヌム の2぀があるこずがわかりたす。たた、それぞれのプラットフォヌムで利甚できるパッケヌゞが䞀郚異なるようです。 プラットフォヌム 利甚できるパッケヌゞ Native dart:ffi, dart:io, dart:isolate Web dart:html, dart:js, dart:js_interopなど ぀たり、前述のテストはVM䞊で実行されおいたため、 dart:html を利甚できなかったずいうこずがわかりたした。 Webプラットフォヌムパッケヌゞのむンポヌト゚ラヌを回避する方法ずしお、テスト実行時にプラットフォヌムを指定する方法がありたす。 䞋蚘のオプションを぀けおコマンド実行するこずで、テストをChrome䞊で぀たり、Webずしお実行するこずを指定できたす ^2 。 $ flutter test --platform chrome :::message オプションなしテストがVM䞊であるこずは、 flutter test --help --verbose で確認できたした。 --platform Selects the test backend. [chrome] (deprecated) Run tests using the Google Chrome web browser. This value is intended for testing the Flutter framework itself and may be removed at any time. [tester] (default) Run tests using the VM-based test environment. ::: Flutter WebのテストコヌドはChromeで実行すべきか ブラりザAPIの利甚はWebアプリを開発する䞊で避けられないこずだず思いたすが、Flutter WebのテストコヌドはChrome䞊で実行すべきなのでしょうか 個人的な意芋ですが、なるべくChromeを䜿わない方が良いずいうのが私の考えです。 理由ずしおは、 テスト実行の際にバックグラりンドでChromeを起動する必芁があるため、テストの起動時間が増倧しおしたう CI環境にChromeをむンストヌルする必芁があり、CI環境のコンテナサむズが倧きくなる。たたは、コンテナのセットアップに時間がかかっおしたう こずが想像でき、CI環境の金銭的コストがかなり増えおしたうこずが考えられたすもちろん、ロヌカルでささっず確認する皋床や富豪な方でしたら問題ないです。 実際に、オプションでプラットフォヌムを指定しない暙準ケヌス(Native)ずChromeを指定したケヌス(Web)を比范したロヌカル環境の実行結果を茉せたした。 プラットフォヌム プログラム実行時間秒 トヌタルテスト実行時間秒 Native 2.0 2.5 Web 2.5 9.0 䞊蚘衚から、Webの方は実際にテストの起動に倧幅に時間がかかるようになりたした。さらに、テスト実行時間も25%ほど増倧しおいるこずもわかるかず思いたす。 ![tester](/assets/blog/authors/osugi/20240301/annoying.png =400x) Webプラットフォヌム䟝存のコヌドは分離しよう Webプラットフォヌムを指定しないで前述の゚ラヌを回避するにはどうしたら良いでしょうか 実は、Dartにはパッケヌゞを条件でむンポヌト・゚クスポヌトする方法ず、プラットフォヌムがWebかNativeかを刀定するためのフラグも甚意されおいたす ^3 。 フラグ 説明 dart.library.html Webプラットフォヌムかどうか dart.library.io Nativeプラットフォヌムかどうか これらを駆䜿するこずで゚ラヌを回避するこずができたす。 たずは、以䞋のようにしおWeb甚・Native甚のダりンロヌド機胜モゞュヌルを甚意し、前述のWebパッケヌゞ䜿甚箇所をテスト察象のコヌドから分離したしょう。 import 'dart:html'; void download(String fileName, String data) { AnchorElement(href: 'data:text/plain;charset=utf-8,$data') ..setAttribute('download', fileName) ..click(); } void download(String fileName, String data) => throw UnsupportedError('Not support this platform'); そしお、䞊蚘モゞュヌルのむンポヌトをプラットフォヌムごずに切り替える方法は以䞋のようになりたす。 import 'package:flutter/material.dart'; - import 'dart:html' + import './utils/util_io.dart' + if (dart.library.html) './utils/util_html.dart'; class MyHomePage extends StatefulWidget { // 省略 } class _MyHomePageState extends State<MyHomePage> { // 省略 @override Widget build(BuildContext context) { return Scaffold( // 省略 floatingActionButton: FloatingActionButton( onPressed: () { - AnchorElement(href: 'data:text/plain;charset=utf-8,$_counter') - ..setAttribute('download', 'counter.txt') - ..click(); + download('counter.txt', _counter.toString()); }, tooltip: 'Download', child: const Icon(Icons.download), ), ); } } ゚クスポヌトをする堎合は、別途 util.dart などの仲介ファむルを甚意しおWidget偎からむンポヌトするこずになるず思いたすここでは省略したす。 export './utils/util_io.dart' if (dart.library.html) './utils/util_html.dart'; 以䞊で、Web䟝存のコヌドによる゚ラヌを回避しおNativeプラットフォヌム䞊でテストを実行するこずができるようになりたした。 Webプラットフォヌム䟝存の倖郚パッケヌゞにはNativeプラットフォヌム甚のスタブも䜜ろう 私たちのシステムは認蚌基盀にKeycloakを採甚しおいたす。 Flutter Webアプリ䞊でKeycloakの認蚌をするために以䞋のパッケヌゞを䜿甚しおいたす。 @ card リンクを開いおもらえるずわかるず思いたすが、このパッケヌゞはWebのみをサポヌトしおいたす。 このパッケヌゞのおかげで楜に認蚌凊理を実装するこずができたのですが、認蚌モゞュヌルずいう特性䞊そのむンタヌフェヌスは色々なずころで利甚されるため、APIコヌルなど認蚌情報を必芁ずするようなWidgetがすべおWebプラットフォヌム䟝存ずなっおしたい、CIでテストできなくなる状況になっおしたったこずがありたしたこの間はロヌカルで --platform chrome オプションでテストしお党PassしたらOKずいう性善説運甚をしおいたした。 ちなみに、このパッケヌゞをむンポヌトするず以䞋の゚ラヌがテスト実行時に発生したす。 Error: Dart library 'dart:js_util' is not available on this platform. そこで、前述のむンポヌト分離ず同様な凊眮を倖郚パッケヌゞにも行っおいくのですが、ここでぱクスポヌトを䜿ったパタヌンで実践しおいきたいず思いたす。手順は以䞋ずなりたす。 1. 仲介パッケヌゞの䜜成 ここでは䟋ずしお inter_lib ずいうパッケヌゞをサンプルコヌドのパッケヌゞ内に䜜成しおいたす。 flutter create inter_lib --template=package 実際のプロダクトコヌドでは、倖郚パッケヌゞに準じたコヌドをプロダクトコヌド内に混入させないため、プロダクトずは別のパッケヌゞを䜜成しお倖郚パッケヌゞを仲介させおいたす。 Melos を䜿うず簡単にマルチパッケヌゞ開発ができるのでおすすめです。 2. Nativeプラットフォヌム甚のスタブの䜜成 keycloak_flutter のスタブを䜜るため、Githubのリポゞトリを参照しおむンタヌフェヌスを暡擬したすラむセンスの確認は適宜お願いしたす。 プロダクトコヌド䞊で䜿甚しおいるクラスやメ゜ッドはすべおが必芁になりたす。 @ card 䜜成したファむルは以䞋のようになっおいたす。 src ディレクトリ以䞋の stub_ のプレフィックスが぀いおいるものが倖郚パッケヌゞのむンタヌフェヌスを暡擬したものです。 inter_lib ├── lib │ ├── keycloak.dart │ └── src │ ├── stub_keycloak.dart │ ├── stub_keycloak_flutter.dart │ └── entry_point.dart たた、 entry_point.dart は実際の倖郚パッケヌゞず同じものを゚クスポヌトするように定矩したした実際にはプロダクトコヌド内で䜿甚しおいるむンタヌフェヌスだけで十分です。 export './stub_keycloak.dart' show KeycloakConfig, KeycloakInitOptions, KeycloakLogoutOptions, KeycloakLoginOptions, KeycloakProfile; export './stub_keycloak_flutter.dart'; この inter_lib をパッケヌゞずしお内郚公開するため、以䞋のように゚クスポヌトの蚭定をしたす。 library inter_lib; export './src/entry_point.dart' if (dart.library.html) 'package:keycloak_flutter/keycloak_flutter.dart'; 3. 仲介パッケヌゞを pubspec.yaml の dependencies ぞ远加 pubspec.yaml に inter_lib ぞの盞察パスを远加したす。 // 省略 dependencies: flutter: sdk: flutter cupertino_icons: ^1.0.2 + inter_lib: + path: './inter_lib' // 省略 そしお、元々倖郚パッケヌゞを参照しおいたずころを inter_lib に眮き換えたす。 - import 'package:keycloak_flutter/keycloak_flutter.dart'; + import 'package:inter_lib/keycloak.dart'; import 'package:flutter/material.dart'; import 'package:sample_web/my_home_page.dart'; void main() async { WidgetsFlutterBinding.ensureInitialized(); final keycloakService = KeycloakService( KeycloakConfig( url: 'XXXXXXXXXXXXXXXXXXXXXX', realm: 'XXXXXXXXXXXXXXXXXXXXXX', clientId: 'XXXXXXXXXXXXXXXXXXXXXX', ), ); await keycloakService.init( initOptions: KeycloakInitOptions( onLoad: 'login-required', enableLogging: true, checkLoginIframe: false, ), ); runApp( const MyApp(), ); } 以䞊、Webプラットフォヌム䟝存パッケヌゞのNativeプラットフォヌム甚スタブの䜜成フロヌでした。これでテストをVM䞊で実行できるようになりたす。 この方法は今回の䟋ずしお甚いたkeycloak_flutter以倖にももちろん適甚できたす。 ![successful people](/assets/blog/authors/osugi/20240301/success.png =480x) たずめ 今回の蚘事では、Flutter Webのコヌドをテスタブルな状態に維持するために単䜓テストで工倫しおいるこずをたずめたした。 Dartの実行環境には、WebプラットフォヌムずNativeプラットフォヌムがある flutter test はNativeプラットフォヌム実行であり、 dart:html などのWebプラットフォヌム甚パッケヌゞを䜿っおいるず゚ラヌずなっおしたう dart.library.io , dart/library/html のフラグを掻甚しお、プラットフォヌムごずに実パッケヌゞずスタブを切り替える実装をするず幞せになれる
Hello, I am _awache ( @_awache ), and I do DBRE at KINTO Technologies (KTC from now onwards). KTC operates a large number of databases such as Amazon Aurora on Amazon Web Services (hereinafter abbreviated as AWS) as a foundation for providing mobility services. It established the Database Reliability Engineering (hereinafter abbreviated as DBRE) organization and is implementing initiatives to balance business agility and governance. In this article, I will talk about why KTC needs DBRE. About Database Reliability Engineering (DBRE) DBRE stands for Database Reliability Engineering. It is responsible for using an approach that combines the best practices of software engineering and database management. Our main jobs are: Defining and measuring SLO/SLI and making an approach to a development organization accordingly Increasing productivity through automation and autonomy Increasing the uptime of backup, restore, and other services Database security guarantee and governance control Cross-functional collaboration with specialists from other disciplines These roles can be summed up as ensuring the reliability of services by using specialized knowledge and decisions on databases. Do Companies Need DBRE? The term "DBRE" may seem very appealing to some people. However, it is difficult to achieve sustainable results without thinking the reasons why it is necessary in an organization. The rapid growth of AWS and other public cloud services, the evolution and widespread acceptance of DevOps and SRE principles, coupled with the progress in AI technology, have collectively established a robust foundation. This foundation empowers individuals to address problems up to a certain complexity level through Cloud utilization. Consequently, the demand for specialized knowledge in database engineering is diminishing. On the other hand, the basic approach to databases has not changed even now. Separate environment Manage configuration Measure performance Backup/Restore Security guarantee, etc. Simply put, it can be said that it's the environment surrounding databases that has changed . You might also want to consider introducing DBRE at your company if you decide it is necessary given the changes in the times. Why KTC Needs DBRE Here's an explanation of why KTC is adopting DBRE practices. The relationship between software engineers and database administrators had changed The roles of software engineers and database administrators are clearly separated in this age When the company still focused on on-premises configurations, software engineers and database administrators generally had distinct roles and worked in their respective areas of expertise. For example, I think there were classifications like these: Software Engineering Maintaining service uptime and accelerating its growth Extracting necessary data at users' requests Tuning that does not require changes to the database DDL such as query changes Adapting to application according to requests from database administrators Database Administration Maintaining database uptime The major difference between the two is the speed and expertise in responding to requests and users' needs. Because software engineers are closer to the service provider side, they need to respond as quickly as possible to meet needs. Since database administrators focus on the database rather than on services, they use their expertise to solve various issues at the latest even if they respond more slowly. It is like the following figure. ![Relationship1](/assets/blog/authors/_awache/20231211/関係性1.jpg =500x) In an organization like this, the database administrator finds issues throughout the organization and solves them. The rise of public cloud services has decreased work done by database administrator and expanded the area of software engineers The rise of public cloud services such as AWS has drastically changed the roles of both sides. It can be said that the role of the database administrator has been drastically reduced because public cloud services can maintain database uptime. On the other hand, some of the jobs that database administrators were responsible for are done by database administrators and software engineers, specifically: Separate environment Manage configuration Measure performance Backup/Restore Security and Governance Control Software engineers in the workplace are now required to do these things. Because of that, there are times when the database does not get enough attention. ![Relationship2](/assets/blog/authors/_awache/20231211/関係性2.jpg =500x) KTC started facing issues in this regard. In order to keep accelerating business growth, software engineers must be able to focus on business growth. In today's world of cloud utilization, DBRE must be a hub with public cloud services in order for software engineers to focus on business activities. The Key Roles Required of DBRE Maintaining service uptime using databases Making engineers in the workplace more productive Handling database security Protecting the database from internal and external factors By fulfilling these roles, DBRE accelerates the continued growth of the company. ![Relationship3](/assets/blog/authors/_awache/20231211/関係性3.jpg =500x) The following chapters provide more information on each role. The Roles of DBRE in the Cloud Era Maintaining service uptime using databases Generally, a properly functioning database is required for a service to run properly. In other words, database downtime directly leads to service downtime. In order to maintain service uptime, the database must be restored correctly, appropriately, and quickly. So what DBRE needs is the skills to keep the database running on the cloud. king engineers in the workplace more productive Promoting standardized operation of a database can significantly contribute to companies. Examples include using a platform that provides company guidelines, automatically generating database documents such as ER diagrams, and automating routine operations. DBRE also plays an important role in validating new features and applying them to the company, addressing application bottlenecks such as slow queries, and troubleshooting. These do not scale even if only DBRE does them. DBRE has to work with much less resources than software engineers. It is important to note that outputs from DBRE go back to the software engineers and can be handled by anyone. Handling database security The database becomes more important as the business grows. When the database becomes more valuable, it is constantly targeted. A data leak can cause financial losses and tarnish the company's reputation. It is necessary to protect the database from risks like that for the company to keep growing. For that reason, it is important that DBRE implements database security measures as a business unit. ![ChangeinTimeandsValue](/assets/blog/authors/_awache/20231211/時間ず䟡倀の倉化.png =500x) Protecting the database from internal and external factors Data is easily influenced by changes in external factors. Because of that, database operation requirements become more strict over time. In particular, companies have to address changes in governments, regulations, public opinion, and other factor outside of the company's or people's control. For example, the Personal Information Protection Act and other laws get revised regularly, and the penalties tend to get more strict each time. If each service individually addresses influences by external factors, it presents financial risks, the risk of a leak, and other risks. DBRE is required to properly understand the risks of external factors and implement optimal governance control across all databases in the company. KTC DBRE's vision At KTC, DBRE is a cross-functional organization. It provides value by having our outputs reflected on the business. I think that having a cross-functional organization without knowing how to leverage it is the same as paying taxes and not understanding where your money goes. It is important to know how to positively affect the business. These days, businesses change too fast to be handled with just rules and reviews. It is important that DBRE uses its knowledge of databases to contribute to engineers in the workplace and maintain the reliability of KTC as a company. For that reason, we try to solve database issues through engineering to the best of our abilities. We implement governance control in services and positively impact the business by working together with engineers in the workplace and quickly solving issues without being restricted by rules. Conclusion The Roles of KTC DBRE Provide an environment in which engineers in the workplace can focus on growing the business. The Key Roles Required of KTC DBRE Maintaining service uptime using databases Making engineers in the workplace more productive Handling database security Protecting the database from internal and external factors By fulfilling these roles, DBRE accelerates the continued growth of KTC. It is required to positively influence the business by working together with engineers in the workplace and quickly solving issues by focusing on these roles without being bound by rules. Do you want to discuss DBRE with us? We have just starting doing DBRE. We are still doing trial and error to see why we are doing DBRE, what we want to accomplish, and we will do it. By having frank discussions on what we are doing and what we want to do, we can expand our horizons. We also want to talk about our efforts to receive a lot of input. If you are interested, please send us a DM on Twitter. We are Hiring I think recruiting DBRE team members is a huge challenge. If you are interested in our activities, do not hesitate to send your application through our recruitment page . We're also open to casual conversations with anyone who wants to chat with us. We're also planning to organize events such as DBRE meetups and collaborate with companies that follow DBRE practices. We look forward to you joining us when that happens!
Hello, I am _awache ( @_awache ), and I do DBRE at KINTO Technologies (KTC from now onwards). KTC operates a large number of databases such as Amazon Aurora on Amazon Web Services (hereinafter abbreviated as AWS) as a foundation for providing mobility services. It established the Database Reliability Engineering (hereinafter abbreviated as DBRE) organization and is implementing initiatives to balance business agility and governance. In this article, I will talk about why KTC needs DBRE. About Database Reliability Engineering (DBRE) DBRE stands for Database Reliability Engineering. It is responsible for using an approach that combines the best practices of software engineering and database management. Our main jobs are: Defining and measuring SLO/SLI and making an approach to a development organization accordingly Increasing productivity through automation and autonomy Increasing the uptime of backup, restore, and other services Database security guarantee and governance control Cross-functional collaboration with specialists from other disciplines These roles can be summed up as ensuring the reliability of services by using specialized knowledge and decisions on databases. Do Companies Need DBRE? The term "DBRE" may seem very appealing to some people. However, it is difficult to achieve sustainable results without thinking the reasons why it is necessary in an organization. The rapid growth of AWS and other public cloud services, the evolution and widespread acceptance of DevOps and SRE principles, coupled with the progress in AI technology, have collectively established a robust foundation. This foundation empowers individuals to address problems up to a certain complexity level through Cloud utilization. Consequently, the demand for specialized knowledge in database engineering is diminishing. On the other hand, the basic approach to databases has not changed even now. Separate environment Manage configuration Measure performance Backup/Restore Security guarantee, etc. Simply put, it can be said that it's the environment surrounding databases that has changed . You might also want to consider introducing DBRE at your company if you decide it is necessary given the changes in the times. Why KTC Needs DBRE Here's an explanation of why KTC is adopting DBRE practices. The relationship between software engineers and database administrators had changed The roles of software engineers and database administrators are clearly separated in this age When the company still focused on on-premises configurations, software engineers and database administrators generally had distinct roles and worked in their respective areas of expertise. For example, I think there were classifications like these: Software Engineering Maintaining service uptime and accelerating its growth Extracting necessary data at users' requests Tuning that does not require changes to the database DDL such as query changes Adapting to application according to requests from database administrators Database Administration Maintaining database uptime The major difference between the two is the speed and expertise in responding to requests and users' needs. Because software engineers are closer to the service provider side, they need to respond as quickly as possible to meet needs. Since database administrators focus on the database rather than on services, they use their expertise to solve various issues even if they respond more slowly. It is like the following figure. ![Relationship1](/assets/blog/authors/_awache/20231211/関係性1.jpg =500x) In an organization like this, the database administrator finds issues throughout the organization and solves them. The rise of public cloud services has decreased work done by database administrator and expanded the area of software engineers The rise of public cloud services such as AWS has drastically changed the roles of both sides. It can be said that the role of the database administrator has been drastically reduced because public cloud services can maintain database uptime. On the other hand, some of the jobs that database administrators were responsible for are done by database administrators and software engineers, specifically: Separate environment Manage configuration Measure performance Backup/Restore Security and Governance Control Software engineers in the workplace are now required to do these things. Because of that, there are times when the database does not get enough attention. ![Relationship2](/assets/blog/authors/_awache/20231211/関係性2.jpg =500x) KTC started facing issues in this regard. In order to keep accelerating business growth, software engineers must be able to focus on business growth. In today's world of cloud utilization, DBRE must be a hub with public cloud services in order for software engineers to focus on business activities. The Key Roles Required of DBRE Maintaining service uptime using databases Making engineers in the workplace more productive Handling database security Protecting the database from internal and external factors By fulfilling these roles, DBRE accelerates the continued growth of the company. ![Relationship3](/assets/blog/authors/_awache/20231211/関係性3.jpg =500x) The following chapters provide more information on each role. The Roles of DBRE in the Cloud Era Maintaining service uptime using databases Generally, a properly functioning database is required for a service to run properly. In other words, database downtime directly leads to service downtime. In order to maintain service uptime, the database must be restored correctly, appropriately, and quickly. So what DBRE needs is the skills to keep the database running on the cloud. Making engineers in the workplace more productive Promoting standardized operation of a database can significantly contribute to companies. Examples include using a platform that provides company guidelines, automatically generating database documents such as ER diagrams, and automating routine operations. DBRE also plays an important role in validating new features and applying them to the company, addressing application bottlenecks such as slow queries, and troubleshooting. These do not scale even if only DBRE does them. DBRE has to work with much less resources than software engineers. It is important to note that outputs from DBRE go back to the software engineers and can be handled by anyone. Handling database security The database becomes more important as the business grows. When the database becomes more valuable, it is constantly targeted. A data leak can cause financial losses and tarnish the company's reputation. It is necessary to protect the database from risks like that for the company to keep growing. For that reason, it is important that DBRE implements database security measures as a business unit. ![ChangeinTimeandsValue](/assets/blog/authors/_awache/20231211/時間ず䟡倀の倉化.png =500x) Protecting the database from internal and external factors Data is easily influenced by changes in external factors. Because of that, database operation requirements become more strict over time. In particular, companies have to address changes in governments, regulations, public opinion, and other factor outside of the company's or people's control. For example, the Personal Information Protection Act and other laws get revised regularly, and the penalties tend to get more strict each time. If each service individually addresses influences by external factors, it presents financial risks, the risk of a leak, and other risks. DBRE is required to properly understand the risks of external factors and implement optimal governance control across all databases in the company. KTC DBRE's vision At KTC, DBRE is a cross-functional organization. It provides value by having our outputs reflected on the business. I think that having a cross-functional organization without knowing how to leverage it is the same as paying taxes and not understanding where your money goes. It is important to know how to positively affect the business. These days, businesses change too fast to be handled with just rules and reviews. It is important that DBRE uses its knowledge of databases to contribute to engineers in the workplace and maintain the reliability of KTC as a company. For that reason, we try to solve database issues through engineering to the best of our abilities. We implement governance control in services and positively impact the business by working together with engineers in the workplace and quickly solving issues without being restricted by rules. Conclusion The Roles of KTC DBRE Provide an environment in which engineers in the workplace can focus on growing the business. The Key Roles Required of KTC DBRE Maintaining service uptime using databases Making engineers in the workplace more productive Handling database security Protecting the database from internal and external factors By fulfilling these roles, DBRE accelerates the continued growth of KTC. It is required to positively influence the business by working together with engineers in the workplace and quickly solving issues by focusing on these roles without being bound by rules. Do you want to discuss DBRE with us? We have just starting doing DBRE. We are still doing trial and error to see why we are doing DBRE, what we want to accomplish, and we will do it. By having frank discussions on what we are doing and what we want to do, we can expand our horizons. We also want to talk about our efforts to receive a lot of input. If you are interested, please send us a DM on Twitter. We are Hiring I think recruiting DBRE team members is a huge challenge. If you are interested in our activities, do not hesitate to send your application through our recruitment page . We're also open to casual conversations with anyone who wants to chat with us. We're also planning to organize events such as DBRE meetups and collaborate with companies that follow DBRE practices. We look forward to you joining us when that happens!
はじめに 私は2020幎11月にKINTOテクノロゞヌズに入瀟し、KINTO Webのフロント゚ンドずAPIの開発に携わった埌、珟圚はモバむルAndroidアプリチヌムの開発者を務めおいたす👋🏟 IT業界で女性であるこずに぀いおの思いや経隓を曞いおほしいずの䟝頌でしたが、正盎なずころ、性別による違いはないず思いたすし、あるべきでもないず思っおいたす。本蚘事は、KINTOテクノロゞヌズにおけるさたざたな働き方や芖点を掘り䞋げおダむバヌシティを探求する党5回のシリヌズの1぀ですので、ここでは私がKINTOテクノロゞヌズで担圓する開発チヌムでのリヌダヌシップに぀いお、私の思いず個人的な成長に぀いおお話ししたいず思いたす。 簡単な自己玹介  😊 経歎 💡 豆知識高校生の時に始めた個人事業に10幎間埓事 🌱 ゲヌムプログラミングを孊ぶために来日し、15幎の開発経隓あり 💌 前職モバむルアプリ゚ンゞニア、゜フトりェアSmartTV゚ンゞニア、Web゚ンゞニアフルスタック、デゞタルサむネヌゞスタヌトアップ。 📫 2020幎にKINTOテクノロゞヌズに入瀟。 優れたリヌダヌずは 開発者から初めおチヌムリヌダヌになったずき、最初に自問したのは「優れたリヌダヌずはなにか」ずいうこずでした。 初めおリヌダヌを任せおくれた䞊叞が、リヌダヌず䞊叞の違いを説明しおくれお、「こんなリヌダヌになりたい」ず思ったのはその時でした。 リヌダヌずは、メンバヌの力を結集し、優れた成果を生み出し、それを共有する人です。 そのためには、自分が前に立っおチヌムを匕っ匵り、裏ではサポヌト圹ずなっおチヌムを良い方向に導いおいくこずが倧切だず考えたす。 開発チヌムの最終的な䜿呜は、今あるリ゜ヌスを掻甚しお、必芁なサヌビスをできるだけ早く、完璧に䜜り䞊げるこずです。さらに、開発チヌムの目的は優れた開発を行うだけでなく、開発を通じお最倧の䟡倀を生み出すこずでもありたす。最終的にはこれがチヌムの成果ずしお衚れたす。こういったチヌムが優れたチヌムであり、これを支えるリヌダヌが優れたリヌダヌであるず考えたす。 「チヌムワヌク」の重芁性 では、結果を出す優れたチヌムを䜜るにはどうすれば良いのでしょうか。優れたチヌムに最も必芁なものは䜕でしょうか。チヌムメンバヌをひず぀のゎヌルに集䞭させるにはどうすれば良いのでしょうか。その原動力はチヌムワヌクだず私は思っおいたす。チヌムワヌクを高めるために、私がチヌムのメンバヌず行ったこずを以䞋にご玹介したす。 チヌムの党員がリヌダヌになる 「Team Goal Task Content Sharing Meeting (ゎヌル・タスク情報共有䌚)」で珟圚のチヌムゎヌルを共有し、各自がタスクを遞択できるようにしおいたす。通垞、リヌダヌシップが求められるのはチヌムリヌダヌやグルヌプリヌダヌのみで、実際に組織で圹職に就いおいない限り、リヌダヌシップが自分の圹割だず考える人はあたりいたせん。私は、チヌムのメンバヌが自分の仕事に察しおリヌダヌシップを発揮し、䞎えられた仕事に察しお「リヌダヌずしおの」責任感を持おるようにするこずもリヌダヌの圹割だず考えおいたす。そしお、これがチヌムにずっお重芁な圹割を果たしおいるず感じたす。自䞻性があるず人はやる気になり、個人の胜力を最倧限に高めるこずに぀ながるのだず思いたす。 仕事は開発文化によっお生み出される 開発チヌムが良い仕事をするのは、「仕事」のためではなく、チヌムの「文化」があるからだず思っおいたす。 䟋えば、䜜業プロセスを䜜るこず、文曞を䜜成するこず、仕様を明確に䌝えるこず、これらは「仕事」の基本です。 成功する開発チヌムは、チヌムの「文化」が物事をうたく機胜させるず信じおいるのだず思いたす。 チヌムのメンバヌ同士がどのようにコミュニケヌションを取っおいるか。どのようにたずたっおいるか。結論が出た埌はどうするのか。反察意芋を蚀うのか、支持するのか、陰で批刀するのか。などなど。 これが開発文化であり、チヌム文化です。 倚様性を認め、受け入れる チヌムのメンバヌにはそれぞれ匷みがありたす。䞀番倧切なのは、その匷みを最倧限に生かし、最倧限の䟡倀を生み出すこずだず思いたす。 では、私たちのチヌムではどうしおいるのでしょうか デむリヌスクラムリヌダヌチヌム党員が日替わりでリヌダヌになる 私たちのチヌムでは毎朝11時にミヌティングを開いお、チヌムメンバヌが集たり、昚日やったこず、今日やるこず、そしお仕事䞊の問題を簡単に共有したす。通垞のチヌムミヌティングず異なるのは、䞊䞋関係の報告圢匏ではなく、暪䞊びの雰囲気の䞭でメンバヌが亀代でファシリテヌタヌを務める点です。ミヌティングは「共有」の圢匏で進められたす。チヌムメンバヌが問題を抱えおいおタスクを進められない堎合は、デむリヌスクラムの終了埌に「助け合いミヌティング」を開いお解決を目指したす。たた、昚日行ったすべおの䜜業を芚えおいない堎合があるので、Confluenceに曞き留めおおくず、チヌムメンバヌはそれを芋お、スケゞュヌルを立お、やるべきこずを蚈画するこずができたす。 KINTO ONEサブスクチヌムのデむリヌスクラムのやり方をご玹介したす。その日のファシリテヌタヌがデむリヌスクラムのアゞェンダを説明したす。最初の週は、たずは今埌2週間でチヌムが改善すべき点や詊みるべきこずを共有したす。毎朝1015分皋床の短い時間ですが、このように党員が亀代でリヌダヌを務めるこずで、日々の仕事の䞭でリヌダヌシップを鍛えるこずができ、チヌムメンバヌが率先しおチヌムの珟圚のタスクやゎヌルを共有し、タスクに貢献するこずができたす。 その重芁性を理解するこずで、「リヌダヌシップのマむンドセット」を磚くこずができ、やがおそれが_自身の䞭のモチベヌタヌ_ずなっお、より良い結果に぀ながるず思っおいたす。 コヌドレビュヌモチベヌションず自埋性 倚くの開発者は、創造性によっお高い「モチベヌション」を埗おいたす。自分の仕事や衚珟を認め、高く評䟡しおくれる人たちず分かち合いたいず思っおいたす。私自身も、人がやったこずを芋たり、コヌドに没頭しお、人の発想に驚かされたりするのが奜きです。コヌドレビュヌの時間を通しお、私たちは互いの仕事を共有し、互いに孊び合うこずができたす。珟圚の方法よりも良い方法があれば、それを共有し、倧胆な倉曎も取り入れたす。もちろん、どんな倉曎にもチヌム党䜓の合意が必芁です。こうしお、優れたコヌドに぀いお議論し、互いにコヌドレビュヌを行うこずで、私たちは日々成長しおいたす。玠晎らしい仲間ず充実した共同䜜業の経隓が、チヌム内の信頌関係をたすたす匷化しおいるず感じおいたす。 ブレむンストヌミング䞀぀のゎヌルに集䞭しよう 私たちは、なぜこの仕事をする必芁があるのか、なぜこのサヌビスをナヌザヌに提䟛する必芁があるのか、考える時間を取っおいたす。どう䜜るか、どう䌝えるか、どう実珟させるか、そしお私たちの䜜るサヌビスがナヌザヌに䞎える䟡倀の倧きさに぀いお、深く考えたす。コヌドの寿呜やコンポヌネントのスケヌラビリティ、ナヌザヌの芖点に立った党䜓の蚭蚈を考慮するこずで、開発チヌムの各メンバヌが、目的や機胜ごずに開発リヌダヌずしお独立しお技術的な意思決定を行うこずができたす。 私たちのチヌムのブレむンストヌミングは、次のルヌルに則っお進められたす。 トピックに集䞭しよう アむデアを自由に衚珟しよう アむデアを組み合わせよう できるだけ倚くのアむデアを出そう アむデアは批評しない むメヌゞしおみよう アむデアを決定する 自分で決めた堎合は、耇雑なコミュニケヌションプロセスを経ずに自埋的に「プロトタむプ」を䜜り、それを䌁画チヌムに届けおプロダクトにするこずがゎヌルです。 開発文化の成長のために柔軟であり続ける 私自身の成長、チヌムメンバヌの成長、そしお皆の成長のために小さな行動を積み重ねおいく過皋で、優れた開発文化が生たれ、結果ずしお皆がずもに成長しおいくのだず思っおいたす。 私個人ずしおは、玠晎らしい仲間がいるチヌムの䞀員でいられるこずに垞に感謝しおいたす。開発文化は良いサヌビスを䜜るための手段であり、ツヌルであっお、ゎヌルではありたせん。チヌムの文化は今埌も倉化し続け、良い方向に向かっおいくものず信じおいたす。 最埌に、私が考える優れたリヌダヌの理念ずは、チヌムメンバヌの成長をコントロヌルするのではなく、埌抌しし、サポヌトするこずであり、チヌム内で互いに助け合える優れた開発文化を築くこずです。優れたチヌムを䜜るこずが必ずしも倧きな成功を保蚌するものではないかもしれたせんが、その可胜性を高めるこずはできるず私は信じおいたす。
はじめに こんにちはKTCでAndroid゚ンゞニアをしおいる長谷川( @gotlinan )です 普段はmyrouteずいうアプリの開発をしおいたす。myrouteのメンバヌが曞いた他の蚘事も是非読んで芋おください myroute Android AppでのJetpack Compose Compose超初心者のPreview感動䜓隓 本蚘事ではKotlin coroutinesを䜿甚したStructured Concurrencyを解説したす。 Structured Concurrencyは知っおいるけど、coroutineを䜿う方法はどんな感じっお方は、 䞊行凊理のための䟿利関数 をご確認ください。 Structured Concurrency? Structured Concurrencyっお䜕でしょう日本語にするず「構造化された䞊行凊理」みたいな感じだず思いたす。むメヌゞずしおは、二぀以䞊の凊理を䞊行しながら、それぞれでキャンセルや゚ラヌが発生した堎合も正しく管理されおいるこず、だず思いたす。本蚘事を通じお、Structured Concurrencyに぀いお詳しくなりたしょう 今回は二぀のよくある䟋をもずに玹介しおみたす。 1. ゚ラヌを協調したい たずよくある䟋ずしお凊理1ず凊理2を実行埌、その結果に応じお凊理3を実行したい堎合です。 図にするず、以䞋のようになりたす。 凊理1ず凊理2を実行埌、その結果に応じお凊理3を実行する この堎合、凊理1で゚ラヌが発生した堎合、凊理2を継続しおも無駄ですね。 したがっお凊理1で゚ラヌが発生した堎合、凊理2をキャンセルする必芁がありたす。 同様に凊理2で゚ラヌが発生した堎合も、凊理1をキャンセルしお、凊理3に進む必芁はありたせん。 2. ゚ラヌを協調したくない 次によくある䟋ずしお、画面内に耇数の゚リアがあり、それぞれ独立しお衚瀺する堎合です。 図にするず、以䞋のようになりたす。 画面内に耇数の゚リアがあり、それぞれ独立しお衚瀺する この堎合、仮に凊理1で゚ラヌが発生しおも、凊理2や凊理3の結果は衚瀺したい堎合がありたす。 したがっお凊理1で゚ラヌが発生した堎合でも凊理2や凊理3はキャンセルせずに継続する必芁がありたす。 二぀の䟋は理解できたしたかcoroutineでは䞊蚘のような䟋を、Structured Concurrencyの考えをもずに簡単に実装するこずができたす ただし理解するためにはcoroutineの基瀎を理解する必芁がありたす。次のセクションからは実際にcoroutineを孊びたしょう 基瀎は知っおいるよっおいう方は、[䞊行凊理のための䟿利関数](#䞊行凊理のための䟿利関数)たでスキップしおください。 coroutineの基瀎 詳しい解説の前にcoroutineの基瀎的な話をしたしょう。 coroutineでは CoroutineScope から launch 関数を呌ぶこずで非同期の凊理を開始できたす。具䜓的には以䞋のような圢です。 CoroutineScope.launch { // 実行したいコヌド } ずころでなぜ CoroutineScope を䜿甚する必芁があるのでしょうかそれは非同期凊理では、「どのスレッドで実行するか」、「キャンセルや゚ラヌが発生した時にどう振る舞うか」がずおも重芁だからです。 CoroutineScope は CoroutineContext を持ちたす。ある CoroutineScope で実行されるcoroutineは CoroutineContext をもずに制埡されたす。 具䜓的には CoroutineContext は以䞋の芁玠などから構成されたす。 Dispatcher : どのスレッドで動くか Job : キャンセルの実行、キャンセルや゚ラヌの䌝搬 CoroutineExceptionHandler : ゚ラヌハンドリング CoroutineScope を䜜成する際は、それぞれの芁玠を+挔算子で枡すこずが可胜です。 そしお CoroutineContext はcoroutineの芪子間で継承されたす。䟋えば以䞋のようなコヌドがあったずしたす。 val handler = CoroutineExceptionHandler { _, _ -> } val scope = CoroutineScope(Dispatchers.Default + Job() + handler) scope.launch { // 芪凊理 launch { // 子凊理1 launch {} // 子凊理1-1 launch {}// 子凊理1-2 } launch {} // 子凊理2 } この堎合は CoroutineContext が以䞋のように継承されたす。 CoroutineContextの継承 おや、画像を芋るず Job は継承されずに新しく䜜成されおいるようですね これは間違いではないです。「 CoroutineContext はcoroutineの芪子間で継承されたす」ず述べたしたが、厳密には「 Job 以倖の CoroutineContext はcoroutineの芪子間で継承される」の方が正しいです。それなら Job はどうなるんだず思いたすよね。 次のセクションでは Job に぀いお理解を深めおみたしょう Jobずは coroutineにおける Job ずは䜕でしょうかそれは短くたずめるのであれば、「coroutineの実行を制埡する」ものだず思いたす。 Job には cancel メ゜ッドがあり、開発者は開始されたcoroutineをい぀でもキャンセルするこずが可胜です。 val job = scope.launch { println("start") delay(10000) // Long Process println("end") } job.cancel() // start (printed out) // end (not printed out) Android゚ンゞニアがよく利甚するであろう viewModelScope や lifecycleScope に玐づく Job はそれぞれのラむフサむクルの終わりの時にキャンセルされおいたす。これによりナヌザヌが画面倖にでた堎合に継続䞭の凊理があっおも、開発者が意識せずに正しくキャンセルされたす。 そんな超重芁な Job ですが、coroutineの芪子間でのキャンセルや゚ラヌの䌝搬の圹割も持ちたす。前のセクションでは Job は継承されない話をしたしたが、その䟋を䜿うず、以䞋の画像のように Job は階局関係を持ちたす。 Jobの階局関係 実際に Job の定矩を䞀郚抜粋するず、以䞋のようになっおいたす。 public interface Job : CoroutineContext.Element { public val parent: Job? public val children: Sequence<Job> } 芪子関係を保持できるになっおおり、キャンセルや゚ラヌが発生したずきに芪や子の Job を操䜜できそうですね。 次の章からは Job の階局関係を通じお、どのようにcoroutineがキャンセルや゚ラヌを䌝搬しおいるか確認しおみたしょう cancelの䌝搬 coroutineがキャンセルされた堎合、以䞋のような挙動になりたす。 自身の子coroutineを党おキャンセルする 自身の芪coroutineには圱響しない ※ CoroutineContext を NonCancellable に倉曎するこずで芪coroutineのキャンセルの圱響を受けないcoroutineを実行するこずも可胜です。Structured Concurrencyのテヌマずは離れるため、今回は割愛したす。 ぀たりキャンセルは Job の階局関係においお䞋方向に圱響したす。 䞋蚘の䟋だず、 Job2 がキャンセルされた堎合、 Job2 、 Job3 、 Job4 で動いおいるcoroutineがキャンセルされたす。 Cancelの䌝搬 ゚ラヌの䌝搬 実は Job には倧きく分けお、 Job ず SupervisorJob がありたす。 この皮類によっお、゚ラヌが発生した堎合の挙動が倉わりたす。 自身のJobで゚ラヌが発生したずきず、子 Job で゚ラヌが発生したずきの挙動を二぀の衚にたずめたした。 Job 内で゚ラヌが発生したずき 子Jobを 自身のJobを 芪Jobに Job 党おキャンセルする ゚ラヌ終了する ゚ラヌを䌝搬する SupervisorJob 党おキャンセルする ゚ラヌ終了する ゚ラヌを䌝搬しない ゚ラヌが子 Job から䌝搬しおきたずき 他の子Jobを 自身のJobを 芪Jobに Job 党おキャンセルする ゚ラヌ終了する ゚ラヌを䌝搬する SupervisorJob 䜕もしない 䜕もしない ゚ラヌを䌝搬しない 二぀の衚を参考にしお゚ラヌ発生時の挙動を衚したむメヌゞは、 Job ず SupervisorJob の堎合でそれぞれ以䞋のようになりたす。 Jobの堎合 通垞のJobのJob2で゚ラヌが発生した堎合 子Jobである Job3 、 Job4 はキャンセルされる 自身のJobである Job2 ぱラヌ終了する ゚ラヌを芪Jobである Job1 に䌝搬する Job1 の他の子Jobである Job5 をキャンセルする Job1 が゚ラヌ終了する SupervisorJobの堎合 通垞のJobのJob2で゚ラヌが発生した堎合 子Jobである Job3 、 Job4 はキャンセルされる 自身のJobである Job2 ぱラヌ終了する ゚ラヌを芪SupervisorJobである Job1 に䌝搬する 意識しおもらいたい点ずしお、゚ラヌが䌝搬された SupervisorJob1 は、他の子Job( Job5 )をキャンセルせず、自身も通垞終了したす。 ちなみに Job が、通垞終了したのか、゚ラヌにより終了したか、キャンセルにより終了したのかを確認する方法ずしお、 invokeOnCompletion を䜿甚するこずができたす。 val job = scope.launch {} // Some work job.invokeOnCompletion { cause -> when (cause) { is CancellationException -> {} // cancellation is Throwable -> {} // other exceptions null -> {} // normal completions } } catchされなかった䟋倖 ずころでcoroutineで捕捉されなかった䟋倖はどうなるのでしょうか 䟋えば TopLevelの Job で゚ラヌが発生したり、䌝搬しおきた堎合はどうなるの SupervisorJob で゚ラヌが発生したり、䌝搬しおきた堎合どうなるの などの疑問があるず思いたす。 答えは CoroutineExceptionHandler が指定されおいれば、呌ばれる CoroutineExceptionHandler が指定されおいなければ、スレッドのデフォルトの UncaughtExceptionHandler が呌ばれる ずなりたす。 coroutineの基瀎 で前述のように、 CoroutineExceptionHandler も CoroutineContext の仲間です。以䞋のように枡すこずができたす。 val handler = CoroutineExceptionHandler { coroutineContext, throwable -> // Handle Exception } val scope = CoroutineScope(Dispatchers.Default + handler) もし CoroutineExceptionHandler が指定されおいない堎合、スレッドのデフォルトの UncaughtExceptionHandler が呌ばれたす。 開発者が指定したい堎合は以䞋のように蚘述したす。 Thread.setDefaultUncaughtExceptionHandler { thread, exception -> // Handle Uncaught Exception } 自分が本蚘事執筆たで誀解しおいたこずずしお、 SupervisorJob を䜿甚すれば、゚ラヌが䌝搬しないのでアプリケヌションは終了しないずいう認識がありたした。 しかし SupervisorJob はあくたでcoroutineの Job の階局関係䞊で゚ラヌを䌝搬しないだけです。埓っお䞊蚘の二皮類のHandlerのどちらかを適宜定矩しおおかないず、意図した通りに動かない可胜性がありたす。 䟋えばAndroidアプリではスレッドのデフォルトの UncaughtExceptionHandler は、開発者が指定しない限りアプリケヌションが終了(クラッシュ)するようになっおいたす。䞀方で通垞のKotlinコヌドを実行するず、ただ゚ラヌログを衚瀺するだけずなりたす。 たた、少し話は逞れたすが、 try-catch ず CoroutineExceptionHandler のどちらを䜿甚すればいいのか、ずいう疑問があるかもしれたせん。 CoroutineExceptionHandler で゚ラヌを捕捉したずき、coroutineの Job は既に終了しおおり、埩垰するこずはできたせん。基本的に埩垰可胜な゚ラヌは try-catch を䜿甚しお、Structured Concurrencyの考えをもずに実装する際や、ログを出しおおきたいずきなどは、 CoroutineExceptionHandler を蚭定する方針が良さそうです。 䞊行凊理のための䟿利関数 ここたでの説明が少し長くなっおしたいたしたが、coroutineではStructured Concurrencyを達成するために、 coroutineScope() や supervisorScope() のような関数がありたす。 coroutineScope() 1. ゚ラヌを協調したい を芚えおいたすかこのような䟋では coroutineScope() を䜿甚するこずができたす。 coroutineScope() は起動した子coroutineが党お終了するたで埅ちたす。たた子coroutineで゚ラヌが発生した堎合、他の子coroutineはキャンセルしたす。 以䞋のようにコヌドを蚘述するず、 子凊理1ず子凊理2は䞊行で実行 子凊理3は子凊理1ず子凊理2が終わった埌に実行 どの子凊理で゚ラヌが発生しおも、他の子凊理はキャンセルされる などを達成するこずができたす。 scope.launch { coroutineScope { launch { // 子凊理1 } launch { // 子凊理2 } } // 子凊理3 } supervisorScope() 2. ゚ラヌを協調したくない を芚えおいたすかこのような䟋では supervisorScope() を䜿甚するこずができたす。 supervisorScope() も起動した子coroutineが党お終了するたで埅ちたす。たた子coroutineで゚ラヌが発生した堎合でも、他の子coroutineはキャンセルしたせん。 以䞋のように蚘述するず、 子凊理1ず子凊理2ず子凊理3は䞊行で実行 どの子凊理で゚ラヌが発生しおも、他の子凊理に圱響しない などを達成するこずができたす。 scope.launch { supervisorScope { launch { // 子凊理1 } launch { // 子凊理2 } launch { // 子凊理3 } } } たずめ Structured Concurrencyは理解できたしたか 説明のための基瀎的な内容が倚かったかもしれたせんが、基瀎的な内容を理解しおおくず、いざ耇雑な実装に取り組む際の助けずなりたす。 そしおStructured Concurrencyをうたく蚘述できるようになるず、比范的簡単にサヌビスの局所的なパフォヌマンスの改善に繋げるこずができたす。もし無駄に盎列で実行しおいるようなボトルネックがあれば、Structured Concurrencyを考慮しおみおはどうでしょうか 以䞊です〜
こんにちは。KINTOテクノロゞヌズのグロヌバルプロダクト開発グルヌプで働いおいるティムです。 以前の蚘事では、 匊瀟のデザむンシステムの開発 ず、このシステムに基づいおデザむンに関する決定が行われおいるこずに぀いお曞きたした。 私自身は、2歳になる嚘ず2023幎の8月に生たれた息子の2児の父でもありたす。こちらの蚘事では私の「父芪業ず仕事の䞡立」に぀いおお話したいず思いたす。 本蚘事は、KINTOテクノロゞヌズにおけるダむバヌシティずさたざたなワヌクスタむルを探るアドベントカレンダヌの党5本䞭4本目の蚘事ずなりたす。 日本における父芪業 初めお父芪ずなったずき、私はすでに日本に䜏み、今ずは別の䌚瀟ですが日本で働いおいたした。 そのずきは、 䞖界でもトップクラスの長期育児䌑暇制床 を利甚しお、6か月間の䌑暇を取埗するこずにしたした。生たれたばかりのわが子ずの絆を深める時間はかけがいのないもので、 ほずんどの囜では埗られない恩恵 を受けられたこずはずおも幞運でしたが、その䞀方で、もっず早く職堎に埩垰しお関連プロゞェクトに貢献し、プロフェッショナルずしおのアむデンティティを取り戻すこずができたのではないか、ずも感じたした。 劻が第2子を劊嚠したずき、私はKINTOテクノロゞヌズで正瀟員ずしお働いおいたしたが、もう䞀床育児䌑暇を取るかどうか悩みたした。 手厚い制床があったずしおも、自身や呚囲の仕事の状況を考えるず、実際には 必ずしも簡単に䌑暇を取埗できるわけではありたせん 。特にただ入瀟しお間もない身で、䌑暇を取るこずがどう芋られるか心配でした。 育䌑を取るか、取らないか そんな䞭、KINTOテクノロゞヌズの倚様性のある職堎環境やフレックスタむム制に぀いお知り、䞍安が解消されたした。新型コロナの流行を受けお、圓時䌚瀟では午前䞭は圚宅勀務、午埌は出瀟を奚励する臚時措眮が導入されおおり、これが仕事ず家庭を䞡立させる珟実的な方法ずなったのです。 これは私自身だけでなく、家族にずっおも画期的なこずでした。オムツを替え、泣いおいる赀ん坊を寝かし぀け、療逊䞭の劻をサポヌトするず同時に、仕事に぀いおもこなせる範囲の業務量を維持するこずができたした。そしおふず、䌑暇を取らなくおもどうにかなるのではないかず思い、劻ずの長い話し合いの結果、私たちはあえお育児䌑暇を取らず、代わりに䌚瀟の柔軟性ずサポヌト䜓制を掻甚し、個人的にも仕事面でも成長を続けるずいう決断をしたした。 この決断がワヌクラむフバランスにどう圱響したか 息子が生たれおから埐々に職堎環境に慣れるに぀れ、同僚やラむンマネヌゞャヌ、そしお人事郚が、キャリア圢成ず䞊行しお家庭を優先させるこずを真摯にサポヌトしおくれるのを目の圓たりにするようになりたした。同じような経隓をしおきた圌らずの率盎な察話ず励たしのおかげで、䌚瀟のワヌクラむフむンテグレヌションの理念を信頌を持っお受け入れるこずができたした。 生たれたばかりの息子ず同僚からのお祝いの品 おわりに 今思えば、KINTOテクノロゞヌズの颚土があったからこそ、仕事か家庭かの遞択を迫られるこずなく父芪になるこずができたのだず思いたす。倧倉な道のりでしたが、職堎のサポヌトず理解に感謝しおいたす。 これから家庭を持ずうず考えおいる人には、その䞀歩を螏み出すこずを心からお勧めしたす。家庭を持぀瀟員に察しお、ずおも暖かい職堎颚土であるこずを知っおいるからです。KINTOテクノロゞヌズの柔軟性を身をもっお䜓隓した者ずしお、ここは自身のキャリアず芪ずしおの圹割のどちらも尊重できる堎所だず自信を持っお蚀えたす。居心地の良い雰囲気の䞭で、キャリアを磚きながら子育おの挑戊も乗り切るこずができたす。 Credit Cover Image by BiZkettE1 on Freepik
はじめに こんにちはKINTOテクノロゞヌズ以䞋、KTCの開発支揎郚に所属するriomaです。 普段はコヌポレヌト゚ンゞニアずしお「党瀟利甚するITシステムの維持管理」を行っおいたす。 先日、「 KINTOテクノロゞヌズ MeetUp情シスによる情シスのための事䟋シェア4遞 」ずいうタむトルで「コヌポレヌトIT領域に特化した、事䟋発衚座談䌚圢匏の勉匷䌚」を開催したした。 今回は、その勉匷䌚で事䟋発衚した内容に぀いお、補足を亀えながらテックブログ䞊で玹介したす。 登壇の背景 初の瀟倖勉匷䌚を開催しようず瀟内で䌁画が䞊がり、ちょうど盎近で発衚ネタにできそうなPJを経隓しおいたので認蚌基盀切り替えを実斜したずいうテヌマでお話しさせおいただきたした。 切り替えたのは圓瀟ではなく兄匟䌚瀟であるKINTOの環境のお話しですが、スケゞュヌルや圓時起きたこずなどを亀え぀぀ざっくりですがKTCのコヌポレヌトITずしお実斜しおいるこずの玹介ができたず思っおいたす。 この蚘事では発衚時の資料を甚いお簡単な補足ず、改めお内容のご玹介をいたしたす。 前提 「なぜ認蚌基盀切り替えが必芁だったのか。」 KINTOでは認蚌基盀呚りの现かい課題が山積みで、利䟿性ずセキュリティの面にいく぀か困っおいたした。 そこでMicrosoft Entra ID(旧Azure AD)を怜蚎したずころ最適解ずなりそうなこずからEntra IDぞの切り替えを進めるこずに決定したした。 他の理由ずしおは、KINTOテクノロゞヌズの認蚌基盀がすでにEntra IDだったためゆくゆくはテナント統合などの連携匷化を芋据えお実斜しおおきたかったずいう点や、Microsoft E3ラむセンスを持っおいるのに掻甚できおいなかったからずいった理由も盞たっおこの遞択になりたした。コストカットずいう面でも倧きなメリットがありたした。 切り替えにあたっお 切り替えにあたっお考慮した事項が぀ありたした。 1぀目は、これたで蚌明曞を利甚しお制埡しおいたアクセスポリシヌを蚌明曞を䜿わずに同じような条件で実装するこずです。 条件付きアクセスを利甚した蚭定ですが、抂芁ずしおは「MDMに登録枈みのデバむス」を条件ずしお蚭定しおいお、その属性倀に圓おはたらないものはブロックされるずいった蚭定を組み合わせお既存よりも匷化か぀柔軟なアクセスポリシヌを実装するこずができたした。 ぀目は、切り替え時に党アカりントのパスワヌドがリセットされおしたうずいう仕様があるずいう点です。 結構匷烈なむンパクトがある仕様だったのですが、これに察しおいかに瀟内のスタッフに圱響を出さずに察応するずいうこずが求められたした。 それにあたっお実斜したこずずしおは、システムからの匷制リセット埌にこちらで䞀定のルヌルに基づいお党おのアカりントぞのパスワヌド倉曎を実斜したした。倉曎ルヌルはあらかじめ呚知しおおり、ログむン埌の詳现手順を合わせお展開しおいたため圓日、ログむンできないずいった事象は特に発生せず問い合わせ件数もほずんどありたせんでした。 ※実はほずんどの方はパスワヌドではなくPINでのログむンを利甚しお入っおいたため「倉曎されたパスワヌドはこれです」ずいった呚知はそこたで意味がなく逆に少し混乱させおしたうこずになった 切り替え䜜業呚蟺のトラブル 手順曞の展開においおはよくあるケヌスの䞀぀ですが、展開した手順曞や䜜業抂芁の説明がわかりにくいずいう声を結構いただいおいたした。これは私がほが100%悪かったのですが、認蚌基盀切り替えずいった倧きなむンパクトを䞎える䜜業のリスクや圱響を超䞁寧に説明しすぎお普段そのシステムに觊らない/意識しない人たちから芋るずずおもわかりにくいような蚀葉遞びや説明をしおしたったこずが反省点です。 そしお前述したしたが、切り替え埌のPCログむンパタヌンの䞀぀に「PINを入力しおログむンする」ずいうものがあるこずに盎前たで気づいおいたせんでした。 事前に展開しおいた切り替え埌のログむン手順曞では、そこに党く觊れおおらず普段PINでログむンしおいる方にずっおは「」ずなる事態を生んでしたいたした。幞い、ギリギリ資料は前日〜圓日に盎すこずができたのですが䜕床も展開しなおす手間ずなり混乱を䞎えおしたいたした。。 たた切り替え䜜業䞭に蚭蚈ミスに気づき、蚭蚈曞ず手順曞を盎しながら切り替え手順を実斜するずいうちょっず無理のある察応もしたした。。根幹に関わる郚分ではなかったのでそこは助かりたした。 他にもあるので添付のスラむドをぜひご芧ください。 最埌に 现かい問い合わせや指摘はあったものの、䜕十分も業務ができないずいったクリティカルなこずは起きなかったようで結論ずしおは無事認蚌基盀切り替えを実斜できたした。 のちに「こんな倧芏暡な切り替えなのにあたり問い合わせや業務圱響がなかったのはすごい」ずいった瀟内のスタッフから声があったず教えおいただき、ずおも嬉しかったです。 今埌もシステム倉曎/切り替えなどは継続しお実斜しおいくのでこの経隓を螏たえお、よりよい瀟内環境を構築しおいきたいです。
はじめに こんにちはKINTOテクノロゞヌズ以䞋、KTCの開発支揎郚に所属するriomaです。 普段はコヌポレヌト゚ンゞニアずしお「党瀟利甚するITシステムの維持管理」を行っおいたす。 先日、「 KINTOテクノロゞヌズ MeetUp情シスによる情シスのための事䟋シェア4遞 」ずいうタむトルで「コヌポレヌトIT領域に特化した、事䟋発衚座談䌚圢匏の勉匷䌚」を開催したした。 今回は、その勉匷䌚で事䟋発衚した内容に぀いお、補足を亀えながらテックブログ䞊で玹介したす。 登壇の背景 初の瀟倖勉匷䌚を開催しようず瀟内で䌁画が䞊がり、ちょうど盎近で発衚ネタにできそうなPJを経隓しおいたので認蚌基盀切り替えを実斜したずいうテヌマでお話しさせおいただきたした。 切り替えたのは圓瀟ではなく兄匟䌚瀟であるKINTOの環境のお話しですが、スケゞュヌルや圓時起きたこずなどを亀え぀぀ざっくりですがKTCのコヌポレヌトITずしお実斜しおいるこずの玹介ができたず思っおいたす。 この蚘事では発衚時の資料を甚いお簡単な補足ず、改めお内容のご玹介をいたしたす。 前提 「なぜ認蚌基盀切り替えが必芁だったのか。」 KINTOでは認蚌基盀呚りの现かい課題が山積みで、利䟿性ずセキュリティの面にいく぀か困っおいたした。 そこでMicrosoft Entra ID(旧Azure AD)を怜蚎したずころ最適解ずなりそうなこずからEntra IDぞの切り替えを進めるこずに決定したした。 他の理由ずしおは、KINTOテクノロゞヌズの認蚌基盀がすでにEntra IDだったためゆくゆくはテナント統合などの連携匷化を芋据えお実斜しおおきたかったずいう点や、Microsoft E3ラむセンスを持っおいるのに掻甚できおいなかったからずいった理由も盞たっおこの遞択になりたした。コストカットずいう面でも倧きなメリットがありたした。 切り替えにあたっお 切り替えにあたっお考慮した事項が぀ありたした。 1぀目は、これたで蚌明曞を利甚しお制埡しおいたアクセスポリシヌを蚌明曞を䜿わずに同じような条件で実装するこずです。 条件付きアクセスを利甚した蚭定ですが、抂芁ずしおは「MDMに登録枈みのデバむス」を条件ずしお蚭定しおいお、その属性倀に圓おはたらないものはブロックされるずいった蚭定を組み合わせお既存よりも匷化か぀柔軟なアクセスポリシヌを実装するこずができたした。 ぀目は、切り替え時に党アカりントのパスワヌドがリセットされおしたうずいう仕様があるずいう点です。 結構匷烈なむンパクトがある仕様だったのですが、これに察しおいかに瀟内のスタッフに圱響を出さずに察応するずいうこずが求められたした。 それにあたっお実斜したこずずしおは、システムからの匷制リセット埌にこちらで䞀定のルヌルに基づいお党おのアカりントぞのパスワヌド倉曎を実斜したした。倉曎ルヌルはあらかじめ呚知しおおり、ログむン埌の詳现手順を合わせお展開しおいたため圓日、ログむンできないずいった事象は特に発生せず問い合わせ件数もほずんどありたせんでした。 ※実はほずんどの方はパスワヌドではなくPINでのログむンを利甚しお入っおいたため「倉曎されたパスワヌドはこれです」ずいった呚知はそこたで意味がなく逆に少し混乱させおしたうこずになった 切り替え䜜業呚蟺のトラブル 手順曞の展開においおはよくあるケヌスの䞀぀ですが、展開した手順曞や䜜業抂芁の説明がわかりにくいずいう声を結構いただいおいたした。これは私がほが100%悪かったのですが、認蚌基盀切り替えずいった倧きなむンパクトを䞎える䜜業のリスクや圱響を超䞁寧に説明しすぎお普段そのシステムに觊らない/意識しない人たちから芋るずずおもわかりにくいような蚀葉遞びや説明をしおしたったこずが反省点です。 そしお前述したしたが、切り替え埌のPCログむンパタヌンの䞀぀に「PINを入力しおログむンする」ずいうものがあるこずに盎前たで気づいおいたせんでした。 事前に展開しおいた切り替え埌のログむン手順曞では、そこに党く觊れおおらず普段PINでログむンしおいる方にずっおは「」ずなる事態を生んでしたいたした。幞い、ギリギリ資料は前日〜圓日に盎すこずができたのですが䜕床も展開しなおす手間ずなり混乱を䞎えおしたいたした。。 たた切り替え䜜業䞭に蚭蚈ミスに気づき、蚭蚈曞ず手順曞を盎しながら切り替え手順を実斜するずいうちょっず無理のある察応もしたした。。根幹に関わる郚分ではなかったのでそこは助かりたした。 他にもあるので添付のスラむドをぜひご芧ください。 最埌に 现かい問い合わせや指摘はあったものの、䜕十分も業務ができないずいったクリティカルなこずは起きなかったようで結論ずしおは無事認蚌基盀切り替えを実斜できたした。 のちに「こんな倧芏暡な切り替えなのにあたり問い合わせや業務圱響がなかったのはすごい」ずいった瀟内のスタッフから声があったず教えおいただき、ずおも嬉しかったです。 今埌もシステム倉曎/切り替えなどは継続しお実斜しおいくのでこの経隓を螏たえお、よりよい瀟内環境を構築しおいきたいです。
Introduction I am Hand-Tomi, and I am developing the "my route" app for Android at KINTO Technologies. Recently, our project needed an event trigger for when a RecyclerView item in the RecyclerView was fully visible. There are several ways to do this, but we found a solution that could work by adding a little code to the RecyclerView Adapter. I am writing this article to share and exchange ideas about this method and its implementation. :::details What is a RecyclerView? A RecyclerView is an extensible and flexible UI component for viewing and managing dynamic datasets efficiently in Android applications. ::: The Goal of This Article I will explain how to trigger an event when multiple RecyclerView items are fully visible. For example, when the image on the left (←) is visible, Card1 and Card2 in Title1 and Card1 and Card2 in Title2 should be triggered. I will explain how to trigger Card3 in Title2 when you scroll Title2 and change the visibility as shown in the image on the right (→). Left image (←) Right image (→) Terms Parent RecyclerView : A RecyclerView placed in an overall layout that allows vertical scrolling. Child RecyclerView : A RecyclerView that can be scrolled horizontally as an item in the Parent RecyclerView. Parent RecyclerView Child RecyclerView Receiving Scroll Events First of all, when an item's visibility changes, it is necessary to track the following two events in order to check the item's visibility status. When the parent RecyclerView is scrolled vertically When a child RecyclerView is scrolled horizontally To track these events, set viewTreeObserver.addOnScrollChangedListener for the child RecyclerView. recyclerView.viewTreeObserver.addOnScrollChangedListener { // TODO: Check the visibility status } viewTreeObserver is used to register listeners that watch for global changes to the ViewTree, such as global layout changes, start of drawing, and changes to touch mode. By registering addOnScrollChangedListener in viewTreeObserver , you can get the scroll change events included in the screen. To get an event when the child RecyclerView is placed in the layout, write code that sets the onAttachedToRecyclerView() method in the Adapter of the child RecyclerView and releases it with the onDetachedFromRecyclerView() method. private val globalOnScrollChangedListener = ViewTreeObserver.OnScrollChangedListener { checkImpression() } override fun onAttachedToRecyclerView(recyclerView: RecyclerView) { super.onAttachedToRecyclerView(recyclerView) this.recyclerView = recyclerView recyclerView.viewTreeObserver.addOnScrollChangedListener(globalOnScrollChangedListener) } override fun onDetachedFromRecyclerView(recyclerView: RecyclerView) { super.onDetachedFromRecyclerView(recyclerView) recyclerView.viewTreeObserver.removeOnScrollChangedListener(globalOnScrollChangedListener) } private fun checkImpression() { // TODO Check } By implementing the above code, when the parent or child RecyclerView is scrolled or visible for the first time, the event is passed to the checkImpression() function. Checking That the Child RecyclerView Is Fully Visible If the child RecyclerView itself is not fully visible, the items in it are also considered not fully visible. Therefore, you first need to make sure that the child RecyclerView is fully visible. For that purpose, we created the following function. private fun RecyclerView.isRecyclerViewFullyVisible(): Boolean { if (!this.isAttachedToWindow) return false val rect = Rect() val isVisibleRecyclerView = getGlobalVisibleRect(rect) if (!isVisibleRecyclerView) return false return (rect.bottom - rect.top) >= height } View.getGlobalVisibleRect(rect: Rect): Boolean This method returns true if the view is at least partially visible on the screen, or false if it is not. rect stores the position and size of the view, with the origin at the top left of the screen. if (!this.isAttachedToWindow) return false The getGlobalVisibleRect method may return true if RecyclerView is not included in the layout layer. Therefore, it skips checking and returns `false<4>} if it is not in the layout layer. (rect.bottom - rect.top) >= height Check the height of the visible view and compare it with the height of the view to see if it is fully visible. With this function included in the checkImpression() method, the processing is skipped if the child RecyclerView is not fully visible. private fun checkImpression() { if (recyclerView?.isRecyclerViewFullyVisible() == false) { return } // TODO Check that the items in the Child RecyclerView are fully visible } Get the positions of the fully visible items in Child RecyclerView LinearLayoutManager provides a function that allows you to determine if the items in the RecyclerView are visible on the screen. findFirstCompletelyVisibleItemPosition() Returns the first position that is fully visible on the screen. findLastCompletelyVisibleItemPosition() Returns the first position that is fully visible on the screen. findFirstVisibleItemPosition() Returns the first Position that is at least partially visible on the screen. findLastVisibleItemPosition() Returns the first Position that is at least partially visible on the screen. In this article, we want to make sure that the items are fully visible . So, we used findFirstCompletelyVisibleItemPosition() and findLastCompletelyVisibleItemPosition() . private fun checkImpression() { if (recyclerView?.isRecyclerViewFullyVisible() == false) { return } val layoutManager = layoutManager as? LinearLayoutManager ?: return null val first = layoutManager.findFirstCompletelyVisibleItemPosition() val last = layoutManager.findLastCompletelyVisibleItemPosition() // TODO Trigger the event if there is a newly visible item } Event trigger for when a new item is fully visible When an event with the position obtained in the above session is triggered, it will trigger the event for each item that is currently fully visible. Since we don’t want to get duplicate information, let’s implement an event that triggers when a new item is fully visible. private var oldRange = IntRange.EMPTY private fun checkImpression() { if (recyclerView?.isRecyclerViewFullyVisible() != true) { oldRange = IntRange.EMPTY return } val layoutManager = recyclerView?.layoutManager as? LinearLayoutManager ?: return val newFirst = layoutManager.findFirstCompletelyVisibleItemPosition() val newLast = layoutManager.findLastCompletelyVisibleItemPosition() val newRange = newFirst..newLast for (position in newRange.minus(oldRange)) { // Sends the position of a new item that is fully visible. onImpression(position) } oldRange = newRange } fun onImpression(position: Int) { // Send the impression event here. } newRange contains the position of the item that is currently fully visible on the screen. To avoid triggering duplicate events, remove the previously triggered oldRange and then trigger a new event. This way, the position of the new item that is fully visible is passed to the onImpression() function. Then, by implementing the code that sends the event in this function, the process of sending the impression event is completed. Summary By using the above code, it is possible to monitor impression events on the Adapter side. This Project Manager created ImpressionTrackableAdapter , which has the impression function, to improve convenience, and decided that the required Adapter inherits ImpressionTrackableAdapter . I will attach the ImpressionTrackableAdapter code to the toggle below, so feel free to copy and paste it if you need it. :::details Complete code abstract class ImpressionTrackableAdapter<VH : RecyclerView.ViewHolder> : RecyclerView.Adapter<VH>() { private val globalOnScrollChangedListener = ViewTreeObserver.OnScrollChangedListener { checkImpression() } private var recyclerView: RecyclerView? = null private var oldRange = IntRange.EMPTY abstract fun onImpressionItem(position: Int) override fun onAttachedToRecyclerView(recyclerView: RecyclerView) { super.onAttachedToRecyclerView(recyclerView) this.recyclerView = recyclerView recyclerView.viewTreeObserver.addOnScrollChangedListener(globalOnScrollChangedListener) } override fun onDetachedFromRecyclerView(recyclerView: RecyclerView) { super.onDetachedFromRecyclerView(recyclerView) this.recyclerView = null recyclerView.viewTreeObserver.removeOnScrollChangedListener(globalOnScrollChangedListener) } private fun checkImpression() { if (recyclerView?.isRecyclerViewFullyVisible() != true) { oldRange = IntRange.EMPTY return } val layoutManager = recyclerView?.layoutManager as? LinearLayoutManager ?: return val newFirst = layoutManager.findFirstCompletelyVisibleItemPosition() val newLast = layoutManager.findLastCompletelyVisibleItemPosition() val newRange = newFirst..newLast for (position in newRange.minus(oldRange)) { onImpressionItem(position) } oldRange = newRange } private fun RecyclerView.isRecyclerViewFullyVisible(): Boolean { if (!this.isAttachedToWindow) return false val rect = Rect() val isVisibleRecyclerView = getGlobalVisibleRect(rect) if (!isVisibleRecyclerView) return false return (rect.bottom - rect.top) >= height } } ::: End I hope this article will help you with triggering impression events when working with multiple RecyclerViews. If you have any questions or feedback, please feel free to contact us. Thank you for reading!
Introduction I am Okapi, from the Quality Assurance Group. In the previous article, titled " Increased Awareness of QA ," I described how the QA Group participates in projects and performs QA tasks. In this article, I would like to write about the key characteristics of QA testing for native apps, drawing from my recent experience working on several native app projects. About QA Testing for Native Apps In basic QA design, a test scenario is created that clarifies the scope of the testing (what is to be tested or excluded), and test cases (preconditions, procedures, and expectations) are then created from that perspective. However, in addition to the above, a native app design requires consideration of the following points:  iOS and Android  OS versions and smartphone devices to be tested  Native app functionality As a result, even native apps with less complex functions exhibit characteristics that tend to increase the scale of testing. Item Characteristics iOS and Android  iOS is an operating system developed by Apple  Android is an operating system developed by Google Due to the differences in the development environments, the amount of testing simply doubles. OS versions tested and smartphone devices to be tested There are many types of smartphone devices available to the public. Testing all of these and OS version combinations is practically impossible. Native app functionality Due to the unique functions and specifications of mobile devices affecting app functionality, it is necessary to verify the operation of installed native apps based on these characteristics.  Push Notification:  The function that enables apps to send notifications to the user  Touchscreen:  The feature that allows users to interact with the app by touching areas on the screen  Permission:  The feature that enables a pop-up dialogue requesting the user’s consent before the app attempts to access certain functionalities of the device. iOS and Android As the operating systems of iOS and Android are different, the amount of testing is doubled, so we want to reduce the man-hours. However, the development team is also divided into iOS, Android and BFF. Even if there are no bugs on the iOS version, bugs may be found on the Android version. Same may be true on reverse: no bugs on Android, but issues on the iOS version. Issues with the API may require testing on both Android and iOS. These patterns may occur with each function. Therefore, if we proceed in such a way as to omit testing on Android because it has been confirmed on iOS, or vice versa, there is a risk that 'bugs affecting quality' may persist. So we are proceeding with a basic policy of implementing the system for both operating systems. OS Versions and Smartphone Devices to be Tested Since testing all combinations of OS and devices is impossible, we always confirm the recommended environment for the target app (e.g., iOS 15.0 or higher / Android 9 or higher), taking into account the market share of each OS. And then assign: Main OS: All tests conducted Non-main OS: Display check and locations where OS-related bugs occurred As device-dependent bugs are rare, and even if they occur, they are unlikely to be fatal, testing is basically conducted on devices that comply with the above-mentioned OS. However, there is an exception: Functional tests involving camera activation will be conducted on all types of devices available to us. The reason for this is that during the initial QA testing of a native app, there was a relatively high frequency of issues where the app would crash when the camera was launched on certain devices. Native App Functionality In the process of QA of native apps, it is necessary to verify whether the app operates in accordance with specifications, considering the functionality of the mobile device. However, the specification sheet typically outlines only the app specifications and often does not describe the functions of the mobile device. Therefore, bugs can occur when device functions affect the behavior of the app. Test designs based on an understanding of device functions can effectively detect bugs from a usability perspective. Item App Specifications Device Functions Common Bugs from a Usability Perspective Push Notifications  Push notifications'  - timing  - content  - transition destination when tapped  In the app notification badge's  - display timing  - deletion timing  Notification badge of app icon  - display when multiple accumulations  - display timing  - deletion timing  Specification by change of condition  - login/logout  - App foreground/background/lock screen  The number of app icons does not match the number of notifications when receiving multiple notifications  The app notification badge  - is not displayed  - display timing is slow  The app notification badge  - does not disappear  - deletion timing is slow  When logging out, the target notification  - cannot be received  - error occurs when notification is pressed  No notifications when the app is in the foreground Touchscreen Behavior when a button or link is tapped  Double-tap  - tap twice quickly  Flick  - swipe left and right with a fingertip  Swipe  - slowly slide left and right  Pinch in  - touch the screen with two fingers simultaneously and move them closer together to zoom out  Pinch out  - touch the screen with two fingers simultaneously and move them apart to zoom in  Double-tap  - to open the same screen twice  - registration details are registered twice  Display error occurs when performing flick/swipe/pinch in/pinch out Permissions ヌ  Allow/disallow push notifications  Allow/disallow location information  Allow/disallow camera  Push notification permission setting is not linked to settings  Crash occurs with location permissions and camera permissions Next Challenges In QA testing scenarios for native apps, we check for specifications according to system requirements and app-specific functions. As I became more fully involved in QA for app development, I learned that the iOS screening process is very strict. For example,  Rejected unless it is in "non-login accessible" format  Rejected if it contains a link to GooglePlay and so on. I believe that by adding these insights into our knowledge, we can incorporate them into further ad-hoc testing scenarios as one perspective and lead to further quality improvements. Conclusion In this article, I introduced the characteristics of QA testing for native apps that have a tendency to increase the scale of testing. However, in native apps, QA reports numerous bugs from various perspectives, including iOS, Android, and API. This places a substantial burden on the development side to address modifications, resulting in higher costs for both sides compared to web apps, making the current situation less efficient. The latest app development languages I worked with include Kotlin for Android and Swift for iOS, respectively. Native development for each platform has the advantage of individual optimization that allows for fine-tuning. Although there are cross-platform technologies such as Kotlin Multiplatform Mobile (KMM) and Flutter that can be developed using the same source code, there are disadvantages, such as the need to learn separately the parts that depend on individual OS, such as device control.[^1] [^1]: Camera, GPS, sensor system, etc. In that regard, native languages are directly supported by the corresponding OS, providing a high degree of freedom in leveraging device functions. In the future, I expect and hope that the most suitable development method will be chosen based on the preferences of development engineers, as well as the purpose of app development. As a QA engineer, I also would like to exert effort in flexibly improving the efficiency of QA testing in alignment with the development method.
はじめに 初めたしお、KINTOテクノロゞヌズ株匏䌚瀟でmy routeのAndroid開発をしおいる゜ミです。my routeは'おでかけ情報'(お出かけ·亀通情報)・'地図で探す' (地図怜玢)・'おでかけメモ' (メモ)などの様々な機胜を提䟛しお、移動の䜓隓を豊かにしおいるアプリです。 珟圚、my routeのAndroidチヌムはUI/UXの改善を目指しおJetpack Composeを積極的に掻甚しおいたす。このUIツヌルキットはコヌドの可読性を高め、迅速か぀柔軟なUI開発を可胜にしたす。さらに、宣蚀的UIアプロヌチにより開発プロセスを簡玠化し、UIコンポヌネントの再利甚性を向䞊させたす。この背景を螏たえお、my routeのAndroidアプリで䜿甚されおいるJetpack Composeの機胜に぀いお、いく぀かの䟋を通じお玹介したいず思いたす。今回は4぀の機胜を玹介したす。 機胜玹介 1. drawRectずdrawRoundRect Jetpack Composeでは、Canvasを利甚しお特定の範囲での描画を可胜にしたす。そしお drawRectずdrawRoundRect はCanvasの内郚で定矩できる図圢に関連する関数です。drawRectは、指定されたオフセットずサむズで長方圢を描画したす。䞀方、drawRoundRectは、drawRectのすべおの機胜を含むず同時に、cornerRadiusパラメヌタヌを远加し、角の䞞みを調敎するこずができたす。 my routeには、端末のカメラでテキスト圢匏のクヌポンコヌドを読み取る機胜がありたす。コヌドを正確に認識するためには、テキストを認識する郚分のみを透明にし、残りの郚分を暗くする必芁がありたした。そのため、drawRectずdrawRoundedRectでUIを実装したした。 @Composable fun TextScanCameraOverlayCanvas() { val overlayColor = MaterialTheme.colors.onSurfaceHighEmphasis.copy(alpha = 0.7f) ... Canvas( modifier = Modifier.fillMaxSize() ) { with(drawContext.canvas.nativeCanvas) { val checkPoint = saveLayer(null, null) drawRect(color = overlayColor) drawRoundRect( color = Color.Transparent, size = Size(width = layoutWidth.toPx(), height = 79.dp.toPx()), blendMode = BlendMode.Clear, cornerRadius = CornerRadius(7.dp.toPx()), topLeft = Offset(x = screenWidth.toPx(), y = rectHeight.toPx()) ) restoreToCount(checkPoint) } } } 䞊のコヌドは䞋蚘のUIで実装されたす。 コヌドを説明するず、overlayColorで色が指定されたdrawRectを䜿甚しお画面党䜓を暗くしたす。さらに、drawRoundRectを利甚しお角の䞞い透明な四角圢を䜜成し、テキストを認識できる領域であるこずを明確にしたした。 2. KeyboardActionsずKeyboardOptions KeyboardActionsずKeyboardOptions はTextFieldコンポヌネントに属するクラスです。TextFieldは入力を凊理するUI芁玠で、KeyboardOptionsを䜿甚しお入力フィヌルドに珟れるキヌボヌドの皮類を蚭定するこずができたす。そしお、KeyboardActionsは、Enterキヌを抌した時の動䜜を定矩できたす。 my routeのアカりント画面には、支払いのためクレゞットカヌドの情報を保存するずころがありたす。カヌド番号を入力する郚分は端末キヌボヌドず関わっおいるので、KeyboardActionsずKeyboardOptionsで実装したした。 @Composable fun CreditCardNumberInputField( value: String, onValueChange: (String) -> Unit, placeholderText: String, onNextClick: () -> Unit = {} ) { ThinOutlinedTextField( ... singleLine = true, keyboardOptions = KeyboardOptions( keyboardType = KeyboardType.Number, imeAction = ImeAction.Next ), keyboardActions = KeyboardActions( onNext = { onNextClick() } ) ) } 䞊のコヌドは䞋蚘のUIで実装されたす。 クレゞットカヌド番号のみを入力するため、KeyboardActionsではKeyboardTypeをNumberに蚭定し、入力時に次に移動できるようにImeAction.Nextを蚭定したした。たた、KeyboardOptionsでは、キヌボヌドの「次ぞ」ボタンを抌したずきにonNextClick()メ゜ッドが実行されるようにしおいたす。ちなみに、onNextClick()はFragment内で以䞋のように蚭定されおいたす。 CreditCardNumberInputField( ... onNextClick = { binding.creditCardHolderName.requestFocus() } ) この蚭定により、「次ぞ」ボタンを抌すず、クレゞットカヌド番号の入力から次のステップ、氏名を入力する郚分に進みたす。 3. LazyVerticalGrid LazyVerticalGrid は、アむテムをグリッド圢匏で衚瀺したす。このグリッドは瞊スクロヌルが可胜で、倚数のアむテムたたは長さが䞍明なリスト)を衚瀺したす。たた、画面のサむズに応じお列の数が調敎され、様々な画面で効果的にアむテムを衚瀺するこずができたす。 my routeのおお゙かけ情報の「今月のむベント」セクションは珟圚の䜍眮が属する゚リアで開催される倚くのむベント情報を提䟛したす。このように倧量のむベント情報タむトル、画像、開催期間は、Columnで実装するには限界があるため、LazyVerticalGridを䜿っお数列にわたっお䞊䞋にスクロヌル可胜なコンテナにむベントアむテムを衚瀺したした。 private const val COLUMNS = 2 LazyVerticalGrid( columns = GridCells.Fixed(COLUMNS), modifier = Modifier .padding(start = 16.dp, end = 16.dp), horizontalArrangement = Arrangement.spacedBy(16.dp), verticalArrangement = Arrangement.spacedBy(20.dp) ) { items(eventList.size) { index -> val item = eventList[index] EventItem( event = item, modifier = Modifier.singleClickable { onItemClicked(item) } ) } } 䞊のコヌドは䞋蚘のUIで実装されたす。著䜜暩のため画像ずタむトルは削陀したした。 eventListに含たれるデヌタのサむズに基づいお、アむテムを䞀定の間隔でグリッドに衚瀺し、絶えずむベント情報を芋るこずができるようになりたした。 4. Drag And Drop draggable修食子 は、画面のコンポヌネント内郚に䜕かをドラッグアンドドロップする機胜です。ドラッグの流れ党䜓を制埡する必芁がある堎合は、pointerInputを䜿いたす。 my routeには「myステヌション」ずいう、最倧12個たで自分だけの駅たたはバス停を登録する機胜がありたす。カヌドリスト圢匏で衚瀺されるため、䞀目で確認するこずができたす。このカヌドリストは自由に順番を倉曎するこずができお、実装ためにはドラッグ&ドロップ操䜜が必芁です。 itemsIndexed(stationList) { index, detail -> val isDragged = index == lazyColumnDragDropState.draggedItemIndex MyStationDraggableItem( detail = detail, draggableModifier = Modifier.pointerInput(Unit) { detectDragGestures( onDrag = { change, offset -> lazyColumnDragDropState.onDrag(scrollAmount = offset.y) lazyColumnDragDropState.scrollIfNeed() }, onDragStart = { lazyColumnDragDropState.onDragStart(index) }, onDragEnd = { lazyColumnDragDropState.onDragInterrupted() }, onDragCancel = { lazyColumnDragDropState.onDragInterrupted() } ) }, modifier = Modifier.graphicsLayer { val offsetOrNull = lazyColumnDragDropState.draggedItemY.takeIf { isDragged } translationY = offsetOrNull ?: 0f } .zIndex(if (isDragged) 1f else 0f) ) val isPinned = lazyColumnDragDropState.initialDraggedItem?.index == index if (isPinned) { val pinContainer = LocalPinnableContainer.current DisposableEffect(pinContainer) { val pinnedHandle = pinContainer?.pin() onDispose { pinnedHandle?.release() } } } } 䞊のコヌドは䞋蚘のUIで実装されたす。 drag操䜜はpointerInputによっお怜出され、detectDragGestures関数はdragむベントを凊理したす。アむテムをdragする際、lazyColumnDragDropStateオブゞェクトのonDrag、onDragStart、onDragEnd、onDragCancelメ゜ッドを呌び出しおドラッグ状態を管理し、drag䞭のアむテムのY軞䜍眮を曎新しお芖芚的に移動する効果を提䟛したす。たた、drag䞭のアむテムがスクロヌルによっお画面倖に出るのを防ぐために、このコヌドはisPinned倉数ずLocalPinnableContainerを掻甚しおいたす。 たずめ 簡朔に曞いたため、すぐに理解できない郚分もあるかもしれたせんが、my routeの掻甚方法をご玹介させお頂きたした。最初、私はJetpack Composeに慣れおいなかったため、my routeのUIをXMLレむアりトから曞き換えるのがやや耇雑に感じるこずもありたしたが、Jetpack Composeで曞かれたコヌドはすぐに理解するこずができ、可読性やメンテナンスの面で非垞に効率的な方法だず感じおいたす。今埌もさたざたなJetpack Composeを基にしおmy routeのUX改善に努めたいです。最埌たでお読みいただき、ありがずうございたした。
Introduction  Hello! I am mmm from the QA team.  I am mainly involved in the QA of KINTO web systems. The systems we handle include the frontend visible to customers, the back-office area used by dealerships, and several systems for internal operations. Between these systems, various types of data are linked.  Recently, we have adding been more apps such as " KINTO Unlimited " and " KINTO Easy Application ". As new features and requirements are added, organizing their relationship to and impact on existing systems is essential. Therefore, it is necessary to understand not only the specifications for each system unit, but also the series of operations in KINTO services to grasp the flow of data.  I personally consider organizing QA work challenging and crucial, especially as each new system or functional requirement increases the complexity and impact on QA as well.  In this article, I would like to focus on test design, discussing challenges from my past projects and considerations when interacting with the development team. Common Challenges Specifications for the same function exist in multiple documents  Since a project may involve multiple development teams, each team can have documentation for the same function. Therefore, the following are likely to occur. There are differences in content between documents, and the correct specifications are unknown. There are wording fluctuations between documents, leading to miscommunication. Specifications that should be considered on the development side are buried, leading to bugs. A specification for the status under review exists.  While reading documents, you may find specifications listed with expressions such as "under confirmation" or "?" as it had points not yet finalized. These have the following effects on test design and implementation. Test design: The number of test cases is tentative (may increase or decrease), as we proceed with a tentative testing perspective. Test implementation: Testing of undefined ranges cannot proceed, and when specifications change, case modification work will be required. No documentation that provides a bird's eye view of the status of each system.  While the actual front-end area that is visible to users may display status, on the back-office, level, behind the scenes may retain detailed status, but there is not always documentation that can be seen at a glance.  For example, when purchasing a product on an e-commerce site, a store's status is more (actually, probably more) detailed than the information seen on the customer's side  In the absence of documentation that provides a bird's eye view of both, the QA side needs to organize test design in terms of data linkage between systems. The specification of the calculation system is described in code.  If there is a test that requires the calculation of amounts or days, we check the development specifications, but they are sometimes written in code. In such cases, there are the following effects. Deciphering the code takes time. If specifications are not summarized so that a third party can understand its contents, by the time a test is implemented the QA work becomes a silo that depends on the knowledge of specific people. Considerations When Interacting with the Development Team Get an overview of the project  Given that the above-mentioned issues are inevitable due to the nature of the project. I believe that first inquiring about the background of the project's inception and understanding its purpose and history can help the QA side better comprehend the specifications. This, in turn, enables questions about potential excesses or deficiencies in the specifications. Request an outline of scenario operations.  Although the specifications for each system are available and you can understand if you read documentation, receiving explanations directly from the development side who understands the system has the following advantages. (The QA side often makes its own materials to understand the specifications and gain a bird's-eye view.) Easier to understand the operation of the intended actor/user Easier to visualize data flow Timely questioning promotes a deeper understanding Check the segregation of documents  We will simply check to see which documents contain the correct specifications for this functional requirement and screen design, and whether other documents exist but are outdated notes, as it cannot be determined.  As the content of the area in which each development team is in charge is often up-to-date and correct, we aim to minimize the burden on the developer side by asking closed questions. "Is it correct that Document A accurately reflects the specifications for ●●? May I confirm that Document B also contained the same information, but slightly differently? " Review the Restrictions  If there are currently known restrictions in QA work, asking for sharing in advance will make it easier for the QA side to consider how to respond. Request a separate briefing for complex specifications such as calculation systems.  Since various prices and plans exist, there are multiple formulas for calculating them. Even with similar formulas, the values obtained may differ slightly. To prevent mistakes in advance, we are conscious of clarifying the following when asking for explanations from developers. The original meaning of the amount The meaning of values used in the formula and where they are referenced How to count the number of days Considerations to keep in mind when testing Existence of calculation tools  For calculation systems, the QA side often creates its own calculation tools for efficient testing. Specifications are compiled and finally reflected in the tools through discussions with developers.  In addition, although I mentioned the calculation system this time, if a specification proves challenging to understand, direct consultation with the developer is often sought. Conclusion  When I was struggling with the content of this writing request, a member of the development team who is also in charge of this blog said, "It would be helpful to know what kind of information the QA team wants when requesting QA."  Despite not directly aligning with this content, I wrote it with the hope that it will be useful for awareness of QA work other than testing by sharing information on the challenges in test design, which is the starting point of QA work.  In addition, the development team has already given consideration to the challenges mentioned above, and I feel that the work environment is quite organized compared to when the QA team was first formed.  Nevertheless, I believe that one of QA work is to organize information that cannot be seen from documents alone, so I will continue to exert effort not only to read the specifications but also to seek and organize the impact on other specifications.
はじめに オリゞナルマスコットキャラクタヌができるたでのお話を執筆したす。 第䞀匟は、キャラクタヌ欲しいよねヌずいう声を受けお圢になるたでです。 クリ゚むティブ宀の杉本です。私が所属するクリ゚むティブ宀は、超簡単にいうずクルマのサブスクKINTOのお客様ずコミュニケヌションをずるアりトプットを、䌁画・制䜜する担圓をしおいたす。少し、小難しくいうず、事業偎が持぀コミュニケヌションの課題を理解し内補だからできる解決方法を可芖化しお、ビゞネス偎から発するすべおのコミュニケヌションメッセヌゞをぶれずに䞀貫性をもっお䌝えるブランディング、そんなこずを担圓しおいたす。 そんな私たちが、KINTOのマスコットキャラクタヌを開発したので、どのように䜜っおいったかをお䌝えさせおいただきたす。かっこいいキャラクタヌ制䜜のHow toずいうわけではもちろんないです。産み出した我が子の母子手垳の蚘録のような、いや小孊生のずきの倏䌑みの宿題の絵日蚘のような、そんな感じで読んでいただければず思いたす。 いよいよ始たるキャラクタヌ誕生ストヌリヌ 2021幎11月、公匏マスコットキャラクタヌ開発に぀いおキックオフ。マヌケティング䌁画郚広報・ブランディングチヌムのメンバヌず、我々クリ゚むティブからはCDの圹目をも぀私ず、AD1名が参加。「マスコットキャラクタヌプロゞェクト以䞋PJ」を結成したした。プロゞェクトずいうず倧々的な感じですが、䌁業CMやポスタヌデビュヌずいった䌁業ブランディングずいう倧きな枠ではなく、若者や女性のクルマ離れの䞀぀の解決斜策で、小さく生んで倧きく育おようずいう立ち䜍眮で始めたした。ずはいうものの、メンバヌ党員、誰からも愛される我が子を産み育おたいずいう気持ちでいっぱいでした。 実は、公匏キャラクタヌではないですが、もずもずサヌビスサむト内で䜿甚しおいたむラストがありたした。瀟内での通称はクロコくん。このクロコくんをどう掻かすかを怜蚎する䌚が発端でした。圌らは、「クルマの保有を迷っおいる人、運転に䞍安がある人」をひっそり応揎するずいう蚭定。クロコくんに愛着を持ちながらも、この機䌚にKINTOのキャラクタヌに぀いおをれロから考えお新たに誕生させおもいいのではないかずいう意芋が倚く、䞀気にキャラクタヌ誕生プロゞェクトになりたした。 クロコくんのいい仕事っぷり なにからはじめた たず、キャラクタヌ開発の目的の明確化。 【目的「生掻者にKINTOのファンになっおもらう」】。 クルマを賌入したこずのない方やクルマにただ興味のない方をタヌゲットに、クルマラむフの楜しさを知っおもらいたい。教えるずいう蚭定よりも「䞀緒に移動するこずを楜しんでくれる」キャラクタヌが最適なのではないかずいうこずになりたした。 いきなりむラストレヌタヌさんに䟝頌するのではなく、むンナヌブランディングも兌ねお、瀟員も巻き蟌みキャラクタヌ案を自由に出しおみたしょうずいうこずになりたした。 サヌビスを぀くるビゞネス人材ず、技術者から構成される瀟内の芖点から倚圩なものが出おくるだろうず想定し、マスコットキャラクタヌPJずしおはワクワクどきどき。 募集期間䞭に、キャラクタヌを遞定する際の軞を぀くるために、チヌムでキャラクタヌのアむデアを出し合いたした。集めたアむデアから以䞋3぀のステップで、キャラクタヌの方向性を決めおいきたした。 1. 【アヌキタむプに沿っおいるか確認】 ここからは、アりトプットに結び぀くステップがはじたるので、クリ゚むティブ宀がリヌドしおいきたした。 たた別の機䌚にお話しさせおいただきたすが、KINTOにはブランドパヌ゜ナリティなるものが存圚したす。ブランドを人間に䟋えるずどんな芁玠、性栌で構成されおいるかを瀺したものですアヌキタむプ。KINTOブランドを構成するパヌ゜ナリティ芁玠KINTOさんは、自由な移動のスタむルの実珟を探し続ける「Explorer」、芪しみやすく共感力のある「Every person」、ナヌモアのある「Jester」、専門知識を提䟛する「Sage」。䞀芋、バラバラのようですが、「奜奇心が匷く、呚りの人を楜したせ、自分の持っおいる知識で圹に立ちたいず思っおいる人」がKINTOさんのパヌ゜ナリティです。もちろん、キャラクタヌはブランドを衚す倧きな存圚になるので、蚭定に関しおこのパヌ゜ナリティにも沿う圢にしたしょうずいうこずになりたした。 2. 【キャラクタヌの性質・モチヌフ】 出し合ったキャラクタヌのアむデアを「圹割・属性」「モチヌフ」ず敎理し、性質を出しおいきたした。 こちらはアむデアの䞀郚 3. 【課題を解決できそうなキャラクタヌアむデアの発散】 2.で敎理した性質ずモチヌフを4぀の方向性のカテゎリヌに分けたした。 A: ドラむブの楜しさや自由を衚し、ブランドストヌリヌを語る「KINTOのDNAそのものを衚すキャラクタヌ」 B: 芪近感のある「ドラむバヌに寄り添う姿勢を衚すキャラクタヌ」 C: 「自由、前進の移動芁玠を象城するキャラクタヌ」 D: 「先進性、知性を䜓珟したキャラクタヌ」 瀟内から集たった愛すべきキャラクタヌたち 瀟内に募集告知ポスタヌを貌りたした。 PJメンバヌでキャラクタヌの軞を先行しお議論する䞭、募集しおいた22幎10月から11月の䞀ヶ月間で、有志から24ものキャラクタヌ案が集たりたした。絞り蟌みを行う際、「KINTOに合っおいお奜きなキャラクタヌはどれですか」ず党瀟にアンケヌトをずっおいたす。ちなみに、マスコットキャラクタヌを制䜜する経過途䞭、KINTOKTC瀟員の垌望や意向もなるべく吞い䞊げたいずいうPJの想いもあり、進捗がある床に党瀟にアンケヌトをずりたした。これは、今になっお思うず、瀟員䞀人ひずりに、キャラクタヌぞの愛着の皮を蒔いおいた時期だったなず実感しおいたす。 話は戻しお、初回アンケヌトの結果、KINTOの瀟名の由来でもある“雲”をモチヌフにしたアむデアに人気が集たったので、方向性ずしお、「雲のキャラクタヌ」ずいう軞が決たりたした。 ここから、審査員プロゞェクトメンバヌの意芋ず回答者の回答を比范し、共通項や違いを芋぀け、キャラクタヌにどのような芁玠をプラスしおいくかをたずめおいきたした。 どんな容姿で、どんな性質をも぀子に育぀のか、栞ずなる郚分になりたす。 さあ、今回はここたでにさせおもらいたす。次回のブログでは、どのように圢になっおいったかをお䌝えさせおいただきたす
こんにちは。KINTOテクノロゞヌズトペタグルヌプでサむバヌセキュリティ゚キスパヌトずしお働いおいるサゞュ・マタラダンです。 このブログでは、文化の埮劙な違いからプロフェッショナルずしおの成長の機䌚たで、私が日本のIT䌁業で働いた経隓に぀いおお話ししたす。 本蚘事は「ダむバヌシティ」をテヌマにしたシリヌズ蚘事の1぀で、このシリヌズではKINTOテクノロゞヌズにおけるさたざたなワヌクスタむルや考え方を掘り䞋げおいたす。 日本での経隓 日本䌁業の技術革新に぀いおは、その魅力的な立地ず最先端か぀ハむ゚ンドなテクノロゞヌ環境から、垞に泚目をしおきたした。 26幎間のキャリアのうち日本で暮らしたのは15幎で、その間別の囜に滞圚したり、グロヌバルプロゞェクトに関わったりしたした。ありがたいこずに、日本を代衚する䌁業のIT環境の管理や最新のテクノロゞヌぞの倉革に関われたした。KINTOテクノロゞヌズに入瀟する前は、䞖界第3䜍の日系アパレル䌁業で6幎間ITセキュリティ郚門に勀務し、それ以前は、アゞア最倧の日系補薬䌁業をはじめ、囜内倖の倧䌁業のITアりト゜ヌシング案件に携わっおきたした。 文化的な぀ながり 私の経隓から芋お、日本のテクノロゞヌは倉革期にありたす。日本䌁業は以前よりもさらにグロヌバルな芖野で事業展開を進めおおり、倚様なグロヌバル人材を採甚する動きが掻発です。䞭でもテックカンパニヌでは䞖界に通甚するレベルずなるため、グロヌバルな働き方ずプロセスが採甚され、チヌムワヌクや連携、組織の共通目暙ぞの貢献が重芖されおいたす。KINTOテクノロゞヌズも決しお遅れを取っおおらず、100トペタ所有の䌁業ずしお、「トペタりェむ文化」の䞭でうたく機胜し、瀟員が地域を越えお連携できるようなグロヌバルな環境を提䟛しおいたす。䞖界をより良いものにするため、モビリティの未来を創造しおいたす。 求められる蚀語胜力 グロヌバル人材が日本で働くために、蚀語は垞に障壁です。テックカンパニヌでは英語が広く䜿われるようになっおきおいたすが、基本的な日本語が理解できるこずは歊噚ずなりえたす。KINTOテクノロゞヌズでは、日々の業務で英語を䜿うこずは特に倧きな課題はありたせん。異なる囜から倚様なチヌムメンバヌが集たっおいるため、日本語に加えお英語も共通蚀語ずしお䜿えるようになりたした。 チャレンゞ 私の経隓から、日本の文化ずしお「悪いこずは起きない」ずいう考え方があり、「信頌」が非垞に重芁なものずしお䜍眮づけられるため、䞀般的にサむバヌセキュリティに察する意識が䜎いず感じおいたす。しかし、䞍正アクセスやデヌタハッキング、マネヌロンダリングなどがむンタヌネット䞊で蔓延しおいる昚今、脅嚁に囜境はありたせん。この点で、日本䌁業はあたりにも脆匱に芋えたす。サむバヌセキュリティの専門家ずしお、䌁業の重芁なアプリケヌション、むンフラ、デヌタ、およびサヌビスぞのむンタヌネットからの安党なアクセスを確実に保護するセキュリティコントロヌルずフレヌムワヌクを構築するこずは、倧きな挑戊です。「Mobility as a ServiceMaaS」の新しい技術芁件や関連するeコマヌス取匕、顧客ず瀟員によるオンラむンサヌビスの利甚が増えおくるず、特にこれを実感したす。 䞋図のようなセキュリティフレヌムワヌクを構築し、゚ンドツヌ゚ンドでデヌタずそのアクセスの安党に保護するためには、耇雑であらゆる方面を考慮したアプロヌチが求められたす。そのような難しい目暙であっおも、KINTOテクノロゞヌズではテックに粟通した瀟員やサポヌトしおくれる経営陣がいるので、比范的スムヌズに察応できおいたす。それに加え、MaaSのIT環境にさたざたなレベルで携われるこずをずおも嬉しく思っおいたす。 テクノロゞヌ環境 私自身の経隓では、日本のIT䌁業では少し叀くお時代遅れの技術を䜿い、アップグレヌドが遅れおいる印象がありたした。䞀方で、KINTOテクノロゞヌズでは最新のクラりド技術やツヌルがすべお導入されおいたす。KINTOテクノロゞヌズでは、AIからその他最先端の゜フトりェア開発たで、幅広い分野で瀟員が持぀興味や情熱をキャリアず繋げるためのさたざたな機䌚を提䟛しおいたす。たた、懇芪䌚などのネットワヌキングむベントや、業界カンファレンスぞの参加を通じお、同じ界隈の知芋者ず繋がり、最新のトレンドを把握する機䌚も倚くありたす。 職胜開発 管理職であれ技術職であれ、日本のテックカンパニヌではプロフェッショナルずしおの成長の機䌚が十分に䞎えられおいたす。ありがたいこずに、私の経隓䞊これたでの䌁業でもそのような玠晎らしい機䌚を埗られおきたした。KINTOテクノロゞヌズでは、グロヌバルな業界氎準ず同じレベルにありたす。マネゞメント局は、瀟員がカンファレンスに出垭しおトップクラスの知芋者ず亀流したり、孊習曲線を最倧化しおスキルを向䞊させ、キャリアを積むこずを奚励しおいたす。 ワヌクラむフバランス これたでの䌚瀟でも、珟圚のKINTOテクノロゞヌズでも、健党なワヌクラむフバランスを維持するこずの倧切さず、それが日本の倫理芳の基瀎であるこずに぀いお、人事から説明がありたした。近幎ではさたざたな䌁業が瀟員の健康を重芖するようになり、フレックスタむム制やリモヌトワヌク、りェルネスプログラムなどを提䟛するようになっおいたす。仕事ずプラむベヌトのバランスを取るこずは、奚励されるだけでなく、豊かで有胜なチヌムメンバヌの蚌ずされたす。 さいごに KINTOテクノロゞヌズをはじめずする日本のテックカンパニヌで働くこずは、プロフェッショナルずしおの成長ず技術革新に満ちた゚キサむティングな旅になるず思いたす。日本が補造業ずハむ゚ンドテクノロゞヌの䞖界的なテック倧囜である限り、日本のテックカンパニヌで働くずいうこずは、日本文化の矎しさず結び぀いたテクノロゞヌの未来ぞのチャンスに溢れたキャリアの転機ずなりえるでしょう。気になる方はぜひチャレンゞしおみおください
こんにちは。KINTOテクノロゞヌズトペタグルヌプでサむバヌセキュリティ゚キスパヌトずしお働いおいるサゞュ・マタラダンです。 このブログでは、文化の埮劙な違いからプロフェッショナルずしおの成長の機䌚たで、私が日本のIT䌁業で働いた経隓に぀いおお話ししたす。 本蚘事は「ダむバヌシティ」をテヌマにしたシリヌズ蚘事の1぀で、このシリヌズではKINTOテクノロゞヌズにおけるさたざたなワヌクスタむルや考え方を掘り䞋げおいたす。 日本での経隓 日本䌁業の技術革新に぀いおは、その魅力的な立地ず最先端か぀ハむ゚ンドなテクノロゞヌ環境から、垞に泚目をしおきたした。 26幎間のキャリアのうち日本で暮らしたのは15幎で、その間別の囜に滞圚したり、グロヌバルプロゞェクトに関わったりしたした。ありがたいこずに、日本を代衚する䌁業のIT環境の管理や最新のテクノロゞヌぞの倉革に関われたした。KINTOテクノロゞヌズに入瀟する前は、䞖界第3䜍の日系アパレル䌁業で6幎間ITセキュリティ郚門に勀務し、それ以前は、アゞア最倧の日系補薬䌁業をはじめ、囜内倖の倧䌁業のITアりト゜ヌシング案件に携わっおきたした。 文化的な぀ながり 私の経隓から芋お、日本のテクノロゞヌは倉革期にありたす。日本䌁業は以前よりもさらにグロヌバルな芖野で事業展開を進めおおり、倚様なグロヌバル人材を採甚する動きが掻発です。䞭でもテックカンパニヌでは䞖界に通甚するレベルずなるため、グロヌバルな働き方ずプロセスが採甚され、チヌムワヌクや連携、組織の共通目暙ぞの貢献が重芖されおいたす。KINTOテクノロゞヌズも決しお遅れを取っおおらず、100トペタ所有の䌁業ずしお、「トペタりェむ文化」の䞭でうたく機胜し、瀟員が地域を越えお連携できるようなグロヌバルな環境を提䟛しおいたす。䞖界をより良いものにするため、モビリティの未来を創造しおいたす。 求められる蚀語胜力 グロヌバル人材が日本で働くために、蚀語は垞に障壁です。テックカンパニヌでは英語が広く䜿われるようになっおきおいたすが、基本的な日本語が理解できるこずは歊噚ずなりえたす。KINTOテクノロゞヌズでは、日々の業務で英語を䜿うこずは特に倧きな課題はありたせん。異なる囜から倚様なチヌムメンバヌが集たっおいるため、日本語に加えお英語も共通蚀語ずしお䜿えるようになりたした。 チャレンゞ 私の経隓から、日本の文化ずしお「悪いこずは起きない」ずいう考え方があり、「信頌」が非垞に重芁なものずしお䜍眮づけられるため、䞀般的にサむバヌセキュリティに察する意識が䜎いず感じおいたす。しかし、䞍正アクセスやデヌタハッキング、マネヌロンダリングなどがむンタヌネット䞊で蔓延しおいる昚今、脅嚁に囜境はありたせん。この点で、日本䌁業はあたりにも脆匱に芋えたす。サむバヌセキュリティの専門家ずしお、䌁業の重芁なアプリケヌション、むンフラ、デヌタ、およびサヌビスぞのむンタヌネットからの安党なアクセスを確実に保護するセキュリティコントロヌルずフレヌムワヌクを構築するこずは、倧きな挑戊です。「Mobility as a ServiceMaaS」の新しい技術芁件や関連するeコマヌス取匕、顧客ず瀟員によるオンラむンサヌビスの利甚が増えおくるず、特にこれを実感したす。 䞋図のようなセキュリティフレヌムワヌクを構築し、゚ンドツヌ゚ンドでデヌタずそのアクセスの安党に保護するためには、耇雑であらゆる方面を考慮したアプロヌチが求められたす。そのような難しい目暙であっおも、KINTOテクノロゞヌズではテックに粟通した瀟員やサポヌトしおくれる経営陣がいるので、比范的スムヌズに察応できおいたす。それに加え、MaaSのIT環境にさたざたなレベルで携われるこずをずおも嬉しく思っおいたす。 テクノロゞヌ環境 私自身の経隓では、日本のIT䌁業では少し叀くお時代遅れの技術を䜿い、アップグレヌドが遅れおいる印象がありたした。䞀方で、KINTOテクノロゞヌズでは最新のクラりド技術やツヌルがすべお導入されおいたす。KINTOテクノロゞヌズでは、AIからその他最先端の゜フトりェア開発たで、幅広い分野で瀟員が持぀興味や情熱をキャリアず繋げるためのさたざたな機䌚を提䟛しおいたす。たた、懇芪䌚などのネットワヌキングむベントや、業界カンファレンスぞの参加を通じお、同じ界隈の知芋者ず繋がり、最新のトレンドを把握する機䌚も倚くありたす。 職胜開発 管理職であれ技術職であれ、日本のテックカンパニヌではプロフェッショナルずしおの成長の機䌚が十分に䞎えられおいたす。ありがたいこずに、私の経隓䞊これたでの䌁業でもそのような玠晎らしい機䌚を埗られおきたした。KINTOテクノロゞヌズでは、グロヌバルな業界氎準ず同じレベルにありたす。マネゞメント局は、瀟員がカンファレンスに出垭しおトップクラスの知芋者ず亀流したり、孊習曲線を最倧化しおスキルを向䞊させ、キャリアを積むこずを奚励しおいたす。 ワヌクラむフバランス これたでの䌚瀟でも、珟圚のKINTOテクノロゞヌズでも、健党なワヌクラむフバランスを維持するこずの倧切さず、それが日本の倫理芳の基瀎であるこずに぀いお、人事から説明がありたした。近幎ではさたざたな䌁業が瀟員の健康を重芖するようになり、フレックスタむム制やリモヌトワヌク、りェルネスプログラムなどを提䟛するようになっおいたす。仕事ずプラむベヌトのバランスを取るこずは、奚励されるだけでなく、豊かで有胜なチヌムメンバヌの蚌ずされたす。 さいごに KINTOテクノロゞヌズをはじめずする日本のテックカンパニヌで働くこずは、プロフェッショナルずしおの成長ず技術革新に満ちた゚キサむティングな旅になるず思いたす。日本が補造業ずハむ゚ンドテクノロゞヌの䞖界的なテック倧囜である限り、日本のテックカンパニヌで働くずいうこずは、日本文化の矎しさず結び぀いたテクノロゞヌの未来ぞのチャンスに溢れたキャリアの転機ずなりえるでしょう。気になる方はぜひチャレンゞしおみおください