忍者ブログ

カウンター

プロモーション

カレンダー

02 2025/03 04
S M T W T F S
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 31

AntinomyMy の実験室

   私のWEBアプリ実験室です!

ブログ内検索

楽天でお買い物

twitter

最新トラックバック

最新コメント

忍者アナライズ

ウェザーニュース

バーコード

本を買う

アクセス解析

Google+

[PR]

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。


WindowsのVirtualBox でブルースクリーン、回復コンソールからサービス停止で回避

WindowsのVirtualBox でブルースクリーン、回復コンソールからサービス停止で回避

仮想OS の調べ物

 いつもの長ぁ~いメモ。

Windows のVirtualBoxは、設定でネットワークアダプタが追加できる、
この追加したときにドライバをインストールするかどうか聞いてくるが、
誤ってキャンセルなどして、そのまま再び設定でネットワークアダプタを消して追加しなおし、
「VirtualBox Bridged Networking Driver Miniport」というドライバの操作を行なうと
想定外のブルースクリーンになって、Windows すら起動しなくなる場合がある様だ(多分)。
※ 追伸:私のPCのいろいろなコントローラが不安定だったのも要因みたいです※
※追伸の追伸:原因はAMDのマザーにどうもキャプチャーカードが合わなかった様です※


そのブルースクリーンになったときに、OSをまるまる入れなおしたりする方法を取らずに
回復コンソールで回避出来たのでメモを残してみます゜w゜;

Windows の回復コンソール(回復コンソールをインストールしていない場合にはWindows のインストールCDが必要)で
listsvc コマンドを使うと、インストールされているサービスが表示される、
そこでVirtualBox 関連のサービスを見つけ出してdisable コマンドによって停止する。
----------------------------------------------------------
●MpFilter システム (SERVICE_SYSTEM_START)
 VirtualBox Bridged Networking Service
●SharedAccess 自動 (SERVICE_AUTO_START)
 Windows Firewall/Internet Connection Sharing (ICS)

●VBoxDrv  システム(SERVICE_SYSTEM_START)
 VirtualBox Host-Only Ethernet Adapter
●VBoxNetFlt  手動(なんだっけ?書き忘れたけど特に問題ないと思う、元々手動)
 VirtualBox Bridged Networking Service
----------------------------------------------------------
 上記の中でVBoxNetFlt は元々手動とあったが、なんとなくDisable コマンドを使った覚えがある、
しかし起動後にenable コマンドによって元に戻した覚えが無い。

 それと上記でSharedAccess も停止したのは、ブルースクリーンでBIOS やら
anti-Virus 関係もどうとか英語のメッセージが出ていたので、
サービスを見渡す限り、セキュリティーや、ネット関係で競合を起こして居そうな名前が、
なんとなくそれくらいしか見つからなかった気がしたので停止してみた、
実際にその停止が必要だったのかは定かではないが、結果的に動いている。

今回変更したのは
- - - - - - - - - - - - - - - - - -
disable MpFilter
disable SharedAccess
disable VBoxDrv
disable VBoxNetFlt
- - - - - - - - - - - - - - - - - -
でサービスを停止した。

Windows が動いた後、デバイスマネージャでネットワーク アダプタにある、
VirtualBox 関連で!マークがついたものを消す、しかし、
 「VirtualBox Bridged Networking Driver Miniport」は消す事が上手に出来ないと思う。

なにやら厄介な事に、かなりシステムに依存したサービスらしいので、
回復コンソールでenable コマンドで自動やらシステムで起動と設定されていたサービスを
再び動作する設定に戻す。

具体的にはVBoxNetFlt は元々手動だったので、それ以外の以下を
- - - - - - - - - - - - - - - - - -
enable MpFilter SERVICE_SYSTEM_START
enable SharedAccess SERVICE_AUTO_START
enable VBoxDrv SERVICE_SYSTEM_START
- - - - - - - - - - - - - - - - - -
とコマンドを用いて元に戻した。

その後に再びWindows のデバイスマネージャで、
VirtualBox Bridged Networking Driver Miniport を有効にしたり、
ドライバを入れなおそうとしたり、ドライバを指定して
C:\Program Files\Oracle\VirtualBox\drivers\network\netflt
にあるドライバを再びインストールしようとしていると、
私の場合はエラーが表示された後に、なぜか
「デバイス問題のトラブルシューティング ウィザード」が自動で立ち上がり、
有効動作を選ぶと有効になり動き出した。

