<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: nao</title>
    <description>The latest articles on DEV Community by nao (@5d8vsrhksd93374).</description>
    <link>https://dev.to/5d8vsrhksd93374</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1190378%2F979f76c3-d4c6-4e5e-970c-831dac0cbf16.jpg</url>
      <title>DEV Community: nao</title>
      <link>https://dev.to/5d8vsrhksd93374</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/5d8vsrhksd93374"/>
    <language>en</language>
    <item>
      <title>AWS SAP Practice</title>
      <dc:creator>nao</dc:creator>
      <pubDate>Tue, 07 May 2024 13:32:15 +0000</pubDate>
      <link>https://dev.to/5d8vsrhksd93374/aws-sap-practice-4hk6</link>
      <guid>https://dev.to/5d8vsrhksd93374/aws-sap-practice-4hk6</guid>
      <description>&lt;p&gt;AWS SAP&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A&lt;/li&gt;
&lt;li&gt;S&lt;/li&gt;
&lt;li&gt;A&lt;/li&gt;
&lt;li&gt;A&lt;/li&gt;
&lt;li&gt;A&lt;/li&gt;
&lt;li&gt;A&lt;/li&gt;
&lt;li&gt;A&lt;/li&gt;
&lt;li&gt;A&lt;/li&gt;
&lt;li&gt;A&lt;/li&gt;
&lt;li&gt;ABCE Amazon SESでは設定セット（Configuration sets）を使うことでメールの開封率などを調べることが可能 メトリクスはCloud Watch, Kinesis Firehose, SNSに送信することが可能 以前はできなかったが、２０１７年ごろに可能になった&lt;/li&gt;
&lt;li&gt;Aa VPCフローログは送信元IPアドレスや宛先、ポート番号などの基本的な情報しかないがVPCミラーリングで得られたパケットには通信に関する全ての情報がある それをWireshark等のパケットキャプチャツールで解析すると通信をしているユーザなどの情報を検査できる パケットの送信先はENIかNetwork loadBalancerのみ。CloudWatch Logsには送信できない&lt;/li&gt;
&lt;li&gt;A AWS Personal Health DashboardのAWS_EC2_PERSISTENT_INSTANCE_RETIREMENT_SCHEDULEDイベントは、EC2インスタンスがハードウェアの問題や老朽化などの理由で退役予定であることを示すアラート このイベントのターゲットとしてAWS AutomationのAWS-RestartEC2Instanceを指定することで自動起動が可能&lt;/li&gt;
&lt;li&gt;A Amazon Inspectorにはエージェントが必ずしも必要ない（エージェントレススキャン） ただ、ソフトウェアの脆弱性を詳細に検査するためにはAgentが必要&lt;/li&gt;
&lt;li&gt;Aa Dedicated Hostsのアフィニティオプションを利用することで、インスタンスが再起動したときも同じハードウェアマシン上で起動されるようになる&lt;/li&gt;
&lt;li&gt;A S3バケットのリクエスタ支払いを有効にすると、自動的にAWS認証とx-amz-request-payer:requesterをヘッダーに含めたリクエストが必須になる つまり、バケットポリシーのConditionを追加する必要はない&lt;/li&gt;
&lt;li&gt;A KMSマスターキーのエクスポートはできない 素早く安全にデータベースのコピーを相手に渡すには、Aurora MySQLのスナップショットを作成してKMSのCMKをキーポリシーによって使えるようにする&lt;/li&gt;
&lt;li&gt;A&lt;/li&gt;
&lt;li&gt;A DAXにはSaving Plansは存在しない&lt;/li&gt;
&lt;li&gt;A Elastic IPアドレスが利用できるAWSのサービスは、EC2, NATゲートウェイ、Network Load Balancerである&lt;/li&gt;
&lt;li&gt;Aa AWS SCT (Schema Conversion Tools)を使うことでデータウェアハウスからデータを抽出/変換しS3やSnowball Edgeに移行することができる&lt;/li&gt;
&lt;li&gt;A AWS Replication AgentはAWS Application Migration Serviceでも使える AMSでテストインスタンスの起動も可能&lt;/li&gt;
&lt;li&gt;C⭕️&lt;/li&gt;
&lt;li&gt;C⭕️ Kinesisはマネージド→OSの管理が必要ない&lt;/li&gt;
&lt;li&gt;B/C Memchaedは暗号化やレプリケーションをサポートしていない &lt;/li&gt;
&lt;li&gt;DCF/ADF ENIにはMACアドレスも紐づいている &lt;/li&gt;
&lt;li&gt;C⭕️&lt;/li&gt;
&lt;li&gt;BC⭕️&lt;/li&gt;
&lt;li&gt;DCE/BCD&lt;/li&gt;
&lt;li&gt;B⭕️ CodepipelineでCodeBuildを実行して、コマンドの戻り値がエラーの場合はパイプラインが終了する &lt;/li&gt;
&lt;li&gt;EDC/BDE AWSとオンプレミスの安定な接続→Direct Connect Gateway マネージドなVPN接続→AWSクライアントVPN&lt;/li&gt;
&lt;li&gt;A/D&lt;/li&gt;
&lt;li&gt;A/B CART（AWS Cloud Adoption Readiness Tool）を利用することでAWS以降に必要な準備について適切な指標を出せる&lt;/li&gt;
&lt;li&gt;D/C Egress-Onlyインターネットゲートウェイはサブネットに作成するものではなくVPCにアタッチするものである&lt;/li&gt;
&lt;li&gt;B/D&lt;/li&gt;
&lt;li&gt;B⭕️&lt;/li&gt;
&lt;li&gt;B/C 外部IDはIAMロールのARN登録ごとにランダムに作成する必要がある&lt;/li&gt;
&lt;li&gt;C⭕️ &lt;/li&gt;
&lt;li&gt;B⭕️ &lt;/li&gt;
&lt;li&gt;B⭕️&lt;/li&gt;
&lt;li&gt;D⭕️&lt;/li&gt;
&lt;li&gt;A/B 追加の勉強が必要&lt;/li&gt;
&lt;li&gt;C⭕️ Transit GatewayのVPN接続でEnable Accelerationを有効にするとGlobal Acceleratorを利用したVPNネットワークの高速化になる&lt;/li&gt;
&lt;li&gt;ADE⭕️&lt;/li&gt;
&lt;li&gt;C/B SCPを利用するにはOrganizationsで全ての機能を有効化する必要がある&lt;/li&gt;
&lt;li&gt;CDF/BCD Firewall Managerで必須の機能→Organizationsで全ての機能を有効化すること、管理者アカウントの設定、Configを有効化すること&lt;/li&gt;
&lt;li&gt;A/D 最小限の権限を設定するためにService Catalogを使える&lt;/li&gt;
&lt;li&gt;D⭕️ Lambda関数に送信元Elastic IPアドレスを設定するには、NATゲートウェイ経由でアウトバンドリクエストを実行する必要がある NAT Gatewayに適用したElastic IPアドレスを使う&lt;/li&gt;
&lt;li&gt;D/C KMSの顧客管理キーはローテーションが可能 パスワードのローテーションが必要な場合はシークレットマネージャーを利用する必要があるが、キーのローテーションならKMSでOK&lt;/li&gt;
&lt;li&gt;A/C&lt;/li&gt;
&lt;li&gt;AC⭕️ Cloud HSMでTDEプライマリ暗号化キーを使用するケースはRDSでサポートされていない。→EC2を利用する必要がある&lt;/li&gt;
&lt;li&gt;D⭕️&lt;/li&gt;
&lt;li&gt;B⭕️&lt;/li&gt;
&lt;li&gt;B⭕️ Direct Connect Gatewayで複数リージョンのVPCにアタッチできる&lt;/li&gt;
&lt;li&gt;CDE/BCE SricataとはオープンソースのIDS Sricata互換での検査をマネージドで提供するサービスはAWS Network Firewall&lt;/li&gt;
&lt;li&gt;C/B&lt;/li&gt;
&lt;li&gt;ABC⭕️ IAMロールを使うことでEC2のメタデータに一時的な認証情報が保存されますが、IMDSv2のみを使用することでサーとパーティ製のWAFの脆弱性に影響されにくい&lt;/li&gt;
&lt;li&gt;C/A Cloud Frontキーペアの作成はrootユーザーでなくてもできる&lt;/li&gt;
&lt;li&gt;C⭕️&lt;/li&gt;
&lt;li&gt;B⭕️&lt;/li&gt;
&lt;li&gt;BD⭕️&lt;/li&gt;
&lt;li&gt;B/C ベストプラクティスは「自動化」&lt;/li&gt;
&lt;li&gt;B/C S3マルチパートアップロードでは不完全なパートが残りっぱなしになるとストレージ容量を逼迫してしまうため定期的に削除することが必要&lt;/li&gt;
&lt;li&gt;D⭕️&lt;/li&gt;
&lt;li&gt;BCE⭕️&lt;/li&gt;
&lt;li&gt;B⭕️ ルートユーザーが使われたことの通知→Guard DutyのRootCredentialUsageイベント&lt;/li&gt;
&lt;li&gt;D⭕️ Application Discovery Serviceで以降の判断や計画を立てることにも使える&lt;/li&gt;
&lt;li&gt;B⭕️&lt;/li&gt;
&lt;li&gt;D/C AWS Outpostsとは自社のデータセンターやオンプレミス環境にAWSのサーバをラックごと設置するもの 住所がはっきりしている特定の場所にデータを保存しなければならない場合などに利用する&lt;/li&gt;
&lt;li&gt;B⭕️ EMRではマスターノードとコアノードは中断されずに実行される必要がある&lt;/li&gt;
&lt;li&gt;ABC/ACD インプレミスのLinuxにEFSをマウントし、転送中のデータを暗号化する場合 amazon-efs-utilsをインストールして、マウントヘルパーコマンドで-o tlsオプションをつけてマウントする マウントするとき、EFSファイルシステムIDを指定するので名前解決できる必要がある&lt;/li&gt;
&lt;li&gt;D/B わからん&lt;/li&gt;
&lt;li&gt;CE/BC RDS Proxyを利用する場合は、パスワード保存用のSecrets Managerが必要 RDS Proxyにとどいたリクエストの認証を行うため&lt;a href="https://dev.classmethod.jp/articles/how-rdsproxy-uses-secrets-manager/"&gt;https://dev.classmethod.jp/articles/how-rdsproxy-uses-secrets-manager/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;B/C CloudFrontのフィールドレベル暗号化とは、CloudFrontでやり取りされる特定のフィールドのデータを暗号化するもの 特定のセンシティブな情報を暗号化する際に利用される KMSキーなどで暗号化をすると、KMSキーが利用できる人ならその情報が見れてしまう&lt;/li&gt;
&lt;li&gt;A/B&lt;/li&gt;
&lt;li&gt;D/A リアルタイム配信は、AWS Elemental MediaLiveとAWS Elemental MediaStoreとCloudFrontで実現可能&lt;/li&gt;
&lt;li&gt;C/D 同じリージョン内のVPC同士を接続する場合→Transit Gateway その後、各リージョンのTransit Gateway同士をピア接続する&lt;/li&gt;
&lt;li&gt;D⭕️&lt;/li&gt;
&lt;li&gt;BD/BE OACはCloudFront経由に限定するだけで、アクセスもとの認証などを判断するものではない&lt;/li&gt;
&lt;li&gt;A/C EventBridgeを利用することでスポットインスタンスの中断などのAWSアカウント内のイベントと、外部SaaS製品のイベントを統合できる&lt;/li&gt;
&lt;li&gt;C⭕️&lt;/li&gt;
&lt;li&gt;DE/CE&lt;/li&gt;
&lt;li&gt;D/C 勉強が必要Step Function 使う&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;追加で勉強すること&lt;/p&gt;

&lt;p&gt;追加でまとめること&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;組織のネットワーク設計

&lt;ol&gt;
&lt;li&gt;VPCエンドポイントの利用&lt;/li&gt;
&lt;li&gt;AWS PrivateLinkとVPCエンドポイントの違い&lt;/li&gt;
&lt;li&gt;AWS クライアントVPN/AWS Site-toSite VPN/ソフトウェアVPNなどを使ったVPN構成&lt;/li&gt;
&lt;li&gt;仮想プライベートゲートウェイとカスタマーゲートウェイ&lt;/li&gt;
&lt;li&gt;AWS Direct Connect&lt;/li&gt;
&lt;li&gt;VPCピア接続&lt;/li&gt;
&lt;li&gt;AWS Transit Gateway&lt;/li&gt;
&lt;li&gt;Direct ConnectとTransit Gateway&lt;/li&gt;
&lt;li&gt;Route53プライベートホストゾーンとRoute53 Resolver&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;li&gt;マルチアカウント戦略、ロール、ユーザ管理について

&lt;ol&gt;
&lt;li&gt;組織内でのクロスアカウントアクセス&lt;/li&gt;
&lt;li&gt;サードパーティ製品へのアクセス許可と混乱した代理問題&lt;/li&gt;
&lt;li&gt;AWS Directory Service&lt;/li&gt;
&lt;li&gt;AWS Organization&lt;/li&gt;
&lt;li&gt;AWS Service CatalogとAWS Resource Access Manager&lt;/li&gt;
&lt;li&gt;AWS Control Tower&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;li&gt;開発

