PythonでWebサービスを作るために色々な事に遭遇したり、調べたりしたので、それをシェアするためのポストです。色々とやってみないとわからない事があり、知ってれば無駄な時間を大量に使う必要のなかった落とし穴があるので、それをシェアしようという趣旨です。 貴重な時間を浪費するのを避けるためにも、次にやる人のかたの参考になれば幸いです。 どの言語を使うか まず言語選びです。ウェブサービスを作る場合には、言語を選ぶ必要があります。可能性としては、C#、Java、Ruby、PHP、Pythonなどがあると思います。最近はサーバーサイドのJavaScriptやLinuxで走るSwiftなどもあります。色々ありますし、どれを使っても一緒と思いそうですが、ライセンスや言語の性質でその後に大きく影響するので、実はとても重要です。 まず、C#はLINQもあり非常に使いやすいのですが、WEBサービスとして公開する際にはライセンスの問題が発生するので注意が必要です。最初からユーザーにライセンスのコストを転嫁できる立場の強いWEBサービスなら別ですが、最初は無料でユーザー数の獲得に力点を置いているような場合には(特に最初は)コスト割れになると思われるので、使わない方が無難です。ちなみに私は簡単便利なLINQは大好きです。社内システムなどで使うようでしたら問題なさそうです。 Javaは開発が重たすぎるので、やめた方がいいという意見も多いです。また、世の中で活躍している有名なWEBサービスはスクリプト言語またはライトウェイト言語と呼ばれているRubyやPHPを使っているところが多いようです。Moneyforwardとかfreeeとか。実際に調べてみると、良いフレームワークやデータベースとの接続を楽にするOR Mappingは随分改良されているようで、Javaも選択肢の一つなのではないかと思いました。 C#やJavaなどは静的型付け言語と呼ばれていますが、静的型付け言語の良いところは、コンパイルする時に型に関するエラーを見つけてくれるので、バグが入りにくいというのがあると思います。実際にiPhoneなどの開発に使われる言語はSwiftですが、これは静的型付け言語です。AppleがSwiftを静的型付け言語にしたのは(統計的にバグが少なくなるなどの)理由があるはずです。 ライトウェイト言語(LL)では、RubyやPython、PHPなどがあります。私は一応全部試してみて、今回はPythonで行こうと決めました。Rubyは日本では大手のWebサービスにも使われておりメジャーなのですが、Googleの検索件数などから逆算した割合だと、世界ではPythonの方が圧倒的に使われています。私の調べた範囲なだけですが、使っているプログラマーの数が多いからかライブラリーの数も豊富です。画像を使ったWebサービスでは必ず必要なPILLOWや、CSVの読み込みや書き出しの処理をするcsv、エクセルやPDFの処理など多数のライブラリーが存在します。きっとRubyやPHPにもあるのでしょうが、海外でのシェアはPythonの方が圧倒的です。 PHPも多くのサイトで使われているし候補ではあったのですが、他の言語では関数やプロパティをA.Bというふうに書きますが、PHPではA->Bという風に書きます。2文字で打ちづらいキーで書かなくてはいけないのと、見た目が何となく好きになれなかったのでやめました。ちょっと本質的な理由ではないですね。 動的型付け言語はバグが多くなり、メンテが大変か? 静的型付け言語の方がバグが発生しにくいと思われるので、システムが大きくなる予定だったら、メンテナンスのことを考えてJavaを使った方が結局効率がいいのではとは思いました。RubyやPythonなどの動的型付け言語は最初は楽ですが、あとでバグ取り地獄に入ってしまうのだったら、開発の後半でシステムが大きくなっていくほど長い時間がかかりそうに思えました。最初が急坂でだんだん傾斜が緩くなっていくか、最初がゆるいけど、あとで段々きつくなっていくかのどちらにするかのイメージです。 ただ、現状を見回すと急成長しているWebサービスは動的型付け言語でやっているっぽいです。私の見えていない何かがあるのかもしれないと思い、とりあえずその流れに合わせてみることにしました。 エディタ、IDE、開発ツール 最初はATOMを使っていたのですが、開発が本格的になってからPycharmに変えました。 ATOMは無料ですし、入力補助のモジュールもあるのでテキストエディタとしては大変優秀です。ですが、変数のスペルミスなどは事前に見つけてくれないので、実際に走らせてみるまでわかりません。 ATOMに限りませんが、テキストエディタで開発すると、なんでもテキストエディタとターミナルからコマンドを使ってやらなくてはいけないので、プログラムが走るまでの環境をどうやって作るかとか、ツールのインストールの仕方とかとてもよくわかるようになります。私も、ATOMで開発を始めたおかげで、Linux(やMaxOS)がどうなっているかだいぶ勉強になりました。 最初は無料でいいのですが、本格的にやることがわかったら無料でも有料でもIDEを使った方がいいと思います。私の場合はPycharmを個人ライセンスで買ったので89ドルでしたが、スペルチェックのミスを見つけるのやリファクタリングはエディタではできないので、それだけでも十分に元が取れます。 まだ試していない機能がたくさんあるのですが、デバッグでブレークポイントも設定できるようですし、IDEにお金を出す価値は十分すぎるほどあります。 フレームワーク フレームワークはPythonでは一番機能が充実していると言われるDjangoにしました。PythonではそのほかにもFlaskやPyramidなど色々なフレームワークがあるようですが、Djangoが一番機能が充実しているようです。実際、ORMや画面遷移など、とても便利です。 ORMは何を使ったらよいか。 ただ、DjangoのデフォルトのORMは書き方も直感的で便利ではあるのですが、データベースを動的に複数作りたい場合に、構造的にうまくできなさそうなのでやめました。DjangoではDBへの接続を設定ファイルに書いておかなくてはいけないのですが、私が作ろうとしているのは、新しいユーザーがウェブサイトから登録した場合に、個別に新しいDBを作る設計にしたかったので、接続文字列をログインのたびに動的に変更できない(ように少なくともOfficialのTutorialではそう見えた)Django ORMはやめて、sqlalchemyというものを使いました。 sqlalchemyはFlaskやPyramidなどのPyrhonの他のフレームワークで使われているORMなのですが、Djangoでもインポートして使えます。 データベースは何を使うか。 Djangoのデフォルトはsqlite3なのですが、使おうと思ったプラットホームのサービスのHerokuでは、sqlite3は使えなくて、Postgresqlです。その他にMySQLという選択肢もありますが、私にはMySQLでもPostgresqlでもどちらを使っても得られる機能は同じに見えました。sqlite3はデータがファイルなので管理するにしてもわかりやすいのですが、パスワードをつけることができないのでユーザー認証ができず、やめました。 プラットフォームは何を使うか Windowsサーバーはライセンス料が発生するので論外でしょう。 次に、Linuxを使うかMacを使うかですが、普通はLinuxのどれかのバージョンを使うのでしょうが、私は開発をMacでやっているので、WebサーバーもMacにしました。やっぱり環境の構築とか色々覚えるより、使い慣れている環境を使った方が一々調べる手間も減ると思ったので、ハード代くらいは浮くと思ったのです。ハード代といってもmac miniなら5万円くらいで買えるので、Linuxのハードを買ってもそれくらは普通にかかりそうです。 サーバーをローカルで立てるか、クラウドにするかも考えたのですが、今の所は、事務所に実際のサーバーを置いて運用する予定です。最初はHerokuを使おうと思っていたのですが、色々試したところで、動的にアップロードした画像ファイルをHerokuには保存できないということがわかったのでやめました。画像ファイルが保存できないなんて、領収書の保管が必要な私のサービスでは致命的でした。 ちなみにアップロードした画像ファイルはAWSに保存するようにするのが一般的なようなのですが、それだったら最初からAWSを使った方がよくないですか? 以上、色々と言語の選定から、フレームワーク、データベース、環境構築などに渡りつらつらと書きました。新しくWebサービスを立ち上げる際に沢山の選択肢がありますが、その中からどれを選ぶかなどの参考になれば幸いです。
Year: 2017
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 … Read More “DjangoをApacheで動かすまでの話” »
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 … Read More “Well known tax saving setting by buying properties abroad” »
GTECを受けてみました。 テストの結果は、もう一つでしたが、気軽に30分でやれるし、値段は2000円だし、そういう意味では価値があると思いました。 この自宅でできるGTECではリスニングとリーディングがあります。私の場合は、自分の思い込みとは別に、リスニングがダメでした。そう言われてみれば、相手が言っていることをちゃんと聞き取れないことがあるし、言いたいことをうまく言えないこともよくあります。自分では、リスニングは得意ではないけど、それほどダメでもないだろうと思ってたのですが、テストの成績は残酷であり正直です。やっぱりリスニングがダメなのでした。 今後は少しリスニングの勉強を続けたいと思います。 このテストは値段がお手頃なところがとてもいいです。毎月1回受けても全然問題ありません。いわゆるPDCA的なものを練習してみるのにもちょうどいいように思いました。つまり、目標を立てて、その目標を実現するための計画を立てます。実行してみて、結果を確認し、良ければそれでいいですし、ダメならダメで、では次は何をしようとやり方を変えてみれば良いのです。 しばらく(5年ぐらい?)続けてみようかと思いました。
春になってきました。無事に確定申告の忙しい時期を終えることが出来てホッとしています。 税務調査で仕掛品の未計上を質問されました。あるコンサルティングのプロジェクトで売り上げが上がっていないのに、コンサルタントの給与が仕掛品として資産に計上されず、費用に上がっていることを言われたのです。 では、この場合に必ず仕掛品に計上をしなくてはいけないのでしょうか。 基本通達を見ると以下の様になっています。 2-2-9 設計、作業の指揮監督、技術指導その他の技術役務の提供に係る報酬に対応する原価の額は、当該報酬の額を益金の額に算入する事業年度の損金の額に算入するのであるが、法人が継続してこれらの技術役務の提供のために要する費用のうち次に掲げるものの額をその支出の日の属する事業年度の損金の額に算入している場合には、これを認める。(昭55年直法2-8「七」により追加) (1) 固定費(作業量の増減にかかわらず変化しない費用をいう。)の性質を有する費用 (2) 変動費(作業量に応じて増減する費用をいう。)の性質を有する費用のうち一般管理費に類するものでその額が多額でないもの及び相手方から収受する仕度金、着手金等(2-1-12の(注)の適用があるものに限る。)に係るもの なかなか寛容な規定ではあり、また、企業会計の実務に考慮した規定です。一般の事業会社では製造業でもやっていない限り製造原価報告書を作りません。したがって、未完成のプロジェクトの分の人件費を集計しないことが多いです。ですので、このような指摘(?)をされることが多いと思います。 税法は、税法や施行令などの法律で決まっていない限りは、企業会計のルールに従います。これは法人税法22条にも書いてあります。売上の基準は実現主義、費用は発生主義で計上するのです。あらためて、なぜ通常の企業会計ではサービス業で仕掛品を計上しないことが多いのか考えてみました。 私は長年、税務をやっていて、会計学の基本的な部分がちょっと曖昧になってしまいました。税務をやっていると、税法の規定にばかり目がいってしまい、そもそも論の会計が曖昧になってしまっていたのです。 結論としては、やはり社員の給与は固定費的なものなので、直接原価的な考え方よりは、期間費用であるという考え方が背後にあるのではないかと思いました。 ですので、税務調査でそのようなことを指摘された場合には、法人税法22条に立ち返り、企業会計ではどうなっているのか、また、その際には基本通達2-2-9をよく読んで、その射程がどうなっているのかを検討して、税務調査官の方にその旨を伝えて検討してもらうのが良いように思います。
外国語が上手になるには文法が大切なのだそうです 英語は日本語とは本当に別の言語なので、習得するのには相当の時間がかかります。ただ、時間「は」かかりますが、必要な練習や勉強さえやれば十分に習得はできます。ネイティブのレベルには到達することはないと思いますが、仕事で使う分には十分に使えるようになります。これは身をもって保証します。地道な努力は必要で、これは避けられないとおもいますが、逆を言うと、地道な練習さえ継続できれば、外国語の一つくらいは出来るようになるのです。 英語で出来る様になったのですから、もしかしたらもう一つくらい出来るようになるかも知れません。 最近、読んだ本で「一生モノの英語力を身につけるたったひとつの学習法」と言うのがありました。 この本で、ちゃんとしたレベルの高い英語力を身につけるには、英文法が不可欠と書いてありました。確かに我々外国人は英語を肌ですべて吸収しているわけではないので、母国語である日本語のように直感的に、この文章は合っているとか、誤っているとかを、判断することができません。ですので、文法が大事なのだそうです。なるほど、確かに理屈にあっていますよね。 私も、もう一度文法を勉強してみようと思い、早速、文法の本を注文しました(中古ですが)。 効果測定の話、GTEC 最近やって見たいなと思ったのが、ベネッセが提供しているGTECという試験です。この試験は安くて、かつ、自宅のコンピュータで出来るのが特徴です。 GTEC TOECIなどは一回の試験が5,725円です。また、事前の申し込みが必要です。このGTECはまだ一般的に知られていないのが難点で、この試験のスコアが良くても、就職や転職活動であまり認めてくれないかもしれませんが、自分で学習するうえでの進捗を測るには最高です。 まず、一回の試験料が2,160円です。しかもオンラインで申し込みが出来て自宅で受験が出来ます。わざわざどこかまで試験を受けに行く必要が無いし、一回の試験にかかる時間はたったの30分だそうです。この試験のぶれがどれくらいなのかまだわかりませんが、TOEICなどと同じように、上手く計算されていて、同じ実力の人が受ければ同じようなスコアが出るようにできていれば、自分の学習の成果をわざわざ半日潰してどこかまで行く必要はありません。 他人に見せる目的でないのであれば、自分はちゃんと不正をせずに試験を受けているとわかっているので、スコアは自分のためだけのものであり、効果の測定には十分に目的を達成出来ると思います。 もう一ついいと思ったのは、TOEICは990点で終わりです。それ以上の点数はありません。このGTECはそれ以上の能力も測れるようなので、良いなと思いました。 ご興味がある方は上記のリンクから見てみたらいいと思います。
Apparently, it became more difficult to open a bank account in Japan. The screening process by banks are very very strict today. We have a few clients with whom we helped establishing a company and opening a bank account for them. Until a few years ago, it was difficult and it required a lot of … Read More “It turns more difficult to open a bank account recently in Japan.” »
仕事柄、新規のクライアントの日本法人を設立することが多いのですが、この時に大変になるのが銀行口座の開設です。外国のお客様は日本で営業を始めようと考えて日本法人を設立するのですが、銀行は、会社が今現在に存在することの証明が出来る資料を求めてきます。 これが結構大変なのです。鶏が先か、卵か先かの状態になることも多いです。つまり、良く求められるのが請求書や見積書なのですが、これは銀行口座が無いとなかなか出せるものではありません。銀行口座もないのに、まさか現金で払ってくださいなんて言えないし、請求書なんて実際問題ムリなのです。 もう一つ、金融機関は事務所が実際にあるかどうかをチェックしているようでもあります。信用金庫に新会社の口座開設の手続きを問い合わせると、実際に担当者が事務所を訪問して、本当に事務所が存在しているのかどうかを確認するのだそうです。 金融庁あたりが指針を出していると思われますが、私たち外部の人間には、内容が具体的にどのようになっているのかは知りようがありません。ただ、想像するには、背景はもっともなものであり、不正な銀行口座を防止するためのものだと思われます。なので、私たちができることは、口座を開設しようとしている会社が不正なものであることが疑われないように、もっと言えばペーパーカンパニーであることが疑われないような、外観を作ることなのでしょう。 以前、銀行の方に聞かれたのは、住所がサービスオフィスではないかどうかでした。サービスオフィスは住所だけを貸しているところもあるので、そこを確認していたのでしょう。 外国会社の設立をお手伝いする立場の私たちの事務所としても悩ましい問題です。
Swift3の文法が変わりすぎて、昔の本がほとんど役に立たなくなってしまいました。あまりに違いすぎて、文法を結局一から勉強しなくちゃいけないのと同じ状況なので、本を一冊買ってきました。 「Swift実践入門」 今をときめくウェブ系の会社であるクックパッドとメルカリの実務家が書かれているので、ただの文法だけ解説した本と違って、それぞれの機能をどのような場面で、どのような理由で使うのかが書いてあり買ってよかったと思います。 クラスと構造体の使い分けなども書いてあるのですが、できるだけクラスを使わずに構造体を使った方がいい、など目から鱗が落ちるような実践的な知識も色々書いてあります。 私にとってよかったのは、「Web APIのクライアントを作ろう」のセクションでした。今のスマートフォンのアプリでは、Web APIを通した情報の取得と、投稿は欠かせない機能です。その部分を実際のコードを使って解説していただいているので、とても役に立ちそうです。
噂には聞いていましたが、Swift 2.xから3.xに変更するのはとても大変です。以前に書いたコードがかなり使えません。全然使えないということはないのですが、引数の使い方が変わったり、関数の名前が変わったりで、マニュアルで直そうとすると、一日じゃとても終わりません。ほぼ新言語をやっているかのようでした。いちいちグーグルで調べても、情報が少なくて良くわからないし。。 Pythonも2.x系から3.x系に移行するときは、ほとんど互換性がなかったと言いますから、Swiftでもこれくらい仕方がないのでしょう。 新しいプログラミング言語を学ぶ時の常ですが、最初はよくわからなくても、我慢して続けていると少しずつわかってきます。継続は力なり。頑張って少しずつ続けてみようt思います。