さくらインターネット


2014年版 さくらでpearインストール(go-pear.phar使用)

さくらインターネットでpearをインストールしたときの覚書。
go-pearを使ったが、ファイルが古いのか利用中のさくらサーバーではインストールできず。(途中で止まる)。

2014年4月現在、下記の方法でpearがインストールできる。

1.ターミナルでサーバーにインストールして、go-pear.pharをダウンロード。

------------------------------------
curl http://pear.php.net/go-pear.phar > go-pear.phar
------------------------------------

このとき、ダウンロード先はここにした。
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/home/ユーザー名
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

2.次のコマンドを実行してインストール開始。
------------------------------------
php go-pear.phar
------------------------------------

インストール先を「/home/ユーザー名/pear」にしたかったので、事前に「pear」フォルダを作っておいた。「/home/ユーザー名」にある「go-pear.phar」を実行すれば、希望のフォルダにインストールされた。

インストール途中でメッセージが出た。
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Would you like to alter php.ini ? [Y/n] :
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
権限がなくて変更できないので「n」を選択。

以上でインストールは完了。

参考ページ: こちら

以下はおまけの覚書。

3.DB.phpが使いたかったので、コマンドを実行してインストール。

------------------------------------
pear install DB
------------------------------------

4.使いやすくするためにDB.phpのある場所にパスを通す。

php.iniに追記した内容
------------------------------------
/home/ユーザー名/pear/share/pear
------------------------------------

また、PHPファイルでデータベースを読み込んだときエラーが出たが、単にログインパスワードを間違えていただけだった・・・

ブラウザに出力されたエラー内容
------------------------------------
Warning: mysql_set_charset(): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) in /home/ユーザー名/libs/function.php on line 220

Warning: mysql_set_charset(): A link to the server could not be established in /home/ユーザー名/libs/function.php on line 220
ConnectError!DB Error: connect failed
------------------------------------

さくら共有サーバーでImportError: No module named MySQLdbが出る

さくら共有サーバーに「MySQL for Python」をインストールしたときに、ImportErrorが出た。解決方法の覚書。

【環境と前提】
---------------------------------
・さくらスタンダードプラン
・/home/workroom/local以下に自前の python2.7 がインストール済み。(さくら標準のpythonとは別で)
・/home/workroom/local以下に MySQL for Python がインストール済み。
---------------------------------

import MySQLdb を行うとエラーが出るのだが、理解に苦しんだのはエラー発生の条件が限定されているということ。

エラー内容
---------------------------
Traceback (most recent call last):
File "python_test4.cgi", line 11, in
import MySQLdb
ImportError: No module named MySQLdb
---------------------------

エラーが出る、もしくは出ないのは次の場合。

エラーが出ない(問題なし)
---------------------------
1.自前のpythonにパスを通して、ターミナルで「import MySQLdb」したとき。

2.テキストファイルの先頭に「#!/usr/local/bin/python」と記述して、pythonスクリプトをアップロードして、さくら標準のpythonを使い、ブラウザで読み込んだとき。
---------------------------
この2つの場合は、問題なく動作する。

エラーが出る
---------------------------
1.テキストファイルの先頭に「#!/home/username/local/bin/python」と記述して、pythonスクリプトをアップロードして、自前のpythonを使い、ブラウザで読み込んだとき。
---------------------------
自前のpythonを使って、ブラウザでpythonスクリプトを読み込んだときだけエラーが発生する。

「.cshrc」に PYTHONPATH や LD_LIBRARY_PATH を設定しているのに、無い!といわれる。

いろいろ悩んだ結果、解決法。
pythonスクリプトの先頭の記述を変更した。

---------------------------
#!/home/username/local/bin/python
---------------------------

↓↓↓

---------------------------
#! /usr/bin/env -S LD_LIBRARY_PATH=/home/username/local/lib PYTHONPATH=/home/username/local/lib/python:/home/username/local/lib/python/site-packages:/home/username/local/MySQL-python-1.2.3:/home/username/local/lib /home/username/local/bin/python
---------------------------

ようは、「.cshrc」に記述してあったpython関係のパスの記述を、全部テキストファイルの先頭にもコピーした。

