日記帳
本ページはプロモーションが含まれています
カテゴリー
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

アーカイブ

2018年06月 のアーカイブ

laravel 5.6 定義済み グローバル関数

ヘルパー関数でグローバル関数が定義されているので注意されたい。
次のコマンドで検索することができる
find . -type f -name "helpers.php"
./vendor/laravel/framework/src/Illuminate/Foundation/helpers.php
./vendor/laravel/framework/src/Illuminate/Support/helpers.php
./vendor/mockery/mockery/library/helpers.php

次のコマンドで、関数一覧を表示できる
grep "function_exists" ファイル名 | grep -oP "'.+'" | sort



エラー
"Too few arguments to function redirect(), 0 passed in vendor\laravel\framework\src\Illuminate\Foundation\Auth\AuthenticatesUsers.php on line 107 and exactly 1 expected "
はい。検索 redirect
  グローバル関数 redirect かぶり見たいですね。

Laravelに既存のプロジェクトを移行しようと思ったのですが
namespace使うように書き換えるか、既存のプロジェクトのredirect関数を別名に変更するしかないですね。
当然一括置換できる後者しか選択の余地がないですね。

ここで定義されています
vendor/laravel/framework/src/Illuminate/Foundation/helpers.php

このファイルで定義されいる同名関数が使われている場合は、誤動作する可能性がある。

一覧
vendor/laravel/framework/src/Illuminate/Foundation/helpers.php
'__'
'abort'
'abort_if'
'abort_unless'
'action'
'app'
'app_path'
'asset'
'auth'
'back'
'base_path'
'bcrypt'
'broadcast'
'cache'
'config'
'config_path'
'cookie'
'csrf_field'
'csrf_token'
'database_path'
'decrypt'
'dispatch'
'dispatch_now'
'elixir'
'encrypt'
'event'
'factory'
'info'
'logger'
'logs'
'method_field'
'mix'
'now'
'old'
'policy'
'public_path'
'redirect'
'report'
'request'
'rescue'
'resolve'
'resource_path'
'response'
'route'
'secure_asset'
'secure_url'
'session'
'storage_path'
'today'
'trans'
'trans_choice'
'url'
'validator'
'view'

vendor/laravel/framework/src/Illuminate/Support/helpers.php
'append_config'
'array_add'
'array_collapse'
'array_divide'
'array_dot'
'array_except'
'array_first'
'array_flatten'
'array_forget'
'array_get'
'array_has'
'array_last'
'array_only'
'array_pluck'
'array_prepend'
'array_pull'
'array_random'
'array_set'
'array_sort'
'array_sort_recursive'
'array_where'
'array_wrap'
'blank'
'camel_case'
'class_basename'
'class_uses_recursive'
'collect'
'data_fill'
'data_get'
'data_set'
'dd'
'e'
'ends_with'
'env'
'filled'
'head'
'kebab_case'
'last'
'object_get'
'optional'
'preg_replace_array'
'retry'
'snake_case'
'starts_with'
'str_after'
'str_before'
'str_contains'
'str_finish'
'str_is'
'str_limit'
'str_plural'
'str_random'
'str_replace_array'
'str_replace_first'
'str_replace_last'
'str_singular'
'str_slug'
'str_start'
'studly_case'
'tap'
'throw_if'
'throw_unless'
'title_case'
'trait_uses_recursive'
'transform'
'value'
'windows_os'
'with'
何年か前に
Windows10アップデートで
エクスプローラーのコマンドプロンプトが
勝手にPowershellに変わりました。

エクスプローラーの右クリックに コマンドプロンプトを追加する方法です。

regeditを実行

HKEY_CLASSES_ROOT\Directory\Background\Shell
に移動します

新規キーで以下を追加します(cmd_prompt, cmd_prompt\command)
HKEY_CLASSES_ROOT\Directory\Background\Shell\cmd_prompt
(既定) コマンド プロンプト

