New Relicをつかってみる(1)

New Relicという監視サービスがすごいということを教えてもらったので、使ってみようと思います。
http://newrelic.com/

まずは、概要から。

New Relicはバックエンドもフロントエンドも監視できるというのがいいところのようです。

特に、フロントエンドだと、
・アプリ、ネットワーク、DOM処理、ページレンダリング別のページ読み込み時間のリアルタイムモニタリング
・ブラウザや地域ごとのページ読み込み
・ページごとのスループット、パフォーマンス測定
などの監視ができるようです。


プランによる値段の違いはここ。
http://newrelic.com/pricing/details

基本的に、個人や小規模で使う分には、Freeプランで十分だと思います。

FreeとStandardの主な違いは、以下のモニタリングができるかどうか。
・測定値の保持期間が1週間
JVMパフォーマンス分析
・アプリケーションマップ
・時間比較
・パフォーマンスデータAPI
・DBレスポンスタイムとスループット
・DB操作ランキング
・バックグラウンド処理
・インシデント発見とアラート
・エラー発見とアラート


自作のDjangoアプリへ導入してみたら、続きを書こうと思います。


その他、こちらの記事もご参考に。
http://qiita.com/items/dd4fce78b1bc32b64600

Heroku + Flask(Python)な環境での使い方も簡単に紹介されてます。
http://fusigi-movement.blogspot.jp/2012/05/herokupython-flasknew-relic.html

TitaniumMobileでIPhoneアプリを開発しようとしたメモ

GWにTitaniumMobileでiPhoneアプリの開発に入門したので、断片的にメモ。

手っ取り早く、まとまった情報が欲しかったので、書籍を購入

TitaniumMobile iPhone/Androidアプリ開発入門

TitaniumMobile iPhone/Androidアプリ開発入門


Titanium Studio 2.0.1をインストール
http://www.appcelerator.com/


Mac OSなので、Titanium_Studio.dmg


インストールは、友人のブログにも載っているのでどうぞ。
http://devugger.com/2012/04/update-titanium-mobile-ade-to-2-0-1/


ちなみに、Android開発したい場合は、これ。

[Android SDK r18]
android-sdk_r18-macosx.zipをDL。
Android SDK
  Preferences > Aptana Studio > Titanium
  Android欄
      /Volumes/HDD/DeveloperHDD/android-sdk-macosx

事前に、android-sdk-macosx/tools/android
で、Androidマネージャーで必要なものを入れる。
Android 2.2が最低限必要。


[Xcode 4.3.2]
Xcodeも環境設定 > DownloadsでiOS5 Simulatorをインストールしておく。


お決まりのサンプル、Kichen Sinkをインポート。


左下のSampleタブ > Kichen Sink > Import sample as project…

動かしてみる
Run As > iPhone Simulator

エラーなる。
回避策
http://d.hatena.ne.jp/toshiyuki83/20120423


Titanium Studio Workspace/KitchenSink/build/iphone/Classes/ASI/ASIHTTPRequest.h
の下記IPHONE_5_0部分を追記

#ifndef __IPHONE_4_0
#define __IPHONE_4_0 40000
#endif
#ifndef __IPHONE_5_0
#define __IPHONE_5_0 50000
#endif

はい、これでTitaniumでiPhone開発環境整いました。


新規プロジェクト作成は、
File > New > Titanium Mobile Project
Project Name: MyProject
Location : Use default location
App Id: com.upsetter.myproject
URL: http://www.upsetter.com
Titanium SDK :2.0.1.GA2
Deployment Targets: iPhone
Cloud Setting: チェックはオフにしておく
Finish


プロジェクトフォルダ内の「.xcodeproj」ファイルをXcodeで開けば、
XCodeでビルド、シミュレーションできます。


以下、参考情報とTipsなど。


Titanium本家情報
http://docs.appcelerator.com/titanium/2.0/index.html

