F1大好きな、インチキ技術者の日記

F1大好きなインチキ技術者が情報を発信して、自分を変えようとしている日記です

コマンドラインからWindows Terminalを好きな分割ペインで起動する

好きな形でWindows Terminalを起動したい

最近、Windows Terminalがとてもいい感じで気に入っています。

サーバーがいくつもあるので、一気にログインしたりできるようにペインを分割して起動できる機能がとても便利です。

例えば、以下のように4分割した状態で起動したい!なんてこともできます。

f:id:hanamiche:20210412185538p:plain
4分割のWindows Terminal

4分割のコマンドラインは以下の通りです。DOSプロンプトで実行します。

wt.exe split-pane -V; move-focus left; split-pane -H; move-focus right; split-pane -H

ポイントは、 move-focus left;move-focus right; です。 これがないと、きれいに4分割されず、以下のようになります。

f:id:hanamiche:20210412190043p:plain
きれいに分割できなかった・・・Windows Terminal

手動でCentOS7のcurlをバージョンアップしたら証明書エラーになったので対応した

はじめに

CentOS 7を使っているのですが、curlのバージョンが古いため、 curl: option --data-raw: is unknown なんていわれました。 というわけでcurlをバージョンアップすることにしました。

ダウンロード

公式サイトからリンクがある、GitHubリポジトリから実行ファイルをダウンロードしました。 curl.se

RHEL7用のrpmもあったのですが、実行ファイルだけ置き換えられれば、簡単じゃん。と思っていました。 github.com

インストール

インストールは簡単です。 念のため /usr/bin/curl をバックアップし、そこに新しいバージョンをコピーしました。

  • コピー前
$ curl --version
curl 7.29.0 (x86_64-redhat-linux-gnu) libcurl/7.29.0 NSS/3.53.1 zlib/1.2.7 libidn/1.28 libssh2/1.8.0
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp scp sftp smtp smtps telnet tftp
Features: AsynchDNS GSS-Negotiate IDN IPv6 Largefile NTLM NTLM_WB SSL libz unix-sockets
  • コピー後
$ curl -V
curl 7.76.0 (x86_64-pc-linux-musl) libcurl/7.76.0 OpenSSL/1.1.1k zlib/1.2.11 libssh2/1.9.0 nghttp2/1.41.0
Release-Date: 2021-03-31
Protocols: dict file ftp ftps gopher gophers http https imap imaps mqtt pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp
Features: alt-svc AsynchDNS HTTP2 HTTPS-proxy IPv6 Largefile libz NTLM NTLM_WB SSL TLS-SRP UnixSockets

使ってみたらエラーになった

まずは動作確認をするために、ブログにアクセスしたところ証明書関係のエラーになりました。

$ curl https://hanamiche.hatenablog.jp/
curl: (77) error setting certificate verify locations:  CAfile: /etc/ssl/certs/ca-certificates.crt CApath: none

少し調べると同じような問題の解決方法が見つかりました。 証明書は各ディストリビューションごとに異なっています、見落としていました。 github.com

シンボリックリンクを作り対応

rpmを使うことも頭をよぎりましたが、せっかくなのでシンボリックリンクで対応することにしました。

$ sudo ln -s /etc/ssl/certs/ca-bundle.crt /etc/ssl/certs/ca-certificates.crt

実行できた

証明書の準備が整ったところで、再度実行したら問題なく実行できました! 問題の発端である --data-raw オプションも問題なく動作しました。

$ curl https://hanamiche.hatenablog.jp/ --data-raw 'test=1'
<!DOCTYPE html>
<html
  lang="ja"

data-admin-domain="//blog.hatena.ne.jp"
data-admin-origin="https://blog.hatena.ne.jp"
data-author="hanamiche"
data-avail-langs="ja en"
data-blog="hanamiche.hatenablog.jp"
data-blog-host="hanamiche.hatenablog.jp"
data-blog-is-public="1"
data-blog-name="F1大好きな、インチキ技術者の日記"

