日記帳
本ページはプロモーションが含まれています
カテゴリー
Links
blog(ブログ)マスター
アンドロイドの巣
ゼロから始めるベランダ菜園
タイトル
2024年11月
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30

Search Results

タイトル

執筆:2024.04.08
編集:2024.04.08


先日ちゃちゃちゃとcygwinでPHP8.3を動くようにしたりしてみましたが
今後のことを考慮すると利用しないほうが賢明という結論に至りました!!

基本的なライブラリがメンテされていないので
アンインストールすることにしました!

メンテリストをみると
curl -o "cygwin-pkg-maint_`date +%Y-%m-%d`.txt" "https://cygwin.com/cygwin-pkg-maint"
重要なものが放置なのでオワコンですね

数年したらなくなってそう。

簡単なコマンドならgit bash shellでもできます。
少しの手間で wsl2から直接アクセスできます。
あなたのPCの cygwin 本当に必要ですか?

たまに利用していたアプリは、Linuxにもあるので、cygwinフォルダに保存していたデータ自体かなり減らしていました。
データフォルダを移動して引越ししました。保存していたデータは利用するときに整理することにします。

  • 直接他ドライブのフォルダへ
  • cygwinからの移動データ
    • doccument
    • workspace
すぐに仕分けできないものは後者で分類して、「cygwinからの移動データ」としてNASドライブへ

cygwin32のときにセキュリティ設定でくいついてシステムから削除できないことが昔あったので
64bitにしたときにcygwinのフォルダ自体はドライブマウントしているので、アンマウントしてディスクファイル削除するだけです。

まずは システムからcygwin OSを追放することです

🗑 削除ポチ ✨🌌

使えるから置いておこうって、邪魔なだけです。
アップデートとか時間の無駄。


時代の流れです。
思い切ってスパッと
cygwinを削除しましょう。 



さようなら Cygwin!!
カテゴリー: Linux
2024.04.08

タイトル

執筆:2024.04.04
編集:2024.04.06


cygwin 3.5  PHP-8.3.4

$ uname -ro
3.5.1-1.x86_64 Cygwin

cygwinの環境が独自仕様の変数とか配置とかで
標準のLinuxと違うみたいで
標準のphpのソースだとそのまま通らないみたい。

cygwin環境は
パッチを当てないとPHPのビルドはできません。

以前XP用にXP未サポートのPHP5.6をビルドしたことがあったので、なんとなくconfigureの仕組みは知っていたので、書き換えてみた。

php.cygportのパッチ作り直し
fedoraの分はすぐ手に入ったのでそのまま差し替えて流用。
残りは、不要なものは無視して、必要そうなものだけ ちゃちゃちゃと書き換えて完了。

コンパイル通らない。

なんでphp.cygport全部ひとまとめにしているのだろう。
基本パッケージcli,sapi毎(cgi,apache),extを最低でもわけるべき。
extなんかbuild後に自動でphplizeすればいいことでしょ。デバッグできないような余計なパッケージして手間かけさせて迷惑。
全部まとめるならオプション渡して必要なものに変更できるようにしないと。

自分の用途で動けばいいだけなのでパッケージとかは考えない。

cygport prepでパッチまで当てて、
残りは、./confugiureで使用する環境に合わせる

./configure --prefix=/usr/local/php/8 $OPTIONS_CONF
config.status: executing default commands

+--------------------------------------------------------------------+
| License: |
| This software is subject to the PHP License, available in this |
| distribution in the file LICENSE. By continuing this installation |
| process, you are bound by the terms of this license agreement. |
| If you do not agree with the terms of this license, you must abort |
| the installation process at this point. |
+--------------------------------------------------------------------+

Thank you for using PHP.


make
落ちたところで少し修正
原因が分かったので解決。


あら、作業開始後に cygwinのバージョンが変わってる
$ uname -ro
3.5.3-1.x86_64 Cygwin


完成!!
uname -ro && sapi/cli/php -v




動作確認完了

やったね!🥂

システムのPHPと置き換え
make install

OK 🍕

デフォルトのphp消してもいいかも?
apt-cyg remove php


