wiki.kazuma.tokyo

CloudWatch Logs Insightの使い方

概要CloudWatchLogsにはInsightというクエリを実行できるサービスがあります。 その使いかたをまとめていきます。 クエリfilter filterでkeyを指定してフィルタリングが可能です。or, andも使用できます。 field @message, @timestamp | filter type = 'dog' or type = 'cat' まとめてカウント statsを使うことでカウントすることが可能です。 field @message, @timestamp | stats count(*) as カウント名 by bin(5m) sample query mysql.audit.log0,1,2のmessageからexample_userの実行クエリを確認する。 fields @timestamp, @message | filter @logStream like /^mysql\.audit\.log\.(0|1|2)$/ | filter @message like /example_user/ | sort @timestamp desc | limit 20

Read more →

July 22, 2024

WordPressの記事をHugo用に変換する

概要 WordPressの記事データをHugoようにMarkdownへ変換するにあたりwordpress-to-hugo-exporterというツールを使用可能である。 このツールでは2通りの方法でデータの変換が可能であり、1つはWordPressの管理画面から実行することと、PHPのCLIを使う方法である。 試しに管理画面から実行したが、データ量やスペックにもよると思うが何度もタイムアウトをしてしまい成功しなかった。 そこで、CLIで実行したところ一発ですぐに変換ができたのでそちらの手順を記録しておく。 手順 # ツールをダウンロード $ wget https://github.com/SchumacherFM/wordpress-to-hugo-exporter # ツールをWordPressの拡張の箇所へコピー $ cp -rp wordpress-to-hugo-exporter-master /path/to/html/wp-content/plugins/ # ツールを入れたパスへ移動する $ cd /path/to/html/wp-content/plugins/wordpress-to-hugo-exporter-master # ツールを実行する $ php hugo-export-cli.php

Read more →

July 19, 2024

Terraformのtfstateを別のtfstateへ移行する手順

概要 リファクタ等で、既存のtfstateにあるリソースを別の新しいワークスペースにあるtfstateへ引っ越ししたい場合があります。 例えば、シングルrootモジュールだったコードから、module参照に切り替える場合などです。 その場合の引っ越し手順を記載します。 移行元のtfstateと移行先のtfstateをterraform state pullでダウンロードしてマージを行い、最終的に移行先にterraform state pushでアップロードする手順です。 なお、途中のterraform state mvを実施すると自動的にbackupファイルが作成されるので、万が一手順ミスをしても最初の状態に戻すことは可能です。 手順 なにかしらの作業ディレクトリを作って移動しておく mkdir xxx export WORKDIR=xxx 移行元ワークスペースでstate fileをダウンロード terraform state pull > ${WORKDIR}/src.terraform.tfstate 移行元ワークスペースでリソース一覧を取得 terraform state list > ${WORKDIR}/src.resources.txt 移行先ワークスペースでstate fileをダウンロード terraform state pull > ${WORKDIR}/dest.terraform.tfstate 配列がそのままだとzshでエラーになるのでエスケープする cd ${WORKDIR} sed -e 's/\[/\\[\\/g' -e 's/\"\]/\\"\\]/g' src.resources.txt > src.resources.txt.sed DryRun エラーが無いことを確認 cat src.resources.txt.sed | xargs -I {} terraform state mv -dry-run -state=src.terraform.tfstate -state-out=dest.terraform.tfstate {} module.admin.{} 実行 cat src.resources.txt.sed | xargs -I {} terraform state mv -state=src.

Read more →

July 9, 2024

JQL使い方まとめ

ToDo, In Pregress, Waitingと一週間以内のDoneを表示 一週間以上のDoneは非表示でそれ以外は表示しておきたい場合

Read more →

February 21, 2024

terraform_remote_stateの使い方

概要 tfstateが分かれている状況で、別のtfstate環境から、別のtfstateの情報を取得したい場合の手順です。 例:prd, devがあったとして、devからprdの情報を参照する場合です。 手順 prd で dev に公開する値をoutputs.tfに記載します。 例えばグローバルサービスで共通の情報(ACMなど)を記載します。 value = { # ACM acm_main = aws_acm_certificate.main.arn acm_global = aws_acm_certificate.global.arn } } dev の backend.tf でterraform_remote_stateを指定して、tfstateを参照できるようにします。 backend = "s3" config = { bucket = "terraform" key = "prd/terraform.tfstate" region = "ap-northeast-1" profile = "example" } } 参照したいリソース側で下記のようなフォーマットで参照します。 certificate_arn = data.terraform_remote_state.prd.outputs.prd.acm_main

Read more →

February 18, 2024

MySQL起動時の疎通チェック

概要 疎通チェックして通ったらパスするような、そんな制御をいれたい場合に使えるシェルです。 mysqladmin mysqlクライアント系の標準コマンドとして付随するmysqladminを使用したパターンです。 if mysqladmin ping -h 127.0.0.1 -u root -pパスワード --silent; then echo "MySQL is up." break else echo "Waiting for MySQL..." sleep 3 fi done Docker Docker コンテナでMySQLを稼働している場合に、ステータスをチェックするパターンです。 until [ "$(docker inspect --format='{{.State.Health.Status}}' mysqlコンテナ名)" = 'healthy' ]; do sleep 1s done

Read more →

January 24, 2024

GitHubActionsでSSHデバッグ

概要 GitHub ActionsでもCircleCIみたいにSSHデバッグする手順です。 内容 デバッグを開始したい箇所で下記を追加するだけ。超簡単です。 GitHub Actionsのログの途中で、SSHコマンドが出力されるので、それをターミナルに貼り付けて実行すればOK。 SSHをexitすれば終了される。 - name: Debug if: ${{ always() }} uses: mxschmitt/action-tmate@v3

Read more →

January 22, 2024

MySQLでインデックス関連

インデックスを確認する インデックスを作成する インデックスを削除する

Read more →

November 17, 2023

terraform import ブロックの使い方

概要 terraform v1.5.0以降からimportをCLIで実行するのではなく、宣言的に実行することが可能になりました。 本記事ではその使い方を記載します。 使い方 まず、インポートで使うファイルを用意する。importブロックは後で不要になるので、一時的なファイルを用意すると良いかもです。 たとえば import.tf を用意して、下記に必要な項目を記載します。 下記例ではRoute53のZONEについての記載です。 to = aws_route53_zone.kazuma_tokyo id = "(ここにZONEIDを記載)" } 次に下記コマンドを実行することで、コードを出力します。ただし、すでにあるファイルに追記ができないのでファイル名は一時的なものにしておくと良いかもです。 $ terraform plan -generate-config-out=kazuma_tokyo_import_1.tf 出力されるコードは必ずしも完璧じゃないことがあるので、terraform plan を実行して確認しつつ、必要に応じて不要なブロックは削除して修正します。 問題がなくなると、terraform planを実行すると差分がなくなり、下記のようになります。 # aws_route53_zone.kazuma_tokyo will be imported resource "aws_route53_zone" "kazuma_tokyo" { arn = "arn:aws:route53:::hostedzone/XXXXXXXX" comment = "DNS" id = "XXXXXXXX" name = "kazuma.tokyo" name_servers = [ "ns-2.awsdns-00.com.", "ns-102.awsdns-00.org.", "ns-153.awsdns-00.co.uk.", "ns-1112.awsdns-00.net.", ] primary_name_server = "ns-2.awsdns-00.com." zone_id = "XXXXXXXXXX" vpc { vpc_id = "vpc-123456" vpc_region = "ap-northeast-1" } } Plan: 1 to import, 0 to add, 0 to change, 0 to destroy.

Read more →

November 7, 2023

awkで最初や最後のフィールドを除外する

概要 特定の文字列の中で、最初や最後のフィールド以外を抽出したい場合のコマンド。 最初 2nd 3rd ## 最後 1st 2nd

Read more →

October 31, 2023

gcloudの使い方

概要 gcloudの使い方まとめです。 Project 用途 コマンド プロジェクト一覧 gcloud projects list 現在設定しているプロジェクト gcloud config configurations list プロジェクトの切り替え gcloud config set project プロジェクト名

Read more →

October 31, 2023

スプレッドシートのフィルタ条件

NOTのOR条件 次のテキストを含まないというフィルタ条件で複数のNOT条件をORで指定したい場合、数式で記載することで指定可能です。 フィルタ -> 条件でフィルタ -> カスタム数式 フィールドを A:Aという記載方式で指定する。 =OR(NOT(REGEXMATCH(A:A, "hoge|fuga|test")))

Read more →

October 18, 2023

github cliのghコマンドの使い方

概要 GitHubから公式でghコマンドがでている。便利に色々使えるので活用方法をまとめておきます。 内容 コマンド Pull Request 作成 gh pr create 上記で作成したPRをブラウザでみる gh pr view -w 期間を指定してPR一覧をみる gh pr list -state merged -search “created:2023-01-1..2023-06-30” -limit 1000

Read more →

October 11, 2023

AWS CLIまとめ

pagerでlessを無効化 AWS CLI v2ではlessを頭にAWS_PAGER=''とすることで無効化できます。 CloudWatch Metrics 例:RDSでCPUUtilizationを取得する場合。なお、CloudWatchMetricsは基本1分ごとは15日、5分ごとは63日、1時間ごとは15ヶ月とだんだん丸められてしまい、2023/06/26現在APIやコンソールで設定を変更することは出来ない(下記APIを叩いて別に保存する必要がある)。 RDS 利用可能なEngineバージョンの検索 { "EngineVersion": "8.0.mysql_aurora.3.01.0", "DBEngineVersionDescription": "Aurora MySQL 3.01.0 (compatible with MySQL 8.0.23)" } { "EngineVersion": "8.0.mysql_aurora.3.01.1", "DBEngineVersionDescription": "Aurora MySQL 3.01.1 (compatible with MySQL 8.0.23)" } 以下略 停止したクラスターが次に起動する時間の確認 AutomaticRestartTimeを確認することで、起動時間を確認できる { "DBClusterIdentifier": "test-rds-cluster", "AutomaticRestartTime": "2023-07-10T10:12:12.212000+00:00" } ECS ECS exec

Read more →

June 26, 2023

Dockerで上位ディレクトリにあるファイルやディレクトリをマウントするTips

概要 Dockerでなにかしらの理由でカレントディレクトリから上位ディレクトリにあるファイルやディレクトリをコンテナで使いたい場合のTipsです。 前提として、カレントディレクトリの配下にあるディレクトリやファイルに対しては、難しいことを考えなくてもvolumeマウントしたり、COPYでコピーすることは可能です。 今回は対象がカレントディレクトリより、上位のディレクトリを対象とする場合です。 ディレクトリの構成 下記のようなテスト用のディレクトリ構成と過程する。 src配下には一般的にアプリケーションのソースコードがあるとする。 . ├── .github │ └── config.yml ├── docker │ └── Dockerfile └── src └── index.html 条件 カレントディレクトリがdocker docker run Dockerfileではなくdocker runコマンドを使った場合のパターン。 srcディレクトリだけをマウントする Dockerfileをdockerディレクトリ配下に配置して、dockerへcdする。 そこでdocker runコマンドでコンテナを起動する際に、アプリケーションのソースコードをマウントするには下記を実行する。 total 4 drwxr-xr-x 3 root root 96 Jun 10 12:40 . drwxr-xr-x 1 root root 4096 Jun 10 12:47 .. -rw-r--r-- 1 root root 0 Jun 10 12:40 index.html リポジトリ全体をmountする 上位ディレクトリをマウントする際にpwdで上位ディレクトリを指定するだけでOK。 total 4 drwxr-xr-x 5 root root 160 Jun 10 12:46 .

Read more →

June 10, 2023

SQLまとめ

概要SQLに関するまとめです。MySQLが前提です。 テーブル操作 テーブル作成 テーブルを空にする テーブルカラムの操作 カラム名の変更 カラムの型変更 データの操作 データの投入 データの投入(JSON型) mysql> select * from t01; +----+----------------------------------+ | id | text | +----+----------------------------------+ | 1 | {"key1": "val1", "key2": "val2"} | +----+----------------------------------+

Read more →

May 26, 2023

PowerShellまとめ

もしMacでPowershellの挙動を確認したいなら 上記でインストール後に powershell Appを実行する。 ファイル・ディレクトリ存在チェック True > Test-Path /tmp/hoge False もし指定したフォルダがなかったら -not か -! を指定して囲うことでFalseのときの制御ができる mkdir "/tmp/hoge" }