これで動いた。自前のpythonをテキストファイルの記述で動かすと、「.cshrc」に書いてあるパスは無視されるって事かな?

参考:こちら

テキストファイルのpythonスクリプトでcabochaがエラーになる

テキストファイルのpythonスクリプトでcabochaがエラーになったときの対処法。

ターミナルではpythonでcabochaが動かせるが、テキストファイルに記述したpythonスクリプトからcabochaを実行するとエラーになった。

【環境と前提】
・さくらスタンダードプラン
・/home/username/localに自前のpython2.7がインストール済み
・/home/username/localにcabochaがインストール済み
・テキストファイルのpythonスクリプトでのみ問題発生。

エラー内容(Apacheのエラーログ)
------------------------------------------------------
Traceback (most recent call last):
File "python_test2.cgi", line 5, in
import CaboCha
File "/home/username/local/lib/python2.7/site-packages/CaboCha.py", line 26, in
CaboCha = swig_import_helper()
File "/home/username/local/lib/python2.7/site-packages/CaboCha.py", line 22, in swig_import_helper
mod = imp.load_module('_CaboCha', fp, pathname, description)
ImportError: Shared object "libcabocha.so.4" not found, required by "_CaboCha.so"
------------------------------------------------------
テキストのpythonスクリプトだと、共有オブジェクトが見つからないよう。パスが通ってないということだろう。

解決方法

スクリプトの先頭の記述を次のように変更した。

------------------------------------------------------
#!/home/username/local/bin/python
------------------------------------------------------

↓↓↓

------------------------------------------------------
#! /usr/bin/env -S LD_LIBRARY_PATH=/home/workroom/local/lib /home/workroom/local/bin/python
------------------------------------------------------

参考:こちらのページの最後ら辺

【さくら共有サーバー】pythonでmysqlを使えるようにする

pythonでmysqlを使えるようにした際の覚書。

概要をつかむための参考ページ

【環境と前提】
・さくらスタンダードプラン
・「/home/username/local」に自前のpython2.7がインストール済み

1.pythonでmysqlを利用するためドライバをインストール

ドライバは何種類かある中で「MySQL for Python」を選択。デファクトスタンダードらしい。

こちらからダウンロード(この時のファイル名、MySQL-python-1.2.3.tar.gz)

ダウンロード先は「/home/username/local」で、次に解凍。
解凍したフォルダに移動してセットアップを実行。

参考:こちら

セットアップコマンド
--------------------------------------------------
% python setup.py install --home=~/local

Traceback (most recent call last):
File "setup.py", line 5, in
from setuptools import setup, Extension
ImportError: No module named setuptools
--------------------------------------------------

エラーで出る。

setuptoolsがないとのことで、インストールする。

参考:Pythonで一番最初に入れるべきパッケージ
  こちらも参考

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

ダウンロード後、解凍し、フォルダの中へ移動。

コマンドを実行。
--------------------------------------------------
python ez_setup.py
--------------------------------------------------

インストールできたことを確認するため、コマンドを打って確認
--------------------------------------------------
easy_install
--------------------------------------------------
エラーは出るけど、コマンド自体が存在していることを確認。

setuptoolsがインストールできたので、「MySQL-python」に移動してsetupをリトライ。

コマンド
--------------------------------------------------
python setup.py install --home=~/local
--------------------------------------------------

今度は別のエラーが出る。

エラー内容
--------------------------------------------------
% python setup.py install --home=~/local

running install
Checking .pth file support in /home/username/local/lib/python/
/home/username/local/bin/python -E -c pass
TEST FAILED: /home/username/local/lib/python/ does NOT support .pth files
error: bad install directory or PYTHONPATH

You are attempting to install a package to a directory that is not
on PYTHONPATH and which Python does not read ".pth" files from. The
installation directory you specified (via --install-dir, --prefix, or
the distutils default setting) was:

/home/username/local/lib/python/

and your PYTHONPATH environment variable currently contains:

''

Here are some of your options for correcting the problem:

* You can choose a different installation directory, i.e., one that is
on PYTHONPATH or supports .pth files

