- Heroku
- Heroku 初期手順
-
Heroku Toolbeltインストール Herokuを操作・管理できるツール https://devcenter.heroku.com/articles/heroku-cli
-
コマンドプロンプトで heroku login 必要に応じてuser、passwordを入力
-
ひな形アプリ取得
git clone https://github.com/heroku/java-getting-started.git my_first_app -
アプリ作成
heroku create -
アプリpush
git push heroku master-
エラー
To https://git.heroku.com/[applicationname].git ! [rejected] master -> master (non-fast-forward) error: failed to push some refs to 'https://git.heroku.com/[applicationname].git' hint: Updates were rejected because the tip of your current branch is behind hint: its remote counterpart. Integrate the remote changes (e.g. hint: 'git pull ...') before pushing again. hint: See the 'Note about fast-forwards' in 'git push --help' for details.リビジョンが戻ってる場合に出る。
分かった上で強制的にpushする場合は以下。git push heroku master --force
-
-
アプリを開く
ブラウザでpushしたアプリが開く。heroku open
-
- 引っかかった所
-
何回やっても以下エラーが出る。
Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 90 seconds of launch- application.ymlのポート指定をしてなかった。
サンプルアプリを参考に以下を設定。server: port: ${PORT:5000} - アドレスを指定してた。
以下設定を削除。server: address: 127.0.0.1
- application.ymlのポート指定をしてなかった。
-
- Heroku 初期手順
2019年8月18日日曜日
Heroku(途中)
2019年6月5日水曜日
powershell デジタル署名されていません
経緯
-
別の場所で書いたps1をメール(webmail)で送り、それを家でダウンロードして実行したらエラーが出た。
PS C:\WINDOWS\system32> C:\work\test.ps1 ファイル C:\work\work\test.ps1 を読み込めません。 ファイル C:\work\work\test.ps1 はデジタル署名されていません。 このスクリプトは現在のシステムでは実行できません。 スクリプトの実行および実行ポリシーの設定の詳細については、 「about_Execution_Policies」 (https://go.microsoft.com/fwlink/?LinkID=135170) を参照してください。 + CategoryInfo : セキュリティ エラー: (: ) []、ParentContainsErrorRecordException + FullyQualifiedErrorId : UnauthorizedAccesspowershellの実行ポリシーで、インターネットからダウンロードしたスクリプトの実行が禁止されている。
なんでも実行できるポリシーに変更することもできるが
そもそも問題ないファイルだということが分かっているので
ファイル自体の実行を許可する方法をとった。
ps1を右クリックして、[プロパティ]の以下項目にチェックを入れるだけ。
2019年5月27日月曜日
RestAPIでredmineのチケット起票
経緯
ファイルサーバのディスク容量が切迫した時にアラートを通知する仕組みが必要になった。
社内環境であり、通知されて見る可能性があるのが
- メール
- Redmine
だけだった。
メール通知は社内のハードルが高かったのと、Redmineがrest apiでチケット発行できて
簡単だったのでRedmineに通知する方式を採用。
タイトルと説明だけ変えられるようにしていてそれ以外は固定。
コード
Param(
[String]$title = "タイトル",
[String]$desc = "説明",
[String]$logFilePath = ".\Redminerest.log"
)
$postUri = "http://[Redmineurl]/issues.json"
# JSONパラメータ内容改修
$issue = @{
project_id = "1"; # プロジェクトID
tracker_id = "22"; # トラッカーID
subject = $title; # タイトル
assigned_to_id = "333"; # 担当者 ユーザID or グループID
description = $desc.Replace("\r\n","`n") # 説明
}
$issueJson = @{issue = $issue; key = "アクセスキー"}
# 書き換えたパラメータをjson形式に戻す
$postText = ConvertTo-Json $issueJson
#body部(json)変換
$postBody = [Text.Encoding]::UTF8.GetBytes($postText)
#Rest実行
$Redmine = Invoke-RestMethod -Method POST -Uri $postUri -Body $postBody -ContentType application/json
echo " 発行されたRedmineのid:" + $Redmine.issue.id >> $logFilePath
注意点
-
各ID取得方法
Redmineから一覧を取得して使用するIDを探す
ID URL プロジェクトID http://[Redmineurl]/projects.xml トラッカーID http://[Redmineurl]/trackers.xml ユーザID http://[Redmineurl]/users.xml グループID http://[Redmineurl]/groups.xml ※ 対象が多すぎると途中で切られる。取得する必要がある場合はパラメータを付ける。
-
例) ユーザID200件
http://[Redmineurl]/users.xml?limit=200
-
-
アクセスキーの取得方法
- 個人設定画面を開く
- 右側のサイドバー内「APIアクセスキー」欄の「表示」をクリック
-
APIを有効にする方法
- [管理]→[設定]画面の[API]タブ
(Redmine 3.1以前の場合は[認証]タブ)を開く - [RESTによるWebサービスを有効にする]をONにする
- [保存]ボタンをクリックして設定内容保存
- [管理]→[設定]画面の[API]タブ
ひっかかったこと
-
assigned_to_idについて
ユーザidをassigned_to_idに入れて実行すると
そのユーザが担当者に指定されたチケットが発行されることが確認できた。
では、グループを指定したい場合はどのキーに指定すればよいのかと疑問に思い
調査してもいまいち回答にたどり着けずにとりあえず試した結果
assigned_to_idに入れるのが正解だった。
ユーザidとグループidは通しの連番が設定される模様。
参考
http://Redmine.jp/glossary/r/rest-api/2019年5月7日火曜日
chocolateyメモ
新しい端末に色々とソフトを入れていくのが面倒だったので使用。
概要
- Windows OS向けのパッケージマネジャー
- ソフトウェアのダウンロード・インストール・アップデート・アンインストールをコマンドで行う
- 新しい端末を構築する時など、各サイトを回って最新のインストーラをダウンロードして・・・ってことをしなくて済む
使い方
※勉強中なのでpowershellで実施
-
chocolateyのインストール
# chocolateyのinstall.ps1をダウンロードして、中のスクリプトを実行する Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1')) # -Scope Process : 現在のセッション(プロセス)が対象 # -Force : 強制的に実行 # iex : Invoke-Expressionのエイリアス # 以降の文字列をコマンドとして実行 -
ソフトウェアのインストール
-
サクラエディタ
cinst sakuraeditor # choco install のエイリアス -
7zip
cinst 7zip -
WinMerge
cinst winmerge -
まとめてインストール
cinst sakuraeditor 7zip winmerge # 後ろにパッケージ名を繋げていけばよい
-
-
インストールしたソフトウェアパッケージのアップデート
- 全パッケージアップデートcup all # choco updateのエイリアス
- 特定のパッケージのみアップデート(ここではWinMerge)cup winmerge
- 全パッケージアップデート
-
アンインストール
- アンインストール(ここではWinMerge)cuninst winmerge # choso uninstallのエイリアス
- アンインストール(ここではWinMerge)
-
ソフトウェアパッケージ一覧表示
-
chocolateyリポジトリ上
clist # choso listのエイリアス -
ローカル
clist -lo
-
その他
-
chocolateyパッケージ一覧ページ
2019年4月29日月曜日
powershellメモ
まだ整理しきれてないことをBloggerためしがてらとりあえずメモ
基礎的なこと
-
$_
パイプラインに渡されたオブジェクトを指す。
#ps結果でNameが"powershell"のオブジェクトを出力 ps | Where-Object {$_.Name -eq "powershell"} -
%
-
ForEach-Objectのエイリアス
例は後述 -
割り算の余り
10 % 3 #1
-
-
@
-
配列
$arr = @("aaa","bbb","ccc") $arr[1] # bbb $arr.Count # 3 $arr += "ccc" # 配列に追加 $arr.Count # 4 -
連想配列
$map = @{key1="aaa"; key2="bbb"; key3="ccc"} $map.key2 # bbb $map.Add("key4","ddd") # 追加 $map["key4"] # "ddd" $map["key3"] = "eee" # 変更 $map["key3"] # eee $map.Count # 4 $map.Remove("key2") # 削除 $map.Count # 3 $map["key2"] = "fff" # これでも追加される $map.Count # 4 -
ヒアドキュメント(複数行のテキストを1つの文字列に)
$var = "です" #変数が展開され、1行目が"1行目です"になる $message = @" 1行目$var 2行目 "@ #変数が展開されず、1行目が"1行目$var"になる $message = @' 1行目$var 2行目 '@
-
-
例外処理
-
例外処理(キャッチされない)
powershellコマンドのエラーは標準エラー出力に出るが、何もしないとキャッチできない。
try{ Move-Item "aaaaa" "bbbbb" }catch{ # キャッチしない Write-Error("エラーをキャッチしました:"+$_.Exception) }finally{ Write-Output "終了" } -
例外処理(キャッチされる)
キャッチしたい場合は、-ErrorAction Stopオプションを付ける。
ただ標準エラー出力に出ないので、$_.Exceptionで出す。try{ Move-Item "aaaaa" "bbbbb" -ErrorAction Stop }catch{ Write-Error("エラーをキャッチしました:"+$_.Exception) }finally{ Write-Output "終了" } -
例外処理(exe)
pingなど、個別のexeが動く場合は、$LASTEXITCODEを見てエラーを投げる。
try{ ping 111.222.333.444 if($LASTEXITCODE -ne 0){ throw } }catch{ Write-Error("エラーをキャッチしました:"+$_.Exception) }finally{ Write-Output "終了" }
-
-
関数
-
引数
参照渡しの場合は変数の前に[ref]を付ける。関数内では.valueをつけて処理する。
# 通常 function convertFileNameNormal { Param( $fileName ) $fileName = "bbbb" } # 参照渡し function convertFileNameRef { Param( $fileName ) $fileName.value = "cccc" # 参照渡しされた変数の書き換え $fileName = "dddd" # 書き換わらない } $filename = "aaaa" convertFileNameNormal($filename) # 通常呼び出し echo ("1:[" + $filename + "]") # 1:[aaaa] 変わらず convertFileNameRef([ref]$filename) # 参照渡し echo ("2:[" + $filename + "]") # 2:[cccc] 変わる。 -
戻り値
関数の戻り値は、標準出力も含めて全て返ってくる。
returnしたものだけではない。
個別に返して欲しい場合は参照渡しのほうがマシ。function returntest { Write-Output "1個目" echo "2個目" return "3個目" } $ret = returntest echo ("結果:"+$ret) # 結果:1個目 2個目 3個目
-
-
よく使うエイリアス
コマンド エイリアス Select-Object select Select-String sls Where-Object Where
?ForEach-Object % Out-String -Stream oss #エイリアス一覧 Get-Item Alias: Get-Item Alias: | oss | sls "Select-String"
疑問・ひっかかったこと
-
PowerShell ISE
PowerShell ISEで試しに書いたコマンドを実行したら、コンソールにコマンドも出力された
- ファイルを保存しないで「無題.ps1」のままだとそうなる。
ファイルを保存してから実行すれば出ない。
- ファイルを保存しないで「無題.ps1」のままだとそうなる。
-
なぜだめなのかわからなかったケース
#「式は、パイプラインの最初の要素としてのみ許可されます。」のエラー "aaaaa,bbbb" | $_-split(",")[0]要は、複数要素が渡された時に処理できないからダメ。
# これはOK "aaaaa,bbbb" | %{ $_-split(",")[0] } -
split等の演算子について
文字列分割する方法が複数ある
$str = "aaaa,bbbb" #1 $str | %{$_ -split(",")} #2 $str.split(",")こう書かれると、先頭の要素を取得したい時にこう書きたくなる
#1 $str | %{$_ -split(",")[0]} #2 $str.split(",")[0]しかし、#1は目的の結果が得られない。理由は -split が演算子だから。
-
#1
演算子
-eqとか-matchとかと一緒 -
#2
.NETのメソッド
混同しないためにもカッコを付けないほうがいい
$str | %{$_ -split "," } $str | %{ @($_ -split ",")[0] } #先頭の要素 -
-
Select-Stringされない
Remove-Itemのエイリアスを探そうとしてこう書いたが、何も出力されなかった。
Get-Item Alias: | sls "Remove-Item"これはGet-Itemでパイプラインに渡される内容が単純な文字列でないから。
Get-Item Alias: | oss | sls "Remove-Item" # oss: Output-String -Streamこれで目的の結果が得られた。
Output-Stringで出力結果を文字列に変換することができる。
-Streamを入れることで1行ずつ配列に入れてくれる。
パイプラインはどのような形で渡されるか意識することが大事。 -
Test-Pathについて
ファイルの存在チェックでTest-Pathを使用した時に
確実に存在するのにfalseが返却されたケースがあった。
理由は、そのファイル名に "[111-222]" のような文字が入っていて
それを正規表現として解釈してしまったため。
ファイル名に正規表現として解釈されそうな文字が確実に入らないことが分かっている場合以外は
-LiteralPath をつけたほうがよい。if(!(Test-Path -LiteralPath $srcfile ) ){ Move-Item $srcfile $dstfile }
使用したコマンドメモ
-
ps結果でNameが"powershell"のオブジェクトを出力
ps | Where-Object {$_.Name -eq "powershell"} ps | Where {$_.Name -eq "powershell"} # 簡易表記 ps | ? Name -eq "powershell" # 簡易表記 -
ネットワークドライブ接続
# ユーザー名・パスワード入力 $Credential = Get-Credential # ネットワークドライブ接続 New-PSDrive -Name "Z" -PSProvider FIleSystem -Root "\\192.0.0.1\c$" -Credential $Credential # スクリプト内でのみ有効 # -Persist を付けると永続的に有効になる # 使用しているドライプ一覧表示 Get-PSDrive -
grep
Select-String "searchString" -Path *.csv # 検索文字列が日本語の場合、「-Encoding default」を付ける -
システム種類(32/64bit)判別
if( $Env:PROCESSOR_ARCHITECTURE -eq "AMD64" ){ # 64bit }else{ #32bit } -
tail
Get-Content .\test.txt -Wait -Tail 1 -
tail結果を"aaaa"で検索し、カンマで分割した個数が2より大きい場合に、カンマで分割した要素の0番目と1番目をスペースで連結して出力
Get-Content .\test.txt -Wait -Tail 1 | Select-String "aaaa" | ?{ @($_-split(",")).Length -gt 2 } | %{$($_-split(","))[0] + " " + $($_-split(","))[1] } -
20日前以降の更新日時のファイル検索
dir | where { $_.LastWriteTime -ge ((get-date).AddDays(-20)).ToString("yyyy/mm/dd") } -
ファイルリストの先頭10行
dir | select -first 10 -
ファイル名に"(1)"が入ったファイル・フォルダを削除
dir -Recurse "*(1)*" | Remove-Item -recurse -force -
全プロパティ出力
ps | select -Property * ps | where {$_.Name -eq "powershell"} | select -property * -
横並びの結果をリスト表示(Format-List ( エイリアス:fl ))
PS C:\work> ps | ? Name -eq "powershell" | select -First 1 Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName ------- ------ ----- ----- ------ -- -- ----------- 864 32 131944 149296 1.84 23500 1 powershellPS C:\work> ps | ? Name -eq "powershell" | select -First 1 | fl Id : 23500 Handles : 907 CPU : 1.84375 SI : 1 Name : powershellPS C:\work> ps | ? Name -eq "powershell" | select -First 1 | fl * Name : powershell Id : 23500 PriorityClass : Normal FileVersion : 10.0.17134.765 (WinBuild.160101.0800) HandleCount : 939 ... #以降、全部出る -
json読み込み
{ name:"test", id:"12345", array:[ { name:"test1", id:"id1" }, { name:"test2", id:"id2" } ] }PS C:\work> $json = cat "C:\work\test.json" | ConvertFrom-Json PS C:\work> $json.name test PS C:\work> $json.array[1].id id2 -
jsonに変換
$testchild3 = @{ testchild3_1 = "3_1" } $testchild2 = @{ testchild2_1 = "2_1" testchild2_2 = $testchild3 } $testchild1 = @{ testchild1_1 = "1_1" testchild1_2 = $testchild2 } $test = @{ item1 = "1" item2 = $testchild1 } ConvertTo-Json $test{ "item1": "1", "item2": { "testchild1_1": "1_1", "testchild1_2": { "testchild2_1": "2_1", "testchild2_2": "System.Collections.Hashtable" } } }展開される深さが決まっている(デフォルト:2)なので"testchild2_2"が展開されない。
展開したい場合は「-Depth 数値」を付ける。今回の例では「-Depth 3」。 -
フォルダ判定
# PSIsContainer # 例)C:\WORK以下でフォルダでないものをget # 判定の否定は ! Get-ChildItem -Recurse "C:\WORK" | ? { ! $_.PSIsContainer } # PathType if( Test-Path "C:\work" -PathType Container){ echo "フォルダです" } -
ファイル・フォルダ操作
-
ファイルパスからファイルオブジェクト取得
Get-Item -Path "c:\work.test.log" -
ファイル移動
Move-Item "旧パス" "新パス" -
フォルダ作成
if(!(Test-Path "フォルダパス")){ New-Item "フォルダパス" -ItemType Directory # 複数階層でもOK } -
フォルダ削除
Remove-Item "フォルダパス" -Recurse
-
-
ログ出力
# Start-Transcript、Stop-Transcript # すべてのコマンド、およびコンソールに表示されるすべての出力を取得 # コンソールに出しつつ、ログも出したい時はこれが楽 # 複数スクリプトで同じファイルが指定された場合は先勝ち(エラーにならない・・・) Start-Transcript c:\work\powershell.log -append date Stop-Transcript# Tee-Object # 追記モードがない! date | Tee-Object -FilePath test.log -
ハッシュ取得
Get-FileHash -Path "C:\work\test.log" -Algorithm "SHA512" Algorithm Hash Path --------- ---- ---- SHA512 6AAFB3E... C:\work\test.log -
パス取得
# フルパスから親フォルダ取得 Split-Path "C:\work\test.log" -Parent # C:\work # フルパスからファイル名・フォルダ名取得 Split-Path "C:\work\test.log" -Leaf # test.log Split-Path "C:\work" -Leaf # work # 相対パス取得 cd "c:\work" Resolve-Path "c:\test\exam\sum.ps1" -Relative # ..\test\exam\sum.ps1 -
自分(シェル)の格納場所に移動
cd (Split-Path -Parent ($MyInvocation.MyCommand.Path)) -
スリープ
Start-Sleep 5 # デフォルトは秒 Start-Sleep -Milliseconds 100 # 100ミリ秒
katalon studio 画面が静的になるまで待つ?smart waitという機能がある。これがあると入力動作が遅くなる。 停止方法 プロジェクト全体の設定 [Project]-[Settings]-[Execution]-[WebUI] 、一番上の [Default Sma...
-
まだ整理しきれてないことをBloggerためしがてらとりあえずメモ 基礎的なこと $_ パイプラインに渡されたオブジェクトを指す。 #ps結果でNameが"powershell"のオブジェクトを出力 ps | Where-Object { $_...
-
経緯 別の場所で書いたps1をメール(webmail)で送り、それを家でダウンロードして実行したらエラーが出た。 PS C:\WINDOWS\system32> C:\work\test.ps1 ファイル C:\work\work\test.ps1 を読み込めません...
-
経緯 ファイルサーバのディスク容量が切迫した時にアラートを通知する仕組みが必要になった。 社内環境であり、通知されて見る可能性があるのが メール Redmine だけだった。 メール通知は社内のハードルが高かったのと、Redmineがrest apiでチケット発行...