「技術」カテゴリーアーカイブ

npmでaws-cdkをローカルインストールして使いたい

https://docs.aws.amazon.com/ja_jp/cdk/v2/guide/work-with-cdk-javascript.htmlにはすんなりできそうにも思える書き方されているんだけど、cdk initは空のディレクトリに対してしかできないので、そこだけコンテナを使って回避する。

まずはこんな感じでコンテナを作っておく。
Dockerfile

FROM node:18-bookworm
RUN npm install -g aws-cdk@2.99.1
WORKDIR /usr/src/app

docker build -t aws-cdk-cli-2.99.1 .

次にcdkのプロジェクトディレクトリを作って、コンテナを起動する

mkdir cdk-sample
cd cdk-sample
docker run -it --mount type=bind,source="$(PWD)",target="/usr/src/app/$(basename $(PWD))" aws-cdk-cli-2.99.1 /bin/bash

最後にコンテナ内からプロジェクトを初期化して、aws-cdkをローカルインストールする

cd cdk-sample
cdk init app --language javascript
npm install --save-dev aws-cdk

これでコンテナの外(ホスト)からはこんな感じに使える

npx cdk list

良く使うcurlのオプション

ちょっと時間が開くと忘れてる時があって何度も調べているのでメモ。

  • 詳細情報を表示(困った時はとりあえずこれ)
    curl -v "http://example.com/"
  • リダイレクト先にリクエストを送りたい時
    curl -L "http://example.com/"
  • 開発中などにDNS登録と違うところにリクエストを送りたい時
    curl --resolv example.com:80:127.0.0.1 "http://example.com/"
  • 証明書エラーを無視したい時
    curl -k "https://example.com/"
  • プログレスバー表示しない
    curl -s "http://example.com/"
  • レスポンスbodyのみ表示したい時
    curl "http://example.com/"
  • レスポンスヘッダとbody両方表示したい時
    curl -i "http://example.com/"
  • レスポンスヘッダのみ表示したい時
    curl -D - -o /dev/null "http://example.com/"
  • レスポンスヘッダのみ表示したい時(HEADリクエスト)
    curl -I "http://example.com/"

良く使う組み合わせ
curl -s -L -k --resolv example.com:443:127.0.0.1 "https://example.com/"

ファイルをダウンロードする
curl -s -L -O "https://example.com/index.html"

ちなみに、最近のWindowsは(10位から)curl.exeが入っているのでコマンドプロンプトからも実行可能。PowerShellはcurlがInvoke-WebRequestのエイリアスになっているのでcurl.exeと指定する必要アリ。

MacにVagrant+VirtualBoxでVMを作ったら通信できなくて悩んだ

久しぶりにMac(x86)にVagrant+VirtualBoxで仮想マシンを作ろうとしたらハマったのでメモ。

macOSはCatalina、Vagrant 2.3.7、VirtualBox 7.0.8で、ゲストはRockyLinux8。デフォルトのnatとprivate_network(ホストオンリーアダプタ)が指定してあって、vagrant upするとVMは起動するんだけどssh接続のところでタイムアウトしてしまう状況だった。

先に気がついたのはホストオンリーアダプタの方で、VirtualBox GUIでツール・ネットワークのところを見たらvagrantnet-vbox1のLower BoundとUpper Boundが両方とも192.168.33.0になっていたのを192.168.33.1・192.168.33.254にしたら通信できるようになった。

natの方は、Vagrantfileで –nictype1 が virtio になっていたのを 82540EM に変えたら通信できるようになった。

pecl::memcached はセッションの値を memcached に入れるときに圧縮しない

久しぶりに書いておいた方が良さそう(忘れそう)なのがあったので。

LANの奥の方でひっそりと動いていたPHP 5.3(pecl::memcache)なシステムをPHP 7.4(pecl::memcached)化している途中で「7.4の方だけセッションが切れる」ということがあった。

エラーメッセージはこんなのが出ていた。

PHP Warning: Unknown: error saving session to memcached: SUCCESS in Unknown on line 0, referer: ~
PHP Warning: Unknown: Failed to write session data (memcached). Please verify that the current setting of session.save_path is correct ( ~ ) in Unknown on line 0, referer: ~

最初???という感じだったんだけど、良くコードを眺めるとセッションに大きなオブジェクトを入れている箇所があり、そこでセッションの保存に失敗しているらしいことがわかった。

5.3の方は動くので実際にmemcachedに保存されている値を見るとバイナリっぽいものが保存されていて、このあたりでpecl::memcache はセッションの保存時に透過的圧縮がかかるけど、 pecl::memcached だとかからないのか?という仮説にたどり着いた。