Read more →

May 7, 2023

SSL証明書の更新に必要な作業まとめ

概要 購入したSSL証明書の更新に必要な作業をまとめていきます。 AWSのACMやLet’sEncryptは除外です。 CSR作成 CSRに必要な鍵の作成 下記はパスフレーズなし。 -des3を付与するとパスフレーズありにできてセキュアだが、Apache再起動時に毎回パスフレーズ入力が必要となり、運用が大変になるのでオススメしません。 CSR作成 証明書 証明書が発行されたら下記を行う。 証明書の中身を確認 中間証明書と証明書の一致確認 証明書と中間証明書をファイルに書き出して、それぞれを下記方法でチェックする。値が一致すればOK. 28902ca4 $ openssl x509 -subject_hash -noout -in example.com.crt.ca 28902ca4

Read more →

April 22, 2023

Dockerでデバッグするときにインストールすると良いパッケージ

概要通信がうまくいかないとか、ポートなんだっけとか色々調査するときに一時的に入れると便利なパッケージ一覧です。 amazon linux 2023 最初にパッケージアップデート: dnf update インストールコマンド: dnf install パッケージ名 使いたいコマンド パッケージ名 vim vim ping iputils netstat net-tools ps procps telnet telnet wget wget dig bind-utils which which Alpine Linux 最初にパッケージアップデート: apk update インストールコマンド: apk add パッケージ名 使いたいコマンド パッケージ名 vim vim ping iputils netstat net-tools ps procps telnet busybox-extras wget wget dig bind-tools which which Ubuntu/Debian 使いたいコマンド パッケージ名 vim vim ping iputils-ping netstat net-tools ps procps telnet telnet wget wget パッケージ検索サイト

Read more →

April 17, 2023

AmazonLinux2023でMySQL Clientをインストールする

概要 タイトル通り AmazonLinux2023でMySQLClientをインストールする手順です。 環境 Amazon Linux 2023 x86_64 ※ARM版は未検証 手順 # wget https://dev.mysql.com/get/mysql80-community-release-el9-1.noarch.rpm # rpm -ivh mysql80-community-release-el9-1.noarch.rpm # dnf -y install mysql mysql-community-cli

Read more →

April 13, 2023

NginxでSiteguard WP Pluginを使う場合の設定

概要 Siteguard WP Plugin を使うとWordPressのログインURLを変更できます。 しかし、Apacheのmod_rewriteを使っているとそのまま使えますが、nginxでは設定が必要です。 ※多くのレンタルサーバーが .htaccess をユーザーに利用許可するために、Apacheを採用していることが多いです。nginxでは.htaccessは使用できません。 設定内容 下記のようにrewriteの設定をしないと、ログインURL変更ができないので注意です。 rewrite ^/wp-signup\.php$ /404-siteguard break; rewrite ^/wp-activate\.php$ /404-siteguard break; rewrite ^/ここにログインURL(.*)$ /wp-login.php$1 break;

Read more →

April 11, 2023

terraformで文字列の処理のTips

概要Terraformで文字列を処理したい、そんなときのTipsをまとめます。 末尾の文字列だけ削除する 末尾の数字の5桁までを削除したいときに、replaceと正規表現で処理できます。 sample:2とかsample:10をsampleだけにできます。 https://developer.hashicorp.com/terraform/language/functions/regex

Read more →

March 16, 2023

Dockerコマンド

概要Dockerで使えるコマンド一覧です(作成中) build Dockerfileで変数を定義している場合に、外から渡すには、--build-argを指定する必要があります。

Read more →

March 16, 2023

StepFunctionsの基本

概要 Step Functionsの基本を書いていきます。わかったら追記します。 デバッグ方法 とりあえず挙動を確認するには Workflow Studio を使って手で動かすのが良さそうです。 慣れてからJSONを加工するようにすると良いと思います。 Workflow Studioでpassを使う どんな結果が返ってくるかを見るのに pass を使うと便利です。 これは特に何も処理をしないStateですが、入出力を確認したり、加工したりできます。 以下検証はPassを使って、入力、出力を確認しています。 InputPath これは受け取ったInputのJSONをフィルタリングするのに使えます。 例えば下記のようなInputのJSONが渡った場合。 "flowName": "example", "id": 12345, "name": { "firstname": "taro", "lastname": "suzuki" } } InputPathで下記のようにフィルタリングする。 "InputPath": "$.name" そうすると結果としては下記が返ってくる。 "firstname": "taro", "lastname": "suzuki" } Idを指定すると、 "InputPath": "$.id" 下記が返ってくる。 12345 OutputPath OutputPathを使うと、出力をフィルタリングできる。 入力JSONが下記だったとする。 "flowName": "example", "id": 12345, "name": { "firstname": "taro", "lastname": "suzuki" } } OutputPathに下記を指定する。 すると下記lastnameだけが出力される。 ResultPath 既存のInputのJSONにStateのなにかの出力を追加する場合に使う。 例えば、stateの名前と実行ステータスコードを結果として、resultというKeyに追加したい場合は下記のように指定する。 "stateName": "Pass", "statusCode": "200" } $.

Read more →

March 8, 2023

ChatbotとSNS連携してSlack通知

手順 SNS でトピックを作成する。このとき、FIFOだとSNS連携できないのでスタンダードにする。 ChatbotとSlackの連携しておく(OAuth?) Chatbotを作成して、指定したSlackのチャンネルID(対象チャンネルの詳細をみるとIDが分かる)を設定し、上記で作成したSNSのサブスクリプションに指定する 下記のようになっていればOK。

Read more →

February 16, 2023

Auroraのインスタンスのどこに接続しているか確認する方法

概要MySQLだと、下記で基本的にはどこにつないでいるか分かる。 しかし、Auroraだと ip-X-X-X-X となっていて、特定が難しい。そこで下記のグローバル変数をチェックすることで特定可能。 確認SQL 下記で接続しているインスタンスの識別子が分かる。

Read more →

February 6, 2023

DatadogのANDとORを複合的に使用するクエリーの書き方

概要Datadogのメトリクスの検索で A and B は AND を使えば良いけど、 A and B(c or d) というパターンがあった。 具体例としてはDBインスタンスの条件と、エンジンバージョンを複数指定したかったパターン。 こういったパターンはあると思って調べて、下記で出来たのでメモ。 クエリーの書き方 HTTPステータスコードだと、範囲指定が可能。 AZなどだと INが使えるらしい。

Read more →

January 25, 2023

MySQLのユーザー作成と権限追加

概要 MySQLでユーザーを作成する手順です。 5.7, 8.X でも実行可能です。 ユーザー作成 権限の追加 権限の確認 +--------------------------------------------------------+ | Grants for testuser01@% | +--------------------------------------------------------+ | GRANT USAGE ON *.* TO 'testuser01'@'%' | | GRANT ALL PRIVILEGES ON `testdb`.* TO 'testuser01'@'%' | +--------------------------------------------------------+ 2 rows in set (0.00 sec) 権限の剥奪 Query OK, 0 rows affected (0.01 sec) MySQL [(none)]> show grants for testuser01@'%'; +----------------------------------------+ | Grants for testuser01@% | +----------------------------------------+ | GRANT USAGE ON *.* TO 'testuser01'@'%' | +----------------------------------------+ 1 row in set (0.

Read more →

January 22, 2023

Dockerをreadonlyで動かす

概要 セキュリティ向上のためにdockerをreadonlyで動かすためのメモ まずは動かす そのままやっても動かない。 Unable to find image 'nginx:latest' locally latest: Pulling from library/nginx f3ac85625e76: Already exists 2f2ae0d10f0c: Pull complete 686758060351: Pull complete 9d6463e85319: Pull complete bb6dfee87e07: Pull complete 594d75b0add1: Pull complete Digest: sha256:3b89317d99358692e82aa34d38c52085a937e437daaaf05aa17522460883452e Status: Downloaded newer image for nginx:latest /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/ /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh 10-listen-on-ipv6-by-default.sh: info: can not modify /etc/nginx/conf.d/default.conf (read-only file system?) /docker-entrypoint.sh: Launching /docker-entrypoint.

Read more →

December 6, 2022

template_fileはdeprecatedなので組み込みのtemplatefileを使う

概要 template_file は template プロバイダーを使って、レンダリングするために terraform 0.11 まで使われてきたが、0.12以降は組み込みの templatefile を使うように公式でアナウンスされています。 https://registry.terraform.io/providers/hashicorp/template/latest/docs/data-sources/file In Terraform 0.12 and later, the templatefile function offers a built-in mechanism for rendering a template from a file. Use that function instead, unless you are using Terraform 0.11 or earlier. https://registry.terraform.io/providers/hashicorp/template/latest/docs#deprecation パッと見、プロバイダーから組み込みに変えるのは大変そうに思うかもしれませんが、実際はそんなことはなく、シンプルに置き換えが可能です。 Before 例えば下記のように、 templte_file を使って、dataを定義している場合は、dataとresourceで2つに分けて書く必要がありました。 template = file("files/example_policy.json") } resource "aws_ecr_lifecycle_policy" "example" { repository = aws_ecr_repository.example.name policy = data.template_file.example_policy.rendered var = { name = "example" } } After templatefile になったことで、resource内に直接参照元のファイルパスを指定することができ、また変数を埋め込むことが可能です。

Read more →

November 21, 2022

terraformで組み込み関数を使って日付を指定する

概要 terraformの命名規則で、いわゆる日付(YYYYMMDD)の形式で何某かを指定したいこともあるでしょう。 これはterraformの組み込み関数のformatdateを使うことで解消できます。 terraform versionn 1.3.4 組み込み関数 terraform consoleを使って確認します。 例えば単純な日付形式だとtimestampが使えます。 > timestamp() "2022-11-17T12:51:12Z" この形式だとログなどでは良いですが、可読性が低い形式です。 そこで、わかりやすい形式としてYYYYMMDDの形式にするには、formatdateを使うと良いです。 "20221117" ただし、これだと決め打ちになってしまうので、最初に試したtimestamp関数を使うと良いでしょう。 "20221117"

Read more →

November 17, 2022

NotionのAPI操作

内容 NotionのAPIを操作する際のメモです。 対象APIバージョン 2022-06-28 最初にやること 下記でインテグレーションを作成し、権限を設定する。その際にAPIトークンが発行されるのでメモする https://www.notion.so/my-integrations 対象のデータベースがあるページの設定から「コネクト」の一覧より、上記インテグレーションを選択する(共有とは異なるので注意) データベース データベースのオブジェクトの取得 データベースのIDは、対象のデータベースのURLを確認して、下記のデータベースIDの部分。 メソッドはGETではなく、POSTな点に注意。 https://www.notion.so/ワークスペース名/データベースID?v=ビューID -H 'Authorization: Bearer 'secret_XXXXX'' \ -H "Content-Type: application/json" \ -H "Notion-Version: 2022-06-28" データベースへのオブジェクトの追加 基本的には上記で確認したJSONの形式でPOSTすればOK。 エンドポイントが変わるのに注意。(databasesではなくpogesとなる) 結構階層が深いので、雑に作るとエラーになるので注意。必ず、上記でKeyを確認すること。 -H 'Authorization: Bearer 'secret_XXXXX''\ -H "Content-Type: application/json"\ -H "Notion-Version: 2022-06-28"\ -d '{ "parent": { "database_id": "XXXXXX" }, "properties": { "Weight": { "type": "rich_text", "rich_text": [ { "type": "text", "text": { "content": "20" } } ] } } }'

Read more →

October 24, 2022

Terraform 1.X 系のアップグレード手順

前提tfenv を使用 手順 1.tfenv を使って最新のterraformをダウンロード 2.tfenv を使って対象のリポジトリでバージョンを指定 $ tfenv use 1.3.3 $ cat .terraform-version 1.3.3 <- もしなっていなかったら手動で書きかえる 3.terraform initでアップグレード 4.terraform stateでバージョンを確認して、あがっていればOK "terraform_version": "1.3.3", 5.terraform planをして確認 6.terraform applyを実行

Read more →

October 22, 2022

Terraformのaws_ecs_cluster_capacity_providers対応

概要 ECSで下記Deprecatedのログが出ることがあります。 │ │ with aws_ecs_cluster.example, │ on example.tf line 3, in resource "aws_ecs_cluster" "example": │ 3: capacity_providers = ["FARGATE"] │ │ Use the aws_ecs_cluster_capacity_providers resource instead 対応内容 まず、該当行を削除します。削除しただけでは差分になりません。(Fargateだと差分になるか?と思いましたがなりませんでした。) そして、下記を追加します。 https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/ecs_cluster_capacity_providers cluster_name = aws_ecs_cluster.example.name capacity_providers = ["FARGATE"] } このままでは差分となってしまうので、importが必要です。 これでterraform planした際に、warningと差分がでなければOKです。

