// //

メモ -Error: Failed to lookup view ”error” in views directory-

Express4系 + ectで動かしていたページにアクセスしようとしたら下記エラーが発生


「Error: Failed to lookup view "error" in views directory "hogehoge"」


調べてみても、どうも有益な情報が見当たらない。
きりがないので試しに別環境を作って、git cloneして試してみる。


エラーが出ずに問題なく動く…


さて、安心しつつ弱った。
とりあえず、差異を探しつつ検索を続ける。


手詰まったので、pm2 killしてからpm2 startでプロセス自体を再起動してみた。


エラーが出ずに問題なく動く…


さて、原因がわからず弱った。
とりあえず、半日詰まった内容が解決したので考えるのをやめた。

lint警告

  • 現象:ビルドした際にuncehckedやdeprecationの警告ログが出てビルドが成功しない


警告レベルとは言っても未確認処理や不適切処理だから直せやと怒られている。

  • 理由:ソース上の不備もしくはlintの設定による回避を行っていない


まぁ、不適切な処理を使っていると怒られているので修正するのが最善だが、
そうも言ってられない事情もある…ので回避することにする。


ちなみに、該当部分の詳細なログが欲しい場合は下記をbuild.gradleに記載。
(これを回避処理と勘違いしてはまったのは内緒…)

allprojects {
    gradle.projectsEvaluated {
        tasks.withType(JavaCompile) {
            options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation"
        }
    }
}
  • 解決:build.gradleにlintOptionsを仕込む
android{
省略
   lintOptions {
        abortOnError false
        warningsAsErrors true
        lintConfig file("app/lint.xml")
    }
}


記載内容にもあるが、appディレクトリ配下に下記の「lint.xml」を置いてある。

<?xml version="1.0" encoding="UTF-8"?>
<lint>
    <issue id="MissingTranslation" severity="warning" />
</lint>


褒められたやり方ではないのは百も承知…

ライブラリの重複

  • 現象:ログにて以下のエラー(一部省略)が発生
com.android.dex.DexException: Multiple dex files define Landroid/support/v4/accessibilityservice/AccessibilityServiceInfoCompat

org.gradle.process.internal.ExecException: 
Process 'command '/Library/Java/JavaVirtualMachines/jdk1.7.0_75.jdk/Contents/Home/bin/java''
finished with non-zero exit value 2
  • 理由:取り込み済みライブラリが外部モジュールにも使用されていた

/libsディレクトリに「android-support-v4.jar」を置いていたが、
導入した外部モジュールであるdrag-sort-listview内にも同ファイルが存在していたため怒られていた。
(おかげで半日程はまった…)

  • 解決:build.gradleを修正


build.gradle内のライブラリ記載箇所を修正

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    // compile 'asia.ivity.android:drag-sort-listview:1.0' と記載していたのを下記に修正
    compile ('asia.ivity.android:drag-sort-listview:1.0'){
        exclude module: 'support-v4'
    }
}

AWSにてnode.js, express4.xをインストールしてhttps接続を行う

Amazon EC2にてインスタンス起動

インスタンス作成

EC2コンソールからインスタンスを作成。

Keyの作成

putty使用場合pemをputtygenにてppkに変換。

Securty Groupの設定

とりあえずinboundのsshhttpsとCustom TCP Ruleで3000ポートを開放。

ログイン設定

puttyの設定(Windows)

SSH接続のためにインスタンス作成時に作ったKey(.ppk)を設定しておく。

SSH CONFIGの設定(MAC)

.sshディレクトリのconfigファイルに下記を記載

	Host (ssh接続時に使用する任意のホスト名)
		HostName  	(作成したインスタンスのIP)	
		Port      	22
		User		ec2-user
		IdentityFile	(インスタンス作成時に作ったKeyの配置場所)

ターミナルを起動後に「ssh (上記Host)」でログイン可能。

準備

インスタンス内モジュールのアップデート
$ sudo yum update		
gitのインストール
$ sudo yum install git
nvmのインストール

・gitリポジトリからクローン

$ git clone https://github.com/creationix/nvm.git ~/.nvm

・コマンド対応

$ source ~/.nvm/nvm.sh
node.jsのインストール

・node.jsのリリースバージョン確認

$ nvm ls-remote

・対象となるnode.jsのインストール

$ nvm install v[バージョンNo]
PM2のインストール(グローバル)
$ npm install pm2@latest -g
expressのインストール
$ npm install express