私が選んだドライバは、
VBoxNetFltM を選んでエラーだったのだが、エラーが選び間違え立ったのかは
定かではないが、しっかり再認識して動き出したので問題は無さそうだった。

その時のスクリーンショット
57f82a8e.PNG

実は・・・・ ここまで来る前に、HDD のフォーマット形式が表示されなくなるという
不具合も同時に起こっていて、これも解決したのでその事も書き記す。

同様に上記の事柄をする前に、回復コンソールでchkdsk /r /p をしてみたが、
修復フラグを数箇所見つけて修正はするが、その後のHDDのチェックをエラーを見つけて
終了してしまう。

なので調べていると、HDDのフォーマット形式が表示されなくなっていた、
どうもパーティションを区切っているブートセクタに不具合があって、
フォーマット形式がわからなくなっていて発生している様であってので、
map というコマンドを使って、フォーマット形式が見えなくなっているドライブの
物理的な場所とフォーマットのあるパーティションを示した場所を示す文字列を表示させる。

そのmap で示された、フォーマット形式が見えなくなっているドライブ名から得た、
その文字列を使って、fixboot コマンドより、再びフォーマットのセクタを再定義して、
再起動する。

fixboot コマンドはmap コマンドから得た場所を示す文字列を例えば以下のように書く。
fixboot \Device\HardDisk?\Partition?

私の場合、fixboot コマンドの後、再起動して再び回復コンソールで、chkdsk が1度しっかり最後まで
動作を確認後、それでもWindows が正常に動かなかった為、
desable コマンドを使ってサービスを停止してみた所、無事に動いた。




 以上、毎度ながら長いメモでした、お粗末<_ _>

拍手[0回]

PR

No Image

Synaptic って?リポジトリとかの管理と関係してるの?

Linux 関連 調べ物

個人的なメモです。

パッケージマネージャは、パッケージをどうやって管理しているのだろうか?
なぜインストールできるのか???

これ凄い純粋で単純な疑問。

これを知れば、多くが知れるんじゃないか?と思った。

前回Eclipse を調べているときに、Eclipse の何処かのサイトで
http://anonscm.debian.org/gitweb/?p=pkg-java/eclipse.git;a=blob_plain;f=debian/control
こんなのをみつけた。

これって何だろう???
ネット上で調べてみた。

とりあえず、気になったのは、「git」と言う言葉、そこから数箇所拾ってみた。

●15分でわかるGit入門
正直、5分かからなかった、概要がかかれているのだと分かったので、すぐに読めた。

●分散バージョン管理システムGitの使い方入門
なにやらこちら、しっかり書いてある。

●Git入門
こちらはWiki形式、まだしっかり見ていないがリンクがあった。

これらを見ていてわかったが、Git自体がリポジトリを使ってパッケージを管理する仕組みだと把握。

Eclipse の本家からGit でのソース管理の集まりだと把握した、以下はその全て。
http://anonscm.debian.org/gitweb/
かなり重い(長い)ので開くのは注意。

もしかしてSynaptic もGit なのだろうか???

良く分からないので、とりあえずメモ。

私は何が知りたいか? どうやって管理しているかの実際が知りたい、
たとえば管理する仕組みが書かれていたファイルを見つけたとして、
それをどうやって見るかの大まかな概要が知りたい。

多分それが分かれば、何も怖いものは無い。
たしかプロパティでパスはいっぱい出てくるのは見たし、パスが表示されるのは
便利だと思ったが、無駄に多すぎるとも思った、何を表しているのか、
やはりまだ分かりにくい。

ここでまたメモ、調べたという、なんとなくのメモ、深い意味は無い。

☆Git のツール本家



また、色々調べていてわかったこと、Synaptic はバックグラウンドでaptを使ってパッケージの取得をしている。
なのでAPTを調べたら、CUIで動作するフロントエンドとしてaptitudeがあるらしい。

大体何処を調べながら何をしたら、Web上や、実際のディレクトリ上にどんな事柄が
載っているのかは、大体イメージが付いた。

