読者です 読者をやめる 読者になる 読者になる

ITの隊長のブログ

ITの隊長のブログです。CakePHPとPlayFrameworkを使って仕事しています。最近はAngular2をさわりはじめたお(^ω^ = ^ω^)

【起動できませんでした】面白そうなOSS見つけた。「python-for-android」

Python

github.com

README.mdやドキュメントだけでは起動できず、ソースを読んでオプションを試してみたけど、結局Android起動まではできませんでした。

また試してみるかもしれないので、メモしておく。

とりあえず試した

Getting Started — python-for-android 0.1 documentation

$ pip install python-for-android
$ p4a apk --requirements=kivy --private obasann/ --package=net.inclem.planewavessdl2 --name="planewavessdl2" --version=0.5 --bootstrap=sdl2

pipでインストールできた。んで、よくわからんけど、起動っぽいコマンドを実行。

NDKのパスが見つからん。バージョンが見つからん。

エラー発生です。

[WARNING]: Android SDK dir was not specified, exiting.

sdkがないー。(そのあとにndkがないー!)と言われた。

コマンドで指定してあげることもできるが、exportしてあげたほうが楽かも。

Getting Started — python-for-android 0.1 documentation

$ export ANDROIDSDK="$HOME/Library/Android/sdk"
$ export ANDROIDNDK="$HOME/Library/Android/ndk"
$ export ANDROIDNDKVER="r10e"  # Version of the NDK you installed
$ p4a apk --requirements=kivy --private obasann/ --package=net.inclem.planewavessdl2 --name="planewavessdl2" --version=0.5 --bootstrap=sdl2

AttributeError: ‘Context’ object has no attribute ‘hostpython’

build中に踏んだ。

github.com

よくわからんが、hostpython2ってのがbundle?されているやつをそのまま使うのはダメらしい。

なので、再度ビルドする必要があるとのこと。どないせーちゅーねん。

Troubleshooting — python-for-android 0.1 documentation

This is a known bug in some releases. To work around it, add your python requirement explicitly, e.g. –requirements=python2,kivy. This also applies when using buildozer, in which case add python2 to your buildozer.spec requirements.

ふむ。オプションを追加してあげれば良いのね。

$ p4a apk --requirements=kivy --private obasann/ --package=net.inclem.planewavessdl2 --name="planewavessdl2" --version=0.5 --bootstrap=sdl2 --requirements=python2,kivy

コンパイルに結構時間かかっている感じ。

謎のエラー発生

そもそもこのエラーの見方がわからん。