🍳 phpのインストールパスをシステムに登録して完成。
nano ~/.bashrc
export PATH="/usr/local/php/8/bin:$PATH"

今回はさすがに無理かと思いました🤣🤮

少し手間かかりましたが いけましたね。💯

$ php -r "echo 'PHP'.phpversion().'-'.PHP_OS;"
PHP8.3.4-CYGWIN_NT-10.0-19045

cygwin で PHP8 完🎉🍭

» cygwin 3.5  PHP-8.3.4'">続きを読む

カテゴリー: ぷろぐらみんぐ
2024.04.06

MD5チェックサムコマンド一覧

執筆:2019.05.29
編集:2019.05.29


MD5は、次の方法で計算できます
  • Power Shell
    Get-FileHash -Algorithm MD5 ファイル名

  • コマンドプロンプト (Windows7以降)
    certutil -hashfile ファイル名 MD5

  • cygwin
    md5sum ファイル名

  • PHP
    php -r "echo md5_file('ファイル名');"
カテゴリー: General
2019.05.29

cygwin
PHP Fatal error: Out of memory (allocated 49807360) (tried to allocate 2140027 bytes) in phar:///usr/local/bin/composer/src/Composer/Util/RemoteFilesystem.php on line 451

451: $result = zlib_decode($result);

なぜか50MBしか割り当てられていないとエラーが表示されます。

確認するが 512MBきちんと割り当てられている。
php -i | grep memory_limit
memory_limit => 512M => 512M

php -r "\$s = str_repeat(' ', 1000*1000*1000);"
PHP Fatal error: Allowed memory size of 536870912 bytes exhausted (tried to allocate 1000000024 bytes) in Command line code on line 1

zlib_decode関数が怪しい
ということでzlib_decode関数をいじめてみます。
php -r "\$s = zlib_encode(' ',ZLIB_ENCODING_DEFLATE); str_repeat(\$s, 100*1000*1000);"
PHP Fatal error: Allowed memory size of 536870912 bytes exhausted (tried to allocate 900000024 bytes) in Command line code on line 1
予想と違う結果で、きちんと設定値が返ってきました。

ということは、
cygwinのphpにメモリリーク
・phar がメモリを食いつぶしている
・composer がメモリを食いつぶしている
あたりが疑われます

これ以上の追及は時間の無駄(というかわからない)なので
dosプロンプトで実行して解決
curl -O https://getcomposer.org/composer.phar
php composer.phar オプション
2018.06.20

python3をインストール : さくらインターネット ライトプラン

さくらインターネットの
Ruby と Python は古すぎて使い物にならない
Ruby /usr/local/bin/ruby 1.8.7
Python /usr/local/bin/python 2.7.6
2018/06

ローカルのcygwinでバージョンを見ると
ruby 2.3.6
Python2  2.7.14
Python3  3.6.4

virtualboxにいれているテスト用のfreebsd9でも Python 2.7.13 が返ってくる(pkg upgradeとうったが最新だよっていわれ、もう更新できない。)

FreeBSD9は tlsv1 なので
最新のものに更新していない古いバイナリを実行すると
'SSLError(SSLError(1, '[SSL: TLSV1_ALERT_PROTOCOL_VERSION] tlsv1 alert protocol version (_ssl.c:833)'),)'
などのエラーが発生する

  さくらインターネットで使われている python 2.7.6はいつごろか追うと 2014Q3 ということがわかった。 2014Q4からは、2.7.8になっているので
4年以上も放置されているということになる
ということで、pythonを使いたい人はさくらインターネットの共有サーバーはやめておいたほうがいいでしょう。
OSのアップグレード待つか、新規契約して新しいサーバーに移るしかないですね。

注意点(リスク)
せっかくインストールしてもサーバーOSがアップグレードされると
.soファイルのリンク切れで
自前Buildアプリはすべてダウンしてしまうので気を付けましょう

さくらインターネットは FreeBSD9(FreeBSD 9.1) で
FreeBSD9のFreeBSD公式サポートはかなり前に終了していて(9.1:2014 年 12 月 31 日, 9シリーズ:最終 2016 年 12 月 31 日)
osのライブラリも古いので 自前buildは あまりお勧めしない

