はにまログ

「はにまる」のようにゆるーく生きたい。

寒天培地で育てられた水草購入

熱帯魚の趣味についても書いてみようと思います。
より詳しく言うと、アクアリウムで、水槽の中に水草を植えて楽しんでます。
もちろん、おさかなさんも好きなので、一緒に入れて育ててます。
熱帯魚がより生き生きと生活している様子が楽しいのです。

先日、東大阪のアクアティラーズさんで、水草を購入しました。
アクアテイラーズ Aqua Tailors 東大阪のアクアリウムプロショップ 淡水魚・水草・シュリンプ・海水魚・無脊椎販売

うちの水槽は 60cm とごくノーマルな大きさの水槽です。

しかも、現在 結構大きめの植物も植わっている状況…。
どんどん成長しちゃう様な、元気な水草を植えるわけにもいきません。

今回、小さくてこじんまりした、かわいらしい水草を見つけて、3つ購入してみました。

 小型のクリプトでうちの狭い水槽にもレイアウトしやすそう。
 しかも、やや日陰でも育てやすいクリプト、というポップも張ってあり、すでに水草が植えてある水槽にはピッタリなんじゃないかと。
 でも以前、クリプト買ったとき、予想以上に伸びた記憶があり、後景として植えてみました。

  • ヒドロコティレ・ミニ(写真:左手前)

 小型のヒドロコティレで、前景にも中径にも使えるみたい。
 姿かたちは「つた」風で、葉っぱがすごく小さいのがかわいらしい。
 うちの水槽に相性がよさそうなので買ってみました。

  • ミリオフィラム・マットグランセ(写真:中央奥)

 これは和の風情がある水草なので、前からほしかったんで、思わず買っちゃいました。
 でも、これは、有茎層と言って茎がすっと伸びるタイプの水草
 もりもり育つか、貧弱でへなへなになるか、心配しております。
 光景で、できる限り光が当たりそうなところにそっと植えました。

いずれも、「ADA水草のもり」シリーズです。
今回、初めて、寒天培地で滅菌状態で作成された苗を買いました。
寒天なんてそのうち溶けちゃうでしょ、と思い培地ごと植え付けようとしましたが、、
寒天培地って水より軽いのでうまく植えることができません。

そこで、寒天培地を割って除去しました。
中には、培地に根が張り、苗の株同士を分離できないため、ほとんど培地を除去できなかった苗もありましたが、
その場合、そのまま植え付けて、上から少し土をかけて浮かないようにしました。

元気に育ってほしいもんです~。

PHPビルトインサーバーにIPアドレス指定でアクセスするには?

問題

PHPインストール後、ビルトインサーバを立ち上げてみた。
PHP: ビルトインウェブサーバー - Manual
マニュアルに従って立ち上げる。

php -S localhost:8000

すると、サーバー本体から

curl http://localhost:8000/src/test.php

などでアクセスできるが、家庭内のPCからサーバーのIPを指定した場合、まったくアクセスできない。

http://192.168.11.5:8000/src/test.php

解決

マニュアルをよく読んでみると、以下のように書いている。

ウェブサーバーを、任意のインターフェイスからポート 8000 でアクセスできるようにするには、このようにします。
$ php -S 0.0.0.0:8000

早速試してみた。

php -S 0.0.0.0:8000

この状態でブラウザに再度上記のURLを指定すると、

http://192.168.11.5:8000/src/test.php

アクセスできた~!!ちなみに

$ php -S 192.168.11.5:8000

でもOK。

マニュアルにも、「IPアドレスでアクセスできるようにするには」、とか書いてくれれば判りやすいのになぁ~。

「アドラーに学ぶ部下育成の心理学」を読んで


Amazon.co.jp: アドラーに学ぶ部下育成の心理学: 小倉 広: 本


私はあまり部下を叱るのは意味がないと思っていました。ただ同時に、失敗をフォローするだけで終わらせてしまっていいのか、成功したときにほめるだけだと何かが足りないのはないか、とも感じていました。
この本で、その必要なピースの一つが見つかったように思います。それは「勇気づけ」。(成功/失敗関係なく、)部下の「成長」のポイントを見つけてやることが、何よりの勇気づけになるようです。
たぶん正しく勇気づけてあげるには、普段から部下の事をよく見ておく必要があります。今その部下には何が足りないのか、次はどのように成長すればよいのか考えてやる、一定の努力が必要となります。ただ、難しく考える必要はなく、部下が成長しようとしているのを前提として構わない、のがポイントだと思いました。

また、「教えるな」という点にも納得です。私自身、「思ったとおりにやれ」と言われた時が一番やる気が出た経験があります。その時の事を思い返してみると、ポイントは「自分で決めていいんだ」と気がつけた事にあったようです。その時、自然に「自分はどうしたいか」という考えが芽生えるようになりました。それは決して「放置」ではなかったです。
つまり「相手に任せる」という事、相手を信じる事です。信じないより、信じたほうが、自分の人生は豊かになるかもしれません。それに信じてもらったほうが、相手は頑張るでしょうしね。お互いハッピーでしょう。

