
- TOP
- ã¿ã°äžèЧ
- Cèšèª
Cèšèª
ã€ãã³ã

ãã¬ãžã³
æè¡ããã°
ã¯ããã« ããã«ã¡ã¯ãã¯ã©ãŠããšãŒã¹æ ªåŒäŒç€Ÿ 第äºéçºéšã®ç°äžã§ãã ããã°ã©ã ã³ãŒããåãªããæååããšããŠäžèŽæ€çŽ¢ããã®ã§ã¯ãªãããã®ãåŠçå
å®¹ïŒæå³ïŒãã§æ€çŽ¢ãããæ¯èŒãããã§ããã䟿å©ã ãšæããŸãããïŒ ç€Ÿå
ã®ã³ãŒãããŒã¹ãå¢ããã»ã©ãããã®åŠçãã©ãã«ãã£ãã£ãïŒããšæå³ã§æ€çŽ¢ããããªãå Žé¢ã¯å€ããšæããŸãã ä»åã¯ãGoogle Cloud ã® BigQuery ã§æäŸãããŠãã AI.EMBEDïŒãšã³ããã£ã³ã°çæïŒã䜿ã£ãŠãç°ãªãããã°ã©ãã³ã°èšèªéããã³ãŒããšæ¥æ¬èªïŒèªç¶èšèªïŒã®ãæå³çãªè¿ãããæž¬ãå®éšãããŠã¿ãŸããã åã蟌ã¿ã¢ãã«ã«ã¯ gemini-embed
ã¯ããã« ãšã³ã¿ãŒãã©ã€ãº ç¬¬äžæ¬éšã2025 Japan AWS Jr. Champions ã®äœè€æ ã§ãã ç§ã¯ Kubernetes ãè§Šãæ©äŒãå€ãããã®äžã§ãç£èŠã«æè¿èå³ãæã£ãŠããŸãã ç£èŠãå®çŸããã»ãã¥ãªãã£ãœãªã¥ãŒã·ã§ã³ã®äžã« Tetragon ãªã©ãæããããŸããããã®ç£èŠã®ããŒã¹ãšãªã£ãŠããæè¡ã«eBPFããããŸãã ãã®eBPFãEC2 ã€ã³ã¹ã¿ã³ã¹ ã® Amazon Linux äžã§åãããŠããã®é¢çœããšäœãèµ·ããŠããã®ãã解説ããŸãã ã¯ããã« LinuxãŠãŒã¶ãŒç©ºé/ã«ãŒãã«ç©ºé ã«ãŒãã«ã¢ãžã¥ãŒã« ç°å¢ ã«ãŒãã«ãããã®ã€ã³ã¹ããŒã« ãœãŒã¹ã³ãŒãã®ä¿å Makefileã®äœæ ã¢ãžã¥ãŒã«ã®ãã«ã ã¢ãžã¥ãŒã«ã®ããŒã ã¢ãžã¥ãŒã«ã®ãªã¹ã ã¢ãžã¥ãŒã«ã®ã¢ã³ããŒã ææ³ ãããããeBPF eBPF Verifier åŒã³åºããã«ãŒãã«é¢æ°ã¯ããªãéå®ç Stepã®å¶é ã¡ã¢ãªã¢ã¯ã»ã¹ã®å¶é NULLãã€ã³ã¿åç
§ããªãã eBPFã§Hello World ç°å¢ ãã¡ã€ã«ã®äœæ å®è¡ çµæ ææ³ ãããŠTetragonãž... ãããã« Linux ãŠãŒã¶ãŒç©ºé/ ã«ãŒã㫠空é ãŸãã¯eBPFã®èæ¯ç¥èãšã㊠Linux ã®ãŠãŒã¶ãŒç©ºéãš ã«ãŒã㫠空éã«é¢ããŠçè§£ããå¿
èŠããããŸã äžå³ã®ããã« Linux ã«ã¯ãŠãŒã¶ãŒç©ºéãš ã«ãŒã㫠空éãšãããã®ãååšããŠããŸãã ããã¯äžåºŠ ã«ãŒãã« ãçµç±ãããããšã§ç©çã ãã€ã¹ ãžã®ã¢ã¯ã»ã¹ãå¶åŸ¡ããã®ãšå
±ã«ãããã»ã¹ãå©çšãããªãœãŒã¹ã®äžå
管çãè¡ãé
åãããçãããããŸãã ãã®ãããŠãŒã¶ãŒãš ã«ãŒãã« ã®ç©ºéãåºåãã ã·ã¹ãã ã³ãŒã« ãšããã€ã³ã¿ãŒãã§ãŒã¹ã§ã®ã¿ ã«ãŒãã« ãžã¢ã¯ã»ã¹ã匷å¶ããã¢ã¯ã»ã¹å¶åŸ¡ãšãªãœãŒã¹é
åãæŒããªãå®çŸããŠãããšããããã§ãã 以äžã¯lsã³ãã³ããå®è¡ãããšãã«åŒã³åºãããŠãã ã·ã¹ãã ã³ãŒã« ã§ãã ããŸããŸãª ã·ã¹ãã ã³ãŒã« ãçµã¿åãã㊠ã«ãŒãã« ã«ã¢ã¯ã»ã¹ããŠãã³ãã³ãã®å®è¡çµæãåºåããŠããããšãçè§£ã§ããŸããã $strace -c ls % time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ---------------- 0.00 0.000000 0 7 read 0.00 0.000000 0 3 write 0.00 0.000000 0 23 close 0.00 0.000000 0 30 mmap 0.00 0.000000 0 7 mprotect 0.00 0.000000 0 1 munmap 0.00 0.000000 0 3 brk 0.00 0.000000 0 2 ioctl 0.00 0.000000 0 4 pread64 0.00 0.000000 0 2 2 access 0.00 0.000000 0 1 execve 0.00 0.000000 0 2 2 statfs 0.00 0.000000 0 2 1 arch_prctl 0.00 0.000000 0 1 futex 0.00 0.000000 0 2 getdents64 0.00 0.000000 0 1 set_tid_address 0.00 0.000000 0 34 13 openat 0.00 0.000000 0 22 newfstatat 0.00 0.000000 0 1 set_robust_list 0.00 0.000000 0 1 prlimit64 0.00 0.000000 0 1 getrandom 0.00 0.000000 0 1 rseq ------ ----------- ----------- --------- --------- ---------------- 100.00 0.000000 0 151 18 total ããã§ããã»ã¹ã¯ ã«ãŒãã« ãçµç±ãããããã¢ããªã±ãŒã·ã§ã³ã®æ¯ãèã㯠ã«ãŒãã« ãèŠãŠããã°ç£èŠã§ããã®ã§ã¯ïŒãšããæ°ã¥ããããããã§ãã ã«ãŒãã« ã¢ãžã¥ãŒã« ãããã Linux ã® ã«ãŒãã« ã«ã³ãŒãã®å€æŽããããïŒããšæã£ãŠãã Linux ã®å©çšãããŠããèŠæš¡ãããããã®ã³ãŒãéãªã©ãéã¿ããšãã³ãã¥ããã£ã®çè§£ãåŸãŠãéçºã®ã³ã¹ãããããŠãã¢ããã¹ããªãŒã ã«ãªããŸã§åŸ
ã€ãšããæ°ã®é ããªãæéããããäœæ¥ãšãªã£ãŠããŸããŸãã ãã®åé¡ã«å¯ŸããŠã Linux 㯠ã«ãŒãã« ã®å€æŽã»æ¡åŒµã®ããã«ã¢ãžã¥ãŒã«ãåãå
¥ããããã«ã§ããŠããŸãã ããã ã«ãŒãã« ã¢ãžã¥ãŒã«ã®æŠå¿µã§ãã ã§ã¯ã ã«ãŒãã« ã¢ãžã¥ãŒã«ãäœæããŠã¿ãŸãã ç§ã¯ Cèšèª ã®çµéšããªãã®ã§ä»¥äžã®æžç±ã Linux Device Drivers, 3rd Editionãã®Chapter2 p16 The Hello world Moduleã®é
ãåèã«ããŸããã åèïŒ https://www.oreilly.com/library/view/linux-device-drivers/0596005903/ch02.html é©åœã«å€æŽããŠgogo.cãäœæããŸãã 以äžã®ã¢ãžã¥ãŒã«ã ã«ãŒãã« ã«ããŒããããšgo!go!ãã¢ã³ããŒããããšbyebye!ãšãã°ãããã¡ã«åºåããŸãã #include <linux/module.h> #include <linux/kernel.h> MODULE_LICENSE ( "GPL" ); //ããŒãããããå®è¡ããã颿° static int gogo ( void ) { printk (KERN_ALERT "go!go! \n " ); return 0 ; } //ã¢ã³ããŒãããããå®è¡ããã颿° static void byebye ( void ) { printk (KERN_ALERT "byebye! \n " ); } module_init (gogo); module_exit (byebye); ãããä»åã®ã¢ãžã¥ãŒã«ã§ãã ã§ã¯ããŒã/ã¢ã³ããŒãããŠã¿ãŸãã ç°å¢ ã¢ãŠãããŠã³ã443ããŒãã®éä¿¡ã®ã¿ãèš±å¯ãããµããããå
ã§ãã EC2 ã€ã³ã¹ã¿ã³ã¹ ã§ Amazon linux ãèµ·åããSessionManagerã§æ¥ç¶ãããŠããŸãã sh-5.2$ cat /etc/os-release NAME="Amazon Linux" VERSION="2023" ID="amzn" ID_LIKE="fedora" VERSION_ID="2023" PLATFORM_ID="platform:al2023" PRETTY_NAME="Amazon Linux 2023.8.20250804" ANSI_COLOR="0;33" CPE_NAME="cpe:2.3:o:amazon:amazon_linux:2023" HOME_URL="https://aws.amazon.com/linux/amazon-linux-2023/" DOCUMENTATION_URL="https://docs.aws.amazon.com/linux/" SUPPORT_URL="https://aws.amazon.com/premiumsupport/" BUG_REPORT_URL="https://github.com/amazonlinux/amazon-linux-2023" VENDOR_NAME="AWS" VENDOR_URL="https://aws.amazon.com/" SUPPORT_END="2029-06-30" ã«ãŒãã« ãããã®ã€ã³ã¹ããŒã« sudo dnf install gcc make kernel-devel kernel-headers Last metadata expiration check: 1:37:35 ago on Sat Oct 18 05:49:32 2025. Package gcc-11.5.0-5.amzn2023.0.4.x86_64 is already installed. Package make-1:4.3-5.amzn2023.0.2.x86_64 is already installed. Package kernel-devel-1:6.1.147-172.259.amzn2023.x86_64 is already installed. Package kernel-headers-1:6.1.147-172.259.amzn2023.x86_64 is already installed. Dependencies resolved. Nothing to do. Complete! ãœãŒã¹ã³ãŒã ã®ä¿å #å
ã»ã©ã®ãã¡ã€ã«ãã³ãã sh-5.2$ sudo vim gogo.c sh-5.2$ cat gogo.c #include <linux/module.h> #include <linux/kernel.h> MODULE_LICENSE("GPL"); //ããŒãããããå®è¡ããã颿° static int gogo(void) { printk(KERN_ALERT "go!go!\n"); return 0; } //ã¢ã³ããŒãããããå®è¡ããã颿° static void byebye(void) { printk(KERN_ALERT "byebye!\n"); } module_init(gogo); module_exit(byebye); Makefile ã®äœæ åã ãã£ã¬ã¯ã ãªã§ Makefile ãäœæ sh-5.2$ sudo vim Makefile sh-5.2$ sudo cat Makefile obj-m += gogo.o all: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules clean: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean ã¢ãžã¥ãŒã«ã®ãã«ã make gogo.koãåºæ¥ãŸããã ã¢ãžã¥ãŒã«ã®ããŒã â»ç§ã«ã¯ãã®æ«å°Ÿã®ãã°ã¯çŽ«ã«å
ã£ãŠèŠããŠããŸãã sh-5.2$ sudo insmod gogo.ko sh-5.2$ sudo dmesg | tail ... [ 6689.540149] gogo: loading out-of-tree module taints kernel. [ 6689.540977] gogo: module verification failed: signature and/or required key missing - tainting kernel [ 6689.542802] go!go! ã¢ãžã¥ãŒã«ã®ãªã¹ã lsmodã§ç¢ºèªããŸãããgogoã¢ãžã¥ãŒã«ããããŸãã sh-5.2$ lsmod Module Size Used by gogo 16384 0 ã»ã»ã» ã¢ãžã¥ãŒã«ã®ã¢ã³ããŒã sh-5.2$ sudo rmmod gogo sh-5.2$ sudo dmesg | tail ... [ 6689.540149] gogo: loading out-of-tree module taints kernel. [ 6689.540977] gogo: module verification failed: signature and/or required key missing - tainting kernel [ 6689.542802] go!go! [ 6999.290169] byebye! ææ³ ãããªã«æè»œã« ã«ãŒãã« ãæ¡åŒµã§ãããã§ããã ãšããã§ã ã«ãŒãã« ã¢ãžã¥ãŒã«ãããŒãããã¿ã€ãã³ã°ã§ä»¥äžã®ãã°ãåºãŠããŸãã loading out-of-tree module taints kernel. ããªãŒå€ïŒå
¬åŒå€ïŒã®ã¢ãžã¥ãŒã«ãããŒãããããã ã«ãŒãã« ãæ±æãããŸãããïŒç¿»èš³ïŒChatGPTïŒ ãŸãèªäœã®ã¢ãžã¥ãŒã«ãªã®ã§ãã¡ãã»ãŒãžã®éãã§ããã ãã ã宿ãªã¢ãžã¥ãŒã«ã®ããŒãã£ãŠèªäœã第 äžè
ã®æäŸãåãã ã«ãŒãã« ãå£ããå¯èœæ§ããããªã¹ã¯ã倧ãããã ãšæããŠããŸãã ãããããeBPF ãã㪠ã«ãŒãã« ã¢ãžã¥ãŒã«ã®ä»£ããã«ç»å Žããã®ã eBPF ã§ãã eBPF㯠ã«ãŒãã« ã® ãœãŒã¹ã³ãŒã ã®æ¹å€ãã ã«ãŒãã« ã¢ãžã¥ãŒã«ã®ããŒããå¿
èŠãšããã«ãå®å
šãã€å¹çç㪠ã«ãŒãã« ã®æ©èœæ¡åŒµã«å©çšãããŠããŸãã åèïŒ https://ebpf.io/ja/what-is-ebpf/ ãã® å®å
šãªæ¡åŒµ ã¯äž»ã«eBPF Verifierã«ãã£ãŠä¿éãããŠããŸã eBPF Verifier eBPF ããã°ã©ã ã¯ã¯ã©ãã·ã¥ãããã·ã¹ãã ã«æªåœ±é¿ãåãŒãããããŸããã ããã°ã©ã ã¯åžžã«å®è¡ãå®äºããŸãïŒã€ãŸããããã°ã©ã ã¯ç¡éã«ãŒãã«é¥ã£ãŠåŠçãå®è¡ãç¶ããããããšã¯ãããŸããïŒã åèïŒ https://ebpf.io/ja/what-is-ebpf/ ãã®eBPF VerifierïŒæ€èšŒåšïŒã§ãã§ãã¯ããŠããå
容ã¯å€å²ã«ããã£ãŠãããããç§ã調æ»ããç¯å²ã§ä»£è¡šçãªé
ç®ã以äžã«åæããŸãã åŒã³åºãã ã«ãŒãã« é¢æ°ã¯ããªãéå®ç åºæ¬çã«ã¯å®å
šæ§ãæ€èšŒããããã«ããŒé¢æ°ãã䜿ããŸããã ãã«ããŒé¢æ°ã§ãé¢ä¿å€ã®é¢æ°ãåŒãŒããšãããšãšã©ãŒãšãªããŸãã â»BPFããã°ã©ã ã¿ã€ãã®æŠå¿µ Stepã®å¶é 100äžStepã®æç€ºæ°ã«ä»¥å
ã®æã«éãèš±å¯ããããšã§ãCPUãå æããªãããã«ããŠããŸã ã¡ã¢ãªã¢ã¯ã»ã¹ã®å¶é ã¢ã¯ã»ã¹å¯èœãªç¯å²å€ã®ã¡ã¢ãªã«è§ŠããŸããã â»eBPF mapãšããæŠå¿µã䜿çšã㊠ã«ãŒãã« ãšãŠãŒã¶ãŒç©ºéã§ããŒã¿ã®ããåããããŸãã NULLãã€ã³ã¿åç
§ããªãã ãã ïŒãã»âã»ïŒããã|ã|ãïŸïœ¯ ãããšããããïŒã ã |ã| ããã ã/ãããã 人 ãããã /ãïŒã ã < ã>__Îâ© ãã /ã'ãïŒïŒ. ïœÐÂŽïŒ/ ããïŒïŒ¿ã圡ããããã ãã/ ãã以äžã«ãããã£ãšããããã®æ€èšŒäºããã£ãŠå®å
šæ§ãä¿éããŠããŸãã ããã«èžã¿èŸŒããšãåãããªãããšã ããã«ãªã£ãŠããŸãã®ã§ããããŸããŸãªæ€èšŒãçµãŠã ã«ãŒã㫠空éã§ã®å®è¡ãèš±ãããããšããŠãããŸãã eBPFã§ Hello World ã§ã¯eBPFããã°ã©ã ã®å®è£
ãããŸãã ããã¯ä»¥äžã®æžç±ãå
¥éeBPFã2ç« p15 eBPFã®ã Hello World ããåèã«ããŠããŸãã åèïŒ https://www.oreilly.co.jp/books/9784814400560/ BCC ã® Python ã©ã€ãã©ãªã§ Cèšèª ã§æžããeBPFã³ãŒãã ãã€ãã³ãŒã ãžå€æãã ã«ãŒã㫠空éã«ããŒããããŸãã #!/usr/bin/python from bcc import BPF program = r""" int hello(void *ctx){ bpf_trace_printk("Hello World!\\n"); return 0; } """ b = BPF(text=program) syscall = b.get_syscall_fnname( "execve" ) b.attach_kprobe(event=syscall, fn_name= "hello" ) b.trace_print() ããããåè§£ããªãã解説ããŸãã 以äžã®ã³ãŒãã ã«ãŒãã« ã«ããŒããããeBPFã³ãŒãã§ãã program = r""" int hello(void *ctx){ bpf_trace_printk("Hello World!\\n"); return 0; } """ eBPFã®ããã°ã©ã äœææã«ã¯ãå
è¿°ã®ãã«ããŒé¢æ°ã®1ã€ãbpf_trace_printk()ãçšããŠåºåããŠããããšãåãããŸãã ãã® Cèšèª ã ã³ã³ãã€ã« ããŠåäœããããã«ããŸãã b = BPF(text=program) 以äžã®ããã«æžãããšã§ãBPFãªããžã§ã¯ãã®çææã«åŒæ°ã«æž¡ãããšã§ BCC ã« ã³ã³ãã€ã« ãããŸãã syscall = b.get_syscall_fnname( "execve" ) 次ã®ã³ãŒãã§ãã€ããªã®ãã¹ãæž¡ããŠå®è¡ãã ã·ã¹ãã ã³ãŒã« ãexecve()ãã®é¢æ°åãååŸããŸãã b.attach_kprobe(event=syscall, fn_name= "hello" ) ããã§execve()ã«é¢æ°helloãã¢ã¿ããããŸãã kprobeãšã¯ Linux ã«ãŒãã« ã®ä»»æã®é¢æ°ãåœä»€ã®å®è¡æã«åçã«ããã¯ããŠåŠçãæ¿å
¥ã§ããä»çµã¿ã§ã ãã®ããã°ã©ã ã ã«ãŒãã« ã«ããŒãããããšãexecve()ãå®è¡ãããéã«ã¯ hello World ãtrace_pipeïŒãŠãŒã¶ãŒç©ºéããååŸå¯èœïŒã«åºåãããŸãã b.trace_print() æåŸã«ããã¬ãŒã¹ããŒã¿ã Python ãå®è¡ãããŠããæšæºåºåãžåºåããŸãã å®éã«åãããŠã¿ãŸãã ç°å¢ ã«ãŒãã« ã¢ãžã¥ãŒã«ã®æ€èšŒæãšåæ§ ãã¡ã€ã«ã®äœæ sh-5.2$ sudo vim hello.py sh-5.2$ cat hello.py #!/usr/bin/python from bcc import BPF program = r""" int hello(void *ctx){ bpf_trace_printk("Hello World!\\n"); return 0; } """ b = BPF(text=program) syscall = b.get_syscall_fnname("execve") b.attach_kprobe(event=syscall, fn_name="hello") b.trace_print() å®è¡ #å®è¡æš©éã®ä»äž h-5.2$ sudo chmod +x hello.py sh-5.2$ sudo ./hello.py ã¡ãªã¿ã«eBPFã¯ååç¹æš©ãŠãŒã¶ãŒã§ããå®è¡ã§ããªãã®ã§ã./hello.pyã®å®è¡ã ãšä»¥äžã®ããã«ãªããŸã sh-5.2$ ./hello.py bpf: Failed to load program: Operation not permitted Traceback (most recent call last): File "/home/ssm-user/./hello.py", line 13, in <module> b.attach_kprobe(event=syscall, fn_name="hello") File "/usr/lib/python3.9/site-packages/bcc/__init__.py", line 841, in attach_kprobe fn = self.load_func(fn_name, BPF.KPROBE) File "/usr/lib/python3.9/site-packages/bcc/__init__.py", line 523, in load_func raise Exception("Need super-user privileges to run") Exception: Need super-user privileges to run çµæ sh-5.2$ sudo ./hello.py b' <...>-46202 [001] ...21 84764.107466: bpf_trace_printk: Hello World!' b' <...>-46203 [001] ...21 84823.020341: bpf_trace_printk: Hello World!' äœãæäœããŠãªããŠãè£ã§execve()ã£ãŠåŒã°ããŠãããã§ããã å¥ã®æ¥ç¶ãéããŠlsçã®ã³ãã³ããæã€ãšã Hello World !ãåæã«åºåãããã®ãåãããŸãã ææ³ ãã®ããã«ç¹å®ã® ã·ã¹ãã ã³ãŒã« ã«çŽã¥ããŠãç£èŠã§ãããšåãããŸããã ãŸããä»åã®å®éšã§ã¯äœããå®è¡ããããšããæ
å ±ãããªãã§ãã... ãããŠTetragonãž... ãã®ããã«eBPF㯠ã«ãŒãã« ã§åäœã§ããã®ã§ãå®è¡ç°å¢ã§ç£èŠã®ç¯å²ãåºããããããã«æããŸãã ãã åœç¶ã§ãããæ¯åç£èŠã®ããã®ã³ãŒããæžãã®ã¯èŸããã®ããããŸãã ããã§ãã¯ããã«äŸã«ãããTetragonã®ãããªeBPFãããŒã¹ã«ãããµãŒãã¹ãå©çšãããã§ããã ãããŸã§ããã°ã Kubernetes ã§ã¯ããããç£èŠã® ãµã€ãã«ãŒ ã³ã³ããå©çšã«å¯ŸããŠãeBPFãšããåãå£ã§ç£èŠãæäŸãããšãã«æ¡åŒµãããç¯å²ãããã£ãŠãããšæããŸãã ã¡ã€ã³ã³ã³ããã«å¯ŸããŠåãããªã¥ãŒã ãå
±æãã localhost ã§æ¥ç¶å¯èœãª ãµã€ãã«ãŒ ã³ã³ãããšããŠå®è¡ããç£èŠïŒäŸïŒDatadogã® ãµã€ãã«ãŒ ã€ã³ãžã§ã¯ã·ã§ã³ïŒã«å ããŠãããŒãã«DaemonSetsãšããŠãããã€ãããããšã§ã ã«ãŒãã« ã§å®è¡ãããå®è¡ã€ãã³ããŸã§ç£èŠã®ç®ãåºããããšãã§ããŸããã åèïŒ https://tetragon.io/docs/getting-started/execution/ æ¬èšäºã§ã¯eBPFã®ç޹ä»ãªã®ã§ãTetragonã®è©³çްã®è§£èª¬ã¯çç¥ããŸãã ãããã« eBPFã§ã¯ããèãèŠãããŸãããããã¯eBeeãšããååã§ãã ç§ãã¡ã¯äžç·ã«åããŠããã仲éãåéããŠããŸãïŒ é»éç·ç ãã£ãªã¢æ¡çšãµã€ã é»éç·ç æ°åæ¡çšãµã€ã å·çïŒ @sato.yu ã¬ãã¥ãŒïŒ @akutsu.masahiro ïŒ Shodo ã§å·çãããŸãã ïŒ
ã¯ãããŸããŠïŒæ ªåŒäŒç€Ÿã¹ã¿ã¡ã³ã§ããã¯ãšã³ããšã³ãžãã¢ãããŠãã ã¡ãã ãšç³ããŸãã ãã®åºŠã2025/9/6(å)ã«éå¬ãããããªããRubyäŒè°01ãã«åå ããŸããã äŒå Žã¯å²éçã®ãããããã¥ãŒãžã¢ã ãã§ãèªç¶ã«å²ãŸããçŽ æµãªå Žæã§ããâš è¿ãã«ã¯éè¯å±±(ããããã)ããããå±±é ã«ç¯ãããå²éåãèŠããŸãð¯ ãããäŒå ŽãžïŒ ãŸãé©ããã®ã¯ããä»åéå¬ãããããªããRubyäŒè°01ãã§ãããããªããšå¿åã¯ã»ãŒæºå¡...ïŒ æ±æµ·å°æ¹ã«ããããã ãå€ãã®RubyistãéãŸããç±éãæã£ãŠäº€æµã§ããå Žãããããšã«ææ¿ããŸããã ã¡ãªã¿ã«ãnagara.rbã¯ãä»åã®ããªããRubyäŒè°01ãã§èšå¿µãã¹ã第100åç®ã®éå¬ã ããã§ããRubyã³ãã¥ããã£ãäœã£ãŠãããå
人ãã¡ã«æè¬ã§ãã ã¢ãã¿ãŒããŒãã£ãŒã§ã¯ãçãããšéµé£Œã«åå ããŸãã⚠以äžã宿œãããããã°ã©ã å
容ãšãªããŸãïŒ ãµããµãããžã¥ãã¢ãšã³ãžãã¢ã®èªåã«ãšã£ãŠãç®ã®åã« Ruby ã®ã¢ã¿ã©ã·ã€äžçãåºãã£ãŠããã...ð€ regional.rubykaigi.org ãã®èšäºã§ã¯ãç¹ã«æ°ã«ãªã£ãã»ãã·ã§ã³ã«ã€ããŠã玹ä»ãããŠããã ããŸãã refinementsã®ã¡ãœããå®çŸ©ã4000åéããã話 ã¹ããŒã«ãŒïŒalpaca ããïŒ @alpaca_tc ïŒ speakerdeck.com 瀟å
ã§ Ruby ãã¢ããããŒããããšãããã©ãããã¢ããªã±ãŒã·ã§ã³ã®èµ·åããã¡ã€ã«å€æŽæã«ãããåæ ãé
ããªã£ãŠããŸã£ãããã§ãã ãã®ããã vernier ãšãã gem ã䜿ã£ãŠå®éã«é床ãèšæž¬ããŸãã ãããšãRuby3.2 ãšæ¯ã¹ãŠ Ruby3.3以éã§ã¯ã Module#refine ãåŒã³åºãã¿ã€ãã³ã°ã§ããªããšå®è¡æéã«4000å以äžãã®å·®åãèŠãããããã§ãðïŒ èšæž¬ ïŒ Module#refine ãšã¯ãç°¡åã«ãããšãã¢ã³ããŒããããå®å
šã«äœ¿ãããã®ä»çµã¿ãã§ãã äŸãã°ã以äžã®ããã«æžããšãString å
šäœã« shout ã¡ãœãããå®çŸ©ãããŠããŸããŸãã class String def shout self .upcase + " ! " end end " hello " .shout # => "HELLO!" ããããrefine ã䜿ãããšã§ãã¢ãžã¥ãŒã«å
ã§ã®å®çŸ©ã«ã¹ã³ãŒããéå®ããããšãå¯èœãšãªããŸãã module StringRefinement refine String do def shout self .upcase + " ! " end end end using StringRefinement # ãã¡ããå®è¡ããå Žåã®ã¿æå¹ã«ïŒ " hello " .shout # => "HELLO!" ã§ã¯ããã® refine ããªãé
ããªã£ãŠããŸã£ãã®ã§ãããã...ïŒ ããããåå 調æ»ã«å
¥ããŸãã 調æ»ãç¶ããŠãããã¡ã«ãrubyãªããžããªå
ã§ rb_clear_all_refinement_method_cache(); ã®åŠçã远å ãããããšã倿ããŸãã ãããæªããã®ã§ã¯...ïŒð ããã§ãå®éã« Revert ããããåœãŠãŠç¢ºèªãããšããªããšéåºŠãæ¹åãããŸããð ïŒ åçŸ ïŒ ã€ãŸããRuby3.3以éã§ã¯ãrefineã«é¢é£ãã callcache ã®ç¡å¹ååŠçã远å ãããããã«ãã£ãŠããã©ãŒãã³ã¹ãªã°ã¬ãã·ã§ã³ãèµ·ãã£ãŠããŸã£ãã®ã§ããã callcacheãšã¯ãåãã¡ãœãããå床åŒã³åºããšãã«ã以åã®åŒã³åºãçµæãåå©çšããä»çµã¿ãã®ããšã§ãã PR ã«ããããã«ãrefineã«é¢ãããã£ãã·ã¥ã«ãããã°ãçºçããŠããŸã£ãããã«ããã®ãã£ãã·ã¥ã䜿çšããªã倿Žãåæ ããããã§ããã Rubyã§ã¯ãã¡ãœãããå®è¡ããéãç¶æ¿ãã§ãŒã³ã«æ²¿ã£ãŠé ã«ã¡ãœããå®çŸ©ãæ¢ããŸãã ããããä»åã® alpacaããã®ã±ãŒã¹ã§ã¯ã ObjectSpace ã«ãªããšã70åã®ãªããžã§ã¯ããååšããããã§ã...ð³ ãã®ãããrefine é¢é£ã®ã¡ãœããæ¢çŽ¢ããã£ãã·ã¥ãããªãå Žåãçžåœã®ãªãŒããŒããããçºçããããšã¯æ³åã§ããŸãã...ã ããã§ alpacaããã¯ãrefine callcache å°çšã®æ ŒçŽå
ãçšæããæ¹éã§å®è£
ããããšã«ããããã§ãã ããããåç¥ã®éããRuby 㯠Cèšèªã§æžãããŠããŸãããã®ãããäžèšã®æ¹éãCèšèªã§æžããŠå®çŸããå¿
èŠããããŸãã Rubyistã«ãšã£ãŠããªããªã倧å€ãªäœæ¥ã ãšèããããŸã...ã alpacaããã¯æ¡ã®å®ãCèšèªç¹æã®GCïŒã¬ããŒãžã³ã¬ã¯ã·ã§ã³ïŒã«ããã¡ã¢ãªç®¡çããã»ã°ã¡ã³ããŒã·ã§ã³ãã©ãŒã«ãïŒäžæ£ãªã¡ã¢ãªã¢ã¯ã»ã¹ãè¡ã£ããšãã« OS ã匷å¶çµäºããããšã©ãŒïŒçã«èŠæŠããŸãã ãããããããã«ãããããChatGPT ã rubyhackchallenge ãé§äœ¿ããŠãã€ãã«ããŒãžãŸã§å®çŸããããã§ãïŒðïŒ æ¹å ïŒ ãããã§ãããã 該åœPR: Optimize callcache invalidation for refinements ãããããalpacaããã¯ä»¥äžã®æèšã話ãããŠãŸããã ããã©ãŒãã³ã¹æ¹åã®æµãã¯åãïŒèšæž¬ â åçŸ â æ¹åïŒ AIãã³ãã¥ããã£ã®å©ããåŸãŠè²¢ç®ã§ãã ãŸããalpacaããã¯ä»¥åã« RubyKaigi ã«ãåå ãããŠãããGC ãã»ã°ãã©ã«ã€ããŠãåŠãã§ããŸãããããããç¥èããå®éã®çŸå Žã§æŽ»ãããããšã宿ãããããã§ãã TUNAGã®ã¢ããªã¹ãšã¢ãŒããã¯ã㣠ãŸããã¹ãã³ãµãŒã»ãã·ã§ã³ãšããŠãåŒç€Ÿã®è¿è€ïŒ @sei_kondo97 ïŒãç»å£ããŸããïŒ åŒç€Ÿã¯ãçŸåš TUNAG ãšãããšã³ã²ãŒãžã¡ã³ããã©ãããã©ãŒã ãæäŸãããŠããã ããŠãããŸããTUNAGã¯ã¢ããªã¹æ§é ã®ã·ã¹ãã ã§ããã幎ã
ãµãŒãã¹å
容ãè¥å€§åããŠãããä»åŸã¯ãµããµãŒãã¹ããµãã¢ããªã±ãŒã·ã§ã³ã«åå²ããåãã¡ã€ã³ããšã«åããŠç®¡çããŠããæ¹éãšãªããŸãã æè¿ã§ã¯ããTUNAGæ¬äœããããTUNAGãã£ããããåé¢ãããŸããããŸãããTUNAGæ¬äœããèªå¯ãµãŒãã¹ãšããŠå©çšããããšã§ããTUNAGãã£ããããžã®SSOãã°ã€ã³ãå¯èœãšãªããŸããã æåŸã« åã¯ä»åãåããŠå°åRubyäŒè°ã«åå ããŸãããããã§æããã®ã¯ã èªåã䜿ã£ãŠããéå
·ã®æ§é ãç¥ãããšã®éèŠæ§ ã§ãã çŸå®ãšããŠãã¢ããªã±ãŒã·ã§ã³åŽã®ãšã³ãžãã¢ã§ããã°ãéå
·ã®äœ¿ãæ¹ããåãã£ãŠããã°ãå
éšæ§é ãç¥ããªããŠãéçºã¯å¯èœã§ãã髿°Žæºèšèªã®åŒ·ã¿ã¯ãŸãã«ããã«ãããŸããããšãã°ãå€ãã®éçºè
ã¯æ©æ¢°èªãã¢ã»ã³ããªã®ä»çµã¿ãç¥ããªããŠãã³ãŒããæžããŸãããç§èªèº«ãç¥ããŸããã ã³ããã¿ãŒã®æ¹ã
ãRubyã®å
éšããã©ãã¯ããã¯ã¹åããŠãããŠãããããããç§ãã¡ã¯äŸ¿å©ã«éçºã§ããŠããããã§ããããããã®äžæ¹ã§ãæ§é ãçè§£ããŠããªãããšã§èŠèœãšããããæé©ãªäœ¿ãæ¹ãã§ããªãå ŽåããããŸãã Rubyã®å
éšãã¡ãœããã®å®è£
ãç¥ã£ãŠããã°ãããã©ãŒãã³ã¹ãã¥ãŒãã³ã°ããããã°ã§ããå¹ççã§å®å
šãªå€æãå¯èœã«ãªããŸããã€ãŸãããéå
·ã®äœ¿ãæ¹ããšãæ§é ã®çè§£ãã¯è¡šè£äžäœã§ãäž¡æ¹ãã£ãŠåããŠæ·±ãå¿çšåãåŸãããã®ã§ã¯ãªãããšæããŸããã ä»åã®ããªããRubyäŒè°01ãã«ãããåŠã³ã¯ãæ®æ®µã¯ãã©ãã¯ããã¯ã¹ãšããŠäœ¿ã£ãŠããéšåã«ãèå³ãæã¡ãä»çµã¿ãç¥ãããšã§ãéçºè
ãšããŠã®èŠéã倿åãåºãããšããããšã§ããããããã¯ãèªåã®ã³ãŒãã ãã§ãªãããã®äžã§åãä»çµã¿ãèæ¯ã«ãç®ãåããŠãããããšæããŸãã æ ªåŒäŒç€Ÿã¹ã¿ã¡ã³ã§ã¯ãäžç·ã«åã仲éãåéããŠããŸãïŒè©³ããã¯ãã¡ããã芧ãã ããð herp.careers