UI作る時はKichenSinkの他にこれも参照。
http://code.google.com/p/titanium-mobile-doc-ja/wiki/

================================
※戻るボタンがつくのは、currentTab.open()
================================

//※これだと戻るボタンが付かない
//var tabGroup = myapp.ui.createApplicationTabGroupChild();
//tabGroup.open();
//※戻るボタンがつくのは、currentTab.open()
var dir_path = "test";
var win = myapp.ui.listtable.createDirWindow(dir_path);
tab.open(win);

================================
UIの概念
================================

TagGroup -> open
↑(addTab)
Tab
↓
Window
↑
View(TableView,WebView), Controller(Labe,Button)
↑
View(TableView,WebView), Controller(Labe,Button)

================================
OAuth Library

1.oauth-adapter
http://code.google.com/p/oauth-adapter

2.titanium-mobileoauth
http://www.slideshare.net/k0sukey_/titanium-mobileoauth
https://github.com/k0sukey/TiPlatformConnect
Workspace/k0sukey-TiPlatformConnect-7ae4d43

================================
Titanium Mobileで作る!iPhone/Androidアプリ

技評連載
http://gihyo.jp/dev/serial/01/titanium

https://github.com/kurain/TitaniumTestApp
Workspace/kurain-TitaniumTestApp-3f154e7


================================
ソースが公開されているアプリ
http://ti.masuidrive.jp/topic.php?id=4

================================
できること
 Objective-CでPluginを書ける

できないこと
 OpenGLの直接利用
 細かなメモリ管理
 細かなチューニング

勝手にPythonプロフェッショナルプログラミングのタイポメモ

みんなで正誤表はこちら
http://public-errata.appspot.com/errata/book/show/978-4-7980-3294-8/

P212の$ hg は $ hg branch t5

P133のelif method = "POST:はelif method = "POST":

P132のdef _makeOneは def _mekeOne():

P120のm.somthing.call_argsはm.something.call_args

P84 os.path.insertではなく多分sys.path.insert

Pythonプロフェッショナルプログラミング
http://www.shuwasystem.co.jp/products/7980html/3294.html

WordPressで画像アップロード付き投稿フォームをつくるメモ

協業してるWEBデザイナーWordPress(以下WP)と格闘していたので、
応援しようと、とりあえず画像投稿ができるサンプルをつくりました。

コードがぐちゃぐちゃの状態なので、これに加えて、
エラーの補足や投稿オプションなども追加しないとまともなものになりません。
ご注意を。

さて、投稿フォームは、
[1]form.php
[2]form_next.php
の2つからなるのですが、
これらのファイルをWPをアップロードしたディレクトリのテーマにテンプレートとして保存します。
今回は、/wp-content/themes/original 直下に配置します。
(テーマテンプレート名がoriginalです)

WPの管理画面で固定ページをつくります。
今回は、
「投稿フォーム用ページ」

「投稿結果ページ」
をつくります。

「投稿フォーム用ページ」にform.phpのテンプレートを適用します。
「投稿結果ページ」にform_next.phpのテンプレートを適用します。

form.phpのactionの値には投稿結果ページのパーマリンクURLを指定します。

<form action="<以下のform_next.phpテンプレートを適用した固定ページのURL>" method="post" name="form" enctype="multipart/form-data">

これで、投稿フォーム用ページから画像ファイルと一緒に投稿できるはずです。
(ただし、サーバー側のPHPでmove_uploaded_fileなどの関数が正常動作することが前提です。)


[1]form.php