これを解決する時間がないので、また今度(´・ω・`)

[INFO]:    -> directory context /home/user/.python-for-android/build/bootstrap_builds/sdl2-python2/jni
[INFO]:    -> running ndk-build V=1
           working: /home/user/Library/Android/ndk/build/core/build-binary.mk:700: *** Android NDK: Aborting (set APP_ALLOW_MI...(and 58 more)  Exception in thread background thread for pid 69768:
Traceback (most recent call last):
  File "/home/user/.pyenv/versions/anaconda3-2.3.0/lib/python3.4/threading.py", line 911, in _bootstrap_inner
    self.run()
  File "/home/user/.pyenv/versions/anaconda3-2.3.0/lib/python3.4/threading.py", line 859, in run
    self._target(*self._args, **self._kwargs)
  File "/home/user/.pyenv/versions/anaconda3-2.3.0/lib/python3.4/site-packages/sh.py", line 1540, in wrap
    fn(*args, **kwargs)
  File "/home/user/.pyenv/versions/anaconda3-2.3.0/lib/python3.4/site-packages/sh.py", line 2455, in background_thread
    handle_exit_code(exit_code)
  File "/home/user/.pyenv/versions/anaconda3-2.3.0/lib/python3.4/site-packages/sh.py", line 2153, in fn
    return self.command.handle_command_exit_code(exit_code)
  File "/home/user/.pyenv/versions/anaconda3-2.3.0/lib/python3.4/site-packages/sh.py", line 815, in handle_command_exit_code
    raise exc
sh.ErrorReturnCode_2:

  RAN: /home/user/Library/Android/ndk/ndk-build V=1

  STDOUT:
Android NDK: WARNING: APP_PLATFORM android-15 is larger than android:minSdkVersion 12 in /home/user/.python-for-android/build/bootstrap_builds/sdl2-python2/AndroidManifest.xml
Android NDK: WARNING:/home/user/.python-for-android/build/bootstrap_builds/sdl2-python2/jni/src/Android.mk:main: non-system libraries in linker flags: -lpython2.7
Android NDK:     This is likely to result in incorrect builds. Try using LOCAL_STATIC_LIBRARIES
Android NDK:     or LOCAL_SHARED_LIBRARIES instead to list the library dependencies of the
Android NDK:     current module
/home/user/Library/Android/ndk/build/core/build-binary.mk:687: Android NDK: Module main depends on undefined modules: python_shared
/home/user/Library/Android/ndk/build/core/build-binary.mk:700: *** Android NDK: Aborting (set APP_ALLOW_MISSING_DEPS=true to allow missing dependencies)    .  Stop.


  STDERR:


Traceback (most recent call last):
  File "/home/user/.pyenv/versions/anaconda3-2.3.0/bin/p4a", line 11, in <module>
    sys.exit(main())
  File "/home/user/.pyenv/versions/anaconda3-2.3.0/lib/python3.4/site-packages/pythonforandroid/toolchain.py", line 754, in main
    ToolchainCL()
  File "/home/user/.pyenv/versions/anaconda3-2.3.0/lib/python3.4/site-packages/pythonforandroid/toolchain.py", line 343, in __init__
    getattr(self, command_method_name)(unknown)
  File "/home/user/.pyenv/versions/anaconda3-2.3.0/lib/python3.4/site-packages/pythonforandroid/toolchain.py", line 93, in wrapper_func
    build_dist_from_args(ctx, dist, dist_args)
  File "/home/user/.pyenv/versions/anaconda3-2.3.0/lib/python3.4/site-packages/pythonforandroid/toolchain.py", line 138, in build_dist_from_args
    build_recipes(build_order, python_modules, ctx)
  File "/home/user/.pyenv/versions/anaconda3-2.3.0/lib/python3.4/site-packages/pythonforandroid/build.py", line 561, in build_recipes
    recipe.build_arch(arch)
  File "/home/user/.pyenv/versions/anaconda3-2.3.0/lib/python3.4/site-packages/pythonforandroid/recipes/sdl2/__init__.py", line 29, in build_arch
    shprint(sh.ndk_build, "V=1", _env=env)
  File "/home/user/.pyenv/versions/anaconda3-2.3.0/lib/python3.4/site-packages/pythonforandroid/logger.py", line 173, in shprint
    for line in output:
  File "/home/user/.pyenv/versions/anaconda3-2.3.0/lib/python3.4/site-packages/sh.py", line 863, in next
    self.wait()
  File "/home/user/.pyenv/versions/anaconda3-2.3.0/lib/python3.4/site-packages/sh.py", line 792, in wait
    self.handle_command_exit_code(exit_code)
  File "/home/user/.pyenv/versions/anaconda3-2.3.0/lib/python3.4/site-packages/sh.py", line 815, in handle_command_exit_code
    raise exc
sh.ErrorReturnCode_2:

  RAN: /home/user/Library/Android/ndk/ndk-build V=1

  STDOUT:
Android NDK: WARNING: APP_PLATFORM android-15 is larger than android:minSdkVersion 12 in /home/user/.python-for-android/build/bootstrap_builds/sdl2-python2/AndroidManifest.xml
Android NDK: WARNING:/home/user/.python-for-android/build/bootstrap_builds/sdl2-python2/jni/src/Android.mk:main: non-system libraries in linker flags: -lpython2.7
Android NDK:     This is likely to result in incorrect builds. Try using LOCAL_STATIC_LIBRARIES
Android NDK:     or LOCAL_SHARED_LIBRARIES instead to list the library dependencies of the
Android NDK:     current module
/home/user/Library/Android/ndk/build/core/build-binary.mk:687: Android NDK: Module main depends on undefined modules: python_shared
/home/user/Library/Android/ndk/build/core/build-binary.mk:700: *** Android NDK: Aborting (set APP_ALLOW_MISSING_DEPS=true to allow missing dependencies)    .  Stop.


  STDERR:

【CakePHP3.x】FlashComponentのメッセージが表示されない

CakePHP CakePHP3.x PHP

タイトルだけではよくわかんないね。

<?php
// ...
    public function cakeAction($id = null)
    {
        $function = function ($post) {
            // ...
        };
        $this->_something($id, $function);
        $this->render('edit');
    }

    private function _something($id, $function)
    {
        // ...
        $this->Flash->success(__('success!'));
        // ...
    }
// ...

とあるControllerの中に↑のようなアクションとメソッドがあるとする。

/controller/cake-action/1へアクセスすると、cakeAction($id = null)が呼ばれて、その中の処理で、_something($id, $function)メソッドが呼ばれるような感じです。

_something($id, $function)は、処理の途中で$this->Flash->success(__('success!'))を実行しています。これでPHPでよく見る$_SESSIONにメッセージが書き込まれたはずです。

このメッセージを取り出して使うのはView(template)のほうで、この場合だと、edit.ctpなんてテンプレートを呼び出してブラウザでレンダリングするようになっています。

が、何度検証しても、何故かメッセージがでてこない。

色々調べた所、わかりました。

理由としては、セッションに書き込んだ後、$this->render()を呼び出すと、中の処理でセッションがクリアされてることがわかりました。何故ー!?

  1. Cake\Controller\Controller->render()
  2. Cake\View\View->render()
  3. Cake\View\View->renderLayout()
  4. Cake\View\View->_render()
  5. Cake\View\View->_evaluate()

↑の5番目の箇所でセッションがクリアされていました。

ただ、根本な理由はわかりませんでした。。。(´・ω・`)

