
- TOP
- ã¿ã°äžèЧ
- Scratch
Scratch
ã€ãã³ã
ãã¬ãžã³
該åœããã³ã³ãã³ããèŠã€ãããŸããã§ãã
æè¡ããã°
ã¯ããã« ãã®èšäºã¯ New Relic Advent Calendar 2025 ã®24æ¥ç®ã®èšäºã§ãã ããã«ã¡ã¯ãSREããŒã ã® ãããªã ã§ããæ¬èšäºã§ã¯ å
æ¥çºè¡š ãããNew Relic MCPãµãŒããŒãSlackããå©çšã§ããããã«ããæ¹æ³ã«ã€ããŠç޹ä»ããŸãã MCPãµãŒããŒèªäœã¯Claudeãªã©ã®å¯Ÿè©±åAIãCodex, Kiroãªã©ã®ã³ãŒãã£ã³ã°ãšãŒãžã§ã³ããªã©ãããŸããŸãªã€ã³ã¿ãŒãã§ãŒã¹ã§å©çšããããšãã§ããŸãããSlackãšããã€ã³ã¿ãŒãã§ãŒã¹ã§äœ¿ããããã«ããããšã§ãNew Relicã®ããŒã¿å©æŽ»çšã®å¹
ãããã«åºãããããšæããŠããŸãã æ§æå³ ä»åã¯ä»¥äžã®ãããªæ§æã§SlackããNew Relic MCPãå©çšããŸãã ä»åäœæããæ§æå³ Slackã§Botã«ã¡ã³ã·ã§ã³ããŠè³ªåããããšã§ãåçã«å¿
èŠãªæ
å ±ãNew Relic MCPã䜿ã£ãŠååŸããŠã¹ã¬ããã«è¿ä¿¡ããŠãããŸãã æ§ç¯æé :::message æ¬èšäºã§ã¯SlackããNew Relicã®ããŒã¿ã«ã¢ã¯ã»ã¹ã§ããããã«ããããã«æå°éã®å
容ã玹ä»ããŠããŸãã以äžã®ãããªèŠçŽ ã«ã€ããŠã¯çç¥ããŠããŸãã®ã§ãå¿
èŠã«å¿ããŠå¯Ÿå¿ããŠãã ããã ã·ã¹ãã ããã³ããã®ãã¥ãŒãã³ã° New Relicã®ã¢ã«ãŠã³ããè€æ°ããå Žåãã©ã®ã¢ã«ãŠã³ãããæ
å ±ãæ¢ããŸããïŒãšãã£ãè¿çã«ãªããã¡ãªã®ã§ãã·ã¹ãã ããã³ãããªã©ã§ãå©çšãªã¢ã«ãŠã³ãããé çªã«èª¿æ»ããŠãã ãããããšãã£ãæèšãå
¥ãããšåãããã«ãªããŸããã ã»ãã¥ãªãã£é¢ã®å¯Ÿç ä»å玹ä»ããæ§æã¯ãŠãŒã¶ãŒã®ã€ã³ãããããã®ãŸãŸäŒããŠãããããå
¥åã»åºåå
容ã®ã¬ãŒãã¬ãŒã«ãèšããããšããªã¹ã¹ã¡ããŸãã ãŸããIAM Roleã®æš©éãå¿
èŠæå°éã®èšå®ã«ããããšããªã¹ã¹ã¡ããŸãã äŒè©±å±¥æŽã®ä¿æ ä»åã®æ§æã§ã¯äŒè©±å±¥æŽãä¿æããŠããããåçºã§ã®ããåãã«ãªããŸãã ::: New Relic APIããŒã®çºè¡ New Relicã® API Keys ã®ããŒãžã«é·ç§»ããŠã Create a key ãã¿ã³ãæŒäžããŸãã Key Type㯠User ãéžæããŠäœæããçºè¡ãããAPIããŒãæ§ããŠãããŸãã Slack Appã®äœæãšèšå® - ãã®1 ãŸãã¯Slack AppãäœæããŸãã Slack Appã®äœææ¹æ³ã«ã€ããŠã¯ããŸããŸãªèšäºããããã詳现ãªèª¬æã¯çããŸããã ãã¡ã ãã From scratch ã§Slack AppãäœæããŠãã ããã äœæããã OAuth & Permissions ã®ããŒãžã«é·ç§»ããBot Token Scopesã« chat:write ã®æš©éã远å ããŸãã ãã㊠Install App ãã察象ã®Slackã¯ãŒã¯ã¹ããŒã¹ã«ã€ã³ã¹ããŒã«ããçºè¡ããã Bot User OAuth Token ãæ§ããŠãããŸãã ã¢ããªã±ãŒã·ã§ã³ã®æ§ç¯ ä»å㯠AWS SAM ãš Strands Agents ã䜿ã£ãŠæ§ç¯ããŸããç§ãæ§ç¯ããéã®SAM CLIã®ããŒãžã§ã³ã¯1.149.0ã§ããã 以äžã«template.yamlãšããããã®Lambda颿°ã®ã³ãŒããrequirements.txtãèšèŒããŸãã :::details template.yaml AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Globals: Function: Timeout: 120 Resources: SlackEventHandlerFunction: Type: AWS::Serverless::Function Properties: FunctionName: slack-event-handler-function CodeUri: src/ Handler: slack_event_handler.lambda_handler Runtime: python3.14 Role: !GetAtt SlackEventHandlerFunctionRole.Arn SnapStart: ApplyOn: PublishedVersions AutoPublishAlias: SnapStart Architectures: - x86_64 Events: NewRelicBot: Type: Api Properties: Path: /event Method: post Environment: Variables: SQS_QUEUE_URL: !GetAtt SlackMessageSQS.QueueUrl SlackEventHandlerFunctionPermission: Type: AWS::Lambda::Permission Properties: Action: lambda:InvokeFunction FunctionName: !Ref SlackEventHandlerFunction Principal: apigateway.amazonaws.com SlackEventHandlerFunctionRole: Type: AWS::IAM::Role Properties: RoleName: slack-event-handler-function-role AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: Service: - lambda.amazonaws.com Action: - sts:AssumeRole Path: / ManagedPolicyArns: - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole - arn:aws:iam::aws:policy/AmazonSQSFullAccess SlackAIExecutorFunction: Type: AWS::Serverless::Function Properties: FunctionName: slack-ai-executor-function CodeUri: src/ Handler: slack_ai_executor.lambda_handler Runtime: python3.14 MemorySize: 256 Role: !GetAtt SlackAIExecutorFunctionRole.Arn Architectures: - x86_64 Events: SlackMessageSQS: Type: SQS Properties: Queue: !GetAtt SlackMessageSQS.Arn BatchSize: 1 Enabled: true Environment: Variables: NEW_RELIC_API_KEY: '' # çºè¡ããNew Relic APIããŒãèšå® SLACK_BOT_TOKEN: '' # çºè¡ããSlack Bot User OAuth Tokenãèšå® SlackAIExecutorFunctionRole: Type: AWS::IAM::Role Properties: RoleName: slack-ai-executor-function-role AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: Service: - lambda.amazonaws.com Action: - sts:AssumeRole Path: / ManagedPolicyArns: - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole - arn:aws:iam::aws:policy/service-role/AWSLambdaSQSQueueExecutionRole - arn:aws:iam::aws:policy/AmazonBedrockFullAccess SlackMessageSQS: Type: AWS::SQS::Queue Properties: QueueName: slack-message-sqs.fifo FifoQueue: true VisibilityTimeout: 180 MessageRetentionPeriod: 600 ContentBasedDeduplication: true DeduplicationScope: messageGroup RedrivePolicy: deadLetterTargetArn: !GetAtt SlackMessageDLQ.Arn maxReceiveCount: 2 SlackMessageDLQ: Type: AWS::SQS::Queue Properties: QueueName: slack-message-dlq.fifo FifoQueue: true VisibilityTimeout: 180 MessageRetentionPeriod: 604800 â» NEW_RELIC_API_KEY, SLACK_BOT_TOKENã¯å¿
èŠã«å¿ããŠãã©ã¡ãŒã¿ã¹ãã¢ããååŸãããªã©ã®æ¹æ³ã§èšå®ããŠãã ããã ::: :::details slack_event_handler.py import json import boto3 import hashlib import os sqs = boto3.client('sqs') queue_url = os.environ.get('SQS_QUEUE_URL') def lambda_handler(event, context): body = json.loads(event['body']) if body.get('challenge') is not None: challenge = body['challenge'] return response('200', challenge) if body['event'].get('edited') is not None: return response('200', 'edited event ignored') if body['event']['type'] == 'app_mention': ts = body['event']['ts'] channel = body['event']['channel'] thread_ts = body['event'].get('thread_ts') text = body['event'].get('text') if text is None: return response('200', 'no text field') payload = { 'text': text, 'channel': channel, 'ts': thread_ts if thread_ts is not None else ts, } sqs.send_message( QueueUrl=queue_url, MessageBody=json.dumps(payload), MessageGroupId=channel, MessageDeduplicationId=hashlib.md5(text.encode()).hexdigest() ) return response('200', 'ok') def response(status_code, body): return { 'statusCode': status_code, 'body': body, 'headers': { 'Content-Type': 'text/plain', }, } å€éèµ·åãé²ãããã«ãåãæèšãéä¿¡ããå Žåã¯SQSã®éè€æé€æ©èœã«ããã¡ãã»ãŒãžãç Žæ£ãããããã«ããŠããŸã textã«ã¯ <@U12345678> ã®ããã«Slack Appã®ã¡ã³ããŒIDãå«ãŸãããããSQSã«ã¡ãã»ãŒãžãéä¿¡ããåã«å¿
èŠã«å¿ããŠããªãã³ã°åŠçã远å ããŠãã ããã ::: :::details slack_ai_executor.py import json import os from contextlib import asynccontextmanager from mcp.client.streamable_http import streamable_http_client, create_mcp_http_client from strands.tools.mcp.mcp_client import MCPClient from strands import Agent from strands.models import BedrockModel from slack_sdk import WebClient SYSTEM_PROMPT = """ ããªãã¯New Relicã®ããŒã¿ãé§äœ¿ããŠéçºè
ããµããŒãããåªç§ãªãšã³ãžãã¢ã§ãã """ @asynccontextmanager async def _nr_transport(): async with create_mcp_http_client( headers={ "api-key": os.environ.get('NEW_RELIC_API_KEY'), "include-tags": "discovery,alerting,data-access,incident-response,performance-analytics,advanced-analysis", } ) as http_client: async with streamable_http_client( url="https://mcp.newrelic.com/mcp/", http_client=http_client, terminate_on_close=True, ) as streams: yield streams nr_mcp_client = MCPClient(_nr_transport) slack_client = WebClient(token=os.environ.get('SLACK_BOT_TOKEN')) model_id = "jp.anthropic.claude-sonnet-4-5-20250929-v1:0" def lambda_handler(event, context): body = json.loads(event['Records'][0]['body']) text = body['text'] channel = body['channel'] ts = body['ts'] with nr_mcp_client: tools = nr_mcp_client.list_tools_sync() model = BedrockModel(model_id=model_id, region_name='ap-northeast-1', temperature=0) agent = Agent(system_prompt=SYSTEM_PROMPT, tools=tools, model=model) response = agent(text) post_response = slack_client.chat_postMessage(channel=channel, thread_ts=ts, text=str(response)) if post_response['ok']: return True else: return False ::: :::details requirements.txt annotated-types==0.7.0 anyio==4.12.0 attrs==25.4.0 boto3==1.42.13 botocore==1.42.13 certifi==2025.11.12 cffi==2.0.0 click==8.3.1 cryptography==46.0.3 docstring_parser==0.17.0 h11==0.16.0 httpcore==1.0.9 httpx==0.28.1 httpx-sse==0.4.3 idna==3.11 importlib_metadata==8.7.0 jmespath==1.0.1 jsonschema==4.25.1 jsonschema-specifications==2025.9.1 mcp==1.24.0 opentelemetry-api==1.39.1 opentelemetry-instrumentation==0.60b1 opentelemetry-instrumentation-threading==0.60b1 opentelemetry-sdk==1.39.1 opentelemetry-semantic-conventions==0.60b1 packaging==25.0 pycparser==2.23 pydantic==2.12.5 pydantic-settings==2.12.0 pydantic_core==2.41.5 PyJWT==2.10.1 python-dateutil==2.9.0.post0 python-dotenv==1.2.1 python-multipart==0.0.21 referencing==0.37.0 rpds-py==0.30.0 s3transfer==0.16.0 six==1.17.0 slack_sdk==3.39.0 sse-starlette==3.0.4 starlette==0.50.0 strands-agents==1.20.0 typing-inspection==0.4.2 typing_extensions==4.15.0 urllib3==2.6.2 uvicorn==0.38.0 watchdog==6.0.0 wrapt==1.17.3 zipp==3.23.0 â»ä»®æ³ç°å¢ã§slack_sdkãšstrands-agentsãã€ã³ã¹ããŒã«ããŠpip freezeãããã® ::: ãã®å
容ã§sam buildããã³sam deployãå®è¡ããŠãããã€ããŸãã ãããã€ãããAWSã³ã³ãœãŒã«ããäœæãããAPI Gatewayã®ã¹ããŒãžã確èªããäœæãããšã³ããã€ã³ãã®URLãæ§ããŠãããŸãã äŸïŒ https://xxxxxx.execute-api.ap-northeast-1.amazonaws.com/Prod/event Slack Appã®èšå® - ãã®2 å
ã»ã©äœæããSlack Appã®èšå®ç»é¢ã«æ»ãã Event Subscriptions ã®ããŒãžã«é·ç§»ããŸãã Enable Events ãONã«ããŠãRequest URLã«å
ã»ã©æ§ããAPI Gatewayã®ãšã³ããã€ã³ãURLãèšå® Verifiedãšè¡šç€ºãããã°OKã§ã Subscribe to bot eventsã® Add Bot User Event ãã app_mention ã远å ããŠä¿å OAuth & Permissions ã®Bot Token Scopesã« app_mentions:read ã®æš©éãèªåã§è¿œå ãããŸã â»å€æŽãä¿åããããå床Slackã¯ãŒã¯ã¹ããŒã¹ã«ã€ã³ã¹ããŒã«ããŠãã ãã åäœç¢ºèª 以äžã§æ§ç¯ã¯å®äºã§ãïŒ Slackã®ä»»æã®ãã£ã³ãã«ã«äœæããSlack Appã远å ããŠã¡ã³ã·ã§ã³ãé£ã°ããŠã¿ãŸãããã質åå
容ã«ããããŸããã1åçšåºŠã§è¿ä¿¡ãããã¯ãã§ãã Slackã§ã®åäœã€ã¡ãŒãž :::message ã¬ã¹ãã³ã¹ã®ãã©ãŒããããSlackã®ãã©ãŒãããã«æé©åãããŠããªããããå Žåã«ãã£ãŠã¯èŠã¥ãã衚瀺ã«ãªãå¯èœæ§ããããŸãã ç§ã¯ä»¥äžã®ãããªæ¹æ³ã§Slackãã©ãŒããã(ã®ãã)ã«å€æããŠãããã¹ãããŠããŸãã def convert_to_slack_format(text: str) -> str: # 倪å text = text.replace("**", "*") # åãæ¶ãç· text = text.replace("~~", "~") # åé ã« - ãä»ããŠããå Žå text = re.sub(r'^([ ]*)-', r'\1â¢', text) # æ¹è¡ã®åŸã« --- ãä»ããŠããå Žåã¯åé€ text = re.sub(r'\n---+\n', '\n', text) # æ¹è¡ã®åŸã« - ãä»ããŠããå Žå text = re.sub(r'(\n[ ]*)-', r'\1â¢', text) return text ::: MCPã®æ©èœã¯ New Relic MCP ããŒã«ãªãã¡ã¬ã³ã¹ ã§ç¢ºèªã§ããŸããããŒã«ãçµã¿åãããããšã§ããŸããŸãªæŽ»çšãã§ãããã§ãã æ¥é ããã·ã¥ããŒãã§ç¢ºèªããŠããé
ç®ãSlack Reminderã§å®æçã«Botã«ã¡ã³ã·ã§ã³ããŠãèŠçŽããŠããã ã¢ã©ãŒãçºçæã®ã¡ãã»ãŒãžã§Botãã¡ã³ã·ã§ã³ã«å«ããããšã§èªåã§äžæ¬¡èª¿æ»ããã ç¹å®ã®ã»ãã·ã§ã³ãã¬ãŒã¹IDã§ã®ãŠãŒã¶ãŒã®è¡åããŸãšããŠã¬ããŒããäœæããã ãããã« New Relic MCPãµãŒããŒã¯æ¬èšäºå·çæç¹ã§ã¯Public Previewã®æ®µéã§ãããååã«å®çšçãªã¬ãã«ã§å©çšã§ããä»åŸã®ã¢ããããŒããéåžžã«æ¥œãã¿ã§ãïŒ ãŸãããã®ä»çµã¿ã¯New Relicã®MCPãµãŒããŒã«éãããä»ã®MCPãµãŒããŒã«å¯ŸããŠãå¿çšå¯èœãªãã®ã«ãªã£ãŠããã®ã§ãæ®æ®µæŽ»çšããŠããMCPãµãŒããŒã䜿ããããã€ã³ã¿ãŒãã§ãŒã¹ã§äœ¿ããããã«ããŠã¿ãŠã¯ãããã§ããããïŒ
ã¯ããã« Turing CTOå®€ã«æå±ããŠããæ±äº¬ç§åŠå€§åŠ(Institute of Science Tokyo)ã®è€äºã§ãã æ¬èšäºã§ã¯ãOpenAIãã2025幎8æã«ãªãªãŒã¹ãããgpt-ossãNVIDIA NeMoãã¬ãŒã ã¯ãŒã¯ã«ãŠåŠç¿ããããã®æ¹æ³ã«ã€ããŠè§£èª¬ããŸãã 2025幎11æ4æ¥æç¹ã§ã¯ãNVIDIAå
¬åŒããã¯ãLoRA finetunigãè¡ãæ¹æ³ã«ã€ããŠã®ã¿è§£èª¬ãããŠãããLong Contextç¶ç¶äºååŠç¿(Continual Pre-Training)ãªã©æ¬æ ŒçãªåŠç¿ãè¡ãã«ã¯ããŒãã«ã倿°ãããŸãã æ¬èšäºã§ã¯ãåŠç¿ãè¡ãããã«è§£æ±ºããå¿
èŠããããã¹ãŠ
ã¡ã«ã«ãªããã§ QA Engineering manageãããŠãã @____rina____ ã§ãã æšå¹Ž2024幎11æã«éå¬ããã Agile Testing Days ãšããã§åå ããã¯ãŒã¯ã·ã§ããã«ã€ããŠç޹ä»ããŸãã Agile Testing Daysãšã¯äœã ã Agile Testing Days ãšã¯ããã€ãã®ãããã ã§æ¯å¹Žéå¬ãããŠããã«ã³ãã¡ã¬ã³ã¹ã§ããåå è
å±€ã¯ãã¹ã¿ãŒãã¢ãžã£ã€ã«ãã¹ã¿ãŒãQAãšã³ãžãã¢ããã¹ããªãŒãããã¹ããªãŒãã¡ãŒã·ã§ã³ãšã³ãžãã¢ãšãã£ãQAããã¹ãã«é¢ãããšã³ãžãã¢ã«å ãããã£ãããããŒããœãããŠã§ã¢ãšã³ãžãã¢ãã¢ãžã£ã€ã«ã³ãŒããã¹ã¯ã©ã ãã¹ã¿ãŒããããã¯ããªãŒããŒãããŒã ãªãŒããªã©æ§ã
ãªæ¹ã察象ã®ã«ã³ãã¡ã¬ã³ã¹ã§ããä»ååå ããæ¥æ¬èªè©±è
ã®åå è
ã¯æ°åã ã£ãããšããšãŒãããã®åå è
ãå€ãã£ãããã§ãã³ãã¥ãã±ãŒã·ã§ã³ã¯è±èªã§ãããªããŸããã Agile Testing Daysã§ã¯ã1æ¥ã®ã¯ãŒã¯ã·ã§ãããš3æ¥éã®ã«ã³ãã¡ã¬ã³ã¹ã§æ§æãããŠããŸããã«ã³ãã¡ã¬ã³ã¹ã§ã¯ãããŒããŒããã¯ãããã»ãã·ã§ã³ãããã«ãã£ã¹ã«ãã·ã§ã³ãã¯ãŒã¯ã·ã§ãããªã©ãéå¬ãããŸãããŸããã»ãã·ã§ã³ã®åéã«ã¯ã³ãŒããŒãã¬ã€ã¯ãã©ã³ããªã©ããæäŸãããæã®ãžã§ã®ã³ã°ããå€ã®é³æ¥œã€ãã³ããŸã§ãäžžäžæ¥ã€ãã³ããæ¥œããããã®ä»æããããããçšæãããŠããŸããã ãã«ã³ãã¡ã¬ã³ã¹äŒå Žã¯ã¢ãžã£ã€ã«ãã¹ãã®ç¬¬äžäººè
ãšãèšãã Lisa Crispin ã«äŒãããšãã§ããããããããã®æèè
ã«äŒããããåãæ©ã¿ãæã£ããšã³ãžãã¢ãšäº€æµã§ããããããšãŠãåºæ¿çãªã€ãã³ãã§ããã ãã¹ããŒã«ãŒã¯ã·ãã¢ãšã³ãžãã¢ã«éãããã¯ãããŠç»å£ãããæ¹ã®ã»ãã·ã§ã³ãªã©ãå¹
åºãç»å£è
ã®ããããã®çºè¡šãèãããšãã§ããŸããã Getting a grip on exploratory testing with test charters ãEwald WassinkSconewileæ°ãšRob van Sttenbergenæ°ã«ãããæ¢çŽ¢çãã¹ãã®ã¯ãŒã¯ã·ã§ããã§ããæ¢çŽ¢çãã¹ãã®ã¯ãŒã¯ã·ã§ããã¯åœå
ã§ãæã
èŠãããããã«ãªããŸããã ããã®ã¯ãŒã¯ã·ã§ããã¯ããã€ãã®ããŒãã«ã«åãããŠã°ã«ãŒãã¯ãŒã¯ãããŸãããç§ã®ã°ã«ãŒãã¯4åã§ã2åã¯ãã€ãããã®åå ã§ãè±èªã§ã³ãã¥ãã±ãŒã·ã§ã³ãããŸããã æ¬¡ã«ã¯ãŒã¯ã·ã§ããã®æµãã玹ä»ããŸãã ã¯ãŒã¯ã·ã§ããã®æµã 以äžã®ãããªæµãã§ã¯ãŒã¯ã·ã§ããããã¶ã€ã³ããŠããŸããã è¬åž«ã®èªå·±ç޹ä»ãšã¯ãŒã¯ã·ã§ããã®èª¬æ ããªãŒã¹ã¿ã€ã«ã§æ¢çŽ¢çãã¹ãããã 2ã§èŠã€ããäžå
·åã®çŽ¹ä» ãã¹ããã£ãŒã¿ãŒãå©çšããæ¢çŽ¢çãã¹ã ã°ã«ãŒããã£ã¹ã«ãã·ã§ã³ãšçºè¡š ç»å£è
ã®èæ¡ãããã¬ãŒã ã¯ãŒã¯ãå©çšããæ¢çŽ¢çãã¹ã ã°ã«ãŒããã£ã¹ã«ãã·ã§ã³ãšçºè¡š 1. è¬åž«ã®èªå·±ç޹ä»ãšã¯ãŒã¯ã·ã§ããã®èª¬æ è¬åž«2人ã®èªå·±ç޹ä»ããããŸãããæµ·å€ã®ããŒããŒããªã©ã¯åœå
ã§ãèŠãæ©äŒããããŸããããèªå·±ç޹ä»ãããªãå°è±¡ããã£ãã®ã§ãå°ãæå€ã§ããã圌ãã®ããã¯ããŒã³ãªã©ãç¥ãããšãã§ããŸããã 2. ããªãŒã¹ã¿ã€ã«ã§ãã¹ããå®è¡ãã 以äžã®URLã«ã¢ã¯ã»ã¹ããŠãå人ã§ããªãŒã¹ã¿ã€ã«ã§ãã¹ããããŸããã https://www.eviltester.com/page/tools/thepulper/ 顿ã¯Webãµã€ãã§ãåã
ã«äžå
·åãåºããŠãããŸãããã¹ãèšèšã¯ããã«ãçµéšããŒã¹ã§ãã¹ããå®è¡ããŸãã HTMLãšã³ã³ãŒããè¡ãããŠããªããããå
¥åãããå€ããã®ãŸãŸHTMLãšããŠè¡šç€ºãããäžå
·å HTMLãšã³ã³ãŒããããŠããªãããã«ãå
¥åå€ãšinput formã®è¡šç€ºãå€ãã£ãŠããŸãäžå
·å æ¥ä»ãå
¥åããæ¬ã«å€§ããªæ°åããããããã«Number Format ExceptionãçºçããŠããŸã£ãããããäžå
·åãšãããã©ããã¯ä»æ§æ¬¡ç¬¬ 3. çºèŠãããäžå
·åã®å
±æ ãåå è
å
šå¡ã§ãæ¢çŽ¢çãã¹ãäžã«çºèŠããäžå
·åã«ã€ããŠçºè¡šããŸãããç§ã¯èªèº«ãå ±åããããšããŠããäžå
·åããæ¢ã«ä»ã®åå è
ã«ãã£ãŠå ±åæžã¿ã§ããã確信ãæãŠãŸããã§ãããããã§ã念ã®ããé£åžã®æ¹ã«äžå
·åã®ç»é¢ãèŠããªãããããã®ãã°ã«ã€ããŠå ±åããããšæã£ãŠããã®ã§ãããæ¢ã«çºè¡šãããæ¹ã¯ããŸããïŒããšç¢ºèªããŸããããããšããã®æ¹ã¯ç§ã®çºè¡šããã©ããŒããŠãã ãããå®å¿ããŠçºè¡šã«èšãããšãã§ããŸããã 4. æ¢çŽ¢çãã¹ããšãã¹ããã£ãŒã¿ãŒã®è§£èª¬ ããã§ã¯ãæ¢çŽ¢çãã¹ããšã¯äœãããããŠãã¹ããã£ãŒã¿ãŒãšã¯äœãã«ã€ããŠè§£èª¬ããããŸãããè¬åž«ããã¯ãèåãªãœãããŠã§ã¢ãã¹ãç ç©¶è
ã§ãã Cem Kaner æ°ã®èšèãåŒçšãã€ã€ãããã¹ããã£ãŒã¿ãŒã¯ããã¹ãã®ãŽãŒã«ãæç¢ºã«ããããã®èšç»ã§ããããšãã説æããããŸããã 以äžã¯ãã¹ããã£ãŒã¿ãŒã®äŸã§ãã define your goal; charter template target where are you exploring? resources what resources do you need ? information what kind of information do you want to discover 5. ãã¹ããã£ãŒã¿ãŒãçšããæ¢çŽ¢çãã¹ã é£ã®åžã®æ¹ãšãã¢ã«ãªããå
ã»ã©ã®ãã¹ã察象ã®Webã¢ããªã±ãŒã·ã§ã³ã«å¯ŸããŠãä»ç®ã䜿ã£ãŠãã¹ããã£ãŒã¿ãŒãäœæããŸããããã¢ã¯ãŒã¯åŸãã°ã«ãŒãå
šäœã§ããããã®ãã¢ãã©ã®ãããªèãã§ãã¹ãé
ç®ãéžã³ããã¹ããã£ãŒã¿ãŒãäœæããããå
±æããè°è«ããŸããã 6. BRIEFãã¬ãŒã ã¯ãŒã¯ã®ææ¡ è¬åž«ãããElizabath Hendricsonæ°ãæå±ãããã¹ããã£ãŒã¿ãŒã«ã€ããŠã®èª¬æããããŸãããç§ã¯ãã¹ããã£ãŒã¿ãŒã«ã€ããŠã圌女ã®èæžã§ç¥ã£ãŠã¯ãããã®ã®ãæ¹ããŠèª¬æãåããããšã§ãèªèº«ã®æ±ããŠããéåæãæç¢ºã«ãªããŸãããããã¯ãåãå
¥ãæ¡ä»¶ïŒAcceptance CriteriaïŒãæžãéãã€ãŸããã¹ãèšèšæã«ãæ
å ±ããã¹ã芳ç¹ããèšè¿°ããŠããç¹ã§ããã ãããŠãè¬åž«ããæå±ããæ°ãããã¬ãŒã ã¯ãŒã¯ãBRIEFãã®èª¬æããããŸããã BRIEFã¯ãBehaviorïŒè¡åïŒãResultïŒçµæïŒãImpedimentsïŒé害ïŒãExpectationïŒæåŸ
ïŒãFeelingïŒææ
ïŒ ã®é æåãåã£ããã®ã§ãããã®ãã¬ãŒã ã¯ãŒã¯ãçšããããšã§ãæ¯ãèãã軞ãšãããã¹ããã£ãŒã¿ãŒãäœæããããšãã§ããŸããæåŸã«ããã®BRIEFãã¬ãŒã ã¯ãŒã¯ã䜿ã£ãŠãã¢ã¯ãŒã¯ãè¡ãããã®åŸãä»ã®ã°ã«ãŒããšå
¥ãæ¿ãã£ãŠãã£ã¹ã«ãã·ã§ã³ãè¡ããŸããã ãã¢ã¯ãŒã¯ã§äœ¿ã£ãä»ç® ãã®ã¯ãŒã¯ã·ã§ããã§ç¹ã«çŽ æŽããããšæããã®ã¯ãè¬åž«èªèº«ãèæ¡ãããã¬ãŒã ã¯ãŒã¯ãBRIEFããæŽ»çšããŠããç¹ã§ããæ¢çŽ¢çãã¹ãã®ã¯ãŒã¯ã·ã§ããã§ã¯ãæãåããæŒç¿ãåå è
åå£«ã®æèŠäº€æããã¹ããã£ãŒã¿ãŒã®äœæãªã©ã¯ããè¡ãããŸããããããä»åã®ããã«æ°ãããã£ãŒã¿ãŒã®ãã¬ãŒã ã¯ãŒã¯ãå®éã«è©Šãæ©äŒã¯åããŠã§ãéåžžã«ææçŸ©ã§ãããå人çã«ããBRIEFã®ãã¬ãŒã ã¯ãŒã¯ã¯æ®æ®µç§ããã¹ããèããéã®æèåè·¯ã«è¿ãããšãŠããã£ããããŸããã Journey From Manual to Automation Pythonic Tester ç¶ããŠãMateusz Adamczakæ°ãšMichal Pilarskiæ°ã«ããããã¹ãèªååã®ååŠè
ã察象ãšããã¯ãŒã¯ã·ã§ããã«ã€ããŠã玹ä»ããŸãããã®ã¯ãŒã¯ã·ã§ããã¯ãã³ãºãªã³åœ¢åŒã§è¡ãããåå è
ã¯èªèº«ã®PCã䜿ã£ãŠå®éã«èªåãã¹ããäœæããŸããã ã¯ãŒã¯ã·ã§ããã®æµã ã¯ãŒã¯ã·ã§ããã§ã¯ä»¥äžã®ãããªæµãã§ã¯ãŒã¯ã·ã§ããããã¶ã€ã³ããŠããŸããã å¿
èŠãªããŒã«ãšãªããžããªã®ããŠã³ããŒã Scrachã䜿ã£ãŠã¢ãã¡ã®äœæ Pythonã®ã³ãŒãã«ã³ã³ããŒããã ãã¹ãã³ãŒãã®äœæ ã°ã«ãŒããã£ã¹ã«ãã·ã§ã³ãšçºè¡š ç»å£è
ã®èæ¡ãããã¬ãŒã ã¯ãŒã¯ãå©çšããæ¢çŽ¢çãã¹ã ã°ã«ãŒããã£ã¹ã«ãã·ã§ã³ãšçºè¡š ãã¡ããã²ãšã€ãã€ç޹ä»ããŸãã 1. å¿
èŠãªããŒã«ãšãªããžããªã®ããŠã³ããŒã GitLabã®ãªããžããªãPythonãJetBrainsãããŠã³ããŒãããŸãã GitLab – GitLab.com – Files · ATD_workshop_manual2auto · Michal Pilarski / python_kids · GitLab Python.org – Python.org JetBrains – PyCharm – https://www.jetbrains.com/pycharm/download/download-thanks.html?platform=macM1&code=PCC 2.Scratchã䜿ã£ãã¢ãã¡ãŒã·ã§ã³åç»äœæ Scratchã䜿ã£ãŠã¢ãã¡ãŒã·ã§ã³åç»ãäœæããŸãããæåã«è¬åž«ãç»é¢å
±æããªããäœãæ¹ã説æããåå è
ã¯ããã«å£ã£ãŠäœæ¥ãé²ããŸãããScratchã¯ãåäŸåãã®ããã°ã©ãã³ã°åŠç¿ããŒã«ãšããŠæ¥æ¬ã§ã人æ°ããããçŽæçãªæäœã§ã¢ãã¡ãŒã·ã§ã³ãäœæã§ããŸãããã®ãããããã°ã©ãã³ã°ååŠè
ã§ãåé¡ãªãåãçµãããšãã§ããŸãããè¬åž«ã®æç€ºã«åŸãããã£ã©ã¯ã¿ãŒãååŸã«åãããããé³ã鳎ãããããšãã£ãç°¡åãªåäœãäœæããŸããã 3. Pythonã³ãŒããžã®å€æ Scratchã§äœæããã¢ãã¡ãŒã·ã§ã³ã宿ããã®ã§ã次ã¯ãããPythonã®ã³ãŒãã«å€æããŸã 倿ã«å¿
èŠãªã³ãŒãã¯äºåã«çšæãããŠããŸããã ãŸãã¿ãŒããã«ã§ python -V ãå®è¡ããŠPythonã®ããŒãžã§ã³ã確èªããæ¬¡ã« pip install -r requirements.txt ãå®è¡ããŠå¿
èŠãªã©ã€ãã©ãªãã€ã³ã¹ããŒã«ããŸãããã®åŸãScratchã§äœæãã kitty.sb3 ãã¡ã€ã«ã倿ããããšã§ãPythonã®ã³ãŒããçæãããŸããã è¬åž«ããåºæ¬çãªPythonã³ãŒãã®èª¬æãããããã®åŸã¯åå è
èªèº«ã§ã³ãŒãã®å®è£
ãè¡ããŸãããç§ã®äœæããã¢ãã¡ãŒã·ã§ã³ã«ã¯èæ¯ããªãã£ããããçæãããã³ãŒãã®6è¡ç®ãã³ã¡ã³ãã¢ãŠãããå¿
èŠããããŸããã 4. ãã¹ãã³ãŒãã®äœæ ãããããã¹ãã³ãŒãã®äœæã§ããå
ã»ã©ã³ã³ããŒãããã³ãŒãã«å¯ŸããŠãã¹ãã³ãŒããå®è£
ããŸãã ãè¬åž«ãç°¡åãªãã¹ãã®ãµã³ãã«ã³ãŒãã玹ä»ããŠãããŸããããã®ãµã³ãã«ã³ãŒãã¯ãScratchã§äœæããã¢ãã¡ãŒã·ã§ã³ã®åãããã¹ããããã®ã§ãpytestã©ã€ãã©ãªã䜿çšããŠããŸãããäŸãã°ããã£ã©ã¯ã¿ãŒãæå®ãããäœçœ®ã«ç§»åããããšãæ€èšŒãããã¹ãããç¹å®ã®é³ã鳎ãããšãæ€èšŒãããã¹ããªã©ããããŸãããè¬åž«ãã³ãŒããç»é¢å
±æããªãã説æããŠãããã®ã§ãç§ãã¡ãèªèº«ã®PCã§åãããã«ã³ãŒããæžãåããŸããããšã©ãŒãçºçããç®æã¯ããšã©ãŒã¡ãã»ãŒãžãèªã¿ãªããä¿®æ£ããããè¬åž«ã«è³ªåãããããŠè§£æ±ºããŸããããã®åŸãã¿ãŒããã«ã§pytestã³ãã³ããå®è¡ããŠãã¹ããå®è¡ãããã¹ããæåããããšã確èªããŸããã詳现ãªãã¹ãã³ãŒãã«ã€ããŠã¯ããã²GitLabã®ãªããžããªïŒ[GitLabã®ãªããžããªURL]ïŒã«ã¢ã¯ã»ã¹ããŠç¢ºèªããŠãã ãããã¯ãŒã¯ã·ã§ããã§äœ¿çšãããã¹ãŠã®ãã¹ãã³ãŒããé¢é£è³æãå
¬éãããŠããŸãã®ã§ããã¹ãã³ãŒãã®å
šäœåãææ¡ããããå®éã«ãã¹ããå®è¡ãããããããšãã§ããŸãã ãã®ã¯ãŒã¯ã·ã§ããã®ç¹çãã¹ãç¹ã¯ããŸãååŠè
ã®åå è
ãå®éã«åãããã°ã©ã ãäœæã§ããããšã§ããScratchãæŽ»çšããããšã§ãåå è
ãåãããã°ã©ã ãèªãäœããããã«ãããšããã¢ã€ãã¢ã¯éåžžã«çŽ æŽããããšæããŸãããéåžžã®èªåãã¹ãã«é¢ãããã³ãºãªã³ã§ã¯ãå€ãã®å Žåãäºåã«çšæãããããã°ã©ã ã«å¯ŸããŠãã¹ãã³ãŒããæžãããšãäžè¬çã§ããããããä»åã®ã¯ãŒã¯ã·ã§ããã§ã¯ãåããã®ããŒãããèªåã§äœãããã®ãã¹ãã³ãŒããŸã§æžããšããäžé£ã®æµãããæ°æéãšããçãæéã§äœéšã§ããç¹ãçŽ æŽããããšæããŸãããã¯ãŒã¯ã·ã§ããã®æéå
ã§ãã¹ãŠã®ãã¹ãã³ãŒããå®è£
ããããšã¯ã§ããŸããã§ããããåå è
å
šå¡ãäœããã®åœ¢ã§ãã¹ãã³ãŒããå®è£
ããããšãã§ããŸãããååŠè
åãã«Scratchã§ã¢ããªäœæãäœéšããããããPythonã³ãŒãã«å€æããèªèº«ãäœæãããããã¯ãã³ãŒãã«å¯ŸããŠãã¹ãã³ãŒããå®è£
ãããšããã¯ãŒã¯ã·ã§ããã®ãã¶ã€ã³ã¯ãæ¬åœã«çŽ æŽããããšæããŸããã ãããã« ä»åã®èšäºã§ã¯åå ãã2ã€ã®ã¯ãŒã¯ã·ã§ããã«ã€ããŠã玹ä»ããŸãããã©ã¡ãã®ã¯ãŒã¯ã·ã§ããããçæéã§ææã宿ã§ãããããªå·¥å€«ãåããããŠããããã®å
容ãšãšãã«å€§å€å匷ã«ãªããŸãããã¯ãŒã¯ã·ã§ããã®ãªãŒããŒã®æ¹ã
ã«ã¯ãçŽæ¥ãäŒãããŠæè¬ã®æ°æã¡ããäŒããããã²ãã®çŽ æŽãããã»ãã·ã§ã³ãæ¥æ¬ã«ããã¿ããªã«ãåºãããã®ã§ããµã€ãã®URLãªã©ãå
¬éããŠãè¯ãã確èªãããŠããã ããŸããã ãç§èªèº«ãé·å¹Žè±èªã«èŠææèããããã¯ãŒã¯ã·ã§ãããžã®åå ã¯ãä»ã®åå è
ãè¬åž«ã®æ¹ã
ã«ãè¿·æããããŠããŸãã®ã§ã¯ãªãããšããäžå®ããããŸãããããããåãå¿ãæã€ä»²éãã¡ãšãäºãã®äŒãããå
容ãçè§£ããããšããå§¿å¢ã«è§Šãããã®ãã¡ã®äžäººãšã¯æ°é±éåŸã«ç§ã®äœãè¡ãžå¶ç¶æ
è¡ã«æ¥ããšã®ããšã§ãé£äºã®çŽæãŸã§ã§ããŸããããŸããåå è
ã®äžã«ã¯ç¬¬äºå€åœèªãšããŠè±èªãåŠãã§ããæ¹ãããããã§ãã¿ããªãçå£ã«è³ãåŸããŠãããå§¿å¢ãå°è±¡çã§ããã ãçµæãšããŠãç§èªèº«ãéåžžã«æ¥œããåŠç¿ã§ããæéãéããããšãã§ããŸãããåãã°ã«ãŒãã«ãªã£ãåå è
ã®æ¹ã
ãããšãŠã芪åã§å©ããããŸãããç§ã¯è±èªãåŸæã§ã¯ãããŸããããAgile Testing Daysã§ã¯ããŒããŒããã¯ãããæ°å€ãã®ã»ãã·ã§ã³ãã¯ãŒã¯ã·ã§ãããããã«ãã£ã¹ã«ãã·ã§ã³ãéå¬ãããç»å£è
ã®çµéšã«åºã¥ããçºè¡šãå€ããå
±æã§ããå
å®¹ãæ°å€ããããŸããã ãã»ãã·ã§ã³ä»¥å€ã®æéã«ãé£äºãæäŸãããåå è
åå£«ãæ¥œãã亀æµã§ããå ŽãèšããããŠããã3æ¥éãéããŠå€ãã®æ¹ã
ãšè©±ãããšãã§ããŸããã ãä»å¹Žã® Agile Testing Daysã®åå åä» ãå§ãŸããŸããããã®ããã°ããã£ããã«ãèªè
ã®ã¿ãªããŸãã¯ãŒã¯ã·ã§ããã詊ããŠã¿ãããæµ·å€ã®ã«ã³ãã¡ã¬ã³ã¹ãžã®åå ã«ææŠããŠã¿ãããšæã£ãŠããã ãããããšãŠãããããã§ãã
åç»
該åœããã³ã³ãã³ããèŠã€ãããŸããã§ãã