現在のFreeBSDのカレントブランチは 11 で 来年には12がリリースされる

perlの切り替えができるので、pythonでも切り替えは技術的には可能なはずなので
サポートに pythonの切り替え機能の要望を出したほうが無難でしょう

» 続きを読む

2018.06.12

SSH 各種設定 タスクスケジューラー

執筆:2018.06.08
編集:2018.06.08

タスクスケジューラー

タスクの作成

ユーザーがログオンしているときのみ実行する(R)
クライアント
動作する 動作しない
  • ssh
  • PuTTY
  • Tera Term

ユーザーがログオンしているかどうかにかかわらず実行する(W)
クライアント
動作する 動作しない
  • ssh
  • Tera Term
  • PuTTY

※ssh : ssh.exe(powershell , cygwin)

プログラム/スクリプト(P) 一覧
  • powershell
    %SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe
  • cygwin ssh
    C:\cygwin\bin\ssh.exe

引数の追加(オプション)
  • powershell
    -ExecutionPolicy RemoteSigned -File C:\フルパス\スクリプト.ps1


カテゴリー: General
2018.06.08

gdb for Windows ダウンロード

単独で配っていないようなので
(1) ソースコードを入手して、適当なフォルダに展開します
(2) 自分でビルドします

build gdb for Windows
linuxかcygwinを用意して mingwパッケージをインストールしておきます。

まず デバッガに c:\cygwin\bin\gdb.exe が使えないか試したほうが楽でしょう。

静的コンパイル: Windows

cygwinでWindows用バイナリをコンパイル
10分くらいで出来上がります
今回は gdb-8.0を使いました
make distclean
find . -name config.cache -exec rm {} \;
./configure --host=i686-w64-mingw32 \
--disable-host-shared \
LDFLAGS=" -lintl -static -static-libstdc++"
make
# gdb/gdb.exeがあることを確認
# DOSプロンプトで動くことを確認しましょう。
# フォルダ作成(bin)とコピー
mkdir bin
find . -type f -name "*.exe" -exec cp {} bin/ \;
はい、出来上がりました。
chew.exe gdb.exe gdbreplay.exe gdbserver.exe
が binフォルダに入っていると思います。
gdbを実行しコマンドプロンプトが表示されれば成功です。
「quit」と打つとgdbを終了することができます。

Windows用のIDEにgdb.exeの場所を指定して終了です。

【以下のようなエラーは、動的リンクになっています】

  • コンピューターに libintl-8.dll がないため、プログラムを開始できません。この問題を解決するには、プログラムを再インストールしてみてください。
  • コンピューターに libwinpthread-1.dll がないため、プログラムを開始できません。この問題を解決するには、プログラムを再インストールしてみてください。
解決方法:pathを通すか静的コンパイルすると動きます。

【gccまたは、mingwが古い時のエラー】
  • checking for library containing strerror... configure:
    error: Link tests are not allowed after GCC_NO_EXECUTABLES.
    ターゲット 'configure-libiberty' のレシピで失敗しました
cygwinの場合は、 セットアップを「 setup.exe -o 」で 起動して、管理されていない古いパッケージを削除すると直るかもしれません。
古い i686-pc-mingw32 パッケージを自動削除することで直りました。
カテゴリー: ぷろぐらみんぐ
2017.07.03

SHA-256のハッシュを求める方法

Windows

PowerShell パワーシェル
  1. ファイル Windows PowerShell を開く
  2. 次のコマンドを実行する
    Get-FileHash ファイル名 -Algorithm SHA256

コマンドプロンプト
  1. ファイル コマンドプロンプト を開く
  2. 次のコマンドを実行する
    CertUtil -hashfile ファイル名 SHA256
    出力に空白が含まれるので比較しにくい

その他のOS
  1. シェル を開く
  2. 次のコマンドを実行する
    sha256sum ファイル名
Linux,FreeBSD, cygwin
カテゴリー: General
2017.02.18

PHP5.5が終了していたので、
5.5.38にphp-5.5.22 Windows XP version
のパッチをマージして
久々にXPバージョンをビルド