HKEY_CLASSES_ROOT\Directory\Background\Shell\cmd_prompt\command
(既定) cmd.exe /s /k pushd "%V"

以上で追加は完了です。

cmdという名前は、windowsが管理しているので名前はcmd_promptにしています。

ファイルに保存してクリック登録という方法もあります

コマンドプロンプト追加.reg
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\Background\Shell\cmd_prompt]
@="コマンド プロンプト"

[HKEY_CLASSES_ROOT\Directory\Background\Shell\cmd_prompt\command]
@="cmd.exe /s /k pushd \"%V\""
コマンドプロンプト Unicode 絵文字
DOSプロンプト

  1. ショートカットを作成する
    名前: コマンドプロンプトUTF8
    リンク先
    %SystemRoot%\system32\cmd.exe /U /K "chcp 65001"
    作業フォルダは、空欄にするとショートカットの保存先が作業フォルダになる
  2. 文字サイズなどのフォントを変更する場合は、
    いま作成したショートカットのプロパティを開き
    「フォント」タブをクリックする
🍎 りんご
© (c)
㊞ 〇印
をメモ帳でUTF-8を指定して保存する

先ほど作成したショートカットをクリックして、コマンドプロンプトを開き
type 保存したファイル.txt
を実行し、UTF-8文字が表示できることを確認する

下2つが正常に表示されない場合は、フォント 「MS ゴシック」を選択する

残念ながら、筆者のPCでは、絵文字🍎が表示できるフォントが一覧に表示されなかった。

まず使うことはないと思うが
UTF16を使いたい場合は、chcp 850 とする
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 オプション
>pip3 list --o
pip (9.0.3) - Latest: 10.0.1 [wheel]
setuptools (39.0.1) - Latest: 39.2.0 [wheel]
You are using pip version 9.0.3, however version 10.0.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.

python3最新版をいれたのにアップグレードが表示されるとは・・・。

>pip3 install --upgrade pip
Collecting pip
Downloading https://files.pythonhosted.org/packages/.../pip-10.0.1-py2.py3-none-any.whl (1.3MB)
Installing collected packages: pip
Found existing installation: pip 9.0.3
Uninstalling pip-9.0.3:
Successfully uninstalled pip-9.0.3
Successfully installed pip-10.0.1

>pip3 list --o
Package Version Latest Type
---------- ------- ------ -----
setuptools 39.0.1 39.2.0 wheel


/usr/bin/ld: warning: libssl.so.8, needed by /usr/local/lib/libcurl.so, may conflict with libssl.so.9

メンテナンスさていないOSのSSLライブラリが違うために起きる現象
原因
・OSの使っているSSLのライブラリを使用していない
・ライブラリに新しいバージョンのSSLをインストールして、内部で混在している
例) さくらインターネットの共有サーバー(FreeBSD9, -2018)

OSのSSLにあわせる場合
./configure オプション \
--with-ssl=/usr/local/ssl
エラーの出たアプリを作成する際に--with-sslを適切な値に変更する

opensslを$HOME/localなどに入れたものを引き続き使用する場合
crulをソースからインストールし、それを利用するようにconfigureオプションを修正する
./configure --prefix=$HOME/local/curl \
--with-ssl=$HOME/local/ssl
libtool: link: warning: library was moved.

パスを移動した場合に表示される
表示されている 「ファイル名.la」は、テキストファイルなので
LF改行が認識できるエディタで ファイルを開き
libdir='/usr/local/lib'
となっていることろを適切なパスに書き換えて保存すれば直る

さくらインターネット ライトプラン で django2.0 + python3.6

執筆:2018.06.15
編集:2018.06.15


設定の仕方
導入方法は関連ページへ

サイト内 関連ページ
  1. さくらインターネット ライトプランに python3をインストール
  2. Django2 CGI handler + apache2.4

応答速度
応答速度
django2.0
+ python3.6
(デフォルトページ)
PHP製のCMS
(運用しているサイト)
ライトプラン

0.48 - 1.41秒

