技術関連の覚書

案件でやったり自宅で試したことの覚書

awscliとlocalstack

AWSCLIとlocalstack

AWSのサービスを使うときに * バッチ処理などをshellやバッチファイルなどで処理したい時 * AWSを使ったサービスの単体テストでまずはローカルで試したい

そういった場合に使えるのがawscliとlocalstack

AWSCLI

awscliはコマンドラインAWSのサービスを操作するものでwindows,linux,macなどで使える。

使い方はAWS コマンドラインインターフェイス(CLI: AWSサービスを管理する統合ツール)| AWSからCLIリファレンスを見れば使い方があります(英語)。

localstack

localstackはローカルで起動できるAWSサービスのスタブです。

まずはawsの認証設定をします。

ローカルで動作しますが、AWSCLIで認証作業をするためダミーの認証設定が必要になります

aws configureコマンドでlocalstackのプロファイルを作成します

$ aws configure --profile localstack
AWS Access Key ID [None]: dummy
AWS Secret Access Key [None]: dummy
Default region name [None]: us-east-1
Default output format [None]: json

あとは、GitHub - localstack/localstack: 💻 A fully functional local AWS cloud stack. Develop and test your cloud & Serverless apps offline!からcloneして、プロジェクトルートでdocker-compose up -d を実行すれば使えます。

他の方法ではpythonがインストールしてある環境であれば、pip install localstackが最も簡単にインストールできます(とgithubページに書いてあります)

Powershellの使いみちまとめ(なにかやるごとにここに追記してく)

サーバーはLinuxでも開発はWindowsでやることが多く、設計後に設計書から自動でソースなどを起こすようなスクリプトPowershellで作る機会が増えてきたのでまとめることにする Pythonとかだと楽なんだろうなあ

ファイル操作

UTF8Bom無しでテキストを出力する

$encode = New-Object Systen.Text.UTF8Encoding $False
[System.IO.File]::WriteAllLines($outputfile, "出力テキスト", $encode)

$encodeを変えれば出力エンコードが変えられる テキストは$()で出力する関数から出力するようにすれば長いテキストも出力できる

※リダイレクトではUTF16になってしまう

関数で値を返す方法

Write-Output "テキスト"

関数からテキストを返す場合、Powershellにはreturnがないので、一度Write-Outputなどで出力させ、呼び出し元では$()で囲ってやる必要がある

function outText(){
    Write-Output("出力したいテキスト")
}

$(outText)

数値を文字列に変換したい場合は

[string]を使って文字列に変換する

function add($a, $b){
    $c = $a + $b
    Write-Output("演算:"+[string]$c)
    Write-Output("連結"+[string]$a + [string]$b)
}

add 100 200

演算:300
連結:100200

検索

grepっぽいもの

Select-String "検索したい文字列" ファイル名 Select-String -Pattern "正規表現" ファイル名

置換

"文字列".Replace("変えたい文字列","変更する文字列") "文字列" -Replace "正規表現","変える文字列" 正規表現の表し方は、.、\w+ エスケープ文字は\でなくなので、"をエスケープする場合は" .は0文字以上の文字列、は前のパターンの繰り返しなのでこの2つで任意の文字列になる。 \wは任意の単語、+で繰り返すので単語の羅列になる 囲み文字の注意点は、""(.*)"","`$1"にした場合、一番外側の""だけが置換されることになる "aaa","bbb"のようなCSV形式ならaaa","bbbと置換されてしまう

部分置換する場合、"(グループ).*","`$1"で()グループが取り出せる

PowershellでConfluenceの記事を取り出す(2)

実行権限によってスクリプトが実行できない場合はSet-ExecutionPolicyを実行して権限ポリシーを変更する(要管理者権限)

Set-ExecutionPolicy <実行ポリシー>

|実行ポリシー|| |Restricted|| |AllSigned|| |RemoteSigned|| |Unrestricted|| |Bypass||