<?php
/*
Template Name: お問い合わせ1
*/
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>投稿フォーム</title>
</head>
<body>
<form action="<以下のform_next.phpテンプレートを適用した固定ページのURL>" method="post" name="form" enctype="multipart/form-data">
 <table cellpadding="5" cellspacing="0" id="contact">
  <tr>
   <td>タイトル</td>
   <td>
    <input name="title" type="text" size="50">
   </td>
  </tr>
  <tr>
   <td>カテゴリー</td>
   <td>
    <input type="radio" name="category" id="cat1" value="1" /><label for="1">カテゴリー1</label>
    <input type="radio" name="category" id="cat2" value="2" /><label for="2">カテゴリー2</label>
   </td>
     </tr>
   <td>投稿内容</td>
   <td>
    <textarea name="contents" cols="50" rows="10"></textarea>
   </td>
  </tr>
<tr>
<td>アップロード</td>
<td><input type="file" name="pict01" size="30" /></td>
</tr>
  <tr>
   <td colspan="2">
    <input type="submit" name="submit" value="投稿する">
   </td>
  </tr>
 </table>
</form>


</body>
</html>


[2]form_next.php

<?php
/*
Template Name: お問い合わせ2
*/
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
投稿が完了しました。<br>
承認されるまで、しばらくお待ちください。

<?

//フォームの内容を変数に格納
$post_category = $_POST["category"];
$post_title = $_POST["title"];
$post_contents = $_POST["contents"];
//投稿
$postarr = array();
$postarr['post_status'] = 'draft';
$postarr['post_type']='post';
$postarr['post_author']=$user_ID;
$postarr['post_category'] = array($post_category,);
$postarr['post_title'] = $post_title;
$postarr['post_content'] = $post_contents;
//投稿ID
$post_id=wp_insert_post($postarr);

//アップロードするディレクトリとファイルを設定
$filename=basename($_FILES['pict01']['name']);
$filename=trim($filename);
$filename=ereg_replace(" ", "-", $filename);
$upload_dir_var=wp_upload_dir();
$upload_dir=$upload_dir_var['path'];
$uploaddir=realpath($upload_dir);
$uploadfile=$uploaddir.'/'.$filename;

//ファイルを uploadfileにfilenameでアップロードする
if ($_FILES["pict01"]["size"] === 0){
	//echo "ファイルはアップロードされてません!! アップロードファイルを指定してください。";
}else {
	$result = @move_uploaded_file( $_FILES["pict01"]["tmp_name"], $uploadfile);
	if ($result === TRUE ){
		//echo "アップロード成功!!";
	}else{
		//echo "アップロード失敗!!";
	}
}

//ファイルタイプ
$typefile=$_FILES['pict01']['type'];
//ファイル名の拡張子なし
$slugname=preg_replace('/\.[^.]+$/', '', basename($uploadfile));

//アップロードファイルがある場合、以下実行
if ( file_exists($uploadfile) ) { 
		//拡張子をチェックする
          $exten = '';
          if ( $typefile == 'image/jpeg' ) { $exten = 'jpg'; }
	        elseif ( $typefile == 'image/png' ) { $exten = 'png'; }
       		elseif ( $typefile == 'image/gif' ) { $exten = 'gif'; }
	  if($exten == ''){
		//echo " file type error. You can upload jpg, png, gif ";
	 }	

	//アップロードファイルを添付する
          $attachment = array(
	          'post_mime_type' => $typefile, 
	          'post_title' => $slugname, 
	          'post_content' => '', 
	          'post_status' => 'inherit'
          );
         $attach_id = wp_insert_attachment( $attachment, $uploadfile, $post_id );
 
         require_once(ABSPATH . "wp-admin" . '/includes/image.php');
         $attach_data = wp_generate_attachment_metadata( $attach_id, $uploadfile );
         wp_update_attachment_metadata( $attach_id,  $attach_data );

	//ファイル添付が完了したら
	if($attach_id != 0){
		//post_idの投稿に画像を反映させる処理
		$img_src = wp_get_attachment_url($attach_id);
		wp_update_post( array(
				'ID' => $post_id, 
				'post_content' => $postarr['post_content']. '<img src="'.$img_src. '" >'
		  ) );
		//投稿の更新が成功した場合は投稿 ID。失敗した場合は 0。
	}else{
		//echo "error attach <br>";
	}

  } // fin if file_exists
 
