突然gaeのdev_appserver.pyがEOFErrorがでて起動しなくなったときの対処法

参考になったのがこれ

stackoverflow.com

これをやってみると、

$ python
>>> import tempfile
>>> print tempfile.gettempdir()
/tmp

/tmpを見ると

drwx------  2 honda honda  71  7月 24 09:26 appengine.app

あった、、、、これを消して再実行

➜  ~  dev_appserver.py yokkora/ --host=192.168.56.101 --admin_host=192.168.56.101
INFO     2015-07-25 06:55:19,139 sdk_update_checker.py:229] Checking for updates to the SDK.
WARNING  2015-07-25 06:55:19,351 simple_search_stub.py:1126] Could not read search indexes from /tmp/appengine.app/search_indexes <= ???????????????????
INFO     2015-07-25 06:55:19,353 api_server.py:204] Starting API server at: http://localhost:58128
INFO     2015-07-25 06:55:19,359 dispatcher.py:197] Starting module "default" running at: http://192.168.56.101:8080
INFO     2015-07-25 06:55:19,359 admin_server.py:118] Starting admin server at: http://192.168.56.101:8000
INFO     2015-07-25 06:58:37,879 module.py:812] default: "GET / HTTP/1.1" 404 1912
INFO     2015-07-25 06:58:38,068 module.py:812] default: "GET /favicon.ico HTTP/1.1" 404 1945
INFO     2015-07-25 06:58:44,714 module.py:812] default: "GET /hello/yokkora HTTP/1.1" 200 18

変なwarningが、、でも起動した。 もう一回再起動すると

INFO     2015-07-25 06:58:51,418 sdk_update_checker.py:229] Checking for updates to the SDK.
INFO     2015-07-25 06:58:51,644 api_server.py:204] Starting API server at: http://localhost:55397
INFO     2015-07-25 06:58:51,649 dispatcher.py:197] Starting module "default" running at: http://192.168.56.101:8080
INFO     2015-07-25 06:58:51,649 admin_server.py:118] Starting admin server at: http://192.168.56.101:8000

問題なしでおわった。 ようするに変なファイルが邪魔してたからできなかったという話だった。

virtualboxにcentos7を入れて、google app engineにアップロードする

仕事でgoogle app engineを使っていて、勉強環境としてほしかったので構築時のメモをする。

後々AWSをこっちに移行したい。(トラフィック量次第だが無料なので。)

概要

macvirtualboxを入れて、centos7をインストール。

その後google app engine(以下gae)で開発環境をつくって、

本番環境へのアップロードもできるようにする。

手順

virtual boxのインストール

Downloads – Oracle VM VirtualBox

centosのダウンロード

Download CentOS

今回はminimal ISOを使う。

virtual boxにcentos7を入れる

ダウンロードしたisoを指定して、centosをインストールする。

NWはNATと Host only adapterを使う。

Host only adapterでは以下でつまった。

VirtualBoxでホストオンリーアダプタが「無効な設定が見つかりました」となり有効化できない - カタカタブログ

ホストと通信できるようにする

centos 7は6とではいろいろ違いがあった。

  • serviceコマンドがない。 => systemctl start httpdみたいになる。

  • iptablesがない。 => かわりにfirewalldというのがある。

今回は SElinuxと、firewalldを無効にすればipを指定してsshできた

下記を参考にした。

途中SElinuxの設定で間違った入力をしたせいで、linuxreboot後立ち上がらなくなった。 注意。

あとはsystemctl disable firewalldをしないとreboot後にポートが閉まるのでここを忘れないようにする。

VirtualBox に CentOS7.0 をインストールして ssh ログイン + yum コマンドを使えるようにするまで - shouhの日記

GAEをダウンロード

下記からHello worldアプリのデプロイを選択

https://console.developers.google.com/start

基本この通り進める

開発環境をつくる

今回はVM上にgaeを入れたので、下記のようにhostを指定する必要があった。

dev_appserver.py appengine-try-python-django --host=192.168.56.101 --admin_host=192.168.56.101

これで

192.168.56.101:8080 で サービス