デバッグ出力

$VerbosePreference = 'Continue' # Verbose On
# $VerbosePreference = 'SilentlyContinue' # Verbose Off

Write-Verbose("出力内容")

$VerbosePreference = 'Continue' を設定すると出力される この場合標準エラーに出力されるのでリダイレクトしても2を指定しない限りファイル出力されない

Pascal/Camel↔snake変換

camelCase→snake_case

$ret = ([regex]"[A-Z]").Replace($org, {"_"+$args[0].Groups[0].Value.ToUpper()})

PascalCaseの場合は先頭の大文字の部分に_が追加されるため先頭1文字を除去するか、1文字目を小文字にしてから変換する必要がある。

snake_case→camelCase

    $camel = ([regex]"_([a-z])").Replace($snake, {$args[0].Groups[1].Value.ToUpper()})

PascalCaseにする場合は先頭が小文字のままなので先頭を大文字に変更する。

カレントディレクトリを取得する

$pwd = (Convert-Path .)

実行パスに確実にファイルを保存したい場合などに必要な場合がある。 何も指定しない場合、C:\Users[ユーザーパス]\Documentsなどに保存される場合もある。

PowershellでConfluenceの記事を取り出す

ConfluencePSというモジュールをインポートすると使えるようになる。 実行するときは管理者権限が必要

Install-Module ConfluencePS
Update-Module ConfluencePS

使い方は

Import-Module ConfluencePS
Set-ConflenceInfo -BaseURI 'https://yourpage.atlassian.net/wiki' -PrompotCredentials

こうすると認証情報を入力するダイアログが出現してID、パスワードを入れるとConfluenceへのアクセスができるようになる。

Get-ConfluencePage -PageID xxxxxx

PageIDで指定したページ番号のQページ内容を取得できる。 これの内容を取り出すためにはどうしたらいいかが次の課題

intelliJでspringboot + myBatisを使ったシステム開発をするための準備

Spring initializr

OSUbuntu 20.04
IDEIntelliJ IDEA Community 2020.3 AMD64
ProjectGradle Project
LanguageKotlin
SpringBoot2.4.0
Project MetadataGroupcom.example.kotlin
Artifactmybatisdemo
Namemybatisdemo
DescriptionDemo project for Spring Boot
Package namecom.example.kotlin.mybatisdemo
Packagingjar
Java11
DependenciesMyBatis Framework
H2 Database

IntelliJにmyBatis Builderプラグインをインストール Shift連打(2回くらい早く押せばよいです)でmybatis builderを検索して実行 DBに接続する。

今回はPostgresqlなのでPostgresを選択して接続情報を入力

f:id:boctok-ctpoba:20201210020028p:plain
MyBatis Builderの設定

f:id:boctok-ctpoba:20201210015704p:plain
MyBatis BuilderでMapperクラスをジェネレートする

f:id:boctok-ctpoba:20210104133555p:plain
MyBatis Builderのパラメータ設定
f:id:boctok-ctpoba:20210104133651p:plain
配置や生成物などを設定する

生成されるもの 生成されるものはxmlの設定ファイルとJavaソースコードになる。 XMLファイルはmybatis-generator.xml Mapperクラス、モデルクラス、Exapmleクラス、Exampleクラスの中にCriteria、Criterion、CeneratedCriteriaクラスが生成される。 名前は テーブル名Mapper、テーブル名、テーブル名Exampleになる。

powershellを使ったExcelの操作

使いどころ

未だにExcelによる申請書とかが多く、マクロ作るのが権限的にできなかったり他のソフト(rubyとかPythonとか)をインストールできない現場で苦肉の策としてPowershellを使って動かすことになったのでメモ。 Powershellも権限的にスクリプトファイルを実行できない場合もあるけど、最悪でもテキストを流し込んで実行できるのでメモ。