?>

</body>
</html>

30秒でPHP開発環境ができるというphpcloudのメモ

phpcloud使うためのメモを残しておきます。

https://my.phpcloud.com/user/login

にアクセスして、アカウント取得。

アカウント取得後ログインして、Container作ります。

https://my.phpcloud.com/welcome
にアクセスすると、
Get a free PHP environment in 30 seconds
って、30秒でPHP環境が手に入るんですね!
Start Now
をクリックしてやってみます。

ContainerNameなど必要事項に入力して、Create containerボタンをクリック。

例えばtestcontという名前のContainerを作ったら、
左メニューにtestcontができます。

phpcloudは、
Container => Application
という構造になってます。
既に、Default Applicationというのがあるので、多分30秒でPHP環境できてますね。


ここで、Applicationを作りたいので、
testcontをクリックして、New Applicationボタンをクリック。
すると、DeployするApplicationの種類を選べとあるので、
今回はEmpty PHP ApplicationのDeploy Applicationをクリック。
Application Nameにtestと入力して、Deploy Applicationをクリック。


これで、testというアプリケーションができるので、
http://testcont.my.phpcloud.com/test/
にアクセスして、表示を確認。

phpcloudの管理画面に戻って、Applicationのtest行の git をクリック。
git repository URLがこんな感じになっているので、コピー。
https://testcont@testcont.my.phpcloud.com/git/test.git


さて、macの場合、例えば、

$ ls
phpcloud

$cd phpcloud

$ git clone
https://testcont@testcont.my.phpcloud.com/git/test.git

$ vi test/public/index.php

<?php
$disp_message = 'Hello phpcloud!';
?>
<!DOCTYPE HTML>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>Hello phpcloud</title>
</head>
<body>

<?php echo $disp_message ?>

</body>
</html>


$ git add public/index.php
$ git commit -a -m "add public/index.php"
$ git push origin master

ブラウザで、作成したアプリを開く。
http://testcont.my.phpcloud.com/test/index.php


ほんとに、30秒でPHP環境はできるし、
ささっと何かつくるには早いですね。


上記、はしょっているかもしれないので、
いきづまったら、ここ参照のこと。
https://my.phpcloud.com/help

最小二乗法

Pythonの勉強がてら、「はじめての機械学習」のcで書かれたコードをPythonに力技で翻訳していく学習記録。

まずは最小2乗法。

式の解説はここがわかりやすい:http://szksrv.isc.chubu.ac.jp/lms/lms1.html

プログラムは標準入力の2値のセットから係数a0, a1を求めるもの。

#!/usr/bin/python
import sys

__TEXTLENGTH__ = 4096
#print __TEXTLENGTH__

text = []
xi = 0
yi = 0
sxi = 0
syi = 0
sxiyi = 0
sxi2 = 0
a0 = 0
a1 = 0
n = 0

line = sys.stdin.readline()
while line:
	#print line.split()
	nums = line.split()
	if len(nums) == 2:
		#print nums[0] + nums[1]
		xi = float(nums[0])
		yi = float(nums[1])
		sxi+= xi
		syi+= yi
		sxiyi+= xi*yi
		sxi2+= xi*xi
		n+=1
		#print str(sxi) + ':' + str(syi) + ':' + str(n)
	else:
		print 'invalid data: ' + line
	line = sys.stdin.readline()
	if len(line.split()) < 1:
		break

print 'end loop'

if n > 1:
	#print n 
	a0 = (sxi2*syi-sxiyi*sxi) / (n*sxi2-sxi*sxi)
	a1 = (n*sxiyi-sxi*syi) / (n* sxi2-sxi*sxi)
	print 'y='+str(a0)+'+'+str(a1)+'x'
else:
	print 'data is not sufficient'