なんか、何度も実行されるんだよね、このCake\View\View->_evaluate()ってメソッド。

呼ばれたセッションが消えるわけではなくて、その何度も実行されているときに何かのタイミングで削除されてるん感じ。なのでよくわからん。

とりあえず、このアクションはレンダリングするテンプレートファイルは決まっているので、処理の最初で決めるように修正しました。

<?php
// ...
    public function cakeAction($id = null)
    {
        $this->render('edit');
        $function = function ($post) {
            // ...
        };
        $this->_something($id, $function);
    }

    private function _something($id, $function)
    {
        // ...
        $this->Flash->success(__('success!'));
        // ...
    }
// ...

これでよし。

しかし、処理の結果でテンプレートファイルをswitchさせたい場合はメッセージをどうすればいいんだろ?

・・・・

きになったので、やっぱりもう少し調べてみることにした。

<?php

// ...
    /**
     * Sandbox method to evaluate a template / view script in.
     *
     * @param string $viewFile Filename of the view
     * @param array $dataForView Data to include in rendered view.
     *    If empty the current View::$viewVars will be used.
     * @return string Rendered output
     */
    protected function _evaluate($viewFile, $dataForView)
    {
        $this->__viewFile = $viewFile;
        extract($dataForView);
        ob_start();

        include $this->__viewFile;

        unset($this->__viewFile);

        return ob_get_clean();
    }
// ...

_evaluate()メソッドの中身の全部です。ob_get_clean()が怪しいと思っています。

これが呼ばれたら、$_SESSIONの中身が空になるのか調べてみました。

<?php

require_once('./a.php');
require_once('./b.php');

ob_start();

include './index.php';

ob_get_clean();

require_once('./b.php');

echo $_SESSION['test'] . PHP_EOL;
<?php
@session_start();
$_SESSION['test'] = 'test';
<?php
@session_start();
if (isset($_SESSION['test'])) {
  echo $_SESSION['test'].PHP_EOL;
} else {
  echo 'testは見つかりませんでした'.PHP_EOL;
}

a.phpでセッションをセットして、b.phpを最初に呼ぶ。

んで、次にob_start()してob_get_clean()を実行する。

そのあとに、b.phpを呼び出して、セッションから値が読めるかチェックします。

はたして結果は…

$ php ob_get_clean-session-delete.php
test # 最初のrequire_onceでよんだやつ
test # ob_get_clean()のあとによんだやつ

ダメでした。うーん。これが原因じゃないのかな。

Bitbucketでgitの容量が大きすぎと怒られたので容量削減した

git Bitbucket

とある案件で、定期的にデータベースをsqlにエクスポートして、gitで管理し、そのバックアップ先をbitbucketにしている。

久々に確認しようかなと画面みたら、「このリポジトリは1GBを超えています」みたいな注意書きが。

で、下記URLを案内してもらったので、色々試す。

リポジトリ サイズの縮小 - アトラシアン製品ドキュメント

やったこと

git gcでメンテナンス

$ git gc

んで、git push

$ git push origin master
...
remote: repository is in read only mode (over 2 GB size limit).
remote:
remote: Learn how to reduce your repository size: https://confluence.atlassian.com/x/xgMvEw.
To git@bitbucket.org:xxxx/database.git
 ! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'git@bitbucket.org:xxxx/database.git'