192.168.56.101:8000 で gae管理管理コンソールに入れる

本番環境にデプロイ

appcfg.py -A APPID update appengine-try-python-django --noauth_local_webserver

今回はVM上のlinuxなので、--noauth_local_webserverをつける必要があった。

実行すると、 初回のみ、URLにアクセスしろと表示がでるので、 そこにアクセスすると、tokenがでているので、それを入力。

URLは

http://APIID.appspot.com/

そうすれば本番環境にアップロードされる。便利!

今後やること

・あまりトラフィックがきていないものについてはgaeを使った方がawsとかよりも安いのでgaeにうつす

独自ドメインを設定する

github で pull requestを送るときの超速方法メモ

今回以下のrepositoryにpull requestを送った。 いつもやり方を忘れるので、今度は忘れないうちにメモしておく

github.com

fork

f:id:freewave:20150603183808j:plain

自分のアカウントに対象リポジトリをforkする

remote add

fork元が更新されたときにその更新を取得できるようにremote add しておく


git remote add git remote add upstream https://github.com/joke2k/faker.git

今後は以下で更新を取得できる


git pull upstream master

ブランチを作成し、更新

以下で対象ブランチを作成し、ソースを更新する


git checkout -b feature/add_japanese_link_to_readme <- branchの作成と作成したbranchにswitch
git branch <- 現在いるbranchの確認

自分のアカウントにpush


git push origin feature/add_japanese_link_to_readme

pull request

githubにいくとpull requestのボタンがあるので、 それをクリックしてコメントしてpull requestできる

ui-routerとcodeigniterを組み合わせてSPAをつくるときのメモ

できるまで色々と試行錯誤して大変だったからメモする。

環境

angular.version.full "1.3.15"

codeigniter define('CI_VERSION', '2.0.3');

やりたいこと

SPAというものを試してみたかったので、お手軽にcodeIgniterとangularで作ってみよう

調べてみて

angularにはデフォルトにng-routeというものがデフォルトであったが、 angular-ui-routerの方ができることの幅が広く、評判もよかったのでそっちを使うことにした

やり方

  1. SPA用のページテンプレートを作成

controller、viewに下記のようにテンプレートを作成する

controllers/ang.php

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Ang extends CI_Controller {
    public function index()
    {
        $this->load->view('ang/index');
    }

    public function template1()
    {
        $this->load->view('ang/template1');
    }

    public function template2()
    {
        $this->load->view('ang/template2');
    }
}

views/ang/index.html

<base href="<?= base_url(); ?>">
<!doctype html>
<html ng-app="app">
  <head>
    <meta charset="utf-8">
    <title></title>
    <meta name="description" content="">
    <meta name="viewport" content="width=device-width">
    <script src="js/bower_components/angular/angular.min.js"></script>
    <script src="js/bower_components/angular-ui-router/release/angular-ui-router.js"></script>
    <script src="js/ang/app.js"></script>
  </head>

  <body>
    <h3>ui.router</h3>
    <p>ui-routerでそれぞれpageを指定してみた</p>
    <div ng-controller="MainCtrl">
        <!-- multiple ページバージョン -->
        <a ui-sref="contacts_state">template1を読み込む</a>
        <a ui-sref="question_state">template2を読み込む</a>
        <section ui-view><i>templateが読み込まれる</i></section>
    </div>
  </body>
</html>

views/ang/template1.php

template1読み込みok!!!
<br />
{{title}}

views/ang/template2.php

template2読み込みok!!!
<br />
{{title}}
  1. js部分をつくる

js/ang/app.js

'use strict';

var app = angular.module('app', ['ui.router'])
    .config(['$stateProvider', function($stateProvider){
        $stateProvider
            .state('contacts_state', {
                url: '/contacts',
                templateUrl: 'ang/template1',
                controller: function($scope) {
                    $scope.title = 'contactsに入りました!';
                }
            })
            .state('question_state', {
                url: '/question',
                templateUrl: 'ang/template2',
                controller: function($scope) {
                    $scope.title = 'questionに入りました!';
                }
            })
    }]);

