2011年12月30日金曜日

前回(サーバからcsvを複数取得する)の続きに、取得したcsvをDBにinsertする

app/libの下にprice_importer.rbを作成し、app/で実行する

$ ruby script/runner PriceImporter.execute

以下の内容
require 'csv'
class PriceImporter
  class << self
    def execute()
      begin
          result = system("/path/to/script/getfile.sh")  #←<a href="http://kagen88.blogspot.com/2011/12/shelllftp.html">前回作成したshellスクリプト</a>
          print result
          Dir::glob("/path/to/data/*.csv").each {|f|  #←取得したcsvファイルを保存する場所の(すべての?)csvをループ
            puts "#{f}: #{File::stat(f).size} bytes"  #←サイズを表示してみる
            cf=File.open(f,"r")  #←開く
            buf=cf.read()  #←読む
            @parsed_file = CSV::Reader.parse(convertSjis2UTF8(buf))  #←CSVハッシュに格納、その前にsjisをutf8に
            @parsed_file.shift  #←最初のタイトル行をスキップ
            @parsed_file.each  do |row|
              pd = Product.find_by_code(row[0])  #←既存のテーブルモデルを使って、コードの有無を確認
              if pd
                Price.delete_all "pd_id = " + pd.id.to_s + " AND base_date_on = '" + row[4] + "'"  #←上書きしたいので、一致したレコードを削除
                p = Price.new
                p.pd_id = pd.id
                p.base_date_on = row[4]
                p.price = row[5]
                p.save  #←インサート
              else
                RAILS_DEFAULT_LOGGER.debug("コード(" + row[0] + ")がproductsテーブルに存在しない。ご確認ください。")
                puts "コード(" + row[0] + ")がproductsテーブルに存在しない。ご確認ください。"
              end
            end
          }
      rescue => e
        RAILS_DEFAULT_LOGGER.debug(e)
        raise
      end
    end
    def convertSjis2UTF8(val)←utf8変換
      val.kconv(Kconv::UTF8, Kconv::SJIS) unless val.blank?
    end
  end
end
以上

パスワードを埋め込みのshellスクリプト。lftpで複数ファイルをダウンロード

パスワードを埋め込みのshellスクリプト。lftpで複数ファイルをダウンロード。
sftpは必要(通常ある)、lftpがなければyumでインストル

$ yum install lftp

ダウンロードするファイル名はyyyymmddのワイルドカードですが,日付の正確性はチェックしない。
以下スクリプトの内容:

#!/bin/bash
#ローカル保存フォルダー
SAVE_FILE_DIR="~/downloaded"

#今日の日付のyyyymmddファイル、不採用なのではコメントアウト
#TARGET_FILE="DATA_$(date "+%Y%m%d").csv"

#ファイル名がDATA_yyyymmdd.csvのファイルをすべて
TARGET_FILE="DATA_[1-2][0-9][0-9][0-9][0-1][0-9][0-3][0-9].csv"

HOST=myhost
ACCOUNT=user
PASSWORD=pass

#まず既に存在していたら削除する
rm -f ${SAVE_FILE_DIR}/${TARGET_FILE}

#sftからダンロード
lftp -u ${ACCOUNT},${PASSWORD} sftp://${HOST} <<__LUCEN
lcd ${SAVE_FILE_DIR}
mget ${TARGET_FILE}
quit
__LUCEN

fileの存在するかどうかを判断するshell script

fileの存在するかどうかを判断するshell script

#!/bin/bash
if [ -f filename ]
then
echo "filename exists"
fi

2011年12月28日水曜日

fund_indicesは銘柄の基準価額、純資産や分配金の履歴テーブル、巨大なテーブルです。
やりたいことは重複なしでランダムで3銘柄IDを抽出したい。fund_idじゃなくidはプライマリーキーです。
fund_idは重複している。データ全部で280万くらい。

id fund_id as_of_date value
1 529 20111130 5394
2 529 20111129 5384
3 529 20111128 5323
4 529 20111125 5312
5 529 20111124 5312
6 529 20111122 5366
7 529 20111121 5397
8 545 20111129 5374
9 545 20111128 5373
10 545 20111125 5372
11 545 20111124 5312
12 545 20111122 5376
13 545 20111121 5377
... ... ... ...

mysqlのorder by rand()を使ったが、凄く遅い!なんと1分もかかります。

sql> select distinct fund_id from fund_indices order by rand() limit 3;

fund_idを絞るサブクエリを入れると凄く早くなった

sql> select fund_id from (select distinct fund_id from fund_indices) order by rand() limit 3;
表示中の列 0 - 2 (~31 合計, クエリの実行時間 0.0495 秒)



Excel vba シート追加、名前変更のエラー防止、「暴力」チェッカー