・・・できない(´・ω・`)

bitbucketの手順に従う

↑で貼り付けていた、これ↓のこと

リポジトリ サイズの縮小 - アトラシアン製品ドキュメント

この手順によって、リポジトリからプッシュ制限を削除できます。

なるほど。まずは制限を解除するために、容量削除しろ。ってのを先にやらないといけないらしい。参考にして試す。

まずバックアップ。

$ cd ../
$ cp git_repository/ _bk_git_repository/

自分の場合は、毎日バックアップをとっていたので、去年の10月ぐらいまで戻りました。

$ git reset --hard ${戻したいところまでのリビジョン番号}

戻したら、強制する必要があるので、git push --force

$ git push -force orign master

初のgit push --force。手が震える…

これで、bitbucket側がgit gcを走らせるらしいので、そのあと容量が問題なければ、容量制限が解除されるとのこと。

ヘルプには30分から1時間と書いてありましたが、5分ほどで解除されました。

バックアップ側をgit gcして、歴史をもとに戻す

次のステップとして、容量が増大した原因を探すとか、プロジェクトを分けるとかありますが、自分の場合は単純にgit gcのしなさすぎだったので、さっきバックアップとっていたgitリポジトリを、git gcして、リモートへgit pushします。

$ cd ../_bk_git_repository/
$ git gc
$ git push origin master

2GB => 68.5MBぐらいまで削減できました。(どんだけ。。。)

まとめ

  1. まずはバックアップ
  2. 容量制限された場合だと、git gcしたリポジトリgit pushすることができないので、まずはgit resetで軽くなるまでコミットログを戻す
  3. git resetしたら、そのリポジトリgit push --forceを実行
  4. bitbucket側で、git gcが走り、容量が削減されて制限が解除されたら、バックアップ側でgit gcしてgit push

これでおk

参考

qiita.com

リポジトリ サイズの縮小 - アトラシアン製品ドキュメント

【virtualenv】っしゃ!!ついに入ったぜぇえええ!!!

www.aipacommander.com

あれから結局意味不明なエラーを吐いて解決しませんでした。

が! 本日ついにinstallすることができました!!!

まずpyenvでエラーが出るvirtualenvのpythonをuninstallして、再度installします。このとき環境変数を変更してあげてinstallしましょう。

$ pyenv uninstall 2.7.9
$ PYTHON_CONFIGURE_OPTS="--enable-unicode=ucs2" pyenv install 2.7.9

installできたら、virtualenvを実行してみましょう。

$ virtualenv new-python
...
Installing setuptools, pip, wheel...done.

Foooo!!!!

参考 github.com

やる気の出し方がよくわからん

その他

今日1日やったこととして

  • ちょっとした仕事 10%
  • Angularのお勉強 20%
  • 動画鑑賞(というかダラダラ) 70%

ずっと横だったり、猫背だったりしてちょっと腰いたい。来週はどっかで走らなきゃやばい。

ほとんどダラダラしていたんだけど、せっかくオールで休みだから有益につかわなきゃ!と思うわけですよ。前読んだ本にもそう書いてあった。

www.aipacommander.com

明日死んでもいい。なんて、絶対言えない過ごし方をしたわけです。朝なんて、本を手にとって、「あー、どこまで読んだっけ?」でやる気をなくし本を置き、洋書の技術書を開いて、Angularを勉強しようとしたら、英語読むのがだるくて、これも結局手付かずだったわけです。

んで、だらだらーだらだらと時間を過ごしていたんだけども、21時ぐらいだったかな? 「あー、勉強しないと」なんて急に思い出して、ng initとコマンドうって、ちょっとやってみたんですよ。「あー、ここはあれしなきゃいけない。めんどくせーなー」なんて思っているけど、何故かタイプし続けるんですよね。んで、色々ハマってハマって、まぁここまでいいでしょ。と、終わったのが先ほど25:00。もう夜中なわけです。

あっという間でした。でもこれって朝やるべきじゃない? せっかく朝早く起きてスッキリした状態なのに、もったいないと思ったわけです。

でも、この後悔って、これまで何度も思ってきたことでもあるわけで、多分よほどなことが無い限り、治らないんじゃないかなー。

うーん。せめて、このよくわからないやる気が昼ぐらいに発火してくれないかな。

習慣つけろ!ってよく本に書いてあるけど、なんかまだ実感したことがないなぁー。はぁ。

おやすみ。