expressコマンドのインストール(グローバル)

$ npm install -g express-generator
ログイン後用設定

・nvmのコマンドを使用可能にする

$ source ~/.nvm/nvm.sh

・node.jsやnpmのコマンドを使用可能にする

$ nvm use v[バージョンNo]


・再起動後のbash: xxx command not found対策
.bash_profile もしくは .bashrc

source ~/.nvm/nvm.sh
nvm use v[バージョンNo]

expressアプリケーションを作成

expressコマンドを使わずシンプルなコードで確認

適当なディレクトリを作成して下記ファイルを配置

app.js

	
		var express = require('express');
		var app = express();
		var port = 3000;

		app.get('/', function (req, res) {
		  res.send('Hello, World!');
		});
		app.get('/port', function(req, res) {
		        res.send(String(port));
		});

		app.listen(port);
		console.log("server starting...port:"+ port);


package.json


		  "name": "express-sample",
		  "version": "0.0.1",
		  "private": true,
		  "scripts": {
		    "start": "node app"
		  },
		  "dependencies": {
		    "express": "*"
		  }
		}

起動
$ pm2 start app.js

確認

・ブラウザでの確認
 awsのPublic DNSを確認
 ブラウザで「http://[Public DNS]:3000/」を実行
・pm2での確認

$ pm2 ls

expressコマンドにて作成したアプリの確認

アプリ作成
$ express [アプリ名]

起動
$ npm start
PM2でデーモン化して起動

・pm2起動用準備
 express4.xのexpressコマンドで作成したアプリはそのままではpm2での起動ができない。
 原因は、初期起動用の [アプリ名]/bin/www に拡張子が付いていないため(人に教えていただきました。)
 なので、バックアップついでに拡張子を付与する。

$ cd bin/
$cp ./www ./www.js

・pm2で起動

$ pm2 start wwww.js

・確認

$ pm2 ls

httpsでのアクセス

証明書を作成
$ openssl genrsa -aes128 1024 > server.pem
$ openssl req -new -key server.pem> server.csr
$ openssl x509 -in server.csr -days 365 -req -signkey server.pem > server.crt 
$ openssl rsa -in server.pem -out server.rsa
https用にwww.jsを書き換え

・作成した証明書類を適当なディレクトリで管理


www.js

var debug = require('debug')('web');
var https = require('https');
var app = require('../app');
var fs = require('fs');

var port = 3000;
var options = {
        key: fs.readFileSync('../keys/server.rsa'),
        cert: fs.readFileSync('../keys/server.crt')
};

//var server = app.listen(app.get('port'), function() {
https.createServer(options, app).listen(port);


参考

FiS Project
http://www.fisproject.jp/2014/10/%E3%80%90nodejs%E3%80%91koa%E3%81%A7https%E3%82%B5%E3%83%BC%E3%83%90%E3%82%92%E5%BB%BA%E3%81%A6%E3%82%8B%E3%80%90ssltls%E3%80%91/

ListViewでスクロール時に背景色が黒くなってしまう現象について

環境が激変。
かなり前に書いておいた内容を確認もせずに記載。
この訳あっているかなぁ…

Contextについて

Interface to global information about an application environment.
(アプリケーションの環境についての全体的な情報をインターフェースする。)

This is an abstract class whose implementation is provided by the Android system.
(これはアンドロイドシステムによって提供される実行の抽象クラスです。)


It allows access to application-specific resources and classes,
as well as up-calls for application-level operations such as launching activities,
broadcasting and receiving intents, etc.

(ブロードキャスティングやインテントへの返答、アクティビティの実行などの
アプリケーションレベルでの動作のアップコールだけでなく、
アプリケーションで明記した資源やクラスへのアクセスを許可を行う。)


ListViewでスクロール時に背景色が黒くなってしまう現象について


Java

	setScrollingCacheEnabled(false)


Enables or disables the children's drawing cache during a scroll.
By default, the drawing cache is enabled but this will use more memory.
When the scrolling cache is enabled, the caches are kept after the first scrolling.
You can manually clear the cache by calling setChildrenDrawingCacheEnabled(boolean).

(スクロール中の子要素の描写キャッシュを可能か不可能にする。
通常、描写キャッシュは可能になっていますが、これは多くのメモリが使用されるかもしれません。
スクロール動作のキャッシュが可能の時、キャッシュは最初のスクロール動作後に維持されます。
setChildrenDrawingCacheEnabled(boolean)を呼び出すことで手動でキャッシュをクリアすることができます。)