&lt;ol&gt;
&lt;li&gt;Build spec.ymlとapp spec.yml&lt;/li&gt;
&lt;li&gt;EC2インスタンス/ECS/Lambdaへのデプロイ戦略&lt;/li&gt;
&lt;li&gt;CloudFormationのヘルパーリクエスト&lt;/li&gt;
&lt;li&gt;AWS CodePipelineの使用例&lt;/li&gt;
&lt;li&gt;AWS Elastic Beanstalkの使用例&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;li&gt;モニタリング

&lt;ol&gt;
&lt;li&gt;AWS Healthイベント　Personal Health&lt;/li&gt;
&lt;li&gt;CloudWatchの利用例&lt;/li&gt;
&lt;li&gt;VPCのモニタリング（VPC Flow Logsとトラフィックミラーリング）&lt;/li&gt;
&lt;li&gt;AWS X-Ray&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;li&gt;構成管理、メンテナンス

&lt;ol&gt;
&lt;li&gt;AWS Systems Managerの利用&lt;/li&gt;
&lt;li&gt;AWS Config&lt;/li&gt;
&lt;li&gt;S3のバッチオペレーション&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;li&gt;セキュリティ

&lt;ol&gt;
&lt;li&gt;ルートユーザの保護&lt;/li&gt;
&lt;li&gt;AWS KMS&lt;/li&gt;
&lt;li&gt;Cloud HSMのユースケース&lt;/li&gt;
&lt;li&gt;Secret Manager&lt;/li&gt;
&lt;li&gt;Amazon Inspector&lt;/li&gt;
&lt;li&gt;WAF, Shield, Network Firewall, Firewall Manager&lt;/li&gt;
&lt;li&gt;GuardDuty, Macie, Security Hub, Detective&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;li&gt;信頼性

&lt;ol&gt;
&lt;li&gt;災害対策のために&lt;/li&gt;
&lt;li&gt;疎結合化による信頼性の改善&lt;/li&gt;
&lt;li&gt;データベースのリクエスト改善&lt;/li&gt;
&lt;li&gt;EC2 オートスケーリング&lt;/li&gt;
&lt;li&gt;ファンアウト&lt;/li&gt;
&lt;li&gt;AWS Service Quotasが必要になる場面&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;li&gt;パフォーマンス

&lt;ol&gt;
&lt;li&gt;インスタンスタイプとかバーストとか&lt;/li&gt;
&lt;li&gt;プレイスメントグループ&lt;/li&gt;
&lt;li&gt;ストレージのパフォーマンス（S3,DynamoDB）&lt;/li&gt;
&lt;li&gt;CloudFrontの利用&lt;/li&gt;
&lt;li&gt;Global Accelerator&lt;/li&gt;
&lt;li&gt;ElastiCache&lt;/li&gt;
&lt;li&gt;RDS&lt;/li&gt;
&lt;li&gt;Aurora&lt;/li&gt;
&lt;li&gt;API Gateway&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;li&gt;コスト最適

&lt;ol&gt;
&lt;li&gt;EC2のコスト&lt;/li&gt;
&lt;li&gt;S3のコスト&lt;/li&gt;
&lt;li&gt;DynamoDBのコスト&lt;/li&gt;
&lt;li&gt;コストの可視化、予想&lt;/li&gt;
&lt;li&gt;EC2→サーバレスへ&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;li&gt;移行

&lt;ol&gt;
&lt;li&gt;7つのR&lt;/li&gt;
&lt;li&gt;移行評価支援のサービス&lt;/li&gt;
&lt;li&gt;データ、アプリケーションの移行サービス&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;li&gt;AWS の活用例

&lt;ol&gt;
&lt;li&gt;ECS/EKS/Proton&lt;/li&gt;
&lt;li&gt;App Runner&lt;/li&gt;
&lt;li&gt;Kinesis&lt;/li&gt;
&lt;li&gt;データレイク&lt;/li&gt;
&lt;li&gt;SESを活用したメール送受信&lt;/li&gt;
&lt;li&gt;Transfer Family&lt;/li&gt;
&lt;li&gt;IPアドレスに依存した設計&lt;/li&gt;
&lt;li&gt;低遅延を実現するサービス&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;/ol&gt;

</description>
    </item>
    <item>
      <title>chiikawa</title>
      <dc:creator>nao</dc:creator>
      <pubDate>Mon, 15 Apr 2024 14:18:03 +0000</pubDate>
      <link>https://dev.to/5d8vsrhksd93374/chiikawa-m09</link>
      <guid>https://dev.to/5d8vsrhksd93374/chiikawa-m09</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fthll0vmjf9t09r7v52tq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fthll0vmjf9t09r7v52tq.png" alt="Image description" width="800" height="757"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft6yqpise5wk5m3ayolob.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft6yqpise5wk5m3ayolob.png" alt="Image description" width="800" height="769"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foo7f3txqpso4iwf7oecw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foo7f3txqpso4iwf7oecw.png" alt="Image description" width="800" height="668"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F29vbzav7pm3dvetspv0j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F29vbzav7pm3dvetspv0j.png" alt="Image description" width="800" height="650"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn1guyhukpzibun3we06n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn1guyhukpzibun3we06n.png" alt="Image description" width="800" height="762"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqsfo244xs6mgkbe125s5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqsfo244xs6mgkbe125s5.png" alt="Image description" width="800" height="835"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvicooef6idst777wihec.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvicooef6idst777wihec.png" alt="Image description" width="800" height="826"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi6qu5v8gts1oe76dj3je.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi6qu5v8gts1oe76dj3je.png" alt="Image description" width="800" height="788"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi96ntysr8muno0lkl2he.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi96ntysr8muno0lkl2he.png" alt="Image description" width="800" height="740"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzwh5yugwmrjr8hwvzd8z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzwh5yugwmrjr8hwvzd8z.png" alt="Image description" width="800" height="859"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3tz1uabe60zyxgp53nze.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3tz1uabe60zyxgp53nze.png" alt="Image description" width="800" height="599"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8617jzlp7qnpp6iuubwy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8617jzlp7qnpp6iuubwy.png" alt="Image description" width="800" height="397"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqvkvv57fkz2igubaml44.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqvkvv57fkz2igubaml44.png" alt="Image description" width="800" height="590"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to solve Network Forensics puzzl with chat GPT</title>
      <dc:creator>nao</dc:creator>
      <pubDate>Sun, 14 Apr 2024 08:12:12 +0000</pubDate>
      <link>https://dev.to/5d8vsrhksd93374/how-to-solve-network-forensics-puzzl-with-chat-gpt-2ie7</link>
      <guid>https://dev.to/5d8vsrhksd93374/how-to-solve-network-forensics-puzzl-with-chat-gpt-2ie7</guid>
      <description>&lt;p&gt;&lt;a href="https://forensicscontest.com/2009/09/25/puzzle-1-anns-bad-aim"&gt;https://forensicscontest.com/2009/09/25/puzzle-1-anns-bad-aim&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;vidence01.txt&lt;br&gt;
Document&lt;br&gt;
これは下記背景のもと取得されたパケットです。&lt;/p&gt;

&lt;p&gt;背景&lt;br&gt;
Anarchy-R-Us, Inc. suspects that one of their employees, Ann Dercover, is really a secret agent working for their competitor. Ann has access to the company’s prize asset, the secret recipe. Security staff are worried that Ann may try to leak the company’s secret recipe.&lt;/p&gt;

&lt;p&gt;Security staff have been monitoring Ann’s activity for some time, but haven’t found anything suspicious– until now. Today an unexpected laptop briefly appeared on the company wireless network. Staff hypothesize it may have been someone in the parking lot, because no strangers were seen in the building. Ann’s computer, (192.168.1.158) sent IMs over the wireless network to this computer. The rogue laptop disappeared shortly thereafter.&lt;/p&gt;

&lt;p&gt;“We have a packet capture of the activity,” said security staff, “but we can’t figure out what’s going on. Can you help?”&lt;/p&gt;

&lt;p&gt;このパケットを解析して次の問題に答えてください。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What is the name of Ann’s IM buddy?
また、解答に使用したパケット番号を答えてください
名前が直接わからない場合は、IMを始めて開始したと思われるパケットの番号を教えてください。私がそのパケット番号をもとに解析します。&lt;/li&gt;
&lt;/ol&gt;

</description>
    </item>
    <item>
      <title>How to solve Network Forensics puzzl with chat GPT</title>
      <dc:creator>nao</dc:creator>
      <pubDate>Sun, 14 Apr 2024 08:12:12 +0000</pubDate>
      <link>https://dev.to/5d8vsrhksd93374/how-to-solve-network-forensics-puzzl-with-chat-gpt-34bi</link>
      <guid>https://dev.to/5d8vsrhksd93374/how-to-solve-network-forensics-puzzl-with-chat-gpt-34bi</guid>
      <description>&lt;p&gt;&lt;a href="https://forensicscontest.com/2009/09/25/puzzle-1-anns-bad-aim"&gt;https://forensicscontest.com/2009/09/25/puzzle-1-anns-bad-aim&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2i7a19m32q2sf7trux98.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2i7a19m32q2sf7trux98.png" alt="Image description" width="800" height="423"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;vidence01.txt&lt;br&gt;
Document&lt;br&gt;
これは下記背景のもと取得されたパケットです。&lt;/p&gt;

&lt;p&gt;背景&lt;br&gt;
Anarchy-R-Us, Inc. suspects that one of their employees, Ann Dercover, is really a secret agent working for their competitor. Ann has access to the company’s prize asset, the secret recipe. Security staff are worried that Ann may try to leak the company’s secret recipe.&lt;/p&gt;

&lt;p&gt;Security staff have been monitoring Ann’s activity for some time, but haven’t found anything suspicious– until now. Today an unexpected laptop briefly appeared on the company wireless network. Staff hypothesize it may have been someone in the parking lot, because no strangers were seen in the building. Ann’s computer, (192.168.1.158) sent IMs over the wireless network to this computer. The rogue laptop disappeared shortly thereafter.&lt;/p&gt;

&lt;p&gt;“We have a packet capture of the activity,” said security staff, “but we can’t figure out what’s going on. Can you help?”&lt;/p&gt;

&lt;p&gt;このパケットを解析して次の問題に答えてください。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What is the name of Ann’s IM buddy?
また、解答に使用したパケット番号を答えてください
名前が直接わからない場合は、IMを始めて開始したと思われるパケットの番号を教えてください。私がそのパケット番号をもとに解析します。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;GPT&lt;/p&gt;