みごとにこけた
Zend/zend_ini_parser.y : error C2065: 'tsrm_ls' : 定義されていない識別子です。
ext\standard\info.c: error C2065: 'PRODUCT_SERVER_FOUNDATION' : 定義されていない識別子です。

修正して再ビルト
php-5.5.38-Win32-VC9-x86-XP-build-2016-12-26.zip

ソーナンス!!

» 続きを読む

カテゴリー: ぷろぐらみんぐ
2016.12.26

fossil-scm
bashの補完機能を有効にする方法

tools/fossil-autocomplete.bash

C:\Cygwin\etc\bash_completion.d\
にコピーします
次にcygwinシェルを起動しなおすとfossilコマンドに対して補完が有効になります。

(1) bash_completion をインストールしていない場合はインストールする

(2) 設定を追加する

Cygwin /etc/bash_completion.d/
または
${BASH_COMPLETION_COMPAT_DIR}
FreeBSD /usr/local/etc/bash_completion.d/

動作しない場合のチェック項目

  • bash_completion がインストールされているか確認する
  • bash を再起動して確認する
  • パッケージのバグなので自分で呼び出す
    ~/.bashrc
    の最終行に以下を追加する
    #for file in /etc/bash_completion.d/* ; do
    # source "$file"
    #done
    if [ -f /etc/profile.d/bash_completion.sh ]; then
    . /etc/profile.d/bash_completion.sh
    fi
2016.04.04

git と fossil の比較 git vs fossil-scm

結論をいいますと
* 現段階で,gitからfossilへの移行はしないほうがいいです。

fossilには、ブランチ、タグの削除・抹消機能はありません。

改行コードが絡む場合は、 git を使うほうがいいでしょう。
fossilには、cr-lf 変換機能は ありません。

商用のプログラミング言語には、 LF改行だと
// コメント行
を正常に処理できないものがあり、意図しない動作となります


 2015/12 fossil git svn
料金 無料 無料 無料
リポジトリ ファイル1個 フォルダ .git
ファイル多数
フォルダ
ファイル多数
改行
コード変換
なし あり あり
ブランチの削除 不可※ 可能 可能
空フォルダ 不可    
日本語メニュー なし あり あり
わかりやすさ × ×
操作性 × ◎ 
処理速度
競合ファイルの処理
GUI
×
可搬性
ポータビリティ
×
ライセンス

個人著作物

(2-clause BSD license)

GPL Apache License 
将来性(開発の継続)

△ (?)

◎ (?)
20年後(Windows)の動作 Windowsは下位互換性が非常に優れているため、.netランタイムライブラリを使っていない場合は、将来的に動作で問題を起こすことはまず発生しない。

20年後(Unix系)の動作

〇 (未知 ?)
static build-inの単一ファイルなので問題を起こす要素がない

未知 ? 未知 ?

» 続きを読む

2015.12.02

fossil-scmのバグや不具合リスト : メモ

執筆:2015.12.08
編集:2015.12.02

このページの更新は 今後ありません。
リスト作成 2015年12月

» 続きを読む

2015.12.02


手順
(1) chere の インストール
cygwinのsetup.exe からインストールしてください

chere
 sdesc: "Cygwin Prompt Here context menus"
 ldesc: "Shell script to manage shell here context menus for Cygwin"
 category: Shells Utils System

(2) コンテキストメニューに登録します
すべてのユーザー
   chere -ina -e "Open Cygwin Bash Here" -t mintty 
カレントユーザーのみ
   chere -ic -e "Open Cygwin Bash Here" -t mintty 

-i インストール
-a All Users
-c カレントユーザーのみ
-n コントロールパネルに削除を登録
-t 端末エミュレータの指定
デフォルト:コマンドプロンプト
cmd rxvt mintty xterm urxvt
-s シェルを指定
ash bash cmd dash fish mksh pdksh posh tcsh zsh
-e メニューに割り当てる説明文字を指定
ショットカートを割り当てるには &

いま使っているcygwinのシェルは、
echo $SHELL で確認できます

