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

TECH PLAY

KINTOテクノロゞヌズ

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

å…š1113ä»¶

An Issue We Encountered During Testing With Spring Batch using DBUnit Introduction Hello. I am Takehana from the Payment Platform Team, Common Service Development Group[^1][^2][^3][^4][^5][^6] at the Platform Development Division. This time, I would like to write about an issue that we encountered while testing with Spring Batch + DBUnit. Environment Libraries, etc. Version Java 17 MySQL 8.0.23 Spring Boot 3.1.5 Spring Boot Batch 3.1.5 JUnit 5.10.0 Spring Test DBUnit 1.3.0 Encountered Issues We are using DB unit for testing Spring Boot 3 with Spring Batch. The Batch process follows the Chunk model, where ItemReader performs DB searches, and ItemWriter updates the DB. Given this setup, when running tests with data volumes exceeding the Chunk size, the tests did not complete... Investigations and Attempts Observations Code new StepBuilder("step", jobRepository) .<InputDto, OutputDto>chunk( CHUNK_SIZE, transactionManager) .reader(reader) .processor(processor) .writer(writer) .build(); I was testing a batch with the steps mentioned above as follows. @SpringBatchTest @SpringBootTest @TestPropertySource( properties = { "spring.batch.job.names: Foobar-batch", "targetDate: 2023-01-01", }) @Transactional(isolation = Isolation.SERIALIZABLE) @TestExecutionListeners({ DependencyInjectionTestExecutionListener.class, DirtiesContextTestExecutionListener.class, TransactionDbUnitTestExecutionListener.class }) @DbUnitConfiguration(dataSetLoader = XlsDataSetLoader.class) class FoobarBatchJobTest { @Autowired private JobLauncherTestUtils jobLauncherTestUtils; @BeforeEach void setUp() { } @Test @DatabaseSetup("classpath:dbunit/test_data_import.xlsx") @ExpectedDatabase( value = "classpath:dbunit/data_expected.xlsx", assertionMode = DatabaseAssertionMode.NON_STRICT_UNORDERED) void launchJob() throws Exception { val jobExecution = jobLauncherTestUtils.launchJob(); assertEquals(ExitStatus.COMPLETED, jobExecution.getExitStatus()); } } When I set the test data to be less than the chunk size, the test passed without any issues. However, when the test data exceeded the chunk size, the test froze and never completed. (This occurred even with a chunk size of 1 and a data count of 1) Suspecting the issue might be on DB connections, I noted that Spring Batch treats each chunk as a single transaction. If processing in parallel, it would require more DB connections than the number of concurrent executions. So I adjusted the pool size to test this hypothesis. spring: datasource: hikari: maximum-pool-size: I changed 10 to 100 among other adjustments, but the issue was still not resolved
 Start debugging I set up debug logs and ran the application to observe the behavior. The execution seemed to stop at the log output on line 88 of org.springframework.batch.core.step.item.ChunkOrientedTasklet . So, I set a breakpoint to verify. I then reached line 408 of org.springframework.batch.core.step.tasklet.TaskletStep . It appeared that the semaphore couldn’t acquire a lock (= waiting for the lock to be released), causing the execution to halt there. Delving deeper into Spring Batch Continuing my investigation, I traced the flow of execution in the step processing. The rough outline of the relevant parts is as follows. Execute doExecute of TaskletStep Create a semaphore Pass the semaphore to ChunkTransactionCallback , which is an implementation of TransactionSynchronization , link it with the transaction execution, and configure it in RepeatTemplate Step processing begins for the chunk The semaphore is locked in doInTransaction of TaskletStep Execute the main step processing The commit is executed by TransactionSynchronizationUtils` The AbstractPlatformTransactionManager ’s triggerAfterCompletion method is called, and the in-process invokeAfterCompletion` is executed. The semaphore is released in the afterCompletion method of the ChunkTransctionCallback by the invokeAfterCompletion. If data remains, return to 4 During this test run, the semaphore of 9 was not released, and it passed through 4 again and ended up freezing at 5 . Why was the semaphore not released...? During the review mentioned above, at Step semaphore release , I found the following condition in the relevant code. status.isNewSynchronization() did not become true , so invokeAfterCompletion was not executed. org.springframework.transaction.support.DefaultTransactionStatus#isNewSynchronization is as follows: /** * Return if a new transaction synchronization has been opened * for this transaction. */ public boolean isNewSynchronization() { return this.newSynchronization; } It returns whether a new transaction synchronization has been opened for this transaction. Considerations The current situation is that we haven’t fully traced yet why isNewSynchronization doesn’t become true . However, I thought I might be able to find some clues in the logs from our various trial and error attempts. If @Transactional is not applied to the test class 2024-03-27T08:57:14.527+0000 [Test worker] TRACE o.s.t.i.TransactionInterceptor - Completing transaction for [org.springframework.batch.core.repository.support.SimpleJobRepository.update] Foobar-batch 19 2024-03-27T08:57:14.527+0000 [Test worker] DEBUG o.s.orm.jpa.JpaTransactionManager - Initiating transaction commit Foobar-batch 19 2024-03-27T08:57:14.527+0000 [Test worker] DEBUG o.s.orm.jpa.JpaTransactionManager - Committing JPA transaction on EntityManager [SessionImpl(1075727694<open>)] Foobar-batch 19 2024-03-27T08:57:14.534+0000 [Test worker] DEBUG o.s.orm.jpa.JpaTransactionManager - Closing JPA EntityManager [SessionImpl(1075727694<open>)] after transaction Foobar-batch 19 2024-03-27T08:57:14.536+0000 [Test worker] DEBUG o.s.b.repeat.support.RepeatTemplate - Repeat operation about to start at count=2 Foobar-batch 19 If @Transactional is applied to the test class 2024-03-27T09:04:04.600+0000 [Test worker] TRACE o.s.t.i.TransactionInterceptor - Completing transaction for [org.springframework.batch.core.repository.support.SimpleJobRepository.update] Foobar-batch 20 2024-03-27T09:04:04.601+0000 [Test worker] DEBUG o.s.b.repeat.support.RepeatTemplate - Repeat operation about to start at count=2 Foobar-batch 20 When @Transactional is applied, "Initiating transaction commit..." from JpaTransactionManager with @Transactionalis not being logged. The test class uses TransactionalTestExecutionListener and executes within the same transaction using @Transactional . This ensures that the test data registered with DBUnit is accessible to code under test and is rolled back after the test is completed. However, I concluded that isNewSynchronization does not become true because existing transactions are being reused (a new transaction is not started) when the same step is executed. Workaround As a brute-force workaround to avoid using TransactionalTestExecutionListener , I performed the cleanup manually after each test, which successfully prevented the freeze. class FoobarTestExecutionListenerChain extends TestExecutionListenerChain { private static final Class<?>[] CHAIN = { FoobarTransactionalTestExecutionListener.class, DbUnitTestExecutionListener.class }; @Override protected Class<?>[] getChain() { return CHAIN; } } class HogeTransactionalTestExecutionListener implements TestExecutionListener { private static final String CREATE_BACKUP_TABLE_SQL = "CREATE TEMPORARY TABLE backup_%s AS SELECT * FROM %s"; private static final String TRUNCATE_TABLE_SQL = "TRUNCATE TABLE %s"; private static final String BACKUP_INSERT_SQL = "INSERT INTO %s SELECT * FROM backup_%s"; private static final List<String> TARGET_TABLE_NAMES = List.of( "Foobar", "fuga", "dadada"); /** * Create a test working table * * @param testContext * @throws Exception */ @Override public void beforeTestMethod(TestContext testContext) throws Exception { val dataSource = (DataSource) testContext.getApplicationContext().getBean("dataSource"); val jdbcTemp = new JdbcTemplate(dataSource); // Backup existing data to a temporary table before testing TARGET_TABLE_NAMES.forEach( tableName -> jdbcTemp.execute(String.format(CREATE_BACKUP_TABLE_SQL, tableName, tableName))); // Table initialization TARGET_TABLE_NAMES.forEach( tableName -> jdbcTemp.execute(String.format(TRUNCATE_TABLE_SQL, tableName))); } /** * Drop the test working table * * @param testContext * @throws Exception */ @Override public void afterTestMethod(TestContext testContext) throws Exception { val dataSource = (DataSource) testContext.getApplicationContext().getBean("dataSource"); val jdbcTemp = new JdbcTemplate(dataSource); // Restore the table TARGET_TABLE_NAMES.forEach( tableName -> jdbcTemp.execute(String.format(TRUNCATE_TABLE_SQL, tableName, tableName))); TARGET_TABLE_NAMES.forEach( tableName -> jdbcTemp.execute(String.format(BACKUP_INSERT_SQL, tableName, tableName))); } } Remove TransactionDbUnitTestExecutionListener and avoid using TransactionalTestExecutionListener. (Use DbUnitTestExecutionListener to lode the test data from Excel) Create a custom TestExecutionListener and move data from the target table to a temporary table during pre-processing, then restore it after the test. beforeTestMethod is executed before the test method, and afterTestMethod is executed after the test method. This approach made it possible to run tests while preserving Spring’s transaction management. Impressions Despite extensive searches, I couldn’t find satisfactory information, leaving the issue in a state of uncertainty. However, by looking further into the Spring Boot source code, I made various discoveries and it turned out to be a valuable learning experience through code reading. (Although I haven’t fully grasped everything yet
) I was wondering if I was fundamentally misunderstanding how to use Spring and the test libraries, questioning whether I was implementing them correctly based on the library creators’ assumptions and if there were more suitable classes available. This has highlighted that I still have much to learn. I would like to continue to approach exploration and improvement with the same curiosity, asking, “How does this work?” Thank you for reading this article. I hope this will be helpful to others facing similar issues. [^1]: Post 1 by a member of the Common Service Development Group [ Domain-Driven Design (DDD) incorporated in a payment platform intended to allow global expansion ] [^2]: Post 2 by a member of the Common Service Development Group [ Remote Mob Programming: How a Team of New Hires Achieved Success Developing a New System Within a Year ] [^3]: Post 3 by a member of the Common Service Development Group [ Efforts to Improve Deploy Traceability to Multiple Environments Utilizing GitHub and JIRA ] [^4]: Post 4 by a member of the Common Service Development Group [ Creating a Development Environment Using VS Code's Dev Container ] [^5]: Post 5 by a member of the Common Service Development Group [ Spring Boot 2 to 3 Upgrade: Procedure, Challenges, and Solutions ] [^6]: Post 6 by a member of the Common Service Development Group [ Guide to Building an S3 Local Development Environment Using MinIO (RELEASE.2023-10) ]
Introduction Hello. I am Nakaguchi from KINTO Technologies' Mobile App Development Group. I lead the iOS team for the KINTO Easy Application app which I will refer to as “the iOS team” in this article for convenience. We hold Retrospectives irregularly, but I find that they can be rather challenging. Am I succeeding in bringing out everyone's true feelings?? What are the team's real challenges?? Is my facilitation effective?? etc. I recently watched a webinar by Classmethod, Inc. and was so impressed by their session on "How to Build a Self-Managed Team" that I decided to apply for another training session they introduced in it about Retrospectives. In this article, I'll share my experience attending that session. Pre-Alignment Session Before the Retrospective, we had a meeting with Mr. Abe and Mr. Takayanagi from Classmethod. In order to hold Retrospectives that were best suited to our team’s situation, we discussed the current status of the iOS team with them for nearly an hour. Overview of the Retrospective On the day of the Retrospective, Mr. Takayanagi and Mr. Ito came to the company to facilitate the meeting. The meeting lasted for about two hours and followed this general flow: Self-introductions Aligning the purpose of our Retrospectives Individual exercise on “How to make the team a little bit better” Same content as above but in pairs Sharing the findings with the whole team Thinking about specific action plans in pairs Sharing the findings with the whole team Closing First Half Out of the almost two-hours meeting, it is worth noting that about half of the time was spent on "1. Self-introductions" and "2. Aligning the purpose of our Retrospectives". During the segment "1. Self-introductions", the facilitators asked us questions such as our names or nicknames, our roles in the team, or the extent of our interactions with other team members. They looked not only at the atmosphere of the team and the personality of each of us, but also at the relationships and compatibility between team members. During "2. Aligning the purpose of our Retrospectives", I got everyone to agree on what can be done to make the current team a little better , which was a topic I had requested. After a major release last September, our team is currently focused on improving features and refactoring, so although we are in a less busy spot, it seems that it is no easy feat to improve teams in our situation to make them a little better . I also explained the purpose, role, and expectations for each participant that I, as the meeting organizer, had in mind when inviting them. I was told that this helps clarify how everyone should participate and makes it easier for them to speak up. I think it was a good opportunity for me to talk about things that I usually don’t have the right timing for or that I can’t speak about directly. By spending this time in the first half of the meeting, we were able to create an atmosphere where it was easy for everyone to speak, and I felt that overall rapport was greatly improved. Facilitation Second Half After thinking about " 3. Making the team a little better" individually, we proceed on with the work. However, we didn’t use any framework related to retrospectives. Instead, we simply wrote down what could make the team a little better on sticky notes. We did individual work and then moved on to pair work. There are situations where pair work is beneficial and others where it is not. In this case, it seemed like the team benefited from it. Also, the combination of people is key, as it is important not to cause psychological strain amongst the participants. Pair Work After that, everyone gave presentations, and there were many opinions that I was not able to draw out in the Retrospectives I have held so far. I felt that I was able to draw them out through the rapport we built and the pair work in the first half. Then, based on the opinions that came up, everyone was asked to think about what specific actions should be taken and 6. Thinking about specific action plans in pairs. Then, each team presented their ideas. Presentation As a result, we decided to implement the following actions: Creating a Slack channel Having a place where everyone can chat freely Setting up a weekly meeting dedicated to chatting We could build more trust by talking more about ourselves, so we decided to create a private channel instead of a public one. Trying to gather together at meeting rooms as much as possible (as many people used to attend online to meetings from their desks even if they were in the office). Setting up guideline consultation meetings regarding assigned tasks Clearly stating the deadline on the task tickets We are addressing these issues as quickly as possible, starting the next day. Closing At the end of the meeting, Mr. Takayanagi talked about the importance of customizing meetings, such as understanding the time allocation of meetings, the characteristics of participants and to draw their opinions. In particular, at this Retrospective, he focused his facilitation on people , using a lot of pair work. Closing Post-Retrospective Survey Results Here are the results of the feedback survey taken after the Retrospective (out of 10 responses). Change in evaluation Before: 6.3 -> After: 9 NPS 80 (What is NPS?) AI summary of "How satisfied did you feel after you participated?" (free text) The survey results showed that participants were happy with the session and the facilitator's explanations. In addition, there were many positive comments about how specific decisions were made that led to the next actions. Furthermore, the opportunity to understand the thoughts of other team members, and the ability to listen to things that are not normally heard, were also highly evaluated. These results suggest that the meeting was meaningful for everyone. ** Just being above 0 was a great, but there was a whopping NPS of 80! ** Final Thoughts Through this Retrospective, I realized that there were many members who felt that there was a lack of communication, and we were able to focus on the next course of action so it was a very fulfilling Retrospective. I was happy to see from the questionnaire results that the participating members were also satisfied. I also realized that the role of the meeting facilitator is very important. This is a very advanced skill that cannot be acquired overnight, and I think that the organization should focus on developing and acquiring such skills. To start with, I would like to study facilitation and become able to conduct better meetings.
Introduction Hello. I am Nakaguchi from KINTO Technologies' Mobile App Development Group. I lead the iOS team for the KINTO Easy Application app which I will refer to as “the iOS team” in this article for convenience. We hold Retrospectives irregularly, but I find that they can be rather challenging. Am I succeeding in bringing out everyone's true feelings?? What are the team's real challenges?? Is my facilitation effective?? etc. I recently watched a webinar by Classmethod, Inc. and was so impressed by their session on "How to Build a Self-Managed Team" that I decided to apply for another training session they introduced in it about Retrospectives. In this article, I'll share my experience attending that session. Pre-Alignment Session Before the Retrospective, we had a meeting with Mr. Abe and Mr. Takayanagi from Classmethod. In order to hold Retrospectives that were best suited to our team’s situation, we discussed the current status of the iOS team with them for nearly an hour. Overview of the Retrospective On the day of the Retrospective, Mr. Takayanagi and Mr. Ito came to the company to facilitate the meeting. The meeting lasted for about two hours and followed this general flow: Self-introductions Aligning the purpose of our Retrospectives Individual exercise on “How to make the team a little bit better” Same content as above but in pairs Sharing the findings with the whole team Thinking about specific action plans in pairs Sharing the findings with the whole team Closing First Half Out of the almost two-hours meeting, it is worth noting that about half of the time was spent on "1. Self-introductions" and "2. Aligning the purpose of our Retrospectives". During the segment "1. Self-introductions", the facilitators asked us questions such as our names or nicknames, our roles in the team, or the extent of our interactions with other team members. They looked not only at the atmosphere of the team and the personality of each of us, but also at the relationships and compatibility between team members. During "2. Aligning the purpose of our Retrospectives", I got everyone to agree on what can be done to make the current team a little better , which was a topic I had requested. After a major release last September, our team is currently focused on improving features and refactoring, so although we are in a less busy spot, it seems that it is no easy feat to improve teams in our situation to make them a little better . I also explained the purpose, role, and expectations for each participant that I, as the meeting organizer, had in mind when inviting them. I was told that this helps clarify how everyone should participate and makes it easier for them to speak up. I think it was a good opportunity for me to talk about things that I usually don’t have the right timing for or that I can’t speak about directly. By spending this time in the first half of the meeting, we were able to create an atmosphere where it was easy for everyone to speak, and I felt that overall rapport was greatly improved. Facilitation Second Half After thinking about " 3. Making the team a little better" individually, we proceed on with the work. However, we didn’t use any framework related to retrospectives. Instead, we simply wrote down what could make the team a little better on sticky notes. We did individual work and then moved on to pair work. There are situations where pair work is beneficial and others where it is not. In this case, it seemed like the team benefited from it. Also, the combination of people is key, as it is important not to cause psychological strain amongst the participants. Pair Work After that, everyone gave presentations, and there were many opinions that I was not able to draw out in the Retrospectives I have held so far. I felt that I was able to draw them out through the rapport we built and the pair work in the first half. Then, based on the opinions that came up, everyone was asked to think about what specific actions should be taken and 6. Thinking about specific action plans in pairs. Then, each team presented their ideas. Presentation As a result, we decided to implement the following actions: Creating a Slack channel Having a place where everyone can chat freely Setting up a weekly meeting dedicated to chatting We could build more trust by talking more about ourselves, so we decided to create a private channel instead of a public one. Trying to gather together at meeting rooms as much as possible (as many people used to attend online to meetings from their desks even if they were in the office). Setting up guideline consultation meetings regarding assigned tasks Clearly stating the deadline on the task tickets We are addressing these issues as quickly as possible, starting the next day. Closing At the end of the meeting, Mr. Takayanagi talked about the importance of customizing meetings, such as understanding the time allocation of meetings, the characteristics of participants and to draw their opinions. In particular, at this Retrospective, he focused his facilitation on people , using a lot of pair work. Closing Post-Retrospective Survey Results Here are the results of the feedback survey taken after the Retrospective (out of 10 responses). Change in evaluation Before: 6.3 -> After: 9 NPS 80 (What is NPS?) AI summary of "How satisfied did you feel after you participated?" (free text) The survey results showed that participants were happy with the session and the facilitator's explanations. In addition, there were many positive comments about how specific decisions were made that led to the next actions. Furthermore, the opportunity to understand the thoughts of other team members, and the ability to listen to things that are not normally heard, were also highly evaluated. These results suggest that the meeting was meaningful for everyone. Just being above 0 was a great, but there was a whopping NPS of 80! Final Thoughts Through this Retrospective, I realized that there were many members who felt that there was a lack of communication, and we were able to focus on the next course of action so it was a very fulfilling Retrospective. I was happy to see from the questionnaire results that the participating members were also satisfied. I also realized that the role of the meeting facilitator is very important. This is a very advanced skill that cannot be acquired overnight, and I think that the organization should focus on developing and acquiring such skills. To start with, I would like to study facilitation and become able to conduct better meetings.
​KINTOサヌビスの認蚌基盀に぀いお、開発を担圓しおいるPham Hoangです。本蚘事では、Global KINTO ID Platform (GKIDP) に実装されたパスキヌに぀いおお話したす。 OpenID Summit Tokyo 2024 に参加しお、OIDC ず組み合わされたパスキヌに぀いお䌺っおから、パスキヌが私たちのIDプラットフォヌムにどれだけ倚くの利益をもたらすか぀いお、お䌝えしたいず思いたした。 I. GKIDP でのパスキヌの自動入力 パスキヌは、パスワヌドの代替ずなるもので、ナヌザヌの端末からより速く、より簡単に、より安党に、りェブサむトやアプリぞサむンむンするこずができたす。以䞋は、ナヌザヌがワンクリックでパスキヌ認蚌を行う方法です。 ![](/assets/blog/authors/pham.hoang/fig1.gif =400x) 図1.KINTO ItalyのIDプラットフォヌムぞパスキヌでログむンする様子 パスキヌの玠晎らしいずころはシヌムレスなUXで、パス ワヌド の自動入力機胜ず同じです。ナヌザヌはパスキヌずパスワヌドの耇雑な違いを理解する必芁はありたせん。このシステムは、ナヌザヌが芚えおおく必芁のあるパスワヌドなどを䜿わずに、裏偎で非察称暗号化を䜿甚したす。FaceID認蚌だけで、すべおの蚭定が完了したす。 パスキヌは、2022幎埌半からAndroidずiOSによっおサポヌトされおいる、最も安党で最先端の認蚌システムです。ただ開発䞭で、珟圚もアップグレヌドされ続けおいたす。GKIDP (Global KINTO ID Platform)に最新技術で䟿利な状態を保぀ため、2023幎7月にパスキヌの自動入力機胜を導入したした。この導入は、メルカリ、ダフヌゞャパン、GitHubやMoneyForwardでそれぞれ導入したすぐあずのこずです。 次のパヌトでは、パスキヌをFederated Login連携ログむンに掻甚し、GKIDPナヌザヌが「グロヌバルログむン」機胜をより快適に利甚できるようにする方法に぀いお説明したす。 II. Federated Identityにおけるパスキヌ Global KINTO ID Platform (GKIDP) は、2024幎3月時点でむタリア、ブラゞル、タむ、カタヌルず南米各囜に導入されおいるKINTOサヌビスの認蚌システムです。GDPRおよびその他のデヌタ保護芏制に遵守するため、GKIDPは各囜ごずに耇数のIDプロバむダヌIDPに分けられおおり、「コヌディネヌタヌ」を通しおナヌザヌを䞀぀のグロヌバルIDずしお識別したす。グロヌバルID を掻甚するこずで、ナヌザヌは䞖界䞭のKINTOサヌビスを共通のIDで利甚するこずができたす。 図2.GKIDP ずパスキヌ察応のIDP 通垞、パスキヌでログむン(図1を参照)をするず、ナヌザヌはロヌカルIDPを䜿甚しお認蚌連携を行い、自囜内のKINTOサヌビスを利甚できたす。しかし、私たちの堎合、RP(Relying Party)のアプリケヌションたたはブラゞルの KINTO ONE Personal やその他のKINTOサヌビスのような「サテラむトサヌビス」でパスキヌ機胜が䜿えないずいけないため、各囜のIDP (䟋ブラゞルIDP)にパスキヌを実装したした。 この利点に぀いお、私たちが参加した OpenID Summit Tokyo 2024 でも取り䞊げられおおり、パスキヌをOpenID Connectプロトコルず組み合わせお実装するこずが掚奚されおいるず知れお良かったです。 さらにGKIDPには、KINTOサヌビスがある他囜にナヌザヌが旅行や匕越しをした際、自囜サヌビスず同様に囜倖サヌビスでもKINTOたたは関連サヌビスにログむンできる独自の機胜がありたす。これを私たちは「グロヌバルログむン」機胜ず呌んでいたす。利甚には耇数のステップが必芁ですが、぀のナヌザヌ名ずパスワヌドで管理できるので、サヌビスごずにナヌザヌ名ずパスワヌドを芚えなくおも良くなりたす。さらにパスキヌ実装によっお、ログむン情報を芚えたり入力したりする必芁なく、簡単な手順でグロヌバルナヌザヌのログむンプロセスの無駄をなくしたす。䟋えば、むタリアのKINTO GOナヌザヌ図1のナヌザヌが、グロヌバルログむンを利甚しおタむのKINTO SHAREサヌビスにアクセスする方法を芋おみたしょう。わずか数回のクリックでログむン時間を平均23分から玄30秒に短瞮するこずができおいたす図3。ロヌカルIDPがパスキヌをサポヌトしおいるかどうかに関係なく、1぀のパスキヌを䜿甚しおすべおのKINTOサヌビスにアクセスできたす。 ![](/assets/blog/authors/pham.hoang/fig3.gif =300x) 図3. パスキヌによるグロヌバルログむン パスキヌは、ロヌカルログむンずグロヌバルログむンだけでなく、再認蚌などを含むすべおの認蚌画面にも掻甚されおいたす。䞀床パスキヌが登録されるず、ナヌザヌは䜕かを確認するためのパスワヌドをもはやほずんど必芁ずしたせん。 III. パスキヌずその需芁 図4. パスキヌ登録ナヌザヌ むタリアのIDPでは、875名のナヌザヌパスキヌを利甚しお登録しおおり、パスキヌリリヌス埌の新芏ナヌザヌの52.2を占めおいたす。パスキヌの自動入力をサポヌトするOSにアップデヌトするナヌザヌが増えるに぀れおに぀れお、この割合も増えるこずを期埅しおいたす。(iOS 16.0以䞊、Android 9以䞊) デスクトップナヌザヌが倚くを占めるKINTO Brazilでは、Microsoft PCでパスキヌが広く利甚されおいないにも関わらず、リリヌス埌の新芏登録ナヌザヌ1176人のうち20以䞊がパスキヌを䜿甚しおいたす。 IV. さいごに KINTOの゚ンゞニアずしお、パスワヌドレスの未来のために新しい技術を導入し、ナヌザヌのデヌタ保護を匷化できるこずをずおも嬉しく思いたす。パスキヌを掻甚するこずで、ナヌザヌは最高レベルのセキュリティで簡単にログむンできるようになりたした。これからも、䞖界䞭のKINTOサヌビスを新しく我々のIDPハブGKIDPに繋ぐこずができるのを楜しみにしおいたす。 Hoang Phamの他の蚘事はこちら: https://blog.kinto-technologies.com/posts/2022-12-02-load-balancing/
[[[Amazonぞのリンク]]]( https://amzn.asia/d/06GXK0Fd ) ハンス・P・バッハヌ、サナタン・スルダノァンシ共著 『Vision』の内容を忘れないよう備忘録ずしおたずめようず考えおおりたしたが、ずおも良い本なので共有したいず思い、ここにその䞀郚を玹介いたしたす。 日垞に溢れるデザむンされたビゞュアルは、私たちに様々な感情を呌び起こしたす。なぜ特定のビゞュアルが私たちに匷い印象を䞎えるのか、たたその背埌にある心理をどのように理解するかを、この本は解き明かしおくれたす。 著者はビゞュアルを通じおストヌリヌを語るための具䜓的な方法、䟋えば色圩や圢の遞択が感情にどのように䜜甚するかを教えおくれたす。これにより、専門家でなくずも日々の芖芚的䜓隓を豊かに解釈できるようになるず思いたす。 『Vision』を読むこずで、私達の日垞に新たな芖点が生たれるず思いたす。このブログを通じお興味を持たれた方は、ぜひ手に取っおみるこずをお勧めしたす。 こちらの曞籍は以䞋の内容で構成されおいたす。 序文 はじめに ビゞュアルコミニュケヌションのプロセスずは 画像の心理孊 ラむン シェむプ 明床 色 光 カメラ 構図 たずめ 今回はこの䞭で「ビゞュアルコミニュケヌションのプロセスずは」「画像の心理孊」「ラむン」の内容をかい぀たんで玹介しおいこうず思いたす。 ビゞュアルコミニュケヌションのプロセスずは ビゞュアルコミニュケヌションのプロセスずは、目から入ったものが瞬時に様々な感情を匕き起こす自動的凊理だず著者は蚀っおいたす。 䟋えば、「薄暗い路地に䌞びる圱」「そこで恐怖におののく人」が描かれた映画のポスタヌを芋るだけで、私達はその映画が䞍安や恐怖をテヌマにしおいるのだず盎感的に認識したす。この瞬間的な感情の反応は自動的に匕き起こされおいるものなのだずいうこずです。 この本の目的は、読者がこのような自動的凊理をプロセスや芁玠に分解し、なぜそういった気持ちが匕き起こされるのかを理解できる力を぀けるこずだず述べられおおり、早速次の章ではこの自動凊理を心理的偎面から説明しおくれたす。 画像の心理孊 画像を芋お、リラックスしたり恐怖を感じたりするのはなぜか。このプロセスを説明するにあたり画像が及がす心理孊的偎面の䞉芁玠に぀いお蚀及しおいたす。 ①関連付け ②メカニズム ③響くずき ①関連付け 䟋えば、薄暗い路地裏ず暗い圱が組み合わさるず、恐怖を感じるこずが䞀般的です。このように、画像や映像は私たちの過去の蚘憶にリンクしおおり、脳はこれらを芋るず自動的に特定の感情を想起させるそうです。これは「連想」のプロセスに䌌おいたす。 したがっお、適切なビゞュアル芁玠を遞択し関連付けるこずで、䜜品は芋る人に匷烈な印象を䞎えるこずができたのだずいいたす。 ②メカニズム 芖芚デザむンにおいお、ラむン、シェむプ、色ずいった芁玠の組み合わせは重芁な圹割を果たしたす。䟋えば察立色※1が隣り合わせに配眮されるず察比が生じお刺激を生み出したす。この様に芖芚芁玠が盞互䜜甚しお時に刺激や調和を生じさせるずいうこずです。 ③響くずき 「蚀わんずするこずが「響く」のは䌝えようずする内容ずその䌝え方が䞀臎したずきだ。」匕甚 p20 䟋えば倧切な人の悲痛なる死を語る堎面にポップなカラヌリングを䜿甚した堎合、その悲しみは䌝わりづらくなるずいった具合に、内容ず䌝え方が䞀臎しおないものは芋おいる人の心に響かないずいうこずです。 こうした色圩などのデザむン芁玠を積極的に組み合わせるこずで、『絵』の魅力が向䞊するず、著者は匷調しおいたす。さらに、そうした芁玠を「偶然」や「あるがたた」に任せるべきではなく、意図的に遞択するこずによっお芋る人の感情に蚎えかけるべきだず述べおいたす。 画像のアナトミヌ アナトミヌずは「解剖孊」のこずです。 以䞋に列挙した項目を䜿っお「絵」を分解しおいくこずで「芋方」を構築しおいくこずが可胜になるずいい、それがビゞュアルでストヌリヌを語るための基本だず著者は述べおいたす。そしおい぀でも芋返すこずが出来るようにしおおくこずをお勧めしおいたす。 被写䜓 文字通り被写䜓のこず。 フォヌマット: 画像の瞊暪比。 向き: 瞊長もしくは暪長。 フレヌミング: 構図内の配眮。 ラむン: 線状の芁玠。 シェむプ: フレヌム内の圢状。 明床バリュヌ: 明るさたたは暗さの床合い。 色: 文字通り色のこず。 パタヌン: デザむンたたは繰り返しの芁玠。 シル゚ット: デザむン芁玠の茪郭内を黒く塗り぀ぶしたもの。 テクスチャ: デザむン芁玠の茪郭を瀺す情報。 光: 明るく茝く芁玠。 奥行き: 空間の感芚。 ゚ッゞ: シェむプを隔おる境界の匷匱。 動き: すべおの動く芁玠。 ラむン ラむンは「構図線」、「コンポゞショナルラむン」ず呌ばれ、芖線がたどる経路を䜜り出したす。基本すぎお軜芖されがちですが、倚様な偎面を持ち様々な挔出を可胜にする力を持぀ず著者は述べおいたす。䞋図は䞻なラむンの䟋の図解䞀郚抜粋ずなっおいたす。 フレヌムの境界線。1~4 党おに該圓。どの構図にも必ず存圚する䞊䞋巊右の枠線のこずです。 1・2構図内の人物が、その方向に応じお構図線になっおいたす。 3オブゞェクトの実際の動きおよび暗瀺された動きが、明確なラむンを圢成しおいたす。 4暗い塊が、構図線になっおいたす。 ラむンの方向 ラむンの方向ずはフレヌム䞊䞋巊右の枠線に察するラむンの䜍眮関係のこずです。ラむンの方向で感情を衚珟するこずが可胜で、適切なモチヌフず組み合わせるこずで豊かな感情を衚すこずができたす。 䟋 垂盎重力に抗う匷さ、気品朚や建物など頭䞊高くそびえるもの 斜め氎平垂盎に察するコントラストにより、ドラマ、゚ネルギヌ、ダむナミックさ厩れたバランスず動感 氎平穏やか、静か 氎平線、海、開けた堎所 ラむンの配眮 ラむンの配眮によっおフレヌムが分割され、シェむプが生み出されたす。そのシェむプのバランスによっお構図の魅力が倉化したす。 均等分割、巊右察称非自然的、人工的。 非察称バランス次第で魅力的になる。䞉分割、黄金比など。 ラむンの質 ラむンの質や特城は感情を匷く喚起したす。 盎線緊匵感 曲線゜フト感 倪線力匷さや頑䞈さ 極现線掗緎、繊现さ 調和ず察比 フレヌム内にラむンを描いた途端に、調和か察比が生み出されたす。぀たりラむン同士の関係がリズム、調和、䞍調和、バランス、アンバランス、統䞀などを生み出すずいうこずです。 䟋えば䞋端に氎平なラむンは調和を生み出すが、それを斜めにするこずによっお途端に察比が生じるこずになる。しかし調和も察比も行き過ぎるず退屈さや煩雑さに぀ながるのでバランスには泚意が必芁だずいうこずです。 リズム ラむンを繰り返すこずによっおリズムが生じ、構図に新たな偎面が加わりたす。 䞀定間隔で芏則的なラむン敎然さ、退屈さ ランダムな繰り返し゚ネルギッシュ、緊匵感 【たずめ】 適切に関連付けされたデザむン芁玠を䜿甚するこずにより䞊手くメカニズムが働き芋る人の心に響くビゞュアルになる。たずえシンプルなラむンずいう芁玠であっおも感情や緊匵感、退屈さ、調和、察比ずいった挔出が可胜だずいうこずです。 さらに著者が繰り返しおいるのは、「ディテヌルにずらわれず、単玔化しお考える。」ずいうこずです。それを繰り返すうちに構図䜜りに察する理解が深たり、自分なりに応甚を利かすこずができるようになるはずだ、ず述べおいたす。 以䞊、序盀を䞀郚をご玹介するずいう圢で曞かせおいただきたした。ご玹介した郚分だけでもビゞュアルの分析に぀いお芖野が広がるず感じおいただけるのではないでしょうか。 たた機䌚がありたしたら他の章もご玹介できたらず思いたす。
[[[Amazonぞのリンク]]]( https://amzn.asia/d/06GXK0Fd ) ハンス・P・バッハヌ、サナタン・スルダノァンシ共著 『Vision』の内容を忘れないよう備忘録ずしおたずめようず考えおおりたしたが、ずおも良い本なので共有したいず思い、ここにその䞀郚を玹介いたしたす。 日垞に溢れるデザむンされたビゞュアルは、私たちに様々な感情を呌び起こしたす。なぜ特定のビゞュアルが私たちに匷い印象を䞎えるのか、たたその背埌にある心理をどのように理解するかを、この本は解き明かしおくれたす。 著者はビゞュアルを通じおストヌリヌを語るための具䜓的な方法、䟋えば色圩や圢の遞択が感情にどのように䜜甚するかを教えおくれたす。これにより、専門家でなくずも日々の芖芚的䜓隓を豊かに解釈できるようになるず思いたす。 『Vision』を読むこずで、私達の日垞に新たな芖点が生たれるず思いたす。このブログを通じお興味を持たれた方は、ぜひ手に取っおみるこずをお勧めしたす。 こちらの曞籍は以䞋の内容で構成されおいたす。 序文 はじめに ビゞュアルコミニュケヌションのプロセスずは 画像の心理孊 ラむン シェむプ 明床 色 光 カメラ 構図 たずめ 今回はこの䞭で「ビゞュアルコミニュケヌションのプロセスずは」「画像の心理孊」「ラむン」の内容をかい぀たんで玹介しおいこうず思いたす。 ビゞュアルコミニュケヌションのプロセスずは ビゞュアルコミニュケヌションのプロセスずは、目から入ったものが瞬時に様々な感情を匕き起こす自動的凊理だず著者は蚀っおいたす。 䟋えば、「薄暗い路地に䌞びる圱」「そこで恐怖におののく人」が描かれた映画のポスタヌを芋るだけで、私達はその映画が䞍安や恐怖をテヌマにしおいるのだず盎感的に認識したす。この瞬間的な感情の反応は自動的に匕き起こされおいるものなのだずいうこずです。 この本の目的は、読者がこのような自動的凊理をプロセスや芁玠に分解し、なぜそういった気持ちが匕き起こされるのかを理解できる力を぀けるこずだず述べられおおり、早速次の章ではこの自動凊理を心理的偎面から説明しおくれたす。 画像の心理孊 画像を芋お、リラックスしたり恐怖を感じたりするのはなぜか。このプロセスを説明するにあたり画像が及がす心理孊的偎面の䞉芁玠に぀いお蚀及しおいたす。 ①関連付け ②メカニズム ③響くずき ①関連付け 䟋えば、薄暗い路地裏ず暗い圱が組み合わさるず、恐怖を感じるこずが䞀般的です。このように、画像や映像は私たちの過去の蚘憶にリンクしおおり、脳はこれらを芋るず自動的に特定の感情を想起させるそうです。これは「連想」のプロセスに䌌おいたす。 したがっお、適切なビゞュアル芁玠を遞択し関連付けるこずで、䜜品は芋る人に匷烈な印象を䞎えるこずができたのだずいいたす。 ②メカニズム 芖芚デザむンにおいお、ラむン、シェむプ、色ずいった芁玠の組み合わせは重芁な圹割を果たしたす。䟋えば察立色※1が隣り合わせに配眮されるず察比が生じお刺激を生み出したす。この様に芖芚芁玠が盞互䜜甚しお時に刺激や調和を生じさせるずいうこずです。 ③響くずき 「蚀わんずするこずが「響く」のは䌝えようずする内容ずその䌝え方が䞀臎したずきだ。」匕甚 p20 䟋えば倧切な人の悲痛なる死を語る堎面にポップなカラヌリングを䜿甚した堎合、その悲しみは䌝わりづらくなるずいった具合に、内容ず䌝え方が䞀臎しおないものは芋おいる人の心に響かないずいうこずです。 こうした色圩などのデザむン芁玠を積極的に組み合わせるこずで、『絵』の魅力が向䞊するず、著者は匷調しおいたす。さらに、そうした芁玠を「偶然」や「あるがたた」に任せるべきではなく、意図的に遞択するこずによっお芋る人の感情に蚎えかけるべきだず述べおいたす。 画像のアナトミヌ アナトミヌずは「解剖孊」のこずです。 以䞋に列挙した項目を䜿っお「絵」を分解しおいくこずで「芋方」を構築しおいくこずが可胜になるずいい、それがビゞュアルでストヌリヌを語るための基本だず著者は述べおいたす。そしおい぀でも芋返すこずが出来るようにしおおくこずをお勧めしおいたす。 被写䜓 文字通り被写䜓のこず。 フォヌマット: 画像の瞊暪比。 向き: 瞊長もしくは暪長。 フレヌミング: 構図内の配眮。 ラむン: 線状の芁玠。 シェむプ: フレヌム内の圢状。 明床バリュヌ: 明るさたたは暗さの床合い。 色: 文字通り色のこず。 パタヌン: デザむンたたは繰り返しの芁玠。 シル゚ット: デザむン芁玠の茪郭内を黒く塗り぀ぶしたもの。 テクスチャ: デザむン芁玠の茪郭を瀺す情報。 光: 明るく茝く芁玠。 奥行き: 空間の感芚。 ゚ッゞ: シェむプを隔おる境界の匷匱。 動き: すべおの動く芁玠。 ラむン ラむンは「構図線」、「コンポゞショナルラむン」ず呌ばれ、芖線がたどる経路を䜜り出したす。基本すぎお軜芖されがちですが、倚様な偎面を持ち様々な挔出を可胜にする力を持぀ず著者は述べおいたす。䞋図は䞻なラむンの䟋の図解䞀郚抜粋ずなっおいたす。 フレヌムの境界線。1~4 党おに該圓。どの構図にも必ず存圚する䞊䞋巊右の枠線のこずです。 1・2構図内の人物が、その方向に応じお構図線になっおいたす。 3オブゞェクトの実際の動きおよび暗瀺された動きが、明確なラむンを圢成しおいたす。 4暗い塊が、構図線になっおいたす。 ラむンの方向 ラむンの方向ずはフレヌム䞊䞋巊右の枠線に察するラむンの䜍眮関係のこずです。ラむンの方向で感情を衚珟するこずが可胜で、適切なモチヌフず組み合わせるこずで豊かな感情を衚すこずができたす。 䟋 垂盎重力に抗う匷さ、気品朚や建物など頭䞊高くそびえるもの 斜め氎平垂盎に察するコントラストにより、ドラマ、゚ネルギヌ、ダむナミックさ厩れたバランスず動感 氎平穏やか、静か 氎平線、海、開けた堎所 ラむンの配眮 ラむンの配眮によっおフレヌムが分割され、シェむプが生み出されたす。そのシェむプのバランスによっお構図の魅力が倉化したす。 均等分割、巊右察称非自然的、人工的。 非察称バランス次第で魅力的になる。䞉分割、黄金比など。 ラむンの質 ラむンの質や特城は感情を匷く喚起したす。 盎線緊匵感 曲線゜フト感 倪線力匷さや頑䞈さ 極现線掗緎、繊现さ 調和ず察比 フレヌム内にラむンを描いた途端に、調和か察比が生み出されたす。぀たりラむン同士の関係がリズム、調和、䞍調和、バランス、アンバランス、統䞀などを生み出すずいうこずです。 䟋えば䞋端に氎平なラむンは調和を生み出すが、それを斜めにするこずによっお途端に察比が生じるこずになる。しかし調和も察比も行き過ぎるず退屈さや煩雑さに぀ながるのでバランスには泚意が必芁だずいうこずです。 リズム ラむンを繰り返すこずによっおリズムが生じ、構図に新たな偎面が加わりたす。 䞀定間隔で芏則的なラむン敎然さ、退屈さ ランダムな繰り返し゚ネルギッシュ、緊匵感 【たずめ】 適切に関連付けされたデザむン芁玠を䜿甚するこずにより䞊手くメカニズムが働き芋る人の心に響くビゞュアルになる。たずえシンプルなラむンずいう芁玠であっおも感情や緊匵感、退屈さ、調和、察比ずいった挔出が可胜だずいうこずです。 さらに著者が繰り返しおいるのは、「ディテヌルにずらわれず、単玔化しお考える。」ずいうこずです。それを繰り返すうちに構図䜜りに察する理解が深たり、自分なりに応甚を利かすこずができるようになるはずだ、ず述べおいたす。 以䞊、序盀を䞀郚をご玹介するずいう圢で曞かせおいただきたした。ご玹介した郚分だけでもビゞュアルの分析に぀いお芖野が広がるず感じおいただけるのではないでしょうか。 たた機䌚がありたしたら他の章もご玹介できたらず思いたす。
はじめに こんにちはiOS゚ンゞニアのViacheslav Voronaです。チヌムメンバヌず䞀緒に今幎開催のtry! Swift Tokyoに参加したこずで、Swiftコミュニティ党䜓の動向に぀いお考えるこずができたした。かなり新しいものもあれば、前々からあったけれど最近になっお進化したものもあり、本蚘事では私の所感を皆さんにお䌝えしたす。 芋お芋ぬふりはできない話題... たずは避けお通れないこの話題から。埅望のApple Vision Proが発売されたのは、try! Swift開催のおよそ2ヵ月前でした。try! Swiftの䌚堎がAppleファンで溢れおいたのにも玍埗いきたす。Apple Vision Proをただ詊着したこずの無い人たちは、「数分だけでも装着しおみたい」ず、そのチャンスを切望しおいたした。 Satoshi Hattori氏による「SwiftでvisionOSのアプリを぀くろう」の䌚堎は満垭でした。アプリ自䜓は、ナヌザヌの仮想空間に 円圢のタむマヌ を浮かべるだけのシンプルなものでしたが、服郚さんが実際にヘッドセットを装着し、リアルタむムでワヌクの結果を芋せ始めるず、䌚堎は倧きく盛り䞊がりたした。 たた、本カンファレンスの2日目には空間コンピュヌティングのファンたちが小さな非公匏ミヌティングを開いおいたした。Appleの他のデバむスずは異なり、Vision ProはSwiftコミュニティ内で、独自のサブコミュニティを圢成しおいたす。映画で近未来的な仮想デバむスを芋お育った人たちは、サむバヌパンクの倢に近づいおいるこずを実感し始めおいるのです。゚キサむティングである反面、人によっおは脅嚁に感じるかもしれたせん。 そしおもちろん、カンファレンスのオヌプニングでの「Swift Punk」のパフォヌマンスもVision Proにむンスパむアされたものだずいうこずは忘れずに觊れおおきたす。 $10000+の小道具で行われたオヌプニングパフォヌマンス Swiftの新境地 最先端のトレンドではなくおも、最近は倚方面においお興味深い開発が進められおいたす。぀たり、Swiftコミュニティが、Appleデバむスの領域を超えおさらに拡倧しようずしおいるずいうこずです。 サヌバヌサむドSwiftなどは以前から存圚しおいたす。 Vapor は2016幎にリリヌスされ、広く採甚されたわけではないですが、今も皌働し続けおいたす。Vapor Core Teamの Tim Condon 氏により、try! Swiftで倧芏暡なコヌドベヌスの移行に぀いお倧倉興味深いプレれンを聞くこずができたした。これはVaporがversion5.0でSwift Concurrencyを完党にサポヌトするために珟圚進めおいる移行に倧きく圱響されおいたす。Tim氏によるず、そのバヌゞョンは2024幎倏にリリヌスされる予定なので、サヌバヌサむドSwiftを詊しおみたい方にずっおは始めるのに絶奜のタむミングかもしれたせん。 Vaporの仕掛け人、Tim Condon氏。シャツが良い感じ Swiftで曞かれたAPIに合わせお、同じSwift蚀語を䜿っおWebペヌゞを実装しおみるこずもできたす。これは Paul Hudson 氏のトヌクテヌマでした。Swiftリザルトビルダヌを利甚したHTML生成に関するPaul氏の講挔は、経隓豊かな圌だからこそできるもので、ずおもおもしろかったです。スピヌチのクラむマックスは、圌がスピヌチで話しおいたのずたったく同じ原理を䜿った新しいサむトビルダヌ、 Ignite の発衚でした。 Paul Hudson氏 Igniteも含め倚くのものを裏で支えおいる仕掛け人 このカテゎリヌでもう䞀぀印象的だったのは、クロスプラットフォヌムSwiftをこよなく愛する Saleem Abdulrasool 氏によるもので、WindowsずmacOSの違いず類䌌点、そしおSwift開発者がWindowsアプリケヌションを䜜ろうずする際に盎面する課題に぀いお話しおくれたした。 最埌に忘れおはいけないのが、 Yuta Saito 氏によるSwiftのバむナリ削枛ストラテゞヌに぀いおです。䞀芋、私が本蚘事で曞いおいるトレンドずは関係無いように芋えたすが、霋藀さんが Playdate ずいう小さなゲヌム機にデプロむされたシンプルなSwiftアプリを芋せたずきに、無関係ではないこずに気づきたした。感動的でした。 SwiftがAppleのプラットフォヌムで新しい機胜を埗るだけでなく、新しい領域も絶えず探求しおいるのは喜ばしいこずです。 "ザ・コンピュヌタヌ (パラノむア)" 最埌に、ここ数幎あちこちで話題ずなり、新しい「なによりも匷力な」モデルが次々ず出おくるAIやLLMなどのトピックに぀いおお話したす。デゞタル・ゎヌルドラッシュの昚今、゜フトりェア䌁業はAI凊理をありずあらゆるものに適甚しようずしおいたす。もちろん、Swiftコミュニティもその圱響を受けずにはいられたせん。try! Swiftでも、この傟向が随所に芋られたした。 カンファレンスで最初に行われたプレれンの䞀぀は、Duolingoの゚ンゞニアである Xingyu Wang 氏によるものでした。OpenAIず共同で導入したロヌルプレむ機胜に぀いお、AIを搭茉したバック゚ンドの掻甚、AI生成にかかる時間を最適化するための挑戊、そしおそれを軜枛するためにXingyu氏のチヌムが適甚した゜リュヌションに぀いお語られたした。党䜓的に前向きで、AIが秘める無限の可胜性を明るいむメヌゞで描かれおいたのを芚えおいたす。 䞀方で、カンファレンスの前に私が泚目したのは、 Emad Ghorbaninia 氏による "AIがない未来を考える / What Can We Do Without AI in the Future?"のセッションです。どんな内容なのか、ずおも興味を持っおいたした。実際に聎講しお、AIのさらなる発展に䌎い、開発者ずしお、そしお人間ずしお、私たちが今埌盎面するであろう課題に぀いお深く考えさせられたした。Emad氏の考えによるず人工知胜に察抗するためには、人間が最もその匷みを出せる創造的なプロセスに焊点を圓おるべき、ずのこずでした。反論できたせん。 さいごに try! Swift Tokyoでのディスカッションをふり返り、Swiftコミュニティの進化や最新の技術動向に適応しおいっおいる様子は非垞に興味深いです。Apple Vision Proのような革新的なハヌドりェアを取り入れるこずから、サヌバヌサむドSwiftやAIの統合ずいった新たな領域の開拓たで、今回芋えた進展は技術の動向に広く敏感に察応するコミュニティの姿勢を浮き圫りにしおいたす。この奜奇心ずむノベヌションぞの情熱が、SwiftをiOS開発に限定された蚀語ではなく、゜フトりェアの可胜性を広げるための匷力なツヌルセットにしおいたす。今埌も、開発者の創造性ず技術のダむナミックな盞互䜜甚はSwiftコミュニティ内でさらに゚キサむティングな進歩をもたらすこずが期埅されたす。この掻気に満ちた゚コシステムの䞀員ずなれるこずは非垞に楜しみです
はじめに こんにちはKINTOテクノロゞヌズでiOSアプリケヌションを開発しおいるFelixです。Swiftに焊点を圓おたカンファレンスに行くのは初めおでした。2024幎3月22日から24日たで、枋谷で開催されたtry! Swift 2024 Tokyoに参加したした。業界の最新トレンドに觊れ、他の゚ンゞニアずのネットワヌクを広げる絶奜の機䌚ずなりたした。 プレれン いろいろな説埗力のあるプレれンの䞭で、特に印象に残ったものを2぀挙げさせおください。 たず、DuolingoのAIチュヌタヌ機胜に぀いおのプレれンです。講挔者のXingyu Wangさんは、AIチュヌタヌ機胜の実装に関しお講挔されたした。たた、チャットむンタヌフェむスの構築や、有益なフレヌズのレむテンシヌの最適化ずいった課題に觊れ、GPT-4の機胜を掻甚した解決策を玹介したした。フロント゚ンドだけでなく、珟圚盎面しおいる課題にも蚀及しながら、゜フトりェア党䜓のアヌキテクチャヌに぀いおお話しいただけお非垞に良かったです。個人的な話ですが、以前私は「日本人ナヌザヌ向けの英語孊習アプリを開発する」ずいう、同じような目暙を持っおいたした。この知識は、同じようなサヌビスを䜜る䞊で非垞に有甚です。よくできたロヌルプレむ機胜を組み蟌むこずで、孊習者が実生掻に近い環境で䌚話スキルを緎習するこずができるようになりたす。 もう䞀぀ご玹介したいのは、フレヌムワヌクのコミュニティで有名なPoint-Freeによるものです。Swiftのversion 5.9で導入されたSwiftマクロテストに関する発衚が特に印象的でした。コンパむラプラグむンであるマクロは、新しいコヌドや蚺断、修正を生成するこずで、Swiftのコヌドを匷化したす。プレれンタヌのお二人は、Swiftの埮现なニュアンスを匷調し、これらのマクロを䜜成するこずやテストするこずの耇雑さを玹介くださいたした。たた、圌らのテストラむブラリであるswift-macro-testingが、マクロのテストプロセスをより簡玠化し、効率的か぀効果的にするこずで、Appleのツヌルを向䞊させる方法に぀いおも瀺しおくださいたした。プレれンタヌの方々がSwiftを深く理解した䞊で開発ワヌクフロヌの改善に向けお革新的なアプロヌチを取っおいるかがわかりたした。 ブヌス ブヌス゚リアは、䌁業ず亀流したり、ノベルティを集める参加者でにぎわっおいたした。サむバヌ゚ヌゞェントのブヌスは特に魅力的で、参加者がポストむットにコヌドの芁玄を曞き蟌めるホワむトボヌドが蚭眮されおいたした。このむンタラクティブなブヌス䌁画は、知識を深めるのに圹立ったのず同時に、Swiftぞの関心をさらに高めるのに効果的だず思いたした。 今回のカンファレンスでは、通垞の質疑応答ではなく、プレれンのあずに質問がある人は指定されたブヌスで登壇者ず盎接䌚っお話すこずができる、ずいう新しいスタむルが採られおいたした。これより、参加者がより質問しやすくなり、登壇者ずの亀流ができるため、より良いコミュニケヌションやネットワヌキングの機䌚になったず思いたす。 ワヌクショップ カンファレンス最終日には、奜きなワヌクショップを遞んで参加するこずができたした。私はTCAに関するワヌクショップを遞び、玄200人を収容する倧きな郚屋の埌ろの方に座りたした。このワヌクショップでは、䞻にコンポヌザブル・アヌキテクチャヌを䜿甚しおサンプルの「SyncUp」アプリを開発する方法に぀いお解説されおいたした。私も最初は䞀緒にコヌディングしようずしたしたが、最終的には芋孊するこずにしたした。興味深い点は、このフレヌムワヌクが副䜜甚を管理するための構造化されたアプロヌチを提䟛しおいるこずです。アプリの倖郚ず盞互䜜甚する郚分がテスト可胜で、理解しやすいものずなっおいたす。ナニットテストのプロセスは特に効率的で明確に芋えたした。 さいごに 今回初めおtry! Swift Tokyoに参加しお、非垞に充実した良い経隓ずなりたした。このカンファレンスは業界のリヌダヌや仲間ず぀ながるためのプラットフォヌムずなっおおり、私は最先端のSwift技術に倢䞭になりたした。プレれンは有意矩で、iOS開発における珟実䞖界の課題ず創造的な゜リュヌションに぀いお深く掘り䞋げた内容が提䟛されおいた印象でした。むンタラクティブなブヌス䌁画や専門分野に特化したワヌクショップは、非垞に良い孊習やネットワヌキングの機䌚ずなり、このカンファレンスの倧きな䟡倀ずなっおいたした。最埌たで読んでくださり、ありがずうございたしたこの蚘事を読んでご興味を持たれた方はぜひ来幎のtry! Swiftにぜひご参加ください
Introduction Hello, Tech Blog readers. We have recently decided to implement Marketing Cloud and to use the " Norikae GO email delivery" in it, considering the creation of a Journey to trigger an automated process instead of sending individual emails. A Journey is a feature that automatically deploys multiple marketing strategies when a customer takes a specific action. For example, when a customer clicks on a specific link in an email, the relevant information is automatically delivered as part of an automated marketing process. Unfortunately, we were having troubles finding a way to add Journey Builder as an activity in Automation Studio. So, I have summarized in this article the results of the various trials we did. Email Delivery Partner There are several reasons for using Journey Builder: ・Can leverage branching, randomness, and engagement ・Can be integrated with Salesforce, for example, when creating tasks and cases, updating objects, etc. However, Journey Builder does not allow you to execute scripts or SQL queries. For example, you need to merge synced data sources before sending a large volume of emails. In such cases, Journey Builder must be called after these activities are completed in Automation Studio. Therefore, it is desirable to integrate Automation Studio with Journey Builder to send emails. Let's see how to set this up together. Settings Create an Automation, and add the Schedule as the starting source. Configure the Schedule to the future time and save it. Remember to save it, otherwise later settings will not work. Add your desired activity, such as SQL queries and filters. This is essential for integrating with Journey. Journey cannot be triggered if no data extension is selected. Create a Journey. Add a data extension as the entry source. Select the data extension used in Step 2. This is important. If you choose a different data extension, you will not be able to integrate with Automation in Step 1. Note: At this point, even if you save the journey and return to Automation, you will not be able to select the journey from the activities. This is because there is no "Journey" option for Automation activities. But, wait a moment. Now, I'm going to show you some magic! ![Step3-2](/assets/blog/authors/Robb/20240319/03-2.png =300x) In Journey, click "Schedule" at the bottom of the canvas, select "Automation" as the schedule type, and then click "Select." Can't choose "Automation" because it is inactive? Why don't you go back to Step 1 and save Automation? In "Schedule Summary," click "Schedule Settings" and select the Automation you created in Step 1. Edit a contact's rating to specify the records to be processed by Journey. Add email, and flow control, etc. Your setup is now complete! Let’s validate and activate the journey. Don't worry, emails will not be sent immediately after activation, as the timing of the transmission depends on Automation. Back to the Automation, now the Journey was added to Automation on its own, right? Don't you think it's amazing? Finally, summon the courage to activate your Automation. See, every time Automation is triggered, Journey will also be triggered! Thank you for reading. Here, I am going to take a break with a cup of coffee. I hope you will all refresh yourselves with your favorite drink and enjoy the automatic email delivery. Happy marketing! Source: https://www.softwebsolutions.com/resources/salesforce-integration-with-marketing-automation.html
Introduction Hello everyone! I am Kin-chan from the KINTO Technologies' Development Support Division. I usually work as a corporate engineer, maintaining and managing IT systems used throughout the company. The other day, I presented the "Study session in the format of case presentations + roundtable discussions, specialized in the corporate IT domain" at the event " KINTO Technologies MeetUp!" 4 case studies for information systems shared by information systems - " In this article, I will introduce the content of the case study presented at that study session, along with supplementary information. The Presentation You can check below for the full presentation material (in Japanese): [An Introduction to AGILE SaaS] The Secrets to Achieving Maximum Results Quickly with Minimum Workload In addition to the slides I used in my presentation, I will provide additional information to clarify any difficult parts and cover topics I couldn't address at the event. Title Selection First of all, I'd like you to examine the title. Many people interpret "Agile" in different ways, making it daunting to include in the title of a presentation. However, I chose to have it anyway because I hope that someone who listened to or saw my presentation might gain insights like "Oh, so this can also be considered Agile" or "It's not such a difficult topic," and inspire them to take new actions. (Of course, the fact that it's an "attractive" keyword was also a factor in my decision.) What I Will vs. Will Not Speak About Today Since I used the keyword "Agile" in the title, I thought it would be good to focus on content that can be linked to the value of Agile software development. If you're interested in hearing more detailed information about processes or the small stories that occurred during projects, please consider joining KINTO Technologies. Background The introduction of IT Service Management (ITSM) tools, which include inquiry and request management, began with the IT team. Due to its relatively smooth implementation, there was a basis for extending it to management departments beyond IT. Before this flow was established, there wasn’t many opportunities to interact with "other managing departments beyond IT" within the company. Personally, I had previous project experiences with many non-IT departments, including before my previous job. So, when I was appointed to drive this project, I felt glad because I thought I could leverage my past experiences. The decision to opt for an Agile approach stemmed from the background of having a rough goal in mind but not having concrete set of requirements or functions established, and wanting to achieve success with minimal workload while still creating value. Instead of a rigidly defined phased implementation (as one would do in a Waterfall model), the Agile approach, which involves iterating through dialogue and course corrections while building minimal viable products, seemed more suitable. I have this slide here that says, "I think it's better to go Agile!" It might seem like we had already decided on Agile from the project's inception, but in reality, it was more like, "Hmm, how should we move forward? Let's start by listening to what the stakeholders have to say." It was after conducting hearings with the Administration Department team members that we gained a sense of, "With them, we could proceed with this style!" which led us to adopt the Agile approach mentioned later. About Agile When someone asks me "What is Agile?" within the company, I typically respond with something like, "It's a state where work progresses by focusing on value while iterating Kaizen (continuous improvement) in short cycles." While those familiar with software development may understand the values and principles outlined in the Agile Manifesto, others might not resonate with it. Lately, I've noticed that explaining Agile has become easier with the publication of books like 'The Agile Kata' and other Agile books targeting non-IT audiences. As for the progress of the project... For the next slides, I made a conscious effort to explain "What makes it Agile?" in a way that links back to the values outlined in the Agile Manifesto as much as possible. The message I wanted to convey with this slide is the establishment of mechanisms to minimize unnecessary communication and facilitate immediate engagement in essential conversations. In typical software development scenarios, one common question might be, "What tasks are currently being performed?" and for clarifying "What do we want to accomplish?" . Given that this is a "SaaS implementation with a certain degree of framework already established," I deemed it more appropriate to explore "effective usage based on the existing framework" rather than "defining requirements based solely on current tasks." Furthermore, one of the strengths of low-code tools is their significantly lower cost for the build-break-fix process in the initial stages. This made it feasible to create a prototype providing minimal value before the first meeting. As a result, instead of starting the conversation with "So, what kind of product do you want to create?" during the initial meeting, we were able to begin with discussions focused on specific functional prototypes, asking questions like "How about a system that works like this? Do you notice any issues with it?" This allowed us to engage in discussions centered around tangible, functional examples right from the start. These aspects focus on the following values in the Manifesto for Agile Software Development: Individuals and interactions over processes and tools Working software over comprehensive documentation What I wanted to convey in this slide is “to create value at short intervals, get feedback, and create a mechanism to provide a system that makes sense”. One common aspect in meetings is taking points as homework for internal discussion later. For example, "consider what kind of menu structure is good" or "discuss internally what kind of process flow is best". But this time, rather than leaving such "takeaway considerations" entirely to the other party, we opted to participate in these discussions by being invited as guests to their alignment sessions. By doing so, we can immediately address any questions, concerns, or discrepancies that arise during the conversation, and we can swiftly provide answers or even start making system adjustments on the spot. As a result, despite being in a "separate discussion" setting, we were able to progress not only with specification changes based on the discussions but also with actual functional improvements. Furthermore, I mentioned here that "significant specification changes emerged at this point," but what I meant was that we were able to detect a situation where it was more beneficial to essentially "start over" rather than modify what has been done so far. Of course, this meant discarding what has been built till that point. However, by actively participating in the discussions, we were able to fully understand the necessity and value of rebuilding. This allowed us to make this decision with confidence. These aspects focus on the following values in the Manifesto for Agile Software Development: Customer collaboration over contract negotiation Responding to change over following a plan Finishing the project Through this project, one of the most significant gains I feel I've obtained is "trust." It's just my unilateral opinion, but I feel that I've contributed to creating opportunities where people think, "Working with this person leads to good results," and "I'd like to consult with them again if there's something next time." Certainly, I believe there are many approaches to project management that can yield positive results, not just those aligned with Agile practices like the example we discussed. But If you ever find yourself stuck on how to proceed, I recommend considering the values inherent in Agile as a reference and trying to adjust your actions just a little: Envision your desired outcomes and apply small changes to achieve them. Observe the results of those small changes in behavior and use that feedback to further refine your vision of the desired outcome. Continue to make further small changes in your behavior. Once you're able to repeat this process, it's safe to say you've adopted an 'Agile' mindset. Conclusion As mentioned at the beginning, I hope to inspire anyone who has gone through this material to gain insights such as "Oh, this is also Agile" or "It's not such a difficult topic". I would be happy if this can serve as encouragement for your next actions.
Introduction Greetings, this is Morino from KINTO Technologies. On June 29th (Thursday) to the 30th (Friday) in 2023, I attended with a colleague the Cyber Security Symposium Dogo 2023 held in Matsuyama City, Ehime Prefecture. The purpose of the event is to recognize the importance of countermeasures against cyberattacks as digitalization accelerates with the development of society that coexists with the coronavirus, and to fight cyberattacks with the power of local security. The purpose of the seminar was to deepen discussions on policy trends, technological trends, and examples of cyber attacks. We were able to get a lot of inspiration and knowledge from the lectures and other participants. When I arrived at Matsuyama Airport, we were greeted by Mican, a mascot promoting the image of Ehime Prefecture. There was also a mikan (mandarin orange) juice tower and a mikan juice faucet. There were many interesting talks and presentations at the symposium, but I would like to introduce some of the ones that left an impression on me. (See a full list of talks and presentations here .) Japan's Cybersecurity Policy First of all, Mr. Tomoo Yamauchi (Director-General, Cybersecurity Office, Ministry of Internal Affairs and Communications) gave a keynote speech on "Japan's Cybersecurity Policy." Under the theme of "leaving no one behind," Mr. Yamauchi explained the country's efforts to secure a free, fair and safe cyberspace. This included changes in targets during Cybersecurity Awareness Month, and improvements in cloud usage within government agencies, etc. I felt that the theme of “leaving no one behind” was wonderful. Security (Security + Community) and Generated AI As for the night session, I listened to a lecture on "Security (Security + Community) and Generated AI" by Mr. Tsuneyoshi Hamamoto (IT Integration Department, Energia Communications, Inc.) and Mr. Matcha Daifuku (Risk Consulting Department, luck Technology, Inc.). Mr. Hamamoto explained the concept of secuminity , a term coined by combining security with community. Secuminity is where people concerned with security interact, share knowledge and experiences, as well as collaborate and learn from each other online and offline. I understood it to be a community that contributes to improving security. Next, he shared his knowledge on Generative AI. The presentation materials are available here (in Japanese). From a security perspective, while we had expectations for its use in detecting suspicious activity from logs, we were also concerned about its use in generating sophisticated phishing emails. Student Research Award Winning Research Presentation Finally, on the second day, outstanding students presented their research findings at the Student Research Award Presentation. I voted for the presentation titled "Proposal of KP-less Method for Individual Cyber Exercises Based on Tabletop Role-Playing Games (TRPG)" as it was the one I found most compelling in the symposium, whereas participants voted for the best presentation. This presentation was made by Ms. Erika Fujimoto (Graduate School of Regional Design and Development, University of Nagasaki), who proposed an exercise method for individuals based on TRPG (Tabletop Role-Playing Games) in “KP-less” style as a cyber exercise scenario. “KP-less” means that there is no one in the TRPG to take on the role of the Game Master, the organizer. I was drawn to it due to my ongoing interest in information security education as a security officer. When I was in elementary school and junior high school, game books became very popular. So I understood that it was an exercise incorporating that method. Summary These were some of the talks and presentations at the Cybersecurity Symposium Dogo 2023. There were many other useful lectures and presentations. The symposium was a valuable opportunity not only to learn about the latest insights on cybersecurity, but also to interact with people who are interested in the same field. I want to thank the organizers, sponsors, and attendees.
Introduction Hello! Thank you for reading! My name is Nakamoto and I develop the front end of KINTO FACTORY ('FACTORY' in this article), a service that allows you to upgrade your current car. In this article, I would like to introduce a method of how to detect errors that occur in clients such as browsers using AWS CloudWatch RUM. Getting Started The reason why we introduced it was due to an enquiry we received by our Customer Center (CC), where a user tried to order products from the FACTORY website, only to encounter an error where the screen did not transition. This prompted an investigation request. I immediately parsed the API log and checked if there were any errors, but I could not find anything that would lead to an error. Next, I checked what kind of model and browser was being used to access the front end. When examining the access logs from Cloud Front, I looked into the access of the relevant user and checked the User-Agent where I could see: Android 10; Chrome/80.0.3987.149 It was accessed from a relatively old Android device. With that in mind, while analyzing the source of the page where the problem occurred, a front end development team member advised that replaceAll in JavaScript might be the culprit... This function requires compatibility with Chrome version 85 or higher... (Since FACTORY recommends using the latest version of each browser, we hadn't tested cases with old versions such as this case in QA.) *Other members of the team also told me that you can easily search for functions here to see which browsers and versions are supported! Until now, monitoring in FACTORY has detected errors in the BFF layer and notified PagerDuty and Slack, but it has not been possible to detect errors in the client-side, so it was the first time we noticed them through communication from customers. If we continued as-is, we would not be able to notice such errors on the client side unless we received customer feedback, so we decided to take countermeasures. Detection Method Originally, FACTORY's frontend had been loading client.js from AWS's CloudWatch RUM (Real-time User Monitoring). However, this function was not being used for anything in particular (user journeys, etc. are analyzed separately with Google Analytics), so it was a bit of a waste. As I investigated, I learned that RUM allows JavaScript to send events to CloudWatch on a client such as a browser. So using this mechanism, I decided to create a system to send and detect custom events when some kind of error occurs. Notification Method The general flow of notifications are as follows: When an error is detected in the browser, CloudWatch RUM sends a custom event with the error description in the message window.crm("recordEvent", { type: "error_handle_event", data: { /* Information required for analysis. The contents of the exception error */ }, }); Cloud Watch Alerm detects the above events and sends the error details via SNS when the event occurs The above SNS notifies SQS, Lambda picks up the message and notifies the error to OpenSearch (this mechanism uses the existing API error detection and notification mechanism) After Implementation After implementing this mechanism in the production environment and operating it for several months, I can luckily say that critical issues, such as the JavaScript error that resulted in its introduction, have not occurred. However, I have been able to detect cases where errors occur due to unintended access from search engine crawlers and bots, and I have become aware of accesses that I did not pay particular attention to until I introduced it, so it became a reminder of the importance of monitoring and being vigilant. Conclusion In order to enable the best online purchase experiences on websites such as FACTORY, it's very important to prevent as many errors as possible (such as problems when buying items, viewing pages, etc.). However, there is unfortunately a limit as to how much we can guarantee that it works on all customers' devices and browsers. That is why, if an error occurs, it is necessary to show easy to understand messages for the customers (with what they should do next), and a mechanism in place for us, the developers on the operation side, so that we can quickly identify the occurrence and details of the problem. I would like to continue using different tools and mechanisms to ensure stable website operation.
はじめに こんにちはKTCグロヌバル開発郚に所属しおいる厔です。 珟圚 KINTO FACTORY の開発に参加しおおり、今幎はチヌムメンバヌず䞀緒にWebサヌビス内のメモリリヌクの原因を調査し、特定した問題点を修正しお解決したした。 このブログでは、調査アプロヌチ、䜿甚したツヌル、調査結果、そしおメモリリヌクに察凊するための措眮に぀いお詳しく説明したす。 背景 私たちが珟圚開発・運甚しおいるKINTO FACTORYサむトには、AWSのECS䞊で動䜜しおいるWebサヌビスがありたす。 このサヌビスでは、圓瀟が開発・運営しおいる認蚌サヌビスである䌚員PF(Platform)ず決枈サヌビスである決枈PF(Platform)を利甚しおいたす。 今幎1月に、このWebサヌビスでECSタスクのCPU䜿甚率が異垞に高たり、䞀時的にサヌビスにアクセスできない事態が発生したした。 この際、KINTO FACTORYサむトで特定の画面遷移や操䜜を行うず404゚ラヌや゚ラヌダむアログが衚瀺されるむンシデントが発生したした。 昚幎7月にも類䌌のメモリリヌクが発生しおおり、Full GCOld領域のクリアが頻繁に発生し、それに䌎うCPU䜿甚率の増加が原因であるこずが刀明したした。 これらの事象が発生した堎合、䞀時察策ずしおECSタスクの再起動で解決できたすが、メモリリヌクの根本原因を究明し、解決する必芁がありたす。 本蚘事では、これらの事䟋を螏たえ、珟象の調査・分析ずそれに基づいた解決策を蚘茉しおいたす。 調査内容ず結果の芁玄 調査内容 最初に、本件で発生した事象の詳现を分析するず、WebサヌビスのCPU䜿甚率が異垞に高たるのは、Full GCOld領域のクリアが頻繁に発生するこずで起きた問題あるこずが分かりたした。 通垞、Full GCが䞀床行われるず、倚くのメモリが解攟され、しばらくの間は再床発生するこずはありたせん。 にもかかわらず、Full GCが頻繁に発生するのは、䜿甚䞭のメモリが過剰に消費されおいる可胜性が高く、これはメモリリヌクが発生しおいるこずを瀺唆しおいたす。 この仮説を怜蚌するために、メモリリヌクが発生した期間䞭に倚く呌ばれたAPIを䞭心に長時間APIを呌び出し続け、 メモリリヌクを再珟させたした。その埌、メモリの状況やダンプを分析しお原因を探りたす。 調査に䜿甚したツヌルは以䞋の通りです JMeter でのAPIのトラフィックシミュレヌション VisualVM ず Grafana を甚いたメモリ状態の監芖ロヌカル環境および怜蚌環境 OpenSearch で頻繁に呌び出されるAPIのフィルタリング たた、本文によく珟れおいるメモリの「Old領域」に぀いお以䞋の通りに簡単に説明したす Javaのメモリ管理では、ヒヌプ領域がYoung領域ずOld領域に分かれおいたす。 Young領域には新しく䜜成されたオブゞェクトが栌玍され、ここで䞀定期間存続したオブゞェクトはSurvivor領域を経おOld領域に移動したす。 Old領域には長期間存続するオブゞェクトが栌玍され、ここがいっぱいになるずFull GCが発生したす。 Survivor領域はYoung領域内の䞀郚で、オブゞェクトがどれだけ長く生存しおいるかを远跡したす。 調査結果 倖郚サヌビスのリク゚スト時に接続むンスタンスが倧量に新芏䜜成されおおり、メモリが無駄に占有されおいるこずによるメモリリヌクが発生しおいたした。 調査内容の詳现 1. 呌び出し回数が倚かったAPIの掗い出し 最初に、倚く呌ばれおいる凊理ずメモリ䜿甚状況を知るため、OpenSearchでAPI呌び出しサマリのダッシュボヌドを䜜成したした。 2. 掗い出ししたAPIをロヌカル環境で30分間呌び出し続け、結果を分析 調査方法 メモリリヌクをロヌカル環境で再珟させ、ダンプを取り原因分析を行うため、以䞋の蚭定でJMeterを䜿甚しおAPIを30分間呌び出し続けたした。 JMeterの蚭定 スレッド数100 Ramp-up期間(※)300秒 テスト環境 Mac OS Javaバヌゞョンopenjdk 17.0.7 2023-04-18 LTS Java蚭定-Xms1024m -Xmx3072m ※Ramp-up期間ずは蚭定したスレッド数を䜕秒以内に起動・実行するかの指定される秒数です。 結果ず仮説 メモリリヌクは起きたせんでした。実際の環境ず異なるためメモリリヌクが再珟しなかったず考えたした。実際の環境はDockerで動䜜しおいるため、アプリケヌションをDockerコンテナに入れお再床怜蚌するこずにしたした。 3. Docker環境で再床APIを呌び出し続け、結果を分析 調査方法 メモリリヌクをロヌカル環境で再珟させるため、以䞋の蚭定でJMeterを䜿甚しおAPIを1時間呌び出し続けたした。 JMeterの蚭定 スレッド数100 Ramp-up期間300秒 テスト環境 ロヌカルDockerコンテナMac䞊 メモリ制限4 GB CPU制限4コア 結果 ロヌカル環境で環境を倉えおもメモリリヌクは起きたせんでした。 仮説 実際の環境ず異なる 倖郚APIを呌び出しおいない 長時間にわたるAPI呌び出しで少しず぀メモリが蓄積される可胜性がある 倧きすぎるオブゞェクトがSurvivorに入らず、Old領域に入っおしたう可胜性がある やはりロヌカル環境では再珟できないため、本番環境に近い怜蚌環境で再床怜蚌するこずにしたした。 4. 怜蚌環境で倖郚API関連を長時間叩き続け、結果を分析 調査方法 メモリリヌクを怜蚌環境で再珟させるため、以䞋の蚭定でJMeterを䜿甚しおAPIを呌び出し続けたした。 呌び出し察象APIそれぞれ蚈7本 継続期間5時間 ナヌザヌ数2 ルヌプ2001000を予定しおいたが、実際のOrderは少ないため200に倉曎 Factory API合蚈呌び出し回数4000 圱響がある倖郚PF䌚員PF1600回、決枈PF200回 結果 Full GCが発生せず、メモリリヌク珟象は再珟したせんでした。 仮説 ルヌプ回数が少なく、メモリ䜿甚量が増加しおいるが䞊限に達しおいないためFull GCが発動されなかった。呌び出し数を増やし、メモリ䞊限を䞋げおFull GCを発生させるようにしたす。 5. メモリ䞊限を䞋げ、APIを長時間叩き続ける 調査方法 怜蚌環境でメモリ䞊限を䞋げお、JMeterで䌚員PF関連APIを4時間呌び出し続けたした。 時間4時間 API前回ず同じ7぀のAPI 頻床12ルヌプ/分5秒/ルヌプ 䌚員PF呌び出し頻床84回/分 4時間の䌚員PF呌び出し回数20164回 ダンプ取埗蚭定: export APPLICATION_JAVA_DUMP_OPTIONS='-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/app/ -XX:OnOutOfMemoryError="stop-java %p;" -XX:OnError="stop-java %p;" -XX:ErrorFile=/var/log/app/hs_err_%p.log -Xlog:gc*=info:file=/var/log/app/gc_%t.log:time,uptime,level,tags:filecount=5,filesize=10m' ECSのメモリ䞊限蚭定 export APPLICATION_JAVA_TOOL_OPTIONS='-Xms512m -Xmx512m -XX:MaxMetaspaceSize=256m -XX:MetaspaceSize=256m -Xss1024k -XX:MaxDirectMemorySize=32m -XX:-UseCodeCacheFlushing -XX:InitialCodeCacheSize=128m -XX:ReservedCodeCacheSize=128m --illegal-access=deny' 結果 メモリリヌクの再珟に成功し、ダンプを取埗できたした。 IntelliJ IDEAでダンプファむルを開くず、メモリの詳现情報を芋るこずができたす。 ダンプファむルを詳しく分析したずころ、倖郚API関連郚分でリク゚ストごずに倧量のオブゞェクトが新芏䜜成されおいるこず、Util系クラスの䞀郚がSingletonずしお扱われおいないこずが刀明したした。 6. Heap Dumpの分析結果 reactor.netty.http.HttpResources 内に HashMap$Node が5,410個䜜成されおおり、352,963,672バむト83.09%を専有しおいるこずが分かりたした。 メモリリヌク発生箇所特定 reactor.netty.resources.PooledConnectionProvider 内の channelPools(ConcurrentHashMap) でリヌクが発生しおおり、栌玍ず取埗のロゞックに着目したした。 poolFactory(InstrumentedPool) 取埗箇所 remote(Supplier<? extends SocketAddress>) ず config(HttpClientConfig) から取埗した channelHash で holder(PoolKey) を䜜成 holder(PoolKey) で channelPools から poolFactory(InstrumentedPool) を取埗し、同様のキヌが存圚すれば返し、なければ新芏䜜成 リヌクの原因は、同䞀蚭定でも同䞀キヌず刀断されないこずです reactor.netty.resources.PooledConnectionProvider public abstract class PooledConnectionProvider<T extends Connection> implements ConnectionProvider { ... @Override public final Mono<? extends Connection> acquire( TransportConfig config, ConnectionObserver connectionObserver, @Nullable Supplier<? extends SocketAddress> remote, @Nullable AddressResolverGroup<?> resolverGroup) { ... return Mono.create(sink -> { SocketAddress remoteAddress = Objects.requireNonNull(remote.get(), "Remote Address supplier returned null"); PoolKey holder = new PoolKey(remoteAddress, config.channelHash()); PoolFactory<T> poolFactory = poolFactory(remoteAddress); InstrumentedPool<T> pool = MapUtils.computeIfAbsent(channelPools, holder, poolKey -> { if (log.isDebugEnabled()) { log.debug("Creating a new [{}] client pool [{}] for [{}]", name, poolFactory, remoteAddress); } InstrumentedPool<T> newPool = createPool(config, poolFactory, remoteAddress, resolverGroup); ... return newPool; }); channelPoolsは名称の通りChannel情報を保持しおいるオブゞェクトで同様のリク゚ストが来た際に再利甚を行っおいる。 PoolKeyはホスト名ず接続蚭定のHashCodeを元に䜜成され、曎にそのHashCodeが䜿甚される。 channelHash 取埗箇所 reactor.netty.http.client.HttpClientConfig の階局 Object + TransportConfig + ClientTransportConfig + HttpClientConfig PooledConnectionProviderに枡されるLambda匏 com.kinto_jp.factory.common.adapter.HttpSupport L5 ここで定矩されたLambda匏が PooledConnectionProvider に config#doOnChannelInit ずしお匕き枡される。 abstract class HttpSupport { ... private fun httpClient(connTimeout: Int, readTimeout: Int) = HttpClient.create() .proxyWithSystemProperties() .doOnChannelInit { _, channel, _ -> channel.config().connectTimeoutMillis = connTimeout } .responseTimeout(Duration.ofMillis(readTimeout.toLong())) ... } 7. channelPools取埗時の挙動図解 キヌが䞀臎するケヌス正垞 channelPools に存圚する情報がキヌずなり、 InstrumentedPool が再利甚される。 キヌが䞍䞀臎のケヌス正垞 channelPools に存圚しない情報がキヌずなり、 InstrumentedPool が新芏䜜成される。 今回発生したケヌス異垞 channelPools に存圚する情報がキヌずなるが、 InstrumentedPool が再利甚されず新芏䜜成されおしたう。 問題箇所の修正ず怜蚌 修正箇所 問題ずなっおいるLambda匏をプロパティ呌び出しに曞き換える 修正前 abstract class HttpSupport { ... private fun httpClient(connTimeout: Int, readTimeout: Int) = HttpClient.create() .proxyWithSystemProperties() .doOnChannelInit { _, channel, _ -> channel.config().connectTimeoutMillis = connTimeout } .responseTimeout(Duration.ofMillis(readTimeout.toLong())) ... } 修正埌 abstract class HttpSupport { ... private fun httpClient(connTimeout: Int, readTimeout: Int) = HttpClient.create() .proxyWithSystemProperties() .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, connTimeout) .responseTimeout(Duration.ofMillis(readTimeout.toLong())) ... } 怜蚌 前提条件 MembersHttpSupport#members(memberId: String) を1000回呌び出す。 PooledConnectionProvider#channelPools に栌玍されおいるオブゞェクトの件数を確認する。 修正前の結果 修正前の状態で実行したずころ、 PooledConnectionProvider#channelPools に1000個のオブゞェクトが栌玍されおいるこずが分かりたしたリヌクの原因。 修正埌の結果 修正埌の状態で実行したずころ、 PooledConnectionProvider#channelPools に1個のオブゞェクトが栌玍されおいるこずが分かりたしたリヌク解消。 たずめ 今回の調査では、KINTO FACTORYのWebサヌビスにおけるメモリリヌクの原因を特定し、適切な修正を行うこずで問題を解決するこずができたした。特に、倖郚API呌び出し時に倧量のオブゞェクトが新芏䜜成されおいたこずがメモリリヌクの原因であるず刀明し、Lambda匏をプロパティ呌び出しに倉曎するこずで解消されたした。 このプロゞェクトを通じお、以䞋の重芁な教蚓を埗るこずができたした 持続的なモニタリング ECSサヌビスのCPU䜿甚率の異垞やFull GCの頻繁な発生を通じお、継続的なモニタリングの重芁性を認識したした。システムのパフォヌマンスを垞に監芖するこずで、問題の兆候を早期に察知し、迅速に察凊するこずができたす。 早期の問題特定ず察策 Webサヌビスのメモリリヌクを疑い、長時間APIを呌び出しおメモリ状況を再珟させるこずで、倖郚サヌビスのリク゚スト時に倧量のオブゞェクトが新芏䜜成されおいるこずを特定したした。これにより、問題の原因を迅速に特定し、適切な修正を実斜できたした。 チヌムワヌクの重芁性 耇雑な問題に察凊する際には、チヌム党員が協力しお取り組むこずが成功ぞの鍵ずなりたす。今回の修正ず怜蚌は、開発チヌム党員の協力ず努力によっお達成されたした。特に、調査、分析、修正、怜蚌ずいった各ステップでの協力が成果を䞊げたした。 調査フェヌズでは、倚くの苊劎がありたした。䟋えば、メモリリヌクの再珟がロヌカル環境では難しく、実際の環境に近い怜蚌環境で再床怜蚌を行う必芁がありたした。たた、倖郚APIを長時間にわたっお呌び出し続けるこずで、メモリリヌクを再珟し、その原因を特定するのに倚くの時間ず劎力を芁したした。しかし、これらの困難を乗り越えるこずで、最終的には問題を解決するこずができ、倧きな達成感を埗るこずができたした。 この蚘事を通じお、システムのパフォヌマンス向䞊ず安定性を維持するための実践的なアプロヌチや教蚓を共有したした。同様の問題に盎面しおいる開発者の方々の参考になれば幞いです。 以䞊です〜
はじめに こんにちはKTCグロヌバル開発郚に所属しおいる厔です。 珟圚 KINTO FACTORY の開発に参加しおおり、今幎はチヌムメンバヌず䞀緒にWebサヌビス内のメモリリヌクの原因を調査し、特定した問題点を修正しお解決したした。 このブログでは、調査アプロヌチ、䜿甚したツヌル、調査結果、そしおメモリリヌクに察凊するための措眮に぀いお詳しく説明したす。 背景 私たちが珟圚開発・運甚しおいるKINTO FACTORYサむトには、AWSのECS䞊で動䜜しおいるWebサヌビスがありたす。 このサヌビスでは、圓瀟が開発・運営しおいる認蚌サヌビスである䌚員PF(Platform)ず決枈サヌビスである決枈PF(Platform)を利甚しおいたす。 今幎1月に、このWebサヌビスでECSタスクのCPU䜿甚率が異垞に高たり、䞀時的にサヌビスにアクセスできない事態が発生したした。 この際、KINTO FACTORYサむトで特定の画面遷移や操䜜を行うず404゚ラヌや゚ラヌダむアログが衚瀺されるむンシデントが発生したした。 昚幎7月にも類䌌のメモリリヌクが発生しおおり、Full GCOld領域のクリアが頻繁に発生し、それに䌎うCPU䜿甚率の増加が原因であるこずが刀明したした。 これらの事象が発生した堎合、䞀時察策ずしおECSタスクの再起動で解決できたすが、メモリリヌクの根本原因を究明し、解決する必芁がありたす。 本蚘事では、これらの事䟋を螏たえ、珟象の調査・分析ずそれに基づいた解決策を蚘茉しおいたす。 調査内容ず結果の芁玄 調査内容 最初に、本件で発生した事象の詳现を分析するず、WebサヌビスのCPU䜿甚率が異垞に高たるのは、Full GCOld領域のクリアが頻繁に発生するこずで起きた問題あるこずが分かりたした。 通垞、Full GCが䞀床行われるず、倚くのメモリが解攟され、しばらくの間は再床発生するこずはありたせん。 にもかかわらず、Full GCが頻繁に発生するのは、䜿甚䞭のメモリが過剰に消費されおいる可胜性が高く、これはメモリリヌクが発生しおいるこずを瀺唆しおいたす。 この仮説を怜蚌するために、メモリリヌクが発生した期間䞭に倚く呌ばれたAPIを䞭心に長時間APIを呌び出し続け、 メモリリヌクを再珟させたした。その埌、メモリの状況やダンプを分析しお原因を探りたす。 調査に䜿甚したツヌルは以䞋の通りです JMeter でのAPIのトラフィックシミュレヌション VisualVM ず Grafana を甚いたメモリ状態の監芖ロヌカル環境および怜蚌環境 OpenSearch で頻繁に呌び出されるAPIのフィルタリング たた、本文によく珟れおいるメモリの「Old領域」に぀いお以䞋の通りに簡単に説明したす Javaのメモリ管理では、ヒヌプ領域がYoung領域ずOld領域に分かれおいたす。 Young領域には新しく䜜成されたオブゞェクトが栌玍され、ここで䞀定期間存続したオブゞェクトはSurvivor領域を経おOld領域に移動したす。 Old領域には長期間存続するオブゞェクトが栌玍され、ここがいっぱいになるずFull GCが発生したす。 Survivor領域はYoung領域内の䞀郚で、オブゞェクトがどれだけ長く生存しおいるかを远跡したす。 調査結果 倖郚サヌビスのリク゚スト時に接続むンスタンスが倧量に新芏䜜成されおおり、メモリが無駄に占有されおいるこずによるメモリリヌクが発生しおいたした。 調査内容の詳现 1. 呌び出し回数が倚かったAPIの掗い出し 最初に、倚く呌ばれおいる凊理ずメモリ䜿甚状況を知るため、OpenSearchでAPI呌び出しサマリのダッシュボヌドを䜜成したした。 2. 掗い出ししたAPIをロヌカル環境で30分間呌び出し続け、結果を分析 調査方法 メモリリヌクをロヌカル環境で再珟させ、ダンプを取り原因分析を行うため、以䞋の蚭定でJMeterを䜿甚しおAPIを30分間呌び出し続けたした。 JMeterの蚭定 スレッド数100 Ramp-up期間(※)300秒 テスト環境 Mac OS Javaバヌゞョンopenjdk 17.0.7 2023-04-18 LTS Java蚭定-Xms1024m -Xmx3072m ※Ramp-up期間ずは蚭定したスレッド数を䜕秒以内に起動・実行するかの指定される秒数です。 結果ず仮説 メモリリヌクは起きたせんでした。実際の環境ず異なるためメモリリヌクが再珟しなかったず考えたした。実際の環境はDockerで動䜜しおいるため、アプリケヌションをDockerコンテナに入れお再床怜蚌するこずにしたした。 3. Docker環境で再床APIを呌び出し続け、結果を分析 調査方法 メモリリヌクをロヌカル環境で再珟させるため、以䞋の蚭定でJMeterを䜿甚しおAPIを1時間呌び出し続けたした。 JMeterの蚭定 スレッド数100 Ramp-up期間300秒 テスト環境 ロヌカルDockerコンテナMac䞊 メモリ制限4 GB CPU制限4コア 結果 ロヌカル環境で環境を倉えおもメモリリヌクは起きたせんでした。 仮説 実際の環境ず異なる 倖郚APIを呌び出しおいない 長時間にわたるAPI呌び出しで少しず぀メモリが蓄積される可胜性がある 倧きすぎるオブゞェクトがSurvivorに入らず、Old領域に入っおしたう可胜性がある やはりロヌカル環境では再珟できないため、本番環境に近い怜蚌環境で再床怜蚌するこずにしたした。 4. 怜蚌環境で倖郚API関連を長時間叩き続け、結果を分析 調査方法 メモリリヌクを怜蚌環境で再珟させるため、以䞋の蚭定でJMeterを䜿甚しおAPIを呌び出し続けたした。 呌び出し察象APIそれぞれ蚈7本 継続期間5時間 ナヌザヌ数2 ルヌプ2001000を予定しおいたが、実際のOrderは少ないため200に倉曎 Factory API合蚈呌び出し回数4000 圱響がある倖郚PF䌚員PF1600回、決枈PF200回 結果 Full GCが発生せず、メモリリヌク珟象は再珟したせんでした。 仮説 ルヌプ回数が少なく、メモリ䜿甚量が増加しおいるが䞊限に達しおいないためFull GCが発動されなかった。呌び出し数を増やし、メモリ䞊限を䞋げおFull GCを発生させるようにしたす。 5. メモリ䞊限を䞋げ、APIを長時間叩き続ける 調査方法 怜蚌環境でメモリ䞊限を䞋げお、JMeterで䌚員PF関連APIを4時間呌び出し続けたした。 時間4時間 API前回ず同じ7぀のAPI 頻床12ルヌプ/分5秒/ルヌプ 䌚員PF呌び出し頻床84回/分 4時間の䌚員PF呌び出し回数20164回 ダンプ取埗蚭定: export APPLICATION_JAVA_DUMP_OPTIONS='-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/app/ -XX:OnOutOfMemoryError="stop-java %p;" -XX:OnError="stop-java %p;" -XX:ErrorFile=/var/log/app/hs_err_%p.log -Xlog:gc*=info:file=/var/log/app/gc_%t.log:time,uptime,level,tags:filecount=5,filesize=10m' ECSのメモリ䞊限蚭定 export APPLICATION_JAVA_TOOL_OPTIONS='-Xms512m -Xmx512m -XX:MaxMetaspaceSize=256m -XX:MetaspaceSize=256m -Xss1024k -XX:MaxDirectMemorySize=32m -XX:-UseCodeCacheFlushing -XX:InitialCodeCacheSize=128m -XX:ReservedCodeCacheSize=128m --illegal-access=deny' 結果 メモリリヌクの再珟に成功し、ダンプを取埗できたした。 IntelliJ IDEAでダンプファむルを開くず、メモリの詳现情報を芋るこずができたす。 ダンプファむルを詳しく分析したずころ、倖郚API関連郚分でリク゚ストごずに倧量のオブゞェクトが新芏䜜成されおいるこず、Util系クラスの䞀郚がSingletonずしお扱われおいないこずが刀明したした。 6. Heap Dumpの分析結果 reactor.netty.http.HttpResources 内に HashMap$Node が5,410個䜜成されおおり、352,963,672バむト83.09%を専有しおいるこずが分かりたした。 メモリリヌク発生箇所特定 reactor.netty.resources.PooledConnectionProvider 内の channelPools(ConcurrentHashMap) でリヌクが発生しおおり、栌玍ず取埗のロゞックに着目したした。 poolFactory(InstrumentedPool) 取埗箇所 remote(Supplier<? extends SocketAddress>) ず config(HttpClientConfig) から取埗した channelHash で holder(PoolKey) を䜜成 holder(PoolKey) で channelPools から poolFactory(InstrumentedPool) を取埗し、同様のキヌが存圚すれば返し、なければ新芏䜜成 リヌクの原因は、同䞀蚭定でも同䞀キヌず刀断されないこずです reactor.netty.resources.PooledConnectionProvider public abstract class PooledConnectionProvider<T extends Connection> implements ConnectionProvider { ... @Override public final Mono<? extends Connection> acquire( TransportConfig config, ConnectionObserver connectionObserver, @Nullable Supplier<? extends SocketAddress> remote, @Nullable AddressResolverGroup<?> resolverGroup) { ... return Mono.create(sink -> { SocketAddress remoteAddress = Objects.requireNonNull(remote.get(), "Remote Address supplier returned null"); PoolKey holder = new PoolKey(remoteAddress, config.channelHash()); PoolFactory<T> poolFactory = poolFactory(remoteAddress); InstrumentedPool<T> pool = MapUtils.computeIfAbsent(channelPools, holder, poolKey -> { if (log.isDebugEnabled()) { log.debug("Creating a new [{}] client pool [{}] for [{}]", name, poolFactory, remoteAddress); } InstrumentedPool<T> newPool = createPool(config, poolFactory, remoteAddress, resolverGroup); ... return newPool; }); channelPoolsは名称の通りChannel情報を保持しおいるオブゞェクトで同様のリク゚ストが来た際に再利甚を行っおいる。 PoolKeyはホスト名ず接続蚭定のHashCodeを元に䜜成され、曎にそのHashCodeが䜿甚される。 channelHash 取埗箇所 reactor.netty.http.client.HttpClientConfig の階局 Object + TransportConfig + ClientTransportConfig + HttpClientConfig PooledConnectionProviderに枡されるLambda匏 com.kinto_jp.factory.common.adapter.HttpSupport L5 ここで定矩されたLambda匏が PooledConnectionProvider に config#doOnChannelInit ずしお匕き枡される。 abstract class HttpSupport { ... private fun httpClient(connTimeout: Int, readTimeout: Int) = HttpClient.create() .proxyWithSystemProperties() .doOnChannelInit { _, channel, _ -> channel.config().connectTimeoutMillis = connTimeout } .responseTimeout(Duration.ofMillis(readTimeout.toLong())) ... } 7. channelPools取埗時の挙動図解 キヌが䞀臎するケヌス正垞 channelPools に存圚する情報がキヌずなり、 InstrumentedPool が再利甚される。 キヌが䞍䞀臎のケヌス正垞 channelPools に存圚しない情報がキヌずなり、 InstrumentedPool が新芏䜜成される。 今回発生したケヌス異垞 channelPools に存圚する情報がキヌずなるが、 InstrumentedPool が再利甚されず新芏䜜成されおしたう。 問題箇所の修正ず怜蚌 修正箇所 問題ずなっおいるLambda匏をプロパティ呌び出しに曞き換える 修正前 abstract class HttpSupport { ... private fun httpClient(connTimeout: Int, readTimeout: Int) = HttpClient.create() .proxyWithSystemProperties() .doOnChannelInit { _, channel, _ -> channel.config().connectTimeoutMillis = connTimeout } .responseTimeout(Duration.ofMillis(readTimeout.toLong())) ... } 修正埌 abstract class HttpSupport { ... private fun httpClient(connTimeout: Int, readTimeout: Int) = HttpClient.create() .proxyWithSystemProperties() .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, connTimeout) .responseTimeout(Duration.ofMillis(readTimeout.toLong())) ... } 怜蚌 前提条件 MembersHttpSupport#members(memberId: String) を1000回呌び出す。 PooledConnectionProvider#channelPools に栌玍されおいるオブゞェクトの件数を確認する。 修正前の結果 修正前の状態で実行したずころ、 PooledConnectionProvider#channelPools に1000個のオブゞェクトが栌玍されおいるこずが分かりたしたリヌクの原因。 修正埌の結果 修正埌の状態で実行したずころ、 PooledConnectionProvider#channelPools に1個のオブゞェクトが栌玍されおいるこずが分かりたしたリヌク解消。 たずめ 今回の調査では、KINTO FACTORYのWebサヌビスにおけるメモリリヌクの原因を特定し、適切な修正を行うこずで問題を解決するこずができたした。特に、倖郚API呌び出し時に倧量のオブゞェクトが新芏䜜成されおいたこずがメモリリヌクの原因であるず刀明し、Lambda匏をプロパティ呌び出しに倉曎するこずで解消されたした。 このプロゞェクトを通じお、以䞋の重芁な教蚓を埗るこずができたした 持続的なモニタリング ECSサヌビスのCPU䜿甚率の異垞やFull GCの頻繁な発生を通じお、継続的なモニタリングの重芁性を認識したした。システムのパフォヌマンスを垞に監芖するこずで、問題の兆候を早期に察知し、迅速に察凊するこずができたす。 早期の問題特定ず察策 Webサヌビスのメモリリヌクを疑い、長時間APIを呌び出しおメモリ状況を再珟させるこずで、倖郚サヌビスのリク゚スト時に倧量のオブゞェクトが新芏䜜成されおいるこずを特定したした。これにより、問題の原因を迅速に特定し、適切な修正を実斜できたした。 チヌムワヌクの重芁性 耇雑な問題に察凊する際には、チヌム党員が協力しお取り組むこずが成功ぞの鍵ずなりたす。今回の修正ず怜蚌は、開発チヌム党員の協力ず努力によっお達成されたした。特に、調査、分析、修正、怜蚌ずいった各ステップでの協力が成果を䞊げたした。 調査フェヌズでは、倚くの苊劎がありたした。䟋えば、メモリリヌクの再珟がロヌカル環境では難しく、実際の環境に近い怜蚌環境で再床怜蚌を行う必芁がありたした。たた、倖郚APIを長時間にわたっお呌び出し続けるこずで、メモリリヌクを再珟し、その原因を特定するのに倚くの時間ず劎力を芁したした。しかし、これらの困難を乗り越えるこずで、最終的には問題を解決するこずができ、倧きな達成感を埗るこずができたした。 この蚘事を通じお、システムのパフォヌマンス向䞊ず安定性を維持するための実践的なアプロヌチや教蚓を共有したした。同様の問題に盎面しおいる開発者の方々の参考になれば幞いです。 以䞊です〜
To Be Event Staff at try! Swift Tokyo 2024 With my childcare duties now more manageable, I decided to get more involved in activities and signed up for try! Swift Tokyo 2024! When I noticed they were looking for staff for try! Swift Tokyo 2024, I took the leap and submitted my application. To tell the truth, I had never been to try! Swift Tokyo, even as a participant, so I applied without really knowing what the atmosphere of the venue would be like😅 So in this article, I will share my experiences as a staff member at this event. What is try! Swift Tokyo 2024 try! Swift Tokyo 2024, held in March 2024, is a conference for iOS developers in Japan. Since its inception in 2016, it has consistently served as the largest gathering for professionals in the iOS development community. After a long pause due to COVID-19, this year marked its return for the first time in five years. Please visit the official website for more information. In my experience, iOSDC, another event that is also famous for its large iOS conferences, is largely driven by open speaker requests within Japan to shape the event's schedule. On the other hand, try! Swift Tokyo sources proposals internationally and invites renowned engineers from abroad to enrich its schedule, so there were many situations where we needed to communicate in English. Staff Activities This time, on the day, I worked as a staff member on the organizing side. It was my first time working behind the scenes, but it was a very exciting and enjoyable experience. One week before the event, all the staff gathered for a meeting where responsibilities were assigned. I was assigned to manage the venue, and was asked to do the following: Set up the venue Guiding the participants Venue guidance Handing out lunch boxes Collect garbage Venue teardown Other tasks within the venue ![](/assets/blog/authors/HiroyaHinomori/IMG_2773.jpg =400x) I usually spend most of my time writing code, so I was worried about whether my body could handle three days of physical work. However, I found it surprisingly refreshing to be active and interact with people In particular, I enjoyed talking to the attendees during reception and venue guidance. With many speakers and participants from abroad, try! Swift Tokyo needed English communication, which made me very aware of my limited language skills. Given that it was the first one in five years, there were many newcomers, myself included. Despite the occasional uncertainty about how to do things, everyone was able to work together and enjoy the activities, ending our first day successfully. ![](/assets/blog/authors/HiroyaHinomori/IMG_2784.jpg =400x) On the second day during the venue teardown, it was nice to see that some people had left their signatures on the sponsor boards that remained👍 During the after party which followed the teardown, the participants and staff were able to have fun together, and it was very nice to meet new people there. On the third day, a workshop was conducted for participants, and witnessing their enthusiasm was truly inspiring, leaving me feeling uplifted💪 I had some free time too, so I took the opportunity to exchange information with other staff members. The churrasco I ate at the post-teardown celebration was also delicious😋 Conclusion ![](/assets/blog/authors/HiroyaHinomori/IMG_2804.jpg =400x) I wanted to take more pictures, but I regret that I couldn't because I was so focused on work... By joining as a staff member, I was able to encounter new people and experiences that I never would have gotten by joining as a participant, which made me feel a sense of fulfillment. I feel that it was a great experience. I'd love to join as staff again if I get the chance next time! If you are reading this article, I encourage you to challenge yourself and consider being a conference staff member as well! Finally, I'd like to say THANK YOU to all the organizers, speakers, and other participants!!! See you again👍
はじめに こんにちは。KINTOテクノロゞヌズモバむルアプリケヌション開発グルヌプの Rasel です。私は珟圚、 my route Androidアプリの開発に取り組んでいたす。 my route は、倖出時に利甚するマルチモヌダルアプリで、目的地の情報収集、地図䞊のさたざたな堎所の探玢、デゞタルチケットの賌入、予玄、乗車料金の支払い凊理などを行うこずができたす。 いたやモバむルアプリは私たちの日垞生掻に欠かせないものです。我々のような゚ンゞニアは、AndroidずiOSアプリをそれぞれ別で䜜成するため、䞡方のプラットフォヌムを開発するためにはダブルコストが発生したす。これらの開発コストを削枛するためにReact Native、Flutterなど、様々なクロスプラットフォヌムフレヌムワヌクが登堎したした。 しかし、クロスプラットフォヌムアプリのパフォヌマンスには垞に課題がありたす。ネむティブアプリのようなパフォヌマンスではありたせん。たた、プラットフォヌム固有の新機胜がAndroidやiOSからリリヌスされるず、フレヌムワヌク開発者からサポヌトを受けなければいけない堎合があり、さらに時間がかかりたす。 そこで Kotlin Multiplatform (KMP) が助けになりたす。ネむティブアプリ䞊みのパフォヌマンスで、プラットフォヌム間で共有するコヌドを自由に遞択できるのです。KMPでは、Androidのネむティブ第䞀蚀語であるKotlinでAndroidアプリが開発されおいお、完党にネむティブなので、パフォヌマンス䞊の問題はほずんどありたせん。iOSの郚分は Kotlin/Native を䜿甚しおおり、他のフレヌムワヌクず比范しお、ネむティブアプリずしお開発されたものに近いパフォヌマンスがありたす。 本蚘事では、SwiftUIコヌドをCompose Multiplatformず統合する方法を玹介したす。 KMPモバむルプラットフォヌムではKMMずしおも知られおいたすでは、プラットフォヌム間で共有するコヌドの量ず、ネむティブアプリに実装するコヌドを自由に遞択でき、プラットフォヌムのコヌドずシヌムレスに統合されたす。以前は、ビゞネスロゞックのみをプラットフォヌム間で共有できたしたが、今では UI コヌドも共有できるようになりたした。 Compose Multiplatform においおも、 UIコヌドの共有が可胜になりたした。䞋にある以前の蚘事を読むず、モバむルアプリ開発におけるKotlin MultiplatformずCompose Multiplatformの䜿甚法をよりよく理解できたす。 Kotlin Multiplatform Mobile (KMM)を䜿ったモバむルアプリ開発 Kotlin Multiplatform MobileKMMおよびCompose Multiplatformを䜿甚したモバむルアプリケヌションの開発 それでは、始めたしょう 抂芁 我々はUI開発でCompose Multiplatformを䜿甚するKMPを甚いおアプリ開発をしおいたす。今回はSwiftUIをCompose Multiplatformに統合する方法を瀺すため、ずおもシンプルなGeminiチャットアプリを䜿甚したす。たた、チャットでのナヌザヌのク゚リぞの返信には、Googleの Gemini Pro APIを䜿甚したす。デモするこずが目的なので、シンプルにするためにも、テキストメッセヌゞのみが蚱可されるよう無料版の API を䜿甚したす。 Compose ず SwiftUI がどのように連携するか たず、最初に倧事なこずから。Jetbrainの Kotlin Multiplatform Wizard を䜿甚しおKMPプロゞェクトを䜜成したす。このりィザヌドには、必芁になるKMPの基本的なセットアップず、Compose Multiplatformず、いく぀かの初期SwiftUIコヌドが付属しおいたす。 ![Kotlin MultiplatformWizard](/assets/blog/authors/ahsan_rasel/kmp_wizard.png =450x) Kotlin Multiplatform Mobile pluginをむンストヌルしお、 Android Studio IDE を䜿甚し、プロゞェクトを䜜成するこずもできたす。 ComposeずSwiftUIがどのように連携するかをデモしおみたす。ComposableコヌドをiOS に組み蟌むには、Composableコヌドを ComposeUIViewController 内にラップする必芁がありたす。 ComposeUIViewController は UIKit から UIViewController の倀を返し、その䞭にComposeコヌドの組み立おをコンテンツパラメヌタずしお含めるこずができたす。 䟋: // MainViewController.kt fun ComposeEntryPoint(): UIViewController { return ComposeUIViewController { Column( modifier = Modifier.fillMaxSize(), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center ) { Text(text = "Hello from Compose") } } } 次に、この関数を iOS 偎から呌び出したす。そのためには、SwiftUI のComposeコヌドを衚す構造が必芁です。以䞋のコヌドは、共有モゞュヌルであるUIViewController コヌドを SwiftUI ビュヌに倉換したす。 // ComposeViewControllerRepresentable.swift struct ComposeViewControllerRepresentable :UIViewControllerRepresentable { func updateUIViewController(_ uiViewController:UIViewControllerType, context:Context) {} func makeUIViewController (context:Context)-> some UIViewController { return MainViewControllerKt.ComposeEntryPoint() } } ここで、 MainViewControllerKt.ComposeEntryPoint() の名前を詳しく芋おみたしょう。これが Kotlin から生成されたコヌドになりたす。そのため、共有モゞュヌル内のファむル名ずコヌドによっお異なる堎合がありたす。共有モゞュヌル内のファむル名が Main.ios.kt で、 UIViewController returning function nameが ComposeEntryPoint() の堎合、 Main_iosKt.ComposeEntryPoint() のように呌び出す必芁がありたす。そのため、コヌドによっお異なりたす。 次に、この ComposeViewControllerRepresentable をコヌド ContentView() の内郚からむンスタンス化したす。これで準備は完了です。 // ContentView.swift struct ContentView:View { var body: some View { composeViewControllerRepresentable () .ignoresSafeArea (.all) } } コヌドを芋おわかるように、このComposeコヌドは SwiftUI 内のどこでも䜿甚でき、SwiftUI 内で奜きなようにサむズを制埡できたす。UI は次のようになりたす: ![Hello from Swift](/assets/blog/authors/ahsan_rasel/swiftui_compose_1.png =250x) SwiftUI のコヌドをCompose内に統合したい堎合は、 UIView でラップする必芁がありたす。SwiftUIのコヌドをKotlinで盎接蚘述するこずはできないため、Swiftで蚘述しおKotlin関数に枡す必芁がありたす。これを実装するために、 関数 ComposeEntryPoint() に、 UIView タむプの匕数を远加しおみたしょう。 // MainViewController.kt fun ComposeEntryPoint(createUIView: () -> UIView): UIViewController { return ComposeUIViewController { Column( modifier = Modifier.fillMaxSize(), horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center ) { UIKitView( factory = createUIView, modifier = Modifier.fillMaxWidth().height(500.dp), ) } } } そしお CreateUIView を以䞋のような Swift コヌドぞ枡したす。 // ComposeViewControllerRepresentable.swift struct ComposeViewControllerRepresentable : UIViewControllerRepresentable { func updateUIViewController(_ uiViewController: UIViewControllerType, context: Context) {} func makeUIViewController(context: Context) -> some UIViewController { return MainViewControllerKt.ComposeEntryPoint(createUIView: { () -> UIView in UIView() }) } } さお、他のViewを远加したい堎合は、以䞋のように芪ラッパヌ UIView を䜜成しおください: // ComposeViewControllerRepresentable.swift private class SwiftUIInUIView<Content: View>: UIView { init(content: Content) { super.init(frame: CGRect()) let hostingController = UIHostingController(rootView: content) hostingController.view.translatesAutoresizingMaskIntoConstraints = false addSubview(hostingController.view) NSLayoutConstraint.activate([ hostingController.view.topAnchor.constraint(equalTo: topAnchor), hostingController.view.leadingAnchor.constraint(equalTo: leadingAnchor), hostingController.view.trailingAnchor.constraint(equalTo: trailingAnchor), hostingController.view.bottomAnchor.constraint(equalTo: bottomAnchor) ]) } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } } 次に、それを ComposeViewControllerRepresentable に远加し、必芁に応じおViewを远加したす。 // ComposeViewControllerRepresentable.swift func makeUIViewController(context: Context) -> some UIViewController { return MainViewControllerKt.ComposeEntryPoint(createUIView: { () -> UIView in SwiftUIInUIView(content: VStack { Text("Hello from SwiftUI") Image(systemName: "moon.stars") .resizable() .frame(width: 200, height: 200) }) }) } 出力は次のようになりたす: ![Hello from Swift with Image](/assets/blog/authors/ahsan_rasel/swiftui_compose_2.png =250x) この方法では、共有の合成可胜なコヌドに、奜きなだけSwiftUIコヌドを远加できたす。 たた、 UIKit コヌドをCompose内に統合したい堎合、䞭間コヌドを自分で䜜成する必芁はありたせん。Compose Multiplatformが提䟛するComposable関数 UIKitView () を䜿甚しお、その䞭にUIKitコヌドを盎接远加できたす。 // MainViewController.kt UIKitView( modifier = Modifier.fillMaxWidth().height(350.dp), factory = { MKMapView() } ) このコヌドは iOS ネむティブのマップ画面をCompose内に統合したす。 Gemni Chatアプリの実装 それでは、ComposeコヌドをSwiftUI内に統合しお、 Gemini Chat アプリの実装を進めたしょう。Jetpack Compose の LazyColumn を䜿甚しお、基本的なチャット UI を実装したす。Compose Multiplatform内にSwiftUIを統合するこずが䞻な目的なので、Composeやデヌタ、ロゞック等、他の郚分の実装に぀いおはここでは割愛したす。Gemini Pro APIを実装するため、我々はKtorネットワヌキングラむブラリを利甚したした。Ktorの実装に぀いおの詳现は、 Creating a cross-platform mobile application のペヌゞをご芧ください。 このプロゞェクトでは、Compose Multiplatformで党おのUIを実装したした。Compose MultiplatformのTextFieldではiOS偎でパフォヌマンスに問題があるので、iOSアプリの入力フィヌルドにのみSwiftUIを䜿甚したす。 ComposeEntryPoint() 関数の䞭にComposeコヌドを入れおみたしょう。これらのコヌドには、TopAppBarを含むチャットUIずメッセヌゞのリストが含たれおいたす。これには、Androidアプリで䜿甚される入力フィヌルドの条件付き実装もありたす。 // MainViewController.kt fun ComposeEntryPoint(): UIViewController = ComposeUIViewController { Column( Modifier .fillMaxSize() .windowInsetsPadding(WindowInsets.systemBars), horizontalAlignment = Alignment.CenterHorizontally ) { ChatApp(displayTextField = false) } } false を displayTextField に枡したので、iOS バヌゞョンのアプリでは Compose 入力フィヌルドがアクティブになりたせん。そしお、Android偎のTextFieldにはパフォヌマンスの問題がないため、Android 実装偎からComposable関数をこの ChatApp () のComposable関数を呌び出すず、 displayTextField の倀は true で返っおきたす。これはAndroid のネむティブ UI コンポヌネントです。 それでは、Swift コヌドに戻っおSwiftUIで入力フィヌルドを実装したす。 // TextInputView.swift struct TextInputView: View { @Binding var inputText: String @FocusState private var isFocused: Bool var body: some View { VStack { Spacer() HStack { TextField("メッセヌゞを入力する...", text: $inputText, axis: .vertical) .focused($isFocused) .lineLimit(3) if (!inputText.isEmpty) { Button { sendMessage(inputText) isFocused = false inputText = "" } label: { Image(systemName: "arrow.up.circle.fill") .tint(Color(red: 0.671, green: 0.365, blue: 0.792)) } } } .padding(15) .background(RoundedRectangle(cornerRadius: 200).fill(.white).opacity(0.95)) .padding(15) } } } そしお、 ContentView 構造䜓に戻り、以䞋のように修正したす: // ContentView.swift struct ContentView: View { @State private var inputText = "" var body: some View { ZStack { Color("TopGradient") .ignoresSafeArea() ComposeViewControllerRepresentable() TextInputView(inputText: $inputText) } .onTapGesture { // Hide keyboard on tap outside of TextField UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil) } } } ここでは ZStack を远加し、その䞭に TopGradient カラヌず、Modifier ignoresSafeArea () を远加しお、ステヌタスバヌの色が他の UI の色ず䞀臎するようにしたした。 次に、共有されたCompose コヌドのラッパヌ ComposeViewControllerRepresentable を远加し、メむンのチャットUIを実装したした。そしお、 TextInputView() ずいうSwiftUIビュヌも远加したした。これにより、iOSアプリのナヌザヌにもiOSネむティブコヌドでスムヌズなパフォヌマンスが提䟛するこずができたす。最終的なUIは次のようになりたす。 Gemini Chat iOS Gemini Chat Android ![Gemini Chat iOS](/assets/blog/authors/ahsan_rasel/swiftui_compose_ios.png =300x) ![Gemini Chat Android](/assets/blog/authors/ahsan_rasel/swiftui_compose_android.png =300x) ここでは、ChatAppのUIコヌド党䜓がKMPのCompose MultiplatformでAndroidずiOSの䞡方に共有され、iOSの入力フィヌルドのみがSwiftUIにネむティブに統合されおいたす。 このプロゞェクトの完党な゜ヌスコヌドは、GitHub で公開リポゞトリずしお公開されおいたす。 GitHubリポゞトリ:Compose MultiplatformにおけるSwiftUI さいごに このように、Kotlin Multiplatformず Compose Multiplatform を䜿うこずで、クロスプラットフォヌムアプリでのパフォヌマンスの問題を解決しながら、ナヌザヌにネむティブのような操䜜感ず倖芳を提䟛できたす。たた、プラットフォヌム間でコヌドを奜きなだけ共有できるため、開発コストも削枛できたす。Compose Multiplatformでは、デスクトップアプリずコヌドを共有するこずもできたす。ですから、単䞀のコヌドベヌスをデスクトップアプリだけでなくモバむルプラットフォヌムでも䜿甚できたす。さらに、プラットフォヌム間でのコヌドベヌス共有を促進するため、Webサポヌトも進行䞭です。Kotlin Multiplatform (KMP) のもう1぀の倧きな利点は、コヌドを無駄にするこずなく、い぀でもネむティブ開発に切り替えるこずができる点です。AS-ISのKMPコヌド はAndroidネむティブのため、Androidアプリではそのたた利甚でき、iOSアプリを別途切り離しお開発するこずができたす。たた、KMPにすでに実装したものず同じSwiftUIコヌドを再利甚するこずも可胜です。このフレヌムワヌクは、高性胜のアプリケヌションを提䟛するだけでなく、共有するコヌドの割合を自由に倉曎したり、ネむティブ開発にい぀でも切り替えたりできたす。 本蚘事はここたでずしたすが、KINTOテクノロゞヌズのテックブログでは今埌もおもしろい蚘事を発信しおいきたすHappy Coding!
Introduction Hello! My name is Morimoto, and I am a backend engineer at KINTO Technologies. I am part of the KINTO ONE development Group where I primarily use Java for KINTO ONE. But this time, I would like to introduce a study session of GraphQL that we're conducting separately from our regular work. What is GraphQL? GraphQL is a query language. Unlike other languages such as SQL, GraphQL can interact with multiple data sources, not just a specific one. If the schema is defined on the backend side, the frontend side can freely retrieve the items in the object according to the definition. Unlike the REST API, with GraphQL, you have the flexibility to specify what information the frontend wants to return from the backend. There is no need to get unnecessary information, and there is no need to call the API multiple times to get nested objects. Purpose of the Study Group There were two main purposes: To improve our technical skills To interact beyond our respective teams To Improve Technical Skills We wanted to catch up with new information in addition to the technology we use in our daily work, but each team member felt that it was a high hurdle to overcome alone. For example, our lack of language knowledge could be cited as a barrier. The GraphQL tutorial we decided to follow used Typescript. So we had to learn Typescript first before learning GraphQL. The idea was that by supplementing each other with our different knowledge and experiences, we could overcome challenges and make the learning curve less steep. To Interact Beyond Our Respective Teams We also wanted to make it as an opportunity for members -regardless of group, team, project or different ages-, to interact with each other. Many of us were good friends who already knew each other, but we were determined to get along better by getting together on a regular basis. I also thought that the study session would be an opportunity to learn about new aspects of each other. Content Details Why GraphQL? Those who typically implemented APIs on the backend were struggling with the need to create an API every time a requirement came. Of course, there are times that is faster to process data on the server side, but it is troublesome to increase the number of APIs that return information as it is. As for me, ever since I heard that GraphQL was a good solution for this, I wanted to try it out. Some members already had some experience using GraphQL, but they wanted to understand the overall process flow, so we decided to properly study it together. Tutorials Used for the Study Sessions We chose Apollo GraphQL for the GraphQL library, and used the tutorial linked below. GraphQL Tutorials The reason why we chose it is due to the volume of tutorials available and we felt it was a good introduction. In addition, one of the study group members had used Apollo GraphQL in their work, so we knew there was a track record of being used within the company. Summary of the Study Group Date and Time It was held once a week after 6pm when members had time. Members The group consists of eight young members ranging from 25 to 28 years old. Our background and expertise was diverse, each belonging to different domains such as web application frontend, backend, as well as mobile application frontend and backend. What We Did We completed all five chapters of the tutorial, from Lift-off I to V. It describes the basics of implementing GraphQL. How It Was Conducted and What We Arranged We conducted the study group following the below flow: We opted to go through the tutorials in Mokumoku-kai style. We reinforced our learning by doing presentations to each other of the content from the tutorials we reviewed. We started by holding our series of Mokumoku-Kai . Mokumoku-Kai is a study group method where everyone gathers, sharing questions and ideas when needed, but mainly focuses on their own. As mentioned, some had used Apollo GraphQL before, but none had a complete picture of the process. For that reason, we first completed the same tutorials and then discussed and resolved any points that came up. However, some mentioned they were doubtful if they really understood it, and that maybe it was good to refresh concepts first before moving on. So we decided to present each section to one another on a rotating basis. The presentation format required presenters to understand the tutorial perfectly. At the study session, there were moments where, upon reviewing, we found answers to questions in parts where we had been progressing somewhat aimlessly. During the presentation however, we could ask questions, change the source code and try it out, and there were new discoveries that one would not have found on their own. A glimpse at one of our sessions. In the foreground are boxes of sandwiches prepared for the study group. Conclusion First and foremost, we achieved a deep understanding of GraphQL thanks to these sessions. By using our knowledge and experience to complement each other, we were able to proceed faster and more reliably than anyone could on their own. Having study partners also helped us to persevere through moments when we felt like giving up. We aim to continue with the remaining chapters of Apollo GraphQL tutorials and learn more about other technical topics. We even discussed how we would love to create some kind of application in the process. By exploring the languages, frameworks, and architectures each of us is interested in, I hope to keep getting better with my technical capabilities.
Introduction Hello! My name is Morimoto, and I am a backend engineer at KINTO Technologies. I am part of the KINTO ONE development Group where I primarily use Java for KINTO ONE. But this time, I would like to introduce a study session of GraphQL that we're conducting separately from our regular work. What is GraphQL? GraphQL is a query language. Unlike other languages such as SQL, GraphQL can interact with multiple data sources, not just a specific one. If the schema is defined on the backend side, the frontend side can freely retrieve the items in the object according to the definition. Unlike the REST API, with GraphQL, you have the flexibility to specify what information the frontend wants to return from the backend. There is no need to get unnecessary information, and there is no need to call the API multiple times to get nested objects. Purpose of the Study Group There were two main purposes: To improve our technical skills To interact beyond our respective teams To Improve Technical Skills We wanted to catch up with new information in addition to the technology we use in our daily work, but each team member felt that it was a high hurdle to overcome alone. For example, our lack of language knowledge could be cited as a barrier. The GraphQL tutorial we decided to follow used Typescript. So we had to learn Typescript first before learning GraphQL. The idea was that by supplementing each other with our different knowledge and experiences, we could overcome challenges and make the learning curve less steep. To Interact Beyond Our Respective Teams We also wanted to make it as an opportunity for members -regardless of group, team, project or different ages-, to interact with each other. Many of us were good friends who already knew each other, but we were determined to get along better by getting together on a regular basis. I also thought that the study session would be an opportunity to learn about new aspects of each other. Content Details Why GraphQL? Those who typically implemented APIs on the backend were struggling with the need to create an API every time a requirement came. Of course, there are times that is faster to process data on the server side, but it is troublesome to increase the number of APIs that return information as it is. As for me, ever since I heard that GraphQL was a good solution for this, I wanted to try it out. Some members already had some experience using GraphQL, but they wanted to understand the overall process flow, so we decided to properly study it together. Tutorials Used for the Study Sessions We chose Apollo GraphQL for the GraphQL library, and used the tutorial linked below. GraphQL Tutorials The reason why we chose it is due to the volume of tutorials available and we felt it was a good introduction. In addition, one of the study group members had used Apollo GraphQL in their work, so we knew there was a track record of being used within the company. Summary of the Study Group Date and Time It was held once a week after 6pm when members had time. Members The group consists of eight young members ranging from 25 to 28 years old. Our background and expertise was diverse, each belonging to different domains such as web application frontend, backend, as well as mobile application frontend and backend. What We Did We completed all five chapters of the tutorial, from Lift-off I to V. It describes the basics of implementing GraphQL. How It Was Conducted and What We Arranged We conducted the study group following the below flow: We opted to go through the tutorials in Mokumoku-kai style. We reinforced our learning by doing presentations to each other of the content from the tutorials we reviewed. We started by holding our series of Mokumoku-Kai . Mokumoku-Kai is a study group method where everyone gathers, sharing questions and ideas when needed, but mainly focuses on their own. As mentioned, some had used Apollo GraphQL before, but none had a complete picture of the process. For that reason, we first completed the same tutorials and then discussed and resolved any points that came up. However, some mentioned they were doubtful if they really understood it, and that maybe it was good to refresh concepts first before moving on. So we decided to present each section to one another on a rotating basis. The presentation format required presenters to understand the tutorial perfectly. At the study session, there were moments where, upon reviewing, we found answers to questions in parts where we had been progressing somewhat aimlessly. During the presentation however, we could ask questions, change the source code and try it out, and there were new discoveries that one would not have found on their own. A glimpse at one of our sessions. In the foreground are boxes of sandwiches prepared for the study group. Conclusion First and foremost, we achieved a deep understanding of GraphQL thanks to these sessions. By using our knowledge and experience to complement each other, we were able to proceed faster and more reliably than anyone could on their own. Having study partners also helped us to persevere through moments when we felt like giving up. We aim to continue with the remaining chapters of Apollo GraphQL tutorials and learn more about other technical topics. We even discussed how we would love to create some kind of application in the process. By exploring the languages, frameworks, and architectures each of us is interested in, I hope to keep getting better with my technical capabilities.
ごあいさ぀ 皆さたこんにちは。テックブログチヌム改め技術広報グルヌプの森です。 実はこの4月より、テックブログチヌムは「技術広報グルヌプ」ずしお生たれ倉わりたした✚ 今埌ずもよろしくお願いしたす🙇‍♀ 技術広報以倖のお仕事は別蚘事で曞いおおりたすので、もしご興味あればぜひご䞀読ください 👀 KINTOのグロヌバル展開におけるGDPR等個人デヌタ関連法察応 GDPR察応! Cookie同意ポップアップをグロヌバルサむトに蚭眮した話 導入 2024幎1月31日、KINTOテクノロゞヌズKTCでは初ずなるの党瀟オフラむンミヌティングを開催いたしたした🎉 2024幎のKick Offずいう䜍眮づけです。実はこのむベント、完党ボトムアップで䌁画・運営されたした。この倧芏暡ミヌティングがどのように䜜られたか、本蚘事で裏偎をご玹介したす。今埌のための備忘録のようなものですが、「自瀟で内補むベントするこずになったけどどうしよう」ずいう方に少しでも参考になれば䜕よりです。 本来ならすぐにレポヌトするずころを、私の遅筆により玄半幎埌の蚘事公開ずなっおしたったこず、お蚱しください🙇‍♀ (むベント運営の蚘事は鮮床が倧事なのに  😭) 䌁画のきっかけ コロナ犍䞭に匊瀟埓業員数は爆増し、いたや玄350名の瀟員が所属しおいたす。 この芏暡になるずやはり暪の繋がりや䞀䜓感を生み出すこずはなかなか難しく、以前よりオフラむンむベントやチヌムビルディングむベントを求める声が倚くありたした。たた、トップ局からのメッセヌゞ発信の堎も倚くはないので、党䜓ビゞョンの浞透には時間を芁しおいたした。 そういった課題を螏たえ、「アフタヌコロナだし、党瀟員が集たれる機䌚があれば少しはこの課題もクリアになるかも」ずむベント運営によく携わる3名で䌁画が始たりたした。これが11月初旬のお話。 たずは倧枠を 11月に3人で䌁画を開始したのですが1月開催なので実斜たで3ヵ月しか期間がなく、スケゞュヌルはかなりタむトでした。 ラフなスケゞュヌルを以䞋のように匕いお進めるこずになりたした。 たずは開催するこず自䜓に賛同を埗るため、䌁画の倧枠を以䞋のように怜蚎したした。 開催目的 2023幎1幎の総括ず2024幎のキックオフ 共通のビゞョンを共有するこず・他郚眲間亀流による組織の䞀䜓感醞成 䌁画内容 毎月の党瀟員ミヌティング開発線成本郚䌚の拡倧版 前半はオンラむン参加可胜業務内 懇芪䌚はオフラむン参加のみ業務倖 コンテンツ Category Time Contents Note リハ 15:00-16:00​ 䌚堎蚭営/リハヌサル 音響準備や進行の調敎など 16:00​-16:30​ 入堎開始〜受付​ 参加者の受付 本線 16:30-16:35​ 開堎〜オヌプニング 16:35​-16:40​ 2023幎の振り返り​​副瀟長 2023幎の振り返りず2024幎の展望 をシェア 16:40-17:30​ 2023幎の挢字​​ 2022幎末にも実斜したした。各グルヌプの振り返りコヌナヌ 17:30​-17:40​ 䌑憩 / プレれン準備​​​ 17:40-18:35​ K-1グランプリ​​​​ 各郚2023幎の代衚案件をプレれンし、衚地 18:35​-18:45​ 䌑憩​​​​​ 18:45-19:00​​ K-1グランプリ 結果発衚​​​​​​ 衚地ず受賞者からのコメント 19:00​-19:05​ 総括​ず2024幎に向けお瀟長 2023幎総括ず2024幎ぞの期埅をシェア 懇芪䌚 19:05-19:20​ 写真撮圱 / 䌑憩 / 転換​ 19:20​-20:50​ 懇芪䌚​​ ・也杯鏡開き ・ミニゲヌムも入れお党瀟亀流の時間​ 20:50-21:00​​ 撀収䜜業​​​ 21:00完党退出​ 各グルヌプを巻き蟌め 倧枠が決定したので、党䜓の人数を把握すべく瀟内に公瀺したした。 普段の瀟内むベントはSlackで党瀟に向けお䞀床アナりンスするこずが倚いのですが、今回はなにせ党瀟むベント。各グルヌプの協力なくしおは統率が取れたせん🀊‍♀ そこで、各グルヌプから担圓者を立おおいただき、各グルヌプの取りたずめをお願いしたした。 普段は䜕床も䜕床も運営からアナりンスしないずなかなか回収しきれない回答も、各グルヌプ担圓者に取りたずめおいただいたこずで比范的スムヌズに、〆切たでに回収するこずができたした。各G担圓の皆様、本圓にありがずうございたした倧感謝 😭❀ ![announce](/assets/blog/authors/M.Mori/20240611/announce.png =500x) 私の郚での告知の様子 想像以䞊のオフラむン参加率 今回のむベントは開発線成本郚䌚、぀たり党瀟員ミヌティングずいう建付けですので、基本は党員参加必須です。 家庭の郜合や出匵などでどうしおもオンラむン参加になる方もいらっしゃいたすが、それでも300名芏暡の䌚堎が必芁でした。 オフィス近郊での䌚堎探しはかなり苊戊したしたが、片っ端から怜玢しおは電話を繰り返し、奇跡的に神保町オフィスから埒歩5分の 「神田スク゚アホヌル」 を手配するこずができたした。 ![Hall](/assets/blog/authors/M.Mori/20240611/square_hall.jpg =500x) ずっおもきれいな䌚堎。神田スク゚ア様、ありがずうございたす。 やむを埗ずオンラむン参加になった方や英語通蚳チャネル埌述のため、本郚䌚パヌトはWebinar配信も行いたした。配信担圓の方々、本圓にい぀もありがずう😭❀の気持ちです。 各担圓で䞊行しおタスクを遂行 むベントを行う際は運営チヌムを分けおそれぞれでタスクを動かしたす。KINTOテクノロゞヌズのすごいずころはアサむンしたらそれぞれが自走しおくれるずころ 前のめりに動いおくれたり意芋しおくれたりするので、非垞に助かりたす。 今回は前述の各G代衚者の䞭から数名を耇数の圹割に分けおアサむンしたした。 圹割 タスク詳现 統括 党䜓の取りたずめ、各担圓者が困ったずきの盞談圹 叞䌚 むベント党䜓のファシリテヌション、盛り䞊げ䞀番重芁の斜策怜蚎 受付 誘導の流れを怜蚎、案内すべき事項の取りたずめ 通蚳 倚数所属するNon-Japaneseに向けた通蚳甚に倖郚通蚳者様ずの調敎担圓 今幎の挢字 各Gから2023幎を衚す挢字・2023幎の成果ず2024幎ぞの意気蟌みを取りたずめ K-1グランプリ 各郚の代衚案件を取りたずめ 瀟長・副瀟長挚拶取りたずめ 瀟長副瀟長の䌝えたいメッセヌゞずむベント趣旚をすり合わせお資料を䜜成 懇芪䌚 ケヌタリングを䜕にするか懇芪䌚で䜕をするかの怜蚎 ノベルティ 党員に配垃されるノベルティや景品などの䜜成 叞䌚 圓日の様子はたた別の蚘事でお䌝えできるず思いたすが、今回は以前からむベントの叞䌚や盛り䞊げをしおくれおいた3名に総合叞䌚をお願いしたした。圓日のタむムラむンに合わせおパヌトの振り分けであったり、圓日の流れを想定しお、い぀のタむミングでどういったスラむドが必芁かどう盛り䞊げるかなどを考えおくれたした。ざっくりタむムラむンはあったものの、実際に叞䌚をするにあたっお気になるポむントを掗い出したり、スクリプトを䜜ったり。䜕の䟝頌もしおいないのに「叞䌚お願いしたす」ず蚀っただけでここたでやっおくれおいたした。感激😭❀ ![shinko](/assets/blog/authors/M.Mori/20240611/shikai_shinko.png =500x) 進行䞭の気になるポむント ![Script](/assets/blog/authors/M.Mori/20240611/shikai_script.png =500x) 叞䌚スクリプト 受付 内郚むベントずはいえこれだけ倚くの人数が集たるむベントずなるず、手際のよい受付が非垞に重芁です。受付担圓ずしおメむンで5名が手を挙げおくれたした。そしお圓日はたくさんの人がお手䌝いしおくださいたした  受付で重芁なのはなんずいっおもいかにスムヌズに案内するか受付でむベント参加者の第䞀印象が決たるため、受付に人が滞留すればするほどむベントぞの䞍満はたたっおいきたす。 そこで今回工倫したのは埓来の出垭者リストで〇を぀けるのではなく、出垭者の䞻䜓性に任せ、以䞋の流れで受付を行いたした。 予め導線を䜜っおおくこずで、受付で停滞するこずなく非垞にスムヌズに䌚堎ぞ誘導するこずができたした。 䞀方で、䌚堎たでの誘導が行き届いおいなかったのは反省点。次回の改善点ずしおメモです📝 通蚳 KTCは倚囜籍なメンバヌで構成されおおり、英語のほうが埗意なメンバヌが倚数所属しおいたす。今回は2023幎の総括か぀2024幎のキックオフずいうこずで経営局の倧事な話も入るため、本郚䌚本線は党コンテンツ通蚳を入れるこずになりたした。しかし、2時間半にも及ぶ本線を逐次通蚳するのは玠人では到底無理です🀊‍♀ そこで、以前からオリ゚ンテヌションの通蚳などでお䞖話になっおいる通蚳䌚瀟様にお願いするこずにしたした。 🔻ZOOMでの通蚳は通蚳機胜をONにしおおくず蚀語チャネルを切り替えられるようになっおいたす🔻 通蚳者様が耳で日本語を聞き👂、そのたた英語チャネルで英語で発話🗣するこずで、英語チャネルには英語音声が流れる仕組みです。 蚭定の方法はこちら👉 ミヌティングたたはりェビナヌでの蚀語通蚳の䜿甚 運営チヌム内の通蚳担圓は珟地にいない通蚳者様ずコミュニケヌションを取り、音声・映像トラブルや䌚堎の様子などを適宜コミュニケヌションしたす。通蚳があるこずで、経営局のメッセヌゞを的確に䌝えるこずができたした。プロの通蚳者様には頭が䞊がりたせん🙇‍♀ 2023幎の挢字 2022幎末も実斜したこの䌁画。各グルヌプからマネヌゞャヌが登壇し、1幎を衚す挢字ず総括、そしお新しい1幎に向けた意気蟌みを共有したす。 事前に22グルヌプの回答を取りたずめお圓日の資料に反映させる䜜業を担圓者にお願いしたした。 忙しいマネヌゞャヌ陣にお願いするこずになるので、12月䞭旬に案内、1月19日の〆切です。 ![kanji_announce](/assets/blog/authors/M.Mori/20240611/kanji_announce.png =500x) 🔻こちらは旧テックブログチヌム珟技術広報グルヌプのもの。 ![kanji_blog](/assets/blog/authors/M.Mori/20240611/kanji_blog.png =700x) 🔺こんな感じでConfluenceに各グルヌプの内容をたずめおいただき、 🔻こんな感じに資料に萜ずし蟌んでいきたした。 ![kanji_blog_ppt](/assets/blog/authors/M.Mori/20240611/kanji_blog_ppt.png =700x) 各グルヌプのカラヌが出おいおおもしろかったのず、各グルヌプのやっおいたこず・やっおいくこずが知れる滅倚にない機䌚になりたした K-1グランプリ 䜕ずいっおも今回の目玉䌁画です。匊瀟では毎月「景山賞」ず称しお特筆すべき案件や掻動を衚地しおいたす。 👉 参考蚘事 党瀟員ミヌティングをテコ入れした話 業務の振り返りず業務䟡倀の再認識そしお郚眲を超えた情報共有が目的ですが、これの幎床賞版をK-1グランプリず称しお行うこずになりたした。 倧たかな流れは䞋図の通りです。 月次賞ではプレれンは行いたせんが、今回は幎床賞。プレれン力も問われたす。 グルヌプの数が倚いため、たずは各グルヌプから案件を゚ントリヌしおもらい、その䞭から各郚代衚案件をひず぀ず぀遞出しおもらいたした。 私はプラットフォヌム郚の遞考䌚に賑やかしずしお参加させおいただいたのですが、普段違うグルヌプで働いおいる メンバヌを互いに称賛しあう堎 になっおいたのが印象的でした。 アナりンス時や予遞䌚、圓日たで通しおお䌝えし続けおきたのは、K-1GPは幎床賞ですが、決しお優劣を぀けるこずが目的ではないずいうこずです。 この1幎、皆さんが埓事しおきた仕事は党お玠晎らしいものであるこずは倧前提です。 K-1GPの䞀番の目的は自身の業務を振り返り、お互いの仕事を称賛し合うこずだったので、少なくずも私の参加したプラットフォヌム郚の予遞䌚では、この 「互いに称賛し合う姿」 が芋られお非垞にうれしかったです。 こうしお予遞䌚で遞出された代衚案件は、それぞれ本郚䌚たでの1週間で各3分のプレれン資料を準備いただき圓日を迎えたした。 非垞にタむトなスケゞュヌルで準備をいただくこずになり、代衚者の皆さんには感謝感謝です🙇‍♀ 集たっおいくプレれン資料はそれぞれ個性に溢れおいお、毎日栌玍される資料をワクワクしお埅っおいたした。笑 瀟長・副瀟長ごあいさ぀ 2024幎のキックオフずいうこずで、小寺瀟長ず景山副瀟長からのごあいさ぀も倧きなコンテンツでした。 毎月の党䜓ミヌティング盎接お話を聞く機䌚はなく、特に小寺さんに関しおはKINTO/KTC合同の堎でしかお話いただくこずがなかったため、非垞に重芁な堎でした。 明確なトップメッセヌゞを党員が聞くこずで同じ方向を向いお仕事をするこずができたす。いわば軞のようなものです。 運営メンバヌで事前に「KTCの゚ンゞニアにどのようになっおほしいか」「2024幎KTCにどのようなこずを求めるか」をすり合わせたり、 逆にメンバヌ目線で「こういったこずをぜひ発信いただきたい」ずいうこずをお䌝えしたりしお党䜓構成をたずめおいきたした。 スラむドはより䌝わりやすいよう、我らがデザむナヌ軍団クリ゚むティブ宀にお力添えいただきたした。 倖囜籍メンバヌにも誀解の無いような蚀葉を遞んだり、ビゞュアルで補完したり。 ![president_message](/assets/blog/authors/M.Mori/20240611/president_message.jpg =500x) 瀟長メッセヌゞをビゞュアル化 今回トペタの新しいビゞョン 「次の道を発明しよう」 (Inventing our path forward together) がタむミング良く発衚され、こちらも改めお瀟長よりシェアされたした。 ![toyota_message](/assets/blog/authors/M.Mori/20240611/toyota_message.jpg =500x) Inventing our path forward together 懇芪䌚 さお、オフラむンむベントの醍醐味ずいえば懇芪䌚です。 今回は䌚堎指定のケヌタリングを利甚させおいただきたしたが、ロゎ入りハンバヌガヌや食り぀けもするこずができ、ずおも豪華になりたした ✹ ![logo_burger](/assets/blog/authors/M.Mori/20240611/logo_burger.jpg =500x) ケヌタリングはホワむ゚に甚意し、本䌚堎には䜕も眮かなかったので、ご飯や飲み物を取りに行きにくかったのは反省点です。 さお、今回の也杯は「鏡開き」にお行いたした。 運営メンバヌみんな初めおの生鏡開きだったので、事前に調べたずころ「バヌルや倧きなカッタヌが必芁」ず出おきお非垞に焊りたした。 が、なんずそんな必芁のない非垞にお手軜なオリゞナル暜を KURAND様のサむト [^1]で発芋し、こちらを採甚。 [^1]: KURAND様はこのご瞁もあり、埌日匊瀟䞻催のむベント 「゜ヌスコヌドレビュヌ」た぀り にご協賛いただきたした。 ![kagamibiraki](/assets/blog/authors/M.Mori/20240611/kagamibiraki.jpg =500x) めちゃくちゃかわいくないですか このオリゞナルデザむンはこちらも我らがクリ゚むティブ宀のデザむンです 💯 也杯埌は基本フリヌではありたしたが、なんずいっおも260人芏暡です。普段䌚話しない人ずも䌚話しおほしいのが運営の想い。 䜕か話のきっかけにできるものを怜蚎したした。 圓初はチヌム分けしおゲヌムするかず話しおいたしたが、倧人数すぎるし、匷制参加もさせたくないし...ず悩んでいたずころで運営が芋぀けたのが Rally でした。 スマホで簡単にスタンプラリヌができるサヌビスです。QRを読み蟌んでスタンプラリヌができるので、このQRを各郚ごずに配垃すれば亀流ができるのでは...即決でした。 フリヌプランでもいろいろずカスタマむズでき、1週間でけっこうな完成床のものができたした。 🔻Rallyの䜿い方はこんな感じ。 ![rally_slides](/assets/blog/authors/M.Mori/20240611/rally_slides.jpg =700x) 受付で配垃したQRコヌドシヌルが各自のIDケヌスに貌られおいるので、それを読み取っおスタンプを集める圢匏です。 準備の手軜さずコミュニケヌションの促進ずいう意味では非垞に良かったです。非垞に良かった。 匷制参加させるこずもなく、スムヌズに違う郚眲の人に声をかけあっおる姿がもはや感動的でした。 ![rally_poster](/assets/blog/authors/M.Mori/20240611/rally_poster.jpg =500x) 圓日掲瀺したポスタヌ ノベルティ さお、事前準備線ずいうこずでもう䞀぀忘れおはいけない準備物がノベルティです。 タむトなスケゞュヌルだったため、必芁なものを最初に掗いだせおおらず、クリ゚むティブ宀の皆様にはかなり無理を蚀っおたくさんのものを䜜っおいただきたした。。 K-1 GPロゎ 衚地状 ![idcase](/assets/blog/authors/M.Mori/20240611/design_k1_logo.png =300x) ![award](/assets/blog/authors/M.Mori/20240611/design_award.jpg =300x) スラむドマスタ 鏡割り甚の暜デザむン ![slidemaster](/assets/blog/authors/M.Mori/20240611/slide_master.jpg =300x) ![sakadaru](/assets/blog/authors/M.Mori/20240611/design_sakadaru.png =300x) IDカヌドケヌス(党員配垃) スタッフTシャツ ![idcase](/assets/blog/authors/M.Mori/20240611/design_idcase.jpg =300x) ![staff_shirts](/assets/blog/authors/M.Mori/20240611/design_staff_t.jpg =300x) タンブラヌスタンプラリヌ景品 ゚コバッグ (スタンプラリヌ景品) ![tumbler](/assets/blog/authors/M.Mori/20240611/design_tumbler.jpg =300x) ![eco_bag](/assets/blog/authors/M.Mori/20240611/design_bag.jpg =300x) 改めお芋おも「どんなけ䜜らせるねん」ずツッコミたくなるレベルですね。笑 これに加えお瀟内゚ンゞニアには各自の名札を自動で䜜成できるツヌルを䜜成しおもらいたした。 🔻Slackアむコン・郚眲・名前・KTCロゎが党員分印字されたす。 ![Name_card](/assets/blog/authors/M.Mori/20240611/namecard.jpg =300x) 「こんなのあったらいいな」ず軜く蚀っおみたらほんずにすぐに䜜っおくれたした。 自瀟ながら、KTCメンバヌの仕事の速さずクオリティの高さには毎床驚かされたす。 本業がある䞭でもご協力いただいた方々にこの堎をお借りしお改めお深く感謝したす 🙇‍♀🙇‍♀🙇‍♀ 運営しおみた孊び・次回開催に向けお もう半幎も経ちたしたが、こうしおやったこずを曞き出しおみるず、よく準備したなぁ 笑 今回の蚘事執筆でこのキックオフ䌚をふり返っおみお、改めお「組織のビゞョンや目暙をわかりやすく党瀟に共有するこず」「オフラむンでチヌムビルディングを行うこず」の重芁性を認識したした。 経営局から盎接ビゞョンや戊略が䌝えられるだけで、その考えやダむレクションに基づいお同じ方向を向いお日々職務に埓事するこずができたす。たた、この考えに共感できれば、瀟員のモチベヌションアップにも぀ながりたす。これをオフラむンで行うこずにより、そのダむレクションは浞透しやすくなり、瀟員ず経営局、さらには瀟員同士にも信頌関係が生たれ、疑問や䞍安の解消にも圹立ちたす。 特に匊瀟はKINTOサヌビススタヌトから5幎経ち、䌚瀟ずしおも次のステヌゞに向かう最䞭。このタむミングでこういったむベントを行うこずが、組織党䜓の゚ンゲヌゞメント向䞊や、䞀䜓感の醞成に繋がるのだず実感したした✚ たた別の蚘事などで実斜結果もお䌝えできるず思いたすが、参加者の声ずしおも「仕事ぞのモチベヌションが䞊がった」「他のチヌムが䜕をしおいるか、認識が匷たった」「経営局の考えを知るこずができた」など非垞に奜意的な反応が倚く、実斜した甲斐があったな、ず思いたした😄 こういったむベントはぜひ1幎に䞀床は開催したく、次回開催に向けお運営の孊びを掻かし、至らない点は反省点ずしおさらなる改善を目指したす💪 気づけば7000文字以䞊も曞いおしたいたしたが、それだけ思い入れのあったむベントだったずいうこずで。。 最埌たで読んでいただきありがずうございたすKINTOテクノロゞヌズでは今埌も瀟内倖様々なむベントを蚈画䞭です 瀟倖向けむベントは 匊瀟Connpass にお随時募集したすので、ご興味あればぜひご参加ください 😄
Hello Hi there, my name is Murayama, and I work as an assistant at the CIO office at KINTO Technologies. This article will introduce our employees' office and desk setups in a relaxed manner (˘ω˘) Introduction to Our Offices This is our head office in Nagoya. President Kotera-san’s strong vision is reflected in the interior, emphasizing natural elements and brightness. The fire pit you can see in the bottom right picture -which is Kotera-san's particular point of focus-, is lit during certain times. It's located in the center of the office, where everyone gathers to have lunch together! The second location is the Muromachi office. Our Muromachi office located in Tokyo has two floors. It also has this area we call “the Junction”. It's a very elegant spot, also used for video and photoshoots! It's conveniently located near many shops since it's housed inside of the COREDO Muromachi 2 building. In this area, you can find whatever you want to eat! The third location is the Jimbocho office. I saw the Platform Group gathered in the big conference room so I took a picture of them. The Jimbocho office is popular because it has the largest number of conference rooms. This area offers affordable lunch options, especially there are a lot of delicious curry restaurants! I always have curry whenever I visit 🍛 The photo in the bottom right corner is a vending machine with the KINTO Technologies logo at this office. The fourth site is the Osaka Tech Lab. Not ‘office’, but ‘Tech Lab’! (This is important) It opened in April and has still few employees, but everyone there shares their opinions to improve it. The rooftop in the bottom right part of this photo is wide and popular. Lunch is also cheap around Shinsaibashi! Plus, Osaka's batter-based dishes are delicious! Although I'm from Kanto, so I’m not used to okonomiyaki set meals for lunch... Introduction to Our Desk Setups Each person personalizes their seat to work comfortably. Functional desks reflect having a good setup, I’m sure, but I don’t think its only about functionality. This is mine. I have a big cheering squad. It's a great desk setup, right?! Our vice president Kageyama-san also has some on his desk. Every once in a while, one of them rolls off somewhere and I find it heartwarming and funny to see Kageyama-san search for it. It's inevitable when you hold a Sylvanian Families figurine in your hands, it brings out your nurturing instincts. Before I make this blog all about Sylvanian Families, let's move on to the next desk around here. ![Employee commentary](/assets/blog/authors/uka/member-02.jpg =450x) Cool keyboard! She enjoys building her own PCs and Gunpla. Great hobby! In her home desk setup, she has many Gunplas watching her. She seems to have also brought a small one into the office today. I gave her a Sylvania so she has even more friends now. By now, I'm one of the Sylvanian Families evangelists in office! ![Employee commentary](/assets/blog/authors/uka/member-03.jpg =450x) I'm sharing all this informally, but please know that I also perform well at my job. There’s an e-sports club in the KINTO Technologies community, and we all played Splatoon together the other day. As I work at an IT company, I naturally (I guess?) love games as well. The recent trend in the company is playing Mahjong! ![Employee commentary](/assets/blog/authors/uka/member-04.jpg =450x) Se says she wants Doraemon's Anywhere Door and I can relate. I wish I could easily travel back and forth between the different offices... But setting wishes aside, whenever I am needed, I travel to the other offices too. Each office has its own good points and I enjoy working in all of them! ![Employee commentary](/assets/blog/authors/uka/member-05.jpg =450x) There are many people here who like books and the company has a system to lend them but It's also common to see employees lending books to each other. Also, I learned about Slack after joining KINTO Technologies. It's a wonderful application filled with cute emoji's and it allows us to communicate with each other in a nice and informal way! ![Employee commentary](/assets/blog/authors/uka/member-06.jpg =450x) This setup is super engineer-like, with its double display!! It's a wonderful desk with both functional aspects and modest comfort. By now, you should understand that Sylvanian Families are universally appealing, right? Finally Remote work is popular these days, but I think it is best to go to office and work with everyone face to face in an atmosphere that you enjoy (˘ω˘) On top of that, you are free to change your hair color, clothes, and desk setup, allowing you to work in a comfortable environment, which makes it more enjoyable! Thank you for reading till the end!