codex

2011年11月28日月曜日

雑記 - HDDが壊れた・・・

土曜の時点でメインマシンの立ち上がりが遅くなり
「なんかおかしいなぁ」と思っていたら・・・昨日にはめちゃくちゃ立ち上がりが遅くなって
まともに動かなくなった。
とりあえず、システムは動作しているようなのだが特定のアイコンが表示されていなかった。
まさか・・・とは思ったがデータ用にゲームとかプログラムの大半を入れていたドライブが
認識されていないようだった。
まだ、一年も経ってないのに・・・しかも2TBの4分の1も使ってないのに・・・
しかも、マイドキュメントのドライブだったのに・・・
「WD20EARS」を価格comのレビューで見ると確かに壊れやすいようで・・・
でも買った当初(去年末かな)はいいレビューしかなかった気がするなぁ。
まぁ、時限爆弾のように時間が経ってから壊れてるんだろうなぁ。

とりあえず、今はHDDが高いから買いたくないし・・・
システムをSSDにして、いま使ってるシステムドライブのHDDをデータに転用するか・・・
でも、OSの再インストールをするならばWindowsXPからWindows7に変えたいし。
いや、ならばCPUも・・・と、なるとマザーボードも変えないといけないし。
CPU、マザーボード、SSD、ビデオカード、Windows7・・・全部変えると7万はいくのかぁぁぁ
まぁ非現実的な妄想はやめてとりあえずSSDだけ変えようかな。

2011年11月24日木曜日

Android環境 - エミュレータ構築

まぁ、以前からandroidのエミュレータは使っていたんだけど・・・
実機とあまりにも入っているアプリが違うので、マーケットとかからインストールできたら
いいかな・・・と軽い気持ちでやってみました。

とりあえず、ぐぐると
Android SDKを使おう・アンドロイドのエミュレータでマーケットなどのアプリを利用するには
ここが、参考になりそうです。

dos窓1でandroidツール起動
android

環境としてはandroid 2.3.3がいいのでAPI Levelは10ですね。
エミュレータは一つだけ起動させます。

dos窓2でshell起動
adb shell

dos窓2でshellコマンド実行
chmod 777 /system/app

exit

dos窓2でマーケットアプリ等を転送と不要ファイル削除
adb push Vending.apk /system/app/

adb push GoogleServicesFramework.apk /system/app/

adb push MarketUpdater.apk /system/app/

adb push Development.apk /system/app/

adb shell rm /system/app/SdkSetup.apk

まぁ・・・一応、systemにはマーケットが入ったが・・・エミュレータを落とすと
systemが最初の状態に戻ってしまいますねぇ・・・毎回やるのメンドクサイよ・・
system.imgには反映されないんですなぁ・・・なんでだよぅ。

まぁまたぐぐると
Android エミュレータの system.img を書き換える。 - kikumotoのメモ帳
ここがそのような感じですな。

ちょっと更新日付が古かったのでツール先のリンクが切れてました・・・
http://jiggawatt.org/badc0de/android/mkfs.yaffs2.arm.tar.gz
これでいいのかな。


mkfs.yaffs2を/system/binにコピー
adb push mkfs.yaffs2.arm /system/bin/mkfs.yaffs2

パーミッション変更
adb shell
chmod 777 /system/bin/mkfs.yaffs2
exit

/systemをsdcardへコピー
adb shell mkfs.yaffs2 /system /sdcard/system.img

sdcardからパソコンへコピー
adb pull /sdcard/system.img system.img

※これすごく時間がかかる・・・90MB程度なのに25分はかかった・・・

C:\Documents and Settings\(ユーザー名)\.android\avd\(エミュレータ名).avd
ここへsystem.imgをコピー。

とりあえずはマーケットは消えずに使えるようになったが・・・
マーケットの検索がおかしいのか、エミュレータだからかわからないけど
全てのアプリが出てこないw
こりゃ・・・apkをどーにかして調達して、インストールした方がいいんじゃないか?w
すごくまた無駄な時間をすごした気もするが・・・

2011年11月22日火曜日

Chromeアプリ - Chrome Remote Desktop BETA

昨日、初めて使ってみたんだけどお手軽でいいね~
Chrome ウェブストア - Chrome Remote Desktop BETA

使い方は操作する側、される側ともにChrome Remote Desktop BETAをインストール。
操作される側からアクセスコードを教えてもらってから
操作する側にアクセスコードを入れるだけ。非常に簡単。

