Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
C++のパッケージマネージャ「poac」を開発した話 / Poac is a package ...
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Ken Matsui
February 20, 2019
Technology
1.6k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
C++のパッケージマネージャ「poac」を開発した話 / Poac is a package manager for C++
Ken Matsui
February 20, 2019
More Decks by Ken Matsui
See All by Ken Matsui
conanが使いづらいのでpoacを作っている話 / conan-to-poac
matken
2
890
Other Decks in Technology
See All in Technology
AIっぽい文章を採点して人間らしく直すアプリを作ってみた
yama3133
2
140
チームで進めるAI駆動アジャイル×ウォーターフォール
kumaiu
0
160
EventBridge Connection
_kensh
5
700
2026.06.13_AI時代に事業会社が「SIer出身エンジニア」を求める理由 / Why Businesses Seek Engineers with a System Integrator Background in the AI Era
jumtech
0
1.1k
AIソロプレナー時代に2ヶ月で20人増員した事業創造会社の開発組織の話
miyatakoji
0
620
あなたの AI ワークスペースに、 専門コーダーを連れてくる - Amazon Quick Desktop 最新情報
kawaji_scratch
1
130
20260619 私の日常業務での生成 AI 活用
masaruogura
1
140
2026TECHFRESH畢業分享會 - Lightning Talk - 資料也要 CI/CD? 用 Airbyte 自動化資料同步
line_developers_tw
PRO
0
890
FinOps × AIエージェントで実現する コストインシデントの自動調査
oasis1994liveforever
0
130
Claude Code×Terraform IaC テンプレート駆動開発
itouhi
1
510
データサイエンスを価値につなげるプロジェクト設計 〜 DS一年目が現場で得た気づき 〜
ysd113
1
200
プロダクト開発から業務改善コンサルまで。事業全体へ「染み出す」ことで広がるエンジニアの可能性
ham0215
0
120
Featured
See All Featured
Scaling GitHub
holman
464
140k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
Code Reviewing Like a Champion
maltzj
528
40k
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
380
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
190
Google's AI Overviews - The New Search
badams
0
1k
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
160
4 Signs Your Business is Dying
shpigford
187
22k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.2k
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.5k
Transcript
$ ͷύοέʔδϚωʔδϟ ʮQPBDʯΛ։ൃͨ͠ ·͚ͭΜ !NBULFO ໋ཱؗେֶใཧֶ෦̎ੜ
ύοέʔδϚωʔδϟͱ ϥΠϒϥϦͷஔόʔδϣϯཧɼґଘؔ ղܾͷࡶͳ࡞ۀΛϚωδϝϯτͯ͘͠ΕΔ
▸ /PEFKTͷOQNZBSO ▸ &MJYJSͷIFY ▸ $ ͷDPOBO ▸ 3VTUͷDBSHP ▸
)BTLFMMͷDBCBM ৭ʑͳύοέʔδϚωʔδϟ
$ ͷDPOBO͍ͮΒ͍
poac ▸ ΠϯλϑΣʔε͕ײత ▸ ཚཱͨ͠ྑ͍ࢿ࢈ΛవΊͯఏڙ ▸ ύοέʔδϚωʔδϟ݉ϏϧυγεςϜ ▸ GitHub: https://github.com/poacpm
Website: https://poac.io
None
QPBDͷ༝དྷᶃ Plus of Cͷpocͩͱඪ͕େྔʹऔΒΕ͍ͯͯා͔ͬͨ
ൃԻʹӨڹΛ༩͑ͳͦ͞͏ͳԻΛೖΕͯɼpoacʹͨ͠ QPBDͷ༝དྷᶃ
QPBDͷ༝དྷᶄ ίϚϯυͱͯ͠Կೖྗ͢ΔͷͰɼ ଧͪ͘͢ɼยख͚ͩʹෛ୲͕ภΒͳ͍ࣄΛॏࢹ ྲྀΕΔΑ͏ʹଧͭ͜ͱ͕Մೳ P, O ӈख A, C ࠨख
QPBDͷ༝དྷᶅ /p/࠷໌Δ͍ҹΛ༩͑Δ ग़యɿຊޠΦϊϚτϖͷجຊײ࣍ݩͱຊޠԻײૉͷجຊϨϕϧʹ͍ͭͯ (http://hdl.handle.net/10112/12311)
QPBDͷ༝དྷᶅ /p/࠷ॊΒ͔͍ҹΛ༩͑Δ ग़యɿຊޠΦϊϚτϖͷجຊײ࣍ݩͱຊޠԻײૉͷجຊϨϕϧʹ͍ͭͯ (http://hdl.handle.net/10112/12311)
QPBDͷϩΰ ੨ ਫ ւ ޫ ਂւ C++ͷҋ
QPBDͷϩΰ ޫ C++ͷҋ
ରԠ04 ▸ NBD04 TJFSSB ▸ -JOVY Y@ ▸
8JOEPXT 84-
༻ٕज़ 4FSWFS Frontend Elm firebase hos2ng $MJFOU C++ Backend TypeScript
firebase func2ons Upload API Golang App Engine
▸ JOTUBMM ύοέʔδΛΠϯετʔϧ ▸ VOJOTUBMM ύοέʔδΛΞϯΠϯετʔϧ ▸
TFBSDI ύοέʔδΛݕࡧ ▸ JOJU QPBDZNMϑΝΠϧΛੜ ▸ OFX ϓϩδΣΫτςϯϓϨʔτΛੜ ▸ QVCMJTI ࣗ࡞ύοέʔδΛެ։ ▸ UFTU ςετΛߦ͏ ▸ VQEBUF ύοέʔδΛΞοϓσʔτ ▸ CVJME Ϗϧυ͢Δ ▸ SVO Ϗϧυͱ࣮ߦΛߦ͏ αϒίϚϯυ Ұ෦
None
None
None
None
ΞʔΩςΫνϟ $ poac args... vector<string> Command I/O Builder Resolver components
Inference
*OGFSFODF template <typename S, typename OpTypeE, typename VS, typename=std::enable_if_t<std::is_rvalue_reference_v<VS&&>>> auto
_apply(S&& func, const OpTypeE& cmd, VS&& arg) { return branch(std::move(func), cmd, std::move(arg)); } template <typename S, typename VS, typename=std::enable_if_t<std::is_rvalue_reference_v<VS&&>>> std::string apply(S&& func, const S& cmd, VS&& arg) { namespace except = core::exception; if (auto itr = subcmd_map.find(cmd); itr != subcmd_map.end()) return _apply(std::move(func), itr->second, std::move(arg)); else if (itr = option_map.find(cmd); itr != option_map.end()) return _apply(std::move(func), itr->second, std::move(arg)); else throw except::invalid_first_arg("Invalid argument"); }
*OGFSFODF // Create function pointer table: { &func<0>, &func<1>, ...
} // Execute function: &func<idx>[idx]() template <size_t... Is, typename VS, typename = std::enable_if_t<std::is_rvalue_reference_v<VS&&>>> static auto execute(std::index_sequence<Is...>, int idx, VS&& vs) { // Return ""(empty string) because match the type to the other two functions. return make_array({ +[](VS&& vs){ return (op_type_list_t::at_t<Is>()(std::move(vs)), ""); }... })[idx](std::move(vs)); } template <size_t... Is> static auto summary(std::index_sequence<Is...>, int idx) { return make_array({ +[]{ return op_type_list_t::at_t<Is>::summary(); }... })[idx](); } template <size_t... Is> static auto options(std::index_sequence<Is...>, int idx) { return make_array({ +[]{ return op_type_list_t::at_t<Is>::options(); }... })[idx](); }
($$ͷόά #if BOOST_COMP_GNUC template <typename T, typename VS, typename =
std::enable_if_t<std::is_rvalue_reference_v<VS&&>>> static auto execute2(VS&& vs) { return (T()(std::move(vs)), ""); } template <typename T> static auto summary2() { return T::summary(); } template <typename T> static auto options2() { return T::options(); } template <size_t... Is, typename VS, typename = std::enable_if_t<std::is_rvalue_reference_v<VS&&>>> static auto execute(std::index_sequence<Is...>, int idx, VS&& vs) { using func_t = decltype(&execute2<op_type_list_t::at_t<0>, VS>); static func_t func_table[] = { &execute2<op_type_list_t::at_t<Is>>... }; return func_table[idx](std::move(vs)); } template <size_t... Is> static auto summary(std::index_sequence<Is...>, int idx) { using func_t = decltype(&summary2<op_type_list_t::at_t<0>>); static func_t func_table[] = { &summary2<op_type_list_t::at_t<Is>>... }; return func_table[idx](); } template <size_t... Is> static auto options(std::index_sequence<Is...>, int idx) { using func_t = decltype(&options2<op_type_list_t::at_t<0>>); static func_t func_table[] = { &options2<op_type_list_t::at_t<Is>>... }; return func_table[idx](); } #else
ΞʔΩςΫνϟ $ poac args... vector<string> Inference Command I/O Builder Resolver
components
3FTPMWFS core semver SAT solver
compiler shell-command core #VJMEFS
*0 cli network file
ΞʔΩςΫνϟ $ poac args... vector<string> Inference Command I/O Resolver Builder
components
ΞʔΩςΫνϟ vect B Re com Client API
Client ΞʔΩςΫνϟ API
"1* #BTJD 6QMPBE (PMBOH 5ZQFTDSJQU
None
ࠓޙ͍ͬͯ͘͜ͱ ▸ ύοέʔδͷՃɾඋ ▸ υΩϡϝϯτͷ֦ॆ ▸ ϏϧυγεςϜվળ ▸ ͷվળ ▸
ιʔείʔυͷվળ ▸ ΤσΟλͷ֦ுػೳ։ൃ ▸ ϏϧυࡁΈύοέʔδͷΠϯετʔϧ ▸ άϩʔόϧΠϯετʔϧ ▸ EFW%FQFOEFODZɾUFTU%FQFOEFODZ ▸ EPDίϚϯυɾGNUίϚϯυ
poac ▸ ΠϯλϑΣʔε͕ײత ▸ ཚཱͨ͠ྑ͍ࢿ࢈ΛవΊͯఏڙ ▸ ύοέʔδϚωʔδϟ݉ϏϧυγεςϜ ▸ GitHub: https://github.com/poacpm
Website: https://poac.io