はてなキーワード: インクルードとは
現役ペチパーだけど、元々PHPはHTMLにスクリプトを埋め込むところから始まった変態言語なので、
普通に関数を作って組み合わせてしまえば大半は事足りるのも当然なんだけども。
実務で使うと便利だなと思うのは、まとまりのある複数の変数とメソッドを1つのクラスにカプセル化できること。
例えば、ユーザの情報を管理するときに、「ユーザ情報」というクラスを作って、
その中に publicな変数として、名前、フリガナ、郵便番号、住所、電話番号、会員ID、階級、職業、性別…
を放り込んでおく。
同時に、ユーザ情報の処理に関連する処理の関数を public なメソッドとして、定義する。
ユーザ情報をタブ区切りで得るメソッド getTABDATA()
フォーム入力からユーザ情報にセットする setFromForm()
こうしておけば、
・ユーザ情報を何かの関数に渡す時は、インスタンスの変数1つ渡せば済む。
・ユーザ情報に関する処理は、ユーザ情報クラスの定義部を観れば済む。
という2大メリットが得られる。
メソッドだって1つのファイルに関数並べてインクルードすれば同じメリットが得られるやん?
…と私も思ってた。ただねぇ、開発規模が大きくなると、関数名の重複を避けた命名が面倒になったり、
連想配列だと好きな場所で勝手に変数増やされたりして、メンテナンス性が悪くなるのね。
あとは、例えばメールを送るという1つの大きな処理に関連して複数の関数を定義する場合に、
その関数をまとめてメール送信クラスとしてしまうのはあるかな。
http://web-terminal.blogspot.jp/2014/04/php-file-mail-pear.html
PHPでエクセル出力できるPHPExcelもクラスになっているから使いやすそう。
http://qiita.com/suin/items/7a8d0979b7675d6fd05b
http://cmf.ohtanz.com/blog/archives/2463
結論としては、
gccの構文解析の結果(構文木)を、XMLとして出力してくれるツールです。C++の構文解析はやたらと面倒らしいので、こういうのがあるとうれしいみたいよ。
「Py++」というC++のPytyonバインディングで使われていたので、必要になりました。gcc-xml 0.6はバイナリで配布されてるんだけど、MSVC7.1までしか対応してないようで、Visual Studio 2005だと使えませんでした。うーん、困った。というわけで、最新版のソース一式を取得してビルドしてみます。
gcc-xmlのビルドには、CMakeというツールが必要になります。CMakeは、オープンソースでクロスプラットフォームのビルドシステムなんだとか。CMakeの公式サイトから、Windows版のインストーラーをダウンロードしてインストールしよう。
実は最初は、ここでcygwinのsetup.exe経由でのインストールをしてたんですけど、これだとgcc-xmlのビルドの段階でエラーが発生しちゃいました。この原因がどうしてもわかんなかったので、あきらめて公式サイトのインストーラーを使うことにした次第です。
ソース一式はCVSから取得できます。CVSクライアントはいろんなのがあるので、好きなクライアントを使って取得しよう。ここではcygwinのCVSを使って、シェルから以下の命令を実行して取得しました。40MBくらいあるみたい。
$ cvs -d :pserver:anoncvs@www.gccxml.org:/cvsroot/GCC_XML co gccxml
「Visual Studio 2005 コマンドプロンプト」を起動してください。起動したら、さきほど取得したソース一式が格納されているディレクトリに移動して、以下の命令を実行します。
$ cmake .
cmake.exeにはあらかじめパスを通しておくか、パスを直接指定するのを忘れずにね。
gcc-xmlのビルドはまだ終了してなかった! 一度ビルドが終了しても、第二第三のビルドが必要となって…。などと恐れおののきましたが、二段階でいいみたい。
さきほどの処理が終了すると、同じディレクトリに"gccxml.sln"というソリューションファイルが新しくできあがっているかと思います。これをVisual Studio 2005から開いて、Releaseビルドしよう。ビルドが終了したら、以下の5つの実行ファイルができあがっているはずです。
まずは環境変数の設定です。Visual Studio 2005を使っていることを、gcc-xmlに高らかに宣言しておこう。
$ set GCCXML_COMPILER=msvc8
つぎに、gccからVisual Studio 2005のインクルードファイルを使えるよう、パッチをあてます。ありがたいことに、"GCC_XML/VcInstall"ディレクトリ以下にVisual Studioのバージョンによってパッチが用意されています。そのディレクトリと、パッチを当てたファイルを出力するディレクトリ("gccxml.exe"が置いてあるディレクトリ)を指定して、"gccxml_vcconfig.exe"を実行してください。
$ bin/release/gccxml_vcconfig GCC_XML/VcInstall/ bin/release
あとはbin/releaseにパスを通せば、gcc-xmlが使えるようになったはずです。bin/release以下をどこか適当なディレクトリにコピーして、そこにパスを通してもオッケイです。やったね! というわけで、さっそく試してみましょう。
$ gccxml eample1.cpp -fxml=example1.xml
ここでは、解析するC++のソースファイルとしてeample1.cppを入力し、eample1.xmlを出力しています。ちゃんと出力できたかな? できたー! やったー!
以上で終わりです。
以上のような組み合わせで出くわした困ったことと、その解決策をメモしておきます。
Python was built with Visual Studio 2003;
extensions must be built with a compiler than can generate compatible binaries.
Visual Studio 2003 was not found on this system. If you have Cygwin installed,
you can try compiling with MingW32, by passing "-c mingw32" to setup.py.
setup.pyに.iファイルとか.cppファイルを記述して実行すると、こんな感じのエラーメッセージが表示されました。うーん、困った!
http://labs.cybozu.co.jp/blog/mitsunari/2007/08/vc2005boostpython.html
上記のページを参考にして、"%Pythonをインストールしたフォルダ%/Lib/distutils/msvcompiler.py"を以下のように修正してみたら解決できました。ありがとうありがとう!
--- msvccompiler.py 2007-04-04 17:17:12.000000000 +0900 +++ @@ -126,7 +126,7 @@ self.set_macro("FrameworkDir", net, "installroot") try: if version > 7.0: - self.set_macro("FrameworkSDKDir", net, "sdkinstallrootv1.1") + self.set_macro("FrameworkSDKDir", net, "sdkinstallrootv2.0") else: self.set_macro("FrameworkSDKDir", net, "sdkinstallroot") except KeyError, exc: # @@ -252,7 +252,10 @@ def initialize(self): self.__paths = [] - if os.environ.has_key("DISTUTILS_USE_SDK") and os.environ.has_key("MSSdk") and self.find_exe("cl.exe"): + if self.__version >= 7.1 or ( + os.environ.has_key("DISTUTILS_USE_SDK") and + os.environ.has_key("MSSdk") and + self.find_exe("cl.exe")): # Assume that the SDK set up everything alright; don't try to be # smarter self.cc = "cl.exe" @@ -288,10 +291,16 @@ self.preprocess_options = None if self.__arch == "Intel": - self.compile_options = [ '/nologo', '/Ox', '/MD', '/W3', '/GX' , - '/DNDEBUG'] - self.compile_options_debug = ['/nologo', '/Od', '/MDd', '/W3', '/GX', - '/Z7', '/D_DEBUG'] + if self.__version >= 7.1: + self.compile_options = [ + '/nologo', '/Ox', '/MD', '/W3', '/EHsc', '/DNDEBUG'] + self.compile_options_debug = [ + '/nologo', '/Od', '/MDd', '/W3', '/EHsc', '/Z7', '/D_DEBUG'] + else: + self.compile_options = [ + '/nologo', '/Ox', '/MD', '/W3', '/GX', '/DNDEBUG'] + self.compile_options_debug = [ + '/nologo', '/Od', '/MDd', '/W3', '/GX', '/Z7', '/D_DEBUG'] else: # Win64
setup.pyを実行するとcl.exeが見つからないみたいなエラーが表示されました。これは、アレだ。「パス通せ!」ということですね。bashを起動するときのバッチファイル(たぶん"cygwin.bat"とか)で、以下のような行を入れてやれば解決しました。
call "%VS80COMNTOOLS%vsvars32.bat"
d:\python25\include\pyconfig.h(189) : fatal error C1083: include ファイルを開けません。'basetsd.h': No such file or directory
setup.pyを実行すると、上のようなエラーが表示されました。
http://d.hatena.ne.jp/ousttrue/20070531/1180556273
上記のサイトを見るとインクルードパスが通っていない場所に"basetsd.h"があるのが原因なので、"cygwin.bat"にインクルードパスの設定をしておきました。
call "%VS80COMNTOOLS%vsvars32.bat" set INCLUDE=C:\Program Files\Microsoft Platform SDK\Include;%INCLUDE%
link: extra operand `/INCREMENTAL:NO'
詳しくは `link --help' を実行して下さい.
これは、cygwinのほうのlink.exeが実行されてるのが原因でした。スマートな解決策ではありませんが、cygwinのほうのlink.exeをリネームして解決。パスの設定順序とかでどうにかできるといいんだけど、どうすればいいんかな。
MSVCR80.dllが見つからなかったため、このアプリケーションを開始できませんでした。アプリケーションをインストールし直すとこの問題は解決される場合があります。
SWIGが生成した.pyファイルをimportしたら、こんな感じのエラーダイアログが表示されたよ。うーん、困った!
http://d.hatena.ne.jp/moriyoshi/20070525
上記のページを参考にして、"%Pythonをインストールしたフォルダ%/python.exe.manifest"として以下のようなファイルを新しく作ったら、解決できました。ありがとうありがとう!
あとこれ、bashから実行したらエラーダイアログが表示されず、importするモジュールが見つからないみたいなエラーメッセージが出力されるだけだったよ。
<?xml version='1.0' encoding='UTF-8' standalone='yes'?> <assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'> <dependency> <dependentAssembly> <assemblyIdentity type='win32' name='Microsoft.VC80.CRT' version='8.0.50608.0' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' /> </dependentAssembly> </dependency> </assembly>
いや、前にそれでアップローダーを潰されたざますよ。
増田でしか公開していないやつだったんだけど、URL拾われたみたい。
スクリプトを埋め込まれても拡張子が画像ファイルだから動作はしないんだけど、
他にずるずるの鯖とかをみつけてそこからこっちの画像偽装ファイルをインクルードするんだと。
すると、こっちのアップローダに本体があることになるので、向こうでも発覚しにくくなる。
そんな感じ。
こっちは本体があるので、運営会社から連絡が入って、お宅のところに不正なファイルがあがってる言われてドギャーーン!
こっちでも画像だけしかアップロード許可を入れてないので、油断しまくりんぐでした。
幸い使われた形跡はなかったんだけど、ネットの世界は難しいね。