* You can add the installation directory to the PYTHONPATH environment
variable. (It must then also be on PYTHONPATH whenever you run
Python and want to use the package(s) you are installing.)

* You can set up the installation directory to support ".pth" files by
using one of the approaches described here:

https://pythonhosted.org/setuptools/easy_install.html#custom-installation-locations

Please make the appropriate changes for your system and try again.
--------------------------------------------------

どうもPYTHONPATHがエラーの原因のようなので、PYTHONPATHの設定を変更する。

ホームディレクトリにある「.cshrc」に以下を追加。
参考:こちら

--------------------------------------------------
setenv PYTHONPATH $HOME/local/lib/python:$HOME/local/lib/python/site-packages

setenv LD_LIBRARY_PATH $HOME/local/lib
--------------------------------------------------
※実際には「$HOME/local/lib/python」というフォルダは存在しない。あるのは「$HOME/local/lib/python2.7」。だけど構わない。

パスの確認は、コンソール画面で
-----------
python
>>>import sys
>>>sys.path
-----------

サーバーに再接続して、ふたたびsetupを試みる。

コマンド
--------------------------------------------------
python setup.py install --home=~/local
--------------------------------------------------

うまくいった。

おまけ。
別に機会に「MySQL for Python」をインストールしたときは、こんなエラーが出た。

エラー内容
--------------------------------------------------
% python setup.py install --home=~/local
running install
error: can't create or remove files in install directory

The following error occurred while trying to add or remove files in the
installation directory:

[Errno 2] No such file or directory: '/home/workroom/local/lib/python/test-easy-install-35897.write-test'

The installation directory you specified (via --install-dir, --prefix, or
the distutils default setting) was:

/home/workroom/local/lib/python/

This directory does not currently exist. Please create it and try again, or
choose a different installation directory (using the -d or --install-dir
option).
--------------------------------------------------
「python」という名前のディレクトリを作ってあげたら解決した。

【さくら共用サーバー】pythonでprint出力する

さくら共用サーバーで、pythonを使って、ブラウザに文字を出力する方法。

さくらインターネットスタンダードプランにはあらかじめpythonがインストールされているので、それを利用する。

以下の文字をテキストエディタにコピペして保存。
保存時の拡張子は「.cgi」にする。(「.py」でない。)
-------------------------
#!/usr/local/bin/python
# -*- coding: utf-8 -*-

print "Content-type: text/html\n"
print "hello world "
-------------------------

そして、「www」フォルダ以下に入れる。

-----気をつけるが何点かある-----

1.「/usr/local/bin/python」は自身のサーバー環境を確認。
2.改行コードは「LF」にする。
3.アップロードしたファイル及び、ディレクトリのパーミッションは「755」か「705」にする。
4.「Content-type: text/html」は必須。無いと Internal Server Error になる。詳細はこちら
--------------------------------

さくら、poderosaでmysqlのデータ表示すると文字化けする

さくらのmysqlサーバーの文字コードはEUC-JP。

poderosaの文字コードもEUC-JPに合わせれば、きちんと見れる。

さくら共用サーバーにmecabをインストールする

さくら共用サーバーで php-mecab を使うだけならサービスに元々含まれている mecab を利用できる。自前の mecab は不要なのでこのエントリーの作業は不要。自前で mecab はインストールすべき。デフォルトの mecab は php のバージョンアップなどでフォルダが変わることがある。php-mecab は mecab のフォルダを指定してるので不具合が起こる。

さくら共用サーバーにmecabをインストールに至った経緯↓↓

=========================================
さくら共用サーバーには最初からmecabが入っている。但し辞書はEUC-JPなのでUTF-8で利用するには自前で辞書を用意しなくてはならない。で、辞書のみをインストールしたがどうもうまくいかない。UTF-8でインストールしても文字化け、EUC-JPで文字を扱ってしまう。
いろいろ調べると、当方サーバーにインストールされているmecabのバージョンは、「0.995」で、このバージョンはUTF-8の辞書をうまく使えないバグがあるらしい。
ということで別バージョンのmecabを共用サーバーにインストールした。
=========================================
↑こう書いたもののいざやってみると、v0.97でも辞書のutf-8化ができない場面に遭遇。mecab本体のインストールは問題なし。mecabのバージョンと辞書の文字コードは関係ないのかもと思い始める。ただutf-8の文字コードで動かすことはできた。詳しくは下記のリンク。