Amazon SageMakerのエンドポイントを無料利用枠で使えるようにしてもらった

おさらい

前回は、m5.xlarge が利用できないため、エンドポイントは無料枠適用できず、支払いが発生してしまいました。 hanamiche.hatenablog.jp

m5.xlarge を使えるようにサポートに依頼

AWSのサポートのページから、要望を行うことで制限を解除してもらえます。 https://console.aws.amazon.com/support/home#/

私は以下のように、正直に申請しました😁

制限緩和のリクエスト 1
サービス: SageMaker Endpoints
リージョン: Asia Pacific (Tokyo)
リソースタイプ: SageMaker Hosting
制限の名前: ml.m5.xlarge
申請する上限数: 1
--
申請理由の説明: SageMakerエンドポイントを無料利用枠で利用したいため、制限の緩和をお願いします。
エンドポイントを以下の無料利用枠で利用したかったのですが作成でませんでした。

サポートからの回答後、m5.xlarge が利用可能に!

1日ほど待つと、サポートの方から「制限解除しました」と連絡がありましたので、さっそくエンドポイントをm5.xlarge で作成したら、無事に作成できました😃

f:id:hanamiche:20210330154921p:plain
m5.xlarge でエンドポイントが作成できた

エンドポイントの停止?

無事に無料枠で使えるようになりましたが、無料利用枠には限りがあります。 エンドポイントの停止はできないようですので、エンドポイントを削除しておく必要がありそうです。

エンドポイントの設定が残っているので、都度エンドポイントを作成するのがお財布には優しそうです。 ただし、エンドポイントの作成には時間がかかるのがネックですね。ほかに方法はないのでしょうか・・・😥

Amazon SageMakerで無料利用枠が使えず意図しない支払いが発生してしまった

SageMakerを使ってみたい

ディープラーニングの勉強を始めていますが、目標をがないとモチベーションが上がらないので、AWS Certified Machine Learning - Specialty(MLS-C01)取得をはじめの目標にしました。 というわけで、SageMakerを初めて使ってみました。

SageMakerの無料利用枠

利用開始して最初の2ヶ月間は1ヶ月あたり以下の無料枠があります。有効活用したいと思っていました。

機能 最初の 2 か月間は 1 か月あたりの無料利用枠を利用可能
Amazon SageMaker Studio ノートブック、オンデマンドノートブックインスタンス tudio ノートブックで 250 時間の ml.t3.medium インスタンス、またはオンデマンドノートブックインスタンスで 250 時間 の ml.t2 medium インスタンスまたは ml.t3.medium インスタンス
レーニン 50 時間の m4.xlarge または m5.xlarge インスタンス
推論 125 時間の m4.xlarge または m5.xlarge インスタンス

aws.amazon.com

推論のインスタンスでm4.xlarge も m5.xlarge も使えない・・・

とりあえず、右も左もわからずにSageMaker Studioを起動し、学習済みのモデルをデプロイしようとしたのですがデフォルトのマシンタイプが m5.large になっていて無料枠の対象ではなかったので m5.xlarge を選択してデプロイを行ったらエラーが発生しました。

Something went wrong

We encountered an error while preparing to deploy your endpoint. You can get more details below.

An error occurred (ResourceLimitExceeded) when calling the CreateEndpoint operation: The account-level service limit 'ml.m5.xlarge for endpoint usage' is 0 Instances, with current utilization of 0 Instances and a request delta of 1 Instances. Please contact AWS support to request an increase for this limit.

どうやら m5.xlarge インスタンスは一つも作れないように制限がかかっているようでした。 仕方なく、m5.large でデプロイして利用してみましたがきちんと支払いにカウントされていました😅

エラーの原因と対応

エラーの内容を調べると対応策がわかってきました。

  • 新しく作ったアカウントはSageMaker標準の制限ではなく、より厳しい制限がある。 なおリンク先ではすべて0との記載があるが m5.large は作成できた。 github.com
  • m5.xlarge を利用するにはAWSのサポートに依頼し制限を解除してもらう必要あり