APTの挙動を探れば見つかりそうだ。



前回からほぼ数時間でブログに書き込んだので、今日はこれくらいにしよう。




また、追伸だが、Eclipse は、2つのGUIバージョンが存在するらしい。

・Motif(モチーフ)は、X Window Systemでの操作手順、見栄え(ルック・アンド・フィール)などを
統一しようというグラフィカルユーザインタフェース (GUI) 規格。

・GTK+ (The GIMP Toolkit) は、クロスプラットフォームウィジェット・ツールキット(GUIツールキット)

らしいが、Eclipse はJava で動くので、Java の実装が元であると思えるので、
Java のGUIがそのMotif やらGTK を使って呼び出されるのかなと想像。


ライブラリが動かない場合は、依存関係なども、良く知らないと動かない場合に理解しにくいなと
思った。






以上個人的なメモ。






拍手[0回]


Linux(Debian) にEclipse をインストールして日本語化

Linux(Debian) にEclipse をインストールして日本語化

Eclipse の調べ物


いつもながらダラダラの前置き。(毎度ながら長いので、嫌な方は下の方の本題からどうぞ!)

(アクセス解析で、なぜか私の他のブログのワードが、このページでひっかかります。
 なので「玄箱 debian 6.0.4」もしくは「玄箱 debian squeeze」のインストール情報は
 
[黒箱PRO にDebian squeeze(6系)をtftpboot コマンドよりインストールしてみた。]をご覧下さい)

お酒(HOT!梅酒)が脳内に・・・ 後はご想像までに!

さぁ、なんだかずっとずっと遠回りをしていた私ですが、
何を遠回りしていたかと言うと、便利になったLinux を見向きもせずに、
結局最終的にWindows なんてWeb サーバーなんて向いているもんか!

結局自宅サーバも、レンタルサーバも、どうもWindows なんて使ってられるか!
って本能が騒ぐのですが、WAMP環境でのみ、学習と構築を続けてきたのでした。

しかし、偶然にも兄弟からLinux 上で動く、フォートラン(g77)で作られたアプリケーションを
動かしたいと言われて、久しぶりにLinux に触る機械が訪れた。

実はそろそろ本格的にLinux を触って、外部向けのサーバを立てないと!なんていう事は
100どころか1000も承知で、遅すぎるくらい遅い出足なのでした。

格好ばかりつけるつもりなんて、全く無かったのに、ここまでしっかりLinux に触れずにいると、
なんで触れてこなかったのかと、自分のしていることの不始末に気が付いているのですが、
気にしていても進まないし、今なんか、妙に良いタイミングだったので、Linux 始動開始!しようかなと
思っている状況に、兄弟からの良いタイミングでした。

兄弟にはLinux のディストリービューションの選び方に妙な迷いが起こるのではないかと
思っていたら、やはり周りの人に多少聞いても、迷っている様子でした。

それが今回の兄弟の質問でした。

私も迷って、何度か入れて、消して、良く理解出来ず消してみたいな、そんな遊び程度の
こわごわなんかいじっている本気じゃないけど、遊びでもないみたいな、いい加減な
しかも落ち着きの無いテンションで、なんだか必死に※何か※を探っていたのです。

案外記憶って言うのは、私の場合、忘れない程度に覚えていて、
その時に解決できなくても、半年、一年とかすると、妙に落ち着いて多くを見渡せるタイミングが来るのです。

さぁ!いいタイミングだ! 兄弟に教えついでに、自分もしっかりやりなおさなきゃ!

私は考える時間が多い人間、本も給料がガッポリ出た場合には3万円分とか買っちゃう人なので、
振り向いて本棚を見れば、Debian の本が2冊もあるんです!

今見て驚いたのは、私の思いつきで買う行動は、毎回自分を助けるって事です。
なんでしょうか、それは毎回そうなんです。

癖なんでしょうか、欲張りなのでしょうか、確かに全く読まないでいる本があるのですが、
それも何か役に立つのです。

私の場合、全ての本=辞書なのです!

辞書は欲しい時に無いと困るもの、そういう考えなので、本はいくらあっても困らない、
むしろ困ったときにあれば大いに助かる、それだから衝動買いしてでも買うのです。

これまでこの行為で助かった経験は3度はあるでしょう。