成功したときはいいですけど、失敗したとき、自分なら部下にどう接するべきなのか、という大きな課題もありますね。この本では約束に対して成果が上がったかを、感情抜きで論理的に判断するのが、采配として正しいとしています。むしろ、はっきりと采配しないと、約束どおりでなくてよかったんだという誤解を生むので、という教育上の配慮を大切にしているのですね。これも、処遇が悪くなってがっかりしても、自分が原因なんだと跳ね返して頑張るのは部下自身、という相手を信じるスタンスに基づいています。
また、そのスタンスをはっきりと伝える必要があるな、と思いました。失敗は成功のもと、という考えは私も好きです。ただそれを旗印にしただけでは腐ってしまう時もあると思います。その時こそ勇気づけてやる必要がありそうです。
私としては成果判断の根本となる目標設定が大事なんだろうな、とも思いました。部下が目標を自分のものとする、そこがスタートなのではないかと。

また、失敗時の処遇も、論理的に意味のある内容にするべきとあり、大事だと思いました。関係のない適当な処置を施すと、「罰」にしかならないのですね。

部下は自立して考える、という事を逆にとらえれば、部下の感情はコントロールできない、ということになります。だから、蔭口や反論があっても無理に解消させない。今までそればかり気にしてくじけそうになっていましたが、気にしても仕方がない。むしろ、自分の感情をコントロールしなさい、と。
確かに、上司なのに逆切れしてたらいけませんよね。簡単じゃないですが、出来る限り頑張ろうかとは思いました。

MySQLストアドプロシージャのサンプル1

ストアドを久々に作ったら色々と忘れてました…。
サンプルに解説を付けておけば判り易く覚えられそう。

#既存プロシージャがあれば DROP してから CREATE する事。
#DROP は DELEMITER 外に書く事。
DROP PROCEDURE IF EXISTS memberupdate;
DELIMITER //
CREATE PROCEDURE memberupdate ()
BEGIN

  #宣言は、変数、カーソル、ハンドラの順に行わないとエラーが出る。
  #他にもDATE、CHARなどの型も利用できる。
  DECLARE mem_id INT;
  DECLARE mem_name VARCHAR(20);
  DECLARE mem_age INT;
  DECLARE fetch_state INT default 0;

  #カーソルはSELECT文をそのまま利用できる。
  DECLARE cur_member CURSOR FOR 
    SELECT uid, name, age FROM member;

  #ループの終了判別にエラーハンドラを利用している。
  DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET fetch_state = 1;

  OPEN cur_member;

  #ラベル名:の後ろには半角スペースを入れる事。
  label1: REPEAT

    #MySQLのプロシージャには配列が無い。
    #だから、カーソルのループ内で、値を取り出してで更新処理を行っている。
    #一時テーブルを作る方法もあるが、結構面倒なので。
    FETCH cur_member INTO mem_id, mem_name, mem_age;
    IF NOT fetch_state THEN
      UPDATE member SET name = CONCAT(mem_name, 'さん'), age = mem_age + 1 WHERE uid = mem_id;
    END IF;
    counter=counter+1;
    IF mem_id=2 THEN

      #LEAVEで特定ラベルのループを抜ける事ができる。
      #この例では単一のループなのであまり意味が無いが、
      #入れ子でループしている場合に効果あり。
      LEAVE labl1;
    END IF;
  UNTIL fetch_state
  END REPEAT label1;

  CLOSE cur_member;

#最後のENDの後ろにセミコロンを入れない事。
END
//

#末尾DELIMITERと;の間には半角スペースを入れる事。
DELIMITER ;

サーバ間でmountする場合は、mountされる側にNFSサービスが必要!

覚えるためにメモ。

サーバ(192.168.10.111)から別サーバ(192.168.10.110)のディレクトリを mount した。

vi /etc/fstab
...
192.168.10.110:/var/www/html /html nfs defaults 0 0
...など編集

mount -a

しかしこの結果
mount.nfs: access denied by server while mounting (IPアドレスなど)
とエラーが表示されてしまう。

ちなみに、SELinuxは沈静化してあるので、このせいではない。
よくわからないのでググってみると、マウントされる側の準備も必要だったようだ…。

1 NFSサーバ側サービス起動の確認

DBサーバ側で

chkconfig
  • rcpbind
  • nfs
  • nfslock

が起動している事を確認。

2 NFSサーバ側の受け入れ状態確認
exportfs -v
3
vi /etc/exports

/var/www/html 192.128.10.111(rw,sync)

NFSサーバ側のディレクトリ、および、そこにアクセス可能なIPアドレスを追加

4 サービス再起動
exportfs -ra
5 クライアント側でマウントコマンド再実施
mount -a

エラーが出なくなった!

6 確認
df -h

JMeterについて調べてみた

これからJMeterを使う予定なので下調べ。

GUIインターフェースを使ってかなり細かく負荷テストのシナリオを設定する事ができます。
面白いのは、ブラウザで辿ったページを記録して、それに対して負荷テストをしたりする事もできたりする点です。

WEBサイト負荷テストツール7選 | さぶみっと!JAPAN

エラー発生の有無、期待したデータがレスポンスに含まれているかの確認なども簡単に行うことが可能