(3) フォント、サイズの変更
どこでもいいので、作った右クリックからフォルダを開いて
メニュー右上をクリック → プロパティ

【アンインストール】
 chere -u 


カテゴリー: General
2015.11.24

コマンドプロンプト(cmd.exe)
 start . 

cygwinシェル
 cygstart . 

どっちでもいい方法
 explorer . 

カテゴリー: General
2015.11.24

コマンドプロンプトをutf8で起動する
cmd /f:on /k "chcp 65001"

コマンドプロンプトでの操作
utf8に変更する
chcp 65001

shift_jisに戻す
chcp 932


問題点
(1)  UTF8モードにすると 日本語入力(IME)が使えないようです
(2)  ファイル名が壊れる
例) 日本.txtという名前で保存する
     chcp 65001
     dir コマンドを実行する
日本.t という名前になっている。
日本.txt → 日本語.t
日本語.txt → 日本語.
となることから、cmdの不具合で
文字長は utf8で数え、実際の切り出しをバイト処理しているのではないかと推測されます
(3)  

キーワード:
コマンドプロンプト コードページの変更
コマンドプロンプト コードページ UTF8


» 続きを読む

カテゴリー: General
2015.11.24

Mercurial 日本語ファイル名 文字化け

» 続きを読む

2015.11.17

EditorLineEnds.ttr を作成できません。


結論

起動前に1個キャッシュファイルが消えればいいだけでしょ。
bds.bat作って解決。

» 続きを読む

カテゴリー: General
2015.04.12

Windows  VirtualStore

まとめ
VirtualStoreは、
%LOCALAPPDATA%\VirtualStore\
の書き込み拒否エントリで解決!!

管理者として実行 もおわすれなく

» 続きを読む

カテゴリー: General
2015.04.12

git svn clone svn://localhost/

  Can't locate Error.pm cygwin

cpan

cpan > install Error

カテゴリー: General
2015.03.12

cygwinを別ドライブでマウント

mkdir c:\cygwin
C:\

はい完了!!
あとは、どどどっとcygwinバックアップからコピーするなり新規インストールするなりお好きなように。

目的のパーティションは、mountvol /L で見つけましょうね

cygwinは、恐ろしいくらいファイルが多いし、断片化の原因であるし、
おまけにセキュリティソフトやバックアップの邪魔なので
実機を別マシンに移行するので この際
別のパーティションにインストールすることになりました。
別ドライブでマウントしてしまっても、フォルダにマウントするので
使いかっては何もかわりません。
とりあえず、5GB割り当てました。

ドライブレター消してもいいんですけどね。
一応残しておきます

C:\
現在のマウント ポイントとボリューム名の考えられる値:

\\?\Volume{8268ee93-f2e5-11e3-ac69-806d6172696f}\
C:\

\\?\Volume{9b0fb430-f462-11e3-bd66-806d6172696f}\
D:\

\\?\Volume{a4cc88c1-f29a-11e3-b619-806d6172696f}\
Q:\

\\?\Volume{11f041c3-f486-11e3-a1ab-0800273a8d92}\
E:\
C:\cygwin\

カテゴリー: General
2014.06.15

sqlite.exe .dumpで文字化け 【& patch p2 編】

執筆:2011.12.09
編集:2011.12.10


概要
・sqlite.exe の dumpにHEXモードを追加する方法
・sqlite の 「dump」と「インポート」の仕方
・sqlite の構築の仕方
・php PDO sqlite versionの自動選択手法
ソースコードのダウンロード先

sqlite3に完全移行していたつもりだったのですが
今回、サーバーのDBファイルがあちこちのフォルダに散らばっているため
保存先を統一して整理した結果
version3シリーズへの移行をしていないデータがいくつかありました。

そして dumpすると ビープ音 ビ ビー。
インポートも書式エラーでできない始末。
もー、出力をエスケープしていないようです。

sqlite3に移行するのが目的なので、強引に HEXモードを加えました。
一緒に前回(昨年のパッチ1、set_table_name関数)の修正も入っています

sqlite3.exeの .dumpでは、BLOB型にしていれば、HEX出力されるようです。