ネットで検索できる世の中にはなりましたが、本でしか得られない言い回しや、
寝ている最中にふと気になって、起きると枕元に本があって、気になったところに付箋をするとか、
付箋をしてあったところを見るとか、その行為がとてもなじみます。

あと何処かへいって、小型のPCをもっていって開発をしていても、調べるときと
その画面を同時に使ってというよりも、手元に本がある方が良い場合もあります。

回線の都合とか、持っている小型PCのWebページのブックマーク(リンク)と、
従来開発に使っているPCのブックマークとの同期作業とか、見知らぬ、もしくは知っていても、
サービスに頼って、自分の思考を誰かに知られる気がして、なんだかあまりブックマークを
オンラインで共有するのが好きじゃないです、自分で同様のサービスを作ったとして、
もしかすると、他人が作ったブックマークをデータベース化していたら、
統計くらい取っちゃうんじゃないかとかお思うと、やっぱりクラウドとかは危険に思えて仕方ないです。

話は戻りますが、やっぱり良く知られている系統のCentOSを兄弟には勧めてはみたものの、
CentOS 5 は私の環境のAtomでは動くのですが、CentOS 6 は動かないなど、
なにやら前もCentOS もありましたが、今回もありました。

実は今回、兄弟にも勧めたのは、仮想化したPCです、マイクロソフトのバーチャルPCもありますが、
oracle のVartualBox を進めました。

前もVartualBox を使ったことはあったのですが、なんだか他のOS仮想化ソフトの扱う形式も使えて
結局4種類もの仮想化のフォーマット形式が使える様に変わっていました。

兄弟にCentOS 6 を進めた物の、私はCentOS 5 を入れていたので、
説明にならないかなとか思ったのと、正式にATOMプロセッサのPC上で仮想化PCを使うなんて
CPUの使用率が高くなって使いにくいだろうから、やはり他のPCに仮想化ソフトを入れ直して
使うことにしました。

やはり気になったのは、Debian です、過去もあっさり動いてしまったので、
今回も調べてネットインストールの名刺CDサイズの要領のDebian 6.0.4をダウンロードし、
VartualBox の設定でインターフェースからISOのファイルを選択させて
インストーラーを起動しました。

ダウンロード先:最小の CD を使って、ネットワークインストールする

ダウンロードした物:debian-6.0.4-i386-businesscard.iso

ところで、兄弟に勧めたCentOS 6 の設定では、エンタープライズ向けの設定を選択したのと、
Core2 Duo 8800 であったせいもあるのか、6時間以上もファイルの更新などに
時間もかかっていた様です。
 しかし、兄弟のPCはVISTA 64bit なのでメモリが4Gもあり、
仮想PCに割り当てるメモリは1Gもあったのですが、インストール作業にはさほど効果は
無かった様に見受けられました。
 
私は次の日に、新たにVartualBox を別のPCに入れなおしてみました。
CPUスペックは上になりますが、AMD Athlon 64 3200+シングルプロセッサーです、
そしてメモリは1Gしかありませんが、仮想PCのメモリは384MBにしてもスイスイ快適に
2時間くらいでいすトールは済んでしまって、インストール時のインストーラーも
Graphical Install というメニュー項目から簡単にInstallできたので、
とても利便性が良いインストーラーだと感じました。

Athlon 64 X2 3200+???だったかな?それのデュアルコアもありますが、
今すぐこのよう様な用途のPCにするのは気が引けたのでやめておきました。

他にも感じたことですが、CentOS 5とDebian 6 の比較では割りにあいませんが、
VartualBox のフルスクリーンで、GUI環境が自動で画面の大きさに合わせてくれたのは
Debian 6 の方で、とても便利に感じました。
CentOS 6 はどうだったのかは、ATOM プロセッサで私の選択したものでは動かなかったので、
新しいCentOS のウィンドマネージャとの単純比較は出来ていないのは述べておきましょう。

本題!!!
では、やっと本題に入ります。

さて、Linux と一言で言っても、Windows と違って選ぶのに一番悩むのは
ディストリービューションだと思います、ウィンドウマネージャやら、パッケージマネージャやら、
結局操作性と、インストールを管理している手段が違うのが大きく異なるのだと思います。