ちょっと相手方の方の回線が遅かった(下り2M、上り256k)ので、
Windowを動かしたりすると引っかかる、ちゃんと意図した場所にいかないってのもあったけど。
それとセッションが10分くらいでたまに切れるのもあったかな・・・
まぁ再度アクセスコードを送ってもらえばまたすぐ使えるのでいいけどね。

前まではskypeだけで説明してもらってたから、相手の説明だけだとサッパリなときがあったけど
プログラムの挙動だとかがこっちにもすぐにわかるのですごく便利だった。
本来ならばWindowsのリモートディスクトップの方がいいんだろうけど、
設定とか面倒そうだしな~
まぁ相手方がパソコンに不慣れな場合はこっちでやったほうが楽だしねぇ。

2011年11月19日土曜日

アプリ - オンラインストレージ(続き)

Sugarsync楽だわ~・・・と、思って他のことをいろいろしていたら
フォルダの同期が勝手に解除されてた・・・。
まぁ、SDカードが認識できない状態になったりしたことも原因なのかもしれないが
そもそもSDカードの不具合なんてSugarsyncの同期をやる前には起きなかったしなぁ
復旧はできたけど”My SugarSync Folders"ってところをいじったりすると
すぐに同期の設定が解除されてしまう・・・メンドクサイw

もう、また別の方法かアプリを探すかな・・・

2011年11月18日金曜日

アプリ - オンラインストレージ

今までDropboxをメインに使ってたけど、あまり使わなかったSugarsyncの方が
テキストベースのソースファイルなどの同期を取るのには便利。
なにより、SDカード内の任意のフォルダへ同期ができるのがいい。
メモアプリはsimplenotepadを使ってるんだけど、自動でauto_exportedフォルダを
Sugarsyncで同期させておけばPCとスマホのメモが同期できる・・・楽だわ~
Dropboxだとわざわざファイラーで手動でコピーしてた・・・

まぁ使い分けるのが一番賢いのかなぁ

2011年11月16日水曜日

Blogger - コード部分の表示を変更

うーん、ブログは今までやったこと無かったからhtmlとかcssとかは厳しい・・・
とりあえず、Bloggerカスタマイズで検索していたらいいところを発見!
Blogger カスタマイズ Tipsまとめ | Will feel Tips

その中にコードを表示するスクリプトが載っていたので、そのまま使わせていただきました。
SyntaxHighlighter

なかなか、簡単だし便利だなぁ

2011年11月12日土曜日

Python - メールの日本語対応化・・・(嬉)

先ほど失敗してエポケーしたはずだったが、しつこくpythonのメール関連のページを
見ていたら参考していたサイトに答えは載っていた・・・w
ウノウラボ by Zynga Japan: Pythonでメールを送信したい人のためのサンプル集

一番下のコメントにある、

msg = MIMEText(body, 'plain', encoding)

msg = MIMEText(body.encode(encoding), 'plain', encoding)
これで文字化けせずにメールが受信できた~(嬉)

とかいいながらウキウキと「馬鹿野郎~」とかつけて送信したらまたエラーw
なんだよ・・・と思って成功した時は「あいうえお、かきくけこ」だったので
「あいうえお、かきくけこ~」でテストしたら再現できた。「~」が犯人か。
いろいろ、調べると・・・むむ・・・エンコードの'ISO-2022-JP'ってシビアなのね。
PythonJISX0213 – アクセンスのおまけ

もう!・・・別に読めればいいんだから'ISO-2022-JP'の必要ないんじゃ・・・?
こりゃ、エンコードは'utf-8'でいいよね?

テストしたら「㌧㌦㍑~」も含めてエラーもなし。
#コードはuploadとかできないのか・・・

DOWNLOAD

sendmailAjp.py

# -*- coding: utf-8 -*-
import os
import glob
import codecs
import unicodedata
import mimetypes
from email import encoders
from email.mime.audio import MIMEAudio
from email.mime.base import MIMEBase
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.Header import Header