せっかくなので、m5.large も無料枠に追加していただければ、AWSさんが問い合わせを受ける必要もなく、エンドユーザーにも優しいと感じました! 今回は早速、AWSのサポートに解除を依頼しました。現在は対応待ちです。

最後に

新しいことに取り組むと、いろいろと刺激があって楽しいです。 無知がたたってうまく行かないことも多いですが、その過程も楽しめるような人間になりたいと思います😁

Let's Encryptに登録しているメアドを変更する方法

Let's Encryptに登録しているメールアドレスを変更したくなったら、以下のコマンドを実行する。

certbot update_account --email 【新しいメールアドレス】

実行結果は以下の通りです。 メールアドレスの共有はご自由に

[root@bin]# certbot update_account --email hanamiche@example.com
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing, once your first certificate is successfully issued, to
share your email address with the Electronic Frontier Foundation, a founding
partner of the Let's Encrypt project and the non-profit organization that
develops Certbot? We'd like to send you email about our work encrypting the web,
EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: N

IMPORTANT NOTES:
 - Your e-mail address was updated to hanamiche@example.com

Firefox for iOSを実機で動かす

2015/11/13 AppStoreにて正式にFirefoxが公開されました ですので、普通はもう自分でビルドしなくてもいいです。



Chromeも使いますが、Firefoxにとっても愛着を感じております。iOS版の開発も伝えられていましたが ソースが公開されているので、待ちきれずに自分でビルドしてみることにしました。

xcodeを使って実機デバッグできる環境が必要です。iOS Developer Programとかですね。 (円安でさりげなく値上がりしていますね)

手順は、 https://github.com/mozilla/firefox-ios に掲載されていますので その通り実行しました。

実は、「2. Install Carthage.」 を見逃していて5分ほど途方に暮れました

Cloneの中にある、 Client.xcodeproj を起動して、何も考えずにビルド。 エミュレーターでは上手く動きました!この調子で実機でもとんとん拍子に・・・と 甘い考えをしていたのですが、ダメでした(T-T)

失敗1 SendTo にてエラー

スクリーンショット 2015-04-30 15.22.22.png

SendToのプロパティを見るとTeamが「Unknow name」になっていたので自分のアカウントに修正

スクリーンショット 2015-04-30 15.25.45.png

アカウントを変更して、Fix Issueをクリックするも以下のエラーが出るのでBundle Identifier を適切な値に変更した。(jp.qiita.hanamiche.*にしました) 「An App ID with Identifier 'org.mozilla.ios.Fennec.SendTo' is not available. Please enter a different string.」

スクリーンショット 2015-04-30 15.30.14.png

失敗2 ShareTo にてエラー

SendToと同じように、ShareToもBundle Identifier を適切な値に変更した。

失敗3 とにかく Bundle Identifierを変更しまくる

とにかく、org.mozilla. や group.org.mozilla. の記載があると実機で実行できないので変更する

Client, SendTo, ShareToの「Keychain Sharing」「Add Groups」を適度に修正

ちなみに、swiftファイルに記載してある「org.mozilla.*」は修正不要

そしてついに動いた

IDの衝突で動かないだけなのでBundle Identifier周りを調整してあげれば後はビルドするだけで簡単に動きました!

やった!

IRCのログを日々Redmineに登録する

思い立った理由

IRCRedmineを業務で使っています。 IRCはログインしていない時のログが追えなかったり、基本的に各自のクライアントにログが残るためみんなで共有できないかな。と考えました。

Redmineに日々のIRCのログが残っていけばきっと良いこともあるはずと考えました。

開発環境

いろいろ迷いましたが、Windows版のLimeChatでログをテキストに保存してたのでそれをPowerShellRest API(Invoke-RestMethod)を使ってRedmineに登録することにしました。

前提条件

  • LimeChatのログファイル命名規則は: %c\%y%m%d-%s.log
  • ログを保存するにはずっとろIRCにログインしておかないといけない
  • Redmine REST APIが有効になっていること

