技術関連の覚書

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

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$ 

herokuでwebアプリを作る

herokuとは

PaaS=Platform as a Service Webアプリケーションを動かすためのサーバーやDB環境などが既に用意されていて、heroku gitを利用することで、アプリケーションを作成してgitにpushするだけでデプロイまでしてくれる。

無料でも1万行までのDBの利用やheroku gitでのCI/CDができるサービスなので学習用にも十分に使えるサービス。

準備
  1. herokuへの登録

  2. heroku CLIをインストールする

Command Line | Heroku Dev Center でheroku CLIをインストールする。

herokuアプリを作る
  1. 最初にローカルgitリポジトリを作ってcommitまでしておく

  2. heroku cli でheroku上にアプリを作成する

  3. herokuのリポジトリにpushする

  4. アプリを起動する

mkdir herokuapp
cd herokuapp
git init
git add .
git commit -m "first commit"
heroku create -a herokuapp
git push heroku master
heroku open

以後はmasterにpushするとビルドしてデプロイまで行ってくれる。 gradleの設定などにより、テストも行うことができる。 heroku上のgitでデプロイ管理する際は開発中はdevelopなどのブランチで開発し、masterにmergeしてデプロイするようにする。

アプリの削除

heroku apps:destroy -a アプリ名 で削除する。この場合は確認のためにアプリ名の入力が求められる。 heroku apps:destroy -a --confirm アプリ名 と打つと確認を求められない。

heroku apps:destroy -a obscure-peak-42849
 ▸    WARNING: This will delete ⬢ obscure-peak-42849 including
 ▸    all add-ons.
 ▸    To proceed, type obscure-peak-42849 or re-run this
 ▸    command with --confirm obscure-peak-42849

> obscure-peak-42849
Destroying ⬢ obscure-peak-42849 (including all add-ons)... done