def attach_files(msg, attachements):
  for attachment in attachments:
    attachment = attachment.strip()
    for path in glob.glob(attachment):
      filename = os.path.basename(path)
      if not os.path.isfile(path):
        continue
      # Guess the content type based on the file's extension.  Encoding
      # will be ignored, although we should check for simple things like
      # gzip'd or compressed files.
      ctype, encoding = mimetypes.guess_type(path)
      if ctype is None or encoding is not None:
        # No guess could be made, or the file is encoded (compressed), so
        # use a generic bag-of-bits type.
        ctype = 'application/octet-stream'
      maintype, subtype = ctype.split('/', 1)
      if maintype == 'text':
        fp = open(path)
        # Note: we should handle calculating the charset
        part = MIMEText(fp.read(), _subtype=subtype)
        fp.close()
      elif maintype == 'image':
        fp = open(path, 'rb')
        part = MIMEImage(fp.read(), _subtype=subtype)
        fp.close()
      elif maintype == 'audio':
        fp = open(path, 'rb')
        part = MIMEAudio(fp.read(), _subtype=subtype)
        fp.close()
      else:
        fp = open(path, 'rb')
        part = MIMEBase(maintype, subtype)
        part.set_payload(fp.read())
        fp.close()
        # Encode the payload using Base64
        encoders.encode_base64(part)
      # Set the filename parameter
      part.add_header('Content-Disposition', 'attachment', filename=filename)
      msg.attach(part)

def sendemail(email_name, email_user, email_pswd, mailto, subject, body, attachments, encoding):
  import smtplib

  # DON'T CHANGE THIS!
  # ...unless you're rewriting this script for your own SMTP server!
  smtp_server = 'smtp.gmail.com'
  smtp_port = 587

  # Build an SMTP compatible message
  msg = MIMEMultipart()
  msg['Subject'] = Header(subject, encoding)
  msg['To'] = mailto
  msg['From'] = email_name + " <" + email_user + ">"
  msg.attach(MIMEText(body.encode(encoding), 'plain', encoding))

  attach_files(msg, attachments)

  # Attempt to connect and send the email
  try:
    smtpObj = '' # Declare within this block.
    # Check for SMTP over SSL by port number and connect accordingly
    if( smtp_port == 465):
      smtpObj = smtplib.SMTP_SSL(smtp_server,smtp_port)
    else:
      smtpObj = smtplib.SMTP(smtp_server,smtp_port)
    smtpObj.ehlo()
    # StartTLS if using the default TLS port number
    if(smtp_port == 587):
      smtpObj.starttls()
      smtpObj.ehlo
    # Login, send and close the connection.
    smtpObj.login(email_user, email_pswd)
    smtpObj.sendmail(email_user, mailto, msg.as_string())
    smtpObj.close()
    return 1  # Return 1 to denote success!
  except Exception, err:
    # Print error and return 0 on failure.
    print err
    return 0

import sys
import android

if 'ascii'==sys.getdefaultencoding():
  stdin = sys.stdin
  stdout = sys.stdout
  reload(sys)
  sys.setdefaultencoding('utf-8')
  sys.stdin = stdin
  sys.stdout = stdout

droid = android.Android()

try:
  email_name = droid.getIntent().result[u'extras'][u'%EMAIL_NAME']
except:
  email_name = ''

try:
  email_user = droid.getIntent().result[u'extras'][u'%EMAIL_USER']
except:
  droid.makeToast('EMAIL_USER missing')
  sys.exit(1)

try:
  email_pswd = droid.getIntent().result[u'extras'][u'%EMAIL_PSWD']
except:
  droid.makeToast('EMAIL_PSWD missing')
  sys.exit(1)

try:
  mailto = droid.getIntent().result[u'extras'][u'%EMAIL_TO']
except:
  droid.makeToast('EMAIL_TO missing')
  sys.exit(1)

try:
  subject = droid.getIntent().result[u'extras'][u'%EMAIL_SUBJECT']
except:
  subject = ''

try:
  body = droid.getIntent().result[u'extras'][u'%EMAIL_BODY']
except:
  body = ''

try:
  attachments = droid.getIntent().result[u'extras'][u'%EMAIL_ATTACH']
  attachments = attachments.split(',')
except:
  attachments = ''

try:
  body = droid.getIntent().result[u'extras'][u'%EMAIL_ENCODING']
except:
  encoding = 'utf-8'

# Send email
if (sendemail(email_name, email_user, email_pswd, mailto, subject, body, attachments, encoding)):
  sys.exit(0)
else:
  # Exit with error if email is not sent successfully
  droid.makeToast('email failed')
  sys.exit(1)


Python - メールの日本語対応化・・・(悲)

前回のPythonスクリプトを少し修正すれば日本語対応化ができるかと思っていたら・・・
甘かった。

ここを参考にencodingに'ISO-2022-JP'をつければいけるのかな・・と思ってたが、
SyntaxError: Non-ASCII character ・・・
http://www.python.org/dev/peps/pep-0263/ここを参照しろと出た。