わかったこと

  1. codeigniter側では、きちんとコントローラーとviewをセットしてあげないとだめ。 angular側でうまくやるのかと勘違いしていたが、結局URLを参照するから セットしないと何も起きなくなる。

  2. app.jsにstateを記述する。 その際例でいうと、contacts_stateがstate名になり、 index.htmlのように<a ui-sref="contacts_state">template1を読み込む</a> のようにすると、クリックするとURLが#/contactsにかわり <a ui-sref="contacts_state">template1を読み込む</a> にang/template1が挿入される

  3. app.jsのcontroller. function($scope)・・・ のように記載すると各種ページの中でその$scopeがつかえる

その他試したこと

デフォルトルートと引数

views/ang/index.html

        <a ui-sref="detail({empId:12345})">template7へ遷移</a>

        <div id="template">
            <section ui-view><i>templateが読み込まれる</i></section>
        </div>

js/ang/app.js

'use strict';

var app = angular.module('app4', ['ui.router'])
    .config(['$stateProvider', '$urlRouterProvider', function($stateProvider, $urlRouterProvider){
        $stateProvider
            .state('detail', {
                url: '/detail/{empId:[0-9]{5}}',
                templateUrl: 'ang/template7',
                controller: function($stateParams, $scope) {
                    $scope.empId = $stateParams.empId;
                    $scope.title = 'detailに入りました!';
                }
            })
            .state('error_state', {
                url: '/error',
                templateUrl: 'ang/template_error',
                controller: function($scope) {
                    $scope.error = 'errorだよ';
                }
            });
        $urlRouterProvider
            .otherwise('/error');
    }])
    .controller('MainCtrl', ['$scope', function($scope){
        $scope.context = 'year!!';
    }]);
  • 上記の$urlRouterProviderのように定義すれば、指定URL以外は/errorに飛ばすことができる (stateに定義を忘れずに)
  • URLに引数を指定させる場合はdetail部分のように正規表現をつかえる
  • 引数の取得は$scope.empIdのように取得する

ui-viewに名前をつける

views/ang/index.html

        <a ui-sref="contacts">template2とtemplate4を読み込む</a>
        <a ui-sref="question">template3を読み込む</a>
        <section ui-view="main"><i>template2が読み込まれる</i></section>
        <section ui-view="main2"><i>template2が読み込まれる</i></section>
        <section ui-view="sub"><i>template3が読み込まれる</i></section>

js/ang/app.js

'use strict';

var app = angular.module('app2', ['ui.router'])
    .config(['$stateProvider', function($stateProvider){
        $stateProvider
            .state('contacts', {
                views: {
                    "main" : {
                        url: '/contacts',
                        templateUrl: 'ang/template2',
                        controller: function($scope) {
                            $scope.title = 'contactsに入りました!';
                        }
                    },
                    "main2" : {
                        url: '/contacts',
                        templateUrl: 'ang/template4',
                        controller: function($scope) {
                            $scope.title = 'contactsに入りました!';
                        }
                    }
                }
            })
            .state('question', {
                views: {
                    "sub" : {
                        url: '/question',
                        templateUrl: 'ang/template3',
                        controller: function($scope) {
                            $scope.title = 'questionに入りました!';
                        }
                    }
                }
            })
    }]);

上記のように定義すればui-viewに名前を指定できる。

ただし、

  • URLを変更できない。
  • 同時に2つ以上のviewを呼び出せない。

だった。(僕のやり方が悪い?)

angularは覚えることが多いけど、面白い機能がいっぱいなので、もっと勉強しよう。

object state below is captured upon first expansion

javascriptでのdom操作したいが、画面がとても重たく、 操作したいときにまだそのdomが表示されていなくて、 エラーが起きることがあった。

そんな中chrome consoleに下記のような表示がされていた。

object state below is captured upon first expansion

これは、後から読み取ったらこんなdomがありましたよ、 っていう意味だった。

そういうときは

window.onload = function(){ var element = document.getElementById('hoge')};

のようにページ読み込み完了後にスクリプト実行で対応できた。