Read more →

September 29, 2022

Terraformのaws_s3_bucket_acl対応

概要 S3で下記Deprecatedのログが出ることがあります。 │ Warning: Argument is deprecated │ │ with aws_s3_bucket.example, │ on example.tf line 3, in resource "aws_s3_bucket" "example": │ 3: acl = "private" │ │ Use the aws_s3_bucket_acl resource instead │ これはS3バケットで acl を使用しているときにでるようです。 対応内容 まず、該当行を削除します。削除しただけでは差分になりません。 そして、下記を追加します。 bucket = aws_s3_bucket.example.id acl = "private" } このままでは差分となってしまうので、importが必要です。 https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/s3_bucket_acl#import

Read more →

September 29, 2022

Terraformのaws_s3_bucket_lifecycle_configuration対応

概要 Terraform で下記deprectatedが表示された場合の対応です。 │ Warning: Argument is deprecated │ │ with aws_s3_bucket.example, │ on codepipeline.tf line 1, in resource "aws_s3_bucket" "example": │ 1: resource "aws_s3_bucket" "example" { │ │ Use the aws_s3_bucket_lifecycle_configuration resource instead │ 対応内容 まず、S3の該当行をコピーして削除します。(あとでコピーするために一旦コメントアウトでも良さそう) 削除しても、差分にはなりません。 次に新しいterraformのリソース名でコードを追加します。内容は先程コピーした値です。 bucket = aws_s3_bucket.example.bucket rule { id = "example" status = "Enabled" filter { and { tags = { "hoge" = "true" } } } noncurrent_version_expiration { noncurrent_days = 120 } } } 次にインポートします。

Read more →

September 29, 2022

Terraformのaws_s3_bucket_server_side_encryption_configuration対応

概要 S3で下記Deprecatedのログが出ることがあります。 │ │ with aws_s3_bucket.example, │ on s3.tf line 1, in resource "aws_s3_bucket" "example": │ 1: resource "aws_s3_bucket" "example" { │ │ Use the aws_s3_bucket_server_side_encryption_configuration resource instead │ これはS3バケットで server_side_encryption_configuration を使用しているときにでるようです。 https://dev.classmethod.jp/articles/terraform-s3-v4-9-0-refactoring/ 対応内容 まず、該当行を削除します。削除しただけでは差分にならないようです。 そして、下記を追加します。 bucket = aws_s3_bucket.example.bucket rule { bucket_key_enabled = false # ここは必要じゃない場合もあり apply_server_side_encryption_by_default { sse_algorithm = "AES256" } } } もちろんこのままでは差分となってしまうので、importが必要です。 https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/s3_bucket_server_side_encryption_configuration#import

Read more →

September 29, 2022

Terraformのaws_s3_bucket_objectのdeprecated対応

概要 aws_s3_bucket_object はdeprecatedになっていて、aws_s3_objectへ置き換えるようにWarningが出ることがあります。 terraform バージョン: 1.3.0 で確認できましたが、他の1系のバージョンでも発生するかと思われます。 │ Warning: Argument is deprecated │ │ with aws_s3_bucket_object.example, │ on s3.tf line 25, in resource "aws_s3_bucket_object" "example": │ 25: bucket = aws_s3_bucket.example.id │ │ Use the aws_s3_object resource instead https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/s3_bucket_object NOTE: The aws_s3_bucket_object resource is DEPRECATED and will be removed in a future version! Use aws_s3_object instead, where new features and fixes will be added. When replacing aws_s3_bucket_object with aws_s3_object in your configuration, on the next apply, Terraform will recreate the object.

Read more →

September 29, 2022

macOSアップブレード後にGitが使えない

状況 OSアップブレードした後に、VSCodeでGitコマンドが見つからず、git versionを実行したらエラーに。 xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun 対応 どうやらXCode周りで再セットアップが必要でした。 その後無事にGitが使えるようになりました。 git version 2.37.0 (Apple Git-136)

Read more →

September 29, 2022

Error while installing hashicorp/template v2.2.0

エラーログ terraform initで下記エラー │ Error: Failed to install provider │ │ Error while installing hashicorp/template v2.2.0: the current package for registry.terraform.io/hashicorp/template 2.2.0 doesn't match any of the checksums previously recorded in │ the dependency lock file; for more information: https://www.terraform.io/language/provider-checksum-verification ╵ 利用環境がM1だった際に、チェックサムでコケる模様。 自分でgo buildが必要になる。 実行コマンド Goの最新版をインストール。 > goenv global 1.19.0 build Terraform v1.3.0 on darwin_amd64 + provider registry.terraform.io/hashicorp/aws v4.32.0 + provider registry.terraform.io/hashicorp/template v2.2.0 > git clone https://github.com/hashicorp/terraform-provider-template.git > cd terraform-provider-template > go build .

Read more →

September 28, 2022

Terraformデバッグログの出力

デバッグをやめる

Read more →

September 20, 2022

Notionでプロパティのチェックボックスから達成率を表示

概要 いわゆる習慣トラッカーのように、チェックボックスの有無で達成率の割合を標示させる方法。 設定方法 データベースで、各チェックボックスを作成する。 その際に、チェックボックスではないプロパティがあっても問題はなし。 達成率用に関数プロパティを作成する。 関数として、下記のように各プロパティを指定すればOK。 ※propとはプロパティのこと

Read more →

September 19, 2022

AWSアカウントをスイッチロールで管理

概要 AWS Oragnizationsを使っている場合は、AWS IAM Identity CenterでSSOさせることで、統一アカウントでログインさせることができて権限も管理ができます。 しかし、AWS Oragnizationsを使っていない場合はSSOさせることができないため、スイッチロールを使うことで踏み台用のAWSアカウントのログイン情報さえわかっていれば、他のAWSアカウントにアクセスすることが可能になります。 設定 スイッチロールしたいAWSアカウントにIAM Roleを作成して、AssumeRoleを特定のユーザーに許可させてあげることでアクセスできるようになります。 作成する際には、カスタム信頼ポリシーにて、踏み台アカウントの情報を記載します。 "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::AWSアカウントID:user/ユーザー名" }, "Action": "sts:AssumeRole", "Condition": { "Bool": { "aws:MultiFactorAuthPresent": "true" } } } } Conditionで指定しているのは、MFAが有効でないとアクセスさせないというものです。 踏み台側のIAMユーザーにMFAを設定しておきましょう。 例えば、このロール名を example_assumerole とした場合、下記がスイッチロールのURLとなるので、ブラウザのブックマークに登録させておくと良いと思います。 https://signin.aws.amazon.com/switchrole?roleName=example_assumerople&account=アクセス先AWSアカウントID AWS CLI AWS CLIでもスイッチロールを使用することができます。 まずは、踏み台アカウントのアクセスキーとシークレットアクセスキーが ~/.aws/credentials にあること、そしてProfile名を指定します。 例えば、踏み台アカウントのプロファイルをexampleとしたとした場合は、下記の通りです。 aws_access_key_id = XXXXXXXXXXXXXX aws_secret_access_key = XXXXXXXXXXXXXXXXX 次に、~/.aws/config にスイッチロールする先の設定を記載します。 source_profile = example [profile hoge] source_profile = example role_arn = arn:aws:iam::XXXXXXXX:role/example_AssumeRole mfa_serial = arn:aws:iam::XXXXXXXXX:mfa/ユーザー名 source_profile で ~/.

Read more →

August 16, 2022

phpMyAdminのトラブルシュート

概要 phpMyAdminを導入して、画面が真っ白になってしまったり、何も表示されない場合の対処方法です。 また、セットアップ時に必要な対応内容も記載します。 対処内容 バージョンを下げる 原因は不明ですが、最新バージョンから1つ下げたバージョンだとエラーが表示される場合があるため、バージョン下げるのが1つです。 /var/lib/php/session に書き込み権限が無い /var/lib/php/session にPHPを実行しているユーザーの書き込み権限が無い可能性があるため、権限が無い場合は権限を付与します。 example: config.inc.php に必要な設定 config.sample.inc.php をコピーして、config.inc.phpとする。 blowfish_secret が短すぎる 32文字のランダム文字列あるが、32文字だと短すぎてログイン画面でエラーになるので、60文字程度の長さの文字列とする。 server を指定する server のhostはデフォルトlocalhostとなっているが、mysqlの権限でlocalhostで許可されていないとエラーになるため、環境に応じて定義する。 php.ini のtimezoneがUTCの場合 php.iniがUTCの場合(もしくは正しく’Asia/Tokyo’と認識されていない場合)にエラーになるので、そちらも下記と同じようになるよう修正する。

Read more →

July 21, 2022

よく使うjqコマンド

概要 jqコマンドでよく使うものをまとめておきます。 jsonサンプル "Fruits": [ { "Id": 1, "Name": "Apple", "Color": "Red" }, { "Id", 2, "Name": "Banana", "Color": "Yellow" }, { "Id": 3, "Name": "Orange", "Color": "Orange" } ] } テキスト出力 Apple Banana Orange 特定のキーとバリューを抽出 1 2 3 複数のキーとバリューを抽出 { "Id": 1, "Name": "Apple" } { "Id": 2, "Name": "Banana" } { "Id": 3, "Name": "Orange" } 特定の文字列を含む検索 { "EngineVersion": "8.0.mysql_aurora.3.01.0", "DBEngineVersionDescription": "Aurora MySQL 3.01.0 (compatible with MySQL 8.0.23)" } { "EngineVersion": "8.

Read more →

July 19, 2022

Pythonでログをファイルに出力する

概要 Pythonでファイルにログを出力する場合は、loggingモジュールを使う。 コード logger = logging.basicConfig(filename='logs/debug.log', level=logging.DEBUG) def example(): res = requests.get(HOGEHOGE, data=json.dumps(payload), headers=headers) res_json = res.json() logging.info(res_json) try: ~~~ except Exception as e: logging.error(e.message)

Read more →

July 14, 2022

AWS CLIでキーペアの公開鍵を参照する

概要 2022/04/30にキーペア関連のアップデートがありました。そこで、AWS CLIでキーペアの公開鍵を参照できるようになっています。 https://dev.classmethod.jp/articles/update-ec2-keypair-20220429/ しかし、上記ブログ公開時にはまだ参照できるオプションがなかったようです。 本日試したところ、下記バージョンでオプションを確認することができました。 aws-cli/2.7.6 参照コマンド 作成済みキーペアの公開鍵参照コマンド "ssh-rsa AAAAXXXX キーペアの名前"

Read more →

June 6, 2022

nginxで特定のファイルやディレクトリのみ直下を参照する

概要 WordPressなどを使っていて、php-fpmなどに渡している場合に、.well-knownやGoogle関連のファイルを直下に配置して読ませない場合があります。 そういった場合の記述です。 記述 下記のようphp-fpmよりも評価を先にすることで、DocumentRoot直下の.well-knownを参照するようになります。 try_files $uri $uri/ =404; }

Read more →

March 28, 2022

Route53のレコードをTerraformでimport

概要 もし手動でRoute53へレコードを追加していても、Terraformを使っている場合にimportでコード管理することが可能です。 手順 terraform準備 name = "_xxxxxxxxxx.dev.example.com" type = "CNAME" zone_id = aws_route53_zone.example-com.zone_id records = ["_XXXXX.acm-validations.aws"] ttl = 300 } 実行の仕方 import Acquiring state lock. This may take a few moments... aws_route53_record.dev-example-com_acm-validate: Importing from ID "A12345XXX__xxxxxxxxxx.dev.example.com_CNAME"... aws_route53_record.dev-example-com_acm-validate: Import prepared! Prepared aws_route53_record for import aws_route53_record.dev-example-com_acm-validate: Refreshing state... [id=A12345XXX__xxxxxxxxxx.dev.example.com_CNAME] Import successful! The resources that were imported are shown above. These resources are now in your Terraform state and will henceforth be managed by Terraform.

Read more →

March 28, 2022