0.50 - 1.46秒
https://
min : 0.48
max : 1.41
avg : 0.85 n[20]
https://
min : 0.50
max : 1.46
avg : 0.85 n[20]
備考 体感で遅く感じる 気にならない

ブラウザだとdjangoは少し遅く感じますが、機械的な取得だとほぼ同じという結果になりました。
djangoのデフォルトページに描画処理があるせいでブラウザだと遅いのかもしれないですね

pythonのほうは、この速度にさらに表示用のなんらかの処理を加えることになるので
phpのほうがcgi応答速度は速いということになります。

djangoは脆弱性がわりとあるようなので、ライトプランというcronが動作しない自動更新できない環境ではちょっと勇気がいる
djangoの導入は見送りになりそう。

キーワード
Django2 CGI handler
Django2 CGI handler さくらインターネット 共有サーバー
Django2 python3 さくらインターネット 共有サーバー
django 脆弱性
AH01215: suexec policy violation: see suexec log for more details

執筆:2018.06.14
編集:2018.06.14


AH01215: suexec policy violation: see suexec log for more details

さくらインターネット

.cgiの1行目のパスを間違っていた
#!/home/ユーザー名/local/bin/実行名

ユーザー名を間違っていて(契約とは違う別のアカウントを指定していたため)
気が付くのに1時間以上かかってしまった。

「パスがありませんでした」くらいのメッセージにしてくださいよ。
Django2 CGI handler + apache2.4 : メモ

執筆:2018.06.13
編集:2018.06.13


概要
python3.6 + django 2.0.6
  1. .htaccess に cgi用のエントリを追記する
  2. start-django.cgi を設置する(名称はなんでもいい)
    wsgi_emulate.py または wsgi_over_cgi.pyをimportする
  3. wsgi_emulate.py または wsgi_over_cgi.py を settings.py と同じフォルダに設置する
以上をすませて、アクセスすると CGIモードで動作する

基本的に wsgi_over_cgi.py 内の
from wsgiref.handlers import CGIHandler
from . import wsgi
app = wsgi.get_wsgi_application()
CGIHandler().run(app)
だけで動かないといけないのですが、django内の処理が間違っているために、環境変数名の変更 及び
PATH_INFO、FORCE_SCRIPT_NAMEの変更設定がwsgi_emulate.py または wsgi_over_cgi.py および setting.py内に追加されています。


IfModuleで条件指定しているため
wsgiモジュールが有効になった場合は自動的にwsgiで動作する

必要な設定
.htaccess

# 追加分
<IfModule !mod_wsgi.c>
<FilesMatch "\.(?i:pyc?)$">
order deny,allow
deny from all
# RewriteRule "" - [L,R=404]
</FilesMatch>

# wsgi_emulate.py 内で この値をもとに正しいURLを生成できるように成形される
setenv BASE_URI    /    # / or /pathtositetop
setenv SCRIPT_URL /    # / or /pathtositetop/

RewriteRule "^$" start-django.cgi [L,T=application/x-httpd-cgi]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule "." start-django.cgi [L,T=application/x-httpd-cgi]
</IfModule>

apacheが古くて、環境変数が渡らない場合は
start-django.cgi に以下を追加する
os.environ.setdefault("BASE_URI", "/") # / or /pathtositetop
os.environ.setdefault("SCRIPT_URL", "/") # / or /pathtositetop/
こちらに書き込んでいたほうが確実だろう

表示されない場合
  • start-django.cgi ファイルの実行権限がついているか確認する
  • djangoへのパスが通っているか?
    • インストールする場合
      pip3 install Django
    • 指定フォルダから読み込む場合
      スクリプト内で
      sys.path.append("パス")
  • pytzの確認
    pip3 install pytz
  • No module named '_sqlite3'
    sudo pkg install databases/py35-sqlite3
# https://www.djangoproject.com/download/
# https://pypi.python.org/pypi/pytz#downloads


PR

[PR]