ã¨ã ã¹ãªã¼ããã¯ããã°
ã¨ã ã¹ãªã¼(m3)ã®ã¨ã³ã¸ãã¢ã»éçºã¡ã³ãã¼ã«ããæè¡ããã°ã§ã
2025-02-28T11:00:00+09:00
m3tech
Hatena::Blog
hatenablog://blog/8599973812294943206
Rust ã§ä½ã Step Functions ãä½ã§ãããããããå
hatenablog://entry/6802418398331821598
2025-02-28T11:00:00+09:00
2025-02-28T11:00:01+09:00 ããã«ã¡ã¯ãAIã»æ©æ¢°å¦ç¿ãã¼ã ã®è
éã§ããã¨ã ã¹ãªã¼ã«è»¢è·ãã¦ããããä¸ã¶æãä»æ¥ã楽ããã³ã¼ããæ¸ãã¦ãã¾ãã ãã®è¨äºã§ã¯ä»äºã®åéã«ä½ã£ã Rust 製㮠CLI ãç´¹ä»ãã¾ããAWS Step Functions ã®ã¹ãã¼ããã·ã³ãéä¸ã§å®è¡ã«å¤±æããæã«ä½ãåå ã§ä½å失æããããæ°ãããã¨ãã§ãã¾ãã
<p>ããã«ã¡ã¯ãAIã»æ©æ¢°å¦ç¿ãã¼ã ã®<a href="https://bsky.app/profile/hkford.bsky.social">è
é</a>ã§ããã¨ã ã¹ãªã¼ã«è»¢è·ãã¦ããããä¸ã¶æãä»æ¥ã楽ããã³ã¼ããæ¸ãã¦ãã¾ãã</p>
<p>ãã®è¨äºã§ã¯ä»äºã®åéã«ä½ã£ã Rust 製㮠CLI ãç´¹ä»ãã¾ããAWS Step Functions ã®ã¹ãã¼ããã·ã³ãéä¸ã§å®è¡ã«å¤±æããæã«ä½ãåå ã§ä½å失æããããæ°ãããã¨ãã§ãã¾ãã</p>
<ul class="table-of-contents">
<li><a href="#ã¨ãããããã¯ãã§ã®-Step-Functions">ã¨ãããããã¯ãã§ã® Step Functions</a><ul>
<li><a href="#Run-Task-失æã«å¯¾å¿ãã">Run Task 失æã«å¯¾å¿ãã</a></li>
</ul>
</li>
<li><a href="#Step-Functions-ãä½ã§ããããä¸ç®ã§ããã-CLI-ãä½ã">Step Functions ãä½ã§ããããä¸ç®ã§ããã CLI ãä½ã</a><ul>
<li><a href="#ãã®åã«-Rust-ã§æ¸ãã¦ã©ãã ã£ãã">ãã®åã«: Rust ã§æ¸ãã¦ã©ãã ã£ãã</a></li>
<li><a href="#dialoguer-ã§ã¿ã¼ããã«ããã¹ãã¼ããã·ã³ãé¸ã¶">dialoguer ã§ã¿ã¼ããã«ããã¹ãã¼ããã·ã³ãé¸ã¶</a></li>
<li><a href="#AWS-SDK-for-Rust-ã§ã¹ãã¼ããã·ã³ã®ä¸è¦§ãå®è¡å±¥æ´ãåå¾ãã">AWS SDK for Rust ã§ã¹ãã¼ããã·ã³ã®ä¸è¦§ãå®è¡å±¥æ´ãåå¾ãã</a></li>
<li><a href="#AWS-SDK-for-Rust-ããã¹ããã">AWS SDK for Rust ããã¹ããã</a></li>
<li><a href="#AWS-SDK-for-Rust-ã®-tips">AWS SDK for Rust ã® tips</a></li>
</ul>
</li>
<li><a href="#We-are-hiring">We are hiring!</a></li>
</ul>
<h2 id="ã¨ãããããã¯ãã§ã®-Step-Functions">ã¨ãããããã¯ãã§ã® Step Functions</h2>
<p>ç§ãã¡ã®ãã¼ã ã§ã¯å®æçã« ECS Task on Fargate Spot ã§å¦çãå®è¡ãããã®ãªã¼ã±ã¹ãã¬ã¼ã·ã§ã³ã« Step Functions ãå©ç¨ãã¦ãããããã¯ããéç¨ãã¦ãã¾ãããªã¼ã±ã¹ãã¬ã¼ã·ã§ã³ã¨ãã£ã¦ããã Step Functions ãã ECS ã® Run Task ãå®è¡ãã¦ããã ãã§ãããStep Functions ãç¨ãããã¨ã§ãªãã©ã¤å¦çã Step Functions ã«ä»»ã㦠ECS Task ã¯å¦çã®å
容ã«éä¸ãããã¨ã§è²¬åãåãã¦ãã¾ãã</p>
<p><figure class="figure-image figure-image-fotolife" title="Step Functions ã¹ãã¼ããã·ã³"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20250228/20250228110009.png" width="631" height="211" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>Step Functions ã¹ãã¼ããã·ã³</figcaption></figure></p>
<p>å
¥ç¤¾å¾ã®ãªã³ãã¼ãã£ã³ã°ä¸ã«è¿½å ããã Slack ãã£ã³ãã«ã® 1 ã¤ã« AWS ã Google Cloud ã§åãã¦ããã¯ã¼ã¯ãã¼ãã§çºçããã¨ã©ã¼ãéç¥ããããã£ã³ãã«ãããã¾ãããã®ãã£ã³ãã«ã«å
¥ã£ã¦ãã°ãããã㨠Step Functions ã®å®è¡ã«å¤±æããéç¥ãããã¤ãéããã¦ãã¾ããã</p>
<p><figure class="figure-image figure-image-fotolife" title="slack éç¥"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20250228/20250228110005.png" width="800" height="401" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>slack éç¥</figcaption></figure></p>
<p>ã³ã³ã½ã¼ã«ã«ãã°ã¤ã³ãã¦è©³ç´°ã確èªããã¨ãããTask ã®èµ·åã«å¤±æãããã¨ã Task ãéä¸ã§ä¸æããããã¨ãåå ã®ããã§ããã</p>
<h3 id="Run-Task-失æã«å¯¾å¿ãã">Run Task 失æã«å¯¾å¿ãã</h3>
<p>Run Task ã失æããå ´åã¯<a href="https://repost.aws/ja/knowledge-center/ecs-fargate-runtask-capacity">ãã¹ããã©ã¯ãã£ã¹</a>ã«ããããã«ä»¥ä¸ãæ¨å¥¨ããã¾ãã</p>
<ul>
<li><p>è¤æ° AZ ãæå®ãã</p></li>
<li><p>è¤æ°ã® CPU ã¨ã¡ã¢ãªã®çµã¿åãããæå®ãã</p></li>
<li><p>ééãããã¦ãªãã©ã¤ãã</p></li>
</ul>
<p>ã¹ãã¼ããã·ã³ãå®ç¾©ãã¦ãã Terraform ã³ã¼ãã確èªããã¨ãããªãã©ã¤ã®ééãçãåæ°ãå°ãªãã£ãã®ã§ãééãé·ãåãåæ°ãå¢ããããã«ä¿®æ£ãã¾ããã</p>
<p>ãã ããã§ç¡äºè§£æ±ºã¨ããããã§ã¯ããã¾ãããè¤æ° AZ ãæå®ãã¦ä½åº¦ããªãã©ã¤ããã°å¦çãå®äºã§ããå¯è½æ§ãé«ã¾ãã¨ããã ãã§ã仮㫠5 åãªãã©ã¤ãã¦ã 5 åã¨ã Task èµ·åã«å¤±æããã°å¦çã¯å¤±æã§ãããªãã©ã¤åæ°ããã£ã¨å¤§ããªå¤ãä¾ãã° 100 åã¾ã§å¢ããã°å¤§æµã®å¦çã¯å®äºãããã§ãããå¦çãéä¸ã¾ã§å®äºãã¦ãã¦ä¸æããããã¨ãä½åº¦ãèµ·ãã¦ããã¨æåãã Fargate (not Fargate Spot) ã§èµ·åãã¦ããã°ããã£ãã¨ãªãããã¾ããããããã¯å®å¸¸çã«æ°åãªãã©ã¤ãã¦ãããªãããããããåæã RI ã§ç¢ºä¿ãã EC2 ä¸ã§ Task ãèµ·åãã¦ãã¾ã£ãæ¹ãåç´ãªã³ã¹ãé¢ã ãã§ããã°å®ãã¨ãªãããããã¾ããã</p>
<h2 id="Step-Functions-ãä½ã§ããããä¸ç®ã§ããã-CLI-ãä½ã">Step Functions ãä½ã§ããããä¸ç®ã§ããã CLI ãä½ã</h2>
<p>ãã®ããã«èãå§ãã㨠Step Functions ã®å®è¡å±¥æ´ã調ã¹ã¦ã¹ãã¼ããã·ã³ãã©ããªçç±ã§ä½å失æããã調ã¹ãããªãã¾ãããããã³ã³ã½ã¼ã«ãéãã¦è©²å½ã®ã¹ãã¼ããã·ã³ãéããå®è¡å±¥æ´ãè¦ã¦ãã©ã®ç¶æ
ã§å¤±æãããã¨ãã®åå ã確èªãããã¨ãããã¨ãç¹°ãè¿ãã¦ããã¨ãã£ã¨ããéã«æéãéãã¦ããã¾ãããè²ã
ãªç»é¢ãéãå¿
è¦ããã£ã¦é¢åã§ãã</p>
<p>ãã㧠AWS ã®ã³ã³ã½ã¼ã«ã®è²ã
ãªç»é¢ãéãæéãçãããã«ã¹ãã¼ããã·ã³ã®å®è¡å±¥æ´ã調ã¹ã¦å¤±æããå®è¡ã«ã¤ãã¦åå ãä½ã§ä½å Task ã失æãããã表示ãã CLI ãä½ãã¾ãããå人çã«èå³ããã Rust ã§å®è£
ãã¦ãã¾ã<a href="#f-d438c71c" id="fn-d438c71c" name="fn-d438c71c" title="Python ã§ãããããªã¨æãã¾ããã boto3 ãã¢ãã¯ããã©ã¤ãã©ãªã® moto 㧠Step Functions ã® API ãããã¤ã対å¿ãã¦ããªãã®ã§è¦éãã¾ããã">*1</a>ã</p>
<p>ã¾ããã® CLI ã®ä½¿ãæ¹ãç´¹ä»ãã¾ããæåã« CLI ãå®è¡ããã¨ã¾ãå®è¡å±¥æ´ã調ã¹ãã¹ãã¼ããã·ã³ãé¸ã³ã¾ãã</p>
<pre class="code term" data-lang="term" data-unlink>State Machine ãé¸æ:
> calculate-scores-v2
calculate-scores-workday-v2
calculate-scores-not-workday-v2</pre>
<p>ããã¦é¸æããã¹ãã¼ããã·ã³ã®ç´è¿ã®å®è¡å±¥æ´ãè¦ãä¸ã§å¤±æããå®è¡ã«ã¤ã㦠Spot ä¸æã«ãã£ã¦å¤±æããåæ°ã¨ Task èµ·åã«å¤±æããåæ°ãæãã¦ããã¾ãã</p>
<pre class="code term" data-lang="term" data-unlink>State Machine ãé¸æ: calculate-scores-workday-v2
é¸æãã State Machine ã®æå㯠98 åã失æ㯠2 å
失æãã State Machie Execution: arn:aws:states:ap-northeast-1:012345678901:execution:calculate-scores-workday-v2:5fc789df-1a97-3819-448a-b15da23ad9a5_f483b343-f640-b2e9-2d63-80dd10c4b15c
å®è¡å¤±æãã Task 㯠6 åã§ãã®ãã¡ Spot ä¸æ㯠5 åãTask èµ·å失æ㯠1 å
失æãã State Machie Execution: arn:aws:states:ap-northeast-1:012345678901:execution:calculate-scores-workday-v2:7a5907fc-f7e0-c206-4eb4-e0f3d2a0f385_e90e49c0-ae1d-298d-caea-17664ea6a3fc
å®è¡å¤±æãã Task 㯠6 åã§ãã®ãã¡ Spot ä¸æ㯠2 åãTask èµ·å失æ㯠4 å
</pre>
<p>ããããã¯ãã® CLI ãä½ãä¸ã§ä½¿ã£ãã¯ã¬ã¼ã㨠AWS SDK for Rust ã®ä½¿ãæ¹(ã¦ããããã¹ãã®ä»æ¹ãå«ã)ãç´¹ä»ãã¦ããã¾ãã</p>
<h3 id="ãã®åã«-Rust-ã§æ¸ãã¦ã©ãã ã£ãã">ãã®åã«: Rust ã§æ¸ãã¦ã©ãã ã£ãã</h3>
<p>ãã® CLI ã¯å¤é¨ã® API ãå¼ãã§ãã®çµæãã¡ããã£ã¨æ´å½¢ããã ããªã®ã§ Rust 以å¤ã®è¨èªã§å®è£
ãã¦ããã¨æãã¾ã<a href="#f-82d9f951" id="fn-82d9f951" name="fn-82d9f951" title="å¦çæéã¯å¤é¨ API å¼ã³åºãã®çµæã¾ã¡ãæ¯é
çãªã®ã§é度é¢ã®åªä½æ§ã¯ãã¾ããªãã§ãããã¡ã¢ãªå®å
¨ãæ´»ããå ´é¢ããã¾ããªã">*2</a>ãå¾è¿°ããããã« AWS SDK ã®ã¢ãã¯å®ç¾©ã Builder pattern ã§æ¸ãããçµæ§å¤§å¤ã ã£ãã®ã§ããã¨ãã° <a href="https://docs.aws.amazon.com/sdk-for-go/v2/developer-guide/unit-testing.html">Go SDK ã§ã¢ãã¯</a>ããæ¹ã楽ããããã¾ããã</p>
<p>ãã ããä½ãå§ãã¦ã¿ã㨠Rust 㧠CLI ãä½ãã®ã¯æå¤ã¨ã¹ã ã¼ãºã«ã§ãã¾ãããé£ãããã¨ããã¦ããªãããã¨ããã®ã¯ããã¾ãã 1 æéãããã§åããã®ãä½ãã¾ããã</p>
<p>ã¿ã¼ããã«ä¸ã§é¸æããã«ã¯ <code>dialoguer</code> ã¯ã¬ã¼ãããAWS API ãå¼ã¶ã«ã¯ AWS SDK for Rust ã使ãã¾ãããã©ã¡ãã example ãå°ãå¤ããã°ãããããã¨ãã§ãã¾ãããRust ã«ã¯ Result åã Option åãããã®ã§ãã£ã¡ãä½ãã¦ããã£ãã§ããèå³ãããããã¨ããçç±ã§ Rust ã§å®è£
ãã¾ããããããªã«æªããªãããã¨æãã¾ããã</p>
<h3 id="dialoguer-ã§ã¿ã¼ããã«ããã¹ãã¼ããã·ã³ãé¸ã¶">dialoguer ã§ã¿ã¼ããã«ããã¹ãã¼ããã·ã³ãé¸ã¶</h3>
<p>å®è¡å±¥æ´ã調ã¹ã対象ã®ã¹ãã¼ããã·ã³ãã¿ã¼ããã«ä¸ã§é¸ã¶ããã« <a href="https://github.com/console-rs/dialoguer"><code>dialoguer</code> ã¯ã¬ã¼ã</a> ã使ãã¾ããã<a href="https://docs.rs/dialoguer/latest/dialoguer/struct.Select.html#example">ããã¥ã¡ã³ã</a>ã«ããããã«ã¹ã©ã¤ã¹ã渡ãã¨ã¿ã¼ããã«ä¸ã§é¸ãã è¦ç´ ã®ã¤ã³ããã¯ã¹ãè¿ã£ã¦ãã¾ãã次ã®ããã«ã¹ãã¼ããã·ã³ã®ä¸è¦§ã渡ãã¦ãã¾ãã</p>
<pre class="code lang-rust" data-lang="rust" data-unlink><span class="synStatement">let</span> state_machine_names <span class="synStatement">=</span> <span class="synPreProc">vec!</span>[<span class="synConstant">"state_machine_1"</span>, <span class="synConstant">"state_machine_2"</span>]
<span class="synStatement">let</span> selection <span class="synStatement">=</span> <span class="synPreProc">Select</span><span class="synSpecial">::</span><span class="synIdentifier">new</span>()
.<span class="synIdentifier">with_prompt</span>(<span class="synConstant">"State Machine ãé¸æ"</span>)
.<span class="synIdentifier">items</span>(<span class="synType">&</span>state_machine_names)
.<span class="synIdentifier">interact</span>()
.<span class="synIdentifier">unwrap</span>();
</pre>
<h3 id="AWS-SDK-for-Rust-ã§ã¹ãã¼ããã·ã³ã®ä¸è¦§ãå®è¡å±¥æ´ãåå¾ãã">AWS SDK for Rust ã§ã¹ãã¼ããã·ã³ã®ä¸è¦§ãå®è¡å±¥æ´ãåå¾ãã</h3>
<p>AWS SDK for Rust ã¯ãµã¼ãã¹ãã¨ã«ã¯ã¬ã¼ããåããã¦ãã¦ãä»åæ±ã Step Functions 㯠<a href="https://docs.rs/aws-sdk-sfn/latest/aws_sdk_sfn/"><code>aws_sdk_sfn</code> ã¯ã¬ã¼ã</a>ãå
¬éããã¦ãã¾ããä¾ãã°ã¹ãã¼ããã·ã³ã®ä¸è¦§ãåå¾ãããªããããªæãã«ãªãã¾ã(次ã®ãµã³ãã«ã§ã¯ç°¡ç¥åã®ããã¨ã©ã¼ã¯ <code>unwrap()</code> ã§æ½°ãã¦ãã¾ããå®éã«ä½ã£ã CLI ã§ã¯ <a href="https://docs.rs/thiserror/latest/thiserror/"><code>thiserror</code></a> ã使ã£ã¦ã¨ã©ã¼å¦çãã¦ãã¾ã)ã</p>
<pre class="code lang-rust" data-lang="rust" data-unlink><span class="synStatement">use</span> aws_sdk_sfn <span class="synStatement">as</span> sfn;
<span class="synPreProc">#[::tokio::main]</span>
async <span class="synStatement">fn</span> <span class="synIdentifier">main</span>() <span class="synStatement">-></span> <span class="synType">Result</span><span class="synStatement"><</span>(), <span class="synPreProc">sfn</span><span class="synSpecial">::</span>Error<span class="synStatement">></span> {
<span class="synStatement">let</span> config <span class="synStatement">=</span> <span class="synPreProc">aws_config</span><span class="synSpecial">::</span><span class="synIdentifier">load_from_env</span>().await;
<span class="synStatement">let</span> client <span class="synStatement">=</span> <span class="synPreProc">aws_sdk_sfn</span><span class="synSpecial">::</span><span class="synPreProc">Client</span><span class="synSpecial">::</span><span class="synIdentifier">new</span>(<span class="synType">&</span>config);
<span class="synStatement">let</span> state_machines <span class="synStatement">=</span> client.<span class="synIdentifier">list_state_machines</span>().<span class="synIdentifier">send</span>().await.<span class="synIdentifier">unwrap</span>();
<span class="synConstant">Ok</span>(())
}
</pre>
<p><code>list_state_machines()</code> ã§ã¹ãã¼ããã·ã³ä¸è¦§ãã<code>list_executions()</code> ã§ããã¹ãã¼ããã·ã³ã®å®è¡ä¸è¦§ãã<code>get_execution_history()</code> ã§ã¹ãã¼ããã·ã³ã®ããå®è¡ã®ã¤ãã³ãå±¥æ´ãåå¾ãã¦å å·¥ããã°å¤±æããå®è¡ã®åå ãæ°ãããã¨ãã§ãã¾ãã</p>
<h3 id="AWS-SDK-for-Rust-ããã¹ããã">AWS SDK for Rust ããã¹ããã</h3>
<p><a href="https://docs.aws.amazon.com/sdk-for-rust/latest/dg/testing.html">å
¬å¼ããã¥ã¡ã³ã</a>ã« Rust SDK ã§ã¦ããããã¹ããå®è£
ããæ¹æ³ãæ¸ããã¦ãã¾ããä»å㯠<code>automock</code> ã使ããã¨ã«ãã¾ãããã¾ãå
¬å¼ããã¥ã¡ã³ãã 㨠<code>#[cfg(test)]</code> ã <code>#[cfg(not(test))]</code> ãã¤ãã¦æåãå¶å¾¡ãã¦ãã¾ããããã®æ¹æ³ã 㨠VSCode ãæ··ä¹±ããã®ã§æ¬¡ã®ããã« trait ãå®ç¾©ããããã«ãã¾ããã</p>
<pre class="code lang-rust" data-lang="rust" data-unlink><span class="synPreProc">#[cfg_attr(test, automock)]</span>
<span class="synStatement">pub</span> <span class="synStatement">trait</span> <span class="synIdentifier">SfnClient</span> {
async <span class="synStatement">fn</span> <span class="synIdentifier">list_state_machines</span>(
<span class="synType">&</span><span class="synConstant">self</span>,
) <span class="synStatement">-></span> <span class="synType">Result</span><span class="synStatement"><</span>ListStateMachinesOutput, <span class="synPreProc">sfn</span><span class="synSpecial">::</span><span class="synPreProc">error</span><span class="synSpecial">::</span>SdkError<span class="synStatement"><</span>ListStateMachinesError<span class="synStatement">>></span>;
async <span class="synStatement">fn</span> <span class="synIdentifier">list_executions</span>(
<span class="synType">&</span><span class="synConstant">self</span>,
state_machine_arn: <span class="synType">Option</span><span class="synStatement"><</span><span class="synType">String</span><span class="synStatement">></span>,
max_results: <span class="synType">Option</span><span class="synStatement"><</span><span class="synType">i32</span><span class="synStatement">></span>,
) <span class="synStatement">-></span> <span class="synType">Result</span><span class="synStatement"><</span>ListExecutionsOutput, <span class="synPreProc">sfn</span><span class="synSpecial">::</span><span class="synPreProc">error</span><span class="synSpecial">::</span>SdkError<span class="synStatement"><</span>ListExecutionsError<span class="synStatement">>></span>;
async <span class="synStatement">fn</span> <span class="synIdentifier">get_execution_history</span>(
<span class="synType">&</span><span class="synConstant">self</span>,
execution_arn: <span class="synType">Option</span><span class="synStatement"><</span><span class="synType">String</span><span class="synStatement">></span>,
) <span class="synStatement">-></span> <span class="synType">Result</span><span class="synStatement"><</span>GetExecutionHistoryOutput, <span class="synPreProc">sfn</span><span class="synSpecial">::</span><span class="synPreProc">error</span><span class="synSpecial">::</span>SdkError<span class="synStatement"><</span>GetExecutionHistoryError<span class="synStatement">>></span>;
}
</pre>
<p>ãããã¦ããã¨ãã¹ãã³ã¼ãã§ã¯æ¬¡ã®ããã« Mock ã®ã¯ã©ã¤ã¢ã³ãã使ããã¨ãã§ãã¾ãã</p>
<pre class="code lang-rust" data-lang="rust" data-unlink><span class="synPreProc">#[cfg(test)]</span>
<span class="synStatement">mod</span> <span class="synIdentifier">test</span> {
<span class="synStatement">use</span> <span class="synPreProc">super</span><span class="synSpecial">::</span><span class="synType">*</span>;
<span class="synStatement">use</span> <span class="synPreProc">mockall</span><span class="synSpecial">::</span><span class="synPreProc">predicate</span><span class="synSpecial">::</span>eq;
<span class="synStatement">use</span> <span class="synPreProc">sfn</span><span class="synSpecial">::</span><span class="synPreProc">primitives</span><span class="synSpecial">::</span>DateTime;
<span class="synStatement">use</span> <span class="synPreProc">sfn</span><span class="synSpecial">::</span><span class="synPreProc">types</span><span class="synSpecial">::</span>{
ExecutionListItem, ExecutionStatus, HistoryEvent, HistoryEventType, StateMachineListItem,
StateMachineType, TaskFailedEventDetails,
};
<span class="synStatement">fn</span> <span class="synIdentifier">setup_mock_client</span>() <span class="synStatement">-></span> MockSfnClient {
<span class="synStatement">let</span> <span class="synType">mut</span> mock <span class="synStatement">=</span> <span class="synPreProc">MockSfnClient</span><span class="synSpecial">::</span><span class="synIdentifier">default</span>();
<span class="synComment">// There are two state machines: stateMachine:1 and stateMachine:2</span>
mock.<span class="synIdentifier">expect_list_state_machines</span>().<span class="synIdentifier">return_once</span>(<span class="synStatement">||</span> {
<span class="synConstant">Ok</span>(<span class="synPreProc">ListStateMachinesOutput</span><span class="synSpecial">::</span><span class="synIdentifier">builder</span>()
.<span class="synIdentifier">set_state_machines</span>(<span class="synConstant">Some</span>(<span class="synPreProc">vec!</span>[
<span class="synPreProc">StateMachineListItem</span><span class="synSpecial">::</span><span class="synIdentifier">builder</span>()
.<span class="synIdentifier">set_state_machine_arn</span>(<span class="synConstant">Some</span>(
<span class="synConstant">"arn:aws:states:ap-northeast-1:012345678901:stateMachine:1"</span>.<span class="synIdentifier">to_string</span>(),
))
.<span class="synIdentifier">set_name</span>(<span class="synConstant">Some</span>(<span class="synConstant">"1"</span>.<span class="synIdentifier">to_string</span>()))
.<span class="synIdentifier">set_creation_date</span>(<span class="synConstant">Some</span>(<span class="synPreProc">DateTime</span><span class="synSpecial">::</span><span class="synIdentifier">from_secs</span>(<span class="synConstant">946_713_600</span>)))
.<span class="synIdentifier">set_type</span>(<span class="synConstant">Some</span>(<span class="synPreProc">StateMachineType</span><span class="synSpecial">::</span>Standard))
.<span class="synIdentifier">build</span>()
.<span class="synIdentifier">unwrap</span>(),
<span class="synPreProc">StateMachineListItem</span><span class="synSpecial">::</span><span class="synIdentifier">builder</span>()
.<span class="synIdentifier">set_state_machine_arn</span>(<span class="synConstant">Some</span>(
<span class="synConstant">"arn:aws:states:ap-northeast-1:012345678901:stateMachine:2"</span>.<span class="synIdentifier">to_string</span>(),
))
.<span class="synIdentifier">set_name</span>(<span class="synConstant">Some</span>(<span class="synConstant">"2"</span>.<span class="synIdentifier">to_string</span>()))
.<span class="synIdentifier">set_creation_date</span>(<span class="synConstant">Some</span>(<span class="synPreProc">DateTime</span><span class="synSpecial">::</span><span class="synIdentifier">from_secs</span>(<span class="synConstant">946_713_600</span>)))
.<span class="synIdentifier">set_type</span>(<span class="synConstant">Some</span>(<span class="synPreProc">StateMachineType</span><span class="synSpecial">::</span>Standard))
.<span class="synIdentifier">build</span>()
.<span class="synIdentifier">unwrap</span>(),
]))
.<span class="synIdentifier">build</span>()
.<span class="synIdentifier">unwrap</span>())
});
}
</pre>
<p>ãã®ããã« Mock ã®ã¯ã©ã¤ã¢ã³ããå®ç¾©ã㦠AWS API å¼ã³åºãããã¹ããã¤ã¤ã¹ãã¼ããã·ã³ã®å®è¡ä¸è¦§ããæ
å ±ãæ½åºããã³ã¼ããæ¸ããã¨ã§æçµçã«åé ã§ç´¹ä»ãããã㪠CLI ãä½ãã¾ããã</p>
<h3 id="AWS-SDK-for-Rust-ã®-tips">AWS SDK for Rust ã® tips</h3>
<ul>
<li>ãã°ã¬ãã«ã«æ³¨æãã</li>
</ul>
<p>AWS SDK for Rust 㯠<a href="https://docs.rs/tracing/latest/tracing/"><code>tracing</code></a> ã¯ã¬ã¼ãã使ã£ã¦ãã¦<a href="https://docs.aws.amazon.com/sdk-for-rust/latest/dg/logging.html">ããã¥ã¡ã³ã</a>ã«ããããã«ç°å¢å¤æ° <code>RUST_LOG</code> ã§åºåãããã°ã®ã¬ãã«ã調æ´ã§ãã¾ããDEBUG ã ã¨å¤ãã®ãã°ãåºã¦ãã¾ãã®ã§ INFO ãããã§åºãã <a href="https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#directives"><code>directive</code></a>ã使ã£ã¦ DEBUG ã§ãã°ãåºã target ãçµãè¾¼ãã§ããã¨ããã§ãã</p>
<pre class="code term" data-lang="term" data-unlink># DEBUG ã§åºã¦ãããã°(ããã§ãã»ãã®ä¸é¨)
2025-02-26T01:39:33.794696Z DEBUG aws_runtime::fs_util: loaded home directory src="HOME"
2025-02-26T01:39:33.795016Z DEBUG load_config_file{file=Default(Config)}: aws_runtime::env_config::source: performing home directory substitution home="/Users/hidekazu.karino" path="~/.aws/config"
2025-02-26T01:39:33.795073Z DEBUG load_config_file{file=Default(Config)}: aws_runtime::env_config::source: home directory expanded before="~/.aws/config" after="/Users/hidekazu.karino/.aws/config"
2025-02-26T01:39:33.795350Z DEBUG load_config_file{file=Default(Config)}: aws_runtime::env_config::source: config file loaded path=Some("/Users/hidekazu.karino/.aws/config") size=34
2025-02-26T01:39:33.795482Z DEBUG load_config_file{file=Default(Credentials)}: aws_runtime::env_config::source: performing home directory substitution home="/Users/hidekazu.karino" path="~/.aws/credentials"
2025-02-26T01:39:33.795499Z DEBUG load_config_file{file=Default(Credentials)}: aws_runtime::env_config::source: home directory expanded before="~/.aws/credentials" after="/Users/hidekazu.karino/.aws/credentials"
2025-02-26T01:39:33.795534Z DEBUG load_config_file{file=Default(Credentials)}: aws_runtime::env_config::source: config file not found path=~/.aws/credentials
2025-02-26T01:39:33.795563Z DEBUG load_config_file{file=Default(Credentials)}: aws_runtime::env_config::source: config file loaded path=Some("/Users/hidekazu.karino/.aws/credentials") size=0
2025-02-26T01:39:33.798279Z DEBUG aws_sdk_sts::endpoint_lib: loading default partitions
2025-02-26T01:39:33.962491Z DEBUG hyper_rustls::config: with_native_roots processed 161 valid and 0 invalid certs
2025-02-26T01:39:33.963139Z DEBUG aws_sdk_sfn::endpoint_lib: loading default partitions
2025-02-26T01:39:33.963565Z DEBUG invoke{service=sfn operation=ListStateMachines sdk_invocation_id=4509290}:apply_configuration: aws_smithy_runtime::client::orchestrator: timeout settings for this operation: TimeoutConfig { connect_timeout: Set(3.1s), read_timeout: Disabled, operation_timeout: Disabled, operation_attempt_timeout: Disabled }
2025-02-26T01:39:33.963653Z DEBUG invoke{service=sfn operation=ListStateMachines sdk_invocation_id=4509290}:try_op: aws_smithy_runtime_api::client::interceptors::context: entering 'serialization' phase
2025-02-26T01:39:33.963885Z DEBUG invoke{service=sfn operation=ListStateMachines sdk_invocation_id=4509290}:try_op: aws_smithy_runtime_api::client::interceptors::context: entering 'before transmit' phase
2025-02-26T01:39:33.963950Z DEBUG invoke{service=sfn operation=ListStateMachines sdk_invocation_id=4509290}:try_op: aws_smithy_runtime::client::retries::strategy::standard: no client rate limiter configured, so no token is required for the initial request.
2025-02-26T01:39:33.963960Z DEBUG invoke{service=sfn operation=ListStateMachines sdk_invocation_id=4509290}:try_op: aws_smithy_runtime::client::orchestrator: retry strategy has OKed initial request
2025-02-26T01:39:33.963983Z DEBUG invoke{service=sfn operation=ListStateMachines sdk_invocation_id=4509290}:try_op: aws_smithy_runtime::client::orchestrator: beginning attempt #1
2025-02-26T01:39:33.964026Z DEBUG invoke{service=sfn operation=ListStateMachines sdk_invocation_id=4509290}:try_op:try_attempt: aws_smithy_runtime::client::orchestrator::endpoints: resolving endpoint endpoint_params=EndpointResolverParams(TypeErasedBox[!Clone]:Params { region: Some("ap-northeast-1"), use_dual_stack: false, use_fips: false, endpoint: None }) endpoint_prefix=None
2025-02-26T01:39:33.964051Z DEBUG invoke{service=sfn operation=ListStateMachines sdk_invocation_id=4509290}:try_op:try_attempt: aws_smithy_runtime::client::orchestrator::endpoints: will use endpoint Endpoint { url: "https://states.ap-northeast-1.amazonaws.com", headers: {}, properties: {} }
2025-02-26T01:39:33.964221Z DEBUG invoke{service=sfn operation=ListStateMachines sdk_invocation_id=4509290}:try_op:try_attempt:lazy_load_identity:provide_credentials{provider=default_chain}: aws_config::meta::credentials::chain: loaded credentials provider=Environment
2025-02-26T01:39:33.964250Z DEBUG invoke{service=sfn operation=ListStateMachines sdk_invocation_id=4509290}:try_op:try_attempt:lazy_load_identity: aws_smithy_runtime::client::identity::cache::lazy: identity cache miss occurred; added new identity (took 53µs) new_expiration=2025-02-26T01:54:33.964184Z valid_for=899.999935s partition=IdentityCachePartition(7)
2025-02-26T01:39:33.964297Z DEBUG invoke{service=sfn operation=ListStateMachines sdk_invocation_id=4509290}:try_op:try_attempt: aws_smithy_runtime::client::identity::cache::lazy: loaded identity
2025-02-26T01:39:33.964598Z DEBUG invoke{service=sfn operation=ListStateMachines sdk_invocation_id=4509290}:try_op:try_attempt: aws_smithy_runtime_api::client::interceptors::context: entering 'transmit' phase
2025-02-26T01:39:33.964622Z DEBUG invoke{service=sfn operation=ListStateMachines sdk_invocation_id=4509290}:try_op:try_attempt: aws_smithy_runtime::client::http::hyper_014: new TCP connector created in 0ns
2025-02-26T01:39:33.964729Z DEBUG invoke{service=sfn operation=ListStateMachines sdk_invocation_id=4509290}:try_op:try_attempt: aws_smithy_runtime::client::http::body::minimum_throughput: applying minimum upload throughput check future options=MinimumThroughputBodyOptions { minimum_throughput: Throughput { bytes_read: 1, per_time_elapsed: 1s }, grace_period: 5s, check_window: 1s }</pre>
<ul>
<li>Builder pattern ã«æ
£ãã</li>
</ul>
<p>Rust SDK ã§ã¯ã©ã¤ã¢ã³ããã¢ãã¯ããå ´åã¯ã¾ã <code>MockSfnClient</code> ãä½æãã¾ããããã¦ã¢ãã¯ã¯ã©ã¤ã¢ã³ãã«å¯¾ã㦠<code>expect_list_state_machines()</code> ãªã©ãå®ç¾©ãã <code>MockSfnClient.list_state_machines()</code> ãå¼ã°ããæã«è¿ããã®ãå®ç¾©ããæµãã«ãªãã¾ããä¾ãã° <code>list_state_machines()</code> 㯠<a href="https://docs.rs/aws-sdk-sfn/latest/aws_sdk_sfn/operation/list_state_machines/struct.ListStateMachinesOutput.html"><code>ListStateMachinesOutput</code></a>æ§é ä½ãè¿ãã®ã§ãããã®æ§é ä½ã¯ Builder pattern ã§å®ç¾©ãã¦ãããã¨ã«ãªãã¾ãã</p>
<p>Builder pattern ã§ã¯æ§é ä½ã® field ãåããã®ã« <code>set_<field å></code> ã¡ã½ãããå¼ãã§ããæå¾ã« <code>build()</code> ãã¦æ§é ä½ãä½æãã¾ãã次ã®ä¾ã 㨠<code>ListStateMachinesOutput</code> æ§é ä½ã <code>next_token</code>, <code>state_machines</code> field ãæã£ã¦ã¾ãããã®ãããã®å¤ãåããã®ã«ãããã <code>builder.set_next_token()</code> 㨠<code>builder.set_state_machines()</code> ãå¼ãã§ãã¾ãã</p>
<pre class="code lang-rust" data-lang="rust" data-unlink><span class="synStatement">struct</span> <span class="synIdentifier">ListStateMachinesOutput</span> {
<span class="synStatement">pub</span> next_token: <span class="synSpecial">::</span><span class="synPreProc">std</span><span class="synSpecial">::</span><span class="synPreProc">option</span><span class="synSpecial">::</span><span class="synType">Option</span><span class="synStatement"><</span><span class="synSpecial">::</span><span class="synPreProc">std</span><span class="synSpecial">::</span><span class="synPreProc">string</span><span class="synSpecial">::</span><span class="synType">String</span><span class="synStatement">></span>,
<span class="synStatement">pub</span> state_machines: <span class="synSpecial">::</span><span class="synPreProc">std</span><span class="synSpecial">::</span><span class="synPreProc">vec</span><span class="synSpecial">::</span><span class="synType">Vec</span><span class="synStatement"><</span><span class="synError">crate</span><span class="synSpecial">::</span><span class="synPreProc">types</span><span class="synSpecial">::</span>StateMachineListItem<span class="synStatement">></span>,
_request_id: <span class="synType">Option</span><span class="synStatement"><</span><span class="synType">String</span><span class="synStatement">></span>,
}
<span class="synStatement">let</span> builder <span class="synStatement">=</span> <span class="synPreProc">ListStateMachinesOutput</span><span class="synSpecial">::</span><span class="synIdentifier">builder</span>();
<span class="synStatement">let</span> output <span class="synStatement">=</span> builder.<span class="synIdentifier">set_next_token</span>(<span class="synConstant">Some</span>(<span class="synConstant">"token"</span>)).<span class="synIdentifier">set_state_machines</span>(<span class="synConstant">Some</span>(<span class="synPreProc">vec!</span>[state_machine_list_item_1,state_machine_list_item_2])).<span class="synIdentifier">build</span>().<span class="synIdentifier">unwrap</span>();
</pre>
<p>å
ã»ã©ã®ä¾ã ã¨çç¥ãã¾ããã <code>set_state_machines()</code> ã®å¼æ°ã® <code>StateMachineListItem</code> ã Builder pattern ã§ä½æããå¿
è¦ãããã¾ããä»åã ã¨ã¢ãã¯ãå®ç¾©ããã ã㧠150 è¡ã»ã©ããã£ãã®ã§ç¹°ãè¿ãå®ç¾©ããæ§é ä½ã¯ãã«ãã¼é¢æ°ãä½ã£ã¦ä½æããæ¹ãããããããã¾ããã</p>
<h2 id="We-are-hiring">We are hiring!</h2>
<p>AIã»æ©æ¢°å¦ç¿ãã¼ã ã§ã¯ãæ段㯠Rust ã«éããã¨ãã¡ãã£ã¨ãããã¼ã«ã®èªä½ã楽ããããããªã¨ã³ã¸ãã¢ãåéãã¦ãã¾ãã 次ã®ãªã³ã¯ãããå¿åãå¾
ã¡ãã¦ãã¾ãï¼</p>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjobs.m3.com%2Fengineer%2F" title="ã¨ã³ã¸ãã¢æ¡ç¨ãµã¤ãï½æ¡ç¨æ
å ± | å»çÃãã¯ããã¸ã¼ã®å¯è½æ§ã¯ç¡é大" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jobs.m3.com/engineer/">jobs.m3.com</a></cite></p>
<div class="footnote">
<p class="footnote"><a href="#fn-d438c71c" id="f-d438c71c" name="f-d438c71c" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">Python ã§ãããããªã¨æãã¾ããã boto3 ãã¢ãã¯ããã©ã¤ãã©ãªã® <a href="https://docs.getmoto.org/en/latest/docs/services/stepfunctions.html">moto 㧠Step Functions ã® API ãããã¤ã対å¿ãã¦ããªã</a>ã®ã§è¦éãã¾ããã</span></p>
<p class="footnote"><a href="#fn-82d9f951" id="f-82d9f951" name="f-82d9f951" class="footnote-number">*2</a><span class="footnote-delimiter">:</span><span class="footnote-text">å¦çæéã¯å¤é¨ API å¼ã³åºãã®çµæã¾ã¡ãæ¯é
çãªã®ã§é度é¢ã®åªä½æ§ã¯ãã¾ããªãã§ãããã¡ã¢ãªå®å
¨ãæ´»ããå ´é¢ããã¾ããªã</span></p>
</div>
hidekazu3
ãã½ããã¦ã§ã¢ã¨ã³ã¸ãã¢ã¤ã³ã¿ã¼ã³åæ¦è¨ãã¯ã©ã¦ãåé»åã«ã«ãã®ãªã¯ã¨ã¹ãæ°ã13%åæ¸ãã話
hatenablog://entry/6802418398328125728
2025-02-18T11:00:00+09:00
2025-03-04T12:16:49+09:00 ã¯ããã¾ãã¦ï¼ã¨ã ã¹ãªã¼ã®ãã¸ã«ã«ãã¼ã ã§ã½ããã¦ã§ã¢ã¨ã³ã¸ãã¢ã¨ãã¦ã¤ã³ã¿ã¼ã³ã·ããã«åå ããè¤åã§ãã ãã®è¨äºã§ã¯ã¤ã³ã¿ã¼ã³ä¸ã«è¡ãªã£ãã¿ã¹ã¯å
容ã¨ã¨ã ã¹ãªã¼ã§ã®ã¤ã³ã¿ã¼ã³ã·ããã®ææ³ãå¦ã³ããä¼ããã¾ãï¼ ã¨ã ã¹ãªã¼ã§ã®åãæ¹ãªã©ããä¼ããã¦ãã¤ã³ã¿ã¼ã³ãå°±è·ãèãã¦ããä»ã®å¦çã®åèã«ãªããã¨ãé¡ã£ã¦ãã¾ãï¼
<p>ã¯ããã¾ãã¦ï¼ã¨ã ã¹ãªã¼ã®ãã¸ã«ã«ãã¼ã ã§ã½ããã¦ã§ã¢ã¨ã³ã¸ãã¢ã¨ãã¦ã¤ã³ã¿ã¼ã³ã·ããã«åå ããè¤åã§ãã</p>
<p>ãã®è¨äºã§ã¯ã¤ã³ã¿ã¼ã³ä¸ã«è¡ãªã£ãã¿ã¹ã¯å
容ã¨ã¨ã ã¹ãªã¼ã§ã®ã¤ã³ã¿ã¼ã³ã·ããã®ææ³ãå¦ã³ããä¼ããã¾ãï¼</p>
<p>ã¨ã ã¹ãªã¼ã§ã®åãæ¹ãªã©ããä¼ããã¦ãã¤ã³ã¿ã¼ã³ãå°±è·ãèãã¦ããä»ã®å¦çã®åèã«ãªããã¨ãé¡ã£ã¦ãã¾ãï¼</p>
<h2 id="èªå·±ç´¹ä»">èªå·±ç´¹ä»</h2>
<p>ç§ã¯æ®æ®µã¯æ±äº¬çç§å¤§å¦ã®ä¿®å£«1å¹´ã§ãã¸ã¿ã«éä¿¡ã«é¢ããç 究ãè¡ãªã£ã¦ãã¾ãã
UWBï¼Ultra Wide Bandï¼ã¨ããé«ç²¾åº¦ãªæ¸¬è·æ¸¬ä½ç²¾åº¦ãèªãéä¿¡æ¹å¼ã®ç 究ããã¦ãã¾ãããã®æè¡ã¯ä½ç½®æ¸¬ä½ã·ã¹ãã ãªã©ã«æ´»ç¨ããã¦ãã¾ããå
·ä½çã«ã¯AirTagãiPhoneãªã©ã«ãæ´»ç¨ããã¦ãããæ¢ããã«ã使ããã¦ããæè¡ã§ãã</p>
<h2 id="æ¥åå
容">æ¥åå
容</h2>
<p>ã¤ã³ã¿ã¼ã³ã·ããã®æ¥åå
容ã¯å®éã®ãã¼ã ã«ã¢ãµã¤ã³ããã2é±éã§ç°å¢æ§ç¯ã»å®è£
ã»ãã¹ããè¡ãããã±ãããæ¶åãã¦ããã¹ã¿ã¤ã«ã§ãã</p>
<p>ã¾ããã¿ã¹ã¯ã®å
容ãã¡ã³ã¿ã¼ã®æ¹ã¨ç¸è«ããªãããé¸æã§ãããã«ãªã¼ãã¼ã¡ã¤ãåã¨ããé¨åãé
åã§ããç§ãã¢ãµã¤ã³ããããã¼ã ã®ãããã¯ãã§ããã<a href="https://digikar.m3.com/">ãã¸ã«ã«</a>ã¯ã¯ã©ã¦ãåã®é»åã«ã«ããµã¼ãã¹ã§7000件ãè¶
ããå°å
¥ä»¶æ°ã®å®ç¸¾ããã大è¦æ¨¡ãªãããã¯ãã§ãã</p>
<p>ãã®ãããªå¤§è¦æ¨¡ãªãµã¼ãã¹ãªãã§ã¯ã®ã¿ã¹ã¯ãããã ããæè¡çã«ãæé·ãããã¨æãããã®æ¨ãä¼ããã¨ãããããã©ã¼ãã³ã¹åä¸ã«é¢ããã¿ã¹ã¯ãããã ãã¾ããã</p>
<p>å
·ä½çãªã¿ã¹ã¯å
容ã¨ãã¦ã¯ãããã©ã¦ã¶ã§2æ¬ã®ãã£ã³ãã«ã§ãã³ã°ãã¼ãªã³ã°ãã¦ããé¨åã1æ¬åãããã¨ã«ãã£ã¦ãªã¯ã¨ã¹ãæ°ãåæ¸ãããã¨ããã¿ã¹ã¯ã§ããããããã¿ã¹ã¯ã®èæ¯ã詳細ããä¼ããã¦ããã¾ãã</p>
<h3 id="åæ">åæ</h3>
<p>ã¾ããåæã¨ãã¦ãè¦æ¨¡ã大ãããªãã«ã¤ãã¦å¢ãã¤ã¤ãããã¸ã«ã«ã®ãªã¯ã¨ã¹ãæ°ãåæ¸ãããã¨ããæããããã¾ãã</p>
<h3 id="èæ¯">èæ¯</h3>
<p>ã¿ã¹ã¯ã®èæ¯ã¨ãã¦ã¯ãç¾å¨ããã¸ã«ã«ã«ããã¦ã³ãã¯ã·ã§ã³æ°ãå¢ãããªã¯ã¨ã¹ãæ°ãå¢å ãã¦ãã¾ãããã®ä¸ã§ãã³ã°ãã¼ãªã³ã°ãã¦ãã2ã¤ã®ãã£ã³ãã«ããªã¯ã¨ã¹ãæ°ã®ç´26%ãæ¶è²»ãã¦ãã¾ãããã®é¨åãæé©åãããã¨ã«ãã£ã¦ãªã¯ã¨ã¹ãæ°ã®åæ¸ã«ã¤ãªããã¾ããå
·ä½çã«ã¯ãã³ã°ãã¼ãªã³ã°ãã¦ãããã£ã³ãã«ã1æ¬åã§ããã°ãæå¾
å¤ã¨ãã¦ã¯ç´13%ã»ã©ã®ãªã¯ã¨ã¹ãæ°åæ¸ãæå¾
ã§ãã¾ãã</p>
<p>ãã®ããããã¸ãã¹é¢ãä»å¾ã®å®è£
é¢ã§ãé常ã«ã¤ã³ãã¯ãã大ããã¿ã¹ã¯ã«ãªãã¾ãã</p>
<h3 id="æè¡ã¹ã¿ãã¯">æè¡ã¹ã¿ãã¯</h3>
<p>ãã³ã°ãã¼ãªã³ã°ã®é¨åã¯<a href="https://github.com/saiya/dsps">DSPS</a>ã¨ããGo製ã®Pub/Subãµã¼ãã¼ã®ã©ã¤ãã©ãªãç¨ãã¦å®è£
ãã¦ãã¾ãã</p>
<p><figure class="figure-image figure-image-fotolife" title="DSPSæ§æå³"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20250218/20250218110005.png" width="800" height="370" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>DSPSæ§æå³</figcaption></figure></p>
<p>DSPSãç¨ããã¡ãªããã¨ãã¦ã¯ãRedisã¨ã®é£æºãJWTã®è¨å®ã容æãã©ã¤ãã©ãªåããã¦ãããããå®è£
ãç°¡æ½ã«è¡ããã¨ããç¹ãããã¾ãã</p>
<p>ãã®ä»ãããã¯ã¨ã³ãã¯Ruby(Ruby on Rails)ãããã³ãã¨ã³ãã¯TypeScript(React)ãç¨ãã¦ãã¾ãã</p>
<h2 id="åãçµãã ã¿ã¹ã¯">åãçµãã ã¿ã¹ã¯</h2>
<p>ãã£ããã¨ã¨ãã¦ã¯å¤§ãã3ç¹ããã¾ã</p>
<ul>
<li>DSPSã«ããã¦ãã³ã°ãã¼ãªã³ã°ã1æ¬åããããã®æ°ãããã£ã³ãã«ãå®ç¾©</li>
<li>ããã¯ã¨ã³ãå´ã§æ°ãããã£ã³ãã«ã«ãªã¯ã¨ã¹ããéä¿¡ã§ãããããªå®è£
</li>
<li>ããã³ãã¨ã³ãã§å¦çãéè¤ããªãããã«å
±éå</li>
</ul>
<p>ãã³ã°ãã¼ãªã³ã°ã®å¦çã¯DSPSãµã¼ãã¼ã¨Pub/Subãµã¼ãã¼ä¸¡æ¹ã§åãã¦ããé¨åããã£ããããDSPSãµã¼ãã¼ã§éä¿¡ãè¡ããããã«ä¸é¨ç§»è¡ãã¾ãããDSPSãµã¼ãã¼ã¸ã®ç§»è¡é¨åããããã³ãã¨ã³ãå¦çã®å
±éåã¯ä»å¾ã®ç§»è¡ã®éã®å©ãã«ãªãã°å¬ããã§ãã</p>
<p>ã¾ããDSPSãµã¼ãã¼ã¸ã®åãæ¿ãããã£ã³ãã«ã®1æ¬åã«ãããæ¢åã®ãã¹ãã«éããªããªãé¨åãå¤ãã£ãããããã¹ãã³ã¼ãã®ä¿®æ£ãè¡ããã¨ãã§ãã¾ããã</p>
<h2 id="ã¤ã³ã¿ã¼ã³ã·ãããéãã¦ã®ææ³">ã¤ã³ã¿ã¼ã³ã·ãããéãã¦ã®ææ³</h2>
<p>ã¨ã ã¹ãªã¼ã®ã¤ã³ã¿ã¼ã³ã·ããã§ã¯æ§ã
ãªè²´éãªçµé¨ãã§ããééããªãä»å¾ã®ç§ã«ã¨ã£ã¦ã糧ã¨ãªãã¨æãã¾ãããå
·ä½çãªè¦ç´ ããããããä¼ããã¾ãã</p>
<h3 id="ãã£ã¦ããã®ç²¾ç¥">ããã£ã¦ãããã®ç²¾ç¥</h3>
<p>ã¨ã ã¹ãªã¼ã®ã½ããã¦ã§ã¢ã¨ã³ã¸ãã¢ã®æ大ã®ç¹å¾´ã¨ãã¦ã¯ãããã¯ã¨ã³ããããã³ãã¨ã³ããªã©ã¨ãã£ãå½¹å²ãåããã¦ããããã¿ã¹ã¯ãã¼ã¹ã§ããã³ãããã¤ã³ãã©ã¾ã§ä¸è²«ãã¦å®è£
ããã¨ããé¨åã§ããç§èªèº«ãããã³ãã¨ã³ãã®çµé¨ãå°ãªãã£ããããå®è£
ã®ãã£ããã¢ãããæè¡ã身ã«ã¤ããé¨åã«æããã£ã¦ãã¾ãé¨åã¯å¤ãã£ãã§ãããä¸æ°ã«éä¸ãã¦åãçµãã ããããã®çæéã§ãããªãç解ãé²ã¿ãå®è£
ãããåããã¨ãã§ãã¾ãããã¾ããã¡ã³ã¿ã¼ã®æ¹ã¨ãã¢ããã®ãããªå½¢ã§ãµãã¼ãããã¦ããã ãæ©ä¼ããããç´°ããªä½æ³ãéçºææ³ã«ã¤ãã¦ãå¦ã¶é¨åãé常ã«å¤ãã£ãã§ãã</p>
<p>年次ã«é¢ãããã§ãã人ã«ä»»ãã¦ããæåã§ããããã®åæã«ã¯æè¡åã®é«ã人ã
ãéã¾ã£ã¦ããç°å¢ã§ããããããã ã¨æãã¾ããã</p>
<p>ã¾ããæè¡ãç®çã§ã¯ãªãããããã¯ããããè¯ããã¦ããããã«é«ãæè¡åãæ´»ããã¦ããã¾ãããããã¯ããããè¯ããã¦ãããããã¨ããæããéçºã¸ã®ã¢ããã¼ã·ã§ã³ã«ã¤ãªããã¨ããé¨åã¯èªç¤¾éçºãªãã§ã¯ã®ã¡ãªããã ã¨æãã¾ãããç§ããããã¯ãã«æ
ç±ã注ãã§éçºã«åãçµã¿ããã¨æã£ã¦ããã®ã§ããã®ç°å¢ã®ä¸ã§éçºã§ããã®ãè¯ãã£ãã§ãã</p>
<h3 id="社å
ã®é°å²æ°ãèã§æãããã¨ãã§ãã">社å
ã®é°å²æ°ãèã§æãããã¨ãã§ãã</h3>
<p>ã¤ã³ã¿ã¼ã³æéä¸ã¯ç¤¾å¡ã¨åãããã«å®ä¾ãã¼ãã£ã³ã°ãã¤ãã³ãã«åå ããã¦ããã ãã社å
ã®é°å²æ°ãèã§æãããã¨ãã§ãã¾ããã</p>
<p>æã«ã¯Daily Scrumã¨ããåæ¥ã®é²æ確èªã¨å½æ¥ã®ãããã¨ãæ¦ãåãããä¼ãããããããªã¢ã¼ãã§ãã¢ã©ã¼ããä¸ããããç°å¢ã«ããã¾ããã¾ããzoomã§ã¯ãã£ããã常ã«çãä¸ãã£ã¦ãããããä¼ããããã¨ãä¼ããããç°å¢ã«ãããã³ãã¥ãã±ã¼ã·ã§ã³ãã¹ãèµ·ããã«ããç°å¢ã«ãªã£ã¦ããç¹ãé常ã«è¯ãã¨æãã¾ããã</p>
<p>Tech Talkã¨ãã社å
ã®LTä¼ãã社å
ã®ã¨ã³ã¸ãã¢ãä¸åã«éã¾ã£ã¦ãã¬ãã¸ãå
±æãåããã¼ãã£ã³ã°ã«ãåå ããã¦ããã ãã¾ãããã¤ã³ã¿ã¼ã³ã·ããã«åå ããåã«ã¨ã ã¹ãªã¼ã®å°è±¡ã¨ãã¦ãã®ã¼ã¯ãªäººã
ã®éå£ãã¨ããã¤ã¡ã¼ã¸ãããã¾ããããã¾ãã«ãããä½æãããããªä¼ã§ããããã®ãããªç°å¢ã§éãããã¨ã§å¸¸ã«åºæ¿ãåãç¶ãããã¨ãã§ããç°å¢ã«ããã¨æãã¾ããã¾ããèªåã®åºæºã常ã«é«ãä½ç½®ã«ç½®ããç°å¢ã«ããã¨æãã¾ããã</p>
<p><a href="https://www.youtube.com/@m3techchannel160">ã¨ã ã¹ãªã¼ã®å
¬å¼ããã¯ãã£ã³ãã«</a>ã§ããã®é°å²æ°ãæãããã¨ãã§ããã¨æãã®ã§èå³ã®ããæ¹ã¯ãã²è¦ã¦ã¿ã¦ä¸ããï¼</p>
<h3 id="大è¦æ¨¡ãµã¼ãã¹ã«è§¦ãããã¨ãã§ãã">大è¦æ¨¡ãµã¼ãã¹ã«è§¦ãããã¨ãã§ãã</h3>
<p>大è¦æ¨¡ãªãããã¯ãã®ãªã¯ã¨ã¹ãæ°ãåæ¸ããããã©ã¼ãã³ã¹ãåä¸ããããã¨ããçµé¨ã¯å¦çã§ã¯ä¸ã
çµé¨ããæ©ä¼ã¯ãªãã¨æãã¾ãããã®ãããªã¿ã¹ã¯ãä»»ãã¦ããã ããå®è£
ã§ããã®ã¯é常ã«ç¨æãªçµé¨ã«ãªããä»åã®çµé¨ãèªåã®é ã®ä¸ã®ãªã½ã¼ã¹ã«ã¹ããã¯ããããã¨ã«ãããä»å¾ã®ã¨ã³ã¸ãã¢äººçã«ããã¦å©ãã«ãªãæãæ¥ãã®ã§ã¯ãªããã¨æãã¾ããã</p>
<h3 id="ãã¾ã">ãã¾ã</h3>
<p>2é±éã®ã¤ã³ã¿ã¼ã³ã·ããã®å
ãåæ¥ã¨æçµæ¥ã«åºç¤¾ããã®ã§ãããåºç¤¾æ¥ã«ã¯ã©ã³ããã馳走ã«ãªã£ãããæ¥åå¾ã«ã¯é£²ã¿ä¼ã«ãèªã£ã¦ããã ãã¾ããï¼
æ¥åé¢ä¿ãªãã就活ã®è©±ãä»å¾ã®äººçã®è©±ããã®ä»è²ã
ãªè©±ããããã¨ãã§ããå¯åº¦ã®æ¿ããå¿ããããªã2é±éã«ãªãã¾ããï¼
<figure class="figure-image figure-image-fotolife" title="åºç¤¾æã®ã©ã³ã"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20250218/20250218110008.jpg" width="800" height="600" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>åºç¤¾æã®ã©ã³ã</figcaption></figure></p>
<h2 id="æå¾ã«">æå¾ã«</h2>
<p>ä¸è¬çãªã¤ã³ã¿ã¼ã³ã·ããã¯å¦çä½äººãã«å¯¾ãã¦ãéå¬ãããã¨ãããå¤ãã¨æãã¾ããã¨ã ã¹ãªã¼ã®ã¤ã³ã¿ã¼ã³ã·ããã¯åºæ¬çã«ã¯æéä¸ã¯å¦ç1人ããã¼ã ã«ã¢ãµã¤ã³ãããã¡ã³ã¿ã¼ãã¤ãã¦å®éã®ã¿ã¹ã¯ãéè¡ãã¦ããã¹ã¿ã¤ã«ã§ãããã®ãããã«ãªã¼ãã¼ã¡ã¤ãã§é常ã«å¯åº¦ã®é«ããæé·ã§ããç°å¢ãæ´ã£ã¦ãã¾ããæè¡çã«é£ããé¨åãè¦å´ããé¨åãå¤ãã£ãã§ããããããä¹ãè¶ãããã³ã«æé·ãå®æãã¾ããã</p>
<p>èå³ãããæ¹ã¯ãã²ã¨ã³ããªã¼ãã¦ã¿ã¦ãã ããï¼</p>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fopen.talentio.com%2Fr%2F1%2Fc%2Fm3%2Fhomes%2F4354" title="ãæ°åãã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ã åéä¸è¦§ / ã¨ã ã¹ãªã¼æ ªå¼ä¼ç¤¾" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://open.talentio.com/r/1/c/m3/homes/4354">open.talentio.com</a></cite></p>
tsunufu
ãããã¯ãããã¼ã¸ã£ã¼ã売ã£ããã¨ã®ãªããããã¯ãã¯ï¼ççºçã«ã¯ï¼å£²ããªã
hatenablog://entry/6802418398325726328
2025-02-06T11:00:00+09:00
2025-02-06T11:00:00+09:00 ããã«ã¡ã¯ãã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ããããã¯ãããã¼ã¸ã£ã¼ã®éªå£ã§ãã ç§ã¯å»å¸«åãã®ã¢ã³ã±ã¼ã調æ»ããã®ãã¼ã¿åæãææãããªãµã¼ããããã¯ããã¼ã ã«æå±ãããã¼ã ã®ãã¸ã§ã³ããã¼ã¿ã¨ãã¯ããã¸ã¼ãæ´»ç¨ããå»çã«é¢ããææ決å®ã¨ã¢ã¯ã·ã§ã³ããç¡é§ãªããæ£ãããæéã«ããããå®ç¾ãããããæ¥ã
奮éãã¦ãã¾ãã ãã®è¨äºã§ã¯ããããããã¯ãã®ãªãã¥ã¼ã¢ã«ã«ã¦èªããã»ã¼ã«ã¹æ´»åã«å¥èµ°ãããã¨ã§å¾ããã¨ãã§ããå¦ã³ãå
±æãããã¨æãã¾ãã ãããã¯ããªãã¥ã¼ã¢ã«ã®èæ¯ ã¯ã©ã¤ã¢ã³ãããã®è©ä¾¡ã¨èª²é¡ 俺ã¯æå¼·ã®ã»ã¼ã«ã¹ã«ãªãï¼ 1.顧客ã®è§£å度ãä¸ããã売ããããã®ã¡ãã»ã¼ã¸ãè¦ã¤ãã£ã 2.ãããã¯â¦
<p>ããã«ã¡ã¯ãã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ããããã¯ãããã¼ã¸ã£ã¼ã®éªå£ã§ãã<br/>
ç§ã¯å»å¸«åãã®ã¢ã³ã±ã¼ã調æ»ããã®ãã¼ã¿åæãææãããªãµã¼ããããã¯ããã¼ã ã«æå±ãããã¼ã ã®ãã¸ã§ã³ããã¼ã¿ã¨ãã¯ããã¸ã¼ãæ´»ç¨ããå»çã«é¢ããææ決å®ã¨ã¢ã¯ã·ã§ã³ããç¡é§ãªããæ£ãããæéã«ããããå®ç¾ãããããæ¥ã
奮éãã¦ãã¾ãã<br/>
ãã®è¨äºã§ã¯ããããããã¯ãã®ãªãã¥ã¼ã¢ã«ã«ã¦èªããã»ã¼ã«ã¹æ´»åã«å¥èµ°ãããã¨ã§å¾ããã¨ãã§ããå¦ã³ãå
±æãããã¨æãã¾ãã
<span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20250205/20250205205330.png" width="800" height="496" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p>
<ul class="table-of-contents">
<li><a href="#ãããã¯ããªãã¥ã¼ã¢ã«ã®èæ¯">ãããã¯ããªãã¥ã¼ã¢ã«ã®èæ¯</a></li>
<li><a href="#ã¯ã©ã¤ã¢ã³ãããã®è©ä¾¡ã¨èª²é¡">ã¯ã©ã¤ã¢ã³ãããã®è©ä¾¡ã¨èª²é¡</a></li>
<li><a href="#俺ã¯æå¼·ã®ã»ã¼ã«ã¹ã«ãªã">俺ã¯æå¼·ã®ã»ã¼ã«ã¹ã«ãªãï¼</a><ul>
<li><a href="#1顧客ã®è§£å度ãä¸ãã売ããããã®ã¡ãã»ã¼ã¸ãè¦ã¤ãã£ã">1.顧客ã®è§£å度ãä¸ããã売ããããã®ã¡ãã»ã¼ã¸ãè¦ã¤ãã£ã</a></li>
<li><a href="#2ãããã¯ããã¼ã ã¸å¸æãæã¡è¾¼ãã">2.ãããã¯ããã¼ã ã¸å¸æãæã¡è¾¼ãã</a></li>
<li><a href="#3å¶æ¥ã¡ã³ãã¼ã®æ¬ãããã¯ãã«å¯¾ãããã©ã¤ãªãªãã£ãããã£ã">3.å¶æ¥ã¡ã³ãã¼ã®æ¬ãããã¯ãã«å¯¾ãããã©ã¤ãªãªãã£ãããã£ã</a></li>
</ul>
</li>
<li><a href="#ãããã«">ãããã«</a></li>
<li><a href="#We-are-hiring">We are hiring!!</a></li>
</ul>
<h2 id="ãããã¯ããªãã¥ã¼ã¢ã«ã®èæ¯">ãããã¯ããªãã¥ã¼ã¢ã«ã®èæ¯</h2>
<p>ä»åææãããããã¯ãã®ãªãã¥ã¼ã¢ã«ã¯ãã¬ã¼ã ã¯ã¼ã¯ã¨è¨èªãã¼ã¸ã§ã³ã®ã¢ãããã¼ãã¨ãã¦ã¹ã¿ã¼ããããã®ã§ãããããå©ç¨ããã ãã¦ããã¯ã©ã¤ã¢ã³ãã«ã¤ã³ã¿ãã¥ã¼ããã¨ããããã¢ã³ã±ã¼ã調æ»ãã¨ã¦ãæ©ãå®æ½ã§ããããããªã¼ãã¿ã¤ã ãçãå ´åã¯ããã®ãããã¯ãä¸æãã¨ã¹ãã¼ãã«ã¤ãã¦ãé«ãè©ä¾¡ãå¾ã¦ãããã¨ãåããã¾ããã<br/>
ããã§ãç§ãã¡ã¯ããã®ãããã¯ãã¯ã¾ã ã¾ã 伸ã³ãããããã¯ãã ï¼ãã¨èããåãªãã·ã¹ãã æ´æ¹ã§çµããããã®ã§ã¯ãªãããã¯ã©ã¤ã¢ã³ãã®èª¿æ»ãæéã«ããããã®æ°ããªéçºãè¡ããã¨ãã£ãææ決å®ããã¾ããã</p>
<h2 id="ã¯ã©ã¤ã¢ã³ãããã®è©ä¾¡ã¨èª²é¡">ã¯ã©ã¤ã¢ã³ãããã®è©ä¾¡ã¨èª²é¡</h2>
<p>ãµã¼ãã¹ããã¼ã³ãããå¾ãããã«å©ç¨ããã ããã¯ã©ã¤ã¢ã³ãã«ã話ã伺ãã«ããã¾ãããã¯ã©ã¤ã¢ã³ãããã¯æ°ãã«éçºãè¡ã£ãæ©è½ã«é¢ãã¦æå¾
éãã®é«è©ä¾¡ãããã ããã¨ãã§ãã¾ããããããªãããã¸ãã¹ã®ææã«ãããã«ç¹ããã ããã¨ããæã£ã¦ãã¾ããã</p>
<p>ãããâ¦ããç°¡åã«ã¯ããã¾ããã§ããã</p>
<p>åå¹´ã¨æ¯è¼ãã¦å£²ä¸ã®å¤åããªããªãç¾ããªãã£ãã®ã§ãã
ãããã¯ãã¯è©ä¾¡ããã¦ããã®ã«ããªã売ä¸ã伸ã³ãªãã®ãã<br/>
æ©ã¿è¦ããä¸ã§ã次ã®2ã¤ã®è¨äºã«åºä¼ãã大ããªè¡æãåãã¾ããã</p>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fchikathreesix.com%2Fpost%2Fburning-needs" title="顧客ã®Burning needsã解決ãã | chikathreesix" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://chikathreesix.com/post/burning-needs">chikathreesix.com</a></cite></p>
<blockquote><p>Founderã売ããªã製åã¯ã売ããªãã<br/>
è¯ããããã¯ããä½ãã°åæã«å£²ãããããæ²ä½ãã°å£²ããã¨è¨ã£ã¦ãã売ããªããã³ããã³ã¨åãã ã¨æãã¾ãããï¼æ©æã«ãã®èª¤è§£ã解ããã¨ããå§ããã¹ãã§ãããããªã®ãã£ãã便å©ã ãªã¨ä½ã£ããã®ãç¬ãéã«å£²ãã¦æåãããã½ã¼ã·ã£ã«ãããã¯ã¼ã¯ã®æ ç»ã®ãããªä¸çãããªãã«è¨ªãããã¨ã¯ã¾ãããå¾ã¾ããã</p></blockquote>
<p><iframe id="talk_frame_698021" class="speakerdeck-iframe" src="//speakerdeck.com/player/d0d0705ccc44445096e2dd4b0fd8f044" width="710" height="399" style="aspect-ratio:710/399; border:0; padding:0; margin:0; background:transparent;" frameborder="0" allowtransparency="true" allowfullscreen="allowfullscreen"></iframe> <cite class="hatena-citation"><a href="https://speakerdeck.com/tumada/serusuanimaruninarou-v2-sutatoatupufalseying-ye-huo-dong-1">speakerdeck.com</a></cite></p>
<blockquote><p>ã»ã¼ã«ã¹ã¨ã¯<br/>
ååã売ã£ã¦å£²ä¸ãä¸ãããã¨ï¼é¡§å®¢ã¨è©±ãã¦å¦ã³ãå¾ããã¨<br/>
ã»ã¼ã«ã¹ã誰ãã«ä»»ãã¦ã¯ãããªããæè§ã®ããªãã®å¦ã³ãæ¸ã£ã¦ãã¾ããã</p></blockquote>
<p>ç§ã¯ãè¯ããããã¯ãã¯èªç¶ã«å£²ããã¨ããå¹»æ³ãæ±ãã¦ãã¾ã£ã¦ããã®ããããã¾ããããããã¯ãããã¼ã¸ã£ã¼ã¨ãã¦ããã®ãããã¯ãã売ããããã«ä½ãã§ããããã»ã¼ã«ã¹ãçªç ´å£ã«ãªãã¨æããè¦æã決ãã¾ããã<br/>
VPoPã®å±±å´ãããããããã¯ããå®éã«å£²ãããã¨ã示ããã°ãå¨ããã¤ãã¦ããã<strong>ãããã¯ãããã¼ã¸ã£ã¼ã売ã£ããã¨ã®ãªããããã¯ãã¯ççºçã«ã¯å£²ããªã</strong>ã®ã§ã¯ãªãããã¨èä¸ãæ¼ãã¦ããã ãã¾ããã</p>
<h2 id="俺ã¯æå¼·ã®ã»ã¼ã«ã¹ã«ãªã">俺ã¯æå¼·ã®ã»ã¼ã«ã¹ã«ãªãï¼</h2>
<p>顧客ãªã¹ãã®æ´çããå§ããæ
å½å¶æ¥ã¨é£æºãã¦ã¢ãã¤ã³ããåå¾ãã¾ãããã¾ããããã¯ããã¢ã ãã§ãªããå¶æ¥ã®å
輩æ¹ã«åè«ã®é²ãæ¹ãåãçãã«ã¤ãã¦ã¢ããã¤ã¹ãããã ãã¾ããã<br/>
2件/æ¥ã®ãã¼ã¹ã§åè«ãè¡ãã1æ¥ã®å°ãªãã¨ãååãã»ã¼ã«ã¹æ´»åã«è²»ããã¾ããã<br/>
ãã®çµæã売ä¸ãå®éã«ä¸ãããã¨ã«æåãã次ã®3ã¤ã®ææãå¾ããã¨ãã§ãã¾ããã</p>
<h5 id="1顧客ã®è§£å度ãä¸ãã売ããããã®ã¡ãã»ã¼ã¸ãè¦ã¤ãã£ã">1.顧客ã®è§£å度ãä¸ããã売ããããã®ã¡ãã»ã¼ã¸ãè¦ã¤ãã£ã</h5>
<p>å
·ä½çã«ã©ã®ãããªã¡ãã»ã¼ã¸ãåºããã®ããè¦ã¤ãããã¨ãã§ãã¾ããããã®ã¡ãã»ã¼ã¸ãææ¡è³æããããã¯ãã«ãã£ã¼ãããã¯ãããã¨ã§ããããµã¼ãã¹ã磨ããã¦ããã¾ããã</p>
<h5 id="2ãããã¯ããã¼ã ã¸å¸æãæã¡è¾¼ãã">2.ãããã¯ããã¼ã ã¸å¸æãæã¡è¾¼ãã</h5>
<p>ä½ã£ã¦ãããã®ã売ããªãã¨ãããã¯ãããã¼ã¸ã£ã¼ã ãã§ãªãããããã¯ããã¼ã çãä¸å®ã«ãªãã¾ãã<br/>
å®éã«ãããã¯ãã売ãããã¨ã§ãããã¯ãã®æ¹åæ§ãæ£ãããã¨ãã¾ãçå®ã«ã´ã¼ã«ã«åãã£ã¦é²æãã¦ãããã¨ãå®æã§ãã¾ããã</p>
<h5 id="3å¶æ¥ã¡ã³ãã¼ã®æ¬ãããã¯ãã«å¯¾ãããã©ã¤ãªãªãã£ãããã£ã">3.å¶æ¥ã¡ã³ãã¼ã®æ¬ãããã¯ãã«å¯¾ãããã©ã¤ãªãªãã£ãããã£ã</h5>
<p>å¶æ¥ã¡ã³ãã¼ã¨æåä½é¨ãå
±æãããã¨ã§ãååé¢ä¿ãæ·±ã¾ãã¾ãããå¶æ¥ã¡ã³ãã¼ããã®ãããã¯ãã«å¯¾ãã質åãåè«ã¸ã®åå¸ã®ä¾é ¼ãå¢ãã¦ããã¾ããã</p>
<h2 id="ãããã«">ãããã«</h2>
<p>ãããã§ããã§ããããã
ãã¾ã¾ã§ã¤ã³ã¿ãã¥ã¼ãç®çã«é¡§å®¢ã«ä¼ããã¨ã¯ãã£ã¦ãã¾ãããã顧客ã«å£²ãè¾¼ããã¨ã«éä¸ããã®ã¯ã¯ããã¦ã§ãããå®éã«é¡§å®¢ããéãæãã¾ã§ã®å
¨ã¦ã®ã³ãã¥ãã±ã¼ã·ã§ã³ãä½é¨ãããã¨ã§ããã¯ã©ã¤ã¢ã³ãã®èª¿æ»ãæéã«ããããã®æ°ããªéçºãè¡ããã¨ããææ決å®ãè¯ãæ¹åã«åãã£ã¦ãããã¨ãå¼·ãå®æã§ãã¾ããã
<br><br>
ããã¦ãã®å¾ããã®ãããã¯ããã©ããªã£ããã¨ããã¨â¦ <br/>
<br>
åå¹´æ¯ã®å£²ä¸ã2åã«ãããã¨ãã§ãã¾ããï¼<br/>
<span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20250205/20250205205334.jpg" width="800" height="800" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p>
<h2 id="We-are-hiring">We are hiring!!</h2>
<p>ã¨ã ã¹ãªã¼ã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ãã§ã¯ãä¸ç·ã«åã仲éãåéãã¦ãã¾ãï¼ ã¾ãã¯ã«ã¸ã¥ã¢ã«é¢è«ããã以ä¸URLãããå¿åããå¾
ã¡ãã¦ãã¾ãã</p>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjobs.m3.com%2Fengineer%2F" title="ã¨ã³ã¸ãã¢æ¡ç¨ãµã¤ãï½æ¡ç¨æ
å ± | å»çÃãã¯ããã¸ã¼ã®å¯è½æ§ã¯ç¡é大" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jobs.m3.com/engineer/">jobs.m3.com</a></cite></p>
<p>ã¾ãããªãµã¼ããããã¯ããã¼ã ã«é¢ãã詳細ã¯ä»¥ä¸ãã覧ãã ããã</p>
<p><iframe id="talk_frame_1125741" class="speakerdeck-iframe" src="//speakerdeck.com/player/77c248784c9c49b49ad993e931ff8c24" width="710" height="399" style="aspect-ratio:710/399; border:0; padding:0; margin:0; background:transparent;" frameborder="0" allowtransparency="true" allowfullscreen="allowfullscreen"></iframe> <cite class="hatena-citation"><a href="https://speakerdeck.com/m3_engineering/introduction-of-m3-research-product-team">speakerdeck.com</a></cite></p>
sho-sakaguchi
ç°¡æçå½è¡¨ãèªãã§ã¿ã
hatenablog://entry/6802418398323612034
2025-02-04T18:00:00+09:00
2025-02-04T18:00:03+09:00 AIã»æ©æ¢°å¦ç¿ãã¼ã ã®é«æ©ã§ããä»å¹´ã®å¥åº·è¨ºæçµæãã¿ã¦ããã©ã³ãã³ã°ãå§ãã¾ãããå¥åº·å¤§äºã ãã¦ãä»åã¯ç°¡æçå½è¡¨ã¨ããåçå´åçãæ¯å¹´çºè¡¨ãã¦ããçµ±è¨è³æãèªãã§ããããã¨æãã¾ãã ç°¡æçå½è¡¨ã¯ãããã1å¹´ã«ããã¦åæ§å¥/å¹´é½¢ã®äººããã®å¹´ã«æ»äº¡ãã確çããéè¨ãã¦çµ±è¨å¦çããããã®ã§ãã 表ãèªãã¨ä¾ãã°ãã2023å¹´ã«ããã¦30æ³ç·æ§ããã®1å¹´ã«æ»ã¬ç¢ºçã¯0.055%ãã¨ãã£ããã¨ãåããã¾ãã çå½è¡¨ã¯ä¿éºæ°çãªã©ã§ã®åºç¤çµ±è¨ã¨ãªã£ã¦ãã¦ãã¿ãªããã«ã¨ã£ã¦èº«è¿ãªã¨ããã§ããã¨ãå¹³å寿å½ã¯ãã®çå½è¡¨ããè¨ç®ãããçµ±è¨éã«ãªãã¾ãã
<p>AIã»æ©æ¢°å¦ç¿ãã¼ã ã®é«æ©ã§ããä»å¹´ã®å¥åº·è¨ºæçµæãã¿ã¦ããã©ã³ãã³ã°ãå§ãã¾ãããå¥åº·å¤§äºã</p>
<p>ãã¦ãä»åã¯ç°¡æçå½è¡¨ã¨ããåçå´åçãæ¯å¹´çºè¡¨ãã¦ããçµ±è¨è³æãèªãã§ããããã¨æãã¾ãã
ç°¡æçå½è¡¨ã¯ãããã1å¹´ã«ããã¦åæ§å¥/å¹´é½¢ã®äººããã®å¹´ã«æ»äº¡ãã確çããéè¨ãã¦çµ±è¨å¦çããããã®ã§ãã
表ãèªãã¨ä¾ãã°ãã2023å¹´ã«ããã¦30æ³ç·æ§ããã®1å¹´ã«æ»ã¬ç¢ºçã¯0.055%ãã¨ãã£ããã¨ãåããã¾ãã</p>
<p>çå½è¡¨ã¯ä¿éºæ°çãªã©ã§ã®åºç¤çµ±è¨ã¨ãªã£ã¦ãã¦ãã¿ãªããã«ã¨ã£ã¦èº«è¿ãªã¨ããã§ããã¨ãå¹³å寿å½ã¯ãã®çå½è¡¨ããè¨ç®ãããçµ±è¨éã«ãªãã¾ãã</p>
<h3 id="å¹³å寿å½ã®å®ç¾©">å¹³å寿å½ã®å®ç¾©</h3>
<p><a href="https://www.mhlw.go.jp/toukei/saikin/hw/life/life23/dl/life23-02.pdf">åçå´åçã®çºè¡¨</a>ã«ããã°2023å¹´æç¹ã§ã®å¹³å寿å½ã¯ç·æ§ã81.09æ³ã女æ§ã87.14æ³ã§ãã
è¨èãèããå°è±¡ã§ã¯ãä»çãã¦ãã人ãã¡ã®æ³å®ããã寿å½ã®äºæ¸¬ãå¹³åãããã®ãã¨æãããããããã¾ãããããã¯ç°ãªãã¾ãã</p>
<p>å¹³å寿å½ã¯ã(ä»å¹´çã¾ãã)0æ³å
ã®å¹³åä½å½ããå®ç¾©ããã¦ãã¾ãã</p>
<p>è¨ãæããã°å¹³åä½å½ã¨ã¯ã2023å¹´ã®æ»äº¡ç¶æ³ãä»å¾ããã£ã¨ç¶ãã¨ä»®å®ããå ´åã«ä»å¹´çã¾ãã0æ³å
ãä½æ³ã¾ã§çãããããã®æå¾
å¤ã表ãã¦ãã¾ãã</p>
<h3 id="çå½è¡¨ããå¹³å寿å½ãæ±ãã">çå½è¡¨ããå¹³å寿å½ãæ±ãã</h3>
<p>ã§ã¯å®éã«ç¾æç¹ã§æã«å
¥ãææ°2023å¹´ã®ç°¡æçå½è¡¨ããå¹³å寿å½æ±ãã¦ã¿ã¾ãããã
å¹³å寿å½ãæ±ããã«ã¯ä»å¹´0æ³ã§çã¾ãã人ã ã0 * 0æ³ã§æ»äº¡ãã確ç+ 1 * 1æ³ã§æ»äº¡ãã確ç...ãã¨ç©åããã°ããããã§ãã</p>
<p>çå½è¡¨ã¯<a href="https://www.mhlw.go.jp/toukei/saikin/hw/life/life23/index.html">令和5年簡易生命表の概況|厚生労働省</a>ã®ã令åï¼å¹´ç°¡æçå½è¡¨ã®ãã¦ã³ãã¼ããããExcelãã¡ã¤ã«ã§åå¾ã§ãã¾ãã
綺éºãªãã¼ãã«ã§ã¯ãªããã®ã¾ã¾ã ã¨æ±ãã«ããã®ã§ä»åã¯æ´å½¢ãã¦csvãã¡ã¤ã«ã«å¤æãã¾ããã</p>
<pre class="code lang-python" data-lang="python" data-unlink><span class="synPreProc">import</span> pandas <span class="synStatement">as</span> pd
life_table = pd.read_csv(<span class="synConstant">'jp_male_2023_life_table.csv'</span>)
POPULATION = <span class="synConstant">100000</span>
MAX_AGE = <span class="synConstant">105</span>
average_lifespan = <span class="synConstant">0.0</span>
<span class="synStatement">for</span> age <span class="synStatement">in</span> <span class="synIdentifier">range</span>(<span class="synConstant">0</span>, MAX_AGE+<span class="synConstant">1</span>):
death_count = life_table.query(<span class="synConstant">'Age == @age'</span>)[<span class="synConstant">'Death'</span>].iloc[<span class="synConstant">0</span>]
average_lifespan += (age + <span class="synConstant">0.5</span>) * death_count <span class="synComment"># é£ç¶æ§è£æ£ã®ãã0.5ãå ç®</span>
<span class="synIdentifier">print</span>(f<span class="synConstant">"average lifespan: {average_lifespan / POPULATION}"</span>)
<span class="synComment"># average lifespan: 81.09207</span>
</pre>
<p>çµæã¯81.09æ³ã¨ãªããåå´çãçºè¡¨ãã¦ããå¹³å寿å½ã¨ä¸è´ãã¾ããã</p>
<p>ä¸ç¹æ³¨æã¨ãã¦ã¯ç©åããéã«å¹´é½¢ã«0.5ã足ããé£ç¶å¤è£æ£ããè¡ã£ã¦ããç¹ã§ãããã¯0æ³ã§äº¡ããªããã¨ããã®ã¯çã¾ããæ¥ãã1æ³ã®èªçæ¥åæ¥ã¾ã§ã®æéãªã®ã§0.5æ³ã¨ãã¦è¨ç®ããã»ããæ£ç¢ºã«ãªãããã§ãã</p>
<h3 id="ç°¡æçå½è¡¨ããåããå°ãæå¤ãªãã¨">ç°¡æçå½è¡¨ããåããå°ãæå¤ãªãã¨</h3>
<h4 id="ç¾å¨ã®å¹³å寿å½ããé·çããã人ãå¤ã">ç¾å¨ã®å¹³å寿å½ããé·çããã人ãå¤ã</h4>
<p>æå¾ãè³ç£ã®å ´åã ã¨å°æ°ã®éæã¡ã大ããå¹³åãå¼ãä¸ãã¦ç®è¡å¹³åã¨ä¸å¤®å¤ã大ãããºã¬ããã¨ãç¥ããã¦ãã¾ãããä¼¼ããããªãã¨ã寿å½ã§ãèµ·ãã¾ãã
å°æ°ã®äººãä¸å¹¸ã«ãã¦è¥ãå¹´é½¢ã§äº¡ããªã£ã¦ãã¾ããã¨ã§ç®è¡å¹³åãä¸ããã¾ãããå¤æ°ã®äººã¯é«é½¢ã¾ã§çããããã寿å½ä¸ä½æ°(çå½è¡¨ããæ±ããããä»å¹´çã¾ãã人ã®å¯¿å½ã®ä¸å¤®å¤)ã¯å¹³å寿å½ããé·ããªãã¾ãã</p>
<p>å®é2023å¹´ã®å¯¿å½ä¸ä½æ°ã¯ç·æ§ã83.99æ³ã女æ§ã90.02æ³ã¨å¹³å寿å½ãã3å¹´è¿ãé·ãã§ããã¤ã¾ããæ¥æ¬äººã®åæ°ä»¥ä¸ã®äººã¯<strong>å¹³å寿å½+3å¹´</strong>ç¨åº¦ã¯çãããã¨ã«ãªãã¾ãã</p>
<h4 id="æå¾
寿å½ã¯å¹´æãçµã¤ã¨ä¼¸ã³ç¶ãã">æå¾
寿å½ã¯å¹´æãçµã¤ã¨ä¼¸ã³ç¶ãã</h4>
<p>ç§(1993å¹´çã®ç·æ§)ãä¾ã«ãããã¾ã§ã«ã©ã®ããã«æå¾
寿å½(ç¾å¨ã®å¹´é½¢+å¹³åä½å½)ãã©ã®ããã«å¤ãã£ã¦ããã®ãã¿ã¦ã¿ãã¨ã次ã®ããã«ãªãã¾ããã</p>
<p><figure class="figure-image figure-image-fotolife" title="çå½è¡¨ããè¨ç®ãããçè
ã®æå¾
寿å½(ãã®æã®å¹´é½¢+å¹³åä½å½)"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20250204/20250204180008.png" width="800" height="629" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>çå½è¡¨ããè¨ç®ãããçè
ã®æå¾
寿å½(ãã®æã®å¹´é½¢+å¹³åä½å½)</figcaption></figure></p>
<p>0~25æ³ã®éã§ã¯5å¹´çµéãããã¨ã«å¤§ä½1æ³ãããç§ã®æå¾
寿å½ã¯ä¼¸ã³ã¦ãã¦ãã¾ãã<a href="#f-4f22fad0" id="fn-4f22fad0" name="fn-4f22fad0" title="30æ³ã®ã¨ãã¯2023å¹´ã§ãæ°åã³ããã®å½±é¿ã§å
¨ä½ã®å¹³å寿å½ã1æ³è¿ãçããªã£ããã伸ã³ã¦ããªãã">*1</a></p>
<p>ããã¯æ¬¡ã®2ã¤ã®å¹æã«ãã£ã¦çãã¦ãã¾ãã</p>
<ol>
<li><p>ãã§ã«Xå¹´çãã¦ããå(ããã¾ã§ã«æ»ãªãªãã£ãåã ã)ãã®å¹´ã®å¹³å寿å½:=0æ³å
ã®ä½å½ããã¯æå¾
寿å½ãé·ããªããã</p></li>
<li><p>å¹³åä½å½ã¯éè¨å¹´ã®æ»äº¡ç¢ºçããã¨ã«è¨ç®ããããå®éã«ã¯å¹´æãçµéããã«ã¤ãæ»äº¡ç¢ºçãä½ä¸ãå¹³åä½å½ã伸ã³ããã</p></li>
</ol>
<p>1ã¤ç®ã«ã¤ãã¦ã¯å
·ä½çã«è¦ã¦ã¿ãã¨ã0æ³ã§ã®æ»äº¡çãè¥å¹´ã®ãªãã§ã¯é«ãããã0æ³ãä¹ãè¶ãã1æ³ã«ãªãã¨ãã®æç¹ã§ç·æ§ã®æå¾
寿å½ã¯81.09æ³ãã81.24æ³ã«+0.15æ³ä¸ããã¾ãã
40æ³ã¾ã§çåãã¦ããã¨82.06æ³ãå¹´éå給éå§å¹´é½¢ã®65æ³ã ã¨84.97æ³ã¾ã§ä¸æãã¾ãã</p>
<p>2ã¤ç®ã«ã¤ãã¦ã¯ãæ¥æ¬ã®å¹³å寿å½ã¯æ¦å¾ãæ°åã³ããã®æµè¡ãé¤ãã°ä¸è²«ãã¦ä¼¸ã³ã¦ãã¾ããä½æçã«ã¯ããã¾ã§éãããªãæè¿ã®2010å¹´â2020å¹´ã§ãç·æ§ã¯2å¹´è¿ãã女æ§ã1.4å¹´ã»ã©ä¼¸ã³ã¦ãã¾ãã</p>
<p><figure class="figure-image figure-image-fotolife" title="å¹³å寿å½ã®æ¨ç§»"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20250204/20250204180011.png" width="800" height="622" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>å¹³å寿å½ã®æ¨ç§»</figcaption></figure></p>
<h2 id="ã¾ã¨ã">ã¾ã¨ã</h2>
<p>ä»åã¯ç°¡æçå½è¡¨ãèªã¿è§£ãã¦ã¿ã¾ãããçµ±è¨è³æãå°ãæ·±å ãããã¨ç´æã¨ã¯éãå®ç¸ãè¦ãã¦ãããçµ±è¨ããã¼ã¿ãµã¤ã¨ã³ã¹ã®é¢ç½ãã®ä¸ç«¯ã表ç¾ã§ãã¦ããã°å¹¸ãã§ãã</p>
<h2 id="we-are-hiring">we are hiring!</h2>
<p>AIã»æ©æ¢°å¦ç¿ãã¼ã ã¯çµ±è¨å¦ããã¼ã¿ãµã¤ã¨ã³ã¹ã«é¢å¿ããæ¹ãæ±ãã¦ãã¾ãï¼
次ã®ãªã³ã¯ãããå¿åãå¾
ã¡ãã¦ãã¾ãï¼</p>
<h3 id="ã¨ã³ã¸ãã¢æ¡ç¨ãã¼ã¸ã¯ãã¡ã">ã¨ã³ã¸ãã¢æ¡ç¨ãã¼ã¸ã¯ãã¡ã</h3>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjobs.m3.com%2Fengineer%2F" title="ã¨ã³ã¸ãã¢æ¡ç¨ãµã¤ãï½æ¡ç¨æ
å ± | å»çÃãã¯ããã¸ã¼ã®å¯è½æ§ã¯ç¡é大" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jobs.m3.com/engineer/">jobs.m3.com</a></cite></p>
<h3 id="ã«ã¸ã¥ã¢ã«é¢è«ããæ°è»½ã«ã©ãã">ã«ã¸ã¥ã¢ã«é¢è«ããæ°è»½ã«ã©ãã</h3>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjobs.m3.com%2Fengineer%2Fcasual-session%2F" title="ã¨ã³ã¸ãã¢æ¡ç¨ãµã¤ãï½æ¡ç¨æ
å ± | å»çÃãã¯ããã¸ã¼ã®å¯è½æ§ã¯ç¡é大" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jobs.m3.com/engineer/casual-session/">jobs.m3.com</a></cite></p>
<h3 id="ã¤ã³ã¿ã¼ã³ã常æåéãã¦ãã¾ã">ã¤ã³ã¿ã¼ã³ã常æåéãã¦ãã¾ã</h3>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fopen.talentio.com%2Fr%2F1%2Fc%2Fm3%2Fhomes%2F4354" title="ãæ°åãã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ã åéä¸è¦§ / ã¨ã ã¹ãªã¼æ ªå¼ä¼ç¤¾" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://open.talentio.com/r/1/c/m3/homes/4354">open.talentio.com</a></cite></p>
<div class="footnote">
<p class="footnote"><a href="#fn-4f22fad0" id="f-4f22fad0" name="f-4f22fad0" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">30æ³ã®ã¨ãã¯2023å¹´ã§ãæ°åã³ããã®å½±é¿ã§å
¨ä½ã®å¹³å寿å½ã1æ³è¿ãçããªã£ããã伸ã³ã¦ããªãã</span></p>
</div>
eufo
ããã°ã©ãã³ã°ã¯ã¤ãº ãã®æ¼ç®çµæãå¾ãããå
ã®ã³ã¼ãã¯ï¼
hatenablog://entry/6802418398324751429
2025-02-03T11:00:00+09:00
2025-02-03T11:00:03+09:00 ããã«ã¡ã¯ãã¨ã ã¹ãªã¼ã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ãã®è¤åã§ãã ä»åã®è¨äºã§ã¯ããºã«ã®ãããªããã°ã©ãã³ã°ã¯ã¤ãºãåºé¡ãã¦ã¿ã¾ãã èªåã§èãããæ¹ã¯åé¡é¨åããè¨äºãèªã¿é²ããã«èãã¦ã¿ã¦ãã ãããåé¡ã®å¾ã«ãã³ããçãã¨ç¶ãã¦ãã¾ãã åé¡ ã§ã¯ãåé¡ã§ãã 巳年(Python) '25å¹´ ãªã¯ã¤ãºã¨ãããã¨ã§ä½æãã¦ã¿ã¾ããã ï¼å
æ¥ãããã«ä½ã£ãã®ã§ [1:-1] é¨åãå®ã¯"ããã£ã¦"ãã¾ã!ï¼ é£èªã¯ã¤ãºã¨ã¯å°ãéã£ã趣åã®ã¯ã¤ãºã§ãã¨ã³ã¸ãã¢ãªã³ã°ã¨ãã¦ã¯ä½ã®å½¹ã«ãç«ããªããããããªãã§ããããã¾ã«ã¯ããããã®ãé¢ç½ãã®ã§ã¯ãªããã¨æãã¾ãã
<p>ããã«ã¡ã¯ãã¨ã ã¹ãªã¼ã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ãã®è¤åã§ãã</p>
<p>ä»åã®è¨äºã§ã¯ããºã«ã®ãããªããã°ã©ãã³ã°ã¯ã¤ãºãåºé¡ãã¦ã¿ã¾ãã<br/>
èªåã§èãããæ¹ã¯åé¡é¨åããè¨äºãèªã¿é²ããã«èãã¦ã¿ã¦ãã ãããåé¡ã®å¾ã«ãã³ããçãã¨ç¶ãã¦ãã¾ãã</p>
<h2 id="åé¡">åé¡</h2>
<p>ã§ã¯ãåé¡ã§ãã</p>
<table>
<thead>
<tr>
</tr>
</thead>
<tbody>
<tr>
<td><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20250203/20250203110004.png" width="800" height="601" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></td>
</tr>
</tbody>
</table>
<p>巳年(Python) '25å¹´ ãªã¯ã¤ãºã¨ãããã¨ã§ä½æãã¦ã¿ã¾ããã ï¼å
æ¥ãããã«ä½ã£ãã®ã§ <code>[1:-1]</code> é¨åãå®ã¯"ããã£ã¦"ãã¾ã!ï¼<br/>
é£èªã¯ã¤ãºã¨ã¯å°ãéã£ã趣åã®ã¯ã¤ãºã§ãã¨ã³ã¸ãã¢ãªã³ã°ã¨ãã¦ã¯ä½ã®å½¹ã«ãç«ããªããããããªãã§ããããã¾ã«ã¯ããããã®ãé¢ç½ãã®ã§ã¯ãªããã¨æãã¾ãã</p>
<h2 id="ãã³ã">ãã³ã</h2>
<p><details><summary>èªåã§è§£ããã人ã®ããã®ãã³ã</summary>
<code>"*"</code> ã§æååã¨ãªã£ã¦ããç®æ以å¤ã®ä¼åé¨åã¯å
¨ã¦<a href="https://docs.python.org/ja/3.13/library/functions.html">çµã¿è¾¼ã¿é¢æ°</a>ã§ãã
</details></p>
<h2 id="解ç">解ç</h2>
<p><details><summary>ãããã解çã§ãã</summary>æ³å®è§£ã®ã³ã¼ãã¯ãã¡ãã</p>
<pre class="code lang-python" data-lang="python" data-unlink><span class="synIdentifier">sorted</span>(<span class="synIdentifier">oct</span>(<span class="synIdentifier">ord</span>(<span class="synConstant">"*"</span>)))[<span class="synConstant">1</span>:-<span class="synConstant">1</span>]
</pre>
<p>ããã¦ãã <code>_</code> ãé¨åãã¤ãªãã¦ã§ããè¨èã¯ã <code>doctor</code> ãã§ããï¼</p>
<h3 id="èãæ¹">èãæ¹</h3>
<p>解çã«è³ãããã®èãæ¹ã¨ãã¦ã¯ãPythonã®çµã¿è¾¼ã¿é¢æ°ããåãããæåæ°ãã§çµã£ã¦èããã®ãä¸çªè«ççãªè§£ãæ¹ãã¨æããã¾ãã</p>
<p>以ä¸ã§ã¯èãæ¹ã®ä¸ä¾ã示ãã¾ãã<br/>
åé¡ã«ç¤ºããã¦ããé·ã1ã®æååããå§ã¾ãç¶æ
ã®é·ç§»ã次ã®4ã¤ã«åãã¦æ¨çãé²ãããã¨ã¨ãã¾ãããã</p>
<ol>
<li>3æåã®é¢æ°â ãé©ç¨ãã¦ç¶æ
â ã«</li>
<li>3æåã®é¢æ°â¡ãé©ç¨ãã¦ç¶æ
â¡ã«</li>
<li>6æåã®é¢æ°â¢ãé©ç¨ãã¦ç¶æ
â¢ã«</li>
<li>ã¹ã©ã¤ã¹ <code>[1:-1]</code> ãé©ç¨ã㦠<code>['2', '5']</code> ã«</li>
</ol>
<p>ã¾ããç¶æ
â¢ãã¹ã©ã¤ã¹ãããã¨ã§ <code>['2', '5']</code> ãå¾ããããã¨ãããç¶æ
â¢ã¯é·ã4ã® <code>List</code> ã§ãããã¨ããããã¾ãã<br/>
ã¾ããé¢æ°â¢ã¯6æåã®çµã¿è¾¼ã¿é¢æ°ã§ãã
åè£ã¯ä»¥ä¸ã®éã6ã¤ã</p>
<pre class="code" data-lang="" data-unlink>>>> import builtins
>>> [name for name in dir(builtins) if callable(getattr(builtins, name)) and len(name) == 6]
['divmod', 'filter', 'format', 'locals', 'object', 'sorted']</pre>
<p>ãããã®ãã¡ <code>List</code> ãè¿ãã®ã¯ <code>sorted</code> ã®ã¿ã®ãããé¢æ°â¢ã¯ <code>sorted</code> ã«æ±ºã¾ããç¶æ
â¡ã¯é·ã4ã® <code>Iterable[str]</code> ã§ãããã¨ããããã¾ãã</p>
<p>ããã§3æåã®çµã¿è¾¼ã¿é¢æ°ãåæãã¦ããã¾ãããã</p>
<pre class="code" data-lang="" data-unlink>>>> [name for name in dir(builtins) if callable(getattr(builtins, name)) and len(name) == 3]
['abs', 'all', 'any', 'bin', 'chr', 'dir', 'hex', 'int', 'len', 'map', 'max', 'min', 'oct', 'ord', 'pow', 'set', 'str', 'sum', 'zip']</pre>
<p>é¢æ°â¡ã®åè£ã¯ãé·ã4ã® <code>Iterble[str]</code> ãè¿ãå¾ããã®ãªã®ã§ <code>bin</code>, <code>chr</code>, <code>hex</code>, <code>oct</code>, <code>set</code>, <code>str</code> ã§ãã<br/>
ã¾ããé¢æ°â ã®åè£ã¯ãé·ã1ã®æååãå¼æ°ã«åãå¾ããã®ãªã®ã§ <code>all</code>, <code>any</code>, <code>dir</code>, <code>int</code>, <code>len</code>, <code>ord</code>, <code>set</code>, <code>str</code> ã§ãã</p>
<p>ããããã¯é¢æ°â ã¨é¢æ°â¡ã®åè£ãçµã¿åããã¦èãã¦ããã¾ãã<br/>
é¢æ°â ã®åè£ãè¿ãå㯠<code>bool</code>, <code>List[str]</code>, <code>int</code>, <code>Set[str]</code>, <code>str</code> ã®ããããã§ãããé¢æ°â¡ã®åè£ãããããé©ç¨ã㦠<code>'2'</code> 㨠<code>'5'</code> ãè¦ç´ ã«å«ã¾ããé·ã4ã® <code>Iterable[str]</code> ãå¾ãããã«ã¯ <code>int</code> ãè¿ããã®ããæ¡ä»¶ãæºããã¾ããã<br/>
<code>int</code> ãè¿ãé¢æ°â ã®åè£ã¯3ã¤ããã¾ãããé·ã1ã®æååãå¼æ°ã¨ããå ´åã« <code>int</code> 㨠<code>len</code> ãè¿ãå¤ã¯é«ã
ä¸æ¡ã®æ°å¤ã¨ãªããããããé¢æ°â¡ãé©ç¨ã㦠<code>'2'</code> 㨠<code>'5'</code> ãè¦ç´ ã«å«ã¾ããé·ã4ã® <code>Iterable[str]</code> ãå¾ãã¨ããæ¡ä»¶ãæºãããªããããé¢æ°â 㯠<code>ord</code> ã§ãããã¨ããããã¾ãã</p>
<p>é¢æ°â¡ã®æ±ºå®ã«ã¯ãåé¡ã®ã <code>_</code> ãé¨åãç¹ãã¨è¨èã«ãªãã¨ããåæã使ããã¨ã«ãã¾ããããåè£ã® <code>bin</code>, <code>chr</code>, <code>hex</code>, <code>oct</code> ã®ãã¡ã<code>d***or</code> ã§è¨èãã§ããããæ¢ã㨠<code>oct</code> ã® <code>doctor</code> ãè¦ã¤ããã¾ããé¢æ°â¡ã¯ <code>oct</code> ã§è¯ãããã§ãã</p>
<p>æå¾ã«ãåºçºç¹ã¨ãªã£ã¦ããé·ã1ã®æååãæ¢ãã¾ãã
<code>ord</code> 㨠<code>oct</code> ãé©ç¨ã㦠<code>"0o25"</code> ã¾ã㯠<code>"0o52"</code> ã«ãªããã®ãæ¡ä»¶ãæºããã¾ãããé·ã1ã®æååã¨ãªãã®ã¯ <code>"0o52"</code> ã®å ´åã§ããã®æååã¯ä¼åã® <code>"*"</code> ãã®ã¾ã¾ã§ãããã¨ããããã¾ãã</p>
<pre class="code" data-lang="" data-unlink>>>> chr(int("25", 8))
'\x15'
>>> chr(int("52", 8))
'*'</pre>
<p>å
¨ã¦ã®è¬ã解ãã¾ããã <code>"*"</code> ããå§ã¾ãç¶æ
ã®é·ç§»ãé çªã«è¿½ã£ã¦ã¿ã¾ãããã</p>
<ol>
<li>3æåã®é¢æ°â ãé©ç¨<br/>
<code>ord('*')</code> -> <code>42</code></li>
<li>3æåã®é¢æ°â¡ãé©ç¨<br/>
<code>oct(42)</code> -> <code>'0o52'</code></li>
<li>6æåã®é¢æ°â¢ãé©ç¨<br/>
<code>sorted('0o52')</code> -> <code>['0', '2', '5', 'o']</code></li>
<li>ã¹ã©ã¤ã¹ãé©ç¨<br/>
<code>['0', '2', '5', 'o'][1:-1]</code> -> <code>['2', '5']</code></li>
</ol>
<p>解説ã¯ä»¥ä¸ã§ãã<br/>
ããã§ã¯è«ççãªèãæ¹ã®ä¾ã示ãã¦ã¿ã¾ãããããããããã¨ã²ãããã§çãã«è¾¿ãçãã¦ãã¾ã£ã人ãããããããã¾ããã</p>
<p></details></p>
<h2 id="å¥è§£">å¥è§£</h2>
<p><details><summary>å®ã¯ãã®åé¡ã«ã¯å¥è§£ãããã¾ãã </summary>
社å
Slackã§ãåºé¡ãã¦ã¿ãã¨ããããªãã¨ï¼ãã¿ã¼ã³ã®å¥è§£ãçºè¦ããã¾ããã
ã <code>_</code> ãé¨åãç¹ãã§ãè¨èã«ãªããªããã®ã§ã¯ããã¾ãããæ¼ç®çµæã <code>['2', '5']</code> ã«åè´ãããã®ãã¡ã§ãã</p>
<h3 id="å¥è§£1-oct-ã-str-ã«">å¥è§£1. <code>oct</code> ã <code>str</code> ã«</h3>
<pre class="code lang-python" data-lang="python" data-unlink><span class="synIdentifier">sorted</span>(<span class="synIdentifier">str</span>(<span class="synIdentifier">ord</span>(<span class="synConstant">"â°"</span>)))[<span class="synConstant">1</span>:-<span class="synConstant">1</span>]
</pre>
<p><code>oct</code> ã <code>str</code> ã«ãã¦ãåçã«ã¯åé¡ãªããæ¼ç®çµæãæ¡ä»¶ãæºããå¤ãæ¢ã㨠<code>ord("â°") = 9520</code> ãè¦ã¤ããã¨ãããã¨ã®ããã§ãã</p>
<h3 id="å¥è§£2-oct-ã-hex-ã«">å¥è§£2. <code>oct</code> ã <code>hex</code> ã«</h3>
<pre class="code lang-python" data-lang="python" data-unlink><span class="synIdentifier">sorted</span>(<span class="synIdentifier">hex</span>(<span class="synIdentifier">ord</span>(<span class="synConstant">"%"</span>)))[<span class="synConstant">1</span>:-<span class="synConstant">1</span>]
</pre>
<p>å¥è§£1ã¨åæ§ã <code>oct</code> ã <code>hex</code> ã«ããå ´åã«æ¡ä»¶ãæºãã <code>ord("%") = 37</code> ï¼37ã¯16é²æ°ã§25ï¼ãè¦ã¤ããã¾ãã</p>
<h3 id="å¥è§£3--ãæååã«å«ã¾ãã">å¥è§£3. <code>(</code> ãæååã«å«ã¾ãã</h3>
<pre class="code lang-python" data-lang="python" data-unlink><span class="synIdentifier">sorted</span>(<span class="synConstant">"25("</span>+((<span class="synConstant">"a"</span>)))[<span class="synConstant">1</span>:-<span class="synConstant">1</span>]
</pre>
<p>ã³ã¼ãä¸ã® <code>(</code> ãæååã«å«ãã¦ãã¾ããã¿ã¼ã³ãçºè¦ããã¾ããããã®ãã¿ã¼ã³ã 㨠<code>25a</code> ã®3æåã¯ä½ç½®ã®å
¥ãæ¿ãå¯è½ã¨ããèªç±åº¦ãããã¾ãã</p>
<p></details></p>
<h2 id="We-are-hiring-">We are hiring !!</h2>
<p>ãããã ã£ãã§ãããããããã¾ã§èªãã§ããã ããããªãã¯ãåé¡ã解ãåã³ãç¥ã£ã¦ããæ¹ã§ãããã
ã¨ã ã¹ãªã¼ã§ã¯å»çæ¥çã®è¤éãªåé¡ã«å
±ã«ææ¦ããã¨ã³ã¸ãã¢ãåéãã¦ãã¾ãã<br/>
ä¸è¨ã®ãªã³ã¯ãããå¿åãå¾
ã¡ãã¦ãã¾ãã</p>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjobs.m3.com%2Fengineer%2F" title="ã¨ã³ã¸ãã¢æ¡ç¨ãµã¤ãï½æ¡ç¨æ
å ± | å»çÃãã¯ããã¸ã¼ã®å¯è½æ§ã¯ç¡é大" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jobs.m3.com/engineer/">jobs.m3.com</a></cite></p>
m-fujiwara-m3
poetryã®ãã¼ã¸ã§ã³ã2.0.0ã«ä¸ãããinstallã§ããªããªã£ã
hatenablog://entry/6802418398318475750
2025-01-09T11:00:00+09:00
2025-01-09T11:00:00+09:00 AIã»æ©æ¢°å¦ç¿ãã¼ã ã®æ± å¶ï¼@mski_iksmï¼ã§ããAIã»æ©æ¢°å¦ç¿ãã¼ã ã§ã¯Pythonã§éçºãã¦ãããããã¯ãã®ããã±ã¼ã¸ç®¡çã«poetryã使ç¨ãã¦ãã¾ãããå¹´æãæ©ã
ãããªã¡ãã»ã¼ã¸ãåºã¦poetry installãã§ããªããªããã©ãã«ãé »çºãã¾ããã Warning: The current project could not be installed: No file/folder found for package XXXXXXXXXX 2025å¹´1æ5æ¥ã«ãªãªã¼ã¹ãããpoetry 2.0.0ã§ã¯ãèªããã±ã¼ã¸ã®ã¤ã³ã¹ãã¼ã«ã«é¢ããæåãå¤æ´ããã¾ããããã®å½±é¿ã§ãpoetâ¦
<p>AIã»æ©æ¢°å¦ç¿ãã¼ã ã®æ± å¶ï¼<a href="https://x.com/mski_iksm">@mski_iksm</a>ï¼ã§ããAIã»æ©æ¢°å¦ç¿ãã¼ã ã§ã¯Pythonã§éçºãã¦ãããããã¯ãã®ããã±ã¼ã¸ç®¡çã«poetryã使ç¨ãã¦ãã¾ãããå¹´æãæ©ã
ãããªã¡ãã»ã¼ã¸ãåºã¦<code>poetry install</code>ãã§ããªããªããã©ãã«ãé »çºãã¾ããã</p>
<blockquote><p>Warning: The current project could not be installed: No file/folder found for package XXXXXXXXXX</p></blockquote>
<p>2025å¹´1æ5æ¥ã«ãªãªã¼ã¹ããã<a href="https://github.com/python-poetry/poetry/releases/tag/2.0.0">poetry 2.0.0</a>ã§ã¯ãèªããã±ã¼ã¸ã®ã¤ã³ã¹ãã¼ã«ã«é¢ããæåãå¤æ´ããã¾ããããã®å½±é¿ã§ãpoetry installã失æããã±ã¼ã¹ãçºçãã¦ãã¾ãã
ãã®è¨äºã§ã¯ããã®åé¡ã«å¯¾ãã対çã解説ãã¾ãã</p>
<h2 id="tldr">tl;dr</h2>
<p><code>pyproject.toml</code>ã®<code>[tool.poetry]</code>ã»ã¯ã·ã§ã³ã®<code>package-mode</code>ã<code>false</code>ã«ãã</p>
<pre class="code" data-lang="" data-unlink># pyproject.toml
[tool.poetry]
package-mode = false</pre>
<h2 id="詳細">詳細</h2>
<p>poetryã§ã¯package modeã¨non-package modeã®2種é¡ãããã¾ãã
package modeã¯èªåèªèº«ãããã±ã¼ã¸ã¨ãã¦ç°å¢ã«ã¤ã³ã¹ãã¼ã«ãã¦ãã使ãã¢ã¼ãã§ã主ã«ããã±ã¼ã¸éçºã«ä½¿ããã¾ãã
non-package modeã¯éã«èªåèªèº«ãããã±ã¼ã¸ã¨ãã¦ç°å¢ã«ã¤ã³ã¹ãã¼ã«ããã«ä½¿ãã¢ã¼ãã§ãä¾åãããµã¼ããã¼ãã£ã®ããã±ã¼ã¸ç®¡çã«poetryã使ç¨ããå ´åã«é¸æããã¾ã<a href="#f-f2de64b1" id="fn-f2de64b1" name="fn-f2de64b1" title="non-package modeãå°å
¥ãããã®ã¯2024å¹´2æã®1.8.0ããã¨ãæå¤ã¨æ°ããã®æ©è½ã§ããhttps://github.com/python-poetry/poetry/releases/tag/1.8.0">*1</a>ã
ããã©ã«ãã§ã¯package modeãé¸æããã¦ãã¾ãã</p>
<pre class="code bash" data-lang="bash" data-unlink>.
âââ hoge
â âââ __init__.py
â âââ code.py
âââ poetry.lock
âââ pyproject.toml</pre>
<p>ä¾ãã°ä¸è¨ã®ãããªãã£ã¬ã¯ããªæ§é ã®å ´åã<code>hoge</code>èªèº«ãç°å¢ã«ã¤ã³ã¹ãã¼ã«ãããã©ãããã¢ã¼ãã§åãæ¿ãã¾ãã</p>
<p>package modeã®æãpoetryã¯<code>pyproject.toml</code>ã«è¨è¿°ãã<code>[project]</code>ã»ã¯ã·ã§ã³ã®<code>name</code>ã§èªåèªèº«ã®ããã±ã¼ã¸åãå¤æãã¦ãã¾ãã<a href="#f-be02239b" id="fn-be02239b" name="fn-be02239b" title="[project]ã»ã¯ã·ã§ã³ã®nameããªãå ´åã[tool.poetry]ã»ã¯ã·ã§ã³ã®nameãåç
§ãã¾ãããå¾è
ã®è¨å®ã¯éæ¨å¥¨ã«ãªãã¾ããã">*2</a></p>
<p>ããã§æå®ããååã®ãã£ã¬ã¯ããªãè¦å½ãããªãå ´åã®æåããã¼ã¸ã§ã³2.0.0ããå¤æ´ããã¾ããã</p>
<h3 id="200ããå">2.0.0ããå</h3>
<p>ãã£ã¬ã¯ããªã«èªããã±ã¼ã¸ããªãå ´åãwarningã§è¦åãã¤ã¤ãã¹ã«ã¼ãèªããã±ã¼ã¸ã¯ç°å¢ã¸ã®ã¤ã³ã¹ãã¼ã«ã¯å®æ½ããã¾ããã</p>
<h3 id="200以é">2.0.0以é</h3>
<p>ãã£ã¬ã¯ããªã«èªåããã±ã¼ã¸ããªãå ´åã<code>poetry install</code>èªä½ã失æãããï¼è¦åã¡ãã»ã¼ã¸ã¯warningï¼</p>
<p>èªåèªèº«ãã¤ã³ã¹ãã¼ã«ããpackage modeãæå®ããªãããã®ããã±ã¼ã¸ãè¦å½ãããªããã¨ããç¾è±¡ã¯ä½ãééã£ã¦ããå¯è½æ§ãé«ãã®ã§ãããã§ã¯ã¤ã³ã¹ãã¼ã«ã失æããã®ã¯èªç¶ã«æããã¾ãã</p>
<h2 id="èªããã±ã¼ã¸ãç°å¢ã«ã¤ã³ã¹ãã¼ã«ããªãã¦ã使ããå ´åã£ã¦ã©ããããã¨">èªããã±ã¼ã¸ãç°å¢ã«ã¤ã³ã¹ãã¼ã«ããªãã¦ã使ããå ´åã£ã¦ã©ããããã¨ï¼</h2>
<h3 id="1-åä¸ã¹ã¯ãªãããªã©ããããimportãããªãå ´å">1. åä¸ã¹ã¯ãªãããªã©ãããããimportãããªãå ´å</h3>
<p>poetryãä¾åããã±ã¼ã¸ç®¡çã«ã ã使ã£ã¦ããå ´åã§ããããããå ´åã¯packageãä½ã£ã¦ããªãã®ã§ãno-package modeãé¸æããã®ãè¯ãããã§ãã</p>
<h3 id="2-èªããã±ã¼ã¸ãã¢ã¸ã¥ã¼ã«æ¤ç´¢PATHã«ããå ´å">2. èªããã±ã¼ã¸ãã¢ã¸ã¥ã¼ã«æ¤ç´¢PATHã«ããå ´å</h3>
<p>Pythonã§ã¯ãã¢ã¸ã¥ã¼ã«æ¤ç´¢PATHãéããã£ã¬ã¯ããªã®ã³ã¼ããimportã§ãã¾ãã
ã¢ã¸ã¥ã¼ã«æ¤ç´¢PATHã¯<code>sys.path</code>ã§ç¢ºèªãã§ããå¤ã§ãããã©ã«ãã§ã¯ä¾åããã±ã¼ã¸ãã¤ã³ã¹ãã¼ã«ããã<code>site-packages</code>ãã£ã¬ã¯ããªããå®è¡ããã¹ã¯ãªããã®ãã£ã¬ã¯ããªãå«ã¾ãã¦ãã¾ãã
ããã¾ã§ç°å¢ã«èªããã±ã¼ã¸ãã¤ã³ã¹ãã¼ã«ããªãã¦ãåç
§ã§ãã¦ããã®ã¯ãèªããã±ã¼ã¸ãã¢ã¸ã¥ã¼ã«æ¤ç´¢PATHã®éã£ãå ´æã«é
ç½®ããã¦ããããã§ãã</p>
<pre class="code bash" data-lang="bash" data-unlink>.
âââ hoge
â âââ __init__.py
â âââ code.py
âââ main.py
âââ poetry.lock
âââ pyproject.toml
âââ script
âââ main.py</pre>
<p>ä¾ãã°ãä¸è¨ã®ãããªãã£ã¬ã¯ããªæ§é ã®ã¨ãã«ã<code>main.py</code>ãã<code>import hoge</code>ã¯å¯è½ã§ãã
ããã¯<code>main.py</code>ã<code>hoge</code>ã¨åããã£ã¬ã¯ããªã«ããããã§ãã
ã¢ã¸ã¥ã¼ã«æ¤ç´¢PATHã«ã¯ãå®è¡ããã¹ã¯ãªããã®ãã£ã¬ã¯ããªãå«ã¾ãã¦ããããimportå¯è½ã«ãªã£ã¦ãã¾ãã</p>
<p>ä¸æ¹ã<code>script/main.py</code>ãã<code>import hoge</code>ã¯ã§ãã¾ããã
<code>python script/main.py</code>ãå®è¡ããã¨ãã¢ã¸ã¥ã¼ã«æ¤ç´¢PATHã«ã¯<code>.</code>ã§ã¯ãªã<code>script</code>ã追å ããã<code>hoge</code>ãè¦ã¤ãããªãããã§ãã</p>
<p>ãªãããèªããã±ã¼ã¸ãã¢ã¸ã¥ã¼ã«æ¤ç´¢PATHã«ãããå ´åã<code>pyproject.toml</code>ã®<code>[project]</code>ã»ã¯ã·ã§ã³ã®<code>name</code>ã«èªããã±ã¼ã¸ã®ååãæ£ããæå®ãã¦ããããã¨ã§ãä»åã®åé¡ã¯åé¿ã§ãã¾ãã</p>
<h2 id="対ç">対ç</h2>
<blockquote><p>Warning: The current project could not be installed: No file/folder found for package XXXXXXXXXX</p></blockquote>
<p>ãã®åé¡ã®å¯¾çã®æ¹éã¯å¤§ãã2種é¡ããã¾ãã</p>
<p>1ã¤ã¯ãããã¾ã§éãèªããã±ã¼ã¸ã¯ã¤ã³ã¹ãã¼ã«ããªãããã«ããæ¹éã§ãã<code>pyproject.toml</code>ã®<code>[tool.poetry]</code>ã»ã¯ã·ã§ã³ã®<code>package-mode</code>ã<code>false</code>ã«ãããã¨ã§ãno-package modeãæ示çã«ä½¿ç¨ããããã«ãã¾ãã</p>
<pre class="code" data-lang="" data-unlink># pyproject.toml
[tool.poetry]
package-mode = false</pre>
<p>ãªãã<code>poetry install --no-root</code>ãããæ¹æ³ãããã¾ãããããã¯ãpackage modeã®ã¾ã¾<a href="#f-32429f9c" id="fn-32429f9c" name="fn-32429f9c" title="package modeã§ã¯ããã®ã§ãpyproject.tomlã«ããã¦ã[project.name] or [tool.poetry.name]ã¨[project.version] or [tool.poetry.version]ã®æå®ãæ±ãããã¾ãããã®ãã¡[tool.poetry.name]ã¯éæ¨å¥¨ã«ãªã£ã¦ããã®ã§ãå°æ¥çã«[project.name]ã¸ã®ç§»è¡ãå¿
è¦ã«ãªãããããã¾ããã">*3</a>èªããã±ã¼ã¸ã®ã¤ã³ã¹ãã¼ã«ã ããã¹ããããããã¨ãããã®ã§ãmodeã®æå®ã¨ãã£ã¦ãããã¨ãæ»ããã¾ã¾ã®ãããno-package modeãæ示çã«é¸æããåè
ããããã¨èãã¦ãã¾ãã</p>
<p>ãã1ã¤ã¯ãèªããã±ã¼ã¸ãã¤ã³ã¹ãã¼ã«ããããã«ããæ¹éã§ãã
ããã¯ã<code>[project]</code>ã»ã¯ã·ã§ã³ã®<code>name</code>ã«èªããã±ã¼ã¸åãæå®ãããã¨ã§å®ç¾å¯è½ã§ãã</p>
<p>æ¥ãã®å ´åã¯ãããã¾ã§éãã®æåãããããã«no-package modeã«å¤æ´ããã®ã§è¯ãããã§ãããå°æ¥çã«scriptãã£ã¬ã¯ããªãªã©ããèªããã±ã¼ã¸ãimportããããªã©æè»ã«å¯¾å¿ãããå ´åã¯ãå¾è
ã®ããã«packageã¨ãã¦ç°å¢ã«ã¤ã³ã¹ãã¼ã«ãæ¤è¨ãã¦ãããããããã¾ããã</p>
<h2 id="ä»ã®poetry-200ã§ã®å¤æ´ç¹">ä»ã®poetry 2.0.0ã§ã®å¤æ´ç¹</h2>
<h3 id="poetry-shellãpluginã«ãªã£ã"><code>poetry shell</code>ãpluginã«ãªã£ã</h3>
<p>poetryã®ç°å¢å
ã«å
¥ãããã®ã³ãã³ãã§ãã£ã<code>poetry shell</code>ããpluginçµç±ã§å
¥ããæ©è½ã«ãªãã¾ãããä»å¾ã¯<code>eval $(poetry env activate)</code>ã使ããã¨ãæ¨å¥¨ããã¦ãã¾ãã</p>
<h3 id="poetry-lockã®ããã©ã«ãã--no-updateã«ãªã£ã"><code>poetry lock</code>ã®ããã©ã«ãã<code>--no-update</code>ã«ãªã£ã</h3>
<p><code>poetry lock</code>ã®éã«ãã¢ãããã¼ããå¿
é ã§ã¯ãªãããã±ã¼ã¸ã¯ç¾ç¶ã®ã¾ã¾ã«ãã<code>--no-update</code>ãªãã·ã§ã³ãããã©ã«ãã«ãªãã¾ããã</p>
<h3 id="pyprojecttomlã®projectã»ã¯ã·ã§ã³ã®ãµãã¼ã"><code>pyproject.toml</code>ã®<code>[project]</code>ã»ã¯ã·ã§ã³ã®ãµãã¼ã</h3>
<p>æ¬è¨äºã§ã度ã
è¨å®ãã¦ããã<code>pyproject.toml</code>ã®<code>[project]</code>ã»ã¯ã·ã§ã³ããµãã¼ããããã®ã¯2.0.0ããã§ãã
ããã¾ã§<code>[tool.poetry]</code>ã»ã¯ã·ã§ã³ã«è¨è¿°ãã¦ããè¨å®ãããã¤ãã¯éæ¨å¥¨ã«ãªãã<code>[project]</code>ã»ã¯ã·ã§ã³ã¸ã®è¨è¿°ã«ç§»è¡ãã¦ããã®ã§æ³¨æãå¿
è¦ã§ãã</p>
<p>ã¡ã¸ã£ã¼ã¢ãããã¼ãããããä»ã«ãããããã®å¤æ´ãããã¾ãã®ã§ã<a href="https://github.com/python-poetry/poetry/releases/tag/2.0.0">å
¬å¼è§£èª¬</a>ããåç
§ãã ããã</p>
<h2 id="we-are-hiring">we are hiring!</h2>
<p>AIã»æ©æ¢°å¦ç¿ãã¼ã ã§ã¯ãã©ã¤ãã©ãªã®ã¡ã¸ã£ã¼ã¢ãããã¼ãã«ãæ¯ã¾ãã«çªã£è¾¼ãã§whyã調æ»ããã¨ã³ã¸ãã¢ãåéãã¦ãã¾ãã
ä¸è¨ã®ãªã³ã¯ãããå¿åãå¾
ã¡ãã¦ãã¾ãï¼</p>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjobs.m3.com%2Fengineer%2F" title="ã¨ã³ã¸ãã¢æ¡ç¨ãµã¤ãï½æ¡ç¨æ
å ± | å»çÃãã¯ããã¸ã¼ã®å¯è½æ§ã¯ç¡é大" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jobs.m3.com/engineer/">jobs.m3.com</a></cite></p>
<div class="footnote">
<p class="footnote"><a href="#fn-f2de64b1" id="f-f2de64b1" name="f-f2de64b1" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">non-package modeãå°å
¥ãããã®ã¯2024å¹´2æã®1.8.0ããã¨ãæå¤ã¨æ°ããã®æ©è½ã§ãã<a href="https://github.com/python-poetry/poetry/releases/tag/1.8.0">https://github.com/python-poetry/poetry/releases/tag/1.8.0</a></span></p>
<p class="footnote"><a href="#fn-be02239b" id="f-be02239b" name="f-be02239b" class="footnote-number">*2</a><span class="footnote-delimiter">:</span><span class="footnote-text">[project]ã»ã¯ã·ã§ã³ã®nameããªãå ´åã[tool.poetry]ã»ã¯ã·ã§ã³ã®nameãåç
§ãã¾ãããå¾è
ã®è¨å®ã¯éæ¨å¥¨ã«ãªãã¾ããã</span></p>
<p class="footnote"><a href="#fn-32429f9c" id="f-32429f9c" name="f-32429f9c" class="footnote-number">*3</a><span class="footnote-delimiter">:</span><span class="footnote-text">package modeã§ã¯ããã®ã§ãpyproject.tomlã«ããã¦ã[project.name] or [tool.poetry.name]ã¨[project.version] or [tool.poetry.version]ã®æå®ãæ±ãããã¾ãããã®ãã¡[tool.poetry.name]ã¯éæ¨å¥¨ã«ãªã£ã¦ããã®ã§ãå°æ¥çã«[project.name]ã¸ã®ç§»è¡ãå¿
è¦ã«ãªãããããã¾ããã</span></p>
</div>
mski_iksm
2024å¹´ã®æè¡åç»ãããªã¹ã¹ã¡ãã¾ã¨ããã
hatenablog://entry/6802418398316201658
2024-12-31T15:31:38+09:00
2024-12-31T15:31:38+09:00 å¹´æ«ã«ããã«ã¡ã¯ãããã°ãã¯ãVPoEã®æ²³å(@vaaaaanquish)ã§ãã 声åªã®å°æè£ä»ãããå
å±±å¤å®ãããããçµå©ãããã¨ã®äºã§ãæè¿ãªã¼ãææ°è©±ã¾ã§è¿½ãã¤ããç§ãåã³ãé ãã¾ãããå¬ããï¼ ãã¦ãæ¬è¨äºã§ã¯2024å¹´ãçµãããã®æ¥ã«å¹´æ«å¹´å§ã楽ããéãããæè¡LTåç»ãããã¤ãç´¹ä»ãã¦ãçæ§ã«ããå¹´æ«ãæä¾åºæ¥ãã°ã¨æãçãåã£ã¦ãã¾ãã å¹´ã®æ®ã¾ã§æè¡æè¡ã§ãã£ã¦ããã¾ãããï¼ ã¨ã ã¹ãªã¼ããã¯ãã¼ã¯ã¨ã¯ TEXå«ã大å¦çã®éã Firebase De Akka Actorç人ç¼ã¢ãããªãªã¡ã¤ã¯ ãã©ã¯ã¿ã«å³å½¢ãããè¦ãã®å¼ããæãã¦ã¿ã Playwrightã¦ãVRTç°å¢ãæ´åâ¦
<p>å¹´æ«ã«ããã«ã¡ã¯ãããã°ãã¯ãVPoEã®æ²³å(@vaaaaanquish)ã§ãã
声åªã®å°æè£ä»ãããå
å±±å¤å®ãããããçµå©ãããã¨ã®äºã§ãæè¿ãªã¼ãææ°è©±ã¾ã§è¿½ãã¤ããç§ãåã³ãé ãã¾ãããå¬ããï¼</p>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241231/20241231153140.png" width="800" height="450" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p>
<p>ãã¦ãæ¬è¨äºã§ã¯2024å¹´ãçµãããã®æ¥ã«å¹´æ«å¹´å§ã楽ããéãããæè¡LTåç»ãããã¤ãç´¹ä»ãã¦ãçæ§ã«ããå¹´æ«ãæä¾åºæ¥ãã°ã¨æãçãåã£ã¦ãã¾ãã</p>
<p>å¹´ã®æ®ã¾ã§æè¡æè¡ã§ãã£ã¦ããã¾ãããï¼</p>
<ul class="table-of-contents">
<li><a href="#ã¨ã ã¹ãªã¼ããã¯ãã¼ã¯ã¨ã¯">ã¨ã ã¹ãªã¼ããã¯ãã¼ã¯ã¨ã¯</a></li>
<li><a href="#TEXå«ã大å¦çã®éã">TEXå«ã大å¦çã®éã</a></li>
<li><a href="#Firebase-De-Akka-Actorç人ç¼ã¢ãããªãªã¡ã¤ã¯">Firebase De Akka Actorç人ç¼ã¢ãããªãªã¡ã¤ã¯</a></li>
<li><a href="#ãã©ã¯ã¿ã«å³å½¢ãããè¦ãã®å¼ããæãã¦ã¿ã">ãã©ã¯ã¿ã«å³å½¢ãããè¦ãã®å¼ããæãã¦ã¿ã</a></li>
<li><a href="#Playwrightã¦ãVRTç°å¢ãæ´åãã¦ããããã¼ã«ãªã£ããã®å
ã®ä¸ç">Playwrightã¦ãVRTç°å¢ãæ´åãã¦ããããã¼ã«ãªã£ãããã®å
ã®ä¸ç</a></li>
<li><a href="#Water-Sort-Puzzleã解ãã¦ã¿ã">Water Sort Puzzleã解ãã¦ã¿ã</a></li>
<li><a href="#ãããã«">ãããã«</a><ul>
<li><a href="#We-are-hiring-">We are hiring !!</a><ul>
<li><a href="#ã¨ã³ã¸ãã¢æ¡ç¨ãã¼ã¸ã¯ãã¡ã">ã¨ã³ã¸ãã¢æ¡ç¨ãã¼ã¸ã¯ãã¡ã</a></li>
<li><a href="#ã«ã¸ã¥ã¢ã«é¢è«ããæ°è»½ã«ã©ãã">ã«ã¸ã¥ã¢ã«é¢è«ããæ°è»½ã«ã©ãã</a></li>
<li><a href="#ã¤ã³ã¿ã¼ã³ã常æåéãã¦ãã¾ã">ã¤ã³ã¿ã¼ã³ã常æåéãã¦ãã¾ã</a></li>
</ul>
</li>
</ul>
</li>
</ul>
<p> ã</p>
<h1 id="ã¨ã ã¹ãªã¼ããã¯ãã¼ã¯ã¨ã¯">ã¨ã ã¹ãªã¼ããã¯ãã¼ã¯ã¨ã¯</h1>
<p>M3 Tech Talkã¯ãéé±ã§éææ¥ã«éå¬ãã¦ãã社å
ã®æè¡åå¼·ä¼ã§ãã</p>
<p>2013å¹´ãã11å¹´ç¶ç¶ã260å以ä¸éå¬ãæ¯å3~4åã®æ¹ã«15åã»ã©ã®è©±ããã¦ããã£ã¦ãã¦ãã¨ã³ã¸ãã¢100åã®ãã¡60~70人ãæ¯åZoomãSlackã§ã¯ã¤ã¯ã¤å®æ³ãã¦ãããã¨ã ã¹ãªã¼ã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ãã®æä¾ã¤ãã³ãã§ãã
å¹´ã«æ°åã®ãªãã©ã¤ã³éå¬ãå®æ½ãã¦ããã12ææç¹ã§2ææ«ã¾ã§ç»å£å¸æè
ãåã¾ã£ã¦ããè¶
人æ°ã³ã³ãã³ãã«ããªã£ã¦ãã¾ãã
<iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.m3tech.blog%2Fentry%2F2024%2F12%2F21%2F120000" title="ãã®ã¼ã¯ããéãå¦ã³è - 11年以ä¸ç¶ãM3 Tech Talkãæ¯ããæ
ç±ã«è¿«ã - ã¨ã ã¹ãªã¼ããã¯ããã°" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://www.m3tech.blog/entry/2024/12/21/120000">www.m3tech.blog</a></cite></p>
<p>çãä¸ããã®ç§å¯ã¯ãæè¡ã®æ·±ããåºãããããããããã¦é¢ç½ã使ãæ¹ããããã¯ãã¸ã®å¿ç¨ã¨å¹
åºãèããäºã«ããã¾ãã</p>
<p>ã«ã¸ã¥ã¢ã«é¢è«çã§ãããããã¼ã éã®æè¡å
±æã¯ã©ããã¦ããã§ããï¼ããã³ãã¥ãã±ã¼ã·ã§ã³ã¯ã©ããªæãã§ããï¼ããªã©ã®è³ªåãåããã®ã§ãããããã¯ãã¼ã¯ã§èªèº«ã®ãã¼ã æ´»åãå人活åãã¢ãã¼ã«ãããã¨ã§ãæè¡ã§ç¹ãã£ã¦ãããã®ãã¨ã ã¹ãªã¼ã®é¢ç½ãã«ã«ãã£ã¼ã®1ã¤ã ã¨æã£ã¦ä»¥ä¸ã®è¨äºãç´¹ä»ãã¦ãã¾ãã
<iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.m3tech.blog%2Fentry%2Ftechtalk-offline-2023" title="230åç¶ã社å
LT大ä¼ã®å¿å¹´ä¼ãçãä¸ãã£ã件ã«ã¤ã㦠- ã¨ã ã¹ãªã¼ããã¯ããã°" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://www.m3tech.blog/entry/techtalk-offline-2023">www.m3tech.blog</a></cite></p>
<p>ããã¯ãã¼ã¯ã®ç»å£å
容ã¯ã<a href="https://www.youtube.com/@m3techchannel160">ã¨ã ã¹ãªã¼å
¬å¼ããã¯ãã£ã³ãã«</a>ã§å
¬éãã¦ãã¾ãã
ãã¡ããã社å
ã§ããå
±æã§ããªããããªãããã¯ãã«é¢é£ããæ
å ±ãã¨ãã¸ãå¹ãéããç»å£ã«ã¤ãã¦ã¯å
¬éãã¦ããªãã®ã§ãããã¨ã ã¹ãªã¼ã®æè¡ã«ã«ãã£ã¼ãç¥ã£ã¦é ãããã«ä¸é¨ã ããªã¼ãã³ãã¦ãã¾ãã</p>
<p>ããã§ã¯ãããã«ãã®ä¸é¨ã2024å¹´ã«å
¬éãããåç»ã®ä¸ãããç§ããªã¹ã¹ã¡ããããããæè¡åç»ãç´¹ä»ãã¦ãããã¨æãã¾ãã</p>
<p> ã</p>
<h1 id="TEXå«ã大å¦çã®éã">TEXå«ã大å¦çã®éã</h1>
<p>çæ§ãå¦çæ代ã«TeXãæãã£ãã®ã¯è¨æ¶ã«ããã¾ãã§ããããã</p>
<p>å¦çæ代ã®TeXã®buildç°å¢ãä½ãä½æ¥ãæãåºããã ãã§ãç§ãé ãæ±ãã¦ãã¾ãã¾ãï¼è¿å¹´ã¯OverleafãDocker Imageãå
å®ãã¦ãããRe:VIEWçãããã®ã§è¯ãæ代ã«ãªã£ã¦ãã¾ããï¼ã</p>
<p><iframe width="560" height="315" src="https://www.youtube.com/embed/JJ8AoVND6AM?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen title="TEXå«ã大å¦çã®éã ãM3 Tech Talk 第233åã"></iframe><cite class="hatena-citation"><a href="https://youtu.be/JJ8AoVND6AM?si=uN1FD0qttB1BouwV">youtu.be</a></cite></p>
<p>ãã¡ãã®åç»ã§ã¯ãMarkdown PreviewãPugã使ã£ã¦ãããã«TeXãé¿ããã大å¥éããå¦çæ代ã®æãåºãèªããã¦ãã¾ãã
æ£æ°ã«æ»ããªãã¾ã§æé«ã®åç»ã§ãã</p>
<p> ã</p>
<h1 id="Firebase-De-Akka-Actorç人ç¼ã¢ãããªãªã¡ã¤ã¯">Firebase De Akka Actorç人ç¼ã¢ãããªãªã¡ã¤ã¯</h1>
<p>çæ§ãWebä¸ã§äººç¼ããã¬ã¤ã§ãããµã¼ãã¹ã<a href="https://www.docodemo-jinrou.com">ã©ãã§ã人ç¼</a>ãã¯ãåç¥ã§ããããã</p>
<p>æ¤ç´¢ããã¨VTuberã使ã£ã¦ããæ§åãåºã¦ãããããªãµã¼ãã¹ã§ãããå®ã¯ã¨ã ã¹ãªã¼ã®ã¨ã³ã¸ãã¢ã趣å³ã§éçºãã¦ãã¾ãã</p>
<p><iframe width="560" height="315" src="https://www.youtube.com/embed/2PWvfpcueIw?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen title="2024 01 26 Firebase De Akka Actorç人ç¼ã¢ãããªãªã¡ã¤ã¯ ãM3 Tech Talk 第237åã v01"></iframe><cite class="hatena-citation"><a href="https://youtu.be/2PWvfpcueIw?si=69tbFz3p1Bfn4EQw">youtu.be</a></cite></p>
<p>ãã¡ãã®åç»ã¯ãã¢ã¯ã»ã¹å¢å ã¨åå®ã§GKEéç¨ã«è¦ãããããã¨ã³ã¸ãã¢ã«ããFirebase移è¡ã®èµ¤è£¸ã
ãã¼ã¯ã«ãªã£ã¦ãã¾ãã
æå¾ã«åºã¦ããå¿ã«åªããã°ã©ãã¾ã§å«ãã¦ãªã¹ã¹ã¡ã®åç»ã§ãã</p>
<p> ã</p>
<h1 id="ãã©ã¯ã¿ã«å³å½¢ãããè¦ãã®å¼ããæãã¦ã¿ã">ãã©ã¯ã¿ã«å³å½¢ãããè¦ãã®å¼ããæãã¦ã¿ã</h1>
<p>çæ§ããã©ã¯ã¿ã«å³å½¢ãæ¸ããããªã¨æã£ããã®é ã®æ°æã¡ãè¦ãã¦ãã¾ãã§ããããã</p>
<p>ãã©ã¯ã¿ã«å³å½¢ã¨ã¯ããã©ã³ã¹ã®æ°å¦è
ããã¯ã»ãã³ãã«ãããæå±ããå¹¾ä½å¦ã®æ¦å¿µã§ãå³å½¢ã®ä¸é¨ãæ¡å¤§ãã¦ãå
¨ä½ã¨ä¼¼ãå½¢ã«ãªããèªå·±ç¸ä¼¼æ§ãã示ãå³å½¢ã§ãã</p>
<p><iframe width="560" height="315" src="https://www.youtube.com/embed/ejMyrqkBzcs?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen title="ãã©ã¯ã¿ã«å³å½¢ãããè¦ãã®å¼ããæãã¦ã¿ã ãM3 Tech Talk 第237åã"></iframe><cite class="hatena-citation"><a href="https://youtu.be/ejMyrqkBzcs?si=f_xNC9bCDTsT1wSC">youtu.be</a></cite></p>
<p>ãã¡ãã®åç»ã§ã¯ãSPGï¼ãµã¤ãããã¢ã¼ã·ã§ã³ã°ã«ã¼ãï¼ã§åãéå±±ãããããã©ã¯ã¿ã«å³å½¢ãæ§ç¯ããå¼ã®è¨æ¶ã辿ããªããéçºãé²ã¿ã¾ããéå±±ããã®è·ç¨®ã¯ã¨ã³ã¸ãã¢ã§ã¯ãªãã®ã§ãããJavaScriptã§ãã¢ãåãæ§åã¾ã§ããã¨ãããããªãé¢ç½ãã³ã³ãã³ãã«ãªã£ã¦ãã¾ãã</p>
<p><iframe width="560" height="315" src="https://www.youtube.com/embed/sK7YhoXhbGg?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen title="ãã©ã¯ã¿ã«å³å½¢ãããããåããããã±ã©ãªã¼ãã»ãµã³ãããã¦ãã£ããæ°ãæãåºãã話 ãM3 Tech Talk 第238åã"></iframe><cite class="hatena-citation"><a href="https://youtu.be/sK7YhoXhbGg?si=yadj1F1OvYiDuZbv">youtu.be</a></cite></p>
<p>2ã¤ç®ã®ããããåããåç»ã«ã¯ã1ã¤ç®ã®åç»ã§æããä¼ç·ãååããããªãããããç¶ãã¦è¦ã価å¤ãããæè¡åç»ã«ãªã£ã¦ãã¾ãã</p>
<p> ã</p>
<h1 id="Playwrightã¦ãVRTç°å¢ãæ´åãã¦ããããã¼ã«ãªã£ããã®å
ã®ä¸ç">Playwrightã¦ãVRTç°å¢ãæ´åãã¦ããããã¼ã«ãªã£ãããã®å
ã®ä¸ç</h1>
<p>çæ§ãèªåãã¹ãããã£ã¦ãã¾ãããï¼</p>
<p>ã¨ã ã¹ãªã¼ã§ãPlaywrightãSeleniumãTestRailãmablâ¦ã¨å¹
åºããã¼ã«ã§VRTãè¡ããã¦ãã¾ããQAãã¼ã ã¡ã³ãã¼ã ãã§ãªããã¨ã³ã¸ãã¢å
¨ä½ã§å質ãæ
ä¿ãã¹ããæ§ã
ãªåãçµã¿ãè¡ã£ã¦ããæä¸ã§ãã</p>
<p><iframe width="560" height="315" src="https://www.youtube.com/embed/JtLWa8iT7jE?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen title="Playwrightã¦ãVRTç°å¢ãæ´åãã¦ããããã¼ã«ãªã£ãããã®å
ã®ä¸ç ãM3 Tech Talk 第239åã"></iframe><cite class="hatena-citation"><a href="https://youtu.be/JtLWa8iT7jE?si=FHKR7K4YOXiXtOFJ">youtu.be</a></cite></p>
<p>ãã¡ãã®åç»ã§ã¯ããããªVRTæ§ç¯ä¸ã«èµ·ãã£ãè¬ã®ãã©ã¦ã¶æåã«è¿«ãã解決ã«è³ã£ãèæ¯ã¨è©³ãã調æ»ãå
·ä½çã«ç´¹ä»ãã¦ãã¾ãã
ããã³ãã¨ã³ãã®ä¸æè°ãªæåã好ããªã¨ã³ã¸ãã¢ã«ãªã¹ã¹ã¡ã®ä¸æ¬ã§ãã</p>
<p> ã</p>
<h1 id="Water-Sort-Puzzleã解ãã¦ã¿ã">Water Sort Puzzleã解ãã¦ã¿ã</h1>
<p>çæ§ãã¹ããæä½ä¸ã«åºã¦ããã²ã¼ã åºåã¯ã好ãã§ããããã</p>
<p>ç§ã¯ãå®ã溶岩ã«çããã²ã¼ã ï¼ï¼ï¼ã®åºåãããè¦ã¾ãã</p>
<p><iframe width="560" height="315" src="https://www.youtube.com/embed/xMIdMFvAzPM?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen title="Water Sort Puzzleã解ãã¦ã¿ããM3 Tech Talk 第246åã"></iframe><cite class="hatena-citation"><a href="https://youtu.be/xMIdMFvAzPM?si=TFGZCH_eH9iZLiSN">youtu.be</a></cite></p>
<p>ãã¡ãã®åç»ã¯ããããªã²ã¼ã åºåããã£ããã«ããºã«Solverãéçºãããããã«ãã®ã¼ã¯ãªã¨ã³ã¸ãã¢ãèããããªå
容ã«ãªã£ã¦ãã¾ãã
Solveréçºã¨å®éã«ãã¬ã¤ããã®ã§ãã©ã¡ãã®æ¹ãæéã溶ããã®ãããããããªãé¢ç½åç»ã«ãªã£ã¦ãã¦ãªã¹ã¹ã¡ã§ãã</p>
<p> ã</p>
<h1 id="ãããã«">ãããã«</h1>
<p>ãããã§ããããã</p>
<p>æ¬è¨äºã§ã¯ãã¨ã ã¹ãªã¼ã®ã®ã¼ã¯ãªåç»ã®ä¸ããä¸é¨ãç´¹ä»ãè¦ã©ãããã¤ã³ãããä¼ããã¾ããã
å¹´æ«ã¯ãã¨ã ã¹ãªã¼ããã¯ãã¼ã¯ã®åç»ãè¦ãªãããä¸ç·ã«é¤å¤ã®éãé³´ããã¾ãããï¼</p>
<p>ç§ã¯ãæ¥å¹´ã«åããåç»ã¬ãã¥ã¼ãé²ãã¦ããã¾ããï¼ç¬ï¼</p>
<h2 id="We-are-hiring-">We are hiring !!</h2>
<p>ã¨ã ã¹ãªã¼ã§ã¯ãå¹´æ«ã®ãã°ãé¤
ãããã¡æçãæè¡ã大好ããªæ欲ã®ããã¨ã³ã¸ãã¢ãåéãã¦ãã¾ãã
ã¨ã ã¹ãªã¼ããã¯ãã¼ã¯ã§ã®ã¼ã¯ãªãã¼ã¯ãéé±ã§æ¥½ãããã®ãã¨ã ã¹ãªã¼ã ãï¼</p>
<p>æ°åã»ä¸éããããã®æ¡ç¨ã ãã§ãªããã«ã¸ã¥ã¢ã«é¢è«ãã¤ã³ã¿ã¼ã³ã常æåéãã¦ãã¾ãã®ã§ãããããé¡ããã¾ãï¼</p>
<h3 id="ã¨ã³ã¸ãã¢æ¡ç¨ãã¼ã¸ã¯ãã¡ã">ã¨ã³ã¸ãã¢æ¡ç¨ãã¼ã¸ã¯ãã¡ã</h3>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjobs.m3.com%2Fengineer%2F" title="ã¨ã³ã¸ãã¢æ¡ç¨ãµã¤ãï½æ¡ç¨æ
å ± | å»çÃãã¯ããã¸ã¼ã®å¯è½æ§ã¯ç¡é大" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jobs.m3.com/engineer/">jobs.m3.com</a></cite></p>
<h3 id="ã«ã¸ã¥ã¢ã«é¢è«ããæ°è»½ã«ã©ãã">ã«ã¸ã¥ã¢ã«é¢è«ããæ°è»½ã«ã©ãã</h3>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjobs.m3.com%2Fengineer%2Fcasual-session%2F" title="ã¨ã³ã¸ãã¢æ¡ç¨ãµã¤ãï½æ¡ç¨æ
å ± | å»çÃãã¯ããã¸ã¼ã®å¯è½æ§ã¯ç¡é大" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jobs.m3.com/engineer/casual-session/">jobs.m3.com</a></cite></p>
<h3 id="ã¤ã³ã¿ã¼ã³ã常æåéãã¦ãã¾ã">ã¤ã³ã¿ã¼ã³ã常æåéãã¦ãã¾ã</h3>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fopen.talentio.com%2Fr%2F1%2Fc%2Fm3%2Fhomes%2F4354" title="ãæ°åãã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ã åéä¸è¦§ / ã¨ã ã¹ãªã¼æ ªå¼ä¼ç¤¾" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://open.talentio.com/r/1/c/m3/homes/4354">open.talentio.com</a></cite></p>
vaaaaaanquish
ã¨ã ã¹ãªã¼ã®AIã»æ©æ¢°å¦ç¿ãã¼ã ã£ã¦ä½ãã£ã¦ãã®ï¼2024å¹´1å¹´éã§ä½ã£ã¦ãã28åã®ãããã¯ãã大å
Ž
hatenablog://entry/6802418398312664579
2024-12-31T10:00:00+09:00
2024-12-31T13:28:18+09:00 ããã«ã¡ã¯ãã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ãã¼ãã©ã«ããã¸ã£ã¼ & æ©æ¢°å¦ç¿ã¨ã³ã¸ãã¢ã®å¤§å£ã§ãã ãã¦ãç§ãæ©æ¢°å¦ç¿ã¨ã³ã¸ãã¢ã¨ãã¦ä»äºããã¦ããAIã»æ©æ¢°å¦ç¿ãã¼ã ã§ã¯ãä»å¹´ä¸å¹´ã§28åã®ãããã¯ãããªãªã¼ã¹ãã¾ãããæã«2ã¤ãããã¯æ°è¦ãããã¯ããåºã¦ãè¨ç®ã§ããããªããªãé«éã«ãªãªã¼ã¹ã§ãã¦ããã®ã§ã¯ãªãã§ããããã ãªãããã®1å¹´ã§5åã®ã¡ã³ãã¼ãæ°è¦ã«å ããããã¼ã ã12人ãã17人ã«ãªã£ãã®ã§ãæ¥å¹´ã¯æ´ã«å éãã¦ããããã§ãï¼*1 ãããã®ãããã¯ããç°¡åã«ãè¦ããã¤ã¤ãã¨ã ã¹ãªã¼ã¨ããå»çxWebã®ä¼æ¥ã§MLã®ãã¼ã ã¯ã©ãããä»äºããã¦ããã®ããã¨ããã®ããå±ãã§ããã°ã¨æãã¾ãï¼ å¤â¦
<p>ããã«ã¡ã¯ãã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ãã¼ãã©ã«ããã¸ã£ã¼ & æ©æ¢°å¦ç¿ã¨ã³ã¸ãã¢ã®å¤§å£ã§ãã</p>
<p>ãã¦ãç§ãæ©æ¢°å¦ç¿ã¨ã³ã¸ãã¢ã¨ãã¦ä»äºããã¦ããAIã»æ©æ¢°å¦ç¿ãã¼ã ã§ã¯ãä»å¹´ä¸å¹´ã§28åã®ãããã¯ãããªãªã¼ã¹ãã¾ãããæã«2ã¤ãããã¯æ°è¦ãããã¯ããåºã¦ãè¨ç®ã§ããããªããªãé«éã«ãªãªã¼ã¹ã§ãã¦ããã®ã§ã¯ãªãã§ããããã
ãªãããã®1å¹´ã§5åã®ã¡ã³ãã¼ãæ°è¦ã«å ããããã¼ã ã12人ãã17人ã«ãªã£ãã®ã§ãæ¥å¹´ã¯æ´ã«å éãã¦ããããã§ãï¼<a href="#f-f1f8d85f" id="fn-f1f8d85f" name="fn-f1f8d85f" title=" ãããã¯ãã«ã«ã¿ã®ããã°ã«ããããã«ãä»å¹´ã¯ããæç¹ã§ã¯å¹´é15ãããã ã£ãã®ã§ãä»å¹´ãéçºé度ã1.5å以ä¸ã«ãªã£ã¦ã¾ã">*1</a></p>
<p>ãããã®ãããã¯ããç°¡åã«ãè¦ããã¤ã¤ãã¨ã ã¹ãªã¼ã¨ããå»çxWebã®ä¼æ¥ã§MLã®ãã¼ã ã¯ã©ãããä»äºããã¦ããã®ããã¨ããã®ããå±ãã§ããã°ã¨æãã¾ãï¼</p>
<p><figure class="figure-image figure-image-fotolife" title="å¤ãã£ã¡ãå¤ãã®ã§ãæ°ã¡ã³ãã¼ã¯ã«ã«ã¿ã§ãããã¯ããè¦ãã¦ãã¾ãã"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241231/20241231100006.png" width="800" height="518" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>å¤ãã£ã¡ãå¤ãã®ã§ãæ°ã¡ã³ãã¼ã¯ã«ã«ã¿ã§ãããã¯ããè¦ãã¦ãã¾ãããã®ã«ã«ã¿èªä½ãLazzaroniã¨ãããããã¯ãã§ã<br/><a href="https://www.m3tech.blog/entry/2024/08/19/163000">年間15個以上のプロダクトをリリースするAIチームを入社したてのフレッシュな目線で紹介する - エムスリーテックブログ</a></figcaption></figure></p>
<ul class="table-of-contents">
<li><a href="#2024å¹´ã«ç«ã¡ä¸ããããAIæ©æ¢°å¦ç¿ããã¸ã§ã¯ãä¸è¦§">2024å¹´ã«ç«ã¡ä¸ããããAIã»æ©æ¢°å¦ç¿ããã¸ã§ã¯ãä¸è¦§</a></li>
<li><a href="#ã¬ã³ã¡ã³ã">ã¬ã³ã¡ã³ã</a><ul>
<li><a href="#ã³ã³ãã³ãã®åé">ã³ã³ãã³ãã®åé</a></li>
<li><a href="#æ±äººã®æé©å">æ±äººã®æé©å</a></li>
<li><a href="#ã¯ãã¹ãµã¼ãã¹">ã¯ãã¹ãµã¼ãã¹</a></li>
<li><a href="#å
é¨åºåæ ">å
é¨åºåæ </a></li>
</ul>
</li>
<li><a href="#ã¦ã¼ã¶ã¼åãã¢ããªã±ã¼ã·ã§ã³">ã¦ã¼ã¶ã¼åãã¢ããªã±ã¼ã·ã§ã³</a><ul>
<li><a href="#EBHS">EBHS</a></li>
<li><a href="#製è¬æ¥çã®æ¹åãPWAã¢ããªã±ã¼ã·ã§ã³">製è¬æ¥çã®æ¹åãPWAã¢ããªã±ã¼ã·ã§ã³</a></li>
</ul>
</li>
<li><a href="#æ
å ±æä¾ã®ãªã¼ãã¡ã¼ã·ã§ã³">æ
å ±æä¾ã®ãªã¼ãã¡ã¼ã·ã§ã³</a><ul>
<li><a href="#æç³»åã§ã®èå³ã¢ããªã³ã°">æç³»åã§ã®èå³ã¢ããªã³ã°</a></li>
<li><a href="#èªåé
ä¿¡">èªåé
ä¿¡</a></li>
<li><a href="#å¤é¨åºå">å¤é¨åºå</a></li>
<li><a href="#ããã·ã¥ãã¼ã">ããã·ã¥ãã¼ã</a></li>
</ul>
</li>
<li><a href="#è¨åºAI">è¨åºAI</a><ul>
<li><a href="#ç·ç¶åILDã®æ©æ診æã®ããã®BMAXããªãªã¼ã¹ããã¾ãã">ç·ç¶åILDã®æ©æ診æã®ããã®BMAXããªãªã¼ã¹ããã¾ãã</a></li>
<li><a href="#PAHã®è¨ºæã®ç 究ããªãªã¼ã¹ãã¾ãã">PAHã®è¨ºæã®ç 究ããªãªã¼ã¹ãã¾ãã</a></li>
<li><a href="#ãã®ä»ã¾ã éçºä¸ã®ãã®">ãã®ä»ã¾ã éçºä¸ã®ãã®</a></li>
</ul>
</li>
<li><a href="#ä»ã®MLãããã¯ãã«æä¾ããããã®å
é¨ã¨ã³ã¸ã³ãããã¯ã">ä»ã®MLãããã¯ãã«æä¾ããããã®å
é¨ã¨ã³ã¸ã³ãããã¯ã</a><ul>
<li><a href="#LLMã«ããè¨äºã®æ§é å">LLMã«ããè¨äºã®æ§é å</a></li>
<li><a href="#åç»ãã¼ã¿ã®æåèµ·ããæ§é å">åç»ãã¼ã¿ã®æåèµ·ããã»æ§é å</a></li>
<li><a href="#æç« ãããæãã®å ´æã§åºåã">æç« ãããæãã®å ´æã§åºåã</a></li>
</ul>
</li>
<li><a href="#MLã¤ã³ãã©">MLã¤ã³ãã©</a><ul>
<li><a href="#å
製æ©æ¢°å¦ç¿ãã¤ãã©ã¤ã³gokartã«å¼·åãªåãµãã¼ããå°å
¥ãã">å
製æ©æ¢°å¦ç¿ãã¤ãã©ã¤ã³gokartã«å¼·åãªåãµãã¼ããå°å
¥ãã</a></li>
<li><a href="#ãã¼ã å
linter">ãã¼ã å
linter</a></li>
</ul>
</li>
<li><a href="#We-are-hiring-">We are hiring !!</a><ul>
<li><a href="#ã¨ã³ã¸ãã¢æ¡ç¨ãã¼ã¸ã¯ãã¡ã">ã¨ã³ã¸ãã¢æ¡ç¨ãã¼ã¸ã¯ãã¡ã</a></li>
<li><a href="#ã«ã¸ã¥ã¢ã«é¢è«ããæ°è»½ã«ã©ãã">ã«ã¸ã¥ã¢ã«é¢è«ããæ°è»½ã«ã©ãã</a></li>
<li><a href="#ã¤ã³ã¿ã¼ã³ã常æåéãã¦ãã¾ã">ã¤ã³ã¿ã¼ã³ã常æåéãã¦ãã¾ã</a></li>
</ul>
</li>
</ul>
<h2 id="2024å¹´ã«ç«ã¡ä¸ããããAIæ©æ¢°å¦ç¿ããã¸ã§ã¯ãä¸è¦§">2024å¹´ã«ç«ã¡ä¸ããããAIã»æ©æ¢°å¦ç¿ããã¸ã§ã¯ãä¸è¦§</h2>
<p>AIãã¼ã ã§ã¯ããã¼ãã«æ²¿ã£ãA~Zã®ååããããã¯ãã«ã¤ãã¦ããã2024å¹´ã¯ã2024å¹´1æã«ä½ãããå·ã®ååã·ãªã¼ãºå¾åã®V(Volgaãã³ã³ãã³ãã«LLMã§èå¥çã¿ã°ä»ã)ããå§ã¾ããé
ã®ååã·ãªã¼ãºãã»ã¼ä¸å¨å¨ããV(Vermouthãåç»ã®æ¸ãèµ·ããã¨ãã£ãã¿ã¼çæ)ã2024å¹´12æã«æå¾ã«ãªãªã¼ã¹ããã¾ããã
é
ã®ååã·ãªã¼ãºã§A-Zã4é±ç®ãªã®ã§ãAIã»æ©æ¢°å¦ç¿ãã¼ã çºè¶³ä»¥æ¥ã§è¨ãã¨ããã£ãããã¾ã¯100åç¨åº¦ã®ãããã¯ãããããã¨ã«ãªãã¾ãã</p>
<p>æ°ã ã話ãã¦ãã©ããããããªãã®ã§ãAIã»æ©æ¢°å¦ç¿ãã¼ã ã§2024å¹´ã«ç«ã¡ä¸ãããããããã¯ãã®ååã¨ä¸è¨ã¾ã¨ãã大å
¬éãã¾ãï¼</p>
<div><style>
table.ogaki{
width: 100%;
border-collapse: separate;
border-spacing: 5px;
}
table.ogaki th,table td{
padding: 10px 0;
text-align: center;
border-radius: 5px;
}
table.ogaki tr:nth-child(even){
background-color: #eee
}
table.ogaki tr:nth-child(odd){
background-color: rgb(13,39,102);
color: #eee;
}
</style></div>
<table class="ogaki" style="font-size: 100%;font-weight: bold">
<tbody>
<tr>
<td>Volga<br/>ã¿ã°ä»ã</td>
<td>Wulik<br/>ç»åå¤æ</td>
<td>Xingu<br/>å調ãã£ã«ã¿ãªã³ã°</td>
<td>Yodogawa<br/>ã¢ã³ã±ã¼ãé
ç®ã®æ§é å </td>
</tr>
<tr>
<td> Zambezi<br/>ç»åçæ </td>
<td> Asti<br/>å¤é¨åºåæ¯æ´ </td>
<td> Brandy<br/>ã¦ã¼ã¶ã¼æ´»åã®å¯è¦å </td>
<td> Chita<br/>æç³»åæé·ãã¼ãã«ãã¼ã¿</td>
</tr>
<tr>
<td> Dunkel<br/>ç¾æ£æç³»åäºæ¸¬ã¢ãã« </td>
<td> Eiswein<br/>ã«ã«ãã®æ§é å </td>
<td> Fizz<br/>ãã¼ã±ãã£ã³ã°ãã¼ã¿é£æº </td>
<td> Gin<br/>åæ¥è¡åã«ããã¬ã³ã¡ã³ã </td>
</tr>
<tr>
<td> Hoegaarden<br/>ãã¼ã¿ä¸å¿PWAã¹ããã¢ã㪠</td>
<td> Iichiko<br/>ãªã³ã©ã¤ã³ã¬ã³ã¡ã³ã </td>
<td> Jura<br/>åå¯ã </td>
<td> Kir<br/>ã¯ãã¹ãµã¼ãã¹ã¬ã³ã¡ã³ã1 </td>
</tr>
<tr>
<td> Lazzaroni<br/>ãããã¯ãåã«ã«ã¿ </td>
<td> Mojito<br/>ã¹ãããé
ä¿¡ </td>
<td> No.6<br/>ç®èç¾æ£ã®è¨ºæAI </td>
<td> Orion<br/>PVãã¼ã¿ã®ã¢ããªã³ã°ã¨ã³ã¸ã³ </td>
</tr>
<tr>
<td> Pisco<br/>ã¢ãã«åºåæä¾ããã«ã¦ã§ã¢ </td>
<td> Queen<br/>ããã·ã¥éç¥ã¬ã³ã¡ã³ã </td>
<td> Rum<br/>æ±äººã¬ã³ã¡ã³ã </td>
<td> Sauvignon<br/>ã¯ãã¹ãµã¼ãã¹ã¬ã³ã¡ã³ã2 </td>
</tr>
<tr>
<td> Tokaji<br/>æ±äººã¬ã³ã¡ã³ã2 </td>
<td> Underberg<br/>ã¯ãã¹ãµã¼ãã¹ã¬ã³ã¡ã³ã3 </td>
<td> Vermouth<br/>åç»ã®æ¸ãèµ·ããã»æ§é å </td>
<td> Whiskey<br/>è¨äºä¸ã®ç
é¢ã®ã¿ã°ä»ã </td>
</tr>
</tbody>
</table>
<p>å
·ä½çãªãµã¼ãã¹ã¯ããããªãã®ã§ã¬ã³ã¡ã³ã1,2...ã¿ããã«ãªã£ã¦ãã¾ã£ã¦ãããã®ãããã¾ãããé°å²æ°æ´ãã§ããã ããã®ã§ã¯ãªãã§ããããã</p>
<p>ãã®å¾ã®ç« ã§ã¯ãæ´ã«åéãã¨ã«ãã£ããã©ããããã¨ãã£ã¦ããã®ç´¹ä»ããã¾ãã</p>
<h2 id="ã¬ã³ã¡ã³ã">ã¬ã³ã¡ã³ã</h2>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241231/20241231100017.png" width="800" height="334" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p>
<p>2024å¹´ã®éçºãªã¹ããè¦ã¦ããããã¨æãã¾ããããã¯ãwebãµã¼ãã¹ã®ä¼ç¤¾ã§MLãã¼ã ãæãåãçºæ®ããåéã®ä¸ã¤ã¯ã¬ã³ã¡ã³ãã¼ã·ã§ã³ã§ãã</p>
<h4 id="ã³ã³ãã³ãã®åé">ã³ã³ãã³ãã®åé</h4>
<p>ä¾ãã°å»å¸«ã³ãã¥ããã£å
ã®ã³ã³ãã³ãã ã£ããã§ã次ãã次ã¸ã¨ããããªæ稿ãèªã¿ãããã¿ãããªãµã¼ãã¹ãããã¾ãããããã®ãµã¼ãã¹ã§ã¯è¨äºãã¨ã«ã次ã¯ãã®è¨äºããªã¹ã¹ã¡ãªã®ã§èªãã§ã¿ã¦ä¸ãããã¨ããå½¢ã§ããµã¼ãã¹å
ã®åéãä¿ãã¬ã³ã¡ã³ããã¦ã¼ã¶ã¼ä½é¨ã«ååã«å¹ãã¾ããè«æã®ãããªã¹ããã¯åã®ã³ã³ãã³ãã§ã¯å調ãã£ã«ã¿ãªã³ã°ãã¼ã¹ã ã£ããããã¥ã¼ã¹ã®ãããªããã¼åã®ã³ã³ãã³ãã§ã¯ãªã³ã©ã¤ã³å¦ç¿ãã¼ã¹ã ã£ãããä¸å£ã«åéã¬ã³ã¡ã³ãã¨è¨ã£ã¦ãã³ã³ãã³ãã®è³ªãã¨ã«ã¢ãã«ã¯å¤å²ã«ãããã¾ãã</p>
<h4 id="æ±äººã®æé©å">æ±äººã®æé©å</h4>
<p>ã¨ã ã¹ãªã¼ã®ãµã¤ãã®ä¸ã«ã¯ãå»å¸«ãè¬å¤å¸«ãå»çå¾äºè
ã®çæ§ã®ããã®æ±äººæ
å ±ãæä¾ãã¦ãããµã¼ãã¹ãããã¾ãã
ç¾å¨ã®å±
ä½å°ããç¡çãªãéããç¯å²ã§èªåã«ãã£ãæ±äººãããããã¨ããã®ã¯é常ã«éè¦ãªãã¼ã½ãã©ã¤ãºã§ãã®ã§ããã¡ããã¨ã ã¹ãªã¼ã§ã¯ãã®æ±äººãã¼ã½ãã©ã¤ãºãéçºãã¦ãã¾ãã</p>
<h4 id="ã¯ãã¹ãµã¼ãã¹">ã¯ãã¹ãµã¼ãã¹</h4>
<p>ã¨ã ã¹ãªã¼ã®ãããªè¤æ°ãµã¼ãã¹ãæã¤ä¼ç¤¾ã«ã¨ã£ã¦ããããµã¼ãã¹ã¯ä½¿ã£ã¦ããã©ãä»ã®ãµã¼ãã¹ã¯ããã¾ã§ã§ã¯ãªããã¨ããã¦ã¼ã¶ã¼ã®æ¹ã¯ãã¾ã æ°ã¥ãã¦ããã£ã¦ããªãè¯ãããããã¨ããæå³ã§ãã£ãããªãããã§ãããã®ãµã¼ãã¹ã§ããããè¡åããã¦ãã人ã«ã¯ãã£ã¡ã®ãµã¼ãã¹ãåºããããããªããï¼ãªã©ã®è¦³æ¸¬ãéãã¦ãã¦ã¼ã¶ã¼ã®çæ§ãæ°ã¥ãã¦ããªããµã¼ãã¹ã¸ã®åç·ãæä¾ããã®ãã¬ã³ã¡ã³ãã®ä¸ã¤ã§ãã</p>
<h4 id="å
é¨åºåæ ">å
é¨åºåæ </h4>
<p>å
é¨ã§åºåã£ã¦ã©ããããã¨ï¼ã¨æããããããã¾ããããããã¯åé
ã®ã¯ãã¹ãµã¼ãã¹ãããæ½è±¡åããæ ã¨ãªãã¾ãã
ä¾ãã°ãè«æãèªã¿ã«æ¥ãå
çã«è¬å¤ã®æ
å ±ãæä¾ããããã¨ããå½¢ã§ãã
ãããåºåæ ã¨èãã¦ããçç±ã¯ãåºåã®ä»çµã¿ã¨åæ§ã«ãåãµã¼ãã¹ãæ ãæä¾ãã¦ãããã«ã¦ã¼ã¶ã¼ãã¨ã«æé©ãªã³ã³ãã³ãããå
·ä½çã«ã¯CTR/CVRãäºæ¸¬ãã¦æ½é¸ããåºãä»çµã¿ã«ãã¦ããããã§ãã</p>
<p>ãã®ç¹æ§ä¸ã¨ã ã¹ãªã¼ã®ã¬ã³ã¡ã³ãé åã§ãããªãèªç±åº¦ãé«ãããã¤ãã³ã³ãã¯ã¹ããæ´»ãããã¬ã³ã¡ã³ããæå¾
ãããé åã§ãæ£ç´ã¾ã ã¾ã ããããã¦ãªããã§ãããç¹ã«ä»å¹´ã¯ãæ·±ãã³ã³ãã¼ã¸ã§ã³(ã¯ãªãã¯ã ããããªããã®å¾ã³ã³ãã³ãããã£ããè¦ã)ãã¬ã³ã¡ã³ãèªä½ã®ããã©ã¼ãã³ã¹ãè½ã¡ãªãããã«åè£ãæ©ãã«è¶³åããããçã®ãµãã¢ã«ã´ãªãºã ã追å ãã¾ããã</p>
<h2 id="ã¦ã¼ã¶ã¼åãã¢ããªã±ã¼ã·ã§ã³">ã¦ã¼ã¶ã¼åãã¢ããªã±ã¼ã·ã§ã³</h2>
<p>AIã»æ©æ¢°å¦ç¿ãã¼ã ã§ã¯ãå®ã¯ããã³ãã¨ã³ããå«ããã¢ããªã±ã¼ã·ã§ã³ãä½æãã¦ãã¾ãããã¼ã¿ã»æ©æ¢°å¦ç¿ããã¨ã«ã¨ã ã¹ãªã¼ã®ãã¹ã¦ãåä¸ãããã®ãããã·ã§ã³ãªã®ã§ããªããµã¼ãã¹ã¯èªåã§ä½ããã¨ããã®ãããã·ã§ã³ã«å«ã¾ããããã§ãã</p>
<h4 id="EBHS">EBHS</h4>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fm3comlp.m3.com%2Flp%2Febhs-life%2Febhs-life%2F" title="EBHS Life | ã¨ã ã¹ãªã¼æ ªå¼ä¼ç¤¾" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://m3comlp.m3.com/lp/ebhs-life/ebhs-life/">m3comlp.m3.com</a></cite></p>
<p>å¥åº·è¨ºæã®çµæã£ã¦æ¼«ç¶ã¨è¦³ã¦ãã¾ããã¨ããã¾ããããã¨ã ã¹ãªã¼ã§ã¯å¥åº·è¨ºæã®çµæããã¨ã«ãå¥åº·å¯¿å½ã«ã©ããããå½±é¿ãåã¼ãã®ããã©ãæ¹åãããããã®ããã¨ããã®ãå人ã¬ãã«ã»ä¼æ¥ã¬ãã«ã§æä¾ããEBHSã¨ãããµã¼ãã¹ãéå¶ãã¦ãã¾ãããã®ãµã¼ãã¹ã®ä¸ã®äºæ¸¬ã¢ãã«ã¯ãã¡ããããã¼ã¿é£æºã»èªè¨¼ã»ããã³ãã¨ã³ãããµããã¦ã¾ãã£ã¨AIã»æ©æ¢°å¦ç¿ãã¼ã ã®ã¨ã³ã¸ãã¢ãéçºãã¦ãã¾ãã</p>
<h4 id="製è¬æ¥çã®æ¹åãPWAã¢ããªã±ã¼ã·ã§ã³">製è¬æ¥çã®æ¹åãPWAã¢ããªã±ã¼ã·ã§ã³</h4>
<p>ç¾æ£ã®ãã¼ã¿ããå¤æ§ãªã³ã³ãã³ãã®ã¯ãã¹ã¬ã³ã¡ã³ããæ±ãAIã»æ©æ¢°å¦ç¿ãã¼ã ã¨ãã¦ãå®ã¯ãããã®ãã¼ã¿ãæ´»ããããã¹ããã§ã¢ã¯ã»ã¹ããããã®PWAã¢ããªã±ã¼ã·ã§ã³ãéçºããããã¦ãã¾ãã
ãã¾æãéè¦ãªç¾æ£ããã¥ã¼ã¹ã®æ
å ±ãããã·ã¥éç¥ã§å±ããããªã©ãã¹ããã®ä½é¨ãæ大ã«æ´»ããã¦æ¥çå
ã®æ´»åãæ¯æ´ãã¦ãã¾ãã
ãã¡ãããã¶ã¤ã³ã°ã«ã¼ããä»ãã¼ã ã®ãããã¯ãããã¼ã¸ã£ã¼ã¨ååãã¦UIã®ç£¨ãè¾¼ã¿ãè¡ãã¾ãã</p>
<h2 id="æ
å ±æä¾ã®ãªã¼ãã¡ã¼ã·ã§ã³">æ
å ±æä¾ã®ãªã¼ãã¡ã¼ã·ã§ã³</h2>
<p>ã¬ã³ã¡ã³ãã®ãããªãã©ãã¯ããã¯ã¹å¯ããªæé©åãè¯ãã®ã§ããã"ãããã人ã«ããããã¿ã¤ãã³ã°ã§ãããªæ
å ±å±ããããã°åãã§ããããã®ã«ãª"ã¨ããå
·ä½çãªèª²é¡ããæ½çéçºè
ã¨ååãã¦å®ç¾ãã¦ããã®ããã¼ã¿ã»MLã®éè¦ãªå½¹å²ã§ãã</p>
<h4 id="æç³»åã§ã®èå³ã¢ããªã³ã°">æç³»åã§ã®èå³ã¢ããªã³ã°</h4>
<p>ã¦ã¼ã¶ã¼ã®çæ§ã«ã¨ã£ã¦ãæãèå³ãé«ãã¿ã¤ãã³ã°ã§é¢ç½ãè¨äºãé
ä¿¡ããã¦ã»ããããã§ãããã®ãèå³ã¨ããã®ã¯é£ç¶çã«å¤åãããã®ãªã®ã§ã誰ãã»ä½ã«èå³ãããã ãã§ã¯ãªãããã¤ãèå³ããããã®ã¢ããªã³ã°ãé常ã«éè¦ãªåéã§ãã</p>
<h4 id="èªåé
ä¿¡">èªåé
ä¿¡</h4>
<p>ã¢ããªã³ã°ã§ããã ãã§ã¯ä¸è¶³ãªã®ã§ããã«ãããããé©åãªäººã«é©åã«æ
å ±ãå±ãããã¨ããã·ã¹ãã åãMLãã¼ã ã§åãçµãã§ãã¾ãã</p>
<h4 id="å¤é¨åºå">å¤é¨åºå</h4>
<p>ã¨ã ã¹ãªã¼ã§ããä»åªä½ã®å¤é¨åºåã¯å©ç¨ãããã¨ãããã¾ãããã®éã«ãããããåºåã«ãªããªãããã«ãåºãããããªäººã«åºãããããªå
容ã ããåºãããã
ãã®ããã«ã¯ã社å
ã§ã¿ã¼ã²ãã£ã³ã°ã®ã¬ã³ã¡ã³ãã¨ã³ã¸ã³ãåãããããæé©ãªæè¨ãçæããããåãããã¬ã³ã¡ã³ãã¨ã³ã¸ã³ãå
ã«å
¥ç¨¿ãããã¨å²ã¨æ§ã
ãªæé©åãããå¿
è¦ãããã¾ãã</p>
<h4 id="ããã·ã¥ãã¼ã">ããã·ã¥ãã¼ã</h4>
<p>ä¸è¨ãããã¯ããã¡ãä¾ãã°èªåé
ä¿¡ã試ä½éçºã¡ã³ãã¼ã«æä¾ããå¾ã«ãå®éãããã¦ã¼ã¶ã¼ã«ã¨ã£ã¦è¯ãã£ããã®ã«ãªã£ã¦ããããã£ã¨ä¼¸ã°ããã¨ããã¯ãªãããã¨ããå¯è¦åããã£ã¦ããæ½çã磨ããããã§ããAIã«ããåºåã¨æ½çãåã¿åã£ã¦ãããããªã©ãããã·ã¥ãã¼ããéãã¦ææ¡ã§ããããã«ããã®ããã¡ããä»äºã®ä¸ç°ã«ãªãã¾ãã</p>
<p>ä¸æ¹ã§ãããã·ã¥ãã¼ãã®ä¹±é ã¯ãããã¯ããã§ä»äºã®ããã®ä»äºã«ãªãã®ã§æ°ãã¤ãã¦ãã¾ããã·ã³ãã«ãªä»çµã¿ã§ããã·ã¥ãã¼ããä½ããããã«ããããslackéç¥ã§å®çµããé¨åã¯slackã«éãããã¤ã³ã¿ãã§ã¼ã¹ãã¹ãã¬ããã·ã¼ãã§ååãªãã®ã¯ã¹ãã¬ããã·ã¼ãããã®Bigqueryé£æºã¨ããããªã©ãããã·ã¥ãã¼ããç®çã¨ããªãä»äºã®ä»æ¹ããã¦ãã¾ãã</p>
<h2 id="è¨åºAI">è¨åºAI</h2>
<p>å»çã®åéã§MLã¨ããã¨ãç»å診æãªã©ã¯ã¤ã¡ã¼ã¸æ¹§ããããããããã¾ãããã¨ã ã¹ãªã¼ã®MLãã¼ã ã§ãè¨åºç¾å ´ã§ä½¿ãããAIã®éçºã«åãçµãã§ãã¾ãã</p>
<h4 id="ç·ç¶åILDã®æ©æ診æã®ããã®BMAXããªãªã¼ã¹ããã¾ãã">ç·ç¶åILDã®æ©æ診æã®ããã®BMAXããªãªã¼ã¹ããã¾ãã</h4>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fm3comlp.m3.com%2Flp%2Fm3com%2FBMAX" title="BMAX | ç·ç¶åILDã®æ¤åºãæ¯æ´ããAI" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://m3comlp.m3.com/lp/m3com/BMAX">m3comlp.m3.com</a></cite></p>
<h4 id="PAHã®è¨ºæã®ç 究ããªãªã¼ã¹ãã¾ãã">PAHã®è¨ºæã®ç 究ããªãªã¼ã¹ãã¾ãã</h4>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fbmcpulmmed.biomedcentral.com%2Farticles%2F10.1186%2Fs12890-024-02891-4" title="Artificial intelligence-based model for predicting pulmonary arterial hypertension on chest x-ray images - BMC Pulmonary Medicine" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://bmcpulmmed.biomedcentral.com/articles/10.1186/s12890-024-02891-4">bmcpulmmed.biomedcentral.com</a></cite></p>
<h4 id="ãã®ä»ã¾ã éçºä¸ã®ãã®">ãã®ä»ã¾ã éçºä¸ã®ãã®</h4>
<p>ã¦ã§ã¢ã©ãã«ããã¤ã¹ãç
çç»åããã¡ããè¸é¨ãã®ä»Xç·ã»CTãªã©æ§ã
ãªã¢ããªãã£ã®ã¢ãã«ãä½æãã¦ãã¾ã</p>
<h2 id="ä»ã®MLãããã¯ãã«æä¾ããããã®å
é¨ã¨ã³ã¸ã³ãããã¯ã">ä»ã®MLãããã¯ãã«æä¾ããããã®å
é¨ã¨ã³ã¸ã³ãããã¯ã</h2>
<h4 id="LLMã«ããè¨äºã®æ§é å">LLMã«ããè¨äºã®æ§é å</h4>
<p>AIã»æ©æ¢°å¦ç¿ãã¼ã ã§ã®LLMã®ãã£ã¨ãéè¦ãªå©ç¨ã¯ãæ¢åã®è³ç£ã(ãªã³ããã³ãã§)æ§é åããé¨åã¨ãªãã¾ãã
ä¾ãã°ãè¡æ¶²ã®ããã«ã¤ãã¦æ
å ±ãå¿
è¦ãªã¦ã¼ã¶ã¼ãå±
ãã¨ãã«ãããããã©ã®è¨äºãè¡æ¶²ã®ããã«é¢é£ãããã®ã§ããããããã£ã¦ãªãã¨ã¬ã³ã¡ã³ãã®ç²¾åº¦ãè½ã¡ãããã§ãããã</p>
<p>ãã¡ããåºæ¬çã«ã¯ããããæ§é åãå°ç¨ã¢ãã«ãä½ãã°ããããã§ãããLLMã§æ§é åãããã¨ã«ãã£ã¦ãããç¹åããæ½çãçæéã§ç«ã¡ä¸ãããããã¨ãé常ã«ä¾¿å©ã§ãã</p>
<h4 id="åç»ãã¼ã¿ã®æåèµ·ããæ§é å">åç»ãã¼ã¿ã®æåèµ·ããã»æ§é å</h4>
<p>ãã¡ããæ§é åã¯ããã¹ãã®è¨äºã ãã§ã¯ããã¾ãããåç»ã»ç»åã»å»ç¨ç»åã»å¥åº·è¨ºæãã¼ã¿ã»ãã®ä»å»çãã¼ã¿ãªã©ãè¨äºä»¥å¤ã«ãæ§é åãããã¨ã§å©ç¨ä¾¡å¤ãéãããã¼ã¿ã¯é常ã«å¤ãããã¾ããç´è¿ã®ãããã¯ãã§ã¯ãåç»ãå
ã«ãæåèµ·ãããã¤ã¤æ§é åãããã¨ããã®ãã¤ã³ã¿ã¼ã³ã®2é±éã§ãªãªã¼ã¹ãã¾ããã</p>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241231/20241231100014.png" width="800" height="359" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p>
<p><a href="https://www.m3tech.blog/entry/2024/12/19/170000">インターンではじめてのプロダクト開発を経験した話【ソフトウェアエンジニアインターン参戦記】 - エムスリーテックブログ</a></p>
<h4 id="æç« ãããæãã®å ´æã§åºåã">æç« ãããæãã®å ´æã§åºåã</h4>
<p>ããã¾ã§ç´¹ä»ãããããããããã®ä»¥å¤ã«ãã¡ãã£ã¨é¢ç½ããããã¯ããç´¹ä»ããã¨ãããé·ãæç« ããé©åãªæ¹è¡ããã¦ãä¾ãã°ä¸è¡ã§ã¾ã¨ããã
ã¨ãããã®ã1ãããã¯ãã¨ãã¦åãã¦ããããã¾ãã
ãªãã§ãããã»ãããã¨è¨ãã¨ãå¤é¨ã»å
é¨ã®åºåã ã£ãããã¡ã¼ã«ãã¬ã¸ã³ã ã£ããã§ã³ã³ãã³ããç´¹ä»ããã¨ãã«ãã©ããã¦ãç´¹ä»æãè¤æ°è¡ã«é³´ã£ã¦ãã¾ãããã§ããããã®æã®è¦æ ãã¯ã¦ã¼ã¶ã¼ã®ç解ã«é常ã«å½±é¿ãå¼·ãããã§ãã
ãã®ããã«ãæ±ç¨çã§ãããããã«çªãè©°ããã¨é常ã«éè¦ãªåé¡ã«ãªããããã¯ããã¨ããã®ãå
é¨é£æºã§ã¯ããããã¾ãã</p>
<h3 id="MLã¤ã³ãã©">MLã¤ã³ãã©</h3>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241231/20241231100010.png" width="800" height="425" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p>
<p>27ã®ãããã¯ãåã«ã¯ãªã£ã¦ãªããã©ããã¼ã ã®éçºé度ãåä¸ããããã®æ½çããã¡ããã¡ããã£ã¦ã¾ãã</p>
<p>ç¹ã«é¢ç½ãã¨ããã¯ãã¤ã³ãã©æ
å½ãããã¨ãã§ã¯ãªããMLã¨ã³ã¸ãã¢ã»ã½ããã¦ã§ã¢ã¨ã³ã¸ãã¢ã»MLOpsã¨ã³ã¸ãã¢ãåèªèªåã®æ°ã«ãªãã¨ãããã¬ã³ã¬ã³å¿«é©ã«ãã¦ãã£ãçµæã¤ã³ãã©ãæ´ã£ã¦ããã¨ããã§ãã</p>
<h4 id="å
製æ©æ¢°å¦ç¿ãã¤ãã©ã¤ã³gokartã«å¼·åãªåãµãã¼ããå°å
¥ãã">å
製æ©æ¢°å¦ç¿ãã¤ãã©ã¤ã³gokartã«å¼·åãªåãµãã¼ããå°å
¥ãã</h4>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.m3tech.blog%2Fentry%2Fai%2Fgokart-type" title="Genericããoverloadããã使ã£ã¦ãMLãã¤ãã©ã¤ã³ãã¼ã«gokartãåå®å
¨ã«ãã¦ã¿ã - ã¨ã ã¹ãªã¼ããã¯ããã°" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe></p>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.m3tech.blog%2Fentry%2Fgokart-mypy-plugin" title="mypy plugin ã«å
¥éãã¦ç¤¾å
OSS ã§ãã gokart ãåå®å
¨ã«ãã¦ã¿ã - ã¨ã ã¹ãªã¼ããã¯ããã°" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe></p>
<h4 id="ãã¼ã å
linter">ãã¼ã å
linter</h4>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.m3tech.blog%2Fentry%2F2024%2F10%2F02%2F110000" title="ãã¼ã ã§å¹ããããã¹ããã©ã¯ãã£ã¹ãlintã¨ãã¦å¨ç¥ãã - ã¨ã ã¹ãªã¼ããã¯ããã°" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe></p>
<h2 id="We-are-hiring-">We are hiring !!</h2>
<p><figure class="figure-image figure-image-fotolife" title="AIã»æ©æ¢°å¦ç¿ãã¼ã ç´¹ä»è³æãã"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241231/20241231100021.png" width="800" height="445" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>AIã»æ©æ¢°å¦ç¿ãã¼ã ç´¹ä»è³æãã<br/><a href="https://speakerdeck.com/m3_engineering/introduction-of-m3-ai-team">エムスリー AI・機械学習チーム紹介資料 / Introduction of M3 AI Team - Speaker Deck</a> </figcaption></figure></p>
<p>ã¨ã ã¹ãªã¼ã§ã¯ãMLãå°éã¨ãã¦ãããã¼ã ã§ããã¤ã¤ãã"ãªãã§ããã£ã¦ææãåºã"ã楽ãããã¨ã³ã¸ãã¢ãåéãã¦ãã¾ãã</p>
<p>å½è©²ãã¼ã ã§ã®MLã¨ã³ã¸ãã¢ã»ã½ããã¦ã§ã¢ã¨ã³ã¸ãã¢ã»MLOpsã¨ã³ã¸ãã¢ãå§ãã¨ãããã®ä»å¤æ§ãªãã¼ã ã§ã®åãæ¹ã«èå³ãããã¾ããããã²ã«ã¸ã¥ã¢ã«é¢è«ãå¿åä¸ããï¼</p>
<h3 id="ã¨ã³ã¸ãã¢æ¡ç¨ãã¼ã¸ã¯ãã¡ã">ã¨ã³ã¸ãã¢æ¡ç¨ãã¼ã¸ã¯ãã¡ã</h3>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjobs.m3.com%2Fengineer%2F" title="ã¨ã³ã¸ãã¢æ¡ç¨ãµã¤ãï½æ¡ç¨æ
å ± | å»çÃãã¯ããã¸ã¼ã®å¯è½æ§ã¯ç¡é大" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jobs.m3.com/engineer/">jobs.m3.com</a></cite></p>
<h3 id="ã«ã¸ã¥ã¢ã«é¢è«ããæ°è»½ã«ã©ãã">ã«ã¸ã¥ã¢ã«é¢è«ããæ°è»½ã«ã©ãã</h3>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjobs.m3.com%2Fengineer%2Fcasual-session%2F" title="ã¨ã³ã¸ãã¢æ¡ç¨ãµã¤ãï½æ¡ç¨æ
å ± | å»çÃãã¯ããã¸ã¼ã®å¯è½æ§ã¯ç¡é大" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jobs.m3.com/engineer/casual-session/">jobs.m3.com</a></cite></p>
<h3 id="ã¤ã³ã¿ã¼ã³ã常æåéãã¦ãã¾ã">ã¤ã³ã¿ã¼ã³ã常æåéãã¦ãã¾ã</h3>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fopen.talentio.com%2Fr%2F1%2Fc%2Fm3%2Fhomes%2F4354" title="ãæ°åãã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ã åéä¸è¦§ / ã¨ã ã¹ãªã¼æ ªå¼ä¼ç¤¾" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://open.talentio.com/r/1/c/m3/homes/4354">open.talentio.com</a></cite></p>
<div class="footnote">
<p class="footnote"><a href="#fn-f1f8d85f" id="f-f1f8d85f" name="f-f1f8d85f" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text"> <a href="https://www.m3tech.blog/entry/2024/08/19/163000">ãããã¯ãã«ã«ã¿ã®ããã°</a>ã«ããããã«ãä»å¹´ã¯ããæç¹ã§ã¯å¹´é15ãããã ã£ãã®ã§ãä»å¹´ãéçºé度ã1.5å以ä¸ã«ãªã£ã¦ã¾ã</span></p>
</div>
Hi_king
AIãã¼ã Google Kubernetes Engineãªã³ãã¼ãã£ã³ã°ãã¥ã¼ããªã¢ã«
hatenablog://entry/6802418398315065216
2024-12-30T17:00:00+09:00
2024-12-30T17:00:01+09:00 ããã«ã¡ã¯ãAIã»æ©æ¢°å¦ç¿ãã¼ã ï¼ä»¥ä¸AIãã¼ã ï¼ãã¼ã ãªã¼ãã¼ãå
¼ãã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ãã¼ãã©ã«ããã¼ã¸ã£ã¼ã®æ¨ªæ¬(@yokomotod)ã§ãã AIãã¼ã ã§ã¯éçºããMLãããã¯ãã®å®è¡åºç¤ã¨ãã¦Google Kubernetes Engineï¼ä»¥ä¸GKEï¼ãæ¡ç¨ãã¦ãã¾ãããããã¤é¢é£ã³ã¼ãã®ãã³ãã¬ã¼ããæ´åãããæ°ãããããã¯ããã¹ã¿ã¼ããããã¨ãã¯GKEåå¿è
ã§ãç°¡åã«ãããã¤ã¾ã§æã£ã¦ãããããã«ãªã£ã¦ãã¾ãã ãããèªåçæã¯ä¸æ¹ã§ããªã«ãã©ããªã£ã¦ãããã¤ããã¦ããã®ããã©ãã¯ããã¯ã¹ã®ã¾ã¾ã«ãªã£ã¦ãã¾ããã¡ã¨ããåé¡ãããã¾ãã ããã§ä»åã¯ããã¼ã ã¡ã³ãã¼ã¸ã®ãªã³ãã¼â¦
<p>ããã«ã¡ã¯ãAIã»æ©æ¢°å¦ç¿ãã¼ã ï¼ä»¥ä¸AIãã¼ã ï¼ãã¼ã ãªã¼ãã¼ãå
¼ãã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ãã¼ãã©ã«ããã¼ã¸ã£ã¼ã®æ¨ªæ¬(<a href="https://x.com/yokomotod">@yokomotod</a>)ã§ãã</p>
<p>AIãã¼ã ã§ã¯éçºããMLãããã¯ãã®å®è¡åºç¤ã¨ãã¦Google Kubernetes Engineï¼ä»¥ä¸GKEï¼ãæ¡ç¨ãã¦ãã¾ãããããã¤é¢é£ã³ã¼ãã®ãã³ãã¬ã¼ããæ´åãããæ°ãããããã¯ããã¹ã¿ã¼ããããã¨ãã¯GKEåå¿è
ã§ãç°¡åã«ãããã¤ã¾ã§æã£ã¦ãããããã«ãªã£ã¦ãã¾ãã</p>
<p>ãããèªåçæã¯ä¸æ¹ã§ããªã«ãã©ããªã£ã¦ãããã¤ããã¦ããã®ããã©ãã¯ããã¯ã¹ã®ã¾ã¾ã«ãªã£ã¦ãã¾ããã¡ã¨ããåé¡ãããã¾ãã</p>
<p>ããã§ä»åã¯ããã¼ã ã¡ã³ãã¼ã¸ã®ãªã³ãã¼ãã£ã³ã°ãããã¦Kubernetesã触ã£ã¦ã¿ãã人ã®åèã«ãªãã°ã¨æå¾
ãã¦ã
ã¼ãããGKEã«ãããã¤ãããã³ãºãªã³å½¢å¼ã®ãã¥ã¼ããªã¢ã«ãä½ã£ã¦ã¿ã¾ããã</p>
<ul class="table-of-contents">
<li><a href="#Whats-this">What's this</a><ul>
<li><a href="#åææ¡ä»¶">åææ¡ä»¶</a></li>
</ul>
</li>
<li><a href="#GKEã¯ã©ã¹ã¿ã®æºå">GKEã¯ã©ã¹ã¿ã®æºå</a><ul>
<li><a href="#ããã¸ã§ã¯ãã®ä½æ">ããã¸ã§ã¯ãã®ä½æ</a></li>
<li><a href="#Billing-Account-ã®è¨å®">Billing Account ã®è¨å®</a></li>
<li><a href="#GKEãµã¼ãã¹ã®APIãæå¹å">GKEãµã¼ãã¹ã®APIãæå¹å</a></li>
<li><a href="#GKEã¯ã©ã¹ã¿ã®ä½æ">GKEã¯ã©ã¹ã¿ã®ä½æ</a></li>
<li><a href="#ã¯ã©ã¹ã¿ã¸ã®æ¥ç¶">ã¯ã©ã¹ã¿ã¸ã®æ¥ç¶</a></li>
</ul>
</li>
<li><a href="#ãããã¤ããDockerã¤ã¡ã¼ã¸ã®æºå">ãããã¤ããDockerã¤ã¡ã¼ã¸ã®æºå</a><ul>
<li><a href="#ãµã³ãã«ã¢ããªã±ã¼ã·ã§ã³ããã«ããã">ãµã³ãã«ã¢ããªã±ã¼ã·ã§ã³ããã«ããã</a></li>
<li><a href="#Artifact-Registryã«ããã·ã¥ãã">Artifact Registryã«ããã·ã¥ãã</a></li>
</ul>
</li>
<li><a href="#ãããããã¤">ãããããã¤</a><ul>
<li><a href="#ãã¬ã¼ã³ãªYAMLãã¡ã¤ã«ã§ã®ãããã¤">ãã¬ã¼ã³ãªYAMLãã¡ã¤ã«ã§ã®ãããã¤</a></li>
<li><a href="#Namespaceã®ä½æ">Namespaceã®ä½æ</a></li>
<li><a href="#Deployment-ã®ä½æ">Deployment ã®ä½æ</a></li>
<li><a href="#ServiceIngress-ã®ä½æ">ServiceãIngress ã®ä½æ</a></li>
</ul>
</li>
<li><a href="#æ¹å">æ¹å</a><ul>
<li><a href="#Kustomize-ã®å°å
¥">Kustomize ã®å°å
¥</a></li>
<li><a href="#Skaffold-ã®å°å
¥">Skaffold ã®å°å
¥</a></li>
</ul>
</li>
<li><a href="#ãçä»ã">ãçä»ã</a></li>
<li><a href="#ããã">ããã</a><ul>
<li><a href="#We-are-hiring-">We are hiring !!</a><ul>
<li><a href="#ã¨ã³ã¸ãã¢æ¡ç¨ãã¼ã¸ã¯ãã¡ã">ã¨ã³ã¸ãã¢æ¡ç¨ãã¼ã¸ã¯ãã¡ã</a></li>
<li><a href="#ã«ã¸ã¥ã¢ã«é¢è«ããæ°è»½ã«ã©ãã">ã«ã¸ã¥ã¢ã«é¢è«ããæ°è»½ã«ã©ãã</a></li>
<li><a href="#ã¤ã³ã¿ã¼ã³ã常æåéãã¦ãã¾ã">ã¤ã³ã¿ã¼ã³ã常æåéãã¦ãã¾ã</a></li>
</ul>
</li>
</ul>
</li>
</ul>
<h2 id="Whats-this">What's this</h2>
<p>ãã®ãã¥ã¼ããªã¢ã«ã§ã¯</p>
<ol>
<li>GKEã§ã¯ã©ã¹ã¿ãä½æ</li>
<li>ãµã³ãã«ã¢ããªã±ã¼ã·ã§ã³ã®Dockerã¤ã¡ã¼ã¸ãbuildãpush</li>
<li>ãµã³ãã«ã¢ããªã±ã¼ã·ã§ã³ã®ã¯ã©ã¹ã¿ã¸ã®ãããã¤</li>
<li>dev/prodã®2ç°å¢ã«ãããã¤ããããã®æ¹è¯</li>
</ol>
<p>ãè¡ãã¾ãã</p>
<p>ãã¥ã¼ããªã¢ã«ä¸ã§ä½¿ããã¡ã¤ã«ãªã©ã¯ä»¥ä¸ã®githubã¬ãã¸ããªã§ãå
¬éãã¦ãã¾ã</p>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fgithub.com%2Fyokomotod%2Fgke-tutorial" title="GitHub - yokomotod/gke-tutorial" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://github.com/yokomotod/gke-tutorial">github.com</a></cite></p>
<h4 id="åææ¡ä»¶">åææ¡ä»¶</h4>
<p>Google Cloudã®ã¢ã«ã¦ã³ãã®ä½æã <code>gcloud</code> CLIã®ã¤ã³ã¹ãã¼ã«ã¾ã§ã¯å®äºãã¦ããåæã¨ãã¦ãã¾ãã</p>
<h2 id="GKEã¯ã©ã¹ã¿ã®æºå">GKEã¯ã©ã¹ã¿ã®æºå</h2>
<p>ã¾ãã¯ãã¥ã¼ããªã¢ã«ãè¡ãããã®GKEã¯ã©ã¹ã¿ããæºåãã¾ãã</p>
<p>å
¬å¼ããã¥ã¡ã³ã: <a href="https://cloud.google.com/kubernetes-engine/docs/how-to/creating-an-autopilot-cluster">https://cloud.google.com/kubernetes-engine/docs/how-to/creating-an-autopilot-cluster</a></p>
<h4 id="ããã¸ã§ã¯ãã®ä½æ">ããã¸ã§ã¯ãã®ä½æ</h4>
<p>ã¯ã©ã¹ã¿ãé
ç½®ããããã¸ã§ã¯ãã§ãããæå¾ã«ã¾ã¨ãã¦æé¤ã§ããããã«ãã¾ãä»ã®ãªã½ã¼ã¹ã¨å¹²æ¸ããªãããã«ãä»åã®ãã¥ã¼ããªã¢ã«å°ç¨ã®ããã¸ã§ã¯ããä½æãã¾ãããã</p>
<p>ä¾ãã° <code>m3-ai-team-k8s-tutorial-(ã©ã³ãã ãªæ°å)</code> ã¨ããååã§ããã¸ã§ã¯ããä½æãã¾ãã</p>
<pre class="code console" data-lang="console" data-unlink>PROJECT_ID=m3-ai-team-k8s-tutorial-$RANDOM
gcloud projects create $PROJECT_ID</pre>
<h4 id="Billing-Account-ã®è¨å®">Billing Account ã®è¨å®</h4>
<p>GKEã使ç¨ããããã«ã¯ãããã¸ã§ã¯ãã«Billing Accountãè¨å®ããã¦ããå¿
è¦ãããã¾ãã</p>
<p>æå¹ã«ãªã£ã¦ããã確èª</p>
<pre class="code console" data-lang="console" data-unlink>gcloud billing projects describe $PROJECT_ID</pre>
<p>åºå</p>
<pre class="code" data-lang="" data-unlink>billingAccountName: ''
billingEnabled: false
name: projects/m3-ai-team-k8s-tutorial-xxxxx/billingInfo
projectId: m3-ai-team-k8s-tutorial-xxxxx</pre>
<p>ä½æç´å¾ã§ããã° <code>billingEnabled: false</code> ã«ãªã£ã¦ããã¯ããªã®ã§ãBilling Account ãè¨å®ãã¾ãã</p>
<p>Billing Account ã®ä¸è¦§ãåå¾ãã¦ãè¨å®ãããACCOUNT_IDã確èªã</p>
<pre class="code console" data-lang="console" data-unlink>gcloud billing accounts list</pre>
<p>ããã¸ã§ã¯ãã«ç´ã¥ãã¾ãã</p>
<pre class="code console" data-lang="console" data-unlink>ACCOUNT_ID=xxxxxx-xxxxxx-xxxxxx
gcloud billing projects link $PROJECT_ID --billing-account=$ACCOUNT_ID</pre>
<p>ãã㧠<code>billingEnabled: true</code> ã«ãªã£ã¦ããã¯ãã§ãã</p>
<pre class="code console" data-lang="console" data-unlink>gcloud billing projects describe $PROJECT_ID</pre>
<p>åºå</p>
<pre class="code" data-lang="" data-unlink>billingAccountName: billingAccounts/xxxxxx-xxxxxx-xxxxxx
billingEnabled: true
name: projects/m3-ai-team-k8s-tutorial-xxxxx/billingInfo
projectId: m3-ai-team-k8s-tutorial-xxxxx</pre>
<h4 id="GKEãµã¼ãã¹ã®APIãæå¹å">GKEãµã¼ãã¹ã®APIãæå¹å</h4>
<p>GKEãå©ç¨ããããã«APIãæå¹åããå¿
è¦ãããã¾ããã¾ãã¯APIãæå¹ã«ãªã£ã¦ããã確èªãã¾ãã</p>
<pre class="code console" data-lang="console" data-unlink>gcloud services list --project=$PROJECT_ID \
| grep container.googleapis.com</pre>
<p>ããã¸ã§ã¯ãä½æç´å¾ã§ã¯ <code>container.googleapis.com</code> ã表示ãããªã = APIç¡å¹ç¶æ
ã®ã¯ããªã®ã§ã次ã®ããã«ãã¦æå¹åãã¾ãã</p>
<pre class="code console" data-lang="console" data-unlink>gcloud services enable container.googleapis.com --project=$PROJECT_ID</pre>
<p>æå¹ã«ãªã£ãããå度確èª</p>
<pre class="code console" data-lang="console" data-unlink>gcloud services list --project=$PROJECT_ID \
| grep container.googleapis.com</pre>
<p>åºå</p>
<pre class="code" data-lang="" data-unlink>container.googleapis.com Kubernetes Engine API</pre>
<h4 id="GKEã¯ã©ã¹ã¿ã®ä½æ">GKEã¯ã©ã¹ã¿ã®ä½æ</h4>
<p>ããããGKEã¯ã©ã¹ã¿ãä½æãã¾ããä»åã¯Autopilotã¢ã¼ãã§ä½æãã¾ãã</p>
<p>ã¯ã©ã¹ã¿åãªã©</p>
<pre class="code console" data-lang="console" data-unlink>export CLUSTER_NAME=tutorial-cluster
export LOCATION=asia-northeast1</pre>
<p>ããä½æï¼</p>
<pre class="code console" data-lang="console" data-unlink>gcloud container clusters create-auto $CLUSTER_NAME \
--location=$LOCATION \
--project=$PROJECT_ID</pre>
<p>ãã°ããæéããããã¾ããã以ä¸ã®ããã«åºåãããã°æ§ç¯å®äºã§ãã</p>
<pre class="code" data-lang="" data-unlink>NAME LOCATION MASTER_VERSION MASTER_IP MACHINE_TYPE NODE_VERSION NUM_NODES STATUS
tutorial-cluster asia-northeast1 1.30.6-gke.1125000 34.146.50.13 e2-small 1.30.6-gke.1125000 3 RUNNING</pre>
<p>⻠次ã®ãããªè¦åãåºã¾ãããå¾ã»ã©ã¤ã³ã¹ãã¼ã«ããã®ã§ä»ã¯æ°ã«ããªãã¦å¤§ä¸å¤«ã§ãã</p>
<pre class="code" data-lang="" data-unlink>CRITICAL: ACTION REQUIRED: gke-gcloud-auth-plugin, which is needed for continued use of kubectl, was not found or is not executable. Install gke-gcloud-auth-plugin for use with kubectl by following https://cloud.google.com/kubernetes-engine/docs/how-to/cluster-access-for-kubectl#install_plugin</pre>
<p>Webã³ã³ã½ã¼ã«</p>
<p><a href="https://console.cloud.google.com/kubernetes/list/overview">https://console.cloud.google.com/kubernetes/list/overview</a></p>
<p><figure class="figure-image figure-image-fotolife" title="ä½æãããã¯ã©ã¹ã¿"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241230/20241230170011.png" width="800" height="143" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>ä½æãããã¯ã©ã¹ã¿</figcaption></figure></p>
<h4 id="ã¯ã©ã¹ã¿ã¸ã®æ¥ç¶">ã¯ã©ã¹ã¿ã¸ã®æ¥ç¶</h4>
<p>ãããã¤ãªã©ã®æä½ããããã®CLI <code>kubectl</code> ã¨ãè¦åã«åºã¦ããèªè¨¼ç¨ã®ãã©ã°ã¤ã³ãå¿
è¦ãªã®ã§ã¤ã³ã¹ãã¼ã«ãã¾ãã</p>
<pre class="code console" data-lang="console" data-unlink>gcloud components install kubectl gke-gcloud-auth-plugin</pre>
<p>ä½æããã¯ã©ã¹ã¿ã«å¯¾ãã¦èªè¨¼ãéãã¾ãã</p>
<pre class="code console" data-lang="console" data-unlink>gcloud container clusters get-credentials $CLUSTER_NAME \
--location=$LOCATION \
--project=$PROJECT_ID</pre>
<p>ããã§ã¯ã©ã¹ã¿ã«ã¢ã¯ã»ã¹ã§ããããã«ãªãã¾ããã試ãã«Namespace ä¸è¦§ã表示ãã¦ã¿ã¾ãããã</p>
<pre class="code console" data-lang="console" data-unlink>kubectl get namespaces</pre>
<p>åºå</p>
<pre class="code" data-lang="" data-unlink>NAME STATUS AGE
default Active 9m47s
gke-gmp-system Active 8m36s
gke-managed-cim Active 9m19s
gke-managed-filestorecsi Active 9m9s
gke-managed-system Active 8m54s
gmp-public Active 8m36s
kube-node-lease Active 9m48s
kube-public Active 9m48s
kube-system Active 9m48s</pre>
<p>Namespaceã表示ããã¦ããã°æåã§ãï¼</p>
<h2 id="ãããã¤ããDockerã¤ã¡ã¼ã¸ã®æºå">ãããã¤ããDockerã¤ã¡ã¼ã¸ã®æºå</h2>
<p>ã¯ã©ã¹ã¿ã®æºåãåºæ¥ãã®ã§ã次ã¯ãããã¤ãããµã³ãã«ã¢ããªã±ã¼ã·ã§ã³ã®Dockerã¤ã¡ã¼ã¸ãæºåãã¾ãã</p>
<p>å
¬å¼ããã¥ã¡ã³ã: <a href="https://cloud.google.com/kubernetes-engine/docs/deploy-app-cluster">https://cloud.google.com/kubernetes-engine/docs/deploy-app-cluster</a></p>
<h4 id="ãµã³ãã«ã¢ããªã±ã¼ã·ã§ã³ããã«ããã">ãµã³ãã«ã¢ããªã±ã¼ã·ã§ã³ããã«ããã</h4>
<p>Google Cloudãæä¾ãããµã³ãã«ã¢ããªã±ã¼ã·ã§ã³ããã«ããã¾ãã</p>
<p>ã½ã¼ã¹ã³ã¼ã: <a href="https://github.com/GoogleCloudPlatform/kubernetes-engine-samples/blob/main/quickstarts/hello-app/main.go">https://github.com/GoogleCloudPlatform/kubernetes-engine-samples/blob/main/quickstarts/hello-app/main.go</a></p>
<p>å®ã¯ãã®ãµã³ãã«ã®ãã«ãæ¸ã¿ã¤ã¡ã¼ã¸ãå
¬éããã¦ãã¦ãå
¬å¼ããã¥ã¡ã³ãã§ã¯ãã¡ãã使ã£ã¦ãã¾ããããããã§ã¯ãã«ããã¦ããã·ã¥ããé¨åããã£ã¦ã¿ã¾ãããã</p>
<p>ã½ã¼ã¹ã³ã¼ããcloneã</p>
<pre class="code console" data-lang="console" data-unlink>git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.git
cd kubernetes-engine-samples/quickstarts/hello-app/</pre>
<p>ãã«ããã¤ã¡ã¼ã¸ã¿ã°ã¯å¾ã»ã©ä½æããArtifact Registryã®è¨å®ã«åããã¦æå®ãã¾ãã</p>
<pre class="code console" data-lang="console" data-unlink>docker build -t $LOCATION-docker.pkg.dev/$PROJECT_ID/tutorial/hello-app:latest .</pre>
<p>ãã¼ã«ã«ã§åä½ç¢ºèªãã¦ã¿ã¾ããã</p>
<pre class="code console" data-lang="console" data-unlink>docker run --rm -p 8080:8080 $LOCATION-docker.pkg.dev/$PROJECT_ID/tutorial/hello-app</pre>
<p>èµ·åãã°</p>
<pre class="code" data-lang="" data-unlink>2024/12/26 18:52:16 Server listening on port 8080</pre>
<p>curlããã©ã¦ã¶ã§ã¢ã¯ã»ã¹ã§ããã°ãã«ãæåã§ãã</p>
<pre class="code console" data-lang="console" data-unlink>curl localhost:8080</pre>
<p>åºå</p>
<pre class="code" data-lang="" data-unlink>Hello, world!
Version: 1.0.0
Hostname: 748b9d88aa6e</pre>
<h4 id="Artifact-Registryã«ããã·ã¥ãã">Artifact Registryã«ããã·ã¥ãã</h4>
<p>ç¡äºãã«ãã§ããã®ã§ãArtifact Registryã«ããã·ã¥ãã¾ããArtifact Registry ã¯ãDockerã¤ã¡ã¼ã¸ï¼ãå種ããã±ã¼ã¸ãï¼ãä¿åã»é
ä¿¡ããGoogle Cloudã®ãµã¼ãã¹ã§ãã</p>
<p>ããã·ã¥å
ã®ãªãã¸ããªãå¿
è¦ãªã®ã§ä½æãã¾ãããã</p>
<pre class="code console" data-lang="console" data-unlink>gcloud artifacts repositories create tutorial --repository-format=docker \
--location=$LOCATION \
--project=$PROJECT_ID</pre>
<p>ããã·ã¥ã§ããããã«èªè¨¼ãè¨å®ãã¾ãã</p>
<pre class="code console" data-lang="console" data-unlink>gcloud auth configure-docker $LOCATION-docker.pkg.dev</pre>
<p>pushï¼</p>
<pre class="code console" data-lang="console" data-unlink>docker push $LOCATION-docker.pkg.dev/$PROJECT_ID/tutorial/hello-app:latest</pre>
<h2 id="ãããããã¤">ãããããã¤</h2>
<p>ãç²ãæ§ã§ãããã¯ã©ã¹ã¿ã¨ã¢ããªã±ã¼ã·ã§ã³ã®ã¤ã¡ã¼ã¸ãåºæ¥ãã®ã§ããããããããã¤ãã¦ããã¾ãï¼</p>
<h4 id="ãã¬ã¼ã³ãªYAMLãã¡ã¤ã«ã§ã®ãããã¤">ãã¬ã¼ã³ãªYAMLãã¡ã¤ã«ã§ã®ãããã¤</h4>
<p>Kubernetesã«ãããã¤ããæ§æã¯åºæ¬çã«YAMLãã¡ã¤ã«ã§è¨è¿°ãã¾ãã</p>
<p>ã¾ãã¯æ®éã«YAMLãã¡ã¤ã«ãæ¸ãã¦ãããã¤ãã¦ã¿ã¾ãããã</p>
<h4 id="Namespaceã®ä½æ">Namespaceã®ä½æ</h4>
<p>Namespaceã¯ãããã¤ãããªã½ã¼ã¹ãåããããã®ãã®ã§ãã</p>
<p>ä»å㯠<code>tutorial-dev</code> ã¨ããååã§ä½æãã¾ãã</p>
<pre class="code lang-yaml" data-lang="yaml" data-unlink><span class="synIdentifier">apiVersion</span><span class="synSpecial">:</span> v1
<span class="synIdentifier">kind</span><span class="synSpecial">:</span> Namespace
<span class="synIdentifier">metadata</span><span class="synSpecial">:</span>
<span class="synIdentifier">name</span><span class="synSpecial">:</span> tutorial-dev
</pre>
<p><code>kubectl apply</code> ã³ãã³ãã§ãã¡ã¤ã«ã®å
容ãé©ç¨ãã¾ãã</p>
<pre class="code console" data-lang="console" data-unlink>kubectl apply -f namespace.yaml</pre>
<h4 id="Deployment-ã®ä½æ">Deployment ã®ä½æ</h4>
<p>Deploymentã¯Podã®ãããã¤ã管çãããªã½ã¼ã¹ã§ãã</p>
<pre class="code lang-yaml" data-lang="yaml" data-unlink><span class="synIdentifier">apiVersion</span><span class="synSpecial">:</span> apps/v1
<span class="synIdentifier">kind</span><span class="synSpecial">:</span> Deployment
<span class="synIdentifier">metadata</span><span class="synSpecial">:</span>
<span class="synIdentifier">name</span><span class="synSpecial">:</span> helloweb
<span class="synIdentifier">namespace</span><span class="synSpecial">:</span> tutorial-dev
<span class="synIdentifier">labels</span><span class="synSpecial">:</span>
<span class="synIdentifier">app</span><span class="synSpecial">:</span> hello
<span class="synIdentifier">spec</span><span class="synSpecial">:</span>
<span class="synIdentifier">selector</span><span class="synSpecial">:</span>
<span class="synIdentifier">matchLabels</span><span class="synSpecial">:</span>
<span class="synIdentifier">app</span><span class="synSpecial">:</span> hello
<span class="synIdentifier">replicas</span><span class="synSpecial">:</span> <span class="synConstant">3</span>
<span class="synIdentifier">template</span><span class="synSpecial">:</span>
<span class="synIdentifier">metadata</span><span class="synSpecial">:</span>
<span class="synIdentifier">labels</span><span class="synSpecial">:</span>
<span class="synIdentifier">app</span><span class="synSpecial">:</span> hello
<span class="synIdentifier">spec</span><span class="synSpecial">:</span>
<span class="synIdentifier">containers</span><span class="synSpecial">:</span>
<span class="synStatement">- </span><span class="synIdentifier">name</span><span class="synSpecial">:</span> hello-app
<span class="synIdentifier">image</span><span class="synSpecial">:</span> asia-northeast1-docker.pkg.dev/m3-ai-team-k8s-tutorial-xxxxx/tutorial/hello-app:latest
<span class="synIdentifier">ports</span><span class="synSpecial">:</span>
<span class="synStatement">- </span><span class="synIdentifier">containerPort</span><span class="synSpecial">:</span> <span class="synConstant">8080</span>
<span class="synIdentifier">resources</span><span class="synSpecial">:</span>
<span class="synIdentifier">requests</span><span class="synSpecial">:</span>
<span class="synIdentifier">cpu</span><span class="synSpecial">:</span> 200m
</pre>
<p>å°ãé·ãã§ããã使ç¨ããDockerã¤ã¡ã¼ã¸ãportãªã© <code>docker run -p 8080:8080 IMAGE</code> ã¨åæ§ã®è¨å®ãã使ç¨ããCPUéãªã©ãæ¸ãã¦ãã¾ãã</p>
<pre class="code console" data-lang="console" data-unlink>kubectl apply -f deployment.yaml</pre>
<p>ãããã¤ãã㨠<code>replicas: 3</code> ã«å¾ã£ã¦Podã3ã¤ä½æããã¦ããã¯ãã§ãã</p>
<pre class="code console" data-lang="console" data-unlink>kubectl -n tutorial-dev get po</pre>
<pre class="code" data-lang="" data-unlink>NAME READY STATUS RESTARTS AGE
helloweb-5b6b6cc799-wq6n6 1/1 Running 0 14s
helloweb-5b6b6cc799-sl38s 1/1 Running 0 14s
helloweb-5b6b6cc799-t6n8h 1/1 Running 0 14s</pre>
<p>Webã³ã³ã½ã¼ã«</p>
<p><a href="https://console.cloud.google.com/kubernetes/workload/overview">https://console.cloud.google.com/kubernetes/workload/overview</a></p>
<p><figure class="figure-image figure-image-fotolife" title="ãããã¤ãããDeployment"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241230/20241230170013.png" width="685" height="178" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>ãããã¤ãããDeployment</figcaption></figure></p>
<p>ãã°ãè¦ã¦ã¿ã¾ãããã</p>
<pre class="code console" data-lang="console" data-unlink>kubectl -n tutorial-dev logs helloweb-5b6b6cc799-t6n8h</pre>
<pre class="code" data-lang="" data-unlink>2024/12/26 19:02:32 Server listening on port 8080</pre>
<p>ç¡äºã³ã³ãããèµ·åãã¾ãããããã¾ã å¤é¨ããã¢ã¯ã»ã¹ã§ããããã«ã¯ãªã£ã¦ãã¾ããã</p>
<h4 id="ServiceIngress-ã®ä½æ">ServiceãIngress ã®ä½æ</h4>
<p>Global Load Balancerã使ã£ã¦å¤é¨ããã¢ã¯ã»ã¹ã§ããããã«ãã¾ãã</p>
<p>Global Load Balancerã¯Google Cloudã®ãªã½ã¼ã¹ã§ãããGKEã§ã¯Ingressãªã½ã¼ã¹ã使ããã¨ã§k8sããæ§ç¯ã§ãã¾ãã</p>
<p>Serviceã®ä½æ</p>
<pre class="code lang-yaml" data-lang="yaml" data-unlink><span class="synIdentifier">apiVersion</span><span class="synSpecial">:</span> v1
<span class="synIdentifier">kind</span><span class="synSpecial">:</span> Service
<span class="synIdentifier">metadata</span><span class="synSpecial">:</span>
<span class="synIdentifier">name</span><span class="synSpecial">:</span> helloweb
<span class="synIdentifier">namespace</span><span class="synSpecial">:</span> tutorial-dev
<span class="synIdentifier">spec</span><span class="synSpecial">:</span>
<span class="synIdentifier">selector</span><span class="synSpecial">:</span>
<span class="synIdentifier">app</span><span class="synSpecial">:</span> hello
<span class="synIdentifier">ports</span><span class="synSpecial">:</span>
<span class="synStatement">- </span><span class="synIdentifier">port</span><span class="synSpecial">:</span> <span class="synConstant">80</span>
<span class="synIdentifier">targetPort</span><span class="synSpecial">:</span> <span class="synConstant">8080</span>
</pre>
<p>Serviceã®apply</p>
<pre class="code console" data-lang="console" data-unlink>kubectl apply -f service.yaml</pre>
<p>Ingreesã®ä½æ</p>
<pre class="code lang-yaml" data-lang="yaml" data-unlink><span class="synIdentifier">apiVersion</span><span class="synSpecial">:</span> networking.k8s.io/v1
<span class="synIdentifier">kind</span><span class="synSpecial">:</span> Ingress
<span class="synIdentifier">metadata</span><span class="synSpecial">:</span>
<span class="synIdentifier">name</span><span class="synSpecial">:</span> helloweb
<span class="synIdentifier">namespace</span><span class="synSpecial">:</span> tutorial-dev
<span class="synIdentifier">spec</span><span class="synSpecial">:</span>
<span class="synIdentifier">defaultBackend</span><span class="synSpecial">:</span>
<span class="synIdentifier">service</span><span class="synSpecial">:</span>
<span class="synIdentifier">name</span><span class="synSpecial">:</span> helloweb
<span class="synIdentifier">port</span><span class="synSpecial">:</span>
<span class="synIdentifier">number</span><span class="synSpecial">:</span> <span class="synConstant">80</span>
</pre>
<p>Ingressã®apply</p>
<pre class="code console" data-lang="console" data-unlink>kubectl apply -f ingress.yaml</pre>
<p>applyãã¦ãã°ãããã㨠<code>ADDRESS</code> ãå²ãå½ã¦ãããããã«ã¾ããã°ããããã¨ã¢ã¯ã»ã¹ã§ããããã«ãªãã¾ãã</p>
<p><a href="https://console.cloud.google.com/net-services/loadbalancing/list/loadBalancers">Webã³ã³ã½ã¼ã«</a>ã§ãä½æãããGlobal Load Balancerã確èªã§ãã¾ãã</p>
<p>ï¼è¦ãç®æ§ç¯ãå®äºããããã«è¦ãã¦ãã¢ã¯ã»ã¹ãåºæ¥ãªãæéããã°ããããã®ã§ããªã«ãæ§ç¯ãééããã®ãã¨å¿é
ã«ãªãã®ã§ãããç¦ãããã°ããå¾
ã£ã¦ã¿ã¾ãããï¼</p>
<pre class="code console" data-lang="console" data-unlink>kubectl -n tutorial-dev get ingress</pre>
<pre class="code" data-lang="" data-unlink>NAME CLASS HOSTS ADDRESS PORTS AGE
helloweb <none> * 34.54.192.203 80 5m28s</pre>
<pre class="code console" data-lang="console" data-unlink>curl 34.54.192.203</pre>
<pre class="code" data-lang="" data-unlink>Hello, world!
Version: 1.0.0
Hostname: helloweb-5b6b6cc799-t6n8h</pre>
<p>ããã§ã¨ããããã¾ãï¼ãããã¤ããã¢ããªã±ã¼ã·ã§ã³ã«ã¢ã¯ã»ã¹ãåºæ¥ãããã«ãªãã¾ããï¼ï¼</p>
<h2 id="æ¹å">æ¹å</h2>
<p>ãã¬ã¼ã³ãªYAMLã使ã£ã¦ãããã¤ã«æåãã¾ããããå®éã®éç¨ã§ã¯ãã¿æ¸ãã®YAMLã§ã¯ç®¡çãé£ãããªããã¡ã§ãã</p>
<p>ä¾ãã°devç°å¢ã¨prodç°å¢ã®ããã«ãããã¤å
ãè¤æ°ãã£ã¦è¨å®ãå°ãã ãç°ãªããã¨ãããã¨ã¯ããããã¾ãã</p>
<p>ã»ã¨ãã©åãYAMLãã³ããç¶æ
ã§è¤æ°ã¡ã³ããã³ã¹ãããã¨ã¯å¤æ´æ¼ãããã¹ãèµ·ããããã管çã大å¤ãªã®ã§ãããæãã«YAMLãåæããæ¹æ³ã欲ãããªãã¾ãã</p>
<p>ããããã¯ãæ§æãã¡ã¤ã«ãããå°ã管çãããããããã¼ã«ãå°å
¥ãã¦æ¹åãã¦ã¿ã¾ãããã</p>
<h4 id="Kustomize-ã®å°å
¥">Kustomize ã®å°å
¥</h4>
<p>Kustomizeã使ããã¨ã§YAMLãåæãããã¨ãã§ãã¾ãã</p>
<p>ä¾ãã°ã以ä¸ã®ããã«baseã¨ãªãYAMLãä½æããããã«å¯¾ãã¦devã¨prodã®ç°å¢ãã¨ã«å·®åãé©ç¨ããã¨ãã£ããã¨ãå¯è½ã§ã<a href="#f-fb7581a8" id="fn-fb7581a8" name="fn-fb7581a8" title="ä»åã¯ç°¡åã®ããã«åä¸ã¯ã©ã¹ã¿ä¸ã§namespaceã ãã§ç°å¢ãåé¢ãã¦ãã¾ããå®éã«ã¯devç°å¢ã¨prodç°å¢ã¯ããã¸ã§ã¯ãã¬ãã«ã§åé¢ããã¦å¥ã¯ã©ã¹ã¿ã«ãã¾ã">*1</a>ã</p>
<p><code>base/kustomization.yaml</code>:</p>
<pre class="code lang-yaml" data-lang="yaml" data-unlink><span class="synIdentifier">namespace</span><span class="synSpecial">:</span> TO_BE_SPECIFIED
<span class="synIdentifier">resources</span><span class="synSpecial">:</span>
<span class="synStatement">- </span>deployment.yaml
<span class="synStatement">- </span>service.yaml
<span class="synStatement">- </span>ingress.yaml
</pre>
<p>ï¼<code>- namespace.yaml</code> ã®è¡ãç¡ããã¨ã«æ°ã¥ããéãæ¹ã¯ãã°ããå¾
ã¡ä¸ãããï¼</p>
<p>ä»åã¯Namespaceåã ããå¤æ´ãããããªå·®åãé©ç¨ãã¦ã¿ã¾ãã</p>
<p><code>dev/kustomization.yaml</code>:</p>
<pre class="code lang-yaml" data-lang="yaml" data-unlink><span class="synIdentifier">namespace</span><span class="synSpecial">:</span> tutorial-dev
<span class="synIdentifier">resources</span><span class="synSpecial">:</span>
<span class="synStatement">- </span>../base
</pre>
<p><code>prod/kustomization.yaml</code>:</p>
<pre class="code lang-yaml" data-lang="yaml" data-unlink><span class="synIdentifier">namespace</span><span class="synSpecial">:</span> tutorial-prod
<span class="synIdentifier">resources</span><span class="synSpecial">:</span>
<span class="synStatement">- </span>../base
</pre>
<p>ãããã¤æ¸ã¿ã®devç°å¢ã¯ãKustomizeåããã ãã§åæçµæã®YAMLã¯å¤åãã¦ããªãã¯ããªã®ã§ãå·®åããªããã¨ã確èªãã¾ãã</p>
<pre class="code console" data-lang="console" data-unlink>kubectl diff -k dev/</pre>
<p>ãããã¤ããå ´åã¯</p>
<pre class="code console" data-lang="console" data-unlink>kubectl apply -k dev/</pre>
<p>ã®ããã«ãããã¤ã§ãã¾ãã</p>
<p>æªä½æã®prodç°å¢ãåæ§ã«ãããã¤åºæ¥ã¾ããããã®åã«ããï¼ã¤ãã¼ã«ãå°å
¥ãã¾ãããã</p>
<h4 id="Skaffold-ã®å°å
¥">Skaffold ã®å°å
¥</h4>
<p>Kustomizeãå°å
¥ãããã¨ã§YAMLã®ç®¡çã楽ã«ãªãã¾ããããã¾ã Dockerã¤ã¡ã¼ã¸ã®ãã«ãã¨ãããã¤ãåå¥ã«è¡ãå¿
è¦ãããã¾ãã</p>
<p>Skaffoldã使ããã¨ã§ãDockerã¤ã¡ã¼ã¸ã®ãã«ãã¨ãããã¤ã¨ãã£ããã¤ãã©ã¤ã³ãä¸æ¬ã§è¡ããããã«ãã¦ã¿ã¾ãããã</p>
<p>ã¾ãskaffoldãã¤ã³ã¹ãã¼ã«ãã¾ãã</p>
<pre class="code console" data-lang="console" data-unlink>gcloud components install skaffold</pre>
<p><code>skaffold.yaml</code> ã¨ããæ§æãã¡ã¤ã«ãè¨è¿°ãã¾ãã</p>
<pre class="code lang-yaml" data-lang="yaml" data-unlink><span class="synIdentifier">apiVersion</span><span class="synSpecial">:</span> skaffold/v4beta11
<span class="synIdentifier">kind</span><span class="synSpecial">:</span> Config
<span class="synIdentifier">build</span><span class="synSpecial">:</span>
<span class="synIdentifier">artifacts</span><span class="synSpecial">:</span>
<span class="synStatement">- </span><span class="synIdentifier">image</span><span class="synSpecial">:</span> asia-northeast1-docker.pkg.dev/m3-ai-team-k8s-tutorial-xxxxx/tutorial/hello-app
<span class="synIdentifier">context</span><span class="synSpecial">:</span> ../kubernetes-engine-samples/quickstarts/hello-app/
<span class="synIdentifier">docker</span><span class="synSpecial">:</span>
<span class="synIdentifier">dockerfile</span><span class="synSpecial">:</span> Dockerfile
<span class="synIdentifier">local</span><span class="synSpecial">:</span>
<span class="synIdentifier">useBuildkit</span><span class="synSpecial">:</span> <span class="synConstant">true</span>
<span class="synIdentifier">manifests</span><span class="synSpecial">:</span>
<span class="synIdentifier">kustomize</span><span class="synSpecial">:</span>
<span class="synIdentifier">paths</span><span class="synSpecial">:</span>
<span class="synStatement">- </span>dev
<span class="synIdentifier">profiles</span><span class="synSpecial">:</span>
<span class="synStatement">- </span><span class="synIdentifier">name</span><span class="synSpecial">:</span> dev
<span class="synStatement">- </span><span class="synIdentifier">name</span><span class="synSpecial">:</span> prod
<span class="synIdentifier">manifests</span><span class="synSpecial">:</span>
<span class="synIdentifier">kustomize</span><span class="synSpecial">:</span>
<span class="synIdentifier">paths</span><span class="synSpecial">:</span>
<span class="synStatement">- </span>prod
</pre>
<p>ããã§ãã³ãã³ãï¼ã¤ã§Dockerã¤ã¡ã¼ã¸ã®ãã«ãã¨ãããã¤ãä¸æ¬ã§è¡ããããã«ãªãã¾ãã</p>
<pre class="code console" data-lang="console" data-unlink>skaffold run -p dev</pre>
<p>prodç°å¢ãæ§ç¯ãã¾ãããã</p>
<p>ããã§ä¸ã¤AIãã¼ã æµã§ãNamespaceã¯Kustomizeã«å«ãããå¤é¨ã§ä½æãã¦ãã¾ã<a href="#f-0b0c7c8b" id="fn-0b0c7c8b" name="fn-0b0c7c8b" title="å®éã«ã¯terraformã使ã£ã¦ä»ã®k8så¤ã®ãªã½ã¼ã¹ã¨ä¸ç·ã«ä½æãã¦ãã¾ãããããã§terraform destroyã§k8sãªã½ã¼ã¹ãå«ãã¦ãããã«æ¶ããã¨ãåºæ¥ããããã¾ãã">*2</a>ããããããã¨ã§ããªãããã®ééãã§æ¥ç¶å
ã®ç°å¢ãéã£ã¦ããå ´åãnamespaceãç¡ãã®ã§ãããã¤ãå®å
¨ã«å¤±æããããã«ãã¦ãã¾ãã</p>
<p>ã¨ããããã§ãprodç°å¢ã®Namespaceãä½æ</p>
<pre class="code console" data-lang="console" data-unlink>kubectl create namespace tutorial-prod</pre>
<p>skaffold runã§ä¸æ¬ãããã¤ï¼</p>
<pre class="code console" data-lang="console" data-unlink>skaffold run -p prod</pre>
<p>ããã§ãdev, prodã®ï¼ç°å¢ã®æ§æãã¡ã¤ã«ãDRYã«ä¿ã¡ãç°¡åã«ãããã¤åºæ¥ãããã«ãªãã¾ããã</p>
<h2 id="ãçä»ã">ãçä»ã</h2>
<p>ãã¥ã¼ããªã¢ã«ã¯ä»¥ä¸ã§ãï¼</p>
<p>ç¡é§ãªæéãçºçãããªãããã«ãnamespaceãã¨åé¤ãã¦ããã¾ãããã</p>
<pre class="code console" data-lang="console" data-unlink>kubectl delete namespace tutorial-dev tutorial-prod</pre>
<p> ããã¸ã§ã¯ããåé¤ã</p>
<pre class="code console" data-lang="console" data-unlink>gcloud projects delete $PROJECT_ID</pre>
<h2 id="ããã">ããã</h2>
<p>å¦ä½ã§ããã§ãããããå
¥éç¨ãã¥ã¼ããªã¢ã«ã¯ãããä¸ã«ãå¤ãããã¾ãããGKEãKubernetesã®ä¸çã¯åºããã¡ããã©èªåãã¡ã欲ããã¹ã³ã¼ãã欲ããæé ã®ãã³ãºãªã³ããã£ã¦ãããããªã¨æã£ã¦æ¸ãã¦ã¿ã¾ããã</p>
<p>ãå½¹ã«ç«ã¦ã°å¹¸ãã§ãã</p>
<h3 id="We-are-hiring-">We are hiring !!</h3>
<p>ããã¾ã§èªã¿é²ãã¦ããã ããããã¨ããããã¾ããããã§ãã¤ã§ãAIãã¼ã ã§ãã±ããã¹ã¿ã¼ãã§ãã¾ããï¼</p>
<p>ãããèå³ããã¾ããããã¡ãã®ãã¼ã¸ããã©ããã ã«ã¸ã¥ã¢ã«é¢è«ã»ãå¿åãå¾
ã¡ãã¦ããã¾ãï¼</p>
<h4 id="ã¨ã³ã¸ãã¢æ¡ç¨ãã¼ã¸ã¯ãã¡ã">ã¨ã³ã¸ãã¢æ¡ç¨ãã¼ã¸ã¯ãã¡ã</h4>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjobs.m3.com%2Fengineer%2F" title="ã¨ã³ã¸ãã¢æ¡ç¨ãµã¤ãï½æ¡ç¨æ
å ± | å»çÃãã¯ããã¸ã¼ã®å¯è½æ§ã¯ç¡é大" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jobs.m3.com/engineer/">jobs.m3.com</a></cite></p>
<h4 id="ã«ã¸ã¥ã¢ã«é¢è«ããæ°è»½ã«ã©ãã">ã«ã¸ã¥ã¢ã«é¢è«ããæ°è»½ã«ã©ãã</h4>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjobs.m3.com%2Fengineer%2Fcasual-session%2F" title="ã¨ã³ã¸ãã¢æ¡ç¨ãµã¤ãï½æ¡ç¨æ
å ± | å»çÃãã¯ããã¸ã¼ã®å¯è½æ§ã¯ç¡é大" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jobs.m3.com/engineer/casual-session/">jobs.m3.com</a></cite></p>
<h4 id="ã¤ã³ã¿ã¼ã³ã常æåéãã¦ãã¾ã">ã¤ã³ã¿ã¼ã³ã常æåéãã¦ãã¾ã</h4>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fopen.talentio.com%2Fr%2F1%2Fc%2Fm3%2Fhomes%2F4354" title="ãæ°åãã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ã åéä¸è¦§ / ã¨ã ã¹ãªã¼æ ªå¼ä¼ç¤¾" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://open.talentio.com/r/1/c/m3/homes/4354">open.talentio.com</a></cite></p>
<div class="footnote">
<p class="footnote"><a href="#fn-fb7581a8" id="f-fb7581a8" name="f-fb7581a8" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">ä»åã¯ç°¡åã®ããã«åä¸ã¯ã©ã¹ã¿ä¸ã§namespaceã ãã§ç°å¢ãåé¢ãã¦ãã¾ããå®éã«ã¯devç°å¢ã¨prodç°å¢ã¯ããã¸ã§ã¯ãã¬ãã«ã§åé¢ããã¦å¥ã¯ã©ã¹ã¿ã«ãã¾ã</span></p>
<p class="footnote"><a href="#fn-0b0c7c8b" id="f-0b0c7c8b" name="f-0b0c7c8b" class="footnote-number">*2</a><span class="footnote-delimiter">:</span><span class="footnote-text">å®éã«ã¯terraformã使ã£ã¦ä»ã®k8så¤ã®ãªã½ã¼ã¹ã¨ä¸ç·ã«ä½æãã¦ãã¾ãããããã§terraform destroyã§k8sãªã½ã¼ã¹ãå«ãã¦ãããã«æ¶ããã¨ãåºæ¥ããããã¾ãã</span></p>
</div>
yokomotod
åå¹´éã®éç¨ã§å¦ãã Datastreamå°å
¥ã®åæ
hatenablog://entry/6802418398315033676
2024-12-29T12:00:00+09:00
2024-12-29T12:00:00+09:00 ããã«ã¡ã¯ãã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ããã¼ã¿åºç¤ãã¼ã ã®æ¨ç°ã§ããå
æ¥å
¬éãããCTOå
¼VPoPå±±å´ã®è¨äºã«ããéãã¼ãã©ã«ããã¼ã¸ã£ã¼ãæå½ãã¾ãã¦ããã¼ã¿æ´»ç¨ã®è¦³ç¹ã ãã§ã¯ãªããã以å¤ã®å´é¢ã§ãçµç¹å
¨ä½ãæ¯ããç«å ´ã¨ãªãã¾ãããã¯ãªã¹ãã¹ãéãããã£ããè¡ã¯å¹´æ«ã¢ã¼ãã«ãªãã¾ããããæ¯å¹´ãã®å¤ãã身ã®éãã«é©ãã¨ã¨ãã«ãæ°å¹´ã®è¶³é³ãæããææã§ãããã¾ãã éæ¾ã¨ã¯ãªã¹ãã¹é£¾ããåå±
ããå¹´æ«ãããå
æ¯ãã¨ã ã¹ãªã¼èµ¤åãªãã£ã¹ããå¾æ©15åã®è·é¢ã«ãã麻å¸å°ãã«ãºãã¼ã±ããã®ä¸è§ã«ã¦ ã¨ã ã¹ãªã¼ã®ãã¼ã¿åºç¤å©ç¨è
ã¯ä»å¹´ãé 調ã«å¢ãã¾ãã¦ãã·ã¹ãã (ãµã¼ãã¹ã¢ã«ã¦ã³ã)ãå«ããã¨åã
ã§å¢å ãã¦â¦
<p>ããã«ã¡ã¯ãã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ããã¼ã¿åºç¤ãã¼ã ã®æ¨ç°ã§ããå
æ¥å
¬éãããCTOå
¼VPoP<a href="https://www.m3tech.blog/entry/cto-retrospective-2024">å±±å´ã®è¨äº</a>ã«ããéãã¼ãã©ã«ããã¼ã¸ã£ã¼ãæå½ãã¾ãã¦ããã¼ã¿æ´»ç¨ã®è¦³ç¹ã ãã§ã¯ãªããã以å¤ã®å´é¢ã§ãçµç¹å
¨ä½ãæ¯ããç«å ´ã¨ãªãã¾ãããã¯ãªã¹ãã¹ãéãããã£ããè¡ã¯å¹´æ«ã¢ã¼ãã«ãªãã¾ããããæ¯å¹´ãã®å¤ãã身ã®éãã«é©ãã¨ã¨ãã«ãæ°å¹´ã®è¶³é³ãæããææã§ãããã¾ãã
<figure class="figure-image figure-image-fotolife" title="éæ¾ã¨ã¯ãªã¹ãã¹é£¾ããåå±
ããå¹´æ«ãããå
æ¯ãã¨ã ã¹ãªã¼èµ¤åãªãã£ã¹ããå¾æ©15åã®è·é¢ã«ãã麻å¸å°ãã«ãºãã¼ã±ããã®ä¸è§ã«ã¦"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241229/20241229120017.jpg" width="800" height="509" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>éæ¾ã¨ã¯ãªã¹ãã¹é£¾ããåå±
ããå¹´æ«ãããå
æ¯ãã¨ã ã¹ãªã¼èµ¤åãªãã£ã¹ããå¾æ©15åã®è·é¢ã«ãã麻å¸å°ãã«ãºãã¼ã±ããã®ä¸è§ã«ã¦</figcaption></figure></p>
<p>ã¨ã ã¹ãªã¼ã®ãã¼ã¿åºç¤å©ç¨è
ã¯ä»å¹´ãé 調ã«å¢ãã¾ãã¦ãã·ã¹ãã (ãµã¼ãã¹ã¢ã«ã¦ã³ã)ãå«ããã¨åã
ã§å¢å ãã¦ããã¾ããããã«å¼å¿ããå½¢ã§BigQueryä¸ã®ã¯ã¨ãªãã¦ã¼ã¹ã±ã¼ã¹ã®å¤æ§æ§ (ããã¦æéã) å¢ãã¦ããã¾ãããã¼ã¿åºç¤ã®éçºã»éç¨ãæããããã¼ã¿åºç¤ãã¼ã ã§ã¯ãä»å¹´ã®æ´»åã¨ãã¦dbtãdataformã®å©ç¨æ¡å¤§ã«ãããã¼ã¿ãã¤ãã©ã¤ã³ã®å質強åããã¯ã©ã¤ã¢ã³ãä¼æ¥ã¸ã®ã¿ã¤ã ãªã¼ãªã¬ãã¼ãã£ã³ã°ãã¼ãºã«å¯¾å¿ãããã<a href="https://cloud.google.com/datastream?hl=ja">Datastream</a> ã«ããåºå¹¹ãã¼ã¿ãã¼ã¹ããã®ãã¢ãªã¢ã«ã¿ã¤ã ãã¼ã¿é£æºãå§ãã¾ãããDatastreamã®å°å
¥ã»éç¨ãå¤é ããå§ãã¦ç´åå¹´ãçµã¡ãæ¬è¨äºã§ã¯å°å
¥æã®æ¤è¨äºé
ããã®å¾ã®éç¨ã«ã¤ãã¦æ¯ãè¿ãã¾ãã</p>
<ul class="table-of-contents">
<li><a href="#CDCã¨ã¯">CDCã¨ã¯</a><ul>
<li><a href="#CDCã®ä½¿ãæ">CDCã®ä½¿ãæ</a></li>
</ul>
</li>
<li><a href="#CDCå°å
¥ã®äºåæºåã¨è¨è¨">CDCå°å
¥ã®äºåæºåã¨è¨è¨</a><ul>
<li><a href="#ã½ã¼ã¹DBã«ãã®ã³ã°ã®è¨å®ã追å ãã">ã½ã¼ã¹DBã«ãã®ã³ã°ã®è¨å®ã追å ãã</a></li>
<li><a href="#ãããã¯ã¼ã¯çµè·¯ã確èªãã">ãããã¯ã¼ã¯çµè·¯ã確èªãã</a></li>
<li><a href="#BigQueryã®ãã¼ã¿ã»ãããç¨æãã">BigQueryã®ãã¼ã¿ã»ãããç¨æãã</a></li>
</ul>
</li>
<li><a href="#éç¨éå§å¾ã®ãã©ãã«ã·ã¥ã¼ãã£ã³ã°ãããã">éç¨éå§å¾ã®ãã©ãã«ã·ã¥ã¼ãã£ã³ã°ãããã</a><ul>
<li><a href="#BigQueryä¸ã§æ´æ°åæ ãããªãåé¡">BigQueryä¸ã§æ´æ°åæ ãããªãåé¡</a><ul>
<li><a href="#ãã¼ã¿ã½ã¼ã¹å´ã®ãã°ã¢ã¼ã«ã¤ãå¾
ã¡ã«ãããã®">ãã¼ã¿ã½ã¼ã¹å´ã®ãã°ã¢ã¼ã«ã¤ãå¾
ã¡ã«ãããã®</a></li>
<li><a href="#BigQueryå´ã®stalenessã®è¨å®ã«ãããã®">BigQueryå´ã®stalenessã®è¨å®ã«ãããã®</a></li>
</ul>
</li>
<li><a href="#Backfillãããã¬ã³ã¼ããéè¤">Backfillãããã¬ã³ã¼ããéè¤</a></li>
</ul>
</li>
<li><a href="#Datastreamå°å
¥ã®æ¯ãè¿ã">Datastreamå°å
¥ã®æ¯ãè¿ã</a><ul>
<li><a href="#è¯ãã£ãç¹">è¯ãã£ãç¹</a></li>
<li><a href="#é£ããã£ãç¹">é£ããã£ãç¹</a></li>
</ul>
</li>
<li><a href="#ã¾ã¨ã">ã¾ã¨ã</a></li>
<li><a href="#We-are-hiring-">We are hiring !!</a></li>
</ul>
<h2 id="CDCã¨ã¯">CDCã¨ã¯</h2>
<p>CDC(Change Data Capture)ã¯ãã¼ã¿ã½ã¼ã¹ (主ã«OracleãPostgreSQLãªã©ã®ãªã¬ã¼ã·ã§ãã«ãã¼ã¿ãã¼ã¹)ããã®å¤æ´ã¤ãã³ããæ¤ç¥ãããããã®å¤æ´ããªã¢ã«ã¿ã¤ã ã§ãã£ããã£ãã¦ä»ã®ã·ã¹ãã ã¨ã®ãã¼ã¿é£æºãå¯è½ã«ããæè¡ã§ããåä½åçã¨ãã¦ã¯RDBã®ãã©ã³ã¶ã¯ã·ã§ã³ãã°ãç£è¦ããå¤æ´ã¤ãã³ããæ¤ç¥ãå®å
ã®ãã¼ã¿ãã¼ã¹ã«åæããæ¹å¼ãå¤ãã§ãã</p>
<p>CDCãå®ç¾ããã¯ã©ã¦ããµã¼ãã¹ã¨ãã¦Google Cloudã§ããã°Datastream, AWSã«ã¯ <a href="https://aws.amazon.com/jp/dms/">DMS</a> ãããã¾ããFivetranãAirbyteãåæ§ã®ä»çµã¿ã«ãããã¼ã¿é£æºã®æ©è½ãæãã¦ãã¾ãã</p>
<h3 id="CDCã®ä½¿ãæ">CDCã®ä½¿ãæ</h3>
<p> å¼ç¤¾ã§ã¯ãã¼ã¿ã¦ã§ã¢ãã¦ã¹ã¨ãã¦ç¨ãã¦ããBigQueryã¨ã®è¦ªåæ§ãªã©ãè¸ã¾ãDatastreamãé¸æãã¦ãã¼ã¿é£æºãå®è£
ãã¾ãããDatastreamã®ãããªãµã¼ãã¹ãå©ç¨ããéã¯ã³ã¹ãé¢ã¨ã®ãã©ã³ã¹ãéè¦ã§ãããããé£æºã®æ¹ãå®ä¾¡ãã¤æ軽ã«å®è£
ã§ããã±ã¼ã¹ãå¤ãããéé²ã«å
¨ãã¼ãã«ã®ãã¢ãªã¢ã«ã¿ã¤ã é£æºãç®æãã®ã§ã¯ãªããå¿
è¦ã«è¿«ããããã¼ãã«ããé 次対å¿ãé²ããã®ãåççã ã¨èãã¾ãããã以å¤ã«ãç©çåé¤ããã£ããæ´æ°å·®åã®ç¹å®ãå°é£ãªã©ã®çç±ã§å·®åé£æºãé£ãããã¼ãã«ãé£æºããå ´åããã¼ã¿ãµã¤ãºã大ããæ´æ°é »åº¦ã®ä½ããã¼ãã«ãé£æºããå ´åã«ããã¦ãæå¹ãªæ段ã§ãã</p>
<p> 次ç¯ä»¥éã§ã¯Datastreamãå°å
¥ããéã®æ¤è¨äºé
ãéç¨ãã¦ãã¦ééãããã©ãã«ã«ã¤ãã¦ãç´¹ä»ãã¾ããDatastreamã«éããCDCå
¨è¬ã§å½ã¦ã¯ã¾ããã¨ãå¤ãã¯ããªã®ã§ä»å¾å°å
¥ããéã®åèã«ãªãã°å¹¸ãã§ãã</p>
<h2 id="CDCå°å
¥ã®äºåæºåã¨è¨è¨">CDCå°å
¥ã®äºåæºåã¨è¨è¨</h2>
<h3 id="ã½ã¼ã¹DBã«ãã®ã³ã°ã®è¨å®ã追å ãã">ã½ã¼ã¹DBã«ãã®ã³ã°ã®è¨å®ã追å ãã</h3>
<p> Datastreamã¯ãã¼ã¿ã½ã¼ã¹ã®RDBMSã®ãã©ã³ã¶ã¯ã·ã§ã³ãã°ãç£è¦ãã¦å¤æ´ãæ¤ç¥ããã¨ããä»çµã¿ä¸ãã¼ã¿ã½ã¼ã¹ã«å¯¾ããæºåãä¾ãã°PostgreSQLã§ããã°WALã®ã¬ãã«ãLogicalã«è¨å®ããããOracleã®å ´åã¯ãµããªã¡ã³ã¿ã«ãã®ã³ã°ã®æå¹åãäºåã«å¿
è¦ã¨ãªãã¾ãããã¼ã¿ã½ã¼ã¹å´ã®ç¶æ³æ¬¡ç¬¬ã§ã¯è² è·ãã¹ãã¬ã¼ã¸ã«å½±é¿ãããã¨ãèããããã®ã§æ¤è¨¼ãã¤ã¤æ
éã«é²ãããã¨ããã§ããã¾ããDBãã¨ã«å¿
è¦ã¨ãªãè¨å®é
ç®ãå¶ç´ãå¤æ°ãããããã¼ã¿ã½ã¼ã¹ãã¨ã®å¶ç´äºé
ã«ã¯å¿
ãäºåã«ç®ãéããã¨ããå§ããã¾ãã</p>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fcloud.google.com%2Fdatastream%2Fdocs" title="Datastream documentation  | Google Cloud" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://cloud.google.com/datastream/docs">cloud.google.com</a></cite></p>
<h3 id="ãããã¯ã¼ã¯çµè·¯ã確èªãã">ãããã¯ã¼ã¯çµè·¯ã確èªãã</h3>
<p>Datastreamã«ã¯<a href="https://cloud.google.com/datastream/docs/private-connectivity?hl=ja">ãã©ã¤ãã¼ãæ¥ç¶</a>ã®æ©è½ããããGoogle Cloudã®VPCã¨Peeringãããã¨ã§å
é¨IPã¢ãã¬ã¹ã§ã®éä¿¡ãå¯è½ã§ãããããæ¨ç§»çãªPeeringã¯ã§ããªãã®ã§æå®ã®VPCã«é
ç½®ããã¦ããªãDB (ä¾ãã°AWSããªã³ãã¬ãã¹ã«é
ç½®ãããDB) ã¨ã®éã®åæã®ããã«ã¯ãªãã¼ã¹ãããã·ã¤ã³ã¹ã¿ã³ã¹ã®é
ç½®ãå¿
è¦ã§ããå³ä¸ã§ (ä¸ç¥)ã¨ããã¦ããç®æã§ãããAWS, GCP, ãªã³ãã¬ãã¹ãVPNã§ç¸äºæ¥ç¶<sup id="fnref:1"><a href="#fn:1" rel="footnote">1</a></sup>ãããããªæ§é ã«ãªã£ã¦ãã¾ãã</p>
<p><figure class="figure-image figure-image-fotolife" title="ãã©ã¤ãã¼ãæ¥ç¶ãç¨ããæ§æã¤ã¡ã¼ã¸"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241229/20241229120014.png" width="676" height="288" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>ãã©ã¤ãã¼ãæ¥ç¶ãç¨ããæ§æã¤ã¡ã¼ã¸</figcaption></figure></p>
<h3 id="BigQueryã®ãã¼ã¿ã»ãããç¨æãã">BigQueryã®ãã¼ã¿ã»ãããç¨æãã</h3>
<p>CDCã§é£æºããããã¼ã¿ãç´æ¥æ¸ãè¾¼ã¾ãããã¼ã¿ã»ããã¨ãã¼ã¿åºç¤å©ç¨è
ãå®éã«ã¯ã¨ãªãããã¼ã¿ã»ãããåé¢ãã¾ããã</p>
<p><figure class="figure-image figure-image-fotolife" title="å©ç¨è
åãã®ãã¼ã¿ã¯æ¿èªæ¸ã¿ãã¥ã¼ãã¨ãã¦é
ç½®"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241229/20241229120007.png" width="707" height="292" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>å©ç¨è
åãã®ãã¼ã¿ã¯æ¿èªæ¸ã¿ãã¥ã¼ãã¨ãã¦é
ç½®</figcaption></figure></p>
<p>é£æºããããã¼ãã«ã«ãã£ã¦ã¯å
¨ç¤¾ã®å©ç¨è
ã«å
¬éããããªãã±ã¼ã¹ãèãããã¾ã (ä¾ãã°ãæ°åãã¡ã¼ã«ã¢ãã¬ã¹ãªã©ã®ãããªå人æ
å ±ãªã©)ãã¹ããªã¼ã ã®è¨å®ã«ãããã¼ãã«åä½ã»ã«ã©ã åä½ã§é¤å¤è¨å®ãå¯è½ã§ãããç¨éã«ãã£ã¦ã¯é©å®ãã¹ã¯ããç¶æ
ã§å©ç¨ããçã®ã±ã¼ã¹ãèãããããããCDCã®éç¨ã§ã¯é¤å¤ããã«ä¸åº¦BigQueryä¸ã®éå
¬éãã¼ã¿ã»ããã«é£æºããæ¿èªæ¸ã¿ãã¥ã¼ã®å½¢ã§å
¬éé åã«é
ç½®ããã¨ããè¨è¨ã«ãã¾ããã</p>
<p>æå¾ã«ãé£æºå
ãã¼ã¿ãã¼ã¹ã®ã¤ã³ãã©æ
å½è
ãDBAã¨ã¯å¯ã«é£æºãåãå¿
è¦ãããããæ©ãã«å·»ãè¾¼ãã§ãããã¨ãéè¦ã§ããç§ãã¡ã¯å®æçã«SREãã¼ã æå±ã®æ
å½è
ã¨å®ä¾ãæã£ã¦åæ¹ã®ã¿ã¹ã¯ã確èªããªããæºåãã¾ãã<sup id="fnref:2"><a href="#fn:2" rel="footnote">2</a></sup>ã</p>
<h2 id="éç¨éå§å¾ã®ãã©ãã«ã·ã¥ã¼ãã£ã³ã°ãããã">éç¨éå§å¾ã®ãã©ãã«ã·ã¥ã¼ãã£ã³ã°ãããã</h2>
<p>éç¨ãéå§ãã¦ããããã¤ããã¼ã¿åæã®åé¡ã«ééããé½åº¦è§£æ±ºãå³ã£ã¦ãã¾ãããäºä¾éçã«è¨è¼ãã¾ãã®ã§ä½ãã®åèã«ãªãã°å¹¸ãã§ãã</p>
<h3 id="BigQueryä¸ã§æ´æ°åæ ãããªãåé¡">BigQueryä¸ã§æ´æ°åæ ãããªãåé¡</h3>
<p> Datastreamä¸ã§æ£å¸¸ã«ãã°åºåããã¦ããã«ããããããBigQueryã¸ã®ãã¼ã¿åæãããã¦ããªãããã«è¦ããäºè±¡ãããã¾ãããããã«ã¯ï¼ã¤ã®è¦å ãããã¾ããããã¼ã¿ã½ã¼ã¹å´ã»å®å
ãã¼ãã«ã®å´åæ¹ã®è¦å ãèããããã®ã§Cloud Loggingä¸ã®Datastreamã®ãã°ãåç
§ãã¦åãåãããã¨ã«ãªãã¾ãã</p>
<h4 id="ãã¼ã¿ã½ã¼ã¹å´ã®ãã°ã¢ã¼ã«ã¤ãå¾
ã¡ã«ãããã®">ãã¼ã¿ã½ã¼ã¹å´ã®ãã°ã¢ã¼ã«ã¤ãå¾
ã¡ã«ãããã®</h4>
<p> ãã®æã®ãã¼ã¿ã½ã¼ã¹ã¯Oracleã ã£ãã®ã§ãããREDOãã°ãã¢ã¼ã«ã¤ããããã¾ã§ã®éå¤æ´ã¯æµãã¦ããªãã¨ããå¶ç´ã«ãããã®ã§ãããDatastreamã®ãã°ä¸ã¯Oracleã®SCNã¯è¿½ãã¦ãããå¤æ´ã¤ãã³ãã¯æµãã¦ããªãã¨ããç¶æ³ã§ãã<sup id="fnref:3"><a href="#fn:3" rel="footnote">3</a></sup>ã</p>
<p><figure class="figure-image figure-image-fotolife" title="ææ°SCNã¯è¿½ãã¦ãããREDOãã°ãã¹ã¤ããããã¦ãããå¤æ´ã¤ãã³ãã¯åå¾ã§ãã¦ããªãæ§å"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241229/20241229120010.png" width="717" height="144" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>ææ°SCNã¯è¿½ãã¦ãããREDOãã°ãã¹ã¤ããããã¦ãããå¤æ´ã¤ãã³ãã¯åå¾ã§ãã¦ããªãæ§å</figcaption></figure></p>
<h4 id="BigQueryå´ã®stalenessã®è¨å®ã«ãããã®">BigQueryå´ã®<a href="https://cloud.google.com/bigquery/docs/change-data-capture?hl=ja">staleness</a>ã®è¨å®ã«ãããã®</h4>
<p>stalenessã®è©³ç´°ã¯ãªã³ã¯å
ã®ããã¥ã¡ã³ãã«è²ãã¾ããããã£ãã¯CDCã®æ´æ°ã¤ãã³ããå°éãã¦ããBigQueryã®ã¯ã¨ãªçµæã¨ãã¦ç¢ºèªã§ããããã«ãªãã¾ã§ã®æ大ã¿ã¤ã ã©ã°ã§ãã<code>max_staleness</code>ã®å¤ãå°ãããããã¨ã§ãããªã¢ã«ã¿ã¤ã ã«è¿ããã¼ã¿åæãå®ç¾ã§ãã¾ãããBigQueryã¸ã®æ¸ãè¾¼ã¿æã®ã¯ã¨ãªæéãå¢ãã¨ãããã¬ã¼ããªããããã®ã§æ³¨æãå¿
è¦ã§ãããã¼ã¿é®®åº¦è¦æ±ã«å¿ãã¦ç¡çãªãå¤ãè¨å®ãã¹ãã§ãããã</p>
<h3 id="Backfillãããã¬ã³ã¼ããéè¤">Backfillãããã¬ã³ã¼ããéè¤</h3>
<p>ãã¼ã¿ã½ã¼ã¹å´ã§ç§»è¡ä½æ¥ãããããã¹ãç°å¢ã§æ¥ç¶è¨å®å¤æ´ãè¡ãªããã¼ã¿ã®ååæ (Backfill) ãå®è¡ããã¨ããã¬ã³ã¼ãã®éè¤ãçºçãã¾ãããããã¯ãã¼ã¿ã½ã¼ã¹å´ã®ãã¼ãã«ã«ä¸»ãã¼ãè¨å®ããã¦ããªãã£ããã¨ã§çºçãã¾ãã (ã¦ãã¼ã¯ç´¢å¼ã¯å®ç¾©ããã¦ãããDDLä¸ã§Primary Keyã¨æ示ããã¦ããªãã£ã)ã</p>
<p>Oracleã®å ´å主ãã¼æå®ã®ãªããã¼ãã«ã«å¯¾ãã¦Datastreamã¯RowIDããã¼ã¨è¦ãªãã¦åæãè¡ããããexport/importãªã©ã§ãã¼ã¿ã®ç©çé
ç½®ãå¤ãã£ã¦RowIDãå¤æ´ãããã¨å¥ã¬ã³ã¼ãã¨ãã¦æ±ããã¦ãã¾ã£ã¦ãã¾ããããªããPostgreSQLã®å ´åã¯PrimaryKeyã<a href="https://www.postgresql.org/docs/current/sql-altertable.html#SQL-ALTERTABLE-REPLICA-IDENTITY">REPLICA IDENTITY</a> ãæå®ãã¦ããå¿
è¦ãããã¾ãããã®è¾ºããDBMSãã¨ã«æåã®éããããã®ã§ææ¡ãã¦ããå¿
è¦ãããã¾ãã</p>
<h2 id="Datastreamå°å
¥ã®æ¯ãè¿ã">Datastreamå°å
¥ã®æ¯ãè¿ã</h2>
<p>å°å
¥ã»éç¨ããã¦ã¿ã¦æ¹ãã¦è¯ãã¨æããç¹ãé£ããã¨æããç¹ãããã¾ããã</p>
<h3 id="è¯ãã£ãç¹">è¯ãã£ãç¹</h3>
<ul>
<li><p>æ¯è¼çç°¡åãªè¨å®ã¨ç¾å®çãªè²»ç¨ã§ãã¢ãªã¢ã«ã¿ã¤ã ã®ãã¼ã¿åæãå®ç¾ã§ãã¾ããããµã¼ãã¼ã¬ã¹ã®ãµã¼ãã¹ã§ãããããå®è¡ç°å¢ãªã©ã®ã¤ã³ãã©ãæ´ããå¿
è¦ããªããå°äººæ°ã®ãã¼ã ã§ãéç¨ã§ãã¦ãã¾ãã</p></li>
<li><p>ãã¼ã¿ã½ã¼ã¹å´ã®ã¹ãã¼ãå¤æ´ãç©çåé¤ã«å¯¾ãã追éãå¯è½ã ç¹ã«ãã¼ã¿ã½ã¼ã¹å´ã§ã«ã©ã 追å ãªã©ããã£ãéã«ãç¹ã«éç¨å¯¾å¿ãããã¨ãBigQueryã®ãã¼ãã«ã«å¤æ´ãåæ ããã¾ãããã¹ãã¼ãããªããã¸ã®å¯¾å¿ãã¹ã ã¼ãºã«ã§ããã®ã¯è¯ããµãã©ã¤ãºã§ããã</p></li>
</ul>
<h3 id="é£ããã£ãç¹">é£ããã£ãç¹</h3>
<ul>
<li><p>ãã¼ã¿ã½ã¼ã¹ã¨å¯çµåã«ãªããããå¾ãªãããã¼ã¿ã½ã¼ã¹ã¨ãªãDBãã¨ã«ç´°ããå¶ç´<sup id="fnref:4"><a href="#fn:4" rel="footnote">4</a></sup>ããã£ãããã½ã¼ã¹DBã®ã¡ã³ããã³ã¹æã¯CDCã足並ã¿ãæããå¿
è¦ãããããã¼ã¿ã½ã¼ã¹ã®DBã«å¯¾ããä¾åãçºçãã¾ãããã®ç¹ã¯ã¢ã¼ããã¯ãã£ä¸ã®å¶ç´ã¨ãã¦å容ããå¿
è¦ãããã¾ãã</p></li>
<li><p>äºåã®è²»ç¨è¦ç©ãã®é£ãããé£æºå¯¾è±¡ã®ãã¼ãã«ã®ãµã¤ãºãæ´æ°é »åº¦ã®æ
å ±ããããã¾ããªCDCè²»ç¨ã試ç®ãã¦ã¹ã¿ã¼ããããã®ã®ãå
¨ä½ã¨ãã¦ã¯ãã¼ã¿è»¢éã»ãããã·ã¤ã³ã¹ã¿ã³ã¹ã®è²»ç¨ã»CDCã®æéã»BigQueryæéã¨è¤æ°ã®è²»ç®ãæ³å®ããå¿
è¦ãããä¸çç¸ã§ã¯ããã¾ããã§ãããå®éã«ä¸å®è¦æ¨¡ããã¤ç¡åæ ã«ã¯åã¾ããªãç¨åº¦ã«å°è¦æ¨¡ãªã¯ã¼ã¯ãã¼ããåããã¦ã¿ã¦æ³å®å¤ã®è¦è½ã¨ãããªãããã§ãã¯ããã®ãè¯ãã¨æãã¾ããã</p></li>
</ul>
<h2 id="ã¾ã¨ã">ã¾ã¨ã</h2>
<p>CDC (Change Data Capture)ã¯ãã¼ã¿ã½ã¼ã¹ã¨ãªãDBãã¨ã®å¶ç´ãå
é¨æåã®è¤éããããä¸æ¹ãç°¡æãªè¨å®ã§ãã¼ã¿åæãã§ããå¼·åãªã½ãªã¥ã¼ã·ã§ã³ã§ããå¼ç¤¾ã§ãDatastreamãå®éã«å°å
¥ãéç¨ããã¦ã¿ã¦è¯ãç¹ã»èª²é¡ç¹ããã¾ããä»ã®ã¨ããç·ãã¦å®å®ããéç¨ãã§ãã¦ãã¾ããä»å¾ã¯å©ç¨ç¯å²ã®æ¡å¤§ã ãã§ã¯ãªãè²»ç¨ã®æé©åããã¼ã¿æ¬ æã®æ¤ç¥ãªã©ãå¼·åãã¦ããããã¨èãã¦ãã¾ãã</p>
<p>ã¾ããæ¥ãã2025å¹´ã«åãã¦ã¯ãã¢ãªã¢ã«ã¿ã¤ã ãã¼ã¿ã ãã§ã¯ãªããã»ãã¥ãªãã£ä¸èæ
®ãå¿
è¦ãªãã¼ã¿ã½ã¼ã¹ãããããæ±ãã¦ã¼ã¹ã±ã¼ã¹ãå¢ããããªã®ã§ãã¼ã¿ä¿è·ã®æ çµã¿ãä¸æ®µã¨ãã¼ã¸ã§ã³ã¢ãããã¦ãããã¨æã£ã¦ããã¾ããããã§ã¯ãä½ã«æ°ãã¤ãã¦è¯ããå¹´ããè¿ããã ããï¼</p>
<h2 id="We-are-hiring-">We are hiring !!</h2>
<p>ã¨ã ã¹ãªã¼ã®ãã¼ã¿åºç¤æ´»ç¨ç¯å²ã¯å¹´ã
åºãã£ã¦ããã¾ããã³ã¹ãããã©ã¼ãã³ã¹ã®è¯ããã¼ã¿åºç¤ã®æ§ç¯ã»éç¨ããã¼ã¿ãæ´»ç¨ããã¢ããªã±ã¼ã·ã§ã³éçºã§æ´»èºã®å ´ãããããããã¾ãããããèå³ããã¾ããããã¡ãã®ãã¼ã¸ããã©ããã ã«ã¸ã¥ã¢ã«é¢è«ã»ãå¿åãå¾
ã¡ãã¦ããã¾ãï¼</p>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjobs.m3.com%2Fengineer%2F" title="ã¨ã³ã¸ãã¢æ¡ç¨ãµã¤ãï½æ¡ç¨æ
å ± | å»çÃãã¯ããã¸ã¼ã®å¯è½æ§ã¯ç¡é大" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jobs.m3.com/engineer/">jobs.m3.com</a></cite>
<iframe src="https://open.talentio.com/r/1/c/m3-inc/embed/pages/57609" width="100%" height="300" frameborder=0 title="%E3%82%A8%E3%83%A0%E3%82%B9%E3%83%AA%E3%83%BC+%7C+%E3%83%87%E3%83%BC%E3%82%BF%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2"></iframe><cite class="hatena-citation"><a href="https://open.talentio.com/r/1/c/m3-inc/pages/57609">open.talentio.com</a></cite></p>
<div class="footnotes">
<hr/>
<ol>
<li id="fn:1">
詳ããã¯ãã²ãã¡ãããèªã¿ãã ãã <a href="https://www.m3tech.blog/entry/gcp_aws_vpn_struggle">AWS・オンプレと GCP を VPN で相互接続する際の勘所 - エムスリーテックブログ</a><a href="#fnref:1" rev="footnote">↩</a></li>
<li id="fn:2">
å®éã®ã¨ããã¯ä¸è¿°ç¨å¨å°ãªè¨ç»ãç«ã¦ã¦ã¹ã¿ã¼ãããããã§ã¯ãªãã試è¡é¯èª¤ããªããå°å
¥ãé²ãã¾ãããããã§ã¯ãã®å
容ãæ¯ãè¿ã£ã¦å¾ç¥æµçã«ã¾ã¨ãã¦ãã¾ãã<a href="#fnref:2" rev="footnote">↩</a></li>
<li id="fn:3">
ãã¹ãç°å¢ã§ãã©ã³ã¶ã¯ã·ã§ã³éãå°ãªãã£ãããçºçãã¦ãã¾ãããREDOãã°ã®ãµã¤ãºæ¬¡ç¬¬ã§ã¯ã¬ããªã±ã¼ã·ã§ã³é
延ã®è¦å ã«ãªãã®ã§è¨å®ã確èªãã¦å¯¾å¿ãã¾ããã<a href="#fnref:3" rev="footnote">↩</a></li>
<li id="fn:4">
è½ã¨ãç©´ãè²ã
ã¨ãããè½ã¡ãªããå¦ã³ã¾ãããå
¬å¼ã®ããã¥ã¡ã³ããã©ãã©ãå
å®ãã¦ãããããªæ°ããã¾ãã<a href="#fnref:4" rev="footnote">↩</a></li>
</ol>
</div>
takumikid2
ã¨ã ã¹ãªã¼ã®å
¨å¡ QA ä½æ¦
hatenablog://entry/6802418398312840707
2024-12-28T16:00:00+09:00
2024-12-28T16:00:00+09:00 çããããã«ã¡ã¯ãã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ãã¼ãã©ã«ããã¼ã¸ã£ã¼å
¼ QA ãã¼ã ãªã¼ãã¼ã®çªªç°ã§ãã 1å¹´ãçµã¤ã®ã¯é常ã«æ©ããããããã£ããã¨ããããã®ãã¨æ¯ãè¿ãå¹´æ«ã«ãªãã¾ããã æ¬æ¥ã¯ç§ã GM ã«ãªãåããåãå
¥ãã¦ããæ´»åãå
¨å¡QAä½å¶ã¸ã®ç§»è¡*1ãã«ã¤ãã¦ã話ããã¾ãã æ¬å
容ã¯ã12/24 ã«åç· å½¹CTOå
¼VPoPã®å±±å´ãããã°ã§è©±é¡ã«æãã¦ãããçµç¹çã¹ããããã§ã³ã¸ãã®1ã¤ã§ããããçµç¹çãªã¤ã³ãã¯ãã大ããªæ´»åã§ãã www.m3tech.blog ã¯ããã« ç¾ç¶ã®éçºããã¼ å
¨å¡ QA ä½å¶ã¸ã®ç§»è¡ 決起éä¼ï¼ã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ããã¼ãã£ã³ã°ï¼ æ¹éã»ç®æ¨è¨å®ã¨å¨ç¥ â¦
<p>çããããã«ã¡ã¯ãã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ãã¼ãã©ã«ããã¼ã¸ã£ã¼å
¼ QA ãã¼ã ãªã¼ãã¼ã®çªªç°ã§ãã
1å¹´ãçµã¤ã®ã¯é常ã«æ©ããããããã£ããã¨ããããã®ãã¨æ¯ãè¿ãå¹´æ«ã«ãªãã¾ããã
æ¬æ¥ã¯ç§ã GM ã«ãªãåããåãå
¥ãã¦ããæ´»åãå
¨å¡QAä½å¶ã¸ã®ç§»è¡<a href="#f-0a6e7b5e" id="fn-0a6e7b5e" name="fn-0a6e7b5e" title="ããã¸ã§ã¯ããã¼ã ãã»ããããã¨ãã話ã«ããªãããã¼ã ã¡ã³ãã¼ãChat GPTãªã©ã«ç¸è«ããçµæ Quality boost tActics ç¥ãã¦QubotA ã¨ããæ称ãå½±ã§ã¤ãã¦ãã¾ãã">*1</a>ãã«ã¤ãã¦ã話ããã¾ãã
æ¬å
容ã¯ã12/24 ã«åç· å½¹CTOå
¼VPoPã®å±±å´ãããã°ã§è©±é¡ã«æãã¦ãããçµç¹çã¹ããããã§ã³ã¸ãã®1ã¤ã§ããããçµç¹çãªã¤ã³ãã¯ãã大ããªæ´»åã§ãã</p>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.m3tech.blog%2Fentry%2Fcto-retrospective-2024" title="2024å¹´ãã¨ã ã¹ãªã¼ã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ãã§è¡ã£ãçµç¹çã¹ããããã§ã³ã¸5é¸ã - ã¨ã ã¹ãªã¼ããã¯ããã°" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://www.m3tech.blog/entry/cto-retrospective-2024">www.m3tech.blog</a></cite></p>
<ul class="table-of-contents">
<li><a href="#ã¯ããã«">ã¯ããã«</a></li>
<li><a href="#ç¾ç¶ã®éçºããã¼">ç¾ç¶ã®éçºããã¼</a></li>
<li><a href="#å
¨å¡-QA-ä½å¶ã¸ã®ç§»è¡">å
¨å¡ QA ä½å¶ã¸ã®ç§»è¡</a><ul>
<li><a href="#決起éä¼ã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ããã¼ãã£ã³ã°">決起éä¼ï¼ã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ããã¼ãã£ã³ã°ï¼</a></li>
<li><a href="#æ¹éç®æ¨è¨å®ã¨å¨ç¥">æ¹éã»ç®æ¨è¨å®ã¨å¨ç¥</a></li>
<li><a href="#ç¾å¨ã¾ã§ã®é²æ">ç¾å¨ã¾ã§ã®é²æ</a></li>
</ul>
</li>
<li><a href="#ãããã«">ãããã«</a></li>
<li><a href="#ãã¾ã">ãã¾ã</a></li>
<li><a href="#Were-hiring">We're hiring</a></li>
</ul>
<h2 id="ã¯ããã«">ã¯ããã«</h2>
<p>å±±å´ã®ããã°ã§ãè¨åããã¦ããéããåªç§ãª QA ã¨ã³ã¸ãã¢æ¡ç¨ã¯ç«¶äºãæ¿ããç¶æ
ã«ããå社æ¡ç¨ã«è¦å´ãã¦ããç¶æ³ã§ããä¸æ¹ã§ã¨ã³ã¸ãã¢æ¡ç¨ã¯é 調ã«æ¨ç§»ãã¦ãããéçºåã¯æ¥ã
å¢å¼·ããã¦ãã¾ããéçºã¹ãã¼ãã®åä¸ã«å¯¾å¿åºæ¥ãããã«QA ãã¼ã å
ã§ãæ§ã
ãªæ½çãæã£ã¦ãããããQA ä½æ¥å¾
ã¡ãã±ããã®å¤§éçºçãªã©ã®å¤§ããªæ¯éã¯ã¾ã åºã¦ãã¾ãããããããä»å¾ãæ¡ç¨ãå³ããç¶æ
ãç¶ããç¾å¨ã¨åæ§ãªæ¹æ³ã§ QA ä½æ¥ãé²ãã¦ããã¨ãéçºã¹ãã¼ãã«å¯¾å¿ã§ããªããªãã¨ãã訪ããçµç¹ã¹ã±ã¼ã«ã®ããã«ããã¯ã«ãªã£ã¦ãã¾ãå¯è½æ§ãããã¾ãã
ã¾ããQA ã¨ã³ã¸ãã¢ãæ
å½ãµã¼ãã¹ã®ãã¹ãã«å¤§ããªå·¥æ°ãå²ãã¦ãããããå質æ¹åæ½çã«åãçµãæéãååã«ã¨ãã¦ããªãç¶æ³ã¨ãªã£ã¦ãã¾ãããã¹ããä¸å¿ã¨ããå質確ä¿æ½çã®ã¿ã§ã¯ãããªãå質æ¹åã¯é£ãããããã¡ãã«ã¤ãã¦ãæ¹åãå¿
è¦ã§ãã</p>
<h2 id="ç¾ç¶ã®éçºããã¼">ç¾ç¶ã®éçºããã¼</h2>
<p>ç¾å¨ãQA ãã¼ã ã§ã¯ãåãµã¼ãã¹ã®éçºãã¼ã ã«å
¥ãè¾¼ã¿ãä»æ§ã®ç¢ºèªããã·ã¹ãã ãã¹ãã®å®æ½ã¾ã§ãæ
å½ãã¦ãã¾ããç°¡ç¥åããããã¼ã§è¡¨ãã¨ä¸å³ã®ããã«ãªãã¾ãï¼ãã¼ã ã«ãã£ã¦æ¡ç¨ãã¦ããéçºææ³ãéãã®ã§ããã¾ã§ãä¸ä¾ã§ãï¼</p>
<p><figure class="figure-image figure-image-fotolife" title="ç¾å¨ã®éçºããã¼"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241228/20241228160002.png" width="800" height="377" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>ç¾å¨ã®éçºããã¼</figcaption></figure></p>
<p>ç¾å¨ã®éçºããã¼ã¯ãã¼ã å
ã§å¯ã«ã³ãã¥ãã±ã¼ã·ã§ã³ãåããªãã並è¡ãã¦ä½æ¥ãã§ããããä½æ¥å¹çããããããããã®ã¡ã³ãã¼ã®å¾æåéã«å°å¿µã§ãã¦ããã¨æãã¦ããããããã¾ã1ã¤ã®å®å®ããå½¢ãªã®ããªã¨æã£ã¦ãã¾ãããã ãããããã¯ãããã¼ã¸ã£ã¼ï¼ä»¥é PdMï¼ãã¨ã³ã¸ãã¢ï¼ä»¥é Engï¼ã®æ¡ç¨ãé 調ã«é²ãã§ãããã人æ°ã®ãã©ã³ã¹ãå°æ¥çã«å´©ãã¦ãã¾ããã·ã¹ãã ãã¹ãå·¥ç¨ï¼å³ã®ãã¹ãè¨è¨ããã¹ãå®æ½ï¼ããªãªã¼ã¹ã®ããã«ããã¯ã«ãªãã¨äºæ³ããã¾ãã</p>
<h2 id="å
¨å¡-QA-ä½å¶ã¸ã®ç§»è¡">å
¨å¡ QA ä½å¶ã¸ã®ç§»è¡</h2>
<p>ä¸è¨åé¡ç¹ãã¾ãã¯è§£æ¶ããå°æ¥ã®çµç¹æ¡å¤§ããããªãå質æ¹åãéæããããã«ãå
¨å¡ QA ä½å¶ã¸ã®ç§»è¡ãã¨ãã£ããã£ã¬ã³ã¸ããããã¨ã«ãªãã¾ããã
ç°¡åã«è¨ã£ã¦ãã¾ãã° QA ã¨ã³ã¸ãã¢ãä¸å¿ã«è¡ã£ã¦ããã·ã¹ãã ãã¹ããæ ¸ã¨ããå質ä¿è¨¼æ´»åãéçºãã¼ã å
¨å¡ã§ãã£ã¦ãã¾ããã¨ãããã¨ã§ããè¨ãã¯æãã</p>
<p>å
¨å¡ QA ä½å¶ã¸ã®ç§»è¡ã§éæããããã¨ã¯ããããããã¾ããã大ã¾ãã«æ¬¡ã®ãã¤ã³ããéæãããã¨æã£ã¦ãã¾ãã</p>
<ul>
<li>ãã¹ãæ´»åããã¼ã å
¨å¡ã§åºæ¥ãããã«ãã</li>
<li>ãããªãå質æ¹åæ½çã®å®æ½</li>
</ul>
<p>1ã¤ç®ã¯ãã¹ãæ´»åããã¼ã å
¨å¡ã§å®æ½ã§ããããã«ãªããã¨ã§ããªãªã¼ã¹ã®ããã«ããã¯ãå°æ¥çã«çºçããã®ãé²ããå
¨å¡ã§ãããã¯ãã触ããã¨ã«ããå質æèãæ´ã«é¸æãããã¨ãç®æ¨ã«ãªãã¾ãã</p>
<p>2ã¤ç®ã¯ç¾å¨ãã·ã¹ãã ãã¹ããä¸å¿ã¨ããå質ä¿è¨¼æ´»åã¨ãªã£ã¦ããããã次3ç¹ã®æ´»åã«ãããããªãå質æ¹åãããããã¨ãç®æ¨ã§ãã</p>
<ul>
<li>è¦ä»¶å®ç¾©ã ç»é¢è¨è¨æ¸ ãªã©ã®ããã¥ã¡ã³ãå質åä¸</li>
<li>ãªãªã¼ã¹å¾ææ¨ã®ç£è¦ã«ãããµã¼ãã¹å質åä¸</li>
<li>å質ææ¨ã®éæ確èªã¨åæã®å¼·å</li>
</ul>
<p>ä»åã®ããã°ã§ã¯ãã§ã«æ§ã
ãªæ´»åãå®æ½ãã¦ããåè
ã«ã¤ãã¦è©³ãã説æãã¾ãã</p>
<h3 id="決起éä¼ã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ããã¼ãã£ã³ã°">決起éä¼ï¼ã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ããã¼ãã£ã³ã°ï¼</h3>
<p>12/26 ã« VPoE ã®æ²³åãå
¬éããè¨äºã®éããã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ãã§ã¯ã°ã«ã¼ãã¡ã³ãã¼å
¨å¡ãåå ãããã¼ãã£ã³ã°ãæã«1åå®æ½ãã¦ãã¾ãã</p>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.m3tech.blog%2Fentry%2Fengineering-books-2024" title="2024å¹´ã«ã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ããã¼ãã£ã³ã°ã§ç´¹ä»ããæ¸ç±ã®ç´¹ä» - ã¨ã ã¹ãªã¼ããã¯ããã°" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://www.m3tech.blog/entry/engineering-books-2024">www.m3tech.blog</a></cite></p>
<p>ãã®ä¸ã§ãç¾å¨ã® QA ã¨ã³ã¸ãã¢æ¡ç¨ã®ç¾ç¶ãè¸ã¾ããããã§ä»¥ä¸ã®ç¹ã«ã¤ãã¦èª¬æããã¾ããã</p>
<ul>
<li>QA ã¨ã³ã¸ãã¢ã®å¢å ã«é ¼ããªãå質確ä¿ããã»ã¹ã®ç¢ºç«ãå¿
è¦ã§ãããã¨
<ul>
<li>åå¹´å¾ã1å¹´å¾ã«ã©ã®ãããªç¶æ
ã«ãªããããã®æ¹éã»ç®æ¨ãåããã¦èª¬æï¼å¾è¿°ï¼</li>
</ul>
</li>
<li>ãã¹ããä¸å¿ã¨ããå質ä¿è¨¼æ´»åã§ã¯éçããããããå
¨ä½ã§ååãã¦å質ãé«ããä½å¶ãå¿
è¦ã§ãããã¨</li>
</ul>
<p>説æã®å¾ããç¨åº¦ã®å対æè¦ãªã©ãããããªã¨æã£ã¦ãã¾ããããäºæ³ä»¥ä¸ã«ååçãªå£°ãå±ãã¾ãããæ¹ãã¦ã¨ã ã¹ãªã¼ã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ãã®äºãã«ãªã¹ãã¯ããåããå©ãåãæåã«æåãè¦ãããã®ã§ãããã®ãããªé°å²æ°ããã£ããã次ã®ã¹ãããã§ãããã¼ã ã¸ã®åå¥èª¬æãã¹ã ã¼ãºã«é²ãããã¨ãã§ãã¾ããã</p>
<h3 id="æ¹éç®æ¨è¨å®ã¨å¨ç¥">æ¹éã»ç®æ¨è¨å®ã¨å¨ç¥</h3>
<p>Eng ã«å¾æ¥ QA ã¨ã³ã¸ãã¢ãå®æ½ãã¦ãããã¹ããå®æ½ãã¦ããããã¨ãã¨ããããã®åºæ¬æ¹éã§ããå®ã¯ãã®æ¹åæ§ã¯ä»å¹´ããæ¥ã«å§ã¾ã£ãã¨ããããã§ã¯ãªãã確èªã容æãªè»½ãä¿®æ£ãä¸é¨ã®ãããå¦çãªã©ã¯ãã§ã« Eng ã«ãã¹ããå®æ½ãã¦ããã£ã¦ãã¾ããã<a href="#f-5ecbf75f" id="fn-5ecbf75f" name="fn-5ecbf75f" title="ããã«ã¤ãã¦ã®è©³ãã話㯠QA ãã¼ã ã¡ã³ãã¼ãè²ã
ã¨é å¼µã£ã¦ãããã®ã§å¥éããã°ãæ¸ãããäºå®ã§ã">*2</a>ä»åã¯ãã®æ´»åã®ç¯å²ãæ¡å¤§ãããã¨ãããã®ã§ãã</p>
<p>ä½ãããã«ãç®æ¨ãè¨å®ãããã¨ã大äºã§ããã¾ãã¯ç®æ¨ã®ããã®ææ¨ãä½æãã¾ããã次ã®è¡¨ã®ããã«è©ä¾¡åºæºã¯3段éã«ãªãã¾ãã</p>
<p><figure class="figure-image figure-image-fotolife" title="è©ä¾¡åºæº"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241228/20241228160009.png" width="800" height="269" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>è©ä¾¡åºæº</figcaption></figure></p>
<p>次ã«ãåãã¼ã ãç¾å¨ãã®è©ä¾¡åºæºã®ã©ã®ã¬ãã«ã«ãããããããã³ã°ã¾ããããã®ä¸ã§ãã¼ã ã®æ§è³ªãªã©ãå å³ãã¦ã©ã®ã¿ã¤ãã³ã°ã§ã©ã®ã¬ãã«ã«ãªã£ã¦ããããã®ç®æ¨ãè¨å®ãã¾ããã次ã®è¡¨ãä½æä¾ã§ãããã§ã«åå以ä¸ã®ãã¹ããå®æ½ã§ãã¦ãããã¼ã ã¯åå¹´å¾ã«ã»ã¼å
¨ã¦ã®ãã¹ããå®æ½ããããã«è¨å®ãã¦ãã¾ããã¾ããç¾å¨ã®ãã¹ãå®æ½æ¯çãä½ããã¼ã ãã¤ãé«ãå質ãç¶æããªããã°ãããªããã¼ã ã«ã¤ãã¦ã¯å質確ä¿ã®ä»çµã¿ãæ´ããæéãå å³ããå¿
è¦ããããããç·©ãããªç®æ¨ãè¨å®ãã¦ãã¾ãã</p>
<p><figure class="figure-image figure-image-fotolife" title="ç®æ¨è¨å®ä¾"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241228/20241228160005.png" width="710" height="188" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>ç®æ¨è¨å®ä¾</figcaption></figure></p>
<p>ä¸è¨ç®æ¨ã¨æ¹éãåãã¼ã ã«èª¬æããã¾ãããåãã¼ã ã«æå±ãã¦ãã QA ãã¼ã ã¡ã³ãã¼ã«ç¾å®çãªé²ãæ¹ã«ã¤ãã¦ææ¡ããã¦ãããããããæãã ä¸ã§ç´°ããã«ã¼ã«ãªã©ã決å®ãã¾ããã</p>
<p>ã«ã¼ã«ã®ä¸ä¾ã次ã«ç¤ºãã¾ããä»å㯠表㮠C ãã¼ã ã®ä¾ã§ãã</p>
<ul>
<li>é«å質ãè¦æ±ãããæ©è½ã«ã¤ãã¦ã¯ããã¾ã§éã QA ã¨ã³ã¸ãã¢ãä¸å¿ã¨ãªã£ã¦ãã¹ããå®æ½ãã</li>
<li>ä¸è¨ä»¥å¤ã®æ¹ä¿®ã§ãã¹ãå·¥æ°ã1æ¥æªæºã®ãã®ã«ã¤ãã¦ã¯ Eng ããã¹ããå®æ½ãã
<ul>
<li>Eng ã¯ç¢ºèªãããã¹ã観ç¹ããã±ããã«è¨è¼ãããQA ã¨ã³ã¸ãã¢ã¯ãããã¬ãã¥ã¼ãã
<ul>
<li>å¿
è¦ã«å¿ã㦠追å ã®è¦³ç¹ã Eng ã«ãã¹ããã¦ããã</li>
</ul>
</li>
</ul>
</li>
<li>ãã¹ã観ç¹ã¯ QA ãã¼ã å
ã§èç©ãã¦ããè³æãããããå¿
è¦ã«å¿ãã¦ç¢ºèªããã¦ããã</li>
</ul>
<p>å®æ½ã®æåã®æ®µéã§ã¯ãªãã¹ãç°¡ç¥ãªã«ã¼ã«ã«ãã¦ãããåé¡ãçºç次第修æ£ããã¦ããæ¹éã«ãã¾ããã
ãã®ã«ã¼ã«ã Eng ã«èª¬æããã¦ãå³å®æ½ãã¦ããã ãã¾ããã</p>
<h3 id="ç¾å¨ã¾ã§ã®é²æ">ç¾å¨ã¾ã§ã®é²æ</h3>
<p>C ãã¼ã ã§ã®é²æãä¸ä¾ã¨ãã¦ç´¹ä»ãã¾ããC ãã¼ã ã§ã¯æ¬æ½çãå®æ½ããåããå°ãã㤠Eng ã«ãããã¹ããå®æ½ãã¦ãã¾ããããã®ãããä»åã®æ½çã«å¯¾ãã¦ã¯æ¯è¼çã¹ã ã¼ãºã«é²ãããã¨ãã§ãã¦ãã¾ããè¨å®ããã«ã¼ã«ã«å¾ã£ã¦åãã¦ããããã次ã®ã¹ãããï¼ãã¹ãå®æ½çã®åä¸ï¼ã«åãã¦ã®ä½æ¦ãç«ã¦ã¦ãã段éã§ãã
ä¸è¨ã®æ´»åã«ããææãç°¡åã«ã¾ã¨ãã¦ã¿ã¾ããã</p>
<ul>
<li>æé 130 件ã®æ¹ä¿®ã®ãã¹ãã Eng ãå®æ½ã§ãã¦ãã</li>
<li>ä»ã¾ã§ QA ã¨ã³ã¸ãã¢3人ã§æ
å½ãã¦ããä»äºã2人ã§åããæ§ã«ãªã£ã
<ul>
<li>æ®ãã®1人ã¯å質æ¹åã®ããã®ä½æ¥çæä¸</li>
</ul>
</li>
</ul>
<p> ç®æ¨ã¨ãã¦ãããã¹ãæ¯çã¾ã§ã®éã®ãã¯ã¾ã ã¾ã ããã¾ãããçå®ã«è¯ãæ¹åã«é²ãã§ããå®æãããã¾ãã
ææã®ä¸ã«å質æ¹åã®è©±ãå°ãåºã¦ãã¾ãã詳ãã話ã«ã¤ãã¦ã¯æ¬¡å以éã®ããã°ã§ç´¹ä»ãããã¨æãã¾ãã</p>
<h2 id="ãããã«">ãããã«</h2>
<p>å½åããã®æ´»åã«ããå質ãå¤å°è½ã¡ã¦ãã¾ããªããã¨ããæ¸å¿µãããã¾ããããQA ã¨ã³ã¸ãã¢ã«ããã¬ãã¥ã¼ããã¡ãã¨è¡ã£ãããä»ã¾ã§æ´åãã¦ããèªåãã¹ããæ´»ç¨ããããããã¨ã«ããå質ãä¸å®ã«ä¿ã¦ã¦ãããæ¸å¿µã¯é¡å¨åãã¦ããã¾ãããå°éãªæ¹åæ´»åãå®ãçµãã çµæã¨ãè¨ãã¾ãã</p>
<p>ãã¾ãè¡ã£ã¦ãããã¨ã°ããã§ãªã課é¡ãããã¾ããEng ã«ãããã¹ãå®æ½æ¯çããã以ä¸æ¡å¤§ããããã«ã¯å¤§è¦æ¨¡ããã¸ã§ã¯ãã®ãã¹ããå®æ½ãã¦è²°ãå¿
è¦ãããã¾ããä»ã¾ã§å質è¨ç»ããã¹ãå®æ½ã QA ã¨ã³ã¸ãã¢ãå®æ½ãã¦ãããããEng ã«ãã®ãã¦ãã¦ãä¼æ¬ãã¤ã¤ãé©åã«ã¬ãã¥ã¼ããã¹ãæ¯æ´ãå®æ½ãã¦å質ãè½ã¨ããªãããã«ç§»è¡ããå¿
è¦ãããã¾ãã
ãã¡ãã«ã¤ãã¦ã¯ã¾ã æ¤è¨ä¸ã§ãè¯ãææãåºæ¬¡ç¬¬ã¾ãå ±åããã¦ããã ãããã¨æãã¾ãã</p>
<p>ä»å¾ã®å±æã¨ãã¦ã¯ãQA ã¨ã³ã¸ãã¢ãå質æ¹åã«éæçæãã§ããããã«ãªã£ãããããé«ãå質ãæ±ãããããµã¼ãã¹ã« QA ã¨ã³ã¸ãã¢ãéä¸ããããã¨ãã§ããããã«ãªããã¨ãç®æ¨ã§ãã</p>
<h2 id="ãã¾ã">ãã¾ã</h2>
<p>ãããå®å
¨éæãã¡ãã㨠QA ã¨ã³ã¸ãã¢ã®ãä»äºã¯ã©ããªãã®ï¼ã¨ãã話ãåºã¦ãã¾ãã
QA ã¨ã³ã¸ãã¢ã®ãä»äºã¯ããã¾ã§ãå質ã確ä¿ãããé«ããäºã«ããããã¹ãã¯æ段ã®1ã¤ã§ããä¸æµã®ã¬ãã¥ã¼ã«é£ã³è¾¼ãã§ãã£ãããç¾å¨ãã¹ããªã©ã§ç¢ºèªã§ãã¦ããªã課é¡ãè¦ã¤ãã«è¡ã£ããããªãªã¼ã¹å¾ã®æ°å¤ããã¡ãã¨ç¢ºèªã§ããããã«åãããâ¦â¦ã¨ãããã¨ã¯ããããããã¾ããããã«ã¯éçºã常ã«é 調ã«é²ãã¨ãéãããã®æ㯠QA ã¨ã³ã¸ãã¢ã®å質ç¥èãæ´»ãããã£ã³ã¹ã§ãã
ã¨ã ã¹ãªã¼ã® QA ã¨ã³ã¸ãã¢ã¯ãã¼ã ã®å質ã®ãã¼ããã¼ã¨ãã¦ãä½ã§ããããï¼ ã¨ããã¹ã¿ã³ã¹ã§æ´»åãã¦ãããããä»å¾ãæ§ã
ãªãã£ã¬ã³ã¸ãå¾
ã£ã¦ããã¨äºæ³ãã¦ãã¾ãï¼ç´è¿ã§ããã£ã¬ã³ã¸ã¯ããããããâ¦â¦ãããããã¨ããããããâ¦â¦ï¼</p>
<p><figure class="figure-image figure-image-fotolife" title="å
¨å¡QA ã§çæããã AIç»å"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241228/20241228160012.png" width="800" height="535" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>å
¨å¡QA ã§çæããã AIç»å</figcaption></figure></p>
<h1 id="Were-hiring">We're hiring</h1>
<p>ã¨ã ã¹ãªã¼ã§ã¯ å
¨å¡ QA ã®æ¹éã§é¢ä¿è
å
¨å¡ã§å質ä¿è¨¼ã§ããä½å¶ã«åãã£ã¦é²ãã§ãã¾ãããã¹ããå¾æãªæ¹ãå
¨ä½çãªå質ä¿è¨¼ã«èå³ãããæ¹ããã¹ã¦ã®ããã»ã¹ã®å質ã«èå³ã®ããæ¹ãªã©ãªã©æ§ã
ãªäººã«æ¥½ãããã£ã¬ã³ã¸ãå¾
ã£ã¦ããç¶æ
ã§ãããèå³ã®ããæ¹ã¯ãã²ä¸åº¦ãåãåãããã ããï¼</p>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjobs.m3.com%2Fengineer%2F" title="ã¨ã³ã¸ãã¢æ¡ç¨ãµã¤ãï½æ¡ç¨æ
å ± | å»çÃãã¯ããã¸ã¼ã®å¯è½æ§ã¯ç¡é大" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jobs.m3.com/engineer/">jobs.m3.com</a></cite></p>
<div class="footnote">
<p class="footnote"><a href="#fn-0a6e7b5e" id="f-0a6e7b5e" name="f-0a6e7b5e" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">ããã¸ã§ã¯ããã¼ã ãã»ããããã¨ãã話ã«ããªãããã¼ã ã¡ã³ãã¼ãChat GPTãªã©ã«ç¸è«ããçµæ Quality boost tActics ç¥ãã¦QubotA ã¨ããæ称ãå½±ã§ã¤ãã¦ãã¾ãã</span></p>
<p class="footnote"><a href="#fn-5ecbf75f" id="f-5ecbf75f" name="f-5ecbf75f" class="footnote-number">*2</a><span class="footnote-delimiter">:</span><span class="footnote-text">ããã«ã¤ãã¦ã®è©³ãã話㯠QA ãã¼ã ã¡ã³ãã¼ãè²ã
ã¨é å¼µã£ã¦ãããã®ã§å¥éããã°ãæ¸ãããäºå®ã§ã</span></p>
</div>
j-kubota
ã¨ã ã¹ãªã¼å¦çã¨ã³ã¸ãã¢åãæ
å ±ã¾ã¨ã
hatenablog://entry/6802418398313534577
2024-12-27T15:56:59+09:00
2025-02-20T03:35:09+09:00 ããã«ã¡ã¯ãæè¿Re:ã¼ãã人çã§åãã¦è¦ã¾ããVPoEã®æ²³å(@vaaaaanquish)ã§ãããã£ã¨æ©ãç¥ãããã£ãã§ãã ãã¦ãã¨ã ã¹ãªã¼ã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ãã§ã¯ãé·ããæ°åã¨ã³ã¸ãã¢æ¡ç¨ãå°ããè¦æ¨¡ã§é²ãã¦ããã¾ããã 2024å¹´ããã¯ããã®è¦æ¨¡ãå°ãæ¡å¤§ããæ§ã
ãªã¤ãã³ãã«åºããã¤ã³ã¿ã¼ã³ãåãå
¥ãããªã©ãã¦ãã¾ãã æ¬è¨äºã¯ãå¦çã¨ã³ã¸ãã¢ã®çæ§ããèãããäºãå¤ãå
容ãã¾ã¨ããã¨ã ã¹ãªã¼ã®ã¨ã³ã¸ãã¢çµç¹ãç¥ã£ã¦é ãäºãç®çã¨ãããã®ã§ãã ã¨ã ã¹ãªã¼ã®ã¨ã³ã¸ãã¢ã¤ã³ã¿ã¼ã³ Rust/Go/k8sãå
¨ã¦è§¦ã£ã¦Batchããªãªã¼ã¹ããäºä¾ å®ãããã¯ãã®Kotlinããã¯ã¨ã³ããâ¦
<div align="center"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241227/20241227155712.png" width="500" height="400" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></div>
<p>ããã«ã¡ã¯ãæè¿Re:ã¼ãã人çã§åãã¦è¦ã¾ããVPoEã®æ²³å(<a href="https://x.com/vaaaaanquish">@vaaaaanquish</a>)ã§ãããã£ã¨æ©ãç¥ãããã£ãã§ãã</p>
<p>ãã¦ãã¨ã ã¹ãªã¼ã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ãã§ã¯ãé·ããæ°åã¨ã³ã¸ãã¢æ¡ç¨ãå°ããè¦æ¨¡ã§é²ãã¦ããã¾ããã
2024å¹´ããã¯ããã®è¦æ¨¡ãå°ãæ¡å¤§ããæ§ã
ãªã¤ãã³ãã«åºããã¤ã³ã¿ã¼ã³ãåãå
¥ãããªã©ãã¦ãã¾ãã</p>
<p>æ¬è¨äºã¯ãå¦çã¨ã³ã¸ãã¢ã®çæ§ããèãããäºãå¤ãå
容ãã¾ã¨ããã¨ã ã¹ãªã¼ã®ã¨ã³ã¸ãã¢çµç¹ãç¥ã£ã¦é ãäºãç®çã¨ãããã®ã§ãã</p>
<ul class="table-of-contents">
<li><a href="#ã¨ã ã¹ãªã¼ã®ã¨ã³ã¸ãã¢ã¤ã³ã¿ã¼ã³">ã¨ã ã¹ãªã¼ã®ã¨ã³ã¸ãã¢ã¤ã³ã¿ã¼ã³</a><ul>
<li><a href="#RustGok8sãå
¨ã¦è§¦ã£ã¦Batchããªãªã¼ã¹ããäºä¾">Rust/Go/k8sãå
¨ã¦è§¦ã£ã¦Batchããªãªã¼ã¹ããäºä¾</a></li>
<li><a href="#å®ãããã¯ãã®Kotlinããã¯ã¨ã³ããæ¹ä¿®ããäºä¾">å®ãããã¯ãã®Kotlinããã¯ã¨ã³ããæ¹ä¿®ããäºä¾</a></li>
<li><a href="#åæ£å¦çMLOpsã®OSSãéçºå
¬éããäºä¾">åæ£å¦çMLOpsã®OSSãéçºãå
¬éããäºä¾</a></li>
<li><a href="#é»åã«ã«ãã®GoRubyTypeScriptããã©ã¼ãã³ã¹æ¹åäºä¾">é»åã«ã«ãã®Go/Ruby/TypeScriptããã©ã¼ãã³ã¹æ¹åäºä¾</a></li>
<li><a href="#社å
ã®BQãã¹ãåºç¤ãä½ã£ãäºä¾">社å
ã®BQãã¹ãåºç¤ãä½ã£ãäºä¾</a></li>
<li><a href="#åç»ãããã¹ãåãã¦LLMã§è¦ç´ãªãªã¼ã¹ããäºä¾">åç»ãããã¹ãåãã¦LLMã§è¦ç´ããªãªã¼ã¹ããäºä¾</a></li>
<li><a href="#å»çç»åã解æããMLã¢ãã«ãæ§ç¯ããäºä¾">å»çç»åã解æããMLã¢ãã«ãæ§ç¯ããäºä¾</a></li>
</ul>
</li>
<li><a href="#ã¨ã ã¹ãªã¼æ ªå¼ä¼ç¤¾ã«ã¤ãã¦">ã¨ã ã¹ãªã¼æ ªå¼ä¼ç¤¾ã«ã¤ãã¦</a><ul>
<li><a href="#ã¨ã ã¹ãªã¼ãåµãäºæ¥ã¨ãããã¯ã">ã¨ã ã¹ãªã¼ãåµãäºæ¥ã¨ãããã¯ã</a></li>
<li><a href="#äºæ¥ãæ¯ããã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ã">äºæ¥ãæ¯ããã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ã</a></li>
<li><a href="#ã¨ã³ã¸ãã¢ã®ã®ã¼ã¯ã«ã«ãã£ã¼">ã¨ã³ã¸ãã¢ã®ã®ã¼ã¯ã«ã«ãã£ã¼</a></li>
</ul>
</li>
<li><a href="#æ´»èºããã¨ã ã¹ãªã¼æ°åã¨ã³ã¸ãã¢">æ´»èºããã¨ã ã¹ãªã¼æ°åã¨ã³ã¸ãã¢</a></li>
<li><a href="#ãããã«">ãããã«</a><ul>
<li><a href="#We-are-hiring-">We are hiring !!</a></li>
</ul>
</li>
</ul>
<p> ã</p>
<h1 id="ã¨ã ã¹ãªã¼ã®ã¨ã³ã¸ãã¢ã¤ã³ã¿ã¼ã³">ã¨ã ã¹ãªã¼ã®ã¨ã³ã¸ãã¢ã¤ã³ã¿ã¼ã³</h1>
<p>ã¨ã ã¹ãªã¼ã§ã¯ãåºæ¬çã«<strong>ã¨ã³ã¸ãã¢ã¤ã³ã¿ã¼ã³ãéå¹´ã§åé</strong>ãã¦ãã¾ãã
<strong>å¦æ¥åªå
</strong>ã®ææ³ããã£ã¦å®æ½ãã¦ãã¾ãã®ã§ãææãæ¥ç¨ã調æ´å¯è½ã§ãã</p>
<ul>
<li>éå§ææï¼å¦æ¥ã®é½åã«åããã¦èª¿æ´å¯è½</li>
<li>å®æ½æéï¼2é±éï½</li>
<li>å°±æ¥æ¹æ³ï¼ãªã¢ã¼ãå¯</li>
<li>æ給ï¼2,500åï¼äº¤éè²»å«ï¼â» 2é±é 8HÃ10å¶æ¥æ¥å°±æ¥ããå ´å 200,000å</li>
<li>æ¥åå
容ï¼ã¡ã³ã¿ã¼ã¨ç¸è«ãå¿åã«æ²¿ã£ã¦è¨è¨ãã¾ã</li>
</ul>
<p>ã¤ã³ã¿ã¼ã³ã®<strong>å
容ããã«ã«ã¹ã¿ã </strong>ã§å®æ½ãã¦ãã¾ãã
以ä¸ãããåè·ç¨®ã®è©³ç´°ãè¦ããã¾ãã®ã§åèã«ãã¦ãã ããã</p>
<ul>
<li><a href="https://open.talentio.com/r/1/c/m3/pages/80781">ã½ããã¦ã§ã¢ã¨ã³ã¸ãã¢</a></li>
<li><a href="https://open.talentio.com/r/1/c/m3/pages/80782">ã¢ããªã¨ã³ã¸ãã¢</a></li>
<li><a href="https://open.talentio.com/r/1/c/m3/pages/78949">æ©æ¢°å¦ç¿ã¨ã³ã¸ãã¢</a></li>
<li><a href="https://open.talentio.com/r/1/c/m3/pages/78950">MLOpsã¨ã³ã¸ãã¢</a></li>
<li><a href="https://open.talentio.com/r/1/c/m3/pages/80780">ã»ãã¥ãªãã£ã¨ã³ã¸ãã¢</a></li>
</ul>
<p>ç´è¿ã®ã¤ã³ã¿ã¼ã³ã®äºä¾ãç´¹ä»ãã¦ããã¾ãã</p>
<h4 id="RustGok8sãå
¨ã¦è§¦ã£ã¦Batchããªãªã¼ã¹ããäºä¾">Rust/Go/k8sãå
¨ã¦è§¦ã£ã¦Batchããªãªã¼ã¹ããäºä¾</h4>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.m3tech.blog%2Fentry%2F2024%2F09%2F02%2F174905" title="ã¤ã³ã¿ã¼ã³ã®äºé±éã§ç¤¾å
APIãæ°ãã建ã¦æ¬çªãªãªã¼ã¹ã¾ã§ä½ã§ããã£ã話ãã½ããã¦ã§ã¢ã¨ã³ã¸ãã¢ã¤ã³ã¿ã¼ã³åæ¦è¨ã - ã¨ã ã¹ãªã¼ããã¯ããã°" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe></p>
<h4 id="å®ãããã¯ãã®Kotlinããã¯ã¨ã³ããæ¹ä¿®ããäºä¾">å®ãããã¯ãã®Kotlinããã¯ã¨ã³ããæ¹ä¿®ããäºä¾</h4>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.m3tech.blog%2Fentry%2Fintern%2F2019%2F09%2F24" title="ã¤ã³ã¿ã¼ã³ã¨ãã¦æ°ãµã¼ãã¹ã®éçºã«æºãããã¦ããã ãã¾ãã - ã¨ã ã¹ãªã¼ããã¯ããã°" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe></p>
<h4 id="åæ£å¦çMLOpsã®OSSãéçºå
¬éããäºä¾">åæ£å¦çMLOpsã®OSSãéçºãå
¬éããäºä¾</h4>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.m3tech.blog%2Fentry%2F2023%2F03%2F14%2F180137" title="gokartã®MLãã¤ãã©ã¤ã³ãKubernetesã§ä¸¦ååæ£å®è¡ã§ããã©ã¤ãã©ãªkannonãä½ã£ã話 - ã¨ã ã¹ãªã¼ããã¯ããã°" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe></p>
<h4 id="é»åã«ã«ãã®GoRubyTypeScriptããã©ã¼ãã³ã¹æ¹åäºä¾">é»åã«ã«ãã®Go/Ruby/TypeScriptããã©ã¼ãã³ã¹æ¹åäºä¾</h4>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.m3tech.blog%2Fentry%2F2025%2F02%2F18%2F110000" title="ãã½ããã¦ã§ã¢ã¨ã³ã¸ãã¢ã¤ã³ã¿ã¼ã³åæ¦è¨ãã¯ã©ã¦ãåé»åã«ã«ãã®ãªã¯ã¨ã¹ãæ°ã13%åæ¸ãã話 - ã¨ã ã¹ãªã¼ããã¯ããã°" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe></p>
<h4 id="社å
ã®BQãã¹ãåºç¤ãä½ã£ãäºä¾">社å
ã®BQãã¹ãåºç¤ãä½ã£ãäºä¾</h4>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.m3tech.blog%2Fentry%2Fintern-bigquery-local-test" title="AIã»æ©æ¢°å¦ç¿ãã¼ã ã§ã®ã¤ã³ã¿ã¼ã³ã§BigQueryã®ãã¼ã«ã«ãã¹ãåºç¤ãä½ã£ã話 - ã¨ã ã¹ãªã¼ããã¯ããã°" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe></p>
<h4 id="åç»ãããã¹ãåãã¦LLMã§è¦ç´ãªãªã¼ã¹ããäºä¾">åç»ãããã¹ãåãã¦LLMã§è¦ç´ããªãªã¼ã¹ããäºä¾</h4>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.m3tech.blog%2Fentry%2F2024%2F12%2F19%2F170000" title="ã¤ã³ã¿ã¼ã³ã§ã¯ããã¦ã®ãããã¯ãéçºãçµé¨ãã話ãã½ããã¦ã§ã¢ã¨ã³ã¸ãã¢ã¤ã³ã¿ã¼ã³åæ¦è¨ã - ã¨ã ã¹ãªã¼ããã¯ããã°" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe></p>
<h4 id="å»çç»åã解æããMLã¢ãã«ãæ§ç¯ããäºä¾">å»çç»åã解æããMLã¢ãã«ãæ§ç¯ããäºä¾</h4>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.m3tech.blog%2Fentry%2F2019%2F09%2F02%2F153000" title="CycleGANã§å¹æãçºæ®ï¼ç»åã®æ§é ãæ½åºããç¹å¾´é"MIND"ãå®è£
ãã¦ã¿ã - ã¨ã ã¹ãªã¼ããã¯ããã°" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe></p>
<p> ã</p>
<h1 id="ã¨ã ã¹ãªã¼æ ªå¼ä¼ç¤¾ã«ã¤ãã¦">ã¨ã ã¹ãªã¼æ ªå¼ä¼ç¤¾ã«ã¤ãã¦</h1>
<p>ã¨ã ã¹ãªã¼ã¯ãå»çITäºæ¥ã主軸ã¨ããä¼ç¤¾ã§ãã
å¦çåãã®ã¤ãã³ãçã§ã¯ãã¨ã ã¹ãªã¼ã¨ããä¼ç¤¾ãã·ã³ãã«ãªä»¥ä¸2ç¹ã§èª¬æãã¦ãã¾ãã</p>
<ul>
<li><strong>大ããªä¼ç¤¾ã§ããå°æ°ç²¾éã§ã</strong></li>
<li><strong>ã®ã¼ã¯ãªã«ã«ãã£ã¼ã大åã«ãã¦ãã¾ã</strong></li>
</ul>
<h2 id="ã¨ã ã¹ãªã¼ãåµãäºæ¥ã¨ãããã¯ã">ã¨ã ã¹ãªã¼ãåµãäºæ¥ã¨ãããã¯ã</h2>
<p>2000å¹´åµæ¥ã®æ±è¨¼ãã©ã¤ã ä¸å ´ä¼æ¥ãå½å
å¤ã«140社以ä¸ã®ã°ã«ã¼ãä¼ç¤¾ãããé常ã«å¤§ããªä¼ç¤¾ã§ãã
ãã¸ãã¹è·ç¨®ã¯å¦çããã®äººæ°ãé«ããã³ã³ãµã«ãGAFAã«ä¸¦ãã§å°±æ´»ã®äººæ°ä¼æ¥ã©ã³ãã³ã°ä¸ä½ã«å
¥ã£ã¦ãã¾ã<a href="#f-ecffa5d5" id="fn-ecffa5d5" name="fn-ecffa5d5" title="ï½¢å
¥ç¤¾ãé£ããæåä¼æ¥ã©ã³ãã³ã°ï½£ããã200社 æ±æ´çµæ¸ãªã³ã©ã¤ã³ ãã">*1</a>ã</p>
<div align="center"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241227/20241227155701.jpg" width="800" height="450" loading="lazy" title="" class="hatena-fotolife" style="width:400px" itemprop="image"></span></div>
<p>30以ä¸ã®Webãããã¯ããéçºã100以ä¸ã®å»çäºæ¥ãå±éãã¦ãã¾ãã
ãã®ä¸ã§ã¨ã³ã¸ãã¢ã¯ãå½å
ã®9å²ä»¥ä¸ã®å»å¸«ãä¼å¡ã¨ãªããã©ãããã©ã¼ã ãm3.comããæ¥æ¬å°å
¥æ°No. 1ã®é»åã«ã«ãããã¸ã«ã«ããç
é¢ã®å¾
ã¡æéã0ã«ããå»çDXã¢ããªããã¸ã¹ãããä¼å¡æ°500ä¸äººè¶
ã®å»å¸«Q&Aãµã¼ãã¹ãAskDoctorsããªã©ãã¨ã³ã¸ãã¢ãªã³ã°ãä¸å¿ã¨ãªãtoB/toCãããã¯ããå¤ãæä¾ãã¦ãã¾ãã</p>
<h2 id="äºæ¥ãæ¯ããã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ã">äºæ¥ãæ¯ããã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ã</h2>
<p>ã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ãã«ã¯ãç¾å¨110åç¨ã®ã¨ã³ã¸ãã¢ãå¨ç±ãã¦ãã¾ã<a href="#f-e24b549d" id="fn-e24b549d" name="fn-e24b549d" title="2024/12/23æç¹">*2</a>ã</p>
<p>äºæ¥è¦æ¨¡ã«å¯¾ãã¦ã¨ã³ã¸ãã¢ã®äººæ°ãå¤ããªããããç¥ã£ã¦ããå
輩ãå
¥ç¤¾ãã¦ãã¦â¦ãã¨ãããã¿ã¼ã³ãå°ãªããå¦çããã®èªç¥åº¦ã¯ããé«ãã¯ãªãèªèã§ãã
ä¸æ¹ãæè¡é¢é£ã®å®ç¸¾ã¯æ¯å¹´åºãã¦ãããæè¡ã³ãã¥ããã£å
ã§ã¯å¹³åçã«æè¡åãé«ãäºãä¸å®ç¥ããã¦ããããªã¨ã¯æãã¾ãã</p>
<div align="center"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241227/20241227155705.jpg" width="800" height="450" loading="lazy" title="" class="hatena-fotolife" style="width:400px" itemprop="image"></span></div>
<p>ããã¸ã¡ã³ããã¼ã ãå«ãã¦20ã®ãã¼ã ãããã1ãã¼ã 5~10åã§æ§æãã¦ãã¾ãã
å°ãããã¼ã ã§å¤§ããªææãåºãããããã©ããã«ãããã¯ãã®æ§æ³ãè¨è¨ã«ãé¢ãããªããé«éãªææ決å®ãåãã¦ãã¾ãã</p>
<p>å®éã«CEOã¨ã®éçºå®ä¾ãæã¤éçºãã¼ã ãããã»ã©ã«ãå¤ãã®ã®ã¼ã¯ãèªãææ決å®ããææ¡ããæãåããã¦æ´»èºããããã®å¶åº¦ãä»çµã¿ãæã¤ä¼ç¤¾ã§ãã
人æ°ã«æ¯ä¾ãã¦åæ¥çãå°ãªããªãããã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ãããITæ¥çã«CEO/CTO/VPoEã10å以ä¸æåºãã¦ããããGAFAãåã¡ã¬ãã³ãã£ã¼ããåæ¥çã®æ´»èºã®å£°ãèããã¦ãã¦ããã<strong>ã®ã¼ã¯ã®ç»ç«é</strong>ã®ãããªã«ã«ãã£ã¼ã§ãããã¾ãã</p>
<h2 id="ã¨ã³ã¸ãã¢ã®ã®ã¼ã¯ã«ã«ãã£ã¼">ã¨ã³ã¸ãã¢ã®ã®ã¼ã¯ã«ã«ãã£ã¼</h2>
<p>ã¨ã ã¹ãªã¼ã§ã¯ãäºæ¥ã§å¤§ããªææãåºãããããã ããã¨ãªã¹ãã¯ããæã£ã¦æ´»åããã®ã¼ã¯ã«ã«ãã£ã¼ã大åã«ãã¦ãã¾ãã</p>
<p>代表çãªä¾ããæè¡é¸å®ã§ãã
åãã¼ã ã«ä»»ãã¦ãããããè¨èªããã¬ã¼ã ã¯ã¼ã¯ã¯é£ã®ãã¼ã ã«è¡ãã°å¥ã®ãã®ã«ãã¤ã§ããã£ã¬ã³ã¸åºæ¥ãç°å¢ã«ãªã£ã¦ãã¾ãã
ææ決å®ã«ãé¢ä¸ãããæ°æ§ã®æè¡ã«è§¦ãã¦å¦ã¶ã®ã好ããªãã®ã¼ã¯åãã®æåã§ãã</p>
<div align="center"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241227/20241227155708.jpg" width="800" height="450" loading="lazy" title="" class="hatena-fotolife" style="width:400px" itemprop="image"></span></div>
<p>æè¡å¥½ããéã¾ã£ã¦ãããããéé±ã§è¡ã£ã¦ããLT大ä¼ã¯10年以ä¸ã200åãè¶
ãã¦ç¶ãã¦ãã¾ããä»ã§ãæ¯åã¨ã³ã¸ãã¢60~70人ãZoomãSlackã«éã¾ããæ¯åæè¡ã®è©±ã§çãä¸ãã£ã¦ãã¾ããæ°åå
¥ç¤¾ããã¨ã³ã¸ãã¢ãã¤ã³ã¿ã¼ã³ã®å¦çãç»å£ãã¦ãããç§ãæ¯ååºæ¿ãåãã¦ãã¾ãã</p>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.m3tech.blog%2Fentry%2Ftechtalk-offline-2023" title="230åç¶ã社å
LT大ä¼ã®å¿å¹´ä¼ãçãä¸ãã£ã件ã«ã¤ã㦠- ã¨ã ã¹ãªã¼ããã¯ããã°" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe></p>
<p>ã¾ããå½ããã¯ããã°ã¯ãã¡ããã®ãã¨ãæè¡æ¸å
¸ãªã©ã§ãæ°åå
¥ç¤¾ã®ã¨ã³ã¸ãã¢ãå·çæ´»åããã¦ãã¾ããOSSã³ããã¿ã¼ãæ¸ç±å·ççµé¨ã®ããã¨ã³ã¸ãã¢ã¯è¤æ°å¨ç±ãã¦ãã¾ãã®ã§ããããã£ã人ã¨ä¸ç·ã«ã¯ã¤ã¯ã¤æ´»åã§ãã¾ãã</p>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Ftechbookfest.org%2Forganization%2F38290003" title="ã¨ã ã¹ãªã¼ã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ãå·çé¨ | æè¡æ¸å
¸" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe></p>
<p>大å¦ã®ç 究室ããµã¼ã¯ã«ãæè¡ã³ãã¥ããã£ã§ãæè¡ãã¼ã¯ãã¯ã¤ã¯ã¤ããã®ã好ãã§ããã®ç¥èãã«ã«ãã£ã¼ãä¸ã®ä¸ã«æ´»ããã¦ããããå¦çã¨ã³ã¸ãã¢ã®çæ§ã¯æ¯éè¦ã¦ããããã¨è¯ãããªã¨æãã¾ãã</p>
<p> ã</p>
<h1 id="æ´»èºããã¨ã ã¹ãªã¼æ°åã¨ã³ã¸ãã¢">æ´»èºããã¨ã ã¹ãªã¼æ°åã¨ã³ã¸ãã¢</h1>
<p>å®éã«ãæ°åã§å
¥ç¤¾å¾æ´»èºãã¦ããã¨ã³ã¸ãã¢ã®æ
å ±ãããã¾ãã</p>
<p>å
ã«ç´¹ä»ããæè¡LTã®ãã¡ãå¤é¨ã«å
¬éã§ãããã®ã¯YouTubeä¸ã«å
¬éãã¦ãã¾ãã
ãã®ä¸ã§æ°åå
¥ç¤¾ããã¨ã³ã¸ãã¢ãçºè¡¨ãã¦ããåç»ã以ä¸ã«ã¾ã¨ãã¦ãã¾ãã</p>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fyoutube.com%2Fplaylist%3Flist%3DPLaOiAFIVRZ5w-wW2d0G1Xh-jMusJEsVgU%26si%3D5EMM8pxRyANPvU5I" title="æ°åã¨ã³ã¸ãã¢åç»é" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe></p>
<p>æ°åæ¡ç¨ãµã¤ãã§ã¯ãæ°åããå
¥ç¤¾ãã¦æ´»èºãã¦ãã人ã®ã¤ã³ã¿ãã¥ã¼ãæ²è¼ããã¦ãã¾ãã</p>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Ffresh.m3recruit.com" title="ã¨ã ã¹ãªã¼æ ªå¼ä¼ç¤¾ æ°åæ¡ç¨" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe></p>
<p>ã¤ã³ã¿ã¼ã³ä»¥å¤ã®å¦çåãã®ã¤ãã³ãã§ã¯ããµãã¼ã¿ã¼ãºãããé²ããæè²ããã¸ã§ã¯ããå¤è³å°±æ´»ãªã©ã®ã¤ãã³ããæªè¸ããã¸ã§ã¯ããåæè¡ã«ã³ãã¡ã¬ã³ã¹ã§ãæ°åã¨ã³ã¸ãã¢ãå¤ãåå ãã¦ãã¾ãã®ã§ãæ¯éä¼ã£ãéã¯ç¾å ´ã®å£°ãèãã¦ããããã¨è¯ãã¨æãã¾ãã</p>
<p> ã</p>
<h1 id="ãããã«">ãããã«</h1>
<p>æ¬è¨äºã§ã¯ãã¨ã ã¹ãªã¼ã®å¦çã¨ã³ã¸ãã¢åãã®æ
å ±ãã¾ã¨ãã¾ããã</p>
<p>ãã詳ããç¥ãããæ¹ã¯ã200ãã¼ã¸ãè¶
ãã<a href="https://speakerdeck.com/m3_engineering/introduction-of-m3-all-teams">å
¨ãã¼ã ç´¹ä»è³æ</a>ã<a href="https://speakerdeck.com/m3_engineering/geek-of-geeks">ã¨ã³ã¸ãã¢ã®ã«ã«ãã£ã¼ãã¾ã¨ããçæAIã«ããè³æ</a>ãããã¾ãã®ã§æ¯éã©ããã</p>
<p>ã¾ããXã¢ã«ã¦ã³ãã§ã¯æ¯é±é£èªã¯ã¤ãºãªã©ãé
ä¿¡ãã¦ãã¾ãã
ã¤ã³ã¿ã¼ã³æ
å ±ã®ã¢ãããã¼ããªã©ãå®æçã«æ稿ãã¦ãã¾ãã®ã§ãæ¯éãã©ãã¼ãã¦ãã ããã</p>
<p><blockquote data-conversation="none" class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/m3_morning?src=hash&ref_src=twsrc%5Etfw">#m3_morning</a> éææä¾ï¼é£èªã¯ã¤ãºï¼<br>ææ¥ãã <a href="https://twitter.com/hashtag/%E6%8A%80%E8%82%B2%E7%A5%AD?src=hash&ref_src=twsrc%5Etfw">#æè²ç¥</a> ãå§ã¾ãã¨ããäºã§ãgeekãª2æ¥éãããã¼ãã«æè²ã¤ãã³ãã§ãã使ãããJSã§åé¡ãä½ãã¾ããã<br><br>geekãªã¹ã¯ãªããã¯ä½ãåºåããã®ãï¼ï¼<br>çããããã£ããæ¯éå¼ç¨ãªãã©ã¤ã§ï¼ ï¼<br>> [_='geek'.small()[2]]+[-~_._|2]; <a href="https://t.co/0kuLoeRDoF">pic.twitter.com/0kuLoeRDoF</a></p>— ã¨ã ã¹ãªã¼ ã¨ã³ã¸ãã¢å
¬å¼ (@m3_engineering) <a href="https://twitter.com/m3_engineering/status/1836940234669662703?ref_src=twsrc%5Etfw">2024å¹´9æ20æ¥</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> </p>
<p> ã</p>
<h2 id="We-are-hiring-">We are hiring !!</h2>
<p>ã¤ã³ã¿ã¼ã³ä»¥å¤ã«ãéå¹´ã§æ°åã¨ã³ã¸ãã¢ãåéãã¦ãã¾ãã
ãã¡ãã£ã¨è©±ãèãã¦ã¿ãããããã¨ãã£ãæ¹ã¯æ¯éãé£çµ¡ä¸ããã</p>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjobs.m3.com%2Fengineer%2F" title="ã¨ã³ã¸ãã¢æ¡ç¨ãµã¤ãï½æ¡ç¨æ
å ± | å»çÃãã¯ããã¸ã¼ã®å¯è½æ§ã¯ç¡é大" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jobs.m3.com/engineer/">jobs.m3.com</a></cite></p>
<div class="footnote">
<p class="footnote"><a href="#fn-ecffa5d5" id="f-ecffa5d5" name="f-ecffa5d5" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text"><a href="https://toyokeizai.net/articles/-/844492?page=5">ï½¢å
¥ç¤¾ãé£ããæåä¼æ¥ã©ã³ãã³ã°ï½£ããã200社 æ±æ´çµæ¸ãªã³ã©ã¤ã³</a> ãã</span></p>
<p class="footnote"><a href="#fn-e24b549d" id="f-e24b549d" name="f-e24b549d" class="footnote-number">*2</a><span class="footnote-delimiter">:</span><span class="footnote-text">2024/12/23æç¹</span></p>
</div>
vaaaaaanquish
2024å¹´ã«ã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ããã¼ãã£ã³ã°ã§ç´¹ä»ããæ¸ç±ã®ç´¹ä»
hatenablog://entry/6802418398313806755
2024-12-26T12:00:00+09:00
2024-12-26T12:00:00+09:00 å¹´æ«ã«ããã«ã¡ã¯ãããã°ãã¯ã12æã«é·å¥³ã®é³æ¥½çºè¡¨ä¼ããããé·å¥³ã®æé·ã«æ¶ããVPoEã®æ²³å(@vaaaaanquish)ã§ãã æ¬æã¨ã¯é¢ä¿ãªãå¨ã¨ç§ æ¬è¨äºã§ã¯ãã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ãã§æ¯æè¡ã£ã¦ããå
¨ä½ä¼ãGroup Meetingã§å®æ½ãã¦ããããã¾ãã³ã³ãã³ãããç´¹ä»ãã¾ãã ãªã¹ã¹ã¡ã®æ¸ç±ç´¹ä»ã«ãªãã¾ãã®ã§ãå¹´æ«ã®ãä¾ã«æ¯éã Engineering Group Meetingã¨ã¯ æ¸ç±ç´¹ä» ä»äºã«å¿
è¦ãªãã¨ã¯ãã¹ã¦æ ç»ã§å¦ã¹ã çéè« - 人ã¯ãã¤ã¾ã§ãå¦ã³ãæé·ã§ãã RANGE(ã¬ã³ã¸)ç¥èã®ãå¹
ããæå¼·ã®æ¦å¨ã«ãªã ãã¼ã¿ã»ãã¥ãªãã£æ³ã®è¿·èµ° ãã¯ããã¸ã¼ã®ä¸ççµæ¸å² â¦
<p>å¹´æ«ã«ããã«ã¡ã¯ãããã°ãã¯ã12æã«é·å¥³ã®é³æ¥½çºè¡¨ä¼ããããé·å¥³ã®æé·ã«æ¶ããVPoEã®æ²³å(<a href="https://x.com/vaaaaanquish">@vaaaaanquish</a>)ã§ãã</p>
<p><figure class="figure-image figure-image-fotolife" title="æ¬æã¨ã¯é¢ä¿ãªãå¨ã¨ç§"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241226/20241226120006.jpg" width="800" height="533" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>æ¬æã¨ã¯é¢ä¿ãªãå¨ã¨ç§</figcaption></figure></p>
<p>æ¬è¨äºã§ã¯ãã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ãã§æ¯æè¡ã£ã¦ããå
¨ä½ä¼ãGroup Meetingã§å®æ½ãã¦ããããã¾ãã³ã³ãã³ãããç´¹ä»ãã¾ãã</p>
<p>ãªã¹ã¹ã¡ã®æ¸ç±ç´¹ä»ã«ãªãã¾ãã®ã§ãå¹´æ«ã®ãä¾ã«æ¯éã</p>
<ul class="table-of-contents">
<li><a href="#Engineering-Group-Meetingã¨ã¯">Engineering Group Meetingã¨ã¯</a></li>
<li><a href="#æ¸ç±ç´¹ä»">æ¸ç±ç´¹ä»</a><ul>
<li><a href="#ä»äºã«å¿
è¦ãªãã¨ã¯ãã¹ã¦æ ç»ã§å¦ã¹ã">ä»äºã«å¿
è¦ãªãã¨ã¯ãã¹ã¦æ ç»ã§å¦ã¹ã</a></li>
<li><a href="#çéè«---人ã¯ãã¤ã¾ã§ãå¦ã³æé·ã§ãã">çéè« - 人ã¯ãã¤ã¾ã§ãå¦ã³ãæé·ã§ãã</a></li>
<li><a href="#RANGEã¬ã³ã¸ç¥èã®å¹
ãæå¼·ã®æ¦å¨ã«ãªã">RANGE(ã¬ã³ã¸)ç¥èã®ãå¹
ããæå¼·ã®æ¦å¨ã«ãªã</a></li>
<li><a href="#ãã¼ã¿ã»ãã¥ãªãã£æ³ã®è¿·èµ°">ãã¼ã¿ã»ãã¥ãªãã£æ³ã®è¿·èµ°</a></li>
<li><a href="#ãã¯ããã¸ã¼ã®ä¸ççµæ¸å²-ãã«ã²ã¤ãã®ãã©ããã¯ã¹">ãã¯ããã¸ã¼ã®ä¸ççµæ¸å² ãã«ã»ã²ã¤ãã®ãã©ããã¯ã¹</a></li>
<li><a href="#ãã¸ã¥ã¢ã«ã·ã³ã«ã¼ã®è³-çµµã§èãã人ã
ã®ä¸ç">ãã¸ã¥ã¢ã«ã»ã·ã³ã«ã¼ã®è³: ãçµµãã§èãã人ã
ã®ä¸ç</a></li>
<li><a href="#ãã¯ããã¸ã¹ãã®æ¡ä»¶">ãã¯ããã¸ã¹ãã®æ¡ä»¶</a></li>
<li><a href="#ãã¬ãã£ãã±ã¤ãããªãã£-çãã®åºãªãäºæ
ã«èããå">ãã¬ãã£ãã»ã±ã¤ãããªã㣠çãã®åºãªãäºæ
ã«èããå</a></li>
<li><a href="#å®åãéã®ãã¡-è½å主義ã¯æ£ç¾©ã">å®åãéã®ãã¡ è½å主義ã¯æ£ç¾©ãï¼</a></li>
<li><a href="#1å
ãã«ã³ã¼ã">1å
ãã«ã³ã¼ã</a></li>
</ul>
</li>
<li><a href="#ãããã«">ãããã«</a><ul>
<li><a href="#We-are-hiring-">We are hiring !!</a><ul>
<li><a href="#ã¨ã³ã¸ãã¢æ¡ç¨ãã¼ã¸ã¯ãã¡ã">ã¨ã³ã¸ãã¢æ¡ç¨ãã¼ã¸ã¯ãã¡ã</a></li>
<li><a href="#ã«ã¸ã¥ã¢ã«é¢è«ããæ°è»½ã«ã©ãã">ã«ã¸ã¥ã¢ã«é¢è«ããæ°è»½ã«ã©ãã</a></li>
<li><a href="#ã¤ã³ã¿ã¼ã³ã常æåéãã¦ãã¾ã">ã¤ã³ã¿ã¼ã³ã常æåéãã¦ãã¾ã</a></li>
</ul>
</li>
</ul>
</li>
</ul>
<p> ã</p>
<h1 id="Engineering-Group-Meetingã¨ã¯">Engineering Group Meetingã¨ã¯</h1>
<p>ã¨ã ã¹ãªã¼ã§ã¯ãæä¸åå
¨ã¨ã³ã¸ãã¢ãéã¾ãGroup Meetingãéå¬ãã¦ãã¾ãã
Group Meetingã®æ¬ç·¨ã§ã¯ãåãã¼ã ã§è¡ã£ã¦ããæ½çãæè¡ã®å
±æãè¡ã£ã¦ãã¾ãã
ã¾ããæ°ããã¡ã³ãã¼ã®èªå·±ç´¹ä»ãªã©ãéè¦ãªæ
å ±ã®å
¨ä½å¨ç¥ãè¡ã£ã¦ãããã¨ã ã¹ãªã¼ã®ã«ã«ãã£ã¼ãæ¯ãã大äºãªä¼ã«ãªã£ã¦ãã¾ãã</p>
<p>Group Meetingã«ã¯ã5åã»ã©ã®ããã¾ãã³ã¼ãã¼ããããã¾ãã¦ãæ´ä»£VPoEãæ
å½ãã¦ã¦ãã¼ã¯ãªã³ã³ãã³ããç´¹ä»ãã¦ãã¾ãã
éå»ã«ã¯ãæ´ä»£VPoEã®å±±å´ããããã¯ãããã¸ã¡ã³ããç´¹ä»ãããã岩ä½ãã¨ã³ã¸ãã¢ãªã³ã°è¦ç´ ã®ããã²ã¼ã ãç´¹ä»ããããã¦ãã¾ããã
åæ§ã®ããçºè¡¨ãå¤ã人æ°ã³ã³ãã³ãã§ãã</p>
<p>ç§ã¯ãè¯æ¸ãæ°ã«ãªã£ãã¤ã³ã¿ã¼ãããã³ã³ãã³ããç´¹ä»ããããã¦ã¾ãã
<figure class="figure-image figure-image-fotolife" title="ãã¾ãã®ã¤ã³ã¿ã¼ãããã³ã³ãã³ãç´¹ä»äºä¾ - ãã¤ã¢ã¹è°è«ã§ä½¿ããã赤ç¹æ¦éæ©ã®å³ã¯å®ã¯å
è«æã«ã¯åå¨ããªãäºæ¬¡åµä½ã§ããã沢山ããã¨ããå°ãã¿"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241226/20241226120010.jpg" width="800" height="450" loading="lazy" title="" class="hatena-fotolife" style="width:400px" itemprop="image"></span><figcaption>ãã¾ãã®ã¤ã³ã¿ã¼ãããã³ã³ãã³ãç´¹ä»äºä¾ - ãã¤ã¢ã¹è°è«ã§ä½¿ããã赤ç¹æ¦éæ©ã®å³ã¯å®ã¯å
è«æã«ã¯åå¨ããªãäºæ¬¡åµä½ã§ããã沢山ããã¨ããå°ãã¿</figcaption></figure>
ç´è¿ã§ã¯ãAIæè¡ã ã¨ã社ä¼çãªçµ±è¨ã®ã話ãå¤ãã£ãããã¾ãã
å人çã«ã¯æè¿é³å£°åæåéãç±ãã®ã§ãVRCå®è£
ãå«ãã¦æ¥½ããã§ãã話ã次åã¯ãããæã§ãã</p>
<p> ã</p>
<h1 id="æ¸ç±ç´¹ä»">æ¸ç±ç´¹ä»</h1>
<p>Group Meetingã§ã¯æ¸ç±ç´¹ä»ãä¼çµ±çã«ç¶ãã¦ãã¾ãã
æ¯åæ°åç´¹ä»ãã¦ããã®ã§ãããå
¨ã¦ã¯ç´¹ä»ããããªãéã§ãã
å½ç¶ãã¨ã³ã¸ãã¢ãªã³ã°ã«é¢ããåèã<a href="https://www.amazon.co.jp/%E9%81%94%E4%BA%BA%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC-%E7%AC%AC2%E7%89%88-%E7%86%9F%E9%81%94%E3%81%AB%E5%90%91%E3%81%91%E3%81%9F%E3%81%82%E3%81%AA%E3%81%9F%E3%81%AE%E6%97%85-David-Thomas/dp/4274226298">é人ããã°ã©ãã¼</a>ã<a href="https://www.amazon.co.jp/%E9%97%98%E3%81%86%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC-%E6%96%B0%E8%A3%85%E7%89%88-G%E3%83%BB%E3%83%91%E3%82%B9%E3%82%AB%E3%83%AB%E3%83%BB%E3%82%B6%E3%82%AB%E3%83%AA%E3%83%BC/dp/4822247570">éãããã°ã©ãã¼</a>ã<a href="https://www.amazon.co.jp/%E8%84%B3%E3%81%AB%E5%8F%8E%E3%81%BE%E3%82%8B%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E6%9B%B8%E3%81%8D%E6%96%B9-%E2%80%95%E8%A4%87%E9%9B%91%E3%81%95%E3%82%92%E9%81%BF%E3%81%91%E6%8C%81%E7%B6%9A%E5%8F%AF%E8%83%BD%E3%81%AB%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E7%B5%8C%E9%A8%93%E5%89%87%E3%81%A8%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-Mark-Seemann/dp/4814400799">è³ã«åã¾ãã³ã¼ãã®æ¸ãæ¹</a>ã<a href="https://www.amazon.co.jp/Team-Geek-%E2%80%95Google%E3%81%AE%E3%82%AE%E3%83%BC%E3%82%AF%E3%81%9F%E3%81%A1%E3%81%AF%E3%81%84%E3%81%8B%E3%81%AB%E3%81%97%E3%81%A6%E3%83%81%E3%83%BC%E3%83%A0%E3%82%92%E4%BD%9C%E3%82%8B%E3%81%AE%E3%81%8B-Brian-Fitzpatrick/dp/4873116309">Team Geek</a>ãªã©ãç´¹ä»ãã¦ãã¾ãã</p>
<p>æ¬è¨äºã§ã¯ãGroup Meetingãã¾ãã³ã¼ãã¼ã§ç´¹ä»ããæ¸ç±ããããªãã¹ãå¤ãã®ç¤¾ä¼äººã«ç´¹ä»ãããæ¬ããã¼ãã«èãããã¯ã¢ããããæ¸ç±10é¸ã¨ãããã¨ã§æ¸ãã¦ãããã¨æãã¾ãã</p>
<p> ã</p>
<h4 id="ä»äºã«å¿
è¦ãªãã¨ã¯ãã¹ã¦æ ç»ã§å¦ã¹ã">ä»äºã«å¿
è¦ãªãã¨ã¯ãã¹ã¦æ ç»ã§å¦ã¹ã</h4>
<p>ã¯ãªã¨ã¤ã¿ã¼ã¨ãã¦ã代ããããã¦ãã¼ã¯ãªåµä½ã®è½åãä»äºã¨ããå ´ã§æ大éæ´»ãããã¨ããæ¹æ³è«ãå¦ã¹ãæ¬ã§ãã2013å¹´ã®æ¸ç±ã§ãããæè¡ã¨äºæ¥ãè¤éã«çµ¡ã¾ãç¾ä»£ã«åºããä¸åã ã¨æãã¾ãã
<div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/dp/B00GAS3EKO?tag=hatena-22&linkCode=ogi&th=1&psc=1" class="hatena-asin-detail-image-link" target="_blank" rel="sponsored noopener"><img src="https://m.media-amazon.com/images/I/51TjDweScFL._SL500_.jpg" class="hatena-asin-detail-image" alt="ä»äºã«å¿
è¦ãªãã¨ã¯ãã¹ã¦æ ç»ã§å¦ã¹ã" title="ä»äºã«å¿
è¦ãªãã¨ã¯ãã¹ã¦æ ç»ã§å¦ã¹ã"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/dp/B00GAS3EKO?tag=hatena-22&linkCode=ogi&th=1&psc=1" target="_blank" rel="sponsored noopener">ä»äºã«å¿
è¦ãªãã¨ã¯ãã¹ã¦æ ç»ã§å¦ã¹ã</a></p><ul class="hatena-asin-detail-meta"><li><span class="hatena-asin-detail-label">ä½è
:</span><a href="https://d.hatena.ne.jp/keyword/%B2%A1%B0%E6%A1%A1%BC%E9" class="keyword">æ¼äºãå®</a></li><li>æ¥çµBP</li></ul><a href="https://www.amazon.co.jp/dp/B00GAS3EKO?tag=hatena-22&linkCode=ogi&th=1&psc=1" class="asin-detail-buy" target="_blank" rel="sponsored noopener">Amazon</a></div></div></p>
<p> ã</p>
<h4 id="çéè«---人ã¯ãã¤ã¾ã§ãå¦ã³æé·ã§ãã">çéè« - 人ã¯ãã¤ã¾ã§ãå¦ã³ãæé·ã§ãã</h4>
<p>çºæ«å¤§æ°ã®æ¸ç±ã§ããã¹ãã¼ãã«ããã¦ãçã®ãããã©ã³ãã¼ãã¸æé·ããéç¨ãèå¯ãã¦ãã¾ããã¨ã³ã¸ãã¢ã®ãã£ãªã¢ã«éã¥ãæãå¤ãã§ãããä½ããçªãè©°ããå
¨ã¦ã®æé·è«ã«éã¥ãè¯æ¸ã§ãã
<div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/dp/B0C6M66CH9?tag=hatena-22&linkCode=ogi&th=1&psc=1" class="hatena-asin-detail-image-link" target="_blank" rel="sponsored noopener"><img src="https://m.media-amazon.com/images/I/31JbjAjKKJL._SL500_.jpg" class="hatena-asin-detail-image" alt="çéè«â人ã¯ãã¤ã¾ã§ãå¦ã³ãæé·ã§ããâ" title="çéè«â人ã¯ãã¤ã¾ã§ãå¦ã³ãæé·ã§ããâ"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/dp/B0C6M66CH9?tag=hatena-22&linkCode=ogi&th=1&psc=1" target="_blank" rel="sponsored noopener">çéè«â人ã¯ãã¤ã¾ã§ãå¦ã³ãæé·ã§ããâ</a></p><ul class="hatena-asin-detail-meta"><li><span class="hatena-asin-detail-label">ä½è
:</span><a href="https://d.hatena.ne.jp/keyword/%B0%D9%CB%F6%C2%E7" class="keyword">çºæ«å¤§</a></li><li>æ°æ½®ç¤¾</li></ul><a href="https://www.amazon.co.jp/dp/B0C6M66CH9?tag=hatena-22&linkCode=ogi&th=1&psc=1" class="asin-detail-buy" target="_blank" rel="sponsored noopener">Amazon</a></div></div></p>
<p> ã</p>
<h4 id="RANGEã¬ã³ã¸ç¥èã®å¹
ãæå¼·ã®æ¦å¨ã«ãªã">RANGE(ã¬ã³ã¸)ç¥èã®ãå¹
ããæå¼·ã®æ¦å¨ã«ãªã</h4>
<p>æè¡ã®å¹
ãåºããã¹ãããä¸ç¹çªç ´ã§æ¥µããã¹ããããããã£ãè°è«ãæ·±ããä¸åã§ããæ¸ç±ã®çµè«ã¨ãã¦ã¯"å¹
"ã«ä¾ãéãã¦ããé¨åãããã¾ãããã¿ã¤ã¬ã¼ã»ã¦ããºã¨ãã§ãã©ã¼ã®å¯¾æ¯ãªã©ãåã¨ãã½ã¼ããé¢ç½ãã®ã§ãªã¹ã¹ã¡ã§ãã
<div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/dp/B0868DR365?tag=hatena-22&linkCode=ogi&th=1&psc=1" class="hatena-asin-detail-image-link" target="_blank" rel="sponsored noopener"><img src="https://m.media-amazon.com/images/I/41X3WChUZFL._SL500_.jpg" class="hatena-asin-detail-image" alt="RANGEï¼ã¬ã³ã¸ï¼ãç¥èã®ãå¹
ããæå¼·ã®æ¦å¨ã«ãªã" title="RANGEï¼ã¬ã³ã¸ï¼ãç¥èã®ãå¹
ããæå¼·ã®æ¦å¨ã«ãªã"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/dp/B0868DR365?tag=hatena-22&linkCode=ogi&th=1&psc=1" target="_blank" rel="sponsored noopener">RANGEï¼ã¬ã³ã¸ï¼ãç¥èã®ãå¹
ããæå¼·ã®æ¦å¨ã«ãªã</a></p><ul class="hatena-asin-detail-meta"><li><span class="hatena-asin-detail-label">ä½è
:</span><a href="https://d.hatena.ne.jp/keyword/%A5%C7%A5%A4%A5%D3%A5%C3%A5%C9%A1%A6%A5%A8%A5%D7%A5%B9%A5%BF%A5%A4%A5%F3" class="keyword">ãã¤ãããã»ã¨ãã¹ã¿ã¤ã³</a></li><li>æ¥çµBP</li></ul><a href="https://www.amazon.co.jp/dp/B0868DR365?tag=hatena-22&linkCode=ogi&th=1&psc=1" class="asin-detail-buy" target="_blank" rel="sponsored noopener">Amazon</a></div></div></p>
<p> ã</p>
<h4 id="ãã¼ã¿ã»ãã¥ãªãã£æ³ã®è¿·èµ°">ãã¼ã¿ã»ãã¥ãªãã£æ³ã®è¿·èµ°</h4>
<p>æ³å¾å®¶ããè¦ãæã®ã»ãã¥ãªãã£ã®ã話ãæ¸ãããæ¸ç±ã§ããæè¡çã«å
¨ã¦ãææ°ã¨ã¯ãããªãã®ã§ãããä¸æ¹ã§æè¡è¦ç¹ã ãã§ã¯è§£æ¶ã§ããªãã»ãã¥ãªãã£ã®èª²é¡ã詳ããæ¸ãã¦ããã¦ãã¾ããæè¡è
ã®èãæ¹ãåºããè¯ãæ¸ç±ã ã¨æãã¾ãã
<div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/dp/B0CQ23S2PZ?tag=hatena-22&linkCode=ogi&th=1&psc=1" class="hatena-asin-detail-image-link" target="_blank" rel="sponsored noopener"><img src="https://m.media-amazon.com/images/I/413vBvXBiIL._SL500_.jpg" class="hatena-asin-detail-image" alt="ãã¼ã¿ã»ãã¥ãªãã£æ³ã®è¿·èµ°" title="ãã¼ã¿ã»ãã¥ãªãã£æ³ã®è¿·èµ°"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/dp/B0CQ23S2PZ?tag=hatena-22&linkCode=ogi&th=1&psc=1" target="_blank" rel="sponsored noopener">ãã¼ã¿ã»ãã¥ãªãã£æ³ã®è¿·èµ°</a></p><ul class="hatena-asin-detail-meta"><li><span class="hatena-asin-detail-label">ä½è
:</span><a href="https://d.hatena.ne.jp/keyword/%A5%C0%A5%CB%A5%A8%A5%EB%A1%A6J%A1%A6%A5%BD%A5%ED%A5%D6" class="keyword">ããã¨ã«ã»Jã»ã½ãã</a>,<a href="https://d.hatena.ne.jp/keyword/%A5%A6%A5%C3%A5%C9%A5%ED%A5%A6%A1%A6%A5%CF%A1%BC%A5%C4%A5%A9%A5%B0" class="keyword">ã¦ãããã¦ã»ãã¼ãã©ã°</a>,<a href="https://d.hatena.ne.jp/keyword/%BE%AE%B8%FE%C2%C0%CF%BA" class="keyword">å°å太é</a></li><li>åèæ¸æ¿</li></ul><a href="https://www.amazon.co.jp/dp/B0CQ23S2PZ?tag=hatena-22&linkCode=ogi&th=1&psc=1" class="asin-detail-buy" target="_blank" rel="sponsored noopener">Amazon</a></div></div></p>
<p> ã</p>
<h4 id="ãã¯ããã¸ã¼ã®ä¸ççµæ¸å²-ãã«ã²ã¤ãã®ãã©ããã¯ã¹">ãã¯ããã¸ã¼ã®ä¸ççµæ¸å² ãã«ã»ã²ã¤ãã®ãã©ããã¯ã¹</h4>
<p>ãã¤ããã¼ã·ã§ã³ãããã¾ã§ã«ãªããã¼ã¹ã§æ¬¡ã
ã«åºç¾ãã¦ããã¨ããã®ã«â¥ã¢ã¡ãªã«äººã¯å°æ¥ã«ã¤ãã¦ã¾ãã¾ãæ²è¦³çã«ãªã£ã¦ãããã¨ããåºç« ããå§ã¾ãæ¬ã§ããã¾ãã«ç¾ä»£ã£ã¦æãã§ãããããã®ä¸ã§ã¨ã³ã¸ãã¢ã¨ãã¦ã©ãçããããæ¹ãã¦èããä¸åã«ãªãã¨æãã¾ãã
<div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/dp/B08JCGNK7J?tag=hatena-22&linkCode=ogi&th=1&psc=1" class="hatena-asin-detail-image-link" target="_blank" rel="sponsored noopener"><img src="https://m.media-amazon.com/images/I/41T4WtV5icL._SL500_.jpg" class="hatena-asin-detail-image" alt="ãã¯ããã¸ã¼ã®ä¸ççµæ¸å²ããã«ã»ã²ã¤ãã®ãã©ããã¯ã¹" title="ãã¯ããã¸ã¼ã®ä¸ççµæ¸å²ããã«ã»ã²ã¤ãã®ãã©ããã¯ã¹"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/dp/B08JCGNK7J?tag=hatena-22&linkCode=ogi&th=1&psc=1" target="_blank" rel="sponsored noopener">ãã¯ããã¸ã¼ã®ä¸ççµæ¸å²ããã«ã»ã²ã¤ãã®ãã©ããã¯ã¹</a></p><ul class="hatena-asin-detail-meta"><li><span class="hatena-asin-detail-label">ä½è
:</span><a href="https://d.hatena.ne.jp/keyword/%A5%AB%A1%BC%A5%EB%A1%A6B%A1%A6%A5%D5%A5%EC%A5%A4" class="keyword">ã«ã¼ã«ã»Bã»ãã¬ã¤</a></li><li>æ¥çµBP</li></ul><a href="https://www.amazon.co.jp/dp/B08JCGNK7J?tag=hatena-22&linkCode=ogi&th=1&psc=1" class="asin-detail-buy" target="_blank" rel="sponsored noopener">Amazon</a></div></div></p>
<p> ã</p>
<h4 id="ãã¸ã¥ã¢ã«ã·ã³ã«ã¼ã®è³-çµµã§èãã人ã
ã®ä¸ç">ãã¸ã¥ã¢ã«ã»ã·ã³ã«ã¼ã®è³: ãçµµãã§èãã人ã
ã®ä¸ç</h4>
<p>ä½äºãè«ççã«æ´çãã¦ãã¨ããã®ã社ä¼ã§ã¯æ±ããããããä¸ã®ä¸ã§ããããã¸ã¥ã¢ã«ã§æãã人ãå±
ããã¨ããæ¬ã§ãã社å
ã§ããããããæã«æè¦ã§èãããããã¨ãè«ç以å¤ã®æèæ³ã«å¯¾ãããªã¹ãã¯ã話ãçãä¸ããã¾ããã
<div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/dp/B0CCNY7ZSX?tag=hatena-22&linkCode=ogi&th=1&psc=1" class="hatena-asin-detail-image-link" target="_blank" rel="sponsored noopener"><img src="https://m.media-amazon.com/images/I/51+dV+ihSyL._SL500_.jpg" class="hatena-asin-detail-image" alt="ãã¸ã¥ã¢ã«ã»ã·ã³ã«ã¼ã®è³ããçµµãã§èãã人ã
ã®ä¸ç" title="ãã¸ã¥ã¢ã«ã»ã·ã³ã«ã¼ã®è³ããçµµãã§èãã人ã
ã®ä¸ç"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/dp/B0CCNY7ZSX?tag=hatena-22&linkCode=ogi&th=1&psc=1" target="_blank" rel="sponsored noopener">ãã¸ã¥ã¢ã«ã»ã·ã³ã«ã¼ã®è³ããçµµãã§èãã人ã
ã®ä¸ç</a></p><ul class="hatena-asin-detail-meta"><li><span class="hatena-asin-detail-label">ä½è
:</span><a href="https://d.hatena.ne.jp/keyword/%A5%C6%A5%F3%A5%D7%A5%EB%A1%A6%A5%B0%A5%E9%A5%F3%A5%C7%A5%A3%A5%F3" class="keyword">ãã³ãã«ã»ã°ã©ã³ãã£ã³</a></li><li>NHKåºç</li></ul><a href="https://www.amazon.co.jp/dp/B0CCNY7ZSX?tag=hatena-22&linkCode=ogi&th=1&psc=1" class="asin-detail-buy" target="_blank" rel="sponsored noopener">Amazon</a></div></div></p>
<p> ã</p>
<h4 id="ãã¯ããã¸ã¹ãã®æ¡ä»¶">ãã¯ããã¸ã¹ãã®æ¡ä»¶</h4>
<p>å¤ãæ¸ç±ã§ããããã©ãã«ã¼ã®åèã§ããæè¡ã¨ç¥èãä¼´ãèªãæãåããã¨ã³ã¸ãã¢ã¨ãã¦ã®å¨ãæ¹ã¨ãæªç¥ãªããã®ãä½ç³»åãã¤ããã¼ã·ã§ã³ãèµ·ããæ¹æ³ã«ã¤ãã¦èª¬ããã¦ãã¾ãã
<div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/dp/B0081M7XZ4?tag=hatena-22&linkCode=ogi&th=1&psc=1" class="hatena-asin-detail-image-link" target="_blank" rel="sponsored noopener"><img src="https://m.media-amazon.com/images/I/51WVtClaR5L._SL500_.jpg" class="hatena-asin-detail-image" alt="ãã¯ããã¸ã¹ãã®æ¡ä»¶ ã¯ããã¦èªããã©ãã«ã¼ (æè¡ç·¨)" title="ãã¯ããã¸ã¹ãã®æ¡ä»¶ ã¯ããã¦èªããã©ãã«ã¼ (æè¡ç·¨)"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/dp/B0081M7XZ4?tag=hatena-22&linkCode=ogi&th=1&psc=1" target="_blank" rel="sponsored noopener">ãã¯ããã¸ã¹ãã®æ¡ä»¶ ã¯ããã¦èªããã©ãã«ã¼ (æè¡ç·¨)</a></p><ul class="hatena-asin-detail-meta"><li><span class="hatena-asin-detail-label">ä½è
:</span><a href="https://d.hatena.ne.jp/keyword/%A3%D0%20%A3%C6%20%A5%C9%A5%E9%A5%C3%A5%AB%A1%BC" class="keyword">ï¼° F ãã©ãã«ã¼</a></li><li>ãã¤ã¤ã¢ã³ã社</li></ul><a href="https://www.amazon.co.jp/dp/B0081M7XZ4?tag=hatena-22&linkCode=ogi&th=1&psc=1" class="asin-detail-buy" target="_blank" rel="sponsored noopener">Amazon</a></div></div></p>
<p> ã</p>
<h4 id="ãã¬ãã£ãã±ã¤ãããªãã£-çãã®åºãªãäºæ
ã«èããå">ãã¬ãã£ãã»ã±ã¤ãããªã㣠çãã®åºãªãäºæ
ã«èããå</h4>
<p>ãçãã®åºãªãäºæ
ã«èããåãã¨ãããµãã¿ã¤ãã«ã®éããå³æçãªçããåºããã人ã®å¤ãç¾ä»£ã«å¿
è¦ãªä¸åã ã¨æãã¾ããåãã¦ãã¦ããã©ã¤ãã¼ãã§ãèµ·ããå¾ããããã¡ããç«ã¦ãã°ãã¡ããç«ããããªç¶æ³ãä¸æãæãããã¨ããã話ãæ¸ãã¦ããã¾ãã
<div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/dp/B0772WGXFS?tag=hatena-22&linkCode=ogi&th=1&psc=1" class="hatena-asin-detail-image-link" target="_blank" rel="sponsored noopener"><img src="https://m.media-amazon.com/images/I/51qt4nzHzEL._SL500_.jpg" class="hatena-asin-detail-image" alt="ãã¬ãã£ãã»ã±ã¤ãããªãã£ãçãã®åºãªãäºæ
ã«èããå (ææ¥é¸æ¸)" title="ãã¬ãã£ãã»ã±ã¤ãããªãã£ãçãã®åºãªãäºæ
ã«èããå (ææ¥é¸æ¸)"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/dp/B0772WGXFS?tag=hatena-22&linkCode=ogi&th=1&psc=1" target="_blank" rel="sponsored noopener">ãã¬ãã£ãã»ã±ã¤ãããªãã£ãçãã®åºãªãäºæ
ã«èããå (ææ¥é¸æ¸)</a></p><ul class="hatena-asin-detail-meta"><li><span class="hatena-asin-detail-label">ä½è
:</span><a href="https://d.hatena.ne.jp/keyword/%D6%E4%CC%DA%A1%A1%CB%A9%C0%B8" class="keyword">å¸æ¨ãè¬ç</a></li><li>ææ¥æ°èåºç</li></ul><a href="https://www.amazon.co.jp/dp/B0772WGXFS?tag=hatena-22&linkCode=ogi&th=1&psc=1" class="asin-detail-buy" target="_blank" rel="sponsored noopener">Amazon</a></div></div></p>
<p> ã</p>
<h4 id="å®åãéã®ãã¡-è½å主義ã¯æ£ç¾©ã">å®åãéã®ãã¡ è½å主義ã¯æ£ç¾©ãï¼</h4>
<p>社ä¼å¦å¯ãã®æ¸ç±ã§ãããç§éã®ãã®ã¥ããã®åæã¨ãªã£ã¦ãã社ä¼ã®å½¢ã«ã¤ãã¦èãããã大åãªä¸åã§ããç§éãæãã¦ãã¾ãªãæè¡ã使ãå
ã®äºãèããããã®ãã£ããã«ãªãã°ãªã¨æãã¾ãã
<div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/dp/B0CGTVP2TT?tag=hatena-22&linkCode=ogi&th=1&psc=1" class="hatena-asin-detail-image-link" target="_blank" rel="sponsored noopener"><img src="https://m.media-amazon.com/images/I/41FabmBcraL._SL500_.jpg" class="hatena-asin-detail-image" alt="å®åãéã®ãã¡ãè½å主義ã¯æ£ç¾©ãï¼ (ãã¤ã«ã¯æ庫NF)" title="å®åãéã®ãã¡ãè½å主義ã¯æ£ç¾©ãï¼ (ãã¤ã«ã¯æ庫NF)"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/dp/B0CGTVP2TT?tag=hatena-22&linkCode=ogi&th=1&psc=1" target="_blank" rel="sponsored noopener">å®åãéã®ãã¡ãè½å主義ã¯æ£ç¾©ãï¼ (ãã¤ã«ã¯æ庫NF)</a></p><ul class="hatena-asin-detail-meta"><li><span class="hatena-asin-detail-label">ä½è
:</span><a href="https://d.hatena.ne.jp/keyword/%A5%DE%A5%A4%A5%B1%A5%EB%20%A5%B5%A5%F3%A5%C7%A5%EB" class="keyword">ãã¤ã±ã« ãµã³ãã«</a></li><li>æ©å·æ¸æ¿</li></ul><a href="https://www.amazon.co.jp/dp/B0CGTVP2TT?tag=hatena-22&linkCode=ogi&th=1&psc=1" class="asin-detail-buy" target="_blank" rel="sponsored noopener">Amazon</a></div></div></p>
<p> ã</p>
<h4 id="1å
ãã«ã³ã¼ã">1å
ãã«ã³ã¼ã</h4>
<p>æå¾ã¯ãå¿ã«ã¬ãã³ã¨æ¥ãä¸åã§ããããªãããããªããã°ä½ãå¤ãããªãããã ããã ãã®äºãä¸å¯§ã«ä¼ãã¦ããã¾ããç§ãå¹´æ«èªã¿è¿ãããè³æ¥µã®ä¸åã§ãã
<div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/dp/B07ZCY5BXF?tag=hatena-22&linkCode=ogi&th=1&psc=1" class="hatena-asin-detail-image-link" target="_blank" rel="sponsored noopener"><img src="https://m.media-amazon.com/images/I/51ONEF5axHL._SL500_.jpg" class="hatena-asin-detail-image" alt="1å
ãã«ã³ã¼ãââã·ãªã³ã³ãã¬ã¼ã®ã¬ã¸ã§ã³ãããã«ã»ãã£ã³ãã«ã®æåã®æã" title="1å
ãã«ã³ã¼ãââã·ãªã³ã³ãã¬ã¼ã®ã¬ã¸ã§ã³ãããã«ã»ãã£ã³ãã«ã®æåã®æã"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/dp/B07ZCY5BXF?tag=hatena-22&linkCode=ogi&th=1&psc=1" target="_blank" rel="sponsored noopener">1å
ãã«ã³ã¼ãââã·ãªã³ã³ãã¬ã¼ã®ã¬ã¸ã§ã³ãããã«ã»ãã£ã³ãã«ã®æåã®æã</a></p><ul class="hatena-asin-detail-meta"><li><span class="hatena-asin-detail-label">ä½è
:</span><a href="https://d.hatena.ne.jp/keyword/%A5%A8%A5%EA%A5%C3%A5%AF%A1%A6%A5%B7%A5%E5%A5%DF%A5%C3%A5%C8" class="keyword">ã¨ãªãã¯ã»ã·ã¥ããã</a>,<a href="https://d.hatena.ne.jp/keyword/%A5%B8%A5%E7%A5%CA%A5%B5%A5%F3%A1%A6%A5%ED%A1%BC%A5%BC%A5%F3%A5%D0%A1%BC%A5%B0" class="keyword">ã¸ã§ããµã³ã»ãã¼ã¼ã³ãã¼ã°</a>,<a href="https://d.hatena.ne.jp/keyword/%A5%A2%A5%E9%A5%F3%A1%A6%A5%A4%A1%BC%A5%B0%A5%EB" class="keyword">ã¢ã©ã³ã»ã¤ã¼ã°ã«</a></li><li>ãã¤ã¤ã¢ã³ã社</li></ul><a href="https://www.amazon.co.jp/dp/B07ZCY5BXF?tag=hatena-22&linkCode=ogi&th=1&psc=1" class="asin-detail-buy" target="_blank" rel="sponsored noopener">Amazon</a></div></div></p>
<p> ã</p>
<h1 id="ãããã«">ãããã«</h1>
<p>ãããã§ããã§ããããã</p>
<p>ããã§ãä»å¹´ãã¨ã³ã¸ãã¢ã®çããã®ç©èªãå¢ãããã¨ãã§ãã¾ããã
æ¥å¹´ãEngineering Group Meetingãéãã¦ããã¾ãã³ã³ãã³ããã§1è¨äºæ¸ãããããç§ãå¹´æ«å¹´å§ã«ç©èªãæ¶åãã¦ããããã¨æã£ã¦ãã¾ãã</p>
<p>ç©èªæ¶åã§ãããå¹´ãéããã¦ããã¾ãããã
ãã£ã¦ããï¼</p>
<h2 id="We-are-hiring-">We are hiring !!</h2>
<p>ã¨ã ã¹ãªã¼ã§ã¯ãæ¸ç±ãæè¡ã大好ããªæ欲ã®ããã¨ã³ã¸ãã¢ãåéãã¦ãã¾ãã
Engineering Group Meetingã®ãã¾ãã楽ãããã®ãã¨ã ã¹ãªã¼ã ãï¼</p>
<p>æ°åã»ä¸éããããã®æ¡ç¨ã ãã§ãªããã«ã¸ã¥ã¢ã«é¢è«ãã¤ã³ã¿ã¼ã³ã常æåéãã¦ãã¾ãã®ã§ãããããé¡ããã¾ãï¼</p>
<h3 id="ã¨ã³ã¸ãã¢æ¡ç¨ãã¼ã¸ã¯ãã¡ã">ã¨ã³ã¸ãã¢æ¡ç¨ãã¼ã¸ã¯ãã¡ã</h3>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjobs.m3.com%2Fengineer%2F" title="ã¨ã³ã¸ãã¢æ¡ç¨ãµã¤ãï½æ¡ç¨æ
å ± | å»çÃãã¯ããã¸ã¼ã®å¯è½æ§ã¯ç¡é大" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jobs.m3.com/engineer/">jobs.m3.com</a></cite></p>
<h3 id="ã«ã¸ã¥ã¢ã«é¢è«ããæ°è»½ã«ã©ãã">ã«ã¸ã¥ã¢ã«é¢è«ããæ°è»½ã«ã©ãã</h3>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjobs.m3.com%2Fengineer%2Fcasual-session%2F" title="ã¨ã³ã¸ãã¢æ¡ç¨ãµã¤ãï½æ¡ç¨æ
å ± | å»çÃãã¯ããã¸ã¼ã®å¯è½æ§ã¯ç¡é大" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jobs.m3.com/engineer/casual-session/">jobs.m3.com</a></cite></p>
<h3 id="ã¤ã³ã¿ã¼ã³ã常æåéãã¦ãã¾ã">ã¤ã³ã¿ã¼ã³ã常æåéãã¦ãã¾ã</h3>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fopen.talentio.com%2Fr%2F1%2Fc%2Fm3%2Fhomes%2F4354" title="ãæ°åãã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ã åéä¸è¦§ / ã¨ã ã¹ãªã¼æ ªå¼ä¼ç¤¾" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://open.talentio.com/r/1/c/m3/homes/4354">open.talentio.com</a></cite></p>
vaaaaaanquish
DBãã¼ãã«ã®ã«ã©ã ãåé¤ããã¨ãã«ãããã¨ã»èãããã¨
hatenablog://entry/6802418398313995595
2024-12-26T00:00:00+09:00
2024-12-26T14:50:33+09:00 çªç¶ã§ããçæ§ã¯ã稼åæ¸ã¿ãµã¼ãã¹ã®DBãããã¼ãã«ã«ã©ã ãåé¤ãããããããã¨ãããã¾ãã§ããããï¼ åºæ¬çã«åé¤ã¯ã¾ããããªãã®ã§ã¯ã¨æãã¾ãããã£ãããªãã®ï¼ ã¨æãããæ¹ãããã£ãããããããã¾ãããããã£ã¨ãã®è¨äºãèªãã°ãªãå¤ãã®æ¹ãã«ã©ã åé¤ãé¿ããã®ãããããã¨ã§ãããã ã¨ã¯ããããããã¦ä½¿ããªãã«ã©ã ããã¼ãã«ã«æºã¾ã£ã¦ããã¨ããã¦æ°è¦å å
¥ã¡ã³ãã¼ãã³ã¼ãã«ãã£ããã¢ãããã妨ãã¨ãªãã¬ãã«ã«ã¾ã§æºã¾ã£ã¦ããããã¾ãããã¤ãã¯å¤§æé¤ã®ã¨ããããããã§ããDBã¯å¯¿å½é·ãã§ãããããããããã¨ãã«å®éã©ã®ãããªæé ã§ã«ã©ã ãåé¤ããã®ãè¦ã¦ããã¾ããããã¨ã ã¹ãªã¼ã¨ã³ã¸ãã¢ãªã³â¦
<p>çªç¶ã§ããçæ§ã¯ã稼åæ¸ã¿ãµã¼ãã¹ã®DBãããã¼ãã«ã«ã©ã ãåé¤ãããããããã¨ãããã¾ãã§ããããï¼ãåºæ¬çã«åé¤ã¯ã¾ããããªãã®ã§ã¯ã¨æãã¾ãããã£ãããªãã®ï¼ãã¨æãããæ¹ãããã£ãããããããã¾ãããããã£ã¨ãã®è¨äºãèªãã°ãªãå¤ãã®æ¹ãã«ã©ã åé¤ãé¿ããã®ãããããã¨ã§ãããã</p>
<p>ã¨ã¯ããããããã¦ä½¿ããªãã«ã©ã ããã¼ãã«ã«æºã¾ã£ã¦ããã¨ããã¦æ°è¦å å
¥ã¡ã³ãã¼ãã³ã¼ãã«ãã£ããã¢ãããã妨ãã¨ãªãã¬ãã«ã«ã¾ã§æºã¾ã£ã¦ããããã¾ãããã¤ãã¯å¤§æé¤ã®ã¨ããããããã§ããDBã¯å¯¿å½é·ãã§ãããããããããã¨ãã«å®éã©ã®ãããªæé ã§ã«ã©ã ãåé¤ããã®ãè¦ã¦ããã¾ããããã¨ã ã¹ãªã¼ã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ãUnit1ï¼è£½è¬ããã¢ã¼ã·ã§ã³ï¼ã»Unit9ï¼æ²»é¨è¨åºç 究æ¯æ´ï¼ãã¼ã ã¨ã³ã¸ãã¢ã®ä¸æµ¦ [<a href="https://www.m3tech.blog/archive/author/Sampo" target="_blank">è¨äºä¸è¦§ <span style="font-family:blogicon">ï</span></a>]ããæè¿å®éã«ãã£ãä½æ¥ããç¥è¦ããå±ããã¾ãã</p>
<ul class="table-of-contents">
<li><a href="#é·ãã®ã§3è¡ã§">é·ãã®ã§3è¡ã§</a></li>
<li><a href="#èãæ¹">èãæ¹</a></li>
<li><a href="#1-ãã®ã«ã©ã ã¸ã®ã¢ããªã±ã¼ã·ã§ã³å¤ããã®ã¢ã¯ã»ã¹ããªãã">1. ãã®ã«ã©ã ã¸ã®ã¢ããªã±ã¼ã·ã§ã³å¤ããã®ã¢ã¯ã»ã¹ããªãã</a></li>
<li><a href="#2-ã«ã©ã ãNULL許容ã«ãã">2. ã«ã©ã ãNULL許容ã«ãã</a></li>
<li><a href="#3-ã¢ããªã±ã¼ã·ã§ã³å´ã§ãã®ã«ã©ã ã¸ã®ã¢ã¯ã»ã¹ããªãããªãªã¼ã¹">3. ã¢ããªã±ã¼ã·ã§ã³å´ã§ãã®ã«ã©ã ã¸ã®ã¢ã¯ã»ã¹ããªããããªãªã¼ã¹</a></li>
<li><a href="#4-ã«ã©ã ãDROP">4. ã«ã©ã ãDROP</a></li>
<li><a href="#ä»ã®ã±ã¼ã¹ä¸è¦ãªãã¼ãã«ã®åé¤">ä»ã®ã±ã¼ã¹ï¼ä¸è¦ãªãã¼ãã«ã®åé¤</a></li>
<li><a href="#ä»ã®ã±ã¼ã¹ã«ã©ã ã®æ¹å">ä»ã®ã±ã¼ã¹ï¼ã«ã©ã ã®æ¹å</a></li>
<li><a href="#ã¾ã¨ã">ã¾ã¨ã</a></li>
<li><a href="#We-are-hiring">We are hiring</a></li>
</ul>
<h3 id="é·ãã®ã§3è¡ã§">é·ãã®ã§3è¡ã§</h3>
<ol>
<li>ãã®ã«ã©ã ã¸ã®ã¢ããªã±ã¼ã·ã§ã³å¤ããã®ã¢ã¯ã»ã¹ããªãã</li>
<li>ã«ã©ã ãNULL許容ã«ãã</li>
<li>ã¢ããªã±ã¼ã·ã§ã³å´ã§ãã®ã«ã©ã ã¸ã®ã¢ã¯ã»ã¹ããªããããªãªã¼ã¹</li>
<li>ã«ã©ã ãDROP</li>
</ol>
<p>ãã¿ã¾ãã4è¡ã«ãªã£ã¦ãã¾ãã¾ãããã§ããã以ä¸ã¯æ¸ããã¾ããã</p>
<h3 id="èãæ¹">èãæ¹</h3>
<p>æã大äºãªç¹ã¯ç¨¼åä¸ã®ãµã¼ãã¹ããªãªã¼ã¹åå¾ã§ç¡ç¨ã«ã¨ã©ã¼ãèµ·ãããªãããã«ã¨ãããã¨ã«ãªãã®ã§ãããããã«å ãã¦ãéçºã»QAç°å¢ã®ãã¨ã§ãããå¥ã«ãã£ã¼ãã£ã¼ãã©ã³ããåã£ã¦éçºãQAã®ä½æ¥ããã¦ãã人ã
ãè©°ã¾ãªããã¨ãéè¦ãªè¦³ç¹ã¨ãªãã¾ããããã¦å¿ãã¦ã¯ãããªãããã¼ã¿åæããã¦ãã人ã
ã¸ã®ç®é
ããä¸ã¤ç®ã§ããã</p>
<p>ãã¦ã¾ããã«ã©ã åé¤ãã¢ããªã±ã¼ã·ã§ã³ã¨DBã©ã¡ãããå
ã«ãããã¨ããè°è«ãã§ãã¾ãã両è
ãå³å¯ã«ãåæãã«ãªãªã¼ã¹ã¯ã§ãã¾ããããããã©ã¡ããå
ã«ãã¾ããããããå
ã«DBããã«ã©ã ãåé¤ããã¨ãã¢ããªã±ã¼ã·ã§ã³ãã¨ã©ã¼ãåºãå§ããã®ã¯å®¹æã«æ³åãã¤ãã¾ããã§ã¯ãã¢ããªã±ã¼ã·ã§ã³ãå
ãã</p>
<p>å
ã«ã¢ããªã±ã¼ã·ã§ã³å´ãããã®ã«ã©ã ã¸ã®åç
§ããªããã¦ãªãªã¼ã¹ããã°ãã¨ã¯è½ã¡çãã¦DBããã«ã©ã ãåé¤ã§ãããã¯ãããã®çºæ³ã§ã»ã¼ééãããã¾ããããã ãããã ãã®é çªã§è¡ãã¨ã¢ããªã±ã¼ã·ã§ã³å´ãªãªã¼ã¹ã¨åæã«å¤§éã®ã¢ã©ã¼ããé£ã³å§ããå¯è½æ§ãããã¾ããä½ããããªãã£ãã§ãããã</p>
<p>ãï¸</p>
<p>INSERTæãè½ã¡ãããã«ãªã£ãã®ã§ããã¢ããªã±ã¼ã·ã§ã³å´ã§ã«ã©ã ãã¾ã£ããåç
§ããªããªãã°ãINSERTããã®ã«å¿
è¦ãªã«ã©ã ãã¼ã¿ã足ããè»ä¸¦ã¿ã¨ã©ã¼ã¨ãããããã¤ã¾ãã¢ããªã±ã¼ã·ã§ã³å´ããã«ã©ã åç
§ãåé¤ããã®ã«å
ç«ã£ã¦ãããããªãã§ãINSERTãéããããã«ãã¦ãããªãã¦ã¯ãªããªãã£ãã®ã§ãã</p>
<p>ãã®ãINSERTæãéãããã«âã¢ããªã±ã¼ã·ã§ã³å´ããåé¤âDBããåé¤ã®3段éããµã¼ãã¹æ¬ä½ã§ã®ä¿®æ£ã¨ããã¨ãããã«ã¢ããªã±ã¼ã·ã§ã³å¤ããã®ã¢ã¯ã»ã¹ã¸ã®èæ
®ãå
¥ãã¦åè¿°ã®4段éã¨ãªãã¾ãã</p>
<h3 id="1-ãã®ã«ã©ã ã¸ã®ã¢ããªã±ã¼ã·ã§ã³å¤ããã®ã¢ã¯ã»ã¹ããªãã">1. ãã®ã«ã©ã ã¸ã®ã¢ããªã±ã¼ã·ã§ã³å¤ããã®ã¢ã¯ã»ã¹ããªãã</h3>
<p>äºæ¥ã¨ãã¦æä¾ãã¦ãããµã¼ãã¹ãªãã°ãå¤ããå°ãªãããã®å©ç¨å®ç¸¾ã»å®æ
ããã¼ã¿åæãããéè¨ããããããã¼ãºãããã¯ãã§ããããªãã¡ãã¢ããªã±ã¼ã·ã§ã³DBãåæç¨DBã«åãè¾¼ãã§å å·¥ãã¦ãããã¼ã ãããã¯ãã§ããã¢ããªã±ã¼ã·ã§ã³æ¬ä½ã®éçºã«éä¸ãã¦ããã¨ã¤ããããããã¼ã ã¸ã®ç®é
ããå¿ãã¦ãã¾ããæ°æ©è½ãªãªã¼ã¹ã¨åæã«ãã¼ã¿åæãã¼ã æ¹é¢ããæ²é³´ãä¸ãã£ã¦ãã¾ã£ããªãã¦çµé¨ããæã¡ã®æ¹ãå°ãªããªãã®ã§ã¯ã</p>
<p>ã§ãããå®ç³ã¨ãã¦ãã¤ãã¹ããããè¸ãããã«ãã¾ããããDBã¹ãã¼ãå¤æ´ã®æåã®ä¸æã¯ãã¼ã¿åæãã¼ã ç¸è«ãç¹ã«ä½ããåé¤ãããããªç¢ºå®ã«ã¨ã©ã¼ãèµ·ããå¤æ´ãªãã°çµ¶å¯¾ã«ã¯ãããªãäºé
ã¨ãªãã¾ãã</p>
<p>ãã¼ã¿åæãã¼ã ããã®ä¸æµã§ã®å½±é¿ãããã«èªã¿åããã¨ã¯éããããã¼ã¿ãã¼ããããç¡éªæ°ã«ãã®ã«ã©ã ãæ¶ãã¦ãã¾ããã¨ã¯éãã¾ãããã¾ãã¯ä¿å®çã«ã次ã®ããã«åãè¾¼ã¿SQLã§ç¡æå³ãã¼ã¿ãåãè¾¼ãããã«å¤æ´ãªã©ãããã¨ã«ãªãã§ãããã</p>
<pre class="code lang-sql" data-lang="sql" data-unlink> <span class="synStatement">SELECT</span>
id,
tenant_id,
name,
- billing_start_date,
+ <span class="synType">DATE</span><span class="synSpecial">'</span><span class="synConstant">1970-01-01</span><span class="synSpecial">'</span> <span class="synSpecial">AS</span> billing_start_date,
- billing_end_date
+ <span class="synType">DATE</span><span class="synSpecial">'</span><span class="synConstant">2200-12-31</span><span class="synSpecial">'</span> <span class="synSpecial">AS</span> billing_end_date
<span class="synSpecial">FROM</span>
users
</pre>
<p>NULLé許容ã ã£ãbilling_start_date, billing_end_dateãåé¤ããã¨ããã¹ãã¼ãªã¼ã§ãããä¸æµå½±é¿ãé²ãããNULLã§ã¯ãªãåºå®å¤ãèªã¿è¾¼ãããã«ããå¤æ´ããã¦ããä¾ã§ã<a href="#f-d0a2aa94" id="fn-d0a2aa94" name="fn-d0a2aa94" title="é ãæªæ¥ã¨ããæå³ã§2200å¹´ã¨ããããããè¿ãå¹´æãæ¡ç¨ãã¦ããã®ãæ°ã«ãªãæ¹ãããã£ãããããããã¾ãããããããã¼ã¿åæåéã ã¨ãã使ãããPythonã©ã¤ãã©ãªã®pandasãæ¥ä»ã¨ãã¦æ大2262-04-11ã¾ã§ããæ±ããªãã¨ããåé¡ããããããã«å¼ã£ããããªãåãã®è¯ããå¹´å·ã¨ããã¨ãã®ãããã«ãªããªã©ã¨ãã£ãäºæ
ãããã¾ãã175å¹´å¾ã§ããã175å¹´åã¯ã¾ã æ±æ¸æ代ã§ãããããã§ãç¸å½é ãæªæ¥ã§ããã">*1</a>ã</p>
<h3 id="2-ã«ã©ã ãNULL許容ã«ãã">2. ã«ã©ã ãNULL許容ã«ãã</h3>
<p>ãã®ã«ã©ã ãæå®ããªãã¦ãINSERTæãéãããã«ããã¨ãããã¨ã§ããã¨ãããã¨ã¯NULL許容ã«ããã®ã§ãªãDEFAULTãè¨å®ããã¨ããã®ãå¥è§£ã«ãªãã¾ãããã ããããæ¶ãã«ã©ã ã«å¤ãæãããå¿
è¦ãããããã¾ãããããNULL許容ã«ãã¦ããã®ã§ååã§ããããæ¬æ¥NULLé許容ã§ãã¼ã¿ãã¼ãã«ãå¿
ãå¤ãåãè¾¼ã¾ãã¦ããã®ã ã¨ãã¦ãã1.ã®æ®µéã§ã¡ããã¨ããã¼å¤ãåã£ã¦ãããããã«ãªãã¾ããããå¿ç½®ããªãNULL許容ã«ã§ãã¾ããã</p>
<p>ã«ã©ã ããã¨ãã¨NULL許容ã ã£ãããã®ã¹ãããã¯ãã¹ã§ããããã§ã¨ããããã¾ãã</p>
<h3 id="3-ã¢ããªã±ã¼ã·ã§ã³å´ã§ãã®ã«ã©ã ã¸ã®ã¢ã¯ã»ã¹ããªãããªãªã¼ã¹">3. ã¢ããªã±ã¼ã·ã§ã³å´ã§ãã®ã«ã©ã ã¸ã®ã¢ã¯ã»ã¹ããªããããªãªã¼ã¹</h3>
<p>ã¢ããªã±ã¼ã·ã§ã³ããå
ã«ã«ã©ã åç
§ããªããã¾ãããã¨ããã®ã¯ç·è«ã§ã話ãã¾ããããããã§ããã¦ããã«ããã£ãããªãªã¼ã¹ãã¦ãã¾ãã¾ããããã¨ããã®ãä»ãå ãã¾ããã¤ã¾ãåæ¥ã«DBããã®ã«ã©ã åé¤ã¾ã§ãã£ã¦ãã¾ããã«å¥ã®æ©ä¼ã«ãã¾ãããã¨ãããã¨ã¨ããã®çç±ããä»ã®ã¡ã³ãã¼ã®éçºã»QAãæ¢ããªãããã«ã¨ãã観ç¹ã§ãã</p>
<p>ã¢ããªã±ã¼ã·ã§ã³ãããDBãããã«ã©ã ãåé¤ããã¨ããä¿®æ£ãããããªãªã¼ã¹ããåã«QAããã«ã¯ãQAç°å¢ã§DBããã«ã©ã åé¤ãããã¨ã«ãªãã¾ããããããã¨ãä»ã®ãã£ã¼ãã£ã¼ãã©ã³ããQAç°å¢ã§ã¨ã©ã¼ãåºãã¦ãã¾ãããã«ãªãã¾ãããããé²ããã¨ããã¨ã©ã®ãããªæé ãè¸ã¾ãªãã¨ãããªããã¨ããã¨</p>
<ol>
<li>ã¢ããªã±ã¼ã·ã§ã³ããã«ã©ã åç
§ãåé¤ããä¿®æ£ãæ¸ãâQAâãªãªã¼ã¹<br/>
ï¼ãã®éãDBã¹ãã¼ãã«å¤æ´ã¯å ãããªãã®ã§ä»ã®ãã£ã¼ãã£ã¼ãã©ã³ããåé¡ãªãåãï¼</li>
<li>åãã£ã¼ãã£ã¼ãã©ã³ãã§æ¬æµã®ææ°ããã¼ã¸ãªããªãã¼ã¹ãªããã¦ããã<br/>
ï¼åãã©ã³ãã¨ããDBããã«ã©ã ããã¤æ¶ãã¦ãåãç¶æ
ã«ãªã£ãï¼ï¼</li>
<li>DBããã«ã©ã ãåé¤ãããã¤ã°ã¬ã¼ã·ã§ã³ãQAâãªãªã¼ã¹<br/>
ï¼QAãã段éã§ã¾ãQAç¨DBããã«ã©ã ãæ¶ããããåãã£ã¼ãã£ã¼ãã©ã³ãã¯åé¡ãªãï¼</li>
</ol>
<p>äºäººä»¥ä¸ã®ã¨ã³ã¸ãã¢ããããªããã¢ããªã±ã¼ã·ã§ã³ããã¨DBããã«ã©ã ãåé¤ããã®ã¯å¥ã®ãªãªã¼ã¹æ©ä¼ã«åããã»ããããã¨ãªãã¾ããæåã«æ¸ãã4æé ã®ãã¡ãã®3çªç®ã§ãææ«ã®ããªãªã¼ã¹ãã¨ããã®ã«ã¯ãã¼ã ã®çã«æ¬æµãã¼ã¸ããã¦ãããã¨ããã¹ããããå«ã¾ãã¦ãããã¨ã«ãªãã¾ããã</p>
<h3 id="4-ã«ã©ã ãDROP">4. ã«ã©ã ãDROP</h3>
<p>ãã¯ãããªããé»ããã®ã¯ããã¾ãããä½å¹´ãããã¦æºã¾ã£ããããªãã«ã©ã ããã£ããåé¤ãã¾ãããã</p>
<pre class="code lang-sql" data-lang="sql" data-unlink><span class="synStatement">ALTER</span> <span class="synSpecial">TABLE</span> users <span class="synStatement">DROP</span> <span class="synSpecial">COLUMN</span> billing_start_date;
<span class="synStatement">ALTER</span> <span class="synSpecial">TABLE</span> users <span class="synStatement">DROP</span> <span class="synSpecial">COLUMN</span> billing_end_date;
</pre>
<p>ãã¤ãããã¾ã§ããã</p>
<h3 id="ä»ã®ã±ã¼ã¹ä¸è¦ãªãã¼ãã«ã®åé¤">ä»ã®ã±ã¼ã¹ï¼ä¸è¦ãªãã¼ãã«ã®åé¤</h3>
<p>ãã¼ãã«åé¤ã®å ´åã«ã¯ãINSERTæãéããªããªãåé¡ãããã¾ããããã£ã¦å°ãæé ã¯ç°¡åãä»åº¦ã¯æ¬å½ã«3è¡ã§æ¸ãã¾ãã</p>
<ol>
<li>ãã®ã«ã©ã ã¸ã®ã¢ããªã±ã¼ã·ã§ã³å¤ããã®ã¢ã¯ã»ã¹ããªãã</li>
<li>ã¢ããªã±ã¼ã·ã§ã³å´ã§ãã®ãã¼ãã«ã¸ã®ã¢ã¯ã»ã¹ããªããããªãªã¼ã¹</li>
<li>ãã¼ãã«ãDROP</li>
</ol>
<h3 id="ä»ã®ã±ã¼ã¹ã«ã©ã ã®æ¹å">ä»ã®ã±ã¼ã¹ï¼ã«ã©ã ã®æ¹å</h3>
<p>ååãå®æ
ã表ããªããªã£ã¦ãã¾ã£ãã®ã§æ¹åãããã¨ãããã¼ãºããã¾ã«çããã®ã¯ãã®éãã§ãããããâ¯â¯æ¹åã¯é£ããã§ãï¼ãããã©ããã¦ãããããã¨ãã¦ããæ°ããã«ã©ã ãä½ã£ã¦ä½¿ãããã«ãã¦å¤ãã«ã©ã ã¯ä½¿ãã®ããããï¼ããã¦ãã¤ã大æé¤ã®ã¨ãã«â¯â¯ï¼ã¨ãããããªãã§ãããããã¡ããããã ã£ã¦ç°¡åã§ã¯ãªãã</p>
<ol>
<li>æ°ããã«ã©ã ãNULL許容ã§ä½ã</li>
<li>ã¢ããªã±ã¼ã·ã§ã³ã®æ´æ°ç³»ã§ä¸¡æ¹ã®ã«ã©ã ã«æ¸ãè¾¼ãããã«ãããªãªã¼ã¹ï¼ä¸ã®ä¾ã¨åããããªãªã¼ã¹ã¨ã¯åãã£ã¼ãã£ã¼ãã©ã³ãã«ãåãè¾¼ããã¨ã¾ã§ãæå³ãã¾ãï¼</li>
<li>å¤ãã«ã©ã ããæ°ããã«ã©ã ã¸ãã¼ã¿ãã³ãã¼ããDMLãDBã§æµã</li>
<li>ãã®æç¹ã§ãNULLé許容ã«ããå¿
è¦æ§ãããã°ããã§ãã</li>
<li>ã¢ããªã±ã¼ã·ã§ã³å¤ããã®ã¢ã¯ã»ã¹ãæ°ããã«ã©ã ã¸å¤æ´</li>
<li>ã¢ããªã±ã¼ã·ã§ã³ã®åç
§ç³»ãæ°ããã«ã©ã ã¸å¤æ´ãããªãªã¼ã¹</li>
<li>ã¢ããªã±ã¼ã·ã§ã³ã®æ´æ°ç³»ã§å¤ãã«ã©ã ã¸ã®æ¸ãè¾¼ã¿ã¯ãããï¼NULLé許容ãªãç¡æå³ãã¼ã¿ãæ¸ãè¾¼ãããã«ããï¼</li>
</ol>
<p>ããããªä¸å¤§ä½æ¥ã¨ãªãã¾ããã¢ããªã±ã¼ã·ã§ã³ããã°ã©ã å
ã§å¤æ°åããã£ã¼ã«ãåãå¤ãããªãã¡ã¯ã¿ãªã³ã°ã¨ã¯æ¡éãã®å¤§å¤ãã§ãã</p>
<h3 id="ã¾ã¨ã">ã¾ã¨ã</h3>
<p>ãã¾ããå«ãã¦ãã®ãããªãããã¨ãªã¹ããã覧ã«å
¥ããã®ã§ãããã¹ãã¼ãå¤æ´ã«ã¯éããªããã¿ã¼ã³ãããã¾ãããä¸è¨äºã§ã¯æ¬æ¥ã¨ã¦ã網ç¾
ã§ãããã®ã§ã¯ããã¾ãããããã§ãã®ã¨ãã©ãã§ããããå®æ½ãã©ã³ãç«ã¦ããããããããã¾ã§ã§ãã©ã³ãç«ã¦ãã®ã«èãã¦ãããã¨ã¯ä½ã ã£ãã®ããæ¯ãè¿ã£ã¦ã¿ã¾ãããã</p>
<p>æ¥ã«äººéèã話ã«ãªã£ã¦ãã¾ãã¾ãããä»è
ã¸ã®ç®é
ããåºçºç¹ã¨ãªã£ã¦ããã¨æãã¾ãããã¼ã¿åæãã¼ã ããä»ã«éçºã»QAãã¦ãã人ããã¾ãåç
§ç³»ã¯æ´æ°ç³»ããæ´æ°ç³»ã¯åç
§ç³»ãã¨ãã£ãããã«ä»ã®äººéãä»ã®ã¦ã¼ã¹ã±ã¼ã¹ãã¡ãè©°ã¾ãªãããåã¹ãããã§èãããã¨ã§æ²é³´ã®ä¸ãããªãã¹ãã¼ãå¤æ´ãæ§æãããã¨ãã¦ããã®ã§ãã</p>
<p>ãã¡ããã人éã®æ³ååã«ã¯éããããã¾ããããæ³åã§ããªãã£ãã¨ããã¾ã§ã¯ç®ãé
ãã¾ããããããã¦æ²é³´ãä¸ãããã¨ã«ãªã£ã¦ãã¾ã£ããæ¯ãè¿ãããã¦ãããããã°ãã£ã¨åºãç®ãé
ããããã«ãªãã¾ãã次ã®ã¹ãã¼ãå¤æ´ã¯ãã£ã¨ãã£ã¨ãã¾ãããã¾ãã</p>
<h3 id="We-are-hiring">We are hiring</h3>
<p>å½±é¿ç¯å²ã«ç®ãé
ã£ã¦ãããã§ãæ²é³´ãä¸ãããã¦ãã¾ã£ããæ¯ãè¿ã£ã¦ãã£ã¨ç®ãåºãé
ããããã«ããâ¯â¯ãã®ãµã¤ã¯ã«ã¯ã¹ãã¼ãå¤æ´ä½æ¥ã«éããªããã¨ããã¹ã¦ã®éçºåéã§ã¨ã³ã¸ãã¢ãæé·ããã¦ããããã¨ã§ããç§éã¨ã ã¹ãªã¼ã®ã¨ã³ã¸ãã¢ã¯ãã¹ããã¨ãèªåã¨ãã¼ã ã§èãã¦éçºãã¦ãã¾ãã®ã§ãããã ãå½±é¿ç¯å²ãèãããããã¨ãã«ã¯å½±é¿ãèªã¿è½ã¨ãã¦ãã¾ã£ãããæ¥ã
ãã¦ãã¾ããããããæé·ãµã¤ã¯ã«ã®åã£ã¦ããç°å¢ããèå³ãã£ãããã¡ãã®ãã¼ã¸ããã©ãããå¿åãåæã«ããªãã«ã¸ã¥ã¢ã«é¢è«ããã£ã¦ãã¾ãã</p>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjobs.m3.com%2Fengineer%2F" title="ã¨ã³ã¸ãã¢æ¡ç¨ãµã¤ãï½æ¡ç¨æ
å ± | å»çÃãã¯ããã¸ã¼ã®å¯è½æ§ã¯ç¡é大" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jobs.m3.com/engineer/">jobs.m3.com</a></cite></p>
<div class="footnote">
<p class="footnote"><a href="#fn-d0a2aa94" id="f-d0a2aa94" name="f-d0a2aa94" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">é ãæªæ¥ã¨ããæå³ã§2200å¹´ã¨ããããããè¿ãå¹´æãæ¡ç¨ãã¦ããã®ãæ°ã«ãªãæ¹ãããã£ãããããããã¾ãããããããã¼ã¿åæåéã ã¨ãã使ãããPythonã©ã¤ãã©ãªã®pandasãæ¥ä»ã¨ãã¦æ大2262-04-11ã¾ã§ããæ±ããªãã¨ããåé¡ããããããã«å¼ã£ããããªãåãã®è¯ããå¹´å·ã¨ããã¨ãã®ãããã«ãªããªã©ã¨ãã£ãäºæ
ãããã¾ãã175å¹´å¾ã§ããã175å¹´åã¯ã¾ã æ±æ¸æ代ã§ãããããã§ãç¸å½é ãæªæ¥ã§ããã</span></p>
</div>
Sampo
æ©æ¢°å¦ç¿ã¨ã³ã¸ãã¢ããã¼ã¿ãµã¤ã¨ã³ãã£ã¹ãã«ãã¦ã±ãããã«ãã£ãä½ããã
hatenablog://entry/6802418398311775894
2024-12-25T09:00:00+09:00
2024-12-25T09:00:12+09:00 ã®ã¼ã¯ãªæè¡è
ã®çæ§ãããã«ã¡ã¯ãã¡ãªã¼ã¯ãªã¹ãã¹ã ãªã¢ã¼ãã¯ã¼ã¯ã§éåä¸è¶³ãæãã¦ãããããVTuberã®ãªã³ã°ãã£ããã¢ããã³ãã£ã¼ã®ãã¬ã¤åç»ãè¦ã¦æ°ãç´ãããã¦ãã¾ããVPoEã®æ²³å(@vaaaaanquish)ã§ãã æ¬è¨äºã¯ã¨ã ã¹ãªã¼ã¢ããã³ãã«ã¬ã³ãã¼2024ã®æçµæ¥ã®è¨äºã«ãããã¾ãã ã¨ã ã¹ãªã¼ã¢ããã³ãã«ã¬ã³ãã¼ã«ã¯ä»å¹´ãã®ã¼ã¯ãªè¨äºãæã£ã¦ãã¾ãã®ã§ãå¹´æ«å¹´å§ã®æè¡ç é½ã®ãä¾ã«æ¯éã©ããã qiita.com ã¯ããã« ããã«ãã£ã®ä¸æºå digits plot wordcloud ãããã« We are hiring !! ã¨ã³ã¸ãã¢æ¡ç¨ãã¼ã¸ã¯ãã¡ã ã«ã¸ã¥ã¢ã«é¢è«â¦
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241225/20241225090101.png" width="800" height="450" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p>
<p>ã®ã¼ã¯ãªæè¡è
ã®çæ§ãããã«ã¡ã¯ãã¡ãªã¼ã¯ãªã¹ãã¹ã<br/>
ãªã¢ã¼ãã¯ã¼ã¯ã§éåä¸è¶³ãæãã¦ãããããVTuberã®ãªã³ã°ãã£ããã¢ããã³ãã£ã¼ã®ãã¬ã¤åç»ãè¦ã¦æ°ãç´ãããã¦ãã¾ããVPoEã®æ²³å(<a href="https://x.com/vaaaaanquish">@vaaaaanquish</a>)ã§ãã</p>
<p>æ¬è¨äºã¯<a href="https://qiita.com/advent-calendar/2024/m3">ã¨ã ã¹ãªã¼ã¢ããã³ãã«ã¬ã³ãã¼2024</a>ã®æçµæ¥ã®è¨äºã«ãããã¾ãã<br/>
ã¨ã ã¹ãªã¼ã¢ããã³ãã«ã¬ã³ãã¼ã«ã¯ä»å¹´ãã®ã¼ã¯ãªè¨äºãæã£ã¦ãã¾ãã®ã§ãå¹´æ«å¹´å§ã®æè¡ç é½ã®ãä¾ã«æ¯éã©ããã</p>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fqiita.com%2Fadvent-calendar%2F2024%2Fm3" title="ã¨ã ã¹ãªã¼ - Qiita Advent Calendar 2024 - Qiita" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://qiita.com/advent-calendar/2024/m3">qiita.com</a></cite></p>
<ul class="table-of-contents">
<li><a href="#ã¯ããã«">ã¯ããã«</a></li>
<li><a href="#ããã«ãã£ã®ä¸æºå">ããã«ãã£ã®ä¸æºå</a></li>
<li><a href="#digits">digits</a></li>
<li><a href="#plot">plot</a></li>
<li><a href="#wordcloud">wordcloud</a></li>
<li><a href="#ãããã«">ãããã«</a><ul>
<li><a href="#We-are-hiring-">We are hiring !!</a><ul>
<li><a href="#ã¨ã³ã¸ãã¢æ¡ç¨ãã¼ã¸ã¯ãã¡ã">ã¨ã³ã¸ãã¢æ¡ç¨ãã¼ã¸ã¯ãã¡ã</a></li>
<li><a href="#ã«ã¸ã¥ã¢ã«é¢è«ããæ°è»½ã«ã©ãã">ã«ã¸ã¥ã¢ã«é¢è«ããæ°è»½ã«ã©ãã</a></li>
<li><a href="#ã¤ã³ã¿ã¼ã³ã常æåéãã¦ãã¾ã">ã¤ã³ã¿ã¼ã³ã常æåéãã¦ãã¾ã</a></li>
</ul>
</li>
</ul>
</li>
</ul>
<p>ã</p>
<h1 id="ã¯ããã«">ã¯ããã«</h1>
<p>ç§äºãªã®ã§ãããä»å¹´ã¯ã¨ã³ã¸ãã¢ã®æ¡ç¨æ´»åãé å¼µãã¾ããã</p>
<p>ã®ã¼ã¯ãªãã¡ã³ãå¢ããã¨ãã観ç¹ã§ã¯ã<a href="https://x.com/m3_engineering">@m3_engineering</a>ã®ãã©ãã¯ã¼ããã§ãã1ä¸äººãè¶
ãã¾ããããã£ãã¼ï¼ð</p>
<p>ãã®æ´»åã®ä¸ç°ã¨ãã¦å®æçã«é£èªã¯ã¤ãºãä½æãçºä¿¡ãã¦ããã®ã§ãããçµæã¨ãã¦ä»ã社å
ã«100以ä¸ã®ããã°ã©ãã³ã°ã¯ã¤ãºãåå¨ãã¦ãããããã§ã(ç¬)ã
ãã®ä¸é¨ã¯ãæè¡ã«ã³ãã¡ã¬ã³ã¹ãæè¡æ¸å
¸ã§ãå
¬éãã¦ãããç®ã«ããäºãããæ¹ãå°ãªããªãããªã¨æãã¾ãã</p>
<p><figure class="figure-image figure-image-fotolife" title="ãµãã¼ã¿ã¼ãºä¸»å¬ã®æè²ã¢ã«ããã¢ã§ã®çºè¡¨è³æãã"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241225/20241225090015.jpg" width="800" height="450" loading="lazy" title="" class="hatena-fotolife" style="width:500px" itemprop="image"></span><figcaption>ãµãã¼ã¿ã¼ãºä¸»å¬ã®æè²ã¢ã«ããã¢ã§ã®çºè¡¨è³æãã</figcaption></figure></p>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.m3tech.blog%2Fentry%2Ftechbook7" title="ã¨ã ã¹ãªã¼ãæè¡æ¸å
¸17ã§æ°åãåºãã¾ãï¼ - ã¨ã ã¹ãªã¼ããã¯ããã°" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://www.m3tech.blog/entry/techbook7">www.m3tech.blog</a></cite></p>
<p>ä»ã«ããã¨ã ã¹ãªã¼ãç´¹ä»ããã³ã³ãã³ãã¨ãã¦ã200ãã¼ã¸è¶
ãã®å
¨ãã¼ã ç´¹ä»ã¹ã©ã¤ããä½æãã¾ããã
ã¨ã ã¹ãªã¼ã®å¤§ããªä¼æ¥æã¨ãåãã¼ã ã®ã¹ã¿ã¼ãã¢ããæã®ä¸¡æ¹ãä¼ããããä½ã£ã¦ããã®ã§ããã¡ããå¹´æ«ã®ãä¾ã«æ¯éã©ããã</p>
<iframe class="speakerdeck-iframe" frameborder="0" src="https://speakerdeck.com/player/353bdaef98bc4b45bc2c13e7b2866ebb" title="ã¨ã ã¹ãªã¼å
¨ãã¼ã ç´¹ä»è³æ / Introduction of M3 All Teams" allowfullscreen="true" style="border: 0px; background: padding-box padding-box rgba(0, 0, 0, 0.1); margin: 0px; padding: 0px; border-radius: 6px; box-shadow: rgba(0, 0, 0, 0.2) 0px 5px 40px; width: 100%; height: auto; aspect-ratio: 560 / 315;" data-ratio="1.7777777777777777"></iframe>
<p>å®éã®æ¡ç¨ã«ããã¦ã¯ãGAFAåºèº«è
ãçé ã«ãã¡ã¬ãã³ãã£ã¼ãã¹ã¿ã¼ãã¢ããã大æSIerããç¶ã
ã¨ã®ã¼ã¯ãªã¨ã³ã¸ãã¢ãå
¥ã£ã¦ãã¦ããã¦ãã¾ãã
æè¡ã§å»çã«ææ¦ãã仲éãå¢ãããã¨ã¯ãå
ã«ãè§ã«ãå¬ããäºã§ãã</p>
<p>ã</p>
<p>ãããã£ãæ¡ç¨æ´»åã®ä¸ã§ããä»å¹´ä¸çªã®æ¨ãã³ã³ãã³ããã<strong>Quineã¯ãªã¢ãã¡ã¤ã«</strong>ãã§ãã
Quineã¨å¼ã°ãããå®è¡ããã¨å®éã«åä½ããã³ã¼ããè¿ã£ã¦ããã³ã¼ãããã¼ã¹ã«ãM3ãã´ã表ç¾ããããã«ãã£ã§ãã
ããªã人æ°ã®ããã«ãã£ã§ãå¤ãã®æ¹ãããã®ã¼ã¯ãªå¿ææ°ãä¼ããï¼ããâ¯â¯è¨èªãä½ã£ã¦ï¼ãã¨çµ¶è³ã®å£°ãé ãã¦ãã¾ãã</p>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241225/20241225090057.png" width="800" height="450" loading="lazy" title="" class="hatena-fotolife" style="width:400px" itemprop="image"></span>
<iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.m3tech.blog%2Fentry%2Fpython_quine" title="ã¨ã ã¹ãªã¼ãé£èªããã°ã©ãã³ã°ãªã¿ã¯ã«éãããã«ãã£ãPython Quineã¯ãªã¢ãã¡ã¤ã«ã®ä½ãæ¹ - ã¨ã ã¹ãªã¼ããã¯ããã°" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://www.m3tech.blog/entry/python_quine">www.m3tech.blog</a></cite></p>
<p>ãªãã¨ãè¬ã®åã§åãgifãã¼ã¸ã§ã³ã以ä¸è¨äºå
ã«ãã£ãããã¾ãã</p>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.m3tech.blog%2Fentry%2F2024%2F11%2F07%2F110000" title="ã¨ã ã¹ãªã¼ç¦å²¡Quineãä½ãã¾ããï¼ - ã¨ã ã¹ãªã¼ããã¯ããã°" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://www.m3tech.blog/entry/2024/11/07/110000">www.m3tech.blog</a></cite></p>
<p>ããã£ãæ¸é¡ããã©ã·çãæãã§ä½¿ãã¾ãããã³ã¼ããæ¸ãã¦ããã®ã§æ®æ®µä½¿ãã®ä¸ã§ãããã«ã¼æ°åãå³ããã¾ãã
ç§ãæç¨ãã¦ãã¦ã4æ³ã®å¨ããã¾ã«ããããæç´ãæãç´ã大äºã«æãã§ãã¾ãã</p>
<p>ãããªå¥½èª¿ã®Quineã¯ãªã¢ãã¡ã¤ã«ãªã®ã§ãããå
æ¥æè¡é¢é£ã®ã¤ãã³ãã§ã¯ãªã¢ãã¡ã¤ã«ãé
ã£ã¦ããã¨ãããä»ç¤¾ã®æ©æ¢°å¦ç¿ç³»ã®ãªãµã¼ãã¨ã³ã¸ãã¢ã®æ¹ããã<strong>ç´ æ´ãããï¼è¯ãçºæ³ã ãçä¼¼ãããï¼ã§ããã¡ã¯ãªãµã¼ãç³»ã®ä¼ç¤¾ã ããã³ã¼ããæ¸ãã¦ãã£ã¦ãè奮ãã人ãå°ãªããããªâ¦</strong>ãã¨ããç¸è«ãåãã¾ããã</p>
<p>ã<strong>ãããã«</strong>ã</p>
<p>ããæãããå
¨ã¦ã®ã®ã¼ã¯ã§ã¹ãã¼ããªã¨ã³ã¸ãã¢ã¨åãããç§ã¯ãæ¥ãã§ã¹ã¯ãªãããæ¸ãå§ããã®ã§ããã</p>
<p>ã</p>
<h1 id="ããã«ãã£ã®ä¸æºå">ããã«ãã£ã®ä¸æºå</h1>
<p>ã¾ããä¸æºåã¨ãã¦æ©æ¢°å¦ç¿ãªãµã¼ãã§ã¯å¿
é ã®ãã¼ã«ã§ãã<code>matplotlib</code>ã使ã£ã¦æåãæç»ãã¦ããã¾ãã
ããã«ãã£ã«ã¯ç¤¾åããã´ã表è¨ããã訳ã§ããããã¯ãæ©æ¢°å¦ç¿ã¨ã³ã¸ãã¢ããã¼ã¿ãµã¤ã¨ã³ãã£ã¹ãã使ãæ
£ãããã¼ã«ã§ä½ã£ã¦ããã ã¨æãããã§ãã
ããã«ãä¼ç¤¾åã®åºã¦ãªãããã«ãã£ãä½ã£ã¦ã誰ã解éã§ããªãã§ãããã<a href="#f-e9a7c20e" id="fn-e9a7c20e" name="fn-e9a7c20e" title="ããããã ãã«">*1</a>ã</p>
<pre class="code lang-python" data-lang="python" data-unlink><span class="synPreProc">from</span> PIL <span class="synPreProc">import</span> Image, ImageFont, ImageDraw, ImageOps
<span class="synPreProc">import</span> numpy <span class="synStatement">as</span> np
<span class="synPreProc">from</span> matplotlib <span class="synPreProc">import</span> pyplot <span class="synStatement">as</span> plt
<span class="synPreProc">from</span> matplotlib.ticker <span class="synPreProc">import</span> AutoMinorLocator
<span class="synPreProc">import</span> matplotlib_fontja
message = <span class="synConstant">'M3'</span> <span class="synComment"># æç»ããããã¹ã</span>
font_size = <span class="synConstant">2000</span> <span class="synComment"># ãã©ã³ããµã¤ãº</span>
margin = <span class="synConstant">200</span> <span class="synComment"># æåå¨è¾ºãå²ããã¼ã¸ã³</span>
<span class="synComment"># ä¸æ¦å¤§ããæç»</span>
font = ImageFont.truetype(matplotlib_fontja.get_font_ttf_path(), font_size)
plot_size=<span class="synIdentifier">len</span>(message)*font_size
img_array = np.zeros((plot_size, plot_size, <span class="synConstant">3</span>), np.uint8)
img = Image.fromarray(img_array)
draw = ImageDraw.Draw(img)
<span class="synComment"># æåæç»å¾ã®ãµã¤ãºãåå¾ãã¦cut</span>
text_bbox = draw.textbbox((<span class="synConstant">0</span>,<span class="synConstant">0</span>), message, font=font)
img_array = img_array[<span class="synConstant">0</span>:text_bbox[<span class="synConstant">3</span>]+text_bbox[<span class="synConstant">1</span>],<span class="synConstant">0</span>:text_bbox[<span class="synConstant">2</span>]]
<span class="synComment"># æåæç»</span>
img = Image.fromarray(img_array)
draw = ImageDraw.Draw(img)
draw.text((<span class="synConstant">0</span>, <span class="synConstant">0</span>), message, font=font, fill=(<span class="synConstant">255</span>, <span class="synConstant">255</span>, <span class="synConstant">255</span>, <span class="synConstant">0</span>))
<span class="synComment"># marginãä»ä¸</span>
img=ImageOps.expand(img, border=margin)
<span class="synComment"># ç»åããããã</span>
fig = plt.figure()
ax1 = fig.add_subplot(<span class="synConstant">111</span>)
ax1.imshow(np.array(img))
ax1.axis(<span class="synConstant">"off"</span>)
plt.show()
</pre>
<p><figure class="figure-image figure-image-fotolife" title="æç»ãããæåç»å"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241225/20241225090018.png" width="515" height="371" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>æç»ãããæåç»å</figcaption></figure></p>
<p>ããã§ã¾ãã¯ä¸æºåãã§ãã¾ããã
<code>matplotlib_fontja</code>ã®å身ã§ãã<code>japanize-matplotlib</code>ã«ãã©ã³ãã®Pathãåå¾ããã¡ã½ãããçãããã®ã¯å®ã¯ç§ãªã®ã§ããªãã¨ãªãææ
¨æ·±ãç»åã§ãã</p>
<p>以éã¯ãããã§ä½ã£ã<code>PIL</code>ã®<code>img</code>ãä¸æã使ã£ã¦ããã¾ãã
ã</p>
<h1 id="digits">digits</h1>
<p>æ©æ¢°å¦ç¿ã¨ã³ã¸ãã¢ããã¼ã¿ãµã¤ã¨ã³ãã£ã¹ããæåã«æ±ããã¼ã¿ã»ããã¨ããã°ã<code>sklearn.datasets</code>ã§ãããã
ä¸ã§ãç»åç³»ã®æ©æ¢°å¦ç¿ã¢ãã«ã®å¦çãå¦ã¶ä¸ã§å¿
ãéããå®çªä¸ã®å®çªãã¼ã¿ã»ããã<code>digits</code>ã§ãã</p>
<pre class="code lang-python" data-lang="python" data-unlink><span class="synPreProc">from</span> sklearn <span class="synPreProc">import</span> datasets
digits = datasets.load_digits()
plt.imshow(digits.images[<span class="synConstant">0</span>])
<span class="synStatement">for</span> i <span class="synStatement">in</span> <span class="synIdentifier">range</span>(<span class="synConstant">15</span>):
plt.subplot(<span class="synConstant">3</span>,<span class="synConstant">5</span>,i+<span class="synConstant">1</span>)
plt.axis(<span class="synConstant">"off"</span>)
plt.title(<span class="synIdentifier">str</span>(digits.target[i]))
plt.imshow(digits.images[i],cmap=<span class="synConstant">"gray"</span>)
</pre>
<p><figure class="figure-image figure-image-fotolife" title="親ã®é¡ããè¦ãdigits"><div class="images-row mceNonEditable"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241225/20241225090021.png" width="408" height="412" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241225/20241225090023.png" width="516" height="387" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></div><figcaption>親ã®é¡ããè¦ãdigits</figcaption></figure></p>
<p>ããã§ãImage Recognitionã®å°é家ãçãçããã ãã<code>digits</code>ã®æç»ãæãè¿ããããªç»åãä½ã£ã¦ã¿ã¾ãã
å
ã®ãã´ç»åçæã¹ã¯ãªããã®<code>font_size</code>ã極éã¾ã§å°ãããã¦ãç»åå
¨ä½ãèããã¦çæããªããã¾ãã</p>
<p><figure class="figure-image figure-image-fotolife" title="font_size=12,margin=0ã§çæãããã´ç»å"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241225/20241225090026.png" width="515" height="378" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>font_size=12,margin=0ã§çæãããã´ç»å</figcaption></figure></p>
<p>è¯ãæãã§ããã
ããã»ã¼<code>digits</code>ã¨è¨ã£ã¦å·®ãæ¯ããªãã§ãããã
ã§ãããããããã®é è¦ã<code>digits</code>ãã«è¿ä»ãããããçæããç»åã<code>0.~16.</code>ã®å¤ã«å¤æãã¾ãã</p>
<pre class="code lang-python" data-lang="python" data-unlink>plt.imshow(np.array(img.convert(<span class="synConstant">'L'</span>))//<span class="synConstant">16</span>)
plt.show()
</pre>
<p><figure class="figure-image figure-image-fotolife" title="ãããåã¯ãã®æã®â¦ï¼"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241225/20241225090029.png" width="543" height="400" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>ãããåã¯ãã®æã®â¦ï¼</figcaption></figure></p>
<p>å®ç§ã«ããã®é è¦ã<code>digits</code>ãã§ããã</p>
<p>ãã¨ã¯ãããTã·ã£ããªã©ã«å°å·ãã¦ããã«ãã£ã¨ãã¦ããã°ãã解å度ãä½ããã¦ã¼ããã¦ããã®ããæããã®æ¶ã§ã¼ããã¦ããã®ãããã¯ãããããªããã¨ãã£ã声ãèããã¦ããäºééããªãã§ãããã</p>
<p>ã</p>
<h1 id="plot">plot</h1>
<p>æ©æ¢°å¦ç¿ã¨ã³ã¸ãã¢ããã¼ã¿ãµã¤ã¨ã³ãã£ã¹ãã¯ãç»åèªèãå°éã¨ããæ¹ã
ã ãã§ãªãäºã¯éã
æ¿ç¥ãã¦ãã¾ãã
Kaggleãªã©ãã¼ãã«ãã¼ã¿ããå
¥ã£ã人ã«ãåºããããããªããã«ãã£ãå¿
è¦ããã§ãã</p>
<p>ãã¼ãã«ãã¼ã¿ã¨ããã°Explanatory Data Analysis (EDA)ã
ãã¼ã¿ã®å¯è¦åãããããªãããç»åãçæãã¦ã¿ã¾ãã
ãã´ç»åçæã¹ã¯ãªããã§çæããç»åããã¹ã¯ã¨ãã¦ãæ£å¸å³ãå¯è¦åããã¦ã¿ã¾ãã</p>
<pre class="code lang-python" data-lang="python" data-unlink><span class="synPreProc">from</span> numpy.random <span class="synPreProc">import</span> randint
size = <span class="synConstant">5000</span>
mask = np.array(img.convert(<span class="synConstant">'L'</span>))==<span class="synConstant">0</span>
data = np.array([(size-x,y) <span class="synStatement">for</span> (x,y) <span class="synStatement">in</span> <span class="synIdentifier">zip</span>(
randint(<span class="synConstant">0</span>,mask.shape[<span class="synConstant">0</span>],size=size),
randint(<span class="synConstant">0</span>,mask.shape[<span class="synConstant">1</span>],size=size)) <span class="synStatement">if</span> mask[x,y]])
plt.scatter(data[:,<span class="synConstant">1</span>], data[:,<span class="synConstant">0</span>])
</pre>
<p><figure class="figure-image figure-image-fotolife" title="ã©ãããã©ãè¦ã¦ãæ£å¸å³ã§ããæ¬å½ã«ãããã¨ããããã¾ããã"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241225/20241225090032.png" width="560" height="412" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>ã©ãããã©ãè¦ã¦ãæ£å¸å³ã§ããæ¬å½ã«ãããã¨ããããã¾ããã</figcaption></figure></p>
<p>ã©ãè¦ã¦ã<code>plt.scatter</code>ã§ãã
EDAããããã¦ç²ããæãã³ã¼ãã¼ã飲ããã°ã«ããã«<code>plt.scatter</code>ãæããã¦ããã¤ã±ã¦ã空éãæ¼åºããããããªããã«ãã£ãä½ããããªç»åã§ãã</p>
<p>ã</p>
<p>ã¨ã¯ãããããã ãã§ã¯æ£å¸å³æã¯ã¾ã èãã§ãã
ç§ã¯åã©ãã®é ããããã«ããã®ã¨å
ããã®ã¨åããã®ã¯æ ¼å¥½è¯ããã¨ããæãã§çãã¦ãã¦ãããããåããã¦ã¿ããã¨æãã¾ãã</p>
<pre class="code lang-python" data-lang="python" data-unlink><span class="synPreProc">from</span> matplotlib.animation <span class="synPreProc">import</span> FuncAnimation, PillowWriter
size = <span class="synConstant">5000</span>
frames = <span class="synConstant">100</span>
min_data = <span class="synConstant">10</span>
mask = np.array(img.convert(<span class="synConstant">'L'</span>))==<span class="synConstant">0</span>
data = np.array([(size-x,y) <span class="synStatement">for</span> (x,y) <span class="synStatement">in</span> <span class="synIdentifier">zip</span>(
randint(<span class="synConstant">0</span>,mask.shape[<span class="synConstant">0</span>],size=size),
randint(<span class="synConstant">0</span>,mask.shape[<span class="synConstant">1</span>],size=size)) <span class="synStatement">if</span> mask[x,y]])
fig, ax = plt.subplots()
sc = ax.scatter(data[:min_data][:,<span class="synConstant">1</span>], data[:min_data][:,<span class="synConstant">0</span>])
<span class="synStatement">def</span> <span class="synIdentifier">update</span>(frame):
frame=frame+<span class="synConstant">1</span>
sc.set_offsets(np.c_[data[:min_data+(size//frames)*frame][:,<span class="synConstant">1</span>],
data[:min_data+(size//frames)*frame][:,<span class="synConstant">0</span>]])
<span class="synStatement">return</span> sc,
ani = FuncAnimation(fig, update, frames=frames, interval=<span class="synConstant">50</span>, blit=<span class="synIdentifier">True</span>)
ani.save(<span class="synConstant">"m3plot.gif"</span>, writer=PillowWriter(fps=<span class="synConstant">10</span>))
</pre>
<p><figure class="figure-image figure-image-fotolife" title="ã³ã¤ããåããâ¦ï¼.gif"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241225/20241225090035.gif" width="640" height="480" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>ã³ã¤ããåããâ¦ï¼.gif</figcaption></figure></p>
<p>åãã¾ããã
æé«ã§ãã
æè¡ã¤ãã³ãã®ãã¼ã¹çã§æµãã°ãç®ãå¼ãäºééããªãã®ã¢ãã¡ã¼ã·ã§ã³ãã§ãã¾ããã
ä»åã¯<code>randint</code>ã§çæãã¾ããããå³è©ä¸ããã®åå¸ãä½ã£ã¦å¢ãã表ç¾ãããããäºãåºæ¥ãããããã¾ããã
seabornã使ã£ãããã¦ããªã·ã£ã¬ã«ãã¦ãè¯ãããããã¾ãããã
æ¡ç¨ã§é¢ãã£ãã®ã¼ã¯ãªã¨ã³ã¸ãã¢ã«ã¡ã¼ã«ã§éã£ããããã°ããã£ã¨åã°ããã®ããã«ãªãã§ããã<a href="#f-55b0bb42" id="fn-55b0bb42" name="fn-55b0bb42" title="gifã ãã«">*2</a>ã</p>
<p>ã ã</p>
<h1 id="wordcloud">wordcloud</h1>
<p>æ©æ¢°å¦ç¿ã¨ã³ã¸ãã¢ããã¼ã¿ãµã¤ã¨ã³ãã£ã¹ãã«ã¯ãèªç¶è¨èªå¦çãéè¦ãªã¹ãã«ã§ãã
èªç¶è¨èªå¦çã®å¯è¦åã¨ããã°ã<code>wordcloud</code>ãçé ã«æããã¾ãã
Pythonã®<code>wordcloud</code>ã¢ã¸ã¥ã¼ã«ã«ã¯ãç»åã§maskããæ©è½ãããã¾ãã®ã§ããã¡ãã使ã£ã¦ããã¾ãããã</p>
<p>ããã¹ãã¯èªç¶è¨èªå¦çã§é å¼µã£ã¦ä½ã£ã¦ãè¯ãã®ã§ããã令åã¨ããã°å¤§LLMæ代ã
ChatGPTã«ä»¥ä¸ã®ãããªpromptãæãã¦åèªãªã¹ããä½ã£ã¦ãããã¾ããã</p>
<pre class="code text" data-lang="text" data-unlink>ã»ã¨ã ã¹ãªã¼æ ªå¼ä¼ç¤¾ã®ã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ããåèª1000åã§è¡¨ç¾ãã¦ãéè¤ã¯è¨±ãã¾ããåèªã¯CSVã§ã¡ããã ãã
ã»ã¨ã ã¹ãªã¼æ ªå¼ä¼ç¤¾ãåèª1000åã§è¡¨ç¾ãã¦ãéè¤ã¯è¨±ãã¾ããåèªã¯CSVã§ã¡ããã ãã
ã»ã¨ã ã¹ãªã¼æ ªå¼ä¼ç¤¾ã®ã¨ã³ã¸ãã¢ã使ãæè¡ãåèª1000åã§è¡¨ç¾ãã¦ãéè¤ã¯è¨±ãã¾ããåèªã¯CSVã§ã¡ããã ãã</pre>
<p>ä¸è¨3ã¤ã®promptã§çæããCSVã空ç½åºåãã®æååã«ãã¦ãããçæã§ãã</p>
<pre class="code lang-python" data-lang="python" data-unlink><span class="synPreProc">from</span> wordcloud <span class="synPreProc">import</span> WordCloud
wc = WordCloud(
<span class="synComment"># contour_width=1,</span>
max_font_size=<span class="synConstant">400</span>,
font_path=matplotlib_fontja.get_font_ttf_path(),
background_color=<span class="synConstant">"white"</span>,
mask=np.array(img))
wc.generate(text)
_, ax = plt.subplots(figsize=(<span class="synConstant">14</span>,<span class="synConstant">14</span>))
ax.imshow(wc)
ax.axis(<span class="synConstant">"off"</span>)
plt.show()
</pre>
<p><figure class="figure-image figure-image-fotolife" title="countour_widthãã/ãªãã®WordCloudç»å"><div class="images-row mceNonEditable"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241225/20241225090046.png" width="800" height="561" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241225/20241225090050.png" width="800" height="561" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></div><figcaption>countour_widthãã/ãªãã®WordCloudç»å</figcaption></figure></p>
<p>è¯ãæãã§ããã
éåæãªã®ã§ãããç§ã¯WordCloudã®æ¥æ¬èªã®ããã¹ãé
ç½®ã®å¦çãæ¸ãã¦ããææãããã¾ãã
ãã®é ãããæ¥æ¬èªWordCloudã«ã¯ããã©ã³ãã®é¢ä¿ã§è±èªã«æ¯ã¹ã¦ééãåºæ¥ããããã¨ãã課é¡ãããã¾ãã
èªç¤¾ã®ãã¶ã¤ãã¼ã¨ç¸è«ããªããããã©ã³ãã<code>max_font_size</code>ãå¤æ´ãããªã©ãã¦ããã«ãã£ã§ä½¿ããç»åãä½ã£ã¦ããã®ãè¯ãã®ã§ã¯ãªãããªã¨æãã¾ãã</p>
<p>æ¬å½ã«è¯ããã©ã³ããè¦ã¤ããã¨ããã§ãã<a href="#f-1c3524ab" id="fn-1c3524ab" name="fn-1c3524ab" title="ãã©ã³ãã ãã«">*3</a>ã</p>
<h1 id="ãããã«">ãããã«</h1>
<p>ã¨ããããã§ãããã«ãã£ããé¡ã«ãããããªç»åãä½ã£ã¦ã¿ã¾ããã¨ããã話ã§ããã
ããã§2025å¹´ãAIåéã®ã¤ãã³ããçãä¸ããäºééããªãã§ããï¼</p>
<p><figure class="figure-image figure-image-fotolife" title="ãããå¹´ãï¼"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241225/20241225090054.png" width="543" height="189" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>ãããå¹´ãï¼</figcaption></figure></p>
<p>ãã¦ãã¯ãªã¹ãã¹ã«åãã¦é²ãã§ãã<a href="https://qiita.com/advent-calendar/2024/m3">ã¨ã ã¹ãªã¼ã¢ããã³ãã«ã¬ã³ãã¼2024</a>ã¯ãããã§ããã§ããããï¼
ã¨ã ã¹ãªã¼ã¯ã¨ã³ã¸ãã¢ãè¥å¹²100åã¡ãã£ã¨ãªãããã®ã¼ã¯ã§ã¹ãã¼ããªã«ã«ãã£ã¼ã§æ¥å¹´ã大ããå»çäºæ¥ã«ãã£ã¬ã³ã¸ãã¦ããã¾ãã</p>
<p>çæ§ã®å¿æ´ãã£ã¦ããã ã¨æã£ã¦ããã¾ãã®ã§ãæ¥å¹´ãä½åãããããé¡ããã¾ãï¼</p>
<h2 id="We-are-hiring-">We are hiring !!</h2>
<p>ä»åã¯AIåéã®ä¸ã§ãç»åããã¼ãã«ãã¼ã¿ãèªç¶è¨èªå¦çãæèãã¦è¨äºãæ¸ãã¦ã¿ã¾ããã
ã¨ã ã¹ãªã¼ã§ã¯ãããã以å¤ã®AIæè¡ã®æ´»ç¨ã¯ãã¡ããã®ãã¨ãå»å¸«ã®9å²ãä¼å¡ã®ãã©ãããã©ã¼ã ãm3.comããæ¥æ¬No.1ã®é»åã«ã«ãããã¸ã«ã«ããç
é¢ã®å¾
ã¡æéã0ã«ããDXã¢ããªããã¸ã¹ãããªã©ãå¤ãã®ãããã¯ããéçºãã¦ãã¾ãã</p>
<p>ä¸ç·ã«ãã£ã¬ã³ã¸ãã¦ãããã®ã¼ã¯ã§ã¹ãã¼ããªä»²éãéæåéãã¦ãã¾ãã
æ°åãä¸éãã«ã¸ã¥ã¢ã«é¢è«ãã¤ã³ã¿ã¼ã³ã§ç§ã¨æ¡æï¼
2025å¹´ã¯ã¨ã ã¹ãªã¼ã¸ï¼</p>
<h3 id="ã¨ã³ã¸ãã¢æ¡ç¨ãã¼ã¸ã¯ãã¡ã">ã¨ã³ã¸ãã¢æ¡ç¨ãã¼ã¸ã¯ãã¡ã</h3>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjobs.m3.com%2Fengineer%2F" title="ã¨ã³ã¸ãã¢æ¡ç¨ãµã¤ãï½æ¡ç¨æ
å ± | å»çÃãã¯ããã¸ã¼ã®å¯è½æ§ã¯ç¡é大" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jobs.m3.com/engineer/">jobs.m3.com</a></cite></p>
<h3 id="ã«ã¸ã¥ã¢ã«é¢è«ããæ°è»½ã«ã©ãã">ã«ã¸ã¥ã¢ã«é¢è«ããæ°è»½ã«ã©ãã</h3>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjobs.m3.com%2Fengineer%2Fcasual-session%2F" title="ã¨ã³ã¸ãã¢æ¡ç¨ãµã¤ãï½æ¡ç¨æ
å ± | å»çÃãã¯ããã¸ã¼ã®å¯è½æ§ã¯ç¡é大" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jobs.m3.com/engineer/casual-session/">jobs.m3.com</a></cite></p>
<h3 id="ã¤ã³ã¿ã¼ã³ã常æåéãã¦ãã¾ã">ã¤ã³ã¿ã¼ã³ã常æåéãã¦ãã¾ã</h3>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fopen.talentio.com%2Fr%2F1%2Fc%2Fm3%2Fhomes%2F4354" title="ãæ°åãã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ã åéä¸è¦§ / ã¨ã ã¹ãªã¼æ ªå¼ä¼ç¤¾" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://open.talentio.com/r/1/c/m3/homes/4354">open.talentio.com</a></cite></p>
<div class="footnote">
<p class="footnote"><a href="#fn-e9a7c20e" id="f-e9a7c20e" name="f-e9a7c20e" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">ããããã ãã«</span></p>
<p class="footnote"><a href="#fn-55b0bb42" id="f-55b0bb42" name="f-55b0bb42" class="footnote-number">*2</a><span class="footnote-delimiter">:</span><span class="footnote-text">gifã ãã«</span></p>
<p class="footnote"><a href="#fn-1c3524ab" id="f-1c3524ab" name="f-1c3524ab" class="footnote-number">*3</a><span class="footnote-delimiter">:</span><span class="footnote-text">ãã©ã³ãã ãã«</span></p>
</div>
vaaaaaanquish
M3ã«ãããGitHub Copilotæ´»ç¨ç¶æ³
hatenablog://entry/6802418398314106228
2024-12-24T16:00:00+09:00
2024-12-26T04:21:19+09:00 åæµ·éãã¼ãªã³ã°ã«ã¦è¨ªããéä»å島 ã¯ããã« ãã£ãã£ãã¼ ãããºãï¼ãããºãï¼ãããºãã¼ï¼ æææçã«ãªãã¨ãªããããªæ¨æ¶ããã¦ã¿ã @bloody_snow ã§ãã M3ã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ãã®2代ç®VPoEãã¤ã¨ãã @vaaaaanquish ã«äº¤ä»£ãã¦ããã¯ã M3 Technologies ã«ã¦M3ã®ã°ã«ã¼ãä¼ç¤¾ãã¡ã¤ã³ã§æ
å½ãã¦ãã¾ããM3ã«é¢ãã¦ã¯åå¥ã®ãµã¼ãã¹éçºã¨ãããããã¯GitHub CopilotãChatGPT TeamãGitHub Enterpriseãæ¯è¼çé«æ§è½ãªMacBookProã®å°å
¥ãAWSã®æè²åè¬ãªã©å
¨ä½ã®çç£æ§ã¸ã®åãçµã¿ãå¤ããªã£ã¦ãã¾ãã â¦
<p><figure class="figure-image figure-image-fotolife" title="åæµ·éãã¼ãªã³ã°ã«ã¦è¨ªããéä»å島"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241224/20241224160004.jpg" width="800" height="600" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>åæµ·éãã¼ãªã³ã°ã«ã¦è¨ªããéä»å島</figcaption></figure></p>
<h2 id="ã¯ããã«">ã¯ããã«</h2>
<p>ãã£ãã£ãã¼</p>
<p>ãããºãï¼ãããºãï¼ãããºãã¼ï¼</p>
<p>æææçã«ãªãã¨ãªããããªæ¨æ¶ããã¦ã¿ã @bloody_snow ã§ãã
M3ã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ãã®2代ç®VPoEãã¤ã¨ãã @vaaaaanquish ã«äº¤ä»£ãã¦ããã¯ã
<a href="https://www.m3t.co.jp/">M3 Technologies</a>
ã«ã¦M3ã®ã°ã«ã¼ãä¼ç¤¾ãã¡ã¤ã³ã§æ
å½ãã¦ãã¾ããM3ã«é¢ãã¦ã¯åå¥ã®ãµã¼ãã¹éçºã¨ãããããã¯GitHub CopilotãChatGPT TeamãGitHub Enterpriseãæ¯è¼çé«æ§è½ãªMacBookProã®å°å
¥ãAWSã®æè²åè¬ãªã©å
¨ä½ã®çç£æ§ã¸ã®åãçµã¿ãå¤ããªã£ã¦ãã¾ãã</p>
<ul class="table-of-contents">
<li><a href="#ã¯ããã«">ã¯ããã«</a></li>
<li><a href="#å©ç¨ç¶æ³ã®æ¦è¦">å©ç¨ç¶æ³ã®æ¦è¦</a></li>
<li><a href="#è¨èªå¥">è¨èªå¥</a></li>
<li><a href="#ã¨ãã£ã¿å¥">ã¨ãã£ã¿å¥</a></li>
<li><a href="#Copilot-Chat">Copilot Chat</a></li>
<li><a href="#ãããã«">ãããã«</a></li>
<li><a href="#We-are-hiring">We are hiring!</a></li>
</ul>
<h2 id="å©ç¨ç¶æ³ã®æ¦è¦">å©ç¨ç¶æ³ã®æ¦è¦</h2>
<p>GitHub Copilotã¨ã¯ãªãããï¼ãä¸éä¸è¬çãªå©ç¨ç¶æ³ãªã©ã¯å²æããã¦ããã ãã¾ãã</p>
<p>GitHubã«ç¨æããã¦ãã</p>
<p><a href="https://docs.github.com/ja/rest/copilot/copilot-usage">GitHub Copilot の使用状況メトリックの REST API エンドポイント - GitHub Docs</a></p>
<p>ãç¨ããã¨çµç¹ã«ããã¦ã®GitHub Copilotã®å©ç¨ç¶æ³ã確èªã§ãã¾ããåå¾ã§ããJSONãèªåã§å¯è¦åãã¦ãããã®ã§ããã</p>
<p><a href="https://github.com/github-copilot-resources/copilot-metrics-viewer">GitHub - github-copilot-resources/copilot-metrics-viewer: Tool to visualize the Copilot metrics provided via the Copilot Business Metrics API (current in public beta)</a></p>
<p>viewerãã³ãã¥ããã£ã«ãã£ã¦ç¨æããã¦ãããã®ãããã¾ããã®ã§ããã¡ãã使ããã¦ããã ãã¾ããããã¼ã¿ã®åå¾æéã¯2024/10/21ã11/17ã®28æ¥éã®ãã¼ã¿ã¨ãªãã¾ããã§ã¯ãå®éã®æ¦è¦ãä¸è¨ã«ç¤ºãã¾ãã</p>
<ul>
<li>Accepted Rate: 29.64%</li>
<li>Suggestions: 198,539</li>
<li>Accepted Prompts: 58,846</li>
<li>Accepted Code Lines: 77,480</li>
<li>å¹³æ¥ã®å©ç¨è
æ°: 90ã100</li>
<li>å©ç¨è¨èª: Python, Kotlin, Go, TS, Ruby, TSReact, SQL, Vue, Yaml, Terraformã®é çª</li>
<li>å©ç¨ã¨ãã£ã¿: VSCode, IntelliJ, Emacs, neovim, Xcodeã®é çª</li>
</ul>
<p><figure class="figure-image figure-image-fotolife" title="Total Lines Suggested | Total Lines Accepted"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241224/20241224160007.png" width="800" height="435" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>Total Lines Suggested | Total Lines Accepted</figcaption></figure></p>
<h2 id="è¨èªå¥">è¨èªå¥</h2>
<p>æ©æ¢°å¦ç¿ããããå¦çã§Pythonãå¤ã使ããã¦ããããå©ç¨çã1ä½ã¨ãªãã¾ãããããã¯ã¨ã³ãã§ã¯Kotlinãgoãå¤ã使ããã¦ããããã2ä½3ä½ã¨ç¶ãã¾ãããtypescript/typescriptreactã®åºå¥ã¯å°ãã¯ã£ããã¨ã¯ãã¾ããããããã³ãã¨ã³ããããã¯ã¨ã³ãã§ã®å©ç¨ãããä¸ä½ã«å
¥è³ãã¦ãã¾ãããã®ä»SQLãYamlã¨Terraformãªã©ã®è¨å®ãã¡ã¤ã«ãå
¥ã£ã¦ãã¦ãã¾ããã</p>
<p><figure class="figure-image figure-image-fotolife" title="è¨èªå¥"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241224/20241224160010.png" width="800" height="650" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>è¨èªå¥</figcaption></figure></p>
<h2 id="ã¨ãã£ã¿å¥">ã¨ãã£ã¿å¥</h2>
<p>ã¨ãã£ã¿ã«é¢ãã¦ã¯ããã¾ã§ã®å¤æ§æ§ã¯ããã¾ããã§ãããVSCodeãé常ã«å¼·ããããã«IntelliJãç¶ãã¨ããçµæã§ãããå°ãæå¤ã ã£ãã®ã¯Emacsã3ä½ã¨Vimããããããã¨ã§ããç§èªèº«ãEmacsã¦ã¼ã¶ã¼ã¨ãã¦ãã©ã¤ãã¼ãã§Rustãæ¸ãæãªã©ã«ã¤ãã£ã¦ããããã¾ãã®ã§å¬ããçµæã§ãã</p>
<p><figure class="figure-image figure-image-fotolife" title="ã¨ãã£ã¿å¥"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241224/20241224160014.png" width="800" height="521" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>ã¨ãã£ã¿å¥</figcaption></figure></p>
<h2 id="Copilot-Chat">Copilot Chat</h2>
<p>Copilot Chatã«é¢ãã¦ãCopilotå©ç¨è
ã®ç´åæ°ãããã®40ã50åã»ã©ã«ä½¿ããã¦ãã¾ãããåæã¯VSCodeã®ã¿å¯¾å¿ã ã£ãã¨è¨æ¶ãã¦ããããã¾ãåºã使ãããªãã£ãå°è±¡ã§ãããã対å¿ç¯å²ãå¢ãå¹
åºã使ãããããã«ãªã£ã¦ãã¦ãã¾ãã</p>
<p><figure class="figure-image figure-image-fotolife" title="Copilot Chat"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241224/20241224160017.png" width="800" height="529" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>Copilot Chat</figcaption></figure></p>
<p><figure class="figure-image figure-image-fotolife" title="Total Active Copilot Chat Users"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241224/20241224160021.png" width="800" height="406" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>Total Active Copilot Chat Users</figcaption></figure></p>
<h2 id="ãããã«">ãããã«</h2>
<p>M3ã«ãããGitHub Copilotã®æ´»ç¨ç¶æ³ãç´¹ä»ããã¦ããã ãã¾ãããM3ã¯å»çæ¥çã«ããã¦DXããããããã¨ãã¦ããä¼ç¤¾ã§ããITã¨ã³ã¸ãã¢ã¨ãã¦èªèº«ã®æ¥ã
ã®æ´»åãçå
ãã¦DXããããã¦ãããã¾ããä»å¾ããã便å©ãªãããã¯ã(ChatGPT, Dify, v0, etc)ãã©ãã©ãæ¡ç¨ãã¦é²æ©ããããã°ã§ãç´¹ä»ãã¦ãããã°ã¨æã£ã¦ãã¾ãã</p>
<h2 id="We-are-hiring">We are hiring!</h2>
<p>ã¨ã ã¹ãªã¼ããã³ã¨ã ã¹ãªãã¯ããã¸ã¼ãºã§ã¯ãã®ã¼ã¯ã§ã¹ãã¼ããªã¨ã³ã¸ãã¢ãä¸å¿ã«ãå¤æ°ã®ãã£ã¬ã³ã¸ã«ææ¢ã«ã¢ã¿ãã¯ãããããã¯ãéçºã¡ã³ãã¼ã絶è³åéä¸ã§ãã</p>
<p>ã¨ã³ã¸ãã¢ãQAããã¶ã¤ãã¼ããããã¯ãããã¼ã¸ã£ã¼ã©ã®è·ç¨®ã§ãæå¸æ°ãå¤ãããããã¯ãéçºã®åºç¤ç¥èãç¿å¾ããªããã社ä¼ã«ã¤ã³ãã¯ãã®ããåçæ§ã®é«ããããã¯ããçã¿åºãçµé¨ããã¼ã ã©ã³ã®æã¡æ¹ãå¦ã¹ããå¦ã¹ãè¯ãç°å¢ã ã¨æãã¾ãã</p>
<p>ãèå³ã®ããæ¹ã¯ãä¸è¨ã®ãµã¤ãããæ¯éã«ã¸ã¥ã¢ã«é¢è«çããç³ãè¾¼ã¿ãã ããï¼</p>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjobs.m3.com%2Fengineer%2F" title="ã¨ã³ã¸ãã¢æ¡ç¨ãµã¤ãï½æ¡ç¨æ
å ± | å»çÃãã¯ããã¸ã¼ã®å¯è½æ§ã¯ç¡é大" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jobs.m3.com/engineer/">jobs.m3.com</a></cite></p>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.m3t.co.jp%2F" title="M3 Technologies" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://www.m3t.co.jp/">www.m3t.co.jp</a></cite></p>
bloodysnowx
2024å¹´ãã¨ã ã¹ãªã¼ã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ãã§è¡ã£ãçµç¹çã¹ããããã§ã³ã¸5é¸ã
hatenablog://entry/6802418398313607477
2024-12-24T10:14:56+09:00
2024-12-24T10:18:18+09:00 çããããã«ã¡ã¯ãããã°ãã¯ãã¹ãã¼ãã¼ã¯ã®ãã¯ã¿ã¼ã³*1ããã§ã«æã£ã¦ããã«ãããããããSOTOã®ããã*2ãè²·ã£ã¦ãã¾ã£ãåç· å½¹CTOå
¼VPoPã®å±±å´ã§ãã ãã£ãããªã®ã§éããã¬ãã¥ã¼ãã¦ããã¨ãSOTOã®ãããã¯ã¬ã¹ãå
å¡«ãã¦æã¡æ©ããå°ç¨ã¿ã³ã¯ãããã®ã¯ä¾¿å©ãªã®ã§ãããæå¤ã¨å®¹éãå°ãããããã¥ã¢ã«éãé£ç¶çç¼æéã¯1ã2æéã¨æå¤ã¨çãã§ãããã¡ãããããããã¹ãã¼ãã¼ã¯ã®ãã¯ã¿ã¼ã³åæ§ãOD缶ã«ç´æ¥æ¥ç¶ããã°ä¸æ©ä»¥ä¸é£ç¶çç¼ã§ããã¨æãã®ã§ãã©ã³ãå´ã«åé¡ã¯ããã¾ãããããããã°ãããããã¨ãã®ããã«ãã£ã³ãã³ã°ã ã¼ã³ã®BKTC-28ã¨ããOD缶äºæã¬ã¹ã¿ã³ã¯ãè²·ã£ã¦ããããªãâ¦
<p>çããããã«ã¡ã¯ãããã°ãã¯ãã¹ãã¼ãã¼ã¯ã®ãã¯ã¿ã¼ã³<a href="#f-08390cf3" id="fn-08390cf3" name="fn-08390cf3" title="https://ec.snowpeak.co.jp/snowpeak/ja/%E3%82%AD%E3%83%A3%E3%83%B3%E3%83%97/%E3%83%A9%E3%83%B3%E3%82%BF%E3%83%B3%28%E3%82%AC%E3%82%B9%E3%83%BBLED%29%E3%83%BB%E3%83%A9%E3%82%A4%E3%83%88/%E3%83%AA%E3%83%88%E3%83%AB%E3%83%A9%E3%83%B3%E3%83%97-%E3%83%8E%E3%82%AF%E3%82%BF%E3%83%BC%E3%83%B3/p/18758">*1</a>ããã§ã«æã£ã¦ããã«ãããããããSOTOã®ããã<a href="#f-3060e5c5" id="fn-3060e5c5" name="fn-3060e5c5" title="https://soto.shinfuji.co.jp/products/sod-260/">*2</a>ãè²·ã£ã¦ãã¾ã£ãåç· å½¹CTOå
¼VPoPã®å±±å´ã§ãã</p>
<p>ãã£ãããªã®ã§éããã¬ãã¥ã¼ãã¦ããã¨ãSOTOã®ãããã¯ã¬ã¹ãå
å¡«ãã¦æã¡æ©ããå°ç¨ã¿ã³ã¯ãããã®ã¯ä¾¿å©ãªã®ã§ãããæå¤ã¨å®¹éãå°ãããããã¥ã¢ã«éãé£ç¶çç¼æéã¯1ã2æéã¨æå¤ã¨çãã§ãããã¡ãããããããã¹ãã¼ãã¼ã¯ã®ãã¯ã¿ã¼ã³åæ§ãOD缶ã«ç´æ¥æ¥ç¶ããã°ä¸æ©ä»¥ä¸é£ç¶çç¼ã§ããã¨æãã®ã§ãã©ã³ãå´ã«åé¡ã¯ããã¾ãããããããã°ãããããã¨ãã®ããã«ãã£ã³ãã³ã°ã ã¼ã³ã®BKTC-28ã¨ããOD缶äºæã¬ã¹ã¿ã³ã¯ãè²·ã£ã¦ããããªãã¨æã£ã¦å¼ã£å¼µãåºãããããããã¹ããã£ãããæ大çç¼æéã大ãã延é·ã§ãã¾ãããçããåèã«ãã¦ãã ããã</p>
<p>æ¬ããã°ã¯<a href="https://qiita.com/advent-calendar/2024/m3">ã¨ã ã¹ãªã¼ Advent Calendar 2024</a>ã®24æ¥ç®ã®è¨äºã§ãã</p>
<p>ã¡ãªã¿ã«æ¨æ¥ã¯AIã»æ©æ¢°å¦ç¿ãã¼ã ã®ä¸æä¼å¹ï¼<a href="https://x.com/inakam00">@inakam00</a>ï¼ã®ç´ æ´ãããè¨äºã§ããï¼ã¨ã ã¹ãªã¼ã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ãã®æåãããã¾ã¨ã¾ã£ã¦ããã¾ãã®ã§ãã¾ã èªãã§ããªã人ã¯æ¯éãä¸èªãã ãã^^ã</p>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.m3tech.blog%2Fentry%2Fbest-mr-2024" title="AIã»æ©æ¢°å¦ç¿ãã¼ã ãã¹ãMR(Merge Request)決å®æ¦ 2024 - ã¨ã ã¹ãªã¼ããã¯ããã°" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://www.m3tech.blog/entry/best-mr-2024">www.m3tech.blog</a></cite></p>
<p><figure class="figure-image figure-image-fotolife" title="å·¦ãSOTOã®ããã+ç´æ£ã¬ã¹ã¿ã³ã¯ãå³ãã¹ãã¼ãã¼ã¯ã®ãã¯ã¿ã¼ã³+ãã£ã³ãã³ã°ã ã¼ã³ã®BKTC-28ã¬ã¹ã¿ã³ã¯ã§ããå§åçã«BKTC-28ã®ã»ããé£ç¶çç¼æéãé·ãã§ãããã¡ããããããã«BKTC-28ãè£
çãããã¨ãå¯è½ã§ãã"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241224/20241224101458.jpg" width="800" height="600" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>å·¦ãSOTOã®ããã+ç´æ£ã¬ã¹ã¿ã³ã¯ãå³ãã¹ãã¼ãã¼ã¯ã®ãã¯ã¿ã¼ã³+ãã£ã³ãã³ã°ã ã¼ã³ã®BKTC-28ã¬ã¹ã¿ã³ã¯ã§ããå§åçã«BKTC-28ã®ã»ããé£ç¶çç¼æéãé·ãã§ãããã¡ããããããã«BKTC-28ãè£
çãããã¨ãå¯è½ã§ãã</figcaption></figure></p>
<ul class="table-of-contents">
<li><a href="#ã¯ããã«">ã¯ããã«</a></li>
<li><a href="#ã°ããããã¨VPoEæ²³åã«æ¨©éå§è²">â ã°ããããã¨VPoEæ²³åã«æ¨©éå§è²</a></li>
<li><a href="#ã¼ãã©ã«ããã¼ã¸ã£ã¼8人ä½å¶ã¸ã®ç§»è¡">â¡ã¼ãã©ã«ããã¼ã¸ã£ã¼8人ä½å¶ã¸ã®ç§»è¡</a></li>
<li><a href="#主åäºæ¥ã¨AIæ©æ¢°å¦ç¿ãã¼ã ã®èå">â¢ä¸»åäºæ¥ã¨AIã»æ©æ¢°å¦ç¿ãã¼ã ã®èå</a></li>
<li><a href="#å
¨å¡QAä½å¶ã¸ã®ç§»è¡">â£å
¨å¡QAä½å¶ã¸ã®ç§»è¡</a></li>
<li><a href="#ãããã¯ãããã¸ã¡ã³ãçµç¹ã®å¼·å">â¤ãããã¯ãããã¸ã¡ã³ãçµç¹ã®å¼·å</a></li>
<li><a href="#ã¾ã¨ã">ã¾ã¨ã</a></li>
<li><a href="#We-are-hiring">We are hiring!</a></li>
</ul>
<h3 id="ã¯ããã«">ã¯ããã«</h3>
<p>æ¯å¹´ãã¢ããã³ãã«ã¬ã³ãã¼ã§ã¯ã¨ã ã¹ãªã¼ã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ãã®çµç¹çãã£ã¬ã³ã¸ãã¾ã¨ãã¦ãã¾ãã</p>
<p>2024å¹´4æã«ã¯ãç§ã代表åç· å½¹ãåããã¨ã ã¹ãªã¼ãã¯ããã¸ã¼ãºæ ªå¼ä¼ç¤¾<a href="#f-1b5bde33" id="fn-1b5bde33" name="fn-1b5bde33" title="https://www.m3t.co.jp">*3</a>ã®ç«ã¡ä¸ããªã©å¤§ããªãã£ã¬ã³ã¸ããããã¨ã ã¹ãªã¼æ¬ä½ã®å¼·åã¨ã°ã«ã¼ãä¼ç¤¾ã®æ¯æ´ããã©ã³ã¹ããé²ãã¦ãã1å¹´ã¨ãªãã¾ããã</p>
<p>ã¨ã ã¹ãªã¼ãã¯ããã¸ã¼ãºæ ªå¼ä¼ç¤¾ã¨ã°ã«ã¼ãä¼ç¤¾ã®æ¯æ´ã¯2025å¹´ã®å¤§ããå éãã¦ãããã¨ã«ãªãã¨æãã¾ãã®ã§ãæ¥å¹´ã®ã¢ããã³ãã«ã¬ã³ãã¼ã«åã£ã¦ãããã¨ã«ãã¦ãæ¬æ¥ã¯ã¨ã ã¹ãªã¼æ¬ä½ã®å¼·åã«ã¤ãã¦ã2024å¹´ãã¨ã ã¹ãªã¼ã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ãã§è¡ã£ãçµç¹çã¹ããããã§ã³ã¸5é¸ããã¨é¡ãã¦èª¬æãã¦ããããã¨æãã¾ãã</p>
<p>æ¨å¹´ã®è¨äºã¯ãã¡ãã</p>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.m3tech.blog%2Fentry%2Fcto-retrospective-2023" title="2023å¹´ã¯3段éã§ã·ãããã§ã³ã¸ï¼2024å¹´ã¯ããã«å éãã¦ãã£ã¦ããã¾ãï¼ - ã¨ã ã¹ãªã¼ããã¯ããã°" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://www.m3tech.blog/entry/cto-retrospective-2023">www.m3tech.blog</a></cite></p>
<p>ã¨ã ã¹ãªã¼ãã¯ããã¸ã¼ãºæ ªå¼ä¼ç¤¾è¨ç«ã®ãã¬ã¹ãªãªã¼ã¹ã¯ãã¡ãã</p>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fprtimes.jp%2Fmain%2Fhtml%2Frd%2Fp%2F000000009.000125568.html" title="ã°ã«ã¼ãä¼ç¤¾æ¯æ´ãç®çã¨ããéçºæ¯æ´å°éä¼ç¤¾ï½ã¨ã ã¹ãªã¼ãã¯ããã¸ã¼ãºæ ªå¼ä¼ç¤¾ãè¨ç«" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://prtimes.jp/main/html/rd/p/000000009.000125568.html">prtimes.jp</a></cite></p>
<h3 id="ã°ããããã¨VPoEæ²³åã«æ¨©éå§è²">â ã°ããããã¨VPoEæ²³åã«æ¨©éå§è²</h3>
<p>ã¾ãã¯ãã°ããããã¨VPoEæ²³åã¸ã®æ¨©éå§è²ãé²ãã¾ããã
æ²³åããã¯2023å¹´5æã«ã¨ã ã¹ãªã¼ã«VPoEã¨ãã¦æ»ã£ã¦ãã¦ãããã®ã§ãããçããã御åç¥ã®éããç¾å¨é¢é£åæã§å¤§æ´»èºé ãã¦ããã¾ãã</p>
<p>2024å¹´ã¯ä¸éæ¡ç¨æ¦ç¥ãæ°åæ¡ç¨æ¦ç¥ãå種ã¤ãã³ãç»å£ãå種ã¤ãã³ãã¹ãã³ãµã¼ãããã¯ããã°ã¬ãã¥ã¼ãããã¯ãã£ã³ãã«ã¬ãã¥ã¼ãå°å¸¸ã§ã¯ãªã1on1ã®å®æ½ãªã©ãVPoEæ¥ã®ã»ã¼å
¨ã¦ãèªå¾çã«ããªãã¦é ãã¾ããã</p>
<p>å½¼ã®ãé°ã§ãã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ãã次ã®ã¹ãããã«å¤é©ã§ãããã¨ã¯è¨ãã¾ã§ãããã¾ãããæ¬å½ã«ãã¤ããããã¨ããããã¾ãã</p>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.m3tech.blog%2Fentry%2Fthe-reason-why-vaaaaanquish-came-back-as-VPoE-in-M3" title="ã°ããããã¨æ²³åä¿å
¸ããã«ã¨ã ã¹ãªã¼3代ç®VPoEã¨ãã¦æ»ã£ã¦ãã¦ããã£ãçç± - ã¨ã ã¹ãªã¼ããã¯ããã°" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://www.m3tech.blog/entry/the-reason-why-vaaaaanquish-came-back-as-VPoE-in-M3">www.m3tech.blog</a></cite></p>
<h3 id="ã¼ãã©ã«ããã¼ã¸ã£ã¼8人ä½å¶ã¸ã®ç§»è¡">â¡ã¼ãã©ã«ããã¼ã¸ã£ã¼8人ä½å¶ã¸ã®ç§»è¡</h3>
<p>2024å¹´ã¹ã¿ã¼ãæç¹ã§ã¯ãã¨ã ã¹ãªã¼ã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ãã®ã¼ãã©ã«ããã¼ã¸ã£ã¼ï¼æ§ã°ã«ã¼ããªã¼ãã¼ï¼<a href="#f-a59f3487" id="fn-a59f3487" name="fn-a59f3487" title="2024å¹´10æãããã¨ã ã¹ãªã¼ã®ãã¹ã¦ã®é¨éã§é¨éé·ã®å¼ã³åãã°ã«ã¼ããªã¼ãã¼ããã¼ãã©ã«ããã¼ã¸ã£ã¼ã«å¤æ´ã¨ãªãã¾ããã">*4</a>ã¯ç§ãæ²³åã岩ä½ãé«å³¶ã®4åã§ããã</p>
<p>2024å¹´4æã®ä½å¶å¤æ´ã§å¤§å£ãæ¨ç°ã窪ç°ã®3åãææ¢ãç¶ãã¦10æã«æ¨ªæ¬ãææ¢ã¨ãªããç¾å¨ã¯ã¼ãã©ã«ããã¼ã¸ã£ã¼8åä½å¶ã¸ã¨é²åãã¦ãã¾ãã</p>
<p>ããããçµæçã«8åä¸6åãAIã»æ©æ¢°å¦ç¿ãã¼ã ã®åºèº«ã¨ãªããä»å¾ã®AIæ代ã«åãã¦ãæºåãæ´ã£ãç¶æ³ã§ãã</p>
<p><iframe id="talk_frame_1254733" class="speakerdeck-iframe" src="//speakerdeck.com/player/353bdaef98bc4b45bc2c13e7b2866ebb" width="710" height="399" style="aspect-ratio:710/399; border:0; padding:0; margin:0; background:transparent;" frameborder="0" allowtransparency="true" allowfullscreen="allowfullscreen"></iframe> <cite class="hatena-citation"><a href="https://speakerdeck.com/m3_engineering/introduction-of-m3-all-teams?slide=17">speakerdeck.com</a></cite></p>
<h3 id="主åäºæ¥ã¨AIæ©æ¢°å¦ç¿ãã¼ã ã®èå">â¢ä¸»åäºæ¥ã¨AIã»æ©æ¢°å¦ç¿ãã¼ã ã®èå</h3>
<p>ã¨ãªãã°ã主åäºæ¥ã¸ã®ãããªããã³å
¥ããå§ããªããã°ãªãã¾ããã</p>
<p>2024å¹´10æãããã¨ã ã¹ãªã¼ã®ä¸»åäºæ¥ãå¶ãæ
å½ã¼ãã©ã«ããã¼ã¸ã£ã¼<a href="#f-5682d7e9" id="fn-5682d7e9" name="fn-5682d7e9" title="ã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ãã®ã¼ãã©ã«ããã¼ã¸ã£ã¼ã¯å
¨å¡ã§è²¬ä»»ãæã£ã¦ã°ã«ã¼ãå
¨ä½ãå
±åéå¶ãã¤ã¤ãããããæ
å½ã®ãã¼ã ãæã£ã¦ãã¾ãã">*5</a>ãæ¨ç°ã大å£ä½å¶ã«ã¢ãããã¼ããã¦ãæ¢åéçºãã¼ã ã¸ã®AIã»æ©æ¢°å¦ç¿å°å
¥ãå¼·åãã¦ãã¾ãã</p>
<p>2025å¹´ã¯ãã®åãçµã¿ãããã«å éããã¦ããäºå®ã§ãã</p>
<p><iframe id="talk_frame_1135339" class="speakerdeck-iframe" src="//speakerdeck.com/player/98d2854b494f474b88cdf2378ded88f0" width="710" height="399" style="aspect-ratio:710/399; border:0; padding:0; margin:0; background:transparent;" frameborder="0" allowtransparency="true" allowfullscreen="allowfullscreen"></iframe> <cite class="hatena-citation"><a href="https://speakerdeck.com/m3_engineering/introduction-of-m3-ai-team">speakerdeck.com</a></cite></p>
<h3 id="å
¨å¡QAä½å¶ã¸ã®ç§»è¡">â£å
¨å¡QAä½å¶ã¸ã®ç§»è¡</h3>
<p>ã¾ãã窪ç°çããQAä½å¶ã大ããé²åãéãããã¨ãã¦ãã¾ãã</p>
<p>çããã御åç¥ã®éããç¾å¨ãåªç§ãªQAã¨ã³ã¸ãã¢ã®æ¡ç¨ã¯ç¾çãªç«¶äºç°å¢ã§ãå社ããã®ããåãæ¦ä¹±ã®ä¸ã®ä¸ã§ãã
ç§éã¯ãã®ç°å¢ã§æ¦ãã¤ã¤ãããã¹ã¦ã®ã¨ã³ã¸ãã¢ãèªãå質ã«è²¬ä»»ãæã¤ã次ã®æ®µéã¸ã¹ããããã§ã³ã¸ãããã¨èãã¦ãã¾ãã</p>
<p>幸ããã¨ã ã¹ãªã¼ã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ãã¯æ©ãããã¦ããããã¹ãã®å°å
¥ããCI/CDãIaCãã³ã³ããåãªã©ãæ´åãã¦ãããããã§ãã¨ã³ã¸ãã¢ã®å質æèã¯å¹³åã¬ãã«ä»¥ä¸ã«ãªã£ã¦ãã¾ãã</p>
<p>ãããåºç¤ã«ã2024å¹´10æãããå
¨å¡QAããã¸ã§ã¯ããã¹ã¿ã¼ãããQAã¨ã³ã¸ãã¢ã®ããå¹ççãªé
置転æã¨ã¨ã³ã¸ãã¢ã¸ã®å質管çã®ç§»è²ãå§ã¾ã£ã¦ãã¾ãã</p>
<p><iframe id="talk_frame_1182337" class="speakerdeck-iframe" src="//speakerdeck.com/player/684878d783c3415080c1e326f49635cc" width="710" height="399" style="aspect-ratio:710/399; border:0; padding:0; margin:0; background:transparent;" frameborder="0" allowtransparency="true" allowfullscreen="allowfullscreen"></iframe> <cite class="hatena-citation"><a href="https://speakerdeck.com/m3_engineering/introduction-of-m3-qa-team">speakerdeck.com</a></cite></p>
<h3 id="ãããã¯ãããã¸ã¡ã³ãçµç¹ã®å¼·å">â¤ãããã¯ãããã¸ã¡ã³ãçµç¹ã®å¼·å</h3>
<p>ãããã¯ãããã¸ã¡ã³ãçµç¹ã®å¼·åã«ãåãçµã¿ã¾ããã</p>
<p>ã¨ã ã¹ãªã¼ã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ãã®ãããã¯ãæ¯æ´ãã¼ã ã«ã¯ç¾å¨10å以ä¸ã®ãããã¯ãããã¼ã¸ã£ã¼ãå¨ç±<a href="#f-7060f488" id="fn-7060f488" name="fn-7060f488" title="2024å¹´ãæ°ãã«2åã®ãããã¯ãããã¼ã¸ã£ã¼ãå
¥ç¤¾ãã¦ããã¾ããï¼">*6</a>ããåäºæ¥ãã¼ã ã¸ã®è½ä¸åãéãã¦ãæ¥å¤ãå»çãå¤é©ãããããªãããã¯ãéçºã«åãçµãã§ãã¾ãã
ããã¾ã§é²ãã¦ããããäºãã®çµé¨ããå¦ã¶ãã¨ããæ¹éã大åã«ããªãããããå¹çããçµç¹ãæ¡å¤§ãã¦ããããã«ã2024å¹´12æãããæ³ãéªå£ã®2åã®ãã¼ã ãªã¼ãã¼ã«ææ¢ããç§ãå«ããããã¸ã¡ã³ããã¼ã ãç·¨æãã¦ãã¾ãã</p>
<p>2025å¹´ã¯æ¡ç¨å¼·åãå«ããããããã¯ãããã¸ã¡ã³ãçµç¹ã®å¼·åã«åãçµãã§ããããã¨æãã¾ãã</p>
<p>ã¡ãªã¿ã«pmconf2024ã®Discordã¤ãã³ãã§ã話ããããããã¯ãããã¼ã¸ã£ã¼ã«ã¨ã£ã¦ã®ãã¼ã ã©ã³ã«ã¤ãã¦ã¯ã<a href="https://adventar.org/calendars/10453">ãããã¯ãããã¼ã¸ã£ã¼ Advent Calendar 2024</a>ã®14æ¥ç®ã®è¨äºã§ã触ãã¦ãã¾ãã®ã§ãã¾ã ã覧ã«ãªã£ã¦ããªãæ¹ã¯ãã²ãä¸èªãã ããã</p>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.m3tech.blog%2Fentry%2Fpmconf2024-retrospective" title="ãpmconf 2024ãã¯ã©ã¤ã¹&ã«ã³ããã¼ã®Discordä¼ç»æ¯ãè¿ãï¼ãããã¯ãããã¼ã¸ã£ã¼ã«ã¨ã£ã¦ã®ãã¼ã ã©ã³ã¨ã¯ï¼ - ã¨ã ã¹ãªã¼ããã¯ããã°" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://www.m3tech.blog/entry/pmconf2024-retrospective">www.m3tech.blog</a></cite></p>
<h3 id="ã¾ã¨ã">ã¾ã¨ã</h3>
<p>ãããã§ããã§ããããï¼</p>
<p>æ¬ããã°ã§ã¯ãã2024å¹´ãã¨ã ã¹ãªã¼ã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ãã§è¡ã£ãçµç¹çã¹ããããã§ã³ã¸5é¸ããã¨é¡ãã¦ã2024å¹´ã®ã¨ã ã¹ãªã¼ã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ãã®çµç¹çãªåãçµã¿ã«ã¤ãã¦ç´¹ä»ããã¦é ãã¾ããã</p>
<p>æ¬å½ã«åªç§ãªãªã¼ãã¼é£ãã¡ã³ãã¼ã«æ¯ãããã¦ãã¨ã ã¹ãªã¼ã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ãã¯ãã¾ãã¾ãã¨ã³ã¸ãã¢ã«ã¨ã£ã¦æ¥½ããããã£ã¬ã³ã¸ã³ã°ã«åããç°å¢ã«é²åãã¦ããã¨å®æãã¦ãã¾ãã</p>
<p>2025å¹´ãå¼ãç¶ããã¨ã³ã¸ãã¢çµç¹ã®å¼·åãéãã¦ãå°ãã§ãæ¥æ¬ãä¸çã®å»çãåé²ãããæå©ããã§ããã°ã¨æã£ã¦ãã¾ãã</p>
<p>ä»å¹´ããã¨ã ã¹ãªã¼ã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ãã«æå±ãã¦ããç´ æ´ãããã¨ã³ã¸ãã¢ã®çããã«æè¬ãè¾¼ãã¦ã2025å¹´ãã¨ã ã¹ãªã¼ã°ã«ã¼ããã£ã¦ããï¼ããã¦ã¡ãªã¼ã¯ãªã¹ãã¹ï¼<a href="#f-209a9c78" id="fn-209a9c78" name="fn-209a9c78" title="ä»å¹´ã¯çããã®ãªã®ãªã«ã¯ãªããã12/23ã«å·çãã¦ãã¾ãwããããã°ããããã¨VPoEæ²³åã¨åªç§ãªä»²éãã¡ã®ãããããã">*7</a></p>
<p><figure class="figure-image figure-image-fotolife" title="åçã¯å
æ¥éå¬ããã第260åM3 Tech Talkã§ã®éååçã第1åéå¬ã¯2013/5/24ã ã£ãã®ã§11年以ä¸ç¶ãã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ãã®ä¼çµ±ã§ãã"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241224/20241224101501.jpg" width="800" height="420" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>åçã¯å
æ¥éå¬ããã第260åM3 Tech Talkã§ã®éååçã第1åéå¬ã¯2013/5/24ã ã£ãã®ã§11年以ä¸ç¶ãã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ãã®ä¼çµ±ã§ãã</figcaption></figure></p>
<h3 id="We-are-hiring">We are hiring!</h3>
<p>ã¨ã ã¹ãªã¼ã§ã¯ãã®ã¼ã¯ã§ã¹ãã¼ããªã¨ã³ã¸ãã¢ãä¸å¿ã«ãå¤æ°ã®ãã£ã¬ã³ã¸ã«ææ¢ã«ã¢ã¿ãã¯ãããããã¯ãéçºã¡ã³ãã¼ã絶è³åéä¸ã§ãã</p>
<p>ã¨ã³ã¸ãã¢ãQAããã¶ã¤ãã¼ããããã¯ãããã¼ã¸ã£ã¼ã©ã®è·ç¨®ã§ãæå¸æ°ãå¤ãããããã¯ãéçºã®åºç¤ç¥èãç¿å¾ããªããã社ä¼ã«ã¤ã³ãã¯ãã®ããåçæ§ã®é«ããããã¯ããçã¿åºãçµé¨ããã¼ã ã©ã³ã®æã¡æ¹ãå¦ã¹ããå¦ã¹ãè¯ãç°å¢ã ã¨æãã¾ãã</p>
<p>ãèå³ã®ããæ¹ã¯ãä¸è¨ã®ãµã¤ãããæ¯éã«ã¸ã¥ã¢ã«é¢è«çããç³ãè¾¼ã¿ãã ããï¼</p>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjobs.m3.com%2Fengineer%2F" title="ã¨ã³ã¸ãã¢æ¡ç¨ãµã¤ãï½æ¡ç¨æ
å ± | å»çÃãã¯ããã¸ã¼ã®å¯è½æ§ã¯ç¡é大" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jobs.m3.com/engineer/">jobs.m3.com</a></cite></p>
<div class="footnote">
<p class="footnote"><a href="#fn-08390cf3" id="f-08390cf3" name="f-08390cf3" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text"><a href="https://ec.snowpeak.co.jp/snowpeak/ja/%E3%82%AD%E3%83%A3%E3%83%B3%E3%83%97/%E3%83%A9%E3%83%B3%E3%82%BF%E3%83%B3%28%E3%82%AC%E3%82%B9%E3%83%BBLED%29%E3%83%BB%E3%83%A9%E3%82%A4%E3%83%88/%E3%83%AA%E3%83%88%E3%83%AB%E3%83%A9%E3%83%B3%E3%83%97-%E3%83%8E%E3%82%AF%E3%82%BF%E3%83%BC%E3%83%B3/p/18758">https://ec.snowpeak.co.jp/snowpeak/ja/%E3%82%AD%E3%83%A3%E3%83%B3%E3%83%97/%E3%83%A9%E3%83%B3%E3%82%BF%E3%83%B3%28%E3%82%AC%E3%82%B9%E3%83%BBLED%29%E3%83%BB%E3%83%A9%E3%82%A4%E3%83%88/%E3%83%AA%E3%83%88%E3%83%AB%E3%83%A9%E3%83%B3%E3%83%97-%E3%83%8E%E3%82%AF%E3%82%BF%E3%83%BC%E3%83%B3/p/18758</a></span></p>
<p class="footnote"><a href="#fn-3060e5c5" id="f-3060e5c5" name="f-3060e5c5" class="footnote-number">*2</a><span class="footnote-delimiter">:</span><span class="footnote-text"><a href="https://soto.shinfuji.co.jp/products/sod-260/">https://soto.shinfuji.co.jp/products/sod-260/</a></span></p>
<p class="footnote"><a href="#fn-1b5bde33" id="f-1b5bde33" name="f-1b5bde33" class="footnote-number">*3</a><span class="footnote-delimiter">:</span><span class="footnote-text"><a href="https://www.m3t.co.jp">https://www.m3t.co.jp</a></span></p>
<p class="footnote"><a href="#fn-a59f3487" id="f-a59f3487" name="f-a59f3487" class="footnote-number">*4</a><span class="footnote-delimiter">:</span><span class="footnote-text">2024å¹´10æãããã¨ã ã¹ãªã¼ã®ãã¹ã¦ã®é¨éã§é¨éé·ã®å¼ã³åãã°ã«ã¼ããªã¼ãã¼ããã¼ãã©ã«ããã¼ã¸ã£ã¼ã«å¤æ´ã¨ãªãã¾ããã</span></p>
<p class="footnote"><a href="#fn-5682d7e9" id="f-5682d7e9" name="f-5682d7e9" class="footnote-number">*5</a><span class="footnote-delimiter">:</span><span class="footnote-text">ã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ãã®ã¼ãã©ã«ããã¼ã¸ã£ã¼ã¯å
¨å¡ã§è²¬ä»»ãæã£ã¦ã°ã«ã¼ãå
¨ä½ãå
±åéå¶ãã¤ã¤ãããããæ
å½ã®ãã¼ã ãæã£ã¦ãã¾ãã</span></p>
<p class="footnote"><a href="#fn-7060f488" id="f-7060f488" name="f-7060f488" class="footnote-number">*6</a><span class="footnote-delimiter">:</span><span class="footnote-text">2024å¹´ãæ°ãã«2åã®ãããã¯ãããã¼ã¸ã£ã¼ãå
¥ç¤¾ãã¦ããã¾ããï¼</span></p>
<p class="footnote"><a href="#fn-209a9c78" id="f-209a9c78" name="f-209a9c78" class="footnote-number">*7</a><span class="footnote-delimiter">:</span><span class="footnote-text">ä»å¹´ã¯çããã®ãªã®ãªã«ã¯ãªããã12/23ã«å·çãã¦ãã¾ãwããããã°ããããã¨VPoEæ²³åã¨åªç§ãªä»²éãã¡ã®ãããããã</span></p>
</div>
yamazaki-m3
AIã»æ©æ¢°å¦ç¿ãã¼ã ãã¹ãMR(Merge Request)決å®æ¦ 2024
hatenablog://entry/6802418398312573660
2024-12-23T17:00:00+09:00
2024-12-23T17:00:00+09:00 ãã®è¨äºã¯ã¨ã ã¹ãªã¼ Advent Calendar 2024 23æ¥ç®ã®è¨äºã§ãã AIã»æ©æ¢°å¦ç¿ãã¼ã ã®ä¸æä¼å¹(@inakam00)ã§ãã ã½ããã¦ã§ã¢éçºã«ããã¦ãåªããã³ã¼ãã®å¤æ´ã¯æã¨ãã¦ã¢ã¼ãä½åã®ãããªç¾ããããæ群ã®æ©è½æ¹åããããããã¨ãããã¾ããGitHubã§Pull Request(PR)ã使ã£ããã¨ããã人ãªããæåãããããªã³ã¼ãä¿®æ£ã«åºä¼ã£ãçµé¨ãããã®ã§ã¯ãªãã§ããããã ã¨ã ã¹ãªã¼AIã»æ©æ¢°å¦ç¿ãã¼ã ã§ã¯ããã®æåãå
±æã称ãåãããã«ãå¹´ã«ä¸åº¦ããã¹ãMerge Request(MR)決å®æ¦ããéå¬ãã¦ãã¾ããMRã¨ã¯GitLabã®Merge Requestâ¦
<p>ãã®è¨äºã¯<a href="https://qiita.com/advent-calendar/2024/m3">ã¨ã ã¹ãªã¼ Advent Calendar 2024</a> 23æ¥ç®ã®è¨äºã§ãã
AIã»æ©æ¢°å¦ç¿ãã¼ã ã®ä¸æä¼å¹(<a href="https://x.com/inakam00">@inakam00</a>)ã§ãã</p>
<p>ã½ããã¦ã§ã¢éçºã«ããã¦ãåªããã³ã¼ãã®å¤æ´ã¯æã¨ãã¦ã¢ã¼ãä½åã®ãããªç¾ããããæ群ã®æ©è½æ¹åããããããã¨ãããã¾ããGitHubã§Pull Request(PR)ã使ã£ããã¨ããã人ãªããæåãããããªã³ã¼ãä¿®æ£ã«åºä¼ã£ãçµé¨ãããã®ã§ã¯ãªãã§ããããã</p>
<p>ã¨ã ã¹ãªã¼AIã»æ©æ¢°å¦ç¿ãã¼ã ã§ã¯ããã®æåãå
±æã称ãåãããã«ãå¹´ã«ä¸åº¦ããã¹ãMerge Request(MR)決å®æ¦ããéå¬ãã¦ãã¾ããMRã¨ã¯GitLabã®Merge Requestã®ç¥ç§°ã§ãã GitHubã§ããã¨ããã®PR(Pull Request)ã«ãããã¾ãã</p>
<p><figure class="figure-image figure-image-fotolife" title="æ®æ®µã¯å
¨å½ã®æ ç¹ã§ãªã¢ã¼ãã¯ã¼ã¯ã§åãã¦ããAIã»æ©æ¢°å¦ç¿ãã¼ã ããå¹´ã«æ°åå
¨å¡éåããæ©ä¼ãããã¾ããå
é±éææ¥ã«ç¤¾å
ã©ã¤ãã©ãªãOSSã«ã³ã³ããªãã¥ã¼ãããããã¨ããä¼ç»ãå®æ½ãã¾ããã"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241223/20241223170040.jpg" width="800" height="603" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>æ®æ®µã¯å
¨å½åå°ã§ãªã¢ã¼ãã§åãã¦ããAIã»æ©æ¢°å¦ç¿ãã¼ã ãå¹´ã«æ°åå
¨å¡éåããæ©ä¼ãããã¾ããå
é±éææ¥ã«ç¤¾å
ã©ã¤ãã©ãªãOSSã«ã³ã³ããªãã¥ã¼ãããããã¨ããä¼ç»ãå®æ½ãã¾ããã</figcaption></figure></p>
<p>ä»å¹´ãããã¼ã ã¡ã³ãã¼å
¨å¡ã§ãããã¯ãããã£ãï¼ãã¨æããã³ã¼ãå¤æ´ããããã¼ãããæ票ã®çµæããã10ãé¸åºãã¾ãããã·ã³ãã«ãªæ¹åããæ¬æ°ãªã¢ã¤ãã¢ã¾ã§ãããããªãè·äººæããè©°ã¾ã£ã¦ãã¾ãã</p>
<p><figure class="figure-image figure-image-fotolife" title="AIã»æ©æ¢°å¦ç¿ãã¼ã ã®å
¨MRã1å¹´åã¾ã§é¡ãã«ã¯ãã¼ã¸ãã¼ã·ã§ã³ã®227ãã¼ã¸ç®ã¾ã§ããå¿
è¦ãããï¼ç´4500件ï¼ãRenovateãªã©ã®ã¡ã³ããã³ã¹MRãé¤ãã¦ããããã1000件以ä¸ã"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241223/20241223170034.png" width="800" height="69" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>AIã»æ©æ¢°å¦ç¿ãã¼ã ã®å
¨MRã1å¹´åã¾ã§é¡ãã«ã¯ãã¼ã¸ãã¼ã·ã§ã³ã®227ãã¼ã¸ç®ã¾ã§ããå¿
è¦ãããï¼ç´4500件ï¼ãRenovateãªã©ã®ã¡ã³ããã³ã¹ãé¤ãã¦ããããã1000件以ä¸ã</figcaption></figure></p>
<p>ãã®ããã°ã§ã¯ãå®éã«ã³ã¼ããæ¸ãã人ããã¬ãã¥ã¼ãéãã¦ãã®ä¾¡å¤ãé«ãããã¨ã«é¢ãã£ãã¡ã³ãã¼ãã¡ããããããã®MRã®é
åã«ã¤ãã¦èªã£ã¦ããã¾ããã§ã¯ã第10ä½ããè¦ã¦ããã¾ãããï¼</p>
<ul class="table-of-contents">
<li><a href="#第10ä½-æ©æ¢°å¦ç¿ã¢ãã«ã®æ§è½åä¸æ½ç">第10ä½ æ©æ¢°å¦ç¿ã¢ãã«ã®æ§è½åä¸æ½ç</a></li>
<li><a href="#第9ä½-localãã£ã¹ã¯ãã£ãã·ã¥ã®æ´»ç¨">第9ä½ localãã£ã¹ã¯ãã£ãã·ã¥ã®æ´»ç¨</a></li>
<li><a href="#第7ä½åç-gokartã¸ã®mypy-pluginã®è¿½å ">第7ä½(åç) gokartã¸ã®mypy pluginã®è¿½å </a></li>
<li><a href="#第7ä½åç-Kubernetesã¯ã©ã¹ã¿ã¼é½åã§ã®ãããã®ä¸æããªãã©ã¤åæ°ã«ã«ã¦ã³ãããªã">第7ä½(åç) Kubernetesã¯ã©ã¹ã¿ã¼é½åã§ã®ãããã®ä¸æããªãã©ã¤åæ°ã«ã«ã¦ã³ãããªã</a></li>
<li><a href="#第6ä½-ããæ¥çªç¶BigQueryã®downloadãé
ããªã£ã¦ãã¾ãããã¦ãªãã§ããã">第6ä½ ããæ¥çªç¶BigQueryã®downloadãé
ããªã£ã¦ãã¾ããããã¦ãªãã§ãããï¼</a></li>
<li><a href="#第5ä½-gokartã®linterã追å ">第5ä½ gokartã®linterã追å </a></li>
<li><a href="#第4ä½-ã³ã¼ãæ¤ç´¢åºç¤ãæ§ç¯ããããã®ã¤ã³ããã¯ã¹ä½æããã¼">第4ä½ ã³ã¼ãæ¤ç´¢åºç¤ãæ§ç¯ããããã®ã¤ã³ããã¯ã¹ä½æããã¼</a></li>
<li><a href="#第3ä½-Google-Cloud-ArtifactRegistryã®ã¯ãªã¼ã³ã¢ãã">第3ä½ Google Cloud ArtifactRegistryã®ã¯ãªã¼ã³ã¢ãã</a></li>
<li><a href="#第2ä½-TaskOnKartã¸åã追å ">第2ä½ TaskOnKartã¸åã追å </a></li>
<li><a href="#第1ä½-ãã¼ããã©ã³ãµã¼ä¸æ¬ç£è¦">第1ä½ ãã¼ããã©ã³ãµã¼ä¸æ¬ç£è¦</a></li>
<li><a href="#ã¾ã¨ã">ã¾ã¨ã</a><ul>
<li><a href="#We-are-hiring-">We are hiring !!</a><ul>
<li><a href="#ã¨ã³ã¸ãã¢æ¡ç¨ãã¼ã¸ã¯ãã¡ã">ã¨ã³ã¸ãã¢æ¡ç¨ãã¼ã¸ã¯ãã¡ã</a></li>
<li><a href="#ã«ã¸ã¥ã¢ã«é¢è«ããæ°è»½ã«ã©ãã">ã«ã¸ã¥ã¢ã«é¢è«ããæ°è»½ã«ã©ãã</a></li>
<li><a href="#ã¤ã³ã¿ã¼ã³ã常æåéãã¦ãã¾ã">ã¤ã³ã¿ã¼ã³ã常æåéãã¦ãã¾ã</a></li>
</ul>
</li>
</ul>
</li>
</ul>
<h2 id="第10ä½-æ©æ¢°å¦ç¿ã¢ãã«ã®æ§è½åä¸æ½ç">第10ä½ æ©æ¢°å¦ç¿ã¢ãã«ã®æ§è½åä¸æ½ç</h2>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241223/20241223170006.png" width="800" height="140" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p>
<ul>
<li>ç´¹ä»è
: é´¨ç°</li>
</ul>
<p>AIã»æ©æ¢°å¦ç¿ãã¼ã ã§ã¯ãæ§ã
ãªæ©æ¢°å¦ç¿ã¢ãã«ã®éçºãéç¨ããã¦ãã¾ãããã®ä¸ã®ããã¢ãã«ã®ç°¡ç´ åãåãåãã®è¯ãã«çç®ãããã¼ã¸ã§ã³ã¢ããã«ããã¦ãv2ã¢ãã«ãv1ã¢ãã«ã¨æ¯è¼ãã¦ç²¾åº¦ãæªåããã¨ãã課é¡ã«ç´é¢ãã¾ããã</p>
<p>調æ»ã®çµæã主åå ã®1ã¤ãç¹å¾´éã«å¯¾ãã¦å¼·å¶çã«SVD(ç¹ç°å¤å解)ã«ããå§ç¸®ãé©ç¨ãã¦ãããã¨ã ã¨å¤æãã¾ãããç¹å¾´å§ç¸®ã®å¦çãè¦ç´ããã¨ã§v2ã¢ãã«ã®ç²¾åº¦ãv1ã¨åçã®ã¬ãã«ã«ã¾ã§å復ããããã¨ã«æåãã¾ããã</p>
<p>調æ»ããåå 究æã対å¿ã¾ã§ãªãã¨2æ¥ã¨ããã¹ãã¼ãæãç¸ã¾ã£ã¦å ã
ã®10ä½å
¥è³ã¨ãªãã¾ããã</p>
<h2 id="第9ä½-localãã£ã¹ã¯ãã£ãã·ã¥ã®æ´»ç¨">第9ä½ localãã£ã¹ã¯ãã£ãã·ã¥ã®æ´»ç¨</h2>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241223/20241223170010.png" width="800" height="349" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p>
<ul>
<li>ç´¹ä»è
: æ± å¶</li>
</ul>
<p>AIã»æ©æ¢°å¦ç¿ãã¼ã ã§ã¯æ§ã
ãªåæç¨é¢æ°ãå
±æãªãã¸ããªã«å®è£
ãã¦ãã¾ãããä¸é¨å¦çã«æéãããããã®ãããã¾ãããä¾ãã°ãã¼ã¿ã®ãã¦ã³ãã¼ããªã©ã¯ä½åº¦ãã£ã¦ãçµæã¯åããªã®ã§çµæããã£ãã·ã¥ãããã¨ã§æµç¨ãããã¨ããã§ããæ®æ®µãAIã»æ©æ¢°å¦ç¿ãã¼ã ã§ã¯gokartã使ã£ã¦å¦çãæ¸ãã¦ããã®ã§ãçµæããã£ãã·ã¥ã§ãã¦ããã®ã§ãããgokartåããã¦ããªãé¢æ°ã§ããã£ãã·ã¥ã使ã£ã¦é«éåããããªã£ã¦ãã¾ããã</p>
<p>ãã®MRã§ã¯ããã£ãã·ã¥ãã¦ãå®å
¨ãªé¢æ°ãæ´ãåºãã¦localãã£ãã·ã¥ãæå¹åãããã¨ã§å
¨ä½ã®å¦çã3åç¨åº¦é«éåã§ããããã«ãªããåæã®çç£æ§åä¸ã«å¯ä¸ãã¾ããã</p>
<h2 id="第7ä½åç-gokartã¸ã®mypy-pluginã®è¿½å ">第7ä½(åç) gokartã¸ã®mypy pluginã®è¿½å </h2>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241223/20241223170013.png" width="800" height="449" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fgithub.com%2Fm3dev%2Fgokart%2Fpull%2F384" title="feat: add mypy plugin by hiro-o918 · Pull Request #384 · m3dev/gokart" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://github.com/m3dev/gokart/pull/384">github.com</a></cite></p>
<ul>
<li>ç´¹ä»è
: å±±æ¬</li>
</ul>
<p>ã¨ã ã¹ãªã¼ãå
¬éãã¦ããOSSã§ããgokartã«mypy pluginã追å ããPRã§ãã</p>
<p>ããã¾ã§ã³ã³ã¹ãã©ã¯ã¿ã«å¼æ°ã®åã¨ç°ãªã£ããã®ã渡ããã¨ãã¦ããmypyã§æ¤ç¥ã§ãã¾ããã§ããã
ããã§ãdataclassã<a href="https://github.com/pydantic/pydantic">pydantic</a>ã®ãã¨ãæãåºããmypy pluginãå®è£
ãããã¨ã§ä¸è¨ã®åé¡ã解æ¶ãã¾ããã</p>
<p>詳ããã¯æ¬¡ã®ããã°ãåèã«ãã¦ãã ããã
<iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.m3tech.blog%2Fentry%2Fgokart-mypy-plugin" title="mypy plugin ã«å
¥éãã¦ç¤¾å
OSS ã§ãã gokart ãåå®å
¨ã«ãã¦ã¿ã - ã¨ã ã¹ãªã¼ããã¯ããã°" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://www.m3tech.blog/entry/gokart-mypy-plugin">www.m3tech.blog</a></cite></p>
<h2 id="第7ä½åç-Kubernetesã¯ã©ã¹ã¿ã¼é½åã§ã®ãããã®ä¸æããªãã©ã¤åæ°ã«ã«ã¦ã³ãããªã">第7ä½(åç) Kubernetesã¯ã©ã¹ã¿ã¼é½åã§ã®ãããã®ä¸æããªãã©ã¤åæ°ã«ã«ã¦ã³ãããªã</h2>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241223/20241223170017.png" width="800" height="151" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p>
<ul>
<li>ç´¹ä»è
: ä¸æµ¦</li>
</ul>
<p>AIã»æ©æ¢°å¦ç¿ãã¼ã ã®GKE<a href="#f-ccb55186" id="fn-ccb55186" name="fn-ccb55186" title="Google Kubernetes Engine. Google Cloudãæä¾ããããã¼ã¸ãKubernetesã¯ã©ã¹ã¿ã¼">*1</a>ã§ã¯ãç´300åã®ãããã稼åãã¦ãã¾ããGKEã§ã¯ããã¼ãã¸ã®ãããã®é
ç½®æé©åããã¹ãããã¤ã³ã¹ã¿ã³ã¹<a href="#f-8223f031" id="fn-8223f031" name="fn-8223f031" title="å¯ç¨æ§ãæ
ä¿ãããªãåé¢ãæ ¼å®ã§å©ç¨ã§ãããã¼ããPreemptible VM, Spot VMã¨ã">*2</a>ã®åæ¢ã«ãããããããä¸æã»åå®è¡ããããã¨ãããã¾ãããã®ãããªä¸æããªãã©ã¤ã«ã«ã¦ã³ãããããªãã©ã¤ä¸éã«éããçµæãããããSLAãæºãããªããã¨ãããã¾ããã</p>
<p>ããã«å¯¾ãããªãã©ã¤ã®ã«ã¦ã³ããå¶å¾¡ããæ©è½ã<a href="https://kubernetes.io/docs/tasks/job/pod-failure-policy/#using-pod-failure-policy-to-ignore-pod-disruptions">Kubernetesã®ããã¥ã¡ã³ã</a>ãçºè¦ããæ¡ç¨ãã¾ãããæ¬æ¥çç®ããããªãã©ã¤è¦å ã®ã¿<a href="#f-b850bb85" id="fn-b850bb85" name="fn-b850bb85" title="ä¾ãã°ã社å
å¤ã®APIãªã©ãé£æºããã³ã³ãã¼ãã³ãã¸ã®çé">*3</a>ã«ãã©ã¼ã«ã¹ã§ããããã«ãªããã³ã¹ããæãã¤ã¤<a href="#f-1a67e341" id="fn-1a67e341" name="fn-1a67e341" title="åã«ãªãã©ã¤ä¸éãå¢ããã§ã解決ã§ãã¾ãããä¾ãã°ã³ã¼ãã®ãã°ãè¨å®ãã¹ãªã©ãªãã©ã¤ã§è§£æ±ºããªãå ´åã«ãä¸è¦ãªã¤ã³ã¹ã¿ã³ã¹ã®èµ·åæéã¨ããã«ä¼´ãè²»ç¨ãçºçãã¾ã">*4</a>ç£è¦ã»éç¨ã®è³ªãåä¸ã§ãã¾ããã</p>
<h2 id="第6ä½-ããæ¥çªç¶BigQueryã®downloadãé
ããªã£ã¦ãã¾ãããã¦ãªãã§ããã">第6ä½ ããæ¥çªç¶BigQueryã®downloadãé
ããªã£ã¦ãã¾ããããã¦ãªãã§ãããï¼</h2>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241223/20241223170020.png" width="800" height="149" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p>
<ul>
<li>ç´¹ä»è
: ä¸æ(ä¼)</li>
</ul>
<p>æ£è§£ã¯ãBigQuery Storage APIã使ããªãè¨å®ã«ãªã£ã¦ãã¾ã£ã¦ããããã§ãã</p>
<p>AIã»æ©æ¢°å¦ç¿ãã¼ã ã§ã¯BigQueryãæä½ããããã®ç¤¾å
ã©ã¤ãã©ãªãæ´åãããã¨ã«ãã£ã¦ã100åè¿ããããã¯ãã§ãå¦çã®å
±éåãå®ç¾ãã¦ãã¾ãããã®éã«ãBigQuery Storage APIãå©ç¨ãããã¨ã§BigQueryã®ãã¦ã³ãã¼ããé«éåãã¦ããã®ã§ãããpandas-gbq v0.22ããããã©ã«ãã§ã¯å©ç¨ã§ããªããªã£ã¦ãããã¨ãä¿®æ£ããMRã§ãã</p>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fgithub.com%2Fgoogleapis%2Fpython-bigquery-pandas%2Fpull%2F735" title="feat: move bqstorage to extras and add debug capability by chalmerlowe · Pull Request #735 · googleapis/python-bigquery-pandas" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://github.com/googleapis/python-bigquery-pandas/pull/735">github.com</a></cite></p>
<p>çºè¦ã®çµç·¯ã¨ãã¦ãç´¹ä»è
ã®ä¸æ(ä¼)ã諸äºæ
ã§æ°æ¥éã¡ã³ããã³ã¹ãã§ããªãéã«ã代ããã«ãããã¯ãã®ä¿å®ãè¡ãªã£ã¦ããããã¼ã ãªã¼ãã¼ã®åå·ãåä½æ¤è¨¼ä¸ã«çºè¦ãã¾ãããAIã»æ©æ¢°å¦ç¿ãã¼ã ã¯ãããã¯ãæ°ãå¤ããããã¹ãã¼ããåªå
ããããã«ããç¨åº¦ã®å±äººåã許容ããã¨ããä½å¶ãã¨ã£ã¦ãã¾ãããããªä¸ã§ãä»äººã®ä»äºãæ°ã«ãããããã«æ¹è¯ã¾ã§è¡ã£ã¦ãã¾ããã¼ã ãªã¼ãã¼ã®åãã¯ãããã§ããã</p>
<p>æ¥å¹´ã¯ãã¹ãMR決å®æ¦ãã¿ã¤ãã«é¨éããããããã®ã§ãå
容ã¯ä¼ããã絶å¦ãªã¿ã¤ãã«ã®MRãããããã¯ä½æãã¦ããããã§ããã</p>
<h2 id="第5ä½-gokartã®linterã追å ">第5ä½ gokartã®linterã追å </h2>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241223/20241223170023.png" width="800" height="233" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p>
<ul>
<li>ç´¹ä»è
: æ°å®¶</li>
</ul>
<p>ã¨ã ã¹ãªã¼ãOSSã¨ãã¦å
¬éãã¦ããgokartã«å¯¾ãã¦linterãä½æããMRã«ãªãã¾ãã</p>
<p>AIã»æ©æ¢°å¦ç¿ãã¼ã ã§ã¯gokartãæ§ã
ãªãããã¯ãã§å©ç¨ããã¦ããã社å
ã§ã¯ç¥è¦ãæºã¾ã£ã¦ãã¾ããããããæ°ã¡ã³ãã¼ãªã©ãå
¥ã£ãã¨ãã¯ã¬ãã¥ã¼ã§ããã使ããªãã»ããè¯ãã§ãããã¨è¨ããªã©ãå£é ã§ã®æ®åããã¦ããç¶æ
ãç¶ãã¦ãã¾ããã人æã®ãã§ãã¯ã§ã¯è¦éããªã©ãçºçããã®ã§å®å
¨ã«çµ±ä¸ããã«ã¯ãªããªãé£ããã§ãã</p>
<p>ããã§ãã®MRã§ã¯ããã®ãããªç¥è¦ãLinterã¨ãã¦æ©æ¢°çã«ãã§ãã¯ãããã¨ã«ãã£ã¦ãã¬ãã¥ã¼ãæã¾ãã«ãã§ãã¯ã§ããä»çµã¿ãä½ãã¾ããã
詳ããã¯ããã°ãåºãã¦ããã®ã§ããã²ãã¡ãã御覧ãã ããã
<iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.m3tech.blog%2Fentry%2F2024%2F10%2F02%2F110000" title="ãã¼ã ã§å¹ããããã¹ããã©ã¯ãã£ã¹ãlintã¨ãã¦å¨ç¥ãã - ã¨ã ã¹ãªã¼ããã¯ããã°" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://www.m3tech.blog/entry/2024/10/02/110000">www.m3tech.blog</a></cite></p>
<h2 id="第4ä½-ã³ã¼ãæ¤ç´¢åºç¤ãæ§ç¯ããããã®ã¤ã³ããã¯ã¹ä½æããã¼">第4ä½ ã³ã¼ãæ¤ç´¢åºç¤ãæ§ç¯ããããã®ã¤ã³ããã¯ã¹ä½æããã¼</h2>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241223/20241223170027.png" width="800" height="480" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p>
<ul>
<li>ç´¹ä»è
: ä¸æ(å¼)</li>
</ul>
<p>ã³ã¼ãæ¤ç´¢åºç¤ãæ§ç¯ããããã®ã¤ã³ããã¯ã¹ä½æããã¼ã®éçºã®ããã®MRã§ãã</p>
<p>ã¨ã ã¹ãªã¼ã§ã¯ä»ã¾ã§Cloud Source Repositoryãå©ç¨ããã³ã¼ãæ¤ç´¢ãå©ç¨ãã¦ãã¾ãããããµã¼ãã¹ã®End of Salesãã¢ãã¦ã³ã¹ããã¦ãã¾ãã¾ããã移è¡å
ã調æ»ãã¦ããã¨ãããSourcegraphã®å
é¨ã§å©ç¨ããã¦ããZoektã¨ããã³ã¼ãæ¤ç´¢ã¨ã³ã¸ã³ãè¦ã¤ãã¾ãããZoektã使ã£ãã³ã¼ãæ¤ç´¢åºç¤ã社å
åãã«æ§ç¯ãããã¨ã§ãä»ãµã¼ãã¹ã«èª²éãããã¨ãªãã³ã¼ãæ¤ç´¢åºç¤ãå®ç¾ã§ããã³ã¹ãã大å¹
ã«ç¯ç´ãããã¨ã«æåãã¾ããã</p>
<p>ã³ã¼ãæ¤ç´¢åºç¤ã®è©³ç´°ã«ã¤ãã¦ã¯ã¨ã ã¹ãªã¼ããã¯ããã¯7ã§å
¬éãã¦ãã¾ãã
<iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Ftechbookfest.org%2Fproduct%2Fg2gqKCQ96newVVkru0YgAm%3FproductVariantID%3DrVnrwrVH1qJWm0qxss1Vpd" title="ã¨ã ã¹ãªã¼ããã¯ããã¯7ï¼ã¨ã ã¹ãªã¼ã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ãå·çé¨" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://techbookfest.org/product/g2gqKCQ96newVVkru0YgAm?productVariantID=rVnrwrVH1qJWm0qxss1Vpd">techbookfest.org</a></cite></p>
<h2 id="第3ä½-Google-Cloud-ArtifactRegistryã®ã¯ãªã¼ã³ã¢ãã">第3ä½ Google Cloud ArtifactRegistryã®ã¯ãªã¼ã³ã¢ãã</h2>
<p><figure class="figure-image figure-image-fotolife" title="æ°ååã®ãªãã¸ããªã«ä¸æ¬é©ç¨ããããããã©ãã«ã®åæ ãªã©ã大éã«è¡ããã"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241223/20241223170037.png" width="800" height="330" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>æ°ååã®ãªãã¸ããªã«ä¸æ¬é©ç¨ããããããã©ãã«ã®åæ ãªã©ã大éã«è¡ããã</figcaption></figure></p>
<ul>
<li>ç´¹ä»è
: 横æ¬</li>
</ul>
<p>ã¿ãªãããå¤ããªã£ãDockerã¤ã¡ã¼ã¸ã¯ãã¡ãã¨æé¤åºæ¥ã¦ãã¾ãã§ãããããæ¥ããããªããAIã»æ©æ¢°å¦ç¿ãã¼ã ã§ã¯Google Cloud ArtifactRegistryï¼ä»¥ä¸GARã¨çç¥ï¼ã®Cleanupè¨å®ãå¾¹åºåºæ¥ã¦ããªãç¶æ
ã§ãããè¨ãã¾ã§ããªãå¤éããã¤ã¡ã¼ã¸ã¯ã¹ãã¬ã¼ã¸æéã®æµªè²»ã§ãããã¾ãGARã¯å身ã§ããContainerRegistryï¼ä»¥ä¸GCRã¨çç¥ãéæ¨å¥¨ã»æä¾çµäºäºå®ã§ãã¼ã ã§ã移è¡ï¼ãããã¹ãã¬ã¼ã¸æéãå²é«ã§ãã</p>
<p>ããã§ã¡ããã¨åé¤ããªã·ã¼ãå¾¹åºãããã¨ãããã¨ã«ãªã£ãã®ã§ããããã¼ã ã«ã¯å¤ãã®ãããã¯ããããã対象ã®GARãªãã¸ããªãå¤æ°ãã¡ã³ãã¼ã¿ããªã§åæ
ãã¦è¨å®ç¥ããâ¦ã¨æãããã¨ãããã¾ã¨ãã¦ãã£ã¡ããã¾ããã¨æ°ååã®ãªãã¸ããªãä¸æ¬ã§å¯¾å¿ãã¦ãããæ¬MRã«æè¬ãéã¾ã第3ä½ã«è¼ãã¾ããï¼</p>
<p>ãªãGARã¯ã·ã³ã°ã«ãªã¼ã¸ã§ã³ã«éãããã¨ã§éä¿¡æéãåé¿ã§ãããããï¼ã¡ããã¨ã¹ãã¬ã¼ã¸ãç¯ç´ããã°ï¼ãã¼ã¿ã«ã§ã¯ãå¾ãªã±ã¼ã¹ãå¤ãã¨æããã¾ããGAR移è¡ãã¦ããã¾ãããã</p>
<h2 id="第2ä½-TaskOnKartã¸åã追å ">第2ä½ TaskOnKartã¸åã追å </h2>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241223/20241223170030.png" width="800" height="567" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fgithub.com%2Fm3dev%2Fgokart%2Fpull%2F391" title="Add TaskOnKart load type by kitagry · Pull Request #391 · m3dev/gokart" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://github.com/m3dev/gokart/pull/391">github.com</a></cite></p>
<ul>
<li>ç´¹ä»è
: åå·</li>
</ul>
<p>ã¨ã ã¹ãªã¼ãOSSã¨ãã¦å
¬éãã¦ããMLã¯ã¼ã¯ããã¼ã©ã¤ãã©ãªã§ããgokartã¸ã®PRã«ãªãã¾ãã</p>
<p>è¿å¹´Pythonã«ã¯åã«é¢ããæ©è½ãå¢ãã¦ãã¾ãããã®åã®æ©è½ããµãã ãã«ä½¿ã£ã¦gokartã®å¼±ç¹ã§ãã£ãã¿ã¹ã¯éã®åã®åã渡ããã§ããããã«ããã®ããã®PRã®å
容ã«ãªãã¾ãã
ããã«ãã£ã¦å®è¡åã«ã¨ã©ã¼ã«æ°ã¥ãããããªã£ãã ãã§ã¯ãªããã³ã¼ããªã¼ãã£ã³ã°ã容æã«ãããªã©ã®å¹æãå¾ããã¾ããã</p>
<p>詳ããã¯æ¬¡ã®ããã°ãåèã«ãã¦ãã ããã
<iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.m3tech.blog%2Fentry%2Fai%2Fgokart-type" title="Genericããoverloadããã使ã£ã¦ãMLãã¤ãã©ã¤ã³ãã¼ã«gokartãåå®å
¨ã«ãã¦ã¿ã - ã¨ã ã¹ãªã¼ããã¯ããã°" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://www.m3tech.blog/entry/ai/gokart-type">www.m3tech.blog</a></cite></p>
<h2 id="第1ä½-ãã¼ããã©ã³ãµã¼ä¸æ¬ç£è¦">第1ä½ ãã¼ããã©ã³ãµã¼ä¸æ¬ç£è¦</h2>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241223/20241223170044.png" width="651" height="275" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p>
<ul>
<li>ç´¹ä»è
: é è¤</li>
</ul>
<p>AIã»æ©æ¢°å¦ç¿ãã¼ã ã§ã¯ãGoogle Cloudã®Cloud Monitoringã§ãã¼ããã©ã³ãµã¼ãç£è¦ãã¦ãã¾ãã以åã¯ãããã¯ãæ¯ã«ãã¼ããã©ã³ãµã¼ãç£è¦ãã¦ãããç£è¦è¨å®ã¯ãããã¯ãæ
å½è
ãTerraformã§è¨å®ãã¦ãã¾ãããããããAIã»æ©æ¢°å¦ç¿ãã¼ã ã¯ãããã¯ãæ°ãå¤ããç£è¦è¨å®ããããã¯ãæ
å½è
ãå®æ½ããéç¨ã ã¨è¨å®æ¼ããçºçãã¦ãã¾ããã</p>
<p>ããã§ããã®MRã§ã¯ãåå¥ã§ç£è¦ãè¨å®ããã®ã§ã¯ãªãã1ã¤ã®è¨å®ã§å
¨ãã¼ããã©ã³ãµã¼ãç£è¦ããããã«ãã¾ãããããã«ãããåãããã¯ãæ
å½è
ãç£è¦ã®è¨å®ãããå¿
è¦ããªããªããç£è¦æ¼ããç¡ãããã¨ãã§ãã¾ããã</p>
<h1 id="ã¾ã¨ã">ã¾ã¨ã</h1>
<p>ä»å¹´ã®ç¬¬1ä½ã¯é è¤ããã®ä¸æ¬ãã¼ããã©ã³ãµã¼ç£è¦ã§ããããã®MRã¯å¤§éã«ãããã¯ããçã¿åºãAIã»æ©æ¢°å¦ç¿ãã¼ã ã«ã¨ã£ã¦æ¼ãã®èµ·ãããããç£è¦ããèªååããã¨ããã¹ãã¼ããªå¤æ´ã§ããã</p>
<p>AIã»æ©æ¢°å¦ç¿ãã¼ã ã§ã¯ã¬ãã¥ã¼æã«ããã¹ãMRåè£ãã¨ã³ã¡ã³ããã¦ãããã¨ã§ããã¹ãMR決å®æ¦ã«åãã¦ããã¨åæã«ãããé©æ°çãªMRãçã¿åºããã¨ããã¢ããã¼ã·ã§ã³ãé«ãã¦ãã¾ãã2024å¹´ã¯ãã¼ã ã®äººæ°ãããã¾ã§ä»¥ä¸ã«å¢ããMRæ°ãå¤ããªãã¾ãããæ¥å¹´ã¯ã©ããã£ãæ¹åãè¡ãããã®ãæå¾
ã§ããã</p>
<p>ããã§ã¯ãã¾ããã¹ãMR決å®æ¦2025ã§ä¼ãã¾ãããï¼</p>
<h2 id="We-are-hiring-">We are hiring !!</h2>
<p>ã¨ã ã¹ãªã¼AIã»æ©æ¢°å¦ç¿ãã¼ã ã§ã¯ãã©ãã©ãæ¹ä¿®ãé²ãã¦ããæ欲ã®ããã¨ã³ã¸ãã¢ãåéãã¦ãã¾ãã
æ°åã»ä¸éããããã®æ¡ç¨ã ãã§ãªããã«ã¸ã¥ã¢ã«é¢è«ãã¤ã³ã¿ã¼ã³ã常æåéãã¦ãã¾ãï¼</p>
<h3 id="ã¨ã³ã¸ãã¢æ¡ç¨ãã¼ã¸ã¯ãã¡ã">ã¨ã³ã¸ãã¢æ¡ç¨ãã¼ã¸ã¯ãã¡ã</h3>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjobs.m3.com%2Fengineer%2F" title="ã¨ã³ã¸ãã¢æ¡ç¨ãµã¤ãï½æ¡ç¨æ
å ± | å»çÃãã¯ããã¸ã¼ã®å¯è½æ§ã¯ç¡é大" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jobs.m3.com/engineer/">jobs.m3.com</a></cite></p>
<h3 id="ã«ã¸ã¥ã¢ã«é¢è«ããæ°è»½ã«ã©ãã">ã«ã¸ã¥ã¢ã«é¢è«ããæ°è»½ã«ã©ãã</h3>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjobs.m3.com%2Fengineer%2Fcasual-session%2F" title="ã¨ã³ã¸ãã¢æ¡ç¨ãµã¤ãï½æ¡ç¨æ
å ± | å»çÃãã¯ããã¸ã¼ã®å¯è½æ§ã¯ç¡é大" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jobs.m3.com/engineer/casual-session/">jobs.m3.com</a></cite></p>
<h3 id="ã¤ã³ã¿ã¼ã³ã常æåéãã¦ãã¾ã">ã¤ã³ã¿ã¼ã³ã常æåéãã¦ãã¾ã</h3>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fopen.talentio.com%2Fr%2F1%2Fc%2Fm3%2Fhomes%2F4354" title="ãæ°åãã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ã åéä¸è¦§ / ã¨ã ã¹ãªã¼æ ªå¼ä¼ç¤¾" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://open.talentio.com/r/1/c/m3/homes/4354">open.talentio.com</a></cite></p>
<div class="footnote">
<p class="footnote"><a href="#fn-ccb55186" id="f-ccb55186" name="f-ccb55186" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">Google Kubernetes Engine. Google Cloudãæä¾ããããã¼ã¸ãKubernetesã¯ã©ã¹ã¿ã¼</span></p>
<p class="footnote"><a href="#fn-8223f031" id="f-8223f031" name="f-8223f031" class="footnote-number">*2</a><span class="footnote-delimiter">:</span><span class="footnote-text">å¯ç¨æ§ãæ
ä¿ãããªãåé¢ãæ ¼å®ã§å©ç¨ã§ãããã¼ããPreemptible VM, Spot VMã¨ã</span></p>
<p class="footnote"><a href="#fn-b850bb85" id="f-b850bb85" name="f-b850bb85" class="footnote-number">*3</a><span class="footnote-delimiter">:</span><span class="footnote-text">ä¾ãã°ã社å
å¤ã®APIãªã©ãé£æºããã³ã³ãã¼ãã³ãã¸ã®çé</span></p>
<p class="footnote"><a href="#fn-1a67e341" id="f-1a67e341" name="f-1a67e341" class="footnote-number">*4</a><span class="footnote-delimiter">:</span><span class="footnote-text">åã«ãªãã©ã¤ä¸éãå¢ããã§ã解決ã§ãã¾ãããä¾ãã°ã³ã¼ãã®ãã°ãè¨å®ãã¹ãªã©ãªãã©ã¤ã§è§£æ±ºããªãå ´åã«ãä¸è¦ãªã¤ã³ã¹ã¿ã³ã¹ã®èµ·åæéã¨ããã«ä¼´ãè²»ç¨ãçºçãã¾ã</span></p>
</div>
inakam00
ã¯ããã¦ã®OSSã³ã³ããªãã¥ã¼ã
hatenablog://entry/6802418398311543945
2024-12-22T12:00:00+09:00
2024-12-22T12:36:30+09:00 ãã¡ãã¯ã¨ã ã¹ãªã¼ Advent Calendar 2024 22æ¥ç®ã®è¨äºã§ãã ããã«ã¡ã¯ã2024/10 ãã AIã»æ©æ¢°å¦ç¿ãã¼ã ã«ã¸ã§ã¤ã³ããé´¨ç°ã§ãã ç§ãæå±ããAIãã¼ã ã«ã¯ãæ©æ¢°å¦ç¿ãã½ããã¦ã§ã¢éçºã«æ·±ãç¥è¦ãæã¤ã¨ã³ã¸ãã¢ãéã¾ã£ã¦ãã¾ããæ¥ã
ã®ã³ã¼ãã¬ãã¥ã¼ãæè¡è°è«ãéãã¦ãããããªèãæ¹ããã£ãã®ããããã®å®è£
æ¹æ³ã¯åå¼·ã«ãªããã¨æ°ããçºè¦ã®é£ç¶ã§ããä»åã®OSSã³ã³ããªãã¥ã¼ãã¯ããã¼ã ã¡ã³ãã¼ãspotify/luigiã®åé¡ãç¹å®ããã³ã³ããªãã¥ã¼ãã®æ©ä¼ã¨ãã¦å
±æãã¦ããããã¨ããã£ããã§ããã æ¬ããã°ã§ã¯ç§ãã¨ã³ã¸ãã¢äººçã§åãã¦OSSã³ã³ããªãã¥ã¼ããâ¦
<p>ãã¡ãã¯<a href="https://qiita.com/advent-calendar/2024/m3">ã¨ã ã¹ãªã¼ Advent Calendar 2024</a> 22æ¥ç®ã®è¨äºã§ãã</p>
<p>ããã«ã¡ã¯ã2024/10 ãã AIã»æ©æ¢°å¦ç¿ãã¼ã ã«ã¸ã§ã¤ã³ããé´¨ç°ã§ãã
ç§ãæå±ããAIãã¼ã ã«ã¯ãæ©æ¢°å¦ç¿ãã½ããã¦ã§ã¢éçºã«æ·±ãç¥è¦ãæã¤ã¨ã³ã¸ãã¢ãéã¾ã£ã¦ãã¾ããæ¥ã
ã®ã³ã¼ãã¬ãã¥ã¼ãæè¡è°è«ãéãã¦ãããããªèãæ¹ããã£ãã®ããããã®å®è£
æ¹æ³ã¯åå¼·ã«ãªããã¨æ°ããçºè¦ã®é£ç¶ã§ããä»åã®OSSã³ã³ããªãã¥ã¼ãã¯ããã¼ã ã¡ã³ãã¼ã<a href="https://github.com/spotify/luigi">spotify/luigi</a>ã®åé¡ãç¹å®ããã³ã³ããªãã¥ã¼ãã®æ©ä¼ã¨ãã¦å
±æãã¦ããããã¨ããã£ããã§ããã</p>
<p>æ¬ããã°ã§ã¯ç§ãã¨ã³ã¸ãã¢äººçã§åãã¦OSSã³ã³ããªãã¥ã¼ããã話ãæ¸ãã¦ããã¾ããåãã¦ã®ã³ã³ããªãã¥ã¼ãç³»ã®è¨äºã¯æ¢ã«ããããã®äººã«æ²è¼ããã¦ãã¾ãã®ã§<a href="#f-2d1fcea9" id="fn-2d1fcea9" name="fn-2d1fcea9" title="ç§ãé²è¦§ããè¨äºï¼åèè¨äº1ãåèè¨äº2">*1</a>ããã®è¨äºã§ã¯AIãã¼ã ã®æåã絡ãã¦ãä¼ããããã¨æãã¾ãã</p>
<p><figure class="figure-image figure-image-fotolife" title="趣å³ã§è¡ã£ã¦ãããã«ããªã³ã°ã®å¤§ä¼äºé¸ã«åºå ´ããã¨ãã®æ§å"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241222/20241222120012.jpg" width="800" height="600" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>趣å³ã§è¡ã£ã¦ãããã«ããªã³ã°ã®å¤§ä¼äºé¸ã«åºå ´ããã¨ãã®æ§å</figcaption></figure></p>
<ul class="table-of-contents">
<li><a href="#OSSã³ã³ããªãã¥ã¼ãã®åæ©">OSSã³ã³ããªãã¥ã¼ãã®åæ©</a></li>
<li><a href="#ã³ã³ããªãã¥ã¼ãã®å®æ½">ã³ã³ããªãã¥ã¼ãã®å®æ½</a><ul>
<li><a href="#Git-forkã£ã¦ãªãã ">Git forkã£ã¦ãªãã ï¼</a></li>
<li><a href="#PRã®ä½æ">PRã®ä½æ</a></li>
<li><a href="#çæAIãæ´»ç¨ããDescriptionæ¬æä½æ">çæAIãæ´»ç¨ããDescription(æ¬æ)ä½æ</a></li>
</ul>
</li>
<li><a href="#ãã£ã¦ã¿ã¦ã®ææ³">ãã£ã¦ã¿ã¦ã®ææ³</a><ul>
<li><a href="#æå¤ã¨ãããªãçµãã£ã">æå¤ã¨ãããªãçµãã£ã</a></li>
<li><a href="#GitHubã³ãã³ãã便å©">GitHubã³ãã³ãã便å©</a></li>
<li><a href="#ãããããµãã¼ããã¦ããã ããç°å¢ã«å©ãããã">ãããããµãã¼ããã¦ããã ããç°å¢ã«å©ãããã</a></li>
<li><a href="#luigi-360ããªãªã¼ã¹ããã¾ãã">luigi 3.6.0ããªãªã¼ã¹ããã¾ããï¼</a></li>
</ul>
</li>
<li><a href="#ã¾ã¨ã">ã¾ã¨ã</a></li>
<li><a href="#We-are-hiring-">We are hiring !!</a><ul>
<li><a href="#ã¨ã³ã¸ãã¢æ¡ç¨ãã¼ã¸ã¯ãã¡ã">ã¨ã³ã¸ãã¢æ¡ç¨ãã¼ã¸ã¯ãã¡ã</a></li>
<li><a href="#ã«ã¸ã¥ã¢ã«é¢è«ããæ°è»½ã«ã©ãã">ã«ã¸ã¥ã¢ã«é¢è«ããæ°è»½ã«ã©ãã</a></li>
<li><a href="#ã¤ã³ã¿ã¼ã³ã常æåéãã¦ãã¾ã">ã¤ã³ã¿ã¼ã³ã常æåéãã¦ãã¾ã</a></li>
</ul>
</li>
</ul>
<h2 id="OSSã³ã³ããªãã¥ã¼ãã®åæ©">OSSã³ã³ããªãã¥ã¼ãã®åæ©</h2>
<p>ã¨ã ã¹ãªã¼æ ªå¼ä¼ç¤¾ãå
¬éãã¦ããOSSã®ä¸ã«gokartã¨ããæ©æ¢°å¦ç¿ãã¤ãã©ã¤ã³ãã¼ã«ãããã¾ããããã¯Spotify社ãéçºããluigiã®ã©ããã¼ã¨ãã¦éçºããã¾ããã</p>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fgithub.com%2Fspotify%2Fluigi" title="GitHub - spotify/luigi: Luigi is a Python module that helps you build complex pipelines of batch jobs. It handles dependency resolution, workflow management, visualization etc. It also comes with Hadoop support built in." class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://github.com/spotify/luigi">github.com</a></cite>
<iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fgithub.com%2Fm3dev%2Fgokart" title="GitHub - m3dev/gokart: Gokart solves reproducibility, task dependencies, constraints of good code, and ease of use for Machine Learning Pipeline." class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://github.com/m3dev/gokart">github.com</a></cite></p>
<p>gokartã«ãã£ã¦ã©ã®ãããªèª²é¡ã解決ã§ãããã¯Advent Calendar 2 æ¥ç®ã§æ± å¶ãããæ¸ãããè¨äºã«è©³ããè¨è¼ããã¦ãã¾ãã®ã§ããã²ã覧ãã ããã
<iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.m3tech.blog%2Fentry%2F2024%2F12%2F02%2F170000" title="MLOpsã®ãããããã課é¡ã®è§£æ±ºã¨ããã®ããã®ã©ã¤ãã©ãªgokart - ã¨ã ã¹ãªã¼ããã¯ããã°" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://www.m3tech.blog/entry/2024/12/02/170000">www.m3tech.blog</a></cite></p>
<p>ããæ¥ãAIãã¼ã ã§gokartãå©ç¨ãããããã¯ãã®å®è¡æã¨ã©ã¼ã解æãã¦ããã¨ãããã<code>luigi.TupleParameter().parse()</code>ã¯Stringãåãåãã¨ã¨ã©ã¼ã«ãªããã«ãæåãã¨ã«å解ãTupleã«å¤æãã¦ãã¾ããã¨ãããluigièµ·å ã®åé¡ã確èªãã¾ããã</p>
<p>luigiã§ã¯è¨å®å¤ã®åãã§ãã¯ãå®è¡æã«è¡ã£ã¦ãããéç解æãã§ããªãä»æ§ã¨ãªã£ã¦ãã¾ãã</p>
<p>ä¾ãã°æ¬¡ã®ãããªã±ã¼ã¹ã§åé¡ãçºçãã¾ãï¼</p>
<pre class="code lang-python" data-lang="python" data-unlink><span class="synComment"># config.cfg</span>
[TaskA]
tuple_param = <span class="synConstant">"('hoge')"</span> <span class="synComment"># ããã¯stråã§ããæ¬æ¥ã¯('hoge',)ã®ãããªå½¢å¼ãæ³å®ã(ã«ã³ãã大äº)</span>
<span class="synComment"># pipeline.py</span>
<span class="synStatement">class</span> <span class="synIdentifier">TaskA</span>(luigi.Task):
tuple_param:Tuple[<span class="synIdentifier">str</span>,...] = luigi.TupleParameter()
<span class="synStatement">def</span> <span class="synIdentifier">run</span>(self):
<span class="synComment"># tuple_paramã¯('h', 'o', 'g', 'e')ã¨ãã¦è§£éããã</span>
<span class="synComment"># å®è¡æã¾ã§ãã®åé¡ã«æ°ã¥ããªã</span>
</pre>
<p>ãã®ãããªåé¡ã¯ãæ©æ¢°å¦ç¿ãã¤ãã©ã¤ã³ã®å®å®éç¨ã«ããã¦éè¦ãªèª²é¡ã¨ãªããç¹ã«é·æéå®è¡ãããå¦çã®éä¸ã§æå³ããªãå¦çãçºçããã¨ãªã½ã¼ã¹ã®ç¡é§é£ãã«ã¤ãªãã£ã¦ãã¾ãã¾ãã
ä»åã®å ´åã¯ã<code>luigi.TupleParameter().parse()</code>ã«æåååã渡ã£ã¦ãã¾ã£ãã¨ãã«ã¨ã©ã¼ã¨ãããããªå¦çãå
¥ãããã¨ã«ãã¾ããã</p>
<p>åé¡ã®åå ã¨ããããã®å¯¾å¦æ³ããã£ããã«ã¦è°è«ãããå¾ã«ãAIãã¼ã å
ã§ã³ã³ããªãã¥ã¼ããä¿ãæ稿ãããã¾ããã</p>
<p><figure class="figure-image figure-image-fotolife" title="AIãã¼ã å
ã§ã³ã³ããªãã¥ã¼ããä¿ãæ稿ã"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241222/20241222120015.png" width="800" height="88" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>AIãã¼ã å
ã§ã³ã³ããªãã¥ã¼ããä¿ãæ稿ã</figcaption></figure></p>
<p>ã¨ã ã¹ãªã¼ã«ã¸ã§ã¤ã³ããã°ããã®ç§ã¯ã¨ã«ããè²¢ç®ãããæ°æã¡ãé«ã¾ã£ã¦ããææã§ããããããã«è©²å½åé¡ã®ä¿®æ£ã«åä¹ãåºã¾ããã</p>
<h2 id="ã³ã³ããªãã¥ã¼ãã®å®æ½">ã³ã³ããªãã¥ã¼ãã®å®æ½</h2>
<p>åé ã«ãè¨è¼ãã¾ããããæ¢ã«ããããã®äººãã³ã³ããªãã¥ã¼ãç³»è¨äºãè¨è¼ããã¦ãã¾ãã®ã§ãæé ã«ã¤ãã¦è©³ããè¨è¼ãã¾ãããç§ã®æ°ã¥ããå®è£
ãä¸å¿ã«è¨è¼ãããã¨æãã¾ãã</p>
<h3 id="Git-forkã£ã¦ãªãã ">Git forkã£ã¦ãªãã ï¼</h3>
<p>ã¨ã ã¹ãªã¼ãç§ã®ä»ã¾ã§ã®éçºã¯å°äººæ°ãã¼ã ãå¤ããæ¥åã§ã¯åä¸ãªã¢ã¼ããã©ã³ãã§éçºãè¡ã£ã¦ããã®ã§ãforkæåã«è§¦ããæ©ä¼ãããã¾ããã§ãã</p>
<p>å¤ãã®è¨äºã§ã¯ãã¾ãæåã«Gitãªãã¸ããªãforkããforkãããªãã¸ããªã«å¯¾ãã¦å¤æ´ãå ããæé ãç´¹ä»ããã¦ãã¾ããã</p>
<p>åæ¹ãªãã¸ããªãè¤è£½ãããã¨ã«å¤ããã¯ãªãã§ãããforkãå©ç¨ããã¨ãªãªã¸ãã«ãªãã¸ããªã¨ã®ç¹ãããç¶æããã¾ã¾ãç¬ç«ãã¦éçºå¯è½ã¨ã®ãã¨ã§ããã<a href="#f-8e36743d" id="fn-8e36743d" name="fn-8e36743d" title="åèã«ããè¨äº:https://qiita.com/morioka1206/items/6f777c060b88f4a7f3ce">*2</a></p>
<p>forkãã¦ã¬ãã¸ããªãä¹±ç«ããã¨éçºç¶æ³ãè¦ã«ãããªããããã«ãéçºä¸ã®ãã®ã¯PRã»ãã¼ã¸ãããªãéãæ¬å®¶ã¬ãã¸ããªã«å½±é¿ãåã¼ããªããã¨ããOSSã大è¦æ¨¡éçºãªãã§ã¯ã®ã¡ãªãããããããã§ããã</p>
<h3 id="PRã®ä½æ">PRã®ä½æ</h3>
<p>ä»åã®å ´åãæåååã渡ããéã«âæåãã¨ã«å解ãTupleã«å¤æããã¦ãã¾ãâã®ã¯æå³ããæåã§ã¯ãªãã®ã§ãæåååã渡ããéã¯ã¨ã©ã¼ã«ãªãããã«ä¿®æ£ãã¾ããã</p>
<pre class="code lang-diff" data-lang="diff" data-unlink> except (ValueError, TypeError):
<span class="synSpecial">- return tuple(literal_eval(x)) # if this causes an error, let that error be raised.</span>
<span class="synIdentifier">+ result = literal_eval(x)</span>
<span class="synIdentifier">+ # t_str = '("abcd")'</span>
<span class="synIdentifier">+ # Ensure that the result is not a string to avoid cases like ('a','b','c','d')</span>
<span class="synIdentifier">+ if isinstance(result, str):</span>
<span class="synIdentifier">+ raise ValueError("Parsed result cannot be a string")</span>
<span class="synIdentifier">+ return tuple(result) # if this causes an error, let that error be raised.</span>
</pre>
<p>ä½æããPRã¯<a href="https://github.com/spotify/luigi/pull/3323">ãã¡ã</a>ã§ãã<a href="#f-e8686bea" id="fn-e8686bea" name="fn-e8686bea" title="åãAIãã¼ã ã¡ã³ãã¼ãåºãã¦ããPRãåèã«ããã¦ããã ãã¾ãã">*3</a></p>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fgithub.com%2Fspotify%2Fluigi%2Fpull%2F3323" title="Validate str type before tuple cast by ikyasam18 · Pull Request #3323 · spotify/luigi" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://github.com/spotify/luigi/pull/3323">github.com</a></cite></p>
<h3 id="çæAIãæ´»ç¨ããDescriptionæ¬æä½æ">çæAIãæ´»ç¨ããDescription(æ¬æ)ä½æ</h3>
<p>çæAIã¨ã®å¯¾è©±ã¯æ¬¡ã®æµãã§å®æ½ããDescriptionãä½æãã¾ããã</p>
<p>è±èªã§PRä½æãããã¨ã«ä¸çªãã¼ãã«ãæãã¦ãã¾ããããçæAIãæ´»ç¨ãããã¨ã«ãã£ã¦ã¹ãã¬ã¹ãªãä½æ¥ã§ãã¾ããã</p>
<ol>
<li>ãPRã®ãã³ãã¬ã¼ãã¨PRã®å
容ãå
ã«é©å®è³ªåããªãã対話çã«ä½æãã¦ã»ããã ã¨ä¾é ¼</li>
<li>çæAIããã®è³ªåã«åçããªãããæçµçãªæç« ãä½æã
<ol>
<li>å
·ä½çã«ã©ã®ãããªåé¡ããã°ã解決ãããã®ãï¼</li>
<li>ã©ã®ããã«ãã¹ããããï¼</li>
</ol>
</li>
<li>ãã¹ããä½æãã¦ããªãã£ãã®ã§ããã¹ããå®è£
<ol>
<li>çæAIã«ãã¹ãå®è£
å
容ãé£æºãé©åãªã³ãããã¡ãã»ã¼ã¸ãææ¡ãã¦ããã</li>
</ol>
</li>
<li>æçµçãªDescriptionã®ä½æãçæAIã«ä¾é ¼</li>
</ol>
<p><figure class="figure-image figure-image-fotolife" title="çæAIãç¨ãã¦PRå
容ãä½æãã¦ããæ§å"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241222/20241222120018.png" width="800" height="714" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>çæAIãç¨ãã¦PRå
容ãä½æãã¦ããæ§å</figcaption></figure></p>
<p>çæããDescriptionãã©ãã»ã©éåæã®ãªãè¨ãåãã ã£ãããããã¾ããããç¡äºãã¼ã¸ãã¦ããã ããã®ã§æä½éå®è£
ã®å
容ã解決ããã課é¡ã«ã¤ãã¦ã¯ä¼ãã£ãã®ããªã¨æãã¾ããã</p>
<h2 id="ãã£ã¦ã¿ã¦ã®ææ³">ãã£ã¦ã¿ã¦ã®ææ³</h2>
<h3 id="æå¤ã¨ãããªãçµãã£ã">æå¤ã¨ãããªãçµãã£ã</h3>
<p>OSSã³ã³ããªãã¥ã¼ãã¯ã¨ã¦ããã¼ãã«ãé«ãã¤ã¡ã¼ã¸ã§ããããããçµãã£ã¦ã¿ãã¨ãã¾ããã£ã¦ã¿ããããªãã¨æããããããã£ããçµããã¾ããã</p>
<h3 id="GitHubã³ãã³ãã便å©">GitHubã³ãã³ãã便å©</h3>
<p>AIãã¼ã ã®åå·ããã«æãã¦ããã ãæ©é使ã£ã¦ã¿ãã®ã§ãããã¨ã¦ã便å©ã ã£ãã®ã§å
±æãã¾ãã</p>
<p>å¾æ¥ãªãã¸ããªã®forkã¯GitHubãªã©ã®ãã¹ãã£ã³ã°ãµã¼ãã¹ä¸ã§æä½ãè¡ãå¿
è¦ãããã¾ããã
ä¸æ¹ãGitHub CLIï¼Command Line Interfaceï¼ã®ã³ãã³ã<code>gh repo fork</code> 㯠ã以ä¸ã®ãããªç¹å¾´ãããã¾ãã</p>
<ul>
<li>ã³ãã³ãã©ã¤ã³ããç´æ¥GitHubãªãã¸ããªããã©ã¼ã¯ã§ãã</li>
<li>ãã©ã¼ã¯å¾ã«èªåçã«ãã¼ã«ã«ã¯ãã¼ã³ãä½æãããªãã·ã§ã³ãããã</li>
<li>ãªã¢ã¼ãã®è¨å®ï¼upstreamçï¼ãèªåçã«è¡ããã</li>
</ul>
<p>å人çã«ã¯â ãªã¢ã¼ãã®è¨å®ï¼upstreamçï¼ãèªåçã«è¡ããâã«ã¨ã¦ãå©ããããæé ãç°¡ç¥åããæä½ãã¹ãæ¸ãããã¨æãã¦ãã¾ãã</p>
<h3 id="ãããããµãã¼ããã¦ããã ããç°å¢ã«å©ãããã">ãããããµãã¼ããã¦ããã ããç°å¢ã«å©ãããã</h3>
<p>å®éã®ä½æ¥ã§ã¯ããã¹ãã³ã¼ãã®å®è£
å ´æãå¹æçãªGitã³ãã³ãã®ä½¿ãæ¹ãªã©ãå
·ä½çã§å®è·µçãªã¢ããã¤ã¹ãããã ãã¾ãããç¹ã«å°è±¡çã ã£ãã®ã¯ãèªèº«ã®æ¥åã«ç´æ¥ã¯é¢ä¿ãªãã¦ããã¼ã ã¡ã³ãã¼ãç©æ¥µçã«ãµãã¼ããã¦ããã姿å¢ã§ãããããã£ã¦ã©ãããã°ããã§ããï¼ãã¨ããåæ©çãªè³ªåã«ãããã¤ãä¸å¯§ã«åçããã ããOSSã³ã³ããªãã¥ã¼ãã¨ããæ°ãããã£ã¬ã³ã¸ã楽ããé²ãããã¨ãã§ãã¾ããã</p>
<p>AIãã¼ã ã®ã³ãã¥ãã±ã¼ã·ã§ã³ã«ã¤ãã¦ã¯<a href="https://www.m3tech.blog/entry/2024/12/07/110000">ã¢ããã³ãã«ã¬ã³ãã¼7æ¥ç®ã®è¨äº</a>ã«ä¸é¨è¨è¼ããã¦ãã¾ãã®ã§ãããããã°ãã¡ããã覧ãã ããï¼</p>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.m3tech.blog%2Fentry%2F2024%2F12%2F07%2F110000" title="ãªã¢ã¼ãã¯ã¼ã¯æ代ãçãæãAIã»æ©æ¢°å¦ç¿ãã¼ã ã®åãæ¹ - ã¨ã ã¹ãªã¼ããã¯ããã°" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://www.m3tech.blog/entry/2024/12/07/110000">www.m3tech.blog</a></cite></p>
<p>ãã¼ã ã§ã¯å¼ãç¶ãOSSã³ã³ããªãã¥ã¼ãã®ãã£ã³ã¹ãããããããã®ã§ãä»å¾ãç©æ¥µçã«ãã£ã¬ã³ã¸ãã¦ããããã¨æãã¾ãï¼</p>
<h3 id="luigi-360ããªãªã¼ã¹ããã¾ãã">luigi 3.6.0ããªãªã¼ã¹ããã¾ããï¼</h3>
<p>New Contributorsã¨ãã¦ç´¹ä»ããã¦ããããã¡ããã¨ç´¹ä»ãã¦ããã¦ããï¼ãã¨å¬ãããªãä¸æ¹ã§ããªãã¸ããªã®çºå±ã«é¢ããä¸å¡ã¨ãã¦ã®èªè¦ãããä¸å±¤å¼·ã¾ãã¾ããã</p>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fgithub.com%2Fspotify%2Fluigi%2Freleases%2Ftag%2Fv3.6.0" title="Release 3.6.0 · spotify/luigi" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://github.com/spotify/luigi/releases/tag/v3.6.0">github.com</a></cite></p>
<h2 id="ã¾ã¨ã">ã¾ã¨ã</h2>
<p>ä»åã¯ç§ãã¨ã³ã¸ãã¢äººçã§åãã¦OSSã³ã³ããªãã¥ã¼ããã話ã¨AIãã¼ã ã®æåã«ã¤ãã¦ãç´¹ä»ãã¾ããã
ã¿ãªããã®OSSã³ã³ããªãã¥ã¼ãããã¥ã¼ã®ãã£ããã«ãã¦ããã ããããAIãã¼ã ã®æ¸©ããæåãå°ãã§ãæãã¦ããã ãããå¬ããã§ãã</p>
<h2 id="We-are-hiring-">We are hiring !!</h2>
<p>ã¨ã ã¹ãªã¼ã§ã¯çµ¶è³ã¨ã³ã¸ãã¢ãåéä¸ã§ãï¼
OSSã³ã³ããªãã¥ã¼ãã«éãããã¾ãã¾ãªãã¨ã«ãã£ã¬ã³ã¸ãã¦ã¿ããæ¹ã¯æ¯éãå¿åãã ããï¼</p>
<h3 id="ã¨ã³ã¸ãã¢æ¡ç¨ãã¼ã¸ã¯ãã¡ã">ã¨ã³ã¸ãã¢æ¡ç¨ãã¼ã¸ã¯ãã¡ã</h3>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjobs.m3.com%2Fengineer%2F" title="ã¨ã³ã¸ãã¢æ¡ç¨ãµã¤ãï½æ¡ç¨æ
å ± | å»çÃãã¯ããã¸ã¼ã®å¯è½æ§ã¯ç¡é大" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jobs.m3.com/engineer/">jobs.m3.com</a></cite></p>
<h3 id="ã«ã¸ã¥ã¢ã«é¢è«ããæ°è»½ã«ã©ãã">ã«ã¸ã¥ã¢ã«é¢è«ããæ°è»½ã«ã©ãã</h3>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjobs.m3.com%2Fengineer%2Fcasual-session%2F" title="ã¨ã³ã¸ãã¢æ¡ç¨ãµã¤ãï½æ¡ç¨æ
å ± | å»çÃãã¯ããã¸ã¼ã®å¯è½æ§ã¯ç¡é大" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jobs.m3.com/engineer/casual-session/">jobs.m3.com</a></cite></p>
<h3 id="ã¤ã³ã¿ã¼ã³ã常æåéãã¦ãã¾ã">ã¤ã³ã¿ã¼ã³ã常æåéãã¦ãã¾ã</h3>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fopen.talentio.com%2Fr%2F1%2Fc%2Fm3%2Fhomes%2F4354" title="ãæ°åãã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ã åéä¸è¦§ / ã¨ã ã¹ãªã¼æ ªå¼ä¼ç¤¾" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://open.talentio.com/r/1/c/m3/homes/4354">open.talentio.com</a></cite></p>
<div class="footnote">
<p class="footnote"><a href="#fn-2d1fcea9" id="f-2d1fcea9" name="f-2d1fcea9" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">ç§ãé²è¦§ããè¨äºï¼<a href="https://qiita.com/yoyoyo_pg/items/476411a3a63d9c7524e6">åèè¨äº1</a>ã<a href="https://speakerdeck.com/youkidearitai/hazimetenoosskontoribiyuto">åèè¨äº2</a></span></p>
<p class="footnote"><a href="#fn-8e36743d" id="f-8e36743d" name="f-8e36743d" class="footnote-number">*2</a><span class="footnote-delimiter">:</span><span class="footnote-text">åèã«ããè¨äº:<a href="https://qiita.com/morioka1206/items/6f777c060b88f4a7f3ce">https://qiita.com/morioka1206/items/6f777c060b88f4a7f3ce</a></span></p>
<p class="footnote"><a href="#fn-e8686bea" id="f-e8686bea" name="f-e8686bea" class="footnote-number">*3</a><span class="footnote-delimiter">:</span><span class="footnote-text">åãAIãã¼ã ã¡ã³ãã¼ãåºãã¦ãã<a href="https://github.com/spotify/luigi/pull/3315">PR</a>ãåèã«ããã¦ããã ãã¾ãã</span></p>
</div>
kamo2kun
ãã®ã¼ã¯ããéãå¦ã³è - 11年以ä¸ç¶ãM3 Tech Talkãæ¯ããæ
ç±ã«è¿«ã
hatenablog://entry/6802418398312980897
2024-12-21T12:00:00+09:00
2024-12-21T12:00:01+09:00 ã¨ã ã¹ãªã¼ã§ã¯ã社å¡ã®æè¡ååä¸ã¨äº¤æµãç®çã¨ãã社å
åå¼·ä¼ãM3 Tech Talkããå®æçã«éå¬ãã¦ãã¾ããTech Talkã¯ã2013å¹´ããç¶ãæ´å²ããåå¼·ä¼ã§ãæ¯åæ§ã
ãªãã¼ãã®çºè¡¨ãè¡ããã社å¡ãã好è©ãå¾ã¦ãã¾ãã
ä»åã¯ã6å¹´åã¨ããé·ãã«ãããTech Talkã®ãªã¼ã¬ãã¤ã¶ã¼ãåããæå·ã«ã¤ã³ã¿ãã¥ã¼ãè¡ããTech Talkã®è£å´ãããªã¼ã¬ãã¤ã¶ã¼ã¨ãã¦ã®è¦å´ãããã¦Tech Talkã«å¯¾ããç±ãæ³ãã伺ãã¾ããã
<p><em>ãã®è¨äºã¯<a href="https://qiita.com/advent-calendar/2024/m3">ã¨ã ã¹ãªã¼Advent Calendar 2024</a> 21æ¥ç®ã®è¨äºã§ã</em></p>
<p><span class="hidden">
ããã«ã¡ã¯ãæå·ã§ãã
</span></p>
<p>ã¨ã ã¹ãªã¼ã§ã¯ã社å¡ã®æè¡ååä¸ã¨äº¤æµãç®çã¨ãã社å
åå¼·ä¼ãM3 Tech Talkããå®æçã«éå¬ãã¦ãã¾ããTech Talkã¯ã2013å¹´ããç¶ãæ´å²ããåå¼·ä¼ã§ãæ¯åæ§ã
ãªãã¼ãã®çºè¡¨ãè¡ããã社å¡ãã好è©ãå¾ã¦ãã¾ãã</p>
<p><span class="hidden">
æ¬è¨äºã§ã¯ããã®Tech Talkã®ãªã¼ã¬ãã¤ã¶ã¼ãä»å¹´éä¸ã¾ã§ã®ç´6å¹´ååãããã¨ã«ã¤ãã¦ãGeminiã«æ ¹æãèæãèãã¦ããã£ãã¤ã³ã¿ãã¥ã¼ããå±ããã¾ãã
</span>
<span class="after-hidden">
ä»åã¯ã6å¹´åã¨ããé·ãã«ãããTech Talkã®ãªã¼ã¬ãã¤ã¶ã¼ãåããæå·ã«ã¤ã³ã¿ãã¥ã¼ãè¡ããTech Talkã®è£å´ãããªã¼ã¬ãã¤ã¶ã¼ã¨ãã¦ã®è¦å´ãããã¦Tech Talkã«å¯¾ããç±ãæ³ãã伺ãã¾ããã
</span></p>
<p><button class="hidden" id="back-to-about">å
ã®ä½ç½®ã«æ»ã</button></p>
<p><figure class="figure-image figure-image-fotolife" title="12/20ã®ãªãã©ã¤ã³éå¬ã§ã¯ãæ®æ®µé¢è¥¿ã«ä½ãã§ããã¡ã³ãã¼ãéã¾ã大çæ³ã«çµãã£ã"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241221/20241221120009.jpg" width="800" height="420" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>12/20ã®ãªãã©ã¤ã³éå¬ã§ã¯ãæ®æ®µé¢è¥¿ã«ä½ãã§ããã¡ã³ãã¼ãéã¾ããªã©å¤§çæ³ã«çµãã£ã</figcaption></figure></p>
<ul class="table-of-contents">
<li><a href="#M3-Tech-Talkã¨ã¯">M3 Tech Talkã¨ã¯ï¼</a></li>
<li><a href="#ãªã¼ã¬ãã¤ã¶ã¼ã¨ãã¦ã®è¦å´ã¨å·¥å¤«">ãªã¼ã¬ãã¤ã¶ã¼ã¨ãã¦ã®è¦å´ã¨å·¥å¤«</a></li>
<li><a href="#6å¹´åã®ã¢ããã¼ã·ã§ã³">6å¹´åã®ã¢ããã¼ã·ã§ã³</a></li>
<li><a href="#Tech-Talkããããããã®">Tech Talkããããããã®</a></li>
<li><a href="#ä»å¾ã®å±æ">ä»å¾ã®å±æ</a></li>
<li><a href="#ã¾ã¨ã">ã¾ã¨ã</a></li>
<li><a href="#ãã®è¨äºã«ã¤ãã¦">ãã®è¨äºã«ã¤ãã¦</a></li>
<li><a href="#ããã³ããã«ã¤ãã¦">ããã³ããã«ã¤ãã¦</a></li>
<li><a href="#å®é使ã£ã¦ã¿ã¦ã®ææ³">å®é使ã£ã¦ã¿ã¦ã®ææ³</a></li>
<li><a href="#ã¾ã¨ã-1">ã¾ã¨ã</a></li>
<li><a href="#We-are-hiring">We are hiring!!</a></li>
</ul>
<style>
.hidden {
display: none;
}
.revail .hidden {
display: inherit;
animation: blur 2s ease 2.5s backwards reverse;
-webkit-animation: blur 2s ease 2.5s backwards reverse;
-moz-animation: blur 2s ease 2.5s backwards reverse;
}
.revail .after-hidden {
animation: blur 2s ease 1.5s forwards;
-webkit-animation: blur 2s ease 1.5s forwards;
-moz-animation: blur 2s ease 1.5s forwards;
max-height: 0px;
overflow: hidden;
display: inline-block;
}
ul.table-of-contents > li:nth-child(n+7):nth-child(-n+10) {
display: none;
}
.revail ul.table-of-contents > li:nth-child(6) {
display: none;
}
.revail ul.table-of-contents > li:nth-child(n+7):nth-child(-n+10) {
display: inherit;
}
.lines {
width: 100%;
display: flex;
vertical-align: middle;
margin-bottom: 16px;
}
span.bubbles {
white-space: break-spaces;
display: inline;
flex: 1;
background-color: #fff8e8;
padding: 8px;
margin-left: 16px;
border-radius: 4px;
}
.lines.interviewer span.bubbles {
background-color: #eee;
}
span.bubbles:before {
content: "";
background-color: #fff8e8;
rotate: 45deg;
width: 16px;
height: 16px;
display: block;
position: absolute;
margin-left: -16px;
margin-top: 16px;
z-index: 0;
}
.lines.interviewer span.bubbles:before {
background-color: #eee;
}
span.icon {
width: 64px;
height: 64px;
display: inline-block;
border-radius: 32px;
margin-right: 8px;
background-size: contain;
border: 0.5px solid #eeeeee;
}
.lines.interviewer span.icon{
background-image: url("https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241221/20241221120016.jpg");
}
.lines.oboenikui span.icon {
background-image: url("https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241221/20241221120013.png");
}
span.icon:after {
display: block;
position: relative;
width: 64px;
margin-top: 64px;
text-align: center;
font-size: 0.6em;
}
@media (max-width: 767px) {
span.icon {
width: 48px;
height: 48px;
border-radius: 24px;
margin-right: 4px;
}
span.icon:after {
width: 48px;
margin-top: 48px;
}
span.bubbles:before {
margin-top: 12px;
z-index: 0;
}
}
.lines.oboenikui span.icon:after {
content: "æå·";
}
.entry.revail .lines.interviewer span.icon:after {
content: "Gemini";
}
#ai-conclusion {
display: block;
overflow: hidden;
}
#ai-conclusion:after {
content: "æå·ã¸ã®ã¤ã³ã¿ãã¥ã¼ãéãã¦ãM3 Tech Talkãåãªã社å
åå¼·ä¼ã§ã¯ãªãã社å¡å士ã®äº¤æµãæ·±ããå¦ã³ãä¿é²ããããã¦ä¼ç¤¾å
¨ä½ã®æé·ãæ¯ããéè¦ãªå½¹å²ãæ
ã£ã¦ãããã¨ãå®æãã¾ããã6å¹´åãã®éããªã¼ã¬ãã¤ã¶ã¼ã¨ãã¦Tech Talkãæ¯ãç¶ãã¦ããæ
ç±ã¨ãM3ã®ã¨ã³ã¸ãã¢ãã¡ã®æè¡ã«å¯¾ããæ¢ç©¶å¿ãäºãã«é«ãåã社風ã«æ·±ãæéãåãã¾ããã";
}
#ã¾ã¨ã {
overflow: hidden;
}
#spacer {
height: 4000px;
}
.entry.revail #spacer {
animation: erase-space 2s ease forwards;
-webkit-animation: erase-space 2s ease forwards;
-moz-animation: erase-space 2s ease forwards;
}
.entry.revail #ã¾ã¨ã, .entry.revail #ai-conclusion {
animation: partial-blur 3s ease forwards;
-webkit-animation: partial-blur 3s ease forwards;
-moz-animation: partial-blur 3s ease forwards;
}
a.disappear {
animation: blur 2s ease forwards;
-webkit-animation: blur 2s ease forwards;
-moz-animation: blur 2s ease forwards;
}
@keyframes partial-blur {
from {
opacity: 100;
transform: translate(0, 0);
max-height: 500px;
}
to {
filter: blur(50px);
opacity: 0;
transform: translate(100px, 0);
max-height: 0;
}
}
@keyframes blur {
from {
filter: blur(0px);
opacity: 100;
transform: translate(0, 0);
max-height: 500px;
}
to {
filter: blur(50px);
opacity: 0;
transform: translate(100px, 0);
max-height: 0;
}
}
@keyframes erase-space {
from {
height: 4000px
}
to {
height: 0;
}
}
</style>
<h2 id="M3-Tech-Talkã¨ã¯">M3 Tech Talkã¨ã¯ï¼</h2>
<div class="lines interviewer">
<span class="icon"></span>
<span class="bubbles">æå·ãããæ¬æ¥ã¯ãããããé¡ããããã¾ãã6å¹´åãã®éãM3 Tech Talkã®ãªã¼ã¬ãã¤ã¶ã¼ãåããããã¨ã®ãã¨ã§ãããã¾ãã¯Tech Talkã«ã¤ãã¦ç°¡åã«ãç´¹ä»ããã ãã¾ããï¼</span>
</div>
<div class="lines oboenikui">
<span class="icon"></span>
<span class="bubbles">ã¯ãããããããé¡ããã¾ããM3 Tech Talkã¯ãéé±ã§éææ¥ã«éå¬ãã¦ãã社å
ã®æè¡åå¼·ä¼ã§ãã2013å¹´ããç¶ç¶ãã¦éå¬ãã¦ãããæ¨æ¥ã®éå¬ã§260åç®ãè¿ãã¾ãããæ®æ®µã¯æ¯å3~4åã®æ¹ã«15åã»ã©ã®LTããã¦ããã£ã¦ãã¾ãã</span>
</div>
<div class="lines interviewer">
<span class="icon"></span>
<span class="bubbles">ãããã¨ããããã¾ãã15åã»ã©ã®LTã¨ãããã¨ã§ãããå
容ã¯æè¡çãªãã®ã«éããã¦ããã®ã§ããããï¼ ã¾ããçºè¡¨è
ã¯ã©ã®ããã«é¸ã°ãã¦ããã®ã§ããï¼</span>
</div>
<div class="lines oboenikui">
<span class="icon"></span>
<span class="bubbles">ã½ããã¦ã§ã¢ã¨ã³ã¸ãã¢ãå¤æ°ã®ãããITæè¡ã«ã¤ãã¦ã®çºè¡¨ãå¤ãã§ãããçºè¡¨å
容ã¯åºæ¬çã«ã¯ç»å£è
ã«ä»»ãããã¦ãã¾ããéå»ã«ã¯ãDIYã§åã©ãã®ããã®ããã¡ããä½ã話ã®ãããªãã¼ãã¦ã§ã¢å¯ãã®è©±ããã£ããããã£ã¨éãåéã ã¨ããã¸ã§ã¯ãããã¼ã¸ã£ã¼ãä¼ç»ç³»ã®è·ç¨®ã®æ¹ãç»å£ãã¦ãã ãã£ãããç
æ°ã®çµé¨ãåºã«å¥åº·ã«ã¤ãã¦è©±ãããæ¹ãããã£ãããã¾ããã</span>
</div>
<p><br/>
<figure class="figure-image figure-image-fotolife" title="ITæè¡ä»¥å¤ã®è©±ãã¨ã ã¹ãªã¼å
¬å¼ããã¯ãã£ã³ãã«ã®Top3ã«å
¥ã£ã¦ããããã">
<iframe width="560" height="315" src="https://www.youtube.com/embed/7JLA0a_ENHQ?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen title="ãªããªãåæã®å°çãM3 Tech Talk 第171åã"></iframe><cite class="hatena-citation"><a href="https://www.youtube.com/watch?v=7JLA0a_ENHQ">www.youtube.com</a></cite>
<figcaption>ITæè¡ä»¥å¤ã®è©±ãã¨ã ã¹ãªã¼å
¬å¼ããã¯ãã£ã³ãã«ã®Top3ã«å
¥ã£ã¦ããããã</figcaption></figure></p>
<p><br/></p>
<div class="lines oboenikui">
<span class="icon"></span>
<span class="bubbles">çºè¡¨è
ã®æ±ºå®æ¹æ³ã¯ææå¶ã§ããç»å£è
ãå°ãªãã£ãææã¯ä»ã®ã¡ã³ãã¼ããæ¨è¦ããã¦çºè¡¨ããæ¹ãããã£ãããã¾ããããç¾å¨ã¯èªä¸»çã«çºè¡¨ããæ¹ã ãã§æ ãåã¾ãããã«ãªã£ã¦ãã¾ããç§ã®ç¥ãéãã§ã¯æã¡åãå¶ã«ãã¦ããææã¯ããã¾ããã</span>
</div>
<div class="lines interviewer">
<span class="icon"></span>
<span class="bubbles">ãªãã»ã©ãæè¡çãªå
容ã«éãããå¤æ§ãªãã¼ãã®çºè¡¨ããããã§ãããä¼ç»ç³»ã®è·ç¨®ã®æ¹ãããèªèº«ã®ç
æ°ã«ã¤ãã¦è©±ãããæ¹ãããã¨ããã®ã¯èå³æ·±ãã§ããçºè¡¨è
ãèªä¸»çã«æãæããã¨ããã®ã¯ãããã ã社å¡ã®æ¹ã
ãç©æ¥µçã«å¦ã³ãæ·±ããå
±æãããã¨ããæèãé«ãã¨ãããã¨ã§ããããï¼</span>
</div>
<div class="lines oboenikui">
<span class="icon"></span>
<span class="bubbles">ããã§ããããããã£ãæåã¯æ ¹ä»ãã¦ããã¨æãã¾ããå¼ç¤¾ã®ã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ãã形容ããåèªã¨ãã¦ãã®ã¼ã¯ããå¤ç¨ãããã»ã©ãæè¡ã好ããªã¨ã³ã¸ãã¢ãå¤ãå¨ç±ãã¦ãã¾ããããããèæ¯ãããæè¡çãªãããã¯ããé¢ç½ããã¨æããã¡ã³ãã¼ãå¤ãããã®ã§ãèªãã¨ãã®ãããªæèãé«ããªã£ã¦ããã®ã ã¨æãã¾ãã</span>
</div>
<div class="lines interviewer">
<span class="icon"></span>
<span class="bubbles">ãªãã»ã©ããã®ã¼ã¯ãã¨ããè¨èãå¤ç¨ãããã»ã©ãæè¡å¥½ããªã¨ã³ã¸ãã¢ãå¤ãã¨ããã®ã¯ç´ æ´ãããã§ãããTech Talkã®ãããªå ´ããããã¨ã§ããããã£ãæ¹ã
ãç¥èãçµé¨ãå
±æããäºãã«åºæ¿ãåããã¨ãã§ããã¨ããã®ã¯ãä¼ç¤¾ã«ã¨ã£ã¦ã大ããªã¡ãªããã«ãªãããã§ãã</span>
</div>
<h2 id="ãªã¼ã¬ãã¤ã¶ã¼ã¨ãã¦ã®è¦å´ã¨å·¥å¤«">ãªã¼ã¬ãã¤ã¶ã¼ã¨ãã¦ã®è¦å´ã¨å·¥å¤«</h2>
<div class="lines interviewer">
<span class="icon"></span>
<span class="bubbles">ã¨ããã§ãæå·ããã¯6å¹´åã¨ããé·ãéãTech Talkã®ãªã¼ã¬ãã¤ã¶ã¼ãåãã¦ãããã¾ãããããã®ä¸ã§ä½ãè¦å´ããããã¨ãã大å¤ã ã£ããã¨ã¯ããã¾ããï¼</span>
</div>
<div class="lines oboenikui">
<span class="icon"></span>
<span class="bubbles">è²ã
ããã¾ãããâ¦â¦
ã¾ã2020å¹´ã®ã³ããç¦ã§ãã¿ããªã§éã¾ããªããªã£ããã¨ã§ãããããããã¾ã§ã¯ç¤¾å
ã®åºãä¼è°å®¤ã§éå¬ãã¦ãã¾ããããéã¾ããã¨ãã§ããªããªã£ã¦ãã¾ã£ãã®ã§ãä¸æä¼æ¢ã¨ãªãã¾ããã
2ã¶æéã®ä¼æ¢ã®å¾ã«ãZoomã使ã£ã¦ãªã³ã©ã¤ã³éå¬ããããã«ãªãããããä»ã§ãå®çãã¦ãã¾ãã(â»)
ä»ã«ã¯ããªããªãç»å£è
ãéã¾ããªãã£ããã¨ããèªåãä¼æãåãã¥ããã£ããã¨ãªã©ãããã¾ãç¬
<span style="font-size:0.8em">â» ç¾å¨ã¯å¹´2åã»ã©æå¿è
ãä¼ç»ãããªãã©ã¤ã³éå¬ãè¡ããã¦ãã</span></span>
</div>
<div class="lines interviewer">
<span class="icon"></span>
<span class="bubbles">ã³ããç¦ã§ä¸æä¼æ¢ã«ãªã£ããããªã³ã©ã¤ã³éå¬ã¸ã®ç§»è¡ãªã©ãéå¶æ¹æ³ã大ããå¤ãã£ããã§ãããçºè¡¨è
ãéã¾ããªãã£ãææããã£ãã¨ã®ãã¨ã§ãããã©ã®ããã«ä¹ãè¶ããããã®ã§ããããï¼</span>
</div>
<div class="lines oboenikui">
<span class="icon"></span>
<span class="bubbles">çºè¡¨è
ã®éã¾ãå
·åã¨ããã®ã¯æ³¢ããã£ã¦ã人ã®å
¥ãæ¿ãããå½¹è·ãå¤ããã¿ã¤ãã³ã°ã§å¢æ¸ããå¾åãããã¾ãããç»å£ã«ç©æ¥µçãªäººãå
¥ç¤¾ããããéã«ãããã£ãæ¹ãéè·ãããããã¨ãçºè¡¨è
ãæ¸ã£ã¦ãã¾ããã¨ãããã¾ãããã
éã«çºè¡¨ããã人ãå¢ãããã¦ãæ¯é±éå¬ãã¦ããææããã£ããã§ããã</span>
</div>
<div class="lines oboenikui">
<span class="icon"></span>
<span class="bubbles">ãªã¼ã¬ãã¤ã¶ã¼ã¨ãã¦ã¯ãã©ããªæã§ãæä½ã§ãéé±éå¬ãç¶ç¶ãããã¨ãç®æ¨ã«ãã¦ãã¾ãããææå¶ãªã®ã§ãçºè¡¨è
ãæ¸ã£ã¦ãã¦ããå¾åã¯ã¤ãã¿ããããã§ãã
å¾åãæããã¨ãã¯ãç»å£æªçµé¨ã®æ¹ãçºè¡¨ããããããã«ã5åLTä¼ããã¼ã ç¹éåã¨ãã£ãä¼ç»ãå®æ½ãã¾ããããã¼ã ç¹éåã¯ãåããã¼ã ã®ã¡ã³ãã¼ããã¼ã ã§å©ç¨ãã¦ããæè¡ãªã©ãç´¹ä»ããåã§ãããç¹å®ã®æè¡ã«ç¦ç¹ãå½ã¦ãç¹éåãéå¬ãããã¨ãããã¾ããã
ãã以å¤ã«ããç§èªèº«Tech Talkã§ããçºè¡¨ãã¦ããã®ã§ãããç»å£è
ãå°ãªãåã«ã¯ãç©æ¥µçã«çºè¡¨ããããã«ãã¦ãã¾ããã</span>
</div>
<div class="lines oboenikui">
<span class="icon"></span>
<span class="bubbles">ããã¨ãããã¯ç§ããã£ããã¨ã§ã¯ãªãã®ã§ãããAIãã¼ã ã®ã¡ã³ãã¼ã¯å
¥ç¤¾å¾ããã«Tech Talkã§çºè¡¨ãã¦ããããã§ãããããã£ãé°å²æ°ãä½ã£ã¦ããã¦ããã®ã¯ãæ¬å½ã«ãããããã§ããã</span>
</div>
<p><br/></p>
<p><figure class="figure-image figure-image-fotolife" title="AIãã¼ã ã¯å¹´æ«ã«ãã¼ã å
ã§ã¤ã³ãã¯ãã®å¤§ããã£ãPRãæ票ãåãã®ãæä¾ã«ãªã£ã¦ãã">
<iframe width="560" height="315" src="https://www.youtube.com/embed/2uhesE2jp5c?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen title="2022年度AIãã¼ã æé«ã®MRâ¢PRããã¹ã10決å®æ¦ãM3 Tech Talk 第211åã"></iframe><cite class="hatena-citation"><a href="https://www.youtube.com/watch?v=2uhesE2jp5c">www.youtube.com</a></cite>
<figcaption>AIãã¼ã ã¯å¹´æ«ã«ãã¼ã å
ã§ã¤ã³ãã¯ãã®å¤§ããã£ãPRãæ票ãåãã®ãæä¾ã«ãªã£ã¦ãã</figcaption></figure></p>
<p><br/></p>
<h2 id="6å¹´åã®ã¢ããã¼ã·ã§ã³">6å¹´åã®ã¢ããã¼ã·ã§ã³</h2>
<div class="lines interviewer">
<span class="icon"></span>
<span class="bubbles">ã話ãã伺ããã¦ããã¨ãTech Talkãçãä¸ãããã¨ãæå·ããèªèº«ãç¸å½ãªåªåãããã¦ãããã§ããã6å¹´åããªã¼ã¬ãã¤ã¶ã¼ãç¶ããããã¢ããã¼ã·ã§ã³ã¯ä½ã ã£ãã®ã§ããããï¼</span>
</div>
<div class="lines oboenikui">
<span class="icon"></span>
<span class="bubbles">ãã£ã¨ããããã¦å½ããåã«ãªã£ã¦ããã®ã§ãã¾ãèãããã¨ããªãã£ãã§ãããã¾ãTech Talkã好ãã ããç¶ãããããã ã¨æãã¾ããã¾ãã社å¤ã§ãã«ã³ãã¡ã¬ã³ã¹éå¶ã«æºãã£ã¦ããã®ã§ããããã£ã社å
ã³ãã¥ããã£æ´»åã®å½¹åããè¦ã§ã¯ãªãã£ããããã¨ããã®ãããã¨æãã¾ãã
å¸ä¼ã¯æã¡åãå¶ã§ãè¯ãã£ãããããªããã¨æã£ã¦ãã¾ãããä¼çµ±çã«ããã ã£ãã®ã§ãã¾ãèãã¦ãã¾ããã§ããç¬</span>
</div>
<div class="lines oboenikui">
<span class="icon"></span>
<span class="bubbles">ä½ã«ãããç§ã®åä»»è
ãä¸ç·ã«ã«ã³ãã¡ã¬ã³ã¹éå¶ããã¦ããæ¹ã§ãããä»ã®ãªã¼ã¬ãã¤ã¶ã¼ãå¥ã®ã«ã³ãã¡ã¬ã³ã¹éå¶ã«æºãã£ã¦ãã¦ããã¯ãç¸æ§ã¯è¯ãã®ããªã¨æãã¾ãã</span>
</div>
<div class="lines interviewer">
<span class="icon"></span>
<span class="bubbles">Tech Talkã好ãã§ããããç¶ããããä¸çªã®çç±ã¨ããã®ã¯ç´ æµã§ããï¼ ç¢ºãã«ãã«ã³ãã¡ã¬ã³ã¹éå¶ã«æºãã£ã¦ããæ¹ã ã¨ããªã¼ã¬ãã¤ã¶ã¼ã®å½¹å²ã«ãã¹ã ã¼ãºã«é¦´æãããã§ããã
æå·ããã®Tech Talkã«å¯¾ããæ³ããä¼ãã£ã¦ãã¾ãã</span>
</div>
<h2 id="Tech-Talkããããããã®">Tech Talkããããããã®</h2>
<div class="lines interviewer">
<span class="icon"></span>
<span class="bubbles">ã¨ããã§ãTech Talkã¯ç¤¾å
åå¼·ä¼ã¨ãããã¨ã§ãããåå è
ã«ã¨ã£ã¦ã©ã®ãããªã¡ãªãããããã¨æãã¦ãã¾ããï¼ ã¾ããä¼ç¤¾å
¨ä½ã¸ã®å½±é¿ã«ã¤ãã¦ã¯ãããã§ããããï¼</span>
</div>
<div class="lines oboenikui">
<span class="icon"></span>
<span class="bubbles">ã¾ãåå è
ã¯æè¡ã«ã¤ãã¦å¦ã¹ãã®ã¯ãã¡ããã®ãã¨ã社å
ã®ä»ãã¼ã ã®æ¥åã«ã¤ãã¦å¦ã¹ããã¨ãããã¾ããã¾ãç¾å¨å¼ç¤¾ã¯ã»ã¨ãã©ã®æ¹ããªã¢ã¼ãã§æ¥åããã¦ããããããã¼ã å¤ã®ã¡ã³ãã¼ã¨ã®é¢ããã¯å¤ãããã¾ããããã®ä¸ã§ãç»å£è
ã ãã§ãªãåå è
ããã£ããã§ã¯ã¤ã¯ã¤çãä¸ãã£ããã質çãããæ©ä¼ãããããã交æµã®å ´ã¨ãã¦ã®å½¹å²ãããã¾ãã</span>
</div>
<div class="lines oboenikui">
<span class="icon"></span>
<span class="bubbles">ã¾ããç»å£è
ã許å¯ãããã®ã«ã¤ãã¦ã¯é²ç»ãYouTubeã§å
¬éãã¦ããããã社å¤ã®æ¹ãããé°å²æ°ãä¼ããã¨å¥½è©ã§ãã</span>
</div>
<div class="lines interviewer">
<span class="icon"></span>
<span class="bubbles">ãªãã»ã©ãTech Talkã¯ãåã«æè¡ãå¦ã¶ã ãã§ãªããä»ãã¼ã ã®æ¥åå
容ãç¥ã£ããã社å¡å士ã®äº¤æµãæ·±ããå ´ã«ããªã£ã¦ãããã§ããããªã¢ã¼ãã¯ã¼ã¯ãä¸å¿ã®ä»ããã®ãããªæ©ä¼ã¯ã¾ãã¾ãéè¦ã«ãªã£ã¦ããã®ã§ã¯ãªãã§ããããã</span>
</div>
<div class="lines interviewer">
<span class="icon"></span>
<span class="bubbles">YouTubeã§å
¬éããã¦ããã¨ããã®ãç´ æ´ãããã§ããã社å¤ã®æ¹ã«ãM3ã®æè¡åã社風ãã¢ãã¼ã«ã§ãã¾ãããåå è
ã«ã¨ã£ã¦ãèªåã®çºè¡¨ãå¤ãã®äººã«è¦ã¦ããããã¨ããã®ã¯ãã¢ããã¼ã·ã§ã³åä¸ã«ç¹ããããã§ãã</span>
</div>
<h2 id="ä»å¾ã®å±æ">ä»å¾ã®å±æ</h2>
<div class="lines interviewer">
<span class="icon"></span>
<span class="bubbles">æå¾ã«ãTech Talkãä»å¾ã©ã®ããã«çºå±ããã¦ããããããå±æããèãããã ããã</span>
</div>
<div class="lines oboenikui">
<span class="icon"></span>
<span class="bubbles">ãªã¼ã¬ãã¤ã¶ã¼ã¨ãã¦ã¯å¼éãã¾ããããä»å¾ãç»å£è
ã¨ãã¦çãä¸ãã¦ããããã§ããä»ã¾ã§ãYouTuber風ã®åç»ã«ãããªã©ãåã«ã¯ã¾ããªãçºè¡¨ãå¼·ã¿ãªã®ã§ãä»å¾ãããããã®ãç¶ãã¦ããããã§ãï¼</span>
</div>
<p><br/></p>
<p><figure class="figure-image figure-image-fotolife" title="ã©ããã¦ãé²ç»æ åãæ ãæéãå¤ããªãã®ã§ããã£ãã®ãã¨DaVinci Resolveã§çºè¡¨ãä½ã£ãå">
<iframe width="560" height="315" src="https://www.youtube.com/embed/iXzADTQY_Gw?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen title="ãªã¿ããã¼ã³ã®é³ãMIDIã«å¤æãã¦æ¼å¥ãã¦ã¿ããM3 Tech Talk 第199åã"></iframe><cite class="hatena-citation"><a href="https://www.youtube.com/watch?v=iXzADTQY_Gw">www.youtube.com</a></cite>
<figcaption>ã©ããã¦ãé²ç»æ åãæ ãæéãå¤ããªãã®ã§ããã£ãã®ãã¨DaVinci Resolveã§çºè¡¨ãä½ã£ãå</figcaption></figure></p>
<p><br/></p>
<div class="lines interviewer">
<span class="icon"></span>
<span class="bubbles">YouTuber風ã®åç»ã§ããï¼ ããã¯é¢ç½ããã§ããããã²ãä»å¾ã®çºè¡¨ã楽ãã¿ã«ãã¦ãã¾ãï¼
æ¬æ¥ã¯è²´éãªã話ãèããã¦ããã ãããããã¨ããããã¾ãããæå·ããã®Tech Talkã«å¯¾ããç±ãæ³ããã²ãã²ãã¨ä¼ãã£ã¦ãã¾ããããã®è¨äºãéãã¦ãM3ã®ç¤¾é¢¨ãæè¡åãããã¦Tech Talkã®é
åããå¤ãã®æ¹ã«ä¼ããã°å¹¸ãã§ãã
æ¬æ¥ã¯æ¬å½ã«ãããã¨ããããã¾ããï¼</span>
</div>
<div class="lines oboenikui">
<span class="icon"></span>
<span class="bubbles">ãããã¨ããããã¾ããï¼</span>
</div>
<h2 id="ã¾ã¨ã">ã¾ã¨ã</h2>
<p><span id="ai-conclusion"></p>
<p></span></p>
<div id="spacer">
</div>
<script>
window.addEventListener("load", () => {
const backButton = document.getElementById("back-to-about")
backButton.addEventListener("click", () => {
window.scroll({
top: document.getElementById("ãã®è¨äºã«ã¤ãã¦").offsetTop - 100,
behavior: "smooth",
})
})
const title = document.querySelector(".entry-title > a");
const entry = document.querySelector(".entry")
if (location.hash === '#view-changed') {
entry.classList.add("revail");
title.innerText = "M3 Tech Talkã®ãªã¼ã¬ãã¤ã¶ã¼ã6å¹´ååãããã¨ã«ã¤ãã¦ãGeminiã«ã¤ã³ã¿ãã¥ã¼ããã¦ã¿ã";
return;
}
const spacer = document.getElementById("spacer");
const conclusion = document.getElementById("ai-conclusion");
const matome = document.getElementById("ã¾ã¨ã");
const delay = (ms) => new Promise(res => setTimeout(res, ms))
const onScroll = async () => {
if (window.scrollY >= spacer.offsetTop - 400) {
location.hash = '#view-changed'
document.removeEventListener("scroll", onScroll);
entry.classList.add("revail");
await delay(1000)
window.scroll({
top: 0,
behavior: "smooth"
});
await delay(500);
title.classList.add("disappear");
await delay(2000);
title.innerText = "M3 Tech Talkã®ãªã¼ã¬ãã¤ã¶ã¼ã6å¹´ååãããã¨ã«ã¤ãã¦ãGeminiã«ã¤ã³ã¿ãã¥ã¼ããã¦ã¿ã"
title.classList.remove("disappear");
} else {
const filterValue = `blur(${((window.innerHeight - 400) - (spacer.offsetTop - window.scrollY - 400)) / (window.innerHeight - 400) * 50}px)`;
matome.style.filter = filterValue;
conclusion.style.filter = filterValue;
}
}
document.addEventListener("scroll", onScroll);
})
</script>
<h2 id="ãã®è¨äºã«ã¤ãã¦">ãã®è¨äºã«ã¤ãã¦</h2>
<p>ãããæ°ä»ããã¨æãã¾ããããã®è¨äºã¯æå·ãæ¸ãã¦ãã¾ããä»ã¾ã§ã®ãã¼ãã¯ãAI (Gemini 1.5 Pro) ã«ã¤ã³ã¿ãã¥ã¼ãã¦ããã£ãã¨ãã®ä¼è©±ã§ããã</p>
<p>ã¯ããã¯è¨äºã®ã¢ã¤ãã¢åºãã®å£æã¡ã¨ãã¦ä¼è©±ããã¦ããã®ã§ããããã£ãã¤ã³ã¿ãã¥ã¼ã¨ãã¦å
¬éãã¦ãã¾ã£ãæ¹ãããããèªåã§ã¯æ¸ããªãæ
å ±ãåºããæã£ãã®ã§ãã®ãããªå½¢ã§å
¬éãã¾ããã</p>
<h2 id="ããã³ããã«ã¤ãã¦">ããã³ããã«ã¤ãã¦</h2>
<p>次ã®ãããªããã³ããã§ã¤ã³ã¿ãã¥ã¼ã¢ã¼ã«ãªã£ã¦ãããã¾ããã</p>
<pre class="code" data-lang="" data-unlink>ã¨ã ã¹ãªã¼ç¤¾ã®ããã¯ããã°ã®è¨äºãæ¸ããããã¤ã³ã¿ãã¥ã¼ã¢ã¼ã¨ãã¦ãã¨ã ã¹ãªã¼ã®ç¤¾å
åå¼·ä¼ãM3 Tech Talkãã®ãªã¼ã¬ãã¤ã¶ã¼ã6å¹´ååããæå·è²´æ¨¹æ°ã«ã¤ã³ã¿ãã¥ã¼ããã
è¦å´è©±ããç¶ç¶ã®ããã®ç§è¨£ãªã©ãèªè
ãæ°ã«ãªããã¨ã質åããã
æå¾ã«è¨äºã¨ãã¦ã¾ã¨ããã</pre>
<h2 id="å®é使ã£ã¦ã¿ã¦ã®ææ³">å®é使ã£ã¦ã¿ã¦ã®ææ³</h2>
<p>ã¾ãèæ¯ã¨ãã¦ãç§ã¯è¨äºã®å·çãè¦æã§ãããããè¸ã¾ããä¸ã§ãèªåã1ããå·çããå ´åã«ã¯æ¸ããªãã£ãã ãããã¨ãããã¨ã¾ã§å¼ãåºãã¦ããã¦ããã®ã§ãæç¨ã§ãã£ãã¨æãã¦ãã¾ããä¾ãã°ããç§èªèº«ã®ã¢ããã¼ã·ã§ã³ãã«ã¤ãã¦ã¯ç§ãå顧é²ãæ¸ããã¨ããã絶対ã«å
¥ããªãã£ãã¨æãã¾ãã</p>
<p>ã¾ããè¨ããããã¨ã«ã¤ãã¦ãã¾ãã¾ã¨ããããªãã¨ãããç´°ããè¨ãåããæ°ã«ãªãã¨ãã«ãçãæ¢ã¾ã£ã¦ãã¾ããã¨ãããã¾ããAIç¸æã§ããã°ç®æ¡æ¸ãã§ãåé¡ãªãã§ãããããæãã«ã¾ã¨ãã¦ããããã¨ãå¯è½ãªã®ã§ã人éããããããããããé¢ãããã¾ããã</p>
<p><figure class="figure-image figure-image-fotolife" title="ä¸æçã«ä¼è©±ã¨ãã¦ã¾ã¨ããããªãã¦ããç®æ¡æ¸ãã§åé¡ãªãä¼è©±ãç¶ãããã"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241221/20241221120006.png" width="339" height="800" loading="lazy" title="" class="hatena-fotolife" style="width:300px" itemprop="image"></span><figcaption>ä¸æçã«ä¼è©±ã¨ãã¦ã¾ã¨ããããªãã¦ããç®æ¡æ¸ãã§åé¡ãªãä¼è©±ãç¶ãããã</figcaption></figure></p>
<p>çããèããæéã欲ããæããä½æéå¾ã§ãä¼è©±ãåéã§ããã®ã§ããã®ç¹ã人éãã便å©ãªç¹ã§ãã</p>
<p>ä»åã¯ããã°è¨äºã¨ãã¦ãã®ã¾ã¾å
¬éãã¾ããããå£æã¡ã«ãã£ã¨æ´»ç¨ãããã¨æããè¯ãä½é¨ãå¾ããã¾ããã
æ¬å½ã«ä¾¿å©ãªä¸ã®ä¸ã«ãªãã¾ãããã</p>
<h2 id="ã¾ã¨ã-1">ã¾ã¨ã</h2>
<p>ã¾ãTech Talkã®ãªã¼ã¬ãã¤ã¶ã¼ãé·ãåããçµé¨ã«ã¤ãã¦æ¸ããã¦ããã ãã¾ããã11年以ä¸ç¶ãããã¦ããã®ã¯ç»å£è
ãåå è
ã®ç±æã«ãããã®ã§ã決ãã¦ç§ãæ´ä»£ãªã¼ã¬ãã¤ã¶ã¼ã ãã®å績ã§ã¯ãªãã§ãããã®ããä»åæ¸ãããã¨ãå®è·µãã¦ãå¿
ããã¾ãããã¨ãã話ã§ã¯ãªãã¨æãã¾ãããå°ãã§ãåèã«ãªã£ããã¨æã£ã¦ããã¾ãã</p>
<p>ã¾ããããã¹ãçæAIãä»ã¾ã§ã¯ãã¾ãå£æã¡ç¸æã¨ãã¦ä½¿ã£ã¦ããªãã£ãã®ã§ãããã¤ã³ã¿ãã¥ã¼ã¢ã¼ãæ¼ãããã¦ã¿ã¦ãäºæ³ä»¥ä¸ã«å¹æãæãããã¾ããã
ä¸ã®ä¸ã«ã¯æ¢ã«å¤ãã®çæAIãç¨ããå£æã¡ã«ã¤ãã¦ã®è¨äºãããã®ã§ããããã®æ
å ±ãæ´»ç¨ããªããä»å¾ãå©ç¨ãã¦ããããã¨æãã¾ããã</p>
<h2 id="We-are-hiring">We are hiring!!</h2>
<p>ã¨ã ã¹ãªã¼ã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ãã§ã¯ãä¸ç·ã«åã仲éãåéãã¦ãã¾ãï¼ äººéã¨ã®ã«ã¸ã¥ã¢ã«é¢è«ã¯ã以ä¸URLãããå¿åããå¾
ã¡ãã¦ãã¾ãã</p>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjobs.m3.com%2Fengineer%2F" title="ã¨ã³ã¸ãã¢æ¡ç¨ãµã¤ãï½æ¡ç¨æ
å ± | å»çÃãã¯ããã¸ã¼ã®å¯è½æ§ã¯ç¡é大" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jobs.m3.com/engineer/">jobs.m3.com</a></cite></p>
oboenikui
BigQueryã§JSONããã¼ãã«ã«èªåå¤æã§ããããã«ãã¦ã¿ã
hatenablog://entry/6802418398313013956
2024-12-20T12:04:14+09:00
2024-12-20T12:04:14+09:00 ãã¡ãã¯ã¨ã ã¹ãªã¼ Advent Calendar 2024ã®20æ¥ç®ã®è¨äºã§ãã ãã¸ã¹ããã¼ã ã®ç°å£ã§ãã ãã¸ã¹ã診çï¼ä»¥éãã¸ã¹ãï¼ã¯QRã³ã¼ãã«ãããã§ãã¯ã¤ã³ãèªåå¾æãããªã³ã©ã¤ã³è¨ºçãªã©æ°ããå»çä½é¨ãæä¾ãããµã¼ãã¹ã§ãã www.youtube.com ããããããã¨ã«ãµã¼ãã¹ã¯æé·ãç¶ãã¦ãããããã«ä¼´ã£ã¦KPIã®æ·±æããæ½çã®å¹ææ¤è¨¼ã®ããã®ãã¼ã¿åæãããç©æ¥µçã«è¡ãããããã«ãªã£ã¦ãã¾ããã ãã¸ã¹ããã¼ã ã§ã¯ãã¼ã¿åæåºç¤ã«BigQueryãå©ç¨ãã¦ãããAmazon Auroraãå種ãã°ãã¼ã¿ãBigQueryã«é£æºããæ§ã
ãªåæããã¦ãã¾ãã å¤ç¨®å¤æ§ãªãã¼â¦
<p>ãã¡ãã¯<a href="https://qiita.com/advent-calendar/2024/m3">ã¨ã ã¹ãªã¼ Advent Calendar 2024</a>ã®20æ¥ç®ã®è¨äºã§ãã</p>
<p>ãã¸ã¹ããã¼ã ã®ç°å£ã§ãã
ãã¸ã¹ã診çï¼ä»¥éãã¸ã¹ãï¼ã¯QRã³ã¼ãã«ãããã§ãã¯ã¤ã³ãèªåå¾æãããªã³ã©ã¤ã³è¨ºçãªã©æ°ããå»çä½é¨ãæä¾ãããµã¼ãã¹ã§ãã</p>
<p><iframe width="560" height="315" src="https://www.youtube.com/embed/3FxYz5H6LBw?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen title="ãããã¯ããããããã¸ã¹ã診ç"></iframe><cite class="hatena-citation"><a href="https://www.youtube.com/watch?v=3FxYz5H6LBw">www.youtube.com</a></cite></p>
<p>ããããããã¨ã«ãµã¼ãã¹ã¯æé·ãç¶ãã¦ãããããã«ä¼´ã£ã¦KPIã®æ·±æããæ½çã®å¹ææ¤è¨¼ã®ããã®ãã¼ã¿åæãããç©æ¥µçã«è¡ãããããã«ãªã£ã¦ãã¾ããã</p>
<p>ãã¸ã¹ããã¼ã ã§ã¯ãã¼ã¿åæåºç¤ã«BigQueryãå©ç¨ãã¦ãããAmazon Auroraãå種ãã°ãã¼ã¿ãBigQueryã«é£æºããæ§ã
ãªåæããã¦ãã¾ãã
å¤ç¨®å¤æ§ãªãã¼ã¿ãé£æºãã¦ããé½åä¸ããã¼ã¿ã®ä¸ã«ã¯JSONå½¢å¼ã®ã«ã©ã ã®ãã®ãããããã®å
容ãæ¤ç´¢ãéè¨ãããã±ã¼ã¹ãåºã¦ãã¾ãã
åæããä¸ã§JSONå½¢å¼ã®ãã¼ã¿ããã¼ãã«ã«å¤æããããªã£ããããJSONã®ã«ã©ã ããã¼ãã«ã«å¤æããæ¹æ³ãèãã¦ã¿ã¾ããã</p>
<ul class="table-of-contents">
<li><a href="#ã¯ããã«">ã¯ããã«</a></li>
<li><a href="#ãµã³ãã«ãã¼ã¿">ãµã³ãã«ãã¼ã¿</a></li>
<li><a href="#JSONé¢æ°ãç¨ããåæ">JSONé¢æ°ãç¨ããåæ</a></li>
<li><a href="#JSONããã¼ãã«ã«å¤æ">JSONããã¼ãã«ã«å¤æ</a><ul>
<li><a href="#1-UDF-JSONãã¼ã¨å¤ãåæã«åå¾">1. UDF: JSONãã¼ã¨å¤ãåæã«åå¾</a></li>
<li><a href="#2-ä¸æãã¼ãã«ã®ä½æ-JSONããã¼ã¨å¤ã®ãã¢ã«å±é">2. ä¸æãã¼ãã«ã®ä½æ: JSONããã¼ã¨å¤ã®ãã¢ã«å±é</a></li>
<li><a href="#3-ããããã¯ã¨ãªã®åççæ">3. ããããã¯ã¨ãªã®åççæ</a></li>
</ul>
</li>
<li><a href="#ãããã«">ãããã«</a></li>
<li><a href="#We-are-hiring">We are hiring!!</a></li>
</ul>
<h2 id="ã¯ããã«">ã¯ããã«</h2>
<p>ãã¸ã¹ãã§BigQueryã«é£æºãã¦ãããã¼ã¿ã®ä¸ã«ã¯ãæ§é çãªãã¼ã¿ãé
åã表ç¾ããããã®ãJSONå½¢å¼ã§ä¿åãã¦ãããã®ãããã¾ãã
ããã¯ãã¼ã¿ä¿åã®è¦³ç¹ã§ã¯æè»ã§ãããããæ
ã«SQLã§åæããéã¯å·¥å¤«ãå¿
è¦ã§ãã</p>
<h2 id="ãµã³ãã«ãã¼ã¿">ãµã³ãã«ãã¼ã¿</h2>
<p>æ¬è¨äºã§ã¯ããã¡ãã® <code>1.7m users (504.3 MB)</code> ãã¼ã¿ããµã³ãã«ã¨ãã¦å©ç¨ãã¾ãã</p>
<p><a href="https://jsoneditoronline.org/indepth/datasets/json-file-example/#a-large-json-document">Exploring the power of JSON: a real-life JSON file example collection</a></p>
<pre class="code lang-json" data-lang="json" data-unlink><span class="synSpecial">[</span>
<span class="synSpecial">{</span>
"<span class="synStatement">id</span>": <span class="synConstant">0</span>,
"<span class="synStatement">name</span>": "<span class="synConstant">Elijah</span>",
"<span class="synStatement">city</span>": "<span class="synConstant">Austin</span>",
"<span class="synStatement">age</span>": <span class="synConstant">78</span>,
"<span class="synStatement">friends</span>": <span class="synSpecial">[</span>
<span class="synSpecial">{</span>
"<span class="synStatement">name</span>": "<span class="synConstant">Michelle</span>",
"<span class="synStatement">hobbies</span>": <span class="synSpecial">[</span>
"<span class="synConstant">Watching Sports</span>",
"<span class="synConstant">Reading</span>",
"<span class="synConstant">Skiing & Snowboarding</span>"
<span class="synSpecial">]</span>
<span class="synSpecial">}</span>,
<span class="synSpecial">{</span>
"<span class="synStatement">name</span>": "<span class="synConstant">Robert</span>",
"<span class="synStatement">hobbies</span>": <span class="synSpecial">[</span>
"<span class="synConstant">Traveling</span>",
"<span class="synConstant">Video Games</span>"
<span class="synSpecial">]</span>
<span class="synSpecial">}</span>
<span class="synSpecial">]</span>
<span class="synSpecial">}</span>,
<span class="synSpecial">{</span>
"<span class="synStatement">id</span>": <span class="synConstant">1</span>,
"<span class="synStatement">name</span>": "<span class="synConstant">Noah</span>",
"<span class="synStatement">city</span>": "<span class="synConstant">Boston</span>",
"<span class="synStatement">age</span>": <span class="synConstant">97</span>,
"<span class="synStatement">friends</span>": <span class="synSpecial">[</span>
<span class="synSpecial">{</span>
"<span class="synStatement">name</span>": "<span class="synConstant">Oliver</span>",
"<span class="synStatement">hobbies</span>": <span class="synSpecial">[</span>
"<span class="synConstant">Watching Sports</span>",
"<span class="synConstant">Skiing & Snowboarding</span>",
"<span class="synConstant">Collecting</span>"
<span class="synSpecial">]</span>
<span class="synSpecial">}</span>,
...
<span class="synSpecial">]</span>
<span class="synSpecial">}</span>,
...
<span class="synSpecial">]</span>
</pre>
<p>ãµã³ãã«ã®ãã¼ã¿ã¯ä¸è¨ã®ãããªæ§é ã«ãªã£ã¦ãã¾ãã
BigQueryã«ã¯ãä¸è¨ãã¼ã¿ã1ã¤ã㤠<code>user_json</code> ã«ã©ã ã«æ ¼ç´ãã <code>users</code> ãã¼ãã«ãä½æãã¾ãã</p>
<table>
<thead>
<tr>
<th>ã«ã©ã å</th>
<th>ãã¼ã¿å</th>
<th>å¤ã®ä¾</th>
</tr>
</thead>
<tbody>
<tr>
<td>user_json</td>
<td>JSON</td>
<td>{"id":0,"name":"Elijah","city":"Austin","age":78,...}</td>
</tr>
</tbody>
</table>
<h2 id="JSONé¢æ°ãç¨ããåæ">JSONé¢æ°ãç¨ããåæ</h2>
<p>BigQueryã§ã¯<a href="https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#json_type">JSONå</a>ããµãã¼ããã¦ããã<a href="https://cloud.google.com/bigquery/docs/reference/standard-sql/json_functions">JSONãæä½ããé¢æ°</a>ãæ§ã
ãªãã®ãæä¾ããã¦ãã¾ãã</p>
<p>ä¾ãã°ãå¹´é½¢ã50æ³ä»¥ä¸ã®ã¦ã¼ã¶ã¼ãåå¾ããã«ã¯æ¬¡ã®ãããªã¯ã¨ãªã«ãªãã¾ãã</p>
<pre class="code lang-sql" data-lang="sql" data-unlink><span class="synStatement">SELECT</span>
JSON_VALUE(user_json, <span class="synSpecial">'</span><span class="synConstant">$.id</span><span class="synSpecial">'</span>) <span class="synSpecial">AS</span> id,
JSON_VALUE(user_json, <span class="synSpecial">'</span><span class="synConstant">$.name</span><span class="synSpecial">'</span>) <span class="synSpecial">AS</span> name,
JSON_VALUE(user_json, <span class="synSpecial">'</span><span class="synConstant">$.age</span><span class="synSpecial">'</span>) <span class="synSpecial">AS</span> age,
<span class="synSpecial">FROM</span>
test.users <span class="synComment">-- `test` ãã¼ã¿ã»ããã«ãã¼ãã«ãä½æ</span>
<span class="synSpecial">WHERE</span>
<span class="synIdentifier">CAST</span>(JSON_VALUE(user_json, <span class="synSpecial">'</span><span class="synConstant">$.age</span><span class="synSpecial">'</span>) <span class="synSpecial">AS</span> int64 ) >= <span class="synConstant">50</span>
<span class="synSpecial">ORDER</span> <span class="synSpecial">BY</span> <span class="synIdentifier">CAST</span>(id <span class="synSpecial">AS</span> int64)
</pre>
<p>ãã®ã¯ã¨ãªã®çµæï¼ä¸é¨ï¼ã¯æ¬¡ã®ããã«ãªãã¾ãã</p>
<p><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241220/20241220120415.png" width="800" height="261" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p>
<p><a href="https://cloud.google.com/bigquery/docs/reference/standard-sql/json_functions#json_value">JSON_VALUE</a>é¢æ°ãç¨ãããã¨ã§ãJSONã®å¤ããç¹å®ã®ãã£ã¼ã«ãã®å¤ãæ½åºã§ãã¾ãã
ãã£ã¼ã«ãã¯<a href="https://cloud.google.com/bigquery/docs/reference/standard-sql/json_functions#JSONPath_format">JSONPath</a>å½¢å¼ã§æå®ãã¾ãã</p>
<p>ãã®ããã«JSONé¢æ°ãç¨ãããã¨ã§ãJSONã®ãã£ã¼ã«ãã§åæã§ãã¾ãã</p>
<h2 id="JSONããã¼ãã«ã«å¤æ">JSONããã¼ãã«ã«å¤æ</h2>
<p>JSONé¢æ°ã«ãã£ã¦ããç¨åº¦JSONãã£ã¼ã«ãã®å¤ãå©ç¨ããåæãå¯è½ã«ãªãã¾ãããå¥ã®ãã¼ãã«ã¨joinããå ´åãªã©ãè¾ãã±ã¼ã¹ãåºã¦ãã¾ãã
ããã§ãJSONãã£ã¼ã«ãããã©ãããªãã¼ãã«ã§è¡¨ç¾ã§ããªããèãã¾ãã</p>
<pre class="code lang-sql" data-lang="sql" data-unlink><span class="synStatement">SELECT</span>
JSON_VALUE(user_json, <span class="synSpecial">'</span><span class="synConstant">$.id</span><span class="synSpecial">'</span>) <span class="synSpecial">AS</span> id,
JSON_VALUE(user_json, <span class="synSpecial">'</span><span class="synConstant">$.name</span><span class="synSpecial">'</span>) <span class="synSpecial">AS</span> name,
JSON_VALUE(user_json, <span class="synSpecial">'</span><span class="synConstant">$.age</span><span class="synSpecial">'</span>) <span class="synSpecial">AS</span> age,
JSON_VALUE(user_json, <span class="synSpecial">'</span><span class="synConstant">$. friends.name</span><span class="synSpecial">'</span>) <span class="synSpecial">AS</span> friend_names,
...
<span class="synSpecial">FROM</span>
test.users
</pre>
<p>ä¸è¨ã®ããã«ãã£ã¼ã«ãã1ã¤ãã¤æå®ãããã¨ã«ãã£ã¦ãã©ãããªå½¢å¼ã«å¤æãããã¨ã¯ã§ãã¾ããããã£ã¼ã«ãæ°ãå¤ãå ´åãæ§é ãè¤éãªå ´åã¯æå®ãæéã«ãªãã¾ããã¾ãJSONã®æ§é ãå¤ãã£ãæã«å¤æã®ã¯ã¨ãªãä¿®æ£ããå¿
è¦ãããã¾ãã</p>
<p>ããã§ãJSONã®å®ãã¼ã¿ããã¹ãã¼ããèªåçã«æ½åºãããã©ãããªãã¼ãã«ã«ããSQLãèãã¾ããã</p>
<pre class="code lang-sql" data-lang="sql" data-unlink><span class="synComment">-- 1. UDF: JSONãã¼ã¨å¤ãåæã«åå¾</span>
<span class="synStatement">CREATE</span> TEMP <span class="synSpecial">FUNCTION</span> extract_keys_and_values(input STRING)
RETURNS ARRAY<STRUCT<key STRING, value STRING>>
LANGUAGE js <span class="synSpecial">AS</span> <span class="synSpecial">"""</span>
<span class="synConstant"> function flattenObj(obj, parent = '', res = []) {</span>
<span class="synConstant"> for (let key in obj) {</span>
<span class="synConstant"> const propName = parent ? parent + '.' + key : key;</span>
<span class="synConstant"> if (typeof obj[key] === 'object' && obj[key] !== null) {</span>
<span class="synConstant"> flattenObj(obj[key], propName, res);</span>
<span class="synConstant"> } else {</span>
<span class="synConstant"> res.push({ key: propName, value: String(obj[key]) });</span>
<span class="synConstant"> }</span>
<span class="synConstant"> }</span>
<span class="synConstant"> return res;</span>
<span class="synConstant"> }</span>
<span class="synConstant"> return flattenObj(JSON.parse(input));</span>
<span class="synSpecial">"""</span>;
<span class="synComment">-- 2. ä¸æãã¼ãã«ã®ä½æ: JSONããã¼ã¨å¤ã®ãã¢ã«å±é</span>
<span class="synStatement">CREATE</span> TEMP <span class="synSpecial">TABLE</span> temp_table <span class="synSpecial">AS</span>
<span class="synStatement">SELECT</span>
row_num,
kv.key,
kv.value
<span class="synSpecial">FROM</span>
(
<span class="synStatement">SELECT</span> *,
ROW_NUMBER() OVER () <span class="synSpecial">AS</span> row_num,
<span class="synSpecial">FROM</span> test.users
),
UNNEST(extract_keys_and_values(TO_JSON_STRING(user_json))) <span class="synSpecial">AS</span> kv;
<span class="synComment">-- 3. ããããã¯ã¨ãªã®åççæ</span>
<span class="synStatement">EXECUTE</span> <span class="synSpecial">IMMEDIATE</span> (
<span class="synStatement">SELECT</span> FORMAT(<span class="synSpecial">"""</span>
<span class="synConstant"> SELECT * EXCEPT(row_num)</span>
<span class="synConstant"> FROM temp_table</span>
<span class="synConstant"> PIVOT (</span>
<span class="synConstant"> ANY_VALUE(value) </span>
<span class="synConstant"> FOR REPLACE(key, '.', '__') IN (%s)</span>
<span class="synConstant"> )</span>
<span class="synConstant"> ORDER BY CAST(id AS INT64)</span>
<span class="synConstant"> </span><span class="synSpecial">"""</span>, STRING_AGG(FORMAT(<span class="synSpecial">'</span><span class="synConstant">"%s"</span><span class="synSpecial">'</span>, <span class="synIdentifier">REPLACE</span>(key, <span class="synSpecial">'</span><span class="synConstant">.</span><span class="synSpecial">'</span>, <span class="synSpecial">'</span><span class="synConstant">__</span><span class="synSpecial">'</span>)), <span class="synSpecial">'</span><span class="synConstant">,</span><span class="synSpecial">'</span>))
<span class="synSpecial">FROM</span> (
<span class="synStatement">SELECT</span> <span class="synStatement">DISTINCT</span> key <span class="synSpecial">FROM</span> temp_table
)
);
</pre>
<p>ãã®ãããªSQLãå®è¡ãããã¨ã«ãã£ã¦ã<code>user_json</code> ã次ã®ãããªãã¼ãã«ã«å¤æã§ãã¾ãã
ãã®SQLã«ã¤ãã¦è©³ããè¦ã¦ããã¾ãã</p>
<h3 id="1-UDF-JSONãã¼ã¨å¤ãåæã«åå¾">1. UDF: JSONãã¼ã¨å¤ãåæã«åå¾</h3>
<p>ã¯ããã«ãJSONã®ãã¼ã¨å¤ã®ãã¢ãåºåããé¢æ°ãä½æãã¾ãã
BigQueryã§ã¯<a href="https://cloud.google.com/bigquery/docs/user-defined-functions?hl=ja">ã¦ã¼ã¶ã¼å®ç¾©ã®é¢æ°</a>ãä½æãããã¨ãã§ããSQLã¾ãã¯JavaScriptã³ã¼ãã§å¦çãå®ç¾©ã§ãã¾ãã
ããã§ã¯ãJSONæååãå
¥åã¨ãããã¼ã¨å¤ã®ãã¢ãåºåãã¾ãããã¹ãããããã¼ã¯ <code>parent.child</code> å½¢å¼ã«å¤æãã¾ããã¾ããå¤ã¯ãã¹ã¦STRINGåã§è¿å´ããã¾ãã</p>
<pre class="code js" data-lang="js" data-unlink>[
{ key: "id", value: "0" },
{ key: "name", value: "Elijah" },
{ key: "age", value: "78" },
{ key: "friends.0.name": "Michelle" },
{ key: "friends.0.hobbies.0": "Watching Sports" },
...
]</pre>
<h3 id="2-ä¸æãã¼ãã«ã®ä½æ-JSONããã¼ã¨å¤ã®ãã¢ã«å±é">2. ä¸æãã¼ãã«ã®ä½æ: JSONããã¼ã¨å¤ã®ãã¢ã«å±é</h3>
<p>次ã«ããã®é¢æ°ãå©ç¨ãã¦ãã¼ã¨å¤ã®ãã¢ã«å±éããä¸æãã¼ãã«ã«ä¿åãã¾ãã
ä¸æãã¼ãã«ã®æ§é ã¯æ¬¡ã®ããã«ãªãã¾ãã</p>
<table>
<thead>
<tr>
<th>row_num</th>
<th>key</th>
<th>value</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>id</td>
<td>0</td>
</tr>
<tr>
<td>1</td>
<td>name</td>
<td> Elijah</td>
</tr>
<tr>
<td>1</td>
<td>age</td>
<td> 78</td>
</tr>
<tr>
<td>1</td>
<td>friends.0.name</td>
<td> Michelle</td>
</tr>
<tr>
<td>1</td>
<td>friends.0.hobbies.0</td>
<td>Watching Sports</td>
</tr>
<tr>
<td>...</td>
<td></td>
<td></td>
</tr>
<tr>
<td>2</td>
<td>id</td>
<td>1</td>
</tr>
<tr>
<td>2</td>
<td>name</td>
<td> Noah</td>
</tr>
<tr>
<td>2</td>
<td>age</td>
<td>97</td>
</tr>
<tr>
<td>2</td>
<td>friends.0.name</td>
<td> Oliver</td>
</tr>
<tr>
<td>2</td>
<td>friends.0.hobbies.0</td>
<td>Watching Sports</td>
</tr>
</tbody>
</table>
<p>å¾ã§åã¦ã¼ã¶ã¼æ¯ã«ã°ã«ã¼ãã³ã°ã§ããããä¸æã«ãªãå¤ãæã£ã¦ããå¿
è¦ãããã¾ããä»å㯠<code>ROW_NUMBER</code> é¢æ°ã§è¡çªå·ãä»ä¸ããããã«ãã¾ããã</p>
<h3 id="3-ããããã¯ã¨ãªã®åççæ">3. ããããã¯ã¨ãªã®åççæ</h3>
<p>æå¾ã«ã2.ã§ä½æããä¸æãã¼ãã«ã«ã¤ãã¦ããã¼æ¯ã«åãä½æãããããããã¼ãã«ãåçã«çæãã¾ãã
<code>SELECT DISTINCT key FROM temp_table</code> ã§JSONã®ãã¼ã®ä¸è¦§ãåå¾ãããããããããã®åã¨ãã¦æå®ãã¾ãã
ã¾ãã<a href="https://cloud.google.com/bigquery/docs/reference/standard-sql/procedural-language#execute_immediate">EXECUTE IMMEDIATE</a>ãå©ç¨ããINå¥ã®æ¡ä»¶ãåçã«çµã¿ç«ã¦ã¦ãã¾ãã
<code>REPLACE(key, '.', '__')</code> ã¯ããã¼ãã«ã®ååã« <code>.</code> ã使ããªãããã¢ã³ãã¼ã¹ã³ã¢ <code>__</code> ã«æ¸ãæãã¦ãã¾ãã</p>
<p>ãã®ãããªã¯ã¨ãªãå®è¡ãããã¨ã§ãæçµçã«JSONãã¼ã¿ããã©ããåãããã¼ãã«ãåºåãããã¨ãã§ãã¾ãã</p>
<table>
<thead>
<tr>
<th>id</th>
<th>name</th>
<th>age</th>
<th>friends__0__name</th>
<th>friends__0__hobbies__0</th>
<th>...</th>
</tr>
</thead>
<tbody>
<tr>
<td>0</td>
<td> Elijah</td>
<td>78</td>
<td> Michelle</td>
<td>Watching Sports</td>
<td>...</td>
</tr>
<tr>
<td>1</td>
<td> Noah</td>
<td>97</td>
<td> Oliver</td>
<td>Watching Sports</td>
<td>...</td>
</tr>
</tbody>
</table>
<h2 id="ãããã«">ãããã«</h2>
<p>BigQueryã®JSONã«ã©ã ã«å¯¾ãã¦ãJSONé¢æ°ã§åæããæ¹æ³ãããã©ãããªãã¼ãã«ã¨ãã¦åºåããæ¹æ³ãç´¹ä»ãã¾ããã</p>
<p>ããã¾ã§æ¸ãã¦ããã¦ã«ãªãã¾ãããBigQueryã§ã¯å
¬å¼ã§<a href="https://cloud.google.com/bigquery/docs/loading-data-cloud-storage-json?hl=ja">ãã¡ã¤ã«ããJSONãã¼ã¿ãèªã¿è¾¼ãæ¹æ³</a>ãæä¾ããã¦ããããããã¼ã¿ãBigQueryã«é£æºããåã«åå¾ã§ããã®ã§ããã°ããã®ãããªæ©è½ãå©ç¨ããæ¹ãåã§ãã
ç¬èªã®ã¯ã¨ãªãã¡ã³ããã³ã¹ããå¿
è¦ããªããã¾ãä»åã®ãããªSQLã¯JSONã«ã©ã ãã¹ãã£ã³ããã®ã«ã³ã¹ãããããããã奥ã®æã¨ãã¦ä½¿ãã®ãè¯ãã§ãããã</p>
<h2 id="We-are-hiring">We are hiring!!</h2>
<p>ã¨ã ã¹ãªã¼ã§ã¯çµ¶è³ã¨ã³ã¸ãã¢ãåéä¸ã§ãï¼
ãã¸ã¹ã診ç以å¤ã«ãæ§ã
ãªãããã¯ããããã¾ãã®ã§ããèå³ããæ¹ã¯æ¯éã«ã¸ã¥ã¢ã«é¢è«çãå¿åãã ããï¼</p>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjobs.m3.com%2Fengineer%2F" title="ã¨ã³ã¸ãã¢æ¡ç¨ãµã¤ãï½æ¡ç¨æ
å ± | å»çÃãã¯ããã¸ã¼ã®å¯è½æ§ã¯ç¡é大" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jobs.m3.com/engineer/">jobs.m3.com</a></cite></p>
ken_tunc
ã¤ã³ã¿ã¼ã³ã§ã¯ããã¦ã®ãããã¯ãéçºãçµé¨ãã話ãã½ããã¦ã§ã¢ã¨ã³ã¸ãã¢ã¤ã³ã¿ã¼ã³åæ¦è¨ã
hatenablog://entry/6802418398311074642
2024-12-19T17:00:00+09:00
2024-12-19T17:00:09+09:00 ã¯ããã« 11ææ«ãã2é±éãã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ã AIã»æ©æ¢°å¦ç¿ãã¼ã ã§ã®æ°åã½ããã¦ã§ã¢ã¨ã³ã¸ãã¢ã¤ã³ã¿ã¼ã³ã«åå ããå±±å£ (@chimaki_yama821)ã§ãããã®è¨äºã§ã¯ç§ãåãçµãã ãã¨ã¨2é±éã®ææ³ã«ã¤ãã¦æ¸ããã®ã§ãã¨ã ã¹ãªã¼ãæ°ã«ãªã£ã¦ããã¨ããä»ã®å¦çã®åèã«ãªãã°å¹¸ãã§ãã æçµæ¥ã«æ®ã£ã¦ããã£ãåç
<h2 id="ã¯ããã«">ã¯ããã«</h2>
<p>11ææ«ãã2é±éãã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ã AIã»æ©æ¢°å¦ç¿ãã¼ã ã§ã®æ°åã½ããã¦ã§ã¢ã¨ã³ã¸ãã¢ã¤ã³ã¿ã¼ã³ã«åå ããå±±å£ (<a href="https://x.com/chimaki_yama821">@chimaki_yama821</a>)ã§ãããã®è¨äºã§ã¯ç§ãåãçµãã ãã¨ã¨2é±éã®ææ³ã«ã¤ãã¦æ¸ããã®ã§ãã¨ã ã¹ãªã¼ãæ°ã«ãªã£ã¦ããã¨ããä»ã®å¦çã®åèã«ãªãã°å¹¸ãã§ãã</p>
<p><figure class="figure-image figure-image-fotolife" title="æçµæ¥ã«æ®ã£ã¦ããã£ãåç"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241219/20241219170028.jpg" width="800" height="600" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>æçµæ¥ã«æ®ã£ã¦ããã£ãåç</figcaption></figure></p>
<h2 id="ã¤ã³ã¿ã¼ã³ã®èª²é¡ã«ã¤ãã¦">ã¤ã³ã¿ã¼ã³ã®èª²é¡ã«ã¤ãã¦</h2>
<h3 id="ãã£ããã¨ã®æ¦è¦">ãã£ããã¨ã®æ¦è¦</h3>
<p>ã¤ã³ã¿ã¼ã³ã§ã¯ããåç»ã®ã¿ã°ã¥ãããããã¨ããã¿ã¹ã¯ã«ã¤ãã¦åãçµãã§ãã¾ãããæ±ããã対象ã¨ãªãåç»ã«ã¤ãã¦ç¢ºèªããã®ã¡ã«ã</p>
<ol>
<li>ã¢ã¦ããããã¤ã¡ã¼ã¸ã®æ¤è¨</li>
<li>ã¿ã°ã¥ãã¢ã«ã´ãªãºã ã®å®è£
</li>
<li>ã¯ã©ã¦ãã¸ã®ãããã¤ï¼éä¸ã§çµäºï¼</li>
</ol>
<p>ã¨ãããã¨ã«åãçµã¿ã¾ãããããã§ããã¿ã°ã¥ããã¨ã¯ä»¥ä¸ã®å³ã®ãããªãã¨ãæå³ãã¦ãã¾ãã</p>
<p><figure class="figure-image figure-image-fotolife" title="åç»ã®ã¿ã°ã¥ãã®ã¤ã¡ã¼ã¸"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241219/20241219170025.png" width="800" height="359" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>åç»ã®ã¿ã°ã¥ãã®ã¤ã¡ã¼ã¸</figcaption></figure></p>
<h3 id="æ±ãåç»ã«ã¤ãã¦">æ±ãåç»ã«ã¤ãã¦</h3>
<p>ã¨ã ã¹ãªã¼ã®ãµã¼ãã¹ã«ã¯ãMRãã<a href="#f-0c976af9" id="fn-0c976af9" name="fn-0c976af9" title=" MR ã¨ã¯å»è¬æ
å ±æ
å½è
ã®ç¥ã§ãå»å¸«ãè¬å¤å¸«ã¸è¬å¤ã®èª¬æããã製è¬ä¼ç¤¾ã®å¶æ¥æ
å½è
ã®ãã¨ã">*1</a> ãå»å¸«ã«è¬å¤ã®èª¬æåç»ãæä¾ããã¨ãããã©ãããã©ã¼ã ãããã¾ããããã§ãç§ã¯ãã®ã¤ã³ã¿ã¼ã³ã§<strong>ãMRãããæä¾ãã¦ãã5åã10åã»ã©ã®è¬å¤ã«é¢ãã説æåç»ã«å¯¾ãã¦ä½¿ããããå½¢ã§ã¿ã°ã¥ããããã</strong>ã¨ããã¿ã¹ã¯ãããã ããããã«ã¤ãã¦åãçµãã§ãã¾ããã</p>
<h2 id="ãã£ããã¨">ãã£ããã¨</h2>
<h3 id="ã¢ã¦ããããã¤ã¡ã¼ã¸ã®æ¤è¨">ã¢ã¦ããããã¤ã¡ã¼ã¸ã®æ¤è¨</h3>
<p>ä¸è¨ã®ãããªåç»ã¸ã¿ã°ã¥ããè¡ããã¨ãããã¨ã§ <strong>誰ãã»ã©ã®ããã«å¬ãããï¼</strong> ã¨ãããã¨ãèæ
®ããªããã¢ã¦ããããã¤ã¡ã¼ã¸ãæ¤è¨ãã¾ãããã¡ã³ã¿ã¼ããã¨ã® 1on1 ãä»ã®ç¤¾å¡ããã¨ã®ã³ãã¥ãã±ã¼ã·ã§ã³ãéãã¦ã以ä¸ã®ä¸ã¤ã«ã¤ãªããã¨å¬ããã¨èãã¾ããï¼</p>
<h4 id="-ã³ã³ãã³ãä½æè
ã次ã®åç»ä½æã«å½¹ç«ã¤">â ã³ã³ãã³ãä½æè
ã次ã®åç»ä½æã«å½¹ç«ã¤</h4>
<p>éå»ã«ä½æããåç»ã«ã¤ãã¦ã®ãsç§ããtç§ã¾ã§ã§ããã話ãã¦ãããã¨ããæ
å ±ã¨è¦è´è
ãã©ãã¾ã§è¦ããã®æ
å ±ãåããã¦ãã¿ã°ãã¨ã®è¦è´çããåå¾ãããã¨ãã§ãã¾ãããããå¾ããã¨ãã§ããã°ãã³ã³ãã³ãä½æè
ã <strong>次ã®åç»ä½ææã«æ°ãä»ããã¹ããã¨</strong>ãåããã¾ãã</p>
<p>ä¾ãã°ãä¸ã®å³ã§ã¯ã "foo", "bar" ã«ã¤ãã¦è©±ãã¦ããæã«ã¯è¦è´çãé«ãã£ããã®ã® "baz" ã«ã¤ãã¦ã®è©±ã§å¤ãã®è¦è´è
ãè±è½ãã¦è¦è´çãä¸ãã£ã¦ãã¾ã£ã¦ãããã¨ãåããã¾ããããã§ã次ã®åç»ãä½ãæã«ã¯ "baz" ãåãããããããã» "qux" ãå
ã«èª¬æããããªã©ã®å·¥å¤«ããããã¨èãããã¨ãã§ãã¾ãã</p>
<p><figure class="figure-image figure-image-fotolife" title="å
容ãã¼ã¹ã§ã®è¦è´çåæ"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241219/20241219170015.png" width="800" height="403" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>å
容ãã¼ã¹ã§ã®è¦è´çåæ</figcaption></figure></p>
<h4 id="-å»å¸«ãè¦ããã¨ãããè¦ãã®ã«å½¹ç«ã¤">â¡ å»å¸«ãè¦ããã¨ãããè¦ãã®ã«å½¹ç«ã¤</h4>
<p>次ã«ãããåç»ã«ã¤ãã¦ã®ã¿ã°ã¥ããè¡ããã¨ã«ãã£ã¦ãå»å¸«ï¼åç»è¦è´è
ï¼ã <strong>è¦ããã¨ãããé¸ãã§è¦ãã®ã«å½¹ç«ã¤</strong> ã¨æãã¾ããä¸ã®å³ã®ããã«ãæå»ã¨è©±ãã¦ããå
容ããªã³ã¯ä»ãã§ç¨æãããã¨ã«ãã£ã¦ãä¾ãã°ãè¬å¤Xã«ã¤ãã¦ã¯å¤§ä½ç¥ã£ã¦ãããZã¨ã®ä½µç¨å¹æãæ°ã«ãªããã¨ããè¦è´è
ã 3:55 ããåç»ãè¦ãã°è¯ããã¨ãåããã¾ãã</p>
<p><figure class="figure-image figure-image-fotolife" title="ãã£ãã¿ã¼ãã¤ããåç»"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241219/20241219170018.png" width="800" height="316" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>ãã£ãã¿ã¼ãã¤ããåç»</figcaption></figure></p>
<h4 id="-ä»ã®ãã¼ã¿ã¨çµã¿åããã¦ããæ·±ãåæãããã®ã«å½¹ç«ã¤">⢠ä»ã®ãã¼ã¿ã¨çµã¿åããã¦ããæ·±ãåæãããã®ã«å½¹ç«ã¤</h4>
<p>æå¾ã«ãä½æããã¿ã°ã¨ã¦ã¼ã¶ã¼ãã¨ã®è¦è´ç¶æ³ãå
ã«ããããªãåæã«ç¹ãããã¨ã«å½¹ç«ã¤ã¨èãã¾ããä¾ãã°ãè¬å¤Xã«ã¤ãã¦ã®åç»ã§ "Zã¨ã®ä½µç¨å¹æ" ã®é¨åãè¦ã¦ããªãã¦ã¼ã¶ã¼ã®æ¹ã«å¯¾ãã¦ãZã¨ã®ä½µç¨å¹æã®ã¿ã®çãåç»ãè¨äºãã¬ã³ã¡ã³ããããã¨ã«ç¹ãããã¨ãã§ãã¾ããã¾ãã ã"Zã¨ã®ä½µç¨å¹æ" ãã¿ãã¦ã¼ã¶ã¼ã§ã®è¬å¤Xã®å©ç¨çããªã©ãåæãã¦ããã«ä»ã®ãã¨ãã§ããããããã¾ããã</p>
<p>以ä¸ãè¸ã¾ãã¦ãã¤ã³ãããã¨ãã¦åãåã£ãåç»ã«å¯¾ãã¦ãã¿ã°+éå§æå»+çµäºæå»ãã¨ãããã¼ã¿ãèªåçæãããã¨ãç®æããã¨ã«ãªãã¾ããããã®å½¢ã§ã¢ã¦ãããããå¾ãããã°â ãâ¢ã®ãããã«ã使ããããã¨èããããã§ããä»ã®äººã使ããããããããã«ã<strong>ãGCS ã«é
ç½®ãããåç»ã«å¯¾ãã¦ã¿ã°ã¥ããè¡ã BigQuery ã«ä¿åãããããå¦çã</strong> ã¨ããå½¢ãæçµç³»ã¨ãã¦ç®æ¨ã«æ²ãã¾ããã</p>
<p><figure class="figure-image figure-image-fotolife" title="ç®æããã®"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241219/20241219170011.png" width="800" height="299" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>ç®æããã®</figcaption></figure></p>
<h3 id="ã¿ã°ã¥ãã¢ã«ã´ãªãºã ã®å®è£
">ã¿ã°ã¥ãã¢ã«ã´ãªãºã ã®å®è£
</h3>
<p>å®éã«åç»ã«å¯¾ãã¦ã¿ã°ã¥ããè¡ãã«ããã£ã¦ã¯ã OpenAI ã® Whisper ã§æåèµ·ãããè¡ãããã®å¾ã®å¦çã« GPT ã使ãã¾ããããã®ãã¡ã Whisper ã«ã¤ãã¦ã¯ãã¼ã«ã«ã® CPU ç°å¢ã§ã¢ãã«ãåããã¾ããã</p>
<h4 id="Whisper-ã«ããæåèµ·ãã">Whisper ã«ããæåèµ·ãã</h4>
<p>Whisper ã使ããã¨ã§ãããããé«éã«æåèµ·ããããããã¨ãã§ãã¾ãããã¾ããåç»ã§è©±ããã¦ããå
容ãç´1æåä½ã§ãæåèµ·ãã+éå§æå»+çµäºæå»ãã¨ããå½¢ã§å¾ããã¨ãã§ãã¾ãã</p>
<p>Whisper ã«ã¯ãã©ã¡ã¼ã¿ãµã¤ãºã®ç°ãªãè¤æ°ã®ã¢ãã«ãããã®ã§ãããä»åã¯ããã¤ã試ãã¦ååãªæ£ç¢ºãããã£ã¦æ¯è¼çé«éã«åä½ããã¨ããç¹ã§ 'medium' ï¼è¦æ± RAM: 5GB ã»ã©ï¼ã使ç¨ãã¾ãããæ¥æ¬èªã§å°éç¨èªãå¤ãå«ãåç»ã«å¯¾ãã¦ãæ£ç¢ºã«æåèµ·ãããããã¨ãã§ãã¦ãã¦ãã¨ã¦ãå½¹ç«ã¤ãã®ã ã¨æãã¾ããã</p>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fgithub.com%2Fopenai%2Fwhisper" title="GitHub - openai/whisper: Robust Speech Recognition via Large-Scale Weak Supervision" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://github.com/openai/whisper">github.com</a></cite></p>
<h4 id="GPT-ã«ããã¿ã°ã¥ã">GPT ã«ããã¿ã°ã¥ã</h4>
<p>Whisper ã«ãã£ã¦åå¾ããæåæ
å ±ããGPT ã«ãã£ã¦æ§é åãããã¨ã§ã¿ã°ã¥ããè¡ãã¾ããã1æãã¤ã§ã¯éå§æå»ã»çµäºæå»ãããã£ã¦ããããããããããã¤ãã®ã»ã¯ã·ã§ã³ã«åå²ãã¦åã»ã¯ã·ã§ã³ã®æ¦è¦ãã¿ã°ã¨ãã¦åå¾ãããã¨ãããã¨ãç®æãã¾ããã</p>
<p>è²ã
ã¨è©¦ãã¦ããä¸ã§ãä¸ã®å³ã®ããã«ãã¾ãæåèµ·ããããå
¨æãã»ã¯ã·ã§ã³ãã¨ã«åãã¦è¦ç´ããã¦ã次ã«ãã®åºåãç¨ãã¦1æãã¤åã»ã¯ã·ã§ã³ã«é
ç½®ãããã¨ãããã¨ãè¡ãã¾ãããä¸åº¦ã®çæã§ã¯ãã¾ããããªãã£ãã®ã§ãããæåã«è¦ç´ãä½æããã¦ä¸åº¦ã®çæã§ã®ä»äºãæ¸ãããã¨ã§ãããããã¨ãå®ç¾ã§ãã¾ãããã¢ãã«ã¯ gpt-4o-mini ã使ãã¾ãã<a href="#f-ea19c49a" id="fn-ea19c49a" name="fn-ea19c49a" title="100ä¸ãã¼ã¯ã³ã®å
¥åã§ã0.15ãã«ãªã®ã§ã»ã¨ãã©ç¡æï¼">*2</a>ã</p>
<p><figure class="figure-image figure-image-fotolife" title="GPTã«ããã¿ã°ã¥ã"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241219/20241219170021.png" width="800" height="353" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>GPTã«ããã¿ã°ã¥ã</figcaption></figure></p>
<h3 id="ã¯ã©ã¦ãã¸ã®ãããã¤">ã¯ã©ã¦ãã¸ã®ãããã¤</h3>
<p>ä¸è¨ã®ããã«ãã¦åç»ããã¿ã°ã¥ããè¡ãã¾ã§ã®å¦çã¯ã³ã¼ããå®è¡ãããã¨ã§ã§ããããã«ãªã£ãã®ã§ããããããã©ã®ããã«ãã¦åããããåé¡ã«ãªãã¾ãããã¤ã³ã¿ã¼ã³å¾åã§ã¯ãã®é¨åã«åãçµãã§ãã¾ããã</p>
<h4 id="æ©è½è¿½å ã¨-GitLab-ãªãã¸ããªä½æ">æ©è½è¿½å 㨠GitLab ãªãã¸ããªä½æ</h4>
<p>ã¾ãã¯ä½æããã¿ã°ã BigQuery ã«ã¢ãããã¼ãããé¨åã¨åç»ã GCS ãããã¦ã³ãã¼ãããé¨åã Python ã§å®è£
ãã¾ãããã©ã¡ããå
¬å¼ã® Python Client ãç¨æããã¦ããããæ¯è¼ç容æã«è¡ããã¨ãã§ãã¾ããã</p>
<p>ãããã®æ©è½ãæ´ã£ãã¨ããã§ããããã¯ãã¨ãã¦ãªãã¸ããªãä½ãããã¨ãã話ã«ãªãã Vermouthï¼ãã«ã¢ããï¼ <a href="#f-6ba712db" id="fn-6ba712db" name="fn-6ba712db" title="AIãã¼ã ã§ã¯ç¾å¨ãé
ã®ååãããããã¯ãåãã¤ãã¦ãã¦ãvããå§ã¾ããé
ã®ååãä»ãã¦ï¼ã¨ãªã£ããé£èªã">*3</a>ã¨ããååã§ä½æãã¾ããããããã¾ã§èªåã¯ã¢ããªéçºã®çµé¨ãã»ã¨ãã©ãªãã£ããããã³ã¼ãã®æ´çã Poetry ãªã©ã®ããã±ã¼ã¸ç®¡çãã¼ã«ã®æ´»ç¨ã«ã¯è¦æ¦ãã¾ãããããããMRï¼ãã¼ã¸ãªã¯ã¨ã¹ãï¼ãä½æãã¦ã¬ãã¥ã¼ãåãããã®ãã£ã¼ãããã¯ãè¸ã¾ãã¦ä¿®æ£ã¨ãã¼ã¸ãç¹°ãè¿ããã¨ã§ãå¾ã
ã«ãªãã¸ããªãå
å®ããã¦ãããã¨ãã§ãã¾ããã</p>
<h4 id="ã³ã³ããã§ã®åä½ã¨ãããã¤">ã³ã³ããã§ã®åä½ã¨ãããã¤</h4>
<p>次ã«ãã¼ã«ã«ã®ã³ã³ããä¸ã§åãããããã«ãã¾ãããDocker ã¯ã»ã¨ãã©è§¦ãããã¨ããªãã£ãã®ã§ãããAI ãã¼ã ã®çããã«ä¸å¯§ã«æãã¦ããã ããã¨ã§ä½ããã¦ãããç解ããªããã³ãã³ããå®è¡ããã Dockerfile ãæ¸ããããããã¨ãã§ãã¾ããã</p>
<p>æå¾ã« GKE ä¸ã«ãããã¤ãã¦ãããå¦çãè¡ããã¨ããã®ãéä¸ã¾ã§ããã¾ãããTerraform ã§ã® BigQuery, GCS ãªã½ã¼ã¹ç®¡çã権éè¨å®ãk8s ã Skaffold ãªã©ãã¯ããã¦è§¦ãããã®ã ããã§ã¨ã¦ãåå¼·ã«ãªãã¾ãããæå¾ã¾ã§åãããã¨ã¯ã§ããªãã£ãã®ã¯ã¨ã¦ãæããã§ãããè²´éãªçµé¨ãã§ãã¾ããã</p>
<h2 id="ææ³">ææ³</h2>
<p>è²ã
ãªãã¨ã«ææ¦ã§ãã¦ã¨ã¦ã楽ãã10æ¥éã§ãããç¹ã«ãæ¯æ¥ã®ã¡ã³ã¿ã¼ããã¨ã® 1on1 ã§ä»å¾ã®æ¹éãå°ã£ã¦ãããã¨ã®è³ªåãªã©ããã¦ããã¨ãã«ã <strong>ããã«çããè¨ããã«ãã¡ãã«èãããã¦ããã</strong> ã®ãããã£ãã§ããä¾ãã°æåã«è¿°ã¹ããä½ãå¬ãããæ¤è¨ãã®ã¨ããã§ã¯ãã¡ããçãããã¨ã«å¯¾ãã¦ä½åº¦ãæ·±æã質åããã¦ãã ãã£ããããã§ä¸äººã§ã¯èããããªãã£ããã¨ã¾ã§æ´çã§ãã¾ãããå¾åã«ã³ã³ããå¨ãã®åãããªããã¨ã ããã§å°ã£ã¦ããæã«åããã¨ãä½åº¦ãèãã¦ãã¾ã£ããå¿ãã¦ãã¾ã£ãããããã¨ããã£ãã®ã§ãèããå
容ããã¡ãã¨æ´çãããã¨ã¯ä»å¾ã®èª²é¡ã ã¨æãã¾ããã</p>
<p>åæ¥ã¨æçµæ¥ä»¥å¤ã¯ãªã¢ã¼ãã§ã®ã¤ã³ã¿ã¼ã³ã¨ãããã¨ã§éä¸ãã¦åãçµãããä¸å®ã§ããããã¨ã¦ãå
å®ããæéã«ãªãã¾ãããæ¯æã®ãã¼ãã£ã³ã°ãä»äºã¨ã¯é¢ä¿ãªãéè«ãããå¤ä¼ã§ã«ã¡ã©ãªã³ã§è©±ãæ©ä¼ããããã¨ã§ãã³ãã¥ãã±ã¼ã·ã§ã³ãåããããã®ãããã£ãã§ããã¾ããslack ã§ã®ä¼è©±ã zoom ã§ã®ä¼è©±ãã¨ã¦ãè³ãã<a href="#f-f507ee2a" id="fn-f507ee2a" name="fn-f507ee2a" title="15åã®ãã¼ãã£ã³ã°ã§100件以ä¸ã®ãã£ãããæµãã¦ãã¦ãããã£ã">*4</a>ãªã®ãã¯ããã¯é©ãã¾ãããåããããã«ã¤ãªãã£ã¦ããã¨æãã¾ããã<a href="https://www.m3tech.blog/entry/2024/12/07/110000">æ°å®¶ããã®è¨äº</a>
㧠AIã»æ©æ¢°å¦ç¿ãã¼ã ã®ãªã¢ã¼ãã¯ã¼ã¯ã«é¢ãããã¨ãæ¸ããã¦ããã®ã§æ°ã«ãªãæ¹ã¯ãã¡ããã覧ãã ããã</p>
<p>ä¸ã«è¿°ã¹ããã¨ã®ã»ãã«ãã社å¡ããã¨ã® 1on1 ã»æè¡å
±æä¼ã»tech talk ãªã©è²ã
ãªãã¨ãã§ãã¾ããã1on1 ã§ã¯ã¨ã ã¹ãªã¼ã«é¢ãã話ã就活ã®è©±ãããããã§ãã¦ã¨ã¦ãåå¼·ã«ãªãã¾ãããæè¡å
±æä¼ã§ã¯æè¡æ¸ãè«æã®è¼ªèªä¼ãè¡ããã¦ãã¾ãããã¤ã³ã¿ã¼ã³æéä¸ã«ããã§çºè¡¨ããããã£ããã©æéã足ããã§ããªãã£ãã®ãæ®å¿µã</p>
<h2 id="æå¾ã«">æå¾ã«</h2>
<p>ç§ã¯ç«¶ããããã¼ã¿åæã³ã³ãã§ã¡ãã£ã¨ããã³ã¼ããæ¸ãç¨åº¦ãããã¦ããããç 究ã§ãã³ã¼ããæ¸ããã¨ããªãã®ã§ãããä»åã®çµé¨ãéãã¦èªåã§ä½ãã¢ããªãä½ã£ã¦ã¿ããã¨æãããã«ãªãã¾ãããæè¡åãã¤ããã ãã§ãªããèãæ¹ãæè¡ã¸ã®å§¿å¢ã¾ã§å¤ãã£ãæ°ããã¾ãã</p>
<p>ã¡ã³ã¿ã¼ã®åå·ãã(<a href="https://x.com/kitagry">@kitagry</a>)ãAIã»æ©æ¢°å¦ç¿ãã¼ã ã®çãããæ¬å½ã«ãããã¨ããããã¾ããï¼</p>
<p>ã¨ã ã¹ãªã¼ã«èå³ãæã£ã¦ããå¦çã®çããããã²ã¤ã³ã¿ã¼ã³åå ãã¦ã¿ã¦ãã ããï¼</p>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fopen.talentio.com%2Fr%2F1%2Fc%2Fm3%2Fhomes%2F4354" title="ãæ°åãã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ã åéä¸è¦§ / ã¨ã ã¹ãªã¼æ ªå¼ä¼ç¤¾" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://open.talentio.com/r/1/c/m3/homes/4354">open.talentio.com</a></cite></p>
<div class="footnote">
<p class="footnote"><a href="#fn-0c976af9" id="f-0c976af9" name="f-0c976af9" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text"> MR ã¨ã¯å»è¬æ
å ±æ
å½è
ã®ç¥ã§ãå»å¸«ãè¬å¤å¸«ã¸è¬å¤ã®èª¬æããã製è¬ä¼ç¤¾ã®å¶æ¥æ
å½è
ã®ãã¨ã</span></p>
<p class="footnote"><a href="#fn-ea19c49a" id="f-ea19c49a" name="f-ea19c49a" class="footnote-number">*2</a><span class="footnote-delimiter">:</span><span class="footnote-text">100ä¸ãã¼ã¯ã³ã®å
¥åã§ã0.15ãã«ãªã®ã§ã»ã¨ãã©ç¡æï¼</span></p>
<p class="footnote"><a href="#fn-6ba712db" id="f-6ba712db" name="f-6ba712db" class="footnote-number">*3</a><span class="footnote-delimiter">:</span><span class="footnote-text">AIãã¼ã ã§ã¯ç¾å¨ãé
ã®ååãããããã¯ãåãã¤ãã¦ãã¦ãvããå§ã¾ããé
ã®ååãä»ãã¦ï¼ã¨ãªã£ããé£èªã</span></p>
<p class="footnote"><a href="#fn-f507ee2a" id="f-f507ee2a" name="f-f507ee2a" class="footnote-number">*4</a><span class="footnote-delimiter">:</span><span class="footnote-text">15åã®ãã¼ãã£ã³ã°ã§100件以ä¸ã®ãã£ãããæµãã¦ãã¦ãããã£ã</span></p>
</div>
chimaki_yama821
ãç¥ã£ã¦ãã¤ãããããã®è±å´ï¼å£²ä¸æ§é ã®è§£å度ãä¸ãããããã¯ãããã¸ã¡ã³ã
hatenablog://entry/6802418398312037989
2024-12-19T11:00:00+09:00
2024-12-19T11:00:01+09:00 ãã®è¨äºã¯ã¨ã ã¹ãªã¼Advent Calendar 2024ã®19æ¥ç®ã®è¨äºã§ãã ããã«ã¡ã¯ãã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ã ãããã¯ãæ¯æ´ãã¼ã ã§ãããã¯ãããã¼ã¸ã£ã¼ããã¦ããä¸æã§ããç§ã¯ç¾å¨ãå»å¸«åãã®ã©ã¤ãåç»é
ä¿¡ãµã¼ãã¹ã§ãããWebè¬æ¼ä¼ãã¨ãããããã¯ãã«ãããã¯ãããã¼ã¸ã£ã¼ã¨ãã¦æºãã£ã¦ãã¾ããä»åã®è¨äºã§ã¯ãWebè¬æ¼ä¼ã®ã°ãã¼ã¹ã«åãçµãä¸ã§ã®å¦ã³ããç´¹ä»ãã¾ãã ã¯ããã« ãç¥ããªããã¨ããèªèãã ãç¥ããªããã¨ããç¥ãããã«ãã£ãã㨠ãã©ã¼ã«ã¹ããï¼ã¾ãã¯ã¿ããã®å£²ä¸ã2åã«ä¼¸ã°ãï¼ ã¾ã¨ãï¼ãããã¯ãããã¼ã¸ã£ã¼ã¯èªä¿¡ã¨è¬èãã®ãã©ã³ã¹ãå¤§äº We are hirâ¦
<p>ãã®è¨äºã¯ã¨ã ã¹ãªã¼<a href="https://qiita.com/advent-calendar/2024/m3">Advent Calendar 2024</a>ã®19æ¥ç®ã®è¨äºã§ãã</p>
<p>ããã«ã¡ã¯ãã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ã ãããã¯ãæ¯æ´ãã¼ã ã§ãããã¯ãããã¼ã¸ã£ã¼ããã¦ããä¸æã§ããç§ã¯ç¾å¨ãå»å¸«åãã®ã©ã¤ãåç»é
ä¿¡ãµã¼ãã¹ã§ãããWebè¬æ¼ä¼ãã¨ãããããã¯ãã«ãããã¯ãããã¼ã¸ã£ã¼ã¨ãã¦æºãã£ã¦ãã¾ããä»åã®è¨äºã§ã¯ãWebè¬æ¼ä¼ã®ã°ãã¼ã¹ã«åãçµãä¸ã§ã®å¦ã³ããç´¹ä»ãã¾ãã</p>
<ul class="table-of-contents">
<li><a href="#ã¯ããã«">ã¯ããã«</a></li>
<li><a href="#ç¥ããªããã¨ãèªèãã">ãç¥ããªããã¨ããèªèãã</a></li>
<li><a href="#ç¥ããªããã¨ãç¥ãããã«ãã£ããã¨">ãç¥ããªããã¨ããç¥ãããã«ãã£ããã¨</a></li>
<li><a href="#ãã©ã¼ã«ã¹ããã¾ãã¯ã¿ããã®å£²ä¸ã2åã«ä¼¸ã°ã">ãã©ã¼ã«ã¹ããï¼ã¾ãã¯ã¿ããã®å£²ä¸ã2åã«ä¼¸ã°ãï¼</a></li>
<li><a href="#ã¾ã¨ããããã¯ãããã¼ã¸ã£ã¼ã¯èªä¿¡ã¨è¬èãã®ãã©ã³ã¹ã大äº">ã¾ã¨ãï¼ãããã¯ãããã¼ã¸ã£ã¼ã¯èªä¿¡ã¨è¬èãã®ãã©ã³ã¹ã大äº</a></li>
<li><a href="#We-are-hiring">We are hiring!!</a></li>
</ul>
<h2 id="ã¯ããã«">ã¯ããã«</h2>
<p>çªç¶ã§ãããå
æ¥éå¬ãããpmconf2024ã¯åå ããã¾ããã§ããããã</p>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2F2024.pmconf.jp%2F" title="ãããã¯ãããã¼ã¸ã£ã¼ã«ã³ãã¡ã¬ã³ã¹ 2024 | pmconf 2024" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://2024.pmconf.jp/">2024.pmconf.jp</a></cite></p>
<p>ç§ã¯1æ¥ç®ã«ãªã³ã©ã¤ã³ã§åå ãã¾ãããã©ã®ã»ãã·ã§ã³ãé常ã«è¦å¿ããããåå¼·ã«ãªã£ãã®ã§ãããä¸ã§ãå°è±¡ã«æ®ã£ãã®ã<a href="https://x.com/Haruki_Sonehara">æ½æ ¹åãã</a>ã®ã»ãã·ã§ã³ã§ããã</p>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2F2024.pmconf.jp%2Fsessions%2FuhfjCACy" title="ãããã¯ãããã¼ã¸ã£ã¼ã®è¯ãææ決å®ã«ã¤ãã¦Questãã ï½pmconf2024" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://2024.pmconf.jp/sessions/uhfjCACy">2024.pmconf.jp</a></cite></p>
<p>ãã®ä¸ã§èªããã¦ããããããã¯ãã®ã¤ã³ãã¯ãã¯èªåéã®ææ決å®ã¬ãã«ä»¥ä¸ã«ä¸ãã¬ãããã¨ã¯ãªããã¨ããã¡ãã»ã¼ã¸ãè¸ã«çªãåºãã£ã¦ãã¾ãã</p>
<p>ã¨ããã®ããå
æ¥Webè¬æ¼ä¼ã«ã¤ãã¦åç· å½¹CTOå
¼VPoPã®å±±å´ã¨å宿ï¼ã¨ããåã®MTGï¼ãè¡ã£ãã®ã§ãããããã§ã®å¦ã³ãå
ã®ããããã¯ãã®ã¤ã³ãã¯ãã¯èªåéã®ææ決å®ã¬ãã«ä»¥ä¸ã«ä¸ãã¬ãããã¨ã¯ãªããã¨ããã¡ãã»ã¼ã¸ã¨éãªã£ãããã§ããå
·ä½çã«ã¯ãææ決å®ã®ã¬ãã«ããããããã«ã¯å£²ä¸æ§é ã®è§£å度ãä¸ããå¿
è¦ããããã¨ãããã¨ãå¦ã³ã¾ããã</p>
<p>ã¡ãªã¿ã«ã¨ã ã¹ãªã¼ã®ãããã¯ãããã¼ã¸ã£ã¼ãå®æ½ãããå宿ãã«ã¤ãã¦ã¯æ¬¡ã®è¨äºã§ãç´¹ä»ãã¦ããã¾ãã®ã§ããããããã°ã覧ãã ããã<iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.m3tech.blog%2Fentry%2F2024%2F10%2F01%2F110000" title="ãããã¯ãã®æé·ãå éãããä¼è°ï¼ã¨ã ã¹ãªã¼ã®ãããã¯ãããã¼ã¸ã£ã¼ãå®è·µãããå宿ãã¨ã¯ - ã¨ã ã¹ãªã¼ããã¯ããã°" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://www.m3tech.blog/entry/2024/10/01/110000">www.m3tech.blog</a></cite></p>
<p>ããã§ããããã¯ãããã¼ã¸ã£ã¼ã§ããã°æ
å½ãããã¯ãã®å£²ä¸æ§é ã¯ç解ãã¦ãã¦å½ç¶ã®ãã¨ã ã¨æãããã®ã§ã¯ãªãã§ãããããå½ç¶é«ãã¬ãã«ã§ç解ããã¦ãããããã¯ãããã¼ã¸ã£ã¼ãããã£ãããã¨æãã¾ãããã ããããããã¨ãç¥ã£ã¦ãã¤ãããã®ç½ ã«ã¯ã¾ã£ã¦ããã±ã¼ã¹ãããããããã¾ããã</p>
<h2 id="ç¥ããªããã¨ãèªèãã">ãç¥ããªããã¨ããèªèãã</h2>
<p>å宿ã§ã¯ã¾ãå±±å´ããWebè¬æ¼ä¼ã®å£²ä¸æ§é ãKPIã«ã¤ãã¦è³ªåãåããå®éã®KPI管ç表ãåºãã¦KPIã®èª¬æããã¦ããã¾ãããç§ã¯æ
å½ãããã¯ãããã¼ã¸ã£ã¼ã¨ãã¦å½ç¶èª¬æã§ããã¨æã£ã¦ãã¾ããï¼ä½ãªãå宿ã§èª¬æã§ããããäºåæºåãå
¥å¿µã«ãã¦ãã¾ããï¼ããã¡ããçãããããã¨ãããã¾ããããçããããªããã¨ãããã¾ããããã¨ãã°å£²ä¸ãã©ã®ããã«æç«ãã¦ããããKPIå解ãã¦èª¬æãããã¨ã¯ã§ãã¦ãããã¤ãä½ããã©ã®ããã«å£²ãã°å©çãå¢ããã®ãã¨ããç¹ã§çããããªããã¨ãããã¾ããã</p>
<p>ãã®ãã¨ã§ãèªåããç¥ã£ã¦ãã¤ãããã«ãªã£ã¦ãããå®ã¯ææ¡ã§ãã¦ããªãé¨åãããã¨ãããã¨ã«æ°ãä»ãã¾ããã</p>
<p>ã¡ãªã¿ã«ããã ãæ¸ãã¨ããããã¯ãããã¼ã¸ã£ã¼ã¨ãã¦ãã äºæ¥ç解ãçãã£ããã¨ãææãããããã«è¦ããããããã¾ããããããã§ã¯ãªããç¥ããªããã¨ããã¾ã ããã¨æ°ã¥ãããã¨ãå宿ã®ææç©ã¨ãªãã¾ãããå宿ã®æå¾ã«å±±å´ããã¯ãç¥ããªããã¨ãã¾ã ããã¨åãã£ã¦è¯ãã£ãã§ãããã¨ããé常ã«ãã¸ãã£ããªè¨èãããããèªåã®ç¥èã®å¤å´ã«ãããã®ãæããã«ãã¦ãããã©ãããã売ä¸ãå¢ãããã®ãã解ãæããã¦ããåãçµã¿ã«å¯¾ããé常ã«ååããªæ°æã«ãªãã¾ããã</p>
<p>ã¡ãªã¿ã«æ¬¡ã®æ¬ãããã®ãç¥ã£ã¦ãã¤ãããç¾è±¡ã«ã¤ãã¦æ¸ããã¦ãããé¢ç½ãã£ãã§ãã</p>
<p><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/dp/B09DRT8X8H?tag=hatena-22&linkCode=ogi&th=1&psc=1" class="hatena-asin-detail-image-link" target="_blank" rel="sponsored noopener"><img src="https://m.media-amazon.com/images/I/41+947uh+LL._SL500_.jpg" class="hatena-asin-detail-image" alt="ç¥ã£ã¦ãã¤ãããç¡ç¥ã®ç§å¦ (ãã¤ã«ã¯æ庫NF)" title="ç¥ã£ã¦ãã¤ãããç¡ç¥ã®ç§å¦ (ãã¤ã«ã¯æ庫NF)"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/dp/B09DRT8X8H?tag=hatena-22&linkCode=ogi&th=1&psc=1" target="_blank" rel="sponsored noopener">ç¥ã£ã¦ãã¤ãããç¡ç¥ã®ç§å¦ (ãã¤ã«ã¯æ庫NF)</a></p><ul class="hatena-asin-detail-meta"><li><span class="hatena-asin-detail-label">ä½è
:</span><a href="https://d.hatena.ne.jp/keyword/%A5%B9%A5%C6%A5%A3%A1%BC%A5%D6%A5%F3%20%A5%B9%A5%ED%A1%BC%A5%DE%A5%F3" class="keyword">ã¹ãã£ã¼ãã³ ã¹ãã¼ãã³</a>,<a href="https://d.hatena.ne.jp/keyword/%A5%D5%A5%A3%A5%EA%A5%C3%A5%D7%20%A5%D5%A5%A1%A1%BC%A5%F3%A5%D0%A5%C3%A5%AF" class="keyword">ãã£ãªãã ãã¡ã¼ã³ããã¯</a></li><li>æ©å·æ¸æ¿</li></ul><a href="https://www.amazon.co.jp/dp/B09DRT8X8H?tag=hatena-22&linkCode=ogi&th=1&psc=1" class="asin-detail-buy" target="_blank" rel="sponsored noopener">Amazon</a></div></div></p>
<p>ã¾ããèªãã®èããçããæãè¾¼ã¿ãææ¾ããã¨ã«ã¤ãã¦ã¯æ¬¡ã®æ¬ã«ã詳ããè¨è¼ããã¦ãã¾ãã</p>
<p><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/dp/B09X6LPM31?tag=hatena-22&linkCode=ogi&th=1&psc=1" class="hatena-asin-detail-image-link" target="_blank" rel="sponsored noopener"><img src="https://m.media-amazon.com/images/I/51I2Kd+e+gL._SL500_.jpg" class="hatena-asin-detail-image" alt="THINKãAGAINãçºæ³ãå¤ãããæãè¾¼ã¿ãææ¾ã" title="THINKãAGAINãçºæ³ãå¤ãããæãè¾¼ã¿ãææ¾ã"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/dp/B09X6LPM31?tag=hatena-22&linkCode=ogi&th=1&psc=1" target="_blank" rel="sponsored noopener">THINKãAGAINãçºæ³ãå¤ãããæãè¾¼ã¿ãææ¾ã</a></p><ul class="hatena-asin-detail-meta"><li><span class="hatena-asin-detail-label">ä½è
:</span><a href="https://d.hatena.ne.jp/keyword/%A5%A2%A5%C0%A5%E0%A1%A6%A5%B0%A5%E9%A5%F3%A5%C8" class="keyword">ã¢ãã ã»ã°ã©ã³ã</a></li><li>ä¸ç¬ æ¸æ¿</li></ul><a href="https://www.amazon.co.jp/dp/B09X6LPM31?tag=hatena-22&linkCode=ogi&th=1&psc=1" class="asin-detail-buy" target="_blank" rel="sponsored noopener">Amazon</a></div></div></p>
<h2 id="ç¥ããªããã¨ãç¥ãããã«ãã£ããã¨">ãç¥ããªããã¨ããç¥ãããã«ãã£ããã¨</h2>
<p>ä»ååãã£ããç¥ããªããã¨ãã«ã¤ãã¦å宿ã®ä¸ã§ç«ã¦ã仮説ãæ¤è¨¼ããããã«ã社å
ã®é¢ä¿è
ã«è©±ãèãã«è¡ãããã¡ã¯ããåéãã¾ããã</p>
<p>ãã¨ãã°ãå
«ç¾å±ã®å£²ä¸ã®å ´åãè³¼å
¥è
æ°Ã客å価ã¨å解ã§ãã¾ã<a href="#f-97a33f67" id="fn-97a33f67" name="fn-97a33f67" title="çªç¶å
«ç¾å±ãåºã¦ããã®ã¯ãã¢ããã¸ã¼ããã°ãã°æ´»ç¨ããã¨ã ã¹ãªã¼ã®ãããã¯ãæ¯æ´ãã¼ã ã®ç¹å¾´ã§ãããã¾ãã®ã§ãç¬è¦§ãã ããï½">*1</a>ãããã®è§£å度ã¯é¢ä¿è
ã¸ã®ã¤ã³ã¿ãã¥ã¼ã®åå¾ã§å¤§ããç°ãªãã¾ããã</p>
<ul>
<li>Beforeï¼ã売ä¸ï¼è³¼å
¥è
æ°Ã客å価ããåãªãæ°å¼ã¨ãã¦ã¨ãããè³¼å
¥è
ãå¢ããæ¹æ³ã客å価ãä¸ããæ¹æ³ãã¨ãµãããã¨èãã¦ããç¶æ
</li>
<li>Afterï¼æ¬ã®ã¿ãããªãå©ççãé«ãä»å
¥ããå¢ãããã¨ãå¯è½ã ãããã£ã¨å£²ã£ã¦æ¬²ãããã¨ããããã«ããã¤ãä½ããã©ã®ããã«å£²ãã°å©çãå¢ããããç解ãã¦ããç¶æ
</li>
</ul>
<p>â»ä¸è¨ã¯ããã¾ã§ä¾ã§ãã
<span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241219/20241219110008.png" width="800" height="420" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span></p>
<h2 id="ãã©ã¼ã«ã¹ããã¾ãã¯ã¿ããã®å£²ä¸ã2åã«ä¼¸ã°ã">ãã©ã¼ã«ã¹ããï¼ã¾ãã¯ã¿ããã®å£²ä¸ã2åã«ä¼¸ã°ãï¼</h2>
<p>ä¸è¨ã®ã¹ãããã§ã¿ããã売ãã°å©çãå¢ããã¨ãããã¨ãåãã£ããããã¿ããã®å£²ä¸ã2åã«ããæ¹æ³ãèãã¾ããããã§ã®ãã¤ã³ãã¯ãå
«ç¾å±å
¨ä½ã®å£²ä¸ã®ãã¨ã¯ä¸æ¦ç½®ãã¦ãããå¾¹åºãã¦ã¿ããã®å£²ä¸ã2åã«ãããã¨ã«ãã©ã¼ã«ã¹ãããã¨ã§ãã</p>
<p>ãªããå
¨ä½ã®å£²ä¸ã§ãªãã¿ããã®å£²ä¸ã2åã«ãããã®ãã¨ããã¨ãã¿ããã®å£²ä¸ã2åã«ã§ããªããªãã°å
«ç¾å±å
¨ä½ã®å£²ä¸ã2åã«ã¯ã§ããªãããã§ããå®éã«ã横å±éã®ãã¨ã¯ä¸æ¦èããã«ç¹å®ã®æ¡ä»¶ã«ãã©ã¼ã«ã¹ãããã¨ã§ãå
¨ä½ã®KPIã伸ã°ããã¨ãã¦ããã¨ãã«ã¯åºã¦ããªãã£ãã¢ã¤ãã¢ã次ã
ã¨åºã¦ãã¾ãããç¾å¨ã¯ãããã®ã¢ã¤ãã¢ãã¤ã³ãã¯ãã®å¤§ãããã®ããé ã«å®æ½ãå¹æãæ¤è¨¼ãã¦ãã¾ããã¡ãªã¿ã«ãã®è©±ã¯ãå
«ç¾å±çè«ãã¨ãã¦æ¬¡ã®è¨äºã§è©³ãã解説ããã¦ãã¾ãã<iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Flogmi.jp%2Fmain%2Ftechnology%2F328184" title="KPIã®æé·ãæ大åãããå
«ç¾å±çè«ãã¨ãF1çè«ããPMFâæ¡æ£ãã§ã¼ãºãçãæ®ã2ã¤ã®èãæ¹ | ãã°ãã¼Business" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://logmi.jp/main/technology/328184">logmi.jp</a></cite></p>
<p>å
«ç¾å±ã®å£²ä¸ãä¸ããããã«ã¿ããããã£ã¨å£²ã£ã¦æ¬²ãããã¨ãããã¨ã«æ°ã¥ããªããã°ã¿ããã®å£²ä¸ã2åã«ããã¨ããã¢ããã¼ãã«ã¯çµã³ã¤ãã¾ããã§ãããããã§ã¯å
«ç¾å±ãä¾ã«èªãã¾ããããå®éã®ãããã¯ãããã¸ã¡ã³ãã«ããã¦ãåæ§ã§ãã</p>
<h2 id="ã¾ã¨ããããã¯ãããã¼ã¸ã£ã¼ã¯èªä¿¡ã¨è¬èãã®ãã©ã³ã¹ã大äº">ã¾ã¨ãï¼ãããã¯ãããã¼ã¸ã£ã¼ã¯èªä¿¡ã¨è¬èãã®ãã©ã³ã¹ã大äº</h2>
<p>ä»åã®è¨äºã§ã¯ãäºæ¥ãã°ãã¼ã¹ãããããã«ã¯å£²ä¸æ§é ã®è§£å度ãä¸ããå¿
è¦ãããããã®è§£å度ãæ½çã®ç²¾åº¦ãå·¦å³ããã¨ãããã¨ãæ¸ãã¾ããã
ç¹ã«ãèªåãäºæ¥ã®ãã¨ãåãã£ã¦ããã¨ããæãè¾¼ã¿ãããã«æ¨ã¦ããããã常ã«èªåãç¥ããªããã¨ã¯ä½ããèªåèªçãã売ä¸æ§é ã®è§£å度ãé«ãã¦ãããããã¨ãããã¨ã®éè¦æ§ã¨é£ãããå¦ã³ã¾ããã</p>
<p>ãã®ãã¨ã«ã¤ãã¦ã次ã®è¨äºã§ã¯ãããã¯ãããã¼ã¸ã£ã¼ã«å¿
è¦ãªãè¬èããã¨ãã¦èªããã¦ãã¾ãã®ã§ãæå¾ã«ãç´¹ä»ãã¾ãã
<iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Flogmi.jp%2Fmain%2Ftechnology%2F328007" title="âãããPMâã¨âã¤ãã¤ããªPMâã®ããã¦ã¬ã³ã½ã¦ãã®å·®ãæé·æ©ä¼ã失ããªãããã«ãã¸ã¥ãã¢PMãããããã㨠| ãã°ãã¼Business" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://logmi.jp/main/technology/328007">logmi.jp</a></cite></p>
<blockquote><p>å±±å´ï¼ãããã¯ãã¾ãããã¨æã£ã¦ãããããã©ãããã§ãªããããããªãããã£ã¨è¯ãæ¹æ³ããããããããªããããèªåã¯ããã§æé·ã§ããã¨æã£ã¦ãããã ãã©ãã£ã¨è¯ãã¢ããã¤ã¹ããããããããããªããã¨ããã¯ã常ã«èªä¿¡ã¨è¬èãã®ãã©ã³ã¹ã¯æã£ã¦ããã®ãããã§ãããä¸æµãããã¯ãããã¼ã¸ã£ã¼ã¯å¿
ãæã£ã¦ãã¾ãã</p></blockquote>
<p>æå¾ã¾ã§èªãã§ãã ãããããã¨ããããã¾ãã</p>
<h2 id="We-are-hiring">We are hiring!!</h2>
<p>ã¨ã ã¹ãªã¼ã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ãã§ã¯ãä¸ç·ã«åã仲éãåéãã¦ãã¾ãï¼ ã¾ãã¯ã«ã¸ã¥ã¢ã«é¢è«ããã以ä¸URLãããå¿åããå¾
ã¡ãã¦ãã¾ãã</p>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjobs.m3.com%2Fengineer%2F" title="ã¨ã³ã¸ãã¢æ¡ç¨ãµã¤ãï½æ¡ç¨æ
å ± | å»çÃãã¯ããã¸ã¼ã®å¯è½æ§ã¯ç¡é大" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jobs.m3.com/engineer/">jobs.m3.com</a></cite></p>
<div class="footnote">
<p class="footnote"><a href="#fn-97a33f67" id="f-97a33f67" name="f-97a33f67" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">çªç¶å
«ç¾å±ãåºã¦ããã®ã¯ãã¢ããã¸ã¼ããã°ãã°æ´»ç¨ããã¨ã ã¹ãªã¼ã®ãããã¯ãæ¯æ´ãã¼ã ã®ç¹å¾´ã§ãããã¾ãã®ã§ãç¬è¦§ãã ããï½</span></p>
</div>
kananakamu
Javaãããã®ã¯ã©ã¦ã移è¡ããã¸ã§ã¯ãã®æ³¥èãææ¦
hatenablog://entry/6801883189128074680
2024-12-18T17:00:00+09:00
2024-12-18T17:08:15+09:00 ãã®è¨äºã¯ã¨ã ã¹ãªã¼ Advent Calendar 2024 ã®18æ¥ç®ã®è¨äºã§ãã ããã«ã¡ã¯ãåºç¤ãã¼ã ã¨ã³ã¸ãã¢ã®æ¡åã§ããæè¿ã¯Keychron Q11ãè³¼å
¥ãã¦ãã¼ãã¼ãã©ã¤ãã楽ããã§ãã¾ããæ¨æ¥ã¯ãã¼ã¹ã¤ããã®äº¤æã«å¤±æãã10å¹´ã¶ãã«ã¯ãã ä»ãããã¦ä½ã¨ãäºãªããå¾ã¾ããã ã¯ãã ä»ãããã巨大ãªéã®å¡ãã§ãã¦ãã¾ã£ãã®å³ æ¬æ¥ã¯ç§ãåæåãçµãã§ããJavaãããã®ãªã³ãã¬ããã¯ã©ã¦ããªããããã¸ã§ã¯ãã«ã¤ãã¦ç´¹ä»ãã¾ãããªããªãæ³¥èãä½æ¥ãå¤ãã£ãã®ã§ãããããã®ã¾ã¾ã®ä»äºå
容ããä¼ããã¾ãã æ¦è¦ ã·ã¹ãã ã®æ¦è¦ ããã¸ã§ã¯ãã®æ¦è¦ ããã¸ã§ã¯ãã®èæ¯ è±ãªã³ãã¬ãé²ãâ¦
<p>ãã®è¨äºã¯<a href="https://qiita.com/advent-calendar/2024/m3">ã¨ã ã¹ãªã¼ Advent Calendar 2024</a> ã®18æ¥ç®ã®è¨äºã§ãã</p>
<p>ããã«ã¡ã¯ãåºç¤ãã¼ã ã¨ã³ã¸ãã¢ã®æ¡åã§ããæè¿ã¯Keychron Q11ãè³¼å
¥ãã¦ãã¼ãã¼ãã©ã¤ãã楽ããã§ãã¾ããæ¨æ¥ã¯ãã¼ã¹ã¤ããã®äº¤æã«å¤±æãã10å¹´ã¶ãã«ã¯ãã ä»ãããã¦ä½ã¨ãäºãªããå¾ã¾ããã</p>
<p><figure class="figure-image figure-image-fotolife" title="ã¯ãã ä»ãããã巨大ãªéã®å¡ãã§ãã¦ãã¾ã£ãã®å³"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241218/20241218170007.jpg" width="800" height="600" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>ã¯ãã ä»ãããã巨大ãªéã®å¡ãã§ãã¦ãã¾ã£ãã®å³</figcaption></figure></p>
<p>æ¬æ¥ã¯ç§ãåæåãçµãã§ããJavaãããã®ãªã³ãã¬ããã¯ã©ã¦ããªããããã¸ã§ã¯ãã«ã¤ãã¦ç´¹ä»ãã¾ãããªããªãæ³¥èãä½æ¥ãå¤ãã£ãã®ã§ãããããã®ã¾ã¾ã®ä»äºå
容ããä¼ããã¾ãã</p>
<ul class="table-of-contents">
<li><a href="#æ¦è¦">æ¦è¦</a></li>
<li><a href="#ã·ã¹ãã ã®æ¦è¦">ã·ã¹ãã ã®æ¦è¦</a></li>
<li><a href="#ããã¸ã§ã¯ãã®æ¦è¦">ããã¸ã§ã¯ãã®æ¦è¦</a><ul>
<li><a href="#ããã¸ã§ã¯ãã®èæ¯">ããã¸ã§ã¯ãã®èæ¯</a></li>
<li><a href="#è±ãªã³ãã¬ãé²ããã«ããã£ã¦ã®ãã¼ãã«">è±ãªã³ãã¬ãé²ããã«ããã£ã¦ã®ãã¼ãã«</a><ul>
<li><a href="#ã¬ã¬ã·ã¼">ã¬ã¬ã·ã¼</a></li>
<li><a href="#å
¨ä½åã®è¦ããªã">å
¨ä½åã®è¦ããªã</a></li>
</ul>
</li>
<li><a href="#å®éã®ç§»è¡ä½æ¥">å®éã®ç§»è¡ä½æ¥</a><ul>
<li><a href="#æ¹é決å®">æ¹é決å®</a></li>
<li><a href="#EC2ã¸ã®ãªãã">EC2ã¸ã®ãªãã</a></li>
<li><a href="#å
¨ä½å">å
¨ä½å</a></li>
</ul>
</li>
<li><a href="#æè¡çãªèª²é¡ã¨è§£æ±ºç">æè¡çãªèª²é¡ã¨è§£æ±ºç</a><ul>
<li><a href="#ããã©ã¼ãã³ã¹ã®æªå">ããã©ã¼ãã³ã¹ã®æªå</a></li>
<li><a href="#解決">解決</a></li>
</ul>
</li>
<li><a href="#移è¡å¾ã®å¹æ">移è¡å¾ã®å¹æ</a></li>
<li><a href="#ææã¨ä»å¾ã®å±æ">ææã¨ä»å¾ã®å±æ</a></li>
</ul>
</li>
<li><a href="#ã¾ã¨ã">ã¾ã¨ã</a></li>
<li><a href="#We-are-Hiring">We are Hiring!</a></li>
</ul>
<h2 id="æ¦è¦">æ¦è¦</h2>
<p>æ¬ããã°ã®ç®çã¯ãå®éã®æ¥åå
容ããªã¼ãã³ã«ãã¦ç§»è¡ããã¸ã§ã¯ãã詳細ã«ç´¹ä»ãããã¨ã§ãã</p>
<p>ä»åã®ããã¸ã§ã¯ãã§ã¯ãOSã®ä¿å®æéãè¿ãå¤ããªã³ãã¬ãµã¼ãã¼ã§åãã¦ããJavaãããããã®ã¾ã¾EC2ã«ãªãããã¾ãããã¾ããPHPã®é¨åã¯API Gatewayã¨Lambdaãå©ç¨ãã¦è¥å¹²ã®å¤æ´ãå ãã¾ãããã¤ã³ãã©ã®ç®¡çã«ã¯Terraformã¨Ansibleã使ç¨ãã¦ãã¾ãã</p>
<p>ãã«ã¯ã©ã¦ãåãç®æãã¦ãããä»å¾ã®é²æã«ã¤ãã¦ãå ±åãã¦ããäºå®ã§ãã</p>
<h2 id="ã·ã¹ãã ã®æ¦è¦">ã·ã¹ãã ã®æ¦è¦</h2>
<p>ä¼å¡åãã¡ã¼ã«ãã¬ã¸ã³ã«å·®ãè¾¼ãåºåã¨ãªã¢(ã«ã¹ã¿ãã¤ãºã¨ãªã¢ãCA)ã«ãä¼å¡æ¯ã«æé©ãªåºåã決å®ãå·®ãè¾¼ãããã®ã·ã¹ãã ã§ãã</p>
<p><figure class="figure-image figure-image-fotolife" title="ããã¸ã§ã¯ãåææ¦è¦ "><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241218/20241218170010.png" width="701" height="441" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>ããã¸ã§ã¯ãåææ¦è¦ </figcaption></figure>
ã¡ã¼ã«é
ä¿¡ã·ã¹ãã ããåºåã¨ãªã¢ã®æ
å ±ã¨å¯¾è±¡ã®ä¼å¡ã®ãªã¹ãã渡ããããã¡ã¤ã«ã«æ°¸ç¶åãã¾ãããã®ãã¡ã¤ã«ãcronã§Javaããããèµ·åãåºåå
容ã決å®ããçµæããã¡ã¤ã«ã«åãåºããã¦ãã¾ãã</p>
<h2 id="ããã¸ã§ã¯ãã®æ¦è¦">ããã¸ã§ã¯ãã®æ¦è¦</h2>
<h3 id="ããã¸ã§ã¯ãã®èæ¯">ããã¸ã§ã¯ãã®èæ¯</h3>
<p>ãªã³ãã¬ãµã¼ãã¼ã¯å¸³ç¥¨ç°å¢ã¨å¼ã°ãã¦ãããç¶æè²»ãä¿å®æéã®è¦³ç¹ããå
¨ç¤¾çã«ãªãã¬ã¤ã¹ãé²ãããã¦ãã¾ããæ¬ã·ã¹ãã ãä¾ã«æ¼ãããä¿å®æ§ãå®å
¨é¢ã®è¦³ç¹ããè±ãªã³ãã¬ãå¿
è¦ã«ãªãã¾ããã</p>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.m3tech.blog%2Fentry%2F2024%2F12%2F13%2F110000" title="gitã¬ãã¸ããªèå¤å¦ã«ä½¿ãéå
· - ã¨ã ã¹ãªã¼ããã¯ããã°" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://www.m3tech.blog/entry/2024/12/13/110000 ">www.m3tech.blog</a></cite></p>
<h3 id="è±ãªã³ãã¬ãé²ããã«ããã£ã¦ã®ãã¼ãã«">è±ãªã³ãã¬ãé²ããã«ããã£ã¦ã®ãã¼ãã«</h3>
<h4 id="ã¬ã¬ã·ã¼">ã¬ã¬ã·ã¼</h4>
<p>æ´å²ççµç·¯ãç©ã¿éãªããJavaãããã®ã½ã¼ã¹ã³ã¼ãã«ã¯ã«ã¹ã¿ãã¤ãºã¨ãªã¢åºåã®ãã以å¤ã®ã½ã¼ã¹ã³ã¼ãã大éã«å«ã¾ãã¦ãã¾ããã¾ããæ¬ã·ã¹ãã ã®ã½ã¼ã¹ã³ã¼ãã¯å
¨ãå¥ã®ãµã¼ãã¹ããã«ããã¦ããããè¿éã«æãå
¥ãã¦ãã¾ãã¨ãã¡ãã«å½±é¿ãä¸ãã¦ãã¾ãå¯è½æ§ããããªã¹ã¯ãããã¾ãããããã«ãæ´å²ããã·ã¹ãã ã§ãããã³ã³ããã¤ã¡ã¼ã¸åãããã¨ãã¦ãä¸çç¸ã§ã¯ãããªãç°å¢ã§ããã</p>
<h4 id="å
¨ä½åã®è¦ããªã">å
¨ä½åã®è¦ããªã</h4>
<p>大è¦æ¨¡ãªJavaãããã®ã½ã¼ã¹ã³ã¼ããã·ã§ã«ã¹ã¯ãªããããã«ããã¡ã¤ã«ãªã©ãç¯å²ãåºãä¸ã«ä»ã®ã·ã¹ãã ã¨åå±
ãã¦ããã¤ã³ãã©ã ã£ãããã調æ»ç¯å²ãè±ãªã³ãã¬ã®ä½æ¥ç¯å²ãå®äºæ¡ä»¶ãªã©å
¨ä½åãææ¡ããã®ãé£ããç¶æ
ã§ããã</p>
<h3 id="å®éã®ç§»è¡ä½æ¥">å®éã®ç§»è¡ä½æ¥</h3>
<h4 id="æ¹é決å®">æ¹é決å®</h4>
<p>Javaãããã¨ãã®Input/Outputã«ã¯æãä¸åå
¥ããã«ã¯ã©ã¦ãã¸ãªããããã¨ããæ¹éãç«ã¦ãå¿
è¦æå°éã®å·¥æ°ã§è±ãªã³ãã¬ãå®ç¾ãããã¨ãæåªå
ã«ãã¾ããããã®ããå½åæ§æ³ã«ã¯ãã£ããã®ã®Javaã®ã³ã³ããã¤ã¡ã¼ã¸åã¯åªå
度ãè½ã¨ãã¹ã³ã¼ãå¤ã«ãã¾ããæ¬æ¥ã¯ãã¡ã¤ã«IFã®å»æ¢ããããã®é²æéç¥ã®æ¹åãè¡ãããã£ãã®ã§ãããèå¿ã®è±ãªã³ãã¬ã®å®ç¾ãé
ãã¦ãã¾ãããããããã¹ã³ã¼ãå¤ã¨ãã¾ããã</p>
<p>Javaãããã®ã³ã³ããã¤ã¡ã¼ã¸åãã§ããªãã®ã§ãèªç¶ã¨ã¯ã©ã¦ãã¯EC2ããã¼ã¹ã¨ãã¦ä»ã®å¿
è¦ãªãµã¼ãã¹ã追å ãã¦ãããã¨ã«ãã¾ããã</p>
<h4 id="EC2ã¸ã®ãªãã">EC2ã¸ã®ãªãã</h4>
<p>Javaèªä½ã¯ããã <code>Write once, run anywhere</code> ã§ãã£ã¦ãå¿é
ã¯ãã¦ãã¾ããã§ããããå®éç¹ã«åé¡ãªããªããèªä½ã¯ã§ãã¾ããããã ãå¨è¾ºã®ã¹ã¯ãªããã®ç§»è¡ã¯ãªããªã骨ãæãã¾ãããJavaã®ãã«ãããããã¤ã¯ãªã³ãã¬ãµã¼ãã¼ä¸ã§ç¬èªã®ãã«ãã¹ã¯ãªããã使ããã¦ããã®ã§å¼ã³åºããã¦ããå¥ã®ã¹ã¯ãªãããå¿
è¦ãªã©ã¤ãã©ãªã®ã¤ã³ã¹ãã¼ã«ããã£ã¬ã¯ããªæ§é ãªã©ã調æ»ãã¦ä¸æ©ã¥ã¤è§£æ±ºãã¦ããã¾ããããã®ä½æ¥ãæ³¥èãã®ãã¼ã¯ã ã£ãã¨æãã¾ããå
¨é¨èªãã ã¤ããã§ãåããã¦ããã¨å¼ã³åºãã¦ããã¹ã¯ãªãããæ¼ãã¦ããããæé»çã«å¿
è¦ã¨ãã¦ããã©ã¤ãã©ãªã«æ°ã¥ããã¨ãã§ããã«å¯ãã«ã¨ã©ã¼ãåããã«è½ã¡ã¦ããã®ãç¹°ãè¿ãã¦ããã¨ãã¯å¿ã«æ¥ããã®ãããã¾ããã</p>
<p>ã¾ãä»åã¯IaCã«Ansibleãé¸æãã¾ãããå§ãã¦ã®Ansibleã ã£ãã®ã§ãããæ¸ãæ¹ã®ã¬ãã¥ã¼ã¯SREãã¼ã ãååãã¦ãããããå質æ
ä¿ãåããªããé²ãããã¨ãã§ãã¾ããããã¼ã ã®å£æ ¹ãä½ãã®ã§å¿
è¦ãªããã¼ã ã¾ããã£ã¦ã¬ãã¥ã¼ãæ°è»½ã«ã§ããã»ãã¦ããããæåãªã®ã¯ã¨ã¦ã好ãã§ãã</p>
<h4 id="å
¨ä½å">å
¨ä½å</h4>
<p><figure class="figure-image figure-image-fotolife" title="ã¯ã©ã¦ã移è¡å¾"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241218/20241218170013.png" width="800" height="545" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>ã¯ã©ã¦ã移è¡å¾</figcaption></figure></p>
<p>Java以å¤ã®PHPãªã©ã¯EC2ã«å
¥ããããªãã£ãã®ã§ API Gateway + Lambda(Python) ã«ãããªã©ãã¯ã©ã¦ããªããã ãã§ãªãã¯ã©ã¦ãã·ãããå¤å°åæã«åãè¾¼ãã§ãã¾ãã</p>
<h3 id="æè¡çãªèª²é¡ã¨è§£æ±ºç">æè¡çãªèª²é¡ã¨è§£æ±ºç</h3>
<h4 id="ããã©ã¼ãã³ã¹ã®æªå">ããã©ã¼ãã³ã¹ã®æªå</h4>
<p>æ¬çªåãæ¿ãã®ãªã®ãªã®ã¿ã¤ãã³ã°ã§ããã©ã¼ãã³ã¹ãæªåãã¦ãããã¨ã«æ°ã¥ãã¾ããããªã³ãã¬ãããæ§è½ãä¸ããã¯ãã®EC2ã§ããªããå¦çæéã4,5åã«ä¼¸ã³ãã±ã¼ã¹ãããã¾ãã(30åã ã£ãã±ã¼ã¹ã2æéã«ãªããªã©)ããªã³ãã¬æ代ã¨ç°ãªãã®ã¯ãµã¼ãã¼ãã¯ã©ã¦ãã«ç½®ããã¦ãããã¨ãããã§ãããã½ã¼ã¹ã³ã¼ããDBã¯ãªã³ãã¬æ代ã¨åãç°å¢ãªã®ã«ã§ãã</p>
<p>調æ»ãé²ãã¦ããã¨ã©ããããããã¯ã¼ã¯é
延ãåå ã ã£ããã¨ããããã¾ããããªã³ãã¬æ代ã¯ã¢ããªã±ã¼ã·ã§ã³ã¨ãã¼ã¿ãã¼ã¹ãç©ççã«è¿ãä½ç½®ã«ãããããã¢ããªã±ã¼ã·ã§ã³ãã¯ã©ã¦ããªãããããã¨ã§ï¼ãã¼ã¿ãã¼ã¹ã¯ãªã³ãã¬ã®ã¾ã¾ï¼ããããã¯ã¼ã¯é
延ã®å½±é¿ãããã«åãã¾ããã1件1件ã®ãããã¯ã¼ã¯é
延ã¯æ°ããªç§ç¨åº¦ã§ãã£ã¦ãããããæ°åä¸ã®ä¼å¡æ° à æ°åã®åºåã®æãåããã§é
延ãç¡è¦ã§ããªãç¶æ³ã«ãªãã¾ããã</p>
<h4 id="解決">解決</h4>
<p>NWèµ·å ã®æ§è½æªåã ã£ãã®ã§ãµã¼ãã¼ã®ã¹ããã¯ã¢ãããªã©ã§ã解決ã¯é£ãããDBã®ãã¥ã¼ãã³ã°ãå¹æçã§ã¯ãªãç¶æ
ã§é ãæ±ãã¾ããããããå¦çãé
ãã¦ãã¾ãã¨é©åãªåºåãå·®ãè¾¼ããã¨ãã§ããªããªãæ©ä¼æ失ã«ãã¤ãªãã£ã¦ãã¾ãã¾ãã</p>
<p>ä»åã¯Inputãã¡ã¤ã«ããããããnåå²ãã¦ãJavaã®ããã»ã¹ãnçåãã¦èµ·åããã¨ããçµæ§ãªåæã§è§£æ±ºãã¾ãããããã§ããã°Javaãããã«æãããããã¨ãªãã¹ã¬ãã競åãæ°ã«ãããã¨ããªããªããæ¯è¼çå®å
¨ã«ä¸¦è¡å¦çãè¡ããã¨ãã§ããããä»æãã¨ã¹ãã¼ãæã¨å質ã®ãã©ã³ã¹ãã¨ã£ãã¢ã¤ãã¢ã§ãããªã¨ãææ¡ãã¦ãããã¡ã³ãã¼ã«æè¬ã§ãã</p>
<p>Javaãããã¯ãã¨ãã¨è¤æ°ã®ããã»ã¹ãåæã«èµ·åãããããé©åãªã¡ã¢ãªè¨å®ãæ©ã¿ã¾ãããæ°åä¸ä»¶ã®å¦çã«å¿
è¦ãªã¡ã¢ãªãµã¤ãºã¨åæ並è¡ç¨¼åæ°ãèæ
®ãã¦OSã®ã¹ããã¯ã決ãã¦è¡ãå¿
è¦ãããã¾ããã
ä»åã¯jstatã§ã¡ã¢ãªãã³ããå®æçã«åå¾ããªããã¡ã¢ãªä½¿ç¨éã®æ¨ç§»ãè¦ã¦ãè²ã
æ¡ä»¶ãå¤ããªãããã¹ããç¹°ãè¿ããå¿
è¦æå°éã®Javaã¡ã¢ãªéã決å®ãã¦ããã¾ããã</p>
<p><figure class="figure-image figure-image-fotolife" title="50ä¸ä»¶å®è¡æã®jstatã°ã©ã"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241218/20241218170016.png" width="800" height="494" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>50ä¸ä»¶å®è¡æã®jstatã°ã©ã</figcaption></figure></p>
<h3 id="移è¡å¾ã®å¹æ">移è¡å¾ã®å¹æ</h3>
<p>ä»ã¾ã§ã¯ãªã³ãã¬ã¨ããç¹æ§ä¸ãä»ã®ãµã¼ãã¹ãåå±
ãã¦ãããã権é管çã¨ãã¦åé¡ããã£ã¦ãSREãã¼ã ã¸ä½æ¥ä¾é ¼ã調æ»ä¾é ¼ãå¿
è¦ã«ãªã£ã¦ãã¾ããããEC2ãèªåãã¡ã§ã管çããããã«ãªã£ãã®ã§ã調æ»ã«å¿
è¦ãªæ¨©éçã¯èªåãã¡ã§åå¾ãã§ããããã·ã¹ãã ã«ããããã¼ã ã®èªç«æ§ãé«ã¾ã£ãã¨æãã¾ãã</p>
<h3 id="ææã¨ä»å¾ã®å±æ">ææã¨ä»å¾ã®å±æ</h3>
<p>æ¥å¹´æ«ã«ã¯æ¬ã·ã¹ãã ãå¼·ãä¾åãã¦ããåç¨DBããã®è±å´ããã³ã¹ããã¦ã³ã®ããå¿
é ã«ãªãã¾ãããã®ãããããã大è¦æ¨¡ãªã·ã¹ãã ã®æ¹ä¿®ãå¿
è¦ã«ãªã£ã¦ããã¾ããä»åã¹ã³ã¼ãå¤ã«ããJavaãããæ¬ä½ã®æ¹ä¿®ãä¸å¯é¿ãªã®ã§ãæãåã£ããªã¢ã¼ããã¯ãã£ã³ã°ãå«ãã¦ãã£ã¨ã¯ã©ã¦ããã¤ãã£ããªä½ãã«æã£ã¦ãããã¨ãã§ããããããªã¨æãã¾ãã</p>
<h2 id="ã¾ã¨ã">ã¾ã¨ã</h2>
<p>æ³¥èã調æ»ãä½æ¥ãç©ã¿éãã¦è±ãªã³ãã¬ãã¯ã©ã¦ããªãããå®éãã¾ããï¼ ãµã¼ãã¼ã®å ´æããªã³ãã¬ããã¯ã©ã¦ãã«ç§»åããã ãã§ãNWé
延ãç¡è¦ã§ããªãç¶æ
ã«ãªã£ã¦å°ãããçµé¨ãã§ãã¾ããã</p>
<h2 id="We-are-Hiring">We are Hiring!</h2>
<p>ã¨ã ã¹ãªã¼ã¯ã¾ã ã¾ã JavaãKotlinãªã©ã®JVMç³»è¨èªã«ããã·ã¹ãã éçºãè¡ã£ã¦ããã¾ãï¼ èå³ãæãããããã²ãã¡ãããï¼</p>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjobs.m3.com%2Fengineer%2F+" title="ã¨ã³ã¸ãã¢æ¡ç¨ãµã¤ãï½æ¡ç¨æ
å ± | å»çÃãã¯ããã¸ã¼ã®å¯è½æ§ã¯ç¡é大" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jobs.m3.com/engineer/ ">jobs.m3.com</a></cite></p>
kuwavar
GPUã§é«éãªã¢ãã«æ¨è«ãå®ç¾ããããã«èããã㨠-FlashAttentionã¯ãªãé«éã-
hatenablog://entry/6802418398311015222
2024-12-17T18:00:00+09:00
2024-12-20T17:23:27+09:00 ãã¡ãã¯ã¨ã ã¹ãªã¼ Advent Calendar 2024 17æ¥ç®ã®è¨äºã§ãã AIã»æ©æ¢°å¦ç¿ãã¼ã ã®é«æ©ã§ãããã¼ã ã§ã¯å
é±ããNeurIPSèªã¿ä¼ãéå¬ããã¦ããã"Deep Learning Architecture, Infrastructure"ã¨ãã深層å¦ç¿ã®ã¢ã¼ããã¯ãã£ã«é¢ããã»ãã·ã§ã³ãæ
å½ãã¾ããããã®ä¸ã§ãèå³æ·±ãä¸æ¬ã¨ãã¦"You Only Cache Once: Decoder-Decoder Architectures for Language Models"ã¨ããè«æãåå¼·ä¼ã¾ã¨ãããã°ã§ç´¹ä»ãã¦ã¾ãã www.m3tech.blog ãã®è«æã§ã¯LLMã®æ¨è«â¦
<p>ãã¡ãã¯<a href="https://qiita.com/advent-calendar/2024/m3">ã¨ã ã¹ãªã¼ Advent Calendar 2024</a> 17æ¥ç®ã®è¨äºã§ãã</p>
<p>AIã»æ©æ¢°å¦ç¿ãã¼ã ã®é«æ©ã§ãããã¼ã ã§ã¯å
é±ããNeurIPSèªã¿ä¼ãéå¬ããã¦ããã"Deep Learning Architecture, Infrastructure"ã¨ãã深層å¦ç¿ã®ã¢ã¼ããã¯ãã£ã«é¢ããã»ãã·ã§ã³ãæ
å½ãã¾ããããã®ä¸ã§ãèå³æ·±ãä¸æ¬ã¨ãã¦"You Only Cache Once: Decoder-Decoder Architectures for Language Models"ã¨ããè«æãåå¼·ä¼ã¾ã¨ãããã°ã§ç´¹ä»ãã¦ã¾ãã
<iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.m3tech.blog%2Fentry%2F2024%2F12%2F14%2F121059" title="NeurIPS2024ãéå¬ä¸ãªã®ã§ãã¨ã ã¹ãªã¼ AIã»æ©æ¢°å¦ç¿ãã¼ã ã®æ¨ãè«æãåæã«ç´¹ä»ãããï¼ - ã¨ã ã¹ãªã¼ããã¯ããã°" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://www.m3tech.blog/entry/2024/12/14/121059">www.m3tech.blog</a></cite>
ãã®è«æã§ã¯LLMã®æ¨è«æã«ç¨ããããKey Value Cacheã¨ããä»çµã¿ã«çç®ãã¦GPUã¡ã¢ãªã®å æéãã¹ã«ã¼ãããã大å¹
ã«åä¸ãããã¢ã¼ããã¯ãã£ãææ¡ãã¦ãã¾ãããé常ã«ã¢ãã«ã大è¦æ¨¡åããæ¨ä»ããã®è«æã®ããã«GPUãæã¤ãã¼ãã¦ã§ã¢ç¹æ§ã«å¿ãã¦ã¢ãã«ã®ã¢ã¼ããã¯ãã£ãæ¹è¯ãããã¨ãããä¸å±¤æ±ãããã¦ãã¾ãã</p>
<p>ãã®é¡ã®æè¡ã§æåãªãã®ã¨ãã¦FlashAttentionã¨ããLLMã®Attentionæ©æ§ã®æ¨è«ãé«éåããã¢ã«ã´ãªãºã ããããè«æã§ã¯æ大6åç¨åº¦Attentionæ©æ§ã®æ¨è«é度ãåä¸ãããã¨ãå ±åããã¦ãã¾ããããããFlashAttentionã¯è¡åè¨ç®ã®æ¼ç®éãåæ¸ããããã§ã¯ããã¾ããããããªã®ã«ãªãããã»ã©å¤§å¹
ãªé«éåãéæã§ããã®ã§ããããã</p>
<p>çãã¯FlashAttentionã®è«æã¿ã¤ãã«ã«ããªã£ã¦ããã¨ãã"Fast and Memory-Efficient Exact Attention with <span style="font-size: 120%">IO-Awareness</span>"ãI/Oã大å¹
ãªé度åä¸ã®éµã§ãã
ã§ã¯ãªãããã»ã©GPUã§ã®I/OãAttentionæ©æ§ã®è¨ç®ã§ã¯ãªãã£ã«ã«ãªã®ããä»åã¯è¡åæ¼ç®ã¨I/Oããã®ãã©ã³ã¹ã«çç®ãã¦å®éã®è¨ç®éãè¦ç©ãããã¤ã¤GPUä¸ã§ã®ã¢ãã«æ¨è«é度ãèãã¦ããã¾ãã</p>
<h2 id="ã¢ãã«æ¨è«é度ã決ãã2大è¦ç´ ">ã¢ãã«æ¨è«é度ã決ãã2大è¦ç´ </h2>
<p>ãã¦ãLLMãå§ãã¨ãã深層å¦ç¿ã¢ãã«ã®ã¢ã¼ããã¯ãã£ãèããã¨ãã«ã¯å¸¸ã«æ§è½ã¨æ¨è«é度ã®ãã©ã³ã¹ãèãããã¨ã«ãªãã¾ãã
ããã§ã¯æ§è½ã¯ä¸æ¦ç½®ãã¦ããã¦ãæ¨è«é度ãæ¹åãããã¨ãæããã使ãããææ¨ã¯ã¢ãã«ã®æ¼ç®åæ°(FLOPs)ã§ãã</p>
<p>ããããç´æã«åãã¦å¿
ãããGPUã§ã®æ¨è«é度ã¯æ¼ç®åæ°ã«æ¯ä¾ãã¾ãããLLM以å¤ãä¾ãã°ç»ååé¡ã¢ãã«ã§ããMobileNetã§ææ¡ãããDepth-Wise Convolutionãç¨ããã¨è¨ç®éã¯ä½åã®ä¸ãã«åæ¸ããCPUä¸ã§ã¯å®éã«ããç¸å¿ã«æ¨è«é度ãåä¸ãã¾ãããGPUä¸ã§ã®æ¨è«é度ã¯å®ã¯ããã»ã©éããªãã¾ããã</p>
<p>ãã®ãã¨ã¯ä¾ãã°<a href="https://openaccess.thecvf.com/content_CVPR_2020/papers/Radosavovic_Designing_Network_Design_Spaces_CVPR_2020_paper.pdf">Designing Network Design Spaces</a>ãææãã¦ãã¦ãGPUã§ã®æ¨è«æéã¯FLOPsããã¢ãã«ãæ¨è«æã«ä¸éã¬ã¤ã¤ã¼ã§çæããActivationã®ç·éã®ã»ããããå¼·ãç¸é¢ãæã¤ãã¨ã示ããã¦ãã¾ãã</p>
<p>ãªããããªããã¨ããã°GPUã®ããã«é«éãªè¡åæ¼ç®ãå®ç¾ãã¦ãããã¼ãã¦ã§ã¢ã§ã¯ã¡ã¢ãªã®I/Oããã¼ã¿è»¢éé度ã®ã»ããããã«ããã¯ã«ãªããã¨ã度ã
çããããã§ãã</p>
<h2 id="GPUã«æè¼ãããï¼ç¨®é¡ã®ã¡ã¢ãª">GPUã«æè¼ãããï¼ç¨®é¡ã®ã¡ã¢ãª</h2>
<p>GPUã«ã¯å¤§ããåãã¦ï¼ç¨®é¡ã®ã¡ã¢ãªãHBM(High Bandwidth Memory)ã¨SRAM (Static Random Access Memory)ãæè¼ããã¦ãã¾ããHBMã¯ããããGPUã¡ã¢ãªã¨å¼ã°ãã¦ãããã®ã§ãä¾ãã°NVIDIA GPU H100ã¯141GBã®HBMããããLLMã®æ¨è«æã«ã¯ã¢ãã«ã®ãã©ã¡ã¼ã¿ãã¢ã¯ãã£ãã¼ã·ã§ã³ã®ãã£ãã·ã¥ãä¿åãã¾ããä¸æ¹ã§SRAMã¯GPUã§å®éã«æ¼ç®ãè¡ãããã®ãã¼ã¿ãä¸æçã«ä¿æããããã®ã¡ã¢ãªç©ºéã§ããã¤ã¾ãæ¼ç®ãè¡ãã«ã¯HBMããSRAMã«ãã¼ã¿ãéãããã®æ¼ç®çµæãSRAMããHBMã«æ¸ãæ»ãå¦çãçºçãã¾ãã</p>
<p>SRAMã¯é常ã«é«ä¾¡ãªä»£ç©ã§ã256KBã®ã¢ã¯ã»ã¹ã¿ã¤ã ãé常ã«é«éãªSRAM<a href="#f-f3b9466d" id="fn-f3b9466d" name="fn-f3b9466d" title="H100ã ã¨132åã®Streaming Multiprocessor(SM)ã«1ã¤ãã¤256KBã®SRAMãæè¼ããã¦ãã¾ãã">*1</a>ã ã¨<a href="https://www.mouser.jp/c/semiconductors/memory-ics/sram/">1åããã1000å以ä¸ã§å£²ããã¦ãã¾ã(ãªã³ã¯ããæ¤ç´¢)</a>ãNVIDIAãã©ã®ã¹ããã¯ã®SRAMããããã§ä»å
¥ãã¦ãããã¯ãããã¾ããããH100ã®ãããªGPU1åºä½ãã®ã«SRAMã¡ã¢ãªã®ã¿ã§æ°åä¸å(SMã«å ãã¦L2 Cacheç¨ã«æ°åMB)ãå¿
è¦ã¨ãã¾ããã¾ãåå°ä½è£½é æè¡ã®è¦³ç¹ãããSRAMã®ç©çãµã¤ãºãå°ãããããã¨ã¯é£ãããããããéãç©ãã§ã大éã®SRAMãæè¼ããGPUã製é ãããã¨ã¯ç¾ç¶ã§ã¯å°é£ãªããã§ãã</p>
<p>ãããã£ã¦ç¹ã«æ¨ä»ã®å¤§è¦æ¨¡åããLLMã®å¦ç¿/æ¨è«ã§ã¯ããã«ãã¦éãããHBMâSRAMã®ãã¼ã¿è»¢é帯åãå¹ççã«ä½¿ãããæ¨è«é度ã決å®ãããã¨ã«ãªãã¾ãã</p>
<h2 id="ç°¡ç¥åããã¢ãã«ã§Transformerã®è¨ç®éãèãã">ç°¡ç¥åããã¢ãã«ã§Transformerã®è¨ç®éãèãã</h2>
<p>ããã§ã¯GPUã1. è¡åæ¼ç®å¨ 2. ãã¯ãã«æ¼ç®å¨ 3. HBM 4. SRAMã®4è¦ç´ ã ãæ§æãããã¨ä»®å®ãã¦ãLLMã®å¦çã®ä¸é¨ãåãåºãã¦è¡åæ¼ç®ã¨HBMâSRAMéã®ãã¼ã¿è»¢éãã¢ãã«åãã¦ã¿ã¾ãããã</p>
<p><figure class="figure-image figure-image-fotolife" title="H100ãç°¡ç¥åããã¢ãã«"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241220/20241220172346.png" width="800" height="397" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>H100ãç°¡ç¥åããã¢ãã«ã®å³ãæ¼ç®é度ã¯1000TFLOPsãHBMâSRAMéã®è»¢éé度ã¯1.5Tè¦ç´ /secã¨ä»®å®ããã</figcaption></figure></p>
<p>ãã¯ãã«æ¼ç®å¨ã¯Softmaxé¢æ°ãªã©è¡åç©ä»¥å¤ã®å¦çãè¡ãæ¼ç®å¨ã§ãããLLMã§çããã¹ã¯ãã«æ¼ç®ã¯è¡åç©ã¨æ¯ã¹ã¦å¾®ã
ãããã®ãªã®ã§è¨ç®éã®æ¨è¨ããã¯é¤å¤ãã¾ãã</p>
<p>H100ã®å
¬ç§°ã§ã¯ãFP16ã§ã®æ¼ç®å¦çé度ã¯ç´1000TFLOPsãä¸æ¹ã§SRAMâHRAMã®ãã¼ã¿è»¢éã®é度ã¯ç´3TByte/secã§ãã(ãã¹ã¦FP16ã§ãã¼ã¿è»¢éããã¨ä»®å®ããã¨1.5Tè¦ç´ /sec)
ãããã£ã¦ãæ¼ç®åæ°ããã¼ã¿è»¢ééã®1000/1.5=<u>660å</u>ç¨åº¦ã ã¨é£ãåãããããããã¼ã¿è»¢ééãå¤ããªã(æ¯ã660åããå°ããå¤ã«ãªã)ã¨I/Oã®ã»ããæ¯é
çã«ãªãã¨ç解ã§ãã¾ãã<a href="#f-f0d3c6cb" id="fn-f0d3c6cb" name="fn-f0d3c6cb" title="ç¾å®ã«ãã®æ¼ç®/ãã¼ã¿è»¢éé度ã使ãããããã¨ã¯ããã¾ããããããã§ã¯çæ³åãã¦èãã¾ãã">*2</a></p>
<h3 id="QKV-projectionã®ã±ã¼ã¹">QKV projectionã®ã±ã¼ã¹</h3>
<p>LLMã®Embeddingå
¥åãQuery, Key, Valueã«Projection(QKV projection)ããå¦çãä¾ã«ãã¦èãã¦ã¿ã¾ãããã</p>
<p><figure class="figure-image figure-image-fotolife" title="QKV projectionã®ã¢ã«ã´ãªãºã ã¨è¨ç®é"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241220/20241220172328.png" width="800" height="291" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>QKV projectionã®ã¢ã«ã´ãªãºã ã¨è¨ç®éãtexè¨æ³ãå´©ãã¦ãã¾ã£ãããç»ååãã¦ããã</figcaption></figure></p>
<p>åè¨å·ã¯ä»¥ä¸ã®æ°å¤ã表ãã¦ãã¾ãã</p>
<ul>
<li>B: ããããµã¤ãº</li>
<li>S: ç³»åé·</li>
<li>E: Embedding次å
</li>
<li>H: Head次å
(head_dim à head_num)</li>
</ul>
<p>HBMâSRAMã®ãã¼ã¿ã®ããã¨ããå³ã«ãã¦ã¿ãã¨ãã®ããã«ãªãã¾ãã</p>
<p><figure class="figure-image figure-image-fotolife" title="QKV Projectionã§ã®HBMâSRAMéã®ãã¼ã¿ç§»å"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241220/20241220172337.png" width="800" height="441" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>QKV Projectionã§ã®HBMâSRAMéã®ãã¼ã¿ç§»å</figcaption></figure></p>
<p>QKV projectionã§ã¯æ¼ç®åæ°ã¯ãã¼ã¿è»¢ééã®<u>1600å</u>ã¨ãªãããã£ã¦è¡åæ¼ç®ã®ã»ããããã«ããã¯ã«ãªãã¾ãã<a href="#f-b9361d1e" id="fn-b9361d1e" name="fn-b9361d1e" title="æè¿ã®GPUæ§è½ã¯è¡åæ¼ç®æ§è½ã®ã»ãããã¼ã¿è»¢éé度ãããéããã¼ã¹ã§åä¸ãã¦ããã®ã§ãå°æ¥çã«ã¯ãããé転ããããããã¾ããã">*3</a></p>
<h3 id="Attentionæ©æ§ã®å ´å">Attentionæ©æ§ã®å ´å</h3>
<p>ããã»ã©ã¯QKV projectionãä¾ã«ãã¾ããã次ã«Attentionæ©æ§ãåæ§ã«èãã¦ã¿ã¾ããããåé ã§è¿°ã¹ãFlashAttentionãªã©ã使ããPyTorchã§ãã¤ã¼ãã«å®è£
ããã¨Attentionã¯ä»¥ä¸ã®ã¢ã«ã´ãªãºã ã§è¨ç®ããè¨ç®éã¯æ¬¡ã®ã¨ããã«ãªãã¾ãã</p>
<p><figure class="figure-image figure-image-fotolife" title="é常ã®Attentionã¢ã«ã´ãªãºã ã¨è¨ç®é"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241220/20241220172330.png" width="800" height="495" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>é常ã®Attentionã¢ã«ã´ãªãºã ã¨è¨ç®é</figcaption></figure></p>
<p>åè¨å·ã¯ä»¥ä¸ã®æ°å¤ã表ãã¦ãã¾ãã</p>
<ul>
<li>B: ããããµã¤ãº</li>
<li>S: ç³»åé·</li>
<li>D: head_dim次å
</li>
</ul>
<p>QKV projectionã®ã¨ãã¨åæ§ã«HBMâSRAMã®ãã¼ã¿ç§»åãå³å¼åããã¨æ¬¡ã®ããã«ãªãã¾ãã</p>
<p><figure class="figure-image figure-image-fotolife" title="Attentionã§ã®HBMâSRAMéã®ãã¼ã¿ç§»åãAttention Map Pãè¨ç®ããã¹ããã6ã¾ã§"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241220/20241220172340.png" width="800" height="407" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>Attentionã§ã®HBMâSRAMéã®ãã¼ã¿ç§»åãAttention Map Pãè¨ç®ããã¹ããã6ã¾ã§</figcaption></figure></p>
<p><figure class="figure-image figure-image-fotolife" title="Attentionã§ã®HBMâSRAMéã®ãã¼ã¿ç§»åãã¹ããã7ãã9ã¾ã§"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241220/20241220172343.png" width="797" height="607" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span>
<figcaption>Attentionã§ã®HBMâSRAMéã®ãã¼ã¿ç§»åãã¹ããã7ãã9ã¾ã§</figcaption></figure></p>
<p>æ¼ç®åæ°ã¯ãã¼ã¿è»¢ééã®<u>90å</u>ã«ãããªãããI/Oã«ãã£ã¦å¾éãã大å¹
ã«æ¨è«é度ãä½ä¸ãããã¨ã«ãªãã¾ãã</p>
<h4 id="ãªãIOãæ¯é
çã">ãªãI/Oãæ¯é
çã</h4>
<p>ããã«ã¯å¤§ããåãã¦2ã¤ã®çç±ãããã¾ãã</p>
<p>1ã¤ã¯ãAttentionã®æ¼ç®/ãã¼ã¿è»¢éã³ã¹ããå
±ã«<u>ç³»åé·Sã®2ä¹</u>ã¨<u>head_dim次å
D</u>ã«æ¯ä¾ããS>Dã§ãããã¨ã§ããçµæã¨ãã¦ãä¿æ°ãé¤ãã¨æ¼ç®/ãã¼ã¿è»¢éã³ã¹ãã¯<u>head_dim次å
D</u>ã®åããå·®ãåºãI/Oãæ¯é
çã«ãªãã¾ãã</p>
<p>ãã1ã¤ã¯ãã¢ã«ã´ãªãºã ã«åé·ãªHBMâSRAMã®è»¢éãå«ã¾ãã¦ããç¹ã§ããã¹ããã4,6ã§ã¯Softmaxãå®è¡ããããã ãã«(B, S, S)ã®è»¢éãçãã¦ãã¾ããã¾ããã¹ããã5ã§ã¯ä¸åº¦SRAMã«ç½®ãã¦ãã£ãPãã¹ããã7ã§ããä¸åº¦HBMãã転éãã¦ãã¾ãã</p>
<h2 id="FlashAttentionã«ãã大å¹
ãªIOæ¹å">FlashAttentionã«ãã大å¹
ãªI/Oæ¹å</h2>
<p>FlashAttentionã¯Attentionæ©æ§ã®è¨ç®ãI/Oã«ãã£ã¦å¾éããã¦ãããã¨ã«çç®ãã¦ææ¡ãããææ³ã§ããé常ã®Attentionã¨ã»ã¼ç価ãªè¨ç®çµæãå¾ããæ¨è«ãé«éåããããããPyTorch2.xã§ã¯æ¨æºå©ç¨ã§ãããªã©ç¾å¨ã§ã¯é常ã«æ®åããæè¡ã¨ãªã£ã¦ãã¾ãã</p>
<p>I/Oæ¹åãç®çã¨ãã¦ãFlashAttentionã¯ä»¥ä¸ã®æ¹éã§å°åºãããã¢ã«ã´ãªãºã ã§ãã</p>
<blockquote><ol>
<li>Sequenceæ¹åã«QKVããããã¯åããã</li>
<li>ãããã¯ãã¨ã«Attentionã®æçµåºåã¾ã§è¨ç®ãã</li>
<li>ãããã¯éã®ä¾åé¢ä¿ã¯åçè¨ç»æ³çã«æ´æ°ãã¦ãã</li>
</ol>
</blockquote>
<p>ç°¡åã«è£è¶³ããã¨ã1ã®ãããã¯åã¯GPUã®åSMã«æè¼ãããSRAMã®å®¹éã¯éããã¦ããããã§ããããã¯åãããã¨ã§SRAMã®å®¹éå
ã§ãããã¯ãã¨ã®å¦çãã§ããããã«ãã¦ãã¾ãã
2ã¯ãããã¯ãã¨ã«Softmaxã«ç¸å½ããé¨åãè¨ç®ãã¦ãã®ãããã¯ã®åºåOã«ãããé¨åã¾ã§è¨ç®ãããããé常ã®Attentionå¦çã§çããSoftmaxãè¨ç®ããããã®ãã¼ã¿è»¢éãçããã¨ãã§ãã¾ãã</p>
<p>å®éã®å¦çãæ¸ãä¸ããã¨ã¯çãã¾ãããæ¼ç®åæ°ã¨ãã¼ã¿è»¢ééã¯ãããã以ä¸ã®ã¨ããã«ãªãã¾ãã</p>
<p><figure class="figure-image figure-image-fotolife" title="FlashAttentionã®è¨ç®é"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241220/20241220172334.png" width="800" height="134" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>FlashAttentionã®è¨ç®é</figcaption></figure></p>
<p>ããã§æ°ãã«ç»å ´ãã<strong>k</strong>ã¯GPUã«æè¼ããã¦ããSMãããã®SRAMã®å®¹éã«ä¾åãã¦ãããã¤ãã¼ãã©ã¡ã¼ã¿(SRAM容éã大ãããã°å¤§ããã»ã©ãããã¯ãµã¤ãºã¯å¤§ããã§ãã)ã§è«æä¸ã§ã¯A100 GPUã§k=256ãæ¡ç¨ãã¦ãã¾ããã</p>
<p>é常ã®Attentionå¦çã¨æ¯è¼ããã¨æ¼ç®åæ°/SRAMâHRAMã®ãã¼ã¿è»¢ééã¯ãããã3åã«ãªã£ã¦ããI/Oå¾éã大å¹
ã«æ¹åã§ãã¦ãããã¨ãåããã¾ãã</p>
<p>ããã¯ãããã¯åã«ãã£ã¦ããã¾ã§Sã®2ä¹ã«æ¯ä¾ãã¦ãããã¼ã¿è»¢ééã®é
ã<u>D/k</u>ååæ¸ã§ãããã¨ãå ãã¦XãPãªã©ãä¸ã
HBMã«æ¸ãæ»ããªãã¦ãããªã£ã¦ããããã§ãã</p>
<h2 id="ã¾ã¨ã">ã¾ã¨ã</h2>
<p>GPUã§é«éãªã¢ãã«æ¨è«ãå®ç¾ããã«ã¯ã¢ãã«ã®æ¼ç®éã®ã¿ã§ã¯ãªãHBMâSRAMéã®ãã¼ã¿è»¢ééã«ãçç®ãããã¨ã大äºã§ãã</p>
<p>ç¹ã«è¿å¹´ã¯ã¢ãã«ã大è¦æ¨¡åãããã¨ã§ãã¼ãã¦ã§ã¢å´ã®å¶ç´ã«çç®ããæè¡ã®éè¦åº¦ãã¾ãã¾ãé«ã¾ã£ã¦ããããã§ããããããç 究ãæè¡ãå¼ãç¶ã追ã£ã¦ããããã¨æãã¾ãã</p>
<h2 id="We-are-hiring-">We are hiring !!</h2>
<p>ã¨ã ã¹ãªã¼AIã»æ©æ¢°å¦ç¿ãã¼ã ã§ã¯LLMãè¨åºAIã«åãçµãã§ãã¾ããã¢ãã«ã®ã¢ã¼ããã¯ãã£ãè¨ç®ã¢ã«ã´ãªãºã ã«ã¯ã¯ã¯ã¯ããçãããã¨ã ã¹ãªã¼AIã»æ©æ¢°å¦ç¿ãã¼ã ã§ä¸ç·ã«æ©æ¢°å¦ç¿ã¨ã³ã¸ãã¢ããã¾ãããï¼ãã¾ããå¦çã®çããåãã«ã¯æ©æ¢°å¦ç¿ã»MLOpsã¤ã³ã¿ã¼ã³ãåéãã¦ã¾ãããã²ä¸ç·ã«è«æãèªã¿ãµã¼ãã¹éçºãã¦ããã¾ãããã</p>
<p>ã¨ã ã¹ãªã¼ã§ã¯ãã³ã³ãã¥ã¼ã¿ãã¸ã§ã³ã»æ©æ¢°å¦ç¿ã¯ãã¡ãããææ°æè¡ã¸ã®ã¢ã³ãããé«ã仲éãæè¿ãã¦ãã¾ããæ°åã»ä¸éããããã®æ¡ç¨ãã«ã¸ã¥ã¢ã«é¢è«ãã¤ã³ã¿ã¼ã³ã常æåéãã¦ãã¾ãï¼</p>
<h3 id="ã¨ã³ã¸ãã¢æ¡ç¨ãã¼ã¸ã¯ãã¡ã">ã¨ã³ã¸ãã¢æ¡ç¨ãã¼ã¸ã¯ãã¡ã</h3>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjobs.m3.com%2Fengineer%2F" title="ã¨ã³ã¸ãã¢æ¡ç¨ãµã¤ãï½æ¡ç¨æ
å ± | å»çÃãã¯ããã¸ã¼ã®å¯è½æ§ã¯ç¡é大" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jobs.m3.com/engineer/">jobs.m3.com</a></cite></p>
<h3 id="ã«ã¸ã¥ã¢ã«é¢è«ããæ°è»½ã«ã©ãã">ã«ã¸ã¥ã¢ã«é¢è«ããæ°è»½ã«ã©ãã</h3>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjobs.m3.com%2Fengineer%2Fcasual-session%2F" title="ã¨ã³ã¸ãã¢æ¡ç¨ãµã¤ãï½æ¡ç¨æ
å ± | å»çÃãã¯ããã¸ã¼ã®å¯è½æ§ã¯ç¡é大" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jobs.m3.com/engineer/casual-session/">jobs.m3.com</a></cite></p>
<h3 id="ã¤ã³ã¿ã¼ã³ã常æåéãã¦ãã¾ã">ã¤ã³ã¿ã¼ã³ã常æåéãã¦ãã¾ã</h3>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fopen.talentio.com%2Fr%2F1%2Fc%2Fm3%2Fhomes%2F4354" title="ãæ°åãã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ã åéä¸è¦§ / ã¨ã ã¹ãªã¼æ ªå¼ä¼ç¤¾" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://open.talentio.com/r/1/c/m3/homes/4354">open.talentio.com</a></cite></p>
<div class="footnote">
<p class="footnote"><a href="#fn-f3b9466d" id="f-f3b9466d" name="f-f3b9466d" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">H100ã ã¨132åã®Streaming Multiprocessor(SM)ã«1ã¤ãã¤256KBã®SRAMãæè¼ããã¦ãã¾ãã</span></p>
<p class="footnote"><a href="#fn-f0d3c6cb" id="f-f0d3c6cb" name="f-f0d3c6cb" class="footnote-number">*2</a><span class="footnote-delimiter">:</span><span class="footnote-text">ç¾å®ã«ãã®æ¼ç®/ãã¼ã¿è»¢éé度ã使ãããããã¨ã¯ããã¾ããããããã§ã¯çæ³åãã¦èãã¾ãã</span></p>
<p class="footnote"><a href="#fn-b9361d1e" id="f-b9361d1e" name="f-b9361d1e" class="footnote-number">*3</a><span class="footnote-delimiter">:</span><span class="footnote-text">æè¿ã®GPUæ§è½ã¯è¡åæ¼ç®æ§è½ã®ã»ãããã¼ã¿è»¢éé度ãããéããã¼ã¹ã§åä¸ãã¦ããã®ã§ãå°æ¥çã«ã¯ãããé転ããããããã¾ããã</span></p>
</div>
eufo
åéã®åéãå¤ãï¼åéãã©ããã¯ã¹ã«ã¤ãã¦
hatenablog://entry/6802418398312053436
2024-12-17T13:54:47+09:00
2024-12-17T13:54:47+09:00 ã¨ã³ã¸ãã¢ãã¼ã ã®UK. ( @ukohank517 )ã§ãããã®ããã°ã¯ã¨ã ã¹ãªã¼ã¢ããã³ãã«ã¬ã³ãã¼15æ¥ç®ã®è¨äºã§ãã ä»æ¥ã¯åéã«é¢ããã©ããã¯ã¹(Friendship Paradox)ã«ã¤ãã¦ç´¹ä»ãããã¨æãã¾ãï¼ ã¯ããã« åéãã©ããã¯ã¹ã¨ã¯ï¼ åéæ°ã®ã·ãã¥ã¬ã¼ã·ã§ã³ããã¦ã¿ãã ã¾ã¨ã è¿½è¨ We are hiring !! ã¨ã³ã¸ãã¢ã®æ¡ç¨ãã¼ã¸ã¯ãã¡ã ã«ã¸ã¥ã¢ã«é¢è«ããæ°è»½ã«ã©ãã ã¤ã³ã¿ã¼ã³ã常æåéãã¦ãã¾ã ã¯ããã« å®ã¯10å¹´ãåã®è«æã§çºè¡¨ãããå
容ãªãã§ãããæè¿è¦ããã¦èªãã ãæããããã£ããããªãã¨ãããã ï¼ãã¨é©ãã¦ãã¾ã£ããã§ãã æ°ã«ãªãæ¹ã¯ãã¡ãâ¦
<p>ã¨ã³ã¸ãã¢ãã¼ã ã®UK. ( @ukohank517 )ã§ãããã®ããã°ã¯<a href="https://qiita.com/advent-calendar/2024/m3">ã¨ã ã¹ãªã¼ã¢ããã³ãã«ã¬ã³ãã¼</a>15æ¥ç®ã®è¨äºã§ãã ä»æ¥ã¯åéã«é¢ããã©ããã¯ã¹(Friendship Paradox)ã«ã¤ãã¦ç´¹ä»ãããã¨æãã¾ãï¼</p>
<ul class="table-of-contents">
<li><a href="#ã¯ããã«">ã¯ããã«</a></li>
<li><a href="#åéãã©ããã¯ã¹ã¨ã¯">åéãã©ããã¯ã¹ã¨ã¯ï¼</a></li>
<li><a href="#åéæ°ã®ã·ãã¥ã¬ã¼ã·ã§ã³ããã¦ã¿ãã">åéæ°ã®ã·ãã¥ã¬ã¼ã·ã§ã³ããã¦ã¿ãã</a></li>
<li><a href="#ã¾ã¨ã">ã¾ã¨ã</a></li>
<li><a href="#追è¨">追è¨</a></li>
<li><a href="#We-are-hiring-">We are hiring !!</a><ul>
<li><a href="#ã¨ã³ã¸ãã¢ã®æ¡ç¨ãã¼ã¸ã¯ãã¡ã">ã¨ã³ã¸ãã¢ã®æ¡ç¨ãã¼ã¸ã¯ãã¡ã</a></li>
<li><a href="#ã«ã¸ã¥ã¢ã«é¢è«ããæ°è»½ã«ã©ãã">ã«ã¸ã¥ã¢ã«é¢è«ããæ°è»½ã«ã©ãã</a></li>
<li><a href="#ã¤ã³ã¿ã¼ã³ã常æåéãã¦ãã¾ã">ã¤ã³ã¿ã¼ã³ã常æåéãã¦ãã¾ã</a></li>
</ul>
</li>
</ul>
<h1 id="ã¯ããã«">ã¯ããã«</h1>
<p>å®ã¯10å¹´ãåã®è«æã§çºè¡¨ãããå
容ãªãã§ãããæè¿è¦ããã¦èªãã ãæããããã£ããããªãã¨ãããã ï¼ãã¨é©ãã¦ãã¾ã£ããã§ãã</p>
<p>æ°ã«ãªãæ¹ã¯ãã¡ãã®ãªã³ã¯ããè«æããã§ãã¯ãã¦ã¿ã¦ãã ãããï¼</p>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.nature.com%2Farticles%2Fsrep04603" title="Generalized friendship paradox in complex networks: The case of scientific collaboration - Scientific Reports" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://www.nature.com/articles/srep04603">www.nature.com</a></cite></p>
<h1 id="åéãã©ããã¯ã¹ã¨ã¯">åéãã©ããã¯ã¹ã¨ã¯ï¼</h1>
<p>åéãã©ããã¯ã¹ï¼Friendship Paradoxï¼ã¨ã¯ãã·ã³ãã«ã«è¨ãã¨ããããªãã®åéã¯ããªããããåéãå¤ãå¾åã«ãããã¨ããç¾è±¡ã§ãã</p>
<p>ã§ããã¿ãªããããããªé¢¨ã«æãããã¨ã£ã¦ããã¾ãããï¼</p>
<p>ããã®äººããªãã§ãããªã«åéãå¤ããã ããï¼ã
SNSã§ãã©ãã¯ã¼æ°ãå¤ãã¨ãããããç§ã¯åéå°ãªããªãâ¦ãã£ã¦ã¡ãã£ã¨è½ã¡è¾¼ãããããã¨ã
ç§ã®å®ä½é¨ã ã¨ã大å¦ã®æ¼ä¼ã¿ã«åéã¨é£å ã«è¡ã£ã¦ãåã«ä¸¦ãã§ãããåéãããéã£ã人ã®ã»ã¨ãã©ã«æ¨æ¶ãã¦ãããã§ãããã®å
æ¯ãè¦ã¦ãããã¤ãã³ãã¥ãã±ã¼ã·ã§ã³ã®æªç©ã ï¼ãã£ã¦æãããã¨ãããã¾ãããã</p>
<p>ã§ããããã£ã¦å®ã¯æ°ã®ããã§ã¯ãªããçµ±è¨çã«è¨¼æãããç¾è±¡ãªãã§ããï¼ ãã®ç¾è±¡ããããã¨ããç§ã¯ããè«æãèªãã§ç¥ãã¾ããããªãå®éã«ã·ãã¥ã¬ã¼ã·ã§ã³ãã¦ãåãçµæãå¾ããã¾ãï¼</p>
<h1 id="åéæ°ã®ã·ãã¥ã¬ã¼ã·ã§ã³ããã¦ã¿ãã">åéæ°ã®ã·ãã¥ã¬ã¼ã·ã§ã³ããã¦ã¿ãã</h1>
<p>å®éã«ãæ¬å½ã«åéã®æ¹ãåéãå¤ãã®ãï¼ããã·ãã¥ã¬ã¼ã·ã§ã³ãã¦ã¿ã¾ããã 次ã®ã³ã¼ãã使ã£ã¦ãç°¡åãªçµ±è¨ã·ãã¥ã¬ã¼ã·ã§ã³ãè¡ãã¾ããã</p>
<pre class="code lang-python" data-lang="python" data-unlink><span class="synPreProc">import</span> networkx <span class="synStatement">as</span> nx
<span class="synPreProc">import</span> numpy <span class="synStatement">as</span> np
<span class="synPreProc">import</span> matplotlib.pyplot <span class="synStatement">as</span> plt
<span class="synPreProc">import</span> random
<span class="synComment"># ã©ã³ãã ã°ã©ããä½æããé¢æ°ï¼å人æ°ã®åå¸ãå¶å¾¡ï¼</span>
<span class="synStatement">def</span> <span class="synIdentifier">generate_biased_graph</span>(num_nodes):
graph = nx.Graph()
graph.add_nodes_from(<span class="synIdentifier">range</span>(num_nodes))
<span class="synStatement">for</span> node <span class="synStatement">in</span> graph.nodes():
<span class="synComment"># åãã¼ãã®å人æ°ã確ççã«æ±ºå®</span>
<span class="synStatement">if</span> random.random() < <span class="synConstant">0.5</span>: <span class="synComment"># 50%ã®ç¢ºçã§å°ãªãå人</span>
num_friends = random.randint(<span class="synConstant">1</span>, <span class="synConstant">3</span>)
<span class="synStatement">else</span>: <span class="synComment"># 50%ã®ç¢ºçã§å¤ãå人</span>
num_friends = random.randint(<span class="synConstant">5</span>, <span class="synConstant">10</span>)
<span class="synComment"># ã¨ãã¸ãã©ã³ãã ã«çæ</span>
possible_friends = <span class="synIdentifier">list</span>(<span class="synIdentifier">set</span>(graph.nodes()) - {node} - <span class="synIdentifier">set</span>(graph.neighbors(node)))
friends = random.sample(possible_friends, <span class="synIdentifier">min</span>(num_friends, <span class="synIdentifier">len</span>(possible_friends)))
graph.add_edges_from((node, friend) <span class="synStatement">for</span> friend <span class="synStatement">in</span> friends)
<span class="synStatement">return</span> graph
<span class="synComment"># ãã¼ãæ°</span>
num_nodes = <span class="synConstant">30</span>
graph = generate_biased_graph(num_nodes)
<span class="synComment"># åãã¼ãã®å人ã®æ°ã¨å人ã®å人ã®å¹³åæ°ãè¨ç®</span>
friend_counts = []
friends_of_friends_avg_counts = []
<span class="synStatement">for</span> node <span class="synStatement">in</span> graph.nodes():
friends = <span class="synIdentifier">list</span>(graph.neighbors(node))
friend_counts.append(<span class="synIdentifier">len</span>(friends))
<span class="synStatement">if</span> <span class="synIdentifier">len</span>(friends) > <span class="synConstant">0</span>:
friends_of_friends = [<span class="synIdentifier">len</span>(<span class="synIdentifier">list</span>(graph.neighbors(friend))) <span class="synStatement">for</span> friend <span class="synStatement">in</span> friends]
friends_of_friends_avg_counts.append(np.mean(friends_of_friends))
<span class="synStatement">else</span>:
friends_of_friends_avg_counts.append(<span class="synConstant">0</span>)
<span class="synComment"># ã°ã©ãå½¢å¼ã§ãã¼ãã¨é¢ä¿æ§ãå¯è¦å</span>
plt.figure(figsize=(<span class="synConstant">12</span>, <span class="synConstant">8</span>))
pos = nx.spring_layout(graph, seed=<span class="synConstant">42</span>) <span class="synComment"># ãã¼ãã®é
ç½®ã決å®</span>
nx.draw(graph, pos, with_labels=<span class="synIdentifier">True</span>, node_size=<span class="synConstant">500</span>, node_color=<span class="synConstant">"skyblue"</span>, font_size=<span class="synConstant">10</span>, font_color=<span class="synConstant">"black"</span>, edge_color=<span class="synConstant">"gray"</span>)
plt.title(<span class="synConstant">"Visualization of the Biased Random Graph"</span>)
plt.show()
<span class="synComment"># å人ã®æ°ã¨å人ã®å人ã®å¹³åæ°ã®ãã¹ãã°ã©ã ã表示</span>
plt.figure(figsize=(<span class="synConstant">12</span>, <span class="synConstant">8</span>))
plt.hist(friend_counts, bins=<span class="synConstant">20</span>, color=<span class="synConstant">"skyblue"</span>, alpha=<span class="synConstant">0.7</span>, label=<span class="synConstant">"Friend Counts"</span>)
plt.hist(friends_of_friends_avg_counts, bins=<span class="synConstant">10</span>, color=<span class="synConstant">"gray"</span>, alpha=<span class="synConstant">0.7</span>, label=<span class="synConstant">"Friends of Friends Avg Counts"</span>)
plt.xlabel(<span class="synConstant">"Number of Friends"</span>)
plt.ylabel(<span class="synConstant">"Number of Nodes"</span>)
plt.title(<span class="synConstant">"Histogram of the Number of Friends and the Average Number of Friends of Friends"</span>)
plt.legend()
plt.show()
<span class="synComment"># å
¨ä½ã®å人ã®å¹³åæ°ã¨å人ã®å人ã®å¹³åæ°ãè¨ç®</span>
avg_friend_counts = np.mean(friend_counts)
avg_friends_of_friends_avg_counts = np.mean(friends_of_friends_avg_counts)
<span class="synIdentifier">print</span>(f<span class="synConstant">"Average number of friends: {avg_friend_counts}"</span>)
<span class="synIdentifier">print</span>(f<span class="synConstant">"Average number of friends of friends: {avg_friends_of_friends_avg_counts}"</span>)
</pre>
<p>ãã®ã·ãã¥ã¬ã¼ã·ã§ã³ã§ã¯ã30人ã®ã°ã«ã¼ãã«ããã¦ãååã®äººã
ã¯å°ãªãåéï¼1~3人ï¼ãååã®äººã
ã¯å¤ãåéï¼10人以ä¸ï¼ãæã¤ããã«åãã¦ãã¾ããããã¦ãå
¨ä½ã®åéé¢ä¿ã¯ä¸è¨ã®ãããªãããã¯ã¼ã¯å³ã§å¯è¦åããã¾ãã</p>
<p><figure class="figure-image figure-image-fotolife" title="åéãããã¯ã¼ã¯å³"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241217/20241217135457.png" width="800" height="559" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>åéãããã¯ã¼ã¯å³</figcaption></figure></p>
<p>ãã®å¾ãåéã®æ°ã¨ãåéã®åéã®æ°ããããããã¹ãã°ã©ã ä¸ã§è¡¨ç¾ããã¨:</p>
<p><figure class="figure-image figure-image-fotolife" title="åéã®æ°ãåéã®åéã®æ°ã®ãã¹ãã°ã©ã "><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241217/20241217135453.png" width="800" height="567" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>åéã®æ°ãåéã®åéã®æ°ã®ãã¹ãã°ã©ã </figcaption></figure></p>
<p>ãã¹ãã°ã©ã ãããåéã®æ°ãçµ±è¨ããã¨åéãå°ãªã人ãããã°å¤ã人ããã¾ãããããåéã®åéã®çµ±è¨ã¯ãå
¨ä½ã®å³å¯ãã«ãªã£ã¦ãããçµæã¨ãã¦ãéåæ°ã®äººã¯ãåéã®æ°ãããåéã®åéãå¤ããªãå¾åãè¦ããã¾ããããªããå
¨å¡ã«å¯¾ãã¦å人ã®å¹³åæ°ã9.7人åå¾ã§ã§ãããå人ã®å人ã®å¹³åæ°ã¯11.3人åå¾ã¨ã¡ãã£ã¨å¤ãã«ãªãã¾ãã</p>
<p>ãã¦ããªãåéã®åéã®æ¹ãå¤ããªãã®ã§ããããï¼ ãã®çç±ã¯ç°¡åã§ãã<strong>åéãå¤ã人ã¯ãããªãã¨åéã«ãªã確çãé«ã</strong>ããã§ãã</p>
<p>ã¡ãªã¿ã«ãåéã®åéã®æ°ã®æå¾
å¤ã¯æ¬¡ã®å¼ã§è¡¨ããã¾ãï¼</p>
<div align='center' class='scroll'>
<img src="https://chart.apis.google.com/chart?cht=tx&chl=%20%5Cdisplaystyle%0AE%20%3D%20%5Cmu%20%2B%20%5Cfrac%7B%5Csigma%5E2%7D%7B%5Cmu%7D%20%5C%5C%0A%5Cmu%20%3D%20%E5%85%A8%E3%81%A6%E3%81%AE%E4%BA%BA%E3%81%AE%E5%B9%B3%E5%9D%87%E5%8F%8B%E4%BA%BA%E6%95%B0%E3%80%81%20%5Csigma%20%3D%20%E5%8F%8B%E4%BA%BA%E6%95%B0%E3%81%AE%E6%A8%99%E6%BA%96%E5%81%8F%E5%B7%AE%0A" alt=" \displaystyle
E = \mu + \frac{\sigma^2}{\mu} \\
\mu = 全ての人の平均友人数、 \sigma = 友人数の標準偏差
"/>
</div>
<p>ç¹°ãè¿ãã«ãªãã¾ãããè«æã®æ¬æããã²ä¸åº¦èªãã§ã¿ã¾ãããï¼</p>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.nature.com%2Farticles%2Fsrep04603" title="Generalized friendship paradox in complex networks: The case of scientific collaboration - Scientific Reports" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://www.nature.com/articles/srep04603">www.nature.com</a></cite></p>
<h1 id="ã¾ã¨ã">ã¾ã¨ã</h1>
<p>åæ
ã®ãã©ããã¯ã¹ã¨åããããªäºè±¡ã¯ãå®ã¯ç¤¾ä¼ã®è³ãã¨ããã§è¦ããã¾ãããã¨ãã°ãèªç©ºä¼ç¤¾ããå¹³åã®æºå¸çã¯é«ããªããã¨çµ±è¨ã§è¨ã£ã¦ããå®éã«ä¹ã£ã¦ããã客ããã«ã¢ã³ã±ã¼ããåãã¨ããæ··ãã§ãï¼ãã¨æãã人ãå¤ãéã¾ãã®ã常ã§ããããããã¯ãæ··ãã§ãã便ã«ä¹ã£ã¦ãã人ãå¤ãããã§ãã</p>
<p>ã¾ãã社ä¼å
¨ä½ã§è¦ãã°ãæè¡å¥½ããªäººã¯å°æ°æ´¾ããããã¾ãããããã®è¨äºãèªãã§ããããªãã¯ãã»ã¼ééããªãæè¡ã好ãã ã¨æãã¾ããã ã£ã¦ãã¢ããã³ãã«ã¬ã³ãã¼ãèªãã£ã¦ãã¨ã¯ãå°ãªãã¨ãããç¨åº¦ã®æè¡ã«èå³ããã証æ ã§ãããã</p>
<p>åæ
ã®ãã©ããã¯ã¹ãããã«åºããã¨ãåéã®æ°ã ããããªãã¦ãåéãèªåããåªãã¦ããã¨æãããã¨ã説æã§ãã¡ãããã§ãã</p>
<p>ã§ããããã§ãã¬ãã£ãã«æããå¿
è¦ã¯ã¾ã£ããããã¾ããï¼ ãã®ç¾è±¡ã¯ãåºæ¬çã«ãããã¯ã¼ã¯ã®æ§é ãçã¿åºããã®ã§ããããããããªãã®ä¾¡å¤ã«å½±é¿ãä¸ããããã§ã¯ãªãããã§ãã</p>
<p>SNSãæ®åããä»ã®æ代ã§ã¯ããããããã©ããã¯ã¹ãããæããããç°å¢ãæ´ã£ã¦ãã¾ãããã ãããããã£ãç¾è±¡ããããã¨ãç¥ã£ã¦ããã°ãä»ã®äººã¨ã®æ¯è¼ã«å¯¾ãã¦ãå°ãè©ã®åãæãã¦ååãã«åãæ¢ããããããããã¾ããã</p>
<p>æå¾ã«ããé£ã®èçã¯éããã¨ããã®ã¯ãå®ã¯æ®éã®ãã¨ã ã¨ãããã¨ãç解ãã¦ããããã°å¬ããã§ãã</p>
<h1 id="追è¨">追è¨</h1>
<p>advent of codeããã£ã¦ããã¾ãï¼ ã¡ãã£ã¨å
é±ä»é±å¯ãæéãåã£ã¦è²ã
ãã£ã¦é
ãæ°å³ã§ãããé å¼µã£ã¦è¿½ãä¸ãã¾ãã®ã§ãèå³ããæ¹ã¯ä¸è¨ãªã¼ããã¼ãã«åå ãã¦ä¸ç·ã«ä»æ解ãã¾ããã</p>
<p><code>3533898-f84e2f85</code></p>
<h1 id="We-are-hiring-">We are hiring !!</h1>
<p>ã¨ã ã¹ãªã¼ã§ã¯æè¡å¤§å¥½ããªã®ã¼ã¯ã¨ã³ã¸ãã¢ãåéãã¦ãã¾ãï¼ å°ãã§ãèå³ãããæ¹ã¯ãä¸è¨URLããã«ã¸ã¥ã¢ã«é¢è«ããå¿åãã ããï¼</p>
<h2 id="ã¨ã³ã¸ãã¢ã®æ¡ç¨ãã¼ã¸ã¯ãã¡ã">ã¨ã³ã¸ãã¢ã®æ¡ç¨ãã¼ã¸ã¯ãã¡ã</h2>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjobs.m3.com%2Fengineer%2F" title="ã¨ã³ã¸ãã¢æ¡ç¨ãµã¤ãï½æ¡ç¨æ
å ± | å»çÃãã¯ããã¸ã¼ã®å¯è½æ§ã¯ç¡é大" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jobs.m3.com/engineer/">jobs.m3.com</a></cite></p>
<h2 id="ã«ã¸ã¥ã¢ã«é¢è«ããæ°è»½ã«ã©ãã">ã«ã¸ã¥ã¢ã«é¢è«ããæ°è»½ã«ã©ãã</h2>
<p>(ã°ãããããã¨è©±ãããã£ã³ã¹ï¼ @vaaaaanquish )</p>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjobs.m3.com%2Fengineer%2Fcasual-session%2F" title="ã¨ã³ã¸ãã¢æ¡ç¨ãµã¤ãï½æ¡ç¨æ
å ± | å»çÃãã¯ããã¸ã¼ã®å¯è½æ§ã¯ç¡é大" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jobs.m3.com/engineer/casual-session/">jobs.m3.com</a></cite></p>
<h2 id="ã¤ã³ã¿ã¼ã³ã常æåéãã¦ãã¾ã">ã¤ã³ã¿ã¼ã³ã常æåéãã¦ãã¾ã</h2>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fopen.talentio.com%2Fr%2F1%2Fc%2Fm3%2Fhomes%2F4354" title="ãæ°åãã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ã åéä¸è¦§ / ã¨ã ã¹ãªã¼æ ªå¼ä¼ç¤¾" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://open.talentio.com/r/1/c/m3/homes/4354">open.talentio.com</a></cite></p>
ukohank517
ãªãµã¼ããããã¯ããã¼ã ãããæè¿ãã£ã¦ããã¨ããã£ããç´¹ä»ããã
hatenablog://entry/6802418398312011175
2024-12-16T18:30:00+09:00
2024-12-16T19:03:15+09:00 ããã«ã¡ã¯ãã¨ã ã¹ãªã¼ã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ã/ BIR(Business Intelligence and Research) ãã¼ã ã®é è¤(@en_ken)ã§ãã BIRã¯ã¢ã³ã±ã¼ãã·ã¹ãã ãã¯ããã¨ãããªãµã¼ããããã¯ããéçºãã¦ãããã¼ã ã§ãããã¼ã ã®è©³ããç´¹ä»ã¯æ¬¡ã®è³æãèªãã§ããã ããã°ã¨æãã¾ãã speakerdeck.com ãã1å¹´ã»ã©ã§ãã¼ã ã®æ§ç¸ã¯æ§å¤ãããã¾ããã ä¸ææã¨ã³ã¸ãã¢3,4åã»ã©ããããªãã£ããã¼ã ç¶æ³ããç¾å¨ã¯ã¨ã³ã¸ãã¢ã ãã§ã9åã¾ã§å¢ããPdMã2ååç»ãããã¨ã§éçºç¶æ³ãããã¾ã§ä»¥ä¸ã«æ´»æ³ã«ãªã£ã¦ãã¦ãã¾ããéçºã¹ã¿ã¤ã«ãå人éçºã«è¿ãã£ããã®â¦
<p>ããã«ã¡ã¯ãã¨ã ã¹ãªã¼ã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ã/ BIR(Business Intelligence and Research) ãã¼ã ã®é è¤(<a href="https://x.com/en_ken">@en_ken</a>)ã§ãã</p>
<p>BIRã¯ã¢ã³ã±ã¼ãã·ã¹ãã ãã¯ããã¨ãããªãµã¼ããããã¯ããéçºãã¦ãããã¼ã ã§ãããã¼ã ã®è©³ããç´¹ä»ã¯æ¬¡ã®è³æãèªãã§ããã ããã°ã¨æãã¾ãã</p>
<p><iframe id="talk_frame_1125741" class="speakerdeck-iframe" src="//speakerdeck.com/player/77c248784c9c49b49ad993e931ff8c24" width="710" height="399" style="aspect-ratio:710/399; border:0; padding:0; margin:0; background:transparent;" frameborder="0" allowtransparency="true" allowfullscreen="allowfullscreen"></iframe> <cite class="hatena-citation"><a href="https://speakerdeck.com/m3_engineering/introduction-of-m3-research-product-team">speakerdeck.com</a></cite></p>
<p>ãã1å¹´ã»ã©ã§ãã¼ã ã®æ§ç¸ã¯æ§å¤ãããã¾ããã
ä¸ææã¨ã³ã¸ãã¢3,4åã»ã©ããããªãã£ããã¼ã ç¶æ³ããç¾å¨ã¯ã¨ã³ã¸ãã¢ã ãã§ã9åã¾ã§å¢ããPdMã2ååç»ãããã¨ã§éçºç¶æ³ãããã¾ã§ä»¥ä¸ã«æ´»æ³ã«ãªã£ã¦ãã¦ãã¾ããéçºã¹ã¿ã¤ã«ãå人éçºã«è¿ãã£ããã®ãããã¼ã éçºã«ã·ãããã¾ããã</p>
<p>ãã¼ã ã®ç¶æ³ã ãã§ã¯ãªããæã
ã®éçºéç¨ãã¦ããã¢ã³ã±ã¼ãã·ã¹ãã ã«ã¤ãã¦ããªã¢ã¼ããã¯ãã®æ¹åæ§ãæ確ã«ãããã¨ã§ããã¼ã å
¨ä½ã§ããã«åãã¦éçºãé²ãã¦ãã¾ããä»åã®è¨äºã§ã¯ãBIRã®ããæè¿ã®ã¢ã³ã±ã¼ãã·ã¹ãã éçºã®æ¦è¦ãç´¹ä»ããã¦ããã ãã¾ãã</p>
<h2 id="ã¢ã³ã±ã¼ãã·ã¹ãã ã®ã¢ã¼ããã¯ãã£ã¨èª²é¡">ã¢ã³ã±ã¼ãã·ã¹ãã ã®ã¢ã¼ããã¯ãã£ã¨èª²é¡</h2>
<p>åé ã§ç´¹ä»ããéããBIRã¯ä¸»è¦ãããã¯ãã¨ãã¦ã¢ã³ã±ã¼ãã·ã¹ãã ã®éçºãè¡ã£ã¦ãã¾ãã
2024å¹´åæç¹ã§ãBIRã§ç®¡çãã¦ããã¢ã³ã±ã¼ãã·ã¹ãã ã®ã¢ã¼ããã¯ãã£æ¦è¦ã¯æ¬¡ã®ããã«ãªã£ã¦ãã¾ããã</p>
<p><figure class="figure-image figure-image-fotolife" title="24å¹´åé æç¹ã®ã¢ã¼ããã¯ãã£"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241216/20241216183003.png" width="800" height="450" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>24å¹´åé æç¹ã®ã¢ã¼ããã¯ãã£</figcaption></figure></p>
<p>ã¢ã³ã±ã¼ããååããã«ã¯ãä¼å¡ã®æ¹ã«ãã¢ã³ã±ã¼ãã®åå¨ãèªç¥ãã¦ãããã¢ã¯ã»ã¹ãã¦ãããããã¨ãããã¦å®éã«ãã¢ã³ã±ã¼ãã«åçãã¦ãããããã¨ãå¿
è¦ã«ãªãã¾ããããã®ã¢ã¼ããã¯ãã£ã§ã¯ãã®å½¹å²ãæ確ã«åé¢ãã¦ãã¾ãã
ããªãã¡ãã¢ã³ã±ã¼ãã®é
信管çãè¡ãã·ã¹ãã (Dolphin)ãä¼å¡ã®ã¢ã¯ã»ã¹ãéãããã¨ã«è²¬ä»»ãæã¡ãéããã¢ã¯ã»ã¹ã¯åã¢ã³ã±ã¼ãã·ã¹ãã ã«ãªãã¤ã¬ã¯ãããåå¥ã®ã¢ã³ã±ã¼ãã®åçå¦çã¯åã¢ã³ã±ã¼ãã·ã¹ãã ãåãæã¤ã¨ããæ§é ã§ãã(詳ããã¯åTLã®<a href="https://services.google.com/fh/files/events/d1-da-09.pdf">æ»å®ããã®çºè¡¨è³æ</a>ãåç
§ã®ãã¨)</p>
<p>ã¢ã³ã±ã¼ãã®ç£ä¿ãæµå
¥ã®ã³ã³ããã¼ã«ãDolphinã«éç´ãããã®æ§é èªä½ã¯é常ã«æ©è½ãã¦ãã¾ããä¸æ¹ã§ãåã¢ã³ã±ã¼ãã·ã¹ãã å´ã¯åé¡ç¹ãæ±ãã¦ãã¾ããã</p>
<ul>
<li>æ©è½ã®éè¤</li>
<li>ã·ã¹ãã ã®ã¬ã¬ã·ã¼å</li>
</ul>
<p>ã®2ç¹ã§ãã</p>
<p>æ´å²çãªçµç·¯ã§æ§æ¥ã®ã¢ã³ã±ã¼ãã·ã¹ãã ãæ´ççµ±åããªãã¾ã¾ãæ°ããªã¢ã³ã±ã¼ãã·ã¹ãã ãç«ã¡ä¸ãããã¦ããçµæãå¹´åã®æç¹ã§è¨5ã¤ã®ã¢ã³ã±ã¼ãã·ã¹ãã ãéç¨ããã4ã¤ã®ã·ã¹ãã ãããããã«ã¢ã³ã±ã¼ãåçç»é¢ãä¿æãã¦ãã¾ããã
ãã®ãã¨ã¯ãä¾ãã°ãåçç»é¢UIãç»ä¸çã«å·æ°ãããå ´åãã·ã¹ãã æ°åã ãå·¥æ°ãè¨ãä¸ãããã¨ãæå³ãã¦ãã¾ãã</p>
<p>ã¾ããå¹´åæç¹ã§10å¹´è¿ãéç¨ããã¦ããã·ã¹ãã ãåå¨ãã¦ãã¾ãããããã¾ã§10å¹´é¸æã§ãµã¼ãã¹ãæ¯ãã¦ãããã¨ããæå³ã§ã¯é常ã«åªç§ãªã·ã¹ãã ã§ã¯ããã¾ããã
è¿å¹´ã¯ç¶ç¶çãªã¡ã³ããã³ã¹ãããã¦ããªãã£ãèæ¯ããããä»å¾ã®ã¢ãããã¼ããé£ããç¶æ
ã«ããã¾ããã</p>
<p>ããããç¶æ³ã¯ããã¸ãã¹ã®è¦æ±ã«ã¢ã¸ãªãã£é«ãå¿ãã¦ããä¸ã§è¶³ããã¨ãªã£ã¦ãã¾ããã</p>
<h2 id="ãªã¢ã¼ããã¯ãã£ã®æ¹é">ãªã¢ã¼ããã¯ãã£ã®æ¹é</h2>
<p><figure class="figure-image figure-image-fotolife" title="ãªããã姿"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241216/20241216183010.png" width="800" height="450" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>ãªããã姿</figcaption></figure></p>
<p>ããããç¶æ³ãæç ´ããããããã¼ã ã§ã¯æ¬¡ã®æ§ãªãªã¢ã¼ããã¯ãã£ã®æ¹éããã¨ã«æ´çãé²ãã¦ãã¾ãã</p>
<ul>
<li>ã¢ã³ã±ã¼ãåçæ©è½ã¯1ã¤ã®ã·ã¹ãã ã«éç´ããã</li>
<li>ã¢ã³ã±ã¼ãé
ä¿¡å½¢å¼ã®ã¦ã¼ã¹ã±ã¼ã¹ã«ããè¤éãã¯ãåã¢ã³ã±ã¼ã管çå´ã®ã·ã¹ãã ãå¸åããã</li>
</ul>
<p>ã¨ã ã¹ãªã¼ã®ã¢ã³ã±ã¼ãã«ã¯ç¨éã«å¿ãã¦ãåçºã®ã¢ã³ã±ã¼ãã®ä»ã«ãæ°ã¶æã«1åãªã©å®æçã«åéããå½¢å¼ã常æåçã§ããå½¢å¼ãªã©ã®ã¢ã³ã±ã¼ãé
ä¿¡å½¢å¼ãããã¾ããæ¢åã®ã¢ã³ã±ã¼ãã·ã¹ãã ãæ´çãã¦ããã¨ãè¨åå½¢å¼ãªã©ã¢ã³ã±ã¼ãå
容èªä½ã®ç¹æ®æ§ã¨ãããããããã®é
ä¿¡å½¢å¼ã®ããªã¨ã¼ã·ã§ã³ã«å¯¾å¿ããããã«ç«ã¡ä¸ãããã¦ããå´é¢ãå¼·ãã¨ããçµè«ã«è³ãã¾ããããããã£ã¦ãé
ä¿¡å½¢å¼ã®è¤éããåé¢ã§ããã°ãçæ³çã«ã¯æè»æ§ã®é«ã1ã¤ã®åçã·ã¹ãã ã¨3ã¤ç¨åº¦ã®ç®¡çã·ã¹ãã ã«æ´ççµ±åã§ããã¨ãã仮説ãæã£ã¦éçºãé²ãã¦ãããã¨ã«ãã¾ããã</p>
<h2 id="ããã¾ã§ã®éçºã¨ãããã">ããã¾ã§ã®éçºã¨ãããã</h2>
<p><figure class="figure-image figure-image-fotolife" title="24å¹´æ«ç¾å¨ã®ã¢ã¼ããã¯ãã£"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241216/20241216183007.png" width="800" height="450" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>24å¹´æ«ç¾å¨ã®ã¢ã¼ããã¯ãã£</figcaption></figure></p>
<p>ç¾å¨ã¯ãã®ã´ã¼ã«ãç®æãã¦éçºãé²ãã¦ããã11æã«ã¯æ°ã¢ã¼ããã¯ãã£ã®æ¹éã«æ²¿ã£ã常è¨åã¢ã³ã±ã¼ãã·ã¹ãã ã®1ã¤(MedicalChannelMix)ã®ãªãã¬ã¼ã¹ãå®äºãã¾ããã</p>
<p>ãã®ãªãã¬ã¼ã¹ã®ãããæ±ç¨çãªã¢ã³ã±ã¼ãåçã·ã¹ãã ã§ããLionã常è¨åã¢ã³ã±ã¼ã管çã·ã¹ãã Zebraã¨ããã·ã¹ãã ãæ°ãã«ãªãªã¼ã¹ãã¾ããã</p>
<p>BIRã¯ãµã¼ãã¼ãµã¤ãã®è¨èªã¯Goããã¡ã¼ã¹ããã§ã¤ã¹ã¨ãããã¼ã ã§ãããLionã¯ããã³ãã¨ã³ãå´ã®è¤éãªã¢ã³ã±ã¼ãå®ç¾©åã®æ±ãããããéã¿ã¦ãã¼ã åã®ãµã¼ãã¼ãµã¤ãTypeScriptãæ¡ç¨ãã¦ãã¾ãã</p>
<p>ã¾ããä¸è¨ã®å³ã®å¤ã«ã¯ãªãã¾ãããã¢ã³ã±ã¼ãåçãã¼ã¿ãMedicalChannelMixã®ãã¼ã¿ãããã¯ãã¨ãã¦æä¾ããããã®ETLãã¤ãã©ã¤ã³ Rhinoãåææã«ãªãªã¼ã¹ãã¦ãã¾ãããã¡ããDataformããã¼ã ã§åãã¦æ¡ç¨ãããªã©ãæ°ããæè¡ã¸ã®ãã©ã¤ãè¡ã£ã¦ãã¾ãã</p>
<p>ç¾æç¹ã§ã¯ãã¾ã 1ã·ã¹ãã ã®ãªãã¬ã¼ã¹ã®ã¿ã§ãããããæ©è½éè¤ã®è§£æ¶ã«ã¯è³ã£ã¦ãã¾ãããã10å¹´ãã®ã®ã¬ã¬ã·ã¼ã·ã¹ãã ã®æ´çã¯ããã§å®äºãã¾ããã</p>
<p>ä»å¾ã¯ã常è¨åã®ä»ã®ã¢ã³ã±ã¼ããLionã¨Zebraã«æ´ççµ±åãã¦ãããã¨ãç´è¿ã®ããã·ã§ã³ã«ãªãããã®å¾ä»ã®ã·ã¹ãã ãæ´çãã¦ããäºå®ã§ãã</p>
<h2 id="ã¾ã¨ã">ã¾ã¨ã</h2>
<p>æã
ã®ãã¼ã ã®ç´è¿ã®éçºãããã¤ã¾ãã§é§ã足ã§ç´¹ä»ãã¾ããã</p>
<p>ä¸è¨ã§ã¯ãæ±ç¨çãªã¢ã³ã±ã¼ãåçã·ã¹ãã ãã¨ãµã©ãã¨æ¸ãã¦ãã¾ãããå®éã«ã¯ã¢ã³ã±ã¼ãã®å®ç¾©ãã©ãæ±åãã¦ããããã¢ã³ã±ã¼ãåçã·ã¹ãã å´ã«é
ä¿¡æ¹å¼ã®è¤éããããã«æã¡è¾¼ã¾ããªãããªã©è¨è¨èª²é¡ã¯å¤ããæ¥ã
æ°ããªç¥è¦ãå¾ããã¦ãã¾ãã</p>
<p>ã¾ããLionã¯ãã¾ãä¸ã®ä¸ã«ç¥è¦ãå°ãªãã¨æããããµã¼ãã¼ãµã¤ãTypeScript x Cloud Spannerã®çµã¿åããã§å©ç¨ãã¦ãããããããéçºã®è©³ç´°ã«ã¤ãã¦ãã¾ãå¥ã®æ©ä¼ã«ç´¹ä»ã§ããã°ã¨æãã¾ãã</p>
<h2 id="We-are-hiring">We are hiring!!</h2>
<p>ã¨ã ã¹ãªã¼ã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ãã§ã¯ãä¸ç·ã«åã仲éãåéãã¦ãã¾ãï¼</p>
<p>BIRã®éçºã«å°ãã§ãèå³ãæã£ãæ¹ã¯ãã¾ãã¯ã«ã¸ã¥ã¢ã«é¢è«ããã以ä¸URLãããå¿åããå¾
ã¡ãã¦ãã¾ãã</p>
<h3 id="ã¨ã³ã¸ãã¢æ¡ç¨ãã¼ã¸ã¯ãã¡ã">ã¨ã³ã¸ãã¢æ¡ç¨ãã¼ã¸ã¯ãã¡ã</h3>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjobs.m3.com%2Fengineer%2F" title="ã¨ã³ã¸ãã¢æ¡ç¨ãµã¤ãï½æ¡ç¨æ
å ± | å»çÃãã¯ããã¸ã¼ã®å¯è½æ§ã¯ç¡é大" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jobs.m3.com/engineer/">jobs.m3.com</a></cite></p>
<h3 id="ã«ã¸ã¥ã¢ã«é¢è«ããæ°è»½ã«ã©ãã">ã«ã¸ã¥ã¢ã«é¢è«ããæ°è»½ã«ã©ãã</h3>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjobs.m3.com%2Fengineer%2Fcasual-session%2F" title="ã¨ã³ã¸ãã¢æ¡ç¨ãµã¤ãï½æ¡ç¨æ
å ± | å»çÃãã¯ããã¸ã¼ã®å¯è½æ§ã¯ç¡é大" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jobs.m3.com/engineer/casual-session/">jobs.m3.com</a></cite></p>
<h3 id="ã¤ã³ã¿ã¼ã³ã常æåéãã¦ãã¾ã">ã¤ã³ã¿ã¼ã³ã常æåéãã¦ãã¾ã</h3>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fopen.talentio.com%2Fr%2F1%2Fc%2Fm3%2Fhomes%2F4354" title="ãæ°åãã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ã åéä¸è¦§ / ã¨ã ã¹ãªã¼æ ªå¼ä¼ç¤¾" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://open.talentio.com/r/1/c/m3/homes/4354">open.talentio.com</a></cite></p>
enkn
NeurIPS2024ãéå¬ä¸ãªã®ã§ãã¨ã ã¹ãªã¼ AIã»æ©æ¢°å¦ç¿ãã¼ã ã®æ¨ãè«æãåæã«ç´¹ä»ãããï¼
hatenablog://entry/6802418398309287870
2024-12-14T12:10:59+09:00
2024-12-15T00:22:33+09:00 ããã«ã¡ã¯ãã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ãã®AIã»æ©æ¢°å¦ç¿ãã¼ã ã«æå±ãã¦ããé´¨ç° ã§ãã ãã®ããã°ã¯ã¨ã ã¹ãªã¼ã¢ããã³ãã«ã¬ã³ãã¼14æ¥ç®ã®è¨äºã§ãã å¼ãã¼ã ã§ã¯æ¯é±1æéã®æè¡å
±æä¼ãå®æ½ãã¦ãããåèªãæ
å½ãããããã¯ãã®æè¡ããæè¿èªãã è«æãç´¹ä»ãã¦ãã¾ããä»é±ã¯NeurIPS2024ãéå¬ããã¦ãããã¨ããããåå¦ä¼ã®è«æèªã¿ä¼ã¨ãªãã¾ããã1ã»ãã·ã§ã³1åã®æ
å½ã§ãåèªãã»ãã·ã§ã³å
ã§æ°ã«ãªã£ãè«æã®è©³ç´°ã解説ãã¾ããæ¬ããã°ã§ã¯ãã®ä¸é¨ã¨ãã¦ãã»ãã·ã§ã³ãã¨ã®ãæ¨ãè«æããç´¹ä»ãã¾ãã DALL-E 3ã§çæãããæ©æ¢°å¦ç¿ã¨ã³ã¸ãã¢ãåå¼·ä¼ã§ãæ°ã«å
¥ãã®è¨äºã«ã¤ãã¦æ¥½ãããã«éè«â¦
<p>ããã«ã¡ã¯ãã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ãã®AIã»æ©æ¢°å¦ç¿ãã¼ã ã«æå±ãã¦ããé´¨ç° ã§ãã</p>
<p>ãã®ããã°ã¯<a href="https://qiita.com/advent-calendar/2024/m3">ã¨ã ã¹ãªã¼ã¢ããã³ãã«ã¬ã³ãã¼</a>14æ¥ç®ã®è¨äºã§ãã</p>
<p>å¼ãã¼ã ã§ã¯æ¯é±1æéã®æè¡å
±æä¼ãå®æ½ãã¦ãããåèªãæ
å½ãããããã¯ãã®æè¡ããæè¿èªãã è«æãç´¹ä»ãã¦ãã¾ããä»é±ã¯<a href="https://nips.cc/Conferences/2024">NeurIPS2024</a>ãéå¬ããã¦ãããã¨ããããåå¦ä¼ã®è«æèªã¿ä¼ã¨ãªãã¾ããã1ã»ãã·ã§ã³1åã®æ
å½ã§ãåèªãã»ãã·ã§ã³å
ã§æ°ã«ãªã£ãè«æã®è©³ç´°ã解説ãã¾ããæ¬ããã°ã§ã¯ãã®ä¸é¨ã¨ãã¦ãã»ãã·ã§ã³ãã¨ã®ãæ¨ãè«æããç´¹ä»ãã¾ãã</p>
<p><figure class="figure-image figure-image-fotolife" title="DALL-E 3ã§çæãããæ©æ¢°å¦ç¿ã¨ã³ã¸ãã¢ãåå¼·ä¼ã§ãæ°ã«å
¥ãã®è¨äºã«ã¤ãã¦æ¥½ãããã«éè«ãã¦ããæ§åã"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241214/20241214121122.png" width="800" height="457" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>DALL-E 3ã§çæãããæ©æ¢°å¦ç¿ã¨ã³ã¸ãã¢ãåå¼·ä¼ã§ãæ°ã«å
¥ãã®è¨äºã«ã¤ãã¦æ¥½ãããã«éè«ãã¦ããæ§åã</figcaption></figure></p>
<ul class="table-of-contents">
<li><a href="#You-Only-Cache-Once-Decoder-Decoder-Architectures-for-Language-Models">You Only Cache Once: Decoder-Decoder Architectures for Language Models</a><ul>
<li><a href="#æ¨ããã¤ã³ã">æ¨ããã¤ã³ã</a></li>
</ul>
</li>
<li><a href="#Decompose-Analyze-and-Rethink-Solving-Intricate-Problems-with-Human-like-Reasoning-Cycle">Decompose, Analyze and Rethink: Solving Intricate Problems with Human-like Reasoning Cycle</a><ul>
<li><a href="#æ¨ããã¤ã³ã-1">æ¨ããã¤ã³ã</a></li>
</ul>
</li>
<li><a href="#RG-SAN-Rule-Guided-Spatial-Awareness-Network-for-End-to-End-3D-Referring-Expression-Segmentation">RG-SAN: Rule-Guided Spatial Awareness Network for End-to-End 3D Referring Expression Segmentation</a><ul>
<li><a href="#æ¨ããã¤ã³ã-2">æ¨ããã¤ã³ã</a></li>
</ul>
</li>
<li><a href="#GIC-Gaussian-Informed-Continuum-for-Physical-Property-Identification-and-Simulation">GIC: Gaussian-Informed Continuum for Physical Property Identification and Simulation</a><ul>
<li><a href="#æ¨ããã¤ã³ã-3">æ¨ããã¤ã³ã</a></li>
</ul>
</li>
<li><a href="#Convolutional-Differentiable-Logic-Gate-Networks">Convolutional Differentiable Logic Gate Networks</a><ul>
<li><a href="#æ¨ããã¤ã³ã-4">æ¨ããã¤ã³ã</a></li>
</ul>
</li>
<li><a href="#Unlocking-the-Capabilities-of-Thought-A-Reasoning-Boundary-Framework-to-Quantify-and-Optimize-Chain-of-Thought">Unlocking the Capabilities of Thought: A Reasoning Boundary Framework to Quantify and Optimize Chain-of-Thought</a><ul>
<li><a href="#æ¨ããã¤ã³ã-5">æ¨ããã¤ã³ã</a></li>
</ul>
</li>
<li><a href="#Guiding-a-Diffusion-Model-with-a-Bad-Version-of-Itself">Guiding a Diffusion Model with a Bad Version of Itself</a><ul>
<li><a href="#æ¨ããã¤ã³ã-6">æ¨ããã¤ã³ã</a></li>
</ul>
</li>
<li><a href="#We-are-hiring-">We are hiring !!</a><ul>
<li><a href="#ã¨ã³ã¸ãã¢æ¡ç¨ãã¼ã¸ã¯ãã¡ã">ã¨ã³ã¸ãã¢æ¡ç¨ãã¼ã¸ã¯ãã¡ã</a></li>
<li><a href="#ã«ã¸ã¥ã¢ã«é¢è«ããæ°è»½ã«ã©ãã">ã«ã¸ã¥ã¢ã«é¢è«ããæ°è»½ã«ã©ãã</a></li>
<li><a href="#ã¤ã³ã¿ã¼ã³ã常æåéãã¦ãã¾ã">ã¤ã³ã¿ã¼ã³ã常æåéãã¦ãã¾ã</a></li>
</ul>
</li>
</ul>
<h2 id="You-Only-Cache-Once-Decoder-Decoder-Architectures-for-Language-Models">You Only Cache Once: Decoder-Decoder Architectures for Language Models</h2>
<ul>
<li>ã»ãã·ã§ã³: 6D: Deep Learning Architecture, Infrastructure</li>
<li>èè
: Yutao Sun, Li Dong, Yi Zhu, Shaohan Huang, Wenhui Wang, Shuming Ma, Quanlu Zhang, Jianyong Wang, Furu Wei</li>
<li><p>è«æãªã³ã¯:
<a href="https://arxiv.org/pdf/2405.05254">https://arxiv.org/pdf/2405.05254</a></p></li>
<li><p>ç´¹ä»è
: é«æ© (æ©æ¢°å¦ç¿ã¨ã³ã¸ãã¢)</p></li>
</ul>
<h3 id="æ¨ããã¤ã³ã">æ¨ããã¤ã³ã</h3>
<p><figure class="figure-image figure-image-fotolife" title="å³ã¯è«æã®Figure 2ããå¼ç¨ã"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241214/20241214121104.png" width="377" height="416" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>å³ã¯è«æã®Figure 2ããå¼ç¨ã</figcaption></figure></p>
<p>LLMå
¨çã®æ¨ä»ã§ã¯Transformerã®æ¨è«é度ãè¦ããHBMã¡ã¢ãªã®åæ¸ãéç¨ã³ã¹ãã«ã¯ãªãã£ã«ã«ã«å¹ãã¦ãã¾ããæè¡ãã¬ã³ãã¨ãã¦ãAttentionæ©æ§ã«é¢ããé¨åã®ç 究ã¯å¤ããä¾ãã°GPUã¢ã¼ããã¯ãã£ã®æ§è³ªã«é©ããFlashAttentionã§ãã£ãããAttentionãç³»åé·Nã«å¯¾ãã¦O(N<sup>2</sup>)ã®è¨ç®ã³ã¹ããè¦ããã¨ããO(N)ã«ããã¢ã¼ããã¯ãã£ãæ°å¤ãææ¡ããã¦ãã¾ãã</p>
<p>ä»åé¸ãã You Only Cache One (YOCO)ã§ã¯decoder-decoderã¨ãã°ããã¢ã¼ããã¯ãã£ãææ¡ããåè¦æ¨¡ã®Transformerã¨æ¯ã¹ã¦ã¹ã«ã¼ãããã®10åè¿ãé«éåãéæãã¦ãã¾ãã</p>
<p>èã¨ãªãã®ã¯key-value cache (KV cache)ãã¬ã¤ã¤ã¼ãã¨ã§ã¯ãªããã¢ãã«ã§1ã¤ã®ã¿ã®KV cacheãçæãã (global KV cache)ã¨ããç¹ã§ããè«æã®Figure 2ã®ã¨ãããã¢ã¼ããã¯ãã£å
¨ä½ã¨ãã¦ã¯ååã®self-decoderã¨å¾åã®cross-decoderããæ§æããã¾ããself-decoderã§ã¯Retentive Networksãæ¡ç¨ãã¦O(N)ã®è¨ç®ã³ã¹ã㧠global KV Cacheãçæãã¾ããcross-decoderã§ã¯global KV cacheãå©ç¨ãã¦é常ã®Transformerã®Attentionæ©æ§ã¨åæ§ã®è¨ç®ããã¾ãã</p>
<p>æ°ã«ãªãã®ã¯LLMã¨ãã¦ã®æ§è½ã§ãããlanguage modeling, needle-in-a-haystack (é·æããã®æ
å ±æ½åºã¿ã¹ã¯), question asnweringã¨ãã£ãè¤æ°ã®ã¿ã¹ã¯ã§åè¦æ¨¡ã®Transformerã¨åç¨åº¦ãããä¸åãããã©ã¼ãã³ã¹ãéæãã¦ããé常ã«å¹æçãªã¢ã¼ããã¯ãã£ã§ãããã¨ã示ããã¦ãã¾ãã</p>
<p>AIãã¼ã ã§ã¯LLMãæ±ãã¿ã¹ã¯ãå¢ãã¦ãã¦ãããç¹ã«æ¨è«æã®ã¹ã«ã¼ããããã³ã¹ãã¯å®éã«ãããã¯ãã§LLMãæ´»ç¨ããéã«éè¦ãªãããããããæè¡ãæãã¦ãããã¨ã¯å¤§äºã ã¨æãæ¨è¦ãã¾ããã</p>
<h2 id="Decompose-Analyze-and-Rethink-Solving-Intricate-Problems-with-Human-like-Reasoning-Cycle">Decompose, Analyze and Rethink: Solving Intricate Problems with Human-like Reasoning Cycle</h2>
<ul>
<li>ã»ãã·ã§ã³: 3B: Natural Language Processing</li>
<li>èè
: Shangzi Xue, Zhenya Huang, Jiayu Liu, Xin Lin, Yuting Ning, Binbin Jin, Xin Li, Qi Liu</li>
<li>è«æãªã³ã¯: <a href="https://openreview.net/forum?id=NPKZF1WDjZ">Decompose, Analyze and Rethink: Solving Intricate Problems with Human-like Reasoning Cycle | OpenReview</a></li>
<li>ç´¹ä»è
: æ± å¶ (æ©æ¢°å¦ç¿ã¨ã³ã¸ãã¢)</li>
</ul>
<h3 id="æ¨ããã¤ã³ã-1">æ¨ããã¤ã³ã</h3>
<p><figure class="figure-image figure-image-fotolife" title="è«æã®Fig1"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241214/20241214121128.png" width="800" height="351" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>è«æã®Fig1</figcaption></figure></p>
<p>ãã®è«æã§ã¯ãLLMã§è¤éãªè³ªåã¸ã®æ¨è«æ§è½ãä¸ããç®çã§ãåé¡æãå解ãæ¨è«ãè©ä¾¡ãåæ§ç¯ã¨ããã¹ãããã§è§£ãã¦ãããDeAR (Decompose-Analyze-Rethink)ã¨ãããã¬ã¼ã ã¯ã¼ã¯ãææ¡ãã¦ãã¾ããæ¢åææ³ã§ãããChain-of-ThoughtãTree-of-Thoughtã§ãåé¡æãå解ãã¦éä¸åé¡ã解ããããæ¨è«çµæãè©ä¾¡ãã¦è¯ããããªãã®ãæ·±å ããããã§ãã¾ããããéä¸åé¡ã®æ¨è«ééããè¨æ£ã§ããªãã¨ããå¼±ç¹ãããã¾ãããDeARã§ã¯ãLLMèªèº«ã§ã»ã«ããã§ãã¯ãããããåæ§ç¯ã®ã¹ãããã§ã©ã®é¨ååé¡ã®åçã使ãã¹ãããLLMã«å¤æãããããã¦ããã®èª²é¡ã解æ¶ãã¦ãã¾ãã</p>
<p>çµæã¯ãã¡ããSoTAã§ãæ¢åã®Chain-of-ThoughtãTree-of-Thoughtãããæ§è½ãä¸ãã£ã¦ããã¨èª¬æãã¦ãã¾ãã人éã®æ¨è«æ¹æ³ã模å£ãã¦ãåé¡æãå解ã»åæ§ç¯ãããã¨ã§æ§è½ãä¸ããã¨ããã¢ã¤ãã£ã¢ãé¢ç½ãããåç¾ãããããã®ã§ã¤ã³ãã¯ãã®ããè«æããªã¨èãã¾ããã</p>
<p>ãã ãè«æã§ã¯è©ä¾¡ã«ã¯GPT-3.5ã使ç¨ãã¦ãããGPT4ã®å ´åã¯ãããé£åº¦ã®é«ãåé¡ã§å·®ãåºãã¨ä¸»å¼µãã¦ãã¾ãããããã«è«æã§ç¤ºãããLLMã§è§£ãã®ãé£ããã¨ãããåé¡æã試ãã«GPT4<a href="#f-3f36e1e7" id="fn-3f36e1e7" name="fn-3f36e1e7" title="OpenAI o1ã·ãªã¼ãºã«ã¯å
é¨çã«Chain-of-Thoughtãæ¡ç¨ããã¦ããããã§ããhttps://platform.openai.com/docs/guides/reasoning">*1</a>ã«å
¥ãã¦ã¿ãã¨ã0-shotããã³ããã«ãé¢ãããæ£è§£ãã¦ãã¾ã£ã¦ãã¾ãããLLMèªèº«ã®é²åãããè¦ããé¢ç½ãpaperã ãªã¨æãã¾ããã</p>
<h2 id="RG-SAN-Rule-Guided-Spatial-Awareness-Network-for-End-to-End-3D-Referring-Expression-Segmentation">RG-SAN: Rule-Guided Spatial Awareness Network for End-to-End 3D Referring Expression Segmentation</h2>
<ul>
<li>ã»ãã·ã§ã³: 1B: Human-AI Interaction</li>
<li>èè
: Changli Wu, Qi Chen, Jiayi Ji, Haowei Wang , Yiwei Ma, You Huang, Gen Luo, Hao Fei , Xiaoshuai Sun , Rongrong Ji</li>
<li>è«æãªã³ã¯: <a href="https://arxiv.org/pdf/2412.02402">https://arxiv.org/pdf/2412.02402</a></li>
<li>ç´¹ä»è
: é´¨ç° (æ©æ¢°å¦ç¿ã¨ã³ã¸ãã¢)</li>
</ul>
<h3 id="æ¨ããã¤ã³ã-2">æ¨ããã¤ã³ã</h3>
<p><figure class="figure-image figure-image-fotolife" title="å³ã¯è«æã®Figure 2ããå¼ç¨ã"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241214/20241214121107.png" width="720" height="419" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>å³ã¯è«æã®Figure 2ããå¼ç¨ã</figcaption></figure>
3D Referring Expression Segmentation ã¯ããã¹ãã«ããåç
§è¡¨ç¾ã«åºã¥ãã¦ç¹ç¾¤ãã¼ã¿å
ã®3Dç©ä½ãã»ã°ã¡ã³ãã¼ã·ã§ã³ããç 究åéã§ãèªå¾åãããããèªåé転ã¸ã®å¿ç¨ãæå¾
ããã¦ãã¾ãã</p>
<p>ä»åé¸ãã RG-SANã§ã¯ãæ¢åç 究ã§èª²é¡ã ã£ãã¤ã³ã¹ã¿ã³ã¹éã®ç©ºéçãªä½ç½®é¢ä¿ã®èæ
®ãæ¹åããè¤æ°ã®å種ãªãã¸ã§ã¯ããåå¨ããè¤éãªã·ã¼ã³ã§ã®æ§è½åä¸ãå®ç¾ãã¦ãã¾ãã</p>
<p>ãã®è«æã®ãã¼ãã¤ã³ãã¯ããã¹ãã«ç»å ´ããç©ä½ã®3D空éã§ã®ä½ç½®ãç¹å®ã»æ´æ°ããText-driven Localization Moduleï¼TLMï¼ã¨ã¿ã¼ã²ãããªãã¸ã§ã¯ãã®ä½ç½®æ
å ±ã®ã¿ã§å¦ç¿å¯è½ã¨ããRule-guided Weak Supervisionï¼RWSï¼ã®å°å
¥ã§ããTLMã«ãã£ã¦ç©ä½éã®ç©ºéçé¢ä¿æ§ãããæ£ç¢ºã«ç解ã§ããRWSã«ãã£ã¦éãããæ師ãã¼ã¿ãæ大éã«æ´»ç¨ããªããå¹ççãã¤å¹æçãªå¦ç¿ãå¯è½ã«ãã¦ãã¾ãã</p>
<p>課é¡ã«å¯¾ãã¦å¹æçã«ã¢ããã¼ãããç¹ã¨ãç¹å¾´ã®æ¬¡å
å°å½±ãStep-by-stepã§å®æ½ãã¦ããã®ãã¢ãã«ã®è¤éæ§ã«åãããæ½çã§è¯ããªã¨æãæ¨è¦ãã¾ããã</p>
<h2 id="GIC-Gaussian-Informed-Continuum-for-Physical-Property-Identification-and-Simulation">GIC: Gaussian-Informed Continuum for Physical Property Identification and Simulation</h2>
<ul>
<li>ã»ãã·ã§ã³: 4D: Machine Vision</li>
<li>èè
: Junhao Cai, Yuji Yang, Weihao Yuan, Yisheng He, Zilong Dong, Liefeng Bo, Hui Cheng, Qifeng Chen</li>
<li>è«æãªã³ã¯: <a href="https://arxiv.org/pdf/2406.14927">https://arxiv.org/pdf/2406.14927</a></li>
<li>ç´¹ä»è
: å¤§å£ (æ©æ¢°å¦ç¿ã¨ã³ã¸ãã¢)</li>
</ul>
<h3 id="æ¨ããã¤ã³ã-3">æ¨ããã¤ã³ã</h3>
<p><figure class="figure-image figure-image-fotolife" title="è«æFig.1ãã"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241214/20241214121100.png" width="800" height="475" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>è«æFig.1ãã</figcaption></figure></p>
<p><strong>人éã¯ä¸åº¦ç©ãè½ä¸ãã¦è¡çªãããããªãè¦ãã°ããã®ç©ãã©ã®ãããªç¹æ§ãæã¤ãäºæ³ã§ãã</strong></p>
<p>Gaussian Splattingã«ãã3D復å
ã®æ¡å¼µã¨ãã¦ãç©çç¹æ§ãå«ãã3D復å
ãããã®ãã¢ããã¼ã·ã§ã³ãç¹ã«ãã¤ã³ããªã®ã¯ãå¦ç¿å¯è½ãªãã©ã¡ã¿ã«ããããã«ãç©çç¹æ§ããâå¤å½¢ã®äºæ¸¬âã¨ãã¦å®å¼åãã¦ããç¹ãããç©ä½ã®é£ç¶ããåç»ãã移åã¨å¤å½¢ã®ãã©ã¡ã¿ã§è¨è¿°ããåç¾ãããåç»ã¨å®éã®åç»ã®è·é¢ãè¿ããªãããã«å¦ç¿ãã (b)ãã¾ããå®éã®åç»èªä½ãã2Dã«å°å½±ãã¦è·é¢ãåãã®ã§ã¯ãªãããããã3D復å
ãããã®ã¨ã®è·é¢ãåããã¨ã§åé¡ãä¸æ®µé解ãããããã¦ã (a)ã</p>
<p>ãããããã¨ã§ãæ¨è«æã«ã¯ãåç»ã®ä¸é¨ãå
¥ããã°ãã®å¾ã®å¤å½¢ãäºæ¸¬ã§ããããããããã¢ã¼ã ã§ä¿æãã¦åãå
¥ããç¶æ
ã§ã®å¤å½¢ãäºæ¸¬ã§ãããã¨ãããã®ã
Gaussian SplattingãNeRFãªã©ãç©ä½ãç¹ç¾¤ã§ã¯ãªãå ´ã¨ãã¦æããã¨ããç 究ãè³¢ãã¦å¥½ããªã®ã§ãç©çç¹æ§ãå¤å½¢ã¨ããå ´ã®æ¡å¼µãå°å
¥ããã¢ã¤ãã£ã¢ãç¾ããã¨æãã¾ãã
ä»å¾ããreal-worldã®ãã¼ã¿ããè¨æ¸¬ã§ããããã«ãªã£ããã2stageãããªãend-to-endã«ãªã£ãããä»å¾ã®çºå±ã®å¯è½æ§ã大ããã¨æãã¾ãã</p>
<h2 id="Convolutional-Differentiable-Logic-Gate-Networks">Convolutional Differentiable Logic Gate Networks</h2>
<ul>
<li>ã»ãã·ã§ã³: 5C: Machine Vision</li>
<li>èè
: Felix Petersen, Hilde Kuehne, Christian Borgelt, Julian Welzel, Stefano Ermon</li>
<li><p>è«æãªã³ã¯:
<a href="https://arxiv.org/pdf/2411.04732">https://arxiv.org/pdf/2411.04732</a></p></li>
<li><p>ç´¹ä»è
: ä¸æä¼å¹ (ã½ããã¦ã§ã¢ã¨ã³ã¸ãã¢)</p></li>
</ul>
<h3 id="æ¨ããã¤ã³ã-4">æ¨ããã¤ã³ã</h3>
<p><figure class="figure-image figure-image-fotolife" title="å³ã¯è«æã®Figure 3ããå¼ç¨ã"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241214/20241214121110.png" width="318" height="233" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>å³ã¯è«æã®Figure 3ããå¼ç¨ã</figcaption></figure>
æ©æ¢°å¦ç¿ã¢ãã«ã®å¹ççãªæ¨è«ãå®ç¾ããããã®æ°ããã¢ããã¼ãã¨ãã¦ãConvolutional Differentiable Logic Gate Networks (LogicTreeNet)ãææ¡ãã¦ãã¾ãããã¸ãã¯ã²ã¼ããããã¯ã¼ã¯ãç´æ¥å¦ç¿ããææ³ãéçºããç³ã¿è¾¼ã¿æ¼ç®ããã¼ãªã³ã°ãæ®å·®æ¥ç¶ã®æ¦å¿µããã¸ãã¯ã²ã¼ããããã¯ã¼ã¯ã«å°å
¥ãã¦ãã¾ãã</p>
<p>ä»ã¯ã½ããã¦ã§ã¢ã¨ã³ã¸ãã¢ã¨ãã¦AIãã¼ã ã§åãã¦ãã¾ãããå¦çæ代ã¯ã¨ãã¸ããã¤ã¹ã«ããã深層å¦ç¿ã¢ãã«ã«ã¤ãã¦ç 究ãã¦ãã¾ããããã®è«æã§ã¯ã·ã³ãã«ãªçºæ³ã§ç解ããããããã¤ç²¾åº¦ãé«ãã¢ãã«ãå®ç¾ããã¦ãã¾ããã¨ãã¸ã«ããã¦å¹ççã«åã深層å¦ç¿ã¢ãã«ã«å¿ç¨ã§ããããªç 究ã ãªã¨æãããã¡ããã¡ãã¯ã¯ã¯ã¯ãã¾ããã</p>
<h2 id="Unlocking-the-Capabilities-of-Thought-A-Reasoning-Boundary-Framework-to-Quantify-and-Optimize-Chain-of-Thought">Unlocking the Capabilities of Thought: A Reasoning Boundary Framework to Quantify and Optimize Chain-of-Thought</h2>
<ul>
<li>ã»ãã·ã§ã³: 3B: Natural Language Processing</li>
<li>èè
: Qiguang Chen, Libo Qin, Jiaqi Wang, Jinxuan Zhou, Wanxiang Che</li>
<li>è«æãªã³ã¯: <a href="https://arxiv.org/abs/2410.05695">https://arxiv.org/abs/2410.05695</a></li>
<li>ç´¹ä»è
: æ°å®¶ (æ©æ¢°å¦ç¿ã¨ã³ã¸ãã¢)</li>
</ul>
<h3 id="æ¨ããã¤ã³ã-5">æ¨ããã¤ã³ã</h3>
<p><figure class="figure-image figure-image-fotolife" title="å³ã¯è«æã®Figure 1ããå¼ç¨ã"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241214/20241214121114.png" width="798" height="353" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>å³ã¯è«æã®Figure 3ããå¼ç¨ã</figcaption></figure>
è¿å¹´LLMã®æ¨è«ç²¾åº¦ãä¸ããç®çã¨ãã¦ãæèéç¨ãåºåãã段éçã«æ¨è«ãããChain-of-Thoughtã¨ããææ³ãææ¡ããã¦ãã¾ãã</p>
<p>ãã®è«æã§ã¯ãChain-of-Thought(CoT)ãå®éè©ä¾¡ãæé©åãããããReasoning Boundary (RB; LLMã«ã¨ã£ã¦ã®ã¿ã¹ã¯ã®é£æ度ã®ãããªãã®)ã¨ãããã¬ã¼ã ã¯ã¼ã¯ãææ¡ãã¦ãã¾ããCoTã«ããã¿ã¹ã¯ãå解ããéã«ãå
ã®ã¿ã¹ã¯ã®RBãå解å¾ã®ã¿ã¹ã¯ã®RBã®éã¿ä»ã調åå¹³åã«å解ãããã¨ã§ãCoTãçè«çã«èª¬æä»ãããã¨ãã¦ãã¾ãã</p>
<p>ãã®è«æã«éãããæ°ããªææ³ãåºã¦ãå¾ããçè«çãªç 究ãé²ãã®ã¯å·¥å¦çã§ã¨ã¦ã好ããªã®ã§æ¨è¦ãã¾ãããCoTãªã©LLMãåãå·»ãç 究ã¯æ®æ®µä½¿ãããLLMã®ããã³ããã«ãå¿ç¨ã§ãããã®ãããã¾ãããå®æçã«ã¦ã©ãããã¦ããããã§ãã</p>
<h2 id="Guiding-a-Diffusion-Model-with-a-Bad-Version-of-Itself">Guiding a Diffusion Model with a Bad Version of Itself</h2>
<ul>
<li>ã»ãã·ã§ã³: 4B: Diffusion-based Models</li>
<li>èè
: Tero Karras, Miika Aittala, Tuomas Kynkäänniemi, Jaakko Lehtinen, Timo Aila, Samuli Laine</li>
<li>è«æãªã³ã¯: <a href="https://arxiv.org/abs/2406.02507">https://arxiv.org/abs/2406.02507</a></li>
<li>ç´¹ä»è
: è¾²è¦ (æ©æ¢°å¦ç¿ã¨ã³ã¸ãã¢)</li>
</ul>
<h3 id="æ¨ããã¤ã³ã-6">æ¨ããã¤ã³ã</h3>
<p><figure class="figure-image figure-image-fotolife" title="CFGã¯å¼·ãããããã¨ããã³ããã«ã¯å¿ å®ãªãã®ã®ã·ã³ãã«ãããç»åã«ãªã£ã¦ãã¾ããautoguidanceã ã¨å¼·ãã¦ãå質ã®è¯ãç»åãå¾ããã¦ãã"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241214/20241214121117.png" width="670" height="457" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>CFGã¯å¼·ãããããã¨ããã³ããã«ã¯å¿ å®ãªãã®ã®ã·ã³ãã«ãããç»åã«ãªã£ã¦ãã¾ããautoguidanceã ã¨å¼·ãã¦ãå質ã®è¯ãç»åãå¾ããã¦ãã</figcaption></figure></p>
<p>ç»åçæAIã§åºãç¨ãããã¦ãããClassifier-Free Guidance (CFG)ãã¯ãããã³ããï¼æ示ï¼ããã®ç»åã¨ããã³ãããªãã®ç»åã®å·®åã強調ãããã¨ã§ãæ示å
容ã«å¿ å®ã§é«å質ãªç»åãçæããæè¡ã§ãã</p>
<p>ãã®è«æã§ã¯ãCFGããªãé«å質ãªç»åãçæã§ããã®ãããã®ã¡ã«ããºã ãæããã«ãã¾ãããå
·ä½çã«ã¯ãCFGã¯ãæ¡ä»¶ä»ãã¢ãã«ï¼ããã³ããããï¼ã¨ããæ¯è¼çå質ã®é«ãã¢ãã«ã®åºåã¨ãæ¡ä»¶ãªãã¢ãã«ï¼ããã³ãããªãï¼ã¨ããå¦ç¿é£æ度ãé«ãå質ãä½ãã¢ãã«ã®åºåã®å·®åã«çç®ãããã®å·®åã使ãé«å質ãªã¢ãã«å´ã«å¯ãã¦ãããã¨ã§ãçæç»åã®å質ãåä¸ããã¦ãã¾ãããã®è«æã§ã¯ãCFGã®ä»çµã¿ãããã«çºå±ãããæçµå¦ç¿ãçµããé«å質ãªã¢ãã«ã¨ãå¦ç¿éä¸ããã©ã¡ã¼ã¿æ°ã®å°ãªãæ¯è¼çå質ã®ä½ãã¢ãã«ã¨ã®å·®åãå©ç¨ãããautoguidanceãã¨ããæ°ããªææ³ãææ¡ãã¾ãããautoguidanceãç¨ãããã¨ã§ãCFGãæ±ãã¦ãã課é¡ãããªãã¡ããã³ããã«å¿ å®ããããã¾ãç»åãåç´åãã¦ãã¾ãå¾åãç·©åããããå¤æ§æ§ã®ããç»åãçæã§ããããã«ãªãã¾ããã</p>
<p>ã¨ã¯ããæ¬ ç¹ããããä»ã®å¤§è¦æ¨¡ç»åçæã¢ãã«ã¯æ®µéçã«å¦ç¿ããããã¨ãå¤ãåºåã®åå¸ãä¼¼ã¦ããå¼±ãã¢ãã«ãå¾ãããªãã¨ãã話ã¯ããã¾ãããã§ãããä»ã¾ã§åºã使ããã¦ãCFGã®ä»çµã¿ãæããã«ããããè¯ãæ¹åæ¹æ³ãä½ã£ãç¹ãé¢ç½ããªã¨æãã¾ããã</p>
<h2 id="We-are-hiring-">We are hiring !!</h2>
<p>NeurIPSã®è«æã®é¢ç½ãã«ã¯ã¯ã¯ã¯ããçãããã¨ã ã¹ãªã¼AIã»æ©æ¢°å¦ç¿ãã¼ã ã§ä¸ç·ã«æ©æ¢°å¦ç¿ã¨ã³ã¸ãã¢ããã¾ãããï¼ãã¾ããå¦çã®çããåãã«ã¯æ©æ¢°å¦ç¿ã»MLOpsã¤ã³ã¿ã¼ã³ãåéãã¦ã¾ãããã²ä¸ç·ã«è«æãèªã¿ãµã¼ãã¹éçºãã¦ããã¾ãããã</p>
<p>ã¨ã ã¹ãªã¼ã§ã¯ãã³ã³ãã¥ã¼ã¿ãã¸ã§ã³ã»æ©æ¢°å¦ç¿ã¯ãã¡ãããææ°æè¡ã¸ã®ã¢ã³ãããé«ã仲éãæè¿ãã¦ãã¾ããæ°åã»ä¸éããããã®æ¡ç¨ãã«ã¸ã¥ã¢ã«é¢è«ãã¤ã³ã¿ã¼ã³ã常æåéãã¦ãã¾ãï¼</p>
<h3 id="ã¨ã³ã¸ãã¢æ¡ç¨ãã¼ã¸ã¯ãã¡ã">ã¨ã³ã¸ãã¢æ¡ç¨ãã¼ã¸ã¯ãã¡ã</h3>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjobs.m3.com%2Fengineer%2F" title="ã¨ã³ã¸ãã¢æ¡ç¨ãµã¤ãï½æ¡ç¨æ
å ± | å»çÃãã¯ããã¸ã¼ã®å¯è½æ§ã¯ç¡é大" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jobs.m3.com/engineer/">jobs.m3.com</a></cite></p>
<h3 id="ã«ã¸ã¥ã¢ã«é¢è«ããæ°è»½ã«ã©ãã">ã«ã¸ã¥ã¢ã«é¢è«ããæ°è»½ã«ã©ãã</h3>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjobs.m3.com%2Fengineer%2Fcasual-session%2F" title="ã¨ã³ã¸ãã¢æ¡ç¨ãµã¤ãï½æ¡ç¨æ
å ± | å»çÃãã¯ããã¸ã¼ã®å¯è½æ§ã¯ç¡é大" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jobs.m3.com/engineer/casual-session/">jobs.m3.com</a></cite></p>
<h3 id="ã¤ã³ã¿ã¼ã³ã常æåéãã¦ãã¾ã">ã¤ã³ã¿ã¼ã³ã常æåéãã¦ãã¾ã</h3>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fopen.talentio.com%2Fr%2F1%2Fc%2Fm3%2Fhomes%2F4354" title="ãæ°åãã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ã åéä¸è¦§ / ã¨ã ã¹ãªã¼æ ªå¼ä¼ç¤¾" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://open.talentio.com/r/1/c/m3/homes/4354">open.talentio.com</a></cite></p>
<div class="footnote">
<p class="footnote"><a href="#fn-3f36e1e7" id="f-3f36e1e7" name="f-3f36e1e7" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">OpenAI o1ã·ãªã¼ãºã«ã¯å
é¨çã«Chain-of-Thoughtãæ¡ç¨ããã¦ããããã§ãã<a href="https://platform.openai.com/docs/guides/reasoning">https://platform.openai.com/docs/guides/reasoning</a></span></p>
</div>
kamo2kun
ãpmconf 2024ãã¯ã©ã¤ã¹&ã«ã³ããã¼ã®Discordä¼ç»æ¯ãè¿ãï¼ãããã¯ãããã¼ã¸ã£ã¼ã«ã¨ã£ã¦ã®ãã¼ã ã©ã³ã¨ã¯ï¼
hatenablog://entry/6802418398311284757
2024-12-13T20:44:34+09:00
2024-12-14T11:53:22+09:00 ããã«ã¡ã¯ãããã°ãã¯ãä»å¹´ãå¹´æ«å¹´å§ã¯12/25ã1/5ã¾ã§é£ä¼ãåã£ã¦ã¿ãåç· å½¹CTOå
¼VPoPã®å±±å´ã§ããæè¿ã¯ULè£
å*1ãå
å®ãããæ¥ã
ãéããã¦ããã¾ãã æ¬ããã°ã¯ãããã¯ãããã¼ã¸ã£ã¼ Advent Calendar 2024ã®14æ¥ç®ã®è¨äºã§ã*2ã ãããã¯ãããã¼ã¸ã£ã¼ Advent Calendar 2023ã¯ä¹ãé
ãã¦æ ãåããªãã£ãã®ã§ããããã®åã®ãããã¯ãããã¼ã¸ã£ã¼ Advent Calendar 2022ã«ã¯ä»¥ä¸ã®è¨äºããã¹ããã¦ãã¾ãã®ã§ãæ¯éããããã ããã www.m3tech.blog å
æ¥ã®ULè£
åãã£ã³ããEnlightened Equipmenâ¦
<p>ããã«ã¡ã¯ãããã°ãã¯ãä»å¹´ãå¹´æ«å¹´å§ã¯12/25ã1/5ã¾ã§é£ä¼ãåã£ã¦ã¿ãåç· å½¹CTOå
¼VPoPã®å±±å´ã§ããæè¿ã¯ULè£
å<a href="#f-929e7fb9" id="fn-929e7fb9" name="fn-929e7fb9" title="ULã¨ã¯Ultra Lightã®çç¥ã§è¶
軽éè£
åã§ãã£ã³ããç»å±±ãªã©ã楽ããã¸ã£ã³ã«ã§ãã">*1</a>ãå
å®ãããæ¥ã
ãéããã¦ããã¾ãã</p>
<p>æ¬ããã°ã¯<a href="https://adventar.org/calendars/10453">ãããã¯ãããã¼ã¸ã£ã¼ Advent Calendar 2024</a>ã®14æ¥ç®ã®è¨äºã§ã<a href="#f-c38afab8" id="fn-c38afab8" name="fn-c38afab8" title="ããææ¥ç¨äºãããã®ã§3æéæ©ãã§ããããã©ã¤ã³ã°ãªãªã¼ã¹ããã¦é ãã¾ããã">*2</a>ã</p>
<p>ãããã¯ãããã¼ã¸ã£ã¼ Advent Calendar 2023ã¯ä¹ãé
ãã¦æ ãåããªãã£ãã®ã§ããããã®åã®ãããã¯ãããã¼ã¸ã£ã¼ Advent Calendar 2022ã«ã¯ä»¥ä¸ã®è¨äºããã¹ããã¦ãã¾ãã®ã§ãæ¯éããããã ããã</p>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fwww.m3tech.blog%2Fentry%2F2022%2F12%2F25%2F203858" title="ã¨ã ã¹ãªã¼ãèªãæå¼·ã®ãããã¯ãããã¼ã¸ã£ã¼è²æç°å¢ï¼ãããã¯ãããã¼ã¸ã£ã¼å®ä¾ - ã¨ã ã¹ãªã¼ããã¯ããã°" class="embed-card embed-blogcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 190px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://www.m3tech.blog/entry/2022/12/25/203858">www.m3tech.blog</a></cite></p>
<p><figure class="figure-image figure-image-fotolife" title="å
æ¥ã®ULè£
åãã£ã³ããEnlightened Equipmentã®Revelation 850 30Fãæã«å
¥ããã®ã§2âã®ç°å¢ã§ä½¿ã£ã¦ã¿ã¾ãããã³ãã使ã£ã¦ãã段éã§ULãããªããããï¼ã¨ããåãæ ªã®ä¸ã«ããã®ã¯ã¢ã¤ãã³ã¹ãã¼ãï¼ã¨ãã®ããã³ãã¯ãé æ
®ãã ããwã"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241213/20241213204435.jpg" width="800" height="600" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>å
æ¥ã®ULè£
åãã£ã³ããEnlightened Equipmentã®Revelation 850 30Fãæã«å
¥ããã®ã§2âã®ç°å¢ã§ä½¿ã£ã¦ã¿ã¾ãããã³ãã使ã£ã¦ãã段éã§ULãããªããããï¼ã¨ããåãæ ªã®ä¸ã«ããã®ã¯ã¢ã¤ãã³ã¹ãã¼ãï¼ã¨ãã®ããã³ãã¯ãé æ
®ãã ããwã</figcaption></figure></p>
<ul class="table-of-contents">
<li><a href="#ã¯ããã«">ã¯ããã«</a></li>
<li><a href="#ãããã¯ãããã¼ã¸ã£ã¼ã«ã¨ã£ã¦ã®ãã¼ã ã©ã³ã¨ã¯">ãããã¯ãããã¼ã¸ã£ã¼ã«ã¨ã£ã¦ã®ãã¼ã ã©ã³ã¨ã¯ï¼</a><ul>
<li><a href="#ã·ãªã¼ãºåªå">â ã·ãªã¼ãºåªå</a></li>
<li><a href="#試åã«åã¤">â¡è©¦åã«åã¤</a></li>
<li><a href="#ãã¼ã ã©ã³ãããããæã£ã¦ç¹ãåã">â¢ãã¼ã ã©ã³ãããããæã£ã¦ç¹ãåã</a></li>
<li><a href="#æå¸ã«ç«ã£ã¦ããããæ¯ã">â£æå¸ã«ç«ã£ã¦ããããæ¯ã</a></li>
<li><a href="#ç·´ç¿ãã¦ãã¼ã ã®ä¿¡é ¼ãå¾ã">â¤ç·´ç¿ãã¦ãã¼ã ã®ä¿¡é ¼ãå¾ã</a></li>
</ul>
</li>
<li><a href="#ãªããã®æ¹æ³ãæå¼·ãªã®ã誰ãæå¼·ã¨è¨ã£ã¦ãªãw">ãªããã®æ¹æ³ãæå¼·ãªã®ãï¼èª°ãæå¼·ã¨è¨ã£ã¦ãªãwï¼</a></li>
<li><a href="#ã¾ã¨ã">ã¾ã¨ã</a></li>
<li><a href="#We-are-hiring">We are hiring!</a></li>
</ul>
<h3 id="ã¯ããã«">ã¯ããã«</h3>
<p>çãããä»å¹´ã®12/5ã6ã«éå¬ãããæ¥æ¬æ大ç´ã®ãããã¯ãããã¼ã¸ã£ã¼ã®ç¥å
¸ãpmconf2024ãåå ãããã§ããããï¼ãã¡ããããã¾ããããï¼
ä»å¹´ã¯å²ä¸åã®2 Dayséå¬ã¨ãªããç§ã¯ä¸»ã«1æ¥ç®ã®ãªã³ã©ã¤ã³ã»ãã·ã§ã³ã«åå ãã¦ãã¾ãã<a href="#f-12a6680c" id="fn-12a6680c" name="fn-12a6680c" title="ã¿ã¤ãã¼å±±å£ããã®åºèª¿è¬æ¼ããLinkedinæ½æ ¹åããã®ã»ãã·ã§ã³ãæ¬å½ã«ç´ æ´ããããåå¼·ã«ãªãã¾ããï¼ä»ããã»ãã·ã§ã³åç»ã®å
¬éã楽ãã¿ã§ãã">*3</a>ã
éå¶ã®çãããç»å£è
ã®çãããåå è
ã®çãããæ¬å½ã«ãç²ããã¾ã§ããã
ä»åã¯åå è
ãã¼ãºã®èªã¿ãçãããã£ããå
¬åã«è½ã¡ã¦ãã¾ã£ã<a href="#f-40fed5f3" id="fn-40fed5f3" name="fn-40fed5f3" title="ãã£ããéå¶ã審æ»ãã¦ããã¨ãã証æ ã¨æãã¾ãï¼">*4</a>ã®ã§ãæ°ãåãç´ãã¦ä¹
ãã¶ãã®åå è
ã¨ãã¦ã®åå ã«ãªãã¾ããã</p>
<p>ããããªãã¯ãã§ããï¼ç¬ï¼ã</p>
<p>ã¨ããã®ãããªãã¨éå¬10æ¥åã®11/25ã«ã¯ã©ã¤ã¹&ã«ã³ããã¼ã®æ¾æ°¸ãããããé£çµ¡é ããæä¾ã®Discordã¤ãã³ãã¸ã®ç»å£ãªãã¡ã¼ã<a href="#f-ff1eaa91" id="fn-ff1eaa91" name="fn-ff1eaa91" title="ãã¡ãããæ°ã¶æåã«ããã£ããåå ãã¦ãããã¾ããããã¨ããæ診ã¯é ãã¦ããã¾ãããã¯ã©ã¤ã¹&amp;ã«ã³ããã¼ã®æ¾æ°¸ãããå±±æ¬ãããã声ãããããã¨ããããã¾ããã">*5</a>ï¼
ã¨ãããã¨ã§æ¥é½ãããããã¯ãããã¼ã¸ã£ã¼ã«ã¨ã£ã¦ã®ãã¼ã ã©ã³ã¨ã¯ï¼(ä»®é¡)ãã¨ããè°é¡ã§ãã¯ã©ã¤ã¹&ã«ã³ããã¼ãããéå¶ãã¦ãã人æ°ã®PodcastãPMãã£ãªã¢ã©ã¸ãªã®å
¬éã»ãã·ã§ã³ãè¡ããã¨ã«ãªãã¾ããã</p>
<p>ã¯ã©ã¤ã¹&ã«ã³ããã¼ãããéå¶ãã¦ãã人æ°ã®Podcastããããã¯ãããã¼ã¸ã£ã¼ã®ãã£ãªã¢ã©ã¸ãª<a href="#f-7286913d" id="fn-7286913d" name="fn-7286913d" title="https://open.spotify.com/show/2BDUeF54OrvyAL9adfqZrD?si=6dc92491b21b4760">*6</a>ã«ã¤ãã¦ã¯ãéå»ä½åº¦ãåºæ¼ããã¦ããã£ã¦ããã®ã§ãããã£ããä¸è¨ãèãã¦ã¿ã¦ãã ããã</p>
<p><iframe style="border-radius: 12px" width="100%" height="352" title="Spotify Embed: ãããã¯ããªã¼ãã¼ã®å±¥æ´æ¸" frameborder="0" allowfullscreen allow="autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture" loading="lazy" src="https://open.spotify.com/embed/playlist/5pV5dOMJ92cUkWxkVwkl8y?utm_source=oembed"></iframe><cite class="hatena-citation"><a href="https://open.spotify.com/playlist/5pV5dOMJ92cUkWxkVwkl8y?si=I5t0bxjFSHaCvI8zHzmyrA">open.spotify.com</a></cite></p>
<p>ã¡ãªã¿ã«pmconf2023ã§æ¥å ´è
ã¢ã³ã±ã¼ãæºè¶³åº¦1ä½ã¿ã¤ã ã£ãããããæ¨å¹´ã®ç§ã®ç»å£ã¯ãã¡ãã§ã^^ããã¡ããããã£ããã覧ãã ããã</p>
<p><iframe width="560" height="315" src="https://www.youtube.com/embed/BCt10qefqlw?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen title="ãããã¯ãã¨äºæ¥ãç¡éã«ã¹ã±ã¼ã«ããããã®æå¼·ã®ãã¼ããããã®ä½ãæ¹ - #pmconf2023"></iframe><cite class="hatena-citation"><a href="https://youtu.be/BCt10qefqlw?si=tO9Q_OUsxMWPmw8h">youtu.be</a></cite></p>
<h3 id="ãããã¯ãããã¼ã¸ã£ã¼ã«ã¨ã£ã¦ã®ãã¼ã ã©ã³ã¨ã¯">ãããã¯ãããã¼ã¸ã£ã¼ã«ã¨ã£ã¦ã®ãã¼ã ã©ã³ã¨ã¯ï¼</h3>
<p>ãã¦ãæ¬é¡ã§ãããã¨ã®çºç«¯ã¨ãã¦ã¯ãã¯ã©ã¤ã¹&ã«ã³ããã¼ã®æ¾æ°¸ãã<a href="#f-2e207a12" id="fn-2e207a12" name="fn-2e207a12" title="https://x.com/kandc_matsunaga">*7</a>ãã以ä¸ã®ä¼ç»æ¡ãé ãã¾ããã</p>
<blockquote><p>ãããããããã°ãã³ã³ãã³ãã¨ãã¦ã¯ãããããã¯ãããã¼ã¸ã£ã¼ã«ã¨ã£ã¦ã®ãã¼ã ã©ã³ã¨ã¯ï¼(ä»®é¡)ãã¨ãããããªå½¢ã§èãã¦ãã¾ãã
å±±å´ããã®è¨äºãç»å£ã§ä½¿ããã¦ããè¨èã¯PMçéã«æµ¸éãã¦ããã¨æã£ã¦ãããæ¹ãã¦ããã¼ã ã©ã³ãæã¤ããæå¸ã«ç«ã¤ããªã©ã®PMæµè¡èª(ï¼)ãä½ã£ãå±±å´ãããæ¬äººãããã¨ãã¨ã®è¨èã®å®ç¾©ãªã©ãã話ãããã ããããã©ãããã°ãã¼ã ã©ã³ããã¿ã¼ã«ãªããã®ããªã©ã話ãããã ããããªã¨ï¼
ãã£ã¨ããããå
容ã®æ¹ãããªã©ãè¦ææãã°ãã²ãç¥ãããã ããã
ãæ¤è¨ã®ã»ã©ãä½åãããããé¡ãè´ãã¾ãï¼</p></blockquote>
<p>確ãã«ããã ããªãã¨æãã¤ã¤ä½ã話ãããèãã¦ãã£ãã®ã§ãããçµè«ã¨ãã¦ã¯ããçµè«ãã話ãã®ãè¯ãããã ãã¨æãè³ããå½æ¥ãã¯ã©ã¤ã¹&ã«ã³ããã¼ã®å±±æ¬ãã<a href="#f-2ca01c1f" id="fn-2ca01c1f" name="fn-2ca01c1f" title="https://x.com/kreis_yamamoto">*8</a>ããã®ãã¾ãæå¸ã¨ã¯ï¼ãã¨ããä¸å¯§ãªã¨ã¹ã³ã¼ããã¡ãã¶å°è¿ããã¦ããããããç®çã¯ã·ãªã¼ãºåªåã§ãããªãã¦ããã¨ãã§ããªãè¿çã«ãªã£ã次第ã§ãã</p>
<p>å½æ¥ãåå ãããªãã£ãæ¹ã®ããã«è£è¶³ããã¨ãã¾ãæ大ã®ç®çã¯ï¼éçã§ä¾ããã¨ï¼â ã·ãªã¼ãºåªå<a href="#f-6149afc2" id="fn-6149afc2" name="fn-6149afc2" title="ãã£ã¨è¨ãã°10å¹´ã20å¹´ã·ãªã¼ãºåªåãç¶ãããã¨ããªã¨æãã¾ãã">*9</a>ã§ããããã®ããã«ã¯â¡è©¦åã«åã¤å¿
è¦ãããããã®ããã«ã¯â¢ãã¼ã ã©ã³ãããããæã£ã¦ç¹ãåãå¿
è¦ãããããã®ããã«ã¯â£æå¸ã«ç«ã£ã¦ããããæ¯ãå¿
è¦ãããããã®ããã«ã¯â¤ç·´ç¿ãã¦ãã¼ã ã®ä¿¡é ¼ãå¾ãå¿
è¦ãããã¨ãããã¨ãªããããªãããã¨ããã®ãä»ã®ã¨ããã®ç§ã®èãã§ãã以ä¸ãå½æ¥ã®æµãã«æ²¿ã£ã¦ãè£è¶³ããªããç°¡åã«æ¯ãè¿ãã¾ãã</p>
<h4 id="ã·ãªã¼ãºåªå">â ã·ãªã¼ãºåªå</h4>
<p>ã·ãªã¼ãºåªåã¨ã¯ãä¼æ¥ã顧客ããé«ãè©ä¾¡ãããååãªåçãä¸ãã£ã¦ããç¶æ
ã§ãã
å
¨ã¦ã®ãããã¯ãããã¸ã¡ã³ãã¯ããã®ããã®æ¹æ³è«ã«éãã¾ããã
çæçãªåçã§ã¯ãªãããããã¯ãã«æ¯ããããç¤ç³ãªåçããä¼æ¥ã«é·æçãªåçãããããã¾ãã</p>
<p>ã»ããã ãã ãã·ãªã¼ãºåªåãããã¼ã ã顧客ã«åã°ãã¦ãã姿ãæãæµ®ããã§ãã¾ããããï¼</p>
<p>横éããã翻訳æ
å½ããã11æ販売éå§ã¨ãªã£ããã¼ãã£ã»ã±ã¤ã¬ã³ã®ææ°åãTRANSFORMEDãã§ããããã¯ãã»ãªãã¬ã¼ãã£ã³ã°ã»ã¢ãã«ãããããã®ä¼æ¥ã«å¤§ããªåçãããããå¯è½æ§ã示ãã¦ãã¾ãã</p>
<p><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/dp/B0DJGL9CS2?tag=hatena-22&linkCode=ogi&th=1&psc=1" class="hatena-asin-detail-image-link" target="_blank" rel="sponsored noopener"><img src="https://m.media-amazon.com/images/I/51Hf1YackeL._SL500_.jpg" class="hatena-asin-detail-image" alt="TRANSFORMEDãã¤ããã¼ã·ã§ã³ãèµ·ããçã®ï¼¤ï¼¸ã¸ã¨å°ããããã¯ãã¢ãã«" title="TRANSFORMEDãã¤ããã¼ã·ã§ã³ãèµ·ããçã®ï¼¤ï¼¸ã¸ã¨å°ããããã¯ãã¢ãã«"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/dp/B0DJGL9CS2?tag=hatena-22&linkCode=ogi&th=1&psc=1" target="_blank" rel="sponsored noopener">TRANSFORMEDãã¤ããã¼ã·ã§ã³ãèµ·ããçã®ï¼¤ï¼¸ã¸ã¨å°ããããã¯ãã¢ãã«</a></p><ul class="hatena-asin-detail-meta"><li><span class="hatena-asin-detail-label">ä½è
:</span><a href="https://d.hatena.ne.jp/keyword/%A5%DE%A1%BC%A5%C6%A5%A3%A1%A6%A5%B1%A1%BC%A5%AC%A5%F3" class="keyword">ãã¼ãã£ã»ã±ã¼ã¬ã³</a></li><li>æ¥æ¬è½çåä¼ããã¸ã¡ã³ãã»ã³ã¿ã¼</li></ul><a href="https://www.amazon.co.jp/dp/B0DJGL9CS2?tag=hatena-22&linkCode=ogi&th=1&psc=1" class="asin-detail-buy" target="_blank" rel="sponsored noopener">Amazon</a></div></div></p>
<h4 id="試åã«åã¤">â¡è©¦åã«åã¤</h4>
<p>ã·ãªã¼ãºåªåããããã«ã¯ã試åã§åããªãã¦ã¯ãªãã¾ãããå°ãªãã¨ã競åä¼æ¥ããã試åã«åã¤å¿
è¦ãããã¾ãã
試åã«åã¤ã¨ã¯ãä¸ã¤ã®ãããã¯ãããµã¼ãã¹ã顧客ããé«ãè©ä¾¡ãããååãªåçãä¸ãã£ã¦ããç¶æ
ã§ãã
å
¨ã¦ã®ãããã¯ãããã¸ã¡ã³ãã¯ããã®ããã®æ¹æ³è«ã«éããªãã¨ãè¨ãããã§ãã</p>
<p>試åã«åã¤ç¢ºçãåæ°ãå¤ããã°å¤ãã»ã©ãã·ãªã¼ãºåªåã«è¿ã¥ãã¾ãã</p>
<p>ãã®ä¼æ¥ã§æä¾ãã¦ãããããã¯ãããµã¼ãã¹ã®å¤ãã顧客ããé«ãè©ä¾¡ãããååãªåçãä¸ãã£ã¦ããã°ããã®ä¼æ¥ã顧客ããé«ãè©ä¾¡ãããååãªåçãä¸ããã¨ããã®ã¯å½ããåã¨ããã°å½ããåã§ããã<a href="#f-dbb1dbcf" id="fn-dbb1dbcf" name="fn-dbb1dbcf" title="ãã¡ããã大ããªä¸ç¥¥äºãã¹ã³ã³ãã©ã¤ã¢ã³ã¹éåããªããã¨ããåæã§ãã">*10</a>ã</p>
<h4 id="ãã¼ã ã©ã³ãããããæã£ã¦ç¹ãåã">â¢ãã¼ã ã©ã³ãããããæã£ã¦ç¹ãåã</h4>
<p>試åã«åã¤ããã«ã¯ããã¼ã ã©ã³ãããããæã£ã¦ç¹ãåããªããã°ãªãã¾ãããå°ãªãã¨ã競åãµã¼ãã¹ãããç¹ãåãå¿
è¦ãããã¾ãã
ãã¼ã ã©ã³ãããããæã£ã¦ç¹ãåãã¨ã¯ãä¸ã¤ã®ãããã¯ãããµã¼ãã¹ã®æ©è½ãä»æ§ã顧客ããé«ãè©ä¾¡ãããååãªåçãä¸ãã£ã¦ããç¶æ
ã§ãã
ããã¾ããå
¨ã¦ã®ãããã¯ãããã¸ã¡ã³ãã¯ããã®ããã®æ¹æ³è«ã«éããªãã¨ãè¨ããããç¥ãã¾ããã</p>
<p>ãã¼ã ã©ã³ãããããæã£ã¦ç¹ãåã確çãåæ°ãå¤ããã°å¤ãã»ã©ã試åã«åã¤ãã¨ã«è¿ã¥ãã¾ãã</p>
<p>ã¡ãªã¿ã«ããã¼ã ã©ã³ãããããæã£ã¦ç¹ãåã確çãåæ°ã¯ããã®è£ã«ãããããã¯ãã®ä¸ç観ã«å¤§ããé¢é£ãã¦ãã¾ãã
ãã®ãããã¯ãã®ä¸ç観ã顧客ã«é
åçã§ãæ¡å¼µå¯è½ã§ããå ´åãããããå¤ãã®ãã¼ã ã©ã³ãããããçã¾ããå¯è½æ§ãé«ã¾ãã¾ãã
æ¬ä»¶ã«ã¤ãã¦ã¯ãããã ãã§ããã°1æ¬ãããããªã®ã§ãã¾ãå¥ã®æ©ä¼ã§è©³ãã解説ãããã¨æãã¾ã<a href="#f-a8849d48" id="fn-a8849d48" name="fn-a8849d48" title="ãã®ããã«ããXã®ãã¹ããã³ã¡ã³ãããããããé¡ããã¾ãw">*11</a>ã</p>
<h4 id="æå¸ã«ç«ã£ã¦ããããæ¯ã">â£æå¸ã«ç«ã£ã¦ããããæ¯ã</h4>
<p>ãã¼ã ã©ã³ãããããæã£ã¦ç¹ãåãããã«ã¯ãæå¸ã«ç«ã£ã¦ããããæ¯ããã°ãªãã¾ããã
æå¸ã«ç«ã£ã¦ããããæ¯ãã¨ã¯ããããã¯ãããµã¼ãã¹ã®ä¸ã¤ä¸ã¤ã®æ©è½ãä»æ§ãä»»ãã¦ããããã¨ããç¶æ
ã§ãã
ããã¾ã§æ¥ãã¨ãããã¯ãããã¸ã¡ã³ãã®ä¸ã¤ä¸ã¤ã®ãã¯ããã¯ãã®ãã®ã«ãªã£ã¦ãã¾ããããã</p>
<p>ãããã¯ãããµã¼ãã¹ã®ä¸ã¤ä¸ã¤ã®æ©è½ãä»æ§ãä»»ãã¦ãããããªãã§ãèªåãå®éã«ãã¼ã ã©ã³ãããããæã¦ãããã«ãªã£ã¦ããã®ã§ãã</p>
<p>ãã®ã¨ããéé²ã«ããããæ¯ã£ãã¨ãã¦ããå¹ççã«ãã¼ã ã©ã³ãããããæã¦ãããã«ãªãã¨ã¯éããªããã¨ã«æ³¨æãå¿
è¦ã§ãã
ã¨ããã®ããå¹ççã«ãã¼ã ã©ã³ãããããæã¦ãããã«ãªãããã«ã¯ãæåãã¦ããå
輩PdMã®å§¿ãè¦ã¦ãã¾ãã¯è©±ãèãã¦ãèªåèªèº«ããã¼ã ã©ã³ãããããæã¦ãããã«ãªãå¯è½æ§ãé«ãããã§ãã
æ¬ä»¶ã«ã¤ãã¦ã¯ãä¸äººã§æ¯ã£ã¦ããã»ãã大äºãªã®ã§ã¯ï¼ãªã©ãè³å¦ä¸¡è«ããã¨æãã¾ãã®ã§ããã¡ããã³ã¡ã³ãããæè¦é ããã¨å¬ããã§ãã</p>
<h4 id="ç·´ç¿ãã¦ãã¼ã ã®ä¿¡é ¼ãå¾ã">â¤ç·´ç¿ãã¦ãã¼ã ã®ä¿¡é ¼ãå¾ã</h4>
<p>æå¸ã«ç«ã£ã¦ããããæ¯ãããã«ã¯ãç·´ç¿ãã¦ãã¼ã ã®ä¿¡é ¼ãå¾ãå¿
è¦ãããã¾ãã
ç·´ç¿ãã¦ãã¼ã ã®ä¿¡é ¼ãå¾ãã¨ã¯ããããã¯ããã¼ã ããããããã¯ãããµã¼ãã¹ã®ä¸ã¤ä¸ã¤ã®æ©è½ãä»æ§ãä»»ãã¦ã大ä¸å¤«ã ã¨èªèãã¦ããããã¨ã§ãã
ä»åº¦ã¯ãããã¯ããã¼ã ã®ä¸ã§ã®ä¿¡é ¼é¢ä¿ã®è©±ã«ãªã£ã¦ãã¾ãããã</p>
<p>å®ã¯ãããããããã¯ãããã¼ã¸ã£ã¼ã«ã¨ã£ã¦ç©¶æ¥µçã«éè¦ã§ãã
ããã¦ãã¸ã¥ãã¢ã®ãããã¯ãããã¼ã¸ã£ã¼ã«ã¨ã£ã¦ãæãå°é£ãªãã¼ãã«ã¨ãè¨ããããç¥ãã¾ããã</p>
<p>ã¨ããã®ãããããã¯ãã®æå=試åã«åã¦ãããã·ãªã¼ãºåªåã§ãããã¯ããããã¯ããã¼ã å
¨å¡ã®ãã£ãªã¢ãå·¦å³ããå¯è½æ§ãããã¾ãã
ãã®ããã«ã¯æå¸ã¯è²´éã§ãããå¯è½ã§ããã°ç¢ºå®ã«ç¹ãåããé¸æãæå¸ã«ç«ããããã¨ãããã¼ã ã®æ³ããããããã§ãã
ãã®æå¾
ã«å¿ãããã¼ã ã®ä¿¡é ¼ãå¾ãããã«ã¯ãã¼ã å
ã§ã®çºè¨ãææ決å®ã®éãï¼=精度ï¼ãå
¨ã¦ãå·¦å³ããã¨è¨ã£ã¦ãéè¨ã§ã¯ããã¾ããã</p>
<p>ç¾å®åé¡ã¨ãã¦ãããããè² ããããªãã®ã§ããããããããã¯ãããã¼ã¸ã£ã¼ã¯ãããªã¹ã¦ããããç解ãã¦ããã¹ãã§ãã</p>
<h3 id="ãªããã®æ¹æ³ãæå¼·ãªã®ã誰ãæå¼·ã¨è¨ã£ã¦ãªãw">ãªããã®æ¹æ³ãæå¼·ãªã®ãï¼èª°ãæå¼·ã¨è¨ã£ã¦ãªãwï¼</h3>
<p>å®ã¯ããããã®è©±ã¯ããããã¯ãããã¼ã¸ã£ã¼ã«éã£ããã¨ã§ã¯ããã¾ããã
ã¨ã³ã¸ãã¢ã§ãããã¶ã¤ãã¼ã§ãåãã§ãã
ãããããããã¼ã±ã¿ã¼ãã»ã¼ã«ã¹ãã«ã¹ã¿ãã¼ãµã¯ã»ã¹ã§ãåãããç¥ãã¾ããã
ã·ã³ãã«ã§ããããããããã¤ãããã¯ããã¼ã ã®å
¨ã¦ã®è·ç¨®ã«å¯¾ãã¦å¿ç¨ç¯å²ãåºããã¨ãæå¼·ããæ以ã§ãã</p>
<p>è¦ã¯ãæ®æ®µã®ä»äºã®ç´°é¨ã§å
ãææ決å®ã®éããè¦ãããã大ããªãã£ã³ã¹ãåã¡åããããã§ææãåºãã¦ããã«ä¿¡é ¼ãå¾ããã¨ããã©ãã©ã大ãããªã£ã¦ãããµã¤ã¯ã«ããçµæçã«çµç¹çã«ã大ããªææã«ã¤ãªãããã¨ããã·ã³ãã«ãªåå©ã®æ³åã¯ãã¸ãã¹çã«æå¼·ã¨ããã°æå¼·ã§ãããã</p>
<p>ç¹ã«ãã¨ã³ã¸ãã¢ã«ç·´ç¿ãå¿
è¦ã ãã¨ãã話ã«ã¤ãã¦ã¯ã以ä¸ã®ãæ
ç±ããã°ã©ãã¼ãã¨ããæ¬ã«è©³ããã®ã§ãæ¯éã¨ã³ã¸ãã¢åºèº«ã®ãããã¯ãããã¼ã¸ã£ã¼ã¯ä¸åº¦èªãã§ã¿ããã¨ããªã¹ã¹ã¡ãã¾ã<a href="#f-d08e14f3" id="fn-d08e14f3" name="fn-d08e14f3" title="æ
ç±ããã°ã©ãã¼ã15. ä¸ã«ç·´ç¿ãäºã«ç·´ç¿ããåç
§ã®ãã¨ã">*12</a>ã</p>
<p><div class="hatena-asin-detail"><a href="https://www.amazon.co.jp/dp/B01IGW5MQ0?tag=hatena-22&linkCode=ogi&th=1&psc=1" class="hatena-asin-detail-image-link" target="_blank" rel="sponsored noopener"><img src="https://m.media-amazon.com/images/I/61K3lgxqKGL._SL500_.jpg" class="hatena-asin-detail-image" alt="æ
ç±ããã°ã©ãã¼ ã½ããã¦ã§ã¢éçºè
ã®å¹¸ããªçãæ¹" title="æ
ç±ããã°ã©ãã¼ ã½ããã¦ã§ã¢éçºè
ã®å¹¸ããªçãæ¹"></a><div class="hatena-asin-detail-info"><p class="hatena-asin-detail-title"><a href="https://www.amazon.co.jp/dp/B01IGW5MQ0?tag=hatena-22&linkCode=ogi&th=1&psc=1" target="_blank" rel="sponsored noopener">æ
ç±ããã°ã©ãã¼ ã½ããã¦ã§ã¢éçºè
ã®å¹¸ããªçãæ¹</a></p><ul class="hatena-asin-detail-meta"><li><span class="hatena-asin-detail-label">ä½è
:</span><a href="https://d.hatena.ne.jp/keyword/%A3%C3%A3%E8%A3%E1%A3%E4%A3%C6%A3%EF%A3%F7%A3%EC%A3%E5%A3%F2" class="keyword">ï¼£ï½ï½ï½ï¼¦ï½ï½ï½ï½
ï½</a>,<a href="https://d.hatena.ne.jp/keyword/%A4%C7%A4%D3%A4%A2%A4%F3%A4%B0%A4%EB" class="keyword">ã§ã³ãããã</a></li><li>ãªã¼ã 社</li></ul><a href="https://www.amazon.co.jp/dp/B01IGW5MQ0?tag=hatena-22&linkCode=ogi&th=1&psc=1" class="asin-detail-buy" target="_blank" rel="sponsored noopener">Amazon</a></div></div></p>
<h3 id="ã¾ã¨ã">ã¾ã¨ã</h3>
<p>ãããã ã£ãã§ããããï¼</p>
<p>ãããã¯ãããã¼ã¸ã£ã¼ Advent Calendar 2024ã®ãã¿ã¨ãã¦ä½ãæ¸ãããè²ã
ã¨è¿·ã£ãã®ã§ãããä»åã¯ããpmconf 2024ãã¯ã©ã¤ã¹&ã«ã³ããã¼ã®Discordä¼ç»æ¯ãè¿ãï¼ãããã¯ãããã¼ã¸ã£ã¼ã«ã¨ã£ã¦ã®ãã¼ã ã©ã³ã¨ã¯ï¼ãã¨ç¬¬ãã¦ããã°è¨äºã¨ãã¦ã¾ã¨ãã¦ã¿ã¾ããã
å½æ¥ãå¤ãã®æ¹ã«pmconf2024ã®ã¯ã©ã¤ã¹&ã«ã³ããã¼ã®Discordä¼ç»ã«åå é ãã¾ãããããã®å
容ãæ¹ãã¦çããã«ãä¼ãã§ãã¦è¯ãã£ãã§ãã</p>
<p>åé¿ãããã°ãã¯ã©ã¤ã¹&ã«ã³ããã¼ããã®ãããã¯ãããã¼ã¸ã£ã¼ã®ãã£ãªã¢ã©ã¸ãªãè¨äºãªã©ã§ãã詳ãã話ãåãä¸ãã¦ããããå¯è½æ§ãããã¨ããªãã¨ã<a href="#f-1061d9d2" id="fn-1061d9d2" name="fn-1061d9d2" title="ã¯ã©ã¤ã¹&amp;ã«ã³ããã¼ã®æ¾æ°¸ãããå±±æ¬ãããæ¯éãããããé¡ããã¾ãwã">*13</a>èãã¦ãã¾ãã®ã§ãæ¯éãã¯ã¦ã¶ãXã§ææ³ãªã©ãã¹ãé ããã°å¹¸ãã§ãã
ãããã¯ãéçºã§ä¸çãå¤ãããã¨ãã¦ããèªè
ã®çããã«ãå°ãã§ãåèã«ãªãã°å¹¸ãã§ãã<a href="https://twitter.com/yamamuteking">@yamamuteking</a>ã®ãã©ãã¼ããå¿ããªãã</p>
<p>ã¨ãããã¨ã§ãä»å¹´ããã¨åæã¡ãã£ã¨ã¨ãªãã¾ãããç§ãã¾ã ã¾ã å¹´å
ã®ä»äºãã¦ããçãã§ãããé å¼µã£ã¦æ¶åãã¦ããã¾ãããwã</p>
<p><figure class="figure-image figure-image-fotolife" title="å¬ãã£ã³ããæ°æã¡ã®è¯ãå£ç¯ã«ãªãã¾ããããæ°ã«å
¥ãã®æ¸©åº¦è¨ã¯ThermoProã®å®¤å
室å¤åæ表示ã®ãã¤ã¨ãSwitchBotã®å±å¤ç¨æ¸©åº¦è¨ãåè
ã¯ãã£ã³ãä¸ã«ã¹ãããè¦ãå¿
è¦ããªãã®ãç¹å¾´ã§ãå¾è
ã¯ãã°ãå
¨é¨ã¹ããã«è»¢éã§ããã®ãç¹å¾´ã"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241213/20241213204439.jpg" width="800" height="600" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>å¬ãã£ã³ããæ°æã¡ã®è¯ãå£ç¯ã«ãªãã¾ããããæ°ã«å
¥ãã®æ¸©åº¦è¨ã¯ThermoProã®å®¤å
室å¤åæ表示ã®ãã¤ã¨ãSwitchBotã®å±å¤ç¨æ¸©åº¦è¨ãåè
ã¯ãã£ã³ãä¸ã«ã¹ãããè¦ãå¿
è¦ããªãã®ãç¹å¾´ã§ãå¾è
ã¯ãã°ãå
¨é¨ã¹ããã«è»¢éã§ããã®ãç¹å¾´ã</figcaption></figure></p>
<h3 id="We-are-hiring">We are hiring!</h3>
<p>ã¨ã ã¹ãªã¼ã§ã¯ãå¤æ°ã®ãã£ã¬ã³ã¸ã«ææ¢ã«ã¢ã¿ãã¯ããåã¨æãå
¼ãåããã¨ã³ã¸ãã¢ãQAããã¶ã¤ãã¼ããããã¯ãããã¼ã¸ã£ã¼ã絶è³åéä¸ã§ãã</p>
<p>ç¹ã«ãããã¯ãããã¼ã¸ã£ã¼ã«ã¨ã£ã¦ã¯æå¸æ°ãå¤ãããããã¯ãããã¸ã¡ã³ãã®åºç¤ç¥èãç¿å¾ããªããã社ä¼ã«ã¤ã³ãã¯ãã®ããåçæ§ã®é«ããããã¯ããéçºããçµé¨ããã¼ã ã©ã³ã®æã¡æ¹ãå¦ã¹ããå¦ã¹ãè¯ãç°å¢ã ã¨æãã¾ãã</p>
<p>ã¾ããè
ã«è¦ãã®ããã½ããã¦ã§ã¢ã¨ã³ã¸ãã¢ãQAããããã¯ããã¶ã¤ãã¼ã®æ¹ããã®å¿åã絶è³åéä¸ã§ãï¼</p>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjobs.m3.com%2Fproduct%2F" title="M3, Inc. The Power of Medical Innovation Better Life, Better Togetherï½ã¨ã ã¹ãªã¼æ ªå¼ä¼ç¤¾" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jobs.m3.com/product/">jobs.m3.com</a></cite></p>
<div class="footnote">
<p class="footnote"><a href="#fn-929e7fb9" id="f-929e7fb9" name="f-929e7fb9" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">ULã¨ã¯Ultra Lightã®çç¥ã§è¶
軽éè£
åã§ãã£ã³ããç»å±±ãªã©ã楽ããã¸ã£ã³ã«ã§ãã</span></p>
<p class="footnote"><a href="#fn-c38afab8" id="f-c38afab8" name="f-c38afab8" class="footnote-number">*2</a><span class="footnote-delimiter">:</span><span class="footnote-text">ããææ¥ç¨äºãããã®ã§3æéæ©ãã§ããããã©ã¤ã³ã°ãªãªã¼ã¹ããã¦é ãã¾ããã</span></p>
<p class="footnote"><a href="#fn-12a6680c" id="f-12a6680c" name="f-12a6680c" class="footnote-number">*3</a><span class="footnote-delimiter">:</span><span class="footnote-text">ã¿ã¤ãã¼å±±å£ããã®åºèª¿è¬æ¼ããLinkedinæ½æ ¹åããã®ã»ãã·ã§ã³ãæ¬å½ã«ç´ æ´ããããåå¼·ã«ãªãã¾ããï¼ä»ããã»ãã·ã§ã³åç»ã®å
¬éã楽ãã¿ã§ãã</span></p>
<p class="footnote"><a href="#fn-40fed5f3" id="f-40fed5f3" name="f-40fed5f3" class="footnote-number">*4</a><span class="footnote-delimiter">:</span><span class="footnote-text">ãã£ããéå¶ã審æ»ãã¦ããã¨ãã証æ ã¨æãã¾ãï¼</span></p>
<p class="footnote"><a href="#fn-ff1eaa91" id="f-ff1eaa91" name="f-ff1eaa91" class="footnote-number">*5</a><span class="footnote-delimiter">:</span><span class="footnote-text">ãã¡ãããæ°ã¶æåã«ããã£ããåå ãã¦ãããã¾ããããã¨ããæ診ã¯é ãã¦ããã¾ãããã¯ã©ã¤ã¹&ã«ã³ããã¼ã®æ¾æ°¸ãããå±±æ¬ãããã声ãããããã¨ããããã¾ããã</span></p>
<p class="footnote"><a href="#fn-7286913d" id="f-7286913d" name="f-7286913d" class="footnote-number">*6</a><span class="footnote-delimiter">:</span><span class="footnote-text"><a href="https://open.spotify.com/show/2BDUeF54OrvyAL9adfqZrD?si=6dc92491b21b4760">https://open.spotify.com/show/2BDUeF54OrvyAL9adfqZrD?si=6dc92491b21b4760</a></span></p>
<p class="footnote"><a href="#fn-2e207a12" id="f-2e207a12" name="f-2e207a12" class="footnote-number">*7</a><span class="footnote-delimiter">:</span><span class="footnote-text"><a href="https://x.com/kandc_matsunaga">https://x.com/kandc_matsunaga</a></span></p>
<p class="footnote"><a href="#fn-2ca01c1f" id="f-2ca01c1f" name="f-2ca01c1f" class="footnote-number">*8</a><span class="footnote-delimiter">:</span><span class="footnote-text"><a href="https://x.com/kreis_yamamoto">https://x.com/kreis_yamamoto</a></span></p>
<p class="footnote"><a href="#fn-6149afc2" id="f-6149afc2" name="f-6149afc2" class="footnote-number">*9</a><span class="footnote-delimiter">:</span><span class="footnote-text">ãã£ã¨è¨ãã°10å¹´ã20å¹´ã·ãªã¼ãºåªåãç¶ãããã¨ããªã¨æãã¾ãã</span></p>
<p class="footnote"><a href="#fn-dbb1dbcf" id="f-dbb1dbcf" name="f-dbb1dbcf" class="footnote-number">*10</a><span class="footnote-delimiter">:</span><span class="footnote-text">ãã¡ããã大ããªä¸ç¥¥äºãã¹ã³ã³ãã©ã¤ã¢ã³ã¹éåããªããã¨ããåæã§ãã</span></p>
<p class="footnote"><a href="#fn-a8849d48" id="f-a8849d48" name="f-a8849d48" class="footnote-number">*11</a><span class="footnote-delimiter">:</span><span class="footnote-text">ãã®ããã«ããXã®ãã¹ããã³ã¡ã³ãããããããé¡ããã¾ãw</span></p>
<p class="footnote"><a href="#fn-d08e14f3" id="f-d08e14f3" name="f-d08e14f3" class="footnote-number">*12</a><span class="footnote-delimiter">:</span><span class="footnote-text">æ
ç±ããã°ã©ãã¼ã15. ä¸ã«ç·´ç¿ãäºã«ç·´ç¿ããåç
§ã®ãã¨ã</span></p>
<p class="footnote"><a href="#fn-1061d9d2" id="f-1061d9d2" name="f-1061d9d2" class="footnote-number">*13</a><span class="footnote-delimiter">:</span><span class="footnote-text">ã¯ã©ã¤ã¹&ã«ã³ããã¼ã®æ¾æ°¸ãããå±±æ¬ãããæ¯éãããããé¡ããã¾ãwã</span></p>
</div>
yamazaki-m3
gitã¬ãã¸ããªèå¤å¦ã«ä½¿ãéå
·
hatenablog://entry/6802418398310878092
2024-12-13T11:00:00+09:00
2024-12-13T11:00:03+09:00 ãã¡ãã¯ã¨ã ã¹ãªã¼Advent Calendar 2024 13æ¥ç®ã®è¨äºã§ãã ããã«ã¡ã¯ãã¨ã ã¹ãªã¼ã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ãã®ç¦æ (@fukubaya) ã§ãã ä»åã¯ãé·å¹´éç¨ããã¦ããã¬ãã¸ããªãgitã使ã£ã¦çºæããä¸ã§ä½¿ã£ã¦ããéå
·ãç´¹ä»ãã¾ãã ç¦å²¡ã¿ã¯ã¼ï¼ãµãããã¿ã¯ã¼ï¼ã¯ãç¦å²¡çç¦å²¡å¸æ©è¯åºã®ã·ã¼ãµã¤ãããã¡å°åºã«ããã©ã³ããã¼ã¯ã¿ã¯ã¼ï¼é»æ³¢å¡ï¼ãæ¬æã«ã¯é¢ä¿ããã¾ããã 帳票ç°å¢ ã¬ãã¸ããªããDBãã¼ãã«ã®ä½¿ç¨ç®æãæ¢ã ã¹ã±ã¸ã¥ã¼ã«è¨å®ã ãæ¶ããã gitã¬ãã¸ããªèå¤å¦ ãã¡ã¤ã«ãæ¶ããã³ããããç¥ããã ããè¨è¿°ãæ¶ãã(追å ããã)ã³ããããç¥ããã ãããã¼ãâ¦
<p>ãã¡ãã¯<a href="https://qiita.com/advent-calendar/2024/m3">ã¨ã ã¹ãªã¼Advent Calendar 2024</a> 13æ¥ç®ã®è¨äºã§ãã</p>
<p>ããã«ã¡ã¯ãã¨ã ã¹ãªã¼ã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ãã®ç¦æ (<a href="https://x.com/fukubaya">@fukubaya</a>) ã§ãã</p>
<p>ä»åã¯ãé·å¹´éç¨ããã¦ããã¬ãã¸ããªãgitã使ã£ã¦çºæããä¸ã§ä½¿ã£ã¦ããéå
·ãç´¹ä»ãã¾ãã</p>
<p><figure class="figure-image figure-image-fotolife" title="ç¦å²¡ã¿ã¯ã¼ï¼ãµãããã¿ã¯ã¼ï¼ã¯ãç¦å²¡çç¦å²¡å¸æ©è¯åºã®ã·ã¼ãµã¤ãããã¡å°åºã«ããã©ã³ããã¼ã¯ã¿ã¯ã¼ï¼é»æ³¢å¡ï¼ãæ¬æã«ã¯é¢ä¿ããã¾ããã"><span itemscope itemtype="http://schema.org/Photograph"><img src="https://cdn-ak.f.st-hatena.com/images/fotolife/m/m3tech/20241213/20241213110005.jpg" width="601" height="800" loading="lazy" title="" class="hatena-fotolife" itemprop="image"></span><figcaption>ç¦å²¡ã¿ã¯ã¼ï¼ãµãããã¿ã¯ã¼ï¼ã¯ãç¦å²¡çç¦å²¡å¸æ©è¯åºã®ã·ã¼ãµã¤ãããã¡å°åºã«ããã©ã³ããã¼ã¯ã¿ã¯ã¼ï¼é»æ³¢å¡ï¼ãæ¬æã«ã¯é¢ä¿ããã¾ããã</figcaption></figure></p>
<ul class="table-of-contents">
<li><a href="#帳票ç°å¢">帳票ç°å¢</a><ul>
<li><a href="#ã¬ãã¸ããªããDBãã¼ãã«ã®ä½¿ç¨ç®æãæ¢ã">ã¬ãã¸ããªããDBãã¼ãã«ã®ä½¿ç¨ç®æãæ¢ã</a></li>
<li><a href="#ã¹ã±ã¸ã¥ã¼ã«è¨å®ã ãæ¶ããã">ã¹ã±ã¸ã¥ã¼ã«è¨å®ã ãæ¶ããã</a></li>
</ul>
</li>
<li><a href="#gitã¬ãã¸ããªèå¤å¦">gitã¬ãã¸ããªèå¤å¦</a><ul>
<li><a href="#ãã¡ã¤ã«ãæ¶ããã³ããããç¥ããã">ãã¡ã¤ã«ãæ¶ããã³ããããç¥ããã</a></li>
<li><a href="#ããè¨è¿°ãæ¶ãã追å ãããã³ããããç¥ããã">ããè¨è¿°ãæ¶ãã(追å ããã)ã³ããããç¥ããã</a></li>
<li><a href="#ãããã¼ãã«ã使ããã¦ããããããæ¢ããã">ãããã¼ãã«ã使ããã¦ããããããæ¢ããã</a></li>
<li><a href="#大éã«git-grepããã">大éã«git grepããã</a></li>
<li><a href="#git-grepã®çµæãEUC-JPã§ãUTF-8ã§ãæ£ããæ¥æ¬èªãåºåãã">git grepã®çµæãEUC-JPã§ãUTF-8ã§ãæ£ããæ¥æ¬èªãåºåãã</a></li>
</ul>
</li>
<li><a href="#ã¾ã¨ã">ã¾ã¨ã</a></li>
<li><a href="#We-are-hiring">We are hiring!</a></li>
</ul>
<h2 id="帳票ç°å¢">帳票ç°å¢</h2>
<p>å¼ç¤¾ã«ã¯ã帳票ç°å¢ãã¨å¼ã°ãããå種ã¬ãã¼ããçæãããã調æ»ã®ããã®ç°å¢ãããã¾ãã
ç°¡åã«è¨ãã°m3.comã®æ¬çªãµã¼ãã¹ã®ãã¼ã¿ã®ã¬ããªã«DBã¨ããã®DBã®ãã¼ã¿ãåæããããã¬ãã¼ããå¥ã®ãµã¼ãã¹ã§ä½¿ãããã®ãã¼ã¿ãçæãããããã®å®è¡ç°å¢ã§ãã</p>
<p>é·å¹´éç¨ããã¦ããç°å¢ã§ããããªã³ãã¬ç°å¢ã§ç¶æã®ã³ã¹ããããããããå®è¡ç°å¢ã®ã¯ã©ã¦ã移è¡ãå«ãã¦ãªãã¬ã¤ã¹ãé²ãã¦ãã¾ãã
ãã®ä¸ã§ããã¬ããªã«DBã稼åãã¦ããHWã®ä¿å®ã2025年度æ«ã§åããã®ã§ããã®ã¿ã¤ãã³ã°ã¾ã§ã«DBã®ã¬ããªã«å
ãBigQueryã«ç§»è¡ãDBèªä½ãåæ¢ãããããããã®èª¿æ»ã移è¡ãå®æ½ãã¦ãã¾ãã</p>
<h3 id="ã¬ãã¸ããªããDBãã¼ãã«ã®ä½¿ç¨ç®æãæ¢ã">ã¬ãã¸ããªããDBãã¼ãã«ã®ä½¿ç¨ç®æãæ¢ã</h3>
<p>帳票ç°å¢ã®ãããã®å¤§åã¯m3reportsã¨å¼ã°ããã¬ãã¸ããªã«ããã¾ãã
m3reportsã¯ããããã®ã½ã¼ã¹ã³ã¼ãã¨å®è¡ã¹ã±ã¸ã¥ã¼ã«ã®è¨å®ãã¡ã¤ã«ã管çãã¦ããã¬ãã¸ããªã§ã調ã¹ã¦ã¿ãã¨2013å¹´ããããã¾ãã</p>
<pre class="code bash" data-lang="bash" data-unlink>% git log --reverse --pretty='format:%ad'
Mon Apr 8 06:36:49 2013 +0000</pre>
<p>ä»ã«ã legacy_reporting ã¨å¼ã°ããã¬ãã¸ããªã¯ããã«å¤ã2008å¹´ããããã¾ããã</p>
<pre class="code bash" data-lang="bash" data-unlink>% git log --reverse --pretty='format:%ad'
Wed Nov 12 09:26:19 2008 +0000</pre>
<p>åºæ¬çã«ã¯ããã®m3reportsãæ¢ãã°å¸³ç¥¨ç°å¢ã§ä½¿ããã¦ããDBãã¼ãã«ãåããã®ã§ã
ãã¼ãã«ã使ã£ã¦ããããããæ¢ããããæ¸ãæãã¦å¥ã®ãããã«ç§»è¡ããã¦ãã¾ãã</p>
<h3 id="ã¹ã±ã¸ã¥ã¼ã«è¨å®ã ãæ¶ããã">ã¹ã±ã¸ã¥ã¼ã«è¨å®ã ãæ¶ããã</h3>
<p>m3reportsã«ã¯ããããã®æ¬ä½ã®ã½ã¼ã¹ã³ã¼ãã¨ãããã®å®è¡ã¹ã±ã¸ã¥ã¼ã«ãæ¸ãããè¨å®ãã¡ã¤ã«ãããã¾ãã</p>
<pre class="code lang-conf" data-lang="conf" data-unlink><span class="synComment"># è¨å®ãã¡ã¤ã«ã®ä¾</span>
<span class="synComment"># ãããbatch_02 æãç«ãæ°´ãæ¨ãéãåã«å®è¡ãããbatch_01ãæ£å¸¸å®äºãããå®è¡ããã</span>
batch_02 batch_01 wday=Mon,Tue,Wed,Thu,Fri,Sat /path/to/script.sh
</pre>
<p>ãã¼ãã«ã®ååã§git grepããã°ããã®ãã¼ãã«ã使ã£ã¦ããããããæ¢ããã¨ãã§ãã¾ãã
ããããé·å¹´éç¨ããã¦ããããã使ããªããªã£ããããã¯è¨å®ãã¡ã¤ã«ããã¯å®è¡ã¹ã±ã¸ã¥ã¼ã«ã¯æ¶ããã¾ããã
ä¸è¦ã«ãªã£ããããã¹ã¯ãªããã ããæ®ã£ã¦ãããã¨ãå¤ãã§ãã
ã¤ã¾ããDBãã¼ãã«ã使ã£ã¦ããããããã¬ãã¸ããªã«ãã£ãã¨ãã¦ããå®éã«ã¯ãããããã¯èµ·åãã¦ããªããã¨ãå¤ãã§ãã</p>
<p>DBãã¼ãã«ã使ããã¦ããããæ£ç¢ºã«ç¥ãã«ã¯ãã¹ã±ã¸ã¥ã¼ã«è¨å®ã«æ¸ããã¦ããªããããå®è¡ãããªãããããåå®ãã¦ã¬ãã¸ããªããæ¶ãã
ä»ããããã¨ãã¦ä½¿ããã¦ãããã¡ã¤ã«ã ããæ®ããã¨ãå¿
è¦ã§ãã</p>
<h2 id="gitã¬ãã¸ããªèå¤å¦">gitã¬ãã¸ããªèå¤å¦</h2>
<p>gitã¬ãã¸ããªãçºæããã³ããããã°ãã³ã¡ã³ãããå
人ãã¡ã®æå³ãèªã¿åºããªãããã½ã¼ã¹ã³ã¼ããæ´çãã¦ããã¾ãã
ã³ãããããå½äººã¯ãã§ã«ããªãã£ãããå½æã®ãã¨ãè¦ãã¦ããªãã£ããããã®ã§ãã³ããããã°ãã³ã¡ã³ãããæå³ãèªã¿ã¨ããã¨ãå¿
è¦ã§ãã
ããã¯èå¤å¦ã§ãã</p>
<h3 id="ãã¡ã¤ã«ãæ¶ããã³ããããç¥ããã">ãã¡ã¤ã«ãæ¶ããã³ããããç¥ããã</h3>
<p>ãããããAãåç
§ãã¦ãããã¡ã¤ã«Bãè¦å½ãããªããã©ããã®ããããã¡ã¤ã«Aã¯ãã§ã«ã¹ã±ã¸ã¥ã¼ã«å®è¡ããã¦ãªãã¦åé¡ã¯èµ·ãã¦ããªãã
ãããAãæ¶ããããã©ãæ¬å½ã«æ¶ãã¦ããã®ã(ééã£ã¦ãããAã®å®è¡ãæ¢ãããã¦ããã ããããããªã)ãå¤æãããããåç
§å
ãã¡ã¤ã«Bãæ¶ããæã®ã³ããããã³ãããã¡ãã»ã¼ã¸ã確èªãããæã«ä½¿ãã¾ãã</p>
<pre class="code bash" data-lang="bash" data-unlink>git log -- path/to/file</pre>
<p>ãã㯠<code>path/to/file</code> ã«é¢ããã³ãããã®ãã°ãåºåãã¾ãããã°ã®ä¸çªæå¾ãåé¤ãªã®ã§1å±¥æ´ã«éå®ãã¦ãããã§ãã</p>
<pre class="code bash" data-lang="bash" data-unlink>git log -1 -- path/to/file</pre>
<p>ãªã <code>--</code> ã¯ã³ããããªãã¸ã§ã³ãªã®ããã¹ãªã®ãææ§ã«ãªãå ´åã«éã«å
¥ããã ãã§æå³ã¯ãªãã§ãã</p>
<pre class="code bash" data-lang="bash" data-unlink>git log path/to/log
fatal: ambiguous argument 'path/to/log': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'</pre>
<h3 id="ããè¨è¿°ãæ¶ãã追å ãããã³ããããç¥ããã">ããè¨è¿°ãæ¶ãã(追å ããã)ã³ããããç¥ããã</h3>
<p>ãããããAã®ãã¡ã¤ã«ã¯ããããè¨å®ãã¡ã¤ã«ããã¯å¼ã³åºããã¦ããªãã
ããããè¨å®ãã¡ã¤ã«ã§å®è¡ã¹ã±ã¸ã¥ã¼ã«ã ãæ¶ãããããããã¡ã¤ã«ã¯ä½¿ããªãã®ã«æ¶ãããã«æ®ã£ã¦ããã
ããã確ããããããè¨å®ãã¡ã¤ã«ããå®è¡ã¹ã±ã¸ã¥ã¼ã«ãæ¶ããã³ãããã調ã¹ããæã«ä½¿ãã¾ãã</p>
<pre class="code bash" data-lang="bash" data-unlink>git log -p -S "æ¤ç´¢å¯¾è±¡æåå"</pre>
<p><code>-S<gring></code> ã¯å¤æ´(追å /åé¤)ãæ¤ç´¢ãã¾ãã <code>-p</code> ã¯å®éã®å¤æ´å
容ã®diffã表示ããã¾ããã³ãããã ãã§ãããã° <code>-p</code> ã¯ä¸è¦ã§ãã</p>
<h3 id="ãããã¼ãã«ã使ããã¦ããããããæ¢ããã">ãããã¼ãã«ã使ããã¦ããããããæ¢ããã</h3>
<p>ã帳票ç°å¢ãã®ã¬ããªã«DBã®ãã¼ãã«ãåæ¢ããããããã®ãã¼ãã«ã使ã£ã¦ããããããæ¢ãåºãããã§ãã
ããã¯åç´ã«git grepãå®è¡ããã°ããã§ãã</p>
<pre class="code bash" data-lang="bash" data-unlink>git grep --name-only "ãã¼ãã«å"</pre>
<p>ããã§ãã¼ãã«åãå«ã¾ãããã¡ã¤ã«åã®ä¸è¦§ãå¾ãããã®ã§ããããã¼ãã«åãé¨åæååã«ãªã£ã¦ããå ´åãå«ã¾ãã¦ãã¾ãã¾ãã
<code>"user"</code> ã¨æ¤ç´¢ããã <code>"user"</code> ã ãã§ãªã <code>"user_address"</code> ã <code>"admin_user"</code> ãããããã¦ãã¾ãã¾ãã</p>
<p>ãã®ãããæ£è¦è¡¨ç¾ã§æ¤ç´¢ãããã¨ã§å¯è½ãªéãæ£ç¢ºã«æ¤ç´¢ã§ããããã«ãã¾ãã</p>
<pre class="code bash" data-lang="bash" data-unlink>git grep -E -i -e "(^|[^A-Za-z0-9_])targettext([ \"'\(\)]|$)"</pre>
<p><code>-E</code> ã¯æ¡å¼µæ£è¦è¡¨ç¾ã<code>-i</code> ã¯å¤§æåå°æåãåºå¥ããªãã<code>-e</code> ã¯æ¤ç´¢ããæååãæ£è¦è¡¨ç¾ã§æå®ãã¾ãã
<code>(^|[^A-Za-z0-9_])</code> ã¯è¡é ããã¼ãã«åã®åºåãã«ãªãæåãæå®ãã¦ãã¾ãã
<code>([ \"'\(\)]|$)</code> ã¯ãã¼ãã«åã®çµãããè¡æ«ãæå®ãã¦ãã¾ãã</p>
<p>以ä¸ã®ãã¡ã¤ã«ãæ¤åºã§ããã試ãã¾ãã</p>
<pre class="code bash" data-lang="bash" data-unlink># target
targettext
schema.targettext
export TBL="targettext"
export TBL='targettext'
select count(1) from (select x from targettext)
tbl=TARGETTEXT
# not target
tmp_targettext
targettext_1</pre>
<p>ããã§é¨åæååãé¿ãã¦ããæ£ç¢ºã«æ¤ç´¢ã§ãã¾ãã</p>
<pre class="code bash" data-lang="bash" data-unlink>git grep -E -i -e "(^|[^A-Za-z0-9_])targettext([ \"'\(\)]|$)"
test.txt:2:targettext
test.txt:3:schema.targettext
test.txt:4:export TBL="targettext"
test.txt:5:export TBL='targettext'
test.txt:6:select count(1) from (select x from targettext)
test.txt:7:tbl=TARGETTEXT</pre>
<p>git grep 㯠<code>-e</code> ãè¤æ°åéãã¦æå®ã§ãã¾ãããããã¯é
ãã§ããã§ããã ãæ£è¦è¡¨ç¾ã§ä¸ã¤ã«ã¾ã¨ããããã«ãã¾ãããã</p>
<pre class="code bash" data-lang="bash" data-unlink># è¤æ°å
time git grep -E -i -e "(^|[^A-Za-z0-9_])targettext " -e "(^|[^A-Za-z0-9_])targettext\"" -e "(^|[^A-Za-z0-9_])targettext'" -e "(^|[^A-Za-z0-9_])targettext\(" -e "(^|[^A-Za-z0-9_])ta
rgettext\)" -e "(^|[^A-Za-z0-9_])targettext$"
git grep -E -i -e "(^|[^A-Za-z0-9_])targettext " -e -e -e -e -e 8.96s user 0.32s system 274% cpu 3.383 total
# 1å
time git grep -E -i -e "(^|[^A-Za-z0-9_])targettext([ \"'\(\)]|$)"
git grep -E -i -e "(^|[^A-Za-z0-9_])targettext([ \"'\(\)]|$)" 1.57s user 0.40s system 295% cpu 0.667 total</pre>
<h3 id="大éã«git-grepããã">大éã«git grepããã</h3>
<p>ã帳票ç°å¢ãã®ã¬ããªã«DBã¯1000以ä¸ã®ãã¼ãã«ãããã¾ãã
ãããã®ãã¼ãã«1ã¤1ã¤ã«å¯¾ãã¦git grepãå®è¡ããã®ã«ã¯æéããããã¾ãã
ããã«ãæ¤ç´¢å¯¾è±¡ã¬ãã¸ããªãm3reports以å¤ã«ããã£ã¦ãããããæ¤ç´¢ãã
ã¨ãªãã¨ãã¼ãã«æ°Ãã¬ãã¸ããªæ°ã ãgit grepãå®è¡ããªãã¨ããã¾ããã
ããã§ã大éã®git grepãå®è¡ããããã«ãgoã§ä¸¦è¡å®è¡ããããã¨ã«ãã¾ããã</p>
<p>ã¾ãã¯ãgit grepãå®è¡ããé¢æ°ãä½ãã¾ãã</p>
<pre class="code lang-go" data-lang="go" data-unlink><span class="synStatement">func</span> grepRepoBase(ctx context.Context, repopath <span class="synType">string</span>, ops ...<span class="synType">string</span>) *bufio.Scanner {
ctx, cancel := context.WithTimeout(ctx, <span class="synConstant">180</span>*time.Second)
<span class="synStatement">defer</span> cancel()
args := <span class="synStatement">append</span>([]<span class="synType">string</span>{<span class="synConstant">"--no-pager"</span>,
<span class="synConstant">"-c"</span>, <span class="synConstant">"core.quotepath=false"</span>,
<span class="synConstant">"-c"</span>, <span class="synConstant">"grep.linenumer=true"</span>,
<span class="synConstant">"-c"</span>, <span class="synConstant">"grep.patternType=fixed"</span>,
<span class="synConstant">"-C"</span>, repopath,
<span class="synConstant">"grep"</span>, <span class="synConstant">"--no-color"</span>, <span class="synConstant">"--line-number"</span>, <span class="synConstant">"-E"</span>, <span class="synConstant">"-i"</span>}, ops...)
cmd := exec.CommandContext(ctx, <span class="synConstant">"git"</span>, args...)
buf := &<span class="synType">bytes.Buffer</span>{}
cmd.Stdout = buf
cmd.Run()
<span class="synStatement">return</span> bufio.NewScanner(buf)
}
</pre>
<p><code>repopath</code> ã¯ã¬ãã¸ããªããããã¡ã¤ã«ãã¹ã§ãã<code>-C</code> ã§æå®ãããã¨ã§ãã¬ãã¸ããªã®å¤ã®ãã£ãã¯ããªããã§ãå®è¡ã§ãã¾ãã
åºåçµæã1è¡ãã¤èªã¿è¾¼ããã<code>bufio.Scanner</code> ãè¿ãã¾ãã
ã¾ãã並è¡å¦çãããã<code>context.Context</code> ã使ã£ã¦ã¿ã¤ã ã¢ã¦ããè¨å®ãã¦ãã¾ãã</p>
<pre class="code lang-go" data-lang="go" data-unlink><span class="synComment">// tableName ãæ¤ç´¢</span>
s := grepRepoBase(context.Background(), repopath, <span class="synConstant">"-e"</span>, fmt.Sprintf(<span class="synConstant">"(^|[^a-zA-Z0-9_])%s([ </span><span class="synSpecial">\r\t</span><span class="synConstant">'</span><span class="synSpecial">\"\\</span><span class="synConstant">)</span><span class="synSpecial">\\</span><span class="synConstant">(]|$)"</span>, tableName))
<span class="synStatement">for</span> s.Scan() {
line := ReadBytes(s.Bytes())
...
}
</pre>
<p>ãããsemaphoã使ã£ã¦åæå®è¡æ°ã50ã¾ã§ã«æããªãã並è¡ãã¦å®è¡ãã¾ãã</p>
<pre class="code lang-go" data-lang="go" data-unlink> <span class="synComment">// çµæãæ¸ãããã®mutex</span>
<span class="synError"> </span> <span class="synStatement">var</span> resultMutex sync.Mutex
<span class="synComment">// 並åå®è¡</span>
sem := semaphore.NewWeighted(<span class="synConstant">50</span>)
wg := sync.WaitGroup{}
logger.Info(<span class="synConstant">"start check"</span>)
<span class="synStatement">for</span> _, table := <span class="synStatement">range</span> tables {
<span class="synStatement">for</span> _, repo := <span class="synStatement">range</span> REPO_PATHS {
<span class="synStatement">if</span> err := sem.Acquire(context.Background(), <span class="synConstant">1</span>); err != <span class="synStatement">nil</span> {
<span class="synStatement">panic</span>(err)
}
wg.Add(<span class="synConstant">1</span>)
<span class="synStatement">go</span> <span class="synType">func</span>(table <span class="synType">string</span>, repo <span class="synType">string</span>) {
now := time.Now()
<span class="synStatement">defer</span> sem.Release(<span class="synConstant">1</span>)
<span class="synStatement">defer</span> wg.Done()
<span class="synComment">// ããã§git grepå®è¡</span>
resultMutex.Lock()
<span class="synComment">// çµæè¨é²</span>
resultMutex.Unlock()
logger.Info(<span class="synConstant">"check done"</span>,
<span class="synConstant">"table"</span>, table, <span class="synConstant">"repo"</span>, repo, <span class="synConstant">"time(ms)"</span>, time.Since(now).Milliseconds())
}(table, repo)
}
}
wg.Wait()
logger.Info(<span class="synConstant">"check done"</span>)
</pre>
<p>ããã§å¤§éã®git grepã並è¡ãã¦å®è¡ã§ãã¾ãã</p>
<h3 id="git-grepã®çµæãEUC-JPã§ãUTF-8ã§ãæ£ããæ¥æ¬èªãåºåãã">git grepã®çµæãEUC-JPã§ãUTF-8ã§ãæ£ããæ¥æ¬èªãåºåãã</h3>
<p>m3reportsãå«ãã¬ãã¸ããªã¯10年以ä¸åãããããããæåã³ã¼ããæ··å¨ãã¦ãã¾ãã
å¤ããããã¯EUC-JPã§æ¸ããã¦ãããã¨ãå¤ãã§ãããæè¿ä½ããããã®ã¯UTF-8ã§æ¸ããã¦ãã¾ãã
git grepã®åºåã¯å
ã®æåã³ã¼ãã«é¢ä¿ãªãåºåãããã®ã§ãæåã³ã¼ããåºå®ã«ãã¦ãã³ã¼ãããã¨åãã¦ãã¾ãã¾ãã
ããã§ãEUC-JPã§ãã³ã¼ããã¦ã¨ã©ã¼ã ã£ããUTF-8ã§ãã³ã¼ãããå¦çãå
¥ãã¦ãã¾ãã
幸ãShift-JISã使ããã¦ãããã¨ã¯ãªãã®ã§ãEUC-JPã ãããã§ãã¯ããã°ããã§ãã</p>
<pre class="code lang-go" data-lang="go" data-unlink><span class="synStatement">func</span> ReadBytes(b []<span class="synType">byte</span>) <span class="synType">string</span> {
<span class="synComment">// UTF-8ã¨ãã¦ãã³ã¼ãã§ããã°ãã®ã¾ã¾è¿ã</span>
<span class="synStatement">if</span> utf8.Valid(b) {
<span class="synStatement">return</span> <span class="synType">string</span>(b)
}
<span class="synComment">// EUC-JPã§ãã³ã¼ããã¦ã¿ã</span>
<span class="synStatement">var</span> tmpbuf <span class="synType">bytes.Buffer</span>
ic := transform.NewWriter(&tmpbuf, japanese.EUCJP.NewDecoder())
_, err := ic.Write(b)
<span class="synComment">// ã¨ã©ã¼ãªã空æåãè¿ãã¦ãã</span>
<span class="synStatement">if</span> err != <span class="synStatement">nil</span> {
<span class="synStatement">return</span> <span class="synConstant">""</span>
}
err = ic.Close()
<span class="synStatement">if</span> err != <span class="synStatement">nil</span> {
<span class="synStatement">return</span> <span class="synConstant">""</span>
}
<span class="synComment">// ãã³ã¼ãããæåå</span>
<span class="synStatement">return</span> tmpbuf.String()
}
</pre>
<h2 id="ã¾ã¨ã">ã¾ã¨ã</h2>
<p>ã帳票ç°å¢ãã®ãªãã¬ã¤ã¹ã®ããã10å¹´ãã®ã®gitã¬ãã¸ããªãçºæããããã®éå
·ãç´¹ä»ãã¾ããã</p>
<ul>
<li>ãã¡ã¤ã«ãæ¶ããã³ããããæ¢ã</li>
<li>ããè¨è¿°ãæ¶ãã(追å ããã)ã³ããããæ¢ã</li>
<li>ãããã¼ãã«ã使ããã¦ããããããæ¢ã</li>
<li>大éã«git grepãå®è¡</li>
<li>EUC-JPã§ãUTF-8ã§ãæ£ããæ¥æ¬èªãåºåãã</li>
</ul>
<h2 id="We-are-hiring">We are hiring!</h2>
<p>10å¹´ãã®ããå
æã§ãããã®ããã¡ããããããã§ããæ°ããªãã®ã¾ã§å¤æ§ãªãµã¼ãã¹ãä¸ç·ã«éçºãã¦ããã仲éãåéä¸ã§ãããæ°è»½ã«ãåãåãããã ããã</p>
<p><iframe src="https://hatenablog-parts.com/embed?url=https%3A%2F%2Fjobs.m3.com%2Fengineer%2F" title="ã¨ã³ã¸ãã¢æ¡ç¨ãµã¤ãï½æ¡ç¨æ
å ± | å»çÃãã¯ããã¸ã¼ã®å¯è½æ§ã¯ç¡é大" class="embed-card embed-webcard" scrolling="no" frameborder="0" style="display: block; width: 100%; height: 155px; max-width: 500px; margin: 10px 0px;" loading="lazy"></iframe><cite class="hatena-citation"><a href="https://jobs.m3.com/engineer/">jobs.m3.com</a></cite></p>
fukubaya