これは単純に一行目に
# -*- coding: utf-8 -*-
をつければいいらしい。

再実行後、
UnicodeEncodeError: 'ascii' codec can't encode characters.. なんたら・・・かんたら
エラーらしい。

» UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 2-8: ordinal not in range(128) | Google App Engine Blog BBTUNE

ここを参考に、
スクリプトでsys.setdefaultencoding('utf-8') をやってみた。
とりあえずはSL4A上ではエラーはでなくてメールも送信されたが、
おもいっきり本文が化けている・・・。

それと同時にddmsでcatlogを見ていたが、SL4Aもエラーを吐いてる・・・。

python恐るべし・・・。
とりあえずsetdefaultencodingを根本的にやるにはroot権限が必要みたいだし
その辺で引っかかってるならどうしようもないなぁ・・・。

pythonでの日本語メール送信はエポケー。
どうしても日本語メールを送信するならばperlを入れた方が良いような気がする・・・

Tasker - 端末紛失時の位置確認

あまり紛失などしないとは思うけど転ばぬ先の杖ってやつですかね。
紛失した時に対処するアプリはいろいろあるけど、せっかくTaskerがあるのでそれで済ませようというのが狙い。それにあまりアプリを常駐とかさせたくないしね。

まずは基本的な仕様としては、
1.特定の電話から不在通知が3回きたら機能を実行する。
2.Gmailで位置情報を送信する。

まぁ、簡単な仕様ですね。
とりあえず2.の機能を行うために、SL4Aを使用します。
下記のリンク先のSL4Aのインストールとpythonのインストールを参考にインストールしてください。
SL4A による Android プログラミング - インストール
SL4A による Android プログラミング - インタプリタの追加

あとはメールを送信するpythonのスクリプトが必要になります。
下記を参考にしました。
Automatically Take and Email Your Photo - Tasker Wiki
pythonスクリプト:sendemailA.py

さて、環境は整ったのであとはTaskerの設定です。
新たなprofileを任意の名前で作成してください。
First ContextはEventを選択、Phoneを選択、Missed Callを選択。
Callerは虫眼鏡みたいなボタンを選択。
A Single Contactで機能を実行させる電話番号を選択してください。

次はTaskの入力です。
New Taskを選択。名前はなくてもOKですね。
左下の「+」を選択。
Variableを選択。Variable Addを選択。
変数名をつけます。規則としては%のあとの文字が大文字だとグローバル変数になります。
小文字だとローカル変数になります。文字数は3文字以上必要になります。
今回の場合はグローバル変数じゃなきゃいけないので1文字目は大文字にしてください。
Wrap Aroundは4にします。ここの数値に到達した場合、変数がClearされますので
4以上ならいくつでもOKでしょう(最後に機能実行後にこの変数をClearするので)。
ここでは便宜上%TelCntとします。

次のTaskは先ほどの変数の判定を行うIF文です。
Taskを選択。Ifを選択。右上の黄色いマークを選択して先ほどの変数を選択してください。
真ん中のグレーのボタンを選択してMaths: Greater Thanを選択。
右の四角欄に2を入力。

次からはpythonスクリプトへ受け渡すパラメータを入力します。
パラメータ名は間違えると受け渡せませんので注意が必要です。
Variableを選択。Variable Setを選択。
Name欄に%EMAIL_USERを入力。To欄にGmailアドレスを入力。


Variableを選択。Variable Setを選択。
Name欄に%EMAIL_PSWDを入力。To欄にGmailアドレスパスワードを入力。




Variableを選択。Variable Setを選択。
Name欄に%EMAIL_TOを入力。To欄に送信先メールアドレスを入力。

Variableを選択。Variable Setを選択。
Name欄に%EMAIL_SUBJECTを入力。To欄に任意のメールタイトルを入力。
(メールが着てわかりやすいものがいいでしょう)


Variableを選択。Variable Setを選択。
Name欄に%EMAIL_BODYを入力。
To欄に本文を入力しますが、私は以下のようにしました。
Battery Level: %BATT
http://maps.google.co.jp/maps?f=d&source=s_d&saddr=%LOCN

1行目のはバッテリーの残量です。
2行目は単純に%LOCNだとNETWORKから算出した座標だけしか出ないので
それだといちいちGoogle Mapに行って座標コピペで表示するのが面倒なので
アドレスに入れてみました。まぁ見れればいいかなぁ・・・と。
ちなみに本文に日本語は使用できません。