そうなると、何系だとrpm やらyum、apt-get などのインストールのコマンドも使いこなしたり、
ダウンロードにwget とかのコマンドを使って作業を覚えつつも、
インストールコマンドが裏でどんな設定を使って、どんな設定を構築して
インストールしているのかなども、探らなければいけないなという雰囲気は掴んではいました!

 しかし! やってみると・・・・・ あれ?!

eclipse ってパッケージマネージャとして、Debian のサイトが提供していて、
あっという間にインストール完了しちゃいました・・・

linux_eclipse_synaptic.JPG
↑↑↑パッケージ管理のSynaptic で「eclipse」と関連しているパッケージを調べてインストールしてみた例。


あまりにも簡単にアプリケーションがインストールされるので、
勉強にならないというか、インストール系コマンドよりも簡単に扱える、
パッケージマネージャが何をしているか、良く知らなければならないという
余計な?手間が増えてしまったのか・・・それともとりあえず入門者向きには
てっとり早く環境が整うと考えれば良いのか、とてもとても不思議な感じでした。

とりあえず、こうしてメモしているのは、整理するためであるのは間違えないですが、
やはり何が何をし参考にしてどんな設定をしているのかとうのは、知らなければいけない、知りたいと
感じました。


私はすぐに、eclipse を立ち上げて、初めは日本語ではなかったので、
上記のスクリーンショットにあるように、「pleiades 1.3.1-dfsg-1」というのも後から
インストールしたのですが、日本語にならなかったので、ネット上で調べたら
どこもかしこも、

/usr/lib/eclipse/eclipse.ini

をスーパーユーザの権限を使って編集せよ!とあったので、とりあえず編集しようと
Debian 6.0.4 に入っていたファイルマネージャ、Nautilus というものを知り、
それのUI を使って、eclipse.ini を編集しようとダブルクリックしたところ、
gedit というエディタが立ち上がりましたが読み込み専用で、
やはり編集できないので、Nautilus をスーパーユーザで起動すればいいのかな?と思い、
これまたDebian 6.0.4 に入っていた端末というコマンドラインインターフェースを立ち上げ、
sudo Nautius とかなんとかしてみても、

xxx is not in the sudores file. This incident will be reported.

と、xxxがsudores ファイルにない?とか文句をいわれるので
suコマンドでコマンドの実行主を変えて、Nautilus を実行すると、
もっと派手に文句を言われ、これまた実行できず^v^;


良く考えれば、ファイラーで覗けない場所を見たいわけでないので、
gedit なるファイラーをスーパーユーザで実行して、eclipse.ini を開いて編集しようと思った。
コマンドラインでsudo gedit  これでスーパーユーザでgedit が起動した!
ここにドラッグアンドドロップにより、Nautilus からeclipse.ini をドラッグしたら、
あっけなくスーパーユーザ権限でeclipse.ini が編集できた。

このeclipse.ini の最後の行に、
-javaagent:/usr/lib/eclipse/plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar

この文を追加して保存。

そしてeclipse を起動するときに、コマンドラインから

eclipse -clean

とすると、簡単に日本語に成りましたとさ!!!



思ったよりあっさりすぎて、まだまだだなと思いつつ、
次はPHPの編集をEclipse で出来る様にと作業をすれば、
パッケージマネージャが文句を言って、何かが足らない様なので、
やっぱりパッケージマネージャが何をしているのかを探ることを
しないと、この先も躓くな!と思いました。

最後に今回の記事で使われているスクリーンショットがスーパーユーザの権限なのは、
色々やっていた名残で愛嬌です^^


それでは長いメモでした^^ノシ

拍手[0回]


No Image

eval 関数と file_get_contents 関数で作る簡単データ読み込み

PHP の調べ物

久しぶりにメモ。

今回のメモは、PHPのeval 関数を用いて、
eval関数で読み込む内容にスクリプト自体を書き、
PHPで処理させる事が書かれている。
勿論eval関数は、
引数にスクリプトを与えると処理するという代物であるので、
何の変哲も無い、当たり前の事だと感じると思う。

しかし、引数に与える内容を、外部に書かれたファイル
丸々を読み込んで自身に取り込み処理させることが出来るのです。

