TECH PLAY

KINTOテクノロジーズ

KINTOテクノロジーズ の技術ブログ

969

Introduction Hello! I am Jeong, and I am a member of KINTO Technologies' New Vehicle Subscription Development Group. Our daily work goes beyond just writing code. As technology evolves, it is important to adapt to new trends such as microservices and serverless architecture while maintaining a healthy system. After reading this article, you will understand the importance of observability and how Grafana is used to monitor systems and optimize performance. About Observability Observability refers to the ability to monitor and understand the condition and performance of a system. This concept is essential for quickly identifying and resolving problems within the system. Especially when it comes to microservices and cloud-based architecture, as there are composed of many dynamic parts working together, the entire system must be continuously monitored. There are three main elements of observability: Log: Detailed data that records system activity and errors Metrics: Quantitative data that describes the performance and conditions of a system Trace: Data that tracks the path of an E2E[^1] request or transaction [^1]: E2E (End-to-End): A system or process that works as a whole from start to finish About Grafana Grafana is a powerful open source observability tool. It is used by many to visualize, monitor, and analyze data. Grafana is best characterized by its flexibility and customizable dashboards. Users can integrate metrics and logs from different data sources and present them in a way that is easy to understand. Grafana's key benefits include: Supports various data sources: Can be integrated with Prometheus, Elasticsearch, InfluxDB, and more Data analyses and alerts: Instantly detects system anomalies and sends alert notifications Dashboard: The dashboard can be customized to meet the user's needs Grafana in Action: Focus on Clarity The New Car Subscription Development Group uses Grafana’s dashboard to make data easier to understand for people from different technical backgrounds. In this section, I will give an example of PromQL query and talk about its features that are used in the dashboard panel. Monitoring API Requests ![Use the Stat panel to display the number of requests](/assets/blog/authors/jeong/grafana_promql1.png =500x) Number of contracts #the value is a sample The most basic query tracks the number of HTTP requests for URI patterns. This query shows the increase or decrease in the number of requests over a time range and is useful for trend analyses. sum( increase( http_server_requests_seconds_count{ uri=~”/foo”, method=“POST”, status=“200” }[$__range] ) ) or vector(0) sum(...): An aggregating function that sums the results. Here, we calculate the total number of requests that meet the criteria. increase(...): Calculates the amount by which a metric over a time range. You can find the increase or decrease in the number of requests. vector(0): Returns 0 if there is no result. This exists so that a value is displayed on the dashboard even if there is not data. Measuring the Number of Applications per Hour ![Indicate the hourly applications measurement using the Time Series panel](/assets/blog/authors/jeong/grafana_promql2.png =500x) Number of applications by time zone (sample) #sleeps at night Use PromQL which monitors API requests to measure the number of requests per hour and find changes in demand per time zone. This is used as reference data for dynamically allocating resources for different time zones and doing other applications. Identifying the Time-Consuming Requests ![Use the Table panel to show the request that takes the most time](/assets/blog/authors/jeong/grafana_promql3.png =500x) There are also those that take 4 seconds or longer When doing performance analyses, identifying requests that take longer is critical to finding bottlenecks in the system. The following PromQL query can help. Calculating the Average Response Time Calculate the average response time for each request. Determine the total response time and the number of requests, then divide them. sum by(application, uri, outcome, method) ( increase(http_server_requests_seconds_sum[$__range]) ) / sum by(application, uri, outcome, method) ( increase(http_server_requests_seconds_count[$__range]) ) sum by(...): Groups results based on the labels (here, they are application, uri, outcome, and method) and calculates the sum of each group. increase(...): Calculates the amount by which a metric over a time range ($__range). Here we calculate the total response time and the number of requests. Aggregating the Number of Requests Aggregate the number of requests. sum by(application, uri, outcome, method) ( increase(http_server_requests_seconds_count[$__range]) ) Identifying the Requests with the Longest Response Times Identify the ten requests with the longest response times in the time range. topk( 10, max( max_over_time(http_server_requests_seconds_max[$__range]) ) by(application, uri, outcome, method) ) topk(10, ...): Returns the ten elements with the highest values. Here, we list the ten requests with the longest response times. max(...): Calculates the largest value for each group. max_over_time(...): Calculates the largest value for each metric within a time range and groups the results by label. This allows you to extract the requests with the longest response times. Client-Side Error Monitoring ![Use the Table Panel to show client-side errors](/assets/blog/authors/jeong/grafana_promql4.png =500x) Authentication token expired Monitor for errors occurring on the client side and analyze the cause. label_replace( sum by (application, method, uri, exception, status) ( increase(http_server_requests_seconds_count{ status=~”5..|4..”, exception!~”None|FooException” }[$__range] ) ) > 0, ‘uri’, ‘$1/*$2’, ‘uri’, ‘(.*)\\/\\{.+\\}(.*)’ label_replace(...): Changes and adds labels. '> 0': Returns the result if the sum is greater than 0. In other words, it displays data only if there is an error. Advantages of Grafana and Use Cases Learn more about how New Car Subscription Development Group used Grafana to improve their system monitoring. Comprehensive system visualization: With AWS Managed Grafana, we can visualize data from AWS services (RDS, SQS, Lambda, CloudFront, etc.) and application metrics at the same time. This means we can see the performance and bottlenecks of the entire system at a glance, greatly accelerating our approach to problem solving. Efficient data analysis and troubleshooting: By integrating different data sources, you can quickly get the information you need when a problem arises. This allows you to quickly identify the root cause of a problem and handle it efficiently. API Monitoring: Through Grafana, we discovered that certain exceptions are strangely common. As a result of our investigation, we found that an unexpected API was being called on the frontend. This issue was communicated to the frontend team and fixed, making the API more efficient and significantly improving the overall stability and performance of the system. Conclusion Observability is more than just looking at a system. It is the key to maintaining the conditions of a system and ensuring that problems can be dealt with quickly when they arise. With Grafana, we can easily understand complex data and effectively manage the performance of entire systems. Grafana caters to a variety of needs from monitoring API requests to identifying errors. This is worth cooperating with all team members, not just SREs and developers. After all, increasing the transparency and reliability of a system is essential to providing better service and increasing customer satisfaction. I hope that our experience will provide you with a new perspective in your work and help you monitor your systems more efficiently and optimize performance.
アバター
社内限定のLT大会を開催しました! こんにちは、23年10月にKTCに入社したRyommです。普段は my route by KINTO というアプリのiOS開発を行なっています。 さて、今回は弊社の室町オフィスにて社内限定のLT大会を開催したので、みなさまにもお裾分けのレポートです! 開催までの経緯 直属のボスとの1on1にて「最近人前で喋ってないからラフなLT大会とかやりたいっすね〜」という話になり、他のオフィスでは情報共有会という名目でやってるらしいという情報を得ました。 そこで、 (11月21日)timesでやりたいな〜と言ってみたところトントン拍子で話が進み... timesの様子 (11月27日)有志で集まってキックオフMTGが開催され... 実行委員チャンネルの様子 (11月29日)全社員が参加する会議での告知と室町オフィスへの周知がされ... ![室町オフィスチャンネルの様子](/assets/blog/authors/ryomm/2023-12-28-LightningTalks/03.png =400x) 室町オフィスチャンネルの様子 かわいいチラシ作りました (12月14日)タイムテーブルを発表し... ![きゃわいいタイムテーブル](/assets/blog/authors/ryomm/2023-12-28-LightningTalks/05.png =300x) かわいいタイムテーブルも作りました (12月21日)LT大会を実施しました! 会場の様子 ちょうどやりたいと言い出した時から1ヶ月という圧倒的なスピードでLT大会の開催が実現しました! テックブログチームをはじめ多くの方が積極的に参加してくれたおかげで、とても楽しい会になったのではと思います。 さらにコーポレートITグループの方々にも協力していただき、かなり本格的なZoom配信を行うこともできました! 発表者も集まるかな〜と不安でしたが、12名の方にエントリーしていただきました。(中には名古屋からいらっしゃる方も!) 最初は本当にノリと勢いだけで動き出したので、みんなで協力して形にできたLT大会だったと思います。 Lightning Talks 発表してくれたLTを、社内限定ということで色々とゆるめにしていたので全てを公開できるわけではないですが、一部ダイジェストで紹介します。 GitHub Flow+Release PleaseによるTag Based Release ⛩さんによるLTです。 GitHub Flow(Git Flowとの比較含む)、Tag Based Release、Release Pleaseそれぞれについての解説と、これらを統合すると自動でCHANGELOGを生成してくれたり、バージョン管理を簡素化できて便利だというLTでした! 私としては、別バージョンの開発が同時に走っていて、ある機能はまだ公開したくない!というお悩みにも応えてくれていて、Release Please使ってみたいな〜と思いました! ⛩さんのLT モータースポーツ最高峰「F1 (Formula 1)」のマニアックな楽しみ方 mt_takaoさんによるLTです。 F1の面白さを布教するLTでした。自動車を扱う会社ならではのLTですね! F1の世界では1秒差は非常な大きな差であり、1000分の1秒差をどうやって埋めていくか、それがF1の面白さだと力説されていました。 最後には2024年4月5日(金)〜7日(日)に三重県の鈴鹿サーキットで開催される「2024 FIA F1世界選手権シリーズ MSC CRUISES 日本グランプリレース(F1日本グランプリ)」の宣伝で締められていました笑 私もぜひ1度見てみたいと思うLTでした! mt_takaoさんのLT 1月開発編成本部会に向けて ありとめさんによるLTです。 ご自身のキャリアとそこで感じたこと、KTCへの想いと共に「イキイキと働く」ことができるように考えた施策のLTでした。 1月には社内ではじめての大規模イベントを開催されるということで、私も楽しみにしていますー! KTCのこと発信してみませんか HOKAさんによるLTです。 ご自身の広報としての経験と、KTCで組織人事、採用まで関われる人事としてKTCの認知度をアップするための取り組み、そしてKTCについて発信しよう!というLTでした。 一番簡単な発信はXのリポストだということで、私も早速リポストしました😎✨ HOKAさんのLT Sketchy Investment​ 長谷川さんによるLTです。 英語を勉強することは超ハイリターンな投資!ということで、長谷川さん流の勉強術と英語学習の奨励LTでした! 最後は会社に英語学習補助導入への検討の要求で締め括られ、会場は沸き立っておりました笑 私も英語...勉強しちゃうか...!?となるくらいエネルギーに溢れたLTでした! 長谷川さんのLT LT登壇のハードルを限りなく下げるLT+アジャイル会の告知 きんちゃんによるLTです。 LTは「自分が好き」とか「自分が素晴らしいと思う」ことを伝える場だと定義した上で、「あなたの属性×あなたの好き・得意」を伝えると、オリジナリティのある楽しいLTができるよ!と、参加した方がLTに出たくなるLTでした! このLTのおかげか、開催後アンケートでも次回はLTに登壇したいと答えてくださった方が約70%ほどおり、「1番いいなと思ったLT」投票においても最多票を獲得したアツいLTでした。 きんちゃんのLT テックブログ執筆が3年後のキャリアに与える影響 なかにしさんによるLTです。 テックブログの執筆を続けていくことで、スキルも向上していき、遂には本も出版できる!というLTでした。 実物を持ってこられていましたが、1087pの分厚い本で、テックブログを書き続けるとこんなに分厚い本を出版できるのかー!?と、驚きました。 https://www.amazon.co.jp/dp/486354104X/ 面倒な予定調整はBookingsにやらせよう 技術と信頼の技信さんによるLTです。 Microsoft Bookingsを使うと、日程調整をはじめ、予約サイト作成やTeams/Outlook連携、アンケート、リマインドメール等を簡単に行うことができるよ、というLTでした! 実際に今年の健康診断で使用され、参加者の方も「あれか〜」というような反応をしている方も何人かいました。(私は入社前でしたが...) Exchangeを基にしたサービスで、不安定さや想定外の事態が起こることもある...と話してくださった実体験も面白かったです。 私も飲み会の幹事になった時に使ってみようかな〜と思いました! 早速使っている! 5分で「モータースポーツ」を見に行きたくさせるLT シナモロールさんによるLTです。 国内で観戦するおすすめのモータースポーツを7つピックアップし、ぜひサーキットに足を運んで観戦してみてほしい、というLTでした! サーキットの観戦ではエンジン音、臨場感・迫力、コース実況、会場での展示物、クルマでの移動などサーキットならではの良さがあり、一度でいいから体感してみてほしいと力説されていました。 そして、サーキットまでの移動はクルマで行くのが断然おすすめ!やっぱクルマいいな→クルマのサブスクKINTO→KINTOかんたん申し込みアプリ使ってね!と、担当サービスの宣伝まで抜かりないシナモンさんでした笑 KINTOがスポンサーをしているチームのユニフォームを着て発表されており、好きが伝わる良いLTでした! シナモロールさんのLT クソアプリ作って煙突詰めた♪ あわてんぼうの Ryomm・クロースによるLTです。 個人開発をするにあたってアドベントカレンダー駆動を提案し、自身の体験として「クソアプリハッカソン」「クソアプリアドベントカレンダー」に参加した話をしたLTです。 このLTをした後、3日でクソアプリアドベントカレンダーに挑んでくれた方もいて、嬉しかったです! RyommのLT LTを受けてアドカレ書いてくれました https://speakerdeck.com/ktcryomm/kusoapurizuo-tuteyan-tu-jie-meta Corporate IT: A new journey! フローさんによるLTです。 ご自身のキャリアとコーポレートITグループでの仕事、将来の展望などのLTでした! KTCの従業員がHappyに働けるようにする仕事だ、と話すフローさんが眩しかったです...!笑 さいごに 社内限定とすることでカジュアルに人前で話す場を作ることができ、社員同士の交流の場ともすることができて楽しいイベントになったのではないかと思います。 室町情報共有会の旗揚げイベントとして大成功だったはず! 個人的な工夫点としては、KTCは割とSlackが静かな方なのでテキストコミュニケーションを活発に行なってもらおうと、実況chを作成してオンラインでもオフラインでも一緒に盛り上がれるようにしたことです。 同時に記録として残すことができるので後から見返してもLTに対する反応などを確認できますし、今回不参加だった方にも次は参加したいと思ってもらえるような盛り上がりを視覚化することができたのではと思います。 アンケート等もSlackワークフローを通してスプレッドシート等に収集することで、極力Slackから離脱せずに楽しむことができるようにしました。 反省点としては、配信で使用したZoomウェビナーのチャットは無効化したのですが、リアクションは有効にしたままだったので、そちらのみで見ている層が一定数いらしゃったことでしょうか。次回以降に活かしていきたいです。 今回はホリデーシーズンだったので、せっかくだからクリスマスも楽しんでいきましょう!とクリスマスコスやシャンメリーなどを用意しましたが、意外な発見としてイベントごとに合わせると軽食が決めやすい!というものがありました。 参加者からも有志からも第二回を開催してほしい!という声をいただいたので、次回も何かイベントごとと絡めたいなと思っています。 LT大会後に忘年会があったのですが、他オフィスの方も配信で見てくださっていたようで「見たよ〜」と声をかけていただいて嬉しかったです。発表者の方も「発表見たよ〜」と感想をもらって嬉しかったと言っており、開催してよかった〜!と感じました。 今後も、こういうカジュアルな発表の場を設けていくことで、社内のいろいろな人の話が聞けたらいいな〜と思います。
アバター
社内限定のLT大会を開催しました! こんにちは、23年10月にKTCに入社したRyommです。普段は my route by KINTO というアプリのiOS開発を行なっています。 さて、今回は弊社の室町オフィスにて社内限定のLT大会を開催したので、みなさまにもお裾分けのレポートです! 開催までの経緯 直属のボスとの1on1にて「最近人前で喋ってないからラフなLT大会とかやりたいっすね〜」という話になり、他のオフィスでは情報共有会という名目でやってるらしいという情報を得ました。 そこで、 (11月21日)timesでやりたいな〜と言ってみたところトントン拍子で話が進み... timesの様子 (11月27日)有志で集まってキックオフMTGが開催され... 実行委員チャンネルの様子 (11月29日)全社員が参加する会議での告知と室町オフィスへの周知がされ... ![室町オフィスチャンネルの様子](/assets/blog/authors/ryomm/2023-12-28-LightningTalks/03.png =400x) 室町オフィスチャンネルの様子 かわいいチラシ作りました (12月14日)タイムテーブルを発表し... ![きゃわいいタイムテーブル](/assets/blog/authors/ryomm/2023-12-28-LightningTalks/05.png =300x) かわいいタイムテーブルも作りました (12月21日)LT大会を実施しました! 会場の様子 ちょうどやりたいと言い出した時から1ヶ月という圧倒的なスピードでLT大会の開催が実現しました! テックブログチームをはじめ多くの方が積極的に参加してくれたおかげで、とても楽しい会になったのではと思います。 さらにコーポレートITグループの方々にも協力していただき、かなり本格的なZoom配信を行うこともできました! 発表者も集まるかな〜と不安でしたが、12名の方にエントリーしていただきました。(中には名古屋からいらっしゃる方も!) 最初は本当にノリと勢いだけで動き出したので、みんなで協力して形にできたLT大会だったと思います。 Lightning Talks 発表してくれたLTを、社内限定ということで色々とゆるめにしていたので全てを公開できるわけではないですが、一部ダイジェストで紹介します。 GitHub Flow+Release PleaseによるTag Based Release ⛩さんによるLTです。 GitHub Flow(Git Flowとの比較含む)、Tag Based Release、Release Pleaseそれぞれについての解説と、これらを統合すると自動でCHANGELOGを生成してくれたり、バージョン管理を簡素化できて便利だというLTでした! 私としては、別バージョンの開発が同時に走っていて、ある機能はまだ公開したくない!というお悩みにも応えてくれていて、Release Please使ってみたいな〜と思いました! ⛩さんのLT モータースポーツ最高峰「F1 (Formula 1)」のマニアックな楽しみ方 mt_takaoさんによるLTです。 F1の面白さを布教するLTでした。自動車を扱う会社ならではのLTですね! F1の世界では1秒差は非常な大きな差であり、1000分の1秒差をどうやって埋めていくか、それがF1の面白さだと力説されていました。 最後には2024年4月5日(金)〜7日(日)に三重県の鈴鹿サーキットで開催される「2024 FIA F1世界選手権シリーズ MSC CRUISES 日本グランプリレース(F1日本グランプリ)」の宣伝で締められていました笑 私もぜひ1度見てみたいと思うLTでした! mt_takaoさんのLT 1月開発編成本部会に向けて ありとめさんによるLTです。 ご自身のキャリアとそこで感じたこと、KTCへの想いと共に「イキイキと働く」ことができるように考えた施策のLTでした。 1月には社内ではじめての大規模イベントを開催されるということで、私も楽しみにしていますー! KTCのこと発信してみませんか HOKAさんによるLTです。 ご自身の広報としての経験と、KTCで組織人事、採用まで関われる人事としてKTCの認知度をアップするための取り組み、そしてKTCについて発信しよう!というLTでした。 一番簡単な発信はXのリポストだということで、私も早速リポストしました😎✨ HOKAさんのLT Sketchy Investment​ 長谷川さんによるLTです。 英語を勉強することは超ハイリターンな投資!ということで、長谷川さん流の勉強術と英語学習の奨励LTでした! 最後は会社に英語学習補助導入への検討の要求で締め括られ、会場は沸き立っておりました笑 私も英語...勉強しちゃうか...!?となるくらいエネルギーに溢れたLTでした! 長谷川さんのLT LT登壇のハードルを限りなく下げるLT+アジャイル会の告知 きんちゃんによるLTです。 LTは「自分が好き」とか「自分が素晴らしいと思う」ことを伝える場だと定義した上で、「あなたの属性×あなたの好き・得意」を伝えると、オリジナリティのある楽しいLTができるよ!と、参加した方がLTに出たくなるLTでした! このLTのおかげか、開催後アンケートでも次回はLTに登壇したいと答えてくださった方が約70%ほどおり、「1番いいなと思ったLT」投票においても最多票を獲得したアツいLTでした。 きんちゃんのLT テックブログ執筆が3年後のキャリアに与える影響 なかにしさんによるLTです。 テックブログの執筆を続けていくことで、スキルも向上していき、遂には本も出版できる!というLTでした。 実物を持ってこられていましたが、1087pの分厚い本で、テックブログを書き続けるとこんなに分厚い本を出版できるのかー!?と、驚きました。 https://www.amazon.co.jp/dp/486354104X/ 面倒な予定調整はBookingsにやらせよう 技術と信頼の技信さんによるLTです。 Microsoft Bookingsを使うと、日程調整をはじめ、予約サイト作成やTeams/Outlook連携、アンケート、リマインドメール等を簡単に行うことができるよ、というLTでした! 実際に今年の健康診断で使用され、参加者の方も「あれか〜」というような反応をしている方も何人かいました。(私は入社前でしたが...) Exchangeを基にしたサービスで、不安定さや想定外の事態が起こることもある...と話してくださった実体験も面白かったです。 私も飲み会の幹事になった時に使ってみようかな〜と思いました! 早速使っている! 5分で「モータースポーツ」を見に行きたくさせるLT シナモロールさんによるLTです。 国内で観戦するおすすめのモータースポーツを7つピックアップし、ぜひサーキットに足を運んで観戦してみてほしい、というLTでした! サーキットの観戦ではエンジン音、臨場感・迫力、コース実況、会場での展示物、クルマでの移動などサーキットならではの良さがあり、一度でいいから体感してみてほしいと力説されていました。 そして、サーキットまでの移動はクルマで行くのが断然おすすめ!やっぱクルマいいな→クルマのサブスクKINTO→KINTOかんたん申し込みアプリ使ってね!と、担当サービスの宣伝まで抜かりないシナモンさんでした笑 KINTOがスポンサーをしているチームのユニフォームを着て発表されており、好きが伝わる良いLTでした! シナモロールさんのLT クソアプリ作って煙突詰めた♪ あわてんぼうの Ryomm・クロースによるLTです。 個人開発をするにあたってアドベントカレンダー駆動を提案し、自身の体験として「クソアプリハッカソン」「クソアプリアドベントカレンダー」に参加した話をしたLTです。 このLTをした後、3日でクソアプリアドベントカレンダーに挑んでくれた方もいて、嬉しかったです! RyommのLT LTを受けてアドカレ書いてくれました https://speakerdeck.com/ktcryomm/kusoapurizuo-tuteyan-tu-jie-meta Corporate IT: A new journey! フローさんによるLTです。 ご自身のキャリアとコーポレートITグループでの仕事、将来の展望などのLTでした! KTCの従業員がHappyに働けるようにする仕事だ、と話すフローさんが眩しかったです...!笑 さいごに 社内限定とすることでカジュアルに人前で話す場を作ることができ、社員同士の交流の場ともすることができて楽しいイベントになったのではないかと思います。 室町情報共有会の旗揚げイベントとして大成功だったはず! 個人的な工夫点としては、KTCは割とSlackが静かな方なのでテキストコミュニケーションを活発に行なってもらおうと、実況chを作成してオンラインでもオフラインでも一緒に盛り上がれるようにしたことです。 同時に記録として残すことができるので後から見返してもLTに対する反応などを確認できますし、今回不参加だった方にも次は参加したいと思ってもらえるような盛り上がりを視覚化することができたのではと思います。 アンケート等もSlackワークフローを通してスプレッドシート等に収集することで、極力Slackから離脱せずに楽しむことができるようにしました。 反省点としては、配信で使用したZoomウェビナーのチャットは無効化したのですが、リアクションは有効にしたままだったので、そちらのみで見ている層が一定数いらしゃったことでしょうか。次回以降に活かしていきたいです。 今回はホリデーシーズンだったので、せっかくだからクリスマスも楽しんでいきましょう!とクリスマスコスやシャンメリーなどを用意しましたが、意外な発見としてイベントごとに合わせると軽食が決めやすい!というものがありました。 参加者からも有志からも第二回を開催してほしい!という声をいただいたので、次回も何かイベントごとと絡めたいなと思っています。 LT大会後に忘年会があったのですが、他オフィスの方も配信で見てくださっていたようで「見たよ〜」と声をかけていただいて嬉しかったです。発表者の方も「発表見たよ〜」と感想をもらって嬉しかったと言っており、開催してよかった〜!と感じました。 今後も、こういうカジュアルな発表の場を設けていくことで、社内のいろいろな人の話が聞けたらいいな〜と思います。
アバター
Thinking About Explanations as a Product Manager — Book review: Product Management in Practice 2nd Edition Introduction I am Kamei from Woven Payment Solution Development G. My team's job is basically to develop a payment system for Woven City. I was transferred to Woven by Toyota, another company in the Toyota Group, and usually work there. Woven by Toyota has several businesses, one of which is the development of Woven City. In this article, I will also follow up on the promise I made to write a book review when I entered the drawing for the product manager release gift. https://www.attractor.co.jp/news/product-management-in-practice/ How I Became a PdM Actually, I am not a Product Manager (PdM). Even now I am not officially one. I just self-proclaimed myself as a PdM. I was originally a software engineer and worked mainly on backend. I was also a utility player and wrote frontend code when asked. I also have experience with code payment systems, which led me to my current job. After that, I also worked as an engineering manager (EM), so I can work in areas like evaluation, organization, and recruitment. However, when I was moved to this project, I was told that I was supposed to be sort of like a PdM, but with more technical knowledge. In retrospect, I should have asked more specifically what I was supposed to do, but probably nobody really knew. While not really understanding my role, I picked out technologies, built the first prototype, recruited more members, and worked in a hybrid role between a lead engineer and an Engineering Manager. I got a lot of questions from other teams and spent a lot of time preparing materials and giving explanations at in-person meetings (called menchaku meetings in Toyota terminology). Even so, I kept doing operational work like the rest of the staff, but as the team size grew, I started being the bottleneck for task completion. Therefore, I talked with the team, explained the payment functions that I think we needed implementation given my knowledge, and we decided that it would be more productive if I assign rather than take care of tasks myself, splitting the roles amongst us. I think from that point onwards is when I was able to start considering myself as a PdM. That was about a year ago. As for the decision to stop operational work, I made a similar decision back when I was an Engineering Manager, so I didn’t have any complaints about it. Probably the day will come where I'll need to work on operational tasks again; but not for now. How I Got Interested in This Book It's good that I realized that I was a PdM, but I still wasn't sure what exactly a PdM does. There were times when I did whatever job I had in front of me, but no one explained what were the results of what I did. I read a lot of articles and books about product managers, but they didn’t really resonate with me, and I was left feeling unsatisfied. I didn't read the first edition of this book, so you could say I didn't look hard enough. Then I read some comments on this book. They were all very positive, and its subtitle "A Practical, Tactical Guide for Your First Day and Every Day After" resonated with me, but they didn’t really make me want to buy it right away. This is an excuse, but I was skeptical because the comments I saw were all from actual product managers, and I wondered if the book could be understood by people who couldn't relate. Then I found out about the gift project. I was so curious, that I just had to enter. The Book Review First of all, this book is really good. It is useful for people who just became a PdM like me or wants to become a PdM, as well as organizations that want to start introducing the role of a Product Manager. It can also help you find out if there's an unofficial PdM in your organization and help you start using product management in your development process. In that sense, you could say that you can use this book from day 0. What is Product Management It's great that this book acknowledges that the role of PdM varies from organization to organization, and that the roles required of a PdM are just as diverse as organizations in the world or the problems they face. However, if that is the case, the role of PdM does not exist. This book rejects clear definitions of PdM and product management. Instead, it tries to outline it with explanations . An example of a good explanation is "Manager of the value exchange between the business and the customer" from another book, " Product Management: Avoiding Build Traps and Giving Value to Customers ". PdMs and organizations that need a PdM must make explanations for the organization based on this and other explanations . This isn't written in the book, but I think whether the explanations match each other’s concept of one is what’s important when recruiting or assigning a PdM. Of course, this is also true for other positions. However, the PdM role is more abstract than others, and I think explanations are also more important. No matter what background a PdM has, they won't be successful in the organization if there are mismatches in the explanations . CORE Skills The author presents these four skills as required for the abstract role of a PdM. Communicate Organize Research Execute Using the first letter of these four skills, we call these the CORE skills . Most of the book describes how to use them. However, that doesn't mean it has chapters named something like, "The Communication Chapter." This book consists of explanations of common development topics and how to use the CORE skills. The chapters focus on different themes, such as communication and organization building, while combining the CORE skills. Was My Problem Solved? Regardless of my job title, I feel that about half of what I do can be considered being a PdM. That alone made reading this book worth it. If you are thinking about adding another PdM to your team other than yourself, you may be able to better restructure your organization if you make a series of definitions on what you want them to do. You might want to try this. If you are determined to continue being a PdM or want to become one, you should make your own PdM explanations that incorporate the CORE skills. Personally, I'm still not ready to do that. Conclusion Once again, this book is a good guide for thinking about the role of a PdM. I think that whether you're a PdM or not, this book lets you think about how you should use a PdM or product management in your organization and how to make definitions . I would like to thank the author, Matt LeMay, the translator, O'Reilly, and also Attractor Inc. for giving me this book as a gift.
アバター
2023年振り返り&2024年展望 KINTOテクノロジーズの景山です! 2023年の振り返りと2024年の展望について書こうと思います。 今年はコロナ禍があけて、世の中があっという間に正常化したように感じています。 といってもコロナが5類移行したのは5月8日ですから、半年ちょっとしかたってないんですよね。 なにかすごく昔のできごとのように感じるのは、5類移行のあと、いろいろなことが目まぐるしく動いたからかな、と思っています。 今年も新サービスや新機能をかず多くリリースしてきましたが、インパクトの大きなものは KINTO ONEのサイト の再構築でした。 再構築中にも既存サイトへの改修をギリギリまで止めない、というチャレンジだったので、2年以上かかりましたが、みなの頑張りで8月にリリースできました。 組織面では、カルチャー&ワーキングスタンスを制定しました。 経営が考えるというよりも、メンバーが自主的に議論を重ねて少しずつ形にしてくれたものです。 これまでは内製カルチャーというあいまいな表現で、我々のワーキングスタイルを表していました。 これでは内製開発を経験したメンバーしか具体的な働き方が分かりません。 それがより具体的に表現されたこのカルチャー&ワーキングスタンスはとても重要だと思っています。 システム、カルチャーの両面でベースが作れた一年でした。 このベースのうえ、来年はさらに進化したKTCをめざします。 そのために、下記の3つを高めていきます。 技術力 開発生産性 リリーススピード 技術力に関しては、今年もテックブログや勉強会を強化してきました。 テックブログを書くことで、あらためて自分のスキルの棚卸しができたり、気になっていた新しい技術やプロセスに取り組んだり、そういったきっかけになっています。 来年はより多くの社員を巻き込んでいこうと思います。 勉強会も社内で開催するのもだけでなく、AWS Summitのような外部のイベントでプレゼンする機会も増えてきました。 また、自分たちで外部の方も参加できるイベントの開催も始めました。 社内だけでなく社外も巻き込んだ技術情報の相互交流により、自分たちの技術力やナレッジも強化されます。 こうした機会も増やしていきます。 開発生産性に関しては、エンジニアの生産性を視える化するツールの導入をはじめました。 徐々に効果が出ていますが、このツールだけでなくさまざまな観点からエンジニアの生産性を高めていきたいと思います。 生成AIの利用にもチャレンジしはじめていますが、実用に向けて組織的な取り組みを増やしていきます。 エンジニアにフォーカスするだけでなく、要求仕様定義からリリースまでの開発プロセス全体を見直して、一般的ではないKTCにもっともフィットする開発プロセスを全社的に展開できたらと考えています。 これはビジネス部門も巻き込んで進めることで、内製開発ならではのやり方で生産性向上につながるものと期待しています。 リリーススピードに関しては、とくにネイティブアプリについて機能の部品化を進めることで、リリーススピードを高められると考えています。 また、開発する機能を必要最小限にすることでプロダクトを早期にリリースし、顧客のフィードバックをもとに改善をクイックにするというやり方ができます。 ビジネス部門からの要求を自分たちで咀嚼して、必要最小限の機能を判断するとともに、エンジニア視点で最小工数になるような仕様変更を提案する。 そしてバッファーはもたず最短のリリース時期を提示し、要件が増えるならそれに合わせてリリース時期も遅らせる。 こうしたやり方はビジネス部門との一体感醸成に大いに役立ちますし、内製開発部隊でしかできないやり方です。 こうした開発スタイルを全社に浸透させていけたらと考えています。 今年も忙しかったですが、来年もさらに忙しくなりそうです。 上記のような取り組みで、プロジェクトを効率的に進められるようになれば、同じ人数でもより多くのプロジェクトを遂行できることになります。 技術力、開発生産性、リリーススピードを高めることでより多くのプロジェクトを遂行できる体制を構築していきます。 来年もKTCをどうぞよろしくお願いいたします。 KINTOテクノロジーズ 取締役副社長 景山 均
アバター
A Look Back To This Year And Into 2024 It's Kageyama, from KINTO Technologies! I will look back into 2023 and look ahead to 2024. This year, it feels like the world quickly returned to normal after the end of the pandemic. However, it's been only a little over six months since the reclassification of COVID-19 to Class 5 on May 8th. It might feel like a long time ago because a lot of things happened rapidly after that. We've released many new services and features this year, but the most impactful one was the reconstruction of the KINTO ONE website . It was a critical challenge not to stop making improvements to the existing site during the reconstruction, so it took over two years, but we have released it in August finally. Thanks to everyone's hard work. On the organizational side, we established a Culture & Working Stance. It was not something management thought of, but rather something that members discussed voluntarily and shaped little by little. Previously, our working style was ambiguously expressed as "in-house culture," which only the members who had experienced in-house development understood. I believe that this Culture & Working Stance, which more concretely represents our working style, is very important. It has been a year where we have been able to build a strong foundation in both system and culture. Building on this foundation, we aim to further evolve KTC next year. To achieve this, we will focus on enhancing the following three aspects: Technical proficiency Development productivity Release speed With regard to technical skills, we have continued to strengthen our Tech Blog and study sessions this year. Writing the Tech Blog has given team members the opportunity to reassess their skills, work on new technologies and processes that they had been curious about, and more. In the coming year, my plan is to engage a greater number of employees in this initiative. This year we also had more opportunities to present at external events such as AWS Summit, as well as to hold study groups internally. We have also started hosting our own events that were open to outside participants. Through mutual exchange of technical information involving talent, not only within the company but also outside, our own technical skills and knowledge will be strengthened. We will also seek to increase these opportunities. With regard to development productivity, we have begun to introduce a tool to visualize engineer productivity. The tool is gradually proving effective, but we would like to increase the productivity of engineers from various perspectives, not just with this tool. We are beginning to take on the challenge of using generative AI, and we will increase our organizational efforts towards its practical application. In addition to focusing on engineers, we would like to review the entire development process from requirement specification definition to release, and develop a company-wide development process that best fits KTC, not relying on common patterns. By involving the business division in this process, we expect to improve productivity in a way that only in-house development can. In terms of release speed, I believe that the speed of releases can be increased, especially for native apps, by promoting the componentization of functions. Also, by minimizing the number of functions to be developed, products can be released early and improvements can be made quickly based on customer feedback. We can digest the requirements from the business department, determine the minimum necessary functions, and propose changes to the specifications to minimize man-hours from an engineer's point of view. If the requirements increase, the release date can be delayed accordingly. This approach is very useful in fostering a sense of unity with the business department and is something that only an in-house development team can do. I hope to spread this style of development throughout the company. This year has been busy, and next year will be even busier. If we can make our projects more efficient through the above efforts, we will be able to carry out more projects with the same number of people. We will build a system that enables us to carry out more projects by improving our technical capabilities, development productivity, and release speed. We look forward to your continued support for KTC in the coming year. KINTO Technologies Corporation Executive Vice President Hitoshi Kageyama
アバター
はじめに I joined KTC in November 2020, developed the front end and API of KINTO Web, and am currently a developer on the mobile Android app team.👋🏾 "I was asked to write my thoughts and experiences on being a woman in IT, but honestly, I do not think there is any gender difference, nor it should be! Since this article is one of five articles in a series exploring diversity, delving into various work styles and perspectives at KINTO Technologies, I would like to share my thoughts and personal progress regarding leadership at the development team I am responsible for at KTC. Here's a quick summary about me : 😊 career history: 💡 Fun fact: Started working in high school with a personal business for 10 years. 🌱 I came to Japan to study game programming and have 15 years of development experience. 💼 Previous Job: Mobile app Engineer, Software(SmartTV) Engineer, WEB Engineer (Full stack),Digital signage startup. 📫 Joined KINTO in 2020. What is a good leader? When I first became a team leader from a developer, the first question I asked myself was “What makes a good leader?” The senior who gave me the role of leader for the first time explained the difference between a leader and a boss, and it was then that I thought I should become a leader like this. A leader is a person who leverages the power of members to work together, create outstanding results, and share them. In order to do that, I think I lead the team from the front and act as a support guide behind the scenes to push the team to move in a good direction. The development team's ultimate mission is to utilize the resources we have to create the services we need as quickly and completely as possible. Additionally, the goal of the development team is not only to develop well, but also to create maximum value through development. In the end, this shows up as a good result of the team, and the idea is that this is a good team and the leader who supports this is a good leader. The importance of ‘teamwork’ So, how can we create a good team that produces results? What does a good team need most? How can you get your team members to focus on one goal? I think the driving force behind this is teamwork. Below, I will share what I did with my team members to encourage teamwork. All team members become leaders We share the current team goals through the “Team Goal Task Content Sharing Meeting” and allow people to choose their own tasks. In general, leadership is only necessary for team leaders and group leaders, and unless you actually hold a position in an organization, you don't see many people who think that leadership is their role. I think a leader should help team members have a sense of leadership in their own work and a sense of “leadership” responsibility for the tasks they are assigned to. And I think this plays an important role in the team. I believe that when there is autonomy, one is motivated and plays a role in raising an individual's capabilities to the highest level. Work is created by development culture I believe that the reason a development team does a good job is not because of the “work,” but because of the team’s “culture.” For example, creating work processes, creating documents, and clearly communicating specifications These are the basics of “work.” I think that successful development teams believe that the team's "culture" makes things work well. How do team members communicate with each other? How do we come together? What do I do after the decision is made? Do you express opposing opinions, do you support them, do you criticize them behind your back? Etc. This is the development culture and this is the team culture Recognizing and embracing diversity Team members each have their own strengths. I think the most important thing is to make the most of its strengths and create maximum value. So what is our team doing? Daily Scrum Leader: Everyone on the team becomes a daily leader Our team holds a meeting every morning at 11am where team members gather together to briefly share what they did yesterday, what they will do today, and work-related blocking issues. What is different from a regular team meeting is that team members take turns to facilitate in a horizontal atmosphere rather than a vertical reporting format. We proceed in a “sharing” manner. If a team member has a problem and cannot proceed with the task, after the Daily Scrum is over, we have a “mutual help meeting” to resolve the problem. Also, since you may not remember all the work you did yesterday, you can write it down in Confluence so your team members have time to see it, schedule and plan what they need to do. This is how the KINTO ONE Subscription Team conducts Daily Scrums. Today’s Daily Scrum facilitator explains the agenda of the Daily Scrum. 'In the first week, we start by sharing what our team needs to improve or try for the next two weeks. Although it is a short period of time (about 10–15 minutes every morning), by having everyone take turns to lead in this way, leadership can be practiced in daily work, and team members can take the lead in sharing the team's current tasks and goals and contributing to the tasks. I believe that by understanding the importance, you can improve your “Leadership Mindset” and eventually it will become your internal motivator that leads to better results. Code Review: Motivation and Autonomy Many developers are highly “motivated” by their creativity. Developers aspire to share their work and expressions with people who appreciate and value them. Likewise, I enjoy seeing what other people have done, immersing myself in the code, and being shocked by other people's ingenuity. Through Code Review time, we can share our work with each other and learn from each other. If there is a better method than the current method, I will share it and make bold changes. Of course, any change must be agreed upon by the entire team. Through this, we grow day by day through discussing good code and exchanging code reviews. I believe that great colleagues and excellent collaboration experiences continue to strengthen trust within the team. Brainstorming: Let’s focus on one goal We take time to think about why we need to do this work and why we need to provide this service to users. We think deeply about how to create, how to communicate, and how to make things happen, and the level of value that the service we will create will give to users. By considering the lifespan of the code, scalability of components, and overall design from the user's perspective, Each developer team member can make technical decisions independently as a development leader for each purpose and function. Our team's brainstorming proceeds according to these rules. Let’s focus on the topic Let’s freely express ideas Let’s combine ideas Come up with as many ideas as possible Don’t evaluate ideas Let’s visualize Decide on an idea If you have decided on your own, the goal is to autonomously create a “prototype” without a complicated communication process and then deliver it to the planning team to turn it into a product. Staying flexible for development culture growth I believe that in the process of taking small actions for the growth of myself, my team members, and everyone, a good development culture will be born and we will all grow together as a result. Personally, I am always grateful to be part of a team with good colleagues. Since our development culture is a means and tool for us to create good services, not the goal, I believe that our team's culture will continue to change and move in a good direction in the future. Lastly, in my opinion, the philosophy of a good leader is to push and support the growth of team members and rather than controlling it, and to establish a good development culture in the team where we help each other. Building a good team like this may not necessarily guarantee greater success, but I believe it can increase the chances.
アバター
Introduction I am Morimoto from KINTO Technologies' New Vehicle Subscription group. I work as a backend engineer. For the 2022 Advent Calendar, I wrote an article about holding a study group for GraphQL: For this year’s 2023 Advent Calendar, I would like to talk about the renovation of our subscription site (KINTO ONE) which I worked on for two years from August 2021 when I joined the company, to its launch in August 2023. More specifically, I would like to focus on the considerations we did when reviewing its table design, which was my first job after joining the company. What Went Into the Table Design Below is an illustration of the table before and after the renovation, although it’s not exactly the same one we work with. The table contains information on employees and can be tracked by logically deleting a record and adding a new one whenever there is an update. Note: A logical deletion is when a record is not deleted, but is flagged and treated as if it is deleted. One advantage is that it can track the revision history of important values. Before Renovation id employee_id mail_address pref group_and_role delete_flag 1 E-001 email1@XX.XX 23 HR_Manager false 2 E-002 email2@XX.XX 25 HR_Staff true 3 E-002 email2@XX.XX 14 Development_Manager false 4 E-003 email3@XX.XX 1 Development_Staff false After Renovation id employee_id mail_address prefecture group staff is_deleted 1 E-001 email1@XX.XX AICHI HR Manager false 2 E-002 email2@XX.XX SHIGA HR Staff true 3 E-002 email2@XX.XX KANAGAWA Development Manager false 4 E-003 email3@XX.XX HOKKAIDAO Development Staff false Each column contains the following information. id : an ID that uniquely identifies a record in the employees table employee_id : an ID that uniquely identifies an employee mail_address : email address pref / prefecture : prefecture group_and_role / group and role : group and role that an employee belongs to delete_flag / is_deleted : whether the record has been deleted The Four Key Areas We Reviewed Not using abbreviations for columns Not replacing values with numbers Not giving multiple meanings to a single column To Not Name Flag Columns _flag 1. Not using abbreviations for columns We did not abbreviate column names, like we did for pref . One can more or less figure out that it represents Japanese prefectures. However, if you use this in documentation or source code, there is a high chance that it will be mixed up with pref or prf . Some people may not know what the abbreviation stands for in the first place. Because of that, we did not use abbreviations, and used full notations such as prefecture , even if they were long. 2. Not replacing values with numbers As you can see in the Before Renovation table, pref has a value of 23. Maybe you can arrive to the conclusion that 23 represents of one the 47 prefectures of Japan, but which one is the 23rd? It is not intuitive, so it's impossible to tell what this value means. Every time you look at a value, you have to refer to a list of numbers and prefectures, which makes it less readable. It also makes it harder to find mistakes. Because of that, we stored the prefectures using their names, such as AICHI . One advantage is that if there is an invalid value, it comes up as an error when it is read into a program. As an example, here you have the structure if we used Java as programming language and JPA was used as an O/R mapper. Also, if we define the enum class of prefecture as follows and use that type with the user entity, it will raise an error if there is an invalid value such as AICHIA . public enum Prefecture { HOKKAIDO ("Hokkaido"), . . . AICHI ("Aichi"), . . . OKINAWA ("Okinawa"); private String value; } @Entity public class Employee { /** ID */ @Id private Long id; . . . /** Prefecture */ @Enumerated(EnumType.STRING) @Column private Prefecture prefecture; . . . } If mapping is not possible, the following exception will be raised. java.lang.IllegalArgumentException: No enum constant com.example.demo.values.Prefecture.AICHIA 3. Not giving multiple meanings to a single column Before the renovation, columns such as group_and_role had two pieces of information in one column: an employee's department and their role. This may seem fine at first, but this makes it less flexible when adding, deleting, or changing a value. Suppose there are four definitions as follows. HR_Manager HR_Staff Development_Manager Development_Staff If you try to rename the Development group to NewDevelopment , the update SQL condition becomes more complex. HR_Manager HR_Staff Development_Manager → NewDevelopment_Manager Development_Staff → NewDevelopment_Staff There are also problems with searching and sorting. Search queries become more complex, and you have to separate the part after the _ (underscore) when sorting. It also makes them less readable. Because of that, for the site renovation, we separated each column so each one has one meaning. 4. Do Not Name Flag Columns as _flag You can see that the delete_flag column indicates that an item was deleted. However, it is unclear whether "true" means it was deleted or not. So, we decided to use the verb "to be" with a past participle, like in is_deleted . This way, it is clear that "true" means an item was deleted, and "false" means it was not deleted. It is important that there are no inconsistencies with the name of the column and the values in it are clearly understood. For example, the is_deleted column lets you logically delete old records when you are updating information on employees. true: deleted false: not deleted If a third state other than true or false appears in a flag column, you should change it from the flag column. Continuous Improvement The design of the tables was not a one-time event, but it kept being refined right till a few months before the official launch. Changing a table while various tests are being conducted, can have a large impact. In addition to improvements added by the development team, it sometimes included updates from feedback of re-run tests that the backend and frontend team did combined. Not only were we able to establish a connection between the backend program and the table, but since we wanted a smooth integration with the API interface, we worked with each team in charge of the APIs as well. I think everyone involved with the project focused on the main goal to renovate, instead of worrying about the scale of the problems in front of them. Another good thing within the backend team was that we could proactively voice suggestions for topics we thought that needed improvement. Not just when it came to the the table design, but the continuous improvement throughout development was I think one of the factors that led to the success of the renovation project. Conclusion We made major changes to the previous tables, such as changing the structure itself and deleting unused columns. This was the first task I was involved in when I joined the company, and I had to start designing the structure of the subscription site without fully understanding its features. In the middle of development, we checked operations, noticed values that were not made permanent, or even found out only during tests that some parts were defined incorrectly. Even after the launch, there were many times when we thought, "Why did we name it like this?" or “Maybe we should have separated the table here.” However, thanks to team members and the people who accepted the changes to the tables throughout the project, we were able to launch the site without issues. As we continue to improve them, we will continue to do out best to make them easier to understand.
アバター
Introduction Hello. I am Shimamura from the Platform Groups’ Platform Engineering team. I am responsible for the development, operation, and deployment of tools based on platform engineering thinking. This is the first technical article of the KINTO Technologies Advent Calendar 2023 GitHub Actions is a CICD tool in GitHub. You probably use Push and Manual trigger (WorkFlow_dispatch) often, but do you sometimes get confused when this is enabled or working? I do. I often have to ask my team members to refresh my memory. In this article, I will organize my thoughts on this. Background I want to summarize what would happen for the trigger events below. on.push on.workflow_dispatch Test Preparation Cases on.push Does it run even without merging the original workflow to the default(main) branch? What if I change the branch that is pushed to after merging the original workflow to the default(main) branch? Are other branches affected when pushing to the branch? on.workflow_dispatch Does it run even without merging the original workflow to the default(main) branch? If I create a new branch, edit the workflow, and push it to the branch after merging, will the changes be applied? Basic code (echo.yaml) name: "TestWorkFlow" on: push: branches: - main - 'test/**' workflow_dispatch: jobs: TestWorkflow: name: "TestWorkFLow Echo" runs-on: ubuntu-latest steps: - name: Echo Branch run: | echo "Branch:${{ GITHUB_REF_NAME }}" Summary of the results Here are the results in one picture. Details on.push Even if you don't merge it, it runs whenever you push if the following conditions are met: There are no syntax errors (although it will be shown as Fail if there is a syntax error) The conditions of the pushed branch match those of the workflow's on.push branch Even if you leave on.push.branches as test/** and create a branch with "feature/trigger-test" and push it, it does not run If you change on.push.branches to "feature/xx" and push, the feature/trigger-test workflow runs Behavior when two of the following branches exist: test/trigger-test with on.push.branches filter set as “feature/xx” feature/another-trigger with on.push.branches filter set as ”test/xx” Even if you fix something and push it with trigger-test, the feature/another-trigger workflow does not work Even if you fix something and push with feature/another-trigger, the trigger-test workflow does not work The "on"-type parameters looks at the contents of the file in the branch where it occurred and determines whether to launch on.workflow_dispatch If there are no files in the default branch, the manual run button is not displayed After merging, we create a new branch and add Inputs When launching manually, we can select branches, so we select the new branch and increase inputs Just like when pushing, it shows the contents of the file in the branch Verification on.push Does it run even without merging the original workflow to the default(main) branch? First, create echo.yml and push. junpei@:test-trigger-repo$ git add .github/ junpei@:test-trigger-repo$ git commit -m "create workflow" [test/trigger-test 43be511] create workflow 1 file changed, 17 insertions(+) create mode 100644 .github/workflows/echo.yml junpei@:test-trigger-repo$ git push origin test/trigger-test ・・・・・・ Total 5 (delta 0), reused 0 (delta 0), pack-reused 0 remote: remote: Create a pull request for 'test/trigger-test' on GitHub by visiting: remote: https://github.com/junpeishimamura-kinto/test-trigger-repo/pull/new/test/trigger-test remote: To https://github.com/junpeishimamura-kinto/test-trigger-repo.git * [new branch] test/trigger-test -> test/trigger-test junpei@:test-trigger-repo$ I thought it would not work the way I assumed it would, but the Action runs. What if I change the branch that is pushed to after merging the original workflow to the default(main) branch? Naturally, even if you create "feature/trigger-test" from the main branch with the trigger condition "test/**", it will not run. If you revise the files in the workflow and modify it as "feature/trigger-test", then push it, it will run. on: push: branches: - main - 'feature/**' workflow_dispatch: Is There Any Effect on Other Branches From the main branch, create "test/trigger-test-other-branch" and create a suitable file. Then push with the following, and it will run. junpei@:test-trigger-repo$ git status On branch test/trigger-test-other-branch Untracked files: (use "git add <file>..." to include in what will be committed) test-branch.txt nothing added to commit but untracked files present (use "git add" to track) junpei@:test-trigger-repo$ git add test-branch.txt junpei@:test-trigger-repo$ git commit -m "create test-branch.txt" git p[test/trigger-test-other-branch 0c738b1] create test-branch.txt 1 file changed, 1 insertion(+) create mode 100644 test-branch.txt junpei@:test-trigger-repo$ git push origin test/trigger-test-other-branch ・・・・ Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 remote: remote: Create a pull request for 'test/trigger-test-other-branch' on GitHub by visiting: remote: https://github.com/junpeishimamura-kinto/test-trigger-repo/pull/new/test/trigger-test-other-branch remote: To https://github.com/junpeishimamura-kinto/test-trigger-repo.git * [new branch] test/trigger-test-other-branch -> test/trigger-test-other-branch junpei@:test-trigger-repo$ The workflow file in this case is "test/trigger-test-other-branch" and is not Main. Additionally, create a new branch called "feature/another-trigger" from the main branch. We keep the branch "feature/trigger-test" that was verified earlier. junpei@:test-trigger-repo$ git switch -c feature/another-trigger Switched to a new branch 'feature/another-trigger' junpei@:test-trigger-repo$ git branch * feature/another-trigger feature/trigger-test Main test/trigger-test test/trigger-test-other-branch junpei@:test-trigger-repo$ Make a file, and without changing the "feature/another-trigger" workflow conditions, push as (test/**). Then you’ll see that the Actions, does in fact, not run. The point seems to be whether it meets the workflow conditions in the operation branch. on.workflow_dispatch Does it run even without merging the original workflow to the default(main) branch? What can you do manually without merging the echo.yml created with on.push into the main branch? Even if workflow_dispatch is in Yaml, the button is not displayed and cannot be moved unless it is merged into the main branch. Since there is no button, it seems that it is not possible to switch the specified branch. If I create a new branch, edit the workflow, and push it to the branch after merging, will the changes be applied? I use it often, so I don’t need to check it. The changes are reflected as I expected. If you press the RunWorkflow button, you can specify the branch, so if you select it, you can run the one that shows the changes. Impressions For on.push, all of the items work as expected except “Does it run even without merging the original workflow to the default(main) branch?” Pushing alone does not register as GitHub Actions. Because it was recognized when it is registered after merging, I fortunately discovered that it was recognized incorrectly after adjusting it. I used the branch condition, but since Tag has the same event-driven type, I think it will behave the same way. I wanted to compare it with Circle.CI and other CICD services, but I think it will work the same way. Unlike GitHub Actions, SaaS-based CICD tools are event-driven and hold back the source code. I think it judges what is in the branch where the event occurred. Conclusion The Platform Engineering team manages and develops tools used internally across the organization. We adopt what other teams in the Platform group have created and based on the company's requirements, we either build from the ground up or migrate components as needed. I also tried it with CDK and started programming with tools other than Managed Service. If you are interested in any of these activities or would like to hear from us, please feel free to contact us. @ card
アバター
​ こんにちは( º∀º )/ 予算統括G、テックブログPJTのゆかちです。 12月24日、本日は有馬記念ですね!わたしの推しはソールオリエンスです🏇 どの馬もレベルが高いので、今年はどんな物語が生まれるか楽しみです・・ ! みなさんはどうお過ごしでしょうか。 さてさて 今回は(自称)U-35×社長の交流会を開催してみた についての記事を書いてみようと思います。 開催するまで わたしが入社したのは2020年12月、丸3年となりました!! 当時は従業員数も少なかったな~と思って確認したところ・・・ 20代:5名 30代:14名 全体:58名 (KINTOテクノロジーズ設立前の 株式会社KINTO 開発編成部 時代) !!!! 少なすぎる・・!! そしてそしてなんと今現在、 20代:43名 30代:131名 全体:360名 なんという成長っぷり・・・ ・・・!!! 成長の裏側は人事採用G、 HOKA 執筆の記事でどうぞ☟ 人事採用グループをつくろう ~3年で社員数300人に急成長した組織の裏側~ | KINTO Tech Blog | キントテックブログ 少人数時代は社内全体の飲み会もあったり横のつながりもありましたが、 この人数ではグループごとの飲み会が限界・・ これだけ毎月のように入社者がいると誰が誰だかわからん状況・・・ そんなときの今回の企画者、アイデア出し得意な ちむりん ! いつも、これやってみようよ! といろいろな案を出してくれます。 社長と直接交流する機会がない!という声や 他部署との関わりがもっと欲しい!の声に応えて 社長×若手の交流イベント開催しちゃお!!といった流れ。 そしてみんなで協力して形にしていきます。 そんなこんなでぱちぱち~! 今回は社長の小寺さんに学生時代や過去の経歴、現職のこと、将来についてなどいろいろなことを話していただきました。 このパートは1時間でしたが、もっと話を聞きたかった!がアンケートにたくさんあがっていました。 さすがお話上手の小寺さん! さてさて わたしの記事あるあるのいい写真が撮れたので見せつけたいだけのコーナーを設ける 雰囲気が伝わればいいなという想い! 滞りない司会さすがでしたありがと! 普段関わりのないいろいろな部署間の交流だ! 入りたてほやほやの新入社員も! 小寺さんはまじめにお話されてたのであまりカメラ向けれなかったのです・・ トリプルゆうじ 弊社の映えスポットで撮りがち お片付けもみんなで協力してワイワイ 会が終わって小寺さんが帰られたあとも盛り上がっており、 なかなか戻ってこないメンバーを心配して見に来た上田マネージャーの会も開催されましたw 『こんなことになっててうれしいよ』からはじまり熱く語ってましたね 今回参加されなかった20代の社員に なんでこなかったの~?と聞いたら もっと堅い会だと思っていた 社長と話すなんて恐れ多い!などの意見をもらいました。 写真を見ていただければ伝わるかと思いますがゆる~い会ですし、 小寺さんはとても気さくで、いろんな人とのむの好きだよ~!って方です。 アンケートを一部抜擢! 一貫して、KINTOのサービスが良いものだということと、車のサブスクの重要性を説いていることが学びになった。 新しいサービスを作っていくのは大変だと思ったが、やり続けること、人と人との繋がりの重要性 を知ることができた。 KTCの成り立ちについて、作り上げてきた当事者である小寺さんの口から聞くことで、リアリティを持って理解することができた 小寺さんのエピソードや話し方、表情から、小寺さんという人をより知ることができた気がした 先のことばかり考えて仕事をしていたけど、 今を精いっぱい頑張ることのほうが大事なのかなと小寺さんの働き方を聞いて思った 小寺さんの人柄を知るとともに、同年代と知り合えるきっかけにもなった 業務で関わることがない方と交流することができてよかった 同年代と似たような悩みを共有できた! アンケート結果を見る限り満足度高そうでよかった・・! 小寺さんにも締めのご挨拶で『正直めちゃくちゃたのしかった!』 とのコメントもいただけまして、第2回も開催予定です!! さいごに 他部署との関わりは偏りがちで、きっかけがないと関わることがなかなかありません。 わたしは非エンジニアですが、同年代のエンジニアたちにいろんなことを助けてもらっています。 たとえば: ちむりん 執筆✏ 書籍の管理方法をラクにした話 これは、なんか管理大変そうだね~、Jira使えばゆかちの負担減るのでは!?って 有志で集結してぱぱっと作成してくれちゃった愛と感動の物語です!ここで自慢しておこう 小寺さんがこの会でお話されていたように、人と人との繋がりは職場において大事だなと。 いろんな部署に知り合いがいると困ったときに相談しやすいし お互い様で協力しあって仕事を進めることができる =職場の環境がよい につながるのでは?! こういう”仲間”をつくるきっかけはいくつあってもいいのではと思うし これからもそういうきっかけの提供をみんなと一緒にしていきたいな~と思います! では、ここまで読んでいただきありがとうございました!メリークリスマス!
アバター
Hi, my name is Tim, and I am from the Global Product Development Group at KINTO Technologies (KTC). Previously, I have written about developing our company's Design System and how it has informed design decisions at KTC. I am also a father of two: a 2-year old daughter and a son who was born in August 2023. Today I would like to talk about my experience balancing fatherhood and professional life. This article marks the fourth installment of a five-part series in our Advent Calendar, exploring diversity and different work-styles in KTC. Fatherhood in Japan When I became a dad for the first time I was already living and working in Japan, albeit for a different company. Taking advantage of one of the longest paternity leave programs in the world I proceeded to take 6 months of paternity leave. While the time spent on bonding with my new child was priceless and I was very lucky for a privilege most countries don't have , I felt that I could have been able to return to work sooner to contribute to relevant projects and to regain a sense of professional identity. When my wife became pregnant with our second child, I was a full-time employee at KTC but I felt torn about whether to take yet another paternity leave. After all, despite generous policies, workplace culture often discourages taking leave. It made me worry about how it would look to take leave, especially as a relatively new employee. Paternity Leave, or Not Amidst these concerns, I learned about the diverse workplace culture at KTC and its flexible work hours policy, both of which alleviated my worries. In response to COVID-19, the company had implemented a temporary policy that encouraged employees to work from home in the morning and then come to the office in the afternoon, providing a practical way to balance work and family responsibilities. This was a game-changer not only to myself, but also to my family. I was able to spend time changing diapers, rocking my crying baby to sleep, and supporting my recuperating wife - all while maintaining a manageable workload in my professional life. Then it crossed my mind that forgoing paternity leave is somehow conceivable, and after lengthy discussions with my wife we have made the conscious decision not to take paternity leave, and instead, leverage the company's flexibility and support to continue with my personal and professional growth. How has the decision affected my work-life balance As I gradually acclimated to the work environment after my son was born, I began to witness firsthand the genuine support from my colleagues, line manangers and human resource department to prioritize family alongside career aspirations. The open dialogue and encouragement from them who had navigated similar experiences instilled a sense of confidence in me to embrace the company's philosophy of work-life integration. My newborn son with congratulatory gift from my colleagues Conclusion Looking back, I realize that KTC's culture made it possible for me to be a dad without feeling like I had to choose between work and family. It's been a journey, but I'm grateful for the support and understanding I found at my workplace. To those who are considering starting a family, I wholeheartedly encourage you to take that step, knowing that our work culture is incredibly supportive of employees with family commitments. As someone who has experienced first-hand the flexibility that KTC offers, I can confidently say that this is a place where you can embrace both your career and your role as a parent. The welcoming atmosphere make it possible to navigate the challenges of parenthood while excelling in your career. Credit Cover Image by BiZkettE1 on Freepik
アバター
Introduction Last weekend, original article published on Jul 2023, there was an announcement from OpenAI, and a ChatGPT (GPT-4) function called Code Interpreter was released. It is a convenient service programmed in Python that allows you to analyze data without code just by giving instructions in Japanese or English. Japanese text cannot be displayed when drawing graphs or doing other tasks, but I have found a way to display Any fonts, and I will explain it in this article. Code Interpreter had its name changed to Advanced Data Analysis on August 29, but it is called Code Interpreter in this article In this article, you can replace Japanese font with any fonts which you prefer to use on ChatGPT. What You Can Learn from This Article The steps to outputting graphs, images, and PDF files with Japanese fonts using Advanced Data Analysis (formerly Code Interpreter) How to analyze X (formerly Twitter) log analytics with Advanced Data Analysis (formerly Code Interpreter) If you don't need an introduction and just want to know how to output graphs, images, and PDFs with Japanese fonts in Code Interpreter, click here . Self-Introduction Though it's a belated introduction, I am Aoi Nakanishi , the lead engineer of KINTO FACTORY . In addition to development, which is my main job, I manage events, the Tech Blog, and the official account from X (formerly Twitter), so I also manage Technical Public Relation activities in our company. Prerequisites To have paid for ChatGPT (ChatGPT Plus) To have Code Interpreter enabled Only the above two are required Enabling Code Interpreter Enable Code Interpreter from Settings -> Beta Features -> Code Interpreter as shown in the image below. You can skip this step. Advanced Data Analysis is already regular feature on GTP-4 Steps to Switching to Japanese We know that Code Interpreter does not draw in Japanese automatically without instructions, so let's explore ChatGPT and what it can do. Draw this in Japanese! First of all, I tried instructing "Draw this in Japanese" but it returned that Japanese fonts cannot be embedded in the current environment. Try to Find Out Why It Cannot Draw Japanese Font Notice that it says, in Japanese, “ in the current environment .” Let's ask how the graph image is generated. Ask How to Draw Japanese Font Since we know that it uses Python and Matplotlib, I will ask it how to display Japanese. As an example, here is the code that came out. It said that I could not download fonts or change my system settings because my Internet access was disabled. I can upload files, but it seems that I cannot download them. I did a separate check, and it seems that I cannot use system functions. Uploading Japanese Font Files It says, " Cannot download ", so I will immediately ask if I can upload, instead. It is possible to upload files, so I will try it right away. Downloading Japanese Fonts The font Noto Sans was written in the sample code that ChatGPT taught me, so I will use Noto Sans. Download fonts from: https://fonts.google.com/noto/specimen/Noto+Sans+JP (There are other usable fonts, although I haven't tested them) Uploading Japanese Fonts and Switching matplotlib to Japanese Let's try generating a graph in Japanese, or any language's fonts. Uploading Japanese(any) Fonts Upload a file by clicking the plus button at the bottom of the screen. In addition, instruct it to use the Japanese font that was uploaded when drawing graphs by telling it, " Please use this Japanese font when drawing graphs ." ↓ ↓ ↓ Summary of How to Use Japanese Fonts in ChatGPT (GPT-4)'s Code Interpreter You can now display graphs in Japanese by following the steps below. Download Japanese(any) fonts locally Upload the fonts to ChatGPT Specify a font to use when drawing graphs in ChatGPT Upload the required data and draw a graph Also, if the title is not in Japanese when the graph is drawn, you can say; Switch the title to Japanese, and see that the title are regenerated in Japanese. Remember to instruct ChatGPT to draw in Japanese using the uploaded Japanese font file. You can use these steps for PDFs and other file types to output files that can display Japanese correctly. Analyzing Logs from X (formerly Twitter) Now that you are ready to output results of analyses in Japanese, let’s start analyzing logs from X right away. https://x.com/KintoTech_Dev We will analyze data for this X account. You can download detailed data from X Analytics and perform various analyses, but today we will do conduct them using publicly available data. We will use the following information: Main body of the tweet Date and time of the tweet Number of retweets Number of replies Number of likes This data is publicly available and can be accessed by anyone, not just the owner of the account. Uploading a CSV File Select a file by clicking on the Upload button just like when uploading a font, and upload the data you want to analyze. I uploaded a CSV file this time, but it seems that it is possible to read basically any data that can be handled by Python. Also, when I checked the maximum file size that can be uploaded, it did not give the exact number, but it said that several hundred MB were acceptable. I upload the file to ChatGPT and ask it to analyze the file. After answering some questions from ChatGPT, it gave the following analysis results. The following are the results, including explanations of the analyses of the number of impressions, number of retweets, number of likes, and main body. Analysis of Impressions ChatGPT: There is no clear trend at any particular time of day or day of the week. However, it seems that the number of impressions is slightly higher at a particular time on Tuesdays than at other times. KINTO Technologies often posts articles on Tuesdays and makes a tweet when they are published. That seems to be the reason for this result. Analysis of the Number of Retweets ChatGPT: Again, there is no clear trend at any particular time of day or day of the week. However, it seems that the number of retweets is slightly higher at a particular time on Tuesdays than at other times. It seems that the number of retweets is proportional to the number of impressions. Analyzing the Number of Likes ChatGPT: There is no clear trend at any particular time of day or day of the week regarding the number of likes, as well. However, it seems that the number of likes is slightly higher at a particular time on Tuesdays than at other times. You can see that impressions, retweets, and likes are correlated. ChatGPT: Since the number of Tweets in this analysis is relatively small, it is recommended that you keep these results for reference only. This is stated because there are parts that are difficult to understand even if you look at the heat map in the results of the analysis, and it seems that it is necessary to increase the number of tweets and followers first. Analyzing the Main Body of the Tweet Here are the results of a topic modeling analysis of the top ten tweets with the most impressions made with ChatGPT. You can see that our desired information is in the results of the analysis. Item Description Visual element that attracts attention Attracts users' attention and increases engagement Use of hashtags Makes tweets easier to find Clear explanation of the subject of the article Explains the subject of the article clearly Specific call to action Includes the specific call to action, "If you are having trouble building and managing your development environment, please take a look!" Advance notice of upcoming articles Garners interest from users and increases engagement by notifying them when a new article is published Emphasize a specific theme Emphasizing themes will attract users who are interested in an event or the company's activities Summary of the Results of the Tweet Analysis From the analysis thus far, we found that the time posted, content, and use of URLs are key factors in optimizing Tweets. Item Description Post time optimization Although it is not obvious, engagement tends to be higher on Thursday and Friday nights. It is possible that users have more free time and search for content more when it is close to the weekend Tweet content optimization A Tweet that is related to an event or the topic of a new article has a high level of engagement Tweets that contain a URL Tweets with a URL to the Tech Blog have a high level of engagement Summary In this article, I explained how to analyze data with ChatGPT's Code Interpreter and create graphs and other files in Japanese. I hope that it will be useful to you in your daily analyses. We will continue to publish useful articles. If you are interested in reading the latest news, please follow us here. https://x.com/KintoTech_Dev KINTO Technologies is looking for talent to contribute in shaping the future of mobility together. If you are interested, please feel free to contact us for a casual interview. https://www.kinto-technologies.com/recruit/
アバター
はじめに 「KINTOテクノロジーズに入社するまで、Web業界は未経験だった」と言うと、えっ?という顔をされます。そんなキャリアの人が何で入社した(できた)んだろうという戸惑いの顔。しかも20代の若手じゃなくて、40代のおっさんが、何で? 異世界の歩き方 もともとは、家電の組み込みソフト開発のプログラマー。そこから車載ECUの制御ソフトを経験して、前職では欧州系の会社でエンジンなどの試験設備を導入するプロジェクトマネージャーをやってました。ソフトはあくまで全体の一部であり、機械/電気/計測/流体/シミュレーションなど、色々なものを組み合わせてシステムを構成していました。 4線式3相交流 の 中性点接地 や 配管のフランジ接続 に 熱交 の 圧損 と ねじり振動解析 や CFD みたいな世界から、クラウドのモダンアーキテクチャの世界です。 まるっきり異世界に飛び込んでから3年と少々。どんな風に歩いてきたか振り返ってみたいと思います。 ![40代のWeb未経験者](/assets/blog/authors/hamatani/20231223/40s_beginner.jpg =480x) 40代のWeb未経験者を生成AIに描いてもらうとこんな感じ プロGのお仕事 配属されたのは、さすがにWebシステムをゴリゴリ開発するエンジニア枠ではなくて「プロデュースグループ」への配属でした。社内では「プロG」と呼ばれています。1名が育休中なので、いま稼働しているのは4名。KINTOテクノロジーズで一番小さなグループです。 バウンダリースパナー プロGの役割について語るとき、人と組織を繋ぐ「バウンダリースパナ―」というのが、いちばん近いと思います。KINTOのやりたいことを実現するためにどんなシステムを作るかを、ビジネス部門のメンバーと一緒に考えて、システム開発部門と繋いでいく仕事です。中でも私は、大~中規模の案件のいちばん上流工程で「システム構想検討」を主に担当しています。 ![プロデュースグループ](/assets/blog/authors/hamatani/20231223/produce_group.jpg =480x) ビジネスとシステムを繋ぐプロデュースグループ(なんか若い) つくりすぎない どんなシステムを開発するか。ビジネスニーズが満たされていることは大前提ですが、それだけでは不十分だと思います。「つくりすぎない」ことが、とても大事です。初期のシステム化要望は、あれもこれも詰め込んだリッチなものになりがちです。ビジネス部門が求める幹となる部分を理解し、本当に必要な機能を特定して、必要十分な開発スコープに落とし込んでいくように心がけています。 KINTOが手掛けるビジネスは、ほかに前例がないものが大半です。事前に頭の中であれこれ想像してシステムを作りこんだとしても、実際にそれが全て役に立つとは限りません。やってみて初めて分かることもあります。まずは必要最小限のシステムでビジネスをスモールスタートし、そこからビジネスの成長に合わせて、システムも段階的に育てていくのが良いと思います。 また、内製開発部隊はKINTOの貴重な戦力なので、そのリソースは無駄なく活用しなければなりません。案件ごとの優先度とターゲット日程に応じて効率的に割り当てる必要があります。開発スコープをコンパクトにすることで、できるだけ短期間で開発し、いちはやく市場に投入していく。そうしたスピード感はKINTOの文化であり強みだと思います。  ビジネス部門の担当者さんは、システム開発への要求出しに不慣れなことがあります。システムを利用することはあっても、なかなか立ち上げに関わる機会はないので、全く初めてというケースも珍しくありません。システムの立ち上げは、家を建てることに似ているとも言われます。どんな家にしたいか、施主さん自身も初めてでよく分からない。プロGは、そうした担当者さんをリードする役割も担っています。 内製開発部隊だからこそ、ビジネス部門と対等にやりあったり、時にはリードしたりして、絶妙な「つくりすぎない」システムを提案することができます。KINTOテクノロジーズ全体に浸透している意識だと思いますが、プロGのミッションはその中核にあると思います。  狩猟系民族 プロGは基本的に自分で獲物(案件)を見つけに行く狩猟系のスタイルです。グループミーティングで新しい大規模案件の噂が出ると皆が目を輝かせます。そして、向こうの山でマンモスを見つけたときのネアンデルタール人みたいに、いそいそと狩り支度を始めます。そうして一番最初に獲物に飛びついた勇者が、その案件の主担当になる。そういうしきたりになっています。 ※実際は勤務地や得意分野を加味して担当割り振りされることもあります。 半分活かして、半分手放す 異世界を歩きはじめるときは、できるだけ身軽にしておくのが良いと思います。 経験をフル活用、しない 新しい場所で心機一転スタートするとき「これまでの経験をフル活用して」と思うかもしれません。即戦力を期待されているのだから丸腰で飛び込むのはちょっと怖い。新しい環境での不安感を支えてくれるのは、これまでの経験しかないような気がします。けど、経験や価値観を抱えたままだと重たいですし、新しいものを取り入れるスペースもありません。過去の実績はもう動かないものだから、抱えていると足に根が生えたみたいになってしまいます。私も初めての転職のとき、それで失敗したことがありました。  忘れてても、ちゃんと助けてくれる だから、半分は手放します。こだわりとかスタイルみたいなものは真っ先に手放してしまいます。半分活かして、半分手放すくらいがちょうどよいバランスではないでしょうか。手放すのは「失う/否定する」ではなく、いったん「置いておく/忘れる」ということ。普段は忘れていても、必要な時にスッと引き出しが開いてちゃんと助けてくれる。誰かが盗んでいくわけではないのだから、ずっと両手に抱え続けることはない。そう考えるとラクになるので、そうしています。 ![経験のストック](/assets/blog/authors/hamatani/20231223/stock_of_experience.jpg =480x) 自分の経験のストックを仕分けする <活かしているもの> プロマネの気持ち 私くらいの世代だと「うさぎって寂しいと死んじゃうんだよ」というのがありましたが、同じくらいプロマネも孤独に弱い生き物です。前職ではひたすらプロマネをやってまして、うまくいってるプロジェクトは良いのですが、うまくいかないと加速度的に孤立化が進むのを知っています。メンバー/顧客/オーナー/上司/財務部門/営業部門/サービス部門/本国/外注先/協業先と、各方面から同時に圧迫されて、あっというまに逃げ場がなくなります(そしてトドメに家庭が…っていう人もいました)。KINTOだと皆優しい感じなのでそこまでには至らないと思いますが、それでも孤独でしんどい仕事です。応援したいと思います。  炎上するプロジェクトは、そもそものベースライン(スコープ, 日程, 完了条件)がグダグダになっているケースが大半です。プロGの自分にできることとしては、そこをちゃんと整えたうえでプロジェクトを渡していくことです。 結局なんとかなる 前職の6年間だけでも40件弱のプロジェクトを回してきました。場数だけいえば多い方だと思います。失敗して青くなったり、予算が赤になってしまったり、先行きが真っ暗になったり色々ありましたが、どのプロジェクトも結局はなんとかなりました。イメージ通りに格好よくゴールできなくて、息も絶え絶えに転がり込んだとしてもゴールはゴール。行き止まりで万事休すと思っても、必ずどこかに打開策はあるはずだという気がします。さんざん痛い目に合いながら性懲りなくそう思えるのが、自分でも不思議です。 多様性があたりまえ 色んな人と仕事をしてきました。国籍だと、ドイツ、オーストリア、フランス、スウェーデン、チェコ、イギリス、インド、スリランカ、マレーシア、タイ、インドネシア、シンガポール、台湾、韓国など(なぜか、アメリカと中国には縁がない)。職種としても、ソフト開発、機械設計、電気工事、配管工事、搬入設置工事、営業、財務、調達、倉庫、ゼネコン、消防署、自動車の設計開発、産業用ロボット、コラボしたライバル企業 などなど。プロジェクトには多様な人々が参加するのが当たり前で、違うから参加してもらう意味があるという感覚です。KINTOにも色んな職種の人や、癖のある人がいて面白いです。 <手放したもの> プロマネは決めるのが仕事 前職の上司が「プロマネは決めるのが仕事」と言っていて、私の実感としてもその通りだと思っていました。判断ミスよりで責められることよりも、判断しないことを責められるほうがより深刻。決めないというのは「プロマネとして仕事をしていない」ということを意味していました。上司に助言を求めることはあっても、判断を委ねることは絶対にありえません。それは、運転席に座りながらハンドルを自分で操作しないのと同じこと。誰かに判断を委ねるようではプロマネとして失格で、運転席から降りるときでした。グローバル企業でしたが、どこの国のプロマネもそんな感じだったと思います。  そんな価値観で過ごしてきたので、驚きでした。KINTO/KINTOテクノロジーズのプロマネの皆さんを見ていると、自分で決めるのではなく、関係者の合意をもって決定としている。このギャップにはかなり戸惑いましたが、そのうち、これもプロジェクトマネジメントの実践としてアリなのだと理解できました。私の前職が Decision and Order の直接的なマネジメントだとすると、KINTOは Facilitate and Agreement とでも言うべき間接的なマネジメントをやってるんだなというのが今の認識です。むしろ、とても高度なことをやられているなと尊敬する気持ちです。全て自分で決めるほうがシンプルで簡単です。 とはいえ、間接的な "合意の促進" だとスピード感には欠けます。直接的な "判断と命令" も個人に委ねるリスクがあります。それぞれの良いとこどりができないものかと思います。 思い立ったら直電 仕事道具といえばガラケーでした。何か思い立ったらすぐに電話。発信も着信も多くて、1日の履歴が数十件になることも普通です。プロジェクトメンバーが全国の現場に散っているので、すぐ捕まえるには電話しかありません。夜中でも平気で電話してました。KINTOテクノロジーズだともちろんそんなことはなくて、Slackを中心にスマートなコミュニケーションが浸透しています。そんな当たり前のことに驚いていた私は、まるで過去からタイムスリップしてきた人みたいだったと思います。 とはいえ、1分の電話で片付く要件が、Slackのやり取りだと30分かかることもあるので、コミュニケーションツールの使い分けというのは必要です。皆さん実践されてると思いますが。 組み込みソフトの常識 私のルーツであり、思い入れが深いのですが、さすがにこれは手放さざるを得なかったです。Webシステムなので、リアルタイム性の要求が無い(応答速度の要求はあるけど、別物)ですし、Event-Mode-Action のステートマシンで動くわけでもない。PIDみたいな連続系の制御システムとも違う。基本的にはハードウェア非依存なので、リソース制約も限定的です。なので泣く泣く、引き出しの奥にしまい込んでいます。AWSのSQSなんかは、昔手作りしたFIFOのリングバッファを思い出して懐かしい気分になります。 それでも、この先もしかしてSDV(Software Defined Vehicle)や IoTみたいなエッジ領域と、KINTOのクラウドに接点ができたら出番が来るかも?と、少し引き出しがウズウズしています。 ざっくり適当に理解する 異世界なので、ただ歩いているだけでも未知のあれこれに出会います。 アルパカを理解する 初めてアルパカを見たとき「首の長いヒツジみたい」と思う人。「毛の白いラクダみたい」と思う人。漢字で 羊駱駝(ひつじらくだ)と書くくらいなので、どっちもアリです。その人の生まれ育ちや直観的な感じ方に素直に従うしかありません。初心でアルパカと向き合って、ゼロから理解するのは今さら無理なので。だから、自分の知ってる〇〇みたいだなと、最初はざっくり適当に理解すれば良いと思っています。  ![アルパカを観察](/assets/blog/authors/hamatani/20231223/alpaca_watchers.jpg =480x) そこまで一所懸命に観察しなくても大丈夫 違うけど、だいたい同じ 違いに着目するより、同じに着目したほうが、異世界に慣れる助けになるはずです。自分も組み込みソフトやエンジン試験装置についての経験から、ざっくり適当に理解することをよくやります。ただそれは「分かったふりをする(他人を欺く)」ではなく「分かった気になる(自分の深掘りをいったん止める)」ということ。知識を実際に使って仕事をするときは「分かっていない」という事実と向き合う必要があります。逆に言えば、それまではいったん浅いところで置いといても、たぶん大丈夫ということ。 正しさよりも全体感 足元をみて丁寧にひとつずつ正しく理解するより、少しくらいの思い込みや未消化な部分があっても良いので、浅く広く全体感を把握するほうが自分には合っているみたいです。点の集合でも、眺めてるうちに隠されたストーリーを何となく感じ取ったり(星座みたいなもの?)、登りたいところへたどり着くための手がかりになったりします(ボルダリングみたいなもの?)。特にプロマネやバウンダリースパナ―みたいな役割は、そういう全体感の把握が助けになると思います。  素潜りできるところまで 全体感を眺めて読み取れるのはあくまで仮説です。「〇〇だとすると、こんな風に進められそうだ」みたいな仮説が浮かんで来たら、必要に応じて深掘りします。今からその領域のプロになる気はない(なれない)けれど、プロの人と会話できるくらいになれれば十分です。私の場合、それでだいたい仕事は進みます。素潜りの副産物としては、それまで点だった知識が繋がって、線みたいになっていくこと。そうやって少しづつ線を繋げて地図をつくっていきます。 反抗期の過ごし方 仕事に慣れてくると、だんだんと湧いてくるものがあります。 違和感とイライラ 誰でも新しい仕事に慣れるまでは謙虚で、少し臆病なくらい周囲の様子を伺いながら過ごしていくと思います。そのうち仕事に慣れてくると、だんだんと湧き出てくるものがあります。「あれ? この会社の仕事のやり方おかしくないか?」みたいな、これまでのキャリアで経験してきたやり方とのギャップから生まれる違和感です。それ自体はとても貴重な気付きで、うまくすれば何かの改善に繋がるかもしれません。けれど、私の場合だけかもしれないですが、そこにフラストレーションが伴うことがあります。なんだかイライラした気持ち。 転職後反抗期 個人的に「転職後反抗期」と呼んでいます。早ければ3ヶ月頃から始まって、2年目くらいまで続きます。3回の転職を経験しましたが、毎度必ずやってきます。違和感自体は良いとしても、イライラを周囲にまき散らすわけにはいきません。自分の場合は 1 on 1 を使って消化させてもらいました。直属の上司と、2コ上の上司と、3コ上の上司に、それぞれ話を聞いてもらいました。話を聞いてもらうためには違和感を言語化する必要があって、まずその過程で客観視するので少し冷静になれます。少し格好つけて提言っぽくまとめたくなります。そうやって率直に対話をしていくと、だんだんと違和感が消化されていきます。 2コ上は副社長、3コ上は社長という距離感。フラットさはKINTOテクノロジーズの魅力です。 違和感を整理していくと、そのいくつかは自分のミッションに落とし込めることがあります。 ![大人の反抗期](/assets/blog/authors/hamatani/20231223/rebellious_adult.jpg =480x) 生成した “大人の反抗期”(1枚目と同じ人が出てきた) おわりに たぶん、今がいちばん積極的に新しい技術や知識に気持ちが向いているかもしれません。 昔の引き出しが開くとき 社内の色んな職種の人の話を聞くのも、社外の展示会や他の企業さんと話をするのも面白い。刺激を得て考え方を再構築するうちに、さび付いていた昔の引き出しがスッと開いて、新しいものと古いものが化学反応を起こすことがあります。ボルダリングの例えを書きましたが、ほんの少し登ると景色が変わって、次に手が届きそうだとか、思ってたのと違うから考え直そうとか、色々と分かってきます。そういう変化を素直に受け入れると、次の変化も楽しめる。逆に苦しい気持ちになる時は、たいていそこに留まろうとしているときでした。 そうやって生き延びていく 「 タイガー手回し計算機 を使っていた」とか「 パンチカード が読める」とか。新卒で入社したころ、そうしたベテランエンジニアの方が現役で活躍されていました。「クラウドネイティブなモダンアプリケーション」も「LLMの生成AI」も、いずれ枯れた技術としてコンピューターの年表に並ぶことになります。技術は移り変わり、求められる役割も変わっていきます。そのとき何をしているか想像もつかないけれど、自分の半分をどんどん入れ替えながら、しぶとく生き延びていければ良いなと思います。 ![コンピューターの歴史](/assets/blog/authors/hamatani/20231223/history_of_computer.jpg =480x) かつての最先端技術とリンゴが並ぶ
アバター
取材対象 KINTOテクノロジーズ内のグローバル開発部には、多国籍で多様な背景を持つDevOpsチームが存在します。 メンバーそれぞれが得意とする言語、技術、経験は異なりますが、チームとしては非常にスムーズに仕事を進められています。 今回は、そのチームリーダーである李さん( Flyway記事の作者 )に取材を行いました。多国籍チームの運営に興味があれば、ぜひご一読ください。 自己紹介とチーム状況紹介 自己紹介 KINTOテクノロジーズグローバル開発部でDevOpsチームリーダーをしています、李です。 卒業後、日本のメーカーのIT子会社で5年間働きました。その間、社内の共通言語が日本語だったため、日本語や日本の文化、さらには異文化とのコミュニケーションスキルを学びました。当時は、Webアプリケーションの開発、設計、評価から始め、システムエンジニアとプロジェクトマネージャーとしての経験を積みました。開発経験だけでなく、開発プロセスとマネジメントの知識も身につけました。 その後、大学で3年間講師を務め、新しい技術と教育学を学びました。これにより、効率的な学習方法についても理解を深めました。 日本に移住した後、次女が保育園に入園したのをきっかけに、IT分野に復職しました。 これまでの異文化コミュニケーションスキルや開発経験、マネジメント能力や人材育成の経験を活かし、現在はグローバル開発部でDevOpsチームのリーダーを務めています。 チーム状況紹介 現在、私たちのDevOpsチームはCI/CD、インフラ、テストの3つのサブチームで構成されています。チーム内6人が下記のように、国籍も専門分野もそれぞれです。 DevOpsチーム設立当初からの理念は、あえて異なるスキルセットを持つメンバーを組み合わせることで、アプリケーション開発チームをサポートすることです。 No. サブチーム 前職経験 国籍 英語力 日本語力 1 CI/CD 開発、プロジェクト管理、品質保証、システム設計 中国 B B 2 Infra Infraエンジニア、プロジェクト推進、インテグレーション、設計 中国 C A 3 Infra Infraエンジニア、開発、プリセールス 中国 C B 4 Test ネットワークエンジニア、プロジェクト管理 ニュージランド A C 5 Test 開発エンジニア インド A C 6 Test テスト、開発、設計 ミャンマー B C *語学力: A:細かいニュアンスまで再構成して表現できる B:幅広い複雑な話題でも議論可能 C:自分の考えとその理由を表現できる D:日常会話可能 Q&Aコーナー 多様な言語、文化、技術背景を持つチームの日常業務は、想像しにくいかもしれません。 そこで、今回はチームリーダーの李さんにいくつか質問をしてみました。ここではQ&A形式でまとめ、チームの様子を少しでも皆さんに伝えられればと思います。 Q&Aその1 質問: チーム内に様々な専門経験を持つメンバーがいる中で、皆をDevOpsチーム共通の目標に向かわせるにはどのようにしていますか? 回答: 私たちは、下記のようにチーム内で明確なロードマップを共有し、それに基づいて目標を具体的にし、メンバー全員が同じ方向を目指すようにしています。 チーム内には、品質保証をしたい人、インフラを担当したい人、開発に携わりたい人など、様々な希望を持つメンバーがいます。私たちは、それぞれの強みや志向を理解し、皆が納得できるロードマップの作成に努めています。 ロードマップ(例) Q&Aその2 質問: チーム内の7人は4つの異なる母国語を話します。コミュニケーションにはどの言語を使用していますか?文書やメッセージはどうですか? 回答: 口頭でのコミュニケーションや文書の作成は、その人が得意とする言語(英語または日本語)を使用しています。 チーム全員が英語を理解できるため、メッセージは主に英語で送信しています。また、理解を深めるために翻訳ツールの利用も推奨しています。 多言語コミュニケーションでは、発表者がゆっくりと話し、簡単な単語を使用するよう努め、わからないことはすぐに質問する雰囲気を作っています。 Q&Aその3 質問: 文化的にも技術的にも多様なチーム内での知識共有はどのように進めていますか? 回答: 私たちのチームでは知識共有を重視しており、下記の三つの方法を用いています。 期間 手段 内容 目的 アイスブレーキングフェーズ 各メンバーの専門分野について知識共有会 今までの領域の知識 お互いに理解し、自身の知識を広げること 配属から一年後 オンラインコース学習(Udemyにある自動テストツールやマイクロサービスアーキテクチャなどのコース) 仕事に使うスキルで足りない部分(システムアーキテクチャとか、自動テストツールとか、AWSとか) 今の仕事上必要なスキルの向上 随時(異なるタスクが終わった後) ドキュメント化して残す 手順やノウハウなど( 自動テストのブロック  ) 将来横展開しやすくするため Q&Aその4 質問: 母親として、異文化間のチームをリードするのは難しいですか? 回答: 私が母親であることに対して、チームは非常に理解があり、親切です。グローバル開発部の文化として、多様性を尊重し、互いに敬意を払い、適切な距離感で接しています。自分は小学生の子供を2人持っており、学校行事への参加が必要な時、チームメンバーは日程調整やタスクの再配分を通じてサポートしてくれます。 例えば、最近家族全員がインフルエンザにかかった時、約2週間出勤できませんでしたが、チームメンバーが積極的に業務を引き受け、私の負担を軽減してくれました。 そのサポートにはとても感謝しています。 Q&Aその5 質問: 多国籍なチームを管理する際、どのようにして様々な標準(労働倫理やプロフェッショナルな基準など)を統一し、メンバーのモチベーションを維持しつつ、一定水準の成果を出すことができますか? 回答: 異文化の合理性を認め、尊重することが重要です。私自身も外国出身であるため、日本と海外の慣行の違いを理解しており、この視点からチームに説明することができます。ここは日本なので、基本的には日本の標準を遵守していますが、外国人の視点からの解説も提供しています。 また、管理学やPMP(プロジェクトマネジメントプロフェッショナル)などの知識を活用し、業界共通のやり方を取り入れています。 チームでは、メンバーに広範な裁量を与え、彼らが望む仕事を行うことでモチベーションを維持することを重視しています。 最後に 質問: こういった多国籍なチームをまとめる上で、李さんが一番大事にしていること、または工夫しているところは何ですか? 回答: やはりコミュニケーションが最も重要だと思います。PMPの理念に沿っています。私たちのチームでは、皆が明確かつ具体的に自分の考えを伝えることを心掛けています。仕事の中で、いつも「5W1H」を用いてコミュニケーションを取っています。また、異なる考え方にも敬意を払います。基本的に、人々が異なるということを認識した上でコミュニケーションを行っています。 質問: チームメンバーからもサポートがもらえるのは信頼があるからだと思います。その秘訣はありますか? 回答: 普段の業務では、私自身もメンバーのサポートと指導に意識的に取り組んでいます。メンバーがそれぞれの目標を達成できるよう協力しています。私たちは一つのチームとして、各々が欠かせない一員であり、共に目標達成を目指しているため、リーダー・メンバーというポジションの関わらず、お互いにサポートし合えているのだと思います。やはり素直な心が必要だと思います。 まとめと今後の展望 この記事ではグローバル開発部DevOpsチームのリーダーである李さんにインタビューをし、多国籍なチームでの異文化間コミュニケーションや知識共有の方法、母親とチームリーダーのバランス、そして多国籍なチームのマネジメントなどについて取り上げました。 最後の回答にあったように、多様な背景を持つチームであっても、常に「人は異なる」ということを意識し、異なることに敬意を払い、5W1Hなどを通じて考えをわかりやすく伝える。こういったことの積み重ねによって信頼が生まれ、同じ目標に向かって効率的に互いをサポートし合えることがわかりました。これは決して多国籍なチームだけではなく、同じ国籍であっても同じことではないでしょうか。 多様な背景を持つチームのマネジメントに悩んでいる方にとって、この記事が少しでも参考になると幸いです。 今後、DevOpsチームは事業の展開やテクノロジーの進化に伴い、さらなる挑戦に直面することでしょう。 しかしこれまでの取り組みと、多様性を受け入れられるチームの精神があれば、どんな障害も乗り越えていけると、チームの今後の成功と成長に期待しています。
アバター
はじめに Mabuhay!前回のブログからほぼ1年が経ちましたが、私は今でもKINTOテクノロジーズのグローバル開発グループの陽気なメリーです。(ちなみに、私の最初のブログは こちら でチェックできます。) さて、昨年から何が変わったでしょうか?担当しているタスクでまったく余裕がないときがあり、パーソナルアシスタントがいたらいいなと思う時があります。必須と思われるタスクで、でも自分自身でやると時間がかかりすぎるものを追跡するのを助けてくれます。アシスタントをつけることができれば、他にやらねばならない、より重要な事柄に集中することができます。 パーソナルアシスタントのこういった役割は、フロントエンドの状態管理に似ています。状態管理とは、変更点やアクションを追跡し、アプリケーションが期待通り正しく実行されているか確認することを言います。stateはアプリを動かすために必要な情報であり、アプリケーション開発全体を通して管理する必要があります。 状態管理の力を解き明かす 💪 KINTOのバックオフィスシステムには、ウェブサイト全体で複数のデータをダウンロードできるものがあります。最初は、1回のダウンロードが完了するまでに1、2秒しかかかりませんでした。しかし、時間が経過するとデータ量が大きくなり、ダウンロードするのに数秒から数分かかってしまうようになってきました。そうなると、処理中には何も表示されないため、ダウンロードボタンをクリック後、ユーザーが何が起きているかわからず、混乱させてしまいます。こういった混乱を避けるため、ダウンロード通知コンポーネント画面を表示させることにしました。ダウンロードのステータスを表示し、残りのダウンロード件数もわかるようにします。 ![Download Component](/assets/blog/authors/hundanmz/downloadComponent.png =370x) 私は、このプロジェクトに関わる中で状態管理について知り、フロントエンド開発において、状態管理が大変効果のあるものだとわかってきました。 レスポンシブユーザーインターフェイス - 当ウェブサイトにはダウンロードボタンのあるページが複数あり、ユーザーがそのボタンをクリックするとカウントアイコンが更新され、進行中のダウンロード件数が表示されます。 精度 - ダウンロード通知コンポーネント内の表示は、ウェブサイトのダウンロードボタンに依存しています。stateは信頼できる情報源であり、ユーザーがダウンロードボタンをクリックするたびに更新されるため、ユーザーに表示する内容の正確性を担保することができます。 簡単なデバッグ - stateが1 か所に保存されるため、より迅速にデバッグできます。 メンテナンス - 状態管理で再利用可能なコードを作成できるため、コードの可読性が担保され、維持が容易になります。 VueXではなくPiniaを選択 ![Pinia VueX Logo](/assets/blog/authors/hundanmz/piniaVueXLogo.png =150x) 私はこのプロジェクトを通して初めて状態管理を意識するようになったため、同僚からPiniaと VueXについて教えてもらいました。これらはどちらも Vue.jsの状態管理ライブラリであり、どちらを使用するかは自由に選択できます。これら2つのライブラリをある程度調査した結果、主に次の理由により、VueXではなくPiniaを使用することにしました。 モジュラー・バイ・デザイン - Piniaでは複数のストアを作成し、必要なコンポーネントのみにインポートできます。一方、VueXでは1つのストアしか提供していません。このプロジェクトで必要なのはダウンロード用のストア1つだけでしたが、将来的にはこれだけでは足りません。遅かれ早かれ別のモジュールを追加する必要がある場合には、管理が簡単になります。 よりシンプルなAPI - シンプルなAPI のおかげで、状態管理を簡単に始めることができました。stateはアクションで直接更新でき、mutationsは廃止されています。 Vueの公式状態管理ライブラリ - これが、私が VueXよりもPiniaを選んだ一番の理由です。Piniaは現在、Vueの公式状態管理ライブラリです。VueXは引き続き使用できますが、すでにメンテナンスモードになっており、新しい機能追加はありません。 状態管理ライブラリの代替について検討 状態管理/ステート管理ライブラリを一切使用しないことにした場合、ステートを管理する方法は他にもあり、これらのソリューションのうちどれが私たちのニーズに合っているかを評価する必要があります。以下にソリューションの一部を示します。 Propsとイベント - 親子間のコミュニケーションが必要なら、これが一番の選択肢です。親はデータを子に渡すことができます。一方、子はイベントを送信して変更を親に伝えることができます。 ローカルストレージ/セッションストレージ - 永続化したいデータがある場合は、ブラウザのローカルストレージ/セッションストレージを使用できます。 これは、ユーザー設定を保存するなどのシナリオに最適です。 イベントバス - 伝達を円滑に進める必要のある関連性のないコンポーネントがある場合は、イベントバスを使用できます。この方法は推奨されませんが、単純なシナリオでは使用できます。 終わりに 状態管理はフロントエンド開発において重要な役割を果たします。アプリケーションが大きくなるにつれて、管理する必要のある状態がますます増える可能性があります。Piniaは使いやすい状態管理ライブラリで、私のような経験の少ない開発者にもわかりやすいです。 こちらの投稿では、技術的な詳細は延べませんが、Piniaを使用したときにもいくつか問題が起きています。また次のブログでお話ししたいと思います😊 参考 Pinia What is Vuex? | Vuex The Power of State:A Deep Dive into State Management State Management in Frontend Development:An Overview and Case Study Advantages of Pinia vs Vuex Vue.js State Management:Pinia vs.Vuex Vue.js Events API | Vue 3 Migration Guide
アバター
Hello, I am Saju Mathradan, Cyber Security Expert from KINTO Technologies (a Toyota Group company). In this blog, let me write down some of my experiences in working for tech companies in Japan, from cultural nuances to professional growth opportunities. This article is one of five articles in a series exploring diversity, delving into various work styles and perspectives at KINTO Technologies. I am always fascinated about the technological innovation of companies in Japan, given that it stands in a very attractive destination with a cutting-edge and high end technological landscape. My experience in Japan In my 26 years of professional experience, I lived in Japan for 15 years, in between staying in other countries and working for global projects too. However, I was lucky to have worked with some of the leading companies in Japan to manage and transform their IT environment to the latest technologies. Before joining KINTO Technologies, I was working in the IT Security Department of Japan’s number one and world’s third largest apparel company for 6 years, and before that, with Asia's largest Japanese pharmaceutical company, and other local and global large enterprises part of IT outsourcing deals. Cultural Connection In my experience, technology in Japan is in its transformational period. Japanese companies have a larger global outlook than before, eager to expand business internationally and tapping into diverse global talent pool. Global workstyle and processes are followed for greater international integration in tech companies, and this often involves a strong emphasis on teamwork, collaboration, and dedication to the collective goals of the organization. I found that KINTO Technologies is also not far behind as a 100% Toyota owned company, working well within the “Toyota way of culture” and providing a global environment that helps employees collaborate across regions. Together, we strive to create the future of mobility and contirbute to make the world a better place. Language Requirements In Japan, language always creates barriers to global workforce integration. While English is widely used in the tech industry these days, having a basic understanding of the Japanese language can be an asset. At KINTO Technologies, we never faced any big challenges using English for our daily work. Having diverse team members from different countries helped us to use English as a more of common medium along with Japanese. Challenges in Daily Work In my experience, Cyber Security awareness is low in many companies as the cultural thinking in Japan is that bad things can’t happen to anyone, and trust is placed in a very high level. However, with the prevalence of fraudulent access, data hacking or money laundering being common on the Internet these days, there is no boundary for threats. Japanese companies appear too vulnerable in this regard. As a Cyber Security expert, it is quite challenging for me to prepare fool proof security control and framework to protect a company's critical applications, infrastructure, data, and access to the services securely from the internet. This is particularly true when dealing with new and emerging technology requirements of “Mobility as a Service” as well as associated E-Commerce transactions and the increasing use of online services by both customers and employees. Preparing the security framework as given below in the picture and working to ensure the data and its access is safe and protected end to end is complex and needs a heterogeneous approach. Technology fascinated employees and supportive management of KINTO Technologies make my life easier to achieve the required goals. Moreover, I am very happy to be involved in the various levels of Mobility as a Service IT Environment. Technology Landscape When I experienced Japan's IT landscape, I noticed that some of the companies are still using very old and obsolete technologies and are slow in upgrading. However, at KINTO Technologies, I found that all new generation cloud technologies and tools are already in place. Whether you're interested in artificial intelligence or cutting-edge software development, KINTO Technologies offers a diverse range of opportunities to align employees’ career with their passions, or networking events such as meetups (NomiKai), and industry conferences to connect with like-minded professionals and stay abreast of the latest trends. Professional Development Whether it is management or technical ladders, tech companies in Japan provide employees with ample opportunities for professional growth, and I was fortunate to be able to get such good opportunities in my career from all my employers. At KINTO Technologies, it is always at par with the global industry standards. The management always encourages employees to attend industry conferences to collaborate with top-notch experts, and maximize the learning curve, enhance skill development and progress in their careers. Work-Life Balance Whether it was my previous companies or now in KINTO Technologies, I was always explained by HR team the importance of maintaining a healthy work-life balance and that it's a cornerstone of the Japanese ethos. These days companies are increasingly recognizing the importance of employee's well-being, offering flexible work hours, remote work options, and wellness programs, etc. Striking a balance between professional and personal life is not only encouraged but is also seen as a sign of a well-rounded and effective team member. Conclusion In my opinion, working for a tech company like KINTO Technologies or others in Japan, will be an exciting journey filled with professional growth and technological innovation. As Japan continues to be a global tech powerhouse of manufacturing and high-end technology, the experience of working in tech companies in Japan can be a transformative chapter in one's career, offering chances into the future of technology connected with the beauty of Japanese culture. Join and Experience!
アバター
はじめに こんにちは、KINTOテクノロジーズ新車サブスク開発グループの阿出川です。 アプリケーションエンジニアとして国内のトヨタ新車サブスクリプションサービス「KINTO ONE」の開発・保守・運用に3年間従事しております。 自動車が大好きなので仕事を通して関われてとてもハッピーです。 今は家族優先でミニバンに乗っておりますがいつかトヨタのGR車種に乗りたいです! 好きなエンジン機構は「カムギアトレーン」です! そんなわたしが今まで関わったプロジェクトで特に印象深く達成感が大きかったお話を紹介しようと思います。 新型プリウス発売に備えよ 2023年1月10日 新型プリウス(5代目)が発売されました。 プリウスといえばハイブリッド車の先駆けで環境車としての確固たる地位を築いたトヨタの中でも注目度高い車種ですよね。 しかしプロジェクト発足当時のプリウス(先代)は既に発売からだいぶ経過していたこともあってKINTO ONE取扱い車種の中で特に人気が高いわけではなかったです。なので個人的には新型が出ても特段反響が大きいとは考えておりませんでした。 しかし掲げられた目標は*,990 PV/分 耐えられる事! (この数値は過去最高負荷時の10倍) その時点で許容可能だったのは目標値の3%程度でした。 主な対策ポイントは③点です。 対策① Databaseの接続先調整 RDBはライターインスタンス、リーダーインスタンス1台という構成でしたがフロントからは参照系のアクセスの方が圧倒的に多かったのでリーダーインスタンスに負荷が偏りライターのインスタンスの方は余裕がありました。 暫定的にフロントからの接続先を参照・更新問わずライターインスタンスへ接続させるよう設定変更しました。 結果、意図したとおりに負荷が分散されました。 リーダーインスタンスを追加するより手軽だったのでまずはこの方法を取り入れました。 対策② 見積画面の改善 トップ画面に次いでアクセスが多いのは車種ごとの見積画面になります。 ここでは自動車のグレード、パッケージ、オプションなどを選択しますがその車両マスター情報をリレーショナルデータベーステーブルから取得しておりました。 これをインメモリのkey/valueキャッシュ(Elasticacheのredis)に格納された車両マスタ情報から取得するよう変更し、DB負荷軽減とフロントレスポンスの改善を図りました。 次にキャッシュ化出来なかった情報でDB負荷の高い箇所を特定しました。 見積~申込までは車両情報の他、販売店店舗情報のマスタテーブルの参照しており、slow queryに挙がってくるような問い合わせは行われていないのですが発行回数が多いので塵も積ればとやらで比較的costの高い箇所は対象テーブルへINDEXを追加しquery costは全て一桁台に改善させました。 対策③ インフラ増強 ①、②の対策に加え目標数値に耐えられるよう後はインフラの構成見直しで調整します。 特別な一時的な対応という事で手動スケーリングで次の通りインフラ増強を図りました。 スケールアウト AWS service 台数-変更前 台数-変更後 EC2 Front End 6 36 EC2 Back End 2 15 スケールアップ AWS service タイプ-変更前 タイプ-変更後 EC2 スケールアウトのみ Elasticache t3.medium r6g.large RDS r5.xlarge r5.12xlarge その他 急激なアクセス増加に耐えらるよう予めALBの拡張を行う為、暖気運転が必要との事で下記の情報を添えAWSへ暖気申請をしました。 予測されるピーク時間帯 予測されるピーク時のリクエスト数 トラフィックパターン ユースケース etc 発売当日を迎えて 負荷としては準備していた許容範囲に対して実際のアクセスはピークで10%程度でしたがトラブルもなく発売当日から安定し稼働しました。 お客様からの反響もよくKINTO専用グレード含めたプリウス全体の流入(見積・申込)は期待通りだったようです。 しばらく推移を見守り落ち着いたところで暫定的に対応していた箇所は元に戻し終了しました。 さいごに 滅多にない大きなイベントだったので大変貴重な経験だったなと思っております。街中でプリウスを見かける度に気になり目で追ってしまうようになってしまいました。KINTOのかな~?って 結果をみるとインフラのスペックは過剰であったようですが事前に正確に流入を予測する事は不可能且つミスするわけにもいかなかったので良かったのだと思います。 年末から年始にかけての忙しい時期にも関わらず様々な方々にご協力いただき無事に乗り越える事が出来たと思っております。 負荷のテストプラン、スケジュールを管理してくださったベンダー会社の方々。 サーバ増強に伴うサービス停止に付き合ってくれた対向システムのメンバー。 インフラ増強に関してはプラットフォームGメンバーにアドバイス助言を頂きました。 この場でもお礼の言葉を残しておきたいと思います。ありがとうございました。
アバター
Hi, this is Mori again from KINTO Technologies (KTC). I’ve been writing blogs, including co-authored ones, and I just can’t believe this one is already my 10th article! Almost all my posts in the Tech Blog are about event reports, but today, let me talk about a story from my daily work. Well, I usually work as a Product Manager (PdM) of the Global KINTO Web and project lead of PII (Personal Identifiable Information) related tasks in the Global Development Division. Since PII tasks are mainly about the user pool of each KINTO services around the world, both of my tasks are rarely linked together. But for once, it did! We took care of activities to comply with GDPR on the Global KINTO Web. Finally, the time has come for my two main jobs to intersect! 👏👏👏 If you would like to know more about our GDPR compliance activities related to transferring personal information globally between each KINTO user pool, you can check out my previous article Compliance with GDPR in the Global KINTO Looking back, since it was my debut article, it’s amusing to see how the writing is too stiff and serious😂 What is GDPR? Who is the Target? Before starting to write this article, I reread my previous one and realized that there is no explanation of 'What is GDPR?' OMG🤦‍♀️ Let me explain about it now. GDPR is the acronym for the General Data Protection Regulation and it’s a legislation within Europe. It regulates how to protect and process personal data within the European Union (EU) and the European Economic Area (EEA) The purpose is to protect the personal data of individuals residing within the territory. The target is residents, regardless of their nationality This of course means that companies in the EU should comply with the GDPR. However, even companies outside of the EU might be targeted for the following reasons: When a company has branch or a subsidiary in the EU When a company provides products or services for the EU When a company is entrusted to process personal data of EU residents to a third party For example, even if the language of a website is English, it might be out of the scope of GDPR if EU customers are not the target. On the other hand, if your services target inbound customers visiting your country, you are likely to be subject to this regulation. Global KINTO Web and GDPR Tasks The Global KINTO Web is a brand website of KINTO services which are available in +40 countries around the world. Since many KINTO services are available in Europe, European customers are also the target audience of this website. That is why compliance with GDPR cannot be ignored. Of course, we set up policies at the time of release. However, the situation has changed significantly since the beginning, with changes in operational structure, updates to features, and revisions to regulations, among other things. We have decided to re-establish policies and other compliance activities with the support of an external lawyer. In the Global KINTO Web, we collect customer information, such as names, email addresses, phone numbers, etc., through the inquiry form. Additionally, we use cookies to enhance our website. Cookies are classified as “Information related to personal information” according to Japanese regulation, but they are considered as “Personal Information” in GDPR. Thus, if the website is targeting European customers, compliance with GDPR is necessary even though the website collects only cookies from users. As a side note, in GDPR itself, cookies are only briefly mentioned in Recital 30 . For details, they are more concretely and comprehensively regulated in the ePrivacy Directive (EPD) , also known as the cookie law. Well, what should we do to collect cookies? Here are the specific tasks: Receive users’ consent before you use any cookies except strictly necessary cookies. Provide accurate and specific information about the data each cookie tracks and its purpose in plain language before consent is received. Document and store consent received from users. Allow users to access your service even if they refuse to allow the use of certain cookies Make it as easy for users to withdraw their consent as it was for them to give their consent in the first place. Cookies, the GDPR, and the ePrivacy Directive - GDPR.eu GDPR requires establishing a Privacy Policy and other measures, but the tasks mentioned above are additionally requested to collect cookies. I guess you’ve all seen various websites with pop-ups or banners regarding cookie collection (Cookie consent pop-up). THAT is mainly what it is. Cookie Types 🍪 Cookies can be classified as 4 categories by its purpose. Category Contents Strictly necessary cookies These cookies are necessary for the website to function properly. For example, these cookies may store items in the cart of an e-commerce site or maintain language settings. Disabling these cookies may result in the website not functioning properly. Consent from the users is not required. Also, they do not store information that can identify individuals. Functionality cookies These cookies are used to personalize the experience by remembering choices users have made in the past. For example, these cookies determine which area's weather news should be shown or what the user's name is, etc. They are also known as “Preferences Cookies” Information that can identify individuals is not stored. Performance cookies These cookies are used to improve websites. They collect information about how a user uses a website such as pages visited, links clicked and so on. All data is anonymized, and information that can identify individuals is not stored. They are also known as “Statics Cookies” Targeting cookies These cookies track user’s online activity and show personalized ads based on their interests. This information might be shared with other organizations or advertisers to measure the performance of ads. Targeting cookies are also known as “Advertising Cookies” since they are mainly used for advertising. Global KINTO Web collects “strictly necessary cookies” and “performance cookies” from the above categories. As mentioned in above, since strictly necessary cookies are mandatory for the proper functioning of the system, such as keeping language settings or items in an e-commerce site’s cart, user’s consent is not required. However, we had to implement a mechanism to acquire consent and withdraw consent easily in order to collect performance cookies. Issues on Cookie Consent Pop-up While we consider the implementation of the cookie consent pop-up, we have faced one issue: the sample size of user data might be significantly reduced compared to what we currently could. That’s because there are many users who reject the collection of cookies feeling anxious to provide this mysterious data called cookies. There may be some readers among you who find it annoying and click on "just reject for now!🙅‍♀️" as they are repeatedly displayed on the screen, don't you think? Thus, we will deep-dive on the need of this cookie consent pop-up. As mentioned earlier, the pop-up is necessary to comply with the European GDPR. However, according to the interpretation of Japanese regulations (such as the Personal Information Protection Act and the Cookie regulations based on the Telecommunications Business Act), it may not be required in some cases. For our Global KINTO Web case, too, we have judged there is no need to implement it globally, except for Europe. (Of course, with advice from our external lawyer.) Please note that although it’s not required from a legal point of view, a website might display a cookie consent pop-up intentionally as a form to display CSR. We reached this decision by weighing the practical operation against other advantages. For more information regarding the interpretation of Japanese Amendments to the Act on the Protection of Personal Information, you can visit this article from TOPCOURT Law firm which explains it well. Preliminary Study We decided to display the pop-up only for Europe, but we studied how other websites do it, just in case. Luckily for us, there was a team member who traveled back to her home country in Europe! So we asked her to research how other websites display them, given that cookie consent pop-up is not shown in Japan 😎 Let me show you some side by side screenshots below: Website Japan Europe Facebook ![facebook_ja](/assets/blog/authors/M.Mori/20231205/Facebook_ja.png =200x) ![facebook_eu](/assets/blog/authors/M.Mori/20231205/Facebook_eu.png =200x) Google ![google_ja](/assets/blog/authors/M.Mori/20231205/google_ja.png =200x) ![google_eu](/assets/blog/authors/M.Mori/20231205/google_eu.png =200x) Booking.com ![booking.com_jp](/assets/blog/authors/M.Mori/20231205/Booking_ja.png =200x) ![booking.com_eu](/assets/blog/authors/M.Mori/20231205/Booking_eu.png =200x) Toyota Motor ![toyota_ja](/assets/blog/authors/M.Mori/20231205/toyota_ja.png =200x) ![toyota_eu](/assets/blog/authors/M.Mori/20231205/toyota_eu.png =200x) When we accessed websites in the European region, what surprised us was that there were tons of websites showing pop-ups to request consent, no matter the content! Not only were there cookie consent pop-ups, but it also seemed like there were various solutions, such as switching URLs for display through redirects, switching policies, and so on. Consent Acquisition Flow Now, we have confirmed that many websites take special care in Europe when collecting cookies, and also confirmed the fact that we definitely should have a pop-up. This time, based on the advice from our external lawyer, we decided to acquire consent from users in Europe as the below image. How can a user withdraw their consent? They can do it from the [Cookie Preference] button in the Privacy Policy whenever they want. Additionally, we designed it so that consent expires every 6 months. This is for providing users an opportunity to re-consider the privacy setting periodically, and ensure transparency Actual Screen After that, we finally released our new cookie consent pop-up with an updated privacy policy on Nov 1. Different views are shown depending on regions, as follows: Japan Europe A pop-up to notify Privacy Policy update is shown to anyone around the world since it’s required by various countries. Cookie consent pop-up is shown only for Europe. No pop-up or banner is shown after closing the notification pop-up. Users can adjust their consent for Performance Cookies through the “Cookie Preferences”. To Sum It Up As this PII related world including GDPR is so deep and complicated, there are many things that I still don’t know even over 2 years has passed since I was assigned to it. New violations continue to be sentenced, and regulations and guidelines are enacted or revised daily in various countries. Yet, we don’t want to lose usability and limiting the range of actions we can perform. Figuring out this balance is really important 🤔⚖️ The story I’ve shared today is just only an example case supported by external lawyers and it can’t always be applied to other scenarios. For example, to counter the challenge of increased rejection rates like we've faced, designing a UI/UX which makes the pop-up less likely to be rejected is one possible solution. How to comply with each regulation depends on the website’s purpose, target audience, contents and the situation. And since regulations like this are interpreted differently by different people, we can’t completely say "it is absolutely safe if you do it this way!”. The Global KINTO Web should be updated continuously, according to the varying situation of countries where it’s present. If you see a cookie consent pop-up on our website, it would be great if you think “Ah, they are trying to comply with each regulation properly👍”. Thank you for reading this long article, see you next time at my 11th blog🙋‍♀️ Reference Cookies, the GDPR, and the ePrivacy Directive - GDPR.eu クッキーは個人情報?規制の対象となるクッキーについて | BizRis Cookie(クッキー)同意ポップアップの実装率と設置場所 Global Reach - グローバル展開する企業を支援 Cookie types
アバター
自己紹介・記事要約 こんにちは。KINTOテクノロジーズの共通サービス開発グループ[^1][^2][^3][^4]で会員管理のエンジニアを担当している宮下です。 今日は、私たちの開発現場で直面したS3互換のローカルストレージ環境構築の課題をどのように解決したかをお話しします。 具体的には、オープンソースの MinIO を活用してAWS S3の機能をエミュレートする方法について、実践的なアプローチを共有します。 この記事が、同様の課題に直面しているエンジニアの方々にとって、参考になれば幸いです。 MinIOとは? MinIOはS3互換機能を備えたオープンソースのオブジェクトストレージサーバーツールです。NASのように、ファイルをアップロードやダウンロードすることができます。 この分野には LocalStack という似たようなサービスもあります。LocalStackはAWSのエミュレーションに特化し、S3をはじめとするLambda, SQS, DynamoDBなどのサービスをローカルでエミュレートできるツールです。 これらは目的が異なる2つのツールですが、ローカル環境でのS3互換環境を設定するための要件はどちらも満たしています。 MinIO website LocalStack website MinIO と LocalStack で ツール選定 開発の要件 開発の要件として、docker-composeを実行するだけで、自動で任意のS3バケットを作成し、そのバケットにメールテンプレートやCSVファイルなどが登録されていることが必要でした。 コンテナが起動してからコマンドやGUIでファイル登録するのは面倒くさいですからね。 また、自動化されたローカルでのS3接続テストを行う際も、コンテナが起動すると同時にバケットとファイルが準備済みでなければなりません。 ツールの比較 どちらのツールが簡単に要件を実現できるか比較した結果、LocalStackはaws-cliでバケット作成やファイル操作をするのに対し、MinIOは専用のコマンドラインツールであるmc(MinIO Client)を提供しています。これにより、より簡単にシステムの構築が可能でした。 さらに、GUIによる管理コンソールにおいても、MinIOの方が洗練されていると感じました。Google Trendsでの比較では、MinIOがより人気があることが分かります。これらの理由から、MinIOを採用する事に決定しました。 composeファイル MinIOのローカル環境をセットアップするために、最初に「compose.yaml」ファイルを用意する必要があります。 以下のステップに従って進めましょう。 任意のディレクトリを作成します。 そのディレクトリ内にファイル名「compose.yaml」のテキストファイルを作成します。 下記のcompose.yamlの内容をコピペして保存します。 ※docker-compose.ymlは非推奨になりました。 composeファイルの仕様はこちら ※docker-compose.ymlでも後方互換性機能で動作します。 詳細はこちら services: # MinIOサーバーコンテナの設定 minio: container_name: minio_test image: minio/minio:latest # MinIOサーバーを開始し、管理コンソール(GUI)のアクセスポートを指定 command: ['server', '/data', '--console-address', ':9001'] ports: - "9000:9000" # APIアクセス用 - "9001:9001" # 管理コンソール(GUI)用 # USERとPASSWORDを省略する事も可能です。 # その場合は minioadmin | minioadmin に自動で設定されます。 environment: - "MINIO_ROOT_USER=minio" - "MINIO_ROOT_PASSWORD=minio123" # minioが管理する設定ファイルや、アップロードしたファイルを # ローカルで参照したい場合や、登録したファイルを永続化したい場合は # ローカルのディレクトリをマウントします。 # volumes: # - ./minio/data:/data # PC再起動後にminioコンテナが自動で起動してほしい場合など # 停止していたら自動で起動していてほしい場合は有効化します。 # restart: unless-stopped # MinIOクライアント(mc)コンテナの設定 mc: image: minio/mc:latest container_name: mc_test depends_on: - minio environment: - "MINIO_ROOT_USER=minio" # 上と同じユーザー名 - "MINIO_ROOT_PASSWORD=minio123" # 上と同じパスワード # mcコマンドでバケット作成と、作成したバケットにファイルを配置します。 # まずは aliasを設定して、それ以降のコマンドで簡単にminio本体を # 指定できるようにします。 # 今回は myminio というエイリアス名にしました。 # mbは、バケットの新規作成を行う。make bucketの略 # cpは、ローカルのファイルをminioにコピーします。 entrypoint: > /bin/sh -c " mc alias set myminio http://minio:9000 minio minio123; mc mb myminio/mail-template; mc mb myminio/image; mc mb myminio/csv; mc cp init_data/mail-template/* myminio/mail-template/; mc cp init_data/image/* myminio/image/; mc cp init_data/csv/* myminio/csv/; " # minioにアップロードしたいファイルが入っているディレクトリをマウントします。 volumes: - ./myData/init_data:/init_data ディレクトリとファイル構成 適当なダミーファイルを作成し、以下のディレクトリとファイル構成で起動してみます。 minio_test# tree . . ├── compose.yaml └── myData └── init_data ├── csv │   └── example.csv ├── image │   ├── slide_01.jpg │   └── slide_04.jpg └── mail-template └── mail.vm 起動と動作確認 MinIOとそのクライアントをDocker上で稼働させて、その後の動作を確認する流れを紹介します。 Dockerコンテナは、以下のコマンドでバックグラウンドで起動させます(-d フラグを使用)。 Docker Desktop(for Windows)をインストールした場合は、コマンドプロンプトや PowerShellといったコマンドラインで、コンテナの作成が可能です。 ※ Docker Desktopのダウンロードはこちら docker compose up -d ※docker-compose の真ん中のハイフンは付けなくなりました。 詳細はこちら Docker Desktop Docker Desktopを開いて、コンテナの状態をチェックします。 minio_test コンテナは起動していますが、mc_test コンテナが停止していることが確認できます。 mc_test コンテナの実行ログを確認してみましょう。 mcの実行ログ MinIOクライアント(mc)が実行され、すべてのコマンドが正常に終了したことがログから分かります。 管理コンソール 次に、MinIOのGUI管理コンソールを見てみます。ブラウザで localhost の 9001 ポートにアクセスします。 http://127.0.0.1:9001 ログイン画面が表示されたら、compose.yaml で設定したユーザー名とパスワード (この例では minio と minio123)を入力します。 バケット一覧 左側のメニューから「Object Browser」を選択すると、 作成したバケットとそこに保存されているファイルの数が一覧で表示されます。 ファイル一覧 例として「image」バケットを選んで中を見てみます。 予めアップロードされているファイルが見えます。 ファイルの隣にあるアクションメニューから「プレビュー」を選ぶと、ファイルを直接確認できます。 ファイルプレビュー機能 弊社のマスコットキャラクター 謎の生き物K がプレビューされました。 MinIOの管理コンソールで画像を直接プレビューできる機能は非常に便利です。 mc(MinIO Client)のインストール GUIよりコマンドラインを使った方が、大量のファイル操作が効率的な場合があります。 また、開発時にソースコードからMinIOにアクセスしてエラーが出たとき、 ファイルパスの確認を行うにはコマンドラインが非常に便利です。 ここでは、MinIOクライアントのインストール方法と基本的な操作を説明します。 ※GUIの管理コンソールで必要十分という方はこのセクションをスキップしてください。 # 以下のコマンドを使用して、mcをダウンロードしてください。実行ファイルは任意のディレクトリに保存されます。 minio_test/mc# curl https://dl.min.io/client/mc/release/linux-amd64/mc \ --create-dirs \ -o ./minio-binaries/mc # 動作確認 # インストールしたmcが最新版か確認し、バージョンを表示させて正しくインストールされたかをチェックします。 # mcコマンドをPathに通すかはお好みで。今回は通さずにいきます。 minio_test/mc# ./minio-binaries/mc update > You are already running the most recent version of ‘mc’. minio_test/mc# ./minio-binaries/mc -version > mc version RELEASE.2023-10-30T18-43-32Z (commit-id=9f2fb2b6a9f86684cbea0628c5926dafcff7de28) > Runtime: go1.21.3 linux/amd64 > Copyright (c) 2015-2023 MinIO, Inc. > License GNU AGPLv3 <https://www.gnu.org/licenses/agpl-3.0.html> # エイリアスの設定 # MinIOサーバへのアクセスに必要なエイリアスを設定します。 minio_test/mc# ./minio-binaries/mc alias set myminio http://localhost:9000 minio minio123; > Added `myminio` successfully. # ファイル操作の例 # バケット内のファイル一覧を表示 minio_test/mc# ./minio-binaries/mc ls myminio/image > [2023-11-07 21:18:54 JST] 11KiB STANDARD slide_01.jpg > [2023-11-07 21:18:54 JST] 18KiB STANDARD slide_04.jpg minio_test/mc# ./minio-binaries/mc ls myminio/csv > [2023-11-07 21:18:54 JST] 71B STANDARD example.csv # ファイルの中身を画面出力 minio_test/mc# ./minio-binaries/mc cat myminio/csv/example.csv > name,age,job > tanaka,30,engineer > suzuki,25,designer > satou,,40,manager # ファイルの一括アップロード minio_test/mc# ./minio-binaries/mc cp ../myData/init_data/image/* myminio/image/; > ...t_data/image/slide_04.jpg: 28.62 KiB / 28.62 KiB # ファイルの削除 minio_test/mc# ./minio-binaries/mc ls myminio/mail-template > [2023-11-15 11:46:25 JST] 340B STANDARD mail.txt minio_test/mc# ./minio-binaries/mc rm myminio/mail-template/mail.txt > Removed `myminio/mail-template/mail.txt`. mcコマンド一覧 MinIOクライアントに関する詳細なドキュメントが必要な場合は、公式マニュアルをご覧ください。 MinIO Client 公式マニュアルはこちら 最後にJavaのソースコードからアクセス ローカルでMinIOを使ってS3互換の開発環境を構築した後、実際のJavaアプリケーションからMinIOにアクセスする方法を紹介します。 まず、Gradleの設定を行います。 plugins { id 'java' } java { sourceCompatibility = '17' } repositories { mavenCentral() } dependencies { // https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk-s3 implementation 'com.amazonaws:aws-java-sdk-s3:1.12.582' } 次に、MinIOにアクセスするためのJavaクラスを作成します。 package com.example.miniotest; import com.amazonaws.ClientConfiguration; import com.amazonaws.auth.AWSStaticCredentialsProvider; import com.amazonaws.auth.BasicAWSCredentials; import com.amazonaws.auth.EC2ContainerCredentialsProviderWrapper; import com.amazonaws.client.builder.AwsClientBuilder; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3ClientBuilder; import com.amazonaws.services.s3.model.GetObjectRequest; import com.amazonaws.services.s3.model.S3Object; import com.amazonaws.services.s3.model.S3ObjectSummary; import com.amazonaws.services.s3.model.ListObjectsV2Result; import com.amazonaws.regions.Regions; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.List; public class Main { public static void main(String... args) { new Main().execute(); } /** * MinIOのS3互換性テスト * バケット内のファイル一覧を取得し、内容を表示する */ private void execute() { System.out.println("--- Start ---"); // ローカルのMinIOに接続する場合と、 // AWS S3に接続する場合で切り替える。 // spring bootのプロファイルで切り替える事を想定。 boolean isLocal = true; // MinIOはAWS S3と互換性があるので // AWSのライブラリから接続する事ができる。 AmazonS3 s3Client = null; if (isLocal) { s3Client = getAmazonS3ClientForLocal(); } else { s3Client = getAmazonS3ClientForAwsS3(); } // バケット名 final String bucketName = "csv"; // バケット内のすべてのオブジェクトをリストする ListObjectsV2Result result = s3Client.listObjectsV2(bucketName); List<S3ObjectSummary> objects = result.getObjectSummaries(); // 取得できたファイル名の数だけループする for (S3ObjectSummary os : objects) { System.out.println("バケットから取得したファイル名 : " + os.getKey()); // ストリームでファイルの内容を取得する。 // もちろんファイルをダウンロードする事もできる。 try (S3Object s3object = s3Client.getObject( new GetObjectRequest(bucketName, os.getKey())); BufferedReader reader = new BufferedReader( new InputStreamReader(s3object.getObjectContent()))) { String line; while ((line = reader.readLine()) != null) { // 1行ずつファイルの中身を画面出力 System.out.println(line); } } catch (IOException e) { e.printStackTrace(); } // ファイルの切り替わりで空行を入れておく System.out.println(); } System.out.println("--- End ---"); } /** * ローカルのMinioに接続する場合はこちら * @return AmazonS3インターフェースの実装であるAmazonS3クライアントインスタンス。 */ private AmazonS3 getAmazonS3ClientForLocal() { final String id = "minio"; final String pass = "minio123"; final String endpoint = "http://127.0.0.1:9000"; return AmazonS3ClientBuilder.standard() .withCredentials( new AWSStaticCredentialsProvider( new BasicAWSCredentials(id, pass))) .withEndpointConfiguration( new AwsClientBuilder.EndpointConfiguration( endpoint, Regions.AP_NORTHEAST_1.getName())) .build(); } /** * Amazon S3クライアントを取得し、AWS S3サービスへの接続を設定します。 * このメソッドは、Amazon EC2インスタンス上での実行時にIAMロールを用いて自動的に * 認証情報を取得し、S3との接続を確立します。IAMロールにはS3へのアクセスを許可する * ポリシーが関連付けられている必要があります。 * * クライアントは以下のように構成されます: * - リージョン:Regions.AP_NORTHEAST_1(アジアパシフィック(東京)) * - 最大接続数:500 * - 接続タイムアウト:120秒 * - エラーリトライ回数:最大15回 * * 注意:このメソッドは、EC2インスタンス上で実行されることを想定しています。 * EC2以外で実行する場合は、AWS認証情報を別途提供する必要があります。 * * @return AmazonS3インターフェースの実装であるAmazonS3クライアントインスタンス。 * @see com.amazonaws.auth.EC2ContainerCredentialsProviderWrapper * @see com.amazonaws.services.s3.AmazonS3 * @see com.amazonaws.services.s3.AmazonS3ClientBuilder * @see com.amazonaws.regions.Regions */ private AmazonS3 getAmazonS3ClientForAwsS3() { return AmazonS3ClientBuilder.standard() .withCredentials(new EC2ContainerCredentialsProviderWrapper()) .withRegion(Regions.AP_NORTHEAST_1) .withClientConfiguration( new ClientConfiguration() .withMaxConnections(500) .withConnectionTimeout(120 * 1000) .withMaxErrorRetry(15)) .build(); } } 実行結果 --- Start --- バケットから取得したファイル名 : example.csv name,age,job tanaka,30,engineer suzuki,25,designer satou,40,manager --- End --- ソースコード解説 このコードの注目すべき点は、AWS SDK for JavaがMinIOとAWS S3の両方に対応していることです。 ローカルのMinIOインスタンスに接続する際にはgetAmazonS3ClientForLocalメソッドを、 AWS S3に接続する場合にはgetAmazonS3ClientForAwsS3メソッドを使用してクライアントを初期化します。 このアプローチにより、異なるバックエンド環境間で同一のSDKを利用することが可能となり、 同じインターフェースでの操作を実現します。 このように、追加コストをかけずに実際のAWS環境へのデプロイ前に気軽にアプリケーションをテストできるのはいいですよね。 このガイドが何かのお役に立てば幸いです。 最後までお読みいただき、ありがとうございました🙇‍♂ [^1]: 共通サービス開発グループメンバーによる投稿 1 [ グローバル展開も視野に入れた決済プラットフォームにドメイン駆動設計(DDD)を取り入れた ] [^2]: 共通サービス開発グループメンバーによる投稿 2 [ 入社 1 年未満メンバーだけのチームによる新システム開発をリモートモブプログラミングで成功させた話 ] [^3]: 共通サービス開発グループメンバーによる投稿 3 [ JIRA と GitHub Actions を活用した複数環境へのデプロイトレーサビリティ向上の取り組み ] [^4]: 共通サービス開発グループメンバーによる投稿 4 [ VSCode Dev Container を使った開発環境構築 ]
アバター
こんにちは!👋 KINTOテクノロジーズのグローバルプロダクト開発グループでUI/UXチームに所属しているAz, Moji, Aiです。今日はUI/UXデザインの中でダイバーシティ(diversity/多様性)とインクルーシビティ(inclusivity/包括性)の奥深い世界についてお話します! デザインにとってダイバーシティとインクルーシビティとは? Nielson Norman Group によると、インクルーシブデザインとは人種や障がいなど、多様なバックグラウンドやアビリティを持つ人々を理解した上で、それぞれが利用しやすいプロダクトを創る手法です。 では、インクルーシブデザインの具体的な例を挙げてみましょう。わかりやすい例は建築に見られます。車いす用のスロープ、点字や自転車用のレーンなど、全ての人にとって快適な空間を創ることが重要です。 日常生活におけるインクルーシブデザインの例 UI/UXデザインにおける例 インクルーシブデザインについて、なんとなくご理解いただけましたでしょうか?次は、UI/UXデザインにおける具体例を見ていきましょう。 (左から右へ) 代替テキスト, キーボードナビゲーション, Appleのアクセシビリティ HTMLやCSSに詳しい方であれば、画像の代替テキスト(alt属性)の目的について疑問に思ったことはありませんか?これは単に画像が読み込めなかったときのフォールバックだけではありません。視覚障がい者の方など、スクリーンリーダーを使ってサイト閲覧する方に画像の説明を提供するためのキーにもなります。 キーボードだけを使ってサイトをナビゲートできるようにすることも重要です。キーボードアクセシビリティは、キーボードだけを利用するユーザーの体験を向上させるだけでなく、例えばスクリーンリーダーを利用する方、弱視の方、運動障がいや認知障がいのある方、また、ショートカットや代替キーボードを好む方などにも有益です。 Appleはアクセシビリティをデザインに取り込むことに優れていて、様々な障がいを持つ方々に対応するユーザーインターフェースとエクスペリエンスを提供しています。例えば、読みやすさを向上するためのフォントサイズ調整、単語選択による音声読み上げ、障がいのある方向けに設計された音声コントロールや、その他たくさんのインクルーシブデザインが採用されています。詳しくは Apple公式サイト をご確認ください。 これらの例はUI/UXのインクルーシブデザインにおけるほんの一例です。 Web Content Accessibility Guidelines (WCAG)は、ウェブコンテンツのアクセシビリティを向上させるための原則とテクニックを定義しており、障がいを持つ方々など多方面に配慮されたものとするのに役立ちます。 さて、ここまではインクルーシブデザインの基本部分を説明してきました。 ここからは、当社のメインビジネスであるモビリティプラットフォームでどのように応用しているかについて、Mojiから説明いただきます。 Aiがインクルーシビティの詳細について説明してくれました。ここからは私が「モビリティ」の世界でインクルーシビティをどのように表現するかを深掘りします。 改めまして、 Moji です。世界中のどんな方であっても、お客様が目的の場所へ移動する手助けになるようなデザインを提供することが私の使命です。 私はデザイナーとして、我々の開発するプロダクトやソリューションが、民族、言語、年齢、性別、身体能力、文化的背景を超えた幅広いユーザーに対応できるようにする責任と能力があると考えています。 これを他の企業がどうやって実現しているかをベンチマークすることは、単に興味深いだけでなく、我々の仕事をより良く、テックプロダクトをよりインクルーシブなデザインするためのアイデアにも役立ちます。例えば Googleマップ を例に挙げてみましょう。こちらは移動する際に利用するアプリとして多くの人に日常的に利用されています。 "アクセシブル"な(使いやすい)アプリにするためのGoogleマップの標準 GoogleマップはリアルタイムのGPS情報や交通情報を提供するだけでなく、幅広いオーディエンスを対象にデザインされています。 Googleマップでは、 視覚障がい のある方のために 音声ナビシステム があります。これによって、道を曲がるタイミングや、渋滞、経路を遮る可能性がある場合などを教えてくれます。これにより音によるサポートが必要な方々がより生活しやすくなります。 Googleマップの最新アップデートでは、アプリをよりアクセシブルでインクルーシブにするための機能がいくつか追加されました。 没入型ルート案内の イマーシブビュー は、移動手段が車であっても徒歩であっても自転車であっても、経路をより詳細に表示してくれます。以前に比べてより移動しやすくなりました。 また、Googleマップは世界中で利用されているため、40以上の言語が利用可能です。これによって、アプリは世界中でアクセシブルになるだけでなく、ユーザーの母国語など好きな言語で情報を得られ、ユーザー満足度も向上します。 RTL言語に対応したグローバルアプリ開発における課題 さて、アプリデザインにおける言語と地域性への考慮について話を移します。ここからはチームメイトのAzに執筆いただきます。 グローバルにアクセシブルなアプリにするという基本的な課題に対し、特に彼女はアラビア語のような右から左 (RTL/Right to Left) へ読み書きされる言語をサポートするタスクをリードしてきました。Az、お願いします。 最後にバトンタッチされました。UI/UXチームAzです。 KINTOテクノロジーズでRTL対応をした時に気づいたことがありました。それは… Diversityを進めるためには知らなければいけない 今までに無いものを創造するのではなく「当たり前」に感じることを拾っていくことが大事だからです。 今まで意識していなかった部分や初めて知った部分がありました。 まずRTLとは"Right To Left"で右から左に読み進める言語です。 テキスト方向が変わるため、目線の移動順序も変わります。レイアウトも右から左に並ぶよう変更します。 アイコンとテキストの位置、アクションボタンの方向、バッヂの位置などネストした要素も反転します。 ただし、物理アイテムである「ヘッドセット」、ユニバーサルデザインである「位置情報」のアイコンは反転しません。 表示だけでなく入力もレイアウトの反転が必要になります。 進行方向に合わせてインジケーターの増減の方向も変わります。 フォーム系でも例外があります。 電話番号やクレジット番号などの並びに意味がある数列は反転させてはいけません また テキストでも固有名詞の"KINTO"は反転させません ここではKTCの例を紹介しましたが Apple Human Interface guideline や Google Material design に他の具体例も載っています。 この記事でも気づいた方は多いかもしれませんが、UIUXチームのメンバーは多種多様なバックグラウンドを持っています。 そのため一人では気づかない知識や着眼点、知見を増やしてくれます。 Aiは彼女の持つ建築知識から現実空間との比較でDiversityの必要性を示してくれました。 高いリサーチ能力と知識をもったMojiは馴染みが深いサービスで何が行われているか解説してくれました。 今回は別記事で登場するTimもプロジェクト進行やフロントエンドまで幅広くカバーできる頼れるメンバーです それぞれが持つ「当たり前」を知って積み重ねて、これからも誰もが心地よく使えるサービスを展開していきます。
アバター