あとは実際に拡張のコードを見ればよいのだけど、セッションの拡張のコードの追い方は
我慢強い人のためのpeclでsession_handlerを作る。を参考に PS_WRITE_FUNC を見れば良いとあたりをつけて、pecl::memcached のコードを見ると圧縮しているところはなさそうだった(ちなみに memcached_set() は libmemcached の関数)。

ということで、セッションに大きなオブジェクトを入れるのをやめるか、memcached(サーバーの方)の設定を変えるかしないとかな..

Amazon Linuxでhttpd(2.2) + PHP(5.3)の組み合わせからhttpd24 + php54へのアップデート

Apacheが2.2から2.4になって設定の書き方が多少変わっているので対応するのが面倒だったのと、普通は動作確認にしっかり時間をかけないとなやつなのでずーっと先延ばしにしていたのだけど、勢いで対応したら割とすんなりいったので(大したものを動かしていないので)メモっておきます。

とりあえずバックアップを取りましょう。

最低限は

yum erase httpd httpd-tools php php-xml php-process php-cli php-common
yum install httpd24 php54

な感じで、あとは別途インストールしているものがあればそれぞれって感じで。

newrelicの拡張がアンインストール時に削除されていまうので

yum reinstall newrelic-php5

でどうにかなります。

追記: さらにPHP 7.2にした

yum erase php54 php54-cli php54-common php54-mbstring php54-mysqlnd php54-pdo php54-pecl-apc php54-pecl-memcache php54-process php54-xml
yum install php72 php72-mbstring php72-mysqlnd php72-pdo php72-opcache php72-pecl-apcu

要注意ポイントはapcの機能がapcuとopcacheになったのと、memcacheは外したところ。

Nginx reverse proxy + Apache(mod_php)環境でmod_pagespeedを動かしてみた

出立ての頃に少し触ってすっかり忘れてたのに突然存在を思い出したので、js/css/html minifyあたりがカジュアルに使えるようになってると良いなと思いつつ。

本当はちゃんとアセットパイプラインとかやるべきなんだろうけど、そこまで手を入れられない動いているアプリケーションに次善の策として検討できると便利なんじゃないかと。

とはいえ何度も何度もminifyするのは無駄遣い感が凄いので、Apacheにmod_pagespeedを入れてminifyした結果をnginxにキャッシュさせようという戦術で、とりあえずwordpressが動いている環境にmod_pagespeedデフォルト。これはそれっぽく動いているようには見えたんだけど、JSやCSSのURLが変わってしまう(style.cssがstyle.css.pagespeed.abcd.cssのような感じに)のが嫌な感じなので元々のURLを維持しつつ、画像の最適化系まで入れるとカジュアルじゃなくなってくるので、また今度にしたい。ということで入れてみた設定が以下。
# nginx 1.1.10, apache 2.2, mod_pagespeed 1.11.33

続きを読む Nginx reverse proxy + Apache(mod_php)環境でmod_pagespeedを動かしてみた

imagickを使ってpdfを画像に変換する

PHPのImagick(ImageMagick)を使ってPDFファイルを画像に変換することができます。

$imagick = new Imagick();

$imagick->readimage($pdf_file_name);

for ($i = 0; $i < $imagick->getImageScene(); $i++) {
  $imagick->setIteratorIndex($i);
  $imagick->setImageFormat('jpeg');
  $imagick->writeimage($image_file_path . '-page' . $i . '.jpg);
}

これ、結構リソース使うんですよね。ページ数の多いPDFを変換しようとしたら、memory_limitやmax_execution_timeに引っかかって…という経験ありませんか?

特定ページだけを画像化したい場合限定(1ページ目だけ変換したいとかありますよね?)ですが、次のコードでサクッとできます。

続きを読む imagickを使ってpdfを画像に変換する

appendChild()ではなくinsertBefore()を使ってスクリプトをロードするのはなぜ?

Google Analyticsのコードが使っているような、サードパーティのスクリプトを非同期にロードする方法を「createElement-insertBeforeパターン」と言うことくらいは知っていました。けど、ふと「なんでappendChildじゃ駄目なんだ?」と思って調べたのでメモ。

続きを読む appendChild()ではなくinsertBefore()を使ってスクリプトをロードするのはなぜ?

document.write()を止めるためにはFriendly iFrameを使うのが良さそう

Chromeの開発者ツールを開くとコンソールに何か出てるな。というのは気になってたんだけど、スルーしてたらこんな投稿があることを教えてもらった。
遅い通信だとChromeはdocument.writeで外部のスクリプトを読み込んでも動かなくなるらしい(A Parser-blocking, cross-origin script …)

続きを読む document.write()を止めるためにはFriendly iFrameを使うのが良さそう