DjangoをApacheで動かすまでの話

PythonにはDjangoという有名なフレームワークがあります。Djangoには簡易サーバーが付いているので、自分のMacで開発するときは、特にApacheやnginxなどのWebサーバーをインストールする必要はありません。開発用の段階ではこれで十分です。

しかし、いざ、iPhoneやAndroidなどの端末からサーバーにアクセスするアプリを開発しようとすると、外側から自分のMacにアクセスできるようになることが必要になります。iPhoneなどの端末から自分のMacにアクセスできないと、ちゃんと動いているかどうかもわかりません。ここで壁となるのが、Djangoに付属して付いてくるこのウェブサーバーでは外側からアクセスできないのです。

私は、今、iPhoneからサーバーに領収書の写真を送って、サーバー側で私たち会計事務所のスタッフが会計データに変換するサービスの開発をやっています。人間が写真のデータを会計データに直すサービスなので、AIなどのかっこいい技術を使うわけではありません。そこはいけていないのですが、そこはちょっと脇に置いておきます。

そのようなわけで、いろいろ調べてみた結果、昔からあるApacheと比較的最近のnginx(エンジンXと読む)が選択肢になったのですが、前にも触ったこともあって馴染みにあるApacheを入れてみることにしました。

具体的なステップ

ApacheをDjangoで使えるようにするのには、ほぼ一日仕事でした。速い人は数時間でできるのかもしれませんが、初めての方には、色々とひっかりやすいポイントがあり、結構時間がかかります。

私の環境は、Apache2.4、Python3.6です。

順番に、
Apacheのインストールと起動、
mod_wsgiをインストールしてApacheからPaythonのプログラムファイルを処理できるようにする、
MaxOS/Linuxのファイル権限を変更して、外部からのアクセスでも必要なファイルを読み書きできるようにする、

という順番でやっていきます。

一気にやろうとすると、色々なところでハマるので問題の切り分けができにくくなります。順番にやっていくのがいいと思います。

(1) まず、最初はApacheです。

Apacheは、とりあえず動くようにして、「It works!」の既定のメッセージが見れるようになることが目標です。
まずはターミナルを開けて、appachectl startとコマンドを打ち込みます。問題がなければ、次の行に移動して入力ができるようになります。

そして、Safariか Chromeを開けて、アドレスバーのところに127.0.0.1と打ち込みます。「It works!」と表示されれば、Apacheはちゃんと動いています。

(2) 次に、mod_wsgiをインストールします。

これが、Webでは様々な記事が交錯していて、一番わかりにくく苦労しました。しかし、一度出来てしまえばちゃんと動きます。ポイントはmod_wsgi.soというファイルをApacheの設定ファイルにちゃんと書いて、ApacheへのリクエストがきちんとPythonの処理として認識されるようにすることです。私は、最初、Pythonのプログラムのファイル(例:hello.pyなど)がただのテキストファイルとしか認識してもらえず苦労しました。

手順としては、
ターミナルからpip3を使って、pip3 install mod_wsgiを実行する。ー>mod_wsgiがインストールされる。

Apacheの設定ファイルであるhttpd.confのファイルを編集する。httpd.confファイルはprivate/etc/apache2という場所にある。これをATOMなどのエディターで開いて、以下のテキストを追加する。場所はどこでもいいようです。

ポイントは、ネットに色々書いてあるような単純なファイル名ではないので、ちゃんとそのsoファイルの場所と名前を発見して、その通りに記述することです。私の場合は、発見したネット情報のPythonバージョンが3.5と少し違っていたので、修正したらちゃんと動きました。

また、Directoryタグの中の記述の仕方もちょっと変わっているようなので、下記のようにすることが重要です。

LoadModule wsgi_module /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-darwin.so
WSGIScriptAlias / /users/ichirok/Documents/python_projects/firstDjango/firstDjango/wsgi.py


Require all granted

この設定がちゃんとできるようになると、Apacheがちゃんと動いて、返ってくるエラーもInternal Server Errorなどになります。それまでは、そもそもPythonのファイルをプログラムファイルとして認識してくれません。