これは普通に皆が使っている使い方なのだろうか?
基本的に危険を感じて使わないのか、思いついてはいないのではないか?と
思った。

また、その上記な様な使い方をするなら、
include系の関数を使えば良い気がするが、
それらと違い何時でも好きな時に好きなスクリプトを
読み込み、実行した状況を作り出せる。

今回私がなぜこの関数を使おうと思ったか?
それはPHPのスクリプトソースが書かれたファイルにも
エンコードがあり、それを解釈するにもエンコードがある。

Webブラウザで表示するコードにPHPのスクリプトソースも合わせたとしても
データベースから吐き出させるスクリプトコードをどう処理するかなど、
考えなければいけないことと・・・・・①

もしファイルを作りバイナリなどのデータを保存したとしても、
それを今度読み込むときに変数に読み込む処理を書かなければいけない・・・・・・②

レンタルサーバなどの休めのサーバはデータベースを複数持てないので
クラッシュした場合に困ったり、複数ないと使い勝手やパフォーマンスに困る気がする・・・・・・③

これらの理由が大きく、よく考えてみた所、
PHPのソースごとデータとして保存することを思いついた。

つまり、arrayなどや、いろいろな型をそのまま変数にPHPスクリプトを書いて保存して、
それをeval 関数で読み込めば、保存したソース内で指定した変数に値が保存される。

つまり元のソースに存在したかの如く、変数にデータが代入される。


以下2つのソースがサンプルです。
片方は、私が勝手に付けた拡張子です。podという拡張子なのは
PHP of DATA のつもりで付けました、そんな勝手に付けた拡張子なので
後から好きに変えてもらって問題ないです。
同じディレクトリに2つのファイルを置いて下さい。
同じ文字コードで書かれていて、同じ文字コードで解釈される様に設定しておいでください。

尚、PHP of DATA(仮称)側の文字列を作成するスクリプトは
特に載せてないですが、PHPスクリプトを書く要領で記述し、エスケープするPHPスクリプトを
考えて書いて、中の変数部分に好きなデータが埋め込める様にするだけだと思います。

注意点は、元のソースには何処からこの変数は記述があるのか?
と思ってしまうと思うので、その当りを気をつければ良いと思います。

適当なソースですが、参考にどうぞ。


 

ファイル名:<array_string.dop> 以下中身
 


$filedata=array('a'=>777,'b'=>567);
$filedata2=array('a'=>333,'b'=>789);

 

 

ファイル名:<php_of_data.php> 以下中身
 

 


 

<?php

 

$stringVal=<<<'hereDocument'
$arrayString=array('a'=>123,'b'=>555);
hereDocument;

 


eval($stringVal);
echo 'test';
var_dump($arrayString);
echo $arraystring;
echo $stringVal;

 

echo '<br/>file data php read<br/>';

 

$dop=file_get_contents('array_string.dop');

 

eval($dop);
echo $dop;
var_dump($filedata);
var_dump($filedata2);
?>


 






結果

 


test

 

array
  'a' => int 123
  'b' => int 555

$arrayString=array('a'=>123,'b'=>555);
file data php read
$filedata=array('a'=>777,'b'=>567); $filedata2=array('a'=>333,'b'=>789);

array
  'a' => int 777
  'b' => int 567
array
  'a' => int 333
  'b' => int 789

最後に追加の注意点ですが、evalで読み込ませる内容の元であるファイルは、データが内臓されたPHPスクリプトを作成のソース(私が言うpod拡張子)で一定の場所以外は書き込めない様なプロテクト対策が必要だと思います。つまり得体の知れない他のWebに吐き出したり、ユーザーが見ているブラウザに情報を吐き出す可能性があるスクリプトは危険です。 また、内部のデータも同様に、得体の知れないアドレスなどを保管するのは危険です。つまりWeb上の外部のアドレス先は、何時コンテンツが変更になるかわからないので、それらも理解した上で、Web上の外部のアドレスなどを保管するべきです。何にそのアドレスを使うのか、発想が変わった時には危険ですから。 また、データが内臓されたPHPスクリプトを作成のソース(私が言うpod拡張子)は Linux上などであればアクセス制限を施すべきです。ファイルが毎回新たな予測不可能なファイルネームで新規に作成される場合などは、しっかりchmod などでアクセス権限を変更するべきです。 そしてまた、大事な情報であれば、apacheのhtdocs直下などでWebページからアクセス出来る様なそんな場所で使うべきではありません。 こんな感じです。今回は短いメモでした<_ _>