powershellの基本的な出力
Write-Output("リダイレクトするとファイルに出力される")
Write-Host("リダイレクトしてもファイルに出力されない")
スクリプト実行権限ポリシーの変更

powershellで以下を実行

Set-ExecutionPolicy RemoteSigned
ExcelBookのオープンクローズ

Excelオブジェクトの作成

$excel = New-Object -ComObject Excel.Application

実行するExcelの可視化設定

$excel.Visible = $false

Excel Bookのオープン

$xlsxBook = $excel.Workbooks.Open($xlsxName)

Excelのクローズ

# ブックを閉じる
$xlsxBook.Close()
# Excelオブジェクトの終了
$excel.Quit()
# インスタンスの削除
$excel = $null

シートの取得

$sheet = xlsxBook.Worksheets
$xSheet = $sheet.Item("シート名")

シート名、インデックス

Write-Host($xSheet.Name)
Write-Host($xSheet.Index)

セルの値

$cVal = $xSheet.Range("A2").Text
$cVal = $xSheet.Cells(2, 1).Text

Springboot+kotlinでgRPCを動かすための準備

https://start.spring.io/

f:id:boctok-ctpoba:20201110183932p:plain
Spring Initializrの設定内容

qiitaやブログを観るとSpring web starterをdependenciesに追加するように書いてあるけど、なかったのでSpring Webを追加。

追加した内容

build.gradle.kts

import を2個追加

import com.google.protobuf.gradle.*
import org.gradle.kotlin.dsl.provider.gradleKotlinDslOf

pluginsに追加

   id("com.google.protobuf") version "0.8.8"

sourceSetsを追加 ここに自動生成したコードを出力する

sourceSets{
    create("kotlingrpc"){
        proto{
            srcDir("src/main/kotlin/protobuf")
        }
    }
}

dependenciesに追加 protobuf-gradle-pluginにある examples/exampleKotlinDslProject/build.gradle.kts を参照して追加。 元はcompileを使用しているが、非推奨なのでimplementationに変更

   implementation("com.google.protobuf:protobuf-java:3.6.1")
    implementation("io.grpc:grpc-stub:1.15.1")
    implementation("io.grpc:grpc-protobuf:1.15.1")

protobufを追加

protobuf{
    protoc{
        artifact = "com.google.protobuf:protoc:3.6.1"
    }
    plugins{
        id("grpc"){
            artifact = "io.grpc:protoc-gen-grpc-java:1.15.1"
        }
    }
    generateProtoTasks{
        ofSourceSet("main").forEach{
            it.plugins{
                id("grpc")
            }
        }
    }
}

これだけ設定すれば後は./gradlew generateProto を実行すればコードを生成してくれるはず。

gradlewの実行 IntelliJのターミナルから実行したけど、OSのターミナルからでも同じ。 Windowsの場合はgradlew.bat を実行する 順番は、generateProto、compileKotlinの順

protoファイルを別途管理

protoファイル管理プロジェクトを作成する タグ付けする protodep.tomlファイルを作る protodepを実行

user@localhost:~/IdeaProjects/kotlingrpc$ ./gradlew generateProto
Starting a Gradle Daemon, 1 busy and 1 incompatible Daemons could not be reused, use --status for details

Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/6.6.1/userguide/command_line_interface.html#sec:command_line_warnings

BUILD SUCCESSFUL in 4s
3 actionable tasks: 1 executed, 2 up-to-date
user@localhost:~/IdeaProjects/kotlingrpc$ ./gradle compileKotlin
bash: ./gradle: ディレクトリです
masataka@akagi:~/IdeaProjects/kotlingrpc$ ./gradlew compileKotlin
Starting a Gradle Daemon, 1 busy Daemon could not be reused, use --status for details

Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/6.6.1/userguide/command_line_interface.html#sec:command_line_warnings

BUILD SUCCESSFUL in 4s
4 actionable tasks: 4 up-to-date
user@localhost:~/IdeaProjects/kotlingrpc$