突然gaeのdev_appserver.pyがEOFErrorがでて起動しなくなったときの対処法
参考になったのがこれ
これをやってみると、
$ 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をこっちに移行したい。(トラフィック量次第だが無料なので。)
概要
macにvirtualboxを入れて、centos7をインストール。
その後google app engine(以下gae)で開発環境をつくって、
本番環境へのアップロードもできるようにする。
手順
virtual boxのインストール
Downloads – Oracle VM VirtualBox
centosのダウンロード
今回はminimal ISOを使う。
virtual boxにcentos7を入れる
ダウンロードしたisoを指定して、centosをインストールする。
NWはNATと Host only adapterを使う。
Host only adapterでは以下でつまった。
VirtualBoxでホストオンリーアダプタが「無効な設定が見つかりました」となり有効化できない - カタカタブログ
ホストと通信できるようにする
centos 7は6とではいろいろ違いがあった。
今回は SElinuxと、firewalldを無効にすればipを指定してsshできた
下記を参考にした。
途中SElinuxの設定で間違った入力をしたせいで、linuxがreboot後立ち上がらなくなった。 注意。
あとは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は
そうすれば本番環境にアップロードされる。便利!
今後やること
・あまりトラフィックがきていないものについてはgaeを使った方がawsとかよりも安いのでgaeにうつす
・独自ドメインを設定する
vim 上で 今のファイルをpylintしたいときの手軽な方法をメモ
pylint -r n %
%が今のファイルという意味 ちなみに%:hで今の開いているファイルのディレクトリを表示できる
github で pull requestを送るときの超速方法メモ
今回以下のrepositoryにpull requestを送った。 いつもやり方を忘れるので、今度は忘れないうちにメモしておく
fork
自分のアカウントに対象リポジトリを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の方ができることの幅が広く、評判もよかったのでそっちを使うことにした
やり方
- 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}}
- 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に入りました!'; } }) }]);
わかったこと
codeigniter側では、きちんとコントローラーとviewをセットしてあげないとだめ。 angular側でうまくやるのかと勘違いしていたが、結局URLを参照するから セットしないと何も起きなくなる。
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が挿入される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')};
のようにページ読み込み完了後にスクリプト実行で対応できた。