&lt;p&gt;キャプチャファイルの中から、AnnのIM相手の名前を特定するのは直接的な情報がないため、難しいですが、Annのコンピュータ（192.168.1.158）から他のマシンに送信されたIM関連のパケットを探すことで、関連する情報を見つけることができます。&lt;br&gt;
上記の記録から、パケット番号23でAnnのコンピュータがIPアドレス64.12.24.50に対してSSLプロトコル（Transport Layer Security）を使用してデータを送信しています。このパケットは、IM（インスタントメッセージ）に関連するものである可能性が高く、このIPアドレスがAnnのIM相手であるかもしれません。ただし、このパケット情報だけからはIM相手の名前は直接的にはわかりません。&lt;br&gt;
もしこの情報からさらに詳細な解析が必要であれば、指定したパケット番号23に基づいてさらに解析を進めることができます。それでは、この方向で進めてよろしいでしょうか？&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwylahvjnuxc09qz2q3w8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwylahvjnuxc09qz2q3w8.png" alt="Image description" width="800" height="274"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Floezi6j5mtmhzpge3ooy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Floezi6j5mtmhzpge3ooy.png" alt="Image description" width="800" height="463"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;)°byE¤»Eå«&amp;lt;@&lt;a class="mentioned-user" href="https://dev.to/tr"&gt;@tr&lt;/a&gt;À¨@2Ç¸»3kÒÉé`ÛPõ&amp;lt;Ð*a·E4628778Sec558user1Here's the secret recipe... I just downloaded it from the file server. Just copy to a thumb drive and you're good to go &amp;gt;:-)&lt;/p&gt;

&lt;p&gt;問題3&lt;/p&gt;

&lt;p&gt;ありがとうございます。次の問題はこれです。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What is the name of the file Ann transferred?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;GPT&lt;/p&gt;

&lt;p&gt;Annが転送したファイルの名前を特定するためには、ファイル転送が行われたことを示すパケットを探し、その中からファイル名を特定する情報を抽出する必要があります。ファイル転送には、通常、FTP（File Transfer Protocol）、HTTP（HyperText Transfer Protocol）、またはSMTP（Simple Mail Transfer Protocol）などのプロトコルが使用されることが多いです。&lt;br&gt;
パケットキャプチャのデータを確認し、これらのプロトコルに関連する情報が含まれるパケットを探し、そこからファイル名を抽出します。ファイルの詳細な解析を行うため、パケットデータを再度調査して、関連する情報を見つけ出します。これには少し時間がかかる場合がありますので、しばらくお待ちください。&lt;br&gt;
Annが転送したファイルの名前は「recipe.docx」です。この情報はパケット番号117から抽出されました。このパケットは、インターネット・プロトコル（IP）アドレス192.168.1.159から192.168.1.158へのデータ転送を含んでおり、ファイル名「recipe.docx」がデータ部に含まれていることが確認できます 。このファイル名は、会社の秘密レシピを示唆している可能性が高いです。&lt;/p&gt;

&lt;p&gt;ありがとうございます。ちなみに、192.168.1.159のIPアドレスを持つ端末と、64.12.24.50のIPアドレスを持つ端末はどのような用途を持つ端末だと考えられますか？本問題の背景と照らし合わせて教えてください。&lt;/p&gt;

&lt;p&gt;GPT&lt;br&gt;
IPアドレス192.168.1.159と64.12.24.50について、それぞれの用途を考える際、提供された背景情報と既知のデータを考慮に入れることが重要です。&lt;br&gt;
    192.168.1.159:&lt;br&gt;
    このIPアドレスはプライベートアドレス範囲に属しており、一般的にはローカルネットワーク内で使用されます。問題の背景によると、Ann Dercoverが秘密情報を外部に漏らす恐れがあるとされています。彼女のコンピュータ（192.168.1.158）がこのIPアドレス（192.168.1.159）と通信していた事実から、この端末も社内ネットワークに接続されている他の端末、あるいは外部からアクセスした端末（例えばVPNを通じて）である可能性が考えられます。この端末が「recipe.docx」というファイルの受信側であることから、この端末は秘密情報の受け取り手である可能性が高いです。&lt;br&gt;
    64.12.24.50:&lt;br&gt;
    このIPアドレスはパブリックアドレスであり、インターネット上の端末を指します。特定の企業やサービスプロバイダーが所有することが多いです。これがIM（インスタントメッセージング）の通信で使用されていたことから、このIPアドレスが社外のIMサービスプロバイダー、もしくはAnnが使用している外部のコミュニケーションサービス（例えば、競合企業のサーバーなど）に属している可能性があります。AnnがこのIPアドレスと通信していたことから、彼女が外部の人物と連絡を取っていた証拠となるかもしれません。&lt;/p&gt;

&lt;p&gt;ありがとう。答えはrecipe.docxのようです。&lt;br&gt;
次の問題はこれです。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What is the magic number of the file you want to extract (first four bytes)?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;ファイルの「マジックナンバー」とは、ファイルの種類を識別するために使用されるファイルの先頭に位置するバイト列です。これはファイルのフォーマットを示し、オペレーティングシステムやアプリケーションにそのファイルをどのように扱うかを伝える手がかりを提供します。&lt;br&gt;
Annが転送した「recipe.docx」というファイルは、Microsoft Wordのドキュメントです。Wordファイル（特にOffice 2007以降で一般的な.docx形式）は、Open XMLフォーマットを使用しており、実質的にはZIP圧縮された一連のXMLファイルです。&lt;br&gt;
ZIPファイルのマジックナンバーは通常、ファイルの最初の4バイトであり、「50 4B 03 04」というバイト列で表されます。このシーケンスは、ZIPアーカイブを識別するためのものです。&lt;br&gt;
したがって、「recipe.docx」ファイルのマジックナンバーは「50 4B 03 04」です。これは、ファイルがZIPフォーマットを使用していることを示しています。&lt;/p&gt;

&lt;p&gt;ありがとう。次の問題はこれです。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What was the MD5sum of the file?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;GPT&lt;/p&gt;

&lt;p&gt;Annが転送したファイル「recipe.docx」のMD5ハッシュ値を特定するためには、パケットキャプチャから直接そのファイルを抽出し、MD5ハッシュを計算する必要があります。ただし、この操作は通常、パケット解析ツールを使って行われます。&lt;br&gt;
パケットキャプチャファイルから直接ファイルを抽出するプロセスを行うためには、ファイルが転送されたパケット番号を特定し、それを元にデータを再構築する必要があります。この作業は通常、Wiresharkなどのツールで実施しますが、ここではそのプロセスをシミュレートし、ファイルのMD5ハッシュ値を求めます。&lt;br&gt;
ファイルの抽出とMD5計算を行うための具体的な手順は次のとおりです：&lt;br&gt;
パケットキャプチャからファイル転送に関連するパケットを特定します（すでに行っています）。&lt;br&gt;
これらのパケットからファイルデータを抽出し、正しい順序で再構築します。&lt;br&gt;
完全に再構築されたファイルに対してMD5ハッシュを計算します。&lt;br&gt;
このプロセスには専門的なツールやソフトウェアが必要であり、またセキュリティポリシーによっては実行が制限される場合があります。私の環境では直接ファイルを抽出してMD5を計算することはできませんが、もしお持ちの環境でWiresharkなどのツールを使える場合、そちらで試してみることをお勧めします。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx7qvhgadb0d67wb23s6c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx7qvhgadb0d67wb23s6c.png" alt="Image description" width="800" height="736"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;..A.&amp;lt;.k..y...lyK......  .g......n.....D.......|2..[...k:&amp;lt;"........PK..-.........!.|..=..........................[Content_Types].xmlPK..-.........!.........N....................._rels/.relsPK..-.........!...L...........................word/_rels/document.xml.relsPK..-.........!.E.e.P.... .................   ..word/document.xmlPK..-.........!.........P.....................word/theme/theme1.xmlPK..-.........!.?&lt;br&gt;
.a......................v...word/settings.xmlPK..-.........!.t?9z....(.....................customXml/_rels/item1.xml.relsPK..-.........!...T&amp;lt;....U.....................customXml/itemProps1.xmlPK..-.........!..q.}:...,:....................word/styles.xmlPK..-.........!..Dm|o.....................W!..docProps/core.xmlPK..-.........!..=.........................#..customXml/item1.xmlPK..-.........!...cg3...q..................$..word/fontTable.xmlPK..-.........!.J.........................&amp;gt;'..word/webSettings.xmlPK..-.........!.c.........................+(..docProps/app.xmlPK..............&amp;gt;+....OFT2....7174647..........................d.......................d..Cool FileXfer................... ...........................................................................................recipe.docx.....................................................&lt;br&gt;
このようなデータが含まれていたのですが、内容はわかりますか？&lt;/p&gt;

&lt;p&gt;GPT&lt;br&gt;
アップロードされたデータは、ファイルのバイナリコンテンツを含むテキスト表現のようです。ここに示された文字列は、ファイルの内容の一部を16進数（Hex）形式で表現しています。このデータから直接「secret recipe」の内容を読み取ることはできませんが、いくつかの特徴に基づいてデータの種類や関連情報を推測することは可能です。&lt;br&gt;
    ファイル形式の識別:&lt;br&gt;
    データの始まりにある「PK」という文字列は、ZIP圧縮ファイルのマジックナンバーを示しています。Microsoft Officeの文書ファイル（.docx, .xlsxなど）も内部的にはZIP形式で圧縮されているため、このようなマジックナンバーで始まります。&lt;br&gt;
    内容の抽出:&lt;br&gt;
    実際にこのデータから特定の文書内容を読み取るには、ZIPファイルとして解凍し、内部に含まれるXMLファイルや他のリソースを分析する必要があります。これには適切なツールが必要です。&lt;br&gt;
    ファイル名:&lt;br&gt;
    このデータの中に「recipe.docx」という名前が見えることから、送信されたファイルがレシピに関連している可能性があることが示唆されています。&lt;br&gt;
このデータから具体的な「secret recipe」の内容を抽出するためには、次のステップを実行する必要があります：&lt;br&gt;
データの16進数からの変換：表示されている16進数データを実際のバイナリデータに変換します。&lt;br&gt;
ファイルの解凍と解析：ZIP形式のファイルとして解凍し、その中の文書ファイル（この場合はおそらくXML形式の文書）を解析します。&lt;br&gt;
コンテンツの読み取り：文書ファイルから実際のテキストコンテンツを読み取り、レシピの内容を確認します。&lt;br&gt;
このプロセスをローカル環境で行うための具体的なツールやステップが必要であれば、その方法をさらに詳しく説明することができます。どのように進めるか、ご指示ください。&lt;/p&gt;

&lt;p&gt;具体的にどのように行えばいいでしょうか？Mac環境です&lt;/p&gt;

&lt;p&gt;GPT&lt;/p&gt;

&lt;p&gt;Mac環境でZIP形式のデータからファイルを解凍し、内容を解析するためには、以下のステップを実行することができます。ここではコマンドラインツールを使用した方法をご紹介しますが、GUIツールを使用する方法も可能です。&lt;br&gt;
ステップ1: バイナリデータの準備&lt;br&gt;
まず、提示された16進数のデータをバイナリファイルに変換する必要があります。これを行うには、テキストエディタで16進数データをコピーし、適切な形式でファイルに保存します。その後、コマンドラインツールを使用して16進数をバイナリに変換します。&lt;br&gt;
    テキストエディタ（例えば、TextEdit）を開き、16進数データを新しいドキュメントにペーストします。&lt;br&gt;
    ファイルをプレーンテキスト形式で保存し、例えば hexdata.txt という名前をつけます。&lt;br&gt;
次に、Terminal.appを開き、以下のコマンドを実行して16進数データをバイナリデータに変換します。ここではxxdコマンドを使用します。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`&lt;br&gt;
bash&lt;/p&gt;

&lt;p&gt;Copy code&lt;br&gt;
xxd -r -p hexdata.txt output.zip&lt;br&gt;
`&lt;code&gt;&lt;/code&gt;&lt;br&gt;
ステップ2: ZIPファイルの解凍&lt;br&gt;
生成された output.zip ファイルを解凍します。Macには標準でZIPファイルを扱う機能が備わっていますが、コマンドラインからも操作できます。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`&lt;br&gt;
bash&lt;/p&gt;

&lt;p&gt;Copy code&lt;br&gt;
unzip output.zip&lt;br&gt;
`&lt;code&gt;&lt;/code&gt;&lt;br&gt;
このコマンドは、ZIPファイルに含まれるすべてのファイルをカレントディレクトリに展開します。&lt;br&gt;
ステップ3: ドキュメント内容の解析&lt;br&gt;
展開されたファイルの中には、通常 .xml 形式のファイルが含まれていることが多いです（特にOfficeフォーマットの場合）。XMLファイルの内容を確認するには、cat コマンドやテキストエディタを使用します。&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;`&lt;br&gt;
bash&lt;/p&gt;