utf-8の辞書、インストール方法はこちら

インストールするmecabのバージョン
-----------------------------------------
mecab 0.97 ←別サーバーでバグがないことを確認済み
-----------------------------------------

インストール先(localは自分で作る)
-----------------------------------------
/home/username/local/
-----------------------------------------

1.ダウンロードしたファイルを解凍
-----------------------------------------
tar xzvf mecab-0.97.tar.gz
-----------------------------------------

2.「configure」実行
-----------------------------------------
cd mecab-0.97 ←フォルダ移動

./configure --prefix=$HOME/local --with-charset=utf8 --enable-utf8-only
-----------------------------------------
※「configure」というシェルスクリプトを実行することで、ソースファイルをコンパイルする前に、インストール対象となるシステム特有の機能/情報をチェックし、チェック状況を記述したMakefileが作成される。

3.コンパイルとインストール
-----------------------------------------
make ← コンパイル

make install ← インストール
-----------------------------------------

すると、インストール時にエラーが出る。

エラー内容
-----------------------------------------
%make install
.././install-sh: Permission denied
*** Error code 126
-----------------------------------------

mecab-0.97フォルダ内のinstall-shファイルにアクセス権限がないとのことで、確認してみる
-----------------------------------------
ls -l install-sh
-----------------------------------------
こう表示された
-----------------------------------------
-rw-r--r-- 1 username users 5569 Jan 29 2007 install-sh
-----------------------------------------

アクセス権限を変更(「install-sh」は「install -sh」でないよ。ハマッた)
-----------------------------------------
chmod 755 install-sh
-----------------------------------------

再びインストールを試みる
-----------------------------------------
make install
-----------------------------------------
(make cleanで不要はファイルは消せる)

インストール成功。

接続し直してバージョンを確認。binフォルダはインストールが成功するとできる。
-----------------------------------------
~/local/bin/mecab -v
-----------------------------------------
~(チルダ)は、ユーザのホームディレクトリ(home/username)のこと。$HOMEも同じ。

4.簡単に使えるようにパスを通す

現在のPATHを確認してみる
-----------------------------------------
echo $PATH
-----------------------------------------

結果
-----------------------------------------
/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin:/home/username/bin
-----------------------------------------
:」は区切り。

パスを書き換えるため、exportを実行するがエラーが出る

コマンド
-----------------------------------------
export PATH=~/local/bin:$PATH
-----------------------------------------

結果
-----------------------------------------
export: Command not found.
-----------------------------------------

ファイルを直接書き換えることにする。
利用しているシェルを確認してみる

コマンド
-----------------------------------------
echo $SHELL
-----------------------------------------

結果
-----------------------------------------
/bin/csh
-----------------------------------------

この場合、ホームディレクトリ直下にある.cshrcファイルを編集することになる。
パスは左から優先されるので、自前のmecabが選択されるよう、一番左にパスを追加する。

編集内容
-----------------------------------------
#set path = (/sbin /bin /usr/sbin /usr/bin /usr/local/sbin /usr/local/bin $HOME/bin) ←コメントアウト
set path = ($HOME/local/bin /sbin /bin /usr/sbin /usr/bin /usr/local/sbin /usr/local/bin $HOME/bin) ←追加行
-----------------------------------------

(エックスサーバーは bash なので .bashrc に↓追記)
-----------------------------------------
export PATH=$HOME/local/bin:$PATH
-----------------------------------------

PATHが通ったことを確認
-----------------------------------------
echo $PATH
-----------------------------------------

mecabのバージョンを確認
-----------------------------------------
mecab -v
-----------------------------------------

なお辞書をインストールしていないとエラーが出る
-----------------------------------------
param.cpp(69) [ifs] no such file or directory: /home/username/local/lib/mecab/dic/ipadic/dicrc
-----------------------------------------

辞書のインストールはこちら

【mysql】改行を含むCSVファイルをインポートする方法

改行を含むCSVファイルのインポート方法。

CSVファイルの記述ルールは次の通り。

