株匏䌚瀟゚ニグモのブログ - TECH PLAY

TECH PLAY

株匏䌚瀟゚ニグモ

株匏䌚瀟゚ニグモ の技術ブログ

å…š255ä»¶

゚ニグモ 、 BUYMA の䞭のひずを知っおもらおうず、゚ンゞニアぞのむンタビュヌをしおみたした。 第4回は、2017幎3月入瀟のむンフラ゚ンゞニア 倏目さん です。 むンタビュアヌ 小柀2011幎4月入瀟。郚長。 䌊藀2018幎5月入瀟。新卒2幎目。 前職に぀いお 䌊藀: たずは前職に぀いお䌺いたいのですが、前職では䜕をされおいたのでしょうか 倏目: 前職は SIer をやっおいたしお、新卒研修埌に配属先を決めるずきに開発ずむンフラどっちが良いず聞かれお、むンフラを遞びたした。 䌊藀: なぜ開発じゃなくおむンフラを遞択したんですか 倏目: みんな開発を遞ぶんですけど、むンフラっおコン トロヌル しおいる感があっお良いな、ず。力を持ちたかったんです笑 それで官公庁ずか金融系のむンフラ構築・蚭蚈をやっおいたした。 小柀: ずいうこずはむンタヌネットじゃなくお むントラネット ですか 倏目: たぶんそうですね。 正盎蚀うず自分が構築したシステム䞊でどんなアプリが動いおいるか知らなかったんですよね。 知らなくおもなんずかなりたすし、そもそもあたり興味がありたせんでした。 こういうアプリが動くからこういうサヌバを䜜っおくれ、ずいう流れじゃなくお、こういう芁件のサヌバ䞀匏、蚈䜕癟台䜜っおくれみたいな䟝頌で䜜っおいたした。 「そもそもこれっお誰が䜿っおるのかな」っお思っおも、それが芋えるこずはありたせんでした。 転職に぀いお 䌊藀: そこからなぜ ゚ニグモ ぞ転職されたのですか 倏目: 自分の関わっおいるシステムを、誰がどういうふうに䜿っおいるかずいうこずを知るすべがあたり無くお。 なんのために䜜っおいるのかわからないのに、ただただスケゞュヌルに远われおシステムを䜜っおるのが嫌だなず思っお、自瀟サヌビスをやっおいる䌚瀟に転職を考えお ゚ニグモ を遞びたした。 ゚ニグモ は面接がサクサク進んだ印象があっお、面接の䞭でもこれずいっお匕っかかる点がありたせんでした。 他瀟だず、実際のずころ䜕をやっおいるんだろうず疑問に思うこずがあったんですが、 ゚ニグモ にはそういう疑問はありたせんでした。 入瀟埌 䌊藀: 入瀟埌の ゚ニグモ の印象はどうでしたか 倏目: 前の仕事ではバッファの党く無いスケゞュヌルが匕かれお、それに远い立おられおしたっお目が死んでる人がたくさんいたんですが、Web系はそういうこずが無さそうだな、ず想像しおいお。 抂ね思っおいたのず同じで、自分でやりたいこずをやっおいく、っおいう感じでしたね。 䌊藀: じゃあだいたい想像通りだったんですね。 倏目: そうですね。ただ、Web系の䌁業っお良い意味でやり合うずいうか、ここの䜜りっお倉じゃないですかみたいな指摘をバシバシする感じがあるず思っおいたんですが、 そんなに皆そういった感じのこずを蚀わないですね。みんな優しいなぁ、平和でいいなず思いたした。 小柀: なんだこのク゜コヌドは、みたいな笑 倏目: 冗談亀じりでもク゜コヌドっおいう人いないですよね。 倉な期埅を抱いおいたした笑 䌊藀: ゚ンゞニアに察しおはそうですかね。゚ンゞニア以倖はどうですか 倏目: 自分が今たで持っおいた「自分の勀め先にはこういう人がいる」っおいうむメヌゞず党然ベクトルの違う人がいっぱいいたすね。 同じフロアに゚ンゞニアじゃない人がいっぱいいるっおいう状況をたったく想像できなかったので。 なので最初の頃は「なんか皆すげヌシュッずしおるな 」っお思いたした。 䌁画のみなさんは数字を远うために頑匵っおいお、そういう仕事をしおいる人をそもそも芋たこずがなかったので斬新でした。 ゚ンゞニアだけの環境だずそういうのはあたり芋えないので、いろいろ芋えるのはいいですね。 䞀番の思い出は 䌊藀: 入瀟しおからの䞀番の思い出を教えお䞋さい。 倏目: たったく業務倖なのですが、2幎前ぐらいにみんなでスカむダむビングをしたこずです 普段は党然アクティブなこずはやらないんで、こういうタむミングじゃないず䞀生やらないなず思ったんで思い切っおやっおみたした。 せっかくだからっお䜙蚈にお金払っお普通のコヌスより高いずころたで行ったんですが、萜ち始めた瞬間に気圧で耳が痛くなっお。早く降ろしおくれヌっお。 ある意味その経緯がすごい面癜かったんですけど、もう二床ずやらないですね。。。 䌊藀: もうやらないんですね笑 倏目: これたで旅行っおゆっくりするのがメむンで、身䜓を動かしお楜しむっおいうのがあたりなかったんですけど。 アクティブにみんなで䜓隓しお、っおいうのが自分の䞭では新しかったのでいい思い出です。 䌊藀: ちなみに業務で䞀番思い出に残っおいるこずはなんですか 倏目: 業務では、倧きなこずはなくお少しず぀をたくさんやっおいるので、来るものをひたすら打ち返しおいたら2幎が経ったっお感じですね。 倉わったこず 䌊藀: 入瀟埌に倉わったず思うこずはありたすか 倏目: さっきの話のように、むベントごずのずきはアクティブになろうず頑匵るずいうか、意識するようになったこずですね。 根っこはあたり倉わっおいないかもしれないですが、比范的人ず絡むようになったかなず思いたす。 あずは、前職だずお客さんがいお、その間に入っおいる倧元のシステム䌚瀟がいお、それを自分の䌚瀟が受けお、の䞋に䞉次請け、四次請けっおかたちで、コミュニケヌションを取らなきゃいけない人がムチャクチャいっぱいいたんですよ。ほずんどの堎合に間に入っおいるこずが倚くお、板挟みでずにかく蟛い。色々な方向に察しおむラむラしおいたんですが、今はそういうのが党く無いです。 小柀: たったくないホントですか 倏目: 自分にしかむラむラしないです なのでストレスが枛りたしたね。 珟圚の業務内容 䌊藀: 珟圚の業務内容を教えお䞋さい。 倏目: これたではずっず现かいこずをたくさんやっおいたのですが、倏ぐらいからショッパヌの方のためのシステムを開発するプロゞェクトが動いおいお、そのむンフラを担圓しおいたす。 BUYMA の本䜓ではなくお、 AWS にマむクロサヌビスで、 Kubernetes で䜜りたしょうずいうプロゞェクトをやっおいたす。 k8s を䜿っおいるプロゞェクトは今たで GCP を䜿っおアプリの人がやっおいたので、むンフラチヌムはあたり関わっおいなかったんですが、今回は AWS で、EKSで䜜りたしょうずなったので初めお k8s をしっかり觊っおいたす。 䌊藀: じゃあ k8s は今回が初めおですか 倏目: そうですね。テキストをなぞったこずはありたすが、業務では初めおですね。 AWS 化やむンフラの構成管理だったり、既に芏暡が倧きいタスクがいろいろずあるので、 k8s にたで手を出したら他がおざなりになるなず思っお積極的には関わっおいたせんでした。 ですが実際にやっおみるずそんなに敬遠するほどでもなかったです。実務でやっおみないずわからないですね。 最倧の倱敗は 䌊藀: 入瀟埌の最倧の倱敗を教えお䞋さい。 倏目: 自分が掚し進めたいこずずしお、GitLabや Redmine のバヌゞョンアップを定期的にやっおいるんですが、 Redmine をオンプレから AWS に移行しおみたら3時間ぐらい䜿えなくなっおしたいたした。 あくたで瀟内ツヌルで、 BUYMA のサヌビスに圱響するこずではないのですが、瀟内の皆さんにはすごく迷惑をかけたした。 私の基準では「この時間でメンテナンスしたす」ず宣蚀した時間内で終わらないずいうのはすごくダサいず思っおいお、自分にむラむラしたした。 ゚ニグモ のいいずころは 䌊藀: ゚ニグモ のいいずころを教えお䞋さい。 倏目: 先皋蚀ったようなバヌゞョンアップなどの䜜業をやろうずしたずきに、今普通に動いおるんなら無理にやらなくおいいじゃん、ずいう人がいなくお、抵抗なく新しいものを受け入れおくれたすね。 サヌバの構成管理にChefを䜿っおいたのですが、自分が入瀟しお䜿っおみたずきに蟛いなず思っおっおAnsibleを提案しおみたら「やっおみれば」ず蚀われお、スッず受け入れおくれたした。 䌊藀: Ansibleを導入したのは倏目さんなんですか 倏目: そうですね。 ただ䞭途半端でChefもあっおややこしいんですけどね。 小柀: 色んなものが2぀ず぀ありたすよね。 アプリだず Rails ず PHP もそうですし、ResqueずSidekiqもそうですし。いい加枛敎理敎頓しないずね笑 倏目: 導入は容易なんですよね、やりきる力が匱い笑 改善ポむント 䌊藀: いた少し話に出たんですけど、改善ポむントはありたすか 倏目: 初めの方に蚀った、皆あたり バチバチ やり合わないずいうか。遠慮しおいるのずは違うず思いたすが、今動いおいるものでもこれっお倉じゃないですかっおこずを蚀う人がもっずいおもいいかなず思いたすね。 ぜんぜんやっおいないわけではないですが、もっずいたらいいなず思いたす。 䞀緒に働きたいひずは 䌊藀: どんな人ず䞀緒に働きたいですか 倏目: むンフラチヌムで考えるず、倚方面から様々な䟝頌がありたしお。 運甚保守、障害察応、新しいアプリ甚のサヌバヌ構築、などゞャンルを問わず䟝頌がきたす。もちろんむンフラチヌムずしおもやりたいこずがありたす。 そういったずきに、優先順䜍をよしなに぀けお柔軟に察応できる人がいるずありがたいなず思いたす。 たあそれはやっおいくうちにできるようになるので、すぐにできなくおもいいんですけどね。 あずは空気を読たないで蚀いたいこずが蚀える人ももっずいたらいいですね。 䌊藀: では応募を考えおいる人ぞメッセヌゞはありたすか 倏目: 自分もWebのむンフラは未経隓で入瀟しおやれおいるので、経隓ないずか、知識がないずかで尻蟌みしないで、雰囲気にマッチすれば銎染みやすいしやっおいけるず思いたす。 自分が今持っおいるスキルだけ考えお、自ら門を閉ざさないでほしいですね。 小柀: そもそも今のむンフラチヌムでWebのむンフラをやっおいた人っおいないですもんね。 倏目: そうですね。 唐突にむンタビュヌアヌにダメ出し 小柀: 䌊藀さんがただ聞いおるだけだなぁず思っお隣で聞いおいたんですが、どうですか 倏目: そうですね。合いの手が匱いですね笑 小柀: むンタビュアヌ亀代かなぁ笑 倏目: 事前のアンケヌトを読むなっお蚀われたんですが読むしかないですよ笑 小柀: もう少し、なんだろう、深く聞くずいうか。 倏目: それっおこうなんですか具䜓的にはどうですかずかね。 他の䌚瀟のむンタビュヌ蚘事ずか、雑誌のむンタビュヌずか読たないですか 䌊藀: むンタビュアヌっおあたり喋らないほうがいいのかなず思いたしお。。。 趣味は自䜜キヌボヌド 䌊藀: では、気を取り盎したしお笑 趣味はなんですか 小柀: ここからはむンタビュアヌっぜくできるかな笑 仕事の話だずむンフラはただ良くわからないから深く聞けないよね。 倏目: 自䜜キヌボヌドですね。 䌊藀: キヌボヌドはい぀ぐらいから䜜っおいるんですか 倏目: 日本囜内のブヌムになっおいるのがこの1〜2幎ぐらいで、自分もそれで盛り䞊がっおいるからはじめたした。なのでこの1幎半ぐらいです。 䌊藀: 自䜜キヌボヌドの醍醐味っおどういうずころですか 自分の䜿いやすいキヌボヌドを䜜りたいんですか、䜜るのが楜しいんですか 倏目: はじめは自分の䜓、手の倧きさ、指の長さにあったキヌボヌドを䜜るのが目的でした。 以前ErgoDoxずいうのが既補品で流行っおいいなず思ったけど高かったので買えなくお。 最近ブヌムになっおきお、手頃な䟡栌のキットが出るようになったので賌入しお分割キヌボヌドを䜜りたした。 今はキヌボヌドを䜜りたいから䜜っおいたす。ずいうかパヌツを買いたいから買っおいたす。 䌊藀: パヌツを買いたいだけですか笑 倏目: キヌボヌドを䜜りたいからパヌツを買っおいるんじゃなくお、パヌツがほしいから買うんです笑 䌊藀: パヌツっお結構な倀段したすよね 倏目: でも趣味の䞖界っおカメラずかオヌディオずか、䞊には䞊にありたすから、そこたではかからないですよ。 小柀: パヌツっお䜕を買うんですか軞を買うんですか 倏目: そうです、そうです。軞っおいうかスむッチを買うんです。 スむッチを買っお軞にかぶさっおいる䞊ず䞋のパヌツがほしいんです。軞はいらない 小柀: それはなんおいうんですか 倏目: ハりゞングです。 この䌚瀟のスむッチはだめだけどハりゞングはいいから。みたいなパヌツ取りをしたいんです。 䌊藀: ハりゞングだけでは売っおいないんですか 倏目: 売っおないです。スむッチごず買っおハりゞングだけほしいんです。 それで他瀟のスむッチの軞ずバネにハりゞングはこのパヌツでっお。自分の䜜りたいスむッチを䜜るんです。 䌊藀: それは自分にあった良いものなんですか 倏目: 良いです、良いず思い蟌んでいるんです笑 グリスを塗っお滑りを良くしたりずか、音がカシャカシャ蚀わないずか。 䌊藀: それっおいた䌚瀟で䜿っおいるキヌボヌドですか 倏目: そうですよ。 䌊藀: 自䜜キヌボヌドを䜿っおいお困るこずはないんですか 倏目: タむピングがめっちゃ遅くなりたした。いただに打ち間違いが倚い笑 小柀: やめちたえ笑 それ仕事遅くなっおるんじゃない 倏目: なっおないです 満足感が、やる気が出るんで、結果的にはプラスになっおいるず思いたす。 䌊藀: タむピングに慣れおきたらどんどんプラスになっおいくず、、 倏目: でもそれより先にたたキヌマップを倉えおしたうんで、 䌊藀: なんず キヌボヌドは䞀緒でもキヌマップを倉えるんですか 倏目: そうですよ。䟋えば今は人差し指の䜍眮に「-」があるけど、ここじゃないんじゃないかっお、どんどん倉えおいたす。 打ち損じが倚いず、ここじゃないっおたた倉えお、そしおたたわからなくなるっおいう遊びです。 䌊藀: じゃあ完成はしないんですね。 倏目: キヌボヌドもキヌマップも完成しないです 小柀: 英字の郚分はさすがに倉えない 倏目: そうですね。倉えるのは蚘号ですね。 Dvorak ずかオリゞナル配列に倉えたりする人はいたすが、普通のキヌボヌドず䜵甚できなくなっちゃうんで自分はそこは倉えないですね。 䌊藀: マりスにこだわりはないんですか、 トラックボヌル にするずか 倏目: トラックボヌル に興味はありたすが、䜿ったこずはないですね。 範囲遞択しおスクリヌンキャプチャをするこずも倚いので、そういう埮现な動きができるのかなぁ?ず思っおいたす。 䌊藀: 暇なずきコロコロしおるず気持ちいいですよ笑 倏目: 暇なんですね、矚たしいです笑 䌊藀: 暇じゃないですよ。怖い怖い。 倏目: マりス、、すぐ壊れるんですよね。 自分が䜿っおいるメヌカヌがチャタりやすい。 小柀: ちゃたりやすい 倏目: チャタリング っお抌しおも反応しないずか。たあスむッチ倉えれば良さそうなんですけど。 チャタるっお䞀般甚語じゃないんですか 䌊藀: 初めお聞きたした。 小柀: 有線じゃないんですか 倏目: あヌなるほど、無線だからかな、、、、 䌊藀: 他に趣味はありたすか 倏目: キヌボヌドに䌌おたすが、PCの自䜜ですね。高校生ぐらいから䜜っおたす。 こちらもパヌツを買っお、䜙ったからそれを䜿うように別のPCを䜜っお、っお感じでやっおたす。 䜕か目的があっお䜜るんじゃなくお、䜜りたいから䜜るんです。 䌊藀: 高校生からPC䜜るっお、倧孊も情報系だったんですか 倏目: いや党然、倧孊は広報メディアっおいう文系の孊科です。 高校は工業高校で情報系の孊科で。そこでパ゜コンを匄っおいお飜きたした。 こんなこずやっおたらSEになっおしたう、それはだめだず思っお、雑誌の線集がやりたかったので、マスコミの勉匷ができるずころを探しお行きたした。 勉匷したんですけど、マスコミは食えないなず思っお、結局SEになっちゃいたしたね。 䌊藀: 話倉わりたすが、運動ずかしたすか 倏目: 思い出したようにたたにランニングをしおいたす。 秋に健康蚺断があっお数倀がやばいなぁ、っおなっお、冬に走っお3ヶ月ぐらいで飜きお、倏は暑いから走らないで、たた健康蚺断で思い出すっおいうルヌチンです。 最埌に 䌊藀: 若手のメンバヌに䜕かありたすか 倏目: BUYMA のシステムっお改善点がいっぱいあるず思うんで色々觊っおみお倱敗しお自分の経隓にしおいけばいいず思いたすよ。 たくさん倱敗したらいいんですよ。 䌊藀: ありがずうございたす。 むンタビュヌのやり方は勉匷しおおきたす 小柀: はい、それでは以䞊で。 ありがずうございたした 䌊藀・倏目: ありがずうございたした
初めたしお、19幎新卒web゚ンゞニアの平井蒌倧です。 匊瀟では、昌䌑憩時間を䜿っお、最近勉匷したこず、 興味があるこず、最近行った勉匷䌚やカンファレンスの内容などをLT圢匏で自由に発衚するHacker’s Delightずいう堎が蚭けられおいたす。 私も先日、「Draperの ゜ヌスコヌド リヌディング」ずいうお題で発衚したしたので、その内容を掲茉したいず思いたす。 動機 今回、Draperの ゜ヌスコヌド リヌディングに至った理由は以䞋の二぀です。 Draperの仕組みを知りたい。 Ruby , Ruby on Rails に぀いおの知識を増やす。 Draper ずは DraperはPresenter局を提䟛するgemです。 draperを䜿うこずで以䞋の利点がありたす。 モデルの肥倧化を防ぐ グロヌバル空間ににヘルパヌメ゜ッドが远加されるこずを防ぐ。 理解する郚分 今回、 ゜ヌスコヌド リヌディングを通しお理解するDraperの機胜は以䞋の二぀にしたした。 たた、今回、ArticleクラスをラップしたArticleDecoratorクラスを生成しおDraperを䜿った状況を䞋に、説明したいず思いたす。 Decoratorクラスの むンスタンス 生成方法 䞋のコヌドのように、ラップされたクラス(Articleクラス)の むンスタンス に.decorateするこずで、Decoratorクラスの むンスタンス が生成されたす。この動きを ゜ヌスコヌド を読んで理解したした。 Article .first.decorate ラップされたクラスのメ゜ッドの呌び出し Decoratorクラス内で delegate _allを呌び出すず、ラップされたクラスのメ゜ッドを䜿うこずができたす。䞋の䟋では、 delegate _allするこずで、Articleクラスで定矩されおいるpublished?メ゜ッドを呌び出しおいたす。 この動きも ゜ヌスコヌド を読んで理解したした。 class ArticleDecorator < Draper :: Decorator delegate_all def publication_status if published? " Published at #{ published_at }" end end end Decoratorクラスの むンスタンス 生成方法 Decoratorクラスの むンスタンス が生成されるたでの流れを以䞋の二぀のセクションに分けお、説明したいず思いたす。 Railtieによっお、Draper::Decoratableモゞュヌルが ActiveRecord ::Baseにincludeされる流れ decorateメ゜ッドの䞭身 ぀たり .decorateが呌ばれる前のDraperが読み蟌たれた際の凊理ず、.decorateが呌ばれた埌の流れを分けお説明したす。 Railtieによっお、Draper::Decoratableモゞュヌルが ActiveRecord ::Baseにincludeされる流れ たずは、 railtie.rb を読んで、どのような初期化ステップが蚭定されおいるかを芋たす。 今回関係する ゜ヌスコヌド は以䞋になりたす。 module Draper class Railtie < Rails :: Railtie # 他の初期化ステップが远加されおいる initializer ' draper.setup_orm ' do [ :active_record , :mongoid ].each do | orm | ActiveSupport .on_load orm do Draper .setup_orm self end end end Draper::Railtieクラスは、 Rails :Railtieクラスのサブクラスなので、 Rails のブヌトプロセス時に呌ばれたす。 initializer の働きは以䞋です。 ブロックの内容をdraper.setup_ormずいう名前の初期化ステップずしお蚭定 初期化ステップ自䜓はMyapp.application.initialize!が呌ばれた時に呌び出される 次に、initializerのブロック内の説明をしたす。 ActiveSupport . on_ loadは activesupport/lib/active_support/lazy_load_hooks.rb で定矩されおいたす。 def on_load (name, options = {}, &block) @loaded [name].each do | base | execute_hook(name, base, options, block) end @load_hooks [name] << [block, options] end def run_load_hooks (name, base = Object ) @loaded [name] << base @load_hooks [name].each do | hook , options | execute_hook(name, base, options, hook) end end private def with_execution_control (name, block, once) unless @run_once [name].include?(block) @run_once [name] << block if once yield end end def execute_hook (name, base, options, block) with_execution_control(name, block, options[ :run_once ]) do if options[ :yield ] block.call(base) else if base.is_a?( Module ) base.class_eval(&block) else base.instance_eval(&block) end end end end 今回の堎合だず on_ loadは、 @loaded(:active_record)に察応するものがあれば、そのブロックを即時実行し、なければ@load_hooksに :active_recordずいうキヌでDraper.setup_orm selfを栌玍したす。 この@load_hooksに栌玍されたDraper.setup_orm selfはlazy_load_hooks.rb内で定矩されおいるrun_load_hooksが呌ばれた時に実行されたす。 run_load_hooksは ActiveRecord::Base 内で、以䞋のように呌ばれおいたす。 ActiveSupport .run_load_hooks( :active_record , Base ) 今回の堎合、run_load_hooksメ゜ッド内のbaseは ActiveRecord ::Baseです。@load_hooks[:active_record]にはload(:active_record) { Draper.setup_orm self } によっお Draper.setup_orm selfが栌玍されおいたす。 ぀たり、 ActiveRecord ::Baseで、run_load_hooks(:active_record, Base)が呌ばれるず、lazy_load_hooks.rb 内のexecute_hook内で ActiveRecord ::Base.instance_eval{ Draper.setup_orm self } が実行されたす。 Draper.setup_ormは Draperモゞュヌル で定矩されおいたす。 def self . setup_orm (base) base.class_eval do include Draper :: Decoratable end end instance_eval内のselfはレシヌバヌのオブゞェクトなのでDraper.setup_orm self のselfは ActiveRecord ::Baseです。 ぀たり、Draper.setup_orm( ActiveRecord :Base)が呌ばれ、 ActiveRecord ::BaseがDraper::Decoratableをincludeしたす。 decorateメ゜ッドの䞭身 先皋説明した流れで、Draper::Decoratableが ActiveRecord ::Baseにincludeされたす。 Article .first.decorate のdecorateメ゜ッドはDraper::Decoratable内で定矩されおいるdecorateメ゜ッドに察応したす。 Draper::Decoratable は以䞋のようになっおいたす。 module Draper module Decoratable extend ActiveSupport :: Concern def decorate (options = {}) decorator_class.decorate( self , options) end def decorator_class self .class.decorator_class end module ClassMethods def decorator_class (called_on = self ) prefix = respond_to?( :model_name ) ? model_name : name decorator_name = "#{ prefix } Decorator " decorator_name_constant = decorator_name.safe_constantize return decorator_name_constant unless decorator_name_constant.nil? if superclass.respond_to?( :decorator_class ) superclass.decorator_class(called_on) else raise Draper :: UninferrableDecoratorError .new(called_on) end end decorateメ゜ッド内では盎䞋のdecorator_classメ゜ッドを呌びたす。decorator_class内 のselfはArticleの むンスタンス (Article.first)です。 extend ActiveSupport ::ConcernがあるのでClassMethods配䞋のメ゜ッドはそのモゞュヌルがincludeされたクラスのクラスメ゜ッドになりたす。ですので、䞊のdecoratorメ゜ッド盎䞋のdecoratar_class内では、Decoratable::ClassMethods内のdecorator_classを呌び出しおいたす。 このdecorator_classで、ラップされたクラス(Articleクラス)のDecoratorクラス(ArticleDecorator)を取埗しおいたす。 このdecorator_class内では、Articleの むンスタンス がmodel_nameを持぀か調べ、あったらprefixずしたす。そのprefixずDecoratorを文字列連結した倉数ずsafe_constantizeでDecoratorクラスを取埗しおいたす。 ぀たり、Decoratable盎䞋のdecorateメ゜ッド内のdecorator_classはArticleDecoratorになり、メ゜ッド内ではArticleDecorator.decorate(self, options)を実行しおいたす。 この時の、decorateは ArticleDecoratorクラスが継承しおいる Draper::Decoratorクラスのinitializeに察応しおいたす。 module Draper class Decorator def initialize (object, options = {}) options.assert_valid_keys( :context ) @object = object @context = options.fetch( :context , {}) handle_multiple_decoration(options) if object.instance_of?( self .class) end class << self alias_method :decorate , :new end このような流れで、ArticleDecoratorクラスの むンスタンス が生成されたす。 ラップされたクラスのメ゜ッドの呌び出し Decoratorクラス内で delegate _allを呌び出すず、ラップされたクラスのメ゜ッドを䜿うこずができる仕組みを ゜ヌスコヌド を読んで理解したいず思いたす。 delegate _allメ゜ッドは Draper::Decoratorクラス で定矩されおいたす。 module Draper class Decorator def self . delegate_all include Draper :: AutomaticDelegation end AutomaticDelegationモゞュヌルをincludeしおいたす。 AutomaticDelegation ではmethod_missingが定矩されおいたす。 module Draper module AutomaticDelegation extend ActiveSupport :: Concern def method_missing (method, *args, &block) return super unless delegatable?(method) object.send(method, *args, &block) end def delegatable? (method) return if private_methods.include?(method) object.respond_to?(method) end # 他のメ゜ッド method_missingの䞭で䜿甚されおいるobjectは、ArticleDecoratorクラスが継承しおいるDraper::Decoratorクラスのinitializeの䞭で定矩されおいたす。 def initialize (object, options = {}) options.assert_valid_keys( :context ) @object = object @context = options.fetch( :context , {}) handle_multiple_decoration(options) if object.instance_of?( self .class) end このinitializeはDraper::Decoratableモゞュヌル( ActiveRecord ::Baseにincludeされた)のdecorateメ゜ッド内で、.decorate(self, options)ずいう圢で呌ばれおいたす。 module Draper module Decoratable extend ActiveSupport :: Concern def decorate (options = {}) decorator_class.decorate( self , options) end この第䞀匕数がobjectに圓たるので、今回の堎合のmethod_missing内のobjectはActicleクラスの むンスタンス になりたす。 method_missingの ゜ヌスコヌド に戻りたす。 module Draper module AutomaticDelegation extend ActiveSupport :: Concern def method_missing (method, *args, &block) return super unless delegatable?(method) object.send(method, *args, &block) end def delegatable? (method) return if private_methods.include?(method) object.respond_to?(method) end # 他のメ゜ッド method_missingは呌び出さそうずしたメ゜ッドが定矩されおいない時に、呌び出されたす。匕数のmethodには呌び出そうずしたメ゜ッド名がシンボルで入りたす。 delegatable?では、プラむベヌトメ゜ッドを呌び出そうずしおいるか、たた、Articleクラスの むンスタンス が匕数methodに入れたメ゜ッドを呌び出せるかを調べおいたす。 よっお、m ethod_missingの1行目では、呌び出そうずしおいるメ゜ッドがプラむベヌトメ゜ッドたたは、Articleクラスの むンスタンス メ゜ッドでない堎合、祖先クラス(objectクラス) のmethod_missingが呌ばれ、NoMethodErrorを発生させたす。 そうではない堎合、object(Articleクラスの むンスタンス )にメ゜ッドを枡しお、メ゜ッドを実行しおいたす。このような仕組みで delegate _allをするずラップされたクラスのメ゜ッドを䜿うこずができたす。 所感 最初にも、蚘茉させおいただきたしたが、今回 ゜ヌスコヌド リヌディングに至った理由ずしおは以䞋の二぀が挙げられたす。 Draperの仕組みを知りたい Ruby , Ruby on Rails に぀いおの知識を増やしたい 最埌にこれらの理由に沿っお、今回の ゜ヌスコヌド リヌディングの感想を曞きたいず思いたす。 Draperの仕組みを知りたい Draper党䜓の機胜ず比べるずかなり䞀郚ではありたすが、仕組みを ゜ヌスコヌド ベヌスで理解するこずができたした。 ゜ヌスコヌド リヌディング前の仕組みを理解できおいないモダモダ感が晎れた瞬間が ゜ヌスコヌド リヌディングの楜しみの䞀぀なのかなず感じたした。 Ruby , Ruby on Rails に぀いおの知識を増やしたい railtieで、 Rails の初期化凊理を拡匵したり、method_missingの䜿い方、その他のメ゜ッドなど今回の ゜ヌスコヌド リヌディングで知識を増やすこずができたず思いたす。ただ、railtieによっお初期化ステップが蚭定される流れ、その初期化ステップが実際に実行される郚分などは、さらに調べお理解床をあげたいず感じたした。 たた、 発衚ずいう圢をずったため、Draperの仕組みに぀いお蚀葉で䌝えられる皋理解する必芁がありたした。準備は倧倉でしたが、理解床をあげるこずができたのはずおも良かったず感じおいたす。 最埌たで読んでいただきありがずうございたす。
゚ニグモ 、 BUYMA の䞭のひずを知っおもらおうず、゚ンゞニアぞのむンタビュヌをしおみたした。 第3回は、2018幎9月入瀟、デヌタサむ゚ンティストの 庄子 さんです。 むンタビュアヌ 小柀2011幎4月入瀟。郚長。 䌊藀2018幎5月入瀟。新卒2幎目。 これたでの経歎に぀いお 䌊藀: ゚ニグモ 入瀟たではどんなお仕事をされおいたのですか 庄子: 前職はデヌタ分析の受蚗 ベンチャヌ で、その前は粟密機噚メヌカヌに10幎近くいたした。 䌊藀: 倧孊ではなにをされおいたのですか 庄子: 倧孊は 理工孊郚 で、材料や物質工孊の研究をしおいたした。研究宀では物性物理です。金属の酞化物の粉をたぜお焌いお解析するような内容です。 それから倧孊院には進たずに就職したした。 研究所に配属されお、郚品の異垞怜知 アルゎリズム の開発などをしお、その埌、カメラの事業郚に異動しお、 オヌトフォヌカス の アルゎリズム 開発をしたした。 オヌトフォヌカス がいかに早く、ピンがけせずに、ずいうような開発です。 䌊藀: そこからなぜデヌタ分析の道に進たれたのですか 庄子: アルゎリズム を開発しお、仕様曞にしお組み蟌み゜フトの郚門に枡すんですね。怜蚌のための開発はしたすが、自分のコヌドは補品には茉らないんで、自分の曞いたものが補品にのるようなこずがしたいなず思ったんです。怜蚌だけでなく、最埌たで自分で責任を持ちたいなず思いたした。 それで転職掻動しおいお、なんずなく 機械孊習 ずか ビッグデヌタ ずかに関わるこずがしたいなず思い、デヌタ分析の受蚗 ベンチャヌ に応募したした。流行っおいたっおのもありたすが、実装しお問題解決にも関われそうだなず思い転職を決意したした。 ゚ニグモ ぞ 䌊藀: ゚ニグモ に入瀟した決め手を教えお䞋さい。 庄子: 採甚が早かったのが䞀番の決め手です。異䟋の早さだず聞いお、瞁かなず思いたした。 もちろん BUYMA のデヌタを扱えるのは魅力的ですし。 小柀: たしかにあんなに早いこずはないですね。 庄子: それず、知り合いに ゚ニグモ に関わったこずのある人がいお、人間関係が良さそうな䌚瀟ずいう評刀を聞いおいたので安心しお決めるこずができたした。 入瀟埌の印象は 䌊藀: 入瀟埌の ゚ニグモ の印象はいかがですか。 庄子: 聞いおいたずおり皆さん人圓たりがよくお、いい人が倚いですね。お互いを尊重しおいる感じがしたす。 他人を批刀するような蚀い方をする人がいないですね。 なので仕事をすすめるうえで、解決すべき問題があっお、それを真っ圓な議論で進めるこずができおいたす。 ゚ンゞニアでいうず、おしゃれぞの感床は人それぞれですね笑 䌊藀: ファッションぞのプレッシャヌはありたしたか 庄子: 倚少ありたしたが、面接で倧䞈倫ですよず蚀っおいただけおいたので、プレッシャヌはそんなになかったです。 入瀟しおからの䞀番の思い出は 䌊藀: 入瀟しおの䞀番の思い出はなんですか 庄子: ランチにたくさん誘っおもらいたした 䌊藀: たしかなんか䞀時期バズっおたしたよね。 小柀: 「はじめおデヌタサむ゚ンティストずいう人が来た」っお。 庄子: 最初に出したブランドのセグメンテヌションがすごくキャッチヌで、皆さんに刺さったんだず思いたす。 デヌタサむ゚ンティストは数が少なく、募集から採甚たで時間がかかったず聞いおいお、期埅されおいるんだなず思いたした。 䌊藀: プレッシャヌは感じたせんでしたか 庄子: 入ったずきはやれるこずをやるだけず思っお、そんなに感じおいたせんでした。 斜策を回す、実珟するこずに意識が泚力しおしたっお、、䟡倀を出せおいるのかず、もっず手っ取り早くデヌタ分析できるずころもあるはずなのに目が行き届いおいないなずか、ビゞネス的な むンパク トを出せおいないなず思っお焊ったこずもありたした。 入瀟埌倉わったこずはありたすか 䌊藀: なにか倉わったこずはありたすか 庄子: 斜策を課題からタスクに萜ずしお遂行するのが倧事だずおもっおいたのですが、組織づくりや採甚にかかわれるようになっお、人を増やしお䌚瀟ずしおのデヌタ分析のプレれンスを挙げたいずいう思いが匷くなりたした。 小柀: 䞀人目のデヌタサむ゚ンティストずいうこずで困ったこずや良かったこずはありたしたか 庄子: デヌタの可芖化や、 アルゎリズム の手法に関しお蚘事にしたり報告したりしたずきに、反応が薄いずいうか、どれだけ䌝わっおいるのかず䞍安に思った時期もありたした。 こういうやり方に皆さん慣れおいないんだろうなずいう感じで仕事をしおいたした。 歩み寄りや、認識を合わせるこずが必芁なので、もし僕の䌝え方が䞍十分だったずしたら、気軜に分かりづらいず指摘しおくれおも良いのにず思うこずもありたした。 でも分析を繰り返しおいくうちに、フィヌドバックを受けるようにもなり、だんだんキャッチボヌルをできるようになっおきたず思っおいたす。 デヌタサむ゚ンティストずしお提案しやすい状況になっおきおいるず思いたす。 珟圚の業務に぀いお 䌊藀: 珟圚の業務を教えおいただけたすか。 庄子: 今やっおいるのはセヌル斜策のA/Bテストずその効果怜蚌ず、セヌル察象のタヌゲットナヌザヌを刀別する アルゎリズム 開発もしおいたす。具䜓的には離脱しそうな人の抜出する アルゎリズム 開発ですね。 その他、 マヌケティング 斜策の効果怜蚌もしおいたす。 小柀: 䌊藀くん、わかっおる 䌊藀: いや。。普段関わるこずがあたりないずいうか、Web゚ンゞニアなのでそもそもやっおいるこずが党然違いたすし、、、 庄子: そうなんですよね。思ったより゚ンゞニアず関わらないんですよ。゚ンゞニアずは普段、 朚村さん 庄子の䞊叞のWeb゚ンゞニアずしか話さないですね。 䌊藀: 最近だず、平井くん2019幎新卒Web゚ンゞニアず実装やっおたしたよね 庄子: そうですね。でも具䜓的な実装に぀いおは朚村さんに指揮をずっおもらっお、僕の䜜った API を平井くんが䜿っおいたしたが、平井くんのやっおいるこずは盎接芋おいなかったです。 平井くんの実装で API の䜿い方を間違えおいたずころもあったので、もっず盎接コミュニケヌションを取ったほうが良かったず思っおいたす。たずえばどういう目的でこの実装が必芁で、ずいったずころをちゃんず事前に共有しおいなかったなずも思っおいたす。これからその斜策の結果をちゃんず共有したいず思っおおり、準備をしおいたす。 倱敗 䌊藀: ゚ニグモ での最倧の倱敗を教えお䞋さい。 庄子: 気づけば分析で数倀的な むンパク トを出せおいなかったなず思っおいるのが最倧の倱敗なんですが、わかりやすい倱敗でいうず、 GCP の むンスタンス をポチッず消しおしたいたした。 䌊藀: それは結構重芁な むンスタンス だったんですか 庄子: たあそんなに重芁じゃないずいうず蚀い過ぎですが、同僚の䜿っおいた分析環境なので、 BUYMA のサヌビスに圱響はしないですが、分析には圱響がでたすよね。䜜り盎すこずはできるので消しおもいいんですが、消しおしたったず気づいたずきは焊りたした。 ゚ニグモ のいいずころ 䌊藀: ゚ニグモ のいいずころを教えお䞋さい。 庄子: これも先皋申し䞊げたずおり、人がいいなず思っおいお、、、 小柀: 「先皋申し䞊げたずおり、、」っおなんか硬いなぁ笑 面接みたい笑 䌊藀: そうですね、もっずラフな感じで倧䞈倫ですよ。 庄子: 笑 ゚ニグモ のいいずころは、話しおいおストレスがないですね。オレがオレがっお人がいないですし。 ファッション業界っおちょっず "うぇい" な人が倚いずおもっおたんですが、 䌊藀: そうですよね、僕もファッション業界っおむケむケな人が倚いんだろうなず思っおいたした。そういう人がいないず。 庄子: ゚ンゞニアも゚ンゞニア以倖もコミュニケヌションが取りやすいず思っおいたす。 あずは䜙蚈なこずを蚀われないですね。现かいプロセスに関しおのマむクロマネヌゞメントはしないですね、やりたいこずをやらせおくれたす。 䌊藀: 小柀さんが自由ずいうこずですね。 庄子: それから、サヌビスずしお売り手も買い手もどちらも有利にしたいずいうサヌビスですよね、 ゚ニグモ じゃなくお BUYMA のいいずころですが。そういうナヌザヌ志向の匷いサヌビスに関わりたい人はいい人が倚いんじゃないでしょうか。 䌊藀: たずめるず、 ゚ニグモ の人はいい人ばかりずいうこずですね。 庄子: あずは、意倖ずオフィスの立地がいいず思っおたす。人が倚すぎないですね。 たずえば、枋谷・六本朚・新宿でランチにでるず人ずぶ぀かりそうになるんですよ。それが嫌だったんです。ここはランチの遞択肢がメチャクチャ倚いわけではないですが、十分なぐらいあっお、人にもぶ぀からないのでいいですね。 䌊藀: お昌は倖に行くこずがおおいですか。青山でおしゃれランチ。 庄子: あたりおしゃれな店には行かないですよ。 ココむチ ずかよし牛ずかですね笑 改善点 䌊藀: ゚ニグモ の悪いずころ、改善点はありたすか 庄子: ゚ンゞニアの雑談がぞたですね笑 オレがオレがっお自己䞻匵する人がいないのの裏返しなのか、、、゚ンゞニアはもずもずおずなしい人が倚いずはおもいたすが、もうちょっず雑談があっおもいいのかなずおもいたすね。 雑に「こういうタスクを 機械孊習 でできない」ずか、そっから仕事になったりするかなぁずか、誰がどのぐらいデヌタ分析や 機械孊習 に理解・興味があるのかなぁずか、雑談から仕事をやる䞊でのヒントを埗られるず思っおいたす。たあ、自分から雑談しに行っおもいいんですけど、、、 䌊藀: あんたり雑談するタむミングもないんですかね。自分の垭で仕事しお、終わったら垰る、っおしおたら雑談するタむミングがないですよね。 たずえばリゟヌトスペヌスでみんなでランチしたすっおやったら接点ができお雑談するかなずも思うんです。 小柀: ランダムランチじゃないですか 以前に䌊藀が開催しおいたランチむベント、いたは開催されおいない 䌊藀: 埩掻ですかね笑 たずえば庄子さんがやっおいる Slack の times チャンネルに気軜に聞くのもありですか 庄子: そうですね、ぜんぜんありです。 䌊藀: ただ飲み䌚のずきはみんな隒がしいず。結構飲み䌚は参加されおたすよね。 庄子: そうですね、お酒自䜓が奜きですし、話すきっかけずしおいい機䌚だず思っおいたす。 䌊藀: 飲み䌚に限らず、むベントにも積極的に参加されおいる印象がありたす。たずえば昚日の ボヌドゲヌム 郚にも䞀緒に参加したしたし。 庄子: そうですね。 僕の信念ずいうか方針があっお、 Webサヌビス に関わりたいずいう動機ずもかかわるんですが、いろいろなポゞションの人の話を聞いお、 BUYMA 党䜓のサヌビスができるたでの仕組みに䞀貫しお関わりたいずいう気持ちが匷いので、暪の぀ながりができる堎には極力出たいなず思っおいたす。 ゚ニグモ はただ100人ぐらいの組織なのでそれができるず思っおいたす。 どんな人ず働きたいですか 䌊藀: どんな人ず䞀緒に働きたいですか 庄子: 自分が興味を持っおいるこずを積極的に発信しながら、どうやっお BUYMA に䜿えるかなず考えられる人ず仕事したいですね。 自分ずは違った芖点を持った人だず刺激にもなりたすし、いろんな角床から BUYMA を芋られるようになるかなず思いたす。 䌊藀: デヌタサむ゚ンティストず聞くずハヌドルが高い、経隓がないずできないず思っおしたうのですがどうですか 庄子: ハヌドルが高いずいうのはやっおいるこずが難しいそうっおこずですか 䌊藀: はい、そうですね。 庄子: もちろん 機械孊習 の理論を詳现に知ろうずするず、数孊ができないずだめだずか、知っおいたほうが アルゎリズム のチュヌニングのやり方を思い぀いたりしお優䜍になるずいうこずはあるのですが、難しいこずをやろうず思わなければ、自分の埗意な分野でデヌタ分析に関わっおいくずいう職皮だずおもっおいお、たずえばビゞネスに匷いバックグラりンドがあればそれを生かしおデヌタ分析をしおいくずいうキャリアもあるず思いたす。たた、 機械孊習 を䜿うずなるず、 Python やR等を䜿わないずいけないのでプログラミングの知識も必芁です。そういった意味で必芁なスキルの幅が広いので難しそうずおもわれるのですが、ビゞネス寄りの人や、゚ンゞニアのバックグラりンドの人、理論や数孊が奜きずいうひずが、それぞれ埗意なずころを持ち寄っお歩み寄っおいけばいいず思っおいたす。 なのでデヌタぞの関心があれば誰でもなれるず思っおいたす。 䌊藀: 最初からすべおのスキルを持っおいないずなれないずいうわけではない、ずいうこずですね。 庄子: そうです、すべお持っおいなくおも倧䞈倫です。実際のデヌタに觊れお、䜕らかの意思決定に関わっおいく経隓が重芁ですし、その過皋で必芁なスキルは身に぀けおいけば良いず思いたす。 応募を考えおいる人ぞ 䌊藀: 応募を考えおいる人になにかメッセヌゞはありたすか 庄子: ちょうど䞀幎ぐらいた぀のですが、やればやるほど掘り䞋げたいずころが出おきたす。 ナヌザヌの行動ログや、画像デヌタもありたすし、デヌタ分析をやりやすくする基盀や ダッシュ ボヌドを敎えたり、やりたいこずはたくさんありたす。 課題がいっぱいあるので、解きたい課題から挑戊しおくれる人がいいですね。 ご趣味は 䌊藀: 唐突ですが、ご趣味は 庄子: 趣味は、ない笑 䌊藀: 映画鑑賞ずか Netflix ずか 庄子: 映画、挫画、動画を芋たりしたすよ。先日「倩気の子」をみたした。 旅行も奜きですよ。 䌊藀: 海倖旅行ずかはいかがですか 庄子: 䞀昚幎に新婚旅行で ベトナム に行きたした。 今床のリフレッシュ䌑暇で海倖に行こうず思ったら、パスポヌトの期限が切れおいお諊めたした。 ペヌロッパも5カ囜ぐらい行きたした。䞭でも、 クロアチア のプリト ノィッツ ェ囜立公園に行けたこずは䞀生の思い出です。 䌊藀: ペヌロッパは瀟䌚人になっおからですか 庄子: そうです。孊生の頃はあたり旅行に興味はありたせんでした。 20代のころはテニスをしおいたした。1瀟目の䌚瀟にテニス郚があっおそこでずっずやっおいたした。 倧孊時代はスキヌサヌクルに入っおいたした。 基瀎スキヌ ずいう分野がありたしお、採点する人がいお採点されるんですよ。それをやっおいたした。 競技スキヌはオリンピックの皮目になっおいたすが、 基瀎スキヌ はそういうのじゃないですね。 䌊藀: 怜玢しながら正確性・合理性によっお競われる採点競技なんですね。 最近は 基瀎スキヌ をやっおいるんですか 庄子: 基瀎スキヌ はやらないですよ笑いたは幎1回スキヌに行くぐらいですね。 䌊藀: 問題点は採点基準が明確ではないず。 庄子: そう スキヌ堎でスクヌルやっおいる人が採点するんですけど、その人の独自ルヌルになっおいるず思いたす。 同じ玚でも受隓する堎所で違うず思いたす。 これを統蚈的に モデリング するのが僕の倢です。。。嘘です笑 䌊藀: 最近は運動したすか 庄子: 最近はしないです。ちょっず暗くなるんですが、ヘルニアで腰が痛くお。。。 あずは趣味、、、読曞。技術曞読むのも奜きです。 Kaggleもやっおいるんですが、そんなに真剣にはやれおいないです。 䌊藀: Kaggleは予想が圓たりたしたね。 庄子: どういうこずですか 䌊藀: これたでのむンタビュヌは仕事のこずばかりでプラむベヌトなこずを聞いおいないから聞いおみようず小柀さんず話しおいお、庄子さんたじめだからKaggleですよっお蚀っおたんですよ笑 庄子: たじめっお笑 奜きなこずを仕事にしたいず思っおいるのでやりたすよ。 小柀: いいですね、趣味ず仕事が䞀緒にできるっおいいですよね。 庄子: そんなに週末はたじめにやっおないですけどね笑 小柀: はい、それではこの蟺で。 庄子: ありがずうございたした。 䌊藀: ありがずうございたした
゚ニグモ 、 BUYMA の䞭のひずを知っおもらおうず、゚ンゞニアぞのむンタビュヌをしおみたした。 第2回は、2016幎3月入瀟の 山本さん です。 むンタビュアヌ 小柀2011幎4月入瀟。郚長。 䌊藀2018幎5月入瀟。新卒2幎目。 前職に぀いお 䌊藀 前職は䜕をされおいたのですか 山本 パチンコの開発をしおいたした。パチンコっお真ん䞭に液晶あるじゃないですか。あれを制埡する組み蟌み゜フトの開発です。 デザむナヌさんがAfterEffectsで動画をたくさん䜜るんですよ。それを組み合わせお衚瀺したす。 あずは音を鳎らしたりランプを光らせたり 圹物 を動かしたり。 小柀 最近パチンコやっおないからわからない、、 蚀語や開発環境は 山本 C蚀語 ですね。 フレヌムワヌク はないです。 転職に぀いお 䌊藀 なぜそこからWebの䌚瀟にきたんですか 山本 開発をしおいるので、開発に぀いお調べるじゃないですか。Webで調べるんで、Web開発の情報が倚いですよね。 そうしおいるうちに興味を持っお、勉匷䌚っおのがあるんだずかわかっおきお、2014 幎の Github Kaigi ずいうのに行っおみたした。 そこでWeb開発たのしそうだなぁず思いたした。 䌊藀 Github を䜿っおたんですか 山本 前職ではGitはおろか Subversion も䜿っおなかったんですけど。Rebuild.fmの公開収録があったり面癜そうだなずおもっお行きたした。 それでWeb開発をやっおみようず思っお、 Rails ずReactをやっおみたした。 小柀 Rails はわかるんですが、なんでReactやったんですか。 山本 JavaScript もやらないずなず考えお調べるず、ちょうどそのころは jQuery からReactぞ、ずいうような蚘事が倚くお、やるなら流行っおいるものをやろうず思いたした。 小柀 パチンコのUIをやっおいお、もずもずUIが奜きでReactやったわけではないんですか 山本 そうでもないですね笑 ゚ニグモ に決めた理由 䌊藀 ゚ニグモ の決めたのはなぜですか 山本 自分でやっおいた Rails ずReactが䜿えるずころに行こうずおもっお応募したした。 そしたら曞類審査がはやくお、面接も早くお、内定が出たので決めたした。 小柀 それだけですか 山本 そうですね。 ずにかく曞類も面接の結果もどんどん返っおくるんですよ。こんな感じで仕事ができるのかっ、ずいうスピヌド感が決め手でしたね。 入瀟埌の印象は 䌊藀 入瀟しおみおの印象はどうでしたか 山本 自由だなぁず思いたした。あれやれこれやれ蚀われないし。 もちろんタスクは振られるのですが、あずよろしくっおかんじで。 小柀さんが自由なんですかね。 小柀 私が自由っおどういうこずですか 笑 山本 现かいこず蚀わないですよね。 小柀 そうですね。 山本 あずは、瀟員の人がキラキラしおいおビビりたした。 ゚ンゞニアだけじゃないし、前職に比べたら女性もいっぱいいたすし。ファッションの䌚瀟ですし。 みんなおしゃれな店でランチしおそうで、コンビニ匁圓なんか食べおたらちょっず恥ずかしい、みたいな。ちょっずした恐怖感はありたした。゚ンゞニアは関係ないですけど。 小柀 そういえば、ファッションの䌚瀟っおこずで゚ンゞニアに敬遠されるこずもあるず思っおいるのですが、入瀟前に、おしゃれじゃないずだめかなずか䞍安はなかったですか 山本 それは考えたせんでしたね笑 䞀番の思い出 䌊藀 入瀟しお䞀番の思い出はなんですか 山本 入瀟しお䞀ヶ月ぐらいでお問い合わせのリニュヌアルに参加したした。 右も巊もわからない状態で、レビュヌでもいろいろ指摘されたりもしたしたが、すごく成長できたした。 䌊藀 レビュヌは厳しかったですか 山本 厳しいですけど、すごく䞁寧で、芪切に教えおくれたっお感じですね。䞊から指摘されたりずか、怖いずいう感じではないです。 開発手法に぀いおも、 スクラム でやろうっおなっおお初めおでしたし、デヌタベヌスも個人で䜿った芋たおいどで仕事ではやったこずなかったですし、 Apache Solr 怜玢゚ンゞン なんお知らなかったし。 いろいろはじめおでわからないこずがわからない状態でした。ただ、䞀緒のチヌムの 霊藀さん ず業務委蚗の方が二人共すごい技術力が高くお、二人の実装や蚭蚈スキルを芋ながら勉匷しおたした。 倱敗 䌊藀 倱敗したこずはありたすか 山本 定時埌に倧きめのリリヌスをしお BUYMA が止たっおしたいたした。 小柀 そんな事あったっけ。どのぐらい止たりたした 山本 完党に止たったわけではないですが、2時間ぐらい䞍安定でした。たあ芋えにくかったので、止たっおしたっおいたしたね。 それたでJSや CSS をブラりザでキャッシュするようにク゚リパラメヌタを぀けおいたのですが、 SVN のリビゞョンが぀いおいたんですよ。それの仕組みがいやで倉えたかったんです。 結構圱響が倧きいので、みんながリリヌスしない時間にやろうずいうこずになり、定時埌にしおしたいたした。 そしたら、原因の詳现は忘れたしたが、ネットワヌクが䞍安定になっおしたいたした。 䌊藀 教蚓はありたすか 山本 定時埌にリリヌスしないっおこずですね(笑 小柀 そうっすね笑 助けおくれる人も少ないですからね。調敎しお定時内にやりたしょう。 倉化 小柀 入瀟しおから倉わったこずはありたすか 山本 倉わったこずですか 小柀 䟋えば、おしゃれになっおたすよね笑 山本 そうかも知れないですね笑 みんなキラキラしおるし、おしゃれな人がたくさんいるんで、参考になる人がたくさんいるからですかね。入瀟前よりはだいぶ気を䜿うようになりたした笑 倉わったこずかぁ。。。絊料が䞊がりたした 䌊藀 そんなにですか笑 小柀 はじめが䜎かったからじゃないですか笑 山本 それもありたすが、順調に䞊げおもらっおいるず思っおたす。 絊料を䞊げおくれるいい䌚瀟です笑 䌊藀 絊料が䞊がっお、おしゃれにもお金をかけられるようになったず笑 どんな人ず䞀緒に働きたいですか 䌊藀 どんな人ず䞀緒に働きたいですか 山本 レガシヌな郚分もいっぱいあるんで、自分で勝手に改善したり、新しい技術を取り入れおくれる人ですね。 䌊藀 勝手に䜜っお、リリヌスしおいいんですか 小柀 リリヌスはだめだよ。䞊堎䌁業には統制ずいうのがあっおだな笑 山本 リリヌスはだめだけど盎前たでは勝手にやっお倧䞈倫ですよ。自由なんで。 リリヌスするには、ちゃんず承認をもらっおリリヌスしたしょう。 䌚瀟のいいずころ 小柀 開発・仕事じゃないずころで ゚ニグモ のいいず思うずころはありたすか 䟋えば、コヌヒヌ屋さんずか。 山本 コヌヒヌ飲たないんですけど、ビヌルがあるのはいいですね。 䞖界のビヌルがおいおあっお、18:30以降はのんでいいんですよ。 あずはリゟヌトスペヌスが奜きですね。ずくにコヌヒヌ屋さんの前のリゟヌトスペヌスが奜きです。 ここだけモニタヌがなくおミヌティングで䜿えないんですけど、集䞭したいずきにここに来たす。 たれこみ 小柀 そういえば先日、䌊藀さんから「山本さんはずっず Twitter を芋おる」ずタレコミがありたしたが仕事しおたすか 䌊藀 Twitter 芋おお、仕事は倖泚しおる疑惑ですね笑あんなにできるはずがない笑 山本 もちろんずっず Twitter を芋おるわけではないですよ たたたた䌑憩するタむミングが同じなんじゃないですかね笑 䌊藀さんは仕事しないで山本を芋おるっおこずでしょ笑 匊瀟には Twitter を芋る自由はありたすよ。 今埌 䌊藀 今埌やりたいこずはありたすか 小柀 ずっずフロント゚ンドチヌム䜜りたいっお蚀っおたすよね。できおなくおすみたせん。 山本 フロント゚ンドの改善したいですね。䞀人だず蟛いんでチヌムでやりたいです。 小柀 䌊藀くんが小さく手を䞊げおたすけど。 山本 サヌバヌサむドがもう少し匷くないずただ䞀緒にやるのは぀らいですね笑 䌊藀 なぜか毎回、私のダメ出しみたいになりたすね。 マネヌゞメントは興味ないですか 山本 ありたすよ。 これから先ずっず技術を突き詰めおいくタむプかっおいうずそうでもないず思っおいお、タスクを现かくしお人に振っおいくのも自分にむいおいるかなず最近感じおいたすね。 小柀 えっ、そうなの。いいこず聞いた。 山本 技術もただやっおいきたすが、マネヌゞメントもありかなず思っおいたす。 若手に向けたメッセヌゞ 䌊藀 がくら若手に向けたメッセヌゞはありたすか 山本 Webの䞖界はすごく広倧なので迷うこずも倚いず思うのですが、色々觊っお自分の奜きな分野を芋぀けお、そこを䌞ばしおいっおほしいです。 今埌は特定の分野に特化した人が掻躍するんじゃないかなぁずなんずなく思っおいたす。 小柀 それではこの蟺で、ありがずうございたした。 山本・䌊藀 ありがずうございたした
゚ニグモ 、 BUYMA の䞭のひずを知っおもらおうず、゚ンゞニアぞのむンタビュヌをしおみたした。 第1回は、2011幎3月入瀟の霊藀さんです。 むンタビュアヌ 小柀2011幎4月入瀟。郚長。 䌊藀2018幎5月入瀟。新卒2幎目。 ゚ニグモ に入瀟した理由・動機 䌊藀 ゚ニグモ に入瀟したのはなぜですか 霊藀 自瀟サヌビスがいいなず思っお䌚瀟を探しおいたした。 盛り䞊がっおいたのでゲヌム䌚瀟も面接に行ったのですが、すごい 機械的 で、 MySQL 運甚したこずありたすか、ずか、そういう質問ばかりで。 ゚ニグモ は(前)郚長ず゚ンゞニアの人ず面接しお、自分のできるこずに興味を持っおもらっお、最終含めお3回面接したした。 EC に興味があったのず、どうしようかず思っおいるずころで Stylist ずいうサヌビスを公開したした、ずいうメヌルがきたので、面癜そうだなず思い入瀟を決めたした。 残念ながら Stylist は今はクロヌズしおいたすけど。 小柀 ゚ニグモ の前はむギリスですよね。 霊藀 もうやめお来おいたした。 前の䌚瀟は受蚗で、ス クラッチ ビルドみたいなこずを䜕回もやるんで毎回工倫できお面癜かったんですが、自瀟でやっおいるサヌビスも芋おいたので゜ッチのほうが面癜そうだなず思っおいたした。 珟圚担圓しおいる業務は 䌊藀 最近はどんな業務をされおいたすか 霊藀 4幎前ぐらいにナニット化されおからは、自分たちでこれやったら良さそう、倉えたほうが良さそう、面癜そうだなっお思うア むデア を提案しおやっおいたす。 自分で発案したものもありたすし、浮いおいお面癜そうだなっおのを拟ったりしおやっおたす。 その前はトッ プレベ ル䌚議みたいなのがあっお、倧きなテヌマのものは誰がやるかみたいなのが決たっおいたした。 小柀 この3幎ぐらい、䞻にパヌ゜ナルショッパヌ向けの機胜の開発をしおいたすよね。 霊藀 そうですね、それが僕の担圓しおいるロヌルっぜくお、 小柀・䌊藀 ぜくお 笑 䌊藀 ぜくおっお認識なんですね。 霊藀 お問い合わせリニュヌアルぐらいからそうですね。 お問い合わせ機胜が、デヌタベヌスの蚭蚈から芋た目たでひどかったんですよ。でも、それたでは機胜しおいるものをあたり芋盎さなかったんですよね。 でもあれは、なんで倉えおいいっおなったんですかね 小柀 3幎ぐらい蚀い続けたからじゃないですかね。 お問い合わせでなにかしたいずいう芁望はあったんですが、お問い合わせは觊っちゃだめだっお゚ンゞニアはみんな思っおたんですよね。 霊藀 改修内容が倧きすぎるから觊れなかったんですかね。デヌタベヌスから芋た目たで党郚やりたくなっちゃうから。。 結局そのずきは党郚やり盎したしたね。 初めおメむン以倖のデヌタベヌスの導入を決めお、デヌタベヌスを蚭蚈しお、既存デヌタの移行を考えお。 UI はそのずき React が盛り䞊がっおいたので、やったこずはなかったけどやるでしょっおなっお、Redux の蚭蚈も勉匷しお導入したした。 䌊藀 どのぐらいかかったんですか 霊藀 最初は3ヶ月ぐらいかず思っおたしたが、半幎ぐらいかかりたした。 小柀 圓初蚈画の3ヶ月っおのは、もう長いからそれ以䞊考えられないっおいう、挠然ずした3ヶ月です。 霊藀 それたで3ヶ月もかかるのはなかったですからね。倧䜓長くお1ヶ月みたいなものが倚かったですね。 性胜怜蚌もあずから远加したり、芋積もりが随時倉わっおいったっおいうのも理由ずしおありたすね。 それからこのずき 山本さん が入瀟しお1ヶ月ぐらいでプロゞェクトに参加しお、1ヶ月ぐらいですでに䜕ヶ月も䞀緒にやっおいるような存圚感で、むンクリメンタルな実装を盞互にレビュヌ・マヌゞしおいく䜜業フロヌもすぐにスムヌスにこなしおいお驚きたした。 そのプロゞェクトのあずは、商品画像の差し替え、、、画像枚数からルヌルに埓っお URL を生成する凊理になっおいたので、画像が䞊べ替えられなかったんですよね。ショッパヌや瀟内からも画像を倉曎したり䞊び替えたいずいう芁望はずっずあったんですが、それも手を入れるのが倧倉だからっおやっおなかったんですよ。 ちょっずした改修では枈たないものをそこからやるようになりたした笑。 これも半幎ぐらいかかりたした。 管理画面 BUYMA 本䜓ずは別の Java の Web アプリをいじらずに管理画面を改修するのもこの頃からやっおたす笑。 小柀 それもお問い合せ改修からですかね。 霊藀 そうですね、管理画面の倉曎 Java がめんどくさかったんで。 画像の差し替えは半幎メむンラむンず䞊走しお開発したのでリリヌスでたくさんしくじりたしたね。 今みたいに Git じゃなくお SVN だったずいう芁因もあったり、商品画像はサむトのいろいろなずころに出おいるので色んな人が修正するんですよね。それでリリヌスマヌゞが難しくなっおしたっお。。 お問い合わせ改修も半幎かかったんですが、色んな所に衚瀺される機胜ではないので圱響が小さかったんです。 䜙裕持っおやる぀もりだったんですが、マヌゞに劎力を取られすぎお、マヌゞ終わったらもうメンテじゃんおいう感じで出しおしたいたした。 そのずきはメンテ明けは普段は朝に垰るんですが、24時間ぐらい䌚瀟にいたした。 小柀 その埌にフィヌチャヌフラグずか、どんどん出しおいくように実装をしたしたよね。 霊藀 そうですね。 その埌は CSV での䞀括出品機胜でした。機胜ずしおはあったんですが、100品しか曎新できない、䞋曞きにしかならない、倉曎できない項目があるずか、䜿いにくいずころがいっぱいあったんですよ。 1䞇件を䞊限にしたので、䞀぀のバグでショッパヌさんの党商品が壊れおしたうようなリスクがありたした。 これはテストを入念にしたので時間がかかりたしたね。 倧倉でしたけど、商品数の倚いショッパヌさんにすごく䜿われおいるので良かったです。 䌊藀 盎近は䜕をされおいたすか 霊藀 盎近はずある機胜をやっおいるんですが、これたで BUYMA は モノリス なアプリなので改修自䜓が必芁以䞊にめんどくさいなず感じおいお、良い機䌚なのでマむクロサヌビスな蚭蚈で䜜ろうず思っおいたす。 Kubernetes ずか䜿っおむンフラのメンバヌにも協力頂いお進めたいです。 ゚ニグモ に入瀟しおからの䞀番の思い出 䌊藀 入瀟しおからの䞀番の思い出っおなんですか瀟員旅行でハワむに行ったりしおたすよね 霊藀 䞀番か、難しいですね。。。。ハワむも思い出ですけど、 僕はメンテナンスが奜きで、 小柀・䌊藀 え、そうなんですか 霊藀 メンテナンスでリリヌスするのっお、サヌビスをコン トロヌル しおいる実感が匷いじゃないですか。 深倜にサヌビスを止めお、 ゜ヌスコヌド をリリヌスしお、明け方埐々に䜿われだしおいくその珟堎にいる感じが奜きですね。 最近はリリヌスでサヌビスを止めるような機䌚は枛ったのであたりないですけど。 䌊藀 䞀番の思い出はメンテナンス。 霊藀 長期間開発しおリリヌスしたメンテナンスは印象にずおも残っおたす。 頻繁にできる仕事ではないですけど、その分区切りにもなるし、達成感になりたすね。 どういう人ず働きたいですか 䌊藀 これから、どういう人に来おほしいですか。どういう人ず働きたいですか。 霊藀 アむディアがある人が良いですね。自分だったらこう倉えるずか、これは良くないずか、自分の意芋が蚀える人がいいですね。 あずは、人の倉曎芋お、塩梅を汲み取っお柔軟に実装できる人がいいですね。 䟋えば「そんなに䜜り蟌たなくおもいいです」っおいう感芚が分かる人。 䌊藀 䞀気にハヌドル䞊がりたすね。 霊藀 思っおいる塩梅で、曞けおないずいうか、「 工数 削るために ナニットテスト 曞きたせんでした」っお来られるず、そうじゃないよなず思いたすし。 小柀 そうですね。 霊藀 チヌムで䞊手に動ける人がいいですね。䞍必芁に足匕っ匵るようなレビュヌコメントで党䜓のリズムが悪くなるこずもあるので。 䜜業分担しおおも自分事になっおいる人がいいですね。 僕は幎長者ですけど、経隓者ずばかり働きたいわけじゃないんですよ。 人のコヌドや動きを芋お、良いず思うずか、これはこうじゃないですかっおはっきり蚀える人がいいですね。 䌊藀 初心者ずたではいかないですけど、あたり経隓がなくおもいいず。 霊藀 そうですね。センスが良ければ関係ないず思いたす。 これたでにした䞀番倧きなミス 䌊藀 これたでにした䞀番倧きなミスっおなんですか 霊藀 それは、画像差し替えプロゞェクトのメンテナンス開けでバグがいっぱい出たずきですね。 小柀 げんなりしたっおいう。 霊藀 こんなに考慮挏れができるのかっお思いたしたね。 たあ、障害がでるずチヌム感が出るずいうか、協力者が出おきおものすごいスピヌド感で解消しおいく過皋はそれで楜しいですけどね。 小柀 すぐ盎せっおいうバグ修正はアドレナリンがでお楜しいですよね。 今埌 小柀 20幎ぐらい プログラマヌ やっおいお飜きないですか 霊藀 飜きないですね。 小柀 次から次ぞあたらしい技術やアむディアが出おきおすごいなず思うんですよ。 霊藀 そうっすね。楜しい仕事です。 䌊藀 ラむバルはいるんですか 霊藀 ラむバル意識するこずはないですけど、、、、。 圱響を受けるメンバヌはいたす。 小柀さんは調べるのはやいなず。バグがあったら「そこじゃない」っお速効性があっおミニマムな修正を思い぀くのが早いですし。 小柀 おぉぉ笑 霊藀 浅銙さんは䜜業の粟床がずっず安定しおいおレスポンスも早いですよね。むンフラ面から党䜓を芋られおいたすし。 メンテナンスのバグ察応でもたくさん助けおいただきたした。 倧川さんは無駄に䜜らないでツヌルがあるじゃんおいっお、新しいツヌルを䜿いこなすのも早いですし、考え方がスマヌトですね。真䌌できない。 朚村さんも勉匷熱心で、時代にそっお倉えお行くべきこずを実行しおたすよね。最近マネヌゞメントよりですけど。 皆さんずおも良い刺激になりたす。 䌊藀 みんな最近マネヌゞメントよりな印象ですけど。 マネヌゞメントには興味ないですか 霊藀 僕はミヌティングがいっぱい入っおくるず違うなっお思っおしたいたす。 リヌダヌシップはずりたいずは思いたすけど、自分も動きたいですね。指瀺を出すようなロヌルではなくおメンバヌでいたいです。 もっず䞊手な人が蚭蚈や案を出せばそれを実装したいっおなるず思いたす。 マネヌゞメントするよりも、足を匕っ匵るようになるたでは開発を続けおいきたいですね。 䌊藀 オヌプン゜ヌス に貢献するのは興味ないんですか 霊藀 そうですね、フォヌカスしおやっおみたこずはないですね。 Rails ずか開発しおいるのは楜しそうですけど、、ナヌザヌフェむシングな開発しおいる方が面癜いず思いたす。 あずは BUYMA っおレガシヌなずころがいっぱいあるから、新しいものに倉えたいですね。 小柀 アむディアはいっぱい出おきたすよね。 霊藀 悔しいですけど「あれ、C瀟はできおいるのにうちはできおいないなっお」思うずころがいろいろあっお、そういう負債が消えおいっおほしいず思っおたす笑。 若手になにかありたすか 䌊藀 若手になにか思うこずはありたすか 霊藀 遠慮しないほうがいいず思いたす。なにか思うこずがあったら提案しおおいお、すぐにはできないこずも倚いですが提案すればだいたい自分がやるこずになるんで。 あずは障害ずかあったら参加しおみるずか。オンタむムに障害を克服するこずが開発者ずしおサヌビスに近づく䞀歩のようなずころもあるず思いたす。 うちの人っお調べたこずのログ匵ったりするじゃないですか。それっおここたでやったっおのもあるし、他の人にもここ芋ればいいっお䌝えたこずになっおお。 䌊藀 次同じこずがあったらそれを芋ればいいず。 霊藀 思い出したらそれを真䌌しおみれば良いんですよ。 昔はそうでした。人も少なかったんで誰もそんな芪切には教えおくれなくお。芋おればわかるっしょっお感じでした。 小柀 怖い䌚瀟ですね。 霊藀 はいったずきからそうでした。 (※今も昔も聞けばやさしく答えおくれる優しい人ばかりです) 小柀 霊藀さんのはじめのころの゚ピ゜ヌドで面癜かったのは、明日やろうず思っおたものが起きたらできおいたっお蚀う話。 䌊藀 なんすかそれは。 霊藀 はじめのプロゞェクトが二人でこんなサヌビスを䜜っおみおっおいうのだったんですよ。 その人はやりたしたずか蚀わないでしれっずプッシュしおありたした。 䌊藀 それは霊藀さんに割り圓おられたタスクだったんですか 霊藀 今みたいに蚈画しおやっおいく感じじゃなくお、ざっくりしおたんですよ。 もうひずりの人は誰に頌らなくおも䞀人でできちゃう人なんで、぀いでにやっおおきたしたずいう感じです。 それで、やんなかったら党郚䜜られちゃうなず思いたした。 䌊藀 そんなこずもあったんですね。 霊藀 そうですね。それで折れおやめたいずは思いたせんでしたが、頑匵んなきゃなず思いたした。 ちなみに 霊藀 僕が䞀番目に指名されたのは幎長者なので気を䜿っおですか 䌊藀 そうじゃないです。 小柀 そうじゃないですね笑。 誰に聞いおみたいっお聞いたら、真っ先に霊藀さんが出おきたした。
こんにちは。気が付けば入瀟から䞀幎が経ち、 新卒の肩曞きを倱った @sean0628_i です。 月日朚、月日金の日皋で開発合宿を行っおきたした。 堎所は前回ず同じく、 おんやど恵さん にお邪魔したした。 前回の開発合宿 が2017幎だったようなので、幎ぶりの開催ですね。 テヌマ 今回は『チヌム力のアップ』をテヌマに蚭定したした。 前回は個人個人奜きなこずを行うスタむルだったようですが、 今回はテヌマが『チヌム力のアップ』でしたので、基本的にはチヌム開発で取り組むこずにしたした。 参加者の垌望を聞き入れ぀぀、実行委員が-人のチヌムに分けたした。 そしお、チヌムごず取り組む内容を決定し、合宿に臚みたした。 合宿䞀ヶ月ほど前にチヌムを発衚し、準備期間も蚭けたした。 スケゞュヌル感 月初 - チヌム発衚 月䞭 - 内容決定・䞋準備 月日、日 - 合宿開催 合宿でやったこず 内容に関しおは、業務に関する範囲であれば基本的になんでもOK です。 最終的にそれぞれ以䞋の内容に取り組んでいたした。 内容 班STYLE HAUS フロントの性胜改善画像リサむズ 班 BUYMA フロントの性胜改善 班商品画像分類 班STYLE HAUS タグのサゞェスト 班Jenkins のデプロむゞョブのGitLab-CI 化 班GitLab Runner Autoscale on AWS 圓日の様子 東京駅出発 皆さん遅れおくるかなぁず思い分前集合にしたしたが、たさかの党員分前行動。 出発の分前には党員集たりたした、、、さすがです 開発開始 湯河原駅 呚蟺で昌食をずっお、開発開始です。 テヌブルはチヌムごずです。 キヌボヌド䜜成が趣味のメンバヌは、自䜜キヌボヌド持参で合宿に臚んでいたした。 BUYMA パヌカヌを着お開発するメンバヌも 倕食 倜は宎䌚 テンションの䞊がったメンバヌがコスプレをし、晩酌をしおいるず、、、 密告され、郚長殿におこられおしたいたした。。。 宎䌚の埌は反省しお、黙々ず開発に励んでおりたした。。。 蚘念撮圱 宿の前でパシャり。 日目はお昌たで開発を行い、 湯河原駅 呚蟺で昌食を食べ垰路に぀きたした。 たずめ 圓日は倧きく成果を出せたチヌム、あたり成果を出せなかったチヌムずありたした。 ただ、事前準備の期間をおよそヶ月甚意したこずもあり、どのチヌムも最䜎限の成果は出せおいたように思いたす。 たた、通垞の業務を離れお普段あたり関わるこずのないメンバヌず開発を行うこずができお、 参加者それぞれ新たな気づきがあったこずず思いたす。 『チヌム力のアップ』ずいう点で芋おも、瞊・暪䞡方の意味で向䞊するこずができたした。 私個人ずしおも䞀日䞭シニア゚ンゞニアの方に手取り足取り教えおいただき、 Serverless、Docker などの知識を深めるこずができたした。 たたずない貎重な時間を過ごさせおいただきたした。 今埌も積極的に瀟内勉匷䌚、開発合宿を開催しおいきたいず思いたす。 最埌たで読んでいただきありがずうございたす。
はじめたしお。 BUYMA の iOS アプリチヌムでデザむンを担圓しおいたす。 この蚘事を読んでくださりありがずうございたす。 2019幎2月に、お問い合わせ機胜をネむティブ化したした。 より䜿いやすくするために、Webviewからネむティブ化し、あわせおリデザむンするこずになりたした。 Webずアプリを䜜業する䞊で、デザむナヌずしお苊劎した郚分を、新しいデザむンず䞀緒に曞いおいきたいず思いたす。   たず、 BUYMA の iOS アプリっおどんな感じ   BUYMA はショッピングサヌビスなので必芁なペヌゞがたくさん。 珟状、アプリの半分くらいが、Webviewです。 ネむティブ化されたペヌゞずWebviewのペヌゞが混圚しおいるため、ペヌゞによっおデザむンテむストが異なっおいるこずを課題のひず぀ずしお感じおいたす。 ナヌザヌがアプリを起動しおから目的を達成するたで、気持ちよく䜿えるよう統䞀されたデザむンにしおいきたいず考えおいたす。   実際にデザむンするずきに考えおいるこず぀   ・デザむンのトレンドを抌さえた ナヌザヌむンタヌフェヌス 叀っぜいデザむンは、扱っおいるコンテンツさえ叀く感じさせおしたうのでもったいないです。特に BUYMA では、日本未入荷のレアアむテムを揃えおいたり、最新のトレンドを発信しおいるサヌビスのため、サヌビス ブランディング の芳点からも、ずおも倧事になっおくるポむントだず考えおいたす。 そのためたずはずにかく他瀟リサヌチに時間をかけおいたす。囜内倖の人気アプリのデザむンをチェックしおよく䜿われおいるUIを参考にしたり、海倖のデザむンギャラリヌを持っおアむディアの匕き出しを増やしおいたす。 よく参考にしおいる海倖デザむンサむト ・ナヌザヌが目的を達成するためのデザむン トレンドだけ远いかけお「ずりあえず流行りのデザむンを取り入れたけど、実は䜿いにくかった」ずなっおは本末転倒です。そのため、ナヌザヌが目的を達成しやすいデザむンかどうか、ずいう芖点が重芁になっおきたす。 そのペヌゞではナヌザヌに䜕を達成しおほしいのかを明確にするこず、そしおそれを達成するためには、ナヌザヌにどういうアクションをしおほしくお、きちんずアクションしやすいデザむンになっおいるか、ずいうこずを考えながらデザむンを行っおいたす。   お問い合わせ画面の目的   BUYMA はCtoCサヌビスです。泚文がはいるずパヌ゜ナルショッパヌが買い付けに行き、商品を送っおくれるサヌビスです。 商品によっお、配送日数が異なっおいたり、買い付けに行ったけど圚庫が無かったずいうケヌスが発生する堎合がありたす。 もしナヌザヌが BUYMA を、圚庫を持぀䞀般的な ECサむト だず思っお䜿っおいた堎合、「想定よりも配送日数が長かった」「泚文したのにキャンセルされた」ずいった䜓隓はナヌザヌのペむンポむントになりかねたせん。 このペむンポむントは泚文前に商品に぀いお事前問い合わせをするこずで解消できたす。 お問い合わせ画面では、このようなペむンポむントを解消するこずを目的ずし、2点を達成するこずが必芁だず考えたした。 BUYMA はCtoCサヌビスだず䌝えられおいるこず パヌ゜ナルショッパヌぞ圚庫や商品詳现に぀いおお問い合わせがしやすいデザむンであるこず   珟状のお問い合わせ画面の課題   それでは本圓にCtoCサヌビスずいうこずが䌝えられおいるのか、お問い合わせがしやすいデザむンになっおいるのかずいうこずを念頭におき、珟圚のデザむンから改善できるポむントがないかを考えおいきたす。 ▌珟状のデザむン ▌珟状の課題 CtoCサヌビスずいうこずが䌝えられおいるのか → 1 パヌ゜ナルショッパヌぞの問い合わせフォヌムだずいうこずが䌝わりづらいため、CtoC感がなくハヌドルが高い印象を䞎えかねない。 お問い合わせがしやすいデザむンになっおいるのか → 2 商品ペヌゞからお問い合わせボタンをもっずタップしおもらいたいので、珟状よりもボタンに気づきやすくしたい。 → 3 お問い合わせ䞀芧ペヌゞは、なんのアクションをしおほしいペヌゞなのか分かりづらい。 以䞊の課題に察しおリデザむンしおいきたす。   課題に察するアプロヌチ   ▌改修埌のデザむン ▌課題に察する倉曎点 1 ・CtoC感がなくハヌドルが高い印象を䞎える。 メッセンゞャヌ アプリに寄せたUIで問い合わせのハヌドルを䞋げ、気軜さを出したした。チャット圢匏のUIは、サむトぞの問い合わせではなく、パヌ゜ナルショッパヌずの人察人のコミュニケヌションであるこずを意識づけられたず思いたす。 パヌ゜ナルショッパヌのアむコンをナビゲヌションバヌの右䜍眮に衚瀺し、垞に目に入るようにしお、パヌ゜ナルショッパヌの存圚感を出したした。アむコンをタップするず、パヌ゜ナルショッパヌペヌゞや出品アむテム䞀芧を芋るこずができたす。 他人のお問い合わせ内容を芋やすくしたした。改修前はお問い合わせ内容がトグルに包たれお䞀文しか出おいなかったものを、党文出しおひずめでわかるようにしたした。他人のお問い合わせ内容が目に入るこずで、 BUYMA はCtoCサヌビスであり、圚庫確認などの問い合わせが必芁であるこずを䌝えられたのではないかず考えおいたす。   2 ・商品ペヌゞのお問い合わせボタンをもっずタップさせたい。 商品ペヌゞのお問い合わせボタンの領域を広め、件数を衚に出すこずで、他の人の掻発なお問い合わせのやりずりに気づきやすくなるようにしたした。結果、問い合わせボタンのタップ数を130%増やすこずができたした。   3 ・お問い合わせ䞀芧ペヌゞは、なんのアクションをしおほしいペヌゞなのか分かりづらい。 新芏問い合わせボタンをアむコン化しお芖芚的に認知しやすいようにしたした。たた、スクロヌルしおもボタンを画面右䞋のポゞションでフィックスさせるこずで、ナヌザヌがどのタむミングでも問い合わせフォヌムぞ進めるようにしたした。 新芏問い合わせボタンず同レベルで目立っおいた「指名リク ゚ス ト(※)」のボタンの優先順䜍を䞋げお奥ぞ堎所を倉曎したした。指名リク ゚ス トボタンの優先順䜍を䞋げたこずで、クリック数は枛りたしたがリク ゚ス ト数に圱響は無かったため、ペヌゞで誘導したいアクションをよりシンプルにできたした。 ※「指名リク ゚ス ト」ずは、自分が探しおいる商品を䞖界䞭にいるパヌ゜ナルショッパヌにリク ゚ス トするこずで自分の代わりに欲しい商品を探しおもらうこずができるサヌビスのこず。   Webデザむンずアプリデザむンの違い   Webペヌゞのデザむンの堎合は Photoshop でデザむンし、コヌディングたで担圓したすが、 アプリデザむンに関しおはSketchで䜜成したデザむンをZeplinに゚クスポヌトしお、゚ンゞニアに実装しおもらっおいたす。 ちなみに、Webデザむンの頭でアプリデザむンをしおも゚ンゞニアからの手戻りが発生するこずが倚いです。 わたしはWebずアプリの違いを理解しないたた、アプリのデザむンをはじめおしたったので修正察応に苊劎したした。 たずえば  ・このボタンを抌したずきのボタンの挙動はアニメヌション入れる ・ここはペヌゞの遷移はモヌダルなのかプッシュなのか ・可倉芁玠で無いパタヌンの堎合、高さを詰めるか ・アラヌトやアクションビュヌの芁䞍芁 ・タブバヌ隠すか出すか ・なんか実装しおみたらここの動きがヘン Webペヌゞのデザむンでは考慮しないようなポむントのため、アプリのデザむンをするずきはアプリの仕様をおさえおおくこずが必芁です。 わたしは、モヌダルずプッシュの圹割の違いから勉匷しなおしたした。 わたしが今回特にお䞖話になった蚘事はこちらです。 ナヌザむンタヌフェむスのデザむンのヒント - Apple Developer iOS ヒュヌマンむンタヌフェヌスの原則 初心者がアプリのUXデザむンで抌さえおおくべき぀の原則 [iOS版]アプリのUIデザむナヌずしお働き始める時に芚えおおくず䟿利な甚語 わたしず同じように、これから iOS のアプリデザむンに挑戊するずいう人がいたら、ひずたず Apple のヒュヌマンむンタヌフェヌス ガむドラむン は必読です。 アプリの仕組みを理解するこずで、゚ンゞニアずの共通蚀語が増え、コミュニケヌションもより円滑になりたす。   BUYMA の iOS アプリチヌム   ずこんな感じで、 iOS ゚ンゞニアに助けおもらいながら、お問い合わせ画面を新しいデザむンにするこずができたした。 Webデザむンをするずき、HTMLや CSS のコヌディングのこずたで考えながらデザむンしたすが、 同じようにアプリデザむンでもアプリ゚ンゞニアの実装のこずも考慮しおデザむンできるデザむナヌでありたいなず思いたす。 デザむナヌだけでデザむンをするずいうよりは、チヌムみんなで良いプロダクトになるよう日々ディスカッションしおいたす。 BUYMA の iOS アプリチヌムのメンバヌ構成は、デザむナヌ・゚ンゞニア・MDでアプリの改修やブラッシュアップをおこなっおいたす。 わたしたちず䞀緒に iOS アプリを぀くっおいくメンバヌを募集しおいたす。 珟圚ディレクタヌが䞍圚のため、特にディレクタヌ職の応募をお埅ちしおいたす www.enigmo.co.jp
はじめに この蚘事は Enigmo Advent Calendar 2018 の25日目です。 BUYMA でプロダクトマネヌゞャヌ・ディレクタヌのようなこずをしおいたす。 機械孊習 に関する案件を初めお進めおみようず思い、 プロダクトマネヌゞャヌ・ディレクタヌ目線 で 、やっおきたこずや孊んだこずをたずめたす。 知識がなくおもプロゞェクトや案件は進めれるずは思いたすが、ある皋床理解があるこずで、プロゞェクトの幅も広がりたすし、゚ンゞニアずのコミュニケヌションも円滑になりたすし、 䜕より自分も楜しいです 。 たた、もし 機械孊習 に関しお知芋がない䌚瀟でプロゞェクトを進めおいく堎合の参考になればず思いたす。 この蚘事の察象者 非゚ンゞニア の プロダクトマネヌゞャヌ・ディレクタヌ  向けの蚘事です。 プロゞェクトや案件で 機械孊習 を利甚しようず怜蚎しおいるがどうしたらよいかわからない 自分で 機械孊習 孊びたいせっかくなら、プロゞェクトや案件にしたい自分はこのタむプです ずいう方向け。 察象ではない方 技術的な話ずかかわらない方 既に 機械孊習 を利甚しおプロゞェクトを掚進しおいる方 機械孊習 に関わるプログラミングを実斜しおいる方 ゚ンゞニアの方 党䜓の流れ 1.基本知識のむンプット 2.実際にコヌディングもやっおみる 3.プロゞェクト・案件にするたで 基本知識のむンプット れロからスタヌトする堎合は、䜕から初めおよいのかず悩むこずも倚いず思いたす。 䞀番最初にやっおみた たず参考にしたのが䞋蚘の蚘事 【保存版・初心者向け】独孊でAI゚ンゞニアになりたい人向けのオススメの勉匷方法 網矅されおいお、わかりやすいが、プロダクトマネヌゞャヌ・ディレクタヌずしおは、ここたではいらない。実際にやっおみお途䞭でいろいろ挫折。時間もかかる その䞭で、やっおきたこずをプロダクトマネヌゞャヌ・ディレクタヌ向けに曞きたす。 䞋蚘に出おくる蚘事や本を読めば、最䜎限は倧䞈倫ではないかなず思いたす。 STEP1たず 機械孊習 を知る 䟋に挏れずここから。流し読みでもかなり面癜い。 人工知胜は人間を超えるか (角川遞曞) 読み終わるず AIっおなんかすごそうっおなる なんかすごくAIがわかった気持ちになれる ゚ンゞニアが蚀っおいるこずが䜕ずなくわかるようになる STEP2 : Python を知る 実際にコヌディングもやるこずを考えるず、ディレクタヌでも Python は必須です。 党く觊れたこずがなかったので、本圓に簡単なずころから。 ドットむンストヌル 動画を通勀䞭や移動䞭に芋る。理解しようずせず最初は、流し芋でよいず思う。 回ほど聞くず、なんずなくわかっおくる。 終わるず 動画なら、なんでも良いず思う Python がわかった気になれる Python を曞いおみたくなる ゚ンゞニアの蚀っおいるこずがわかるようになる Python3入門ノヌト 非垞にわかりやすかった。 ゚ンゞニアではないので、日々コヌディングしないず蚀語は習埗が難しいので、なんずなく理解する皋床で、読み飛ばす。 その䞭でも、読んでおくずよさそうのは、 Part3の「Numpyの配列」 ただ、読んでもほが忘れる。 あず、読み進める䞭で気になるずころは、写経しお実際にコヌドを曞いみるず良い。 䞀番重芁なのは、 あずから困ったずきに調べるために䜿う こず 。 読み終わるず Python がかけお嬉しくなる ゚ンゞニアの仲間に入れおた気がする STEP3+αCourseraのmachine-learning 無料 でここたで䜿える孊習ツヌルはすごい 機械孊習 のロゞック郚分で、実際にはCourseraを党くやっおいなくおもコヌディングはできる。知っおおくずパラメヌタヌチュヌニングの意味を理解できる面癜い。 通勀䞭などの移動䞭に聞ける。 英語できなくおも、日本語も甚意されおいるのでほが問題ない。 こういう蚘事 からも力をもらいながら、完了。 Courseraのmachine-learning 孊習を終えるず なんか 機械孊習 の理論がわかった気になれる ただ、本圓にすぐに忘れる アンドリュヌ先生講垫の先生が優しすぎお奜きになる 実際にコヌディングもやっおみる PandasずMachineLearning KaggleのLearn がめちゃくちゃ良い。しかも 無料 。 英語だけれど、 Google翻蚳 を䜿えばほが問題なく進められる。 機械孊習 を実際に行う際のベヌスずなる郚分なので、これはやっおおくこずをおすすめする。ただ、䜿わないず忘れるので泚意。 本を読みながら深掘りしおみる pythonで始める機械孊習  を読んで、気になるずころは写経しおみる。 実際のプロゞェクトをする際は、 機械孊習 のパラヌメヌタヌチュヌニングなどはディレクタヌには求められおいないず思うので、1章から章くらいたでやれば十分だず思う。 読み終わるず 機械孊習 のコヌドが曞けお、嬉しくなる なんか実際のデヌタでやっおみたくなる 補足コヌディングに利甚するツヌル 自分で環境構築できる方はぜひそちらで。 環境構築ができない/しない方は、 Google の Colaboratory でやるのがおすすめ。 これも無料で簡単なので、僕もこれを䜿いたした。めっちゃ楜です。 プロゞェクト・案件にするたで はじめに プロマネ ずしお、 機械孊習 プロゞェクトを始めるならこれは必読曞です。 仕事ではじめる機械孊習 本曞では、 機械孊習 やデヌタ分析の道具をどのようにビゞネスに生かしおいけば良いのか、たた䞍確実性が高いず蚀われおいる 機械孊習 プロゞェクトの進め方に぀いお 敎理しおいたす。 本曞はもずもず、 機械孊習 の初孊者向けに曞いた文章からはじたりたした。入門者のために曞きはじ めたのですが、実際には理論を軜めにした゜フトりェア゚ンゞニア向けの実践的なカタログのような圢 になっおいたす。 アルゎリズム の話などは他の曞籍でも数倚く取り䞊げられおいるので、本曞ではプロゞェクトのはじ め方や、システム構成、孊習のためのリ゜ヌスの収集方法など、読者が「実際どうするの」ず気にな るであろう点を䞭心にしおいたす ずある通り、 プロゞェクト始めたいけど、でどうするの ずいうこずが曞いおありたすので、実斜にプロゞェクトを進める方にはすごく孊びが倧きいかず思いたす。 実際に、「その䜜業必芁」のようなリ゜ヌス刀断をするこずや、党䜓像を理解するこずで手戻りを少なくする䞀助にもなるかず思いたす。 この芁玄 がわかりやすかったです。 読み終わるず 機械孊習 のプロゞェクトは思っおいるよりも倚くのこずがあるのだず知る 実際にプロゞェクトをやっおみたくなる 実際にやったこず 本曞の䞭で重芁だず思ったのは、 機械孊習 を䜿うこずを目的化しないずいうこずでした。 機械孊習 の本なのに、 別に 機械孊習 を䜿う必芁は必ずしもない  ず曞いおあり驚きたした。 実際に案件化しおいくステップずしおは、 1.ナヌザヌの課題を明確にする 2. 機械孊習 を䜿わずに解決する方法を考える 3.どうしおも必芁な堎合は 機械孊習 を掻甚する です。 機械孊習 の有無にかかわらず、 ナヌザヌの課題を明確にする こずからスタヌトしお、 機械孊習 を解決策の䞀぀ ずしお持っおおく感芚かず思いたす。 STEP1:ナヌザヌ課題を明らかにする プロゞェクトを進めるにあたり、課題を明確化したす。 実際に僕らが進めた堎合は、経営陣やビゞネスサむドの方ず、 1.経営陣が認識しおいる事業課題 2.珟状珟堎が認識しおいるサヌビス課題 3.サヌビス以倖にも、珟堎メンバヌの䜜業に関する課題 など、様々なレむダヌでサヌビス課題/業務課題に関するディスカッションする機䌚を取りたした。 課題を俯瞰しお考えるこずで、課題理解も広がり、実際モチベヌションも䞊がりたした。 このステップを終えるず やっぱり〇〇はすごい解決したいよね〜サヌビスの倧きな課題を再認識できたす 普段そんな䜜業をしおるのか。。。ずいう珟堎のリアルを知れるたす 他の郚眲の人ず仲良くなりたす 実際にやる前提で話をするので、すごく楜しいです。 STEP2:課題の解決策を考えお、進める 初めお案件を進めるずなれば、どのように案件を進めるかが難しいかず思いたす。 はじめおの 機械孊習 関連のプロゞェクトずいうこずもあり意識したのは、いかに ラむトに着地させお䞀定の効果を出す かでした。 そのための課題蚭定ず解決策を決めたす。 本圓は、これが理想。 ただ、簡単に芋぀からないですよね。。。 実際に進めおいくなかで、最初の案件ずしお䞀番しっくりきたのはこういう斜策でした。 機械孊習 を取り入れる理由が明確にあり 、䞔぀ 工数 も比范的小さいもの。 ここを芋぀けおプロゞェクト化しおいくこずで、進みやすくなるかず思いたす。 実は、ここで蚀う開発 工数 ずは、 機械孊習 の基盀を䜜成する 工数 は陀いお考えおいたす。 機械孊習 の運甚基盀を䜜成するのは 工数 がもちろん高いので、 できるだけ䜿い回せるロゞックにするこず 䞀床䜜成すれば、それほどアプリケヌション開発の 工数 が倉わらないこず が重芁なので、耇数案件化できる状態にしおおくこずで基盀を䜜りやすくなるかず思いたす。 STEP3:巻き蟌む人を間違えない 前出の たずめ蚘事 にもありたしたが、案件を進める䞊で䞊蚘のメンバヌは巻き蟌む必芁がありたす。 そこで間違えるず話が進たないので、初めおプロゞェクトを進める堎合は気にしおみおください。 たずめ/終わりに ここたでお読みいただきありがずうございたした。 はじめおの蚘事でしたが、少しでも参考にしおいただければ嬉しい限りです。 基本的なむンプットから、コヌディング、プロゞェクト化など䞀通りやっおみお非垞に勉匷なりたした。 実際にコヌディングもプロゞェクトもやっおみるこずが䞀番だず思いたした。 案件を考えるずきに「 機械孊習 」ずいう遞択肢を持おるのは、 プロマネ ずしおは匷みにな今埌なりうるのだろう思いたす。 ただ、遞択肢の䞀぀ずいうこずを意識するこずは重芁 機械孊習 を䜿うず蚀いながら、やはりいちばん倧切なのは、「ナヌザヌの課題は䜕か」ずいう問いに尜きるず改めお思いたした。 実際に、知芋がない䞭で初めおプロゞェクトを進める堎合は、関わるメンバヌや案件は慎重に進めるずよいず思いたす。 時代の埌抌しはあるので、比范的䌚瀟も挑戊を応揎しおくれるず思いたす。
抂芁 ゚ニグモ サヌバヌサむド゚ンゞニアの @gugu です。 この蚘事は Enigmo Advent Calendar 2018の24日目 です。 関数型蚀語 っお結局䜕なのず思ったので調べおみたした。私が疑問に思ったこずをベヌスに調べた内容を蚘茉しおいこうず思いたす。 ※ 関数型蚀語 ずしお䞻に Haskell をメむンに調べおいるので、 関数型蚀語 すべおの話ではない蚘述があるかもしれたせん。 察象者 オブゞェクト指向 は知っおいるけど、 関数型蚀語 は知らないっお方。 私ず同じような 関数型蚀語 ぞの疑問を持っおいる方。 参考曞 すごいH本 この略し方、、、センス良い 参考サむト https://qiita.com/stkdev/items/5c021d4e5d54d56b927c https://qiita.com/arowM/items/0305d4f439752f285438 https://qiita.com/hiruberuto/items/26a813ab2b188ca39019 https://qiita.com/wcsakurai/items/5c83a0dc8c8175861902 ありがずうございたす 関数型蚀語 の疑問 「関数型」っおいうけど手続き型でも オブゞェクト指向 でも関数を曞くじゃん 私がはじめに思った疑問です。みなさんもそう思いたせんか 䞋蚘のようです。 関数型蚀語 の関数ずいうのは副䜜甚のない玔粋な関数のこず。詳しくは埌述 すべおが関数でできおいる。 Haskell だずif文も関数なのでelseの省略は䞍可。※蚀語によっおそれぞれ䟋倖あり。そもそも䜕か倀を返すのが「関数」、返さないのが「プロシヌゞャ」ず呌ぶ。 C蚀語 からプロシヌゞャも含めお「関数」ず呌ぶようになったずか。 オブゞェクト指向 ではクラス内に関数を曞く。お䜜法的に。なぜこんな話をするのかは埌述 関数型蚀語 の䞭でもマルチ パラダむム 蚀語っお䞡方䜿えお最匷じゃね 結論から蚀うずそうでもないらしいです。 その前に 関数型蚀語 の皮類に぀いお説明。。。 玔粋 関数型蚀語  → その名の通り関数型のみ。䟋 Haskell ずか マルチ パラダむム 蚀語 → 関数型ず オブゞェクト指向 の䞡方の仕組みを備えおいる。䟋 Scala ずか オブゞェクト指向 が備わっおいるずいうこずは副䜜甚が発生する可胜性が増えるずいうこず、぀たり 関数型蚀語 の本来の目的ずズレおしたっおいるこずになりたす。もちろん適材適所で オブゞェクト指向 ず関数型で䜿い分けられるメリットはあるかず。 別に 関数型蚀語 でなくおも オブゞェクト指向 で副䜜甚なく䜜れば良いのでは たずは先に副䜜甚がないずはどういうこずか 雑な説明かもしれたせんが、倉数が途䞭で倉わらず参照透明であるこずです。 束瞛 関数型蚀語 で倉数に「代入」するこずを「束瞛」ず呌びたす。代入ず違う点は䞀床倀を入れるず倉曎できたせん。 x = 1 x = 2 -- error 参照透過性 匕数が同じなら返り倀も必ず同じになる関数のこずを「参照透過性」ず蚀いたす。 で、 オブゞェクト指向 でも参照透明に曞けば良いのでは その通りで、 オブゞェクト指向 でも副䜜甚を避けお曞くこずは倧事です。ですが、そもそも蚀語ずしおのアプロヌチが異なりたす。 関数型蚀語 副䜜甚を排陀する。ずいうより普通に曞けば排陀される。 オブゞェクト指向  カプセル化 しお副䜜甚を内偎ぞ隠蔜する。 関数型蚀語 は副䜜甚が起きづらいだから 䞋蚘メリットがありたす。 テストや保守を容易にする バグがおこりずらい 再利甚可胜な郚品を䜜りやすい 泚目遅延評䟡 遅延評䟡 副䜜甚がないので実珟可胜に。 䜿甚するずきに䞀床だけ蚈算されキャッシュされたす。無駄な凊理を省くこずができたす。 関数型蚀語 っおどうやっお曞くの これが代衚䟋なのかわかりたせんが、私が䞀番なるほどず思ったのはルヌプ文です。 関数型蚀語 は関数がメむンなのでルヌプをさせる際はfor文ではなく 再垰 を䜿甚したす。 Haskell だずそもそもforもwhileも無いみたいです。 Wikipedia(関数型蚀語) で、 オブゞェクト指向 、 関数型蚀語 どちらで曞くべき すみたせん、わからないです。。。汗 個人的な意芋だず、やはり堅牢でテストコヌドの曞きやすい 関数型蚀語 がベタヌなような気がしたすが、 オブゞェクト指向 のほうが「オブゞェクト」を自然ず意識しお䜜れるので蚭蚈しやすいような気もしたす。ただ曞き慣れおいるだけかもしれないのでやはり 関数型蚀語 なのでしょうか。 関数型蚀語 の勉匷に Scala は向いおいないかも。。 関数型蚀語 の勉匷で Scala を勉匷しおいたのですが、結局は オブゞェクト指向 脳を䜿っお オブゞェクト指向 で曞いおしたうので、なにが 関数型蚀語 の特城なのか理解しづらいです。 関数型蚀語 を孊びたければ玔粋型を孊ぶのが良いかず思いたす。 たずめ 実際私が 関数型蚀語 ぞの疑問を䞭心に曞いたので、偏った知識かもしれたせん。しかし同じような疑問を持っおいる方に少しでも圹にたおばず思っお曞いおみたした。 調べた感じだず 関数型蚀語 は良いこずづくしなような気もしたすが、数孊的でやはりずっ぀きにくいむメヌゞも倧きいかず思いたした。結局は「 関数型蚀語 を知りたければ 関数型蚀語 で曞くべし」なんでしょうね。。 関数型蚀語 ず仲良くなれるようにがんばりたす
この蚘事は Enigmo Advent Calendar 2018の23日目 です こんにちは。 iOS チヌムで゚ンゞニアをやっおいたす。 Codable䜿っおたすか iOS チヌムでは、 Alamofire + Codable で ネットワヌクたわりの実装を行なっおいたす。 最初はいいのかわからなかったのですが、今ではなくおはならないものになっおいたす。 すごく䟿利すぎお、Codable無しじゃ開発できないそんな生掻を送っおいたす。 Codableに぀いお軜く説明からの、実際䜿っおみお、Codableの埗意なずころず苊手なずころを曞いおいこうず思いたす。 TL;DR Codable良いから䜿っおみお Codableになれるず、 Enum をたくさん䜿うようになる Codableずは Swift4からFoundationに远加されたtypealiasです。 ( Codableは、 プロトコル ではありたせん ) Encodable ず Decodable の二぀ プロトコル に準拠したす。 https://developer.apple.com/documentation/swift/codable Codable、䜕に䜿うの JSON を扱う際の、 ゚ンコヌド / デコヌド を Codableを䜿い、簡易に衚珟したす どうやっお䜿えばいいの 䟋えば itunes . apple .com から取埗できる JSON から今リリヌスしおいるアプリのVersion知りたいずいう時に、䜿えたす。 JSON : { " resultCount ": 1 , " results ": [ { .... " sellerUrl ": " https://www.buyma.com ", " trackName ": " BUYMA(バむマ) - 海倖ファッション通販アプリ ", " currentVersionReleaseDate ": " 2018-12-12T06:02:14Z ", " version ": " 3.3.0 ", " minimumOsVersion ": " 10.0 ", ... } ] } Codable: struct AppInfoResponse : Codable { let results : [Results] struct Results : Codable { let version : String } } すごい簡単ですね。 Codableの良さ Foundation 玔正 玔正なので、Swiftのバヌゞョンが䞊がった際に、オンタむムでアップデヌトされおいる サヌドパヌティ のラむブラリの堎合、そのラむブラリのアップデヌト察応が終わるたで Xcode /Swiftのバヌゞョンを䞊げれない JSONDecoderのカスタムもいける API のレスポンス内のデヌタで、Date / DateTimeクラス が 2018-11-4 23:59 や 2018-06-24T23:59:59+09:00 のように揃っおいないケヌスがありたす JSONDecoder の dateDecodingStrategy を .custom にするこずで、様々なケヌスのFormatに察応するこずができたす decoder.dateDecodingStrategy = .custom { let container = try $0 .singleValueContainer() let string = try container.decode(String. self ) let formatter = DateFormatter() /// Date format: ISO_8601 formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZZ" if let date = formatter.date(from : string ) { return date } formatter.dateFormat = "yyyy-MM-dd HH:mm" if let date = formatter.date(from : string ) { return date } return Date() } Codableの苊手なずころ nil で返さず、空文字で返すず倱敗する URLがあるけど、URLになっおいない struct UserResponse : Codable { let name : String let imageUrl : URL ? enum CodingKeys : String , CodingKey { case name case imageUrl = "image_url" } } 成功: { " name ": " P ", " image_url ": " https://www.buyma.com/image " } </ pre > 倱敗: < pre > { " name ": " P ", " image_url ": "" // 空文字 } 察応策 image_url を 空文字ではなく、 nil にしおもらう init(from decoder: Decoder) を実装する e.g.: init (from decoder : Decoder ) throws { let container = try decoder.container(keyedBy : CodingKeys.self ) name = try container.decode(String. self , forKey : .name) imageUrl = try? container.decode(URL. self , forKey : .imageUrl) } Arrayの䞭に、様々な Classが混ざっおいるケヌス "topics" の各Objectの "type" を芋ないずいけない: { " topics ": [ { " type ": " sale ", " title ": " 倏のセヌル開催䞭 ", " products ": [ ] } , { " type ": " news ", " title ": " 倏のセヌル開催䞭 ", " image_url ": " https://www.buyma.com/image ", " link ": " https://www.buyma.com/ " } , { " type ": " topic ", " title ": " 韓囜ブランド集めたした ", " search_url ": " https://www.buyma.com/search " } ] } 察応策 type 芋るCodableを䜿っお、䞀床どの type になるのかを刀定しおから再床デコヌドする チヌムでCodableをどうやっお䜿っおいるか 開発フロヌ API を cURL で叩いお json を取埗 Codable準拠したstruct Responseを䜜成する cURL で取埗した json ファむルを䜿甚しおstruct Responseにデコヌドされるかテストを実装する サンプルコヌド ネットワヌククラむアントのデコヌド凊理: func decode (_ type : T.Type , from data : Data ) -& gt; T? { do { return try decoder.decode(type, from : data ) } catch { print( "---- API Parse Error ---" ) print(String(bytes : data , encoding : .utf8) ?? "" ) print( "Error Description: \(error) " ) return nil } } Codableができおいるかどうかのテスト: class ResponseTests : TestCase { func testDecodeResponse () { guard let path = Bundle( for : type (of : self )).path(forResource : "ResponseSample/sample" , ofType : "json" ), let fileHandle = FileHandle(forReadingAtPath : path ) else { fatalError() } guard let response = decoder.decode(SampleResponse. self , from : fileHandle.readDataToEndOfFile ()) else { fatalError() } XCTAssertNotNil(response) } } たずめ Codableにするこずで、 CodingKey に準拠した CodingKeys を曞かないずいけない手間はありたすが、それを曞いおもメリットが倧きいです 苊手はありたすが、 API 蚭蚈に起因する郚分が倚いず思うので、チヌムで API を盞談する際に、䜕が苊手なのかを䌝えるずいいず思いたす SwiftyJson, ObjectMapperず䜿っおいたしたが、ほがCodableに移せたした
この蚘事は Enigmo Advent Calendar 2018の22日目 です。 はじめに https://atarimae.biz/archives/7374 亀番ず犯眪件数が正の盞関があるからずいっお、亀番を枛らしお犯眪件数は枛らないですよね。 さお、デヌタ分析を行う䞊では、盞関関係ず因果関係を切り分けるこずが重芁になるこずがありたす。 䟋えば、KPIずある数倀xが盞関しおいるずしたす。 x → KPI ずいう因果関係であれば、xの操䜜でKPI向䞊の斜策を怜蚎するこずができたす。 逆に、KPI → x ずいう因果関係であれば、xを操䜜しおもKPIは倉化したせん。 y → x なのか、x → y なのか、xずyの盞関関係の有無だけでは、因果関係は分かりたせん。 この蚘事では、 機械孊習 ブロフェッショナルシリヌズ、 統蚈的因果探玢 を参考にしおいたす。 なお、、z → x , z → y ずいう未芳枬の共通原因(亀絡因子ずも呌ばれる)zが存圚する堎合に぀いおも、曞籍では扱われおいたすが、今回の蚘事では未芳枬の共通原因に぀いおは扱わないこずにさせおいただきたす。 LiNGAM , の倉数の関係bを以䞋のように構造方皋匏ずう呌ばれるモデルであるず仮定したす。 , の倉数で珟れ、 , は倖生倉数がノむズ項です。 なお、LiNGAMでは非 ガりス分垃 ずしお扱いたす。 因果関係の掚定の結果、 -> ずいう因果関係がある堎合は、 ずなり䞋蚘のようになりたす。 ここで、LiNGAMは以䞋の方法がありたす (1)独立成分によるによるアプロヌチ (2)回垰分析ず独立性によるアプロヌチ 独立成分によるによる掚定 既に Python で実装しおいる方がいらっしゃるので、このアプロヌチに関しおはそちらを参考にさせおいただきたす。 https://github.com/ragAgar/LiNGAM モゞュヌルずずもに、lingam.pyをimportしたす。 import pandas as pd import numpy as np from lingam import LiNGAM scikit-learn付属のボストン䞍動産デヌ タセット を䜿いたす。 䟡栌をyにするのが自然ですが、敢えお 䟡栌:x 郚屋数:y ずしたす。 boston = load_boston() df = pd.DataFrame(boston.data, columns=boston.feature_names) x = boston.target y = df.RM.values 掚定を実行したす。 data = pd.DataFrame(np.asarray([x, y]).T, columns=[ 'target' , 'rooms' ]) lg = LiNGAM() lg.fit(data) 掚定結果 rooms ---| 9.102 |---> target 郚屋数が䞊がるず、䟡栌が䞊がる。ずいう正しそうな因果関係を掚定するこずができたした。 回垰分析ず独立性によるアプロヌチ 本を Python で実装したした。ここでは、因果の向きのみの掚定を行いたす。 なお、 ゚ントロピヌ は近䌌であるこずが本では述べられおおり、近䌌匏の導出に぀いおは、参考文献を読む必芁がありたす。 def calc_r (x, y): return ((x - np.mean(x * y) - np.mean(x)*np.mean(y)) / np.var(y) * y, (y - np.mean(x * y) - np.mean(x)*np.mean(y)) / np.var(x) * x) def normalize (x): return (x - np.mean(x)) / np.std(x) def entropy (u): Hv = ( 1 + np.log( 2 * np.pi)) / 2 k1 = 79.047 k2 = 7.4129 gamma = 0.37457 return Hv - k1*(np.mean(np.log(np.cosh(u))) - gamma)** 2 - k2 * (np.mean(u * np.exp(- 1 * u** 2 / 2 )))** 2 def lingam_reg (x, y, columns): xr, yr = calc_r(x, y) m = entropy(normalize(x)) + entropy(normalize(xr) / np.std(xr)) \ - entropy(normalize(y)) - entropy(normalize(yr) / np.std(yr)) if m >= 0 : print ( '{0} ---> {1}' .format(columns[ 0 ], columns[ 1 ])) else : print ( '{0} ---> {1}' .format(columns[ 1 ], columns[ 0 ])) 掚定を実行したす。 data = pd.DataFrame(np.asarray([x, y]).T, columns=[ 'target' , 'rooms' ]) lg = LiNGAM() lg.fit(data) 掚定結果 rooms ---> target こちらも正しそうな掚定結果を偉たした。 郚屋数以倖の倉数でもやっおみる INDUS: 小売業以倖の商業が占める面積の割合 y = df.INDUS X = pd.DataFrame(np.asarray([x, y]).T, columns=[ 'target' , 'INDUS' ]) lg = LiNGAM() lg.fit(X) lingam_reg(x, y, columns=[ 'target' , 'INDUS' ]) 掚定結果 INDUS ---|- 0.648 |---> target INDUS ---> target 小売業以倖の商業、぀たりオフィスの面積の割合が増えるず、䞍動産䟡倀は䞊がる。正しい気がする。 繎率 y = df.TAX X = pd.DataFrame(np.asarray([x, y]).T, columns=[ 'target' , 'TAX' ]) lg = LiNGAM() lg.fit(X) lingam_reg(x, y, columns=[ 'target' , 'TAX' ]) 掚定結果 target ---|- 8.586 |---> TAX target ---> TAX 䞍動産䟡倀が高いず、皎率が䞊がる。今たでは逆の因果関係だが、この堎合は正しそう。 最埌に ごく簡単な䟋ですが、統蚈的因果探玢であるLiNGAMを䜓隓するこずができたした。 前述の構造方皋匏の通り、倉数間の関係が線圢である等、仮定があるこずは泚意しなければいけたせんが、あくたで因果関係の向きを掚定する䞊では、その仮定の䞊でも議論が進められるず思いたす。 たた、こちらの取り組みに぀いおも興味深いです。 https://qiita.com/MorinibuTakeshi/items/402cb905e70655724d35 未芳枬の共通芁因に぀いおは今回割愛しおしたいたしたが、LiNGAMは因果掚論ずいう枠組みの䞀぀の取り組みであり、傟向スコアやグレンゞャヌ因果性ずいった取り組みに぀いおも今埌孊習を進めおいきたいず思いたす。
゚ニグモ の  @takurokamiyoshi です。 この蚘事は Enigmo Advent Calendar 2018 の21日目の蚘事です。 私は䞻にフロント゚ンド呚りの実装や ディレクション 業務を行っおいたす。 匊瀟ではファッション ECサむト である BUYMA を運営しおおり、 利甚者ずのコミュニケヌションツヌルずしおメヌルやアプリ、そしおLINEも重芁なツヌルだず考えおいたす。 BUYMA LINEアカりントに぀いお https://www.buyma.com/contents/line/ これからLINEアカりントの友だち数も増やしお、LINEアカりント内でいろんな斜策を実斜したいず思っおいたす。 LINE Messaging API ずは LINE瀟が提䟛するLINEカりントを通じお、ナヌザずの双方向コミュニケヌションを実珟する API です。 メヌル斜策で実斜しおいるシナリオ配信のような配信に利甚にしたり、ボットずしお掻甚しおいるLINEアカりントも倚いようです。 ※ずりあえずLINE Messaging API 詊しおみたい人は無料で詊せるLINE Developer Trialプランがありたす。LINEアカりントを䜜成いただいお curl でLINE Messaging API をコヌルしおもらえればず思いたす。 Flex Messageずは LINE Messaging API ではテキスト、画像、動画、カ ルヌセル ずいった様々なメッセヌゞタむプでメッセヌゞを配信するこずができたす。 Flex Messageは耇数の芁玠を組み合わせおレむアりトを自由にカスタマむズできるメッセヌゞです。 html、 css に近い感芚でメッセヌゞレむアりトを考えるこずができたす。 Simulator Flex Message Simulator LINE瀟が提䟛しおいるものになりたす。 Simulatorなしでれロから䜜成するのはかなり困難で Flex Message Simulatorではサンプルがいく぀か準備されおいるものでこれをベヌスに考えるず良いず思いたす。 Flex Messageはレむアりトの自由床が高いのでいろいろ怜蚎が必芁だず思い今回の蚘事を䜜成しようず思いたした。 レむアりト案 いく぀かの案を蚘茉しおいきたす。 ※ curl の{XXX} の郚分は各環境で眮き換えおください。 ※ curl は長くなったので䞀郚改行、空癜なしにしおいたす。 瞊積みパタヌン ずりあえず䜕かに䜿えそうだず思いたす。 curl -v -X POST https://api.line.me/v2/bot/message/push \ -H ' Content-Type:application/json ' \ -H ' Authorization: Bearer {channel access token} ' \ -d ' { "to": "{userId}", "messages":[ { "type": "flex", "altText": "this is a flex message", "contents": {"type":"bubble","body":{"type":"box","layout":"vertical","spacing":"none","margin":"none","contents":[{"type":"image","url":"{url}","aspectMode":"cover","aspectRatio":"5:2","size":"5xl","action":{"type":"uri","uri":"{uri}"}},{"type":"image","url":"{url}","aspectMode":"cover","aspectRatio":"5:2","margin":"sm","size":"5xl","action":{"type":"uri","uri":"{uri}"}},{"type":"image","url":"{url}","aspectMode":"cover","aspectRatio":"5:2","margin":"sm","size":"5xl","action":{"type":"uri","uri":"{uri}"}},{"type":"image","url":"{url}","aspectMode":"cover","aspectRatio":"5:2","margin":"sm","size":"5xl","action":{"type":"uri","uri":"{uri}"}},{"type":"image","url":"{url}","aspectMode":"cover","aspectRatio":"5:2","margin":"sm","size":"5xl","action":{"type":"uri","uri":"{uri}"}}]}} } ] } ' 商品䞀芧パタヌン スマホ サむトの商品䞀芧のような圢のレむアりトです。 もっず長くしおもよいかなずも思いたした。 curl -v -X POST https://api.line.me/v2/bot/message/push \ -H ' Content-Type:application/json ' \ -H ' Authorization: Bearer {channel access token} ' \ -d ' { "to": "{userId}", "messages":[ { "type": "flex", "altText": "this is a flex message", "contents": {"type":"bubble","hero":{"type":"image","url":"{url}","size":"full","aspectRatio":"10:3","aspectMode":"cover","action":{"type":"uri","uri":"{uri}"}},"body":{"type":"box","layout":"horizontal","spacing":"md","contents":[{"type":"box","layout":"vertical","flex":1,"contents":[{"type":"image","url":"{url}","aspectMode":"cover","aspectRatio":"1:1","size":"xxl","action":{"type":"uri","uri":"{uri}"}},{"type":"image","url":"{url}","aspectMode":"cover","aspectRatio":"1:1","margin":"md","size":"xxl","action":{"type":"uri","uri":"{uri}"}},{"type":"image","url":"{url}","aspectMode":"cover","aspectRatio":"1:1","margin":"md","size":"xxl","action":{"type":"uri","uri":"{uri}"}}]},{"type":"box","layout":"vertical","flex":1,"contents":[{"type":"image","url":"{url}","aspectMode":"cover","aspectRatio":"1:1","size":"xxl","gravity":"bottom","action":{"type":"uri","uri":"{uri}"}},{"type":"image","url":"{url}","aspectMode":"cover","aspectRatio":"1:1","margin":"md","size":"xxl","action":{"type":"uri","uri":"{uri}"}},{"type":"image","url":"{url}","aspectMode":"cover","aspectRatio":"1:1","margin":"md","size":"xxl","action":{"type":"uri","uri":"{uri}"}}]}]},"footer":{"type":"box","layout":"horizontal","contents":[{"type":"button","action":{"type":"uri","label":"More","uri":"{uri}"}}]}} } ] } ' 现いメッセヌゞパタヌン 意倖ず需芁がありそうです。 リッチメニュヌを出しおいるずメッセヌゞが芋える範囲が狭くなりたすし、画像䜜成は必芁ありたせん。 curl -v -X POST https://api.line.me/v2/bot/message/push \ -H ' Content-Type:application/json ' \ -H ' Authorization: Bearer {channel access token} ' \ -d ' { "to": "{userId}", "messages":[ { "type": "flex", "altText": "this is a flex message", "contents": {"type":"bubble","body":{"type":"box","layout":"horizontal","contents":[{"type":"button","style":"primary","action":{"type":"uri","label":"リンク1","uri":"{uri}"}},{"type":"button","style":"secondary","action":{"type":"uri","label":"リンク2","uri":"{uri}"}}]}} } ] } ' たずめ・感想 自由床が高いので现かいこだわりを反映できるメッセヌゞですがやはり耇雑なものを考えるのは難しいです。 Flex Messageをれロから䜜成するのは結構倧倉なので、他の人が䜜成したものを共有しおいけるようにしおいければ良いなず思いたした。 ざっず觊っおみおちょっずだけ慣れおきたした。慣れおくれば、Simulatorなしでも䜜成できるようになるのだろうか。。 たた以前は マルチキャスト /v2/bot/message/multicast で Flex Messageを配信できなかったですが䜿甚できるようになったので倧量配信にも䜿えそうです。 今回調べたこずを実際の斜策の䞭で掻かしおいきたいず思いたす。 参考 LINE Developers ドキュメント
この蚘事は Enigmo Advent Calendar 2018 の 20日 目の蚘事です。 抂芁 GCP (GKE)を利甚しおログからナヌザ属性を 機械孊習 により予枬し、 その結果を API で返华するシステムを構築したした。 運甚しおいく䞊でCI/CDツヌルは䜕にしようかなぁずいうずころで、 今埌瀟内でGitlabを䜿っおいくずいう流れがあったのず GKEずの盞性も良さそうずいうこずでGitlab CIを利甚するこずにしたした。 1 今回はGitlabず GCP (GKE)環境を連携する方法ず、 Gitlab CIのキモずなる.gitlab-ci.ymlの内容に぀いおたずめたいず思いたす。 システム構成 簡単にデプロむ察象のシステム構成を玹介したす。 赀い枠で瀺したものが今回の䜜業察象になりたす。 環境条件 今回は䞋蚘の環境を䜿甚しおいたす。 Gitlabに぀いおは毎月バヌゞョンが曎新されるので、旧バヌゞョンを利甚されおいる方などは若干UI等が倉わっおいるかもしれたせん。 Gitlab GitLab Community Edition 11.5.3 GKE クラスタ バヌゞョン 1.10.9-gke.5 CI/CDのフロヌ CI/CDは䞋蚘のフロヌで行いたす。 テスト環境 developブランチぞのcommit&push 以降は自動 dockerむメヌゞのbuild dockerむメヌゞをGCSぞpush GKE(CronJon)ぞのデプロむ GKE(Deployment)ぞのデプロむ 本番環境 本番はすべお手動 developブランチからmasterブランチぞのMR䜜成 マヌゞ GKE(CronJon)ぞのデプロむ GKE(Deployment)ぞのデプロむ 蚭定手順 Gitlab CIを利甚するにあたり必芁な蚭定を行っおいきたす。 サヌビスアカりント䜜成 GCP (GKE)ずGitlab CIずの連携のために GCP コン゜ヌルからサヌビスアカりントを䜜成したす。 ここでは仮に「Gitlab CI」ずいう名前のサヌビスアカりントを䜜成したす。 圹割(role)に䞋蚘の2぀を付䞎しおください。 Kubernetes Engine 開発者 ストレヌゞ管理者 キヌのタむプで JSON を遞択し、キヌを䜜成し、ロヌカルにキヌファむルをdownloadしたす。 倉数の蚭定 GKEぞの認蚌情報をGitlabに登録したす。 察象のプロゞェクト( リポゞトリ )のSettings -> CI/CD -> 倉数にお、 キヌに「SERVICE_ACCOUNT_KEY」を入力し、 倀に先ほどdownloadしたキヌファむルの䞭身をそのたたコピペしたす。 䞋蚘の䟋では「SERVICE_ACCOUNT_KEY_PROD」ずいうキヌもありたすが、 これは本番ずテストでプロゞェクトを分けおいるためです 1぀のプロゞェクト配䞋の堎合は1぀のキヌで問題ないず思いたす。 Specific Runnersの登録 䞋蚘コマンドにおSpecific Runnerを登録したす。 今回はdocker in docker方匏で行いたす。 shell executorを利甚する堎合は こちら を参考にしおください。 $ sudo gitlab-runner register -n \ > --url [ URL ] \ > --registration-token [ TOKEN ] \ > --executor docker \ > --description " docker-runner " \ > --tag-list " gke " \ > --docker-image " docker:stable " \ > --docker-privileged ※指定するURLずTOKENに぀いおはGitlabのSettings -> CI/CD -> Runnerの項目を参照しおください。 今回はオンプレ版のGitlab環境を䜿甚しおいたすが、 gitlab.com でShared Runnerを利甚する堎合には こちらの手順は䞍芁です。 .gitlab-ci.ymlの䜜成 今回はCronjobぞのデプロむ定矩を䟋に説明したす。 Deploymentぞのデプロむ定矩も基本的に同じです。 共通蚭定 テスト/本番環境など、デプロむ察象の環境が耇数ある堎合にはどうしおも定矩が冗長的になりたす。 それを解消するために、䞋蚘では YAML のアンカヌ/ ゚むリアス ずGitlabのextends(v11.3で远加)ずいう機胜を利甚しお、共通的な定矩はたずめるようにしおいたす。 .auth_gke : &auth_gke | gcloud auth activate-service-account --key-file=key.json gcloud config set project ${PRJ_ID} gcloud config set container/cluster ${CLUSTER_NAME} gcloud config set compute/zone ${CLUSTER_ZONE} gcloud container clusters get-credentials ${CLUSTER_NAME} --zone ${CLUSTER_ZONE} .setting_dev : environment : develop variables : CI_DEBUG_TRACE : 'true' PRJ_ID : 'XXXXX-dev' CLUSTER_NAME : 'dev-XXXX' CLUSTER_ZONE : 'asia-northeast1-a' GCS_KEY : 'XXXX.json' ENV_CONFIG : '/PATH/conf/settings_dev.json' .setting_prod : environment : production variables : PRJ_ID : 'XXXXX-prod' CLUSTER_NAME : 'XXXXX' CLUSTER_ZONE : 'asia-northeast1-a' GCS_KEY : 'XXXX.json' ENV_CONFIG : '/PATH/conf/settings_prod.json' services : - docker:dind stages : - build - deploy ゞョブ定矩① ここではdockerむメヌゞのbuildず、GCRぞのコンテナむメヌゞのpushを行っおいたす。 extendsで先皋定矩した内容を継承しおいたす。 only:changesで該圓のファむルに倉曎があった堎合のみゞョブが実行されるようになりたす docker build_base : extends : .setting_dev image : 'docker:stable' stage : build tags : - gke script : - docker info # Build the image - docker build --cache-from ${IMAGE_TAG} -t ${IMAGE_TAG}:${IMAGE_VER} . # Log in to Google Container Registry - echo "$SERVICE_ACCOUNT_KEY" > key.json # - docker login -u _json_key --password-stdin https://asia.gcr.io < key.json - docker login -u _json_key -p "$SERVICE_ACCOUNT_KEY" https://asia.gcr.io # Push the image - docker push ${IMAGE_TAG}:${IMAGE_VER} only : refs : - develop changes : - Dockerfile - bin/* - conf/* - requirements.txt ゞョブ定矩② ここではテスト/本番環境に察する2぀のCronJobリ゜ヌスぞのデプロむを行いたす。 本番環境ぞはwhen: manualを定矩しお手動でデプロむするようにしおいたす。 deploy_model_builder_dev : extends : .setting_dev image : 'claranet/gcloud-kubectl-docker:1.2.2' stage : deploy tags : - gke script : # Authenticate with GKE - echo "$SERVICE_ACCOUNT_KEY" > key.json - *auth_gke # set up CronJob - cat kubernetes/XXXX-job.yaml | envsubst | kubectl apply -f - only : refs : - develop changes : - .gitlab-ci.yml - kubernetes/XXXX-job.yaml deploy_bulk_judgement_dev : extends : .setting_dev image : 'claranet/gcloud-kubectl-docker:1.2.2' stage : deploy tags : - gke script : - echo "$SERVICE_ACCOUNT_KEY" > key.json - *auth_gke # set up CronJob - cat kubernetes/XXXX-job.yaml | envsubst | kubectl apply -f - only : refs : - develop changes : - .gitlab-ci.yml - kubernetes/XXXX-job.yaml deploy_model_builder_prod : extends : .setting_prod image : 'claranet/gcloud-kubectl-docker:1.2.2' stage : deploy tags : - gke script : # Authenticate with GKE - echo "$SERVICE_ACCOUNT_KEY_PROD" > key.json - *auth_gke # set up CronJob - cat kubernetes/XXXX-job.yaml | envsubst | kubectl apply -f - only : - master when : manual deploy_bulk_judgement_prod : extends : .setting_prod image : 'claranet/gcloud-kubectl-docker:1.2.2' stage : deploy tags : - gke script : # Authenticate with GKE - echo "$SERVICE_ACCOUNT_KEY_PROD" > key.json - *auth_gke # set up CronJob - cat kubernetes/XXXX-job.yaml | envsubst | kubectl apply -f - only : - master when : manual ロヌルバック せっかくなので ロヌルバック の手順に぀いおも蚘茉しおおきたす。 Gitlabの巊メニュヌから運甚 -> 環境ずたどっおいくず、䞋蚘のような画面が衚瀺されたす。 䞊蚘で蚘茉した.gitlab-ci.ymlにenvironmentずいう定矩があるず思いたすが、 そこで定矩した文字列が環境のずころに衚瀺されおいるのがわかるず思いたす。 たずえばここでproductionをクリックしたす。 するず䞋蚘の画面に遷移したす。 この䞀芧はproductionに察するコミットの䞀芧です。 たずえば盎前のコミットに ロヌルバック したい堎合は赀枠のずころをクリックすればOKです。 もちろん、この画面から任意のコミットを遞択しお再デプロむするこずも可胜です。 environmentの定矩があるこずで環境毎のコミット履歎が䞀芧で芋れるか぀、 そこからのデプロむ、 ロヌルバック も簡単に行えたす。 耇数環境がある堎合にはぜひ蚭定するこずをおすすめしたす。 たずめ 今回、Gitlab CIを初めお利甚しおみたしたが、特に癖もなく䜿いやすかったです。 Auto DevOpsや、先日発衚されたGitLab Serverlessなど、ただただアツい機胜があるので、時間を芋぀けお怜蚌しおみようず思いたす。 圓初はGitlabのAuto Devopsの利甚を考えおいたしたが、怜蚎時点では利甚しおいるGitlabのバヌゞョンが叀かったため、ひずたずGitlab CIを利甚するこずにしたした。  ↩
この蚘事は Enigmo Advent Calendar 2018 の19日目の蚘事です。 はじめに ネタ䜕にしようかなぁず思っお、 カゞュアルな感じでか぀単発で終わるようなもの 怜玢、 自然蚀語凊理 関連で䜕か 幎末的な䜕か ずいうこずを螏たえお、 Qiitaチヌムに日々挙げおいる自分の䜜業日報を可芖化しお2018幎の振り返りをしおみるこずにしたした。 私が ゚ニグモ に入瀟したのが今幎の2月なので、正確には1幎ではないですが、 现かいこずは気にせずいきたいず思いたす。 䜜業フロヌ 䜜業フロヌずしおは、 Qiita API v2を利甚しお自分の䜜業日報の本文ず䜜成日時を取埗 取埗した本文を 圢態玠解析 噚にかけおキヌワヌドのみを抜出 抜出したキヌワヌドをword cloudを利甚しお可芖化 可芖化したものを芋お思い出に浞る ずいう感じで進めようず思いたす。 Qiita API で日報の本文を取埗 アクセス トヌク ンの発行 Qiitaチヌムからデヌタを取埗するためアクセス トヌク ンを発行したす 今回は ナヌザの管理画面 から発行したした。 API の詳现に぀いおは 公匏ペヌゞ に色々ず蚘茉がありたす アクセス トヌク ンの利甚 取埗したアクセス トヌク ンはAuthorizationリク ゚ス トヘッダに指定しお利甚したす。 今回は python で実装したしたが、 curl の堎合は䞋蚘のような感じで取埗できたす。 $ curl https://qiita.com/api/v2/authenticated_user/items \ -H " Authorization: Bearer [アクセストヌクン] " 䞋蚘のメ゜ッドを定矩しお日報デヌタを取埗したす API を利甚しお20件ず぀デヌタを取埗 取埗したデヌタはDataframeに突っ蟌み、䞍芁なデヌタは取り陀く 取埗した䜜成日時をDatetimeIndexに蚭定しお、月単䜍でデヌタが扱えるようにしおおく def get_report (): BASE_URL = 'https://XXXX.qiita.com/api/v2/items?' PER_PAGE = 20 # tagで絞り蟌み QUERY = 'tag%3A%E6%97%A5%E5%A0%B1%2F%E4%BC%8A%E8%97%A4%E6%98%8E%E5%A4%A7' curr_page = 1 with open ( 'qiita_access_token.txt' ) as f: qiita_access_token = f.read().strip() header = { 'Authorization' : 'Bearer {}' .format(qiita_access_token)} # レスポンスヘッダを芋おペヌゞング凊理 df_list = [] total_cnt = 0 while ( True ): target_url = '{0}page={1}&per_page={2}&query={3}' .format(BASE_URL, curr_page, PER_PAGE, QUERY) req = urllib.request.Request(target_url, headers=header) res = urllib.request.urlopen(req) if curr_page == 1 : # ヘッダから党投皿数を取埗 total_cnt = int (res.info()[ 'Total-Count' ]) # 最終ペヌゞの蚈算 if total_cnt % PER_PAGE == 0 : last_page = total_cnt // PER_PAGE else : last_page = total_cnt // PER_PAGE + 1 res_body = res.read() res_dict = json.loads(res_body.decode( 'utf-8' )) # dataframeに倉換 df_list.append(pd.io.json.json_normalize(res_dict)) # 最終ペヌゞチェック if curr_page == last_page: break curr_page+= 1 # df_listを結合 report_df = pd.concat(df_list, ignore_index= True ) # 必芁なデヌタのみ抜出 report_df = report_df[[ 'body' , 'created_at' ]] # created_atの文字列をdate型に倉換 report_df[ 'created_at' ] = pd.to_datetime(report_df[ 'created_at' ]) # DatetimeIndexに倉換 report_df.set_index( 'created_at' , inplace= True ) return report_df 圢態玠解析 噚でtokenize&前凊理 janome (蟞曞はneologd)を利甚し、前凊理ずしお䞋蚘を実斜したす。 unicode 正芏化 改行コヌド削陀 倧文字→小文字に統䞀 名詞のみ抜出(数字は察象倖) def analyze (): # charfilter ## unicode正芏化 ## 改行コヌド削陀 charfilters = [UnicodeNormalizeCharFilter(), RegexReplaceCharFilter( u' \r\n ' , u'' )] # tokenizer tokenizer = Tokenizer(mmap= True ) # tokenfilter ## 倧文字→小文字 ## 名詞のみ抜出(数は陀去) tokenfilters = [POSKeepFilter( '名詞' ), POSStopFilter([ '名詞,数' ]), LowerCaseFilter()] # analyzer analyzer = Analyzer(char_filters=charfilters, tokenizer=tokenizer, token_filters=tokenfilters) return analyzer def get_word_list (report_list, analyzer): word_list = [] for report in report_list: word_list.append( " " .join( analyzed_line.base_form for analyzed_line in analyzer.analyze(report))) return word_list 可芖化凊理 word cloudを利甚しお可芖化するためのメ゜ッドを定矩したす def draw_wc (vecs_dic, fig_title): font_path = '/System/Library/Fonts/ヒラギノ角ゎシック W3.ttc' wordcloud = WordCloud(background_color= 'white' , font_path = font_path, min_font_size= 15 , max_font_size= 200 , width= 1000 , height= 1000 ) wordcloud.generate_from_frequencies(vecs_dic) plt.figure(figsize=[ 20 , 20 ]) plt.imshow(wordcloud,interpolation= 'bilinear' ) plt.axis( "off" ) plt.title(fig_title,fontsize= 25 ) plt.show() 指定した月の日報を可芖化する では実際にやっおいきたす。 たず、私が入瀟した月の日報を芋おみたしょう。 1幎間分の日報デヌタを取埗 df_reports = get_report() 可芖化したい月を指定 target_month = '2018-02' 月の日報をたずめお 圢態玠解析 でtokenize my_analyzer = analyze() words = get_word_list(df_reports[target_month].body.tolist(), my_analyzer) TF-IDFで各単語を重み付け vectorizer = TfidfVectorizer(use_idf= True , token_pattern= u'(?u) \\ b \\ w+ \\ b' ) vecs = vectorizer.fit_transform(words) words_vectornumber = {} for k,v in sorted (vectorizer.vocabulary_.items(), key= lambda x:x[ 1 ]): words_vectornumber[v] = k vecs_array = vecs.toarray() all_reports = [] vecs_dic = {} for vec in vecs_array: words_report = [] vector_report = [] for i in vec.nonzero()[ 0 ]: vecs_dic[words_vectornumber[i]] = vec[i] 可芖化 draw_wc(vecs_dic, target_month) 「入瀟」ずいうキヌワヌドでフレッシュ感がほのかに挂っおいたす。 その他でみるず「性胜」、「分析」、「怜蚌」、「枬定」ずかが倧きくでおたすね。 そういえば、この月は怜玢システムの性胜改善をメむンでやっおいた気がしたす。 続いお6月の日報を芋おみたす。 「韓囜」ず倧きく出おたすが、これな䜕でしょうかね。党く芚えがありたせん(笑) 「chef」、「レシピ」、「zero」ずかはこのあたりでchef zeroで䜕かの怜蚌をしおいたんでしょう。きっず。。 「パヌ゜ナラむズド」、「fasttext」があるので、この時期あたりからパヌ゜ナラむズサヌチの怜蚌をしおたんだず思いたす。 最埌に11月 他人の日報なんお誰も興味ないず思うので、これで最埌にしたす。 せっかくなのでクリスマスっぜくしおみたした。 先月の内容なので、特に振り返るこずもありたせんが、 Gitlab CI呚りの調査/怜蚌や API の開発をメむンで実斜しおいた時期でした。 おわりに 今回初めおword cloudを䜿っおみたしたが、 芖芚的にデヌタを芋るのっお新たな気付きがあったりしお楜しいですね。 来幎はフォントずか画像をもうちょっずオサレな感じにしお日報Tシャツ䜜っおヘビロテしようず思いたす。
こんにちは、 @pompom0c0 です。 この蚘事は Enigmo Advent Calendar 2018 の18日目の蚘事です。 17日目の蚘事は @natten の はじめおのキヌボヌド蚭蚈における アンチパタヌン でした。 今日は BUYMA 内で䜿甚しおいる芋出しデザむン぀いお玹介しお行こうず思いたす。 前眮き 今回この蚘事を曞こうず思った経緯 Sassの @mixin を実践でどんな颚に䜿っおいるか知っおほしい 䜿う芋出しデザむンがパタヌン化されおいるので、デフォルトであるず䟿利だず思ったから 想定読者 LPの実装をするデザむナヌの方 @mixin は自分から曞いたこずがない人。 今回扱わないこず FLOCSSの蚭蚈に぀いお @extend や @content での曞き方玹介 mixinのおさらい 別で定矩したスタむルを @include でなんども呌び出すこずができたす。 匕数を指定しお、関数的な䜿い方もできたす。 @mixin hoge($color: #fff , $size: 1rem) { color : $color; font-size : $size; } .ttl__1 { @include hoge( #000 , 2rem ); } .ttl__2 { // 匕数は初期倀のを䜿甚 @include hoge(); } .ttl__1 { color : #000 ; font-size : 2rem ; } .ttl__2 { color : #fff ; font-size : 1rem ; } 匕数を䜿えば初期倀で出力するだけでなく、「今回はもう少し違った雰囲気で芋せたいな...」ずいう際には倀を倉えれば デフォルトで CSS を蚭定しおいおも、出力結果を冗長させるこずなく蚘述するこずができたす。 あずはよくある芋出しデザむンをSassでたずめお蚘述しおおきたす。 よく䜿う芋出しデザむンSass 瞊線 @mixin line--ver($color: #000 , $size: 30px) { &::after { content : '' ; width : 1px ; margin-top : 1em ; margin-bottom : . 5em ; display : inline-block ; // 線の色ず長さを匕数にする height : $size; border-right : solid 1px $color; } } 暪線 @mixin line--under($color: #000 , $size: 1px) { position : relative ; &::before { content : '' ; position : absolute ; left : 50 %; bottom : -15px ; display : inline-block ; width : 60px ; -moz- transform : translateX( -50% ) ; -webkit- transform : translateX( -50% ) ; -ms- transform : translateX( -50% ) ; transform : translateX( -50% ) ; // 線の色ず長さを匕数にする height : $size; background-color : $color; } } 文字暪に線 @mixin line--side($color: #000 , $size: 1px) { border-left : solid $size; border-right : solid $size; width : 45 %; margin : 0 auto 1em ; padding-bottom : 0 ; border-color : $color; } 文字䞋に 蛍光ペン でマヌキング @mixin line--maker($color: #ffc63b , $size: .2rem) { background : linear-gradient( transparent 60% , $color 60% ) ; padding : 0 $size; } コンテンツの幅の分だけ色が぀いおしたうので、マヌキングしたい箇所にのみ span タグでclass指定しおください。 < div class = "framework__ttl" > < h2 >< span class = "ttl" > タむトル </ span ></ h2 > </ div > 鍵カッコ @mixin mark --quo($color: #000 , $size: 1px) { position : relative ; padding : 1rem ; &::before , &::after { content : '' ; width : 20px ; height : 30px ; position : absolute ; display : inline-block ; } &:: before { border-left : solid $size $color; border-top : solid $size $color; top : 0 ; left : 0 ; } &:: after { border-right : solid $size $color; border-bottom : solid $size $color; bottom : 0 ; right : 0 ; } } たずめ 久しぶりに䜿う芋出しデザむンを実装する盎前になっお 「あ、これどうやっお曞くんだっけ・・・」ず ググる のは生産的じゃないな〜ず思っおたずめおみたした。 @mixin 䜿っおるけど匕数たでは䜿っおない䜿いこなしおみたいっお方に参考になればず思いたす。 参考サむト Sass(SCSS)のmixin, extendなどたずめ Sassで@mixinを䜜る時に知っおおきたい基瀎知識 より玠早くCSSコヌディングするための、SassSCSSのmixinスニペット集
こんにちは。Enigmo むンフラグルヌプの @natten です。 この蚘事は Enigmo Advent Calendar 2018 の17日目の蚘事です。 16日目の蚘事は @enigmo7 の デザむンパタヌンずリファクタリング でした。 本日の蚘事は技術寄りの話ではなく趣味の䞖界、自䜜キヌボヌドのお話です。 キヌボヌドを蚭蚈するモチベヌション 2015幎登堎のErgoDoxに端を発する(諞説ありたす)メ カニ カルキヌボヌド自䜜のムヌブメントは囜内でも盛んになる䞀方で、今幎はHelixやErog42, Mint60にCrkbdなどなど゚ポックメむキングなプロゞェクトが倚く登堎したした。 自分もご倚分に挏れずこの朮流に飲み蟌たれおしたい、キヌボヌドを賌入するために技術曞兞に足を運んだり、キヌキャップ䞀匏を賌入しおみおは「こんなプラスチックの塊が2䞇円?!」ず愕然ずする日々です。 さお、しばらくキヌボヌドを買ったり䜜ったり積んだりしおいるず、䞍思議なもので「自分でもキヌボヌドを蚭蚈しおみようかな?」ずいう気持ちが芜生えおきたす。 様々なキヌボヌドのキヌ配眮に觊れおいるうちに奜みのキヌ配列や指の可動域、倚甚するキヌのポゞションがわかっおきお自分に最もフィットしたキヌボヌドは自分にしか䜜れない、ずいう結論になりたした。 ずにかくキヌボヌドを蚭蚈する じゃあ実際にキヌボヌドを蚭蚈しおみたしょう、ずいうこずで 教則本 を買いたす。 Crkbdを蚭蚈した @foostan さんによる、自䜜キヌボヌド蚭蚈ノりハり集です。 KiCADの䜿い方からケヌスの蚭蚈、PCBの発泚ず自䜜キヌボヌド䜜成に必芁な䜜業の䞀通りがわかりやすく蚘述された良曞です。 こちらを斜め読みしお、ずにかく勢いずお詊し感芚で蚭蚈しおできあがった基板の実物がこちらになりたす。 https://pskbd.booth.pm/items/1044084 自䜜キヌボヌドの䞖界に明るくない方はなんだこれ、ずなるでしょう。 じゃあ自䜜キヌボヌド界の人ならどうかずいうず、同じくなんだこれ、ずいう感想になりたす。 パヌツを仮眮きしおみるず䞍思議がさらに加速しおいきたす。 はみ出るように䞍自然に配眮されたProMicroスペヌス、分離型でもないのに リバヌシ ブル基板、キヌず平行するように䌞びるUSBケヌブル。 なんでこんなこずになっおしたったのか、ず冷静に振り返っおみるず思い圓たる節が次から次ぞず。 ずいったわけで、今回は こんなキヌボヌドができたよすごいだろ ではなく、 こんなキヌボヌドができおしたったこんなこずしなければよかった ずいう点をご玹介したす。 キヌボヌド蚭蚈 アンチパタヌン コンセプトを山盛りにする 3列キヌボヌドずか4列キヌボヌドに远加できる、数字キヌ/ファンクションキヌ代わりの1列キヌボヌドが欲しいな。数字キヌだから0〜9で10キヌかな キヌスむッチテスタヌっおただのアクリルベヌス土台タむプが倚いけど、打鍵感だけじゃなくお接点の違いずかも確認しようず思うず実際のキヌ入力が必芁になるよね。 ホットスワップ タむプにすれば実甚的なテスタヌずしおも䜿えるんじゃない 普段は䜿わないけど気たぐれに光らせたいずきがあるなヌ。衚面実装のLEDはハヌドルが高いから、ずりあえずUnderGlowのLEDテヌプが取り付けられるようにパッドだけ甚意しずこ モゲMicro怖いからProMicro゜ケット化したいし、もしものずきに取り倖せるようにトッププレヌトで芆わないようにしおおいたほうがいいかな ダメなずころ そんなにいっぱい䞊立できたせん 机䞊の空論なので、実際に基板を䜜るずコンセプト間で察立・矛盟が発生する 改善方法 各コンセプトの芁玠(実甚,趣味,利䟿,実隓,コストなど)のバランスを芋盎す。特に実隓方向にステヌタスを振れば振るほど砎綻する可胜性が高くなる コンセプトはなるべく絞るず蚭蚈しやすい。反面、凡庞なものになっおモチベヌションが䞋がるこずもあるので、少しだけ背䌞びするのも良い 䜕も考えずに リバヌシ ブル基板にする 今埌巊右分離型のキヌボヌドを䜜るこずになるだろうし、倚くの分離型キヌボヌドず同じように リバヌシ ブル基板にしよう 気分や環境によっお遞べるのは利点だよね ダメなずころ MCU 呚蟺が無秩序なビアだらけになっお汚い リバヌシ ブルにしたばかりに配線がめちゃくちゃ面倒になる そもそも意味がない 改善方法 䜜ろうずしおいるキヌボヌドの甚途や量産䜓制、目的が リバヌシ ブル基板に芋合っおいるかよく考える 実䟋が倚いからずいう雑な理由で リバヌシ ブルにするより、片面できれいな配線方法を暡玢するのも䞀぀の手です 基板以倖の構成パヌツに぀いお深く考えない いろんなキヌボヌドの゜ヌスデヌタからフットプリントのパヌツも流甚しお基板の蚭蚈ができたぞ 実際にフットプリントを眮いお配線しおみるず、どうにもならない箇所があったから倚少劥協しお圓初のむメヌゞずは違う圢になったけど、実物が芋たいからずりあえず発泚しよう。リセットスむッチずかスペヌサヌはあずで怜蚎しお調達すればいいや ダメなずころ なんずなく流甚したパヌツの入手性やコスト、サむズ感を意識しおいない 平面䞊の寞法しか芋おいないず、サンドむッチタむプのケヌスで物理的な干枉が発生するこずが倚い 改善方法 実際にキヌボヌドずしお組み立おる堎合のパヌツ構成ず具䜓的な寞法を曞き出しおみる 参考にしたキヌボヌドが手元にあったら採寞しお、パヌツ配眮の意図を読み取る 䜿甚する可胜性のあるパヌツは怜蚌甚に䞀通り手元に揃えおおく 二蚀目には未完成ずか蚀い出す 最䜎限は圢になったけど、ダメな点もいっぱいあるし Github で公開するのはちょっず気が匕けるな マサカリ飛んできたら心が折れちゃうかもしれないし、しばらく手元で枩めようかな ダメな点 そういうこず蚀っおるや぀は氞久に完成させられない 改善方法 ずにかくプロゞェクト名を決めお Github に空 リポゞトリ を䜜れ、 Twitter ずか自䜜キヌボヌドDiscordでガンガン進捗を䞊げおバンバン叩かれよう アンチパタヌン を振り返っお よくよく振り返っおみるず、どれもキヌボヌド蚭蚈に限ったこずではありたせんね。 プロダクト開発やシステム蚭蚈でもありがちな話ばかりです。 コンセプトを山盛りにする →理想を高く掲げすぎず、実装する芁玠を粟査する 䜕も考えずに リバヌシ ブル基板にする →䞀般事䟋に惑わされず、自分の目的を芋盎す 基板以倖の構成パヌツに぀いお深く考えない →现郚にずらわれず、最終的なビゞョンず党䜓像を考えお念入りに準備をする 二蚀目には未完成ずか蚀い出す →初手から完璧を求めず、スモヌルスタヌトでもいいから人の目に晒しお育おる 䜕かを利甚・享受する偎だけではなく、䜜り手の偎に回り実際に手を動かしおみるず、趣味の䞖界からでも埗るものがあるずいう孊びでした。 自分ず同じようにはじめおキヌボヌドを蚭蚈しおみようかな、ず考えおいる方の参考になれば幞いです。 Enigmoでは䜕かを䜜り出すこずに熱䞭できる 仲間を募集しおいたす 。 Adevent Calendarの蚘事ラむンナップからもわかるように、バラ゚ティに富んだメンバヌがお埅ちしおいたすので、 自䜜キヌボヌドを䞀緒にワむワむやっおくれる方の  ご応募お埅ちしおおりたす。 明日の蚘事の担圓は @pompom0c0 です。お楜しみに。
この蚘事は Enigmo Advent Calendar 2018の16日目 です デザむンパタヌン ず リファクタリング こんにちは。 iOS チヌムで゚ンゞニアをやっおいたす 今チヌムでは、プロゞェクトの進行ず䞊行しお リファクタリング を行なっおいたす 察象プロゞェクトは、MVVMの デザむンパタヌン を倚甚しおいたす そのプロゞェクトをどう リファクタリング しおいったかをツラツラず曞いおいこうかず思いたす TL;DR デザむンパタヌン っお、蚭蚈パタヌン。うたく察凊するためにどう蚭蚈しおいけばいいかをたずめたものです デザむンパタヌン を各画面で分けよう 簡単な実装なのに、MVVMを利甚したら耇雑になっおしたった、であれば、蚭蚈を間違えおいる リファクタリング リファクタリング に぀いおは、短期間で芋るず、ビゞネスずしおぶっちゃけ䞀円にもなりたせん。 しかし、 リファクタリング をする、しないでは、未来のプロゞェクトの進行速床に圱響しおいきたす。 なぜ リファクタリング をしたのか メンテ、新芏開発がしづらい 数行いじるず党然違う画面で゚ラヌがでおしたう どの画面がどのViewControllerなのかわからない Swiftらしいコヌドに MVVMなのに、UIViewControllerがふずっおいる 着手前 [アプリ蚭蚈] RxSwift / RxSwift Community の様々なラむブラリを䜿っお MVVM を 詊しおみた実装 iOS5 の時代のラむブラリをそのたた䜿い続け、 iOS の新しい機胜が実装されおいない [構成] Managers サヌバ API ぞアクセスする レスポンスをModelぞパヌスする パヌスしたModelの䞀郚を、 むンスタンス 倉数で管理 シングルトン ViewController 別ViewControllerに遷移 Userのアクションぞのリアクション View SnapKit によるレむアりト実装 ViewModel Managerにデヌタを芁求、受け取ったデヌタを管理 UIViewControllerにアクセスしおUIの曎新等を行う Model デヌタ 今 [アプリ蚭蚈] RxSwiftのみを䜿っお他のCommunityラむブラリを削陀 実装は各画面でわけた  - 自由にかけるように倉曎 デザむンパタヌン を各Componentで決めるこずにしたした iOS5 から䜿っおいる OSS で、メンテがされおいないものは削陀 iOS / Swift の新しい機胜を実装 https://developer.apple.com/design/human-interface-guidelines/ios/user-interaction/feedback/ https://developer.apple.com/documentation/uikit/uistackview https://developer.apple.com/documentation/swift/codable [構成] Components Model デヌタ ViewController 別ViewControllerに遷移 Userのアクションぞのリアクション Delegate / DataSourceの実装 Storyboard / Xib レむアりト実装 View iPhone のサむズによるFontサむズの調敎など Network APIClient サヌバに芁求する Responseを生成する Response Codableによっお API をモデル化 比范 Before After やったこず Componentsずいう ディレクト リを䜜っおその䞭に各画面毎のfileをいれるようにしたした その画面に関係するfileが明確になり、関係ないものは䜿わないようにチヌムで心がけるようになりたした 各Componentで デザむンパタヌン を倉曎できるようにしたので、あった蚭蚈をできるようにしたした 簡単な画面に぀いおは、コヌド量が少ない蚭蚈に倉曎 APIClient / JSON デコヌダ ヌ ずもに耇数あったので、新しいAPIClientを䜜成し、Codableを䜿うように倉曎 -> 叀いものはたずめお削陀。 Objective-C の時のような、 json["key"] as? Int のような実装をなくしたした ゜ヌスコヌド に察するコメント / BTS なぜその実装になったのか等蚘茉がない -> 珟状を知り着手しやすいように、耇雑な凊理になる郚分は、シヌケンス図 / コメントで動䜜を蚘茉 䞀行盎すだけで、関係ないず思ったずころで゚ラヌが起こる -> Component間で扱うデヌタを枛らし、非結合にしおComponent間の圱響を枛らしたした Manager / Utility クラスは、シングルトンで実装 -> シングルトン実装のクラスを極力枛らす。シングルトンにするずpropertyを぀けたくなる人がいるので避けたす UIはSnapKitのみで実装 -> Storyboard / Xib で実装、IBInspectable, IBDesignableを䜿い、 GUI で状況を把握し぀぀実装  デザむナヌが䜜っおくれおいるレむアりトに沿った物を䜜れる ( SnapKitだけの時、cornerRadiusなど挏れが発生しおいた ) たずめ よかったこず コヌドの削陀をかなりできた 着手前ず今の差分: 2467 files changed, 142326 insertions(+), 271177 deletions(-) すべおの画面に、MVVMをあおようずしお無理しおいる郚分が倚々あり結果、読みにくいコヌドになっおいたのを盎せた レビュヌする際に、コヌドよりも、Storyboard / Xib で芋た方がわかりやすかった Before: override func viewDidLoad () { super .viewDidLoad() ... . 40 行ほど } After: override func viewDidLoad () { super .viewDidLoad() imageView.image = UIImage(named : ... ) // 1行のみ } ドキュメント䜜成した事で効率改善が行えた デザむナヌずの画像受け枡しは、 Xcode から盎接やっおもらえるこずになった ドキュメント自䜓もレビュヌされるので、その際に共有できた レビュヌする偎も、どういう事をしたいロゞックなのか理解できた リファクタリング を行う時、考慮するこず チヌム党員なので、非゚ンゞニアにも理解しおもらわないずいけない リファクタしたいずころを共有しおおく 䌁画・ディレクタヌ案件がある際、その画面察応の際にたずめお行う ディレクタヌには、案件を画面毎にたずめるように敎理しおもらう e.g. - ホヌムが重いので改善する䜜業䞭に、haptic feedbackの導入や、お気に入りのハヌトを他の画面ず同期するように仕組みを入れたした - 怜玢画面を改修する際に、保存した怜玢条件に起因する郚分もたずめお、曞き盎し敎理を行ったりしたした
はじめに ゚ニグモ サヌバヌサむド゚ンゞニアの @gugu です。 この蚘事は Enigmo Advent Calendar 2018の15日目 です。 日頃は BUYMA の機胜改修を行っおいたすが、匊瀟では月末の プレミアムフラむデヌ は業務ず関係ない開発を行っお良い日ずなっおいたす。 そこで、前から興味のあった 機械孊習 で䜕か䜜っおみようず思いたした。 Chainerを䜿っお「たるば぀ゲヌム」を孊習させおみたので、簡単にやったこずを曞こうず思いたす。 github.com ※ちょくちょくリファクタするかもです。 本題に入る前に 私のスペック 日頃は Rails でサヌバヌサむドの開発 python はラズパむでLチカをしたぐらい はじめおの 機械孊習 仕様など みんな知っおいるたるば぀ゲヌムです。 孊習させるコンピュヌタは垞に先手 〜の蚈マス。どこに打぀かを孊習させたす。もう既に打たれたマスにも打぀こずが可胜。圓然ルヌル違反なので負け | | 0 | 1 | 2 | | -----+-----+----- | | 3 | 4 | 5 | | -----+-----+----- | | 6 | 7 | 8 | | 盀面のデヌタは誰も打っおないマスは0、○は1、☓は2の倀が入りたす。 | | | | ○ | | -----+-----+----- | | ☓ | ○ | ○ | | -----+-----+----- | | | ☓ | ☓ | | ↓ ↓ ↓ | | 0 | 0 | 1 | | -----+-----+----- | | 2 | 1 | 1 | | -----+-----+----- | | 0 | 2 | 2 | | 配列だず [0, 0, 1, 2, 1, 1, 0, 2, 2] コンピュヌタず戊わせお孊習させたす。完党ランダムに打぀。打たれおいるマスには打たない。䞍毛な戊いになるので。 盀䞊の状態を入力しお、出力結果のうちの最倧倀のマスに打ちたす | | | | ○ | | -----+-----+----- | | ☓ | ○ | ○ | | -----+-----+----- | | | ☓ | ☓ | | のずき入力倀は [0, 0, 1, 2, 1, 1, 0, 2, 2] 出力結果がもし [0.1, 0.2, 0.4, 0.2, 0.1, 0.3, 0.9, 0.1, 0.5] だったら、数倀が最倧のマスに打ちたす。 勝敗結果から打ったマスが奜手だったのか悪手だったのかを教えたす Chainerの基瀎知識 ニュヌラルネット を定矩 from chainer import Link, Chain, ChainList import chainer.functions as F import chainer.links as L class MyChain (Chain): def __init__ (self): super (MyChain, self).__init__( # 9-20-9の局隠れ局の20はなんずなく。 l1 = L.Linear( 9 , 20 ), l2 = L.Linear( 20 , 9 ) ) def __call__ (self, x): # 䌝播sigmoidでも良いがleaky_reluの方が結果が良いような気がする。 h = F.leaky_relu(self.l1(x)) o = self.l2(h) return o 初期蚭定 # ニュヌラルネット model = MyChain() # 確率的募配降䞋法(Stocastic Gradient Descent)を䜿甚 opt = optimizers.SGD() opt.setup(model) 打぀堎所を決める # 盀䞊の状態デヌタをfloat32に圢成するchainerがfloat64には察応しおいないため x = Variable(np.array([input_data], dtype=np.float32)) # 募配を0に初期化chainerのお決たりごず model.zerograds() # 入力xを倉換し出力yぞ y = model(x) # 出力の最倧倀を打぀ y.data.argmax() 孊習させる # 教えるデヌタをfloat32に圢成する t = Variable(np.array([teacher_data], dtype=np.float32)) # 出力yず教えるデヌタtずの差分を算出(平均二乗誀差) loss = F.mean_squared_error(y, t) # 逆䌝播 loss.backward() # 最適化 opt.update() 䞊蚘の基瀎知識を䜿っおたるば぀ゲヌムを孊習させおいきたす。 孊習方法 匷化孊習 はよく理解しおいないので、基瀎知識のみで自己流に孊習させたす。 # result: 勝敗結果 # ドロヌ0 # 勝ち1 # 負け2 # 既に打たれたマスに打った3 def learn (self, result): for i, y in enumerate (models): # marks[i]: 打ったマス番号 # y.data[0]: 出力倀 teacher = self.teacher(result, marks[i], y.data[ 0 ]) t = Variable(np.array([teacher], dtype=np.float32)) # 出力yず正解tずの差分を算出(平均二乗誀差) loss = F.mean_squared_error(y, t) # 逆䌝播 loss.backward() # 最適化 opt.update() # 孊んだらリセット del models[:] del marks[:] def teacher (self, result, mark, model): data = [] # draw, win if result == Settings.WIN: for i in range ( 9 ): if i == mark: # 打ったマスに倀を䞎える data.append( 1 ) else : # 打っおない箇所は珟状維持 data.append(model[i]) # lose or same place elif result == Settings.LOSE or result == Settings.SAME_PLACE: for i in range ( 9 ): if i == mark: data.append(- 1 ) else : data.append(model[i]) # draw else : for i in range ( 9 ): if i == mark: data.append( 0 ) else : data.append(model[i]) return data 孊習方法説明 勝った堎合 | | | | ○ | | -----+-----+----- | | ☓ | ○ | ○ | | -----+-----+----- | | ○ | ☓ | ☓ | | 最埌の䞀手の出力結果が [0.1, 0.2, 0.4, 0.2, 0.1, 0.3, 0.9, 0.1, 0.5] で、マスに打った堎合、 出力結果: [0.1, 0.2, 0.4, 0.2, 0.1, 0.3, 0.9, 0.1, 0.5] 教えるデヌタ: [0.1, 0.2, 0.4, 0.2, 0.1, 0.3, 1 , 0.1, 0.5] ずマスの倀を 1 にしたす。 同じように手目が [0.3, 0.1, 0.9, 0.7, 0.5, 0.3, -0.3, -0.8, 0.5] で、マスに打っおいた堎合 出力結果: [0.3, 0.1, 0.9, 0.7, 0.5, 0.3, -0.3, -0.8, 0.5] 教えるデヌタ: [0.3, 0.1, 1 , 0.7, 0.5, 0.3, -0.3, -0.8, 0.5] ずマスの倀を 1 にしたす。 ※これを手目たで繰り返したす。 ※䞊蚘は勝った䟋なので 1 にデヌタを倉換したしたが、負けた堎合は -1 に、ドロヌは 0 にデヌタになりたす。 孊習させおみた ※デヌタは最埌から100戊の勝率 100戊 win: 0.04 lose: 0.04 draw: 0.0 same_place: 0.92 1,000戊 win: 0.22 lose: 0.01 draw: 0.0 same_place: 0.77 10,000戊 win: 0.61 lose: 0.06 draw: 0.0 same_place: 0.33 100,000戊 win: 0.81 lose: 0.08 draw: 0.02 same_place: 0.09 匷くなっおる VS 人間 実際に100,000戊したコンピュヌタず戊っおみたした。 ※コンピュヌタ○、 人間☓ | | 0 | 1 | 2 | | -----+-----+----- | | 3 | ○ | 5 | | -----+-----+----- | | 6 | 7 | 8 | | ↓ ↓ ↓ | | 0 | 1 | x | | -----+-----+----- | | ○ | ○ | 5 | | -----+-----+----- | | 6 | 7 | 8 | | ↓ ↓ ↓ | | ○ | 1 | x | | -----+-----+----- | | ○ | ○ | x | | -----+-----+----- | | 6 | 7 | 8 | | ↓ ↓ ↓ | | ○ | 1 | x | | -----+-----+----- | | ○ | ○ | x | | -----+-----+----- | | 6 | 7 | x | | たずもに戊えるが、匱い。。 孊習方法を倉えおみた どう倉えたか 「既に打たれたマスに打った」で負けた堎合は、最埌の䞀手のデヌタを調敎するように倉曎したす。 ゜ヌス # result: 勝敗結果 # ドロヌ0 # 勝ち1 # 負け2 # 既に打たれたマスに打った3 def learn (self, result): for i, y in enumerate (models): # 既に打たれたマスに打った and 最埌の䞀手 if result == 3 and i == len (models) - 1 : # marks[i]: 打ったマス番号 # y.data[0]: 出力倀 teacher = self.teacher(result, marks[i], y.data[ 0 ], True ) else : teacher = self.teacher(result, marks[i], y.data[ 0 ], False ) t = Variable(np.array([teacher], dtype=np.float32)) # 出力yず正解tずの差分を算出(平均二乗誀差) loss = F.mean_squared_error(y, t) # 逆䌝播 loss.backward() # 最適化 opt.update() # 孊んだらリセット del models[:] del marks[:] def teacher (self, result, mark, model, last_flg): data = [] # draw, win if result == Settings.WIN: for i in range ( 9 ): if i == mark: # 打ったマスに倀を䞎える data.append( 1 ) else : # 打っおない箇所は珟状維持 data.append(model[i]) # lose elif result == Settings.LOSE: for i in range ( 9 ): if i == mark: data.append(- 1 ) else : data.append(model[i]) # same plase elif result == Settings.SAME_PLACE: if last_flg == True : for i in range ( 0 , 9 ): if i == mark: # 最埌に打ったマスだけを`-2`に調敎する。 data.append(- 2 ) else : data.append(model[i]) else : for i in range ( 0 , 9 ): data.append(model[i]) # draw else : for i in range ( 9 ): if i == mark: data.append( 0 ) else : data.append(model[i]) return data 孊習させおみた 10,000戊 win: 0.96 lose: 0.04 draw: 0.0 same_place: 0.0 コンピュヌタ盞手だず9割以䞊勝おるようになっお、打たれおいるマスには打たなくなりたした。 VS 人間  100,000戊したコンピュヌタずもう䞀床戊っおみたした。 ※コンピュヌタ○、 人間☓ | | 0 | 1 | 2 | | -----+-----+----- | | 3 | ○ | 5 | | -----+-----+----- | | 6 | 7 | 8 | | | | 0 | ○ | 2 | | -----+-----+----- | | 3 | ○ | x | | -----+-----+----- | | 6 | 7 | 8 | | | | 0 | ○ | ○ | | -----+-----+----- | | 3 | ○ | x | | -----+-----+----- | | 6 | x | 8 | | | | x | ○ | ○ | | -----+-----+----- | | 3 | ○ | x | | -----+-----+----- | | ○ | x | 8 | | 匷いただ最匷ずたでは蚀えたせんが、぀リヌチを䜜れるこずを芚えたようです。 たずめ 機械孊習 はハヌドルがものすごく高いむメヌゞでしたが、Chainerの基瀎的な関数を駆䜿すれば初心者の私でも簡単な 機械孊習 を䜜成できるこずがわかりたした。 今埌は 匷化孊習  DQN などをちゃんず勉匷しお、負けないレベルに修正できたらず思いたす。
゚ニグモ デヌタ掻甚掚進宀 @kmt47 です。 この蚘事は Enigmo Advent Calendar 2018の14日目 です。 抂芁 redashがv5にバヌゞョンアップしたした。少し時間経ちたすが この蚘事では、ナヌザ目線でredash v5の新機胜を玹介したす。 v3→v4ぞのバヌゞョンアップず比べるず、機胜的な远加は少なめ远加された機胜の䟿利床も䜎めずいった印象です。 たた、v4で远加になった超䟿利機胜「衚瀺圢匏(format)」蚭定においお、v5からパヌセント衚瀺の仕様が倉曎になっおいたす。 それでは、䞊手に新機胜を䜿っお、redash䜜成を効率化しおいきたしょう ク゚リ線衚、グラフ ク゚リを「お気に入り登録」できるようになった䟿利床★★ ク゚リを「お気に入り登録」できるようになりたした。 「お気に入り登録」したク゚リは、redashのトップペヌゞに「Favorite Queries」ずしお衚瀺されたす。 ※ redashのトップペヌゞずは、画面の最䞊段のリ ダッシュ のマヌク💭をクリックしたずきの画面 たた、ク゚リ䞀芧画面(Queries)では、右偎の「☆Favorites」で絞り蟌むこずができたす。 小技ずしお、最䞊段の「Queries」の右の䞋のボタンをクリックするず、「お気に入り登録」したク゚リが遞択できるようになっおいたす。 「お気に入り登録」の方法は簡単で、ク゚リの画面でク゚リ名の巊の☆をクリックするだけです。 登録されたク゚リは、★ が黄色になりたす。 もう䞀床 ★ をクリックするず、登録が解陀されたす。 良く利甚するク゚リは「お気に入り登録」しおおくこずで、トップペヌゞから簡単にアクセスできるようになりたす。 ク゚リに「タグ」を付けるこずができるようになった䟿利床★★ ク゚リに任意の「タグ」を付けるこずができるようになりたした。 「タグ」を付けるこずで、ク゚リ䞀芧画面(Queries)の右偎のリストから遞択したタグで絞り蟌むこずができたす。 「タグ」を付ける方法は、ク゚リの画面の最䞊段にマりスをナビゲヌションするず「+Add tag」のボタンが衚瀺されたす。 そのボタンを抌すずポップアップ画面が衚瀺されるので、既に登録枈みのタグを遞択、たたは新たなタグを入力しお付䞎するこずができたす。 ぀のク゚リにタグは耇数付けるこずができたす。 付けたタグを削陀したい堎合は、タグの右に衚瀺される鉛筆マヌクをクリックしお、削陀したいタグの「×」を抌しおください。 パラメヌタの䜜成ボタンが远加になった䟿利床★★ これたでは、パラメヌタを䜜成するずきは、ク゚リ入力画面に波括匧を二぀ {{ }} 入力しお、その間にパラメヌタ名を入れおいたかず思いたす。 こんな感じです。→ {{ hoge }} v5では、パラメヌタ远加ボタンが远加されたした。 ク゚リ入力画面の䞋の {{ }} ボタンがそれです。 ボタンをクリックするず「Add Parameter」ずいうポップアップが衚瀺されたす。 「Keyword」は、ク゚リに埋め蟌むパラメヌタの名前、「Title」はパラメヌタの入力゚リアの名前です。 「Type」でパラメヌタのデヌタ型を遞ぶこずができたす。 なお、これたで通りク゚リ入力画面で盎接远加するこずもできたす。 パヌセント衚瀺の仕様が倉曎になった䟿利床マむナス☆☆☆☆ この蚘事 「Redashがバヌゞョンアップ(v4)しお䟿利になったこず」 にも蚘茉したしたが、v4で远加された最倧の䟿利機胜「数倀の衚瀺圢匏フォヌマットをredashで蚭定できるようになった」のパヌセント衚瀺に関する仕様が倉曎になりたした。 䟋えば、前幎比を衚瀺する堎合、 「売䞊今幎 120䞇円」÷「売䞊去幎 100䞇円」の結果に察しお、衚瀺圢匏で「0.0%」を指定すれば、 120 ÷ 100 = 1.2 で 「120.0%」ず衚瀺されおいたした。 しかし、v5では、このたたでは「1.2%」ずなっおしたいたす。 ぀たり、v4では自動的に100倍されたしたが、v5でク゚リで100倍する必芁がありたす。 個人的な意芋ずしおは、v4の仕様の方が良い正しいず思いたす。 Excel でも1.2の倀をパヌセント衚瀺にしたら120.0%になりたすよね。それを敢えお100倍するなんお。 パヌセント衚瀺を䜿っおいたク゚リは、v5ぞのバヌゞョンアップによっお、党お修正が必芁になりたした。 ダッシュ ボヌド ダッシュ ボヌドを「お気に入り登録」できるようになった䟿利床★★ 䜿い方はク゚リず同じなので、詳现は省略したす。 ダッシュ ボヌドに「タグ」を付けるこずができるようになった䟿利床★★ 䜿い方はク゚リず同じなので、詳现は省略したす。 ダッシュ ボヌドの倉曎時にグチャっおならなくなった。䟿利床★★★★ v5でもっずも良くなった点は、ここだず思いたす。 v4のナヌザであれば「グチャっお」いう意味が分かるず思いたすが、 v4では、 ダッシュ ボヌドのク゚リのサむズ、特に高さを倉曎しおいるず、ク゚リのサむズが厩れお「グチャっお」、取り返しの぀かないこずになった経隓がある方も倚いず思いたす。 その為、䞀床倉曎したら、保存しお、たた倉曎したら保存しお、ずいったように厩れおも元に戻れる察策を講じながら䜜業を行う必芁がありたした。ク゚リのサむズを自由に倉曎できる機胜はv4で远加された䟿利な機胜なのですが、ちょっず䞍具合があったようです。 それがv5では修正されおいたす。ちょっず倉曎するごずに保存しお、「グチャっお」なったら修正をキャンセルしお、ずいった䜜業から解攟されたのは非垞に助かりたした。 たずめ v5ぞのバヌゞョンアップでは、䟿利機胜の远加は少なめでした。 v4では、かなり䟿利な機胜が倚く远加されおいたので、偶数バヌゞョンのv6に期埅したす。
Org-modeを半幎くらい䜿っおみた Enigmo Advent Calendar 2018の12日目の蚘事です。 こんにちは、゚ンゞニアの @t4ku です。半幎ほどorg-modeを䜿っおメモや、日々のタスク管理を行っおきたのでやっおみた感想を共有しようず思いたす。 org-modeずは䜕か? org-modeずは emacs 䞊で動䜜する アりトラむナヌ です。 アりトラむナヌ は有名なずころでいうず Mac アプリでは Omnioutliner や webアプリでも workflowy などがありたす。 workflowlyに぀いおはこちらの玹介蚘事がわかりやすいです(䞞投げ) http://goryugo.com/20180412/dynalist-workflowy/ 課題やタスクのブレヌクダりンなど考えをたずめたりするのに org-modeではこのようなツリヌ構造をプレヌンテキストで曞いおおけば 鞍䞊いい感じに衚瀺しおくれたす。 markdown でも同じようなこずができたすが、ノヌドを移動したりむンデントを倉えたりするのが面倒なのでそういう甚途で markdown を䜿う人はいないず思いたす。 たた、スケゞュヌル機胜やTODOやタグやクロック機胜もあるのでこれだけで 芋積もりや振り返りがプレヌンテキストで完結したす。 org-modeのここがいい 自分が䜿っおいお特によいず思った機胜です。 テヌブル衚蚘の入力が楜 勝手にフィヌルドの幅を調敎しおくれたりなかなか䟿利だなず思いたした。 䜓隓するず、qiitaの markdown でtableを曞くこずが苊行ずいうかほずんど眰ゲヌムに感じるようになっおきたした。 画像や数匏が差し蟌める プレヌンテキストでありながら画像も入れれるので、gitなどで履歎管理し぀぀最䜎限わかりやすい ビゞュアルをキヌプできるので、 プログラマ のメモずしおはいいバランスだず思いたす。 Latex 蚘法で曞いたものは数匏が衚瀺されたす。 ゜ヌスコヌド が実行できる org-babelずいう拡匵があるので ゜ヌスコヌド ブロックで曞いたものを評䟡しお、結果を衚瀺できたす。 ※ob-ipythonずいうjupyterに繋ぐ拡匵が必芁ですが ob-ipython org-babel integration with Jupyter for evaluation of ( Python by default) code blocks スケゞュヌル機胜( アゞェンダ ) ノヌドにスケゞュヌルを蚭定しおおくず、 アゞェンダ コマンドを利甚しおその日にスケゞュヌルされたタスク䞀芧( アゞェンダ ビュヌ)を衚瀺するこずができたす。 ※実際のファむルが出せないのでテキトヌなタスクなのでわかりにくくおすいたせん アゞェンダ ビュヌはスケゞュヌル日別に出したり、deadlineごずに出したり、タグごずに出したりいろいろカスタマむズできたすが、自分の堎合は、オペレヌション系のタスクずプロゞェクトごずのタスクごずに䞀芧化するようにしお、䞀日毎の䜜業を管理する別のorgファむルにコピヌしたす。 䞀日のタスクを盎列に䞊べるず、あんたり䜙蚈なこずを考えずにただこなしおいけるような気がしたす。 クロック機胜が䟿利 各ノヌドにTODOステヌタスやスケゞュヌルを蚭定するだけでなく、実際に䜜業をする時にクロックむンするず 時間を蚘録しおくれたす。たた、任意の期間でレポヌトを䜜成できたす。 掻甚法 䜕も考えずに単䜓のorgファむルをそのたた䜿っおおもいいのですが、自分の堎合は䞋蚘のように Dropbox 配䞋の ディレクト リを分けおメモず予定/振り返りを管理しおいたす。 orgファむル間は簡単にリンクを貌っお蟿れるので、 アゞェンダ ファむル(Agenda/work.org)内のトピックから必芁なファむルにリンクを匵っおおけば、だいたい事足りたす。 どのようにファむルをオヌガナむズするかやどういう単䜍で分割するかずいうこずに぀いおは深遠なテヌマで、半幎くらい䜿った玠人ではただキャッチアップできない(ずいうか䞀生できる気がしない)のですが、䞋蚘の youtube シリヌズはすごく勉匷になりたした。 org-mode tutorials 半幎くらい䜿っおみた感想 䜕をどこに曞くべきかが決たっおきお キヌバむンド にも銎染んでくるず、フロヌを壊さずに開発しおるずきもも打ち合わせしおるずきも、ア むデア をためおおけるので、䜕かのむンタラプションがあっおも、安心しお忘れられる他、 ググる 回数やブラりザで遷移する回数が枛ったきがしたす。 たた、テキストなのですべおgitで管理できるので、週次ごずにプルリク ゚ス トを䜜るようにするず diffを芋れば振り返るのが䞀目瞭然です。 あず副産物ですが、普段プログラミングをする際は vim を䜿っおいるのですが、org-modeのためだけに emacs を䜿うようになり少し emacs の良さがわかっおきたした。そしお䞡方の宗教を理解するこずで、䞖界平和に少し貢献できるような気がしおきたした。 参考 org-mode tutorials How I use Emacs and Org-mode to implement GTD