(3) ファイルのアクセス権(Mac OS/Linux)の設定

Permission Deniedなどのエラーが返ってきます。
chmod 755 directoryName コマンドを使って、Apacheがちゃんとファイルを読めるようにしなければなりません。

どこに問題があるか、問題の特定は、Apacheのエラーログを見ると速いです。エラーログは

/private/var/log/apache2

で見ることが出来ます。

Linuxのファイル設定については、色んな本に書いてあるので、ここでは細かくは書きません。ただ、ファイルやディレクトリのアクセス権限でハマることが多いのでここに書いておきました。

以上、DjangoがApacheで動くようになるまでには結構苦労すると思いますが、皆様の参考になればと思います。

Well known tax saving setting by buying properties abroad

Well known structure

Buying properties abroad has become a well known structure for saving setting among individuals in high income tax brackets. Properties abroad are especially popular because of two major reasons.

1) The split of the cost between building and land is much more favorable overseas. In Japan, especially in urban area, land portion of the acquisition cost is relatively high. In Tokyo, it normally consists more than 50% of the total purchase price, while those in NY, LA, London, and Paris, the cost of building is apparently much higher in the entire cost of the purchase. Proportion can reach to astounding 85%:15% or even 90%:10%. This means you can expense much larger portion of the total cost you actually cash out.

2) Buildings do last much longer than in Japan but you can expense them all in much shorter period because of the life year by the Japanese tax law. Because the typical life year of a new building under the Japanese tax law is 47 years. And if ones you are purchasing are second handed, its life year is 47 years minus 80% of years that were already passed. For example, if it is 80 years old (which is not unusual in Europe for example), 47 yrs – 80 yrs * 80% = negative number, and if it becomes negative, minimum life year is 20% of the original life year (47 yrs) which is 9.4 yrs.

For instance, you buy an apartment made of concrete and steal of 80 years old in Paris for 100 million yen, its life year for the Japanese tax is 9 years (as mentioned above). Its cost of land is 85 million yen (85% of the total cost), and therefore, the depreciation expense that you can deduct against your rent income is about 9.4 million yen. And if the rent income is 1 million yen per year, the loss of 8.4 million yen (1- 9.4) can be deducted from your other income in Japan (say salary).

Converting salary income today to Capital Gain in future

There is another beauty. Sometime in future, you will sell the property. The cost for the capital gain is the book value after subtracting all the depreciation expenses you have booked since your purchase. The capital gain will look very large. But you will probably benefit from the structure.

The tax rate on salary or business income can be as high as about 50% including resident tax and social insurance. By offsetting the depreciation expense against salary income in this year, you will have the same amount of capital gain, presuming that market price of the property remains the same. (It can increase in value as opposed to this presumption, of course). The tax rate on capital gain is only 20% (if you hold more than 5 plus years). In another word, you are reducing your salary income by the amount of the depreciation expense and increasing the capital gain in future by the same amount. It is almost like converting your highly taxed salary income today to lightly taxed capital gain in future.

GTEC受けてみました

GTECを受けてみました。

テストの結果は、もう一つでしたが、気軽に30分でやれるし、値段は2000円だし、そういう意味では価値があると思いました。

この自宅でできるGTECではリスニングとリーディングがあります。私の場合は、自分の思い込みとは別に、リスニングがダメでした。そう言われてみれば、相手が言っていることをちゃんと聞き取れないことがあるし、言いたいことをうまく言えないこともよくあります。自分では、リスニングは得意ではないけど、それほどダメでもないだろうと思ってたのですが、テストの成績は残酷であり正直です。やっぱりリスニングがダメなのでした。

今後は少しリスニングの勉強を続けたいと思います。

このテストは値段がお手頃なところがとてもいいです。毎月1回受けても全然問題ありません。いわゆるPDCA的なものを練習してみるのにもちょうどいいように思いました。つまり、目標を立てて、その目標を実現するための計画を立てます。実行してみて、結果を確認し、良ければそれでいいですし、ダメならダメで、では次は何をしようとやり方を変えてみれば良いのです。

しばらく(5年ぐらい?)続けてみようかと思いました。