CSVのルール(一部)
------------------------------
LOAD DATA INFILEがデフォルトで対応している書式は、フィールド区切りがタブ、行末が改行。
値は基本、ダブルクォートで囲む。但し、「ダブルクォート(")」「カンマ(,)」「改行()」などの制御文字を含まない場合は「"」で囲まなくても可。
よって、値に改行を含む場合は、必ず「"」で囲む。

「"」のエスケープは「""」(連続したダブルクォート)。場合により「\"」のエスケープも可。
囲み文字と区切り文字の間には何も入れない。
×"値1", "値2" → ○"値1","値2" (×の例はカンマの左に半角スペースが入っている)
------------------------------
追加ルール1 → ファイルの一番最後に改行は入れない。改行を入れるとフィールドの区切り文字がデータと一緒に入ってしまう現象を確認。

つまり値を「"」で囲めば問題なく動作する。

実際のコマンド
---------------------------------------------
load data local infile "/home/username/www/text.csv" into table テーブル名 fields terminated by ',' enclosed by '"'
---------------------------------------------

「enclosed by」を指定して「"」が囲み文字であることを伝える。もちろんCSVファイルの値自体も「"」で囲むこと。

(※CSVファイルをZIPで圧縮のままload data local infileを実行すると、改行も区切りと認識してうまくいかないかも?実行するときは必ずCSVファイルの状態で。)

※ちなみにxamppをインストールしたwindowsのmysqlで実行する場合は「local」は不要。
CSVファイルのパスは、「¥」でなく「/」を使う
--------------------------------------------------------
load data infile 'C:/xampp/php/test.csv' into table テーブル名 fields terminated by '$' enclosed by '%'
--------------------------------------------------------

The used command is not allowed with this MySQL version」とエラーが出る場合は、「--enable-local-infile」をつけてmysqlサーバーに接続しなおすこと。詳しくはこちら

さくら共有サーバーでCSVファイルをインポートする方法

さくら共有サーバーでCSVファイルをインポートした際の覚書。
ファイルのインポートは「load data」を使う。

用意したCSVファイル、test.csv
---------------------------------
3,テストです
---------------------------------
インポート先のテーブルもフィールドは2つ。

1.SSHでサーバーにログインする

2.データベースサーバーにログインする

ログインした際のコマンド
---------------------------------
mysql -u ユーザー名 -h mysqlxxx.db.sakura.ne.jp -p --enable-local-infile
---------------------------------
大事なのは行末の「--enable-local-infile」でLOAD DATA LOCAL INFILE 文を使えるようにしておくこと。無いと「load data local」したとき、
「The used command is not allowed with this MySQL version」とエラーが出る

3.「load data」を実行してインポート

----------------------------------------
use データベース名 ←データベースを選択。「ユーザー名_データベース名」となっているのを忘れないこと。

load data local infile "/home/username/www/test.csv" into table テーブル名 fields terminated by ',';
----------------------------------------
「LOCAL」をつけることで、FILE権限なしで、ローカルファイルの読み込みが可能になる。「fields terminated by」はフィールド区切り文字の指定。ちなみに囲み文字の指定は「OPTIONALLY ENCLOSED BY」で行う。
行の終わりは「lines terminated by '\n'」で明示できる。

さくら共有サーバー、php_mecabのインストール方法

さくら共有サーバー、php_mecabのインストール方法

前提として、mecab の辞書にアクセスする必要があるので辞書をローカルフォルダ以下にインストールしておく必要があ(さくらに最初から入っている辞書を使うこともできるが、htmlファイルが UTF-8 の場合、デフォルトの辞書が EUC なので文字化けしてしまう)。
さくら共有サーバー、UTF-8の辞書でmecabを使う方法 ←この作業を済ませておく

1.ファイルを解凍してビルド
///////////////////////////////////////////////////
tar xvfz php-mecab-0.5.0.tgz ←解凍

cd php-mecab-0.5.0 ←ディレクトリ移動

phpize ←拡張モジュールをビルド(ソースファイルから実行可能なファイルを作成。configureファイルができる)
※-ize(アイズ)・・・~化する。~で扱う。

※エックスサーバーでは phpize は使えないので php_mecab はインストールできない。yum や rpm コマンドが使えないので phpize の追加もできない。どうしても phpize が使えない環境で PHP + mecab を実行したいなら PHP の EXEC 関数でコマンドラインを操作してすることならできそう?
///////////////////////////////////////////////////

2.「configure」を実行
///////////////////////////////////////////////////
./configure --with-mecab=/usr/local/bin/mecab-config --with-php-config=/usr/local/php/5.3.27/bin/php-config
///////////////////////////////////////////////////
php-configのバージョンは必ずあわせる。現在使用しているphpのバージョンをphpinfoで確認。今回は「5.3.27」。指定しなくてデフォルトのバージョンが呼び出されるとうまくいかない。phpのバージョンはターミナルから「php -v」でも調べられるが出てきたバージョンのフォルダ名がない場合がある(php -v で「5.45」と出たが存在するフォルダは「5.4」だった)。使用しているphp のバージョンはサーバーコントロールにログインして調べるといい。
mecab-configの場所は「which mecab-config」で特定できる。自前の mecab をインストールしている場合はそちらのパスを指定する。

3.コンパイルとインストール
///////////////////////////////////////////////////
make ←コンパイル
make install ← インストール
///////////////////////////////////////////////////

インストールするとエラーメッセージが出た
----------------------------------------------------------------------
Installing shared extensions: /usr/local/php/5.3.27/lib/php/extensions/no-debug-non-zts-20090626/
cp: /usr/local/php/5.3.27/lib/php/extensions/no-debug-non-zts-20090626/#INST@99219#: Permission denied
----------------------------------------------------------------------
権限のないところにインストールを試みているよう。
ローカルフォルダにインストールするように、Makefileをいじる。(make実行後に作成されるファイル)

Makefileの変更箇所
----------------------------------------------------------------------
#EXTENSION_DIR = /usr/local/php-5.x.x/lib/php/extensions/no-debug-non-zts-20060613 ←コメントアウト
EXTENSION_DIR = $(HOME)/local/lib/php/extensions/no-debug-non-zts-20060613 ←追記
※「20060613」とかフォルダ名は合わせるといい。
----------------------------------------------------------------------

再びmake installすると無事にインストールが完了するはず。

4.続いて、PHPの起動時に読み込まれる拡張モジュールを設置するディレクトリの設定

PHP.iniに拡張モジュールの置き場を記述する

PHP.iniに記述(追記)する内容
----------------------------------------------------------------------
extension_dir="/home/username/local/php-mecab-0.5.0/modules"
extension=mecab.so
----------------------------------------------------------------------
※拡張子 so は shared object の略。UNIX系OSの共有ライブラリのファイル形式。

最初、こう書いたら動かなかくてハマった。
----------------------------------------------------------------------
extension_dir="/home/username/local/lib/php/extensions"
extension=mecab.so
----------------------------------------------------------------------

作業時に出力されたメッセージを見てとりあえず動くところまで持ってこれた。
----------------------------------------------------------------------
Libraries have been installed in:
/home/sunsdoor/local/php-mecab-0.5.0/modules

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
- add LIBDIR to the `LD_LIBRARY_PATH' environment variable
during execution
- add LIBDIR to the `LD_RUN_PATH' environment variable
during linking
- use the `-Wl,--rpath -Wl,LIBDIR' linker flag

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------

UTF-8の辞書を使いたいのでphp.iniに追記
----------------------------------------------------------------------
mecab.default_dicdir=/path/ ←辞書
mecab.default_userdic=/path/ ←ユーザ辞書
----------------------------------------------------------------------
※UTF-8 の辞書を使う場合は phpファイルの保存形式やメタタグ(headタグ内)の文字コードも UTF-8 に揃える必要がある。

自分の環境だといずれか(dicrcとかsys.dicがあるフォルダ)
----------------------------------------------------------------------
mecab.default_dicdir="/home/username/local/mecab-dic/ipadic-utf8"
mecab.default_dicdir="/home/username/local/lib/mecab/dic/ipadic"
----------------------------------------------------------------------

うまくいっていたらphpinfoにmecabの項目が表示されている。

3 / 41234