Conftest OPA ã§ Terraform ã³ãŒãéçºã«å¶çŽãèšãã
ããã«ã¡ã¯ãjedipunkzð ã§ãã Conftest ãš Open Policy Agent (OPA) ã䜿ã£ã Terraform ã®ããªã·ãŒæ€èšŒãè¡ã£ãã®ã§ãããèšäºã«ããããšæããŸããããªã·ãæžãããšã§ Terraform ã³ãŒãã«å¶çŽãå ããã»ãã¥ãªãã£èŠä»¶(äŸãã°æå·åèŠä»¶ãããŒãéæŸèŠä»¶ç) ãæºãããããã¹ããã©ã¯ãã£ã¹ã«ãã£ãã€ã³ãã©ãæ§ç¯ã§ããŸããæ¯åã¬ãã¥ãŒã§äººã«ãã§ãã¯ãããããã確å®ã«å¶çŽãå®ããããã«ãªãã®ã§ããããã§ãã ãã®èšäºã§ã¯ãConftest ãš OPA ã䜿ã£ãŠãTerraform ã³ãŒãã«èªåçã«ããªã·ãŒãã§ãã¯ãé©çšããæ¹æ³ããã¥ãŒããªã¢ã«åœ¢åŒã§è§£èª¬ããŸãã 1. Conftest æŠèŠãšåºæ¬ãã¥ãŒããªã¢ã« 1.1 Conftest ãšã¯ïŒ Conftest ã¯ãæ§é åãããèšå®ããŒã¿ã«å¯ŸããŠããªã·ãŒããã¹ãããããã®ããŒã«ã§ããOpen Policy Agent (OPA) ã® Rego èšèªã䜿çšããŠããªã·ãŒãèšè¿°ããããŸããŸãªèšå®ãã¡ã€ã«ãæ€èšŒã§ããŸãã Conftest ã®ç¹åŸŽ æ±çšæ§ãé«ã TerraformïŒ.tfãtfplan.jsonïŒ KubernetesïŒYAMLãJSONïŒ Dockerfile ãã®ä»ã® JSON/YAML ãã¡ã€ã« ã·ã³ãã«ã§è»œé åäžã®ãã€ããªã§åäœ å€éšäŸåãªã CI/CD ã«ç°¡åã«çµ±åå¯èœ OPA ã® Rego èšèªãæ¡çš 宣èšçãªããªã·ãŒèšè¿° 匷åãªãã¿ãŒã³ãããã³ã° ãã¹ãå¯èœãªããªã·ãŒã³ãŒã ãªã Conftest ãå¿ èŠãªã®ãïŒ åŸæ¥ã®ã€ã³ãã©ç®¡çã§ã¯ã以äžã®ãããªèª²é¡ããããŸããã ã¬ãã¥ãŒã§æ¯ååãææïŒãæå·åãæå¹ã«ããŠãã ããããªã©ïŒ 人çãã¹ã«ããã»ãã¥ãªãã£ããŒã« ç°å¢éã§ã®èšå®ã®äžæŽå ã³ã³ãã©ã€ã¢ã³ã¹éåã®èŠèœãšã Conftest ã䜿ãããšã§ããããã®èª²é¡ã解決ã§ããŸãã ããªã·ãŒãã³ãŒãã§èªåãã§ã㯠ãããã€åã«åé¡ãæ€åº äžè²«ããã¬ããã³ã¹ã®å®çŸ ã¬ãã¥ãŒè² è·ã®è»œæž 1.2 ã»ããã¢ãã 1.2.1 Conftest ã®ã€ã³ã¹ããŒã« macOS ã®å ŽåïŒ ...
Prometheus Exporter éçºã§ Discord ãµãŒãéå¶ã®å¥å šåãå³ã
èªå㯠Discord ã§ã²ãŒã ã³ãã¥ããã£ãéå¶ããŠã㊠Discord ãµãŒãã管çããŠããŸããéå¶ã®ããã«å¿ èŠãªæ å ±ãéããããšæãããããéçºã Prometheus Exporter ã®éçºãããŠããŸãããã®èšäºã§ã¯ Prometheus Exporter ã«ã€ããŠæžãããšæããŸãã Discord Exporter ã®æŠèŠ Discord Exporter ã¯ãDiscord ãµãŒãã®çµ±èšæ å ±ã Prometheus ã¡ããªã¯ã¹ãšããŠãšã¯ã¹ããŒãããããŒã«ã§ããã¡ã³ããŒæ°ãšåãã£ãã«ã®ã¡ãã»ãŒãžæ°ãåéã Prometheus Exporter ãšããŠã¡ããªã¯ã¹ã Promehteus Server ã«æäŸãããã®ã§ãã https://github.com/jedipunkz/discord-exporter ã³ãŒãã®èŠæèª¬æ Discord Exporter ã®äž»èŠãªåŠçã解説ããŠãããŸãã Discord API åŒã³åºãåŠç ã¡ã³ããŒæ å ±ã®ååŸ updateMemberCount 颿°ã§ã¯ãDiscord ã® GuildMembers API ãšã³ããã€ã³ããåŒã³åºããŠã¡ã³ããŒæ å ±ãååŸããŸããAPI ã®å¶éã«ããæå€§1000ä»¶åäœã§ã¡ã³ããŒãååŸããååŸããã¡ã³ããŒæ°ã Prometheus ã®ã²ãŒãžã¡ããªã¯ã¹ã«èšå®ããŸãã func updateMemberCount(s *discordgo.Session, guildID string) { members, err := s.GuildMembers(guildID, "", 1000) if err != nil { log.Printf("Error fetching members: %v", err) return } memberCountGauge.Set(float64(len(members))) log.Printf("Updated member count: %d", len(members)) } ã¡ãã»ãŒãžã«ãŠã³ãåŠç countChannelMessages 颿°ã§ã¯ããã£ãã«ã®ã¡ãã»ãŒãžã段éçã«ååŸããŸããChannelMessages API ã§100ä»¶ãã€ã¡ãã»ãŒãžãååŸããæçµã¡ãã»ãŒãžã® ID ãæ¬¡ã®ãªã¯ãšã¹ãã®ã¢ã³ã«ãŒãšããŠäœ¿çšããããšã§ãå šã¡ãã»ãŒãžãæ°ãäžãããŸã§ã«ãŒãåŠçãè¡ããŸãã func countChannelMessages(s *discordgo.Session, channelID string) (int, error) { count := 0 lastID := "" for { messages, err := s.ChannelMessages(channelID, 100, lastID, "", "") if err != nil { return 0, err } if len(messages) == 0 { break } count += len(messages) lastID = messages[len(messages)-1].ID } return count, nil } ã¡ããªã¯ã¹åéã®å®è£ 䞊è¡åŠçãšã¬ãŒãå¶é Discord API ãžã®é床ãªåŒã³åºããé²ããããã»ããã©ã䜿çšãã䞊è¡åŠçå¶åŸ¡ãå®è£ ããŠããŸããæå€§5ãã£ãã«ãåæåŠçã§ããããã«å¶éãåãŽã«ãŒãã³ãåŠçåã«ã»ããã©ãååŸãå®äºåŸã«è§£æŸããä»çµã¿ã§å¹ççãã€å®å šã«è€æ°ãã£ãã«ã䞊è¡åŠçããŸãã ...
DuckDB ã«å ¥éããŠã¿ã
ããã«ã¡ã¯ãjedipunkzð ã§ãã ä»å㯠DuckDB ã«ã€ããŠçè§£ããããšããŸãšããããšæããŸãã DuckDB 㯠PostgreSQL äºæã® SQL ã䜿ã£ãŠãJSON ã CSVãParquet ãªã©ã®ãã¡ã€ã«ãçŽæ¥ã¯ãšãªã§ããããŒã¿ããŒã¹ãšã³ãžã³ã§ãããµãŒããŒã®ã»ããã¢ãããäžèŠã§ãNode.js ã Python ãªã©ã®ã¢ããªã±ãŒã·ã§ã³ã«çµã¿èŸŒãã§äœ¿ãããããããŒã¿åæããã°è§£æã®çšéã§æ³šç®ãããŠããŸãã DuckDB ã®ç¹åŸŽ DuckDB ã¯ä»¥äžã®ç¹åŸŽãæã¡ãŸãã çµã¿èŸŒã¿åããŒã¿ããŒã¹: ãµãŒããŒäžèŠã§ãããã»ã¹å ã§åäœ é«éãªåæåŠç: åæåã¹ãã¬ãŒãžãšãã¯ãã«åå®è¡ã«ãã OLAP ã«æé©å 倿§ãªãã©ãŒããã察å¿: JSONãCSVãParquet ãªã©ãçŽæ¥èªã¿èŸŒã¿ PostgreSQL äºæ SQL: æšæºç㪠SQL ã§æäœå¯èœ 軜é: SQLite ã®ããã«åäžãã€ããªã§åäœ ç°å¢ã»ããã¢ãã ä»å㯠Node.js (TypeScript) ã§ DuckDB ã䜿çšããŸãã åºæ¬çãªã»ããã¢ããã³ãŒãã¯ä»¥äžã®éãã§ãã :memory: ãæå®ããããšã§ãã¡ã¢ãªäžã«ããŒã¿ããŒã¹ãäœæããŸããæ°žç¶åãå¿ èŠãªå Žåã¯ããã¡ã€ã«ãã¹ãæå®ããããšãã§ããŸãã import duckdb from "duckdb"; import { promisify } from "util"; const db = new duckdb.Database(":memory:"); const dbAll = promisify(db.all.bind(db)); const dbClose = promisify(db.close.bind(db)); åºæ¬ç㪠SELECT æäœ ãŸãã¯åºæ¬ç㪠SELECT æäœããèŠãŠãããŸãã ãµã³ãã«ããŒã¿ åŸæ¥å¡ããŒã¿ã JSON ãã¡ã€ã«ã§çšæããŸã (employees.json)ã [ {"id": 1, "name": "Alice", "age": 28, "department": "Sales", "salary": 50000}, {"id": 2, "name": "Bob", "age": 35, "department": "Engineering", "salary": 75000}, {"id": 3, "name": "Charlie", "age": 42, "department": "Sales", "salary": 65000}, {"id": 4, "name": "Diana", "age": 31, "department": "Engineering", "salary": 80000}, {"id": 5, "name": "Eve", "age": 29, "department": "HR", "salary": 55000} ] ã¯ãšãªå®è¡ DuckDB ã§ã¯ãJSON ãã¡ã€ã«ãçŽæ¥ FROM å¥ã§æå®ã§ããŸãã ãã€ã³ãã¯ãCREATE TABLE ãªã©ã®äºåæºåãªãã«ããã¡ã€ã«ãã¹ãæå®ããã ãã§ã¯ãšãªãå®è¡ã§ããç¹ã§ããDuckDB ãèªåçã«ã¹ããŒããæšè«ããããŒã¿ãèªã¿èŸŒã¿ãŸãã ...
Zig å ¥é: æ§æé
ããã«ã¡ã¯ @jedipunkz ã§ãã ã³ãŒãã£ã³ã°ãåŠç¿ããæ©äŒãå¢ãããŠããæäžãªã®ã§ãããèªåã¯åºã¬ã€ã€ã奜ããªã®ãæãåºãããŸãããŸã« Mitchell Hashimoto æ°ã Zig ã®ããšãåããŠãã®ãèŠããŠããã®ã§ãçªç¶ Zig ã«å ¥éããããªããŸããã ãšããããšã§åŸã«èªåã§ãèªã¿è¿ãã圢ã«ããããšæã Zig ã®æ§æéãèšããŸãã NOTICE â» çŸæç¹ã§ Stable 㪠0.15.1 ãåæã«èšããŸãã â» æ°ãåãããšãã«èšèªä»æ§ã®å€åã«å¯Ÿå¿ããŠä¿®æ£ããŠããããšæããŸãã ã¯ããã« ãã®ããã¥ã¡ã³ãã¯ãZig èšèªã®äž»èŠãªæ§æãç¶²çŸ çã«ãŸãšãããã¥ãŒããªã¢ã«ã§ãããã¹ãŠã®ãµã³ãã«ã³ãŒãã¯èšäºã®ä¿®æ£æç¹ã§ Stable ãªãªãªãŒã¹ããŒãžã§ã³ã® Zig ã§åäœç¢ºèªããŠããŸãã ç®æ¬¡ åºæ¬æ§æ æŒç®å å¶åŸ¡æ§æ 颿° é åãšã¹ã©ã€ã¹ æ§é äœ åæåãšãŠããªã³ ãã€ã³ã¿ ãšã©ãŒãã³ããªã³ã° ãªãã·ã§ãã«å ã³ã³ãã€ã«æèšç® ã¡ã¢ãªã¢ãã±ãŒã¿ ãã¹ã ã¢ãžã¥ãŒã« 1. åºæ¬æ§æ 倿°å®£èš Zig ã«ã¯ 2 çš®é¡ã®å€æ°å®£èšããããŸããconst ã¯äžå€å€æ°ïŒåä»£å ¥äžå¯ïŒãvar ã¯å¯å€å€æ°ïŒåä»£å ¥å¯èœïŒã衚ããŸãã const cat: i32 = 5; // const: äžå€å€æ°ïŒåä»£å ¥äžå¯ïŒ var dog: i32 = 10; // var: å¯å€å€æ°ïŒåä»£å ¥å¯èœïŒ dog = 15; // OK // cat = 10; // ãšã©ãŒ: const ã¯å€æŽäžå¯ åæšè« åãæç€ºçã«æå®ããªããŠããã³ã³ãã€ã©ãèªåçã«åãæšè«ããŠãããŸãã ...
TypeScript å ¥é: æ§æé
ããã«ã¡ã¯ @jedipunkz ã§ãã TypeScript ã®åŠç¿ãé²ããäžã§æ§æãç¶²çŸ çã«çè§£ããå¿ èŠæ§ãæããŠãµã³ãã«ã³ãŒãäœæãäœæãåäœç¢ºèªããäžã§æ§æéãäœæããŸããããã®èšäºã§ã¯ TypeScript ã®äž»èŠãªæ§æããŸãšããããšæããŸãã â» æ°ãåãããšãã«æ°ããæ§æãåºãŠããéã«æŽæ°ãç¶ããèšäºã«ããããšæã£ãŠããŸãã ç®æ¬¡ 1. åºæ¬çãªåã·ã¹ãã ããªããã£ãå åæ³šéãšåæšè« TypeScript æ¡åŒµå ãªãã©ã«å åã¢ãµãŒã·ã§ã³ 2. è€åå é åãšã¿ãã« ãªããžã§ã¯ãå ãŠããªã³åãšã€ã³ã¿ãŒã»ã¯ã·ã§ã³å åæå Discriminated Unions 3. 颿° 颿°ã®åå®çŸ© 颿°ã®ãªãŒããŒããŒã 4. ã€ã³ã¿ãŒãã§ãŒã¹ åºæ¬çãªã€ã³ã¿ãŒãã§ãŒã¹ ã€ã³ã¿ãŒãã§ãŒã¹ã®ç¶æ¿ 5. ã¯ã©ã¹ ã¯ã©ã¹ã®åºæ¬ ã¢ã¯ã»ã¹ä¿®é£Ÿå ç¶æ¿ãšæœè±¡ã¯ã©ã¹ 6. ãžã§ããªã¯ã¹ ãžã§ããªã¯ã¹ã®åºæ¬ åå¶çŽãšãŠãŒãã£ãªãã£å 7. åãšã€ãªã¢ã¹ 8. ã¢ãžã¥ãŒã« ãšã¯ã¹ããŒããšã€ã³ããŒã 9. é«åºŠãªåæ©èœ åã¬ãŒã é«åºŠãªåæŒç®å ã€ã³ããã¯ã¹ã·ã°ãã㣠ãŠãŒãã£ãªãã£åã®æ¡åŒµ Mapped Types æ¡ä»¶ä»ãå 10. é«åºŠãªæ©èœ ãã³ã¬ãŒã¿ãŒ åå空é åºæ¬çãªåã·ã¹ãã ããªããã£ãå ããªããã£ãå㯠JavaScript ã®åºæ¬çãªããŒã¿åã§ããTypeScript ã§ã¯ãããã«å泚éãä»ããããšã§åå®å šæ§ã確ä¿ã§ããŸãã boolean å - çåœå€ã衚ããŸããtrue ãŸã㯠false ã®ããããã®å€ãæã¡ãŸãã number å - æ°å€ã衚ããŸããæŽæ°ã»å°æ°ã»16 鲿°ã»2 鲿°ã»8 鲿°ãã¹ãŠãã®åã§æ±ããŸããJavaScript ãšåæ§ã«å éšçã«ã¯ãã¹ãŠæµ®åå°æ°ç¹æ°ãšããŠæ±ãããŸãã string å - æååã衚ããŸããããã«ã¯ã©ãŒããã·ã³ã°ã«ã¯ã©ãŒããããã¯ã¯ã©ãŒãïŒãã³ãã¬ãŒããªãã©ã«ïŒã§èšè¿°ã§ããŸãã null åãš undefined å - å€ãååšããªãããšã衚ããŸããnull ã¯æç€ºçã«å€ããªãããšã瀺ããundefined ã¯å€ãæªå®çŸ©ã§ããããšã瀺ããŸãã bigint å - Number.MAX_SAFE_INTEGER ãè¶ ãã倧ããªæŽæ°ãæ±ããŸããæ«å°Ÿã« n ãä»ããŠèšè¿°ããŸãã symbol å - äžæã§äžå€ã®å€ãäœæããŸãããªããžã§ã¯ãã®ããããã£ããŒãšããŠäœ¿çšãããããšãå€ãã§ãã // åºæ¬çãªå const dogName: string = "Buddy"; const dogAge: number = 3; const isDogHungry: boolean = true; console.log(dogName); // åºå: Buddy console.log(dogAge); // åºå: 3 console.log(isDogHungry); // åºå: true // null ãš undefined const location: null = null; let age: undefined = undefined; console.log(location); // åºå: null console.log(age); // åºå: undefined // bigint ãš symbol const weight: bigint = 9007199254740991n; const id: symbol = Symbol("unique"); console.log(weight); // åºå: 9007199254740991n console.log(id); // åºå: Symbol(unique) åæ³šéãšåæšè« åæ³šé (Type Annotation) ã¯å€æ°ã颿°ã«æç€ºçã«åãæå®ããæ©èœã§ãã: åå ã®åœ¢åŒã§èšè¿°ããŸããåæ³šéã«ãããã®å€æ°ã颿°ãæ±ããå€ã®çš®é¡ãæç¢ºã«ã§ããŸãã ...
Terraform Plan å·®åãããŒã¹ãã GitHub Actions ãäœã£ã
ããã«ã¡ã¯ãjedipunkzð ã§ãã Terraform ãéçšããŠãããšããŸã« Plan çµæãã©ãããŠãåºãŠããŸãäºããããŸãããŸã Terraform ã GitHub ã§å®è¡ããç°å¢ãéçšããŠãããš Plan çµæãããŸãæ±ã£ãŠèªååãããã¢ãããŒã·ã§ã³ãæ¹§ããŠããŸãããã®å Žåã« Plan ã®å·®åãããŸãåŠçããŠããã GitHub Action ãããã°ãªãšæã£ãŠäœã£ãŠã¿ãŸããã GitHub Actions äœæãã GitHub Action ã¯äžèšã®ã¬ããžããªã§å ¬éããŠããŸãã https://github.com/jedipunkz/tf-plan-parser å ¥åã»ãªãã·ã§ã³èšå® ãã® GitHub Action ã§ã¯2ã€ã®å ¥åãªãã·ã§ã³ãå©çšå¯èœã§ãïŒ terraform-plan (å¿ é ) ããŒã¹å¯Ÿè±¡ãšãªã Terraform Plan ã®åºåçµæãæå®ããŸããéåžžã¯åã®ã¹ãããã§å®è¡ãã terraform plan ã³ãã³ãã®æšæºåºåãæž¡ããŸãã ignore-resources (ãªãã·ã§ã³) ç¡èŠããããªãœãŒã¹ã¿ã€ããç¹å®ã®ãªãœãŒã¹ãé å圢åŒã§æå®ããŸããããã©ã«ãã¯ç©ºã®é å [] ã§ãã æå®æ¹æ³ã®äŸïŒ ãªãœãŒã¹ã¿ã€ãå šäœãç¡èŠ: ignore-resources: '["null_resource", "local_file"]' ç¹å®ã®ãªãœãŒã¹ã€ã³ã¹ã¿ã³ã¹ãç¡èŠ: ignore-resources: '["null_resource.temporary", "local_file.cache"]' ãªãœãŒã¹ã¿ã€ããšã€ã³ã¹ã¿ã³ã¹ã®æ··åš: ignore-resources: '["null_resource", "aws_s3_bucket.temp", "local_file"]' åºåãããæ å ± ãã® Action ã¯ä»¥äžã®åºåãæäŸããŸãããŸãäžèšã¯ ignore-resources ãªãã·ã§ã³ã®æå®ã«æ²¿ã£ãŠçµæãåºåããŠãããŸãã diff-bool: 倿Žããããã©ããã®çåœå€ïŒtrue ãŸã㯠falseïŒ diff-count: 倿ŽããããªãœãŒã¹ã®æ° diff-resources: 倿ŽããããªãœãŒã¹ã®ã¢ãã¬ã¹äžèЧïŒã«ã³ãåºåãïŒ diff-raw: çã®å·®åããŒã¿ diff-json: såããŒã¿ã® JSON åœ¢åŒ ãããã®åºåã䜿ã£ãŠãåŸç¶ã®ã¹ãããã§æ¡ä»¶åå²ãéç¥ã®å¶åŸ¡ãå¯èœã§ãã ...
Go ååŠè ãåŠã¶ã¯ãªãŒã³ã¢ãŒããã¯ãã£
èªå㯠Go ã®ååŠè ãªã®ã§ããã¯ãªãŒã³ã¢ãŒããã¯ãã£ãåŠã¶ããã«å¹Ÿã€ãã®æžç±ãèªãã§ã¿ããã®ã®ãªããªããã£ãããšçè§£ãåºæ¥ãŠããªãç¶æ ã§ããã ããã§ AI ã«æ¥µåã·ã³ãã«ãªã³ãŒããæžãããŠçè§£ãããšããäºããã£ãŠã¿ãã®ã§ããããªããªãããæãã«çè§£ãé²ãã ã®ã§ããã§èšäºã«ããããšæã£ãŠããŸãã ã¯ãªãŒã³ã¢ãŒããã¯ãã£ãšã¯ïŒ ã¯ãªãŒã³ã¢ãŒããã¯ãã£ã¯ãRobert C. Martin ã«ãã£ãŠæå±ããããœãããŠã§ã¢èšèšååã§æãéèŠãªç¹åŸŽã¯äŸåé¢ä¿ã®æ¹åæ§ã«ãããŸãã åŸæ¥ã®ã¢ãŒããã¯ãã£ãšã¯ç°ãªããå åŽã®å±€ã¯å€åŽã®å±€ãç¥ããªããšããååã«åºã¥ããŠããŸããããã«ãã以äžã®ã¡ãªãããåŸãããŸãã ãã¹ã¿ããªãã£: ããžãã¹ããžãã¯ãåäœã§ãã¹ãå¯èœ æè»æ§: ããŒã¿ããŒã¹ã Web ãã¬ãŒã ã¯ãŒã¯ã®å€æŽã容æ ä¿å®æ§: é¢å¿ã®åé¢ã«ãã倿Žã®åœ±é¿ç¯å²ãéå® å®è£ ããã·ã¹ãã ã®å šäœå ä»å AI ã«å®è£ ãããã®ã¯ RESTful API ãæäŸãããŠãŒã¶ãŒç®¡çã·ã¹ãã ã§ãã ã³ãŒãã¯äžèšã®ã¬ããžããªã«ãããŸãã https://github.com/jedipunkz/go-clean-architecture-playground ã·ã¹ãã ã¯ä»¥äžã®4ã€ã®å±€ã§æ§æãããŠããŸãïŒ Entity ã¬ã€ã€ - ããžãã¹ã®æ žãšãªãã«ãŒã« Interface ã¬ã€ã€ - æœè±¡åã«ããççµå Use Case ã¬ã€ã€ - ããžãã¹ããžãã¯ã®å®è£ Infrastructure ã¬ã€ã€ - å€éšã·ã¹ãã ãšã®é£æºå®è£ Controller ã¬ã€ã€ - HTTP APIã®æäŸ åå±€ã®è©³çްå®è£ 1. Entity ã¬ã€ã€ - ããžãã¹ã®æ žãšãªãã«ãŒã« æãå åŽã®å±€ããå®è£ ãå§ããŸãããšã³ãã£ãã£å±€ã¯ä»ã®ã©ã®å±€ã«ãäŸåããªãçŽç²ãªããžãã¹ããžãã¯ã§ãã // entity/user.go package entity import ( "errors" "time" ) type User struct { ID int `json:"id"` Name string `json:"name"` Email string `json:"email"` CreatedAt time.Time `json:"created_at"` UpdatedAt time.Time `json:"updated_at"` } func NewUser(name, email string) (*User, error) { if name == "" { return nil, errors.New("ååã¯å¿ é ã§ã") } if email == "" { return nil, errors.New("ã¡ãŒã«ã¢ãã¬ã¹ã¯å¿ é ã§ã") } now := time.Now() return &User{ Name: name, Email: email, CreatedAt: now, UpdatedAt: now, }, nil } func (u *User) UpdateInfo(name, email string) error { if name == "" { return errors.New("ååã¯å¿ é ã§ã") } if email == "" { return nil, errors.New("ã¡ãŒã«ã¢ãã¬ã¹ã¯å¿ é ã§ã") } u.Name = name u.Email = email u.UpdatedAt = time.Now() return nil } ãã® User ãšã³ãã£ãã£ã¯ãã¯ãªãŒã³ã¢ãŒããã¯ãã£ã®æãå åŽã«äœçœ®ããéšåã§ããããã§éèŠãªã®ã¯ããã®ãšã³ãã£ãã£ãå€éšã®äœã«ãäŸåããŠããªãããšã§ããããŒã¿ããŒã¹ãMySQLãªã®ãPostgreSQLãªã®ããWebãã¬ãŒã ã¯ãŒã¯ãGinãªã®ãEchoãªã®ãããããã£ãæè¡çãªè©³çްã¯äžåç¥ããªãã®ãç¹åŸŽã«ãªã£ãŠããŸãã ...
MCP ã®çè§£: Platform Enabler/SRE ã§ã®æŽ»çš
èªå㯠Platform Enabler/SRE ãšããŠåŸäºããŠããŸãããŸã AI é¢é£ã®ã¢ããããŒãã¯2025幎ã«å ¥ã£ãŠãå±ã«æŽæ°ãããŠããŸãã2025幎åé ã«ãããŠã¯èªåãã¡ã®åéã§ã AI é¢é£ã®å©çšã«é¢ããŠæ§ã ãªæš¡çŽ¢ãããç¶æ³ã ãšæãããŸãããAhthoropic 瀟ãæå±ãã MCP (Model Context Protocol) ãããããã€ã³ãã¯ãã¯ã¢ããªã±ãŒã·ã§ã³ã«éå®ãããã€ã³ãã©é åã®ãœãããŠã§ã¢ã«ã倧ããªã¡ãªããããããããšæã£ãŠèŠ³æž¬ããŠããŸãã ãã®èšäºã§ã¯ãMCP ã®æŠèŠãšã©ãå®è£ ããã®ãã®åŠç¿ããŸãã©ãæã ã®ãã㪠Platform Enabler/SRE ã«ãšã£ãŠã®æŽ»çšäŸãããããèå¯ããŠãããããšæã£ãŠããŸãã MCP ã®æŠèŠ MCP (Model Context Protocol) ã¯ãAI ã¢ãã«ãšå€éšã·ã¹ãã éã®ããåããå¹çåãããããã³ã«ã§ JSON-RPC ã§ãããšãããŸãããŠãŒã¶ãŒã®èªç¶èšèªå ¥åãåºã«ãAI ã¢ã·ã¹ã¿ã³ãã MCP ãµãŒããŒãéããŠãã¡ã€ã«æäœãããŒã¿åŠçãå®è¡ããŸãã æè¿ OpenAI 瀟ããã® Anthropic 瀟㮠MCP ããµããŒããããšãããã¥ãŒã¹ãæµããéç«¯ã«æ³šç®ãéããç¶æ³ã«ãªã£ãŠããŸããã åŠçã®æµã ããã¯ãããŸã§ã®äžäŸã§ããAssistant ã®å®è£ ã§ããããã«ãåºæ¥ããšæããŸãã +-------------+ +-----------+ +------------+ +--------+ | User Prompt | <-----> | Assistant | ---> | MCP Server | | AI API | +-------------+ (1),(5) +-----------+ (3) +------------+ +--------+ | ^ | (2),(4) | +----------------------------------+ (1) ãŠãŒã¶ããã®å ¥åã Assistant ãåãåã (2) Assistant ã¯ãŠãŒã¶ããã®èªç¶èšèªã LLM ã«åãåããããã®éã« LLM ã«å€éšæ©èœãå®çŸ© (JSON-RPC(MCP ãµãŒããåãåã)) (3) Aasistant 㯠MCP Server ã« JSON-RPC ã§ã¯ãšãªéä¿¡ãã¬ã¹ãã³ã¹ãåŸã (4) Assistant 㯠MCP Server ããåŸãã¬ã¹ãã³ã¹ãåã³ LLM ã«éä¿¡ãèªç¶èšèªãšããŠãŠãŒã¶ã«è¿ãå 容ãçæããŠããã (5) Assistant ã¯ãŠãŒã¶ã«èªç¶èšèªã§çµæãå¿çãã åæ MCP åŠç¿ãç®çã«ããŠããã®ã§ãããã§ã¯è©±ãç°¡æœã«ãããã Linux Filesystem ãæäœãã MCP Server ãæžããçè§£ããŠãããŸãã ...