とりあえず、
1個のDBを移行するのに使うだけで、
cygwinで動いて 、無事に移行できたのでよしとします。

» 続きを読む

2011.12.09

wget 1.12 for windows

執筆 2010/11/17

今日のお題
wget 1.12 と wget 1.11.x for windows
を検証してみましょう

ダウンロード
    ソース: gnuのサイトにあります。
    バイナリ: 配布サイトまたは、自分で構築
    wget-1.12-win32.zip

1.11.4から1.12への主なポイント
  • ソースレベルで前版とかなり違う
  • CSSがサポートされました
  • Internationalized Resource Identifiers (IRIs, RFC3987)のサポート
    libidn と libiconvが必用らしい。
  • windows : 1.11.4までは、wopenではなくfopenで書き込みのためutf8のurlは保存時に壊れていました。
    1.11.4: url.cのurl_file_name関数のfnameの修正で対応できます。
    ※unix環境では、1.11.4でも問題はないようです。 
  • そのままでは、Visual C++でコンパイルできなくなっています。
    wget-1.12/windows/READMEを参照

  その他詳しくは、wget-1.12/NEWSを参照

【構築へのヒント】
未改善点
・不完全なアトリビュートタグで失敗する 例<img src="a.gif" alt=>
  パッチ:  src/html-parse.c @@ -944,7
           /* <foo bar=> */
     -    goto backout_tag;
     +    continue;
・htmlコンバートオプションで失敗するらしい
  パッチ:  src/retr.c  @@ -828,7
    -    if (redirection_count && 0 != strcmp (origurl, u->url))
    +    if (0 != strcmp (origurl, u->url))

【msvcrtのdllが邪魔という場合】 埋め込みで構築します
  windows\Makefile.src
  +LDFLAGS    = $(LDFLAGS) /NODEFAULTLIB:msvcrt
 このオプションになっていないこと自体 タコ仕様。

【opennsslを内蔵したい】 埋め込みで構築します
  環境変数:LIBにopennsslのライブラリ(.lib)へのパスを加えれるとよい
  opennsslの欠陥のたびに構築しないでいいように
  通常は、動的ライブラリへのパスを設定し、動的リンク(dll)をお勧めします
  静的リンクもできます。

