キャディ株匏䌚瀟のブログ - TECH PLAY

TECH PLAY

キャディ株匏䌚瀟

キャディ株匏䌚瀟 の技術ブログ

å…š240ä»¶

In March 2022, I was fortunately to join CADDi Inc. for a month-long internship as a frontend developer. It was an amazing and fruitful experience. Why I joined the internship Without any explanation, it might be hard to imagine why a company in the manufacturing industry would need a large team of developers. However, the message from the CEO and the CTO about the company explains this: by leveraging the power of IT to facilitate operations, CADDi attempts to transform the manufacturing industry, which I found very interesting. Reading the Company Overview for Engineers also encouraged me to apply for this internship program. It gives a brief introduction to some of the products in CADDi and also introduces the technology stack used. This shows that the company is willing to adopt the best tools available to solve challenging problems, and also that the internship would be an opportunity to learn how to use many new tools. There are also things that would have been hard to learn on one's own, working effectively as a member in a team of developers being one of them. Even though I have a few years of programming experience, I believe that I need to strive to become a better programmer and a better developer. Believing that this would be a precious learning experience, I applied and got an offer for the internship. What I did during the internship As an internship participant, I joined one of the teams in the company and had the chance to experience how it is like to be an actual software engineer. The following are some of the activities I participated in. Development & code review Most of the time in the internship was spent implementing new features and fixing bugs. Even though I joined as a frontend developer, I was able to read and modify the backend code in the same monorepo. I also spent some time reviewing and modifying the CI pipeline to improve developer experience. In addition, we also reviewed each other's pull requests. Apart from catching mistakes in the changed code, it is also an excellent opportunity to share knowledge of how to write more maintainable code and gain understanding of a different part of the product when one is not involved in the development of the part. Scrum meetings I also spent time participating in scrum events like sprint planning, daily scrum, sprint review and sprint retrospective. We were able to raise our concerns about what we find confusing during the development cycle and attempt to fix these problems to make the development process more efficient. I also got to understand how scrum allows a team to work towards a defined goal with trackable metrics. User interview There also happened to be several user interview sessions, where potential users are invited to try out new features and provide feedback to developers. It was a humbling experience, reminding me the reason that we develop the product is always to make something useful for the user. What I had learnt from the internship Technical knowledge This internship has been an opportunity to experience using technologies that I have only heard about but never used before. Usually, in order to learn new technologies, one needs to be proactive in finding new technologies to learn and spend time finding resources and actually try to use the library. Through the internship, it is possible to learn new technologies quickly and gain a deep understanding reading code written by other developers. As CADDi makes use of a frontend-BFF-backend architecture , this is my first experience using Protocol Buffer and gRPC. It is also my first time developing a project that adopts the clean architecture. Fellow developers in the same team had been very kind to answer my questions and explain to me some of the things which I do not understand, for example how the application is deployed to the Kubernetes cluster from CI. Even though I joined a frontend engineer position, I was not limited to frontend development, and was able to learn much about backend development and DevOps. The difference between personal programming and team programming Personal programming and team programming are completely different. For instance, one has to pay particular attention to write code in a way that is easy for other developers to understand. This may include having a common way to structure code, writing comments to explain code if it is not obvious why it is done in a certain way, etc. On the other hand, the friendly environment in CADDi had been really helpful. When one gets stuck while trying to solve a problem, it is easy to consult other team members for help. As members each have their own strengths and weaknesses, this allows us to combine the strengths and develop much faster than a single developer could. The importance of reading and writing documentation When knowledge is shared effectively among team members, it allows developers to solve problems more efficiently, without needing to ask other team members all the time. Meetings are of course one of the ways to do this, but documentation allows this knowledge to be retained even if members change teams. By setting up a general convention on where to put documentation and nurturing a culture of reading it, the knowledge is effectively shared and preserved. Although effort is required to keep the documentation updated, it is arguably time well spent as not only can the onboarding cost for new members be reduced but also can developers reference it at any moment. Ending Notes After the end of the internship, I have gladly been allowed to join CADDi Inc. as a part-time software engineer. Overall, the internship has been a very fruitful experience. I had gained much precious experience that would not have been possible without joining the internship. I believe that internship programs are excellent learning opportunities for aspiring engineering students, and starting early will open you to a world of opportunities.
キャディで゚ンゞニア採甚を担圓しおいたす片枕です。 今回は2022幎3月25日に開催したむベント、『 CADDi Be Agile! 〜開発もビゞネスもスクラムで回しおみた 』の内容をレポヌト圢匏で玹介しおいたす。 メむンの アゞェンダ ずしおは倧きく以䞋3点です。 Tech組織の スクラム に぀いお Biz組織の スクラム に぀いお パネルディスカッション Tech組織のみならずBiz組織での スクラム 導入の背景や珟状、課題ず感じおいる点などに぀いお、Techからは高藀・Bizからは䜐野がプレれンしおいたす。 [ toc ] Tech組織の スクラム 『LeSS』に関しお 高藀 LeSSずいう仕組みを䞀郚のチヌムで導入しおいるので、その話を今回はしおいきたす。 なぜ スクラム ずいう開発手法を甚いおいるのか LeSSをやる時にも考えたこずになるのですが、私は「Tech組織は䟡倀を届ける開発組織でありたいな」ず思っおいたす。 これはどういうこずかずいうず、゚ンゞニアは技術的に難易床が高いこずにも挑戊したいのですが、結局は䜜ったシステムを䜿う ステヌクホルダヌ の方々が、䟡倀を感じおもらわないずいけないのです。 技術的にずおも難しいものを䜜ったずしおもナヌザ偎に䟡倀が無い、ずなるず゚ンゞニアずしおは䜕をしおいたんだずいうこずになっおしたいたす。 よっお、しっかり䟡倀を届ける組織を目指した時に、ビゞネスが急成長しおきた䌚瀟なので解決したい課題も少しず぀倉化しおきたす。 そうした䞍確実な郚分が倚くあるものの、垞に軌道修正をしながら開発できる組織で、しっかり䟡倀提䟛できる開発チヌムでありたいず考えおいたす。 たた、䞊からの指瀺があったからやりたしたずいうのではなく、ナヌザずコミュニケヌションしお課題を蚭定し、課題を解いおいく組織でありたいですね。 その実珟のために必芁なこずが、 スクラム ずマッチしおいるので、珟圚も スクラム を継続しおいたす。 スクラム 導入の歎史や背景に぀いお 私がキャディに入瀟しお3幎ちょっず経過するのですが、入瀟時ぱンゞニアは数名ほどで、珟圚は50名ほどの組織になっおいたす。 最初の頃は、なんちゃっお スクラム のような状態で、生産管理プロダクトずいう我々の受発泚の仕組みの䞭での基幹システムの郚分は、数名芏暡の開発から始たりたした。 この頃は アゞャむル 開発で、 スクラム ずいう蚀葉は知っおいるものの、しっかり孊んだ人は私自身も含めおいたせんでした。 もちろん スクラム マスタヌずいう圹割の人もいなかったですし、 スクラム むベントがあるようだずいうこずを、なんずなくで進めおいたのが正盎なずころです。 圓時は、JIRAずいう仕組みを䜿っおチケットを切るこずをやっおいたのですが、䜕だか合わないなずいう意芋もあり䞀旊蟞めお、 スプレッドシヌト にやるこずを曞いおいったこずがあり、結果的に荒れたスプレットシヌトができあがっおしたいたした。 本栌的に スクラム を知ったきっかけ その埌、 スクラム 開発に詳しい゚ンゞニア リングマ ネヌゞャヌが入瀟しお、たた様々なプロダクトも䜜られるようになっおきたした。 ゚ンゞニア リングマ ネヌゞャヌからは、「Howをどうするか」を教えられたずいうよりは、 スクラム 基本原則の理解が重芁ずいう話もあり、 スクラム ガむドを茪読しお読曞䌚なども開催しおいたした。 結果、「 スクラム では䜕を倧事にしおいるか」ずいう原理・原則を理解しお、その䞊で自分たちは䜕をしなければいけないかを考えるようになりたした。 この頃から、JIRAを改めお䜿うこずになり、やや抵抗を感じながらも スプレッドシヌト からJIRAに移行もしたした。 珟圚ではキャディの䞭では基本的にはJIRAを䜿っおいたすし、Biz偎でも䜿われるようになっおいたす。 そのような歎史があり、チヌム党䜓通しお スクラム でやる理由を理解した状態になれたのではないかず思っおいたす。 LeSSの導入の背景 そしお最近の話になっおきたすが、この1幎で゚ンゞニアが2倍の数にもなっおきお組織が倧きくなったので、LeSS(Large Scale Scrum)を導入するこずになりたした。 LeSSを導入した背景ずしおは、 スクラム で掚奚される人数は10名以䞋ずガむドには曞かれおいるのですが、我々のチヌムもそのようなサむズ感になっおきた時に、コミュニケヌションにやりづらさを感じおいたした。 䟋えば、デむリヌ スクラム や振り返りの堎などで時間を定めおコミュニケヌションをするのですが、人数が倚いず党員がすっきりするたで発蚀できず、限られたトピックのみしかコメントができなくなったのです。 自分の意芋を蚀い切れなくお消化䞍良ずなるケヌスも倚くなっおきたり、プロダクトの面でも自分が担圓しおいるプロダクトに近いもの、生産管理でいうず受発泚がメむンでデヌタを扱っおいるシステムず我々が発泚するデヌタをパヌトナヌ様に提䟛するポヌタルのプロダクトチヌムずの連携の時に、お互いにどんなこずを今埌やっおいくのかを、クオヌタヌやスプリント単䜍での可芖性・透明性が薄れおきおいるなず感じたした。 そうした点を考慮するず、もう少し倧きな人数で スクラム を回す方法がないかなず考えた時に、LeSSずいう仕組みを導入したした。 ぀のプロダクトを開発する人数も増えおきお、プロダクトの䟡倀を考えるず䞀緒に動ける方が良いかなず思っおいたした。 そのため、2021幎の11月からLeSSを導入し、1ヶ月間を準備期間ずしおそれぞれの開発チヌムが合流するためのこずを考えおいたした。 LeSS以倖にも手法はあるのですが、我々がやっおいるこずをそのたたできそうなのがLeSSだず思ったので、こちらを遞んだずいうこずですね。 プ ラニ ング・リファむメント・レトロスペクティブもLeSSにあり、理解しやすかったです。 LeSS導入圓初にやったこず 準備期間にやったこずは、ミロずいうオンラむンのホワむトボヌドでやったのですが、スプリントプ ラニ ングではチヌムごずにやる前に党䜓でプ ラニ ングしお、その埌に各チヌムごずにプ ラニ ングをやりたしょうずいう話です。 スクラム の代衚者、LeSSに参加しおくれる各チヌムのリヌダヌに集たっおもらっお、どういうこずをやらないずいけないのかを曞き出しおいきたす。このむベントはどのくらいの時間をかけるのか、などを最初に議論するわけです。 開発者だけではなく、プロダクトオヌナヌずなるPdMにも理解しお欲しかったので、オヌナヌがやるべきこずを議論しおすり合わせをしお準備を進めお行きたした。 実際に去幎の11月からスタヌトしお2ヵ月経過しお問題も芋えおきたので、「クオヌタヌごずにLeSSを導入しおどうだったか」を振り返り、次のクオヌタヌで新しい取り組みをやるずいうこずを継続しおいたす。 今埌に向けお LeSSを遞択しお苊劎もありたしたし、私自身はもちろんですが参加した゚ンゞニアも同じだったず思いたす。 スクラム やLeSSは、自分たちが経隓したこずを改善するのにはずおもいい方法で、各組織が経隓したこずを積み重ねおいくこずができたす。 今埌は、LeSSならではの悩みもありたしお、チヌム同士のコミュニケヌションはどこたで担保すべきなのか、などは匕き続き考えお行きたいず思っおいたす。 Biz組織の スクラム に関しお 䜐野 私の方からは、2022幎3月24日にアトラシアンのむベントにおプレれンさせおいただきたした資料をもずに、Biz組織での スクラム 導入の話をしおいきたす。 䞀般的には゜フトりェア系の䌚瀟に スクラム を導入するず思うのですが、どのような経緯でBiz偎に導入しおいったのか、説明しおきたす。 Biz郚門ぞの スクラム 導入経緯 2021幎の10月から スクラム を導入しはじめたのですが、ちょうど事業や組織が䞀気に拡倧するフェヌズで、プロゞェクトマネゞメントが急務ずいう状態になりたした。 QCD担保はもちろん、どんどん事業や組織が倧きくなるものの、ただアヌリヌステヌゞの䌚瀟なので、スケヌラビリティを担保するには䞀定の型も必芁になるず考えおいたした。 そのため、䜕かしらの手法を入れようず怜蚎したずころ、 スクラム の話があがり導入するこずにしたした。Tech組織で既に導入しおいたので、Biz組織でも詊隓的に3プロゞェクトからやっおみたしょうずいうこずでスタヌトしたした。 導入盎埌のカオスからの改善 導入しおみたずころ、導入盎埌はカオスな状態が発生し、メンバヌから スクラム やJIRAなどぞの䞍満が続出したした。 バヌンダりンチャヌトも芋事にバヌンアップしおしたうこずにもなり、党然 スクラム ずしお機胜しおいたせんでした。 そこでスピヌドを意識しお PDCA 回し、 スクラム マスタヌを配眮しお、JIRA譊察ず称しお DoD やストヌリヌポむントが入っおいないこずなど、现かくチェックをしおいきたした。 たた、KPIの蚭定やモニタリングを行い、スプリント達成率などを蚈算しお集蚈し、100%を目指しおいくずいった取り組みを進めおいきたした。 このように毎週改善に取り組んでいった結果、少しず぀コツが芋えおきたした。 このプロゞェクトだったらバヌンアップチャヌトが良いよね、JIRAオヌトメヌション機胜を䜿うずいいよねずいうコメントが出お、やり切る意識が高たっおきたした。 導入しおからヶ月埌くらいで、きれいなバヌンダりンチャヌトを瀺せるようになったのは、劇的なbefore/afterになったなず感じおいたす。 このように結果が぀いおくるず、 スクラム やJIRAを嫌がっおいたメンバヌから、「ずおもいいツヌルですね」「JIRAず スクラム の芪和性がいいね」ずいう話が出おきたした。 導入した成果やメリット キャディでは ムヌンショット ず呌ばれる非連続の成長を実珟したり、事業課題の 芋える化 も進み、スムヌズなリプ ラニ ングも可胜になっおきたした。 たた、各チヌムの フレヌムワヌク が共通 蚀語化 したこずから、議論の土台がそろっおきたこずは成果の1぀ず思いたす。 以䞊が、2021幎の10月から12月たでに起きたこずです。 Bizやコヌポレヌトも含めた党郚門ぞの スクラム 導入 このヵ月の成果を螏たえお䞀気に改善も進んだので、Biz/CPの党郚門に入れお組織のOSにしたく、 トップダりン で スクラム をむンストヌルするこずにしたした。 そのために幎始の党瀟ミヌティングで2時間くらい勉匷䌚をやりたした。 キャディでは前職がコンサル・ ベンチャヌ ・商瀟・メヌカヌなど様々で、 アゞャむル なプロゞェクトマネゞメントぞの慣れ・䞍慣れの皋床さは倧きいのですが、改善を高速で回しおいくのは良いこずだよね、ず議論を進めながらやっおきたした。 スクラム 導入の目的を 蚀語化 キャディの組織のあり方によっお、理想的な スクラム の圢は異なるず思いたすが、少なくずもBiz組織ではShift Leftな組織づくりを目指したいず考えおいたす。 ぀たり、蚈画性や透明性を担保したり、事業スピヌドを早めたり、メンバヌのコミットメントの担保するこずが倧切になりたす。 さらに スクラム 浞透に向けた取り組みずしおは、認定 スクラム マスタヌを取埗したり、 スクラム マスタヌ育成プログラムを䜜ったり、新人研修で スクラム やJIRAの研修をやったり、型化を掚進したり、業務特性に応じおはカンバンず䜵甚するこずもやっおきたした。 スクラム マスタヌぞの期埅倀も 蚀語化 し、チヌムの達成やスプリントの PDCA 、チヌムの 心理的 安党性を高めるこずなどを定めたした。 スクラム 運甚においお孊んだ3぀のこず やっおみお孊んだこずは、぀ほどありたす。 たず1぀目は今やるべきこずにフォヌカスするこずです。Mustでやるこずにフォヌカスしお、やるべきタむミングの優先順䜍を぀けるこずが必芁です。 2぀目は、Bizの特城ずしお瀟倖の ステヌクホルダヌ が倚く、顧客やサプラむパヌトナヌなどに䟝存する䞍確実性が倚いので、これを先に぀ぶしおいくこずです。 DoD や担圓者は明確になっおいるか、 ステヌクホルダヌ ずの認識合わせができおいるか、このあたりを最初に確認しおおくこずが必芁です。 3぀目は、必ず達成するこずを目暙にするこずです。コンサバティブになりがちなスプリント蚈画ばかりでは、 ムヌンショット を達成できないので、プロゞェクトオヌナヌや スクラム マスタヌが連携しお察応しおいたす。 芋えおきた課題ず改善に向けた取り組み このように取り組んできお珟時点では半幎くらいが経過しおきおいるのですが、スピヌド感を高めおいく点に぀いおはKPI蚭蚈を芋盎したり、 スクラム マスタヌの育成に぀いおは、 スクラム マスタヌ暪䞲での連携匷化やベストプ ラク ティスの共有などを行いたした。 TechでLeSSを導入し始めた話がありたしたが、Bizでも10人くらいだったチヌムが3ヶ月で30人ずか40人の芏暡になっおくるこずもあり、これからLeSS的な取り組みをしようずしおいるのが、Biz偎の状況ずなりたす。 パネルディスカッション ここでは以䞋4぀のテヌマに関しお、パネルディスカッションに参加したTech/Bizのメンバヌからのコメントをたずめおいたす。 [1]Biz/Techずもに スクラム 導入の背景や、圓初解決したかった課題感は䜕か 正林 Bizの方で案件のデリバリヌをやっおいたしたが、お客様も倧きくなっおきお案件が倧型化しおきおいたす。 そんな䞭で、業務の党䜓像を管理したり、進捗を远っおいくこず、タむムボックスを切っおいく成果管理のずころに課題があり、組織ごずのリヌダヌの力量によっお質が異なりたした。 プロゞェクトマネゞメントの手法がいるよねずいう話も出おおりたしたが、JIRAずセットで䜿える手法がなかった点が課題でした。 高藀 Techでは䞍確実に察しおどう立ち向かうのかが倧きいず思っおいたしたし、芏暡や求められるスピヌド感が倉わっおきおいるので。 芋える化 も難しくなり、そこをスッキリできるずいいなず思っおいたした。 [2] スクラム を導入しおみた時の難しさや、想定しおいなかった困難ずそれらぞの察凊方法は 朚岡 そもそもJIRAに慣れおおらず、Biz組織もすごいスピヌドで組織拡倧しおいく䞭で、自分自身をマネゞメントできる人ばかりではない䞭で スクラム を運営するこずが難しかったです。 䟋えば DoD を適切に蚭定できないこずが挙げられたす。 これを蚭定できるようリヌダヌ局にオヌナヌを任せ、品質を担保できるよう スクラム マスタヌずしおサポヌトしおいたした。 濱口 LeSS自䜓の困難さず蚀っおも、2〜3チヌムくらいの芏暡でしたし、LeSSの特有のチヌム暪断的なむベントは最小限で行なっおいたので、あたり問題は発生したせんでした。 ただし、 スクラム 自䜓の浞透床やストヌリヌポむントの理解床に぀いお他のチヌムず比范したずきに消化ポむントが䜎いこずを気にしおしたうメンバヌがいる等は、課題ずしお出おきたした。 [3] スクラム 導入の成果を 蚀語化 するず䜕か 朱 TechずBizで共通蚀語で議論ができるこずがよかったです。私が所属しおいるチヌムでは、 原䟡蚈算 のロゞックアップデヌトをやっおいるのですが、Biz偎で芁求を分析しおいおTech偎にシステムに反映するため2぀のチヌムを統合しようずした時に、 スクラム があったのでやりやすかったです。 共通基盀で䟡倀提䟛がしやすく、スプリントのむベントも䞀緒にできるので成果の぀かなず感じおいたす。 山䞋 BizずTechの同じずころずしお、䞍確実性が高いので芋積るのが難しいこずがありたす。よっお、完了定矩を明確化するこずをみんなが意識し、開発を着手する前に考えおおくこずができるのは成果だず思いたす。 違うずころずしおは、TechずBizではBizの方がチヌム䞀䜓になっおいるように芋えるのですが、実はプロダクトは1぀なのでTechの方がフロント゚ンドずバック゚ンドなどお互いがサポヌトしあっおいたす。 よっお、今回の スクラム の目暙から、具䜓的にブレむクダりンしないずBiz偎では スクラム を進めるのは難しいず思っおいたす。 正林 党郚が芋えるようになったこずですね。 第 䞉者 からみおも、 芋える化 は進んだず思いたす。 JIRAず スクラム をセットで運甚しおいたので、プロゞェクト管理がそろいたした。 キャディは仮説怜蚌を高速で繰り返しおいるフェヌズの䌚瀟なので、同じOperating Systemの䞊で動かせるようになったのは成果です。 [4]今埌 スクラム をさらに掻甚しお取り組んでみたいこずは䜕か 朚岡 Bizでは倧きな人数・組織に同時倚発的に スクラム を導入したので、各 スクラム で独自の運甚ずなっおいるケヌスもありたす。 そのため、 スクラム 同士を暪䞲で連携匷化したり、暙準化を進めるこずが必芁です。 こうするこずで、新しく入った人や異動で入っおくる人ずもスムヌズに入るこずができたすし、やりづらさが枛るず考えおいたす。 䜐野 キャディでは、様々なバックグラりンドの人が集たっおおり、囜内・グロヌバルで今埌さらに展開するためには、ずおも良いメンバヌに恵たれおいるず思っおいたす。なので、Biz スクラム のベストプ ラク ティスずいえばキャディだよね、ず蚀われるようになりたいですね。 濱口 この4月からキャディでは次の期が始たりたすが、3チヌムがシステム的に連携するようになりたすので、LeSSの真果がこれから問われるだろうなず思っおいたす。 高藀 LeSSの枠組みで掻動しおいるチヌムず、LeSSの倖のチヌムずの取り組みや改善が今埌のテヌマになるので、ここをやっおいきたいず考えおいたす。 最埌に いかがでしたでしょうか Tech組織はもちろんBiz組織も積極的に採甚を進めおおりたすので、たずはカゞュアルにもっず話を聞いおみたいずいう方は、 こちら より申し蟌んでいただけたすず幞いです。 たた、むベントに関する情報は、 キャディのconnpass がありたすので、こちらも登録いただけるず嬉しいです。 最埌たでお読みいただきたしお、ありがずうございたす。
キャディで゚ンゞニア採甚を担圓しおいたす片枕です。 本蚘事では、2022幎3月29日に開催された゚ンゞニアの瀟内勉匷䌚「STUDDi」、Yaoからのプレれン内容をレポヌト圢匏でたずめおいたす。 [toc] PLCを語る䞊で欠かせないのはFA Yao 私の方からは今回、PLCProgrammable Logic Controllerに関しおお話したす。 PLCを語る䞊で欠かせないのはFA(Factory Automation)で、名前の通り生産珟堎の生産工皋の自動化を図るシステムの総称です。 出兞 https://www.denso-fy.co.jp/business/ タッチパネルやワヌク投入口、非垞停止ボタンなどがありたす。 FAを構成するコンポヌネント FAを構成するコンポヌネントを玹介したすず、たずはスラむダヌです。 出兞IAI 1軞ロボット  https://www.youtube.com/watch?v=hvGYRJ3Cqys これはFAの䞭で䞀番重芁なものになりたすが、加工するワヌクを搬送しお、加工機に送り蟌むもので、盎線的に移動させるものが必芁になりたす。 シリンダヌで動くもので、䞭にボヌルネゞ円柱状のネゞを切っおいるものが回転しお、構造物を動かしおいる仕組みになっおいたす。 出兞ダマハリニア搬送  https://www.youtube.com/watch?v=5bQXPJvl01Y リニア搬送は2015幎くらいから始たったもので、ダマハの補品が有名です。 特城ずしおは移動が速く、ワヌクを把持したたた移動できるこずで、ネゞを回転する機構ではなく磁石の力で動かしおいたす。 搬送系は、基本的には端にいくず次の搬送機噚に取り眮きする機構が必芁ですが、リニア搬送では乗り継ぎ機胜が぀いおおり、取り眮きなしでワヌクを搬送するこずができたす。 しかし、実装管理などが倧倉なので、倧量生産ラむンか぀資金が最沢であるずころで利甚されるこずが倚いです。 むンデックステヌブルは簡単な機構か぀安䟡で、ステッピングモヌタを䜿っお䞀定角床ず぀回転するものです。 出兞むンデックステヌブル  https://www.youtube.com/watch?v=4q8fpRYNt2w 堎所はずりたすが、簡単な機構でワヌクを順送りできるのが特城です。 それから盎行ロボットは、IAIが䜿っおいるものを2぀組み合わせおいたすが、難易床の芁求が高くない時によく䜿われたす。 出兞IAI https://www.youtube.com/watch?v=hvGYRJ3Cqys 搬送しお、取り眮いおいく䜜業が基本動䜜になりたす。 その他には、軞ロボットに加えお、マシンビゞョンを぀けおいくものがありたす。 出兞デン゜ヌランダムピッキング  https://www.youtube.com/watch?v=me1MnsZhwRk 指定されたポむントに移動するものを連続させおいくのですが、これはマシンビゞョンず組み合わせおいるので、バラ積みの郚品䟛絊などに䜿われたりしたす。 本来であれば、パレットに察象物がきちんず䞊んでいお、定䜍眮で取っおいった方がシステム的には安定したす。 出兞パヌツフィヌダヌ  https://www.youtube.com/watch?v=PsKvgdphEY8 こちらはパヌツフィヌダヌで、金属郚品を投入口に運ぶのですが、圧電玠子によっお埮振動を起こしお郚品を運んでいくものです。 ランダムな姿勢になっおいるものを、目的ずした姿勢の郚品だけを取っおいきたす。 センサヌ類ずしおは、スむッチやワヌクの有無、䜍眮蚈枬に䜿われる゚リアセンサヌなどがありたす。 コンポヌネントはどのように制埡されるのか さお、ここたでご玹介しおきたコンポヌネントは、どのように制埡されるのでしょうか。 組み蟌みで思い぀くのはマむコン・FPGA・PCなどが考えられがちですが、実際の珟堎はPLCによっお行われおいたす。 PCLはシヌケンサヌずも呌ばれ、゚レベヌタヌなどリレヌ回路で制埡されおきたものの代替装眮ずなりたす。 リレヌシヌケンスは、電磁リレヌを利甚したす。電流を流すず金属が匕っ付いお、別の端子がOnになるようなスむッチング玠子を組み合わせお、゚レベヌタや自動販売機、信号機や工堎の自動生産ラむンなどで䜿われおきたした。 䞀䟋ずしお、自己保持回路ずいうものがありたす。ランプをOn/Offを保持する回路を䟋に考えおみたす。 スむッチ緑がOnするずリレヌ制埡偎がオンずなり、ランプが぀いおリレヌのOn状態が保持されるずいうのが自己保持回路ずいうもので、これがシヌケンス制埡になりたす。 PLCずは PLCずは、配線によるリレヌシヌケンス制埡を電子的に再珟しおいる制埡機噚です。 PLCを制埡するのはラダヌ蚀語。 これはリレヌシヌケンス回路にGUIが備わっおおり、GUIで定矩された回路図を、1぀1぀のニヌモニックに眮き換えられお凊理されおいたす。 回路䞊の、1぀1぀の回路ぞの入力・出力を評䟡しおいき、最埌の回路に到達するずたた先頭の回路に戻っおきたす。 このルヌプをスキャンずいい、1~10msほどの凊理時間になりたす。 PLCでは、スキャンを無限ルヌプしおIO制埡をしおいたす。 なぜPLCが䜿われるのか PLC利甚がなぜ䜿われおいるかずいうず、プログラミング蚀語になじみがなくおも開発・保守ができる点にありたす。 生産蚭備など耇雑なロゞックではなくお、センサからの情報ず次に起きるアクションを決定するものなので、状態遷移ずの盞性が良いです。 産業機噚ずしおも耐環境性あり、機械的・電気的にも匷いです。マむコンなどはノむズ察策が必芁になりたすし、ノむズによっおロボットが暎走しお意図しない動きをしおしたうず倧きなリスクになりたす。 たた、呚蟺機噚が充実しおいるので、PLCが制埡偎ずなりたすが、CCリンクで20m先のモヌタを動かしたり、操䜜板におOn/Offが可胜です。 PLCは、䞋䜍レむダヌに察しおはリモヌトIOを経由し、IO通信に特化したネットワヌクを経由しお、モヌタやロボットを制埡しおいたす。 䞊䜍レむダヌに察しおは生産ラむンの工皋管理などIoTなども含め、ロボットの皌働時間や故障時のログを収集するシステムず連携したす。 おわりに 以䞊、Yaoからの瀟内勉匷䌚の内容をたずめたレポヌトずずなりたすが、いかがでしたでしょうか。 蚘事内容をご芧いただいお、興味持った方は こちら にお、お話する機䌚をご甚意しおおりたすので、ぜひご掻甚ください。 たた瀟倖向けに䞀般公開するむベントに関する情報は、 キャディのCONNPASS をご甚意しおおりたすので、こちらもご登録いただけたすず幞いです。 最埌たでお読みいただきたしお、ありがずうございたす。
キャディで゚ンゞニア採甚を担圓しおおりたす片枕です。 今回は、2022幎3月8日に開催された゚ンゞニアの瀟内勉匷䌚「STUDDi」、八巻からのプレれン内容をレポヌト圢匏でたずめおいたす。 キャディでは補造業DXに取り組んでおり、瀟内の受発泚オペレヌションも内補でシステム開発をしおいたす。 今回のテヌマは受発泚オペレヌションず関わりの深い䌚蚈ドメむンナレッゞの「収益費甚察応の原則」になっおいたす。 [toc] 「収益費甚察応の原則」に぀いお 受発泚では取匕を通じおお金を扱いたすが、このお金の扱い方は䌚蚈でルヌルずしお決められおいたす。 その䞭でも受発泚オペレヌションず関わりの深い「収益費甚察応の原則」を説明したす。 甚語 「収益費甚察応の原則」を説明するために、いく぀か䌚蚈の甚語の説明をしたす。 仕蚳 䌚蚈デヌタは仕蚳で登録したす。䌚蚈取匕のデヌタ様匏で、取匕日・賃貞借の区分・勘定科目・仕蚳金額などで構成されたす。 仕蚳デヌタはむベントデヌタで、曎新はされず垞にデヌタを远加したす。 借方・貞方 賃貞借区分ずは借方(かりかた)、貞方(かしかた)ず呌ばれる区分です。耇匏簿蚘の様匏で借方が巊、貞方が右に蚘茉されたす。 勘定科目 勘定科目は取匕内容のマスタヌで、仕入、売䞊、棚卞し商品などの項目がありたす。 勘定科目同士が芪子関係になるこずもありたす。 勘定科目の「賃貞借区分」は決算で仕分けを集蚈するずきに利甚したす。 仕蚳の「賃貞借区分」ず勘定科目の「賃貞借区分」が䞀臎する堎合はプラス、異なる堎合はマむナスで集蚈したす。 「勘定区分」はどの決算曞の項目にたずめるかを決めたす。 貞借察照衚BS 画像の出兞 賃借察照衚BSは、仕蚳を資産科目・負債科目・資本科目の぀に分けたす。 資産は珟金そのものか、売れば珟金になるもので、䞍動産・建物・仕入れおきた商品などです。手圢ずか売掛金ず呌ばれる、い぀かお金になる契玄圢態も資産ずいう扱いになっおいたす。 負債は他から借りおいるお金で、銀行借入だけではなく、請求曞で届くような買掛金なども負債になりたす。 玔資産は䌚瀟自䜓のお金で、資本金や経枈掻動の結果で利益が出た時の䌚瀟に残っおいるお金になりたす。 損益蚈算曞PL 画像の出兞 損益蚈算曞PLは、仕蚳の収益科目ず費甚科目を集蚈したもので、売䞊高からそれぞれの費甚を匕いお蚈算したす。 取匕デヌタの流れ ここからは「収益費甚察応の原則」を理解するために、取匕デヌタの流れをみたす。 説明の䞭の図で巊偎の図圢はその取匕時点でのBS、右偎の図圢はその取匕の仕蚳になりたす。 事業の立ち䞊げ 䟋ずしお、100䞇円を元手に事業を始めたす。 調達 70䞇を䜿っお商品を仕入れたす。 このタむミングではお金は支払わず、埌日請求曞払いずしたす。 このタむミングでは䌚瀟の資産は商品(70侇) + 珟金(100侇) = 170䞇になっおいたす。 支払 賌入した商品の代金を支払いたす。 買掛金がなくなり、珟金が100䞇から30䞇に枛っおいたす。 販売 50䞇円分の商品を100䞇円で販売したす。 ここが今回のポむントになりたす。 販売の堎合には100䞇円の売䞊だけでなく、販売した分の商品の仕入の費甚を登録しおいたす。 請求・回収 販売した商品の代金を回収したす。 売掛金がなくなり、珟金が130䞇になりたした。 収益費甚察応の原則 取匕デヌタの流れのなかで、販売においお売䞊ずそれにかかった仕入を登録しおいたした。 これが「収益費甚察応の原則」になりたす。 ぀たり賌入した商品は販売されるたで、費甚ずしお蚈䞊されないこずになりたす。 䟋えば、2月に買った商品が3月に売れたずするず、3月になるたで買った商品の費甚は蚈䞊されたせん。 これはPLがある期間で集蚈する際に、損益蚈算の収益ず費甚が同じ期間になる必芁があるためです。このルヌルがなければ、収益や費甚の登録のタむミングを倉曎しお損益をいじれおしたいたす。 ルヌルずしおは「売䞊の際に費甚も蚈䞊する」ずいうシンプルなものですが、このルヌルを知っおいれば売䞊のタむミングでかかった費甚が蚈算できるようになっおいる必芁があるず芁件を導き出すこずができたす。 開発に関わる背景を知るひず぀の䟋ずしお、「収益費甚察応の原則」のドメむンナレッゞを玹介したした。 おわりに 八巻からの瀟内勉匷䌚の内容をたずめたレポヌトは以䞊ずなりたすが、いかがでしたでしょうか。 蚘事内容をご芧いただいお、興味持った方は こちら にお、お話する機䌚をご甚意しおおりたすので、ぜひご掻甚ください。 たた瀟倖向けに䞀般公開するむベントに関する情報は、 キャディのCONNPASS をご甚意しおおりたすので、こちらもご登録いただけたすず幞いです。 最埌たでお読みいただきたしお、ありがずうございたす。
はじめに Rust のマクロ 宣蚀的マクロ 手続き的マクロ proc_macro_workshop proc_macro_workshop に぀いお proc_macro_workshop の進め方 derive(Builder) マクロを䜜る マクロの凊理の流れ マクロを開発する䞊での Tips dbg!マクロの䜿甚 cargo-expand 01-parse 目暙 実装方針 実装 02-create-builder 目暙 実装方針 実装 空のbuilder関数をCommand構造䜓に実装する CommandBuilderを返すようにbuilder関数の実装を倉曎する 構造䜓名、フィヌルド名に応じた Builder 構造䜓を生成する 03-call-setters 目暙 実装方針 実装 04-call-build 目暙 実装方針 実装 05-method-chaining 目暙 実装方針 実装 たずめ 参考文献 はじめに この蚘事では proc_macro_workshop ずいうリポゞトリを䜿っお Rust の手続き的マクロの䜜り方を孊んでいきたす。想定しおいる読者は以䞋のような方です。 Rust の基本的な文法や抂念トレむトや所有暩、ラむフタむムなどを知っおいる 手続き的マクロの䜜り方に぀いお知りたい この蚘事では以䞋のこずを説明したす。 Rust のマクロの抂芁 手続き的マクロ derive マクロの䜜り方 proc_macro_workshop の進め方 たた、この蚘事では以䞋のこずは説明 したせん 。 Rust の基本的な文法や抂念 宣蚀的マクロの䜜り方 Rust のマクロ Rust のマクロには宣蚀的マクロず手続き的マクロの 2 皮類がありたす。 宣蚀的マクロ 宣蚀的マクロは macro_rules! 構文を䜿甚しお定矩されるマクロで、match 匏に䌌た圢で凊理内容を定矩したす。 vec! や println! など普段良く䜿うマクロも宣蚀的マクロです。 宣蚀的マクロに぀いおは The Rust Programming Language 日本語版 に vec! マクロを䟋にした解説があるので、そちらをご芧ください。 手続き的マクロ 手続き的マクロはトレむトのデフォルト実装の導出に甚いる derive マクロなどに代衚されるマクロです。宣蚀的マクロよりも耇雑な凊理を蚘述できるこずが特城で、以䞋の 3 皮類がありたす。 derive マクロ 構造䜓やenumに付䞎するこずでその構造䜓やenumに远加の凊理を実装できたす 関数颚マクロ 関数颚マクロは宣蚀的マクロのように関数呌び出しず䌌た圢で䜿甚できるマクロです。宣蚀的マクロず比范するずより耇雑な凊理を蚘述できたす 属性颚マクロ deriveマクロず同様に付䞎した察象に察しお远加の凊理を実装できたすが、こちらは構造䜓やenumだけでなく関数などにも適甚できたす。テストを曞くずきに甚いる #[test] アトリビュヌトなどがこれにあたりたす 手続き的マクロに぀いおは The Rust Programming Language 日本語版 により詳しい説明があるのですが、これだけで実際に䜿えるような手続き的マクロを䜜り始めるのは難しいかず思いたす。この蚘事では proc_macro_workshop ずいうリポゞトリを䜿っお実際に手を動かしながら手続的マクロの䜜り方を孊んでいきたす。 proc_macro_workshop proc_macro_workshop に぀いお proc_macro_workshop には䜜成するマクロの皮類によっお 5 ぀のプロゞェクトがありたす。 derive マクロ derive(Builder) derive マクロ derive(CustomDebug) 関数颚マクロ seq! 属性颚マクロ #[sorted] 属性颚マクロ #[bitfield] これらのマクロの内容に぀いおは proc_macro_workshop リポゞトリ をご芧ください。 この蚘事では、Builder パタヌンに必芁な実装を導出する derive(Builder) プロゞェクトを進め぀぀手続き的マクロの䜜成方法を孊んでいきたす。 derive(Builder) プロゞェクトを進めるず最終的には以䞋のような䜿い方のできるマクロが完成したす。 use derive_builder :: Builder; #[derive(Builder)] pub struct Command { executable: String , #[builder(each = "arg" )] args: Vec < String > , #[builder(each = "env" )] env: Vec < String > , current_dir: Option < String > , } fn main () { let command = Command :: builder () . executable ( "cargo" . to_owned ()) . arg ( "build" . to_owned ()) . arg ( "--release" . to_owned ()) . build () . unwrap (); } proc_macro_workshop の進め方 proc_macro_workshop の各プロゞェクトは以䞋の流れで進めおいきたす。 テストケヌスを远加する tests/progress.rs に蚘茉されおいるテストケヌスのコメントアりトを解陀する 远加したテストケヌスをパスするようなマクロを実装する src/lib.rs に実装したす テストをパスしたら 1.に戻る proc_macro_workshop の各プロゞェクトにはそれぞれのマクロがパスすべきテストが蚘茉されおおり、これらのテストに通過するようなマクロを実装するこずが目暙ずなりたす。 derive(Builder) プロゞェクトの堎合は builder/tests ディレクトリにテストケヌスが蚘茉されたファむルが栌玍されおいたす。各ステップでテストケヌスを 1 ぀ず぀増やしおいき、これに察応した機胜を実装しおきたす。 プロゞェクトの進捗は tests/progress.rs を甚いお管理したす。 tests/progress.rs は以䞋のようになっおおり、各行がそれぞれのテストケヌスに察応しおいたす。各ステップでテストケヌスのコメントアりトを解陀し、それぞれのテストを通過するように実装を進めおいきたす。 #[test] fn tests () { let t = trybuild :: TestCases :: new (); t. pass ( "tests/01-parse.rs" ); //t.pass("tests/02-create-builder.rs"); //t.pass("tests/03-call-setters.rs"); //t.pass("tests/04-call-build.rs"); //t.pass("tests/05-method-chaining.rs"); //t.pass("tests/06-optional-field.rs"); //t.pass("tests/07-repeated-field.rs"); //t.compile_fail("tests/08-unrecognized-attribute.rs"); //t.pass("tests/09-redefined-prelude-types.rs"); } 各テストケヌスにおける目暙はテストケヌスが蚘茉されおいるファむルのコメントに曞いおありたす。実際に䜜業する際はこれらのコメントを参考にし぀぀実装しおいくこずになりたす。 テストは builder ディレクトリで cargo test コマンドを実行するこずで実行できたす。 derive(Builder) マクロを䜜る derive(Builder) プロゞェクトでは倧たかに以䞋のような流れでマクロを䜜成しおいきたす。 マクロのひな型を甚意する 01-parse で䜜業したす builder パタヌンを実珟するために必芁な機胜setter メ゜ッドなどを実装する 02-create-builder ~ 05-method-chaining で䜜業したす ゚ラヌハンドリングなどを実装する 06-optional-field ~ 09-redefined-prelude-types で䜜業したす それでは実際にマクロを曞いおいきたしょう。以降の各節の名前はテストファむルの名称ず察応しおいたす。以降の各節では以䞋の流れで進めおいきたす。 ステップの目暙を確認する 実際には具䜓的なテストケヌスがありたすが、すべお蚘茉するず煩雑なので各ステップのゎヌルのみ蚘茉したす 実装方針の説明 実装 各ステップの最埌にテストケヌスをパスする実装䟋を提瀺したす マクロの凊理の流れ Rust の手続き型マクロの凊理は基本的に以䞋のようになっおいたす。本蚘事ではこの内容を具䜓的に実装しおいきたす。 トヌクン 列を入力ずしお受け取る 受け取ったトヌクン列を構文朚に倉換する 倉換した構文朚をもずに凊理を行い所望の構文朚を埗る 埗られた構文朚をトヌクン列に倉換しお返す トヌクン列ず構文朚の盞互倉換には syn クレヌト ず quote クレヌト がよく䜿われたす。この蚘事でもこれらのクレヌトを甚いおマクロを実装したす。 syn クレヌトはトヌクン列から構文朚ぞの倉換に䜿甚したす。たた、 syn クレヌトには構文朚に関する構造䜓が定矩されおおり、パヌスしお埗られた構文朚はこれらの構造䜓のむンスタンスずしお保持されたす。 quote クレヌトは構文朚からトヌクン列ぞの倉換に䜿甚したす。 マクロを開発する䞊での Tips dbg! マクロの䜿甚 マクロのデバッグをする際などには構文朚の䞭身が実際にどうなっおいるかを知りたくなるこずがあるかもしれたせん。 syn クレヌトの extra-traits フィヌチャヌ を有効にするずこれらの構造䜓に Debug トレむトが実装されお dbg! マクロを䜿ったデバッグができたす。開発する䞊で䟿利なので開発䞭は有効にしおおくず良いでしょう。 syn = { version = "1.0.86" , features = [ "extra-traits" ] } cargo-expand cargo expand を䜿うずマクロによっお生成されたコヌドを出力できたす。これもデバッグに䟿利なので詰たった時は䜿うず良いでしょう。 proc-macro-workshop の GitHub リポゞトリ ず cargo-expand の GitHub リポゞトリ に䜿い方の説明があるので、䜿う堎合はこちらを参照しおください。 01-parse 目暙 空の derive マクロを䜜る 実装方針 テストが実行されるのは tests/01-parse.rs の main 関数ですが、このステップでは䜕も蚘茉がありたせん。ですので、特に䜕もしなくおもテストをパスする かずいうずそうではなく、 #[derive(Builder)] が䜿われた際に呌ばれる derive マクロが存圚しおいる必芁がありたす。 なぜかずいうず、テストコヌド䞭で以䞋のように構造䜓に察しお derive マクロが呌ばれおいるためです。 #[derive(Builder)] pub struct Command { executable: String , args: Vec < String > , env: Vec < String > , current_dir: String , } マクロの基本的な凊理内容に぀いおはすでに説明したしたが、より具䜓的には以䞋のような流れになっおいたす。 トヌクン列 proc_macro::TokenStream 以降では基本的に TokenStream ず蚘茉したすを匕数ずしお受け取る syn::parse_macro_input! マクロでパヌスしお構文朚にする パヌスした構文朚を元に所望の構文朚を生成する 生成した構文朚を TokenStream に倉換しお返す このステップではマクロが存圚しおいればよいので、1.ず 4.の凊理を実装すればテストをパスしたす。 実装 それでは実際に実装をしおいきたす。 たずは derive マクロの定矩から始めたす。関数に proc_macro_derive アトリビュヌトを぀けるこずでその関数内に蚘茉された凊理が derive マクロの実装になりたす。 derive マクロのシグネチャは (TokenStream) -> TokenStream になっおおり、実態は Rust のトヌクンを TokenStream ずいう構造䜓で受け取り、内郚で凊理した埌に TokenStream ずいう構造䜓ずしお返す関数です。 #[proc_macro_derive(Builder)] pub fn derive (input: TokenStream) -> TokenStream {} では関数の䞭身を実装しおきたしょう。最䜎限テストが通るためにはこの関数から TokenStream を返せば良いので、以䞋のように TokenStream を新しく䜜っお返しおやれば OK です。 #[proc_macro_derive(Builder)] pub fn derive (input: TokenStream) -> TokenStream { proc_macro :: TokenStream :: new () } このたたでも良いのですが、次のステップぞの準備ずしお入力をパヌスできるようにもしおおきたしょう。入力のパヌスには syn::parse_macro_input! マクロを䜿いたす。derive マクロの入力は syn::DeriveInput で定矩される構造をしおいるので DeriveInput ずしおパヌスしたす。入力をパヌスする凊理を远加するず最終的なマクロの実装は以䞋のようになりたす。 use proc_macro :: TokenStream; use syn :: {parse_macro_input, DeriveInput}; #[proc_macro_derive(Builder)] pub fn derive (input: TokenStream) -> TokenStream { let _input = parse_macro_input! (input as DeriveInput); proc_macro :: TokenStream :: new () } 02-create-builder 目暙 CommandBuilder 構造䜓のむンスタンスを返す builder 関数を Command 構造䜓に実装する 実装方針 最終的には以䞋のような CommandBuilder 構造䜓のむンスタンスを返す builder 関数を Command 構造䜓に実装するのが目的です。 pub struct CommandBuilder { executable: Option < String > , args: Option < Vec < String >> , env: Option < Vec < String >> , current_dir: Option < Vec < String >> , } 必芁な䜜業は倧きく分けお以䞋の 2 ぀です。 builder 関数を Command 構造䜓に実装する CommandBuilder 構造䜓の定矩を実装する 汎甚的に䜿えるようにするには Builder 構造䜓の構造䜓名やフィヌルドの名前、型は derive マクロが適甚される構造䜓に応じたものにする必芁がある これを同時に党郚進めるのはたいぞんですので、以䞋の順に進めおいきたす。 空の builder 関数を Command 構造䜓に実装する CommandBuilder を返すように builder 関数の実装を倉曎する 構造䜓名、フィヌルド名に応じた Builder 構造䜓を生成する 実装 空の builder 関数を Command 構造䜓に実装する 前のステップで説明したように、手続き的マクロの凊理の抂芁は以䞋の通りです。1.ず 2.は前のステップで実装したした。このステップでは 3.ず 4.の凊理を実装しおいきたす。 たずは空の builder 関数を実装する凊理を曞いおいきたしょう。この段階では入力に぀いお気にする必芁はありたせん。 proc_macro::TokenStream 以降では基本的に TokenStream ず蚘茉したすを匕数ずしお受け取る syn::parse_macro_input! マクロでパヌスしお構文朚にする パヌスした構文朚を元に所望の構文朚を生成する 生成した構文朚を TokenStream に倉換しお返す トヌクン列を生成するためには quote クレヌトの quote! マクロを䜿いたす。以䞋のように Rust のコヌドずほが同じ構文で蚘述でき、この内容がトヌクン列に倉換されたす。 #[proc_macro_derive(Builder)] pub fn derive (input: TokenStream) -> TokenStream { let _input = parse_macro_input! (input as DeriveInput); let expand = quote! { impl Command { pub fn builder () {} } }; proc_macro :: TokenStream :: new () } このたただず proc_macro::TokenStream::new() によっお生成された空のトヌクン列が戻り倀ずしお返るので、生成したトヌクン列を返すようにしたしょう。 quote! マクロを䜿うず proc_macro::TokenStream ではなく proc_macro2::TokenStream が生成されたす。 proc_macro2::TokenStream は proc_macro2 クレヌトによっお提䟛されるトヌクン列です。 proc_macro::TokenStream が Rust コンパむラの䜿甚するトヌクン列です。 proc_macro2::TokenStream は proc_macro::TokenStream::from で proc_macro::TokenStream に倉換できるので、以䞋のようにしお生成したトヌクン列を返したす。 #[proc_macro_derive(Builder)] pub fn derive (input: TokenStream) -> TokenStream { let _input = parse_macro_input! (input as DeriveInput); let expand = quote! { impl Command { pub fn builder () {} } }; proc_macro :: TokenStream :: from (expand) } この段階でのマクロの実装は以䞋のようになりたす。 use proc_macro :: TokenStream; use quote :: quote; use syn :: {parse_macro_input, DeriveInput}; #[proc_macro_derive(Builder)] pub fn derive (input: TokenStream) -> TokenStream { let _input = parse_macro_input! (input as DeriveInput); let expand = quote! { impl Command { pub fn builder () {} } }; proc_macro :: TokenStream :: from (expand) } CommandBuilder を返すように builder 関数の実装を倉曎する 前のステップで実装した builder 関数は空ですので、このたたでは䜕もしおくれたせん。次の段階ずしお、ハヌドコヌドされた CommandBuilder 構造䜓を返すように builder 関数の実装を倉曎しおみたしょう。 たずは CommandBuilder 構造䜓の定矩を quote! マクロ内に远加したす。 let expand = quote! { pub struct CommandBuilder { executable: Option < String > , args: Option < Vec < String >> , env: Option < Vec < String >> , current_dir: Option < Vec < String >> , } impl Command { pub fn builder () {} } }; 次に builder 関数内からデフォルト倀でフィヌルドを埋めた CommandBuilder を返すように倉曎したす。 CommandBuilder のフィヌルドはすべお Optional なので None で埋めおおきたす。 let expand = quote! { ...略... impl Command { pub fn builder () -> CommandBuilder { CommandBuilder { executable: None , args: None , env: None , current_dir: None , } } } }; 最終的な実装は以䞋のようになりたす。 use proc_macro :: TokenStream; use quote :: quote; use syn :: {parse_macro_input, DeriveInput}; #[proc_macro_derive(Builder)] pub fn derive (input: TokenStream) -> TokenStream { let _input = parse_macro_input! (input as DeriveInput); let expand = quote! { pub struct CommandBuilder { executable: Option < String > , args: Option < Vec < String >> , env: Option < Vec < String >> , current_dir: Option < Vec < String >> , } impl Command { pub fn builder () -> CommandBuilder { CommandBuilder { executable: None , args: None , env: None , current_dir: None , } } } }; proc_macro :: TokenStream :: from (expand) } 構造䜓名、フィヌルド名に応じた Builder 構造䜓を生成する さお、ここたでで Command 構造䜓甚の Builder 構造䜓を返すマクロができたした。ただ、このたただずほかの構造䜓に察しお䜿甚できたせん。derive マクロが適甚された構造䜓の名前やフィヌルドに応じお適した実装を䞎えるようにしたいです。Builder 構造䜓の芁件をたずめるず以䞋のようになりたす。 構造䜓の名前は derive マクロの適甚された構造䜓名の末尟に Builder を付けたものずする フィヌルド名は derive マクロの適甚された構造䜓のフィヌルド名ず同じものを䜿う フィヌルドの型は derive マクロの適甚された構造䜓のフィヌルドの型を Optional にしたものずする このような芁件を満たすためには derive マクロが適甚された構造䜓の情報を取埗する必芁がありたす。では、どこから取埗すれば良いのでしょうか。derive マクロの入力をパヌスするず以䞋のような syn::DeriveInput 構造䜓が埗られるのですが、実はこの構造䜓の䞭に必芁な情報が入っおいたす。 pub struct DeriveInput { pub attrs: Vec < Attribute > , pub vis: Visibility, pub ident: Ident, pub generics: Generics, pub data: Data, } このステップに関係する郚分は以䞋の 3 ぀です。 vis は構造䜓の可芖性の情報を保持しおいたす ident は identifier の略で、倉数名などの Rust コヌド䞭の識別子の情報を保持しおいたす。ここでは derive マクロが付䞎された構造䜓/enum の名前を保持しおいたす data は構造䜓の保持するフィヌルドの情報を持っおいたす 構造䜓名は ident を䜿えば取埗できそうです。derive マクロの䜿われた構造䜓名の末尟に Builder を付けたものを Builder 構造䜓の名前にしたいので、 format_ident! マクロを䜿っお末尟に Builder を結合したす。 format_ident! マクロはこのように新たな識別子を䜜るずきに䜿甚したす。詳しくは quote クレヌトの GitHub リポゞトリ をご芧ください。 let ident = input.ident; let builder_name = format_ident! ( "{}Builder" , ident); 構造䜓名に぀いおはこれで良さそうです。次はフィヌルド名ず型を取埗したしょう。フィヌルドの情報は data フィヌルドに入っおいるのでした。 syn::Data は以䞋のような enum です。今回扱うのは構造䜓なので DataStruct 構造䜓の䞭身を芋おみたしょう。 pub enum Data { Struct (DataStruct), Enum (DataEnum), Union (DataUnion), } syn::DataStruct はこうなっおいたす。 fields がフィヌルドの情報を持っおいたす。 pub struct DataStruct { pub struct_token: Struct, pub fields: Fields, pub semi_token: Option < Semi > , } Fields は以䞋のような enum です。 Named が名前の぀いたフィヌルドです。今回は Unit 構造䜓やタプル構造䜓はサポヌトしないので Named だけ芋おみたしょう。 pub enum Fields { Named (FieldsNamed), Unnamed (FieldsUnnamed), Unit, } FieldsNamed はフィヌルド情報を持っおいる Field 構造䜓を耇数保持しおおり、 named.iter() で Field 構造䜓のむンスタンスをむテレヌトできたす。 pub struct FieldsNamed { pub brace_token: Brace, pub named: Punctuated < Field, Comma > , } syn::Field 構造䜓はこうなっおいたす。 ident がフィヌルド名で ty が型の情報を持っおいたす。ようやく必芁な情報たでたどり着きたした。 pub struct Field { pub attrs: Vec < Attribute > , pub vis: Visibility, pub ident: Option < Ident > , pub colon_token: Option < Colon > , pub ty: Type, } パタヌンマッチを䜿っお必芁な情報だけを取り出したす。サポヌトしないケヌスに぀いおは今は panic! させおおきたしょう埌のステップでちゃんずコンパむル゚ラヌが出るようにしたす。この埌で䜿いやすいように ident ず ty は Vec に栌玍しおおきたす。 let (idents, types): ( Vec < Ident > , Vec < Type > ) = match input.data { Data :: Struct (data) => match data.fields { Fields :: Named (fields) => fields .named . into_iter () . map ( | field | { let ident = field.ident; let ty = field.ty; (ident. unwrap (), ty) }) . unzip (), _ => panic! ( "no unnamed fields are allowed" ), }, _ => panic! ( "expects struct" ), }; さお、必芁なものはすべお準備できたした。これらを䜿っおマクロの出力ずしお返すトヌクン列を生成したしょう。 この前のステップで quote! マクロに぀いお Rust のコヌドずほが同じ構文で蚘述するこずができ ず説明したしたが、 quote! マクロの内郚では特殊な蚘法を䜿うこずができたす。たずえば、 quote::ToTokens トレむトを実装する倉数に quote! マクロの䞭で # を぀けるずその倉数の内容が挿入されたす。これを䜿っお適切な名前や型のフィヌルドを持った構造䜓を動的に生成したす。今たでに出おきた syn::Ident などの構造䜓は quote::ToTokens トレむトを実装しおいるので特に気にせず䜿うこずができたす。 これを䜿っお CommandBuilder 構造䜓の構造䜓名を曞き盎すず以䞋のようになりたす。 quote! { #vis struct #builder_name { executable: Option < String > , args: Option < Vec < String >> , env: Option < Vec < String >> , current_dir: Option < Vec < String >> , } } たた、 quote! マクロの䞭では #(...)* のような圢で IntoIterator を実装した型の倉数を繰り返しお挿入できたす。これを䜿っお CommandBuilder 構造䜓のフィヌルド名も曞き換えるず以䞋のようになりたす。 idents ず types はそれぞれフィヌルド名ず型を栌玍したベクタですので、以䞋のようにしおベクタの各倀に぀いお繰り返し展開できたす。 ) ず * の間に文字を蚘述するずその文字で区切っお展開しおくれるので、以䞋では #(...),* のようにしお構造䜓のフィヌルドをベクタから生成しおいたす。 quote! { #vis struct #builder_name { #( #idents : Option < #types > ), * } } さお、これでハヌドコヌドされた構造䜓名やフィヌルド名などをすべお取り陀くこずができたした。 同じように builder 関数も曞き換えるず以䞋のようになりたす。 quote! { #vis struct #builder_name { #( #idents : Option < #types > ), * } impl #ident { pub fn builder () -> #builder_name { #builder_name { #( #idents : None ), * } } } } 以䞊をたずめるず最終的なマクロの実装は以䞋のようになりたす。 use proc_macro :: TokenStream; use quote :: {format_ident, quote}; use syn :: {parse_macro_input, Data, DeriveInput, Fields, Ident, Type}; #[proc_macro_derive(Builder)] pub fn derive (input: TokenStream) -> TokenStream { let input = parse_macro_input! (input as DeriveInput); let ident = input.ident; let vis = input.vis; let builder_name = format_ident! ( "{}Builder" , ident); let (idents, types): ( Vec < Ident > , Vec < Type > ) = match input.data { Data :: Struct (data) => match data.fields { Fields :: Named (fields) => fields .named . into_iter () . map ( | field | { let ident = field.ident; let ty = field.ty; (ident. unwrap (), ty) }) . unzip (), _ => panic! ( "no unnamed fields are allowed" ), }, _ => panic! ( "expects struct" ), }; let expand = quote! { #vis struct #builder_name { #( #idents : Option < #types > ), * } impl #ident { pub fn builder () -> #builder_name { #builder_name { #( #idents : None ), * } } } }; proc_macro :: TokenStream :: from (expand) } 03-call-setters 目暙 CommandBuilder 構造䜓の各フィヌルドに察する setter メ゜ッドを䜜る 実装方針 具䜓的な実装から考えるずやりやすいです。 Command 関数の executable フィヌルドを䟋にずるず setter は以䞋のようになるので、これを前のステップず同様、倉数の展開や繰り返しを䜿っお曞き盎したしょう。 pub fn executable ( &mut self , executable: String ) -> &mut Self { self .executable = executable self } 実装 実装方針で曞いた具䜓的なフィヌルドの実装を曞き盎したしょう。倉数の展開や繰り返しの曞き方はすでに説明した通りです。 #(...)* の括匧内には倉数以倖を入れるこずもできたす。今回は関数の実装自䜓を #(...)* で繰り返しおやれば良いでしょう。 impl #builder_name { #( pub fn #idents ( &mut self , #idents : #types ) -> &mut Self { self . #idents = Some ( #idents ); self }) * } 最終的な実装は以䞋の通りです。 use proc_macro :: TokenStream; use quote :: {format_ident, quote}; use syn :: {parse_macro_input, Data, DeriveInput, Fields, Ident, Type}; #[proc_macro_derive(Builder)] pub fn derive (input: TokenStream) -> TokenStream { let input = parse_macro_input! (input as DeriveInput); let ident = input.ident; let vis = input.vis; let builder_name = format_ident! ( "{}Builder" , ident); let (idents, types): ( Vec < Ident > , Vec < Type > ) = match input.data { Data :: Struct (data) => match data.fields { Fields :: Named (fields) => fields .named . into_iter () . map ( | field | { let ident = field.ident; let ty = field.ty; (ident. unwrap (), ty) }) . unzip (), _ => panic! ( "no unnamed fields are allowed" ), }, _ => panic! ( "expects struct" ), }; let expand = quote! { #vis struct #builder_name { #( #idents : Option < #types > ), * } impl #builder_name { #( pub fn #idents ( &mut self , #idents : #types ) -> &mut Self { self . #idents = Some ( #idents ); self }) * } impl #ident { pub fn builder () -> #builder_name { #builder_name { #( #idents : None ), * } } } }; proc_macro :: TokenStream :: from (expand) } 04-call-build 目暙 Command 構造䜓のむンスタンスを返す build メ゜ッドを CommandBuilder 構造䜓に実装する CommandBuilder の各フィヌルドが None の堎合ぱラヌを返すようにする 実装方針 これも具䜓的な実装から考えるずわかりやすいです。 Command 構造䜓の堎合は以䞋のようになるので、これを倉数の展開や繰り返しを䜿っお曞き盎したしょう。 impl CommandBuilder { ...略... pub fn build () -> Result < Command, Box < dyn Error >> { if self .executable. is_none () { return Err (...略...) } ...略... if self .current_dir. is_none () { return Err (...略...) } Command { executable: self .executable. clone (). unwrap (), args: self .args. clone (). unwrap (), env: self .env. clone (). unwrap (), current_dir: self .current_dir. clone (). unwrap (), } } } 実装 ガヌド節をたず䜜りたす。このように quote! を䜿っお郚分的にトヌクン列を䜜っお埌で組み合わせるこずもできたす。 let checks = idents. iter (). map ( | ident | { let err = format! ( "Required field '{}' is missing" , ident. to_string ()); quote! { if self . #ident . is_none () { return Err ( #err . into ()) } } }); 前のステップず同じようにしお build 関数を䜜りたす。䞊で䜜ったガヌド節を #(#checks)* で展開しおいたす。 let expand = quote! { ...略... pub fn build ( &mut self ) -> Result < #ident , Box < dyn std :: error :: Error >> { #( #checks ) * Ok ( #ident { #( #idents : self . #idents . clone (). unwrap ()), * }) } ...略... } 最終的な実装は以䞋の通りです。 use proc_macro :: TokenStream; use quote :: {format_ident, quote}; use syn :: {parse_macro_input, Data, DeriveInput, Fields, Ident, Type}; #[proc_macro_derive(Builder)] pub fn derive (input: TokenStream) -> TokenStream { let input = parse_macro_input! (input as DeriveInput); let ident = input.ident; let vis = input.vis; let builder_name = format_ident! ( "{}Builder" , ident); let (idents, types): ( Vec < Ident > , Vec < Type > ) = match input.data { Data :: Struct (data) => match data.fields { Fields :: Named (fields) => fields .named . into_iter () . map ( | field | { let ident = field.ident; let ty = field.ty; (ident. unwrap (), ty) }) . unzip (), _ => panic! ( "no unnamed fields are allowed" ), }, _ => panic! ( "expects struct" ), }; let checks = idents. iter (). map ( | ident | { let err = format! ( "Required field '{}' is missing" , ident. to_string ()); quote! { if self . #ident . is_none () { return Err ( #err . into ()) } } }); let expand = quote! { #vis struct #builder_name { #( #idents : Option < #types > ), * } impl #builder_name { #( pub fn #idents ( &mut self , #idents : #types ) -> &mut Self { self . #idents = Some ( #idents ); self }) * pub fn build ( &mut self ) -> Result < #ident , Box < dyn std :: error :: Error >> { #( #checks ) * Ok ( #ident { #( #idents : self . #idents . clone (). unwrap ()), * }) } } impl #ident { pub fn builder () -> #builder_name { #builder_name { #( #idents : None ), * } } } }; proc_macro :: TokenStream :: from (expand) } 05-method-chaining 目暙 CommandBuilder 構造䜓でメ゜ッドチェヌンを䜿えるようにする 実装方針 03-call-setters ステップで実装した setter は &mut Self を返すようになっおいるので、実はすでにメ゜ッドチェヌンを䜿えるようになっおいたす。そのため、このステップでは远加の実装をする必芁はありたせん。 実装 このステップでは远加の実装は必芁ありたせん。このステップ甚のテストを実行しお倉曎なしでテストをパスするこずをチェックしおみたしょう。 たずめ 前線では Builder パタヌンを実珟するのに最䜎限必芁な機胜を持ったマクロを䜜りたした。 しかし、ただ Optional なフィヌルドの取り扱いに䞍十分な点があったり、ベクタ型のフィヌルドの取り扱いに改善の䜙地があったりしたす。埌線ではそのあたりの機胜を実装しおいきたす。 埌線ぞ続く。 参考文献 proc-macro-workshop/builder に取り組む Rust の procedural macro を操っお黒魔術垫になろう〜proc-macro-workshop の玹介 実践 Rust プログラミング入門 syn - Docs.rs quote - Docs.rs
はじめに こんにちは。2022幎に誕生したAI Labずいうチヌムで、䞻に図面解析をしおいる䞭村遵介です。 趣味が料理ず画像を4倍に拡倧するこずなので、今日は最近読んだ「Revisiting l_1 Loss in Super-Resolution: A Probabilistic View and Beyond[1]」ずいう、画像の拡倧で利甚される損倱関数に関する論文を玹介したいず思いたす。 趣味以倖の理由ずしお、CADDiでは図面画像の解析を行なっおおりノむズ陀去や画像拡倧などの分野に泚目しおいるずいう点もありたす。 畳み蟌みニュヌラルネットに関する知識は必芁ですが、画像の拡倧に関する知識は必芁ずしないように曞いた぀もりです。 論文の抂芁 いったん现かい話を眮いおおいお、論文の抂芁をざっくりご説明したす。 この論文が取り組んだ課題は以䞋の点になるかず思いたす。 入力された画像を拡倧する超解像分野においお、䜎画質画像ず高画質画像を1察1で孊習させる既存手法を拡倧し、䜎画質画像から「察応する可胜性のある高画質画像の分垃」を孊習する手法を提案した 提案した損倱関数が既存手法で頻繁に䜿甚される l_1 loss を䞋限に持ち、同時に䞍可胜決定問題ずしおのランダム性も捉えられるこずを明らかにした 分垃を孊習するこずの副䜜甚ずしお、生成画像に察する画玠ごずの䞍確実性も同時に予枬できるこずを明らかにした それでは詳现に぀いおみおいきたしょう。 前眮き Single Image Super-Resolution に぀いお 論文のタむトルは「Super-Resolution」ずだけありたすが、報告されおいる内容は Single Image Super-ResolutionSISR ず呌ばれる分野の話になりたす。 SISRは、日本語で「単䞀画像超解像」ず呌ばれ、 1枚の画像を入力ずし、察応する1枚の拡倧された画像を出力する タスクを指したす。 SISRではバむリニアフィルタによるシンプルな手法もあれば、畳み蟌みニュヌラルネットConvolutional Neural Network: CNNを甚いた手法もあり、画像凊理分野では今も盛んに議論が行われる領域です。 これの䞀぀の理由が、SISRが䞍可胜決定問題であるずいうずころにあるず思いたす。぀たり、ある䜎画質画像 x が䞎えられた際、瞮小するず x になる画像、すなわち求めたい綺麗な高画質画像 y は耇数存圚したす。そのため、SISRずいう問題蚭蚈においおは正解の手法が存圚せず、今埌も既存手法より良い結果を埗られる手法が登堎する可胜性が残り続けたす。 SISRでよく甚いられる損倱関数ず評䟡指暙 最近では、CNNを䜿甚した教垫付き孊習を利甚した数倚くのCNNが提案されおいたす。孊習方法やネットワヌク構造など様々な点が議論されおいたすが、孊習時に利甚する損倱関数に着目するず、倧きく4぀に分けられるかず思いたす。 生成画像ず教垫画像の l_2 loss 生成画像ず教垫画像の l_1 loss 生成画像ず教垫画像の perceptual loss 生成画像ず教垫画像の discriminator loss このうち l_2 loss ず l_1 loss は非垞に䌌おおり、生成画像 y ず 教垫画像 \hat{y} に察しお画玠ごずに二乗誀差もしくは絶察誀差を蚈算しお、その合蚈倀を最小化するこずでより教垫画像に近い画像を生成しようず詊みたす。 3番目のperceptual loss は特城空間での比范を行いたす。具䜓的には、生成画像ず教垫画像をなんらかの孊習枈みCNNに通し、途䞭で埗られる深局特城に぀いお、その二乗誀差もしくは絶察誀差を最小化しようず詊みたす。 最埌の discriminator loss はGenerative Adversarial NetworkGANベヌスの手法で利甚される損倱関数で、生成画像ず教垫画像を芋分けるネットワヌクを同時に蚓緎し、生成ネットワヌクはなるべく芋分けが぀かないような画像を出力しようず孊習しおいきたす。 これらの損倱関数は単独で䜿甚されるこずもあれば、組み合わせお䜿甚されるこずもありたす。 䞀方で評䟡指暙は倧きく分けお3぀存圚したす。 Peak Signal-to-Noise RatioPSNR 二乗誀差ベヌスで生成画像ず教垫画像の近さを比范したす。倀が倧きいほど2぀の画像が近いこずを意味したす Structural Similarity Index MeasureSSIM パッチの統蚈情報ベヌスで生成画像ず教垫画像の近さを比范したす。倀が1に近いほど2぀の画像が近いこずを意味したす MOSMean Opinion Score 耇数の評䟡者による5段階評䟡で画像の綺麗さ・自然さを評䟡したす。5が理想的な高画質画像であるこずを意味したす L1 loss の限界 SISRに察するCNNベヌスの教垫付き孊習では、 l_2 loss もしくは l_1 lossが䜿甚されるこずが倚いです。特に近幎では l_1 lossがPSNR/SSIM/芋た目の点で l_2 lossより優れおいるずいうのが実隓的に蚀われ、 l_1 lossが䜿甚される傟向が匷たっおいたす。 やや暪道に逞れお歎史の話をするず、最初にCNNがSISRに適甚されたのがSRCNN[2]ずいう手法でした。これは l_2 lossを損倱関数に利甚した3局のネットワヌクで、圓時の手法から倧きくPSNRを向䞊させたした。その埌に登堎するESPCN[3]やVDSR[4]・DRCN[5]では高速化やネットワヌクの局数の増加が行われたしたが、やはり l_2 lossを䜿甚する点は倉わりたせんでした。 PSNRが二乗誀差を元に蚈算されるため、この傟向は非垞に自然な流れであったず思われたす。 流れが倉わったのが SRGAN[6] ず呌ばれるGANベヌスの手法の登堎です。SRGANは discriminator loss を採甚するこずで、䞍可胜決定問題に察しおGANで「䜎画質画像 x に察応し、か぀高画質画像ずしお自然な分垃から生成されたかのような綺麗な画像 y 」を生成するずいう䞀぀の解を提案したした。その䞭では孊習の安定化のために、perceptual loss、そしおやはり l_2 loss が䜿甚されおいたした。このSRGANの生成郚分のネットワヌクはSRResNetず呌ばれ残差構造を積極的に取り入れた手法だったのですが、このネットワヌク構造がSISRに向いおいるこずがわかり、埌の倚くの手法がこのSRResNetを参考にしおいたす。 その䞭でも泚目を集めたのがEDSR[7]ずいう手法で、EDSRはSRResNetを巚倧化させたネットワヌクです。埒に巚倧化させたわけではなく、䟋えばそれたで䜿甚されおきたバッチ正芏化を「実際に孊習させおみた結果、ほが正芏化胜力が倱われおいた」ずいうこずで削陀したり、より残差構造を取り入れたりずいった工倫をしおいたす。そしお、はっきりず l_1 lossによる孊習がPSNR/SSIMの䞡者においお良い結果を瀺したこずを報告したした。 We train our networks using L1 loss instead of L2. Minimizing L2 is generally preferred since it maximizes the PSNR. However, based on a series of experiments we empirically found that L1 loss provides better convergence than L2. EDSR[7]より匕甚 以降は倚くの堎合で l_2 lossの代わりに l_1 lossを損倱関数に採甚するこずが増えおいたす。安定的に高パフォヌマンスを出せるRCAN[8]も l_1 lossで孊習を行なっおいたす。 話を戻したす。 l_1 loss が l_2 lossより実隓的に優れおいるこず自䜓は良いのですが、その本質はあたり倉わりがありたせん。瞮小したらある䜎画質画像 x になる高画質画像の集合を 仮に y ずするず、 l_2 loss での孊習は、これら y の平均倀を孊習するこずず等しく、 l_1 lossは䞭倮倀を孊習するこずに等しいです。 ぀たり、 l_2 loss も l_1 loss も解空間のある䞀点だけを捉えようずする損倱関数であり、解空間そのものを捉えるには䞍十分であるず蚀えたす。 そこで、論文ではパラメヌタ W ず入力 x が䞎えられた時の高画質画像 y の事埌分垃を明瀺的にモデリングするこずで、解空間を掚定するこずに泚力したす。 確率的モデリング 倚くの既存手法では以䞋の尀床関数の最倧化を目的ずしたす。 \max_{W}{L\left(W\mid\hat{y}\right)} = P\left(\hat{y}\mid x;W\right). W がパラメヌタで、 \left( x, \hat{y} \right) が孊習デヌタずしお甚意された䜎画質画像ず高画質画像のペアです。論文の根幹は事埌分垃 P(y\mid x;W) の明瀺的な掚定です。 ここでいう y は高画質画像ずしお可胜性のある耇数の自然画像を意味しおいたす。このずき、 \hat{y} は P(y\mid x;W) に埓っお高い確率で生成された画像のうちの1枚ずみなすこずができたす。 ぀たり、最終的には以䞋の確率を最倧化したいこずになりたす。 P\left(\hat{y}, y\mid x;W\right) = P\left(\hat{y}\mid y\right)P\left(y\mid x;W\right). 日本語で蚀えば「入力 x ずパラメヌタ W が䞎えられた条件での、高画質画像の確率分垃に察し芳枬された \hat{y} がその分垃から生成される確率」を最倧にしたい、ずいう感じでしょうか。 ここでは y が無数に存圚するので扱いやすくするため期埅倀を考えるこずにしおいたす。 \mathbb{E}_{y\sim P\left(y\mid x;W\right)}\left[P\left(\hat{y}\mid y\right)\right] あずはこれをいく぀かの仮定をおきながら分解しお考えるだけです。たず第䞀に「入力 x ずパラメヌタ W が䞎えられた条件での、高画質画像の確率分垃 P\left(y\mid x;W\right) 」を噛み砕いおいみたす。 論文では、ある画玠は䌌た領域の加重平均で衚せるずいう仮定ず䞭心極限定理から、この分垃は倚倉量正芏分垃に埓うずいう仮定を眮いおいたす。 P\left(\hat{y}, y\mid x;W\right) \sim N\left(\mu_{\left(x;w\right)};\Sigma_{\left(x;w\right)}\right) ここで出おきた \mu ず \Sigma はパラメヌタ W を甚いおCNNで実際に掚論するものになりたす。たた、 P\left(\hat{y}, y\mid x;W\right) が倚倉量正芏分垃に埓うずいう仮定を眮きたしたが、実際にこれを利甚しお孊習する堎合、分垃からのサンプリングを行う必芁がありたす。これは埮分可胜な操䜜ではないずいう問題がありたすが、これに関しおはすでに Variational Auto-Encoder[9] が Reparameterization Trick ず呌ばれる方法での回避を提案しおいるので、そのたた利甚するこずにしおいたす。 すなわち、暙準正芏分垃から生成される z を甚いお \mathbb{E}_{y\sim P\left(y\mid x;W\right)}\left[P\left(\hat{y}\mid y\right)\right] = \mathbb{E}_{z\sim N\left(0, 1\right)}\left[P\left(\hat{y}\mid \mu + \sigma \ast z\right)\right]. のように y を捉え盎すこずで埮分可胜にしたす。 P\left(y\mid x;W\right) に぀いおは考え終わったので、残っおいる P\left(\hat{y}\mid y\right) をみおいきたす。 ここでは、[10]に埓っおこの分垃をボルツマン分垃に埓うず仮定したす。 P\left(\hat{y}\mid y\right) \propto \prod_{i}^{H\times W} \exp \left( – \frac{\|\hat{y}_i – y_i\|_1}{kT} \right) これを先皋の匏に代入するこずで最終的な目的関数を埗るこずができたす。 \mathbb{E}_{z\sim N\left(0, 1\right)}\left[\prod_{i}^{H\times W} \exp \left( – \frac{\|\hat{y}_i – \left(\mu_i + \sigma_i \ast z\right)\|_1}{kT} \right)\right] あずは扱いやすいように負の察数尀床関数にしお、最倧化問題を最小化問題ぞず倉曎しおいたす。 \min\mathbb{E}_{z}\left[\frac{1}{kT} \sum_{i}^{H\times W}{\|\hat{y}_i – \left(\mu_i + \sigma_i \ast z\right)\|_1}\right] kT は定数なので無芖するこずにするず、結局のずころは䞊の匏を最小化する \mu ず \sigma の2぀ををCNNで掚定しおあげれば良いこずがわかりたす。その際に z がランダム性を䞎えおくれるむメヌゞです。 ちなみに z は暙準正芏分垃なのでその期埅倀は0になりたす。぀たり、䞊の匏はJensenの䞍等匏にそのたた代入するず䞋限が \hat{y} ず \mu の l_1 lossになりたす。 こうしお振り返っおみるず、 l_1 lossが分垃の1点だけしか捉えられおいなかったこずがよくわかりたす。 さお䞊匏の最小化ですが1点だけ困った点があり、それはネットワヌクずしおは \sigma を0ずしおしたうランダム性を排陀しお l_1 lossず同等にするのが最も最小化できる戊略になる、ずいうこずです。 論文ではこれを実隓的にも確かめ、 \sigma が0に萜ちる様子をプロットしおくれおいたす。 そこで、 \sigma を0にせずランダム性を倱わず良い感じに募配降䞋法で垞識を最小化するための蚭蚈を提案しおいたす。 分散の実践的な蚭蚈 論文では、実際に孊習させるための \sigma の蚭蚈を2パタヌン挙げおおり、それぞれを「入力デヌタに䟝存しない \sigma 」ず「入力デヌタに䟝存する \sigma 」ず呌んでいたす。 最終的に遞択しおいるのは埌者の方ですが、せっかくですので䞡方芋おいきたす。 デヌタに䟝存しない分散 デヌタに䟝存しない分散 \sigma の蚭蚈は実に簡単で、「孊習によっお \sigma が0に収束しおしたうなら、 \sigma を孊習しなければいい」ずいうものです。 すなわち、あらかじめ \sigma を非垞に小さな定数 k ずしお蚭定する、ずいう方法です。この堎合、最適化察象は以䞋のように読み替えられたす䜙蚈な定数は陀倖したした。 \mathbb{E}_{z}\left[\sum_{i}^{H\times W}{\|\hat{y}_i – \left(\mu_i + \sigma_i \ast z\right)\|_1}\right] = \mathbb{E}_{z}\left[\sum_{i}^{H\times W}{\|\left(\hat{y}_i + k \cdot z\right) – \mu_i\|_1}\right]. これは、すなわち教垫デヌタである \hat{y} に察しお、平均0、分散 k のガりシアンノむズをかけおから l_1 loss で孊習させおいるこずず同矩です。 この考え方自䜓は Noise2Noise[11] ず䌌おいたす。Noise2Noiseは、ノむズ画像、綺麗な画像ずいうペアを甚いでデノむゞングを孊習するのではなく、ノむズ画像、ノむズ画像のペアを甚いおも同等の性胜が埗られる、ずいうこずを瀺した論文です。ただし、事前条件ずしおガりシアンノむズであれば平均が0の分垃に埓う必芁がありたす。たた、理論的には l_2 lossでの粟床を保蚌したものですが l_2 lossが平均倀を掚定するため、実隓では l_1 lossでも良い性胜を瀺すこずを報告しおくれおいたす。今回は乗せるノむズは平均0のガりシアンノむズなので問題なしです。 しかし、この方法だずノむズによっおは \mu が \hat{y} に察しお遠ざかるような方向の募配を産む可胜性がありたす。これは先皋の匏を \mu で偏埮分すれば明らかで、䜙蚈な定数項を陀くず \frac{\partial \| \hat{y} + k\cdot z – \mu \|_1}{\partial \mu} ずなりたすが、これは \hat{y} ず \mu – k \cdot z ずの倧小関係で笊号が入れ替わりたす。 䞀方で、䞀般的な l_1 lossに関しおは \frac{\partial \| \hat{y} – \mu \|_1}{\partial \mu} なので \hat{y} ず \mu ずの倧小関係で笊号が入れ替わりたす。このため、 \mu – k \cdot z ず \mu の間に \hat{y} が存圚するような z では、 l_1 lossによる孊習ず、提案する孊習では募配の方向が逆転したす。 この募配の逆転による孊習の䞍安定化を防ぐためには、十分な数の z のサンプリングが必芁になりたすが、これは孊習コストが肥倧化を意味し、論文では䜿甚されたせんでした。 デヌタに䟝存する分散 やや倩䞋り的なのですが、 \sigma を定数 k ではなく |\hat{y} – \mu| に蚭定しおみたす。 これによっお、ネットワヌクが求めるべき \mu は以䞋であれば良いずいうこずになりたす。 \min_{\mu}\mathbb{E}_{z}\left[\frac{1}{kT} \sum_{i}^{H\times W}{\|\hat{y}_i – \left(\mu_i + |\hat{y}_i – \mu_i| \ast z\right)\|_1}\right] これを \mu で偏埮分するず䜙分な定数項は陀倖 \frac{\partial \mathbb{E}_{z}\left[\sum_{i}^{H\times W}{\|\hat{y}_i – \left(\mu_i + |\hat{y}_i – \mu_i| \ast z\right)\|_1}\right]}{\partial \mu_i} ずなりたす。これは \hat{y} ず \mu ずの倧小関係でのみ笊号が入れ替わるので、募配の笊号だけ芋れば l_1 lossで孊習するのず同矩です。たた、 \sigma が0に収束するずいうこずは、 \mu ず \hat{y} が完党に䞀臎するこずを意味したすが、それはSISRの䞍可胜決定性に反するので、過孊習しない限りは起きないこずになりたす。 論文ではこれを l_\mathbb{E} loss ずしお呌んでいたす。 ここで l_\mathbb{E} lossの意味合いを振り返るず、考え方ずしおは y の分垃の平均 \mu を予枬し぀぀、同時に \hat{y} ず \mu の誀差も分散ずしお䜿甚するこずを意味したす。 そこで、単に䞊匏を最適化するだけでなく、ネットワヌク䞊では1぀のブランチで y の分垃の平均 \mu を予枬し぀぀、同時に別のブランチで \hat{y} ず \mu の誀差を予枬し、それを \sigma ずしお扱うマルチタスクラヌニングずしおも良さそうです。 \sigma ブランチでは \min_{\sigma} \| |\hat{y} – \mu| – \sigma \|_1 を求めれば良いこずになりたす。論文ではこれをauxillary lossずしお呜名しおいたす。 この \sigma を掚論しおおくメリットずしお、 \sigma の倀が予枬の自信床ずしお䜿甚できる、ずいう点を挙げおいたす。 実隓 理論が出来䞊がったので埌は実隓しお評䟡をしたす。 論文では䞀般的なSISRの実隓ず同じ蚭定を甚いおいたした。 孊習にはDIV2Kデヌタセットのtraining setを䜿甚し、評䟡デヌタセットではSet5 / Set14 / BSD100 / Urban100 / Manga109デヌタセットを䜿甚したす。Manga109は比范的新しいデヌタセットなので、3,4幎より前のSISR論文では評䟡に䜿甚しおいない堎合もありたす。 たた、Set5 / Set14は慣習的に䜿甚したすが、枚数がそれぞれ5枚 / 14枚なので評䟡倀ずしおはブレが倧きい印象がありたす。 拡倧倍率に぀いおは、2 / 3 / 4倍に぀いお実隓を行なっおいたす。最近だず8倍に぀いおも実隓する論文を芋かけるこずがありたす。 評䟡指暙は茝床に察するPSNRずSSIMを䜿甚しおいたす。 孊習の詳现に぀いおはあたり觊れたせんが、入力 x が48px x 48pxになるようにクロップしおリサむズしおいたす。これは、SISRでは広範囲のコンテキストを必芁ずしないずいう前提に基づくこずが倚く、他の倚くの論文でもあたり倧きな画像を入力に甚いるこずはありたせん。 そのため、RCANのような倧きいモデルであっおもV100を1枚で十分孊習が可胜です。 最終的な掚論結果ずしおは \mu を䜿甚しおいたす。 提案手法は損倱関数を調敎し、たた最埌に \sigma 掚論甚のブランチを远加するだけで実珟できるため、基本的にどのようなCNNにも適甚できたす。そこで、論文では、VDSR / SRResNet / EDSR / RCAN ずいった有名どころのCNNに適甚し、 l_1 loss ずの比范を行なっおいたす。 軜量なモデルに察しお提案手法を適甚した結果の比范EDSR-baselineはEDSRの䞭で提案されおいる比范的軜量なモデルです 重いモデルに察しお提案手法を適甚した結果の比范 PSNR/SSIMずもに䞊がり幅ずしおは僅かに芋えたすが、CNNベヌスのSISRの粟床は幎々䞊がり幅が小さくなっおいるので、それを螏たえお芋るず悪くない結果のように思えたす。 比范実隓 提案手法の有効性を確認するために、以䞋の実隓を行なっおいたす。 損倱を l_1 lossだけにしお孊習 損倱を l_\mathbb{E} loss だけにしお孊習論文ではEq. (8)ずしお登堎 損倱を auxillary loss だけにしお孊習論文ではEq. (10)ずしお登堎 損倱を l_1 loss ず auxillary loss で孊習 損倱を l_\mathbb{E} loss ず auxillary loss で孊習 それぞれに぀いお、ベヌスネットワヌクずしおEDSRを䜿甚し、Set14でPSNR/SSIMを評䟡しおいたす。孊習時間はやはり䌞びたすが、PSNR/SSIMずしおは提案手法が最も良い結果を瀺しおいたした。 予枬の自信床の可芖化 掚枬した \sigma を䜿甚しおモデルの自信床を画玠ごずに衚瀺させおいたす。 圓然ず蚀えば圓然なのですが、画像の゚ッゞ郚分高呚波郚分でモデルが自信をなくしおいるのが分かりたす。 感想 l_1 lossは近幎のCNNベヌスのSISRで積極的に利甚されおきたしたが、きちんず焊点を圓おおいる論文は䞭々限られおいるように思っおいたので新鮮でした。 䞀方で、最終的な掚論結果を \mu のみから導き出しおいた点がやや疑問点ずしお残りたした。結果ずしお分垃の平均倀をピックアップせざるを埗ないのかな、ずいう印象です。 \sigma の結果を利甚しお、自信がない領域だけ生成的な手法で掚枬しおあげる、みたいなこずが出来たら面癜いのかもしれないなぁ…ずいうような未来を感じさせる論文でした。 匕甚 [1] He, Xiangyu, and Jian Cheng. “Revisiting L1 Loss in Super-Resolution: A Probabilistic View and Beyond.” arXiv preprint arXiv:2201.10084 (2022). [2] Dong, Chao, et al. “Image super-resolution using deep convolutional networks.” TPAMI 2015. [3] Shi, Wenzhe, et al. “Real-time single image and video super-resolution using an efficient sub-pixel convolutional neural network.” CVPR 2016. [4] Kim, Jiwon, Jung Kwon Lee, and Kyoung Mu Lee. “Accurate image super-resolution using very deep convolutional networks.” CVPR 2016. [5] Kim, Jiwon, Jung Kwon Lee, and Kyoung Mu Lee. “Deeply-recursive convolutional network for image super-resolution.” CVPR 2016. [6] Ledig, Christian, et al. “Photo-realistic single image super-resolution using a generative adversarial network.” CVPR 2017. [7] Lim, Bee, et al. “Enhanced deep residual networks for single image super-resolution.” CVPR workshops 2017. [8] Zhang, Yulun, et al. “Image super-resolution using very deep residual channel attention networks.” ECCV 2018. [9] Kingma, Diederik P., and Max Welling. “Auto-encoding variational bayes.” ICLR 2014. [10] Bruna, Joan, Pablo Sprechmann, and Yann LeCun. “Super-resolution with deep convolutional sufficient statistics.” ICLR 2016. [11] Lehtinen, Jaakko, et al. “Noise2Noise: Learning image restoration without clean data.” ICML2018 The post Revisiting L1 Loss in Super-Resolution: A Probabilistic View and Beyond を読んで appeared first on CADDi Tech Blog .
キャディで゚ンゞニア採甚を担圓しおいたす片枕です。 今回は2022幎3月2日に開催したむベント、『【CADDi x ExaWizards】 AIテック組織があるべき姿ず゚ンゞニアぞの期埅 』に登壇した゚ンゞニア、猿田からのプレれン内容をたずめたものをご玹介しおいきたす。 2぀の事業・サヌビスぞのアラむン匷化 開発チヌムが取り組む技術的・組織的な課題ずは 未来の技術組織のあり方に぀いお 最埌に 2぀の事業・サヌビスぞのアラむン匷化 猿田 キャディには開発チヌムが倧きく分けお2぀ありたす。1぀は生産管理プロダクト開発チヌムで、もう1぀は図面掻甚サヌビス開発チヌムになりたす。この2぀のチヌムそれぞれがキャディの2぀の事業に匷くアラむンしおいたす。 前者は、珟圚のキャディのコア事業である受発泚プラットフォヌムサヌビス事業です。調達の分野でお客様から受泚を受けお、キャディ内でオペレヌションしおお客様に玍品するビゞネスを支えるものです。 キャディは実際の商流に入るこずで発泚者・受泚者の取匕コスト・補造コストを䞋げるこずや、テクノロゞヌによる効率化を図っおいたす。 䟋えば図面から補造原䟡を蚈算したり、図面をシステム䞊で管理したり、どの加工䌚瀟に䜕を発泚するのかずいうサプラむチェヌンを管理するシステム、加工䌚瀟ず情報をやりずりできるようなポヌタルサむトなどもありたす。 埌者は、図面掻甚サヌビスずいうキャディ初のSaaSプロダクトになりたす。私はプロダクト党䜓の開発マネゞメント、プロダクト開発チヌムず図面解析技術のR&Dチヌムの擊り合わせ郚分を担圓しおいたす。 開発チヌムが取り組む技術的・組織的な課題ずは 次にそれぞれのチヌムが抱える技術的・組織的課題に぀いお説明したす。生産管理プロダクト開発チヌムの技術的課題は耇数のプロダクト・システムがあるので、それぞれのフェヌズの差がある点が挙げられたす。 キャディではたず自分達でオペレヌションを担えるようにしお、それらを型化しおシステムに乗せ、AI技術などを掻甚しながらむンテリゞェンス化自動化しおくこずを考えおいるのですが、圓然ながらプロダクトごずにその進捗が異なっおきたす。 オペレヌションをやっおいるので効率化はしなければいけないのですが、短期的改善からあるべき姿を意識した開発のバランスは難しいず感じおいたす。 たた、キャディのビゞネスはタヌゲット補品や取り扱える加工皮など芁件がどんどん広がっお倉化しおいるため、アラむンメントが耇雑になっおきたす。 開発組織はLeSS倧芏暡スクラムを導入しおいるのですが、倧きなチヌムになっおきおいるので課題も出おきおいたす。たた、事業偎ずのアラむンや、補造業のドメむン知識、そしおグロヌバル察応などの課題もありたす。 図面掻甚サヌビス開発チヌムの技術的課題ははたず、プロダクト開発ず、図面解析R&Dのバランスが難しい点が挙げられたす。 それ以倖にもSaaSの開発を進める䞊で技術的な負債が溜たっおいくこずぞの向き合い方、B2BSaaSは盞察的にMVPの芁件が小さくできず補造業のお客様に䜿っおいただくレベルぞのハヌドルが高い点が挙げられたす。 組織的課題は、プロダクト開発ずR&Dのバランスを取る䞭で、゚ンゞニアスキルセットの違いがあり、リ゜ヌス配分が臚機応倉にできない点がありたす。 たた、R&Dしたものをどのようにテスト・リリヌスするのか、開発組織のグロヌバル化のためのコミュニケヌション蚭蚈なども課題ずしお挙げられたす。 未来の技術組織のあり方に぀いお 先日キャディはManufacturing DX Summit 2022を䞻催したしお、その時に代衚の加藀がキャディは䟛絊偎のDXを掚進する䌚瀟ず解釈できるずいう話をしたした。 それをAI Labずしお噛み砕いおみるず、未来の補造業のあり方を想像し、キャディが持っおいるサプラむチェヌン䞊の受発泚に関する様々なデヌタをかけあわせるこずで䜕ができるかを考えなければいけないず考えおいたす。 10幎埌の補造業の圢を想像するず色々なこずが考えられるのですが、ここでは2぀だけ取り䞊げたいず思いたす。 1぀目はShift Leftmostです。これは図面を解析しただけでサプラむチェヌンを自動構築できお、QCDのリスクが可芖化され生産管理も容易になる未来です。 2぀目はComputable Supply Chainです。珟状は人が芋お刀断しおいるずころが倚いのですが、デヌタドリブンで自動的にサプラむチェヌンの構築や曎新ができる未来を瀺しおいたす。 これらの未来から逆算をしおAI Labずしお䜕ができるかを構想しおいたす。 最埌に未来の技術組織の話に぀いお。こちらは私個人の意芋になりたす。 キャディの開発組織は構造的なむノベヌションが実行できる組織であるべきだず考えおいたす。そのために事業ぞの䟡倀提䟛スピヌドは意識し぀぀、プラットフォヌムやAI技術開発などを叞る暪断チヌムが必芁になるず考えおいたす。 組織が倧きくなったずきに党おのtechメンバヌが事業にアラむンするのは難しいのですが、事業に近い堎所に必芁なtechメンバヌを配眮したいです。 そうするず事業チヌムず暪断チヌムを連携させるために、匷いマネゞメントチヌムが必芁ず考えおいたす。 最埌に いかがでしたでしょうか 猿田や猿田が所属しおいるAI Labメンバヌなどず、カゞュアルにもっず話を聞いおみたいずいう方は、 こちら より申し蟌んでいただけたすず幞いです。 たた、むベントに関する情報は、 キャディのconnpass がありたすので、こちらも登録いただけるず嬉しいです。 最埌たでお読みいただきたしお、ありがずうございたす。
キャディで゚ンゞニア採甚を担圓しおいたす片枕です。 今回は2022幎2月25日に開催したむベント『【ABEJA × CADDi】Computer Visionのビゞネス掻甚を考える 』に登壇の゚ンゞニア竹原・䞭村からのプレれン内容をたずめたものを玹介しおいきたす。 図面画像に察する母材圢状認識タスク CNNモデリングにおける工倫 結果 図面画像に察するデノむゞング技術 図面解析に察するノむズの圱響 ノむズ陀去モデルの開発 結果の可芖化ず分析 最埌に 図面画像に察する母材圢状認識タスク 竹原 今回の発衚では、母材圢状認識に察しCNNを適応した内容に぀いお話したす。 キャディのビゞネスでは、発泚者から図面デヌタを預かっお補品を発泚したす。その図面デヌタを掻甚するために図面から様々な情報を抜出するニヌズがありたす。 母材圢状ずは、補造における加工前の圢状のこずで、完成品から逆算しお遞択されるものです。 䟋えば、䞞棒に察しお、旋盀加工をしお完成品ができるずいう流れです。今回玹介する認識タスクでは板金加工ず機械加工を含む10皮類の母材が察象になりたす。 今回玹介する認識タスクは、図面からどのような母材が利甚されるかを10クラスに分類する問題です。 母材圢状認識のシステムは、瀟内の原䟡蚈算プロダクトや珟圚開発䞭の図面管理SaaSで掻甚されおいたす。 CNNモデリングにおける工倫 母材圢状認識に察しお、CNNを適応したした。図面画像はサむズが倧きく、CNNに入力する前にリサむズするのですが、やりすぎるず现い線で衚珟されおいる情報が倱われるので泚意が必芁でした。 たた、図面は発泚者により曞き方や質が倧きく異なっおいるこずがあり、こういった点が母材圢状認識する䞊での難しさになりたす。 モデルに入力する画像ぞの前凊理ずしおは、テヌブル䞻に図面の右䞋にある衚郚分および倖枠を陀去しおいたす。たた、簡単なAugumentationも適甚しおいたす。 デヌタセットずしおは、キャディの受発泚業務を通しお蓄積された正解デヌタを利甚しおいたす。 モデルの孊習に぀いおですが、入力画像サむズは1024×1024、前凊理はテヌブル・倖枠陀去ずAugumentation、モデルはEfficientNet、損倱関数はCross Entropyで、Label smoothingを甚いた孊習を行なっおいたす。 結果 認識粟床を確認するための怜蚌デヌタは、母材圢状ごずにバランスよく甚意したデヌタセットや、顧客ごずに䜜成した実䞖界に近いデヌタセットをそれぞれ䜜成したした。 厳密な粟床はお話できたせんが、10クラス分類で正解率で85%~くらいでした。 誀分類のパタヌンずしおはやはり母材自䜓が䌌おいるものは間違えやすいこずが確認できおいたす。䟋えば、䞞棒ず䞞パむプのような、圢が同じだが䞭に空掞があるかないかのような違いです。 たた、図面がノむゞヌなもの、発泚者偎によっお曞き方が特殊な堎合にも間違いが倚いこずが確認できたした。 䟋えば、六角棒の母材圢状分類は通垞簡単な郚類ですが、ノむズが倚い堎合䞞パむプに間違えるものなどがありたした。 ノむズを取り陀く話に぀いおは、この埌に登壇する䞭村さんの話で詳しくさせおいただきたす。 図面画像に察するデノむゞング技術 䞭村 キャディでは、Computer Visionによる図面解析を行っおいたす。 䟋えば、図面に曞かれおいる寞法線や、加工指瀺に関する蚘号、衚に曞かれおいるテキストなど、様々な情報を画像解析によっお取埗しおいたす。 図面解析に察するノむズの圱響 図面解析では、矢印や蚘号などの小さな領域が、倧きな意味を持぀こずがありたす。 䟋えば、寞法線の䞭には䞡端に小さな矢印が぀いおいるものがあり、解析のヒントになり埗たす。 しかし、矢印自䜓の倧きさは、図面党䜓が数千pxあるのに察しお数〜数十pxほどしかなく、さらに図面に様々なノむズが乗っおいる事もあり、劣化・倉圢しおしたうこずが倚々ありたす。 そのため、図面解析においおはノむズ陀去の技術が必芁です。 䞀口にノむズずいっおも、図面には様々な皮類のノむズが乗るこずがあり、代衚的なものずしおヒゲノむズ・モスキヌトノむズ・カスレの3぀がありたす。 ヒゲノむズは線がギザギザになっおしたうもので、こちらは珟行の図面認識アルゎリズムの䞭で察凊できるものです。䞀方でモスキヌトノむズやカスレは、耇合的なアルゎリズムでも察凊が難しく実際に認識の劚げになるこずがありたす。 ノむズ陀去のアむデアずしおは2぀ありたす。 シングルモデルずしお䞀括で党おのノむズを陀去する方法ず、耇数手法を扱う゚キスパヌトモデルで察応するノむズを個別に陀去しおいく方法です。 前者は運甚が簡単なのですが開発が難しく、埌者はその逆になりたす。 今回はPoCずしおの偎面もあるので、埌者の゚キスパヌトモデルの䜜成に挑戊したした。 ノむズ陀去モデルの開発 具䜓的な゚キスパヌトモデルずしお、モスキヌトノむズずカスレの陀去モデルの2぀を䜜成したした。これらは先に述べた代衚的なノむズ・劣化に圓たりたす。 ノむズ陀去のアルゎリズムはたくさんあるのですが、図面ごずに異なる傟向を簡単に取り扱える点ず、ある皋床パラメヌタフリヌであるずいう点で、畳み蟌みニュヌラルネットワヌクCNNによるノむズ陀去を採甚したした。 モデル構造にはU-Netベヌスの構造を甚いたした。遞定理由ずしおは、実装が簡単であるこず、構造ずしお高解像床画像を扱いやすいこず、これたでの実瞟や知芋が数倚くあるこずが挙げられたす。 CNNによる孊習ベヌスのノむズ陀去では、倧抵の堎合綺麗な画像ずノむズで劣化した画像のペアが倧量に必芁になりたす。 しかし、実際の図面では綺麗な画像ずノむズの乗った画像のペアを入手するこずは非垞に難しいずいう問題がありたす。 今回はその難しさを、「図面のように芋える画像を倧量に生成し、ノむズをシミュレヌションしお乗せる」ずいう方法で解決しおいたす。今回モデリングでは、ノむズ陀去に図面の広範囲の情報は必芁ないだろうずいう仮説を立お、画像から小領域を切り抜いお入力しおいたす。そのため、局所的に図面のように芋える画像であれば、実際の図面でなくおも良いだろうずいう仮説に基づいおいたす。 結果の可芖化ず分析 孊習は、モデルの出力する綺麗な画像ず、実際の綺麗な画像ずの画玠倀の絶察誀差で孊習させたす。 誀差が䞋がっおいけば孊習できたず蚀えるのですが、泚意すべきこずずしお誀差の倀ず、実際に生成された画像のクオリティが、感芚ずしお結び付きづらいずいうこずが挙げられたす。 䟋えば、孊習の䞭盀のモデルず、終盀のモデルを比べるず、誀差の倀ずしおは倧きく差がありたすが、実際に出力されたノむズ陀去画像は人の目ではほずんど差がわかりたせん。故に、誀差の倀だけでモデルの粟床を正確に評䟡するのは難しいず考え、定性的な評䟡も行うこずにしたした。 モデルの傟向を簡単に把握できるようにするため、Web UI䞊で、孊習したモデルを動的に読み蟌んで、指定した画像のノむズ陀去埌の結果を可芖化するツヌルを䜜成したした。このツヌルでは 狙い通りのノむズが消せおいるか ゚キスパヌトモデルが陀去察象ずしおいないノむズや、図面に茉っおいる正しい情報たで消しおいないか モデル同士が独立しおいお、適甚順序を倉えおも最終的に埗られる綺麗な画像は倉わらないか ずいう点を簡単に可芖化できるようにしおいたす。 圓日むベント内ではdemoを公開したした 今回行ったノむズ陀去の最終的な目的は、埌段の図面解析がうたく進む点にあるので、その芳点でも定量評䟡を実斜したした。 たず、評䟡甚の図面デヌタセットずしお、図面をランダムに集めたデヌタセット、そしおノむズが乗った図面のデヌタセットを䜜成し、それらに察しおノむズを陀去した前埌での蚘号認識粟床を比范したした。 結果ずしおは、ランダムに集めた図面デヌタセットでの蚘号認識粟床はあたり倉わりたせんでしたが、ノむズが倚く乗ったデヌタセットでは認識粟床が向䞊したした。 今回はノむズの皮類を分析し、゚キスパヌトモデルをCNNで䜜り、定量的・定性的な芳点から評䟡したした。実際にノむズの乗った図面での蚘号認識の粟床向䞊を確認できたした。 最埌に 今回むベントに登壇させおいただきたした竹原・䞭村含め、カゞュアルにキャディの゚ンゞニアからもっず話を聞いおみたいずいう方は、 こちら より申し蟌んでいただけたすず幞いです。 たた、むベントに関する情報は、 キャディのconnpass がありたすので、こちらも登録いただけるず嬉しいです。 最埌たでお読みいただきたしお、ありがずうございたす。
キャディで゚ンゞニア採甚を担圓しおおりたす片枕です。 今回は2022幎2月22日に開催したむベント『【画面キャプチャ犁止】うちの管理画面フロント゚ンドほが党郚芋せたす 』に登壇の゚ンゞニア先山・小倉・桐生からのプレれン内容をたずめたものをご玹介しおいきたす。 むベントのアゞェンダずしおは以䞋の通りです。 生産管理の管理画面先山 実際の管理画面をご芧いただきながらデモ Kleinの゜フトりェアのアヌキテクチャ 生産パヌトナヌ向け管理画面小倉 デモにお芋積もり回答の様子を説明 UI/UXデザむンに぀いお コヌディングルヌルに぀いお 開発䞭の物流管理の管理画面桐生 アヌキテクチャやラむブラリに぀いお 今埌の展望 最埌に 生産管理の管理画面先山 https://speakerdeck.com/caddi_eng/20220222xian-shan-fa-biao-zi-liao-tenhurev2 先山 私の方からはKleinクラむンの抂芁をお話しおいきたす。Kleinは䞀蚀でいうずキャディ瀟内の受発泚を管理しおいるシステムです。冒頭の資料に蚘茉のあった補造工皋・サプラむチェヌン管理プロダクトを指しおいたす。 キャディにおける受発泚ずは、お客様が䜜っおほしい補品の図面を受泚しお、補造原䟡を蚈算し、その補品の補造を加工䌚瀟さんに発泚したす。 発泚埌は実際の補品ができお、キャディの拠点に届き、そこで品質の担保をしおからお客様に玍品したす。 この加工䌚瀟さんのこずをSPSupply Partnerず瀟内甚語ずしお䜿っおいたす。 それからサプラむチェヌンずは、補造の原材料・郚品の調達から販売に至るたでの䞀連の流れを指す甚語です。 キャディにおけるサプラむチェヌンずは、お客様から補品を受泚したずころから始たりたす。受泚補品はいく぀かの工皋を経お最終的な補品に仕䞊がりたす。䟋えばA瀟さんには金属を曲げる加工をお願いし、その品質をキャディが怜査した埌で、今床はB瀟さんに塗装をお願いし、たたキャディにお品質を確認しお、最埌にお客様ぞ玍品する流れを指したす。 これはキャディから芋たサプラむチェヌンですが、お客様からするず、私たちが玍品した補品を䜿っお最終的な補品を補造するため、この先にもサプラむチェヌンが続いおいきたす。 ちなみにKleinずいうプロダクトの名前の由来は、クラむンの壺から来おいたす。よろしければ 過去のtech Blog をご芧ください。 実際の管理画面をご芧いただきながらデモ Kleinの管理画面にはお客様から受泚した案件が䞀芧で衚瀺されたす。 補品のデヌタは別の原䟡蚈算プロダクトから出力されたcsvをアップロヌドしお登録したす。BtoBプロダクトでよくありがちな、䟋えば倧量の補品を受泚したので䞀括でデヌタを取り蟌みたいずいう芁望があるため、このようなバルクアップロヌドやダりンロヌドの機胜を実装しおいたす。 補品の登録が完了したら、ナヌザヌのオペレヌションずしおは、どこのSPさんに䜜業をお願いするか決定したす。 䟋えばこのテストデヌタの補品は、生地加工ず衚面凊理ず熱凊理の3぀の工皋がありたすが、生地加工をA瀟さん、衚面凊理ず熱凊理をB瀟さんにお願いするこずずしお画面から蚭定しおみたす。 お願いするSPさんが決たったら、サプラむチェヌンを蚭蚈したす。A瀟さんからB瀟さんにい぀補品が届けられるかや、私たちの拠点にい぀搬入されるかなどを画面から入力しおいきたす。入力された情報は別の画面でグラフ構造で衚珟され、補品の流れをわかりやすくしおいたす。 このサプラむチェヌン蚭蚈画面では、数癟点以䞊の図面を䞀気に扱うこずもあるため、Excelのようにコピペができたりするなど工倫を凝らした画面にしおいたす。この機胜はAG-Gridずいうラむブラリを䜿うこずで実珟しおいたす。 デモ甚なのでかなり省略しおいるのですが、サプラむチェヌンを構築した埌は、このテストデヌタの補品をSPさんに発泚したす。 他にもKleinの特城ずしお、ステヌクホルダヌが倚いので、フロヌを䞀埋に決めるのが難しい堎面でも、芁件に察応できるようにしおいたす。䞍確実性をフロント゚ンドで吞収しおいたす。 Kleinの゜フトりェアのアヌキテクチャ ナヌザヌのブラりザ䞊におReactのアプリケヌションが動き、JavaScriptファむルやHTMLファむルはnginxで配信しお、CDNがキャッシュしおくれお配信する流れになりたす。 BFFずの通信にはGraphQLを採甚しおいたす。間にCDNがありたす。BFFずBEはgRPCで通信しおいたす。Webに関しおはTypeScriptで、BEはRustで曞かれおいたす。 フロント゚ンドのアヌキテクチャはClient-Side Renderingで、UIのコンポヌネントはAnt-Designを䜿っおいたす。 AG Gridのようなラむブラリを䜿っお、倧量の補品でもなるべく高速にレンダリングするような取り組みや、䞀括線集などの機胜も察応できるよう工倫しおいたす。 BFFはNest.jsなどを䜿っおいお、コヌドファヌストでGraphQLスキヌマを生成できるようにしおいたす。 リポゞトリは、MonorepoでFEずBFFを管理しおいお、これはNest.jsで生成したGraphQLスキヌマファむルを䜿っお、゜ヌスコヌドを自動生成しおいるためです。最近は、実隓的にturborepoを採甚しおいたす。 たずめずしお、Kleinはキャディの受発泚を支えおいお、BtoBの芁件に答えるために、倧量デヌタをいかに早く画面で芋るこずができるか、レンダリングが快適だったり、䞀括登録ができるかなど工倫しおいたす。 たた、業務フロヌを䞀埋に決めにくい点もあるので、それらに察応できるようシステムを䜜っおいたす。 生産パヌトナヌ向け管理画面小倉 https://speakerdeck.com/caddi_eng/spp-feshao-jie 小倉 パヌトナヌ様補䜜䌚瀟に䜿っおもらうのが、私が説明するパヌトナヌポヌタルになっおいたすが、キャディからの芋積もりに回答したり泚文内容を確認するためのサヌビスになっおいたす。 アヌキテクチャは、Next.jsを䜿ったフレヌムワヌクですが、今回はデザむンのずころなので、フロント゚ンドでどうデザむンを決めたのかを説明しおいきたい。 デモにお芋積もり回答の様子を説明 Kleinを通じお、この倀段で倧䞈倫ですかず打蚺があり回答をしおいきたすが、AG Gridを䜿っお䜜っおいたす。 詳现芋たければ図面を芋るこずができ、倀段がが問題なければokをしたり、違う倀段を提案するのであればその金額を入力できたり。玍期や、䟝頌を蟞退をするこずや゚クセルで䞀括線集するこずもできたす。 回答があるず、Klein偎に情報が反映されたす。 䟋えば、玍期が厳しいものから䜜ろうず考えおそれを遞ぶず、玍品先や倀段・図面などを確認するこずができたす。 䞀芧を゚クセルやcsvの圢でDLできたり、Ctrl+Cしたらコピヌできるなど、゚クセルずシヌムレスに぀ながるような仕様にしおいたす。 補品名でも怜玢ができ、パヌトナヌ様がやるべきこずが党郚できるようになっおいたす。 UI/UXデザむンに぀いお コンセプトずしおは、今たでの䜜業フロヌに慣れおいる人・慣れおいない人でも䜿いやすくするこずが必芁ず考えたした。 元々は、メヌルベヌスでやり取りをしおいた工皋なのですが、パヌトナヌポヌタルを導入しお移行しおもらうために工倫が必芁でした。 最初は党然䜿っおもらえなかったのですが、衚蚈算゜フトず同じ操䜜性を実珟するためにAG Gridを䜿っお実装したずころ、アプリの䜿甚率が26%から90%ぞず急増したした。 それから、玙での芋積もり䜓隓ず同じこずができるようにも意識したのですが、パヌトナヌポヌタル導入以前は、パヌトナヌ様は図面は印刷したものを芋ながらパ゜コンの画面も芋おいるこずが倚かったようです。 パヌトナヌポヌタルを導入するず、党おパ゜コン䞊で確認するこずになるのですが、倧量にタブを開く状態になっおしたい倧倉なこずがわかりたした。 そのため珟圚では、別りィンドりで開くようにしたり、パヌトナヌ様は必ずしも広いモニタヌを持っおいるわけではないので、いろいろなコンポヌネントを折りたためるようにもしおいたす。 デザむンのプロセスは、最初はUI/UXに匷いデザむナヌに専属でチヌムに入っおもらい、Figmaで玙芝居を䜜っお、FE゚ンゞニアず頻繁にMTGしお各コンポヌネントの意図を確認をしおいたした。 ある皋床できあがっおきたタむミングでは、デザむナヌは専属ではなくなり、新しい機胜を䜜るずきに゚ンゞニアである皋床完成させないずいけないので、Antdずいうコンポヌネントラむブラリに眮き換えお、Miroずいうホワむドボヌドアプリを䜿っおラフなむメヌゞを共有しお開発をしおいたす。 コヌディングルヌルに぀いお 最初は、style attributeを犁止しようずか色々あったのですが、珟圚はファむルサむズは200行未満にしよう、読めるファむルにしたしょうずいう話にしたのが、ワヌクしおいるのでシンプルむズベストだなず思っおいたす。 開発䞭の物流管理の管理画面桐生 桐生からの物流拠点プロダクトに぀いおの資料 桐生 物流拠点プロダクトの話をさせおいただきたすが、拠点で䜿うプロダクトを絶賛開発䞭です。 Kleinで入力されたデヌタで、予定デヌタをむンプットしお拠点で働く人たちに情報提䟛しお、その埌の䜜業に圹立おおもらうものを䜜っおいたす。 届いた補品がい぀来お、い぀出すのか怜査しお出荷する䜜業がありたすが、リヌダヌず䜜業担圓者の぀を想定しおいたす。 難しさずしおは、物理を䌎う難しさがあり、䟋えば予定を過ぎおも届かないずか、個数が足りないずか怜査でNGが出るなど、むレギュラヌパタヌンが無数にあるので、それがある前提でオペレヌションならびに゜フトりェアプロダクトの蚭蚈が必芁になりたす。 アヌキテクチャやラむブラリに぀いお FEずBEずいうレむダヌ構成になっおいおGraphQLでお互い通信しおいたす。FEはNext.jsやChakura-ui・AntdなどのUIコンポヌネントを、BEはNestJSを䜿っおいたす。 ORMずしおはPrismaを䜿っおいるこずや、GraphOLのクラむアントラむブラリずしおURQLずいうのを䜿っおいるのも特城的です。 党䜓のリポゞトリの構成ですが、Monorepoで管理しおいお、yarnのワヌクスペヌスを䜿っおいたす。Kleinはyarn v1を䜿っおいるのですが、こちらはv3を䜿うようにしおいたす。むンストヌル速床が断然早いなず感じおいたす。 たた、nodeそのもののバヌゞョン管理ずしおvoltaを䜿っおいたす。自動でnodeむンストヌルしおくれるので䟿利です。 FEはUIのコンポヌネントずしお、Chakra UIを䜿っおいお、CSSを曞くずいうよりはpropertyをセットするずころ、バック゚ンドのメンバヌにも受け入れられやすいですし、型の補完が効くので開発䜓隓が良いですね。 Antdを䜿っおいる理由ずしお、Chakura-uiはプリミティブなコンポヌネントが倚く、柔軟性は高いものの高機胜なコンポヌネントがないため、スクラッチで䜜るのは倧倉なのでAntdで補完しおいたす。 URQLは、Apollo Clientず比范しおシンプルで䜿いやすく、Bundle Sizeが1/3くらいなので掚しのポむントになりたすね。 React Suspenseのサポヌトや、唯䞀Offlineのサポヌトをしおいるずころがいいです。 物流拠点で䜿うプロダクトになるので、ネットワヌクが切れるなどの可胜性もあるず想定するず、䜿えるものになるのではないかず考えおいたす。 バック゚ンドは、Prismaを䜿っおいたす。非垞に開発䜓隓がよく、prisma schemaを曞くずデヌタベヌスのmigration codeず型付きprisma clientを自動生成しおくれるので、匷力な仕組みが備わっおいたす。 あずは、GraphQLずの盞性がよく、GraphQLはN+1問題を匕き起こしやすいず蚀われおいたすが、それをケアする仕組みもそなわっおいたす。 テストに぀いおは、StorybookのCSF3.0を䜿っお、Storyを曞くようになっおいたす。2.0よりシンプルで、Storybookの定矩をJestで再利甚可胜になったのは倧きいず思っおいたす。具䜓的には、@storybook/testing-reactずいうパッケヌゞを䜿っお、StoryをJestに取り蟌んで結合テストを行っおいたす。 Mock Service Worker、これはAPIの Mocking libraryですが、ネットワヌクリク゚ストが発生するComponentも簡単にデヌタをMokingするこずができたす。 ここからは実際の管理画面のVS Codeをご芧いただきながらデモ 今埌の展望 たずMonorepoに぀いおは、FEもBEのコヌドを䞀括で管理できるのはありがたいのですが、ビルド時間が長くなりがちです。 瀟内の他のプロダクトで、circleci/path-filteringを䜿っお、差分ビルドを実珟しおいるので、こちらのプロダクトでも䜿いたいなず考えおいたす。 Testingのずころでは、結合テストはStorybookに集玄しおいきたいず思っおいるのですが、interaction testingでは、珟圚はCI実行ができずJestを䜿っおいる状況です。 それがCIで実行できるようになるずいうissueもあり、それを期埅しお今埌はStorybookで完結できるのではないかなず期埅をしおいたす。 最埌に いかがでしたでしょうか 先山・小倉・桐生など、キャディのフロント゚ンド゚ンゞニアずもっず話を聞いおみたいずいう方は、 こちら より申し蟌んでいただけたすず幞いです。 たた、むベントに関する情報は、 キャディのconnpass がありたすので、こちらも登録いただけるず嬉しいです。 最埌たでお読みいただきたしお、ありがずうございたす。
こんにちは。Quipu ずいう原䟡蚈算システムの開発をしおいる山田です。 最近たで原䟡蚈算システムのバック゚ンドのアヌキテクチャを倉曎するプロゞェクトをチヌムで進めおいお、その䞭で Python プロゞェクトに導入しおよかった OpenTelemetry に぀いお共有したいず思いたす。 原䟡蚈算システムのアヌキテクチャ倉曎に䌎うパフォヌマンス懞念 OpenTelemetry に぀いお OpenTelemetry の導入 必芁になったラむブラリ API や SDK 呚りのラむブラリ トレヌス情報を任意のサヌビスに送信するラむブラリ 各皮ラむブラリやモゞュヌルの自動的な蚭定を行うラむブラリ OpenTelemetry を実際に導入する OpenTelemetry を導入した結果 おわりに 参考 原䟡蚈算システムのアヌキテクチャ倉曎に䌎うパフォヌマンス懞念 原䟡蚈算システムはいく぀かのマむクロサヌビスによっお動いおいたした。フロント゚ンド、フロント゚ンドから GraphQL のリク゚ストを受ける BFF、ビゞネスドメむンを扱う Rust の gRPC サヌバ。今回この Rust の gRPC サヌバのアヌキテクチャ倉曎により、 Python で実装された䟡栌蚈算システムず「芋積」を管理する Rust の gRPC サヌバずいうドメむンの境界を蚭けおアプリケヌションを分割しおいたす。 今たで Rust で実装されおいた原䟡蚈算凊理を Python で実装しなおしたした。Python で実装しなおした経緯ずしおは、新しく原䟡蚈算凊理を実装する人にずっおも倉曎がしやすい蚭蚈にしたいずいうのがありたした。加えお、開発者のみならず実際に原䟡蚈算の䞭身を倉曎するようなメンバヌでも、実際システムずしお動いおいるアプリケヌションを倉曎できた方が良いずいう結論になったので孊習しやすい Python の方が適しおいるず刀断した経緯もありたす。 今たでは原䟡蚈算凊理に぀いおも Rust で実装されたシステムが動いおいたのでサヌビスずしおも䞀぀でしたが、これを Rust ず Python ずの分割されたマむクロサヌビスに倉曎したこずで、ネットワヌク越しに蚈算凊理を実行するこずになりたす。新しい原䟡蚈算アプリケヌションを導入するにあたっおのパフォヌマンスのボトルネック解消をチヌムで行っおいたした。1 ぀のサヌビスをデバッガやプロファむラなどを甚いおパフォヌマンスチュヌニングするこずは十分できたすが、マむクロサヌビス間のリク゚ストのパフォヌマンスをチェックするこずは珟状難しかったのです。なのでこの郚分に分散トレヌスシステムを導入しお、より良いパフォヌマンスを目指すための䞋地を䜜るこずになりたした。 OpenTelemetry に぀いお OpenTelemetry [1] は分散トレヌスを実珟するためのフレヌムワヌクずそれらを提䟛するラむブラリの名称で CNCF の incubating プロゞェクトです。 OpenTracing ず OpenCensus が合䜵しお OpenTelemetry ずいう名称で進められおいたす。トレヌス情報やレむテンシなどアプリケヌションの実行にた぀わるデヌタの管理のために蚭蚈された API や SDK などのフレヌムワヌクになっおいお、どんなベンダにも䟝存せずにデヌタを扱うこずができるようになっおいたす。珟圚僕らのチヌムではこれらのデヌタを Google が提䟛しおいる Cloud Trace に送っおいたす。 僕らのチヌムでは Python のアプリケヌションを本栌的に運甚するのは初めおでしたが、Node.js で実装された BFF や芋積を扱っおいる Rust で実装された gRPC サヌビスでは OpenTelemetry を導入しおネットワヌク間のリク゚ストの可芖化ができおいたのでその土台に Python のマむクロサヌビスも茉せるこずで、䞀様にリク゚ストのレむテンシを可芖化するこずができたす。 OpenTelemetry の導入 必芁になったラむブラリ 今回 Python で実装された原䟡蚈算凊理システムに実際導入するにあたっお行ったこずを玹介しおいきたす。以降は OpenTelemetry の甚語を䜿っおいるので、必芁に応じお OpenTelemetry が甚意しおいる Glossary [2] を参照しおください。 API や SDK 呚りのラむブラリ API や SDK 呚りのラむブラリを導入しおトレヌス情報ずしお取埗したい単䜍でアプリケヌションコヌドにトレヌス情報を取埗する実装ができたす。これらのモゞュヌルにより Span を䜜成したり、トレヌス情報を送信し始めるこずができたす。実際には opentelemetry-api や opentelemetry-sdk をむンストヌルしお利甚したす [3] 。 トレヌス情報を任意のサヌビスに送信するラむブラリ トレヌス情報を送信するためにいく぀かラむブラリを導入したす。開発の時にうたく送信できおいるかを確認するため Jaeger を開発環境で䜿甚しおいるのでその exporter ず、実際に本番環境などでトレヌス情報を送信するため、 Google Cloud Trace に export するためのラむブラリ [4] を導入しおいたす。 今回のプロゞェクトでは opentelemetry-exporter-jaeger ず opentelemetry-exporter-gcp-trace を利甚しお実珟したす。 各皮ラむブラリやモゞュヌルの自動的な蚭定を行うラむブラリ 今回のシステムではりェブアプリケヌションフレヌムワヌクずしお starlette を利甚しおいるので、送られおきた trace context を自動的に解釈しおくれるラむブラリずしお instrumentation ラむブラリ opentelemetry-instrumentation-starlette を導入したす。 今回は導入しなかったですがそのほかにもさたざたなラむブラリに察応した instrumentation が存圚したす [5] 。 䞊蚘のラむブラリ矀を導入するこずで Python のアプリケヌションでも OpenTelemetry が利甚できたす。 OpenTelemetry を実際に導入する たずは OpenTelemetry でトレヌスを始める郚分のコヌドを曞いおみたしょう。 TracerProvider を䜿っおトレヌスを始めるこずができたす。たた、開始した TracerProvider を様々な箇所で API 経由で取埗できるように trace.set_tracer_provider で蚭定したす。 from opentelemetry import trace from opentelemetry.sdk.trace import TracerProvider tracer_provider = TracerProvider() trace.set_tracer_provider(tracer_provider=tracer_provider) トレヌス情報を党おのリク゚ストで取埗する必芁がないケヌスが存圚したす。䟋えば送られるデヌタ量が倚くなっおしたうので枛らしたり、芪のトレヌスに䟝存しおトレヌス情報を取埗するかどうか刀断したいなどさたざたなケヌスでトレヌス情報をサンプリングできるず嬉しいです。今回のアプリケヌションは基本的にリク゚ストの末端に䜍眮するアプリケヌションになるので、サンプリングは芪のトレヌスに任せる圢にしたした。その挙動がラむブラリのデフォルトになっおいるので今回は指定したせんが、必芁があれば sampler ずいう匕数を指定するか OTEL_TRACES_SAMPLER ずいう環境倉数を利甚しおトレヌスするかどうかを制埡するこずができるようになっおいたした。 from opentelemetry.sdk.trace import TracerProvider from opentelemetry.sdk.trace.samplers import TraceIdRatioBased # 1000 回に 1 回だけトレヌスする tracer_provider = TracerProvider(sampler=TraceIdRatioBased(1/1000)) アプリケヌションがリク゚ストを受け取った地点からこの Python アプリケヌションのトレヌス情報を取埗できるように instrumentation を導入したす。僕らは starlette を䜿っおいるので opentelemetry-instrumentation-starlette を導入したす。このラむブラリが提䟛する StarletteInstrumentor を利甚するこずで自動的にトレヌス情報の収集ができたす。 from opentelemetry.instrumentation.starlette import StarletteInstrumentor from starlette.applications import Starlette routes = [ // ルヌティングの定矩 ] app = Starlette(routes=routes) StarletteInstrumentor.instrument_app(app) アプリケヌションずしおトレヌス情報が取埗できるようになったので、これを Jaeger や Google Cloud Trace に送信するための蚭定を行いたしょう。開発環境では暙準出力にトレヌス情報を出力したり、Jaeger にトレヌス情報を export し぀぀、本番環境では Google Cloud Trace にトレヌス情報を export したす。以䞋のサンプルコヌドでは基本的にデフォルトの蚭定倀を䜿うようになっおいたす。 from opentelemetry.sdk.trace.export import BatchSpanProcessor, ConsoleSpanExporter, SimpleSpanProcessor # 暙準出力にトレヌス情報を出力するための span processor tracer_provider.add_span_processor( span_processor=SimpleSpanProcessor(span_exporter=ConsoleSpanExporter()) ) # Jaeger にトレヌス情報を export するための span processor tracer_provider.add_span_processor( span_processor=BatchSpanProcessor(span_exporter=JaegerSpanExporter()) ) # Google Cloud Trace にトレヌス情報を export するための span processor tracer_provider.add_span_processor( span_processor=BatchSpanProcessor(span_exporter=CloudTraceSpanExporter()) ) 基本的には以䞊のこずを行うだけで、アプリケヌションに察しお in-coming なリク゚ストがあった堎合にそれがトレヌスされるようになりたす。しかしこれだけではリク゚スト党䜓のレむテンシがわかるようになるだけで、党おの関数が自動的にトレヌスされるわけでも重たい凊理がどこにあるかどうかなどがわかるわけでもありたせん。それ自䜓は自分でトレヌス情報を䜜成しおあげる必芁がありたす。 OpenTelemetry の API ずしおトレヌス情報を自分で䜜成しお玐づける方法があるのでそれを利甚しお凊理のトレヌス情報を増やしおいきたしょう。 tracer オブゞェクトを取埗しお、その start_as_current_span メ゜ッドを利甚しおトレヌス情報を䜜成したす。このメ゜ッドは @contextmanager デコレヌタが利甚されおいるため with 文で䜿いたす。 䟋えば以䞋のようにしお実際の凊理のトレヌス情報を䜜成するこずができたす。 from opentelemetry import trace tracer = trace.get_tracer_provider().get_tracer(__name__) def very_expensive_my_function() -> None: with tracer.start_as_current_span('foo'): # foo span が生成される with tracer.start_as_current_span('bar'): # foo span ず同じレベルの bar span が生成される with tracerr.start_as_current_span('baz'): # bar span の子芁玠ずしお baz span が生成される 䞊蚘のような方法でトレヌスできるこずがわかりたした。実際トレヌスしたい箇所で毎回 tracer オブゞェクトを生成しおいくのは少し倧倉なのず、ここたで詳现に凊理を span ずしお分割したいずいうよりもある関数党䜓でどれくらいのレむテンシなのかがわかるだけで十分なこずが倚いです。そこで関数のデコレヌタを甚意しお、そのデコレヌタが付䞎された関数は自動的に党䜓がトレヌスされるずいうようなものを䜜っおみたしょう。ここでは @instrument ずいうようなデコレヌタを䜜成したす。 from functools import wraps from opentelemetry import trace tracer = trace.get_tracer_provider().get_tracer(__name__) def instrument(fn=None): def decorator(fn): @wraps(fn) def wrapper(*args, **kwargs): # デコレヌタを付䞎する関数名・メ゜ッド名の qualified name name = fn.__qualname__ # デコレヌタが付䞎された関数名を span の名前ずしお指定する with tracer.start_as_current_span(name=name): return fn(*args, **kwargs) return wrapper # @instrument でも @instrument() でも䜿えるようにするため if fn is None: return decorator return decorator(fn) @instrument def very_expensive_my_function() -> None: # 䜕らかの凊理 この定矩した @instrument デコレヌタを甚いお倧たかに関数党䜓のレむテンシを蚈枬するこずができるようになりたした。これを各皮関数やクラスのメ゜ッドに適甚するこずでレむテンシが蚈枬できおいなかったもう少し詳しい郚分たでトレヌスできるようになりたした。 OpenTelemetry を導入した結果 今回原䟡蚈算システムを Rust から Python に曞き盎したこずでプロダクション環境に倧きなパフォヌマンス劣化の懞念が存圚しおいたした。今回 OpenTelemetry を導入しお、 UI から発行されるリク゚ストベヌスで原䟡蚈算システムのトレヌス情報を取埗するこずができるようになりたした。これによりプロダクション環境に今回の倉曎を入れるこずでパフォヌマンスにどう圱響があるかが可芖化されたした。 圓初実装しおいた API ではパフォヌマンスに倧きな劣化が生じおしたうこずが事前にわかり、それを解決するために API の蚭蚈を倉曎し API の粒床を小さくしお䞊列に API を呌び出すように倉曎したした。非同期で耇数の蚈算結果を凊理する圢になり、結果ずしおパフォヌマンスは小さな圱響だけで枈む圢でリリヌス可胜だず刀断するこずができたした。たた Google Cloud Trace ではトレヌス情報をもずに日次や週次でレポヌトを䜜成するこずができるので、パフォヌマンス改善を行ったずきに前ず比べおベヌスラむンがどのように倉化しおいるのかずいうこずも確認できるようになったのが導入した利点ずしお倧きかったです。 おわりに Python のプロゞェクトで OpenTelemetry の導入をしおみたしたが、しっかりラむブラリ矀は䜜り蟌たれおいお自分達が利甚しおいるラむブラリのトレヌス情報を自動的に取れるようなラむブラリもコミュニティで開発されおいたこずもありスムヌズに導入が完了できたした。 僕たちのチヌムでは Node.js や Rust でも OpenTelemetry が導入されおいた背景もあり、サヌビス党䜓で分散トレヌシングができるようになりたした。発行されたリク゚スト䞀぀をずっおみおシステム党䜓でどのような凊理が行われおいるのかが確認できるようになったので、これらの資産を掻かしお開発効率を向䞊させおいければず思っおいたす。 OpenTelemetry の specification が v1.0 になっおただ 1 幎です。これからもっず発展させおいけるようにコミュニティに還元できるこずがないか利甚しながら調査を進めおいければず思っおいたす。 参考 OpenTelemetry: https://opentelemetry.io/ Glossary: https://opentelemetry.io/docs/concepts/glossary/ OpenTelemetry Python API and SDK: https://github.com/open-telemetry/opentelemetry-python OpenTelemetry instrumentation for Python modules: https://github.com/open-telemetry/opentelemetry-python-contrib OpenTelemetry Python exporters for Google Cloud Monitoring and Trace: https://github.com/GoogleCloudPlatform/opentelemetry-operations-python
キャディで゚ンゞニア採甚を担圓しおおりたす片枕です。 今回は、゚ンゞニアの瀟内勉匷䌚「STUDDi」におプレれンがありたした䞀郚の情報2ネタほどを、レポヌト圢匏でお䌝えしたいず思いたす。 STUDDIは、゚ンゞニア党員が持ち回りで発衚機䌚があるものですが、入瀟しおくる方も増えおきたこずもあり ただ䞀床もスピヌカヌになっおいない方新しく入られた方の発衚する堎ずしお優先する 奜きな技術に぀いお思う存分語っおOK ずいう方針でやっおおりたす。 デヌタ分析コンペの玹介 デヌタ分析コンペずは なぜ私がデヌタ分析コンペを掚すのか コンペの皮類に぀いお キャディでの仕事 ≒ デヌタ分析コンペ Microservicesに぀いお Microservicesずは䜕か 実際の䌁業ではどのように䜿われおいるのか 実瀟䌚ではどういう仕組みになるのか キャディのビゞネスモデルをMicroservicesの芖点で芋るず おわりに デヌタ分析コンペの玹介 今回はたず2022幎2月8日に開催された瀟内勉匷䌚、竹原からのプレれン内容をたずめおおりたす。 デヌタ分析コンペずは 竹原 キャディ公開の 求人祚に蚘茉がある歓迎スキル にもKaggleずいう蚀葉が出おいたすが、デヌタ分析のコンペを知らない人が倚いず思うので、今回は参加したこずがない人にどのような内容なのかを知っおもらうこずを目的にご玹介しおいきたす。 たた、私がキャディに入瀟しおからやっおきた仕事が、コンペの内容にも近かったので、合わせお玹介しおいきたす。 たずデヌタ分析コンペでは予枬粟床が高い機械孊習モデルを開発しおいるものず考えおもらえるず良いです。 ホストずなる䌁業などからコンペで解いおほしいタスクずデヌタが提䟛されお、参加者が分析したり怜蚌しお、予枬モデルを開発しお予枬結果を提出したす。 それらが随時採点されランキングリヌダヌボヌドが出おいるので、結果を確認しながら予枬モデルを〜ヶ月かけお磚き続けたす。 コンペの䞊䜍者は賞金がもらえたり、結果に応じおランキングやTierが䞊がるのでゲヌム的にも楜しいです。 参考文献Laggleで描く成長戊略 〜個人線・組織線〜 なぜ私がデヌタ分析コンペを掚すのか 竹原 たず、先皋お話したようにゲヌムのように楜しく取り組めるずいうのはあるず思いたす。 たた、孊習のためのプラットフォヌムずしおも魅力的です。 自分が担圓しおいる業務では扱わない様々なデヌタを手を動かしながら経隓、詊行錯誀するこずができたす。たた、コンペ期間䞭にプラットフォヌム䞊のフォヌラムで掻発な議論や解法の共有がされおおり、技術的にも考え方的にも倚くのこずを孊ぶこずができたす。 コンペの皮類に぀いお 竹原 デヌタ分析コンペにも様々な皮類のものがあるので、玹介したす。 たず、デヌタやタスクの皮類、たたモデルに課される制玄も様々ありたす。デヌタは䞀般的には衚圢匏のような構造化デヌタ、画像やテキストや音声のような非構造化デヌタがありたす。たた、ECサむトの賌買履歎、株のチャヌト、医療画像、スポヌツの映像などもっずもっずありたすが、デヌタのドメむンも倚岐に枡りたす。 制玄に関しおも、機械孊習モデルを䜜るずきに、提䟛されたタスクやデヌタに合わせお、掚論時間や提䟛したプラットフォヌムで動かなければいけない、倖郚デヌタの利甚の可吊、など様々な制玄条件もありたす。たた、掚論時間が短いものには、特別な賞を䞎えたりするようなものもありたす。 開催期間に぀いおは、Kaggleなどの䞀般的なものは〜ヶ月です。ただ、期間も長いため期間䞭にフルコミットする必芁はないです。参加者は䞊列しお色んなコンペに参加したり、最埌のヶ月だけ参加するなど色々な圢で参加しおいたす。たた、コンペによっおは短期間コンペのものもありたす。1日以内に終了する超短期のものや、〜週間くらいの短期のものもありたす。そのようなコンペは、どちらかずいうず期間䞭に新しい技術を孊ぶずいうよりは、これたでやっおきた経隓や知識、技術をその堎で詊すようなむメヌゞです。 参考文献: 「おすすめコンペは䜕」の答え方を真面目に考える 短期間コンペの戊い方 キャディでの仕事 ≒ デヌタ分析コンペ 竹原 最埌に、キャディでの業務もデヌタ分析コンペにも䌌た郚分もありたしたので簡単に玹介したす。 最近、図面から図面に含たれる属性を予枬する機械孊習モデルの初期開発をしおいたした。 たず、そもそもタスクがどういうものかを理解しお、たた、瀟内で保有しおいる図面解析ツヌルを動かしおみたり、図面を甚いた過去の機械孊習に関する取り組みを調査しお、初期の方針やタスクのドキュメント化を進めたした。このプロセスは、コンペでも提䟛されたタスクやデヌタを芋おから、自分の方針を固め、関連する論文や過去のコンペを調査しおいく点にずおも䌌おいたした。 次に、実際に機械孊習モデルに甚いるデヌタセットを甚意したす。この際には、実際に運甚で機胜するように適切に孊習デヌタやオフラむン怜蚌甚のテストデヌタを分割する必芁がありたす。運甚で利甚する堎面での粟床が適切に怜蚌できるように、曞き方が異なるもの、ノむズの倚いものなど性質の違う様々な図面を適切に甚意する必芁がありたした。このプロセスも、コンペでのリヌダヌボヌドのスコアずロヌカルのスコアの盞関があるようにデヌタを分割しお分析、怜蚌するプロセスに䌌おいるなず思いたした。 そしお、甚意したデヌタセットでベヌスラむンずなるモデルを孊習し、粟床や誀怜出結果を芳察したす。今回は初期の開発だったこずもあり、以降の実隓が効率的にしやすくなるようにパむプラむンの敎備をしおいくこずに力を入れたりなど、こちらもコンペの初期の取り組み方に䌌おいる郚分はありたした。そしお、コンペず同様に芳察した粟床や誀怜出結果をもずに、次の実隓や粟床改善のためのアむデアを敎理しお、チヌムメンバヌからのレビュヌを受け、継続的に改善に取り組みたす。 このようにキャディの仕事ずコンペの仕組みは近い郚分があるので、キャディ内にもコンペのような皆で協調的にモデルを改善する仕組みやプラットフォヌムができたらいいなず思いたした。たた、面癜いデヌタやタスクも倚いので倖郚向けのコンペを開催できたら良いなずも思いたした。 Microservicesに぀いお 続いお2022幎2月15日に開催された瀟内勉匷䌚、刈郚からのプレれン内容をたずめおおりたす。 https://speakerdeck.com/caddi_eng/20220215-karibe-microserviceskohi Microservicesずは䜕か 刈郚 Microservicesずは、1぀のアプリケヌションを動かすために、小さなサヌビスの集合䜓を蚭蚈しお開発するアプロヌチを指したす。 正確な定矩はなく、各瀟で採甚しお蚭蚈・提䟛しおいるのが実態です。 メリットずしおは、サヌビスが分かれおいるのでデプロむしやすく、テクノロゞヌスタックが分けおあるので適材適所で䜿え、チヌムを分けお開発ができるので組織的な柔軟性がある点ですね。 デメリットは、耇雑になりやすいこずです。 蚭蚈パタヌンずしおは、API Gateway、Choreography、Microservice Chassis、Service Discoveryず぀あるので、順番にご説明しおいきたす。 たずAPI Gatewayですが、これは倖郚からリク゚ストがあるずGatewayがすべお受け付け、Backendをたたいお1぀のAPIずしお提䟛するものです。 バック゚ンドの負荷が䞊がらないように流量制埡したり、䌌たようなリク゚ストが来たらキャッシュで返したりするこずも担いたすが、パフォヌマンスやスケヌラビリティに課題を残したす。 Choreographyは、非同期のメッセヌゞによっおサヌビス間で協調しお1぀のビゞネス的操䜜を実珟するものです。 メッセヌゞブロヌカヌが、クラむンアントからの芁求を関連するサヌビス系ず凊理を行うワヌクフロヌを実珟するのですが、サヌビス数が増えるず、耇雑なピタゎラスむッチになっおしたう懞念はありたす。 Microservice Chassisは各サヌビス共通で必芁な基盀を提䟛するもので、サヌビスの新芏䜜成が早く簡単になるのが特城。 Service Discoveryは、サヌビスのネットワヌクロケヌションをクラむアントがどうやっお芋぀けるのかずいう点に぀いおです。 普段キャディではk8sを䜿甚しおいるため、開発者はあたり意識する必芁はありたせん。 実際の䌁業ではどのように䜿われおいるのか 刈郚 䟋えばUberでは、プロダクトやプレれンテヌションのレむダヌで、各サヌビスでMicroserviceのような䜍眮付けお持っおおり、API GatewayはEdgeレむダヌにおAPIを構成・提䟛しおいる圢になっおいたす。 たたNetflixでは、Orchestratorのパタヌンずしお採甚しおいたす。これも非同期による蚭蚈パタヌンで、メッセヌゞブロヌカヌではなくサヌビスを眮き䞀連の非同期凊理を管理しおあげるものです。 Wantedlyでは、Microserviceの開発ガバナンスを高めるために共通ラむブラリを開発しおいたす。たさにこれはMicroservice Chassisです。 Service Discoveryは、Netflixではeurekaを自䜜しおいたす。 ここたでいく぀か䟋をあげおきたしたが、Micorserviceは名前の通り、どれも耇数サヌビスを協調させお機胜提䟛するものです。 耇数のサヌビスを協調させお党䜓ずしお1぀の系を成すので、゜フトりェアの抂念におさたるものではありたせん。 そこで次に、実瀟䌚ではどういう仕組みなのかを䟋をあげおみたいず思いたす。 実瀟䌚ではどういう仕組みになるのか 刈郚 こちらはファミレスの写真ですが、ここにもMicroserviceが隠れおいるず蚀えたす。 スプヌンやフォヌクは食噚メヌカヌが䜜ったもので、食材もここのファミレスの䌚瀟が調達しお料理しおいるだけですよね。氎も氎道局から、むスなどは家具メヌカヌから調達されおいたす。 このように぀の料理をテヌブルに䞊べるだけでも、バック゚ンドは様々なサヌビスを安く提䟛できるこずに集䞭しおいお、調達を埗意な業者に任せおいたす。 こうした瀟䌚的分業は、劎働が専門化するこずで䜜り出されるものです。珟実瀟䌚も専門性を組み合わせるものですよ、ず考えるこずができたすね。 キャディのビゞネスモデルをMicroservicesの芖点で芋るず キャディのビゞネスモデルも同様で、発泚者ず加工䌚瀟の間にキャディがいお、API Gatewayで芋たものず同じく内郚構造を隠しおいるように芋えおきたすし、加工䌚瀟に発泚しお最終的には顧客に玍品しおいたす。 パタヌンに぀いおも、顧客から発泚ずいうリク゚ストに察しお、耇数の加工䌚瀟サヌビスに発泚し、補品を玍品するレスポンスをするプロセスずなりたす。 キャッシュに぀いおは、キャディで抱える圚庫のようなものず考えるこずができ、顧客から䌌たような発泚があれば、キャッシュから匕き圓おるこずでリヌドタむムを短瞮できたす。 Choreographずしおも、メッセヌゞを補品ず眮き換えるこずができそうで、キャディを介さず加工䌚瀟同士でサプラむチェヌンを構築ができる可胜性がありたす。 ただ、サヌビスの数が増えるず耇雑さが増しおピタゎラスむッチを組み立おるこずになるので、Netflixの取り組みを螏たえるずキャディもChoreographyよりもOrchestrationを採甚した方が良さそうずいうこずも芋えおきたす。 Microservice Chassisに぀いおは、共通する機胜を提䟛するこずで加工䌚瀟共通のプラットフォヌムに盞圓するず考えられたす。 これは圚庫情報や䞍可状況のObservabilityを䞊げるこずにも぀ながるず考えおいたす。 おわりに 今回は、2回分の瀟内勉匷䌚の内容をたずめおみたのですが、いかがでしたでしょうか。 蚘事内容をご芧いただいお、興味持った方は こちら にお、お話する機䌚をご甚意しおおりたすので、ぜひご掻甚ください。 たた瀟倖向けに䞀般公開するむベントに関する情報は、 キャディのconnpass をご甚意しおおりたすので、こちらもご登録いただけたすず幞いです。 最埌たでお読みいただきたしお、ありがずうございたす。
こんにちは。゜フトりェア゚ンゞニアの江良です。 普段は Web アプリケヌションのコヌドをせっせず曞いお暮らしおいるのですが、AI Lab の誕生に䌎い、 機械孊習 を専門ずする゚ンゞニアず協業する機䌚も増えおきたした。 今回は、 機械孊習 の研究開発プロゞェクトで導入した Streamlit ずいう フレヌムワヌク に぀いお玹介しようず思いたす。 Streamlit ずは Streamlit は Python で Web アプリケヌションを䜜成するための フレヌムワヌク です。 機械孊習 ゚ンゞニアやデヌタサむ゚ンティスト向けに蚭蚈されおおり、 Python のコヌドを数行曞くだけで、可芖化のためのカスタムアプリケヌションを簡単に構築するこずができたす。 streamlit/streamlit: Streamlit — The fastest way to build data apps in Python 「 機械孊習 のモデルを評䟡するためのデモ甚のアプリケヌションを䜜りたい」「あくたでデモ甚なので、劎力はできるだけかけずに枈たせたい」ずいう今回の ナヌスケヌス にぎったりのツヌルだったため、導入しおみるこずになりたした。 Streamlit を觊っおみよう Streamlit は pip でむンストヌルするこずで䜿えたす。 pip install streamlit 詳现は 公匏ドキュメント に譲りたすが、ほんの数行のコヌドを曞くだけで簡単にグラフィカルなアプリケヌションが実装できたす。 import streamlit as st x = st.slider('Select a value') st.write(x, 'squared is', x * x) 䜜成したアプリケヌションは以䞋のコマンドで起動できたす。 streamlit run main.py チュヌトリアル に茉っおいる 30 行ほどのコヌドを曞くだけでこんなアプリケヌションも䜜れたす。 Streamlit の嚁力をなんずなく感じおいただけたでしょうか Streamlit アプリケヌションを公開しよう Streamlit Cloud の玹介 Streamlit で曞いたアプリケヌションは Streamlit Cloud ずいうサヌビスを䜿うこずで簡単に ホスティング できたす。 䜜成したアプリケヌションを党䞖界に公開するこずもできたすし、有料の Teams プランに加入すれば瀟内だけに限定しお公開するこずもできたす。 公匏ドキュメント を参考に Streamlit Cloud にサむンアップし、 GitHub リポゞトリ 、デプロむしたいブランチ名、main ファむルのファむルパスを入力しお少し埅぀だけで、簡単に Streamlit アプリケヌションをデプロむできたす。 アプリケヌション、むンフラ構成の玹介 次に、今回䜜成したアプリケヌションの構成に぀いお觊れおいきたす。 構成に぀いおは、ざっくり以䞋の通りです。 蚓緎枈みのモデルは GCS に配眮し、掚論時に取っおくる 掚論に䜿うデヌ タセット は BigQuery から取っおくる GCP の各サヌビスにアクセスできるよう Service Account を䜜成し、credential を参照させる Streamlit の Secrets Management ずいう機胜を䜿うず、credential のようなセンシティブな情報を安党に保存し、Streamlit のアプリケヌションから 環境倉数 越しにアクセスさせるこずができたす。 Secrets management - Streamlit Docs Connect Streamlit to Google BigQuery - Streamlit Docs st.secrets を参照するようにアプリケヌションのコヌドを曞き換え、 def get_credentials(): if "gcp_service_account" in st.secrets: return service_account.Credentials.from_service_account_info( st.secrets["gcp_service_account"] ) else: return None Streamlit Cloud の「Advanced settings」に指定するこずで Secrets を䜿甚できるようになりたす。 Streamlit Cloud のハマりどころ ここたで Streamlit、Streamlit Cloud の良いずころを玹介しおきたした。 この勢いのたた Cloud 䞊にさくっず持っおいけるず良いのですが、 Streamlit は2018 幎に公開されたばかりの比范的新しい フレヌムワヌク のため、実務で利甚するにあたっおはいく぀か萜ずし穎も存圚したす。 メモリが足りない Streamlit Cloud は䜿甚可胜なメモリに制限がありたす。 2022/02/14 珟圚で、Free プランなら 1G、Teams プランなら 3G が䞊限ずなりたす。 Troubleshooting - Streamlit Docs この制限を超えおしたうず、 Oh no. のメッセヌゞずずもに Streamlit アプリがクラッシュしおしたいたす。 この問題を解決するには、Streamlit のキャッシュ機胜を正しく掻甚するこずが鍵になりたす。 キャッシュ機胜は、キャッシュしたい凊理の関数に @st.cache を指定するこずで蚭定できたす。 @st.cache def load_data(nrows): data = pd.read_csv(DATA_URL, nrows=nrows) data[DATE_COLUMN] = pd.to_datetime(data[DATE_COLUMN]) return data Optimize performance with st.cache - Streamlit Docs キャッシュが効かない ずころが、この @st.cache を䜿甚するだけでは問題が解決しないケヌスがありたす぀らい。 Experimental cache primitives - Streamlit Docs によるず、 @st.cache の単䞀 API であたりにも倚くの ナヌスケヌス をカバヌしようずした結果、凊理が遅く耇雑になっおしたったずのこず。 この問題を解決するために、streamlit v1.0 から @st.experimental_singleton ず @st.experimental_memo ずいう API が远加されたした。 クレデンシャルオブゞェクトなど、䞀回だけ初期化したいものか぀セッション間で共有されお問題ないものに぀いおは @st.experimental_singleton が䜿甚できたす。 @st.experimental_singleton def get_credentials(): if "gcp_service_account" in st.secrets: return service_account.Credentials.from_service_account_info( st.secrets["gcp_service_account"] ) else: return None デヌタを返す関数には @st.experimental_memo が䜿甚できたす。 @st.experimental_memo def load_data(nrows): data = pd.read_csv(DATA_URL, nrows=nrows) data[DATE_COLUMN] = pd.to_datetime(data[DATE_COLUMN]) return data これらの問題を解決したずころ、無事デモ甚のアプリケヌションが Streamlit Cloud 䞊で動䜜するようになりたした :tada: おわりに 以䞊、Streamlit ず Streamlit Cloud の玹介でした。 Streamlit をうたく掻甚できたおかげで、 機械孊習 のモデルの評䟡も順調に進み、珟圚は「 機械孊習 を実際のアプリケヌションにどう組み蟌むか」を議論するフェヌズにたどり着くこずができたした。 がくが担圓したのは Streamlit Cloud を䜿えるようにするための蚭定ず若干のコヌド倉曎だけでしたが研究開発の成果がきちんず「次」に぀ながっおいく堎に立ち䌚えるのは嬉しいですね。 We're hiring キャディでは、 機械孊習 のタスクを実装し、結果を可芖化しお高速に改善するこずで、モノづくり産業のポテンシャルを解攟するプロダクトを開発する゚ンゞニアを募集しおいたす。 ずころで、がくの専門はバック゚ンド゚ンゞニアです。こちらのご応募もお埅ちしおおりたす。
キャディで゚ンゞニア採甚を担圓しおおりたす片枕です。 今回は2022幎2月8日に開催されたFindy様のむベントに登壇させおいただきたした、AI LabのMLEテッ クリヌド の河合 @vaaaaanquish からの トヌク 内容を䞭心にたずめたむベントレポヌトをご玹介しおいきたす。 [ toc ] 以前お互いにマネゞメントする偎・される偎の関係でしたが、今その時の経隓がいきおいるこずなどありたすか 河合 キャディ入瀟前の前職で䞊叞だった西堎さんも芚えおいるず思うのですが、壁打ちを毎日やっおいたした。 技術遞定やマネゞメントなど、䜓力ず粟神力をずおも䜿いたすが、途䞭から本気でこれをやっおいお気が぀いたこずがありたす。 それは、こちらが本気になっおも䞊走できる人がいるんだなず思ったこずで、ただただ自分も䌞び代があるなず、本気で自分も誰かからぶ぀けられおも倧䞈倫なよう歊噚をしっかり持ち、旗を立おおその旗をふれるようなリヌダヌシップを発揮しようかなず思うようになりたした。 あず、西堎さんずの察話をスムヌズにするためにビゞネス曞を読むようになりたしたね。 壁打ちずは具䜓的にどのようなこずをしおいたのでしょうか 河合 自分のアむディアを聞いおもらっお、西堎さんに「それはなぜ」ず聞かれ、理由を回答しおいくこずを繰り返しおいくものです。 思考が深掘りを繰り返すハヌドなものでした。 西堎さんが1on1で自分が退いおも倧䞈倫な環境䜜りをしおいた事に察しおキャディでも採甚をがんばっおいるし、優秀な人ず話をしおいるのですが、この人がキャディに入瀟しおきたら私もプレッシャヌがすごいな、面癜い仕事を甚意しないずなず感じるこずがありたす。 そうしたノりハりをNoteにたずめたいですね。 これたでどんなキャリアを歩んで来たしたか 河合 開発䞻軞でずっずやっおきたした。 孊生の頃からML゚ンゞニアのバむトをやっおいお、Sansanに1瀟目で入っお、R&Dの郚眲で開発䞀蟺倒でやっおいたした。 画像認識の アルゎリズム を䜜っお、本番環境に乗せお運甚するこずですね。 瀟目ではチヌムリヌダヌもやっおいたしたが、基本は 機械孊習 のモデル開発をずっずやっおいたした。 M3に入っおからは、かなり道が倉わっお、チヌムずかプロゞェクトのマネゞメントをやっおきた、プロダクトずか事業を芋るようになっお、今ではキャディでサヌビス開発や䌚瀟の未来を考えながらツヌルや技術、採甚、䜓制䜜りをフォヌカスしお動かしおいたす。 なので、開発の時間は枛っおいる感じで、キャリアが少し倉わっおきたず思いたす。 珟職に転職したきっかけは 河合 技術に興味あるこずをやっおいたのでカゞュアル面談をさせおもらい、幎くらい経過しおから入瀟したした。 転職においおは、ビゞョンやミッションを倧事にしおいるずころを芋おいたすね。 これがずおも倧事ず分かっおいるし、キャディはそれを倧事にしおいたしたので。 M3で色々ず芖野が広がったので、それを出し切れるような、MLテッ クリヌド ずいう立堎でチヌムを立ち䞊げるずか、AIビゞネスをキャディは圓初は持っおいないのでそれを加速させるずころですね。 Mで孊んだこずを、䜕もないずころからトラむできるずころが、自分の成長に良さそうず思っお転職をしたした。 ゚ンゞニアキャリアの䞭で悩んだこずは 河合 M3の時は西堎さんがいたので、キャディの話を聞き始めたずころから、チヌムから倖れた仕事をしおいたした。 西堎さんがやっおいた仕事が私にやっおきお、ずおも楜しかったです。 だけどRustずか自分の興味あるこずはあたりできなかったので、悩みポむントではありたしたね。 どっちがいいのかなず、最終的には技術を私は遞んだわけですが。 技術を遞んだ背景は 河合 ビックりェヌブに乗るむメヌゞですね。私自身MLは10幎くらい経隓があり、その䞭で様々な蚀語で曞いおいたす。 Sansanだず C# だったり Python 導入したりずやっおきたした。 プログラミング蚀語 によるブレむクポむントはあたりない状況が続いおいたず思いたす。 その䞭で、可胜性がありブレむクポむントになりそうなのがRustず感じお、ここにかけおもいいかな、これは流行るだろうずいうずころに乗っかった感じですね。 悩みが吹っ切れたタむミングありたしたか 河合 尊敬しおいる゚ンゞニアやプロダクトマネヌゞャヌなど、いろんな人に話を聞いおいく䞭で敎理されたむメヌゞです。 PFNで゚ンゞニアをやっおいた方に、メンタリングのような圢で、「お金など党おの問題が解消されたずきに䜕をやりたい」ず聞かれお、問題はいろいろあるけれど本圓は䜕をやりたいのかずいうこずを考えさせられる機䌚がありたした。それが䞀番の”きっかけ”ではあったず思いたす。 最埌は、決めだずは思っおいるので、えいやで決めたずころはありたすが。 もし今、孊生だったらどんなキャリアを遞びたすか 河合 私は実は孊生時代に未緎があっお、研究をもっずちゃんずやりたかったんですよね。 囜際孊䌚に論文を出しおいたけど萜ちた経隓が苊く残っおいお、今思うずもっず䞊手にできたなず感じおいるので、研究をがんばるず思いたす。 その先は、研究を掻かせる゚ンゞニアリングの䌚瀟に就職するようなずころかなず。 今埌も゚ンゞニアの裟野は広がるず思っおいお、コンピュヌタヌサむ゚ンスや 機械孊習 の専門性を高めるこずがより重芁になるず思いたす。 そういった意味でも倚分研究に打ち蟌むだろうず思いたすね。 倉化の早い業界にいる䞭で技術面や粟神面で心がけおいるこずは 河合 西堎さんが勉匷し続けるず答えたこずに察しお勉匷は倧事だず思いたす。 私は最近は、技術曞を執筆したり、グロヌバルをキャディは目指しおいるので英語を孊習したりしおいたす。 他の回答だず、打っおも壊れないものを探したいですね。西堎さんずの壁打ちで味を知っおしたったかもしれないのですが、本気でぶ぀かっおもいい人がいるのは、自分が成長できるので、呚りにそういう人が集たるように行動しおいたす。 自分より必ずしも技術力などレベルが高い人をずいうわけではなく、本気で意芋しおも壊れないメンバヌず察話するこず。 他の䌚瀟ずMeetyで1on1をしおいるが、そういう機䌚を増やすの倧事。 自分の䞭では今それが熱いです。 ML゚ンゞニアにずっお倧䌁業ずベンチャ〜の違いは 河合 瀟目はYahooだったのですが、倧きな䌚瀟のむンフラには䞀定の正解があったりしたす。 小さい䌚瀟では扱えないデヌタサむズ・品質・関わる人の数が圧倒的に違うので、技術力は同じだったずしおも、ML゚ンゞニアの働き方の違いは出おくるなず思いたす。小さな改善で倧きな成果を生めるのも違いたす。 どっちがいい・悪いではなく、経隓しおおくず良いず思いたす。逆に小さい䌚瀟では、倧きな改善を自ら考える必芁がありたす。むンフラのスケヌルも自ら考え自ら手を動かしたす。 そういう意味でも、キャディはいいですよ。笑 圹員ずの距離も近いですし、察等に開発を䞻導できたす。 これからチャレンゞしたいこずや今埌のキャリアの方向性は 河合 打倒、西堎です。笑 西堎さんは、か぀おM3でAIチヌムを立ち䞊げおいたしたが、私は珟圚キャディでAI Labは立ち䞊げ䞭です。 西堎さんの立ち䞊げを圧倒するようなスピヌドで成長するのが目暙だし、キャディAI Labの目暙でもありたす。 特に自分にしか出せないずころ、技術的な知識や耇数の䌁業経隓、 Twitter フォロワヌも倚いので採甚で圧倒的な成果が出せるのでは・・ず思っおいたす。笑 転職をするこずに぀いおどう思いたすか 河合 私は転職に明るい業界ですよずいうこずは垞に蚀えるようにしたいず思っおいたす。 人ず䌁業ずはラむフステヌゞによっおは合う・合わないはあるず思うのですが、業界党䜓でそういった意識を持っお、より良い人が入っお来やすい環境にできればず垞に思っおいたす。 キャリアを重ねる䞊で、お金や仕事、生掻のバランスはどう掚移させたしたか 河合 M3に入るたでは、ずにかくお金のずころは䞊げおいこうず思っおいたした。 最近はそれが萜ち着いおきたかもしれないですね、それは子どもがうたれたこずが倧きいかなず感じおいたす。なるべく未来を䜜る仕事をしたいなずよく思っおいたす。 瀟䌚人になっおから゚ンゞニア以倖の仕事でやっおみたかったこずは 河合 非垞に難しい質問で、゚ンゞニアしか思い぀かないんですよね。Youtuberずか人生楜しくなりそうで良いなず思いたす。リスクはありそうですが。笑 ML以倖で興味がある技術ありたすか 河合 盎近だず、WebAssenblyをやっおいたす。これは䞀郚曞籍執筆のためにやっおいるのですが面癜いです。 これたでのWeb技術の抂念を倉えるこずができるずたでは蚀いたせんが、投資しおもよい技術の぀だず思いたす。 WebAssemblyの代替技術も出おくるずは思いたすが、この抂念を知るこずは重芁だず思いたす。 機械孊習 の応甚事䟋も増えおいたすしね。 仕事で行き詰たった時のリフレッシュ策は 河合 行き詰たっおもやるしかないずは思っおいるのですが、匷いお蚀えば嚘ず遊ぶずかそういう話になりたすかね。 あずは Twitter ですね、これは気持ちが切り替わるのでいいですよ。笑 本気で打っおも壊れない゚ピ゜ヌドを教えおください 河合 来週たでにこれやっおおいおくださいず西堎さんに蚀うず、なんでもやっおくれたずころです。100個くらいの回答が返っおきたす。 次の日くらいたでに考えおくれたりずか、毎回そういう感じなので、継続的なそうした察応が思い出に残っおいる゚ピ゜ヌドかなず感じたす。 どんな䌚瀟に魅力を感じるか 河合 ビゞョン、ミッションがしっかりしおいる䌚瀟ですね。 ビゞョン、ミッションは誀解されやすいですが、実ぱンゞニアずしお自分が働きやすい䌚瀟かどうかの1぀の指暙になるず思いたす。 実䟋を出すず、その䌚瀟の評䟡基準がそこにあったりもするのです。 我々が働いおいるのはあくたで 営利䌁業 なので、䌚瀟のビゞョンやミッションに察しおちゃんずできおいるかずいうずころは非垞に重芁です。 「技術力が高い」ずいう指暙があったずしお、ビゞョン・ミッションず少しズレた技術力を高め評䟡されないずいった䞍幞なシヌンもよく芋たす。 䌚瀟が目指しおいる姿を自分に重ねられるかは重芁だず感じおいたす。 最埌に いかがでしたでしょうか 河合からもむベント時に案内がありたしたが、カゞュアルにキャディの゚ンゞニアず話をしおみたいずいう方は、 こちら より申し蟌んでいただけたすず幞いです。 たた、むベントに関する情報は、 キャディのconnpass がありたすので、こちらも登録いただけるず嬉しいです。 最埌たでお読みいただきたしお、ありがずうございたす。
物理のモノづくりず比べた゜フトりェア開発 物理的なモノだからこそ難しい事 ここたでは 品質の難しさや取り組みの重芁性 に関しお語っおきたしたが、物理的なモノを扱っおいるからこそ発生するチャレンゞを玹介したす。 スケヌルの難しさ ゜フトりェアの䞖界では凊理胜力を䞊げるためにサヌバを远加しおHorizontal Scalingしたり、マシンスペックを䞊げおVertical Scalingしたりできたす。 ナヌザ数やシステム負荷に応じ動的に調敎ができたす。 しかし、補造するのには材料を賌入したり物理的に加工する時間が必芁です。 そのため圓然加工機も必芁ですし圚庫する倉庫も必芁です。 クラりドず違い簡単に固定費を䞋げる仕組みが無いため、需芁予枬が非垞に倧切になっおきたす。 リカバリヌの難しさ サヌバの障害アラヌトが䞊がるずログを遡っお事実確認に入るのず同じく、キャディでお客様から䞍良の連絡があるず事実確認を行いたす。 遠隔で芋れるサヌバログず違い、事実確認だけのために実物の配送が必芁な堎合もありたす。 補品が倧きすぎお怜査員を動かす方が補品を動かすより経枈的な堎面もありたす。 修正もサヌバに新しくデプロむするのではなく、物理的に远加加工をしたり、出来ない堎合は再制䜜になりたす。 ゜フトりェアの再制䜜はファむルコピヌで終わるものの、物理的なモノを耇補するのにはお金ず時間が必芁です。 そしお圓然ですがロヌルバックも出来ないため非垞に神経を䜿いたす。 アゞリティ向䞊の難しさ ゜フトりェア開発ではロヌルバックを可胜にしたり、git branch毎にコンパむルする技術を導入する事で、よりリスクを小さく早く取りやすくなっおきたした。 蚭蚈倉曎も小さくデリバリヌできるようになりたした。 しかし、CI/CD同等の技術はスケヌルの難しさの関係で経枈的に実珟しにくく、リカバリヌの難しさもあり小さくデリバリヌする事自䜓が難しいです。 品質は物理も゜フトも同じに扱える ゜フトりェア開発も昔は簡単にロヌルバックできない、スケヌルしにくい、アゞリティ䞊げにくい、ず数倚くの課題に悩たされおいたした。 ロヌルバックの仕組みが無いため「最埌のチェック」を匷化する傟向は補造業ず同じくありたしたし、デプロむ䜜業する床に本番環境に盎接SSHしお汗かきながらコマンドを打っおいた時代もありたした。 でも、Cloud Native時代の今ずなっおは党く事情が違い、スケヌルもデプロむの再珟性もロヌルバックも党郚実珟できる䞖界になっおきたした。 物理的なモノづくりず゜フトりェアは具䜓のプロセス芳点では違いがあるものの、品質芳点から芋るず意倖ず䌌おいる郚分もあるかなず思いたす。 物理のモノず゜フトりェアを飛行機や空飛ぶ乗り物の開発文脈で玹介したす。 飛行機ずいえば安党性を意識したすよね。 機内の垭の広さや窓の倧きさも重芁ですが、安党に目的地たでたどり着けるこずが倧前提ずなっおいたす。 実際は法埋䞊数倚くの安党性芏定があるわけですが、どのように「安党性」ずいう品質芁件を考えられおいるのか深がっおみたしょう。 我々が乗る飛行機は加工郚品、電子郚品、゜フトりェア、パむロットが組み合わさっお初めお機胜する仕組みです。 党お重芁な芁玠ですが乗客からしたらそこの詳现は関係なく、安党な空の旅が出来るかが重芁で、総合的な結果が䞀番倧切。 仮にゞェット゚ンゞンが故障しおも嬉しくはないけれども、安党にたどり着けるこずに越したこずはないです。 党おの芁玠がコントロヌラブルでは無い䞭でも、最終的な安党性指暙ずしお事故の確率が蚭けられおいるのが航空宇宙業界が成熟しおいるずいう䞻匵かもしれたせん。 半䞖玀以䞊品質ず向き合っおきた業界から、我々玔粋な゜フトりェア開発者ずしおも参考にできる芁玠はいく぀かあるのではないでしょうか。 モゞュヌル分解しおいるのは゜フトりェアも䌌おいる 安党性ずいうのは確率論なので数倀化しやすく芋えたすが、事故芁因は無限倧に想像できたすよね。 ゞェット゚ンゞンに鳥が巻き蟌たれたり、郚品が劣化しお壊れたり、そもそも寞法違いの郚品が組み蟌たれおいたり。 マニアックな䟋だず宇宙からの攟射胜で組み蟌み゜フトの倉数が皌働䞭に倉わっおしたうずか。 あらゆるリスクを掗い出しお発生確率を蚈算したす。 さお、ここで぀のモゞュヌルが同時䞍具合起こしお初めお乗客にむンパクトがある事故になる堎合、事故率を以䞋のように衚珟できるでしょう。厳密には独立倉数前提で蚘茉しおいたす P(overall) = P(A and B) = P(A) x P(B) 䞀方で、いずれかのモゞュヌルの䞍具合により乗客むンパクトがある堎合は P(overall) = P(A or B) = P(A) + P(B) – P(A) x P(B) なるべく安党性を䞊げる䞊では䞡方のモゞュヌルが䞍具合を起こしお初めお事故に぀ながるようにレバレッゞしたくなり、モゞュヌルに分解しお極力独立倉数になるように蚭蚈する事を意識する方向性になるかなず思いたす。 曞いおみれば圓たり前ですが、飛行機の品質を総合的に評䟡する䞊で党䜓を耇数の独立したモゞュヌルに分解し、モゞュヌル単䜍でリスク分析をする事で党䜓の確率を蚈算しやすくしおいたす。 機内のビデオ配信システムず゚ンゞン制埡のシステムが完党に独立しおいる蚭蚈になっおいるからこそ、ビデオ配信システムはランタむム゚ラヌを起こしおも機䜓の安党性には圱響䞎えない保蚌がありたす。 重芁なシステムの冗長性を担保するために耇数台バックアップ甚のシステムを蚭けるこずもありたす。 ゜フトりェア開発する䞊でもモゞュヌル同士を粗結合にすべきか刀断する䞊で、゚ラヌのトレヌサビリティやリスク分析のしやすさも考慮すべきなのかもしれたせん。 品質考える䞊でナヌザもシステムである 飛行機を蚭蚈する䞊で、党おが広い意味でのシステムずしおモデリングされたす。 ゚ンゞンも、構造物も、゜フトりェアも、パむロットもシステムです。 䜕らかのむンプットを元にアりトプットを出すものは党おシステム。 そしおシステム毎に䞍具合の確率や䞍具合時の挙動を定矩しおいくず、機䜓だけではなく空を飛ぶ仕組み党䜓ずしおの䞍具合の確率が出せたす。 ここでパむロットが党䜓の䞀郚であり、システムでもあるずいうポむントが特城的かず思いたす。 パヌフェクトな人間はいないのでパむロットずいうシステムを定矩する䞊で「◯◯レベルたで蚓緎したパむロットならXの確率で操䜜ミスをする」ずいう前提を蚭けお、飛行機党䜓の䞍具合の確率を蚈算したす。 安党に到着する目的に向けおパむロットのトレヌニングを匷化する斜策もあれば、より操瞊を自動化する方法もありたす。 りェブアプリのナヌザ幅はパむロットよりは広く定矩も曖昧ですが、ナヌザに䟡倀提䟛出来るかは゜フトりェアの技術的芁件だけではなく、ナヌザの思考にも巊右されたす。 ナヌザをトレヌニングすべきかそもそも察象倖にすべきかはプロダクト次第ですが、ナヌザのペル゜ナや前提知識をしっかりず蚀語化する事で初めおナヌザずいう「システム」を品質の指暙蚈算に入れられたす。 玔粋な゜フトりェアの䞖界でもナヌザを党䜓システムの䞀郚だず考えるず、最終的に提䟛したい䟡倀がより蚀語化できるのかもしれたせんね。 品質は継続的に改善する事で単発の䜕かではない. DevOpsもたさにこれ 航空業界では 「the laws are written in blood」 ず蚀われるこずもありたす。 党おの事件に察しお調査が行われ、根本原因が特定され、再発防止察策実斜たでサむクルが培底されおいたす。 法埋や芏定の数が凄たじい事になっおいたすが、良い意味で改善が続けられおきた蚌拠ずも蚀えるでしょう。 過去の倱敗を元にPDCAを回し続けおきたからこそ、飛行機の事故率は亀通事故より䜎い実瞟がありたす。 キャディの゜フトりェア品質組織 今の䜓制 2022幎2月珟圚、いわゆる「品質」や「QA」や「QC」の専任人材も組織も無いです。 だからずいっお補造業でいう怜査工皋が無いわけではないですが、逆に開発者が自らプロセス改善含めお改善に投資する文化になっおいたす。 専任がいないため劣埌されるものも倚く、最終的なあるべき姿ずはいえないかもしれたせんが、実は創業から四幎間QA組織を意図的に䜜っお来なかった背景がありたす。 早く専任QA組織を䜜るず機胜を開発する人間ずしお「䞀旊QAに芋おもらう」事が頭を暪切っおしたいたすよね。 この気持ちは分からなくはないです。 しかし、この思考が根付いおしたうずQAが「テスタヌ郚隊」ず暗黙知かもしれないが認識されおしたい、本質的にナヌザ䟡倀を最倧化するための改善掻動にリ゜ヌスが避けられなくなりたす。 ある意味、開発組織が小さいうちに、皆で倚少の障害を起こしたり転びながら成長しおいくフェヌズかなず思っおいたした。 もちろんテスタヌのロヌルを担うリ゜ヌスは確保しおいたすし、珟時点では開発組織も芖座高く䟡倀は出せおいるず思いたすが、がちがち限界に近づいおいたす。 開発組織も50人超えお、今埌さらに拡倧しおいく必芁があるためキャディの開発組織を䞀段レベルアップさせる斜策が必芁だず感じおいたす。 ここたで自ら品質ず向き合っおきた開発組織だからこそ、最匷の品質組織をこれから䜜れるのではないかず思いたす。 テスト自䜓は滑り止めでしか無い 本質的には「怜査」でミスに気づくのではなく、そもそもミスが起きないような仕組み䜜りやプロセス改善が組織の積み䞊がる資産になるず信じおいたす。 最埌に意図的にこがしおいるものを「怜査」で拟うのは健党ですが、意図せぬものがそこで怜知されるず䞊流工皋の方に目を向けるべきです。 このためにはDevOps的な動きも必芁ですし、テストやプロセスの自動化も必芁ですし、開発者の目線揃えも重芁です。 車茪の再発明も枛らしお共通化できる郚分は暪断組織で持぀事で、機胜の品質を向䞊する事もできたす。 たた䟡倀を最倧化する䞊ではより倧胆な斜策に挑戊する事も重芁で、そこの仕組み䜜りずいう意味で、月にプラットフォヌム゚ンゞニアングチヌムを䜜りたした。 開発方針の刀断材料ずしお品質指暙が重芁かも 珟状ではSLI・SLO運甚はしおいたせん。 厳密に䟡倀や安定性を数倀化出来おいないずいうのもあるのですが、䜕らかの圢で今の品質を衚珟する刀断の軞を蚭ける事で皆の目線を揃えやすくなるかなず思いたす。 䟡倀自䜓を分解し、䞭間指暙にする事で。 今埌に向けお 䟡倀提䟛を䞀緒に考える仲間を探しおいたす 正盎、専属の人を眮くこずが重芁なのかも分からないです。 明確に品質ずいう領域に泚力するリ゜ヌスは必芁ですが、それがどういう圢でどういうロヌルなのか、日々の動き方がどうあるべきかただ分かっおいないです。 色々な事䟋を参考にさせお頂いおいたすが、䞀緒に挑戊しおみたいなず思う方は TwitterのDM たたは 応募ペヌゞ からぜひカゞュアル面談をでも蚭定䞋さい。 珟状では専任のテスタヌ郚隊を求めおいるのではなくお、ナヌザ䟡倀を届ける䞊でのコスパを考慮し、プロセス改善からテストたでお任せできる人です。 党工皋のステヌクホルダヌが䟡倀提䟛にフォヌカスしお、コスパやリスクトレヌドオフの刀断ができる組織を目指しおいたす。 ドメむン゚キスパヌトの仲間も探しおいたす パフォヌマンスやセキュリティ等、普段非機胜芁件ずたずめられる領域も暗黙知の機胜芁件です。 DevSecOpsずいう衚珟がバズる理由も分からなくは無いのですが、これも品質基準の蚀語化の䞀皮であるず考えおいたす。 このような新たなムヌブメントを瀟内で䜜ったり、専門知識を掻かしたい方も是非お声がけ䞋さい。 絶賛仲間を探しおおりたす。 The post 補造業ず゜フトりェアの品質 Part 2/2 appeared first on CADDi Tech Blog .
キャディで゚ンゞニア採甚を担圓しおおりたす片枕です。 今回は2022幎1月26日に開催された MIDAS TECH STUDY に登壇させおいただきたした、AI LabのMLEテッ クリヌド の河合 @vaaaaanquish からの トヌク 内容をたずめたむベントレポヌトになりたす。 䞋蚘のように、むベント党䜓の動画も公開されおおりたすが、ブログずしおざっず発蚀内容を確認したい方は、このたたお読みいただけたすず幞いです。 https://www.youtube.com/watch?v=YunfRd33pwE [ toc ] 最近起こった倉化 コロナ犍の圱響で、新しく制床ができたずか組織の倉化などありたしたでしょうか 河合 採甚広報のスタむルは倉わったず思いたす。AI領域だず孊䌚や勉匷䌚、論文の読み䌚などは採甚の䞻軞ずなりたしたね。 以前は、良い人に出䌚ったらそこからのリファヌラルが倚かったのですが、最近は枛っおきおいる感じがしたす。カゞュアル面談やWeb広告も出す方向性が倉わったなあず感じおいたす。 ワヌクスタむルの倉化ずしおはいかがでしょうか 河合 キャディもリモヌトが倚いので、ほずんど䌚ったこずがない人たちも倚いですね。地方圚䜏者などリモヌト前提で採甚しおいる人もいたすので、この人ずは実際に䌚う機䌚あるかなあず思いながら仕事しおいたす。リアルで合わないたた仕事しお、そのたた転職しおしたう・・・ずいうのもありそうだなず。 オンラむン䞭心の仕事で苊劎しおいるこずはありたすか 河合 信頌関係構築ずいう意味で、ビゞネス理解は課題に感じおいたすね。特に゚ンゞニア同士はオフラむンで集たるのは簡単なのですが、䌚瀟の党倧䌚で話があるようなビゞネス戊略の話ず開発の話はちょっず遠い・・みたいなずころがありたす。 瀟内コミュニケヌションツヌルの倉化などに぀いおはいかがですか 河合 slackでのコミュニケヌションはさかんですね。Jiraを䜿っお、最近ではBiz偎にも スクラム を䜿おうずいう動きは増えおきたおいたすが、゚ンゞニア偎が䜿うツヌルは倉わらないかなず思いたす。 それから瀟倖ずいう意味では、Meetyが流行るこずは予想しおいなかったですね。カゞュアル面談にWelcomeな゚ンゞニアが倚いのは驚気でした。 組織マネゞメントに぀いお 副業などは、どのように考えおいたすか 河合 自分の裁量でやっおくださいずいうスタンスですね。私が所属しおいるAI Labでは、比范的たずたったタスクを切り出しやすいので、副業で関わっおくる倖郚の方には䟝頌しやすいです。 たた、面接官をしおいお面接の時に副業okかどうか、ずいうのを確認しおくるケヌスが倚い印象はありたす。 ベンチャヌ 業界だず、自分はこういうこずもやっおいきたいずいうものを耇数持っおいる人もいたすので。 研修や人事制床に倉化があったケヌスはありたしたか 河合そのあたりは倉化はしおいないのですが、組織蚭蚈の意味で倖郚に切り出しやすいタスクはい぀も考えおいたす。やはり副業する人も増えおいたすからね。 河合さんは䌚瀟に出瀟するケヌスはどのような感じですか 河合 キャディに転職しおから、入瀟時研修で少し出瀟した皋床で、今はほずんど出おないですね。なのでコミュニケヌションが垌薄になるので私は意識的に、1on1をわらしべの圢で草の根的に色々な人ず積極的に話をするようにしおいたす。 同じチヌムメンバヌずの1on1はどのくらいやっおいたすか 河合1on1の数は倚くなっちゃいたすけど積極的にやっおたす。やはりオンラむンだず難しいずころもあるので、1on1で情報収集しないずいけないなあず感じおいるんですよ。 採甚に぀いお 報酬面に関しお䜕か意識しおいるこずはありたすか 河合 キャディでは絊䞎テヌブルを公開しおいおるので、それを面接やオファヌ面談などの亀枉でも䜿うこずがありたす。こういう人はゞョブグレヌドはこうなりたすよ、ずいう感じに。 たたSOずか、そのようなものも含めおお互いに亀枉しお話するこずをやっおいたす。 技術面接の時点で話すケヌスもあれば、最終のオファヌ面談の時もありたすね。このあたりは本人のWillもあり、柔軟にやっおいく必芁があるず思っおいたす。 副業や フリヌランス の採甚に関しおは、いかがでしょうか 河合 AI Labでは業務委蚗でお願いしおいるケヌスも倚く、課題も切り出しおいたす。ただ、䌚瀟が目指すビゞョンを䞀緒にやるずころに魅力を感じおくれないず、そういう人を瀟員に掚すようなこずはしおいたせんね。 私も、キャディず面談しはじめたのは2021幎の月ごろからで、䜕回も面接しお、TechやEM、BizやHRなどたくさんの瀟員ず話をさせおいただきたした。䞀緒に働きたいず思ったら面談を耇数セットしおくれるのはありがたいですね。 最埌に、䌚瀟玹介などをお願いしたす。 河合゚ンゞニア採甚は積極的にやっおいたす。囜内倖問わずですね。 むずかしいずいうこずをおもしろがる、ずいうのが私も奜きで、キャディではIT改革が起こっおいない補造業の課題調達や加工などものづくりず IT技術 を組み合わせるずころの難しさがありたす。 そこに、いろいろなチャレンゞをしおいる゚ンゞニアがいたすので山を登る難しさが楜しいずいう人は、ぜひカゞュアル面談したいですね。 最埌に いかがでしたでしょうか 河合からの話にもありたしたが、カゞュアルも含めキャディの゚ンゞニアず話をしおみたいずいう方は、 こちら より申し蟌んでいただけたすず幞いです。 たた、むベントに関する情報は、 キャディのCONNPASS がありたすので、こちらも登録いただけるず嬉しいです。 最埌たでお読みいただきたしお、ありがずうございたす。
キャディで゚ンゞニア採甚を担圓しおおりたす片枕です。 今回は、゚ンゞニアの瀟内勉匷䌚「STUDDi」におプレれンがありたした䞀郚の情報2ネタほどを、レポヌト圢匏でお䌝えしたいず思いたす。 STUDDIは、゚ンゞニア党員が持ち回りで発衚機䌚があるものですが、入瀟しおくる方も増えおきたこずもあり ただ䞀床もスピヌカヌになっおいない方新しく入られた方の発衚する堎ずしお優先する 奜きな技術に぀いお思う存分語っおOK ずいう方針でやっおおりたす。 OAuth 2.0ずOpenID Connect 認蚌ず認可の違い OAuto2.0ずは OpenID Connectずは Kleinでの認可・認蚌プロセスのフロヌに぀いお Authorizationヘッダヌの䞭身 認可リク゚ストの流れ 悪意のある乗っ取り攻撃を防ぐために 地図情報システム入門 緯床経床だけでは䞀意に堎所は定たらない 䞀意に堎所を定めるために 䜍眮情報のデヌタ圢匏 地理情報デヌタを解析するずき Web地図描画 おわりに OAuth 2.0ずOpenID Connect 今回はたず2022幎1月18日に開催された瀟内勉匷䌚、先山からのプレれン内容をたずめおおりたす。 https://speakerdeck.com/caddi_eng/20220118-sakiyama-oauth2-dot-0-and-oidc-falsekohi 認蚌ず認可の違い 先山 今回のアゞェンダずしおは認蚌・認可の話から、OAuto2.0やOpenID Connect、アクセストヌクンや認可リク゚ストに぀いお、説明しおいきたいず思いたす。 たず、認蚌ず認可の違いから。 認蚌ずは通信先の盞手が誰かを確認するずころで、あなたは誰を蚌明するためにログむンするずころを指しおいたす。 䞀方で認可ずは、暩限があるかどうかを確認しおいたしお、決裁できるずか特定の画面を閲芧できる暩限ずかですね。 今回のメむントピックはこの「認可」の話になりたしお、最近だずマむクロサヌビスが流行り、認蚌や認可をどうしおいくかは、アヌキテクチャ的には重芁になっおきおいたす。 OAuto2.0ずは 先山 認蚌や認可に関するプロトコルずサヌビスに぀いおはスラむドにある通りなのですが、その䞭でたずOAuth2.0を取り䞊げおみたいず思いたす。 こちらは認蚌ではなく認可のフレヌムワヌクで、アクセストヌクンを䜿っおAPIアクセスするための暩限を委譲するこずができるものです。ざっくりいうずアクセストヌクンの発行手順を策定したものです。 泚意点ずしお、2.0の内容ではセキュリティ察応が䞍十分なものがありたす。これは埌にOAuth2.0 Security Best Current Practiceの方で補完されおいたす。もしOAuth2.0のドキュメントを読む堎合はこの点に泚意しおください。 珟圚、仕様策定䞭のOAuth2.1ではOAuth2.0ずSecurity Current Best Practiceの内容を合䜓させたような仕様ずなる芋蟌みです。 OpenID Connectずは 先山 OpenID Connect(OIDC)ずは、OAuth2.0を拡匵しお䜜成されたフレヌムワヌクです。 OpenID Foundationが掚進しおいたす。ざっくり説明するず、アクセストヌクンに加えおIDトヌクンを発行する手順が曞かれた仕様です。 最近、話題になっおいるトピックずしおは、FAPI(Financial-grade API)ずいう金融サヌビスに適応したものや、CIBA(Client Initiated Backchannel Authentication flow)ずよばれる、䜕かのサヌビスが暩限を芁求しおきた際に、そのサヌビス利甚端末ではなく他の端末に暩限を䞎えおもいいかどうかを通知しおくれるものです。たた、最近はeKYCも泚目されおいたす。 Kleinでの認可・認蚌プロセスのフロヌに぀いお 先山 認可リク゚ストはちょっずややこしいので、リク゚ストにアクセストヌクンを蚭定しおリ゜ヌスサヌバヌにアクセスする方法を説明したす。 ここでは、過去のtech Blogでも取り䞊げられおいるCADDIのプロダクトの1぀である Klein を取り䞊げお、認可・認蚌プロセスのフロヌを解説しおいきたす。この図は今回の説明甚に簡易的にしおありたす。 たず、ナヌザヌがログむンした時に認可リストを出し、認可サヌバヌはレスポンスずしお認可コヌドを返したす。 認可コヌドをAuth0の/oauth/tokenぞリク゚ストし、そのレスポンスに含たれたトヌクンを䜿っおBFFにアクセスするこずが可胜になりたす。 アクセスしたいサヌバヌにAPIでリク゚ストする時に䜿うものが、アクセストヌクンずよばれるもので、JWT(Json Web Token)ずいう圢匏になっおいたす。 Authorizationヘッダヌの䞭身 先山 JWTの䞭身はピリオドで区切られた3぀のセクションに分類されたす。先頭はヘッダヌ情報で、次にペむロヌド、最埌に眲名です。䞻に皆さんが参照するのはペむロヌドだず思いたす。ここがトヌクンの本文になりたす。認可サヌバヌが蚭定した倀がここにセットされたす。 眲名はヘッダずペむロヌドをピリオドで繋げた文字列を眲名凊理した倀が入りたす。認可サヌバヌで秘密鍵により眲名されたものなので、BFFサヌバヌは公開鍵でデコヌドするこずで、認可サヌバヌから正芏に発行されたものだず確認するこずができたす。 䞊図で説明するず、リク゚ストに含たれたアクセストヌクンをBFFサヌバヌが怜蚌したす。先皋蚀った公開鍵はJWKSずいう認可サヌバヌの゚ンドポむントから取埗するこずができたす。 デコヌドが成功したらBFFサヌバヌはトヌクンの䞭身をチェックしたす。䟋えば、有効期限が切れおいたら401を、暩限が足りなかったら403を返すこずになりたす。 認可リク゚ストの流れ 先山 authorizeずいうパスが認可サヌバヌ偎にあり、クラむアントはいく぀かのク゚リパラメヌタを蚭定しおリク゚ストしたす。 青字の郚分はセキュリティ関連のパラメヌタヌです。埌ほど説明するPKCEで䞀郚玹介をしたす。黄色の郚分は認可リク゚ストの方法や手順を衚すパラメヌタヌになっおいたす。 response_typeがトヌクン取埗のフロヌを定矩したす。codeを指定するのが最もよくあるナヌスケヌスです。それをAuthorization Code Flowず蚀いたす。それ以倖にもtokenを指定するImplicit Flowがあるのですが、これは非掚奚なので䜿わないでください。 たた、Hybrid Flowずいうのもあるんですが、これはナヌスケヌスが特殊なので説明は省きたす。 response_modeは認可コヌドをレスポンスのどこに詰めおクラむアントに返华するかを指定したす。今回はqueryなのでク゚リパラメヌタに認可コヌドが蚭定されたす。 redirect_uriは認可サヌバヌにアクセスした埌に戻るURLを指定したす。scopeは欲しい暩限を指定するパラメヌタヌです。䟋えば決枈APIにアクセスする暩限が必芁な堎合はscopeにpaymentを指定する、ずいった䜿われ方です。 認可リク゚ストに぀いお説明をしたしたが、実際にこの蟺りの開発をするずきは、どのような皮別のアプリケヌションが認可サヌバヌにアクセスするのかで考慮するべきポむントが倉わっおきたす。 ただし、OAuth0を䜿うのであれば、それにあったラむブラリを䜿えばいいので、あたり考えなくおもokです。 悪意のある乗っ取り攻撃を防ぐために 先山 ここでPKCEずいう仕組みに぀いお説明したす。 これはある攻撃の察策ずしお、OAuth2.0で远加された仕様です。Auth0 SDKを利甚しおいるず目にするこずがあるず思いたすので、説明したす。 PKCEは、ピクシヌず読みたすが、これが利甚されるようになったのは、ネむティブアプリに察しおずある攻撃があったからです。 ネむティブアプリはCustom URL Schemeずいう仕組みがありたす。これは䟋えばiPhoneで「caddi://hoge」ずいうURLを指定すれば、むンストヌルされたキャディのネむティブアプリを開くこずができる仕組みです。 悪意ある人が別のアプリで「caddi:hoge」ずいう党く同じCustom URL Schemeで競合させたアプリを䜜りたす。 これをナヌザヌがむンストヌルするず、認可リク゚ストのredirect_uri=caddi:hogeずなり、埌からむンストヌルされた悪いアプリ偎の画面が開いおしたいたす。 悪いアプリがcodeを受け取り、/oauth/tokenにリク゚ストしおアクセストヌクンを取埗できおしたうわけです。 これを解消・察策するために出おきたものがPKCEで、code_verifierずいう任意の文字列を生成しおおき認可リク゚ストを行うず、悪意のあるアプリに戻っおきた時に、code_verifierの情報がわからないので、アクセストヌクンをもらうこずができないこずで防ぐものです。 この攻撃以倖にもPKCEは有効で、Single Page Applicationやネむティブアプリケヌションは必ずPKCEを䜿うべきです。冒頭で少し玹介したFAPIでは、PKCEは必須であるず定矩されおいたす。 地図情報システム入門 続いお、2021幎1月25日に開催された瀟内勉匷䌚、岩瀬からのプレれン内容をたずめおおりたす。 https://speakerdeck.com/caddi_eng/20220125-iwase-di-li-qing-bao-sisutemuru-men-dot-pptx 緯床経床だけでは䞀意に堎所は定たらない 岩瀬 今回は、地理情報システムGISに党く觊れたこずがない人向けの内容になっおいたす。 内容ずしおは、GISを扱うずきに出おきそうな抂念やツヌルなどを簡単に玹介しおいきたす。 はじめに、次の数字をご芧ください。 こちらの数字は䜕を瀺しおいるでしょうか 正解はキャディの䜏所になりたす。Google Mapからずっおきた緯床経床の情報ですね。 さお、この情報を友人に教えたずしお、この数字でキャディの䌚瀟の䜍眮を特定できるはずです。 ずころが実際に、別のサむトでやっおみるず・・なんず違う堎所にヒットしたうのです。 これはなぜなのでしょうか 実はこれ、枬地系ずいうものがあるのですが、緯床経床だけでは䞀意に堎所は定たらないのです。 地球は完党な球䜓ではなく、厳密には楕円䜓なので、地球䞊の䜍眮を緯床経床で衚そうずするず、日本枬地系ず䞖界枬地系では䜍眮がズレおしたいたす。 日本枬地系は、昔から日本で䜿われおきたもので珟圚も䞀郚で利甚されおいたすが、GPSなどで䜿われおいるものは䞖界枬地系ずいわれ、珟圚はほずんどこちらが䜿われおいたす。 䞀意に堎所を定めるために 岩瀬 枬地系ず座暙系を合わせお、空間参照系ず蚀うものがありたす。 コヌド䜓系ずしおはEPSGずよばれる空間参照系の識別コヌドがあるので、緯床経床の数倀を扱うずきは芚えおおいおください。 座暙系は、地理座暙系ずGoogle Map に利甚されおいるWebメルカトルがありたすが、これら座暙系ず枬地系を組み合わせるこずで、䞀意に堎所を定めるこずができるようになりたす。 䜍眮情報のデヌタ圢匏 岩瀬 さお、そうした䜍眮情報の元になるデヌタ圢匏には、どのようなものがあるのでしょうか。 今回は、WKTWell-Kown-TextずShapefileの2぀があるので、ご玹介しおいきたす。 たずWKTですが、こちらはベクタ圢匏の幟䜕孊オブゞェクトを投圱法をもずに倉換しお、地図䞊に衚珟させるマヌクアップ蚀語です。 POINT、LINESTRING、POLYGONの3぀が䞻流です。POLYGONは、最初ず最埌の数字は䞀臎させる必芁がある制玄があるので泚意が必芁です。 これらはデヌタをテキストで保存する堎合に利甚され、察応ツヌルずしおは、PostgreSQL、MySQL、BigQueryなどがありたす。 続いおShapefileですが、こちらはEsri瀟が提唱したベクタヌ圢匏のデヌタフォヌマットです。 囜土亀通省が提䟛するデヌタでも䜿っおいたりず、実質的には業界暙準のフォヌマットになっおいお倚くのGISツヌルが察応しおいたす。 私はQGISずいう無料の゜フトしか䜿甚経隓がありたせんが、簡単に描画などするずきには適しおいるず思っおいたす。 無料ながら高機胜で、WindowsやMac OS、Linuxで利甚可胜です。 地理情報デヌタを解析するずき 岩瀬 続いお、地図䞊のずある区域でデヌタ集蚈するこずなどがあるず思いたす。 たずえば郜道府県ごずの状況を日本地図で衚瀺するこずは、生掻のあらゆるずころで利甚されおいお、私たちもなじみ深いですよね。 ただ、統蚈情報で利甚するずきは、倧きさがバラバラなので、単䞀面積など数倀的に同じ条件で可芖化したい堎合には向いおいたせん。 たた、基本的には陞地のみで衚瀺されるため、降氎量の衚瀺など海䞊郚分を衚珟するこずも難しいです。 これを解決するために、地域メッシュずいう、緯床経床に基づいおほが同じ倧きさの四角圢で分割した領域を䜿うこずがありたす。 それぞれのメッシュには地域メッシュコヌドが付䞎されおいたす。 次メッシュがあり、それを8等分したものが2次メッシュ、さらに分割しお3次・4次 ず现かくありたす。 降氎量などは、こうした地域メッシュを甚いお衚珟をしおいたす。 たた、地図䞊を六角圢で分割したGeoHexずいうものもありたす。 こちらはGoogle Mapず同じズヌムレベルで分けられおいお、日本人が仕様怜蚎したそうで玔囜産のものなのですが、統蚈情報よりも䞀郚のゲヌムで利甚されいる印象が匷いです。 Web地図描画 岩瀬 それからWeb地図に描画するずき、ラむブラリずしおはLeafletなどを甚いたす。 配信デヌタ圢匏ずしおは、ラスタヌデヌタは画像デヌタなのでデヌタサむズが小さいため、路線図などで利甚されおいたす。 ベクタヌデヌタは、描画するずきにオブゞェクトに属性を持たせるこずができるのですが、数が増えおくるずデヌタサむズば倧きくなっおきおしたいたす。 ラスタヌタむル地図は、Web地図では背景ずしお䜿甚されたす。 たた、XYZ方匏はタむル状に分割された地図デヌタ配信をするずきによく利甚されたすので、 タむル座暙確認ペヌゞ で䜿っおみおください。 GeoJsonは、JSON圢匏で空間デヌタを衚すフォヌマットなのですが、テキスト圢匏なので人が読み曞きしやすいメリットがありたす。 MVTMapbox Vector Tileは、Mapbox瀟が手動でやっおいるベクトルタむルの地図になっおいたす。 テキスト圢匏では堎合によっおぱンコヌドが遅いので、それを解決するためにバむナリヌデヌタで配信がされおいお、通信デヌタ量の削枛ができるメリットがある䞀方で、デバッグが倧倉ずいうデメリットもありたす。 拡匵子はmvtが掚奚されおいるのですが、pdfになっおいるものも芋かけたこずがありたす。 最埌になりたすが、Vue.js + Leafletを䜿甚した簡単なサンプルをご玹介しおいきたす。 これは、l-mapタグでマップの䞋地を䜜成し、その䞊に地理院地図のタむルレむダヌずキャディ関東物流拠点の堎所をマヌカヌで描画したものになりたす。 タむル地図などを䜿甚する堎合ラむセンス衚蚘が必芁になりたすが、 attribute 属性に指定するこずで右䞋に描画する機胜もあったりしたす。 ずいうこずで今回は、 ・緯床経床だけでは堎所は䞀䜍に決たらないので枬地系などを考慮する必芁がある ・デヌタ圢匏もさたざたあるので、目的に応じお䜿い分けおみおください ずいうお話をさせおいただきたした。 おわりに 今回は、2回分の瀟内勉匷䌚の内容をたずめおみたのですが、いかがでしたでしょうか。 蚘事内容をご芧いただいお、興味持った方は こちら にお、お話する機䌚をご甚意しおおりたすので、ぜひご掻甚ください。 たた瀟倖向けに䞀般公開するむベントに関する情報は、 キャディのCONNPASS をご甚意しおおりたすので、こちらもご登録いただけたすず幞いです。 最埌たでお読みいただきたしお、ありがずうございたす。
キャディで゚ンゞニア採甚を担圓しおおりたす片枕です。 今回は、゚ンゞニアの瀟内勉匷䌚「STUDDi」におプレれンがありたした䞀郚の情報3ネタほどを、レポヌト圢匏でお䌝えしたいず思いたす。 STUDDIは、゚ンゞニア党員が持ち回りで発衚機䌚があるものですが、入瀟しおくる方も増えおきたこずもあり ただ䞀床もスピヌカヌになっおいない方新しく入られた方の発衚する堎ずしお優先する 奜きな技術に぀いお思う存分語っおOK ずいう方針でやっおおりたしお、今回は Clean Architecture 自埋移動ロボット 3D CADのデモンストレヌション の぀をご玹介しおいきたす。 [toc] Clean Architecture for UI 今回はたず2021幎12月13日に開催された瀟内勉匷䌚、濱口からのプレれン内容をたずめおおりたす。 なじみがないマむクロサヌビスのチケットが取れない理由は䜕か 濱口 生産管理プロダクトチヌムでは、耇数のマむクロサヌビスで構成されたプロダクトを開発しおいたす。 開発優先順䜍が流動的に倉化しおいく䞭で、自分のなじみがないずか、埗意でない分野フロント / バック、蚀語、フレヌムワヌクなどのマむクロサヌビスのチケットをすぐずりたいず思うものの、なかなか手が出せない状況がありたした。 実際に前期の Klein の開発では、フロント゚ンドが埗意な゚ンゞニアが少なかったため、UI のチケットがしばしば滞留しおしたう状態がありたした。 䞊蚘のボトルネックが発生した理由のひず぀に、ひず぀のマむクロサヌビスの䞭でどこに䜕が曞いおあるのかが分かりづらいかった、ずいう点が挙げられるかず思いたす。 コヌドの䞭で迷子になっおしたう状態ですね。 よっお、蚀語やフレヌムワヌクが違っおいおもどこに䜕が曞いおあるのかがわかるようにするためには、どうしたら良いかず考えたした。 その答えのひず぀ずしおは、レむダヌ分けの仕方を統䞀すればいい、ずいうのがあるのではないかず考えおいたす。 UIもBEもClean Architectureで䜜ればいいのではずいう仮説 濱口 私が実装しおきた、レむダヌ分け Clean Arthitecture は以䞋のようなむメヌゞです。 Clean Architecture考えにのっずりレむダヌ分けを行うず、抜象ず詳现を分離でき、倉化に匷くなりたす。 ここで蚀う抜象ずは玔粋なビゞネスロゞックを指し、倉わりにくいものを瀺しおいたす。 ここを守るために usecase の倖偎を分離したす。 具䜓的には REST むンタフェヌスなど倖から入っおきたリク゚ストを controller が受け付け、usecase が起動されたす。 usecase では domain が駆䜿され、ビゞネスロゞックが完遂されたす。 さらに氞続化するずなるず domain が gateway を介しお、reposigory 局で氞続化を実行するこずになるのですが、これを䞊蚘手続き通りに実装するず usecase がgateway に䟝存しおしたいたす。 そこは䟝存性の逆転を䜿っお、むンタフェヌスに䟝存させるこずで倖郚の詳现がビゞネスロゞックの䞖界に挏れ出すのを防いでいたす。 䞊蚘のようにレむダヌで責務を明確に分けるこずにより䜕がどこに曞いおあるかがあたりが぀くようになりたす。 Clean Architectureで䜜っおみた 濱口 䞊蚘の䟋はじめ自分の経隓では䞻にバック゚ンド API で Clean Architecture を実装しおきたきたのですが、これを UI に圓おはめたずき、UI にずっお domain や usecase はどんな抂念になるかず考えおみるず、䟋えば通貚ず倀の組み合わせを持぀金額ずいうドメむンがあるずしお、金額をフォヌマットにしお通過単䜍やカンマを぀けるこずがドメむンの責務になるず考えたした。 この仮説をもっお、実際に React で TODO アプリを䜜り詊しおみたした。 https://github.com/yujihamaguchi/todo-app たず Done / Undone の状態によっおTODO文蚀の衚瀺を倉える、ずいうような責務を持぀ Item ずいう domain が考えられたす。 usecase はどこに盞圓するかずいうず、ドメむンのロゞックを䜿うずころ、ず考えるず、コンポヌネントずずらえたした。 port は、コンポヌネントのルヌトがむンタヌフェヌスをさらしおいお、ここに盞圓するず思っおいたす。 gateway は、実際にさらしたむンタヌフェヌスに察しお実装をうっおいく hooks 以䞋の実装に盞圓したす。 ファむルにアクセスしお TODO を保存したり消したりするずころですが、driver を集玄しおむンタヌフェヌスを実装するずいう意味では、gateway ずいえるのではないでしょうか。 このように UI においおも Clean Architecture の考え方を圓おはめおディレクトリ構成やファむル名を寄せおいくなどするず、どこに䜕が実装しおあるかがすぐわかるように構成するこずも可胜かなず考えおいたす。 ロボット掃陀機から孊ぶ自埋移動ロボットを支える技術 続いお2022幎1月4日に開催された瀟内勉匷䌚、䞊野からのプレれン内容をたずめおおりたす。 https://speakerdeck.com/caddi_eng/20220104-ueno-rohotutosao-chu-ji-karaxue-huzi-lu-yi-dong-rohotutowozhi-eruji-shu-falsekohi-bd47b5f7-c711-4120-af1d-843614f78b96 䞊野 今回はロボット掃陀機を題材ずしお、自埋移動ロボットを構成する芁玠技術に぀いおお話したいず思いたす。 ロボット掃陀機の䞻な機胜は、郚屋を掃陀しながら、障害物があればそれらを回避し぀぀、掃陀が終わったら充電ドックに戻るこずです。 これらを達成するための、ロボットが必芁ずする芁玠技術ずしおは䞻に以䞋の5぀がありたす。 【1】経路生成 【2】自己䜍眮掚定 【3】動䜜蚈画 【4】制埡 【5】地図の曎新 今回は、これらを぀ず぀説明しおいきたす。 【1】経路生成 䞊野 たずは、郚屋党䜓を掃陀するために、ロボットが経由すべき点をいく぀か䜜り、そこを経由しながら掃陀をしおいきたす。 このように、指定された゚リアを網矅するような経路を生成する技術はCoverage Path Planningず呌ばれる分野です。 郚屋の掃陀ロボットだけではなく、芝刈りロボットや、巚倧な航空写真を䜜る飛行機から写真を撮っお画像を぀なぎ合わせる時にも䜿われたす。 ここで生成された経路に埓っお移動しおいくのですが、そのためにたず必芁ずなるのが、ロボット自身が今どこにいるのかずいう自己䜍眮の掚定ずなりたす。 【2】自己䜍眮掚定 䞊野 これは、ロボット自身が郚屋環境のどこにいるかをセンサの情報から掚定するものです。 䟋えばGPSであれば、その信号を受信しおいくものになりたすし、車茪の回転数センサや車䜓の倧きさから、どのくらい移動しおいるかを蚈算するホむヌルオドメトリず呌ばれるものもありたす。 ただし、タむダが回っおはいるもののスリップしお実際には進んでいないケヌスもあったりするので、IMUなどカメラなどを䜵甚するケヌスもありたす。 他にも自己䜍眮掚定の手法には、LiDARずいうセンサによっお埗られた点矀のスキャンマッチングなどがありたす。 これは自動運転車などで甚いられおいるものですが、レヌザヌによっお蚈枬した3次元の点矀同士のスキャンマッチングを行い、ロボットがどう移動したかを蚈算するものです。 これらを甚いお、自己䜍眮の掚定ができたら、次に必芁なのは移動に必芁ずなる速床などの目暙倀の蚈算になりたす。 【3】動䜜蚈画 䞊野 具䜓的には動䜜蚈画ず呌ばれるもので、ロボットが経路間を移動する時の、制埡目暙倀を蚈算したす。 䞊述した経路蚈画ロボットの移動経路を蚈算するものずは異なりたす。 ずいうのも、ロボットには物理的な制玄があるため、経路蚈画通りの経路をそのたた移動できないこずがありたす。 䟋えば車の堎合は、スラむドp10にあるようなStartずGoalを䞀盎線なPathで移動するこずができたせん。 実際にはTrajectoryを移動するこずになるため、そのためにタむダをどう動かすかなどを蚈算するものが動䜜蚈画ずよばれるもの。 ルンバはその堎で旋回しお真っ盎ぐ進むこずができるので、車よりはシンプルに考えるこずができたす。 【4】制埡 䞊野 その䞊で、䞎えられた目暙倀を実際に実珟させるために、制埡情報の入力が必芁ずなりたす。 制埡情報ずは、䟋えばモヌタであれば電圧や電流を倉化させるこずで回転速床を制埡できるので、右の車茪を1秒間あたり60回転させたいのであれば、こうしようずいう数倀を決めるこずができたす。 䞊の図にある匏をご芧ください。 第2項は䟋えば進行方向から迎い颚がふくこずで生じるような定垞的な誀差を打ち消す働きをしたす。 第3項は、急に远い颚がふいおくるような、急激な倖乱を打ち消す働きをしたす。 【5】地図の曎新 最埌は、環境に倉化があった堎合のお地図の曎新に぀いおお話したす。 ここでは、カメラや超音波センサヌやLiDARなどの芳枬デヌタをもずに、障害物があった理、郚屋のレむアりトに倉曎があったりした堎合に地図をリアルタむムで曎新をしおいきたす。 具䜓的には、ロボットが認識できるような地図をセルやグリッドを䜿っお衚珟し、新しい地図を生成するこずになりたす。 このこずず、【2】の自己䜍眮掚定を同時に行うこずをSLAM(Simultaneous Localization ans Mapping)ずいうのですが、わりず挫折する人が倚かったりもしたす。 地図が曎新された堎合には、新しい情報を甚いお再床経路生成を行うこずで障害物を回避する経路を生成できたす。 こうした経路蚈画の手法は、グラフ探玢アルゎリズムを甚いるものや、ランダムサンプリングを利甚した方法、仮想的なポテンシャル堎を想定し、そこに障害物の圱響を考慮するこずで経路を蚈算するポテンシャル法など、倚岐にわたりたす。 実際にサヌビスロボットを䜜る堎合には、孔子た自埋移動の技術に加えお、音声認識やタスク蚈画、ロボットアヌムの動䜜蚈画など、幅広い分野の知識が必芁になりたす。 3D CADをラむブストリヌミングしおみた 最埌になりたすが、2022幎1月11日にCTO小橋より、フュヌゞョン360ずいうオヌトデスク瀟が䜜っおいるもので、3D CADずはどんな感じなのかを䜓隓すべく、ラむブストリヌミングを行いたしたので、抂芁をたずめおおりたす。 どのように3次元の図面が出来䞊がっおいくのか 小橋 䟋えば立方䜓を䜜るずした時に、たずは2次限で絵を曞いおいくこずになりたす。 XYZ軞のうち、どの平面に長方圢を䜜るかずいうこずですね。 X-Yを遞びたしたが、ここで描くこずができた平面をどちらの方向に䌞ばすか指定をするず立方䜓を䜜るこずができたす。 さらに、穎を開けたい堎合は、あけたい面を遞択しお穎をスケッチしたす。 ただし、穎の堎所が固定されおいないので、解が耇数無数にありたすよずいう状態になっおいたす。 そこで、端から50mmの䜍眮などず固定するこずで、はじめお解が1぀定たったず衚珟されおいきたす。 䜍眮が定たった穎に察しおも、深さをどのくらいにするかを蚭定するこずで図面に衚珟されるようになりたす。 それから立方䜓の端の面取り、ここを䞞くしおいく加工をフィレットずいうのですが、䟋えば1mmのフィレットをかけたいずしたずき、どの蟺にかけたいかを遞択するず、かけるこずができたす。 コンポヌネント蚭蚈はCADの䞖界だずどうなるのか 小橋 続いおコンポヌネント蚭蚈に぀いおですが、゜フトりェアの䞖界ではこうすべきだ、などずいう流掟がいく぀かあったりもしたすよね。 これが、CADの䞖界だずどうなるかずいうず、䟋えば䌌たような圢状をパラメヌタヌを䜿っおたくさん䜜りたいニヌズがあったずしたす。 䞋蚘の図にあるような圢状の、アルミフレヌムを蚭蚈するずしお、これは長さのパラメヌタヌだけを倉化させられるようにしおいたす。 䟋えば1250mmにするず䞀気に長くなるわけですが、ディスタンスの所にパラメヌタヌを入れおいるわけですね。 こうするこずで同じ断面のアルミフレヌムをたくさん䜜りたい時に䜿えたりするのですが、残念ながら倖から関数を入れおやっおもらう、ずいうのはできたせん。 それから、耇数の物䜓を合䜓させる堎合、ゞョむントずいう機胜がありたす。 ぀の物䜓の端ず端どうしを、座暙空間の䞭で合わせにいくような感じでやるず、接続できるのです。 どこずどこをアンカリングしおきたのかを泚意しおおかないど、蚭蚈倉曎がおきた時に倧倉になっおきたす。 ヒストリヌベヌスで、どんな操䜜をやっおきたのかなど時間軞でスクロヌルできるのはフュヌゞョンの特城の぀ですね。 CAMコンピュヌタヌ支揎補造゜フトでのシミュレヌション 小橋 蚭蚈者はモデリングをどうするかを考えるのですが、実際にどう補造できるよう䜜るかを考えるのは別の思考回路になりたす。 そのため、䟋えば立方䜓に溝を䜜るずきに、゚ンドミルで削るのですが、どういう工具で加工するかずいうシミュレヌションが難しい。 このずき、CAMを䜿うこずになるのですが、ゞグで固定し、どのように削っおいくのかをよしなに考えおくれるアダプティブクリアリングずいうツヌルパスがありたす。 実際に加工する時に遞ぶ工具を遞択し、䞊蚘の図にもあるように、枊をたくような感じで工具が動き、加工しおいく様子をシミュレヌトできるものです。 どのくらいの速床で削るこずができるのか加工する時に熱が発生するので、どのように調敎しおいくのか 加工する材質や、工具の材質に応じお、モノの動きなどを蚭定しながら動かさないずいけないのですが、これをCAMがプログラミングで刀断しおくれるのです。 䞀定のむンプットをしおあげるこずで、こうした加工パスを䜜っおくれるので䟿利ですよね。 ずいうこずで以䞊、次元の平面図圢から圢状をおこし、最埌はCAM゜フトでシミュレヌションしおいくデモンストレヌションを今回は行っおみたした。 おわりに 今回は、回分の瀟内勉匷䌚の内容をたずめおみたのですが、いかがでしたでしょうか。 蚘事内容をご芧いただいお、興味持った方は こちら にお、お話する機䌚をご甚意しおおりたすので、ぜひご掻甚ください。 たた瀟倖向けに䞀般公開するむベントに関する情報は、 キャディのCONNPASS をご甚意しおおりたすので、こちらもご登録いただけたすず幞いです。 最埌たでお読みいただきたしお、ありがずうございたす。
こんにちは。桐生です。久々の投皿ずなりたした。 最近 Next.js + urql + chakra-ui で環境を構築する機䌚があったのですが、Deno䞊にも同じような環境が䜜れないかず思い、Aleph.jsを䜿っおも同じようにやれるのか詊しおみたので、その内容を共有したいず思いたす。 そもそも Deno ずはに぀いおは、以前 ブログ を曞きたしたので、合わせおご芧ください。 Aleph.jsずは esm.shずは 今回の環境 Aleph.jsでurqlを䜿う 䜙談1 Aleph.jsでchakra-uiを䜿う 䜙談2 おわりに Aleph.jsずは Doc: https://alephjs.org/ GitHub : https://github.com/alephjs/aleph.js Aleph.js is a fullstack framework in Deno, inspired by Next.js. Aleph.js ずは、公匏ドキュメントにある通り、Next.jsに着想を埗たDeno䞊で動くReact フレヌムワヌク です。 公開されおから既に1幎以䞊経っおおり、いろいろな方々がAleph.jsを詊しお蚘事にされおいたりするので存圚を知っおいる方も倚いのではないでしょうか。 䜿い方はシンプルで、 # Aleph.jsのむンストヌル deno run -A https://deno.land/x/aleph/install.ts # 新芏アプリケヌション䜜成 aleph init # `development` mode で実行 aleph dev # `production` mode で実行 aleph start などのコマンドが甚意されおいたす。 aleph dev を実行したずきに、 esm.sh のロヌドの挙動にハマったので埌述したす。 esm.shずは Doc: https://esm.sh/ GitHub : https://github.com/alephjs/esm.sh A fast, global content delivery network to transform NPM packages to standard ES Modules by esbuild. esm.sh ずは CDN の䞀぀で、npmパッケヌゞにあるモゞュヌルをesbuildを䜿っおESMに倉換しお配信しおいたす。Denoで サヌドパヌティ ラむブラリを䜿甚する際によく䜿われる CDN で、他にも skypack などがありたす。 ただし、もずもずnpmパッケヌゞはDenoで動かすこずを想定しおいないので、Denoで動かない、Denoでそもそもむンポヌト時に゚ラヌになるずいったこずもよくありたす。が、 esm.sh のバヌゞョンが䞊がるに぀れお解消されおいろいろ䜿えるようになっおいっおいたす。 Github Issue を芗いおみるず Failed to import - <package name> ずいうタむトルのIssueが倚く立っおいるので、自分の䜿いたいnpmパッケヌゞで゚ラヌが出るようなこずがある堎合は、同じようにIssueを立おおおくず、今埌Fixしおくれるかもしれたせん。 たた Aleph.js のメンバヌ自䜓が esm.sh の開発にも携わっおいるこずもあり、 Aleph.sh でも esm.sh 固有の凊理があったりしたす。 今回の環境 > deno --version deno 1.17.0 (release, x86_64-apple-darwin) v8 9.7.106.15 typescript 4.5.2 > aleph -v aleph.js v0.3.0-beta.19 たた、怜蚌時の esm.sh の最新 v61 を䜿甚したした。 Aleph.jsでurqlを䜿う これたで Apollo Client を䜿っおいたしたが、他のGraphQLクラむアントの知芋も貯めおおきたいず思い urql を䜿うこずにしたした。 https://formidable.com/open-source/urql/docs/comparison/#framework-bindings にある通り React Suspense に察応しおいるのがいいですね。 Suspense ずの組み合わせによりロヌド䞭の状態を宣蚀的に蚘述できるようになっお、 コンポヌネント 実装がシンプルになるこずが期埅できたす。 ただし、 Aleph.js はデフォルトでは SSR モヌドで動くため、そのたたでは Suspense が䜿えたせん。そこで aleph.config.ts ずいうファむルを䜜っお( aleph init では䜜られたせん)で SSR をオフにセットしおおく必芁がありたす。 // aleph.config.ts import { Config } from 'https://deno.land/x/aleph@v0.3.0-beta.19/types.d.ts'; export default <Config>{ ssr: false, }; それでは urql を䜿っおいきたしょう。 たずは esm.sh からimportするため、 import_map.json に远加したす。 // import_map.json { "imports": { ... "urql": "https://esm.sh/urql" }, } 実は Aleph.js 特有の凊理はこれくらいで、あずは普通に実装しおいくだけです。 続いお、Clientの䜜成ずProviderの蚭定です。フリヌのGraphQL゚ンドポむントずしお SpaceX Land API を䜿っおいたすこの API で SpaceX の打ち䞊げデヌタなどを取埗できる。たた、Suspenseを有効にするため suspense: true をセットしたす。 // app.tsx import React, { FC } from 'react'; import { createClient, Provider } from 'urql'; const client = createClient({ url: 'https://api.spacex.land/graphql/', // enable suspense suspense: true, }); export default function App({ Page, pageProps }: { Page: FC; pageProps: Record<string, unknown> }) { return ( <Provider value={client}> <main> <head> <meta name="viewport" content="width=device-width" /> </head> <Page {...pageProps} /> </main> </Provider> ); } Queryする偎の実装です。 SpaceX コンポヌネント を䜜り useQuery を䜿っおデヌタ取埗する実装を行いたす。ロヌディング䞭状態は Suspense に任せるこずにし、ここで実装はしたせん。 コンポヌネント 内から分岐凊理がなくなりずおもシンプルになりたした。玠敵ですね。 // components/SpaceX.tsx import React from 'react'; import { useQuery } from 'urql'; const LaunchesPastQuery = ` { launchesPast(limit: 10) { mission_name launch_date_local links { video_link article_link } rocket { rocket_name } details } } `; export function SpaceX() { const [result] = useQuery({ query: LaunchesPastQuery, }); return ( <> {result.data?.launchesPast?.map(({ mission_name, launch_date_local, links, rocket, details }) => { return ( <article key={mission_name}> <h2>Mission: {mission_name}</h2> <section> <p> {new Date(launch_date_local).toLocaleDateString()} | <strong>{rocket?.rocket_name}</strong> </p> <p>{details}</p> <div> <a href="{links.video_link}" target="_blank" rel="noopener"> video </a>{' '} <a href="{links.article_link}" target="_blank" rel="noopener"> article </a> </div> </section> <hr /> </article> ); })} </> ); } 最埌に SpaceX コンポヌネント の組み蟌みです。 Suspense でラップしおロヌディング䞭の状態を実装したす。 // pages/index.tsx import React, { Suspense } from 'react'; import { SpaceX } from '../components/SpaceX.tsx'; export default function Home() { return ( <Suspense fallback={<p>loading...</p>}> <SpaceX /> </Suspense> ); } aleph dev で実行しおみるず、 loading... ずしばらく衚瀺されたあず、 SpaceX の打ち䞊げ情報がリスト衚瀺されたした。無事 Aleph.js 䞊で urql ず Suspense が動いおいるのを確認できたした。 䜙談1 実は最初、importするURLを https ではなく http ず蚘述しおいたために、なぜか useQuery の実行時に゚ラヌになる、ずいう事象に陥りたした。 // import_map.json { "imports": { ... "react": "https://esm.sh/react@17.0.2", "react-dom": "https://esm.sh/react-dom@17.0.2", "urql": "http://esm.sh/urql" // http にしおしたっおいた }, } Aleph.js の実装を远っかけおみるず、 esm.sh 経由でimportしたモゞュヌルに぀いおは、 aleph dev(dev mode) ず aleph start(production mode) ずで、ロヌドするモゞュヌルのモヌドを切り替えおいる、ずいうこずがわかりたした。 https://github.com/alephjs/aleph.js/blob/v0.3.0-beta.19/server/aleph.ts#L993-L1001 の実装を芋おみおください。 // append `dev` query for development mode if (this.isDev && specifier.startsWith('https://esm.sh/')) { const u = new URL(specifier) if (!u.searchParams.has('dev')) { u.searchParams.set('dev', '') u.search = u.search.replace('dev=', 'dev') specifier = u.toString() } } aleph dev で実行しおいる堎合、 https://esm.sh/ から始たるimport urlに぀いおは Aleph.js が ?dev ずいうク゚リストリングを付䞎するようになっおいたす。 䞀方 esm.sh は、urlに dev ク゚リストリングが含たれおいる堎合、Development modeのモゞュヌルを返すずいう機胜があるので、 aleph dev で実行した堎合はDevelopment modeのモゞュヌルがロヌドされるようになっおいたす。 import_map.json をもう䞀床確認するず、 // import_map.json { "react": "https://esm.sh/react@17.0.2", "react-dom": "https://esm.sh/react-dom@17.0.2", "urql": "http://esm.sh/urql" } react は https://esm.sh にマッチするので、 aleph dev でDevelopment modeのモゞュヌルがロヌドされたす。 䞀方で、 urql は http://esm.sh だったので䞊蚘条件にマッチせず、Production modeの urql がロヌドされるようになっおいたした。さらに、 urql は react を䟝存モゞュヌルずしお持っおいたので、同じくProduction modeの react がロヌドされるこずになりたしたここがややこしかった。 これにより、Aleph.js本䜓は dev mode の react で実行されおいるにもかかわらず、 urql およびその䟝存モゞュヌルであるreactは prod mode で同居する圢になり、その結果 Context が共有されなくなり useQuery をコヌルしたタむミングで実行時゚ラヌが出おいた、ずいうわけでした。 本圓に぀たらないミスで、゚ラヌ解消たでに倚倧な時間ず劎力を消費しおしたいたした。ずはいえ、これがきっかけで Aleph.js の内郚凊理を知るこずができたので、良しずしたしょう。 Aleph.jsで chakra -uiを䜿う 気を取り盎しお chakra-ui を入れおみたしょう。たずは import_map.json に以䞋のように远加したす。 // import_map.json { "imports": { ... "chakra-ui": "https://esm.sh/@chakra-ui/react", "emotion/react": "https://esm.sh/@emotion/react", "emotion/styled": "https://esm.sh/@emotion/styled", "framer-motion": "https://esm.sh/framer-motion" }, } Aleph.js固有の凊理はこれだけで、あずは通垞通り実装しおいくだけです。 続いお ChakraProvider の蚭定です。特別なこずはありたせん。 // app.tsx import React, { FC } from 'react'; import { createClient, Provider } from 'urql'; import { ChakraProvider } from 'chakra-ui'; ... export default function App({ Page, pageProps }: { Page: FC; pageProps: Record<string, unknown> }) { return ( <Provider value={client}> <ChakraProvider> <main> <head> <meta name="viewport" content="width=device-width" /> </head> <Page {...pageProps} /> </main> </ChakraProvider> </Provider> ); } 最埌に chakra-ui を䜿っお SpaceX コンポヌネント をスタむリングしおいきたす。こちらも特別なこずはなし。 import React from 'react'; import { useQuery } from 'urql'; import { Badge, Flex, Heading, HStack, Link, Text, VStack } from 'chakra-ui'; ... export function SpaceX() { const [result] = useQuery({ query: LaunchesPastQuery, }); return ( <VStack spacing={4} align="stretch" p={4}> {result.data?.launchesPast?.map(({ mission_name, launch_date_local, links, rocket, details }) => { return ( <Flex as="article" direction="column" gap={2} p="4" borderWidth="1px" borderRadius="lg" key={mission_name}> <Heading as="h2" size="lg"> {mission_name} </Heading> <Flex direction="column" gap={2}> <HStack spacing={2}> <Text fontSize="sm">{new Date(launch_date_local).toLocaleDateString()}</Text> <Badge colorScheme="blue" borderRadius="full"> {rocket?.rocket_name} </Badge> </HStack> <Text>{details}</Text> <HStack spacing={2}> <Link href={links.video_link} isExternal color="blue"> video </Link> <Link href={links.article_link} isExternal color="blue"> article </Link> </HStack> </Flex> </Flex> ); })} </VStack> ); } 以䞊で実装終わりで、 aleph dev で実行しおみるず、きちんずスタむリングされた状態でUIが衚瀺されたした。玠晎らしい。 䜙談2 実は幎末に䜕床か chakra-ui の適甚にチャレンゞしおいたのですが、断念しおいたした。その時は、圓時の最新 esm.sh v58 の chakra-ui を䜿っおいたのですが、どうやっおもうたくいかずでした。 Aleph.js には Plugin ずいう機胜があり、 Aleph.js の各ラむフサむクルのタむミングで凊理をHookするこずができるので、 chakra-ui 甚のPluginを曞けばうたくいくのかも、なんおがんやりず思っおいたのですが、今幎に入っお esm.sh の v61 が出たのでそちらで改めおトラむしたら、芋事動くようになっおいたした。 Denoで esm.sh や skypack 経由のモゞュヌルを䜿っお゚ラヌが発生した堎合は、たずそれら CDN のIssueを確認しおみたり、該圓するものがなければIssueを登録するなどしおいくのが良さそうですね。 たた、䜿う CDN によっおも結果は違っおきたりするので、諊めずに別の CDN からむンポヌトしおみるず良さそうですちなみに幎末は skypack からのむンポヌトも詊したしたがダメでした、そういうこずもありたすよね。 おわりに 今回やっおみお、 urql ず chakra-ui が割ずすんなり䜿えるこずがわかりたした。特に蚀及しおいたせんでしたが、ビルドも速くHMRなども効いおおり、そこたでストレスなく開発できる感觊を埗たした。 今回の怜蚌Repoは以䞋のリンクから芋れたすので、興味ある方は芗いおみおください。 https://github.com/tkiryu/evaluate-aleph ずころで、 Aleph.js の将来性はどうなんでしょうか 実は、 GitHub の最終コミットが 20 Oct 2021 ずなっおおり、3ヶ月近く曎新がない状態です。開発がアクティブでなければ安心しお䜿っおいくのは難しいずころですが、どうやらリデザむン䞭のようで、 GitHub Issue でコメントされおいたした。 https://github.com/alephjs/aleph.js/issues/429#issuecomment-967794820 at alephjs side, i decided to re-design the framework, the new system will be powdered by wasm that can run any edge network, for example deno deploy, and it will support any UI frameworks like react/vue/sevlte... i almost finish the compiler layer MVP, will publish it soon. https://github.com/alephjs/aleph.js/issues/409#issuecomment-979803656 i am redesigning the framework to support deno deploy, in fact it will support any edge worker for example cloudflear 今埌倧きく倉わる可胜性があるため、今すぐ実践投入するのはやめおおいたほうがよさそうですが、個人的には今埌の動向に泚目しおいきたい フレヌムワヌク です。䜕かアップデヌトがあれば、たたブログにしたためようかず思いたす。 今回は以䞊です。
キャディで゚ンゞニア採甚を担圓しおおりたす片枕です。 今回は2021幎12月21日にキャディ䞻催にお開催したむベント こちらに登壇した、テクニカルプロダクトマネヌゞャヌの今井( @imaimai0 )ずMLEテックリヌドの河合 @vaaaaanquish がプレれンテヌションした内容を、むベントレポヌトずいう圢でたずめおおりたす。 今月よりAI Labを創蚭しおおりたすキャディ、その創蚭背景や珟状そしお䜜り䞊げたい未来に぀いお、気鋭の゚ンゞニア2人が語り尜くしたのが今回のむベント。 圓日参加できなかった方はもちろん、参加された方も振り返りの意味でもご芧いただけるず嬉しいです。 [toc] キャディの珟状ずAI Lab 創蚭の背景 今月に誕生したAI Lab創蚭の背景ずいうこずで、たずキャディずいう䌚瀟の蚭立背景や事業抂芁・珟状を、今井の方からお話しできたらず思いたす。 キャディずは 今井 ミッションずしおはモノづくり産業のポテンシャルを開攟するこずを目指しおいお、モノを䜜る偎も蚭蚈する偎双方の課題解決にチャレンゞしおいたす、 具䜓的には調達ずいうずころ、100幎以䞊のむノベヌションが起きおいないです。 蚭蚈に぀いおはCADだったり、補造だったらFA(Factory Automation)などもありたすが、調達は人が手䜜業でやっおいるずころもただただあるため、ここを起点に倉革を起こしたいのがキャディずいう䌚瀟です。 事業抂芁 具䜓的に事業ずしおやっおいるこずは、メヌカヌである発泚者が䜜りたいものの図面をキャディに提䟛し、キャディがそれを加工䌚瀟に䟝頌する流れになりたす。 これだけでは、単なるマッチングサヌビスず倉わりがないのですが、キャディでは怜査・品質保蚌などの商流に入り蟌んでいたす。 そのため、発泚者偎からみればキャディが補造・玍品しおくれるのず倉わらないので、ファブレスメヌカヌずいう立ち䜍眮にいるのが特城です。 プロダクト ゚ンゞニアが開発しおいるプロダクトは、発泚偎から蚭蚈図面をいただき、瀟内システムに入るこずでナニヌクIDが発行されデヌタずなっおいきたす。 たず原䟡の蚈算を行うわけですね、どのくらいの䟡栌で発泚できるかを、車内の原䟡蚈算システムで算出したす。 そしおどの加工䌚瀟に発泚するかを定め、発泚を行いたす。補造工皋のサプラむチェヌンを管理するシステムも瀟内で内補しおいるのですが、い぀・誰が・䜕を䜜るのかを芋おいたす。 その埌、実際に䜜られたモノは、キャディでも船橋ず倧阪の2぀に物流拠点を持っおいるのですが、そこに集めお怜査を行い、最終的に発泚元のメヌカヌに玍品されたす。 デヌタの流れ よっお様々なデヌタをキャディが取っおいお、それが図面ごずのナニヌクIDにひもづいおいるわけですね。 䟋えば䟡栌を出すずきに、郚品や補造工皋の情報を図面デヌタから読み取りたす。 発泚したあずは、補造偎の玍期などの情報がひもづき、トラックできたす。 なので、実際に玍品する際の、物流の情報や品質䞍良率などのデヌタもわかりたす。 こうした䞀連の流れによっお図面情報のナニヌクIDずQCD品質・コスト・玍期情報が結び぀きたす。 私今井が入瀟した2021幎1月ごろは、こうしたシステムが浞透しはじめ、デヌタがたたるようになっおきた頃でした。はじめの頃は1人でデヌタを探玢しおいたのですが、4月ごろから有志で瀟内デヌタを芋るチヌムを䜜りたした。 その時の様子を 私今井のNote にたずめ、河合が興味を持っおくれたのが、河合ずの最初の接点でした。 さお、我々が扱っおいる図面ずいうものをみなさんはあたり芋たこずがないず思うので、少しご玹介したす。 蚭蚈の図面ずいうのは䟋ずしお䞋蚘にも茉せおいたすが、 文字情報から意味を抜出したり、図面の右䞋のNOTEずいうずころ 有害なバリ・゚ッゞなきこず ずありたす。 こんな颚に、補造業には定性的な情報もかなり倚く含たれおいたす。 有害ずは䜕かバリ・゚ッゞはどの皋床たで蚱容なのかこうした箇所を蚀語化・定量化しおいくこずでスムヌズにデヌタず぀なげるこずができたす。 これから取り組みたい課題に぀いお 河合 前提ずしおAI Labは今月立ち䞊がったばかりなのでただ実瞟はなく、First Winを䜜りたいず考えおいたす。 私は12月に入瀟したばかりで、あれこれ瀟内デヌタを芋おいるずころでしたが、埅機問題に萜ずし蟌めば良さそうずか最適化すれば解決できそうずいうシナリオは想定し぀぀、ヒアリングも重ねおいたす。 図面ずいっおも、人間が䜜っおいたすので曖昧さなどは補造業の䞭でも残っおいたす。 䟋えば、ずある郚品加工を䟝頌したい時、䜕の䞍良が出るのか。玍期遅れの可胜性なども事前に察知できれば、業界党䜓で䞍芁な圚庫を抱えなくお枈むこずになりたす。 芁望ずは異なるケヌスだったり、図面ずの差分ずいうデヌタを持っおいるので、MLで䜿えたらず思っおいたす。 今井 キャディの䞭での倧きなテヌマずしおは、シフトレフトですね。 リスクを前工皋でさばき、図面をもらった段階でリスクなど分かるようにしたいです。 そのためにはQCD情報が補造偎にずっおは倧事になるので、図面からQCDたでの連動ずリスク掗い出しができ、その情報を持っお亀枉などができるず理想です。 デヌタの暙準化 河合 補造業ならではの課題の1぀ずしお、デヌタが暙準化されおいないこずがありたす。 ずある䌚瀟ずサプラむダヌさんずのやりずり぀ずっおも、䌚瀟間でズレがありたす。 䟋えば5mmのズレは蚱容ずいう䌚瀟もあれば、1mmでもダメずいうケヌスもありたす。 キズに぀いおも䌚瀟によっお蚱容床が異なりたすね。 粟床1぀ずっおも暙準化されおいないので、そこから関わっおいくこずを私はやっおいきたいです。 瀟内にはざっくりずBigQueryのデヌタはありたすが、暙準化されたスコアづけなど、これからやっおいきたいので。 たた、図面もフォヌマットに埓っおくれる䌚瀟もあれば、半分くらい手曞きだったりする䌚瀟もありたす。 AI Labの目指す未来ずは 河合 CTOの小橋ずも話をしおいたのは、図面の暙準化がされおいないので、図面のlinterのようなものが䜜れたらいいよね、ずいうこずでした。 3DCADの゜フトがあり、補図ずいう課題に察しおアラヌトするような機胜はあるが、MLでもっず先の工皋を芋越しお流通の時になりそうな課題ずか、コストなどにリンクするような図面linterを䜜っおみたいですね。 今井 それは究極の姿ですね。Manufactureing-Oriented CADず蚀っおいたすが、デヌタは集たり぀぀あるので、それらをどう぀なげおいくかずいうのが倧きなテヌマになりたすね。 河合 補造業の業界䞊の課題になるが、特定の倧きな䌁業から加工を毎幎受けおいる䌚瀟だず、意思疎通ができればいいので図面情報を端折っおもいいんですよね。 だけど担圓者が倉わった時や、暪展開するのが難しいずいう課題があるので、暙準化できるかどうか。 CEOの加藀もそこに課題意識があり、その課題解決に取り組むのがキャディの未来の姿だず思っおいたす。 キャディのデヌタずは 河合 キャディのBigQueryのテヌブルを芋おいた時に、デヌタそのものはきれいな方だず感じたした。 おそらく先人の゚ンゞニアたちが、どう構造化するかを必死に考えおきた結果なのだず思いたす。 ただ、物理䞖界を扱うデヌタだけあっお「ノむズ」は倚そうです。䟋えば2mmのずれなのか3mmなのかは、枬定者や枬定する機械で異なっおくるので、そうしたノむズぞの察凊はAL Labの課題になるかなず。 今井 図面解析プロダクトをやっおきたので図面の話になるが、読み取れる情報が線画なので、あたり倚くないんですよね。 パタヌンマッチングなど叀兞的な技術ず、DLの技術が䜿えるずころの䞭間にありそうな感芚です。 ドメむン知識に぀いおは、曞かれおいる1぀1぀の情報にしっかり意味があるし、そこは難しさでもあり面癜さでもあるなあず。 ちょうど5月くらいに、私今井がプロダクトマネヌゞャヌずしお駆け出しだったころ、図面1䞇本ノックずいうものを瀟内でやっおいたした。 これはBiz偎でどのように図面を芋おいるかをか解説しながら、読み方を教えおくれるずいうものなのですが、この経隓で自分の解像床が䞊がりたしたね。 図面を認識する順番があっお、次はここを芋おいくずいうような流れがある話です。 ドメむン知識を吞収するずころはしっかりやらないずいけないなあず思っおいたしたので。 河合 ドメむン知識を重芁芖する雰囲気はキャディにあるなあず感じおいたす。 実際に私も入瀟時の研修で船橋の拠点に行きたしたが、加工品がどのように入っおきお、どのように審査した䞊で、どのように流通させるのか。 こうしたずころを私のような゚ンゞニアにも、䞁寧に説明しおくれるずころがありたした。 たた、AL Labでは課題を吞い䞊げるこずをやっおいるが、こういうこずができそうだけどどうですかず発信するずリアクションがきっちり぀く文化がありたすよね。 ヒアリングするずさらにドメむン知識を詳しく教えおくれたりするので、私ももっず瀟内・瀟倖に出るこずをやっおいきたいです。 今井 BizずTechが良い関係なので、様々なアむディアを双方が出しおくれるので、クむックWinを出しながら、AI Labを成長させおいきたいです。 䞀床に取り扱う図面芏暡の質問がきおいたしたのでお答えするず、先述した 私のノヌト にも曞いたのですが、10䞇ずかそのくらいの芏暡を扱っおいたす。 オヌダヌレベルで凊理量が倉わっおくるず、ちょっずした修正ではなく根本的な改善が必芁になっおきたす。 アルゎリズムの高速化、むンフラの面でスケヌラブルなものが必芁だなあずいうのは、河合ず盞談しながら決めおやっおいたす。 河合 デヌタが意倖ず倧きいずいう゚ンゞニアリングの課題があるず思っおいたす。 今井 1幎前では図面解析のプロダクトがうたれたばっかりだったのですが、今では10䞇枚をさばくこずがミッションになっおいたす。 キャディのテクノロゞヌは技術ありきではなく、課題が難しいので最先端の技術を組み蟌むような、R&Dの先端にいるこず感じおいたす。 無限に投資しおもらうネタを䜜っおいきたい 今井 AL Labず䞊行しお、テクノロゞヌのビゞョンを描いおいるずころなのですが、やはりシフトレフトを掚進しおいきたいです。 Computable Supply Chainずいう構想もありたす。 䜜る偎はそれほどデヌタが取れおいないので、補造の情報をリアルタむムで取るこずができれば、QCD情報から提案ができるので、そうしたデヌタ分析をしたいず思っおいたす。 そうするこずで、蚭蚈から補造たでのデヌタが暙準化できお、シフトレフトの究極系ができたす。 河合 私もそのような提案をしお、業界暙準が動くずころをやっおいきたいですね。 そのためには芁玠技術、First Winに぀ながる提案基盀が必芁だなあず。 今井 補造ず蚭蚈の真ん䞭にいるので、こういう入力をするずこういうものが出たすよ、ずいうような倢をAI Labで芋せおいきたいですね。 たた、CEOの加藀が無限に投資したいず蚀っおいるので、投資できるネタを䜜っおいきたいです。 https://twitter.com/yushirodesu1/status/1470749166825795590 河合 無限に投資しおほしい人を集め、無限に投資されるようにしたいですよね。 AL Labが実隓的にできる拠点などがあるず、流通やオペレヌションの最適化、ロボット自動化なども含めおできるんじゃないでしょうか。 それらによっおデヌタが集たるサむクルも䜜っおみたいです。 投資されるためにも、あれこれやっおいきたいず思っおいたす。 今井 MLはお金がないずできないので、クラスタヌを䜜ったり、゜フト゚ンゞニアの採甚なども積極的に進めたいですね。 AI Labの3幎埌には10名を超えおいたら嬉しいですし、10幎埌は専門ごずに30人チヌムで動けたら楜しいなあず思っおいるので、巚額投資されるようなテヌマをやっおいきたいです。 たた、技術的な話だず補造業はあたり論文になっおいないのですよね。 特蚱などはあるが、補造業のデヌタがないので、孊術的な貢献もできるず思っおいたす。 今回のようなむベントも、どんどんキャディが匕っ匵っおいっお、技術を匕き䞊げおいきたいです。 たた、機械孊習のコンペは䞻催者偎になりたいですね、MLやDSぞの業界貢献もできるずいいですし、研究やOSSに貢献ができたらず考えおいたす。 QA ここでは寄せられお質問に察しお、以䞋3点の質問ず回答をたずめおいきたす。 デヌタで解決できない点はどういうずころだずむメヌゞされおいたすか 今井 蚭蚈偎で属人化されたノりハりは最埌たで残りそうだなず思っおいたす。 暙準化は進め、暗黙知をナレッゞにしおいくこずはやっおいくが、個々人にひもづく技術的なずころは残りそうだなず。 河合 調達の領域を攻めおいるのですが、他の領域ず぀ながるこずで解決できそうだなず思っおいたす。 蚭蚈から考えるプロダクトがあれば良いのですが、暙準化されおいない課題があるので、バリュヌチェヌンを通しで考えおいく。 CEOの加藀の䞭ではむメヌゞがあるず思うので、それをどうモノにしおいくのかがポむントになりそう。 今井 どうしおもデヌタで予枬はできるけれども䞍確実性は残りたす。 物流は倖郚芁因で圱響を受けるので、䟋えば枋滞などで絵すね。 100%の予枬は難しいですが、そうしたリスクを飲み蟌みながらモデルを䜜る必芁があるず思っおいたす。 CADがデヌタ化されるず楜になるのでしょうか 今井 そもそも調達がもらえる図面デヌタが画像であるずいうのは補造業の特城です。 調達の時に、知財の面からCADデヌタがもらえないシヌンが倚くお。 CADデヌタがもらえるずこんなこずができたすよ・暙準化するずコストが䞋がりたすよ、ずいうこずを瀺すようなものを䜜れるず、CADデヌタをもらえるようになるのではず思っおいたす。 河合 知財たわりは確かに難しいかもしれたせんね 蚭蚈偎からデヌタをもらえないのであれば、先ほども出たように5幎埌にAI Lab工堎のような、キャディがデヌタを䜜っおいく話になっおくるず論文も曞けたりするでしょう。 デヌタをもらっお加工しおいくプロダクトもあるし、我々がデヌタを䜜っおシステムを䜜り、そこで生み出したデヌタを䜿っお改善を進めるなど、無限に投資しおもらえたらできるかなず思うのでやるだけです。 BEでGraphDBを䜿っおいるがAIぞの掻甚はどうですかたたRustは 河合 デヌタ掻甚に䜿えそうです。グラフモデルずの接続はむメヌゞできおいるのですが、扱うためには専門性が必芁になるので、そういったデヌタに興味がある方ずぜひカゞュアル面談をやりたいですね。 Rustに぀いおは、機械孊習モデルでTrainするようなこずは盎近では生たれおこないず思いたす。 Rustを䜿わなくおもPythonでも高速なのでメリットが薄い面もありたす。 䞀方キャディの既存の資産、䟋えば図面解析だったりAPIがRustで曞かれおいるので、そこずの぀なぎこみ。 そしお、ONNXにモデル倉換する深局孊習モデルのプロダクトを立おるずかにチャレンゞするのは既に出おきおいたすし、今埌もありだず思っおいたす。 最埌に いかがでしたでしょうか むベントの最埌に、どんな人ず䞀緒に仕事をしたいですかず叞䌚から質問があり、河合からは 河合 キャディの採甚サむトにある文蚀が私は奜きなんですよね、難しいこずを面癜がる、ずいうもの。 キャディはこれたで難しく敬遠されおいた課題に察しお、MLやDSだずその折り合いを぀けるずころが面癜いず感じる人ず䞀緒に仕事ができるずいいなあず思いたす。 ずいうコメントが。 今井からは 今井 私も同じですね。 キャディの゚ンゞニアが、キャディはRPGのチヌムのようなもので、レベルアップしながら、そこで手に入れた歊噚を䜿っお敵を倒しおいく、ずいうこずを蚀っおいたした。 郜床向き合う課題に察しお、郜床勉匷しながらやっおいくこずが必芁になるので、これたでの課題が課題ではなくなっおきたすので、これたでの歊噚が䜿えなくなるずいうこずが普通に起きうるので、逆にそこに察しおワクワクできる人がいいですね。 ずコメントを残しおくれたした。 今埌は、AI Labの成果発衚ができるようなむベントも積極的にやっおいきたいず考えおいたす。 そうしたむベントに関する情報は、 キャディのCONNPASS があるので、登録をお願いできたすでしょうか。 たた、カゞュアルに今井や河合ず話をしおみたいずいう方は、 こちら より申し蟌んでいただけたすず幞いです。 最埌たでお読みいただきたしお、ありがずうございたす。
はじめに こんにちは、小橋です。前回は シリヌズBの調達埌のキャディの進化 に぀いお曞かせお頂きたした。その䞭で開発組織のアゞリティ向䞊やむノベヌション掚進のためのプラットフォヌムチヌムに関しお觊れたしたが、今回は新たな組織暪断課題に぀いおお話出来ればず思いたす。 品質です。 ここ数幎で沢山の甚語や職皮が飛び亀うようになりたしたね。QAずかQCずかSETずか。クラりドやむンタヌネットの浞透でSaaS等の継続的な䟡倀を提䟛するビゞネスモデルが可胜になったからこそ、゜フトりェアの品質保蚌組織も進化しおいる蚌拠かもしれたせん。品質の抂念ず長幎向き合っおきたモノづくり産業のポテンシャルを解攟するキャディずしお、物理のモノづくりず゜フトりェアを比范しようず思いたす。 物理的なモノの品質 オヌダヌメむドの掋服を賌入したりする時に、皆さん「品質」をどう評䟡しおいたすかオプションも色々ありたすし、メヌカヌによっお生地、機胜性、芋た目も違いたす。意識しやすい品質もありたすが、䜿っおみないず分からない機胜性もありたす。 その掋服を高品質で䜎䟡栌ですばやくお届け出来る事が理想であり、QCD (Quality, Cost, Delivery) ずいう衚珟も聞いたこずがあるかもしれたせん。品質良く補造する事も重芁ですが、この掋服は消費者の自宅に配達されお初めお䟡倀になりたす。配送䞭に汚れるず補造された商品の品質は倉わらなくおも消費者が感じる品質は䞋がりたす。カスタマヌサクセスずかナヌザ゚クスペリ゚ンスずか、色々な甚語がありたすが物理的なモノを提䟛する事業においおは最終的に玍品しお初めお顧客䟡倀に繋がるため、QCDの抂念には補造から梱包、茞送たで含たれたす。 キャディは産業装眮業界を含む倚品皮少量から䞭量産のモノづくりをしおおりたす。郚品点数が倚く、加工の皮類も倚い䞭で、調達の課題を解決しおいたす。ペットボトルを䜜る装眮から半導䜓蚭備たで幅広く調達支揎をさせおいただいおいたす。倧半の郚品が通販やカタログで賌入出来るものではなく特泚品です。蚭蚈図があり郚品ごずに寞法や衚面凊理が違いたす。キャディでは各郚品が甚途に適した品質で䜜られるこずを心がけおおり、そのために瀟内で補造業のドメむン知芋を蓄積しおいたす。 この品質ずいうものをキャディで担保するために怜査拠点も関西ず関東に蚭けおおり、お客様が求めおいる品質に補品が出来䞊がったか確認しおいるわけですが、これが非垞に倧きなチャレンゞです。 補造業の「怜査」工皋 普段出荷盎前に蚭蚈図通りに補造されたかを確認する怜査工皋が蚭けられたす。産業や䌚瀟によっお怜査のしかたは違いたすが、なんらか「ナヌザに届く前の最埌の確認」をする認識はどこも共通でしょう。このステップで「穎の盎埄が間違っおいる」ずか、「衚面にキズがある」ずか、「塗装が剥がれおいる」等ず、色々アラヌトが䞊がっおきたす。 面癜いこずに穎の盎埄が違っおも、キズが付いおいおも、必ずしもダメな蚳ではない。ナヌザが穎の盎埄を気にしないなら良いわけです。誰の目にも付かずキズだらけでも良い郚品なら、キズがあっおも良いです。゜フトりェアの䞖界でもアむコンの䜍眮が数ピクセルズレおいおも、本番ぞのリリヌスを続行する事もある。党おコンテキスト次第でややこしいですね。肉県でキズが無くおも顕埮鏡で芋ればいくらでもキズは芋぀かりたす。あらゆる品質の基準に匷匱を付けお補造の珟堎に䌝える事が重芁で、そのための暙準ずしお日本囜内ではJIS芏栌が蚭けられおいたす。 家具の金具を䜜りたいのにゞェット゚ンゞンず同じ過剰な品質を求めるず䟡栌に倧きな圱響が出おしたう。だからずいっお、「キズだらけに䜜っおOK」ずか「寞法は適圓でOK」ずいう蚭蚈者はいないでしょう。倧䜓蚭蚈郚門は品質を良くしたく、賌買郚門は賌入䟡栌を抑えたいため、機胜芁件ず䟡栌むンパクトを䞊手くバランスするのが補造業の難しさずもいえるでしょう。 そのせめぎ合いで郚品が調達される状況䞋で怜査では合吊刀断が求められたす。怜査ずいうコンテキストだけでは刀断しきれなく担圓者に確認が必芁になる堎面も少なくないです。゜フトりェアの䞖界でもリリヌス盎前に䞍具合に気付き、リリヌス続行刀断をプロダクトマネヌゞャに求める堎面に䌌おいたす。䞀定䞍確実性が怜査工皋たで残っおしたうのは仕方がないですが、それをラヌニングずしお次回に掻かし、䞊流にフィヌドバック出来る事が最終的な姿かもしれたせん。 出荷盎前の怜査工皋でミスに気が付かずにお客様に迷惑かけるよりはマシですが、根本的には䜕も解決しおいない。䞍良の怜出単䜓はその堎の事実確認だけであり、継続的な改善に向かうには曎に原因远跡や再発防止察策が必芁。䜕もしないで再発のリスクを飲み蟌むのも党然ありですが、その共通認識を随時アップデヌトするきっかけずなるのが怜査のあるべき姿なのではないでしょうか。 品質の継続的改善 結局正解は無いし、完党に癜黒の䞖界は䜜れないので劂䜕にナヌザや業界に合わせ続けられるかが肝になりたす。品質は䞀回確認しお「完了」するものではなくお、䜕が求められおいるのかを把握した䞊で、継続的にそれをお届け出来るようにコミットする事です。ミスの無い䞖界は存圚しないですし、䞍確実性がれロの䞖界も存圚しないですが、トレヌドオフを垞に意識しお改善する事は出来たす。 求められおいる基準を定期的にアップデヌトしお、それに向けお改善し続ける事を蚀語化したのが囜際基準である ISO9001 です。こちらは「品質バッチリ」の認定ではなく、「継続的にPDCAを回す」䜓制ず実態があり、それにコミットする経営からの意思衚明です。キャディでもISO9001認定を受けおおり、QMS (Quality Management System)の構築ず継続的な改善に取り組んでいたす。怜査の結果をフィヌドバックのメカニズムずしお掻甚する事を蚘述させお頂いおいたす。 加工品の品質の継続改善ず同時に、テクノロゞヌ本郚では゜フトりェアの継続的な改善にも取り組んでおりたす。物理的な加工品ずパ゜コンの䞭にしか存圚しない゜フトりェアずで基質は違いたすが、䌌おいるずころも耇数ありたす。キャディの受発泚事業郚ずは党く別ですがSaaSの事業郚ではISO27001認定を受けおおり、ISMS (Information security management system)の構築を運甚をしおおりたす。この䞖に100%の保蚌は無いものの、極力お客様に寄り添っおいき、倉化し続ける芁求に察しお適切なプロダクトを提䟛し続けるための意思衚明ずも蚀えたす。 今回ご玹介させおいただいた物理の品質を螏たえお、次回 Part 2 ではセキュリティに限らず物理のモノづくりず゜フトりェアのモノづくりを比范出来ればず思いたす。 The post 補造業ず゜フトりェアの品質 Part 1/2 appeared first on CADDi Tech Blog .