TIPS」カテゴリーアーカイブ

C#でSlackに(ちょっとリッチな)メッセージを送る

C#でSlackに(ちょっとリッチな)メッセージを送る。

SlackAPIは使用可能な状態であることとする!

  • リファレンスを読む(https://api.slack.com/methods/chat.postMessage
  • SlackApp を作成(https://api.slack.com/apps
  • 適切なパーミッションを指定(chat:write, chat:write.customize あたり)
  • アクセストークンを払い出す
  • App を Slackワークスペース にインストール
  • 投稿したいチャンネルに↑のAppを追加

詳しくはリファレンスを見てもらうとして、要するにSlackAPIのURLにJSONデータをアクセストークン付きでPOSTすればいいのだな。

c#とJSONの関係はPHPとのそれより冷めている。C#くんは融通が利かないのだ。(いいところでもある)

JSONデコード、エンコードをするためには大変面倒くさいが、専用クラスを作ったほうが早い。

というわけでリファレンスを見ながら SlackMessage クラスを作る。

こんな感じ。

 

リッチな書式は Attachments で指定するらしいので、こちらもクラスにしておく。

こんな感じ。

 

その他のプロパティはリファレンスを見ながら追加していけばいいが、大体これで足りるんではないか。

次に送信する部分にとりかかる。HttpClient を使って認証情報付きのPOSTを行う。
これがセオリー通りなのかはわからない。誰か教えてください。

こんな感じ。

 

メソッドが返している result にも色々有用な情報が入っているので、実行時は見てみるとよいかもしれない。
(投稿idを使って返信したりできるとかできないとか)

では実際に送信してみる。

実際に送られるメッセージはこんな感じになる。
リッチな装飾が不要なら Attachments は省略してもよい。

LightsailにSSHできない(RLogin使用)

Lightsail に久しぶりに新しいインスタンス(Ubuntu 24.04)を作ったら SSH できなくなっていた。

https://docs.aws.amazon.com/ja_jp/linux/al2023/ug/ssh-host-keys-disabled.html

このあたりを参考に色々やってみたけど解決せず。

認証鍵を作り直しても、SHA1を有効にしてみても(当たり前だけど…)変化ない。うーん。

RLogin側の設定

RSA2認証鍵の署名方式が原因だった。SHA2-512に設定変更すればOK。

Lightsailインスタンス側がSHA2-256を弾くようになったってこと…?

VisualStudio Nuget のインストール先を変更する

えーん、ストレージの容量がいっぱいだよ…!

ということでNugetのインストール先を変更する。

Cドライブの容量が無限にある人が作ったらしいが、こういうのはGUIでできるようにしておいてもらいたいものだ…。

cmdでコマンドラインを出し、dotnetのコマンドで設定変更する。

別途nugetでやる方法もあるようだが、標準の方法のほうがいいだろう。

参考:https://learn.microsoft.com/ja-jp/nuget/consume-packages/configuring-nuget-behavior

Laravel-snappyを使用していて、実際のページ数とフッタのページ数が合わないときは…

Laravel-snappyを使用していて、実際のページ数とフッタのページ数が合わない現象に遭遇した。

PHPサイドでのページフッタの指定はこう。

 

Bladeの任意の場所で改ページするときはこう。

 

これで大抵うまくいくんだが、今回は「生成されたPDFのページ数と、フッタのページ数が合わない」という変な状況になった。
色々削っていくと、今回のケースではページ内に「display:inline-block;」な要素があったためらしい。
高さが未確定なために、内部でのページカウントと描画したあとのページで不一致がおきたんじゃないかと。。。

ということで、今回は inline-block をやめて width を指定、高さも指定できるものは指定して解消。

Laravel Snappy でヘッダに日本語が使用できない件

Laravel で PDF 生成に便利に使える Laravel Snappy だけど…。ヘッダ、フッタに日本語(マルチバイト文字)を使おうとすると該当部分が表示されないという問題が生じた。

普通ならこうする。

でもこれじゃあダメなんである。

ググってみると同じ問題に直面した海外ニキがいて、その投稿によるとheader-left ではなく header-html にしてHTMLを埋め込めばいいらしい。

viewname.header.blade.php の中身はこう。

重要なのはDOCTYPE、charset=utf-8の指定、margin0の指定であった。

Laravel Snappy を使ってPDFを生成してみる

wkhtmltopdf のPHPラッパー Snappy を Laravel に組み込んだ Laravel-Snappy を使ってみる。

インストール

公式の README に目を通しておくといい。

app/snappy.php を編集して、実パスへの位置を定義。
.env に定義があればそれを、無ければ Composer のデフォルト位置を指定。

追加ライブラリ入れる

The exit status code ‘127’ says something went wrong: stderr: “/var/www/html/vendor/h4cc/wkhtmltopdf-amd64/bin/wkhtmltopdf-amd64: error while loading shared libraries: libXrender.so.1: cannot open shared object file: No such file or directory

とか出た場合。メッセージの通り、ライブラリがない。
dockerイメージに libXrender が含まれないので、これを追加する。

/docker/Dockerfile の apt-get install な列に一行追加。

(autoremove の直前でいいと思う)

ついでに日本語フォント(IPAフォント─素晴らしいプロジェクトですよね)も入れておく。

使ってみよう

Hタグを入れると目次も自動で作ってくれる。スゴイ!

日本語が文字化けするんだが?

html 内の meta タグで utf8 を指定する。

PDF::loadFile(url)で外部サイトを読み込むとSSL絡みのエラーが出るんだが?

調べてみたところ、ライブラリの問題でバージョンアップするしか無さそう。しかしメンテナが手を離してしまってるみたいで、SSLのバージョンを落とすか(無意味)か、自力で wkhtmltopdf のバージョンを 0.12.5 以上に上げるしかないらしい。厳しい。

WordPressのURLを変更したら記事が404エラーになっちゃったよ

開発用WebサイトのURLを変更したら、入れといたWordpressデモサイトが起動しなくなった。
今回は以下の手順で修正できた。

WordPress インストールディレクトリ直下の wp-config.php をテキストエディタで開き、以下の二行を追加。
(念の為バックアップをとっておこう)

これでトップページが開き、管理用ページにも入れるようになった。

が、特定のページを開くと404エラーになってしまう。
これはパーマリンクのリダイレクトルールがあべこべになっているかららしい。

管理用ページから「設定→パーマリンク設定」と移動し、何も変更せず「保存」ボタンを押すとリダイレクトルールが再設定される。
(.htaccess を修正する方法もあるらしいが、こちらのほうが確実だった)

ピュウ!焦ったぜ…

Kubuntu 20.04 LTS(Focal Fossa)がリリース

KDEの「重い」という印象から敬遠してたけど、ちょっと試してみたらすっかり気に入ってメインのLinuxディストリビューションとなっている。

kubuntu

Kubuntu 20.04 LTS(Focal Fossa)

”デフォルトではシンプルで、必要なときに強力”な kubuntu のLTSが2年ぶりにリリースされた。
ざっくり変更点は以下。

  • コアパッケージの更新
  • Linuxカーネル5.4ベース
  • デスクトップ環境が KDE Plasma 5.18 LTS に
  • 音楽再生ソフトのデフォルトが Elisa から Cantata に
  • メーラーのデフォルトが kmail から Thunderbird に
  • その他のアプリケーションアップデート

順当なアップデートという感じ。
やはり Kubuntu としては最大の関心事は KDE Plasma 5.18 であろう。

KDE Plasma 5.18 LTS

  • 絵文字ファインダー追加(Win+ピリオド)
  • GTKアプリケーションのサポート強化(KDEの外観を可能な限り引き継ぐ)
  • ナイトカラー機能追加(なかったっけ??)
  • 通知機能強化1:Bluetoothデバイスの電力不足を通知
  • 通知機能強化2:ダウンロードしたファイルへのアクセスを追加
  • システム設定の機能強化
  • アプリケーションスタイルのカスタマイズ
  • ウィンドウアニメーション効果のカスタマイズ

一般ユーザとして気になるところは外観スタイルのカスタマイズが強化されたところか。
Windows 9Xスタイルを適用することで、昔のWindowsにもかなり近づけることができるようになった。(ニーズはともかく…)

見た目と操作感がとってもモダンで、操作してて気持ちいいので、見た目に抵抗がなければぜひ試してみてもらいたい。

ダウンロードはこちらから

ダウンロードしたISOで LiveUSB を作るのが手っ取り早い。
ソフトとしては Rufus がある。ありがたく使わせて頂こう。

AWS(Amazon Route 53)に独自ドメインを設定する

AWSに独自ドメインを設定したときのメモ。
Amazon Route 53 はクラウド上でDNSサーバを提供してくれるウェブサービス。
ただし今のところ日本語化されていないので、操作性にちょっと難あり。
(当たり前だけど従量課金されるので注意してね)

  • EC2インスタンスは作成済み。
  • Elastic IP(グローバルIP)取得済み。
  • 独自ドメインは他レジストラで取得済み。

まずAWS管理コンソールにログイン。

サービス一覧から「Route 53」を選択。

「DNS Management」に入り、「Create Hosted Zone」を選択。

「Domain Name」に取得済みドメインを入力。sample.comなど。
「Comment」は適当に。 「Type」は「Public Hosted Zone」。
「Create」ボタンを押すとゾーンが作成される。

次にレコードを作っていく。
メニューから「Go To Record Set」を選択。
デフォルトで NSレコード と SOAレコード が作成されている。
(コレをいじくるんじゃねぇぞ、とチュートリアルに書いてあるので触らないでおきます)

「Create Record Set」をクリック。

「Name」にサブドメイン名。 まずは空白でよい。
「Type」はIP-V4。 V6にするときが来るんだろうか・・・。
「Alias」は「No」、「TTL」はデフォルトのままで。
「Value」に取得済みの Elastic IP を入力。
「Routing Policy」は「Simple」に。 他のは課金コース。
「Create」ボタンを押すとAレコードが作成される。

ここまでで名前が引けるようになっているはず。

AWSからレンタルサーバに移行した話

諸事情でAWSからレンタルサーバに移行したので、その顛末を記しておく。

状況

地方の小さなプロダクトで、小規模なブランドページを企画した。
予算も限られているということで、ほかのプロダクトも展開していたAWS上で構築。
単発の品物だったので、運用期間は数年程度を予定していた。

あまりないケースかもしれないが、低予算で目標達成したらごほうびがもらえる、とイメージしてもらいたい…。

単なるWebサイト(Wordpress)ということで、比較的非力なEC2サービスをチョイスした。
独自ドメインを一応とり、サービスイン。

しばらくはぽつぽつとアクセスがある程度で、とくに問題なかった。

異変

とある時期を堺に、使用量がじわじわ上がってきた。
ありがたいことに多少話題になったようで、アクセス数が上がってきたらしい。

で、そうなってくるとAWS特有の「使ったぶんだけ課金」というのが響いてくる。
アクセスが大いに越したことはないのだが、実験的な側面もあり予算が決まっているのがネックであった。

このままいくと予算をぶっちぎっちゃうカモ…?

対策してみる

ec2サービスの利用料を圧縮するために、しばらく経ってからリザーブドインスタンスを導入した。
その名の通り、EC2の使用を予約し、利用料を値引きしてもらうシステムである。
(今思えば、数年運用する計画だったのだから最初からやっておけば良かったのだが…)

リザーブドインスタンスを購入してEC2の運用コストを下げる

ちょっとマシになったけど…

そのときはEC2の利用料が大半だったので、予算内に収まるよう調整できた。
よかったよかった、これで計画通り、実験的にも成功といえそうだ。

…ところが、ここからさらにハネてしまい、EC2利用料でなくデータ転送量が料金の大半を占めるようになってしまった。
しかも、ピークタイムになるとアクセス過多のため、メモリ不足でapacheかmysqlが落ちることも。

完全に当初の想定アクセス数を上回ってしまう状況になってしまった。(本来ならありがたいことだが…)

困ったなぁ

さて、当座の対処としては、apacheとmysqlが落ちないようにしなければならない。
調整を入れたり、SWAP領域を多めに確保するなどしてみた。

スワップファイルの設定については公式サイトが詳しい。

スワップファイルを使用して、Amazon EC2 インスタンスのスワップ領域として動作するようにメモリを割り当てる

なんでSWAP領域がないねん…と思ったけど、ディスクIOで課金される以上、AWS側としては勝手にSWAP領域を設定するのはマズいやろ、ということらしい。必要なら覚悟の上で自分で設定してね、というスタンスなのだろう。

公式がわざわざ「注意: スワップ領域は、エフェメラルストレージのインスタンスストアボリューム上にのみ作成することをお勧めします。」と書いてあることに注意していただきたい。

エフェメラル(ephemeral:一時的な)ストレージは再起動するたびにクリアされるストレージのことである。
そのかわり、ここへのディスクアクセスについては課金されない。

前述したとおり、今回チョイスしたEC2インスタンスタイプは低価格帯であったため、インスタンスストアボリュームが存在しなかった。
ディスクアクセスによって課金されることを知りながら、スワップファイルを高価なEBS上に作成しなければならない、このストレス!

Apacheの調整とスワップファイルを設定したことで落ちなくはなったが、ディスクIOで予算を使い切ってしまう未来しか見えない。
なんらか対策が取れるのかもしれないが、それをやってる時間がないくらい、データ転送量もえらいことになっていたのだ。

多数使用していた画像を圧縮してみたりしたが、仮にもブランドサイトなので限界がある。

もぅマヂ無理…移行しよ…

ローコストでスタートできる、というウリでAWSをチョイスしたのだが、(うれしいことに?)アクセス過多で負荷が高まり、結局立ち行かなくなってしまった。

無難に安く仕上げるつもりが、クラウド破産に怯えるハメに。なにやってんだ??(ヽ´ω`)

こういうとき予算があればインスタンスタイプを変更することで対応できるのだろうが、今回は諸事情でそうはいかなかった。
リザーブドインスタンスも無駄になるしね…。

というわけで、「一日の」データ転送量に比較的余裕のあるレンタルサーバに移行することにした。
一日の、というのがミソで、くだんのWebサイトではスパイクはそれほど発生しておらず、一日あたりで見てみれば十分おさまる範囲であったのだ。

じっくり考えている余裕はあまりなかったので、とりあえずさくらのレンタルサーバとロリポップの2件に絞った。

値段は2019年12月調べ。

さくらインターネット

ライトプランは131円からと、とにかく安い。

スタンダードプラン(月額524)

一日あたりの転送量:80GB

プレミアムプラン(月額1571)

一日あたりの転送量:120GB

ロリポップ!

さくらの間隙を縫うようなプラン設定。
ハイスピードだとストレージがSSDでリッチ。

スタンダードプラン(月額500~)

一日あたりの転送量:100GB
ストレージ:HDD

ハイスピードプラン(月額1000~)

一日あたりの転送量:100GB
ストレージ:SSD

あれ…すっげー安い。

どちらにしたかはここではあえて申し上げますまい。
とにかく、今回のケースにおいてはAWSよりレンタルサーバのほうが遥かに安く上がった、ということである。

そのほか、各種アップデートを気にしなくてよくなった。
プロセスが落ちることを気にする必要もない。
VPSのように自由度はないが、「任していい部分」を任せられるのが楽だ。

さらにおまけでいうと、独自ドメインのメールアドレスが作れたのがお客さんにやたらとウケた。
メールサーバまで構築するのはちょっと合わなかったので作ってなかった。
(最初いらない、と言ってたんだけど…)

AWSのメリット

不勉強が招いたこと&使い方が合わなかっただけで、AWSをディスる意図はない。
実際にやってみて知見を得、ここには記せないことも色々体験できたのは良かった。

AWSは

  • すぐにインスタンスを作成でき、不要なときは停止できる開発サーバ
  • ある程度予算を確保できるプロダクト

に使うべきかなと思った。