【考察】
  • このプロジェクトの特徴 安定版の修正版がなかなかない。
    マルチOSに対応した手軽な代用品があればいいのですけどね。

  • Unix?から派生したプロジェクトなのでwindowsサポートが弱い
    Unix環境を持っていれば、そちらの方がgetに失敗しない可能性が高い。
    しかしUnix環境はウイルスチェックが甘いので気をつけましょう。

  • その他見つけた欠陥
    • 特殊ファイル名を拒否しない
      DOS の予約語 (nul、aux、con、com1-9、lpt1-9, prn など)
      吹っ飛ぶ例:http://localhost/nul
      アドレスによっては、周辺機器に悪影響がでる可能性があります。
      「Naming a File」(http://go.microsoft.com/fwlink/?LinkId=76838) を参照してください。
      要点は信用できないサイトをwgetでgetしないこと ということ です。
      問題箇所は、url.cのurl_file_name関数あたりでしょうか。
      ※unixやcygwin版は普通に動くようです

  • FATシステムへの書き込み(NTFSしか使っていないので検証不能)
    1.11系では、FATシステムでは、@関係で失敗していましたが1.12系はどうなんでしょう。
    命名規則が同じなら落ちるでしょう。

  • wgetからサイトを守る方法
    • useragentで拒否
    • useragentを偽装した場合
    • robots.txt
    • ipやhostで遮断
  • 保存ファイル名を安全に
    1.11系までにあったファイル名の文字化け類が直ったといっても安全ではない。
    はやりのutf8だろうとか決めつけは厳禁です。
    %16進数のurlは、欧文、sjis、euc、utf8なのかはっきり言って短いとコードページの区別がつきません。
    パッチをあてて 1文字につき2バイト+数バイトかかってしまうが、総パス名の制限260を減らしてでも、
    一部のファイル名 及び 英数字と一部の記号以外は、16進数文字に強制変換してしまうほうが安全かもしれない。
    utf8の命名フォーマットから外れ+上記の条件で強制変換というルールもいいと思います。
    url.cのurl_file_name関数のfnameの修正で対応できます。
【結論】
 中途半端な実装のツール。
   とりあえず、windowsなら簡単に構築できるパッチをあてた 1.11.4でもいいと思う。

カテゴリー: General
2010.11.18

phpのchmヘルプファイルの作り方(ダウンロードしたchmが 文字化 け)


執筆:2007.07.05
編集:2007.07.05
編集:2011.02.16


公式サイトのchmが文字化けして、キーワードが読めなくなったり
コンテンツが欠けていたり・・・
配布サイクルが長くて待ち遠しい?・・・
正常なときのchm上書きで消しちゃったよ!

 さぁ、さくっと 自分でコンパイルしましょう。

通常はこちら

» 続きを読む

カテゴリー: ぷろぐらみんぐ
2007.07.10

Win Apacheでperlを1行目無視でcgi実行するには


執筆:2006.12.27
編集:2007.01.04


 普通に実行するには、httpd.confに
 Options +ExecCGI 
 AddHandler cgi-script .cgi
を書くだけで使えるでしょう。

そういう人は、これを読んでも意味がありません。

私のような、開発はWin 、サーバーはunix系だと
困ったことになるのです。

Cygwin(Win上で動くLinux)のApache
・Anhttpdサーバー
・仮想OSを使ってApache
・Win Apacheで無理矢理変換

などの選択がありますが、ここでは、無理矢理変換をやってみましょう。

Winでは、
CygwinのApacheやAnhttpdサーバー
を使えばなんの苦労もなく実行できるのですが

Win Apacheを使うと スクリプトの最初が
#!/usr/local/bin/perl
#!c:/prog..../perl.exe
と指定の仕方がちがうのでーす

CygwinのApacheつかえって つっこみは抜きでお願いします。


それで 、直接ハンドラを変更してみると 内部エラー・・・・
unix系で できるのになぜ?

Anhttpdサーバー的な使い方をしたいのですよ!!

いろいろ条件を変え、試して、
どうもWinのperl.exeは、環境変数をよんでくれない?
という結論にいたりました

直接perl.exeにおくらず
仲介ソフト+リダイレクトを通すことにしました。

やっていることは、
カレントディレクトリを変更して
STDINをファイルに書き出して
PATH_INFO
PATH_TRANSLATED
から
単に、コマンド実行させて結果をファイルに保存して、
そのファイルをコンソールにはきだすだけです。

ここで問題になるのが実行の同期問題です。
コマンド実行がくせもので、Win32アプリですと
言語はなんでもいいのですが
Shellexecでは「実行待ち無し」にしかできないので
「実行待ちができる」Shellコマンドを使うのですが、なぜかVBにしかないのです。
VBはもっていないので
Delphi2005でコンパイルできる VB.netで作ってみました。
 (ShellがないためにDelphi → Delphi.net → VB.net という経過をたどりました。)
つい慣れている環境で作ろうとしてしまうので・・・おもわぬところでつまづきました。 
VB.netはコード支援が働かないのでヘルプを見ながらコピペでペタペタと・・・

実行ファイルも7KBと小さいので、問題なしです。

本気でWin運用するには、
Win apacheではなく、仮想OSかCygwin上の方が
全角文字問題やmodrewriteの動作異常につきあわずに済みます。
またそのほうがセキュリティ的にいいと思います。

しかし、記憶容量やメモリや、実行速度の問題で
テストにしか使わないのに、いちいちそんなことできませんよー
というときに この技は 便利なんです。

  ScriptAlias /perl_MyCgi/ "c:/。。。/Perl/bin/"
  Action cgi-script "/perl_MyCgi/perl.exe"
これで 動けば一番いいのですが動かないのです。
※この方法で最近のphpは、動くようです。(php-cgi.exe)。
※perl.exeが馬鹿なので仕方がないです

そこで

CygwinのApacheつかえって つっこみは抜きでお願いします。

やり方は、非常に簡単です。
●ハンドラのオーバーライト(httpd.conf)
  ScriptAlias /perl_MyCgi/ "c:/。。。/Perl/bin/"
  AddHandler perl_cgi .cgi
  Action perl_cgi "/perl_MyCgi/perl_cgi_vb/perl_cgi_vb.exe"
●仲介ソフトの設置(ここでは、perl_cgi_vb.exe)
(※パスの全角文字は壊れるようなので、全角を含む場合は、Cygwinを検討しましょう)

ついでに、スクリプト内でのOSの確認は
if  (index($^O,'Win')
みたいな感じで分岐できます。MSWin32


わぁ。やったぁ・・・
 そ の ま ま
  う ・ ご ・ い ・ た

しつこいですが、
CygwinのApacheつかえって つっこみは抜きでお願いします。

※本気で使う場合は、CygwinのApacheか、仮想OS上で普通に使うほうが安全です。


仲介ソフト のコード(一部)
 VB.net  (Shellを利用するため)
PerlのPath  dim rk  as Microsoft.Win32.RegistryKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey("SOFTWARE\Perl")
   if Not(IsNothing(rk)) then
       Perl_exe_Path = rk.GetValue("BinDir","")
   End if
環境変数
の取得
PATH_INFO  = Environment.GetEnvironmentVariable("PATH_INFO")

PATH_TRANSLATED = Environment.GetEnvironmentVariable("PATH_TRANSLATED")
コマンドの
エスケープ用
Function QuotedStr(S as String)
       Dim c as Char
       c = """"  ' ややこしくなるので単純化
       Return c + S.Replace(c, c+c) + c
End Function
  Sub MakeStdinFile()
       dim AFileStream as FileStream
       Dim standardInput as Stream
       dim b as byte
       dim i as integer
      ' STDIN の内容を書き出す
       Temp_IN_FileName = getTempFileName()
       AFileStream = new FileStream(Temp_IN_FileName,FileMode.Create)
       standardInput = Console.OpenStandardInput()
       ' Seekをサポートしていないので 最後にきたかを判定。
       ' ReadByte() 終わりだと -1
       Try
         i = standardInput.ReadByte()
         While (i>-1)
           if (i = -1) then exit While
           b = Cbyte(i)
           AFileStream.WriteByte(b)
           i = standardInput.ReadByte()
         End While  '   Wend
       Finally
         AFileStream.Flush()
         AFileStream.Close()
       End Try
    End Sub
作成関数 Sub MakeStdinFile()
Sub DeleteStdinFile()
Sub DeleteTempFile()
Function getTempFileName() as string
Function cmd() as string
Function QuotedStr(S as String)
Sub ExecCGI()  ' shell
その他
使用したクラス
FileStream
Console.OpenStandardInput()
Console.OpenStandardOutput()

概要
 Stdinの内容をstandardInput.ReadByte()でファイルに納め、
コマンドとともにリダイレクトし、
結果ファイルを、FileStreamでreadbyteで読み込みながら
Console.OpenStandardOutput()へwitebyteで出力します。


CygwinやLinuxの場合。

普通に、
httpd.confに
 Options +ExecCGI 
 AddHandler cgi-script .cgi
を書くだけで使えるでしょう。

/usr/bin/perl

/usr/local/bin/perl
の場合に対応できるように

perlが入っていることを確認して
/usr/binと/usr/local/binにシンボリックリンクがあるか確認しましょう。
Cygwinの場合、ln -s /usr/bin/perl /usr/local/bin/ perl
で、リンクを追加しておけば、特に困ることはないと思います。

2007.01.04

win用のphpの拡張をmingw32コンパイルしようとしましたが
ファイルがないとかで
エラーがでて
どうしてもFreeBSDやlinuxで
windows dllを構築できないので
cygwinをいれてみることにしました。
http://cygwin.com/
dllができればいいだけなので
okです。
500MBくらいくいました。
Xは必要ないのでいれていません。
処理はかなり遅いようです。
cygwin
pkg_add や apt-getみたいなのが
あればいいのになぁ・・・
cygwinのsetup.exeをいちいち起動するのが
面倒だな
カテゴリー: Linux
2006.07.18

PR

[PR]