http://www.jasst.jp/archives/jasst07e/pdf/C2-1.pdf

これらから手順を抽出し、自分の考えを加えた。

1 テスト環境の作成

プロジェクト、スクリプトの配備
  • 設定ファイルの修正(取りあえず動かせるようにするだけ、チューニング等は後から行うのでプレーンなまま)
  • CSV出力先などワーキングディレクトリのパーミッションの確認
  • 既存ログファイルのクリーニング
DBの配備
  • 設定ファイルの修正(取りあえず動かせるようにするだけ、チューニング等は後から行うのでプレーンなまま)
  • 既存ログファイルのクリーニング
負荷試験に供するテストデータの作成
  • マスタ、トランザクション共に、実運用時の件数に近づける(コーディング中の未熟なデータが入らないように注意する)
テスト計画の計画
  • テスト対象ページの決定(負荷がかかりそうなものに絞り込んで)
  • 要件の確認(応答時間の上限、最大利用人数、同時接続人数)
  • 最初は1スレッド1シナリオで。目標クリアできれば、徐々にスレッド数を増やしつつ再試験。

2 ダウンロード

JMeterダウンロード先
Apache JMeter - Apache JMeter™

3 インストール

tarを解凍

4 起動

binディレクトリのjmeter.batを実行

5 テスト計画の作成と実行

  1. スレッドグループの作成
  2. タイマの設定(同時アクセスのテストでなければ設定の必要あり)
  3. デフォルトHTTPリクエストの作成(サーバ名やIPを指定)
  4. テスト内容の設定
  5. リスナーの作成(テストレポートのファイル名を指定)
  6. テストプランの保存(上記で指定した内容を保存)
  7. 実行
ポイント
  • スレッド数 = ユーザ数
  • シナリオ = テスト内容
  • 容量不足になったらヒープサイズを増やす(jmeter.batで指定)
テスト内容は2種類の方法で指定できる

A)サンプラーの作成

  • シンプルなリクエストでよい場合
  • リクエスト先のパスを指定するだけでよい

B)ブラウザ操作からテスト計画を自動作成

  1. HTTPプロキシサーバエレメントの追加
  2. Webブラウザのプロキシサーバを設定
  3. シナリオの実行(JMeterをプロキシモードで作動させ、テスト計画を記録させる)
  4. テスト計画の編集

6 結果の確認

  • 指定回数分、実行されたか?実行回数を確認。
  • 平均応答時間は目標範囲内か?(例えば、2秒以内とか)

7 チューニング

DBサーバやWebサーバに割り当てるメモリを増やすなど

MySQLのTemporary table

現場のSQLの中に、CREATE TEMPORARY という文をいくつか見かけたので、「一時テーブル」について勉強してみました。

Temporary Tableはセッションを抜けると自動的にDropされる。
異なるセッションのTemporary Tableは別々のものと扱われる。

Temporary Table(一時テーブル)について - 十番目のムーサ
*1

テンポラリテーブルはそのサイズがtmp_table_size以下であればMEMORYテーブルとしてメモリ上に作成され、tmp_table_sizeを超えるとISAMテーブルとしてディスクに書き出されます。

MySQLの「temporary table (一時テーブル)」 と「tmp file(テンポラリファイル)」の違いと「Copying to tmp table」と「copy to tmp table」の違い | 田舎に住みたいエンジニアの日記
*2

MEMORYテーブルの大きさはmax_heap_table_sizeによっても制約されるため、tmp_table_sizeを大きくする場合は同時にmax_heap_table_sizeも大きくします。

MySQLの「temporary table (一時テーブル)」 と「tmp file(テンポラリファイル)」の違いと「Copying to tmp table」と「copy to tmp table」の違い | 田舎に住みたいエンジニアの日記
*3

クエリが最適化されていない場合は、大きなテンポラリテーブルが作られてしまいます。テンポラリテーブルがtmp_table_sizeやmax_heap_table_sizeに割当のサイズを超える場合は、「Created_tmp_tables」のメモリ上で収まらずに「Created_tmp_disk_tables」としてディスクに書かれてしまいます。

MySQLの「temporary table (一時テーブル)」 と「tmp file(テンポラリファイル)」の違いと「Copying to tmp table」と「copy to tmp table」の違い | 田舎に住みたいエンジニアの日記
*4

CREATE TEMPORARY TABLE tmp1
SELECT * FROM test_dt
WHERE item_name like '%検索文字列%'

テンポラリテーブルの作成MySQL|プログラムメモ
*5

*1:他のセッションでも利用できなくていいくらい、本当に一時的な結果を保持するテーブルなんですね。集計の途中結果、アドホックな軸での集計、などを格納するのでしょうね。

*2:このディスク書き出しがかなり遅い、とも書いてありました。まあメモリサイズは有限ですから、このしくみが悪いという訳ではないです、ただチューニングは必要なんですね。実際、どれくらい遅くなるんだろう?

*3:なるほど

*4:ちなみにCreated...関係は、SHOW STATUS;で取得可能とのことでした。

*5:CREATEするのにselect文がダイレクトに使えるってことですね。