&lt;p&gt;Copy code&lt;br&gt;
cat word/document.xml&lt;br&gt;
`&lt;code&gt;&lt;/code&gt;&lt;br&gt;
このコマンドは、Wordドキュメントの主要な内容が記述されたXMLファイルの内容を表示します。&lt;br&gt;
追加のヒント&lt;br&gt;
XMLファイルが非常に大きい場合は、less コマンドを使用してページごとに内容を閲覧することが便利です。&lt;br&gt;
XMLの内容が複雑な場合は、XMLを整形して可読性を高めるツールやサービスを使用することを検討してください。&lt;br&gt;
これらのステップに従って、Mac環境でバイナリデータを解析することができます。何か不明点があれば、お気軽にお尋ねください。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiv00nmqhuts9qj2xtz0g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiv00nmqhuts9qj2xtz0g.png" alt="Image description" width="800" height="505"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwsr3j9ro3sx7ycidkifp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwsr3j9ro3sx7ycidkifp.png" alt="Image description" width="454" height="39"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fecoytjjo30y924ekm1op.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fecoytjjo30y924ekm1op.png" alt="Image description" width="474" height="231"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F09dbqwsoimiopruaklk5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F09dbqwsoimiopruaklk5.png" alt="Image description" width="734" height="343"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0air876vb1ogxbl3mqfe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0air876vb1ogxbl3mqfe.png" alt="Image description" width="449" height="36"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;w:rsidRDefault="00D91C7F" w:rsidP="00D91C7F"/&amp;gt;&lt;a href="/w:sectPr"&gt;/w:sectPr&lt;/a&gt;&lt;a href="/w:body"&gt;/w:body&lt;/a&gt;&lt;a href="/w:document"&gt;/w:document&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;このxml形式で書かれた文字列を可読性高く教えてください&lt;/p&gt;

&lt;p&gt;Title: Recipe for Disaster&lt;br&gt;
Serving Size: 1 serving&lt;br&gt;
Heading: Ingredients&lt;br&gt;
4 cups sugar&lt;br&gt;
2 cups water&lt;br&gt;
Instructions:&lt;br&gt;
In a medium saucepan, bring the water to a boil.&lt;br&gt;
Add sugar.&lt;br&gt;
Stir gently over low heat until sugar is fully dissolved.&lt;br&gt;
Remove the saucepan from heat.&lt;br&gt;
Allow to cool completely.&lt;br&gt;
Pour into a gas tank.&lt;br&gt;
Repeat as necessary.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>testpost3</title>
      <dc:creator>nao</dc:creator>
      <pubDate>Wed, 06 Mar 2024 06:12:18 +0000</pubDate>
      <link>https://dev.to/5d8vsrhksd93374/testpost3-27dh</link>
      <guid>https://dev.to/5d8vsrhksd93374/testpost3-27dh</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvro0rx0ickfzdpz1cfxz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvro0rx0ickfzdpz1cfxz.png" alt="Image description" width="800" height="249"&gt;&lt;/a&gt;&lt;br&gt;
目的：ユーザーの代わりにミーティングの候補日を伝えるメール文を作成します。&lt;/p&gt;

&lt;p&gt;ルール：日本語での対応をお願いします。&lt;/p&gt;

&lt;h4&gt;
  
  
  ステップ
&lt;/h4&gt;

&lt;p&gt;ステップ1「調整さん」は「Find Event in Google Calendar」Actionを用いてGoogle カレンダーからユーザーにどのようなイベントがあるか以下のルールに従い探します。&lt;br&gt;
　　ルール1.1 　「調整さん」は土曜日と日曜日であってもイベントを探します。&lt;br&gt;
　　ルール1.2 「調整さん」が探すイベントは"start__dateTime"が今日以降のものです。&lt;br&gt;
　　ルール1.3 「調整さん」は検索範囲の隅々までイベントを探します。&lt;br&gt;
　　ルール1.4 １週間とは７日間です。たとえば3月20日から１週間後は3月27日です。&lt;br&gt;
         ルール1.5 日付はKnowledgeのdate.csvファイルから学習してください。&lt;/p&gt;

&lt;p&gt;ステップ2「調整さん」はどんなイベントがあるのか列挙します。&lt;/p&gt;

&lt;p&gt;ステップ3「調整さん」はルール2で調べたイベントの状況からユーザーの空き状況を決定し、候補日とし、ユーザーに提示します。候補日の選定基準は以下の通りです。　&lt;br&gt;
　　ルール2.1「調整さん」が提示する候補日時は、イベントが何もない時間に限定されます。&lt;br&gt;
　　ルール2.2「調整さん」が提示する候補日時は9:00~17:00の中のイベントが何もない時間に限定されます。&lt;br&gt;
　　ルール2.3 「調整さん」が提示する候補日は平日（月曜日、火曜日、水曜日、木曜日、金曜日）に限定されます。&lt;br&gt;
　　ルール2.3 １週間とは７日間です。たとえば3月20日から１週間後は3月27日です。&lt;br&gt;
         ルール2.4 日付はKnowledgeのdate.numbersファイルから学習してください。&lt;br&gt;
　　ルール2.5「調整さん」が提示する候補日時は&lt;em&gt;月&lt;/em&gt;日　&lt;strong&gt;:&lt;/strong&gt;~&lt;strong&gt;:&lt;/strong&gt;（ミーティングの時間分）のように書いてください。&lt;br&gt;
　　ルール2.5「調整さん」が提示する候補日時は最大で4つまでです。選び方は日付が早い順です。&lt;/p&gt;

&lt;p&gt;ステップ4「調整さん」はメールのシチュエーションに応じてKnowledgeにあるメールの例文選び、参考にしてメール文を作成します。&lt;/p&gt;

&lt;p&gt;ステップ5 「調整さん」はメール文をユーザーに出力します。&lt;/p&gt;

&lt;p&gt;ステップ6「調整さん」はKnowledgeにあるメール例文の「件名：」をSubjectに、「本文：」をBodyにします。&lt;/p&gt;

&lt;p&gt;ステップ7「調整さん」は下書きメールの宛先メールアドレスを「&lt;a href="mailto:test@gmail.com"&gt;test@gmail.com&lt;/a&gt;」に設定します。&lt;/p&gt;

&lt;p&gt;ステップ8 メールの下書きにはあなたが作成した本文全体を記入してください&lt;/p&gt;

&lt;p&gt;ステップ9 最後にメールの件名（Subject）と本文（Body）を、「Create Gmail Draft」Actionを用いてGMailの下書きに保存します。メール文を作成するときは下記のルールに従ってください。&lt;br&gt;
　ルール9.1 改行も例文を参考にしてください。&lt;/p&gt;

&lt;h3&gt;
  
  
  Rules:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Before running any Actions tell the user that they need to reply after the Action completes to continue.&lt;/li&gt;
&lt;li&gt;If a user has confirmed they’ve logged in to Zapier’s AI Actions, start with Step 1.
###Instructions for Zapier Custom Action:
Step 1. Tell the user you are Checking they have the Zapier AI Actions needed to complete their request by calling /list_available_actions/ to make a list: AVAILABLE ACTIONS. Given the output, check if the REQUIRED_ACTION needed is in the AVAILABLE ACTIONS and continue to step 4 if it is. If not, continue to step 2.
Step 2. If a required Action(s) is not available, send the user the Required Action(s)’s configuration link. Tell them to let you know when they’ve enabled the Zapier AI Action.
Step 3. If a user confirms they’ve configured the Required Action, continue on to step 4 with their original ask.
Step 4. Using the available_action_id (returned as the &lt;code&gt;id&lt;/code&gt; field within the &lt;code&gt;results&lt;/code&gt; array in the JSON response from /list_available_actions). Fill in the strings needed for the run_action operation. Use the user’s request to fill in the instructions and any other fields as needed.
REQUIRED_ACTIONS:&lt;/li&gt;
&lt;li&gt;Action: Find Event in Google Calendar
Configuration Link: &lt;a href="https://actions.zapier.com/gpt/action/***/"&gt;https://actions.zapier.com/gpt/action/***/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Action: Create Gmail Draft
Configuration Link: &lt;a href="https://actions.zapier.com/gpt/action/**%EF%BC%8A/"&gt;https://actions.zapier.com/gpt/action/**＊/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6jcq6m5b9zts456hizth.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6jcq6m5b9zts456hizth.png" alt="Image description" width="800" height="777"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzzin5wgdk5jbwf8ua5ac.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzzin5wgdk5jbwf8ua5ac.png" alt="Image description" width="800" height="539"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdk1ulznwenzufxhqczvp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdk1ulznwenzufxhqczvp.png" alt="Image description" width="800" height="700"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fciqrjwr6f6c89v9cn1ov.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fciqrjwr6f6c89v9cn1ov.png" alt="Image description" width="800" height="519"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7zonx8p7q5hlow0m9pv8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7zonx8p7q5hlow0m9pv8.png" alt="Image description" width="800" height="626"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fupq6zllm5ezves62d0qg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fupq6zllm5ezves62d0qg.png" alt="Image description" width="800" height="776"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8rxi37q58lk3szu0ahfe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8rxi37q58lk3szu0ahfe.png" alt="Image description" width="800" height="547"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffdoq3uvds16j6r5shm80.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffdoq3uvds16j6r5shm80.png" alt="Image description" width="800" height="149"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Futmzelu2fddgmvi3re2p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Futmzelu2fddgmvi3re2p.png" alt="Image description" width="800" height="671"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Photo of a spacious urban setting where, at a distance, a white poodle sits on the sidewalk, enjoying an ice cream cone. The lens captures the vastness of the surroundings, with the dog as a noticeable but not dominating element in the scene. Buildings, trees, and pedestrians of various genders and descents can be seen, but they’re all secondary to the poodle’s delightful moment.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc5u6sahjz8lfk9pqrjgb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc5u6sahjz8lfk9pqrjgb.png" alt="Image description" width="800" height="464"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Photo of a cafeteria area at office&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fslgyl5a8i52obz5mmoi1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fslgyl5a8i52obz5mmoi1.png" alt="Image description" width="800" height="568"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;it's on the 20th floor&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fao3m742p8c44b4ozkyd6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fao3m742p8c44b4ozkyd6.png" alt="Image description" width="800" height="569"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There is no food court. There are tow coffee machine.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foq9zew8xjojl9493dm9o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foq9zew8xjojl9493dm9o.png" alt="Image description" width="800" height="573"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Not very angular, but round image. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fttbzx2l7prjrrq0qvk9p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fttbzx2l7prjrrq0qvk9p.png" alt="Image description" width="800" height="569"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It's too round, curve is more gradual. And office is in Tokyo.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fciyz1zihqm1ppuryk109.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fciyz1zihqm1ppuryk109.png" alt="Image description" width="800" height="569"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;LINUX&lt;br&gt;
I want you to act as a Linux terminal. I will type commands and you will reply with what the terminal should show. I want you to only reply with the terminal output inside one unique code block, and nothing else. Do not write explanations. Do not type commands unless I instruct you to do so. When I need to tell you something in English I will do so by putting text inside curly brackets {like this}. My first command is pwd.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg9atsp6s1z97irf7o1ov.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg9atsp6s1z97irf7o1ov.png" alt="Image description" width="800" height="569"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnbceovuauw6gpo6i3oea.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnbceovuauw6gpo6i3oea.png" alt="Image description" width="800" height="250"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fky6xeusbaurrvd1qrskn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fky6xeusbaurrvd1qrskn.png" alt="Image description" width="800" height="520"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flprck3ldtm8j9x7xpim6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flprck3ldtm8j9x7xpim6.png" alt="Image description" width="800" height="516"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;.&lt;br&gt;
├── bin&lt;br&gt;
├── boot&lt;br&gt;
├── dev&lt;br&gt;
├── etc&lt;br&gt;
├── home&lt;br&gt;
│   └── user&lt;br&gt;
│       ├── Desktop&lt;br&gt;
│       │   ├── file1.txt&lt;br&gt;
│       │   ├── file2.txt&lt;br&gt;
│       │   ├── important.docx&lt;br&gt;
│       │   └── notes.txt&lt;br&gt;
│       ├── Documents&lt;br&gt;
│       │   ├── document1.txt&lt;br&gt;
│       │   ├── document2.txt&lt;br&gt;
│       │   └── important_documents&lt;br&gt;
│       ├── Downloads&lt;br&gt;
│       │   ├── download1.zip&lt;br&gt;
│       │   └── download2.zip&lt;br&gt;
│       ├── Music&lt;br&gt;
│       ├── Pictures&lt;br&gt;
│       ├── Test&lt;br&gt;
│       ├── Text&lt;br&gt;
│       └── Videos&lt;br&gt;
├── lib&lt;br&gt;
├── lib64&lt;br&gt;
├── media&lt;br&gt;
├── mnt&lt;br&gt;
├── opt&lt;br&gt;
├── proc&lt;br&gt;
├── root&lt;br&gt;
├── run&lt;br&gt;
├── sbin&lt;br&gt;
├── srv&lt;br&gt;
├── sys&lt;br&gt;
├── tmp&lt;br&gt;
├── usr&lt;br&gt;
│   ├── bin&lt;br&gt;
│   ├── include&lt;br&gt;
│   ├── lib&lt;br&gt;
│   ├── lib64&lt;br&gt;
│   ├── local&lt;br&gt;
│   ├── sbin&lt;br&gt;
│   ├── share&lt;br&gt;
│   └── src&lt;br&gt;
└── var&lt;/p&gt;

&lt;p&gt;29 directories, 8 files&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flsl9l6dw7q7vr396p6e9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flsl9l6dw7q7vr396p6e9.png" alt="Image description" width="800" height="821"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9gk1ms3lhw4mig1g4kg9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9gk1ms3lhw4mig1g4kg9.png" alt="Image description" width="800" height="763"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;目的：ユーザーの代わりにミーティングの候補日を伝えるメール文を作成します。&lt;/p&gt;

&lt;p&gt;ルール1 日本語での対応をお願いします。&lt;/p&gt;

&lt;h4&gt;
  
  
  ステップ
&lt;/h4&gt;

&lt;p&gt;ステップ1「調整さん」は「Find Event in Google Calendar」Actionを用いてGoogle カレンダーからユーザーにどのようなイベントがあるか調べ列挙します。&lt;/p&gt;

&lt;p&gt;ステップ2 「調整さん」はルール2で調べたイベントの状況からユーザーの空き状況を決定し、候補日とします。候補日の選定基準は以下の通りです。　&lt;br&gt;
　　ルール2.1「調整さん」が提示する候補日時は、イベントが何もない時間に限定されます。&lt;br&gt;
　　ルール2.2「調整さん」が提示する候補日時は9:00~17:00の中のイベントが何もない時間に限定されます。&lt;br&gt;
　　ルール2.3 「調整さん」が提示する候補日は平日（月曜日、火曜日、水曜日、木曜日、金曜日）に限定されます。&lt;/p&gt;

&lt;p&gt;ステップ3「調整さん」は空き状況を確認したら、どんなイベントがありいつが空き状況なのかユーザーに知らせます。&lt;/p&gt;

&lt;p&gt;ステップ4「調整さん」が提示する候補日時は&lt;em&gt;月&lt;/em&gt;日　&lt;strong&gt;:&lt;/strong&gt;~&lt;strong&gt;:&lt;/strong&gt;（ミーティングの時間分）のように書いてください。&lt;/p&gt;

&lt;p&gt;ステップ5「調整さん」はメールのシチュエーションに応じてKnowledgeにあるメールの例文選び、参考にしてメール文を作成します。&lt;/p&gt;

&lt;p&gt;ステップ6 「調整さん」はまず下書きを作成する前にメール文をユーザーに出力します。&lt;/p&gt;

&lt;p&gt;ステップ7 「調整さん」はKnowledgeにあるメール例文の「件名：」をSubjectに、「本文：」をBodyにします。&lt;/p&gt;

&lt;p&gt;ステップ8 最後にメールの件名（Subject）と本文（Body）を、「Create Gmail Draft」Actionを用いてGMailの下書きに保存します。&lt;/p&gt;

&lt;p&gt;インプット：ユーザーからは、「ミーティングの候補日時の大まかな範囲」と「ミーティングの種類」、「ミーティングの時間」が入力されます。&lt;/p&gt;

&lt;p&gt;アウトプット：「調整さん」はミーティング候補日を相手に伝え、どの日にするか決めてもらうように依頼するメール文を作成し、Gmailの下書きに保存します。&lt;/p&gt;

&lt;h3&gt;
  
  
  Rules:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Before running any Actions tell the user that they need to reply after the Action completes to continue.&lt;/li&gt;
&lt;li&gt;If a user has confirmed they’ve logged in to Zapier’s AI Actions, start with Step 1.
###Instructions for Zapier Custom Action:
Step 1. Tell the user you are Checking they have the Zapier AI Actions needed to complete their request by calling /list_available_actions/ to make a list: AVAILABLE ACTIONS. Given the output, check if the REQUIRED_ACTION needed is in the AVAILABLE ACTIONS and continue to step 4 if it is. If not, continue to step 2.
Step 2. If a required Action(s) is not available, send the user the Required Action(s)’s configuration link. Tell them to let you know when they’ve enabled the Zapier AI Action.
Step 3. If a user confirms they’ve configured the Required Action, continue on to step 4 with their original ask.
Step 4. Using the available_action_id (returned as the &lt;code&gt;id&lt;/code&gt; field within the &lt;code&gt;results&lt;/code&gt; array in the JSON response from /list_available_actions). Fill in the strings needed for the run_action operation. Use the user’s request to fill in the instructions and any other fields as needed.
REQUIRED_ACTIONS:&lt;/li&gt;
&lt;li&gt;Action: Find Event in Google Calendar
Configuration Link: &lt;a href="https://actions.zapier.com/gpt/action/***"&gt;https://actions.zapier.com/gpt/action/***&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Action: Create Gmail Draft
Configuration Link: &lt;a href="https://actions.zapier.com/gpt/action/****"&gt;https://actions.zapier.com/gpt/action/****&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmkyhcajedcqeldj7gt6a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmkyhcajedcqeldj7gt6a.png" alt="Image description" width="800" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;件名：&lt;br&gt;
面接日時のご相談&lt;br&gt;
本文：&lt;br&gt;
●●さん&lt;/p&gt;

&lt;p&gt;お世話になっております。&lt;br&gt;
△△株式会社、営業部の▲▲と申します。&lt;/p&gt;

&lt;p&gt;この度は当社選考にエントリー並びに書類を&lt;br&gt;
ご提出いただきありがとうございました。&lt;/p&gt;

&lt;p&gt;●●さんには面接選考にお進みいただきたく、&lt;br&gt;
日程のご相談のためご連絡させていただきます。&lt;/p&gt;

&lt;p&gt;下記日程の内希望の面接日程をお選びいただけますでしょうか。&lt;/p&gt;

&lt;p&gt;・〇月〇日（〇）〇〇:〇〇～〇〇:〇〇&lt;br&gt;
・〇月〇日（〇）〇〇:〇〇～〇〇:〇〇&lt;br&gt;
・〇月〇日（〇）〇〇:〇〇～〇〇:〇〇&lt;br&gt;
上記日程以外でも調整可能ですので、ご都合が合わなければ遠慮なくお申し付けください。&lt;br&gt;
お忙しいところ恐縮ですが、ご検討の程よろしくお願いいたします。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk7lebymwwddxs3wm93wp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk7lebymwwddxs3wm93wp.png" alt="Image description" width="800" height="581"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbtgftu6k81qbwux6i5ue.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbtgftu6k81qbwux6i5ue.png" alt="Image description" width="800" height="707"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6jepaa4ugue87qsq1wob.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6jepaa4ugue87qsq1wob.png" alt="Image description" width="800" height="741"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwltasoelzog2ghxluksf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwltasoelzog2ghxluksf.png" alt="Image description" width="800" height="395"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F42dp7mdpc4kzmq4zbzs6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F42dp7mdpc4kzmq4zbzs6.png" alt="Image description" width="800" height="757"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fboeoqmygnaqznkwiigch.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fboeoqmygnaqznkwiigch.png" alt="Image description" width="800" height="806"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhiyyql5mrdharo5r8ntx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhiyyql5mrdharo5r8ntx.png" alt="Image description" width="800" height="635"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>test post</title>
      <dc:creator>nao</dc:creator>
      <pubDate>Mon, 13 Nov 2023 12:53:08 +0000</pubDate>
      <link>https://dev.to/5d8vsrhksd93374/test-post-2h0a</link>
      <guid>https://dev.to/5d8vsrhksd93374/test-post-2h0a</guid>
      <description>&lt;p&gt;lambda IAM role&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "logs:CreateLogGroup",
            "Resource": "arn:aws:logs:ap-northeast-1:468249393587:*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": [
                "arn:aws:logs:ap-northeast-1:ID:log-group:/aws/lambda/CompLambdaName:*"
            ]
        },
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::UploadBucket",
                "arn:aws:s3:::UoloadBucket/*",
                "arn:aws:s3:::CompressedBucket",
                "arn:aws:s3:::CompressedBucket/*"
            ]
        }
    ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadGetObject",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::WebBucketName/*"
        }
    ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Webホスティングの設定&lt;/p&gt;

&lt;p&gt;CORS設定&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[
    {
        "AllowedHeaders": [
            "*"
        ],
        "AllowedMethods": [
            "HEAD",
            "GET",
            "PUT",
            "POST",
            "DELETE"
        ],
        "AllowedOrigins": [
            "*"
        ],
        "ExposeHeaders": [
            "ETag"
        ]
    }
]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;イベント通知の設定&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from PIL import Image
import urllib.parse
import boto3
import os

TARGET_BUCKET_PATH = os.environ['TARGET_BUCKET_PATH']
QUALITY_IMAGE = int(os.environ['QUALITY_IMAGE'])
s3 = boto3.client('s3')


def lambda_handler(event, context):
    bucket = event['Records'][0]['s3']['bucket']['name']
    source_key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'], encoding='utf-8')
    destination_key = 'compressed' + source_key
    source_file = u'/tmp/' + os.path.basename(source_key)
    destination_file = source_file
    file_paths = os.path.splitext(source_key)
    file_path = file_paths[0]
    file_extension = file_paths[1][1:].lower()

    try:
        s3.download_file(Bucket=bucket, Key=source_key, Filename=source_file)
        img = Image.open(source_file, 'r')
        img.save(destination_file, file_extension, quality = QUALITY_IMAGE)
        s3.upload_file(Filename=destination_file,
                       Bucket=TARGET_BUCKET_PATH,
                       Key=destination_key)
        return source_key
    except Exception as e:
        print(e)
        raise e
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;画像圧縮lambda&lt;/p&gt;

&lt;p&gt;環境変数&lt;/p&gt;

&lt;p&gt;インポートにはlambdaレイヤーを利用した&lt;/p&gt;

&lt;p&gt;テストフォルダーが見えている&lt;/p&gt;

&lt;p&gt;実際に保存されている画像&lt;/p&gt;

&lt;p&gt;Cognito authenticated User&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Statement1",
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetObject",
                "s3:AbortMultipartUpload",
                "s3:DeleteObject",
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::CompressBucketName",
                "arn:aws:s3:::CompressBucketName/*",
                "arn:aws:s3:::UploadBucketName",
                "arn:aws:s3:::UploadBucketName/*"
            ]
        }
    ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;###signin.html
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;

&amp;lt;head&amp;gt;
    &amp;lt;meta charset="UTF-8"&amp;gt;
    &amp;lt;/meta&amp;gt;
    &amp;lt;title&amp;gt;CognitoAuthenticateUser&amp;lt;/title&amp;gt;
    &amp;lt;script src="https://sdk.amazonaws.com/js/aws-sdk-2.1489.0.min.js"&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script
        src="https://cdn.jsdelivr.net/npm/amazon-cognito-identity-js@4.3.3/dist/amazon-cognito-identity.min.js"&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script src="signin.js"&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;

&amp;lt;body&amp;gt;
    &amp;lt;h1&amp;gt;CognitoAuthenticateUser&amp;lt;/h1&amp;gt;
    &amp;lt;span style="display: inline-block; width: 100px;"&amp;gt;Email&amp;lt;/span&amp;gt;
    &amp;lt;input type="text" id="email" placeholder="Email Address"&amp;gt;
    &amp;lt;br /&amp;gt;
    &amp;lt;span style="display: inline-block; width: 100px;"&amp;gt;Password&amp;lt;/span&amp;gt;
    &amp;lt;input type="password" id="password" placeholder="Password"&amp;gt;
    &amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;
    &amp;lt;input type="button" value="CognitoAuthenticateUser" onclick="OnCognitoAuthenticateUser();"&amp;gt;
&amp;lt;/body&amp;gt;

&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;###signin.js
function OnCognitoAuthenticateUser() {

    var username = document.getElementById("email").value;
    var password = document.getElementById("password").value;

    var authenticationData = {
        Username: username,
        Password: password,
    };

    var authenticationDetails = new AmazonCognitoIdentity.AuthenticationDetails(
        authenticationData
    );
    var poolData = {
        UserPoolId: 'ap-northeast-1_xxxxxx', // Your user pool id here
        ClientId: '5g6xxxxxxxxxxxxxxxxxxxxx', // Your client id here
    };
    var userPool = new AmazonCognitoIdentity.CognitoUserPool(poolData);
    var userData = {
        Username: username,
        Pool: userPool,
    };

    var cognitoUser = new AmazonCognitoIdentity.CognitoUser(userData);
    cognitoUser.authenticateUser(authenticationDetails, {
        onSuccess: function (result) {
            var idToken = result.getIdToken().getJwtToken();          // IDトークン
            var accessToken = result.getAccessToken().getJwtToken();  // アクセストークン
            var refreshToken = result.getRefreshToken().getToken();   // 更新トークン

            console.log("idToken : " + idToken);
            console.log("accessToken : " + accessToken);
            console.log("refreshToken : " + refreshToken);

            //POTENTIAL: Region needs to be set if not already set previously elsewhere.
            AWS.config.region = 'ap-northeast-1';

            AWS.config.credentials = new AWS.CognitoIdentityCredentials({
                IdentityPoolId: 'ap-northeast-1:xxxxxxxxxxxxxxxxxxxxxxxxx', // your identity pool id here
                Logins: {
                    // Change the key below according to the specific region your user pool is in.
                    'cognito-idp:ap-northeast-1:accountID:userpool/ap-northeast-1_xxxxxxxx': result
                        .getIdToken()
                        .getJwtToken(),
                },
            });

            //refreshes credentials using AWS.CognitoIdentity.getCredentialsForIdentity()
            AWS.config.credentials.refresh(error =&amp;gt; {
                if (error) {
                    console.error(error);
                } else {
                    // Instantiate aws sdk service objects now that the credentials have been updated.
                    // example: var s3 = new AWS.S3();
                    console.log('Successfully logged!');
                }
            });
            location.href = "ImageCompService.html";
        },

        onFailure: function (err) {
            alert(err.message || JSON.stringify(err));
        },
    });
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#####ImageCompService.html
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;

&amp;lt;head&amp;gt;
    &amp;lt;!-- **DO THIS**: --&amp;gt;
    &amp;lt;link href="favicon.ico" rel="icon"&amp;gt;
    &amp;lt;!--   Replace SDK_VERSION_NUMBER with the current SDK version number --&amp;gt;
    &amp;lt;script src="https://sdk.amazonaws.com/js/aws-sdk-2.1489.0.min.js"&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script
        src="https://cdn.jsdelivr.net/npm/amazon-cognito-identity-js@4.3.3/dist/amazon-cognito-identity.min.js"&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script src="ImageCompService.js"&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script&amp;gt;
        function getHtml(template) {
            return template.join('\n');
        }
        listAlbums();
    &amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;

&amp;lt;body&amp;gt;
    &amp;lt;h1&amp;gt;This is your image compression service!&amp;lt;/h1&amp;gt;
    &amp;lt;div id="app"&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;

&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;######ImageCompService.js
var originalBucketName = "UploadBucketName";
var compBucketName = "CompressBucketName";
var bucketRegion = "ap-northeast-1";
var REGION = "ap-northeast-1";
var IDENTITY_POOL_ID = "ap-northeast-1:xxxxxxxxxxxxx";
var APP_CLIENT_ID = 'xxxxxxxxxxxxxxxxxxxx'
var USER_POOL_ID = 'ap-northeast-1_xxxxxxxxxx'
var poolData = {
    UserPoolId: USER_POOL_ID,
    ClientId: APP_CLIENT_ID
}
userPool = new AmazonCognitoIdentity.CognitoUserPool(poolData);
AWS.config.region = REGION;

const LOGINS_KEY = `cognito-idp.${REGION}.amazonaws.com/${USER_POOL_ID}`
var cognitoUser = new AmazonCognitoIdentity.CognitoUserPool(poolData).getCurrentUser();
if (!cognitoUser) {
    document.location.href = 'signin.html'
}

cognitoUser.getSession(function (err, result) {
    if (err) {
        console.error(err);
        return
    }

    AWS.config.credentials = new AWS.CognitoIdentityCredentials({
        IdentityPoolId: IDENTITY_POOL_ID,
        Logins: {
            [LOGINS_KEY]: result.getIdToken().getJwtToken()
        },
    })
    AWS.config.credentials.refresh(function (err) {
        if (err) {
            console.error(err)
            return
        }

        console.log('Refreshing AWS credentials is succeed')
        listAlbums()
    })
})

var s3 = new AWS.S3({
    apiVersion: "2006-03-01",
    params: { Bucket: originalBucketName },
});

var s3comp = new AWS.S3({
    apiVersion: "2006-03-01",
    params: { Bucket: compBucketName },
});

function listAlbums() {
    var albums = [];
    var albumscomp = [];

    // S3バケットからアルバムのリストを取得
    s3.listObjects({ Delimiter: "/" }, function (err, data) {
        if (err) {
            return alert("Error listing folders in 'UploadBucketName' bucket: " + err.message);
        } else {
            albums = data.CommonPrefixes.map(function (commonPrefix) {
                var prefix = commonPrefix.Prefix;
                var albumName = decodeURIComponent(prefix.replace("/", ""));
                return getHtml([
                    "&amp;lt;li&amp;gt;",
                    "&amp;lt;span onclick=\"deleteAlbum('" + albumName + "', 'UploadBucket')\"&amp;gt;X&amp;lt;/span&amp;gt;",
                    "&amp;lt;span onclick=\"viewAlbum('" + albumName + "', 'UploadBucket')\"&amp;gt;",
                    albumName,
                    "&amp;lt;/span&amp;gt;",
                    "&amp;lt;/li&amp;gt;"
                ]);
            });
            updatePage();
        }
    });

    // S3compバケットからアルバムのリストを取得
    s3comp.listObjects({ Delimiter: "/" }, function (err, data) {
        if (err) {
            return alert("Error listing albums in 'CompressBucket' bucket: " + err.message);
        } else {
            albumscomp = data.CommonPrefixes.map(function (commonPrefix) {
                var prefix = commonPrefix.Prefix;
                var albumName = decodeURIComponent(prefix.replace("/", ""));
                return getHtml([
                    "&amp;lt;li&amp;gt;",
                    "&amp;lt;span onclick=\"viewAlbumcomp('" + albumName + "', 'CompressBucketName')\"&amp;gt;",
                    albumName,
                    "&amp;lt;/span&amp;gt;",
                    "&amp;lt;/li&amp;gt;"
                ]);
            });
            updatePage();
        }
    });

    function updatePage() {
        // 両方のバケットから取得したアルバムリストを結合して表示
        var allAlbums = albums.concat(albumscomp);
        var message = albums.length
            ? getHtml([
                "&amp;lt;p&amp;gt;Click on an folder name to view it.&amp;lt;/p&amp;gt;",
                "&amp;lt;p&amp;gt;Click on the X to delete the folder.&amp;lt;/p&amp;gt;"
            ])
            : "&amp;lt;p&amp;gt;You do not have any folders. Please create an folder.";
        var messagecomp = albumscomp.length
            ? getHtml([
                "&amp;lt;p&amp;gt;Click on an folder name to view it.&amp;lt;/p&amp;gt;"
            ])
            : "&amp;lt;p&amp;gt;You do not have any folders. Please create an folder.";
        var htmlTemplate = [
            "&amp;lt;h2&amp;gt;Compressed Folders&amp;lt;/h2&amp;gt;",
            messagecomp,
            "&amp;lt;ul&amp;gt;",
            getHtml(albumscomp),
            "&amp;lt;/ul&amp;gt;",
            "&amp;lt;h2&amp;gt;Original Folders&amp;lt;/h2&amp;gt;",
            message,
            "&amp;lt;ul&amp;gt;",
            getHtml(albums),
            "&amp;lt;/ul&amp;gt;",
            "&amp;lt;button onclick=\"createAlbum(prompt('Enter Folder Name:'))\"&amp;gt;",
            "Create New Folder",
            "&amp;lt;/button&amp;gt;"
        ];
        document.getElementById("app").innerHTML = getHtml(htmlTemplate);
    }
}

function createAlbum(albumName) {
    albumName = albumName.trim();
    if (!albumName) {
        return alert("Folder names must contain at least one non-space character.");
    }
    if (albumName.indexOf("/") !== -1) {
        return alert("Folder names cannot contain slashes.");
    }
    var albumKey = encodeURIComponent(albumName);
    s3.headObject({ Key: albumKey }, function (err, data) {
        if (!err) {
            return alert("Folder already exists.");
        }
        if (err.code !== "NotFound") {
            return alert("There was an error creating your folder: " + err.message);
        }
        s3.putObject({ Key: albumKey }, function (err, data) {
            if (err) {
                return alert("There was an error creating your folder: " + err.message);
            }
            alert("Successfully created folder.");
            viewAlbum(albumName);
        });
    });
}
function viewAlbumcomp(albumName) {
    var albumPhotosKey = encodeURIComponent(albumName) + "/";
    s3comp.listObjects({ Prefix: albumPhotosKey }, function (err, data) {
        if (err) {
            return alert("There was an error viewing your folder: " + err.message);
        }
        // 'this' references the AWS.Response instance that represents the response
        var href = this.request.httpRequest.endpoint.href;
        var bucketUrl = href + originalBucketName + "/";

        var photos = data.Contents.map(function (photo) {
            var photoKey = photo.Key;
            var photoUrl = bucketUrl + encodeURIComponent(photoKey);
            return getHtml([
                "&amp;lt;span&amp;gt;",
                "&amp;lt;div&amp;gt;",
                "&amp;lt;span onclick=\"downloadphoto('" +
                albumName +
                "','" +
                photoKey +
                "')\"&amp;gt;",
                "download",
                "&amp;lt;/span&amp;gt;",
                "&amp;lt;span&amp;gt;",
                photoKey.replace(albumPhotosKey, ""),
                "&amp;lt;/span&amp;gt;",
                "&amp;lt;/div&amp;gt;",
                "&amp;lt;/span&amp;gt;"
            ]);
        });
        var message = photos.length
            ? "&amp;lt;p&amp;gt;Click on the download to download the image&amp;lt;/p&amp;gt;"
            : "&amp;lt;p&amp;gt;You do not have any images in this album. Please add images.&amp;lt;/p&amp;gt;";
        var htmlTemplate = [
            "&amp;lt;h2&amp;gt;",
            "Album: " + albumName,
            "&amp;lt;/h2&amp;gt;",
            message,
            "&amp;lt;div&amp;gt;",
            getHtml(photos),
            "&amp;lt;/div&amp;gt;",
            '&amp;lt;button onclick="listAlbums()"&amp;gt;',
            "Back To Folders",
            "&amp;lt;/button&amp;gt;"
        ];
        document.getElementById("app").innerHTML = getHtml(htmlTemplate);
    });
}

function viewAlbum(albumName) {
    var albumPhotosKey = encodeURIComponent(albumName) + "/";
    s3.listObjects({ Prefix: albumPhotosKey }, function (err, data) {
        if (err) {
            return alert("There was an error viewing your folder: " + err.message);
        }
        // 'this' references the AWS.Response instance that represents the response
        var href = this.request.httpRequest.endpoint.href;
        var bucketUrl = href + originalBucketName + "/";

        var photos = data.Contents.map(function (photo) {
            var photoKey = photo.Key;
            var photoUrl = bucketUrl + encodeURIComponent(photoKey);
            return getHtml([
                "&amp;lt;span&amp;gt;",
                "&amp;lt;div&amp;gt;",
                "&amp;lt;span onclick=\"deletePhoto('" +
                albumName +
                "','" +
                photoKey +
                "')\"&amp;gt;",
                "X",
                "&amp;lt;/span&amp;gt;",
                "&amp;lt;span&amp;gt;",
                photoKey.replace(albumPhotosKey, ""),
                "&amp;lt;/span&amp;gt;",
                "&amp;lt;/div&amp;gt;",
                "&amp;lt;/span&amp;gt;"
            ]);
        });
        var message = photos.length
            ? "&amp;lt;p&amp;gt;Click on the X to delete the image&amp;lt;/p&amp;gt;"
            : "&amp;lt;p&amp;gt;You do not have any images in this folder. Please add images.&amp;lt;/p&amp;gt;";
        var htmlTemplate = [
            "&amp;lt;h2&amp;gt;",
            "Album: " + albumName,
            "&amp;lt;/h2&amp;gt;",
            message,
            "&amp;lt;div&amp;gt;",
            getHtml(photos),
            "&amp;lt;/div&amp;gt;",
            '&amp;lt;input id="photoupload" type="file" accept="image/*"&amp;gt;',
            '&amp;lt;button id="addphoto" onclick="addPhoto(\'' + albumName + "')\"&amp;gt;",
            "Add Image",
            "&amp;lt;/button&amp;gt;",
            '&amp;lt;button onclick="listAlbums()"&amp;gt;',
            "Back To Folders",
            "&amp;lt;/button&amp;gt;"
        ];
        document.getElementById("app").innerHTML = getHtml(htmlTemplate);
    });
}

function downloadphoto(albumname, photoKey) {
    var ObjectParams = {
        Bucket: compBucketName,
        Key: photoKey,
        Expires: 3600,
    };
    var preurl = s3.getSignedUrl('getObject', ObjectParams);
    var downloadLink = document.createElement('a');
    downloadLink.href = preurl;
    console.log(preurl);
    downloadLink.download = photoKey;
    downloadLink.click()
}

function addPhoto(albumName) {
    var files = document.getElementById("photoupload").files;
    if (!files.length) {
        return alert("Please choose a file to upload first.");
    }
    var file = files[0];
    var fileName = file.name;
    var albumPhotosKey = encodeURIComponent(albumName) + "/";

    var photoKey = albumPhotosKey + fileName;

    // Use S3 ManagedUpload class as it supports multipart uploads
    var upload = new AWS.S3.ManagedUpload({
        params: {
            Bucket: originalBucketName,
            Key: photoKey,
            Body: file
        }
    });

    var promise = upload.promise();

    promise.then(
        function (data) {
            alert("Successfully uploaded image.");
            viewAlbum(albumName);
        },
        function (err) {
            return alert("There was an error uploading your image: ", err.message);
        }
    );
}

function deletePhoto(albumName, photoKey) {
    s3.deleteObject({ Key: photoKey }, function (err, data) {
        if (err) {
            return alert("There was an error deleting your image: ", err.message);
        }
        alert("Successfully deleted image.");
        viewAlbum(albumName);
    });
}

function deleteAlbum(albumName) {
    var albumKey = encodeURIComponent(albumName) + "/";
    s3.listObjects({ Prefix: albumKey }, function (err, data) {
        if (err) {
            return alert("There was an error deleting your folder: ", err.message);
        }
        var objects = data.Contents.map(function (object) {
            return { Key: object.Key };
        });
        s3.deleteObjects(
            {
                Delete: { Objects: objects, Quiet: true }
            },
            function (err, data) {
                if (err) {
                    return alert("There was an error deleting your folder: ", err.message);
                }
                alert("Successfully deleted folder.");
                listAlbums();
            }
        );
    });
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SlIap5La--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cnmkt4xsd1qikb5pk6qg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SlIap5La--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cnmkt4xsd1qikb5pk6qg.png" alt="Image description" width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--72vyIruq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/805j37d0oqffygo9huk2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--72vyIruq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/805j37d0oqffygo9huk2.png" alt="Image description" width="800" height="329"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--G29KP8Hi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4jma76rdikt7oam5uo6b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--G29KP8Hi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4jma76rdikt7oam5uo6b.png" alt="Image description" width="800" height="299"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xAWwAQnA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lnduqop2i38jhhnnnhgu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xAWwAQnA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lnduqop2i38jhhnnnhgu.png" alt="Image description" width="800" height="262"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YNu2YZMt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dpevwrmuy5mn12gjo0r5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YNu2YZMt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dpevwrmuy5mn12gjo0r5.png" alt="Image description" width="800" height="148"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fAWJoMGj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/re4dclx29w4utnqlrvlc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fAWJoMGj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/re4dclx29w4utnqlrvlc.png" alt="Image description" width="800" height="311"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cpJusfMt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x2rzzn0grvap33cj17f4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cpJusfMt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x2rzzn0grvap33cj17f4.png" alt="Image description" width="800" height="245"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XU1ZQAHT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bze1pyksfd54qeck8h1z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XU1ZQAHT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bze1pyksfd54qeck8h1z.png" alt="Image description" width="800" height="347"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oZ7E8DG---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ql43r5jm8i71ejwy0vvj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oZ7E8DG---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ql43r5jm8i71ejwy0vvj.png" alt="Image description" width="800" height="514"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NcnXVb-0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gvgbksgea3b6o3lt7egl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NcnXVb-0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gvgbksgea3b6o3lt7egl.png" alt="Image description" width="800" height="212"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dHJXTCgC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/30hjqxuivbejtyfpfo7c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dHJXTCgC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/30hjqxuivbejtyfpfo7c.png" alt="Image description" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3cg3ZHoA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ijoynn8zfc6ax8ho2a39.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3cg3ZHoA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ijoynn8zfc6ax8ho2a39.png" alt="Image description" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PTD4Vkxk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9mi8dg1l13u3us17p6sv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PTD4Vkxk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9mi8dg1l13u3us17p6sv.png" alt="Image description" width="800" height="672"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--oxBkhpvt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/eizagreiun77i2vt96lo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--oxBkhpvt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/eizagreiun77i2vt96lo.png" alt="Image description" width="800" height="588"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BQyFek3_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gr0msntogn6nh3srk39q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BQyFek3_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gr0msntogn6nh3srk39q.png" alt="Image description" width="410" height="172"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7IHdN1_z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vi60705n3hlay0nmdx64.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7IHdN1_z--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vi60705n3hlay0nmdx64.png" alt="Image description" width="800" height="171"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--q6gV4TDJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dqcaeblaxo26nfd6x2o4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--q6gV4TDJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dqcaeblaxo26nfd6x2o4.png" alt="Image description" width="800" height="596"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HI6W4dWT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zg1aoi7f4dcdbazh6i49.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HI6W4dWT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zg1aoi7f4dcdbazh6i49.png" alt="Image description" width="800" height="550"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tH0iyIEm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/phyx6ifzdncg7e3njked.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tH0iyIEm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/phyx6ifzdncg7e3njked.png" alt="Image description" width="800" height="550"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rZ_Bmv6T--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/o1q48o4yjxr4lc28qrn8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rZ_Bmv6T--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/o1q48o4yjxr4lc28qrn8.png" alt="Image description" width="800" height="460"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jlwjBbYA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e4vbvl6tygquawmmvtm6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jlwjBbYA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e4vbvl6tygquawmmvtm6.png" alt="Image description" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HRW1bCL8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xq8ufup2rntfkwj6avsx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HRW1bCL8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xq8ufup2rntfkwj6avsx.png" alt="Image description" width="800" height="605"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CtorXDlP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/14isf22gkrlbp783gm2n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CtorXDlP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/14isf22gkrlbp783gm2n.png" alt="Image description" width="800" height="265"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>For your health, walking 8,000 steps with 20 minutes MICT is needed!</title>
      <dc:creator>nao</dc:creator>
      <pubDate>Sun, 29 Oct 2023 10:19:53 +0000</pubDate>
      <link>https://dev.to/5d8vsrhksd93374/for-your-health-walking-8000-steps-woith-20-minutes-mict-is-needed-4dk2</link>
      <guid>https://dev.to/5d8vsrhksd93374/for-your-health-walking-8000-steps-woith-20-minutes-mict-is-needed-4dk2</guid>
      <description>&lt;h1&gt;
  
  
  1. What is MICT?
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qp7DJLxl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e71pm61ak1mqgcvhok3v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qp7DJLxl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e71pm61ak1mqgcvhok3v.png" alt="MICT" width="373" height="400"&gt;&lt;/a&gt;&lt;br&gt;
Moderate-Intensity Continuous Training (MICT) refers to a form of exercise that involves sustained, moderate-intensity physical activity. In the context of walking, MICT corresponds to brisk walking at a pace where you can maintain a conversation but still experience a notable level of physical exertion. &lt;/p&gt;

&lt;h1&gt;
  
  
  2. Why 8,000 steps with 20 minutes MICT is important?
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UljJxTnz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/muwnp1qa8amexc0z81ak.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UljJxTnz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/muwnp1qa8amexc0z81ak.png" alt="walking" width="450" height="450"&gt;&lt;/a&gt;&lt;br&gt;
Dr. Yukitoshi Aoyagi recommends a daily goal of 8,000 steps with the inclusion of 20 minutes of moderate-intensity exercise (MICT) as the ideal approach for promoting longevity and preventing various diseases. This combination offers a range of health benefits and reduces the risk of certain health conditions, as highlighted in his research.&lt;a href="https://onlinelibrary.wiley.com/doi/full/10.1111/j.1447-0594.2010.00589.x"&gt;ref&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  3. Best timing you walk
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2z9gMSFc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5fgyyk937of72iigdlbw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2z9gMSFc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5fgyyk937of72iigdlbw.png" alt="late afternoon" width="400" height="370"&gt;&lt;/a&gt;&lt;br&gt;
The best timing for walking is the late afternoon.This timing is ideal for several reasons:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Body Temperature:&lt;br&gt;
Your body temperature tends to be at its highest in the late afternoon, which means your muscles are warmed up, making it easier to move and reducing the risk of injury.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Strength and Coordination:&lt;br&gt;
As the day progresses, your muscle strength and coordination tend to be at their peak. This can result in more effective and efficient walking.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Mood and Stress Reduction:&lt;br&gt;
Walking in the late afternoon can help reduce stress and boost mood. It's a great way to unwind after a long day and release endorphins, which are natural mood elevators.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Sunlight Exposure:&lt;br&gt;
If you walk outdoors, the late afternoon provides an opportunity to get some sunlight exposure, which is beneficial for vitamin D production and can enhance your overall well-being.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Consistency:&lt;br&gt;
Setting a routine for walking in the late afternoon makes it more likely that you'll stick to your exercise regimen. Consistency is key to reaping the long-term benefits of walking.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
    </item>
    <item>
      <title>How to create image compression website by using Amazon S3 &amp; Lambda</title>
      <dc:creator>nao</dc:creator>
      <pubDate>Wed, 25 Oct 2023 12:36:24 +0000</pubDate>
      <link>https://dev.to/5d8vsrhksd93374/how-to-create-image-compression-website-by-using-amazon-s3-lambda-2k81</link>
      <guid>https://dev.to/5d8vsrhksd93374/how-to-create-image-compression-website-by-using-amazon-s3-lambda-2k81</guid>
      <description>&lt;h1&gt;
  
  
  My goal
&lt;/h1&gt;

&lt;p&gt;My goal is to built image compression website by using Amazon S3 and lambda. Here is my goal architecture. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--W13viS_x--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qgw9bnsk2vhnk6tuxfx7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--W13viS_x--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qgw9bnsk2vhnk6tuxfx7.png" alt="My goal architecture S3 &amp;amp; Lambda" width="800" height="424"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;HTML and Javascript files are stored in Amazon S3 Web bucket. A client accesses this HTML page by his browser. They can upload images to the Upload bucket through the HTML page. The uploaded image is compressed by Lambda function and saved in Compressed bucket. He can view the compressed images from Compressed bucket. &lt;/p&gt;

&lt;h1&gt;
  
  
  What are Amazon S3 &amp;amp; Lambda?
&lt;/h1&gt;

&lt;p&gt;I'll explain the basics of Amazon S3 and Lambda. I'll also mention what functions of S3 and Lambda were used.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is Amazon S3?
&lt;/h3&gt;

&lt;p&gt;Amazon Simple Storage Service (S3) is a managed AWS service which can be used as an object storage. It is not a block storage, not a file storage, not even a relational database; it is an object storage! &lt;a href="https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html"&gt;ref&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;A bucket is a container for objects. You have to create a bucket first and then store objects in the bucket. &lt;/p&gt;

&lt;h3&gt;
  
  
  Features of S3 used in this article.
&lt;/h3&gt;

&lt;p&gt;Features used in this article are...&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Website hosting &lt;a href="https://docs.aws.amazon.com/AmazonS3/latest/userguide/WebsiteHosting.html"&gt;ref&lt;/a&gt;&lt;br&gt;
You can use an S3 bucket as a website hosting site by simply uploading static page files like HTML. You need to change the S3 bucket's permissions and policies to enable public access. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Amazon S3 Event Notifications &lt;a href="https://docs.aws.amazon.com/AmazonS3/latest/userguide/EventNotifications.html"&gt;ref&lt;/a&gt;&lt;br&gt;
You can send notifications when certain events happen in your S3 bucket. For example, you can send notifications when 'New Object Created events' occur. If you set a notification destination as a Lambda function, you can activate the Lambda function.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  What is Lambda? &lt;a href="https://docs.aws.amazon.com/lambda/latest/dg/welcome.html"&gt;ref&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Lambda is a compute service, and you don't have to prepare any machine to run code. All you have to do is coding.You create lambda functions, and the Lambda service runs these functions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Features of Lambda used in this article.
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Lambda Layer &lt;a href="https://docs.aws.amazon.com/lambda/latest/dg/chapter-layers.html"&gt;ref&lt;/a&gt;
A Lambda Layer can be used as a supplement data for Lambda function. It contains data like library dependencies archived in .zip file. To install packages like Pillow, I use Lambda Layer. &lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  Creating HTML page for uploading images to S3 and viewing them from S3.
&lt;/h1&gt;

&lt;p&gt;To create HTML page by S3, I referenced these documents. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/s3-example-photos-view.html"&gt;Viewing Photos in an Amazon S3 Bucket from a Browser&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.classmethod.jp/articles/javascript-s3-upload-cfn/#toc-6"&gt;I quickly created an environment for browser (JavaScript) uploads to Amazon S3 using CloudFormation.&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  1. Do some prerequisite tasks.
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1-1 Let's make s3 buckets!
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kpWXCAaf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gomh2bqbipl7zh9gj88i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kpWXCAaf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gomh2bqbipl7zh9gj88i.png" alt="Image description" width="800" height="370"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;All buckets allow public access. &lt;/p&gt;

&lt;h4&gt;
  
  
  1-2 Let's set CORS setting on Upload and Compress bucket.
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[
    {
        "AllowedHeaders": [
            "*"
        ],
        "AllowedMethods": [
            "HEAD",
            "GET",
            "PUT",
            "POST",
            "DELETE"
        ],
        "AllowedOrigins": [
            "*"
        ],
        "ExposeHeaders": [
            "ETag"
        ]
    }
]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Set this CORS setting!&lt;/p&gt;

&lt;h4&gt;
  
  
  1-3 Let's make identity pool by Amazon Cognito.
&lt;/h4&gt;

&lt;p&gt;Find the IAM role created by an Amazon Cognito for unauthenticated users, and set following role to it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "cognito-identity:GetCredentialsForIdentity",
                "s3:DeleteObject",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": [
                "arn:aws:s3:::Upload bucket/",
                "arn:aws:s3:::Upload bucket/*",
                "arn:aws:s3:::Compress bucket/",
                "arn:aws:s3:::Compress bucket/*"
            ]
        }
    ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Defining the Webpage
&lt;/h3&gt;

&lt;p&gt;Only you have to do is putting following HTML file and javascript file in Web bucket! The name of HTML file should be 'index.html' so that this page will show up when clients access to Web bucket endpoint.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;**index.html**
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
  &amp;lt;head&amp;gt;
     &amp;lt;!-- **DO THIS**: --&amp;gt;
    &amp;lt;!--   Replace SDK_VERSION_NUMBER with the current SDK version number --&amp;gt;
    &amp;lt;script src="https://sdk.amazonaws.com/js/aws-sdk-2.1473.0.min.js"&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script src="s3_photoExample.js"&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script&amp;gt;
       function getHtml(template) {
          return template.join('\n');
       }
       listAlbums();
    &amp;lt;/script&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;h1&amp;gt;My Photo Albums App&amp;lt;/h1&amp;gt;
    &amp;lt;div id="app"&amp;gt;&amp;lt;/div&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;**s3_photoExample.js**
var albumBucketName = "Upload bucket";
var compBucketName = "Compress bucket";
var bucketRegion = "reagion";
var IdentityPoolId = "identitypoolID";

AWS.config.update({
    region: bucketRegion,
    credentials: new AWS.CognitoIdentityCredentials({
        IdentityPoolId: IdentityPoolId
    })
});

var s3 = new AWS.S3({
    apiVersion: "2006-03-01",
    params: { Bucket: albumBucketName }
});

var s3comp = new AWS.S3({
    apiVersion: "2006-03-01",
    params: { Bucket: compBucketName }
});
function listAlbums() {
    var albums = [];
    var albumscomp = [];

    // Get list of folders in Upload bucket
    s3.listObjects({ Delimiter: "/" }, function (err, data) {
        if (err) {
            return alert("Error listing albums in 'Upload bucket' bucket: " + err.message);
        } else {
            albums = data.CommonPrefixes.map(function (commonPrefix) {
                var prefix = commonPrefix.Prefix;
                var albumName = decodeURIComponent(prefix.replace("/", ""));
                return getHtml([
                    "&amp;lt;li&amp;gt;",
                    "&amp;lt;span onclick=\"deleteAlbum('" + albumName + "', 'Upload bucket')\"&amp;gt;X&amp;lt;/span&amp;gt;",
                    "&amp;lt;span onclick=\"viewAlbum('" + albumName + "', 'Upload bucket')\"&amp;gt;",
                    albumName,
                    "&amp;lt;/span&amp;gt;",
                    "&amp;lt;/li&amp;gt;"
                ]);
            });
            updatePage();
        }
    });

    // get folder lists form Compress bucket
    s3comp.listObjects({ Delimiter: "/" }, function (err, data) {
        if (err) {
            return alert("Error listing albums in 'Compress bucket' bucket: " + err.message);
        } else {
            albumscomp = data.CommonPrefixes.map(function (commonPrefix) {
                var prefix = commonPrefix.Prefix;
                var albumName = decodeURIComponent(prefix.replace("/", ""));
                return getHtml([
                    "&amp;lt;li&amp;gt;",
                    "&amp;lt;span onclick=\"viewAlbumcomp('" + albumName + "', 'Compress bucket')\"&amp;gt;",
                    albumName,
                    "&amp;lt;/span&amp;gt;",
                    "&amp;lt;/li&amp;gt;"
                ]);
            });
            updatePage();
        }
    });

    function updatePage() {
        // add folder lists form Upload and Compress bucket
        var allAlbums = albums.concat(albumscomp);
        var message = albums.length
            ? getHtml([
                "&amp;lt;p&amp;gt;Click on an album name to view it.&amp;lt;/p&amp;gt;",
                "&amp;lt;p&amp;gt;Click on the X to delete the album.&amp;lt;/p&amp;gt;"
            ])
            : "&amp;lt;p&amp;gt;You do not have any albums. Please create an album.";
        var messagecomp = albumscomp.length
            ? getHtml([
                "&amp;lt;p&amp;gt;Click on an album name to view it.&amp;lt;/p&amp;gt;",
                "&amp;lt;p&amp;gt;Click on the X to delete the album.&amp;lt;/p&amp;gt;"
            ])
            : "&amp;lt;p&amp;gt;You do not have any albums. Please create an album.";
        var htmlTemplate = [
            "&amp;lt;h2&amp;gt;Compressed Alubms&amp;lt;/h2&amp;gt;",
            messagecomp,
            "&amp;lt;ul&amp;gt;",
            getHtml(albumscomp),
            "&amp;lt;/ul&amp;gt;",
            "&amp;lt;h2&amp;gt;Original Alubms&amp;lt;/h2&amp;gt;",
            message,
            "&amp;lt;ul&amp;gt;",
            getHtml(albums),
            "&amp;lt;/ul&amp;gt;",
            "&amp;lt;button onclick=\"createAlbum(prompt('Enter Album Name:'))\"&amp;gt;",
            "Create New Album",
            "&amp;lt;/button&amp;gt;"
        ];
        document.getElementById("app").innerHTML = getHtml(htmlTemplate);
    }
}

function createAlbum(albumName) {
    albumName = albumName.trim();
    if (!albumName) {
        return alert("Album names must contain at least one non-space character.");
    }
    if (albumName.indexOf("/") !== -1) {
        return alert("Album names cannot contain slashes.");
    }
    var albumKey = encodeURIComponent(albumName);
    s3.headObject({ Key: albumKey }, function (err, data) {
        if (!err) {
            return alert("Album already exists.");
        }
        if (err.code !== "NotFound") {
            return alert("There was an error creating your album: " + err.message);
        }
        s3.putObject({ Key: albumKey }, function (err, data) {
            if (err) {
                return alert("There was an error creating your album: " + err.message);
            }
            alert("Successfully created album.");
            viewAlbum(albumName);
        });
    });
}
function viewAlbumcomp(albumName) {
    var albumPhotosKey = encodeURIComponent(albumName) + "/";
    s3comp.listObjects({ Prefix: albumPhotosKey }, function (err, data) {
        if (err) {
            return alert("There was an error viewing your album: " + err.message);
        }
        // 'this' references the AWS.Response instance that represents the response
        var href = this.request.httpRequest.endpoint.href;
        var bucketUrl = href + compBucketName + "/";

        var photos = data.Contents.map(function (photo) {
            var photoKey = photo.Key;
            var photoUrl = bucketUrl + encodeURIComponent(photoKey);
            return getHtml([
                "&amp;lt;span&amp;gt;",
                "&amp;lt;div&amp;gt;",
                '&amp;lt;img style="width:128px;height:128px;" src="' + photoUrl + '"/&amp;gt;',
                "&amp;lt;/div&amp;gt;",
                "&amp;lt;div&amp;gt;",
                "&amp;lt;span&amp;gt;",
                photoKey.replace(albumPhotosKey, ""),
                "&amp;lt;/span&amp;gt;",
                "&amp;lt;/div&amp;gt;",
                "&amp;lt;/span&amp;gt;"
            ]);
        });
        var message = photos.length
            ? "&amp;lt;p&amp;gt;Click on the X to delete the photo&amp;lt;/p&amp;gt;"
            : "&amp;lt;p&amp;gt;You do not have any photos in this album. Please add photos.&amp;lt;/p&amp;gt;";
        var htmlTemplate = [
            "&amp;lt;h2&amp;gt;",
            "Album: " + albumName,
            "&amp;lt;/h2&amp;gt;",
            message,
            "&amp;lt;div&amp;gt;",
            getHtml(photos),
            "&amp;lt;/div&amp;gt;",
            '&amp;lt;button onclick="listAlbums()"&amp;gt;',
            "Back To Albums",
            "&amp;lt;/button&amp;gt;"
        ];
        document.getElementById("app").innerHTML = getHtml(htmlTemplate);
    });
}
function viewAlbum(albumName) {
    var albumPhotosKey = encodeURIComponent(albumName) + "/";
    s3.listObjects({ Prefix: albumPhotosKey }, function (err, data) {
        if (err) {
            return alert("There was an error viewing your album: " + err.message);
        }
        // 'this' references the AWS.Response instance that represents the response
        var href = this.request.httpRequest.endpoint.href;
        var bucketUrl = href + albumBucketName + "/";

        var photos = data.Contents.map(function (photo) {
            var photoKey = photo.Key;
            var photoUrl = bucketUrl + encodeURIComponent(photoKey);
            return getHtml([
                "&amp;lt;span&amp;gt;",
                "&amp;lt;div&amp;gt;",
                '&amp;lt;img style="width:128px;height:128px;" src="' + photoUrl + '"/&amp;gt;',
                "&amp;lt;/div&amp;gt;",
                "&amp;lt;div&amp;gt;",
                "&amp;lt;span onclick=\"deletePhoto('" +
                albumName +
                "','" +
                photoKey +
                "')\"&amp;gt;",
                "X",
                "&amp;lt;/span&amp;gt;",
                "&amp;lt;span&amp;gt;",
                photoKey.replace(albumPhotosKey, ""),
                "&amp;lt;/span&amp;gt;",
                "&amp;lt;/div&amp;gt;",
                "&amp;lt;/span&amp;gt;"
            ]);
        });
        var message = photos.length
            ? "&amp;lt;p&amp;gt;Click on the X to delete the photo&amp;lt;/p&amp;gt;"
            : "&amp;lt;p&amp;gt;You do not have any photos in this album. Please add photos.&amp;lt;/p&amp;gt;";
        var htmlTemplate = [
            "&amp;lt;h2&amp;gt;",
            "Album: " + albumName,
            "&amp;lt;/h2&amp;gt;",
            message,
            "&amp;lt;div&amp;gt;",
            getHtml(photos),
            "&amp;lt;/div&amp;gt;",
            '&amp;lt;input id="photoupload" type="file" accept="image/*"&amp;gt;',
            '&amp;lt;button id="addphoto" onclick="addPhoto(\'' + albumName + "')\"&amp;gt;",
            "Add Photo",
            "&amp;lt;/button&amp;gt;",
            '&amp;lt;button onclick="listAlbums()"&amp;gt;',
            "Back To Albums",
            "&amp;lt;/button&amp;gt;"
        ];
        document.getElementById("app").innerHTML = getHtml(htmlTemplate);
    });
}

function addPhoto(albumName) {
    var files = document.getElementById("photoupload").files;
    if (!files.length) {
        return alert("Please choose a file to upload first.");
    }
    var file = files[0];
    var fileName = file.name;
    var albumPhotosKey = encodeURIComponent(albumName) + "/";

    var photoKey = albumPhotosKey + fileName;

    // Use S3 ManagedUpload class as it supports multipart uploads
    var upload = new AWS.S3.ManagedUpload({
        params: {
            Bucket: albumBucketName,
            Key: photoKey,
            Body: file
        }
    });

    var promise = upload.promise();

    promise.then(
        function (data) {
            alert("Successfully uploaded photo.");
            viewAlbum(albumName);
        },
        function (err) {
            return alert("There was an error uploading your photo: ", err.message);
        }
    );
}

function deletePhoto(albumName, photoKey) {
    s3.deleteObject({ Key: photoKey }, function (err, data) {
        if (err) {
            return alert("There was an error deleting your photo: ", err.message);
        }
        alert("Successfully deleted photo.");
        viewAlbum(albumName);
    });
}

function deleteAlbum(albumName) {
    var albumKey = encodeURIComponent(albumName) + "/";
    s3.listObjects({ Prefix: albumKey }, function (err, data) {
        if (err) {
            return alert("There was an error deleting your album: ", err.message);
        }
        var objects = data.Contents.map(function (object) {
            return { Key: object.Key };
        });
        s3.deleteObjects(
            {
                Delete: { Objects: objects, Quiet: true }
            },
            function (err, data) {
                if (err) {
                    return alert("There was an error deleting your album: ", err.message);
                }
                alert("Successfully deleted album.");
                listAlbums();
            }
        );
    });
}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. What you will see.
&lt;/h3&gt;

&lt;p&gt;When you access to this website, you will see albums in Upload and Compressed buckets. You can create new album on Original albums (Upload bucket), add photo to it, and see it. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ThtImFW8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ybec02i79vwfs3l4u7g1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ThtImFW8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ybec02i79vwfs3l4u7g1.png" alt="Uploading image to the website" width="800" height="338"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Compress images in S3 by using S3 events and Lambda.
&lt;/h1&gt;

&lt;p&gt;To make lambda function, I referenced these documents.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.classmethod.jp/articles/aws-s3-image-compress-lambda/"&gt;Using the Pillow (Python library) to compress images stored in S3.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  1. Make lambda function.
&lt;/h4&gt;

&lt;p&gt;Before coding lambda function, I made lambda layer for import Pillow. I made Pillow zip file by following command and upload it to Lambda.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$pip install \
    --platform manylinux2014_x86_64 \
    --target=python/ \
    --implementation cp \
    --python 3.9 \
    --only-binary=:all: --upgrade \
    Pillow
$ zip -r ./my-deployment-package.zip ./python/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then I coded Lmabda function. Values of TARGET_BUCKET_NAME and QUALITY_IMAGE are in environmental variables.&lt;br&gt;
I used Chat GPT to fix errors in lambda function...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from PIL import Image
import urllib.parse
import boto3
import os

TARGET_BUCKET_PATH = os.environ['TARGET_BUCKET_PATH']
QUALITY_IMAGE = int(os.environ['QUALITY_IMAGE'])
s3 = boto3.client('s3')


def lambda_handler(event, context):
    bucket = event['Records'][0]['s3']['bucket']['name']
    source_key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'], encoding='utf-8')
    destination_key = 'compressed' + source_key
    source_file = u'/tmp/' + os.path.basename(source_key)
    destination_file = source_file
    file_paths = os.path.splitext(source_key)
    file_path = file_paths[0]
    file_extension = file_paths[1][1:].lower()

    try:
        s3.download_file(Bucket=bucket, Key=source_key, Filename=source_file)
        img = Image.open(source_file, 'r')
        img.save(destination_file, file_extension, quality = QUALITY_IMAGE)
        s3.upload_file(Filename=destination_file,
                       Bucket=TARGET_BUCKET_PATH,
                       Key=destination_key)
        return source_key
    except Exception as e:
        print(e)
        raise e
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  2. Set IAM Role.
&lt;/h4&gt;

&lt;p&gt;I set this IAM Role to Lambda function.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "logs:CreateLogGroup",
            "Resource": "arn:aws:logs:reagion:*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": [
                "arn:aws:logs:reagion:log-group:/aws/lambda/naoCompFunction:*"
            ]
        },
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::Upload bucket",
                "arn:aws:s3:::Upload bucket/*",
                "arn:aws:s3:::Compress bucket",
                "arn:aws:s3:::Compress bucket/*"
            ]
        }
    ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  3. Set S3 events.
&lt;/h4&gt;

&lt;p&gt;Trigger event types are these. You should include Multi part upload event if you might upload large files.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Event types: s3:ObjectCreated:Put, s3:ObjectCreated:Post, s3:ObjectCreated:CompleteMultipartUpload&lt;/code&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Finally...
&lt;/h1&gt;

&lt;p&gt;When client upload image file, Lambda function automatically compress image and put it in Compressed bucket. Client can see compressed image and download it form website!!!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RzcC4nZg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sb7uhekg3y297gsmpkwc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RzcC4nZg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sb7uhekg3y297gsmpkwc.png" alt="Compressed image in website" width="800" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Summary
&lt;/h1&gt;

&lt;p&gt;It was so much fun to create some systems using AWS! It was not as difficult and didn't take as much time as I had expected. In this blog, I couldn't cover any security settings like bucket policies, so I'll write about them soon.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>javascript</category>
      <category>s3</category>
      <category>lambda</category>
    </item>
    <item>
      <title>Who am I and why am I here?</title>
      <dc:creator>nao</dc:creator>
      <pubDate>Sat, 21 Oct 2023 00:48:20 +0000</pubDate>
      <link>https://dev.to/5d8vsrhksd93374/who-am-i-and-why-am-i-here-59bi</link>
      <guid>https://dev.to/5d8vsrhksd93374/who-am-i-and-why-am-i-here-59bi</guid>
      <description>&lt;p&gt;&lt;strong&gt;I'm Nao and I was born in Japan.&lt;/strong&gt;I'm working as an engineer at a cyber security company in Japan. I started working this year!(2023)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I have a graduate degree in applied physics.&lt;/strong&gt;I had been researching about 'atomic switch' which is a kind of synapse memory, and the experience of working on the development of atomic switch and their application in deep learning was valuable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I had two reasons for joining the cybersecurity company.&lt;/strong&gt; The first was my big interest in IT technology, and the second was my desire to work in a role that protects the security and peace mind of many people and company. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My qualification&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;AWS Cloud practitioner &lt;br&gt;
(Obtained at 2023/09)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;AWS Certified Solutions Architect - Associate&lt;br&gt;
　　　　　　（Obtained at 2023/10） &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;My interests&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;AWS&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cybersecurity&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;AI &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I love ski!&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;I am here to ...&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;write about things that I'm interested in &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;learn how to write articles in English&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;enjoy! &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
    </item>
  </channel>
</rss>