追伸:
include とかでもファイルは読み込めるのと、
phpのserialize 関数もあるので、
特定のPHPソースとして残したい用途以外は
こんな使い方をしなくても良いかもです。

PHPのソースを吐き出すPHPのプログラムを作るのならば話は別ですが^ー^

拍手[0回]


No Image

PHP isset() とempty() の、もやもやメモ

PHP の調べ物

今更ではあるが、毎回ふと疑問に思うことがある。
何がしたいか判っているはずなのに、度々つまずく、毎回考える、
果たしてこのisset() とempty() は何をしたい時に使うのか?
何を表しているのか?

やりたい事から知りたい事を割り出してみた。

変数の入れ物があり、型や内容が明確か?
これが知りたいのだろう、ケースはいくつかある。


したいこと 知りたい型 知りたい値
- 不明 不明
Falseと0を別扱いしたい 不明 判る
型が作られたら値0だと判断させたくない 判る 不明
- 判る 判る

結局色を変えた2種類の事柄が知りたいが為に
isset() とempty() の関数を使うのだと思う。

ぶっちゃけ、ネットで色々調べるが、
最終的に解決できるであろう場所はココにある
公式マニュアルのPHP 型の比較表だ。

そして何よりもNULL とは何なのか?
これも公式マニュアルのNULLにも
その事柄が書いてある。

確かにその通りなのであるが、
しかし、これだけでは実感できない。
特に私の場合には配列の中身の扱いが不安である。

なので少し実験してみた。

以下ソース
---------------------------------------------------------------
<?php
header('Content-type: text/html; charset=UTF-8');


echo 'いきなりx</br>isset:'. (isset($x)?'何かある':'空') . '  empty:'. (!empty($x)?'何かある':'空') . '</br></br>';
var_dump($x);

echo '配列として見る</br>issetx[0]:'. (isset($x[0])?'何かある':'空') . '  empty:'. (!empty($x[0])?'何かある':'空') . '</br></br>';
var_dump($x);

$x[10]=0;
echo 'いきなりx[10]に0を代入</br>isset[10]:'. (isset($x[10])?'何かある':'空') . '  empty:'. (!empty($x[10])?'何かある':'空') . '</br></br>';
var_dump($x);

$x=0;
echo 'xに0を代入</br>isset:'. (isset($x)?'何かある':'空') . '  empty:'. (!empty($x)?'何かある':'空') . '</br></br>';
var_dump($x);

$x=array();
echo 'xを配列宣言</br>isset:' . (isset($x)?'何かある':'空') . '  empty:'. (!empty($x)?'何かある':'空') . '</br></br>';
var_dump($x);

$x[0]=0;
echo '配列xの[0]に0を代入</br>isset:' . (isset($x)?'何かある':'空') . '  empty:'. (!empty($x)?'何かある':'空') . '</br></br>';
var_dump($x);

$x[0]=1;
echo '配列xの[0]に1を代入</br>isset:' . (isset($x)?'何かある':'空') . '  empty:'. (!empty($x)?'何かある':'空') . '</br></br>';
var_dump($x);

$x[1]=1;
echo '配列xの[1]に1もを代入</br>isset:' . (isset($x)?'何かある':'空') . '  empty:'. (!empty($x)?'何かある':'空') . '</br></br>';
var_dump($x);

unset($x[0]);
echo '配列xの[0]だけunset</br>isset:' . (isset($x)?'何かある':'空') . '  empty:'. (!empty($x)?'何かある':'空') . '</br></br>';
var_dump($x);

unset($x);
echo 'x全てをunset</br>isset:'. (isset($x)?'何かある':'空') . '  empty:'. (!empty($x)?'何かある':'空') . '</br></br>';
var_dump($x);

echo ($x?'true':'false');

?>
---------------------------------------------------------------
以下結果:
---------------------------------------------------------------

いきなりx
isset:空 empty:空

null

配列として見る
issetx[0]:空 empty:空

null

いきなりx[10]に0を代入
isset[10]:何かある empty:空