こちらはスクロール時に黒くなる現象を抑えられる
また、リスト上下端にあるまだ読み込み先があることを表示する黒線もそのまま表示
上下どちらかの限界までスクロールしたことを通知する青線も表示


XML

	android:cacheColorHint="#00000000"


こちらもスクロール字に黒くなる現象を抑えられる
また、リスト上下端にあるまだ読み込み先があることを表示する黒線も抑えられる
読み込み限界時の青線についてはそのまま表示される

Sublime Text 3でAndroidアプリ開発環境構築(中)

サクサクっと開発したいとEclipseからちょっと寄り道。
HTMLぐらいでしか使っていなかったのでSublime Textでどうにかできないか右往左往。


参考元

おれせか sublime text2でandroid開発。
http://ichi.fool.jp/blog/?p=1849

導入するもの

Sublime Text(今回はSublime Text 3を使用)
AndroidSDK(導入方法は割愛)
Apache Ant(同上)
Sublime Android(下記)

Sublime Androidのダウンロード

Sublime Android
https://bitbucket.org/ucomesdag/sublime-android


Sublime Textでプラグインを導入して機能の拡張ができる。
一般的には「Package Control」という便利なプラグイン管理用のプラグインを入れればできるのだが、
このプラグインで導入できるAndroid関連のプラグインは「AndroidImport」という
Androidアプリ開発用のクラスファイルでの自動import記述プラグインしかない模様。
なので今回は、直接導入を行う。


URL内右側の項目群のサイズ横もしくは、ダウンロードリンクからタグやブランチで最新のものから保存。
どうも現在ダウンロードできるものはSublime Text 3用みたい。
とりあえず解凍してAndroid (対応するOS).sublime-settingsをどこかにコピーしておく。

プラグイン(パッケージ)のインストール

Sublime Text側の仕様なのかは知らないけど、中身を入れたフォルダを圧縮したものでは上手く扱われないみたい。
そのうえ、プラグインとして認識させるには「.sublime-package」という形式のファイルにする必要がある。
また、今回のプラグインAndroidという名前で扱われることを想定しているようなので、
中身をそのまま圧縮したファイルを「Android」にリネームしてやる。
というわけで、「Android.sublime-package」という導入用のファイルが完成!
(まだSublime Text使い慣れていないので、この辺の仕様把握でアレコレ試す羽目になった…)



完成したらあとはファイルを置くだけ。
保存場所はSublime TextのInstalled Packagesフォルダ内。
Sublime Textのメニューバーの[Preferences]→[Browse Packages…]で表示されるディレクトリの一つ上の階層にある。

とりあえずパス関連の設定


.sublime-packageにした今回のプラグインを導入していれば、メニューバーにAndroidの項目が追加される。
ただ、上記のプラグイン内の階層やリネームをしてやらないと[Preferences]以外のメニューアイテム内が選択できない。



現状では未設定状態なのでNew Projectを選択しても怒られる。
というわけで、設定に移る。
[Android]→[Preference]→[Settings - Default]と[Settings - User]から設定ファイルが開く。
Defaultは\Sublime Text 3\Packages\Android\Android (Windows).sublime-settings、
Userは\Sublime Text 3\Packages\User\Android (Windows).sublime-settingsでとりあえず保存。



今回はDefaultのみ中身を設定。
保存場所は上に書いてある通りPackages直下にAndroidというフォルダを作ってその中へ。
ここで最初にコピーしておいたファイルを使用する。
ファイルをテキストエディタで開くと設定の基本が記述されている。
jdk_binにはJDKのインストールディレクトリ(〜/Java/jdk1.xx_xx)を指定。
次はant_binだけど、なぜかこちらはbinフォルダまで含まないとプロジェクト作成時にパスが違うって怒られる…
なので、〜/apache-ant-xx/binを指定する。
android_sdkはインストールフォルダでOKなので、〜/android-sdksで指定。
default_android_project_dirは作業ディレクトリを指定。
これで、パスは通るので他の項目は今回弄らず。

設定はとりあえずできた…が……

設定が終わったら再起動。
ここまでで、ファイルメニューに追加され、その項目たちも選択できるようになり、新規でプロジェクト作成もできるようになる。


だが、ビルドができてくれずに結局詰まっている…さてどうしたものか……