TerraformでGitHub ActionsのOIDC連携用のIAM Roleを作成する

概要 GitHub Actionsを実行するのに、アクセスキーをSecretsに設定していた場合、漏洩した際のリスクがあるため、定期的なローテーションの運用などがある。 そうすることなく、GitHubにはIAM RoleのARNだけを渡すのみで、一時的なアクセスキーを使って、AWSリソースへアクセスするOIDC連携が最近発表された。 AWSでは下記の設定のみで、準備が整うのでそのコードを記録しておく。 Terraform ※追記: thumbprint_listの固定値が変わったので修正(20240310) url = "https://token.actions.githubusercontent.com" client_id_list = ["sts.amazonaws.com"] thumbprint_list = [ "6938fd4d98bab03faadb97b34396831e3780aea1", "1c58a3a8518e8759bf075b76b750d4f2df264fcd" ] <-- 固定値 } resource "aws_iam_role" "github-actions" { name = "github-actions" path = "/" assume_role_policy = jsonencode({ Version = "2012-10-17" Statement = [{ Effect = "Allow" Action = "sts:AssumeRoleWithWebIdentity" Principal = { Federated = aws_iam_openid_connect_provider.github-actions.arn } Condition = { StringLike = { "token.actions.githubusercontent.com:sub" = [ "repo:inamuu/example:*", <-- ここで必ずリポジトリ制限を行う ] } } }] }) } resource "aws_iam_role_policy_attachment" "github-actions-01" { role = aws_iam_role.

Read more →

February 15, 2022

Ubuntuで便利コマンド

コマンド名 効果 xev キー割当の確認、xdotoolで正しいキー割当を確認するのに使える

Read more →

February 2, 2022

Pythonの環境変数の処理

環境変数をセット 環境変数を取得 'test' 環境変数を削除 'test' >>> os.environ.get('TEST')

Read more →

January 31, 2022

pytestでプライベート化した関数を呼び出す

概要 とすると、Pylanceでerrorになります。 こちらをerrorにならないようにするには as で別名を付与してあげることで回避可能です。

Read more →

January 14, 2022

pytestで例外をテストする

概要 raiseを使って例外を出力することをテストしたい場合の書き方です。 コード class TestServiceHandler: def test_example(self): with pytest.raises(KeyError): check_request(sample)

Read more →

January 14, 2022

型のチェック

概要 Pythonの型のチェック方法 コード "name": "taro", "emails": ["test@exmaple.com"] } for k, v in test_data.items(): if k == 'emails': if type(v) is not list: raise TypeError(v + ' is not List')

Read more →

January 12, 2022

AWS CloudShellで日本語対応する

概要 AWS CloudShellはデフォルトで日本語入力が文字化けするなどの問題があります。 そのため、日本語環境をインストールして、環境変数で呼び出すようにしてあげれば解消します。 localectlコマンドは、コンテナで使用できないため、環境変数の対応が必要です。 対応 rootに昇格して、日本語環境をインストール # yum install glibc-langpack-ja .bash_proffileを作成して、言語設定 LANG="ja_JP.UTF-8" LANGUAGE="ja_JP:ja" LC_ALL="ja_JP.UTF-8" vimも日本語入力できるようにしておく :set encoding=utf-8 :set fileencodings=iso-2022-jp,euc-jp,sjis,utf-8 一度CloudShellを閉じて再度開き直すか、exec $SHELLでシェルをひらき直すことで反映されます。

Read more →

January 5, 2022

MacのfishでpyenvのPATHを通す

概要 Macでfish+pyenvの方法がいくつかサイトで散見されますが、うまくいかず、最終的には公式ドキュメントどおりに記載することでうまくいったのでその内容です。 手順 HOME配下の.pyenvにpyenvをインストール。 config.fishに下記を記載する。一行目が無いとPATHが通らず、python -VをしてももともとインストールされているシステムPythonを参照してしまうので注意。 status is-login; and pyenv init --path | source if status is-interactive pyenv init - | source end 下記でインストール対象のバージョンを確認する。 Pythonをインストールしてグローバルで有効化する。 pyenv global 3.9.9 下記でちゃんとHOME配下のPATHになっていればOK /Users/ここに自分のユーザー名/.pyenv/shims/python ドキュメント https://github.com/pyenv/pyenv いつも思いますが、公式ドキュメントが英語でも、英語を読むのが近道です。

Read more →

November 29, 2021

GitHubActionsのrunで複数行でコマンドを実行

概要 複数行に渡ってコマンドを実行したい、改行したいという場合の書き方です。 コマンドを複数記述したい場合 | パイプを利用する それぞれのコマンドが実行される。 echo "install pkgs" apt install vim 一行が長くなるので複数行に分けたい場合 > 大なりの記号を利用する 1行とみなされて実行される。 pip install requests dotenv

Read more →

October 20, 2021

Terraformでメンテナンス専用のALBを作成する