excelのシートいろいろ禁止文字が有るみたい、暴力的に禁止字を排除する
If trim(shtName) <> "" Then
  If Len(shtName) > 30 Then shtName = Left(shtName, 30)
  shtName = Replace(shtName, "/", "")
  shtName = Replace(shtName, "/", "")
  shtName = Replace(shtName, "[", "")
  shtName = Replace(shtName, "]", "")
  shtName = Replace(shtName, "*", "")
  shtName = Replace(shtName, "*", "")
  shtName = Replace(shtName, "¥", "")
  shtName = Replace(shtName, "\", "")
  shtName = Replace(shtName, ":", "")
  shtName = Replace(shtName, ":", "")
  shtName = Replace(shtName, "?", "")
  shtName = Replace(shtName, "?", "")
  ActiveWorkbook.Worksheets.Add(after:=Worksheets(Worksheets.Count)).Name = shtName
End If

2011年12月26日月曜日

選択されているRangeの行だけを配列で返すメソッド

選択されているRangeの行だけを配列で返すメソッド、
単一の長方形の選択範囲なら、Selection.addressで処理しても十分だと思いますが、
このメッソドは複数バラバラの選択範囲に対応します。まぁ、使う場面ないかもしれない…
Function getRowsFromRanges(ByVal seletedRange As Range) As Variant
  Dim cl As Range
  Dim arrRows As New Scripting.Dictionary
  For Each cl In seletedRange
    If Not arrRows.Exists(cl.row) Then
        arrRows.Add cl.row, ""
    End If
  Next
  getRowsFromRanges = arrRows.Keys
End Function

2011年12月22日木曜日

princeの日本語文字化けについて

前回centosにprince用msttcorefontsをインストル手順を紹介しました。それで一応PDFは吐き出されたけど、よく見たら、日本語はすべて文字化けている(「?」になっている)
まずはシステム上「明朝」や「ゴシック」などturetype fontの有無を確認、centosだと普通はこの場所にあるか

$ cd /usr/share/fonts/
$ ll
合計 24
drwxr-xr-x. 2 root root 4096 11月 1 17:05 2011 ipa-gothic←ゴシック
drwxr-xr-x. 2 root root 4096 11月 1 17:05 2011 ipa-mincho←明朝
drwxr-xr-x. 2 root root 4096 11月 1 17:05 2011 ipa-pgothic←Pゴシック
drwxr-xr-x. 2 root root 4096 11月 1 17:05 2011 ipa-pmincho←P明朝
drwxr-xr-x. 2 root root 4096 12月 21 16:19 2011 msttcorefonts←前回インストルしたMSフォント
drwxr-xr-x. 2 root root 4096 11月 1 17:05 2011 vlgothic

そしてfonts.cssを開いて。

$ sudo vi /usr/local/lib/prince/style/fonts.css
まずはもともと「font-family: serif」と「font-family: sans-serif」の@font-faceブロッグをすべて削除(またはコメントアウト)
そして明朝とゴシックを追加

/* standard "IPAMincho" font family */

@font-face {
font-family: serif;
font-style: normal;
font-weight: bold;
src: url("/usr/share/fonts/ipa-mincho/ipam.ttf")
}

/* standard "IPAGothic" font family */

@font-face {
font-family: sans-serif;
font-style: normal;
font-weight: bold;
src: url("/usr/share/fonts/ipa-gothic/ipag.ttf")
}

fontの絶対パスを設定すること

2011年12月21日水曜日

CentOS6(64bit)にmsttcorefontsをインストール

ちなみに、前回はprinceのインストール方法を紹介しました。必要があれば参照してください。

htmlをPDFに変換してくれるlib princeを使おうと思ったけど、「fontがない」と怒れる

$ /usr/local/bin/prince --input=html --server -s /home/kagen/work/anyproj/public/stylesheets/application.css -s /home/kagen/work/anyproj/public/stylesheets/print.css -s /home/kagen/work/anyproj/public/stylesheets/prince.css ~/test.html -o test.pdf
...
Fontconfig error: Cannot load default config file
...
msg|wrn||no glyphs for character U+0074, fallback to '?'
msg|err||no available fonts

問題は2つ有るようだ
①Fontconfigがない
②linux上msのtruetype fontがインストールされてないのが原因らしい。
解決
①について、インストールすればいいとおもう。

$ sudo yum install fontconfig

②の解決策は2つ、/usr/local/lib/prince/style/fonts.cssを弄るか、msttcorefontsをインストールするか
私はmsttcorefontsをインストールすることにした。
まずはrepoを新規作成

$ sudo vi /etc/yum.repos.d/puias-unsupported.repo
[puias-unsupported]
name=PUIAS Unsupported
baseurl=http://elders.princeton.edu/data/puias/unsupported/5/i386/
enabled=1
gpgcheck=0

早速yumしてみると

$ sudo yum install msttcorefonts
...
Requires: /usr/sbin/chkfontpath
...

と怒れる。取り敢えずまたyumしてみると

$ sudo yum install chkfontpath
...
No package chkfontpath available.
...

またダメか!ググッてたら、chkfontpath Install Howto
ここが書いてありました!
まずatrpms-repoのrpmをダウンロード、ここ。64bitだからatrpms-repo-6-4.el6.x86_64.rpm←これ

$ wget http://dl.atrpms.net/el6-x86_64/atrpms/stable/atrpms-repo-6-4.el6.x86_64.rpm
$ sudo rpm -Uvh atrpms-repo*rpm
...

$ sudo yum install chkfontpath
...
Complete!

成功!最後はfontだ

$ sudo yum install msttcorefonts
...
Complete!

やったー!もう一回princeを実行してみる

$ /usr/local/bin/prince --input=html --server -s /home/kagen/work/anyproj/public/stylesheets/application.css -s /home/kagen/work/anyproj/public/stylesheets/print.css -s /home/kagen/work/anyproj/public/stylesheets/prince.css ~/test.html -o test.pdf
...
sta|Converting document...
prg|0
prg|100
fin|success

できた…
以上。

2011年12月20日火曜日

CentOS6(64bit)にHTML+CSSをPDFに変換するprince8

railsのプロジェクトでHTML+CSSをPDFに変換する必要がありました。
ApacheのFOPがありました。無料ですが、それはHTMLとCSSではなくXSL-FO(XML)からPDFに変更するというものでした。しかもいろいろできないことが有るみたい(文字を画像の回り込みなど)。
さらに調べたら、princeがあって、HTML+CSSをPDFに変換できる。特徴はいろいろ、かなりイケてる感じ
1.各プラットフォームに対応http://www.princexml.com/download/
2.PDFファイルの出力は当然ですが、標準出力も対応
3.テーブルの中でページが割れないように設定できる
4.ヘッダー、フッター、ページナーンバー
5.大きくしてもボヤけないSVGの読み込みが対応
6.いろんな言語のWrappersがある(Java/Python/Perl/PHP/VB....)⇒rubyがない…でも大丈夫みたい
取り敢えずインストールしてみる

$ cat /etc/redhat-release
CentOS Linux release 6.0 (Final)
$ uname -a
Linux localhost.localdomain 2.6.32-71.el6.x86_64 #1 SMP Fri May 20 03:51:51 BST 2011 x86_64 x86_64 x86_64 GNU/Linux

OSはCentOS6(64bit)みたい。
ここからダウンロード
RHEL5: CentOS 5.5 / 64-bit
prince-8.0-1.centos55.x86_64.rpm

$ cd ~/download
$ wget http://www.princexml.com/download/prince-8.0-1.centos55.x86_64.rpm

普通にインストールしたら怒られた、openssl64bitはちゃんとあるのに

$ sudo rpm -ivh prince-8.0-1.centos55.x86_64.rpm
エラー: 依存性の欠如:
libcrypto.so.6()(64bit) は prince-8.0-1.x86_64 に必要とされています
libcurl.so.3()(64bit) は prince-8.0-1.x86_64 に必要とされています
libexpat.so.0()(64bit) は prince-8.0-1.x86_64 に必要とされています
libfontconfig.so.1()(64bit) は prince-8.0-1.x86_64 に必要とされています
libfreetype.so.6()(64bit) は prince-8.0-1.x86_64 に必要とされています
libgif.so.4()(64bit) は prince-8.0-1.x86_64 に必要とされています
libjpeg.so.62()(64bit) は prince-8.0-1.x86_64 に必要とされています
libpng12.so.0()(64bit) は prince-8.0-1.x86_64 に必要とされています
libpng12.so.0(PNG12_0)(64bit) は prince-8.0-1.x86_64 に必要とされていま す
libssl.so.6()(64bit) は prince-8.0-1.x86_64 に必要とされています
libtiff.so.3()(64bit) は prince-8.0-1.x86_64 に必要とされています
libungif.so.4()(64bit) は prince-8.0-1.x86_64 に必要とされています
[kagen@localhost download]$ rpm -qa | grep openssl-devel
openssl-devel-1.0.0-4.el6_0.2.x86_64

検索したら、ここにたどり着いた。同じ困っている人がいた。http://www.princexml.com/bb/viewtopic.php?f=2&t=7021
8.1から対応してくれそうです。

$ wget http://www.princexml.com/download/prince-8.0-linux-amd64-static.tar.gz
....
$ tar xzvf prince-8.0-linux-amd64-static.tar.gz
....
$ cd prince-8.0-linux-amd64-static
$ sudo ./install.sh
[sudo] password:
Prince 8.0

Install directory
This is the directory in which Prince 8.0 will be installed.
Press Enter to accept the default directory or enter an alternative.
[/usr/local]:⇒ブランクのままエンター

Installing Prince 8.0...
Creating directories...
Installing files...

Installation complete.
Thank you for choosing Prince 8.0, we hope you find it useful.
Please visit http://www.princexml.com for updates and development news.
$ prince --version
Prince 8.0
Copyright 2002-2011 YesLogic Pty. Ltd.
Non-commercial License

取り敢えずインストール出来たみたい。

2011年12月13日火曜日

新しい作ったサーバになんとsshとscpコマンドがない。

bash: scp: コマンドが見つかりません
bash: ssh: コマンドが見つかりません

sshdなどは入っているけど、なんで?
まぁインストールします。

# sudo yum install openssh-clients
...
# which ssh
/usr/bin/ssh

インストールされた。

2011年12月2日金曜日

COUNTIF,SUMIF,SUMPRODUCT

よく使うのはCOUNTIF,SUMIF
複数条件時は、SUMPRODUCTだと便利です。

商品名 クラス 販売数量 単価
リンゴ A 3 200
リンゴ S 2 600
バナナ A 5 90
B 7 100
リンゴ B 12 50

求め 数式 結果
単価が100円以上の商品数 =COUNTIF(D2:D6,">=100") 3
リンゴの販売数は =SUMIF(A2:A6,"=リンゴ",C2:C6) 17
リンゴの売上は =SUMPRODUCT((A2:A6="リンゴ")*C2:C6*D2:D6) 2400
リンゴクラスAとAAの総売上は =SUMPRODUCT((A2:A6="リンゴ")*((B2:B6="A")+(B2:B6="S"))*C2:C6*D2:D6) 1800

Excelの#DIV/0!エラー

Excel2007では通常はこれで隠すが
IFERROR(A1/A2,"")

Excel2000では(2003は確認していません)"IFERROR"がないので
IF(ISERROR(A1/A2),"",A1/A2)
で代替できる

2011年11月29日火曜日

vbaで先月末、今月末、今月の日数など

vbaのdateをちょっと...

'今日
today = Date

'先月末
lastMonthLastDay = _
DateAdd("d", -1, DateSerial(Year(today), Month(today), 1))

'先月初
lastMonthLastDay = _
DateAdd("m", -1, DateSerial(Year(today), Month(today), 1))

'今月末
thisMonthLastDay = _
DateAdd("d", -1, DateAdd("m", 1, DateSerial(Year(today), Month(today), 1)))

'今月の日数
thisMonthDayCount = DateDiff("d",lastMonthLastDay,thisMonthLastDay)

'今日(yyyymmdd形式)
today = Format(Date,"yyyymmdd")

'今日(mysql形式)
today = Format(Date,"yyyy-mm-dd")

'今現在(mysql形式)
Format(Now, "yyyy-mm-dd hh:nn:ss")

'YYYYMMDDをDate形に変換
myDate = CDate(Format("20111231", "@@@@/@@/@@"))


2011年11月25日金曜日

Excelのバーションを自動判断保存する(警告なし)のサンプル

Excelの各バーション(95,97,2000,2003,2007,2010)file format一覧表


Excel 定数 拡張子 説明
97-2003 xlWorkbookNormal -4143 .xls 既定のExcel2003ベースのファイル形式
2007-2010 xlWorkbookDefault 51 .xlsx 既定のExcel2007ベースのファイル形式、VBAなし
2007-2010 xlOpenXMLWorkbookMacroEnabled 52 .xlsm Excel2007ベースのマクロ有効ファイル形式、VBA有効
2007-2010 xlExcel12 50 .xlsb Excel2007バイナリファイル形式(BIFF12)
2007-2010 xlExcel8 56 .xls Excel 97 - 2003のバイナリファイル形式(BIFF8)
2007-2010 xlExcel5 39 .xls Excel 5.0/95のバイナリファイル形式(BIFF5)

サンプル
'まずは拡張子を定義
    Public Const Extension_Excel2003 As String = ".xls" '2003エクセルの拡張子
    Public Const Extension_Excel2007 As String = ".xlsx" '2007エクセルの拡張子

    '2007エクセル(マクロ)の拡張子、保存するファイルにVBAが含まれる時はこっちを使ってください
    Public Const Extension_Excel2007_With_Macro As String = ".xlsm"

    'まずはfileFormat定数を定義
    Public Const Excel2003FileFormat As Long = -4143
    Public Const Excel2007FileFormat As Long = 51
    Public Const Excel2007FileFormatWithMacro As Long = 52

    Public gExt As String
    Public gFormat As Long

    '使っているEXCELのバージョンが97-2003
    If Val(Application.Version) < 12 Then
        gExt = Extension_Excel2003 
        gFormat = Excel2003FileFormat
    Else '2007-2010の場合
        gExt = Extension_Excel2007
        gFormat = Excel2007FileFormat
    End If

    '保存
    Application.DisplayAlerts = False
    With someWorkbook
        .SaveAs Filename:= strFileName & gExt, FileFormat:=gFormat
    End With
    Application.DisplayAlerts = True

2011年11月21日月曜日

UTF-8とUTF-8N

railsに怒られた
syntax error, unexpected kEND, expecting $end
controllerの文字コードをSJISからUTF8に変換したら、このエラーが出るようになった…
変換を使ったのはterapad、2バイト文字全然ないのに、なぜ?


一般異議でUTF8はUTF8のボムなしを指します(BOMってなに?わかない…最初の一文字目だそうです)
Terapadの呼び方では:
UTF8 = UTF8ボムあり
UTF8N = UTF8ボムなし

だからUTF8Nにすればエラーが出なくなる、改行コードはLFかCRLFどっちでも?(だそうです)
エンコードってややこしいな、兎に角UTF8ボムなしにすればよいか…


2011年11月18日金曜日

railsでdb migrateしたら怒られたのでgemをダウングレード

railsでdb migrateしたら怒られた

WARNING: 'require 'rake/rdoctask'' is deprecated. Please use 'require 'rdoc/task' (in RDoc 2.4.2+)' instead.

gemのバージョンが高すぎるからgem 1.3.7にダウングレードする

# gem -v
1.8.7
# gem update --system 1.3.7
# gem -v
1.3.7

あとgemのmysqlも入れてないからいれる

# gem install mysql

これでdb:migrateしたらうまくいった

# rake db:migrate

ちなみに、すべてのテーブルを削除する方法は

# rake db:migrate VERSION=0

2011年11月10日木曜日

railsのscaffoldで作成したcontrollerが余計のお世話をする

railsのscaffoldを作成したら、controllerでactionを追加したら、actionをidとして探してしまうという余計のお世話は、実はscaffoldの仕業
rorr(ruby on rails rookie)の私にyuoさんがいろいろ教えてくれてありがとうございました。

$ rails anydesign -d mysql #まずはプロジェクト作成(データベースはmysql)
$ cd anydesign
$ rake db:create #DB作成
$ ruby script/generate scaffold report title:string header:text body:text footer:text #scaffoldで簡単なreport機能を作成
$ rake db:migrate #DBを更新
$ ruby script/server #サーバを立ててみる

ブラウザーでhttp://localhost:3000/を叩いたら、タイムアウト…
調べたら、iptables(firewall)がオンになってる

$ sudo service iptables status #状態を調査する
$ sudo service iptables stop #やっぱりオンになってるから、止める

もう一回ブラウザーでhttp://localhost:3000/を叩いたら、出ました。on rail...
先作ったscaffoldで作ったreportを見てみるhttp://localhost:3000/report
あ!ちゃんと空の一覧が出来ました、便利。
一覧、新規、変更、削除一応全部できる。取り敢えず
title, header, body, footerを入れて、一レコードを作りました。
そして、controllerで新しいaction、「test」を追加しました、空のaction
in reports_controller.rb

def test
end

http://localhost:3000/report/testを叩いたら、[ActiveRecord::RecordNotFound (Couldn't find Report with ID=test):]という
エラーが出来ました、なぜaction名がidに無理やりも当てるの?railsの大きなお世話だね、yuoさんが教えてくれた
scaffoldで作成するとき、config/routes.rbで

map.resources :reports

を追加してくれたので、こうなった、一番簡単なのはこの一文を削除すればいいですが、config/routes.rbで

map.resources :reports, :only => ['create','show'] #適応actionを絞る
あるいは
map.resources :reports, :except=> ['test'] #action testを除外する

でもいいらしい。

svnコマンド、ディレクトリを再帰的に無視属性追加する


$ svn propset -R 'svn:ignore' '*' ./log/
$ svn propset -R 'svn:ignore' '*' ./tmp/
$ svn ci -m "ignore tmp and log"

ここから引用しました、ありがとうございました。

2011年11月8日火曜日

ディレクトリ構造のまま、ファイル一覧で指定したファイルを別のディレクトリに移すVBA

grepで特定の文字を含むファイルを探し出す、一覧を作成する、そしてディレクトリ構造のまま別場所に移す。作業ログも出力できる。
ファイルはこちらでダウンロード、まぁ使い道ないないかもね…

subversionコンソールでのcommit

まずはSubversionクライアントが必要です。
Subversionサーバサイドと同じくインストールしましょう

# yum -y install subversion mod_dav_svn #クライアントのみならmod_dav_svnは不要かも


そしてチェクインしましょう、今回のソースは”/www/myproj”ですので
そしてリポジトリ親玉のURLはhttp://localhost/repose/とします

# svn co http://localhost/repose/myproj /www/myproj

更新

# svn up 更新
# svn status 変更があったファイルの一覧
# svn info リポジトリ情報など

単純のクライアントだけのsubversionはないですか?

2011年11月2日水曜日

install ruby on rails development evn on centos6.0 memory


//install centOS6.0 from netinstall

//install all ruby
# sudo yum -y install ruby ruby-devel ruby-irb ruby-libs ruby-rdoc
# ruby -v
ruby 1.8.5 (2006-08-25) [i386-linux]

//install rubygems
# cd Download
# wget http://rubyforge.org/frs/download.php/60718/rubygems-1.3.5.tgz
# tar xzvf rubygems-1.3.5.tgz
# cd rubygems-1.3.5
# sudo ruby setup.rb

//install all needed stuff (if necessary)
# sudo yum -y install mysql-devel mysql-server httpd gcc make

//install the rails 2.3.8
# sudo gem install rails -v=2.3.8 --include-dependencies

//confirm versions
# ruby -v
ruby 1.8.7 (2010-06-23 patchlevel 299) [x86_64-linux]
# gem -v
1.3.7
# rails -v
Rails 2.3.8

//stop firewall
$ sudo service iptables status
$ sudo service iptables stop

//start mysql server
$ sudo service mysqld start
$ sudo chkconfig mysqld on
$ sudo chkconfig --list

//install mysql connecter for ruby
$ sudo gem install mysql -- --with-mysql-config

//create database
$ mysql -uroot
mysql> create database demo_development;

//add a application using mysql as db
$ cd ~
$ mkdir work
$ cd work
$ rails demo -d mysql

//create the controller
$ cd demo
$ script/generate controller layout

//add a action
$ vi app/controllers/layout_controller.rb
---
add "def index"
add "end"
---

//start web server
$ ruby script/server
=> Booting WEBrick
=> Rails 2.3.8 application starting on http://0.0.0.0:3000

//confirm from browser url:http://localhost:3000
//if you see "Template is missing" you done

2011年10月31日月曜日

androidのSDカードを4Gから8Gへアップグレート

最近アプリ入れすぎて4GのSDカードがパッツパツなってきた。
秋葉原で8Gclass10のやつを購入(\850)、さて移行はどうする??
取り敢えずコピーしてみるとおもって、エラー出まくりですね、windowsがlinuxのファイル名を理解できないでしょうか…

直接コピーじゃダメみたい、winImageという奴はあるけど、SDを一枚まるごとimageに焼いてくれる。しかし今回買ったのは8G、もともとのやつは4だけら、直接焼いたら、フォーマットが必要らしい、8Gのカード4Gしか使えない?

最終的に下記の手順でやりました:
元SDカード(4G)⇒圧縮(tmp.zip)⇒新SDカード(8G)に解凍


以上終了!

2011年10月24日月曜日

CLIでSSG5の設定を出力

USBシリアルケーブルでSSG5のコンソールをPCに繋げて、teratermでログインする、シリアルを選択して、適切なUSBポートCOMを選択する。「OK」と押したら、繋げるはず。

何でも表示しないけど、ログインIDを入れてください。

>get config

設定がすべて表示される
以上

2011年10月16日日曜日

L-04C Root取る

とにかく超簡単です

1.まずは「LG On-Screen Phone」をダウンロード、そしてインストールする。
http://www.lg.com/jp/mobile-phones/download-page/download.jsp?modelName=L-04C&downType=driver

2.L-04Cのmenuキーから「設定」⇒「アプリケーション」⇒「開発」⇒「USBデバッグ」をチェックする

3.USBでパソコンと接続、SDカードをマウントしない

4.LG On-Screen Phoneを立ち上げ、パソコンとL-04Cの接続を実現。※初期パスワードは「0000」です

5.SuperOneClickv1.7-ShortFuse.zipをダウンロード
http://forum.xda-developers.com/showthread.php?t=803682

6.SuperOneClickv1.7を実行、「Exploit」に「rageagainstthecage」を選択「Root」を押す




2011年9月20日火曜日

PHP、オブジェクトのプロパティ名を変数で参照

PHP、オブジェクトのプロパティ名を変数で参照
$this->{$key} = $val;

2011年9月16日金曜日

disabledとreadonly

なるほど、書込み禁止の要素結構ありますね、見た目の関係でよくreadonlyを使わずdisabledを使います。

<input name="score" disabled="disabled" value="100" />

しかしdisabledは「使用禁止」という意味ですから、valueはForm送信されないらしい。やはりreadonlyを使うべきだね。

<input name="score" readonly="readonly" value="100" />

見た目はCSSで頑張りましょう
input[readonly=readonly] {
	border: 1px solid #556f8c;
	color: #0a0809;
	text-shadow: 0 -1px 0 #DFE5D7;
	background: -moz-linear-gradient(top, #f6f6f6 0%, #e1e1e1 100%); /* firefox */
	background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#e1e1e1), color-stop(100%,#afafaf)); /* webkit */
}

2011年9月14日水曜日

変数でワークシートを参照する関数INDIRECT

セルB1の内容によって参照するシートを変える

=COUNTIF(INDIRECT(CONCATENATE($B$1,"期!O5:O65535")),">2010/05/01")

例えばセルB1の内容は"201105"であれば、参照範囲はシート名が"201105期"シートのRange("O5:O65535")
そして、その範囲で全て2010/05/01以降の行をカウントする

2011年9月10日土曜日

QdmailでHTMLメール送信の件、フレームワークはcakePHP

cakePHPを使って開発している、QdmailでHTML送信したいですが、思うように動かなかった。

HTMLのタグが無視されたり、変な「?」が表示されたり、とにかくすんなり行かない。
やっと最後はうまく行ったので、やったことをメモしとく

環境はこう:
cakePHP 1.3
centOS 5

まずは勿論Qdmailをダウンロード、http://hal456.net/qdmail/downloads#p6.1 使ったのはqdmail.1.2.5b.zip 解凍して、controllers/components/に入れます。

まずこのqdmail.phpを改造しないと行けない

まずは3821行あたり
	$content = $view->renderElement( $this->view_dir . DS . $type . DS . $this->template , array('content' => $content ) , true );
この一行をこう変えます
	if( version_compare(Configure::version(), '1.3.0') < 0){
		$content = $view->renderElement( $this->view_dir . DS . $type . DS . $this->template , array('content' => $content ) , true );
	}else{
		$content = $view->element( $this->view_dir . DS . $type . DS . $this->template , array('content' => $content ) , true );
	}
すると、cakePHP1.3も使えるようになった。

そして前回の投稿にも紹介した、340行あたり
	'multipart/alternative'=>array(
		'html'		=>	1,
		'plain'		=>	1,
		'OMIT'		=>	true,
	),

のhtmlとplainの順番を差し替え
	'multipart/alternative'=>array(
		'plain'		=>	1,
		'html'		=>	1,
		'OMIT'		=>	true,
	),
こうするとGmailなどもHTMLのタグを正常に表示てきる。

改造終わったら、いよいよコーディング
例えば、仮登録後に本登録のメールを送信する
registers_controller.phpで
class RegistersController extends AppController {
	var $components=array('registerLogic');//送信ロジックはコントローラーで書きたくないから専用のcomponentsを作成した
	var $helpers = array('Form','Notify');
	var $name = 'Registers';

	function beforeFilter() {
		$this->Auth->allow('add');//ログインしたくでも新規登録ができる
	}

	function add() {
		$this->layout = "login";//これはただレイアウトを引用
		$params = $this->getRequestParams();//これはフォームからの変数を受け取るメソッド
		if (!empty($params)) {
			$params['session'] = $this->Session->read('Config.userAgent');//セッションIDを取得
			$deleteCondition = array('session' => $params['session']);
			$this->Register->deleteAll($deleteCondition);//セッションにが既に登録してたら、削除
			$this->Register->create();//仮登録を登録
			if ($this->Register->save($params)) {

				//下のredirectをするとこのテロップが表示されなくなるらしい、セッションレベルを「low」にしても、受け継がない、困る
				$this->Session->setFlash(__('登録しました', true));
				$this->registerLogic->sendRegisterMail($params);//専用のcomponentsを読んで、送信する
				$this->redirect(array('controller' => 'info','action' => 'warning',__REGISTER_COMPLETED__));//完了画面を表示
			}
		}
	}
}
そしてregisterLogic.php
class RegisterLogicComponent extends object {
	var $components = array('Qdmail');//ここでQdmailを引用
	function startup(& $controller) {
		$this->_controller = $controller;//コントローラーをセット

		//モデル読み込み
		App::import('Model','register');//モデルは必須ではないけど
		$this->_registerModel  = new register;

		$this->Qdmail->startup($this->_controller);//コントローラーをセット
	}
	
	function sendRegisterMail($params) {
		$content = array(
						"title"=>__REGISTER_MAIL_SUBJECT__,//登録メールの定数メッセージ、別途定義済み
						"to"=>"あなた様",//何でもいい
						"session"=>$params['session'],//メールの正文で使うセッションIDを用意
						"body"=>"ご注文ありがとうございました。");//なんでもいい

		$this->Qdmail->to($params['email'],'あなた');//送信先を定義、「あなた」は受信者名、一応ね
		$this->Qdmail->subject(__REGISTER_MAIL_SUBJECT__);//定数
		$this->Qdmail->from(__NOREPLAY_MAIL_ADDRESS__ , __NOREPLAY_MAIL_FROM__);//送信者、ここも定数

		//QdmailでcakePHPのメール要素(テンプレート)とレイアウトを引用するメソッド
		//引数1:テンプレート(メール正文)で使う変数
		//引数2:テンプレート、パスは views\elements\email\html\
		//引数3:レイアウト、パスは views\layouts\email\html\
		$this->Qdmail->cakeHtml($content,'register','karu');
		$this->Qdmail->send();
	}
}
テンプレートはこんな感じ、
<?php echo $content["to"]; ?>様
<br />
この度は 「某某某某某」 に仮登録頂き 誠にありがとうございます。
<br /><br />
<?php echo $content["body"]; ?><br />
登録を完成するには、下記リンクをクリックし、本登録を完成させる必要があります。<br />
<a href="http://某某某某.com/user/add?ssid=<?php echo $content["session"]; ?>">href="某某某某.com/user/add?ssid=<?php echo $content["session"]; ?></a><br />
注意:このリンクは48時間以内有効です、48時間を超えた場合、再度仮登録からやり直す必要があります。
<br /><br />
宜しくお願いします。<br />
【某某某某.com】事務局より

ここでポイント!

①文字コードをJISに変換してください、改行コードはLF
(じゃないと何故か変数はOKだけど、テンプレートの日本語が全部化けちゃう)

②最後のEOFを改行
(じゃないとなぜか最後の行にモジバケがつく)

レイアウトはこんな感じ、日本語ないからエンコードはどうでもいい
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=Shift-JIS">
	<title><?php echo $title_for_layout;?></title>
</head>
<body style="font-size:12px;background-color:#fafafa;padding:20px;">
	<div style="border:solid 2px #b7ddf2;background:#ebf4fb;margin:20px auto;width:800px;padding:14px;">
	<h1 style="font-size:14px;font-weight:bold;margin-bottom:8px;margin-bottom:20px;border-bottom:solid 1px #b7ddf2;padding-bottom:10px;">
		<?php echo $title_for_layout;?>
	</h1>
<?php echo $content_for_layout;?>
	</div>
<p>
		<div style="text-align: center;">
			Copyright(C) xxxxxx. All Rights Reserved.
		</div>
</p>
</body>
</html>

ここでポイント!

CSSは無効!インラインstyleタグのみ、以前のブログも紹介した
まぁ、以上かな…
そうだ自宅サーバですので、プロバイダーはplalaです、OP25B対策しないと送信できない、ここをご覧plalaのOP25B対策、sendmail編

2011年9月7日水曜日


有名なwindows XPデスクトップ、10年後の悲惨な姿、microsoftの運命は?

2011年9月3日土曜日

QdmailがGmailでHTML表示しない件

cakephpでQdmailを使って送信するコードを書いています、しかしどうしてもHTMLがGmailで正しく表示されない!
苦闘の末、心が折れかかったとき、まるで神の救えてくれたように、このページを見つけてくれましたヾ(@^▽^@)ノ
ここ
そして出典はここ
Qdmail.phpの340行当たり
		0 => array(
			'multipart/mixed' => array(
				'multipart/alternative'=>array(
					'html'		=>	1,
					'plain'		=>	1,
					'OMIT'		=>	true,
				),
				'image'		=> 'BOTH', // Available Inline
				'OMIT'		=>	true,
			),
			'OMIT'		=>	true,
		),
ここのhtmlplainの順番を 変えるだけで問題は解決された!
アーメン!
		0 => array(
			'multipart/mixed' => array(
				'multipart/alternative'=>array(
					'plain'		=>	1,
					'html'		=>	1,
					'OMIT'		=>	true,
				),
				'image'		=> 'BOTH', // Available Inline
				'OMIT'		=>	true,
			),
			'OMIT'		=>	true,
		),
ちなみに、GmailではHTMLメール表示する時、inlinestyle属性しか効かないみたい、<script>タグは完全に無視されるらしい、つまり外部のcssを読み込んだり、scriptタグ内でcssを書いたり、全て無視されます。
また、インラインでstyleを書けばすべて有効というわけでもないらしい、グラデーション、シャドーや丸角系(おしゃれ系)は無視されるらしい。
おしゃれHTMLメールを作るならやはり画像ゴリゴリですか...やめたほうがいいよ、simple is best!

2011年8月28日日曜日

plalaのOP25B対策、sendmail編

plalaのOP25B対策、sendmail編,centos
# vi /etc/mail/sendmail.mc
dnl define(`SMART_HOST', `smtp.your.provider')dnl ←この行のしたに
define(`SMART_HOST', `esmtp:[timmy.mail.plala.or.jp]')dnl
↑「timmy」の部分は個人差がある、契約書で確認
define(`ESMTP_MAILER_ARGS',`TCP $h 587')←追加
FEATURE(authinfo, DATABASE_MAP_TYPE` -o 'MAIL_SETTINGS_DIR`authinfo')←追加
↑上記三行を追加、:wqで保存
# yum -y install sendmail-cf
# m4 /usr/share/sendmail-cf/m4/cf.m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf
# telnet timmy.mail.plala.or.jp 587
Trying 58.93.xxx.xx...
Connected to timmy.mail.plala.or.jp (58.93.xxx.xx).
Escape character is '^]'.
220 msa0Xx.plala.or.jp ESMTP server ready Fri, 12 Aug 2011 23:16:05 +0900

ehlo localhost ←情報を出力
250-msa0Xx.plala.or.jp
250-AUTH=LOGIN PLAIN CRAM-MD5 ←認証方法
250-AUTH LOGIN PLAIN CRAM-MD5
250-PIPELINING
250-DSN
250-8BITMIME
250 SIZE 20971520
quit ←一旦出る
221 msa0Xx.plala.or.jp ESMTP server closing connection
# echo AuthInfo:timmy.mail.plala.or.jp \"U:ユーザ名\" \"P:パスワード\" \"M:認証方法\" > /etc/mail/authinfo
※ここの「LOGIN PLAIN CRAM-MD5」は先情報出力時の認証方法
※アカウント名とパスワードは契約書で確認、アカウント名は「@」前の部分

# chmod 640 /etc/mail/authinfo
# makemap hash /etc/mail/authinfo.db < /etc/mail/authinfo # chgrp smmsp /etc/mail/authinfo.db # /etc/rc.d/init.d/sendmail reload sendmail を再読み込み中: [ OK ]
sm-client を再読み込み中: [ OK ]

2011年8月26日金曜日

vbaでcsvを一気にScripting.Dictionaryに格納する方法、セル内改行やダブルクォーテーションエスケープ対応版

vbaでcsvを読み込む方法が2つあると思う

一つ目:
テキストとして一行つづ読んで、区切りコンマまたはタブでsplitして処理する、この方法はメリットは高速で簡単、デメリットはフィルド内改行やダブルクォーテーションがあったら、おかしくなること

二つ目:
Workbookでcsvを開き、range単位で処理する方法。方法1と比べてちょっと遅いですが、Excelで正常に開けるCSVなら、問題なく処理できるというのはポイント。※注意:連想配列Scripting.Dictionaryを使うには、「ツール」⇒「参考設定」の中に「Microsoft Scripting Runtime」をチェック入れてね

それでは2番目の方法を紹介します:

例えばこんなCSVがあります

名前 学校名 学年 クラス 国語 英語 数学
田中 一小 3年 1組 90 80 70
佐藤 ニ小 3年 1組 34 60 90
渡辺 一小 2年 2組 78 76 80
田中 ニ小 1年 3組 66 66 78
中田 一小 2年 1組 67 89 53
山田 ニ小 3年 2組 43 57 78


まずは一個モジュールを作りましょう。例えば名前はcsv_reader。内容は下記:
Option Explicit
Public gReits As New Scripting.Dictionary '格納先の連想配列
Sub CSV_Read2()
    Dim FileType, Prompt As String
    Dim FileNamePath As Variant
    Dim dicHeader As New Scripting.Dictionary
    Dim dicHeaderRev As New Scripting.Dictionary
    Dim wb As New Workbook
    Dim st As New Worksheet
    Dim csvrow As Range
    Dim csvfield As Range
    Dim strFolder As String
    
    Dim FSO As Object
    
    'まずはcsvファイルを選択するダイアログボックス
    FileType = "CSV ファイル (*.csv),*.csv"
    Prompt = "CSV File を選択してください"
    
    '操作したいファイルのパスを取得します
    FileNamePath = SelectFileNamePath(FileType, Prompt)

    'キャンセルボタンが押された
    If FileNamePath = False Then
        End
    End If
    
    '格納先の連想配列を空にする
    gReits.RemoveAll
    
    'csvファイルを開く
    Set wb = Workbooks.Open(FileNamePath)
    'シートをセット(csvファイルはsheet1しかない)
    Set st = wb.Sheets(1)
    '内容の有るすべてのレンジから一行つづ読み込む
    For Each csvrow In st.UsedRange.Rows
        '一行目はタイトル、タイトル変数に格納
        If csvrow.row = 1 Then
            'タイトル行のすべての列
            For Each csvfield In csvrow.Columns
                'タイトル名と列の情報をkey,item交代でそれそれ格納し
                dicHeader.Add csvfield.Value, csvfield.Column
                dicHeaderRev.Add csvfield.Column, csvfield.Value
            Next
        Else
            '2行目以降の処理
            '今後使うときにやりやすいようにデータは階層構造として格納する
            '第一階層キーはcsvの学校の値
            '第二階層キーは学年
            '第三階層キーはクラス
            '第四階層キーはなく、csvの生徒のデータを格納する場所
            
            'もし第一階層キーまだ登録してなければ登録します
            If Not gReits.Exists(Cells(csvrow.row, dicHeader.Item("学校名")).Value) Then
                gReits.Add Cells(csvrow.row, dicHeader.Item("学校名")).Value, New Scripting.Dictionary
            End If
            
            'もし第ニ階層キーまだ登録してなければ登録します
            If Not gReits.Item(Cells(csvrow.row, dicHeader.Item("学校名")).Value).Exists(Cells(csvrow.row, dicHeader.Item("学年")).Value) Then
                gReits.Item(Cells(csvrow.row, dicHeader.Item("学校名")).Value).Add Cells(csvrow.row, dicHeader.Item("学年")).Value, New Scripting.Dictionary
            End If
            
            'もし第三階層キーまだ登録してなければ登録します
            If Not gReits.Item(Cells(csvrow.row, dicHeader.Item("学校名")).Value).Item(Cells(csvrow.row, dicHeader.Item("学年")).Value).Exists(Cells(csvrow.row, dicHeader.Item("クラス")).Value) Then
                gReits.Item(Cells(csvrow.row, dicHeader.Item("学校名")).Value).Item(Cells(csvrow.row, dicHeader.Item("学年")).Value).Add Cells(csvrow.row, dicHeader.Item("クラス")).Value, New Scripting.Dictionary
            End If
            
            '最後列ごとで、タイトルと値を連想配列に格納する
            For Each csvfield In csvrow.Columns
                gReits.Item(Cells(csvrow.row, dicHeader.Item("学校名")).Value).Item(Cells(csvrow.row, dicHeader.Item("学年")).Value).Item(Cells(csvrow.row, dicHeader.Item("クラス")).Value).Add dicHeaderRev.Item(csvfield.Column), csvfield.Value
            Next
            
        End If
    Next
    wb.Close SaveChanges:=False
    set wb = nothing
    set st = nothing
    'ここまで、csvのデータがすべてグローバル連想配列変数gReitsに格納したはず、あとは好きなように使うだけ
    call printOut
End Sub
Function SelectFileNamePath(FileType, Prompt) As Variant
  SelectFileNamePath = Application.GetOpenFilename(FileType, , Prompt)
End Function

Sub printOut()
    Dim gakkou As Variant
    Dim gakunen As Variant
    Dim class As Variant

    If gReits.Count > 0 Then
        For Each gakkou In gReits.Keys
            Debug.Print "学校名:" & gakkou
            For Each gakunen In gReits.Item(gakkou).Keys
                Debug.Print vbTab & "学年:" & gakunen
                For Each class In gReits.Item(gakkou).Item(gakunen).Keys
                    Debug.Print vbTab & vbTab & class
                    Debug.Print vbTab & vbTab & vbTab & gReits.Item(gakkou).Item(gakunen).Item(class).Item("名前") & "⇒" & _
                                                        "国語:" & gReits.Item(gakkou).Item(gakunen).Item(class).Item("国語") & _
                                                        "英語:" & gReits.Item(gakkou).Item(gakunen).Item(class).Item("英語") & _
                                                        "数学:" & gReits.Item(gakkou).Item(gakunen).Item(class).Item("数学")
                Next
            Next
        Next
    End If

End Sub
イミディエイトウィンドウの出力はこんな感じ 学校名:一小
  学年:3年
    1組
      田中⇒国語:90英語:80数学:70
  学年:2年
    2組
      渡辺⇒国語:78英語:76数学:80
    1組
      中田⇒国語:67英語:89数学:53
学校名:ニ小
    学年:3年
    1組
      佐藤⇒国語:34英語:60数学:90
    2組
      山田⇒国語:43英語:57数学:78
    学年:1年
    3組
      田中⇒国語:66英語:66数学:78

Ruby on Rails DateTimeやTimeオブジェクトの比較謎

データベースにavailable_toというdatetime型のフィルドがあります
active recordのfindメッソドを使って取り出した時は値の型は何でしょうか?

railsのバージョンによるかもしれないが、少なくでもrails1.16ではDateTime
やTimeオブジェクトと直接比較できなかった、謎!


if rec.available > DateTime.now
comparison of Time with DateTime failed
怒られました!なんで??
findメソッドを経由して、型が変わった?そんなわけないだろう...
取り敢えずこうして見る
if rec.available > Time.now
comparison of DateTime with Time failed
え?!冗談でしょう!
...仕方がない、最後の一撃!
if rank.fund.available_to.to_s.to_date > DateTime.now.to_s.to_date
やっと出来た...激汚いですけど

仕方がない、そして謎が一杯残ってます...
取り敢えず忘れよう。うん!

RailsのactiveRecordのfindメッソドで複数テーブル(Join)からクエリー

fund(1)<------>(*)fund_ranking
fundとfund_rankingは一対多の関係です。キーはfund_rankingsテーブルのfund_id
まずはmodelsでそれぞれ関係を作りましょう
fund.rbに追加
has_many :fund_rankings #ここは複数形
fund_ranking.rbに追加
belongs_to :fund #ここは単数形
ここで単数複数を間違うとActiveRecord::ConfigurationError と怒られる
コントローラー側 fund/ranking_controller.rb
@pcipu1m = FundRanking.find :all,
               :conditions => ["yyyymm = ? and period = '1m'", @yyyymm.yyyymm],
               :include => [:fund], #ここでfundsテーブルをインクルード
               :order => "rank asc",
               :limit => 10
ビュー側 fund/ranking/index.rhtml
<%- if @pcipu1m.size > 0 -%>
<%- @pcipu1m.each_with_index do |rank, idx| -%>
    第<%= rank.rank %>位 #fund_rankingsのrank
    銘柄名:<%= rank.fund.name %> #fundsのname
<%- end -%>
<%- end -%>
まぁ、私みたいなror超初心者の参考のために(。・ω・。)





2011年8月24日水曜日

ruby on rails, cakephpなどlogが書かれない場合

今日、凄くはまりました、自分はアホかと思った。

Railsを使って開発しますが、logファイルが作れない。
環境設定等もバッチリと思いますけどなぜ?!!

結局、logディレクトリのmodでした、書き込み権限がないんだ!

今度何かログが書かれないことがあったら、まずこいう順番で調べようと思った

1.設定は問題ないか。environment.rbなど、ログレベルとか
2.ログ出力先のディレクトリの有無、なければ作る、そして書き込み権限、開発機なら777にしておこう、念のため tmpも777にしましょう
3.複数システム存在している場合、ちゃんと意図したものを見ているかどうかを確認

全部当たり前のことだけど、私はハマっちゃったToT

2011年8月21日日曜日

多次元のScripting.Dictionary構造

Sub testData()
    Dim shops As New Scripting.Dictionary
    
    '店を三軒追加します
    shops.Add "東京本店", New Scripting.Dictionary
    shops.Add "小金井店", New Scripting.Dictionary
    shops.Add "新宿店", New Scripting.Dictionary
    
    '東京本店に商品コードPD001~003を追加、定義したclsProductを利用
    shops.Item("東京本店").Add "PD001", New clsProduct
    shops.Item("東京本店").Add "PD002", New clsProduct
    shops.Item("東京本店").Add "PD003", New clsProduct
    
    'PD001~003の商品詳細を定義
    shops.Item("東京本店").Item("PD001").Name = "北海度牛乳"
    shops.Item("東京本店").Item("PD001").Price = 165
    shops.Item("東京本店").Item("PD001").Desc = "北海道のおいしい原乳"
    
    shops.Item("東京本店").Item("PD002").Name = "刺身の盛り合わせ"
    shops.Item("東京本店").Item("PD002").Price = 1200
    shops.Item("東京本店").Item("PD002").Desc = "新鮮だ新鮮だ"
    
    shops.Item("東京本店").Item("PD003").Name = "ハンドソープ"
    shops.Item("東京本店").Item("PD003").Price = 350
    shops.Item("東京本店").Item("PD003").Desc = "綺麗な手"
    
    '小金井店も同じ
    shops.Item("小金井店").Add "PD001", New clsProduct
    shops.Item("小金井店").Add "PD002", New clsProduct
    
    shops.Item("小金井店").Item("PD001").Name = "トーマス揺々セット"
    shops.Item("小金井店").Item("PD001").Price = 3200
    shops.Item("小金井店").Item("PD001").Desc = "子供大人気"
    
    shops.Item("小金井店").Item("PD002").Name = "果物ゼリ"
    shops.Item("小金井店").Item("PD002").Price = 200
    shops.Item("小金井店").Item("PD002").Desc = "りんご、ぶどう、いちご"
    
    Dim shop As Variant
    Dim product As Variant
    
    '全ての店から,店名を取得してループ
    For Each shop In shops.Keys
        'その店から,商品コードを取得してループ
        For Each product In shops.Item(shop).Keys
            '店名、商品コード、商品名、値段、改行、商品説明をコンソールに出力
            Debug.Print shop & " - (" & product & ")" & _
                        shops.Item(shop).Item(product).Name & " \ " & _
                        shops.Item(shop).Item(product).Price & vbNewLine & _
                        shops.Item(shop).Item(product).Desc
        Next
    Next
End Sub
こっちはclsProductの中身
Private mPdtName As String
Private mPdtPrice As Long
Private mPdtDesc As String

Public Property Let Name(ByVal newPdtName As String)
    mPdtName = newPdtName
End Property
Public Property Get Name() As String
    Name = mPdtName
End Property

Public Property Let Desc(ByVal newPdtDesc As String)
    mPdtDesc = newPdtDesc
End Property
Public Property Get Desc() As String
    Desc = mPdtDesc
End Property

Public Property Let Price(ByVal newPdtPrice As Long)
    mPdtPrice = newPdtPrice
End Property
Public Property Get Price() As Long
    Price = mPdtPrice
End Property

イミディエイトの出力はこんな感じ、新宿店は商品一つも登録しなかったので、
表示されませんでした。

東京本店 - (PD001)北海度牛乳 \ 165
北海道のおいしい原乳
東京本店 - (PD002)刺身の盛り合わせ \ 1200
新鮮だ新鮮だ
東京本店 - (PD003)ハンドソープ \ 350
綺麗な手
小金井店 - (PD001)トーマス揺々セット \ 3200
子供大人気
小金井店 - (PD002)果物ゼリ \ 200
りんご、ぶどう、いちご


データ構造はこうなっています

2011年8月10日水曜日

3秒後、ジャンプのmetaタグ

<META HTTP-EQUIV="Refresh" CONTENT="3;URL=http://newdomain.com/index.html">

2011年8月3日水曜日

mysqlのpassword変更

OSコンソールで

# mysqladmin -u user -h localhost password "newpw"


mysqlコンソールで

mysql> SET PASSWORD FOR 'user'@'%' = PASSWORD('newpw');

2011年7月31日日曜日

SVNサーバを構築メモ

まずはSubversionをインストールしましょう。
http://subversion.tigris.org/

そしてコマンドプロンプトでパスが通っているかどうかを確認

>svn --version


リポジトリの作成

>mkdir svn
>cd svn
>mkdir repo
>svnadmin create L:\svn\repo


リポジトリへインポート

>svn import C:\dev\myproject file:///C:/svn/repo -m "initial import"


リポジトリCheckout

>svn checkout file:///C:/svn/repo C:\dev\myproject

2011年7月29日金曜日


グループウェア比較
比較項目 Google Apps Aibo Microsoft Exchange Server サイボウズ
ロゴ
イニシャルコスト 設定など人件費:
¥300,000

トレーニング:
¥200,000



















サーバー(2):
¥200,000

設定など人件費:
¥300,000

トレーニング:
¥200,000
















サーバー(2):
¥500,000

OS(2):
¥488,400

OS CAL(人数):
¥9,600 x 20 = ¥192,000

ExchangeServ2010(2):
¥476,400

Exchange CAL(人数):
¥22,800 x 20 = ¥456,000

設定など人件費:
¥600,000

トレーニング:
¥400,000
サーバー(2):
¥500,000

OS(2):
¥488,400

50人基本セット:
¥198,000

設定など人件費:
¥400,000

トレーニング:
¥200,000
小計 ¥500,000 ¥700,000 ¥3,112,800 ¥1,786,400
ランニングコスト(年間) 利用料(人数)
¥6000 x 20 = ¥120,000年/年

管理者人件費:
¥1,000,000/年
サーバー代:
\240,000/年

管理者人件費:
¥1,500,000/年
サーバー代:
\240,000/年

管理者人件費:
¥3,000,000/年
サーバー代:
\240,000/年

管理者人件費:
¥2,000,000/年
小計 ¥1,120,000 ¥1,740,000 ¥3,240,000 ¥2,240,000

2011年7月21日木曜日

google music I am coming!

I was invited!


取り敢えず、google chromeで操作感抜群、レスポンスは速いです。また使ったら報告する

2011年7月20日水曜日

javascriptでimageのpreview

1.imgpop.js
/*
 * Image preview script 
 * powered by jQuery (http://www.jquery.com)
 * 
 * written by Alen Grakalic (http://cssglobe.com)
 * 
 * for more info visit http://cssglobe.com/post/1695/easiest-tooltip-and-image-preview-using-jquery
 *
 */
this.imagePreview = function(){ 
 /* CONFIG */
  
  xOffset = 10;
  yOffset = 30;
  
  // these 2 variable determine popup's distance from the cursor
  // you might want to adjust to get the right result
  
 /* END CONFIG */
 $("a.preview").hover(function(e){
  this.t = this.title;
  this.title = ""; 
  var c = (this.t != "") ? "<br/>" + this.t : "";
  $("body").append("<p id='preview'><img src='"+ this.href +"' alt='ロード中...' />"+ c +"</p>");         
  $("#preview")
   .css("top",(e.pageY - xOffset) + "px")
   .css("left",(e.pageX + yOffset) + "px")
   .fadeIn("fast");      
    },
 function(){
  this.title = this.t; 
  $("#preview").remove();
    }); 
 $("a.preview").mousemove(function(e){
  $("#preview")
   .css("top",(e.pageY - xOffset) + "px")
   .css("left",(e.pageX + yOffset) + "px");
 });   
};


// starting the script on page load
$(document).ready(function(){
 imagePreview();
});

2.imgpop.css
#preview{
 position:absolute;
 border:1px solid #ccc;
 background:#333;
 padding:5px;
 display:none;
 color:#fff;
 }

3.jquery.jsを含め引用しておきます
<script src="/javascripts/jquery.js" type="text/javascript"></script>
<script src="/javascripts/imgpop.js" type="text/javascript"></script>
<link href="/stylesheets/imgpop.css" rel="stylesheet" type="text/css" media="all" />

4.こう使う
<a href="big_image.png" class="preview" alt="this is a popup preview">
<img src="thumber_pic" />
</a>

サンプル




5.別窓でポップアップ
<a href="big_image.png" class="preview" alt="this is a popup preview" onclick="window.open('big_image.png', '', 'width=100,height=100'); return false;">
<img src="thumber_pic" />
</a>

サンプル2(クリックするとポップアップ)


2011年7月18日月曜日

amzone mp3 cloudplayerを使ってみた

以前はこれを使ってました
grooveshark
、結構使いやすくて、Facebookで簡単に友たちとシェア出来て便利だった。しかし、歌が少ない(?)、マイナー曲だと検索しても出てこない。アップロード機能も何故かうまくできませんでした。
そこでAmazonのmp3 cloud




を試してみようと思った。しかし、なんとアメリカのアカウントが必要だと?!(日本のIPはダメらしい)アマゾンめ!

気を取り戻して、「アメリカ IP」で調べてみたら
「Easy-Hide-IP」
その他にもHotspot Shieldなどありますね



というソフトを見つけました。簡単にアメリカ、イギリスなどたくさんの国のIPを偽装できる神級ツールでした。有料だけど、最初の3日は試し使いできる。早速インストールして、アメリカのIPにしたら、やった!できた!!一回登録すれば、IPを日本に戻しでも問題なくサービスを使える見たい。現状一部の日本語文字化けてる。




今後はgoogleの「music」サービスも使ってみようと思う。