ソースはこちら。 これをタスクスケジューラーで日々実行しています。

######################################################################
##                                                                  ##
## IRCのログをRedmineに登録するよ!                                 ##
##                                                                  ##
## このPowerShellをタスクスケジューラで1日1回実行中!               ##
##                                                                  ##
######################################################################
#本番用
$url = "【RedmineのURL】/issues.json"
$api_key = "【APIキー】"
$project_id = "irclog"

#HTTPヘッダ (認証ありだとBASIC認証用のヘッダも必要)
$headers = @{"X-Redmine-API-Key" = $api_key;
             "Authorization" = "【BASIC認証用のヘッダ (Basic : xxxxxxxxxxxxxxxxxxx)】"
}

#ログファイルのパス
$logfilepath = "【ログファイルのディレクトリパスを指定】"

#タイトルを作成
$subject = Get-Date (Get-Date).AddDays(-1) -Format "yyyy/MM/dd(ddd)のIRCログ"

#本文をログファイルから取得
$filename = $logfilepath + (Get-Date (Get-Date).AddDays(-1) -Format "yyyyMMdd") + ".log"
$files = Get-Content $filename
$description = ""

Foreach ($name in $files)
{
    #ここで、関係のないログは排除するようにする。正規表現で排除したいぞ!
    if( $name -match "^[0-9]{2}:[0-9]{2}:[0-9]{2} .*> " -eq $true ) {

        #投稿者の名前先頭4文字をclass指定する
        $span_class = $name.Substring(9,4)

        #きれいに見せるための苦肉の策
        $name = $name.Replace("  ", "&nbsp;&nbsp;");
        $name = $name.Replace("&nbsp;#", " #");
        $name = $name.Replace("http://", " http://");
        $name = $name.Replace("https://", " https://");

        $name = "%(" + $span_class + " irclog)" + $name + "  %`r`n"

        $description = $description + $name
    }
}

if( $description.Length -gt 0) {

    # 絵文字エスケープ・・・これは無念だけど・・・
    $description = $description.Replace("^^;","<notextile>^^;</notextile>")
    $description = $description.Replace("(__)","<notextile>(__)</notextile>")
    $description = $description.Replace("(^_^)","<notextile>(^_^)</notextile>")
    $description = $description.Replace("(-_★)","<notextile>(-_★)</notextile>")
    $description = $description.Replace("<(_ _)>","<notextile><(_ _)></notextile>")
    $description = $description.Replace("T-T","<notextile>T-T</notextile>")
    $description = $description.Replace("(^-^)/","<notextile>(^-^)/</notextile>")


    # JSONを組み立てる
    $issue_json = @{"project_id" = $project_id; "subject" = $subject; "description" = $description; "tracker_id" = $tracker_id}

    #このissueに気がつくまで2時間はかかった・・・
    $parent = @{"issue" = $issue_json}

    #JSONに変換する
    $parent = $parent | ConvertTo-Json -Compress

    # WindowsのファイルがShift-JISで保存されているので、UTF-8に変換
    $parent = ([System.Text.Encoding]::UTF8.GetBytes($parent))

    try 
    {
        # Redmineへ登録
        Invoke-RestMethod -Uri $url -Method POST -Body $parent -Headers $headers -ContentType "application/json;"
    }
    catch { 
        # がっかり。エラー(手抜き)
        echo $_.Exception.Response 
    }
}

Redmineに無事に登録できました! Redmineに無事に登録できました

参考サイト

最後に

Redmine REST APIを使う事で、いろいろと自動化できそうと気がつくことができました。 例えば、特定のSubjectを含んだメールが来たらRedmineのチケットをつくるとか、IRCで特定の発言をしたらRedmineに登録するなど、夢が膨らみます。

あ、IRCRedmine操作するのは、Redmine-Chan ( https://github.com/onishi/Redmine-Chan )がすでにありますね!

プライバシーポリシー・問合せ