概要 ALBでは固定レスポンスを返すことができるため、メンテナンス専用のALBを作成して、Route53でDNSを切り替えてメンテナンスページを表示することができます。 AレコードのAliasを指定した場合、TTLが設定できませんが、digで確認する限り60秒なので最長でも60秒でALBに切り替わる想定です。 Terraform 80は443へ301リダイレクトをして、443では503のステータスコードと、固定のHTMLを返すようにします。 name = "maintenance" internal = false load_balancer_type = "application" security_groups = [aws_security_group.maintenance.id] subnets = [aws_subnet.public-1a.id] enable_deletion_protection = true } resource "aws_alb_listener" "maintenance-HTTP" { load_balancer_arn = aws_lb.maintenance.arn port = "80" protocol = "HTTP" default_action { type = "redirect" redirect { port = "443" protocol = "HTTPS" status_code = "HTTP_301" } } } resource "aws_alb_listener" "maintenance-HTTPS" { load_balancer_arn = aws_lb.maintenance.arn port = "443" protocol = "HTTPS" ssl_policy = "ELBSecurityPolicy-2015-05" certificate_arn = aws_acm_certificate.

Read more →

October 16, 2021

CloudFrontにTerraformを使ってベーシック認証を設定する

概要 CloudFrontにもCloudFront Functionを使うことでベーシック認証を設定することが可能です。 Terraformでその書き方をメモしておきます Terraform まず、CloudFront Functionを定義します。 code = <<-EOT function handler(event) { var request = event.request; var headers = request.headers; var cookies = request.cookies; // Basic認証情報 // echo -n hoge:password | base64 var authString = "Basic aG9nZTpwYXNzd29yZA=="; if ( typeof headers.authorization === "undefined" || headers.authorization.value !== authString ) { return { statusCode: 401, statusDescription: "Unauthorized", headers: { "www-authenticate": { value: "Basic" } } }; } return request; } EOT name = "inamuu-basicAuth" runtime = "cloudfront-js-1.

Read more →

October 12, 2021

autopep8でフォーマットされるのを除外する

下記のいずれかでOK from app import db #nopep8

Read more →

September 14, 2021

CdkStack failed: Error: This stack uses assets

一番最初のdeploy実行時に下記エラーが出ることがあります。 Do you wish to deploy these changes (y/n)? y CdkStack: deploying... ❌ CdkStack failed: Error: This stack uses assets, so the toolkit stack must be deployed to the environment (Run "cdk bootstrap aws://unknown-account/unknown-region") at Object.addMetadataAssetsToManifest (/home/kazuma/.anyenv/envs/nodenv/versions/12.9.1/lib/node_modules/aws-cdk/lib/assets.ts:27:11) at Object.deployStack (/home/kazuma/.anyenv/envs/nodenv/versions/12.9.1/lib/node_modules/aws-cdk/lib/api/deploy-stack.ts:208:29) at processTicksAndRejections (internal/process/task_queues.js:85:5) at CdkToolkit.deploy (/home/kazuma/.anyenv/envs/nodenv/versions/12.9.1/lib/node_modules/aws-cdk/lib/cdk-toolkit.ts:184:24) at initCommandLine (/home/kazuma/.anyenv/envs/nodenv/versions/12.9.1/lib/node_modules/aws-cdk/bin/cdk.ts:213:9) This stack uses assets, so the toolkit stack must be deployed to the environment (Run "cdk bootstrap aws://unknown-account/unknown-region") bootstrapを実行して、S3バケットを作成して、再度deployを実行すればOKです。

Read more →

August 3, 2021

MySQL5.7セットアップメモ

OS CentOS7 インストール $ wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm $ rpm -ivh http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm $ systemctl enable mysqld $ systemctl start mysqld セキュアインストール 事前にデフォルトのパスワードを確認する セキュアインストールの実行 下記で、rootパスワードの変更、テストデータベースの削除、リモートからのroot接続を無効化を実施する パラメータ調整 ファイルを変換 パラメータ追加 # Charset character-set-server = utf8mb4 collation-server = utf8mb4_general_ci init-connect = SET NAMES utf8mb4 skip-character-set-client-handshake # MyISAM key_buffer_size=8M thread_cache_size=16 query_cache_limit=5M query_cache_min_res_unit=4k query_cache_size=8M query_cache_type=1 read_buffer_size=8M join_buffer_size=8M read_rnd_buffer_size=8M # InnoDB innodb_buffer_pool_size=1024M innodb_log_file_size=512M innodb_log_buffer_size=16M innodb_file_per_table = 1 sort_buffer_size=8M 最後に再起動して終わり

Read more →

July 22, 2021

API GatewayとLambdaで送られてくるeventを確認する

概要 API GatewayでLambdaプロキシ統合を利用した際に送られてくるJSONのeventを確認するためには、下記で確認することでそれを手元のJSONファイルに保存するとLambdaでテストする際に便利。 Pythonの場合 print(json.dumps(event))

Read more →

July 20, 2021

WindowsまたはMacで文字列のエンコードとデコード

Windows certutilというデフォルトで入っているコマンドをコマンドプロンプトで使用する。 中身の確認 >type from.txt hello world エンコード >certutil -f INPUT.txt encode.txt デコード >certutil -f encode.ext decode.txt 中身の確認 >type decode.txt hello world Mac Macの場合はbaes64コマンドを使う。 エンコード $ echo "hello world" | base64 aGVsbG8gd29ybGQK デコード $ echo aGVsbG8gd29ybGQK | base64 -d hello world

Read more →

June 21, 2021

CloudFormationをAWS CLIで管理する手順

概要 CloudFormationをAWS CLIを使って確認したり、削除したりするための手順です。 スタックの一覧を表示する スタックの中身を確認する

Read more →

June 10, 2021

RDS for SQL Serverのまとめ

概要 RDS for SQL Serverで色々やるときのストアドだったり、SQLだったりをまとめます。 ユーザー作成 WITH PASSWORD = 'Password', DEFAULT_DATABASE = test_db, CHECK_EXPIRATION = OFF, CHECK_POLICY = OFF GO データベースユーザー作成 GO CREATE USER developer GO ロール割当 GO EXEC sp_addrolemember 'db_owner', 'developer' GO バックアップ @source_db_name='database_name', @s3_arn_to_backup_to='arn:aws:s3:::BACKETNAME/FILENAME.bak', @type='FULL' リストア @restore_db_name='database_name', @s3_arn_to_backup_to='arn:aws:s3:::BACKETNAME/FILENAME.bak', @with_norecovery=1, ステータス確認 @db_name='database_name', @task_id=ID_number; データベースの削除

Read more →

June 10, 2021

Azure Data Studioの使い方

概要 Microsoft謹製のSQL Server接続GUIクライアントのAzureDataStudioの使い方です。 データベースの作成 公式のドキュメント: データベースを作成する データベースの削除 データベースの作成と同様に、スニペットの sqlDataBaseを展開して実行。 バックアップ 公式ドキュメント: チュートリアル:Azure Data Studio を使用したデータベースのバックアップと復元 AWSのRDSの場合: SQL Server データベースのインポートとエクスポート 対象DBを選択してBackupを選択。 オプションを指定してBackupを実行。

Read more →

June 3, 2021

SQL ServerのSQL実行

概要 SQL Server on Linuxでsqlcmdを使ったSQLの実行例です。 ログイン Password: ここでパスワードを入力 バージョン確認 2> go Microsoft SQL Server 2019 (RTM-CU8) (KB4577194) - 15.0.4073.23 (X64) Sep 23 2020 16:03:08 Copyright (C) 2019 Microsoft Corporation Express Edition (64-bit) on Linux (Red Hat Enterprise Linux) <X64>

Read more →

May 31, 2021

Ulauncherまとめ

概要 Linux用のGUIランチャーUlancherについてのまとめ。 ※日々追記・更新 ホットキーを入力しても起動しない。 エラーのリンクにご丁寧に書いてある下記のとおりに実施するのみ。 https://github.com/Ulauncher/Ulauncher/wiki/Hotkey-In-Wayland 設定を開く キーボードショートカットを開く 一番下の「+」からショートカットを追加 任意の名前(Ulancherとか)を入力し、ぶつからないショートカット(私はShift+Spaceにした)を設定し、Commandとして「ulancher-toggle」を指定する ターミナルから上記コマンドを入れても起動するように、ショートカットに割り当てるだけで起動する。便利。

Read more →

May 3, 2021

scoopを使ってWindowTerminalをインストール

概要 WindowsTerminalはWindowStoreでインストールができますが、CLIでインストールが可能なのでその手順です。 準備:scoopをインストールする PowerShellを起動して、scoopをセットアップ PS: iwr -useb get.scoop.sh | iex gitを導入して、extrasリポジトリを追加 scoop bucket add extras WindowsTerminalをインストール scoopを使ってインストール scoop install windows-terminal

Read more →

February 15, 2021

Windows Server 2019でApacheとPHPとMySQLとIISでメールの送信設定とFTPのセットアップ

概要Windows Server 2019 を使って、下記のセットアップ手順を記載します。 ※追記 Windows Server 2022 でも対応可能です。 IEセキュリティ設定のオフ Apache2.4 PHP7.4 OpenSSL MySQL IIS メール FTP Apacheトラブルシュート IEセキュリティ設定のオフ IEセキュリティが有効だとファイルのダウンロード等で煩わしいので下記設定でゆるくする。 サーバーマネージャーを起動 > ローカルサーバー > IE セキュリティ強化の構成 > Administratorグループをオフ > IEを再起動 エクスプローラーで隠しファイルと拡張子を表示 Apache https://www.apachelounge.com/download/ Apache 2.4.X Win64 [Apache VS17 Binary] httpd-2.4.X-win64-VS17.zip インストール ダウンロードしたzipを解凍→Apache24フォルダを C:\\ へコピー bin/httpd を実行して、ブラウザで localhost:80 でアクセス 環境変数PATHを追加 検索で、環境変数を検索して、環境変数PATHへ新規で下記を追加する。 C:\Apache24\bin 自動起動設定 管理者でコマンドプロンプトを起動 バイナリまでCDして(Pathを通していればそのままでOK)、 httpd.exe -k install を実行すればサービスへ追加される もしも、「VCRUNTIME140.dllが見つからない」と出てしまう場合、下記からVisual Studio C++をインストールする。(64bitならx64をインストールする) Microsoft Apache再起動用のバッチを作成する 下記を apache_restart.bat という名前でデスクトップに作成する。 httpd.exe -k start DocumentRoot配下で.htaccessを有効化 mod_rewriteとSSL関連、mod_deflateのモジュールをアンコメント。

Read more →

January 11, 2021

Ansibleでファイルの存在に応じてコマンドの条件分岐

概要 特定のファイルがある場合は実行せず、なければ実行するような条件分岐を入れて、べき等性を担保する方法です。 ソース 最初にstatモジュールでファイルの有無をチェックして、変数sqlupdate_cmdに入れます。 そのsqlupdate_cmdの変数からstatモジュールのexistsを使うとファイルの存在チェックで判定できます。 statで変数に入れておくことで、他にも使えるモジュールがあるので ls -l や test -e でチェックうするより汎用性が高いです。 https://docs.ansible.com/ansible/devel/collections/ansible/builtin/stat_module.html tags: base git: repo: git://bisqwit.iki.fi/sqlupdate.git dest: /usr/local/src/sqlupdate remote: "origin/release" accept_hostkey: yes - name: check sqlupdate command tags: base stat: path: /usr/local/bin/sqlupdate register: sqlupdate_cmd - name: configure sqlupdate tags: base command: cmd: "./configure" chdir: /usr/local/src/sqlupdate ignore_errors: True when: sqlupdate_cmd.stat.exists == false - name: make sqlupdate tags: base make: chdir: /usr/local/src/sqlupdate when: sqlupdate_cmd.stat.exists == false - name: make install sqlupdate tags: base make: chdir: /usr/local/src/sqlupdate target: install when: sqlupdate_cmd.

Read more →

January 10, 2021

Ansibleでシェルコマンドの結果をもとに別のコマンドを実行する

概要 どうしてもコマンドでやらないといけないときにその結果をもとに実行する必要があった場合に、結果から次のコマンドを実行できます。 コード 下記はgrepの結果からファイル作成をしていますが、良い例ではありません。 結果的に別のモジュールで代替できましたが、下記はうまくいった事例なのでメモしておきます。 ファイル作成はfileモジュールを作成し、文字列が無い場合にファイルに追記する場合はlineinfileをすると良いです。 tags: opendkim command: "grep '._domainkey.{{ domain_name }}' /etc/opendkim/KeyTable" register: keytable_domain failed_when: no - name: test tags: opendkim command: "touch /tmp/{{ domain_name }}" when: keytable_domain.rc == 1

Read more →

January 9, 2021

Macでclamavを使ってウイルススキャン

概要特定のディレクトリ配下をウイルススキャンしたい場合にclamavを使った方法です。 clamavのインストール手順 clamvをインストール 設定ファイルのサンプルのPATHを確認 /usr/local/bin/freshclam /usr/local/Cellar/clamav/0.103.0/bin/freshclam /usr/local/Cellar/clamav/0.103.0/.bottle/etc/clamav/freshclam.conf.sample /usr/local/Cellar/clamav/0.103.0/share/man/man5/freshclam.conf.5 /usr/local/Cellar/clamav/0.103.0/share/man/man1/freshclam.1 /usr/local/share/man/man5/freshclam.conf.5 /usr/local/share/man/man1/freshclam.1 ディレクトリ作成 サンプルのコピー /usr/local/Cellar/clamav/0.103.0/.bottle/etc/clamav/freshclam.conf.sample -> /usr/local/etc/clamav/freshclam.conf 元ファイルのバックアップ /usr/local/etc/clamav/freshclam.conf -> /usr/local/etc/clamav/freshclam.conf.bak 設定ファイルの Example という文字列をコメントアウト --- /usr/local/etc/clamav/freshclam.conf.bak 2020-10-26 19:37:45.000000000 +0900 +++ /usr/local/etc/clamav/freshclam.conf 2020-10-26 19:38:29.000000000 +0900 @@ -5,7 +5,7 @@ # Comment or remove the line below. -Example +#Example # Path to the database directory. # WARNING: It must match clamd.conf's directive! データベースの更新 スキャン方法 clamscanを使って対象ディレクトリをスキャンする -r 再帰的に実行 -i 対象ファイルのみを表示

Read more →

October 26, 2020

EBSのボリューム拡張

概要Amazon Linux 2の場合、EBSのボリューム拡張はオンラインで行えます。 その手順を記載いたします。 ボリューム一覧の確認 ボリュームのサイズ変更 Amazon Linux2でファイルシステムの拡張 対象のパーティションを確認 パーティションの拡張 CHANGED: partition=1 start=4096 old: size=16773087 end=16777183 new: size=104853471 end=104857567 ファイルシステムの拡張(Amazon Linux2はxfs) meta-data=/dev/xvda1 isize=512 agcount=4, agsize=524159 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=1 spinodes=0 data = bsize=4096 blocks=2096635, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=1 log =internal bsize=4096 blocks=2560, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 data blocks changed from 2096635 to 13106683 確認

Read more →

October 21, 2020

pyenvのインストールエラー

概要wslでpyenvを使って各バージョンのPythonをインストールしようとしたところ、いくつかパッケージ不足でエラーになったのでまとめていきます。 エラー1 zipimport.ZipImportError: can't decompress data; zlib not available $ sudo apt install zlib1g-dev エラー2 WARNING: The Python bz2 extension was not compiled. Missing the bzip2 lib? WARNING: The Python readline extension was not compiled. Missing the GNU readline lib? $ sudo apt install -y libssl-dev libbz2-dev libreadline-dev

Read more →

September 30, 2020

WSLでprezto

概要WSLでbashをzshにしてpreztoにする手順です。 WSL2ではありませんが、基本的には作業は同じだと思います。 手順 zshをインストールして、デフォルトシェルを変更します。 sudo apt install zsh sudo chsh -s $(which sh) preztoをインストールします。 下記コマンドを実行します。 setopt EXTENDED_GLOB for rcfile in "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/^README.md(.N); do ln -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}" done ※すでに.zshrcがある場合は削除してください。rm ~/.zshrc 再度ログインしなおせばpreztoが有効になっています。

Read more →

September 15, 2020

Webpacker configuration file not found

エラー内容bin/rails s した際に発生するエラー。 対処方法 webpackをインストールする。この際にnodeのエラーが出ることがあるので、その場合はこちらを参照してnodeをアップデートする。 bin/rails webpacker:install

Read more →

September 8, 2020

dyld: Library not loaded: /usr/local/opt/icu4c/lib/libicui18n.64.dylib

エラー内容npmインストールを実行した際に出るエラー。Railsを動かしたいだけなのにこんなことがある。 dyld: Library not loaded: /usr/local/opt/icu4c/lib/libicui18n.64.dylib Referenced from: /usr/local/bin/node Reason: image not found zsh: abort npm install -g yarn 対処方法 なにはともあれ、nodeのバージョンアップ こうしたらnpm installが通った。

Read more →

September 8, 2020

can’t find gem bundler (>= 0.a) with executable bundler (Gem::GemNotFoundException)

エラー内容bundleコマンドの実行時に下記のようなエラーになることがあります。 Traceback (most recent call last): 2: from /Users/inamuu/.rbenv/versions/2.5.1/bin/bundle:23:in `<main>' 1: from /Users/inamuu/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems.rb:308:in `activate_bin_path' /Users/inamuu/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems.rb:289:in `find_spec_for_exe': can't find gem bundler (>= 0.a) with executable bundle (Gem::GemNotFoundException) Gemfile.lockで指定されているbundlerとのバージョンの違いのようです。 まだ作り始めとかでしたら、Gemfile.lockを削除すると解決します。Gemfile.lockを削除するのがまずい場合は、Gemfile.lockのバージョンにあわせてbundlerをインストールします。

Read more →

September 8, 2020

MAMP使い方

概要MAMPはGUIで操作できる便利なツールです。 デフォルトでphpMyAdminも備わっているので、コマンドを使うことなく操作ができます。 しかし、場合によってはコマンドで操作が必要な場合もあるため、其の辺を含めてまとめていきます。 MySQLのポートMAMPではデフォルトで8889番ポートが使用されます。 ApacheのDocumentRootApacheのDocumentRoot(公開ディレクトリ)はデフォルトでは /Applications/MAMP/htdocs です。 MySQLへコマンドから接続下記パスへ移動して、デフォルトのパスワードrootを使って接続する。 $ ./mysql -u root -proot デフォルトのmysql cliから接続するときはホストの指定を localhost ではなく、 127.0.0.1 にすること。 PHPの設定ファイルのパス複数バージョンが存在する。 なお、デフォルトでは下記のように複数バージョンのPHPが存在する。 GUIでは上位2つしか画面上に切り替えができないようになっているので、ディレクトリごと 使わないバージョンをアンダーバーをつけるなりしてリネームすることで認識されるようになるらしい。 total 552 drwxrwxr-x 10 hoge admin 320 2 17 23:30 . drwxrwxr-x 25 hoge admin 800 8 5 22:38 .. -rw-rw-r-- 1 hoge admin 282226 2 17 21:12 browscap.ini drwxrwxr-x 7 hoge admin 224 2 17 21:52 php5.4.45 drwxrwxr-x 7 hoge admin 224 2 17 21:52 php5.6.40 drwxrwxr-x 7 hoge admin 224 2 17 21:52 php7.

Read more →

August 23, 2020

WindowsをMacと同じように使うメモ

随時更新予定 IME切り替え MS IMEのプロパティ → Ctrl+SpaceにIMEオンオフの割り当て コマンドプロンプトでシステム音を鳴らさない サウンドコントロールパネル → サウンド → サウンド設定 → サウンドなし https://www.atmarkit.co.jp/ait/articles/1904/26/news032.html WSLの手動インストール https://junk-box.net/toy/2019/08/01/wsl%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/ パッケージマネージャーのscoopをインストールする Windowsのパッケージマネージャー

Read more →

August 18, 2020

Windowsのパッケージマネージャー

# scoop インストール手順 “` PS C:\Users\M172043> Set-ExecutionPolicy RemoteSigned -Scope CurrentUser -Force PS C:\Users\M172043> iwr -useb get.scoop.sh | iex Initializing… Downloading scoop… Extracting… Creating shim… Downloading main bucket… Extracting… Adding ~\scoop\shims to your path. ’lastupdate’ has been set to ‘2020-08-17T22:37:38.5268481+09:00’ Scoop was installed successfully! Type ‘scoop help’ for instructions. “`

Read more →

August 17, 2020

Windowsで起動時にアプリケーションを実行する

# タスクマネージャーで制御 `タスクマネージャー > スタートアップ > {有効化|無効化}` # スタートアップリンク cmd+rで `スタートフォルダ` に対象アプリケーションのショートカットを追加する

Read more →

August 17, 2020

WordPressのエラーまとめ

概要WordPressのエラーをまとめていきます。 Internal Server Error(500)になってしまって、エラーログにもでない場合のデバッグwp-config.phpでdebugをtrueにする。

Read more →

August 2, 2020

h2oでmrubyを使ってリダイレクト

概要h2oを使っているときにリダイレクト処理を入れたい場合、PATHベースであれば下記のようにシンプルに記載が出来ます。 https://h2o.examp1e.net/configure/redirect_directives.html redirect: url: https://inamuu.com/ status: 301 しかし、クエリストリングを使っている場合に下記のように記述してもリダイレクトされません。 redirect: url: https://inamuu.com/?p=100 status: 301 そこでmrubyを使うことでクエリストリングが含まれている場合の書き方になります。 https://h2o.examp1e.net/configure/mruby.html 前提h2oをmrubyで使うのにあたり、幾つか仕様として最低限覚えておかないといけないことがあります。 1つは、戻り値は配列にする必要があること。 下記のようなコードを書いたとします。 Proc.new do |env| if /\.(html|css)\z/.match(env["PATH_INFO"]) p 'test' end end そうすると、エラーログにarrayじゃなかったよって出力されます。 配列は下記のように ステータスコード, ヘッダー, body にしてあげる必要があります。 if /\.(html|css)\z/.match(env["PATH_INFO"]) [200, { 'content-type' => 'text/plain' }, ['hoge']] end end 次に、条件にマッチしなかったら、yamlの処理、つまり次に処理を進めたい場合はステータスコードを399で返す必要がある点です。 上記のコードは、/hoge/hoge.html は問題ありませんが、 /hoge は Internal Server Error となります。 そこでマッチしなかったら、ステータス399を返すようにしてあげればその後の /var/www/html が参照されます。 if /\.(html|css)\z/.match(env["PATH_INFO"]) [200, { 'content-type' => 'text/plain'}, ['hoge']] else [399, {}, []] end end file.

Read more →

July 31, 2020

certbot-autoでDNS認証

コマンド Saving debug log to /var/log/letsencrypt/letsencrypt.log Plugins selected: Authenticator manual, Installer None Obtaining a new certificate Performing the following challenges: dns-01 challenge for ドメイン名 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - NOTE: The IP of this machine will be publicly logged as having requested this certificate.

Read more →

July 29, 2020

Laravel7でAdminLTEを使って管理画面を作成

概要 管理画面を作成する 前提 ログイン機能の実装 Laravelでログイン機能を追加 環境 Laravel7 laravel-adminlte3.4 参考URL https://shishido.dev/laravel6-adminlte/ https://github.com/jeroennoten/Laravel-AdminLTE#2-installation 手順 composer require laravel/ui php artisan ui:controllers php artisan adminlte:install php artisan adminlte:install --only=auth_views ログイン画面がAdminLTEに切り替わっている。 home.blade.phpを下記に書き換える。 @section('title', 'Dashboard') @section('content_header') <h1>Dashboard</h1> @stop @section('content') <p>Welcome to this beautiful admin panel.</p> @stop @section('css') <link rel="stylesheet" href="/css/admin_custom.css"> @stop @section('js') <script> console.log('Hi!'); </script> @stop ログイン後はAminLTEデザインになっている。

Read more →

July 27, 2020

Laravelでログイン機能を追加

やりたいことLaravelで認証画面を作る 環境 Laravel6 手順Laravel6未満だったら、下記を実行する。 Laravel6以降の場合Command "make:auth" is not defined. とでたら、下記を実行する。 sh: 1: git: not found とでたら、gitをインストールする。 下記でログイン画面をインストール npm install && npm run dev migrationする 画面右上にLogin, Registerが追加されている。 ログイン機能が追加されている。

Read more →

July 27, 2020

WindowsServer2016でmod_mdを使ってLet’sEncryptでSSL証明書を設置する

TL;DRWindows Server2016でLet’sEncryptを使うのに、mod_mdを使うと簡単にSSL証明書の認証まで出来て便利。 Environment さくらのVPS for Windows Windows Server2016 Apache2.4.30以降 mod_md Let’s Encrypt 手順httpd.confで下記をアンコメントする。 LoadModule socache_shmcb_module modules/mod_socache_shmcb.so LoadModule watchdog_module modules/mod_watchdog.so LoadModule md_module modules/mod_md.so 下記をhttpd.confへ追記する。 MDCertificateAuthority でv01を指定していると、ACMEv1は使えないエラーが出るので注意。v02を指定する。 MDCertificateProtocol ACME MDCAChallenges http-01 MDDriveMode auto MDPrivateKeys RSA 2048 MDRenewWindow 33% MDStoreDir md MDCertificateAuthority https://acme-v02.api.letsencrypt.org/directory MDCertificateAgreement https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf MDomain www.example.com Listen 443 <VirtualHost *:443> SSLEngine on ServerName www.example.com DocumentRoot "${SRVROOT}/htdocs" </VirtualHost> 下記メールアドレスを変更する。 ここがexample.comのままだとエラーになる。 ここでApacheを2回再起動する。 1回目だけだと、エラーログに次回のApache再起動でと表示が出る。 ファイアウォールで443を開放して、ブラウザでアクセスできればOK。

Read more →

July 24, 2020

ConohaのVPSのセキュリティグループをopenstackコマンドで追加する

背景ConohaのVPSを触る機会があり、コントロールパネルを見た所、開放できるポートが限定的であることがわかりました。 もちろん全許可にしてfirewalldなどでやるのでも良いのですが、できるだけ低いレイヤーでいて、且つサーバーそのものではないレイヤーで制限が出来た方が良いので調べてみたところ、ConohaにはAPIがあることがわかりました。 ConohaのバックエンドはOpenStackなので、APIで使える情報を設定することでopenstackコマンドが使用できます。 そこで、openstackコマンドを使って、SGを設定することにしました。 openstackコマンドのインストール手元にpython3.8.1がインストールされていたので、venvを使ってopenstackをインストールしました。 $ pyenv versions $ python -m venv ~/.venv/global $ source ~/.venv/global/bin/activate $ easy_install pip $ pip install -U pip $ pip install python-openstackclient $ openstack --version openstack 5.3.1 $ which openstack /Users/USERNAME/.venv/global/bin/openstack 環境変数のセットコンパネでAPIユーザーを作成したあとに環境変数をセットします。 exportコマンドで各値をセットするのでも良いですが、envchainを使うとMacのkeychainで管理出来て便利なので今回はenvnchainを使って設定しています。 https://github.com/sorah/envchain conoha_example.OS_TENANT_NAME: gnctXXXXXX $ envchain --set conoha_example OS_PASSWORD conoha_example.OS_PASSWORD: XXXXX $ envchain --set conoha_example OS_USERNAME conoha_example.OS_USERNAME: gncuXXXXX $ envchain --set conoha_example OS_AUTH_URL conoha_example.OS_AUTH_URL: https://identity.tyo2.conoha.io/v2.0 実際にopenstackコマンドを実行してみると、server listのサブコマンドでインスタンス一覧を確認できます。 +--------------------------------------+---------------+--------+--------------------------------------------------------------------+----------------------------+------------+ | ID | Name | Status | Networks | Image | Flavor | +--------------------------------------+---------------+--------+--------------------------------------------------------------------+----------------------------+------------+ | XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX | XX-XX-XXX-XXX | ACTIVE | ext-XXX-XXX-XXX-XXX=XXX.

Read more →

July 16, 2020

herokuでハマった所

Bundler::GemNotFound: Could not findBundler::GemNotFound: Could not find nokogiri-1.10.9 in any of the sources Ruby 2.5.8 で稼働させていたが、Bundlerのバージョンの問題があるようで、herokuはRubyを2.6.X以上を推奨としている。 2.5.8も対応バージョンだが、Ruby 2.6.0 にしたところ解消した。 ActiveSupport::MessageEncryptor::InvalidMessage /usr/local/bundle/ruby/2.6.0/gems/activesupport-5.2.4.3/lib/active_support/message_encryptor.rb:206:in `rescue in _decrypt': ActiveSupport::MessageEncryptor::InvalidMessage (ActiveSupport::MessageEncryptor::InvalidMessage) こちらはRails5.2から追加された秘匿情報の取り扱い。 EDITOR="vim" bundle exec credentials:edit で config/credentials.yml.encが再作成されるので、中身をメモして削除する。 secret_key_baseは再度割り当てられるので、それ以外の値だけまた貼り付ける。 RAILS_MASTER_KEY という環境変数があるので、herokuでは heroku config:set RAILS_MASTER_KEY="ここに確認した文字列" -a アプリケーション名 でセットできる。 値は cat config/master.key のものをセットすればOK.

Read more →

July 14, 2020

herokuコマンド使い方

herokuコマンドのインストール herokuへログイン heroku: Press any key to open up the browser to login or q to exit: Opening browser to https://cli-auth.heroku.com/auth/cli/browser/XXXXX Logging in... done Logged in as XXXXX@gmail.com configのアプリケーション設定 === XXX-menta Config Vars bundle configの確認 ログをtail 環境変数の設定 Setting CLEARDB_DATABASE_URL and restarting ⬢ XXX-menta... done, v3 CLEARDB_DATABASE_URL: mysql://XXXXXXXX:XXXX@us-cdbr-east-02.cleardb.com/heroku_XXXXXX?reconnect=true Dockerコンテナレジストリログイン Login Succeeded DockerfileをPush 手元のDockerfileがログインしたレジストリへPushされる === Building web (/Users/XXXX/.ghq/github.com/XXX/Dockerfile) コンテナをリリース サイトへアクセス

Read more →

July 14, 2020

brew installでArgumentError user inamuu doesn’t exist

背景今日、herokuのCLIをbrewでインストールしようとしたところ、下記エラーが出てきた。 ArgumentError: user inamuu doesn't exist なぜCLIのインストールで私の名前が出てくるんだ?と暫く悩むことに。 原因全く別のissueで、ruby -e 'p Dir.home' か env を実行してみろというコメントがあり、試してみることに。 https://github.com/CocoaPods/CocoaPods/issues/5788 たしかにenvで USER=inamuu をセットしていた。 しかし、ディレクトリ名は別の名前になっていたので export USER=ディレクトリと同じユーザー名 にしたところ、すんなりとインストールできた。 brewというよりはRuby側でライブラリのインストールじにユーザー名を取得していて、それが一致しないことによる問題のようです。 自分でUSERの環境変数をセットしている人は要注意。

Read more →

July 14, 2020

MacOSで不要なオーディオインターフェース仮想ドライバーを削除する

概要ManyCamやBlackHoleと言った仮想オーディオデバイスドライバがあった際に、アプリケーションをゴミ箱にいれただけだと、ドライバーの設定が残ってしまうので削除する手順です。 手順ドライバーファイルがあるディレクトリへ移動する。 total 0 drwxr-xr-x 5 root wheel 160 5 18 16:54 ./ drwxr-xr-x 7 root wheel 224 7 2 01:01 ../ drwxr-xr-x 3 root wheel 96 5 15 13:44 BlackHole.driver/ drwxrwxr-x 3 root wheel 96 4 20 19:28 ManyCamAudioDevice.driver/ drwxr-xr-x 3 root wheel 96 5 1 13:15 ZoomAudioDevice.driver/ 不要なドライバーを削除する。 $ sudo rm -rf ManyCamAudioDevice.driver launchctlでオーディオサービスを再起動する。※PCを再起動でも良さそう。 service spawned with pid: 33215 Audio MIDI設定.app を起動して、不要なドライバーが削除されていることを確認する。 公式ドキュメントhttps://github.com/ExistentialAudio/BlackHole/wiki/Uninstallation

Read more →

July 6, 2020

htaccessでリダイレクト

特定のサイトから別のサイトへリダイレクト # Redirect Redirect permanent / https://URLをここに記載/

Read more →

June 26, 2020

S3で静的ウェブホスティングを公開するための手順

概要 S3を静的ウェブホスティングとして利用するための手順です。 独自ドメインについてはまた別途。AWSドメインでの公開手順です。 手順 S3バケットを作成する PermissionsのBlock all public accessを全てOffにする Bucket Policyに下記を指定する "Version": "2012-10-17", "Statement": [ { "Sid": "PublicReadGetObject", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::バケット名/*" } ] } 4.webホスティングを有効にする

Read more →

May 27, 2020

AmazonWorkSpacesでIMEの切り替え

環境 Amazon WorkSpaces Windows10 日本語版 US配列 クライアント → MacOS US配列 課題MacOSからWorkSpacesのアプリを使って、インスタンスへアクセスした際に、MicrosoftIMEの日本語と英語の切り替えをしたい。 対処方法IME側でShiftのシングルキーで切り替えられるようにできるので、そこにチェックをいれる。

Read more →

March 30, 2020

Slackボットを使うためのAPI Gatewayのセットアップ手順

Set up API Gateway API を作成 REST API を選択 プロトコルはREST, 新しいAPIを選択, 名前は適当に, エンドポイントタイプはリージョン Add method Postを追加 統合タイプをLambda関数 Lambdaプロキシ統合の使用にチェック Lambda関数で対象関数を選択 Deploy to stage ステージ名を作成(v1) デプロイ

Read more →

March 28, 2020

Node.jsでスクリプト化

概要 下記のように package.json へ書いてあげることでnpmコマンドでワンライナーをスクリプト化できる。 "dependencies": { "date-utils": "^1.2.21", "request": "^2.88.2" }, "scripts": { "zip": "zip -r slack-bot.zip ./ && mv -f slack-bot.zip ~/Downloads/" } } 実行

Read more →

March 25, 2020

Datadog基本のキ

最近会社でもDatadogを使い始めています。 非常に沢山の情報をまとめてチェックできるため、積極的に導入検証を進めています。 Datadogはドキュメントが充実しているので、基本的なことは下記ドキュメントを見ることで大抵のことは設定可能です。 https://docs.datadoghq.com/ja/ とは言え、Datadogは出来ることが膨大なので最初は戸惑うことが多いですし、ドキュメントも所々英語のままなので私自身も最初は分からないことだらけでした。 そこで、私がここ最近設定を検証した内容を、記録がてら残しておきます。 ※まだ触り初めのため誤っている内容がありましたら、是非ご指摘いただけましたら幸いです。 環境 AWS EC2(Amazon Linux) AWS Integrationsをインストールする AWSを使っていてまずはじめにやることは、下記のIntegrationsでAWSをインストールすることから始まります。 Integrationsを表示すると沢山のIntegrationsが存在します。 https://docs.datadoghq.com/ja/integrations/ IntegrationsをインストールすることでインストールしたIntegrationのメトリクスを収集できる状態になります。 その中にAWSがあるので、インストールを行うと下記のような画面になります。 ここでは自分で使っているAWSアカウントを追加する必要があります。 また、そのAWSアカウントに対してDatadogがサービスで利用しているAWSアカウントに対して、読み取り権限を付与してあげることになります。 そうすることで、Datadogは様々なAWSのAPIで取得した情報をDatadogのメトリクスとして表示させることができるようになります。 IAM Roleの設定の詳細は下記のドキュメントに書いてありますが、IAM Roleまで作成して設定してあげた値を上記Integrationsで設定します。 https://docs.datadoghq.com/ja/integrations/amazon_web_services/?tab=allpermissions ここまで設定して暫くすると、CloudWatchで取得しているメトリクスがDatadogで同期されるようになります。 下記MetricsのSummaryより、メトリクスのキーが表示されるようになっていることを確認出来たらOKです。 もし確認できないようでしたら、うまく同期できていないのでこれまでの設定を見直す必要があります。 下記はec2に関するメトリクスが取得できているかを確認しています。 EC2にdatadogのエージェントをインストールする IntagrationsのAgentを見ると各OSにあわせたエージェントのインストール手順が確認できます。 MacOS用のエージェントもあるのが面白いですね。 上記ワンライナーを実行しても良いと思いますし、弊社ではAnsibleを使用しているので下記のようなdatadog-agentロールを用意して適用しました。 Ansible tasks/main.yml tags: datadog-agent become: yes copy: src=datadog.repo dest=/etc/yum.repos.d/datadog.repo owner=root group=root mode=0644 - name: install datadog-agent tags: datadog-agent yum: name=datadog-agent state=installed enablerepo=datadog disablerepo='*' become: yes ignore_errors: "{{ ansible_check_mode }}" - name: copy datadog-agent conf tags: datadog-agent become: yes template: src: "{{ item.

Read more →

March 25, 2020

docker-composeのオペレーションに使えるシェルスクリプト

概要docker-compose.ymlで開発環境とか使ってる際に使つとオペレーションが楽になるシェルスクリプトです。 他のリポジトリでもdocker-compose.ymlを使っていて、別の開発リポジトリのコンテナがすでに起動とかしていると docker-compose up -d とかで起動に失敗することがあります。 また、動作がおかしくなったりして、一回イメージごとキレイにするのにいくつかコマンドを打つ必要があります。 そういった煩わしさをなくすために作りました。 改善余地はありますが、dockerコマンドを何個か叩くのを減らせますし、シンプルなのでわかりやすいかと思います。 動作環境 MacOS (bashが動けばどこでも使えるかと思います。) Docker for Mac 18.09 使い方 docker-compose.ymlが存在するディレクトリに、下記スクリプトを配置します。 その後で下記スクリプトを dockerops.sh などわかりやすいファイル名にします。 そのままだと実行権限が無いので、 chmod u+x dockerops.sh とかしてあげると良いです。 その後で ./dockerops.sh -h とかでヘルプを見つつ、必要なコマンドを実行します。 dockerops.sh up () { IMAGES=$(docker ps -q | wc -l) if [ "${IMAGES}" -ge 1 ]; then echo "現在起動しているコンテナを停止します..." docker kill $(docker ps -q) fi echo "コンテナを起動します..." docker-compose up -d } build() { IMAGES=$(docker ps -q | wc -l) if [ "${IMAGES}" -ge 1 ]; then echo "現在起動しているコンテナを停止します.

Read more →

March 25, 2020

Redashでユーザーの最終アクセス日時を取得するクエリ

概要 Redashでユーザーの最終アクセス日時を取得する際のクエリ。 実行クエリ DISTINCT ON (users.name) users.name, events.created_at FROM events INNER JOIN users ON events.user_id = users.id WHERE events.created_at BETWEEN '2018-11-01 00:00:00' AND '2018-11-30 23:59:59' ORDER BY users.name, events.created_at DESC ## 結果 ----------------------+---------------------------- hoge1 hoge1 | 2018-11-14 04:49:48+00 fuga1 fuga1 | 2018-11-14 04:04:05.434+00 hoge2 hoge2 | 2018-11-14 01:26:17.407+00 fuga2 fuga2 | 2018-11-21 03:16:42.85+00

Read more →

March 25, 2020

Railsのアプリケーションを新規作成する

概要 MacOSを使っていて、初めてRails環境をセットアップしたいなとなった時ににやる手順です。 Rubyはバージョン切り替えにrbenvを使用しているので、あとからバージョン変更可能です。 データストアはsqliteではなく、本番でも使えいやすいようにMySQLを使用、ただしMySQLの実行はMacOSのbrewで起動できるものを採用しています。 環境 MacOS 10.14.2 brewが使える rbenvが使える Rubyは2.5.Xでやる Railsは5.2.0 rbenvでRubyバージョンを指定する brewで入れたMySQLを使う(MacでMySQLを動かす) 指定したバージョンのRubyをインストールする ruby-buildをアップグレードして最新のRubyをインストールできるようにする brew upgrade ruby-build rbenvで特定のRubyをインストールする rbenv install --list rbenv install 2.5.1 アプリケーションを作成するディレクトリへ移動して、Rubyのバージョンを指定する Railsをセットアップする bundlerをインストールする Gemfileを作成する(ここでRailsのバージョンを指定する) gem "rails" , '~> 5.2.0' bundlerを使ってRailsをインストールする bundle execでRailsのプロジェクトを作成する 残りのgemをインストールする もしbundle install時にmysql2でコケたら 下記を実行して、再度bundle installする MacでMySQLを起動する brew servicesを使ってMySQLを起動する(これは最初にやったほうが効率が良さそう) brew services start mysql DBを作成する DBを作成する productionのところでコケるかもだが、developmentとtestが作成されていればOK Railsを起動する ブラウザで http://localhost:3000 へアクセスする Yay! You’re on Rails!と表示されればOK. Git管理する .gitignoreを作成して(rails newで作成されていたらそれに追記する)vendor配下は除外する 下記を追記する vendor 参考サイト 新規Railsプロジェクトの作成手順まとめ - Qiita

Read more →

March 25, 2020

venvを使ってLambdaをデプロイするまでの手順

手順仮想環境をセット venvを有効化することで、pipのインストール先が指定した環境にインストールされるようになる。 $ source /opt/ここに環境名/bin/activate $ cd /var/www/lambda/ここに環境名 $ pip install -r requirements.txt $ zip -r zip_file ./* --region ap-northeast-1 \ --function-name function-name \ --zip-file fileb://{Path}xxx.zip \ --role arn:aws:iam::XXXXX:role/XXXXX \ --handler lambda_function.lambda_handler \ --runtime python3.7 \ --profile xxxxx\ --environment Variables="{VariableA=xxxx,VariableB=xxxxx}" 仮想環境を解除 その他 venvで有効化する前にグローバルでインストールしたライブラリは、仮想環境に切り替えたあとも共有で使える。 なので、共有で使いたいライブラリはグローバルにインストールして、共有で使いたくないものは仮想環境に切り替えてインストールする。

Read more →

March 25, 2020

Node.jsでパッケージ管理

ライブラリのインストール ライブラリをインストールして、package.jsonに書き込む 最初に下記package.jsonを用意する。 "dependencies": {} } --saveを使ってpackage.jsonへ書き込む そうするとdependenciesに追記される。 "dependencies": { "date-utils": "^1.2.21", "request": "^2.88.2" } }

Read more →

March 24, 2020

VSCodeチートシート自分用

移動 内容 キー ファイル選択(タブ切り替え) Cmd + Alt + カーソル(左右) 行頭へ移動 Cmd + カーソル(左) 行末へ移動 Cmd + カーソル(右) マルチカーソル 内容 キー マルチカーソル Cmd + Alt + カーソル

Read more →

March 22, 2020

RubyのGemのバージョンを固定する

背景 さくらのレンタルサーバーでメンテナンス後からサイトが表示されなくなってしまった。 調べてみるとどうやらjsonがおかしそう。 さくらの新しいレンタルサーバーではRubyの1.8と2.5が共存しており、2.5側でjson2.2がインストールされており、どうもそれを呼んで閉まっている様子。 思考錯誤した結果、下のようにGemfileっぽく、gemのバージョンを書いてあげると当該バージョンで動かせる。 古いサーバーから引っ越してにっちもさっちもいかなくなったら、下記を試すと良さそうです。 require 'json'

Read more →

March 17, 2020

RailsのproductionでActionViewTemplateError

エラー内容 stage環境などでは、そのままで大丈夫だが、productionではprecompileをしないとassetファイルがなくて、下記のようなエラーが出力される。(という解釈) 解決方法 下記rakeタスクでコンパイルする。 それでも解決しない場合、ENVでファイルをRailsから配信するように設定されている可能性があるので確認する。

Read more →

March 4, 2020

Terraformのバージョンアップ

バージョンアップ $ unzip /tmp/terraform_0.12.21_linux_amd64.zip $ sudo unlink /usr/local/bin/terraform $ sudo mv terraform /usr/local/bin/terraform_0.12.21 $ sudo ln -s /usr/local/bin/terraform_0.12.21 /usr/local/bin/terraform Terraform v0.12.21

Read more →

March 3, 2020

EBSのボリュームを別のインスタンスにアタッチして調査する手順

下記クラメソさんのブログを参考に。 https://dev.classmethod.jp/cloud/aws/ec2-investigate-detach-attach/ インスタンスを停止する。 volumeで対象のvolumeをデタッチする。 スナップショットを作成する。 おなじAZのインスタンスのインスタンスIDをメモる volumeから対象インスタンスへアタッチする アタッチしたインスタンスで確認する ボリュームをアタッチしたインスタンスで、アタッチされていることを確認。 lrwxrwxrwx 1 root root 7 2月 19 18:55 /dev/sdf -> nvme1n1 lrwxrwxrwx 1 root root 9 2月 19 18:55 /dev/sdf1 -> nvme1n1p1 lrwxrwxrwx 1 root root 11 2月 19 18:55 /dev/sdf128 -> nvme1n1p128 ディレクトリを作成する。 マウントを実施。 root@test-inrance:~# df -h ファイルシス サイズ 使用 残り 使用% マウント位置 devtmpfs 464M 0 464M 0% /dev tmpfs 481M 0 481M 0% /dev/shm tmpfs 481M 444K 481M 1% /run tmpfs 481M 0 481M 0% /sys/fs/cgroup /dev/nvme0n1p1 8.

Read more →

February 19, 2020

DebianのDockerでopenssh-serverをインストールして起動する

環境 Docker for Mac Debian-jessie インストール手順 下記をしないと Missing privilege separation directory: /run/sshd で怒られるのでDockerfileに下記を追記すると良い。 apt install openssh-server -y ssh-keygen -A mkdir -p /run/sshd /usr/sbin/sshd

Read more →

February 13, 2020

Debianでnokogiriのインストールに失敗する場合に必要なパッケージ

背景 nokogiriのインストール時にエラーになる場合、いくつかのパッケージが必要となる。 また、gemのmysqlでもエラーになる場合があり、今は default-libmysqlclient-dev が必要。 その辺をまとめたのが下記。 インストールするパッケージ 下記はDockerfileを想定しているので、DockerでなければRUNは不要。 build-essential \ default-libmysqlclient-dev \ liblzma-dev \ patch \ pkg-config \ ruby-dev \ zlib1g-dev \ && apt-get clean \ && rm -rf /var/lib/apt/lists/*

Read more →

February 12, 2020

AutoScalingの設定

手順 ベースとなるAMIを作成する 起動設定でスペック等を設定する(ユーザーデータで初期化処理、git pullで差分のダウンロードなどを設定する) AutoScalingグループを作成する スケーリングポリシーはCPU XX% 以上に設定 アクションは「必要に応じてインスタンスを追加または削除」 スケールインの無効化はいいえ モニタリング、通知は設定なしでもOK タグはデフォルトで付与するタグなので、タグで制御している場合は必須なので注意 スケジュールされたアクションはなし。(意図的に台数を減らす場合などに必要) ライフサイクルフックは、デプロイ処理やLambda処理を行う場合に使う

Read more →

February 7, 2020

AutoScalingの状態を確認するコマンド

コマンド --profile=プロファイル名 describe-auto-scaling-groups \ --auto-scaling-group-name 名前 \ --query "AutoScalingGroups[0].Instances[].{InstanceId:InstanceId,LifecycleState:LifecycleState}" \ --output text | \ sort

Read more →

February 7, 2020

GoogleAppsScriptで特定の列の値を検索する

背景 GASで特定の列を上からなめていって、特定の文字列に合致したらなにかの処理をしたい場合。 ソースコード var mySheet = SpreadsheetApp.getActiveSheet(); //最終行を取得 var lastRow = mySheet.getDataRange().getLastRow(); //検索キー var searchKey = '依頼する' //for文で最後の行まで実行する for(var i = 2; i <= lastRow; i++) { //ここでi行で10列目の値を取得 var statusValue = mySheet.getRange(i, 10).getValue(); //取得した値と検索キーが合致するかチェック if(statusValue == searchKey) { var actRng = mySheet.getRange(i, 10); //取得した値が検索キーと合致していれば変数をセットする break; //文字が合致したらここで終了する。複数データを考えるなら配列に入れたほうが吉 } } //検索セルから-1の位置の値を取得して変数へセットする var cel_M = actRng.offset(0, -1).getValue();

Read more →

January 31, 2020

CloudWatchLogsを手元で確認する

概要 CloudWatchLogsを手元で確認する方法です。 環境 MacOS 使うコマンド awslogs インストール手順 使い方 直近5分のログを表示 ロググループ一覧の取得 ストリーム一覧の取得 tail -f的にリアルタイムで見る

Read more →

January 27, 2020

DockerでUnicornを動かすのにログを標準出力する

概要 Dockerは標準出力にログを吐かないと、docker logsやECS等のマネージドにログを渡す事ができない。 手元で試す分にはDockerへbashをアタッチしてみればよいが、本番運用となるとそうもいかない。 unicornでログの出力先を指定している場合の対処方法を記録。 書き方 $stdout, $stderrがRubyの組み込み定数になっているので指定してあげればOK. pid File.expand_path('/var/www/hoge/unicorn.pid', app_path) - stderr_path File.expand_path('/var/www/hoge/logs/stderr.log', app_path) - stdout_path File.expand_path('/var/www/hoge/logs/stdout.log', app_path) + stderr_path = $stderr + stdout_path = $stdout

Read more →

January 27, 2020

Google Apps Scriptで文字列を検索する

概要 特定の文字列を検索して、その結果を取得したい場合 セルを返す var textFinder = mySheet.createTextFinder(searchKey); var allCel = textFinder.findAll(); var resCel = allCel[0].getA1Notation(); Logger.log(resCel); 返ってきた結果 参考URL https://developers.google.com/apps-script/reference/spreadsheet/text-finder#getCurrentMatch() https://qiita.com/wezardnet/items/210eafa0530ec0c4a2c7

Read more →

January 7, 2020

python-lambda-localを実行したらdisable_warnings

エラー内容 Traceback (most recent call last): File "/Users/NANKAnoUSER/.pyenv/versions/3.7.2/bin/python-lambda-local", line 6, in <module> from lambda_local import main File "/Users/NANKAnoUSER/.pyenv/versions/3.7.2/lib/python3.7/site-packages/lambda_local/__init__.py", line 12, in <module> from .main import run File "/Users/NANKAnoUSER/.pyenv/versions/3.7.2/lib/python3.7/site-packages/lambda_local/main.py", line 25, in <module> urllib3.disable_warnings() AttributeError: module 'botocore.vendored.requests.packages.urllib3' has no attribute 'disable_warnings' 対処方法

Read more →

December 24, 2019

Pythonで文字列マッチング

あいまい検索 >>> data = '相談' >>> if re.search('相', data): ... print('ok') ... ok 前方一致 >>> data = 'hoge' >>> if re.search('hoge', data): ... print('ok') ... ok 一致しないを条件に 前方一致 >>> data = 'hoge' >>> if not re.search('ho', data): ... print('match') ... else: ... print('not match') ... not match

Read more →

December 19, 2019

Pythonで今の時間を表示する

タイムゾーンがJSTだったら下記のみでOK now = datetime.datetime.now() print(now.strftime("%Y%m%d %H:%M:%S")) タイムゾーンがJSTじゃなければ下記で res = requests.get('https://ifconfig.me') JST = timezone(timedelta(hours=+9), 'JST') now = datetime.now(JST) print(now.strftime("%Y%m%d %H:%M:%S"))

Read more →

December 17, 2019

Alfredのアウトプット形式

アウトプット形式 Python(2.7.16) data = "{query}" result = json.dumps({ "items": [{ "title" : 'hoge', "arg" : data }]}) print result

Read more →

December 12, 2019

Pythonのワンライナー

for if >>> b = a[1] if len(a[0]) is 0 else a[0] >>> print(b) 500

Read more →

December 12, 2019

S3の特定ページをリダイレクトする

概要 hogehoge.com/testdayo を https://www.example.comへリダイレクトしたいみたいな要望があった場合の対応内容です。 手順 まず対象のパスにあるindex.htmlファイルからアクションを開きます。 上記対象ファイルを選択してアクションをクリック。 Website-Redirect-Locationを選択して、転送先URLを入力する。 これでOK。

Read more →

December 9, 2019

Pythonで複数の文字列に共通の変数をセットする

aもbもcも同じ値にする >>> print(a,b,c) 100 100 100 data01からdata20まで全てNoneにする ... x = str('data') + str("%02d" % i) ... exec("%s = None" % (x)) hoge01からhoge20まで全て1にする ... x = str('hoge') + str("%02d" % i) ... exec("%s = %d" % (x, 1))

Read more →

November 29, 2019

Pythonで文字列処理

文字の分割 下記のような変数があった場合。 splitで分割文字列を指定可能。また、分割した値はlistになる。 ['1,000円', '3,500円'] 文字列から不要な文字を削除する 単一の文字の場合はreplaceを使う。ただし、複数の条件指定ができないので、条件を羅列することになる。 >>> list = i.split(' 〜 ') >>> for i in list: ... text = i.replace(',', '') ... print(text) ... text2 = text.replace('円', '') ... print(text2) ... 1000円 1000 3500円 3500

Read more →

November 29, 2019

Ansibleでホスト名にローカルのIPアドレスを含める記述

概要 Ansibleを使っていて、ホスト名をセットしたい&自分のローカルIPアドレスを含めたいと思った時にセットする方法です。 内容 inventories app-prod-172-31-XX-XX.inamuu.com app-prod-172-31-XX-XX.inamuu.com [production:children] app [all:vars] host_env=production - name: set hostname in basic rule tags: base hostname: name="{{ host_roles }}-{{ env_short }}-{{ ansible_eth0.ipv4.address | regex_replace('\.', '-') }}.{{ domain }}"

Read more →

October 31, 2019

Pythonでファイルの処理

カレントディレクトリ取得 print(os.environ['HOME']) もしファイルが無かったら作成する f = open(path, 'w') f.write('0\n') f.close() ファイルの文字列呼び出し for row in f: id = row.strip()

Read more →

October 31, 2019

Ansibleでソースインストールを実行する

- name: Download XXX tags: XXX get_url: > url=http://XXX/XXX/XXX.tar.gz dest=/usr/local/src/XXX.tar.gz - name: Unarchive XXX tags: XXX unarchive: src=/usr/local/src/XXX.tar.gz dest=/usr/local/src/ copy=no - name: configure XXX tags: XXX shell: > {{ item }} chdir=/usr/local/src/XXX/ creates=/usr/sbin/XXX loop: - './configure --with-XXX' - make - make install - make samples - make config shellモジュールの creates を使って冪等性を担保する。

Read more →

September 16, 2019

Google Apps Scriptで別シートに追記するボタンを作る

スクリプト var sheet_copyFrom = SpreadsheetApp.getActiveSpreadsheet(); var sheet_copyTo = SpreadsheetApp.openById('コピー先スプレッドシートのファイルのID'); var sheet_copyFrom = sheet_copyFrom.getSheetByName('コピー元シート名'); var copyValue = sheet_copyFrom.getRange('A1:R1').getValues(); var targetRow = sheet_copyTo.getLastRow()+1; sheet_copyTo.getRange('A'+targetRow+':R'+targetRow).setValues(copyValue); Browser.msgBox("完了しました"); } ボタン 挿入 図形描画で適当なボタンを作る ボタンの右上の編集から「スクリプトを割り当て」で上記スクリプトの関数名(上記で言えば「myFunction」を割り当てる) その他 上記は行データになっているが、もし列データを縦横に入れ替えたい場合は TRANSPOSE という関数を使うことで、指定したセル範囲の縦横を入れ替えることが可能。 入れ替えたセルデータを上記ボタンでコピーすればOK.

Read more →

September 10, 2019

Pythonでbyte型を文字列型へ変更する

概要 下記のようなエラーが出た場合は、オブジェクトがバイト型になっている。 AttributeError: 'bytes' object has no attribute XXX 対策 decode()を使うとstring型になる。

Read more →

September 9, 2019

About

This is the about page.

Read more →

Documentation

This is a demo of the theme’s documentation layout. Hello, World! main.gopackage main import "fmt" func main() { fmt.Println("Hello, World!") }

Read more →