array 10 => int 0

xに0を代入

isset:何かある empty:空

int 0

xを配列宣言
isset:何かある empty:空

array empty

配列xの[0]に0を代入
isset:何かある empty:何かある

array 0 => int 0

配列xの[0]に1を代入
isset:何かある empty:何かある

array
0 => int 1

配列xの[1]に1もを代入
isset:何かある empty:何かある

array 0 => int 1 1 => int 1

配列xの[0]だけunset
isset:何かある empty:何かある

array 1 => int 1

x全てをunset
isset:空 empty:空

null

false

---------------------------------------------------------------

結果

まず関係の無いことかもしれないが、
PHP では
型宣言されていないなんらかの変数を
配列として中身を初めて見ても、
その後から配列として型宣言された扱いとなったりはしない。
当たり前と言えば当たり前なのだが、
案外インスタンス関係はややこしく仕様が介入するので、
もしや?!なんて思ってしまうことがあるので、
これは収穫だったと思えた。

次に型の有無、これは型があり、値が使われていなければ
Emptyになると配列では証明された。

配列のEmptyは全く持って0 やFalse と変わらない、
その為型宣言後なのかだけを調べることはisset 関数でもempty 関数でも出来ない。
Emptyでは0やfalse 以外かどうかしかわらない、名前は空(empty)とと言う名称なので
型判断に思えてしまうので、毎回考えてしまうが、値が0やfalse以外かどうかしか確認できない。

つまり、結局値では0が代入されたりfalse だったりすればempty 関数ではTlue を返す。
empty関数が空であるtlue を返すのは型が宣言されていない時、0やfalse、empty の時。

※分かりにくいので ! をつけた !emptyとして使ったほうが理解しやすい場合もある、私の例題ではそうしている。

そしてisset関数が空であるFalse を返すのは
型が設定されていない時以外は結果的に全て返す。
また、0であってもfalseであっても型があればTlue を返す。
(isset関数で複数を同時に検査した場合、一つでもfalse判定であると、isset関数はfalseを返すので
 それには注意が必要。)
 

値(x)   !empty(x)   isset(x)

(例ではarray)
0,false,empty false true
0,false,empty以外 true true
無(NULL) NULL(値として比較すると0,false,emptyに相当) false false



一応参考のソースと結果を載せておく。
<?php

header('Content-type: text/html; charset=UTF-8');

echo (NULL==false?'NULL==false 同じ':'NULL==false 違う') . '</br>';

echo (NULL==0?'0==false 同じ':'0==false 違う') . '</br>';

echo (NULL===false?'NULL===false 同じ':'NULL===false 違う') . '</br>';

echo (NULL===0?'0===false 同じ':'0===false 違う') . '</br>';

?>
------ 結果 -------
NULL==false 同じ
0==false 同じ
NULL===false 違う
0===false 違う

当たり前であるが、NULLと型が一致するのはNULLしかない。


結論:
型チェックと数値チェックを混同しがちなisset関数と
!をつけた方が理解しやすい!empty関数、
これらを使い数値のチェックをするのは良いが、
型が存在するかなどは、配列に使えば話が変わる様に、
配列であるかなどのチェックが必要な場合がある。

型をチェックするのであれば、
is_array関数を用いるべきであり、
他の型をチェックするのには
is_から始まる 変数操作関数を使うべきである。

isset関数はNULL型かどうかの比較機能もつけた!empty関数だと
思えば良いのかもしれないが、実際はNULL型(値)との比較をするか、
is_null を使った方が良い場合もある。

特に細かく型を判定した方が良い場合などは
isset関数を使ってしまうよりは良いかもしれない。

そもそも紛らわしいのは、empty関数が空である場合をTrueとしていることである。
なので! をつけて !emptyとして使わなければいけないので、
これとisset関数の使い勝手を比較するのはとてもややこしく思えるのでした。

また、isset関数は、多くの引数を使い、多くの引数の中で1つでもisset関数で
falseな場合には1つでもTrueがあったとしても関数はfalseを返すので、
多数の変数全体の判断に使うのだと思います。

以上、長ぁーーーいメモでした<_ _>     (かなり前回の編集が適当だった為、書き直してあります。) 

拍手[0回]


[PR]