次のTaskはpythonスクリプトの実行になります。
Miscを選択。Run Scriptを選択。
Nameの横の虫眼鏡を選択。sendmailA.pyを選択。
Pass Variableの横の黄色マークを選択。
順次、先ほど値を設定した変数を入力していくのですが、
変数毎にカンマ(,)で区切らなければいけません。
%EMAIL_USER,%EMAIL_PSWD,%EMAIL_TO,%EMAIL_SUBJECT,%EMAIL_BODY

次のTaskからはスクリプト実行後の後処理になります。
特にパスワードはClearしておかないとTaskerのVariable Edit画面で見えてしまうので
Clearは必要になります。
また、一番最初に使用した%TelCntも次は4になってからWrap Aroundで
Clearされるので実質4回不在通知を送らなくてはならなくなるので、
これもClearが必要になります。

Variableを選択。Variable Clearを選択。
Nameの横の黄色マークを選択し、%EMAIL_PSWDを選択。

Variableを選択。Variable Clearを選択。
Nameの横の黄色マークを選択し、%EMAIL_BODYを選択。

Variableを選択。Variable Clearを選択。
Nameの横の黄色マークを選択し、%EMAIL_SUBJECTを選択。

Variableを選択。Variable Clearを選択。
Nameの横の黄色マークを選択し、%EMAIL_TOを選択。

Variableを選択。Variable Clearを選択。
Nameの横の黄色マークを選択し、%EMAIL_USERを選択。

Variableを選択。Variable Clearを選択。
Nameの横の黄色マークを選択し、一番最初に書いた%TelCntを選択。

最後に別になくても動きそうですがIfの終わりのTaskを追加します。
Taskを選択。End Ifを選択。

以上で処理の記述は終わりですが、動作チェックは必要ですね。
とりあえず、Task側だけの動作チェックを行いましょう。
右下にある三角のマークを押します。実行されると左に赤いマークがしばらく出ます。
一回目は当然なにも起こりません。
二回目も何も起こらないのを確認。
三回目でSL4Aが立ち上がって(ステータスバーに表示されて2,3秒後には消えます)
メールが送信されていれば成功です。
メールが送信されていなければ
pythonへの受け渡しパラメータ名が間違っていないかどうか、
また、メールアドレスやパスワードが間違っていないか確認してください。
成功していたら最後にパラメータがClearされているかも確認してください。

Taskerの最初の画面まで戻って、右下にある黄色マークを押します。
Global Variable Editorというのが起ち上がって、
ずらずらと先ほど定義した変数名が出ていると思います。
右側になにも表示されていなければClearは成功しています。

一応、電話から3回不在通知をしてメールがくるのを確認してください。

これで終了としてもいいのですが、TaskにGmailアドレスのパスワードを
入力しているのですぐに誰にでも見れてしまいます。
それはちょっとなぁ・・・と思うので、Taskにパスワードをかけます。
Tasker最初の画面からMenuボタンを押して、Preferencesを選択。
UIタブを選択。Lock Codeに任意の数字を入力。

Profileを選択してスパナとドライバーの絵のアイコンを選択。
Propertiesを選択。一番上のLock In UIをチェック。
鍵マークが出たらOKです。
一旦、Taskerを終了させて再度、鍵マーク付のProfileを選択する際に
Enter Lock Codeの入力画面が出てLock解除も確認できればOKです。

お疲れ様でした。

#今度からは簡略化して書こう・・・

2011年11月11日金曜日

Androidアプリ - tasker(雑記)

買ってからようやく一週間。
自宅wi-fiの自動接続・切断を目的にスマホにしてからはAutomateIt、Llama - Location Profilesを使用していたが、もっといろいろできるという話だったので購入。
最初は確かに「なんだコレ?」な部分があったが、ようやく慣れてきた。
とりあえず、wi-fiの自動接続・切断の設定はうまくいっているようだし(昨日、ちょっと挙動がおかしかったが修正して直ったと思う)、まだいろいろ実験したいこともあるし500円出す価値はあるね。
今のところSL4Aでpythonスクリプトとの実験をしているが、スクリプトからtaskerにパラメータが引き継げないということなのでちょっと残念。でも、手軽にいろいろできるようなので試してみるつもり。
まぁ・・・androidもpythonもjavaも今までやったこと無いから勉強しながらやらないとなぁ。

テスト投稿

とりあえず、投稿してみる。