2012年12月18日火曜日

powerpointのアドインppamをdebugする方法

1.Close PPT if it's running
2.In REGEDIT, go to HKCU\Software\Microsoft\Office\xx.0\PowerPoint\Options (where xx.0 is 11.0 for 3.Office 2003, 12.0 for Office 2007, 14.0 for Office 2010)
4.Add DebugAddins a DWORD=1
5.Quit regedit.

thx
http://stackoverflow.com/questions/5129362/powerpoint-2007-2010-vba-ppam-add-in-does-not-show-up-in-vba-editor-when-open

2012年12月14日金曜日

linuxのzipコマンドで特定フォルダーとファイルを除外する

特定フォルダーヤファイルを除外して圧縮するzipコマンドの例です。

zip -r what_ever_you_want.zip ./target_dir/ -x ./target_dir/dont_zip_me_dir\* '*.svn*' '*.tmp'

dont_zip_me_dirフォルダーとSVN関係フォルダーと'*.tmp'を除外したtarget_dirまるごとを圧縮する例です。


解凍先のディレクトリを指定する場合は

unzip what_ever_you_want.zip -d target_dir

2012年12月12日水曜日

ADODB.Commandのパラメータ埋め込みクエリーを出力

ADODB.CommandのCommandTextではクエリーを確認できますが、parameterのところが"?"のまま、直接DBにクエリー投げたいので、いちいち値をセットするのはめんどくさいので、メソッドを作ってみました。

' adArray
' adBigInt
' adBinary
' adBoolean
' adBSTR
' adChapter
' adChar
' adCurrency
' adDate
' adDBDate
' adDBTime
' adDBTimeStamp
' adDecimal
' adDouble
' adEmpty
' adError
' adFileTime
' adGUID
' adIDispatch
' adInteger
' adIUnknown
' adLongVarBinary
' adLongVarChar
' adLongVarWChar
' adNumeric
' adPropVariant
' adSingle
' adSmallInt
' adTinyInt
' adUnsignedBigInt
' adUnsignedInt
' adUnsignedSmallInt
' adUnsignedTinyInt
' adUserDefined
' adVarBinary
' adVarChar
' adVariant
' adVarNumeric
' adVarWChar
' adWChar

Public Function printSql(ByRef cmd As ADODB.Command) As String
Dim p As ADODB.Parameter
Dim vntP As Variant
Dim inti As Integer
Dim strR As String
inti = 1
ReDim vntP(cmd.Parameters.Count)
For Each p In cmd.Parameters
    Select Case p.Type
        'ここはニーズに応じてタイプを追加してください
        Case adInteger
            vntP(inti) = p.Value
        Case Else
            vntP(inti) = "'" & p.Value & "'"
    End Select
    inti = inti + 1
Next
strR = cmd.CommandText
For inti = 1 To UBound(vntP)
    strR = Replace(strR, "?", vntP(inti), 1, 1)
Next
printSql = strR
End Function
使い方
Global cnn As New ADODB.Connection
    Dim cmd As ADODB.Command
    Dim rs As ADODB.Recordset
    Dim param As ADODB.Parameter
    Set cmd = New ADODB.Command

   ' DB接続
    cnn.Open "Provider=SQLOLEDB;" & _
             "Data Source=" & srvName & ";" & _
             "Initial Catalog=" & databaseName & ";", user, pass
    cmd.ActiveConnection = cnn
    cmd.CommandTimeout = 0
    cmd.CommandType = adCmdText
    cmd.CommandText = "SELECT * FROM MyProj WHERE NAME = ? AND Create_at = ? AND hour = ?"

    ' パラメータを作成
    Set param = cmd.CreateParameter("PJNAME", adVarChar, adParamInput, 20)
    cmd.Parameters.Append param
    Set param = cmd.CreateParameter("CREATED", adDBTimeStamp, adParamInput)
    cmd.Parameters.Append param
    Set param = cmd.CreateParameter("HOUR", adInteger, adParamInput)
    cmd.Parameters.Append param

    ' パラメータに値をセット
    cmd.Parameters("PJNAME").Value = "計画A"
    cmd.Parameters("CREATED").Value = "2012-12-01"
    cmd.Parameters("HOUR").Value = 10

    Set rs = New ADODB.Recordset
    rs.CursorLocation = adUseClient
    rs.CursorType = adOpenStatic
    Debug.Print(printSql(cmd)) '⇒ココ
    rs.Open cmd

結果

SELECT * FROM MyProj WHERE NAME = '計画A' AND Create_at = '2012/12/01' AND hour = 10

2012年12月11日火曜日

railsのhelper便利すぎw

counter_partyのview
<%= f.collection_select(:名前, モジュール.find_all_by_列("値"), :列val用, :列disp用) %>
<%= f.collection_select(:CPCategory1, MiscCode.find_all_by_MiCodeKey("Field"), :MiCodeName, :MiCodeName) %>

<select id="counter_party_CPCategory2" name="counter_party[CPCategory2]">
  <option value="顧客">顧客</option>
  <option value="外注先">外注先</option>
  <option value="その他">その他</option>
</select>

2012年12月6日木曜日

既存データベース(SQL Server)をRailsに載せる

ごめんなさい、ちょっと長すぎて、途中で何を言っているかわからなくなった気がする...でも一応個人の作業メモということで...お許し下さい..orz

環境はwindows
Ruby on Rails(RoR)は「railsinstaller.org」からdownload

$ ruby --version
ruby 1.9.3p125 (2012-02-16) [i386-mingw32]
$ rails --version
Rails 3.2.1
$ gem --version
1.8.16
$ gem list
*** LOCAL GEMS ***
actionmailer (3.2.1)
actionpack (3.2.1)
activemodel (3.2.9, 3.2.1)
activerecord (3.2.1)
activerecord-sqlserver-adapter (3.2.10, 3.2.1)
...
...

VersionやGemの一覧(初期ではない、あとからGEMで追加したものもある!)
インストール後、デフォルト「c:\Sites」が作成される
※もしOS上既にRubyがインストールしていれば、複数バージョンを管理するために,pikをススメます
参照 http://holypp.hatenablog.com/entry/20110407/1302193459

$ gem install pik


さて、プロジェクトを建てましょう

$ rails new railsinstaller_demo
$ cd railsinstaller_demo


今回は、既存のデータベースを使って、RoRに乗り換える。DBはSQL Server
Rails3からはプロジェクト単位でGEMを管理するから、プロジェクトフォルダ直下のGemfileに追加

gem 'activerecord-sqlserver-adapter'
gem 'tiny_tds'

そしたら、実行

$ rail bundle install


次はDBに接続
config/database.ymlを編集

development:
adapter: sqlserver
database: DB_NAME
host: 192.168.1.XXX
username: user
password: pwd


migrate←この段階では必要ないかもしれr内が、まぁ私はやった

$ rake db:migrate


ここまで来て、次はscaffold。だけど既存のDBのテーブルにはid列もないし、テーブル名はRailsの複数形式に従っていないが、ここ参照しました。本当にたすかったよ!
例えば今回scaffoldしたいテーブル名は「CounterParty」

$ rails console

irbコンソールが表示されたら、下記コードを全部(テーブル名は変更してね)コピペ
name = 'CounterParty'
si_table_name = 'CounterParty'
si_field_names = Array.new
si_cols = ActiveRecord::Base.connection.columns(si_table_name,"#{name} Columns")
si_cols.each do |c|
si_field_names << "#{c.name}:#{c.type}"
end
puts si_field_names.join(' ')
putsされたのは既存「CounterPartyのテーブル構造」、それをコピして、一旦railsコンソールをexit $ rails g scaffold CounterParty コピーした内容をここにペスト Another migration is already named create_counter_parties:... あれ、作成できない、既にある?なるほど、これはさきmigrateが悪かったね、しなければ良かったかも skip-migrateオプションを追加してもう一回 $ rails g scaffold CounterParty コピーした内容をここにペスト --skip-migrate Overwriteと聞かれたら「Y」 ... .. そしてCOunterPartyのScaffoldが作成されました。 しかし、DBの構造はRailsに乗ってないので、いま表示したらエラーになりますので app\models\counter_party.rbを編集して、テーブル名とid列を指定
class CounterParty < ActiveRecord::Base
 attr_accessible :CPName, :CPMemo, ... #Rails3からはwrite可能なフィルドを明示的に宣言しないといけないらしい?
 self.table_name = 'CounterParty'
 self.primary_key = :CPCPID
end
これでOKのはず、さあ見てみよ $ rails s ブラウザーで「http://localhost:3000/counter_parties」をいれてご― 表示されたかな? 続き、WindowServer2008で動かす >ruby --version ruby 1.8.6 (2007-09-24 patchlevel 111) [i386-mswin32] >rails --version Rails 2.1.1 >gem --version 0.9.4 だいぶ古いですね Rails3とRails2はいろいろ変わったので、ソースコードはそのまま移して使えないので、プロジェクトを新規作成する。 プロジェクト作成 database.ymlを編集 mongrelで動かすので、サービスとして登録します。 プロジェクトフォルダーの下で、「cmd」というフォルダーを作成して、下記のbatファイルを作成する mongrel_service_regist.bat CD ../ CALL mongrel_rails service::install -N "Mongrel 9500 MyProj" -p 9500 -e development -a 0.0.0.0 SC CONFIG "Mongrel 9500 MyProj" START= AUTO 9500はポート番号、他の空いているポートもOK mongrel_service_remove.bat mongrel_rails service::remove -N "Mongrel 9500 MyProj" mongrel_service_restart.bat NET STOP "Mongrel 9500 MyProj" NET START "Mongrel 9500 MyProj" mongrel_service_start.bat NET START "Mongrel 9500 MyProj" mongrel_service_stop.bat NET STOP "Mongrel 9500 MyProj" これで、サービス登録[自動に設定]、再起動、開始、停止などがOne Clickでできるようになる ※但し、これは「管理者:コマンドプロンプト」で実行しなければなりません。 SQL Serverを使っている、データベースの日本語がviewで文字化けている時。 RoRのソースコードはすべてUTF8で記載、SQLServerのencodeはsjisの場合に発生?と思う config/environment.rbの先頭で、下記を追加すれば解消された。
$KCODE = "u"
require "win32ole"
WIN32OLE.codepage=WIN32OLE::CP_UTF8
最後、既存DBを使っているので、既存のprimary key列「CPCPID」(AUTO_INCREMENT利用しない)をrailsで管理する。 sql server では「IDENTITY」という属性らしい。「開始番号」の「IDENTITYシード」と「ID増分」がある 例えばIDENTITYシード=100、ID増分=10なら、「100,110,120」みたいに自動IDを生成してくれる。 Microsoft SQL Server Management Studio(長っ!)オブジェクトエクスプローラでテーブルの「デザイン」を開き、右クリックで「列のプロパティ」でIDENTITYを設定することが可能です。 もしなんか「一旦削除しないといけない」的なメッセージで怒られたら、 「ツール」>「オプション」>「デザイナ」>「デーブルデザイナおよび...」>「テーブルの再作成を必要とする変更.....」のチェックを外せば、変更できると思います。 それが終わったら、moduleでid列として、newとeditから削除すれば、普通にidとしてrailsが管理更新してくれます。
self.primary_key = :CPCPID

長すぎで自分も嫌になりました、よしっ!以上!ヽ(´ー`)ノ フッ

2012年11月22日木曜日

mysqlでCURSORを使ったループ(LOOP)でINSERT

#まず削除

DROP PROCEDURE IF EXISTS myProc;

#作成

#日付をプロシジャーの引数に設定、戻り値はない

CREATE PROCEDURE myProc(IN aft_date DATETIME)

BEGIN

  DECLARE done INT DEFAULT FALSE;#ループを抜けるフラグ

  DECLARE dt DATETIME;#日付ごとにループ

  DECLARE tdays CURSOR FOR SELECT aod as as_of_date FROM date_ots where aod > aft_date order by aod asc;#ループする日付たち

  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;#日付が全部回ったら終了フラグ



  OPEN tdays;#取得する



  read_loop: LOOP#ループ開始

    FETCH tdays INTO dt;

    IF done THEN

      LEAVE read_loop;#ループを抜ける

    END IF;



insert into fund_correction_indices

select null,f.id,rt.aod,0,ci4.correction_value * rt.rate1 * rt.rate2 * rt.rate3 * rt.rate4,ci4.correction_value * rt.rate1 * rt.rate2 * rt.rate3 * rt.rate4,0

from 

(

    select dto.aod,f.fund_small_category_id,

        avg(ci0.correction_value/ci1.correction_value) as rate1,

        avg(ci1.correction_value/ci2.correction_value) as rate2,

        avg(ci2.correction_value/ci3.correction_value) as rate3,

        avg(ci3.correction_value/ci4.correction_value) as rate4,

        avg(ci0.correction_value/ci4.correction_value) as rate_,

        dto.4thd 

    from date_ots dto 

        inner join fund_correction_indices ci0 on ci0.as_of_date = dto.aod

        inner join funds f on f.id = ci0.fund_id and f.kind not in ('平均','指数'

        inner join fund_correction_indices ci1 on ci1.as_of_date = dto.1std and ci1.fund_id = ci0.fund_id

        inner join fund_correction_indices ci2 on ci2.as_of_date = dto.2ndd and ci2.fund_id = ci0.fund_id

        inner join fund_correction_indices ci3 on ci3.as_of_date = dto.3rdd and ci3.fund_id = ci0.fund_id

        inner join fund_correction_indices ci4 on ci4.as_of_date = dto.4thd and ci4.fund_id = ci0.fund_id

    where dto.aod = dt

        and f.fund_small_category_id >=1 and f.fund_small_category_id <=57

    group by fund_small_category_id,dto.aod

) rt

    inner join funds f on f.fund_small_category_id = rt.fund_small_category_id and f.kind = '平均'

    inner join fund_correction_indices ci4 on ci4.as_of_date = rt.4thd and ci4.fund_id = f.id

order by f.id,rt.aod 

ON DUPLICATE KEY UPDATE 

  value=ci4.correction_value * rt.rate1 * rt.rate2 * rt.rate3 * rt.rate4,

  correction_value=ci4.correction_value * rt.rate1 * rt.rate2 * rt.rate3 * rt.rate4;

  END LOOP;

  CLOSE tdays;

END



呼び出し

CALL myProc('2012-02-01')


もしCREATE PROCEDUREの時「Column count of mysql.proc is wrong」みたいなエラーが出たら

$ mysql_upgrade -uroot -p
rootパスワード入力

で直してあげてください。

INSERT ON DUPLICATE KEY UPDATE

feel this useful,copy from here
http://stackoverflow.com/questions/548541/insert-ignore-vs-insert-on-duplicate-key-update


CREATE TABLE `users_partners` (
`uid` int(11) NOT NULL DEFAULT '0',
`pid` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`uid`,`pid`),
KEY `partner_user` (`pid`,`uid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

INSERT INTO users_partners (uid,pid) VALUES (1,1);
...1 row(s) affected

INSERT INTO users_partners (uid,pid) VALUES (1,1);
...Error Code : 1062
...Duplicate entry '1-1' for key 'PRIMARY'

INSERT IGNORE INTO users_partners (uid,pid) VALUES (1,1);
...0 row(s) affected

INSERT INTO users_partners (uid,pid) VALUES (1,1) ON DUPLICATE KEY UPDATE uid=uid
...0 row(s) affected

REPLACE INTO users_partners (uid,pid) VALUES (1,1)
...2 row(s) affected

INSERT INTO users_partners (uid,pid) VALUES (1,1),(1,2),(1,3),(1,4)
...Error Code : 1062
...Duplicate entry '1-1' for key 'PRIMARY'

INSERT IGNORE INTO users_partners (uid,pid) VALUES (1,1),(1,2),(1,3),(1,4)
...3 row(s) affected

INSERT INTO users_partners (uid,pid) VALUES (1,1),(1,2),(1,3),(1,4) ON DUPLICATE KEY UPDATE uid=uid
...3 row(s) affected

REPLACE INTO users_partners (uid,pid) VALUES (1,1),(1,2),(1,3),(1,4)
...5 row(s) affected

SQLOLEDB INSERT トランザクション付き

Sub InsertDB()
    Global cnn As New ADODB.Connection
    cnn.Open "Provider=SQLOLEDB;" & _
             "Data Source=" & srvName & ";" & _
             "Initial Catalog=" & databaseName & ";", user, pass

    Dim cmdIns As ADODB.Command
    Set cmdIns = New ADODB.Command
    cmdIns.ActiveConnection = cnn
    cmdIns.CommandTimeout = 0
    cmdIns.CommandType = adCmdText
    cmdIns.CommandText = "INSERT INTO myTable(id,name,price,bigmoney) VALUES(?,?,?,?)"

    'DB定義: id int
    Set param = cmdIns.CreateParameter("id", adInteger, adParamInput)
    cmdIns.Parameters.Append param

    'DB定義: name nvarchar(50)
    Set param = cmdIns.CreateParameter("name", adVarWChar, adParamInput, 100)
    cmdIns.Parameters.Append param

    'DB定義: price decimal(12, 6)
    Set param = cmdIns.CreateParameter("price", adDecimal, adParamInput)
    param.Precision = 12 '全桁数
    param.NumericScale = 6 '小数桁数 こんな感じ:123456.123456
    cmdIns.Parameters.Append param

    'DB定義: price bigmoney(12, 0)
    Set param = cmdIns.CreateParameter("bigmoney", adDecimal, adParamInput)
    param.Precision = 12 '全桁数
    param.NumericScale = 0 '小数桁数 こんな感じ:123456123456
    cmdIns.Parameters.Append param

    cmdIns.Parameters("id").Value = 1
    cmdIns.Parameters("name").Value = "かげんぱぱ"
    cmdIns.Parameters("price").Value = 1999.123
    cmdIns.Parameters("bigmoney").Value = 10000000000

    cnn.BeginTrans 'トランザクション開始
    cmdIns.Execute 'インサート実行
    'cnn.RollbackTrans 'ロールバック
    cnn.CommitTrans 'コミット
End Sub

2012年11月14日水曜日

mysqlテーブルコピー


/* スキーマをコピーしてテーブル作成 */
> CREATE TABLE mytable_copy LIKE mytable;
/* mytableテーブルのデータをINSERT */
> INSERT INTO mytable_copy SELECT * FROM mytable;

2012年11月9日金曜日

googleだからできること

面白い!
Googleスプレッドシートを新規して
A1セルに「mazda」
A2セルに「honda」
そしてctrlを押しながら、引っ張ったら…ほらね!

2012年11月2日金曜日

vbaで定義済みの名前NamesとRangeの参照

Sub name2range_test()
Debug.Print ThisWorkbook.Names.Count
For i = 1 To ThisWorkbook.Names.Count
    Debug.Print ThisWorkbook.Names.Item(i).Name & " -> " & ThisWorkbook.Names.Item(i).RefersTo
    Debug.Print ThisWorkbook.Names.Item(i).Name & " -> " & ThisWorkbook.Names.Item(i).RefersToRange.Address
Next
'あるいは
Debug.Print Range(ThisWorkbook.Names.Item(1).RefersTo).Address

End Sub

2012年10月22日月曜日

update複数テーブルmysql

update条件にjoinが必要、あるいは、複数テーブルを更新するときに使うね、あまりないと思う

mysql> create database kgtest;
Query OK, 1 row affected (0.03 sec)
mysql> use kgtest
Database changed
mysql> create table students (`id` int(11) not null, `name` varchar(10) not null);
Query OK, 0 rows affected (0.01 sec)
mysql> insert into students value(1,'tom');
Query OK, 1 row affected (0.03 sec)
mysql> insert into students value(2,'Jerry');
Query OK, 1 row affected (0.00 sec)
mysql> select * from students;
+----+-------+
| id | name |
+----+-------+
| 1 | tom |
| 2 | Jerry |
+----+-------+
2 rows in set (0.00 sec)
mysql> create table student2 (`id` int(11) not null, `name` varchar(10) not null);
Query OK, 0 rows affected (0.01 sec)
mysql> insert into student2 value(1,'tomas');
Query OK, 1 row affected (0.00 sec)
mysql> insert into student2 value(2,'rose');
Query OK, 1 row affected (0.00 sec)
mysql> select * from student2;
+----+-------+
| id | name |
+----+-------+
| 1 | tomas |
| 2 | rose |
+----+-------+
2 rows in set (0.00 sec)
mysql> update students st1,student2 st2 set st1.name = st2.name,st2.name = 'kitarou' where st1.id = st2.id;
Query OK, 4 rows affected (0.00 sec)
Rows matched: 4 Changed: 4 Warnings: 0
mysql> select * from student2;
+----+---------+
| id | name |
+----+---------+
| 1 | kitarou |
| 2 | kitarou |
+----+---------+
2 rows in set (0.00 sec)
mysql> select * from students;
+----+-------+
| id | name |
+----+-------+
| 1 | tomas |
| 2 | rose |
+----+-------+
2 rows in set (0.00 sec)

historyコマンド、日付時刻を表示


$ HISTTIMEFORMAT='%Y-%m-%d %T '
$ history

2012年10月17日水曜日

vbaでgoogleのマップAPIにアクセスする

まずは「ツール」→「参照設定」で「Microsoft XML. vX.0」を追加して下さい。
Sub httpRequest()

    Dim HttpReq As MSXML2.XMLHTTP
    Dim DomDoc As MSXML2.DOMDocument
    Dim targetURL As String
    
    targetURI = "http://maps.google.co.jp/maps/geo?key=&output=xml&q=" & EncodeURI("大宮市吉野町1-1-2")
    
    
    'HTTP GET
    Set HttpReq = CreateObject("MSXML2.XMLHTTP")
    HttpReq.Open "GET", targetURI, False
    HttpReq.send (Null)
    
    'XML PARSE
    Set DomDoc = CreateObject("MSXML2.DOMDocument")

    DomDoc.LoadXML (HttpReq.responseText)
    
    Set HttpReq = Nothing
    Set DomDoc = Nothing
End Sub
Function EncodeURI(uri As String) As String
        Set sc = CreateObject("ScriptControl")
        sc.Language = "JScript"
        Set js = sc.CodeObject
        EncodeURI = js.encodeURIComponent(uri)
End Function


参考URL、ありがとう!
URL1
URL2

excelをDBにして、wordやpower pointとデータ連携

ツール→参照設定から、Microsoft Activex Data Objects 2.x Libraryを追加しておく
Private Sub openDB()
    Dim CN As ADODB.Connection
    Dim RS As ADODB.Recordset
   
    Set CN = New ADODB.Connection
   
    CN.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                    "Data Source=C:\Documents and Settings\UserName\My Documents\data.xls;" & _
                    "Extended Properties='Excel 8.0;HDR=YES'"
                   
    Set RS = CN.Execute("select * from [シート名$] where 銘柄名 like '%日本%';")
        Do Until RS.EOF
        Debug.Print RS.Fields(0); RS.Fields(1); RS.Fields(2)
        RS.MoveNext
    Loop
End Sub

2012年10月16日火曜日

exclude(エクスクルード)除外のJOIN関係はないですか?

MySQLではLEFT・RIGHT (OUTER)、INNER JOINはありましたが、除外の関係はないでしょうか?
この図のようにAからBの部分を除外して、緑の部分を取得するクエリーの書き方はありませんか?

Aの中からidがBにも存在するレコードを除去して、Aのレコードを取得

select * from table_a A left outer join table_b B on B.id = A.id where B.id IS null

2012年10月7日日曜日

VBAのscripting.dictionaryをPHPのvar_dumpみたいに出力

'定数         値  内容
' vbEmpty     0   Empty値
' vbNull      1   Null値
' vbInteger   2   整数型
' vbLong      3   長整数型
' vbSingle    4   単精度浮動小数点数型
' vbDouble    5   倍精度浮動小数点数型
' vbCurrency  6   通貨型
' vbDate      7   日付型
' vbString    8   文字列型
' vbObject    9   オブジェクト
' vbError     10  エラー値
' vbBoolean   11  ブール型
' vbVariant   12  バリアント型(バリアント型配列にのみ使用)
' vbDataObject13  非OLEオートメーションオブジェクト
' vbDecimal   14  10進数型
' vbByte      17  バイト型
' vbArray     8192配列
Public Sub var_dump(ByVal obj As Scripting.Dictionary)
    Dim pi As Variant
    Dim strVal As String
    Static strTab As String
    strTab = strTab + vbTab
    For Each pi In obj.Keys
        If Not IsObject(obj.Item(pi)) Then
            Select Case VarType(obj.Item(pi))
                Case vbEmpty
                    strVal = "(Empty)"
                Case vbNull
                    strVal = "(NULL)"
                Case vbInteger
                    strVal = "(Interge)"
                Case vbLong
                    strVal = "(Long)"
                Case vbSingle
                    strVal = "(Single)"
                Case vbDouble
                    strVal = "(Double)"
                Case vbCurrency
                    strVal = "(Currency)"
                Case vbDate
                    strVal = "(Date)"
                Case vbString
                    strVal = "(String)"
                Case vbDecimal
                    strVal = "(Decimal)"
                Case vbByte
                    strVal = "(Byte)"
                Case vbArray
                    strVal = "(Array)"
            End Select
            Debug.Print strTab & pi & " -> " & strVal & obj.Item(pi)
        Else
            If TypeName(obj.Item(pi)) = "Dictionary" Then
                var_dump obj.Item(pi)
            Else
                Debug.Print strTab & pi & " -> " & "(object)" & TypeName(obj.Item(pi))
            End If
        End If
    Next
End Sub

2012年10月4日木曜日

CREATE TABLE SELECTの中にAUTO_INCREMENTのIDを付ける、おまけにCHARACTERをUTF8

CREATE TABLE SELECTの中にAUTO_INCREMENTのIDを付ける、おまけにCHARACTERをUTF8

create table nek_in_tdb
(
id INT PRIMARY KEY AUTO_INCREMENT
,company_code VARCHAR( 25 ) NOT NULL ←無くでも問題ない
,name_jp VARCHAR(255) NOT NULL ←無くでも問題ない
) CHARACTER SET 'utf8'
select distinct
n.company_code
,n.name_jp
from company_tdb t
inner join company_nik n
on t.search_key = n.name_jp;

2012年9月27日木曜日

今日知った、mysqlの罠、ハァ・・(ノω=;)

今日の罠(常識かも)
①mysqlのクエリーでは「○○ <> True」使わない方がいいです。NULLのものが入ってこないから。
「○○ = False or ○○ IS NULL」が正解

②「union」では勝手に一意してくれるから、そうさせたくないときは「union all」

2012年9月26日水曜日

selectした内容をシーケンス(Sequence)付きで新しいテーブルに挿入


insert into new_table (
seq
,fund_name
,rank_org
,yyyymm
,period)
SELECT
@row := @row + 1 as seq
,fund_name
,rank as rank_org
,yyyymm
,period
FROM old_table t,
(SELECT @row := 0) r
where yyyymm = '201203'
and period = '1m'
order by rank desc limit 10;

count caseで月次統計クエリー、タイトル付きでCSV出力


SELECT 'Product_ID', 'Product_Name', 'Total', 'Jan', 'Feb',... //csvのタイトルを出力
UNION
SELECT product_id,
product_name,
Count(*), //合計
Count(CASE
WHEN RIGHT(yyyymm, 2) = '01' THEN 1
END) AS 'Jan', //1月の合計
Count(CASE
WHEN RIGHT(yyyymm, 2) = '02' THEN 1
END) AS 'Feb', //2月の合計
...
...
FROM sales_table
GROUP BY product_id
into outfile 'c:\\prod_monthly.csv' FIELDS TERMINATED BY ',';//csvに出力

2012年9月21日金曜日

住所をマッピングする為に、mysqlのLEFTとINSTRで関数で住所の検索キーを生成

まずは町、区、市、郡まで切り捨て

ALTER TABLE company_nikkei ADD shi_addr_key VARCHAR( 255 ) NULL;
UPDATE company_nikkei SET shi_addr_key =
LEFT(address,CASE
WHEN INSTR(address,'町') <> 0 THEN INSTR(address,'町')
WHEN INSTR(address,'区') <> 0 THEN INSTR(address,'区')
WHEN INSTR(address,'市') <> 0 THEN INSTR(address,'市')
WHEN INSTR(address,'郡') <> 0 THEN INSTR(address,'郡')
END);

そして、もっと大雑把、都道府県

ALTER TABLE company_nikkei ADD to_addr_key VARCHAR( 255 ) NULL;
UPDATE company_nikkei SET to_addr_key = CASE WHEN INSTR(address,'東京都') <> 0 THEN '東京都'
WHEN INSTR(address,'北海道') <> 0 THEN '北海道'
WHEN INSTR(address,'大阪府') <> 0 THEN '大阪府'
WHEN INSTR(address,'京都府') <> 0 THEN '京都府'
WHEN INSTR(address,'県') <> 0 THEN LEFT(address,INSTR(address,'県'))
WHEN INSTR(address,'市') <> 0 THEN LEFT(address,INSTR(address,'市'))
ELSE '不明' END;

DBのエンコードはUTF8だけど、データ自体のエンコードはsjisになっている。
windowsのコマンドプロンプトからmysqlのコンソールにアクセスしているので、
上記クエリーを投げでもなぜかうまくいかない...

ここですごい人に見てもらって、どうもコマンドプロンプトのエンコードのせいかも
コマンドプロンプトのエンコードを変えるコマンドchcp(change code page)

>chcp
現在のコード ページ: 932
> chcp 65001
↑UTF8

とにかく、DOSのコマンドプロンプトで2バイドのものは書かないで
phpmyadminやnavicatなどSQLクライアントを使いましょう。

2012年9月18日火曜日

ついに僕もSSDデビュー

秋葉原からIntelSSD(120G)購入、8000円くらいでした。
セットアップに一苦労…
グラフィックカードが大きい過ぎで、唯一開いているSATAを完全隠した。
幸いファンのあたりだったので、無理やりグラボに穴を貫通してSSDのSATAケーブルを通した。
あとはマンターをつけて、固定しました。

物理繋いたら、あとはCドライブの移行です。
移行作業は割りと簡単、Intelの専用ソフトがあったので、ソース(既存Cドライブ)とターゲット(SSD)を選択して、「次へ」⇒再起動。そしてデータのコピーが終わったらシャットダウンして、SATAケーブルの差し替えを行う。

ここで説明書ではSWAPと書いてますが、実はここで差し替えたらドライブレターが乱れることがありますので、元CドライブのSATAケーブルをSSDに接続したら、一旦元CドライブHDDをOFFLINEにしたほうがいいです。
そしてWindowsを起動して、ちゃんとSSDがCドライブになっているを確認したら、再度PCをシャットダウンして、元CドライブのHDDもONLINEさせて、起動すると、ドライブレターがちゃんと変わります。

まぁメモメモ

PS:肝心なBOOTスピードは…まぁ驚く程のスピード感は感じ取れなかったが、実際いろいろ使ってみたら、確かに以前より3,4割早くなっている体感。まぁまぁ8000円だから、良かったと思う!

2012年9月16日日曜日

vb,vbaの(仮)非同期実行方法??

for i = 0 to 9999
  DoEvents
next
DoEventsはcupビジー時でもユーザのインプットに対してUIを反応させることができるらしい
ここでは詳しく書いています、ありがとうございました。

2012年9月6日木曜日

mysqlのload data infile

一般的にCSVファイルをmysqlコンソルで直接流し込む...

csvの中身はこんな感じ:
10000031,"ああああ",""
10000041,"いいいい",""
10000050,"うううう","おおおお"
10000130,"ささささ","しししし"
文字コードはsjisで、改行コードはCRLF

流しこむコマンド:
mysql> set character_set_database=sjis;
mysql> LOAD DATA INFILE "C:\\Documents and Settings\\username\\data.csv" INTO TABLE my_table FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n' STARTING BY '';

LINES TERMINATED追加しないとおかしいことになる。

2012年9月5日水曜日

vba条件書式の罠

現象:vbaで条件書式を追加したら、訳がわからない条件が追加される、Excel2007
下のコードで「C1」セルに、自分自身がエラーの場合、背景色を変える条件書式を追加したところ
Sub test()
    Sheet1.Range("C1").FormatConditions.Delete
    Sheet1.Range("C1").FormatConditions.Add Type:=xlExpression, Formula1:="=ISERROR(C1)"
    Sheet1.Range("C1").FormatConditions(1).Interior.ColorIndex = 38
End Sub
実行後、出来た数式を見てみると、なんだこりゃ~?!「ISERROR(C1)」と指定したのに、「XFD1」とはなんだ?!!



試しに絶対参照の「ISERROR($C$1)」にしてみたら、治った(当たり前だ)。でも絶対参照だとソートとかしたら大変なことになるので...
まぁ、最後はこうして治ったけど、なんか腑に落ちないな~
Sub test()
    Sheet1.Activate
    Sheet1.Range("C1").Select
    Sheet1.Range("C1").FormatConditions.Delete
    Sheet1.Range("C1").FormatConditions.Add Type:=xlExpression, Formula1:="=ISERROR(C1)"
    Sheet1.Range("C1").FormatConditions(1).Interior.ColorIndex = 38
End Sub

2012年9月2日日曜日

google spreadsheetsで乱数キーを生成する関数

下記のコードをスクリプトエディタで追加して
function randString(cb) {
  var rgch = "abcdefghijklmnopqrstuvwxyz";
  rgch = rgch.toUpperCase() + "0123456789";
  var tmpString = "";
  for (var i = 1; i <= cb; i++) {
    var startPos = Math.ceil((Math.random() * rgch.length));
    tmpString = tmpString + rgch.substring(startPos, startPos + 1);
  }
  return tmpString;
}

function genKey(cn) {
  var keys = [];
  for (var i = 0; i <= cn - 1; i++) {
    keys.push(randString(4));
  }
  return keys.join("-");
}
スプレッドシートで数式を入れると、乱数生成のキーが生成される。

2012年8月21日火曜日

excelの数値format

内容 指定文字
表示する桁数を指定する。"0"1つで1桁を表し、それより桁数が少ない数値の場合は"0"で埋められる。 0 Format(12345,"0000000") → 0012345

Format(12345,"000") → 12345
表示する桁数を指定する。"#"1つで1桁を表し、それより桁数が少ない数値の場合は元の数値がそのまま返される。 # Format(12345,"#######") → 12345

Format(12345,"###") → 12345
0や"#"と組み合わせて小数点の位置を指定する。 . Format(12345.567,"0000000.00") → 0012345.57

Format(12345.567,"0000000.00000") → 0012345.56700

Format(12345.567,"#######.##") → 12345.57

Format(12345.567,"#.#####") → 12345.567
0や"#"と組み合わせて1000ごとにカンマで区切る。 , Format(12345,"0,000,000") → 0,012,345

Format(12345,"#,###") → 12,345
数値を100倍してパーセント表示する。 % Format(0.25,"#%") → 25%
数値の先頭に¥マークを付ける。 \\ Format(12345,"\\#,###") → \12,345
このマークのすぐ後1文字をそのまま表示する。 \ Format(12345,"\@#,###") → @12,345

Format(12345.56,"0.000\円/\ケ") → 12345.560円/ケ
ダブルクォーテーションで囲まれた文字列はそのまま表示する。

Format(12345,"#,###""です""") → 12,345です

2012年8月17日金曜日

sql、カレンダー作成

2010/4/1から2012/5/31までのカレンダーを作成


Declare @date table(d datetime)
Declare @d datetime

set @d='20100401'

While @d<='20120531'
Begin
Insert into @date values (@d)
set @d=@d+1
End
Select d as date_ymd into calendar from @date

エクセルでデータベースを参照するサンプル、SQL ServerとmySQL対応

シート1の名前を「"テーブル一覧"」にして、ボタンを追加する
そして、I列の1から5行目、下記の情報を入れる
サーバー
DB名
ユーザ
パスワード
接続DBタイプ["SQL Server","MySQL ODBC 5.1 DRIVER"]
※今のところ、MS SQL Serverとmysqlしか対応していない
シート"テーブル一覧"は
Private Sub CommandButton1_Click()
 Call getTables
End Sub

Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink)
    'MsgBox Target.TextToDisplay
    getTableData Target.TextToDisplay
End Sub

モジュールに下記のコード
Public con As ADODB.Connection
Public wb As Workbook
Public st As Worksheet
Public gDB As String
Public gConDriver As String
Dim connectionString As String


Sub initDBcon()


Set wb = ThisWorkbook
Set st = wb.Worksheets("テーブル一覧")
'接続文字列
gConDriver = st.Range("I5")


Select Case gConDriver
    Case "SQL Server"
        connectionString = "Provider=Sqloledb;" _
                & " Data Source=" & st.Range("I1") & ";" _
                & " Initial Catalog=" & st.Range("I2") & ";" _
                & " Connect Timeout=15;" _
                & " user id=" & st.Range("I3") & ";" _
                & " password=" & st.Range("I4")
    Case "MySQL ODBC 5.1 DRIVER"
        connectionString = "Driver={" & gConDriver & "};" _
                & " SERVER=" & st.Range("I1") & ";" _
                & " DATABASE=" & st.Range("I2") & ";" _
                & " USER=" & st.Range("I3") & ";" _
                & " PASSWORD=" & st.Range("I4") & ";"
End Select

gDB = st.Range("I2")

'ADODB.Connection生成
Set con = New ADODB.Connection
On Error GoTo Err

'MySQLに接続
con.Open connectionString
Exit Sub
Err:
    Set con = Nothing
    MsgBox (Err.Description)

End Sub
Sub getTables()

Dim rs As ADODB.Recordset


Dim sqlStr As String

Dim rowNo As Integer
Dim colNo As Integer
Dim item As Variant


Call initDBcon
If con Is Nothing Then
    Exit Sub
End If
Application.DisplayAlerts = False
For Each stname In wb.Sheets
    If stname.Name <> "テーブル一覧" Then
        stname.Delete
    End If
Next
Application.DisplayAlerts = True

'SQL文
Select Case gConDriver
    Case "SQL Server"
        sqlStr = "select table_name from information_schema.tables;"
    Case "MySQL ODBC 5.1 DRIVER"
        sqlStr = "show tables;"
End Select


'SQL文実行
Set rs = con.Execute(sqlStr)

'シートデータクリア
'st.Cells.Clear
st.Columns("A:A").Clear
rowNo = 1
Do While rs.EOF = False
    'データ抽出
    For Each item In rs.Fields
        st.Range("A" & rowNo).Value = item.Value
        st.Range("A" & rowNo).Hyperlinks.Add Anchor:=st.Range("A" & rowNo), _
        Address:="", TextToDisplay:=item.Value
    Next
    rowNo = rowNo + 1
    '次のレコード
    rs.MoveNext
Loop

'クローズ
con.Close
Set rs = Nothing
Set con = Nothing

Exit Sub


End Sub

Sub getTableData(ByVal srtTableName As String)
Dim stname As Variant
Dim qt As QueryTable

Call initDBcon
    For Each stname In wb.Sheets
        If stname.Name = srtTableName Then
            Exit Sub
        End If
    Next
    wb.Worksheets.Add(After:=wb.Worksheets(wb.Worksheets.Count)).Name = srtTableName
    
On Error GoTo Err
Select Case gConDriver
Case "MySQL ODBC 5.1 DRIVER"
    With wb.Worksheets(srtTableName).ListObjects.Add(SourceType:=xlSrcExternal, Source:=Array(Array( _
        "ODBC;" & connectionString), Array("E=db35211_CustomerMasterList;DefaultTable=Customers;")), _
        Destination:=wb.Sheets(srtTableName).Range("$A$1")).QueryTable
        .CommandText = Array("Select * FROM " & srtTableName)
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .PreserveColumnInfo = True
        .ListObject.DisplayName = "テーブル_" & gDB & "_" & srtTableName
        .Refresh BackgroundQuery:=False
    End With
Case "SQL Server"
    With wb.Worksheets(srtTableName).ListObjects.Add(SourceType:=xlSrcExternal, Source:=Array( _
        "OLEDB;" & connectionString), Destination:=wb.Sheets(srtTableName).Range("$A$1")).QueryTable
        .CommandType = xlCmdTable
        .CommandText = Array("""" & gDB & """.""dbo"".""" & srtTableName & """")
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .PreserveColumnInfo = True
        .ListObject.DisplayName = "テーブル_" & gDB & "_" & srtTableName
        .Refresh BackgroundQuery:=False
    End With
End Select
    Exit Sub
    
Err:
    Set con = Nothing
    MsgBox (Err.Description)

End Sub

2012年8月15日水曜日

あるセルにとって、最終行、列を返す

'rgStart 単一セル
'horv 縦か横か、デフォルト縦
'戻り値
'  縦の場合 0→エラー
'  横の場合 ""→エラー
Public Function getBounce(ByRef rgStart As Range, Optional ByVal horv As String = "V") As String
Dim blnVertical As Boolean
Dim rgBounce As Range
    blnVertical = IIf(UCase(horv) = "H", False, True)
    If blnVertical Then
        Set rgBounce = rgStart.Worksheet.Range(ConvertToLetter(rgStart.Column) & rgStart.Worksheet.Rows.Count).End(xlUp)
        If rgStart.Cells.Count > 1 Then
            getBounce = IIf(blnVertical, 0, "")
            Exit Function
        End If
        If rgStart.Value = "" And rgBounce.Row <= rgStart.Row Then
            getBounce = 0
        Else
            getBounce = rgBounce.Row
        End If
        Exit Function
    Else
        Set rgBounce = rgStart.Worksheet.Range(ConvertToLetter(rgStart.Worksheet.Columns.Count) & rgStart.Row).End(xlToLeft)
        If rgStart.Value = "" And rgBounce.Column <= rgStart.Column Then
            getBounce = ""
        Else
            getBounce = ConvertToLetter(rgBounce.Column)
        End If
        Exit Function
    End If
    
End Function


Function ConvertToLetter(iCol As Integer) As String
    ConvertToLetter = Split(Cells(1, iCol).Address, "$")(1)
End Function

大量データのCSVをソート方法

Excelのソート機能を使う方法
Dim wb As New Workbook
    Dim st As New Worksheet
    Dim sortField As Range
    Dim rg As Range

    'csvファイルを開く
    Set wb = Workbooks.Open("c:\abc.csv")

    'シートをセット(csvファイルはsheet1しかない)
    Set st = wb.Sheets(1)
    
    For Each rg In st.Range("1:1")
        If rg = "容器番号" Then 'ソートする列を探す
            Set sortField = rg
            Exit For
        End If
    Next
    'ソート(容器番号)
    st.UsedRange.Sort Key1:=sortField, Order1:=xlAscending, Header:=xlYes, _
        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _
        :=xlPinYin

大量のデータの時、65535行(excel2007以下),100万?を超えた時
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset

    Set cn = New ADODB.Connection
    cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                    "Data Source='c:\';" & _
                    "Extended Properties='Text;HDR=YES'"
    'c:\abc.csvというファイルをデータベーステーブルとして開く、「容器番号」という列を昇順でソート                
    Set rs = cn.Execute("SELECT * FROM abc.csv ORDER BY clng(容器番号) ASC")
    
    Do Until rs.EOF

       'データを書き出しなどの処理
       '...

       rs.MoveNext
    Loop
"HDR=YES"は最初の行はタイトルという意味。

ちなみに、下の順番にならないためには、

1
10
2
3
...

クエリーをこのようにclng関数を使う

SELECT * FROM abc.csv ORDER BY clng(容器番号) ASC

sqlではcastやconvertなど使いますが、Microsoft.Jet.OLEDB(Access)ではclngなどで文字列を数字に変換する

Excelのソートの話

Excel2007のソート
ActiveWorkbook.Worksheets("201210期").Sort.SortFields.Clear
    Worksheets("201210期").Sort.SortFields.Add Key:=Worksheets("201210期").Range("B4"), _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    With Worksheets("201210期").Sort
        .SetRange Worksheets("201210期").Range("A5:CO90")
        .Header = xlNo
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
Range("B4")→並び替え列
Order:=xlAscending→昇順、xlDescending降順
.SetRange Range("A5:CO90")→並び替え範囲
.Header = xlNo→ヘッダーありなし(xlYes,xlNo)、xlGuessの利用は避けたほうが無難。

Excel XP(2002)のソート
Worksheets("201210期").Range("A5:CO90").Sort Key1:=Worksheets("201210期").Range("B4"), Order1:=xlAscending, Header:=xlNo, _
        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, SortMethod _
        :=xlPinYin
Excelは下位互換ですので、XPも2007も2010も使えるためには、excel xpのコードで実装したほうが無難

2012年8月2日木曜日

ランダム数字のcsvを作成するツール

固定でc:\abc.csvです
Sub csvRnd()
Dim txt As Integer
Dim lngidx As Long
Dim lngStart As Long
Dim lngEnd As Long

txt = FreeFile
Open "c:\abc.csv" For Output As #txt
Write #txt, "ID", "Name"

lngStart = 1
lngEnd = 120000
For lngidx = lngStart To lngEnd
    Write #txt, lngidx, Int((lngEnd - lngStart + 1) * Rnd + lngStart)
    
Next
Close #txt
MsgBox "completed!", vbInformation
End Sub

2012年7月27日金曜日

google apps engineでカスタマドメインいろいろメモ

ややこしくて、箇条書きでメモしていく
前提:
・有料はgoogle apps for businessサービスを利用している「abc.com」とします
・管理画面から「abc.com」の「google apps engine」(GAE)を開通
・GAEで「xyz-jp.appspot.com」というappを作成、URLはhttp://xyz-jp.appspot.comです
・ドメイン「xyz.com」をお名前.comから購入

やりたいこと:
・「xyz.com」をGAEのURLにする
・無料でやること


最初やったこと:
・DNSで「www」ホストで、タイプ「CNAME」で、値を「xyz-jp.sppspot.com」にしてみたが、「www.xyz.com」を叩くとgoogle.comのトップ画面に飛んでしまう、そう簡単ではないはず、GAEは登録されていないドメインに飛ばせない仕組みになっているみたい。

次考えた手は:
・「abc.com」のgoogle appsドメイン管理画面で、xyz.comを追加し
・指定のキーをDNSでTXTレコードとして登録し、xyz.comを所有していることを証明(浸透結構時間かかった)
 →nslookup -type=TXT xyz.comでキー登録されたがどうかを確認できる
・ここで一つビックリしたことを判明、有料ドメインabc.comにxyz.comを登録したら、xyz.comも有料になります!!!つまり、xyz.comでユーザを作成にはabc.comのライセンスを使うことになります!
 →google appsは10アカウント以下なら無料で使えるはずです。

解決1(結局ダメでした)方法と経緯:
・abc.comに1ライセンス余っているから、xyz.comの管理者「root@xyz.com」を取り敢えず作成して、管理画面からxyz.comを有料プランから無料プランに変更(できるかできないかやってみないと分からない)
・しかし、ユーザは作成したが、管理者にはならず、xyz.comの管理画面に入れない
・abc.comの管理画面からなんと「root@xyz.com」というユーザが見えない!ライセンスは使った状態でした。
・ここで止まった、カスタムサービスに電話した

解決2:
・カスタムサービスのお姉ちゃんによると、xyz.comは有料abc.comドメインの追加されて、xyz.comも有料扱い
・xyz.comはabc.comに属しているので、abc.comの管理画面では普通にxyz.comのユーザ見えて、管理できるはず
・しかし、見えないのはもしかしてバグ?
・お姉ちゃんにヒントもらって、アカウント検索で「root@xyz.com」を検索したらちゃんと出てきて、削除した
・abc.comからxyz.comを削除した
・再度普通のgoogle appsからxyz.comを追加、所有権を証明→xyz.com無料でgoogle apps利用できる状況に
・abc.comのGAE「xyz-jp.appspot.com」のapplication settingに「add domain」して「xyz.com」を追加
・「xyz.com」のgoogle apps登録画面が表示され、利用契約を同意して、DNSでホストに「www」を追加し、タイプ「CNAME」にしてで、値として「ghs.googlehosted.com」を登録
・浸透して、www.xyz.comをアクセスするとちゃんと表示された...
・ふーーっ!

感想:
1.有料GAにドメイン追加したら、そのドメインのGAも無条件に有料になる
2.GAのユーザ管理画面にバグがあった、アカウントが表示されないときは、検索してみて
3.今回はabc.comとxyz.com2つのドメインがあって、ややこしくなったけど、単一ドメインは簡単です

いやー、雑乱でゴメンナサイ...orz



2012年7月25日水曜日

再帰的(サブフォルダも含む)にあるディレクトリ配下のファイル一覧を取得、配列の結合(マージ)メッソドもセットで

バグがあったら、教えてくれるとありがたい
☆参照にscriptingは必要!☆
再帰的(サブフォルダも含む)にあるディレクトリ配下のファイル一覧を取得メッソド
Function ListUp(FolderSpec) As Variant

    Dim File_Collection As Object
    Dim File_List As Variant
    Dim Folder_Collection As Object
    Dim Folder_List As Variant
    Dim result As Variant
    Dim subResult As Variant
    Dim subResultAppend As Variant

    If Not CreateObject("Scripting.FileSystemObject").FolderExists(FolderSpec) Then
        ListUp = Empty
        Exit Function
    End If
    
    Set File_Collection = _
                     CreateObject("Scripting.FileSystemObject") _
                    .GetFolder(FolderSpec).Files
    

    For Each File_List In File_Collection
        push FolderSpec & "\" & File_List.Name, result
    Next
    
    Set Folder_Collection = _
                       CreateObject("Scripting.FileSystemObject") _
                      .GetFolder(FolderSpec).SubFolders
    
    For Each Folder_List In Folder_Collection
        subResultAppend = ListUp(FolderSpec & "\" & Folder_List.Name)
        subResult = ArrayMerge(subResultAppend, subResult, True)
    Next
    
    ListUp = ArrayMerge(subResult, result)
End Function
配列最後に要素を追加していくメッソド
'this is a function to push an element into an array
Public Function push(ByVal val As Variant, ByRef arr As Variant) As Integer
    If IsArray(arr) Then
        ReDim Preserve arr(UBound(arr) + 1)
    Else
        ReDim arr(0)
    End If
    arr(UBound(arr)) = val
    push = UBound(arr)
End Function
配列を結合するメソッド、追加(ダブリチェックなし)とマージ(ダブリチェックあり)モードあり、最後の引数は結語した後に、元配列を消す設定
Public Function ArrayMerge(ByRef sourceArray As Variant, ByRef destArray As Variant, Optional appendMode As Boolean = False, Optional KillSource As Boolean = False) As Variant
Dim sDic As New Scripting.Dictionary
Dim v As Variant
Dim tempArray As Variant
Dim idx As Long

'片方だけなら、片方を返す
If (Not IsArray(sourceArray)) And (Not IsArray(destArray)) Then
    ArrayMerge = Null
    Exit Function
ElseIf Not IsArray(sourceArray) Then
    ArrayMerge = destArray
    Exit Function
ElseIf Not IsArray(destArray) Then
    ArrayMerge = sourceArray
    Exit Function
End If

'ダブリチェックしない、ただ追加していくモード
If appendMode Then
    ReDim tempArray(UBound(sourceArray) + UBound(destArray) + 1)
    idx = 0
    For Each v In sourceArray
        tempArray(idx) = v
        idx = idx + 1
    Next
    For Each v In destArray
        tempArray(idx) = v
        idx = idx + 1
    Next
'ダブリチェックする、Mergeモード。ないものだけ追加していくモード
Else
    idx = 0
    For Each v In sourceArray
        sDic.Add v, idx
        idx = idx + 1
    Next
    
    For Each v In destArray
        If Not sDic.Exists(v) Then
            sDic.Add v, idx
            idx = idx + 1
        End If
    Next
    tempArray = sDic.Keys
End If
If KillSource = True Then Erase sourceArray
ArrayMerge = tempArray
End Function
使い方はこう、"c:\windows"みたいな深すぎフォルダーは使わないほうがいいね、timeoutっぽい
dim fileList as Variant
fileList = ListUp("c:\your_path")

2012年7月23日月曜日

urlのパラメータを取得するfunction、デフォルト指定もある

<!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" />
        <meta http-equiv="Content-Language" content="ja" />
        <meta http-equiv="Content-Script-Type" content="text/javascript" />
        <meta http-equiv="Content-Style-Type" content="text/css" />
        <meta http-equiv="imagetoolbar" content="no" />
        <title>TEST</title>
        <!-- JS -->
        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
        <script type="text/javascript">
     function getQuerystring(key, default_)
     {
      if (default_==null) default_="";
      key = key.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
      var regex = new RegExp("[\\?&]"+key+"=([^&#]*)");
      var qs = regex.exec(window.location.href);
      if(qs == null)
       return default_;
      else
       return qs[1];
     }
     $(function(){
      alert(getQuerystring('msg', ''));
     });
        </script>
    </head>
    <body>
   http://localhost/phpbox/getQueryParam.html?msg=hello world!
    </body>
</html>
会社の友たちが書いてた、便利ですので、シェアする

2012年6月28日木曜日

Rを使ってみた


x <- c(1:5); y <- x # create some data
par(pch=22, col="red") # plotting symbol and color
par(mfrow=c(2,4)) # all plots on one page
opts = c("p","l","o","b","c","s","S","h")
for(i in 1:length(opts)){
    heading = paste("type=",opts[i])
    plot(x, y, type="n", main=heading)
    lines(x, y, type=opts[i])
}

実行後結果

SQL日付フォーマットの変換

SQL日付フォーマットの変換

[yyyyMMdd]
SELECT CONVERT(char(8), GETDATE(), 112);

[yyyyMM]
SELECT CONVERT(char(6), GETDATE(), 112);

[hhmmss]
SELECT REPLACE(CONVERT(varchar(8), GETDATE(), 8), ':', '');

[hhmmssfff]
SELECT REPLACE(CONVERT(varchar(12), GETDATE(),114), ':', '');

[次月yyyyMMdd]
SELECT CONVERT(char(8), DateAdd(Month, 1 , GETDATE()), 112);

引用、ありがとう!

crontabの設定

crontabの設定


>crontab -e
* * * * * 実行コマンド
- - - - -
| | | | |
| | | | +----- 曜日 (0 - 6) 日曜日は0
| | | +------- 月 (1 - 12)
| | +--------- 日 (1 - 31)
| +----------- 時間 (0 - 23)
+------------- 分 (0 - 59)



書き方 効果
43 23 * * * 23:43に実行
12 05 * * * 05:12に実行
0 17 * * * 17:00に実行
0 17 * * 1 毎週月曜の 17:00に実行
0,10 17 * * 0,2,3 毎週日,火,水曜の 17:00と 17:10に実行
0-10 17 1 * * 毎月 1日の 17:00から17:10まで 1分毎に実行
0 0 1,15 * 1 毎月 1日と 15日と 月曜日の 0:00に実行
42 4 1 * * 毎月 1日の 4:42分に実行
0 21 * * 1-6 月曜日から土曜まで 21:00に実行
0,10,20,30,40,50 * * * * 10分おきに実行
*/10 * * * * 10分おきに実行
* 1 * * * 1:00から 1:59まで 1分おきに実行
0 1 * * * 1:00に実行
0 */1 * * * 毎時 0分に 1時間おきに実行
0 * * * * 毎時 0分に 1時間おきに実行
2 8-20/3 * * * 8:02,11:02,14:02,17:02,20:02に実行
30 5 1,15 * * 1日と 15日の 5:30に実行

2012年6月25日月曜日

sql serverのinsert文では複数組valuesを対応しない

sql serverでは、複数insert文はできないことを知った_| ̄|● ガックリ
mysqlなら下のコードはすんなり行ったと思うが

insert into mytable (id,name,sex,age) values (1,'john','male',22),(2,'jane','female',21);

sql serverではinsert文を分けるしかないか

insert into mytable (id,name,sex,age) values (1,'john','male',22);
insert into mytable (id,name,sex,age) values (2,'jane','female',21);

まぁ関係ない関係ない.

2012年6月19日火曜日

centos 5.8(64bit) net install

centos 5.8(64bit) net install
first download net_install iso from
http://mirror.averse.net/centos/5.8/isos/x86_64/CentOS-5.8-x86_64-netinstall.iso

then install:
install method: http
web site:mirror.averse.net
centos path:/centos/5.8/os/x86_64/

2012年6月5日火曜日

mysqlでdate_formatを使ったら、日付が文字化けしてしまった、その対策

datetime型の項目なのに、なぜかdate_formatを使うと文字化けしてしまう、
状況として、DBはmysql、databaseのencodeはutf8、そしてOSのencodeはeuc
問題があったSQL

select date_format(a.as_of_date,""%Y%m%d"") as_of_date from tb1 where 1

解決策はこれ

select convert(date_format(a.as_of_date,""%Y%m%d"") using utf8) as_of_date from tb1 where 1

mysqlってややこしいね

2012年5月31日木曜日

スクリプトまたはコマンドラインでGoogleドライブにファイルをアップロードする

Javaの実行可能の環境は必要だ、まだの方はここからダウンロードしてインストールしてください。
そして、google-docs-uploadダウンロードします。
あとはコマンドラインで呼び出すだけだ、windows版

C:\>java -jar "C:\paht\to\google-docs-upload-1.4.7.jar" "c:\\test\\" --recursive --username "yourname@gmail.com" --password "password" --protocol https --skip-all --remote-folder "/test"

「google-docs-upload-1.4.7.jar」の1.4.7の部分はバージョンですから、ダウンロードしたバージョンに書き換えてください。
このコマンドはC直下のtestディレクトリをまること(再帰的に)googleドライブ(旧googleドキュメント)のtestフォルダにアップロードする。
ドライブ側testディレクトリがなければ作成されます。サブディレクトリもちゃんとそのままドライブ側で作成されます。また、あくまでc:\test以下のものを再帰的にドライブにアップロードするから、
ドライブ側では/test/test/...2重ディレクトリになっていない。

2012年5月22日火曜日

bloggerのファビコン(favicon)の設定方法が変わった

最近このブログのファビコンが表示されなくなった。
調べたら、原因はbloggerのfavicon設定方法が変わった...古いやり方はここ
専用のメニューができているらしい。この図で説明できるかと思う。

2012年5月14日月曜日

jquery mobileでanayticsのチャートを表示するサンプル

Google analytics for mobile using jQuery mobile and php | jqueryload.com
こんなのを発見したので、やってみた。
構造はシンプルで、2つファイルのみです。

gapi.class.php
index.php
ここからダウンロード
index.phpの一部を変更する
// CONFIG 
// Please complete this section before run the script

// this user and password is only for the application
$applicationUser="yourname";//ベーシック認証、コメントアウトしても問題ない
$applicationPassword="password";//ベーシック認証、コメントアウトしても問題ない

// analytics account information
$analyticsUser="yourusername@gmail.com";←anayticsのgmailアドレス
$analyticsPassword="password";←パスワード
$profileId="56997226"; //URLで確認できます、下の図を参照

// sites to add, could be more than one
// replace your site name and the "000000" values

//     site name    analytics ID
$site['kagen88.blogspot.com']='56997226';//profileIdと一緒?

//you can add more sites in the same screen.
//$site['jQueryLoad.com']='000000';
//$site['Hashake.com']='000000';

// end CONFIG
profileIdの確認方法

とにかくこうしたら表示しました。




もしこのようなエラーが起こったら

Fatal error: Uncaught exception 'Exception' with message 'GAPI: Failed to
authenticate user. Error: "Request failed, fopen provides no further
information"' in ...

php.iniの「extension=php_curl.dll」を有効にして、apacheを再起動すれば治るはず

androidのwifiがadhocに対応しない件(テザリングtethering)

最近、android端末2台持ちすることになりました。一台(L-04C)は定額950円のIIJmio、もう一台古い(ht-03a)です。二台ともroot済み。
L-04Cをディザリングすることになりました。
ディザリング(テザリングtethering)方法は簡単なので割愛する。いろいろアプリありますが、やっぱりWireless Tether for Root Usersが一番ですね。
しかしディザリングのwifiはadhoc、日本のandorid端末そのままではadhocのwifi対応していない。(そもそもwifiスキャンしても出てこない)
ネットで調べた、hackする方法が書いていたので、やってみました。要するにadhoc対策済みのwpa_supplicantを入れ替えて、再起動する。
adhoc対策済みwpa_supplicantはここからダウンロード※ダウンロードしたら解凍してね。

まずは下記ステップを済ませよう
①android-sdkをインストール済み、SDKの中にplatform-toolsもインストール済み
②携帯をUSBケーブルでPCに繋き、ドライバもインストール済み
③rootを取得済み
④先程ダウンロードしたadhoc対策済みwpa_supplicantをSDカードに入れる

それではいよいよwpa_supplicantの改造:
cmdでDOSコンソールを起動して、例えば

cd D:\android-sdk-windows\platform-tools →もしこのフォルダーがなければ、多分platform-toolsがまだインストールされていない。
D:\android-sdk-windows\platform-tools>adb shell
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
$ su →Rootになる、ここで、携帯権限を与えるメッセージが出るので、許可してあげて下さい。
su
#  →「#」が出たらオッケー
# cd /sdcard/hack ←さっき作ったhackフォルダーへ移動。
# ls -l ←対策済みwpa_supplicantファイルを確認する
----rw-rw- system system 235788 2010-08-14 18:17 wpa_supplicant
# ls -l /system/bin/wpa* →現在のファイルを確認
----rw-rw- system system 306040 2012-05-11 01:41 wpa_supplicant
# mount -o rw,remount -t yaffs2 /dev/block/mtdblock3 /system →書き込め権限を開放する
# busybox cp /system/bin/wpa_supplicant /sdcard/hack/wpa_supplicant.org →現在の設定ファイルをバックアップ
(一般では、「busybox cp」では普通にコピーしてくれるはずが、ht03aのbusyboxが古かったせいか、busyboxのcpコマンド反応がないので、仕方なく下記のコマンドを使った)
(#cat /system/bin/wpa_supplicant > /sdcard/hack/wpa_supplicant.org)
# rm /system/bin/wpa_supplicant →バックアップとったら、現在の設定ファイルを削除する
# busybox cp /sdcard/hack/wpa_supplicant /system/bin/ →adhoc対応済み設定ファイルを差し替え
(busyboxダメなら #cat /sdcard/hack/wpa_supplicant > /system/bin/wpa_supplicant)
# chmod 775 /system/bin/wpa_supplicant →権限を与える
#reboot →携帯を再起動したら、ディザリングのadhoc wifiをスキャンできるはず、何かおかしくなったら、バックアップしたwpa_supplicantを元に戻して、再起動すれば治るはず。



追加
最近中華パットを買いました、ainolの精霊2、とっても快適でした。
早速「刷機」しまして、rootをとって、adhocも対応させました。
①「刷機」はここ、http://www.ainol.com/plugin.php?identifier=ainol&module=download&action=info&downloadid=103基本言われたことをやればできる。
一つメモしたいことは、音量減キーを押しながら、電源キーを長押しすれば、Wipe画面に入ります、そこからは音量減キーが移動キーで、音量増キーは確定キーです。
②root取るもここです。http://bbs.ainol.com/forum.php?mod=viewthread&tid=5083
③adhocの対応はここです。http://bbs.ainol.com/forum.php?mod=viewthread&tid=6643&extra=page%3D1、Android Terminal Emulatorでコンソールからやるのがおすすめです。wpa_supplicantはここからダウンロードするhttp://bbs.ainol.com/forum.php?mod=viewthread&tid=6643、上書きするときに「read-only file system」とか言われたら、

$su
#mount -o rw,remount rootfs /system/

あとはダウンロードや解凍するときに、不完全なファイルができてしまう可能性はあるので、一回でダメだったら、もう一回wpa_supplicantダウンロードからやり直したほうがいいかも、自分はそこでちょっとハマった。

2012年5月3日木曜日

グーグルスクリプトエディタ

現象:
google script editorでプロジェクトを削除できないことがあります。
「削除」ボタンを押してもなにも反応ないままです、これはバグでしょうか。
対策:
削除したいプロジェクトのソースコードを全部削除して保存する、
そしてプロジェクトが削除できるようになるらしい。

2012年4月30日月曜日

javascriptで現在時刻をyyyymmddhhiissで表示

function getNow(){
  nowtime = new Date();
  yy = nowtime.getYear();
  mm = nowtime.getMonth() + 1;
  dd = nowtime.getDate();
  hh = nowtime.getHours();
  if(hh < 10){hh = "0" + hh;}
  ii = nowtime.getMinutes();
  if(ii < 10){ii = "0" + ii;}
  ss = nowtime.getSeconds();
  if(ss < 10){ss = "0" + ss;}
  if (yy < 2000) { yy += 1900; }
  if (mm < 10) { mm = "0" + mm; }
  if (dd < 10) { dd = "0" + dd; }
    return (yy + "/" + mm + "/" + dd + " " + hh + ":" + ii + ":" + ss);
}
document.write(getNow());
loading...

2012年4月22日日曜日

googleスプレットシートをデータベースとして利用したカウンター







0

Gmailから他のGoogle Appsアカウントを追加

① まずは追加したいアカウントの「設定」→「メール転送と POP/IMAP」→「POP ダウンロード」からPOPを有効にする
② 追加先のGmailアカウントの「設定」→「アカウントとインポート」→「自分の POP3 メール アカウントを追加」
③ メールアドレス入力して、最後はPOPの設定、そして保存。

andoridで使っているメールクライアントk9mailは、なぜかpop方式がうまくいかないみたい、imapを使うしかありません(for businessと無料版は一緒みたい):
POP受信設定
POP サーバー: pop.gmail.com
セキュリティの種類: SSL(常に使用)
アカウント:yourname@yourdomain.com
パスワード:*********
認証タイプ:PLAIN
ポート:995

IMAP受信設定
IMAP サーバー: imap.gmail.com
セキュリティの種類: SSL(常に使用)
アカウント:yourname@yourdomain.com
パスワード:*********
認証タイプ:PLAIN
ポート: 993

SMTP送信設定
SMTP サーバー: smtp.gmail.com
セキュリティの種類: SSL(常に使用)
認証必要
アカウント:yourname@yourdomain.com
パスワード:*********
セキュリティ設定:AUTOMATIC
ポート: 465

ちなみに、k9mailのアカウント削除は「拡張機能」のなかにあった、探すのが時間かかった…
以上。

有料なgoogle apps for businessから無料なgoogle appsにダウングレード

間違ってgoogle apps for businessを申し込んでしまったら、使用期30日以内、利用者アカウントが10人未満なら、簡単に無料版に切り替えるらしい。
「ドメイン設定」→「登録と請求」で上記条件を満たしていれば、「Google Apps for Business をキャンセル」というリンクが表示されます。googleっていいやつだね orz


2012年4月21日土曜日

フォームからPOSTし、googleスプレットシートを更新するサンプル

ここを参考した、ありがとう御座いました。
つまり、googleスプレットシートをデータベースのように利用する。

① まず、googleドキュメントでスプレットシートを新規作成、シート名を"DATA"に変更する
② ツール → Script Editorを開け、このサイトからスクリプトをコピペする
③ スクリプトのfunction名「doGet」を「doPost」に変更して、保存、プロジェクト名は任意
④ 関数選択で「setUp」を選択し、実行、ポップアップした「Authorization required」にAuthorizeし、完了メッセージのページが表示される
⑤ もう一回「setUp」を実行、今回は何も表示しない
⑥ 「公開」→「サービスとして公開」、ポップアップ窓で、「Allow anyone to invoke this service」、「Allow anonymous access」、「Enable Service」をチェック、URLをコピー(重要)、最後「保存」
⑦ スプレットシートに戻って、A,B,C列の一行目に「name」、「age」、「sex」を入力
⑧ そしてHTMLを作る、UTF8で編集してね
<html>
<head>
<title>GoogleスプレットシートAPIテスト</title>
<script type="text/javascript">
<!--
function validateForm(){
  if(document.getElementById("name_input").value==""){
    alert("なんか書いてくださいよ!");
    return false;
  }else{
    document.getElementById("formID").submit();
    document.getElementById("thankyou").style.display="";
    document.getElementById("thankyou").innerHTML="登録ありがとう御座いました!";
    document.getElementById("formID").style.display="none";
  }
}
-->
</script>
</head>
<body>
<div style="display:none;" id="thankyou"></div>
<iframe src="#" id="fake-target" name="fake-target" style="width:0px; height:0px; border:0px;">
</iframe>
<form id="formID" action="https://docs.google.com/macros/exec?service=AKfycbzzoShgn4aUhFE4HLhUk2c41OCsMX8GOBru-nep" method="post" target="fake-target">
名前:<input type="text" name="name" id="name_input"/>
年齢:
<select name="age" id="age_input">
<option value="10">10歳</option>
<option value="20">20歳</option>
<option value="30">30歳</option>
<option value="40">40歳</option>
<option value="50">50歳</option>
</select>
性別:
<input type="radio" name="sex" id="sex_m" value="male" />男
<input type="radio" name="sex" id="sex_f" value="female" />女
<button onClick="javascript:validateForm();">送信</button>
</form>
</body>
</html>
⑨ ここのinputエレメントのname属性はそれそれスプレットシートに対応していますよ

スプレットシートのURL、登録後、確認してみてください。
https://docs.google.com/spreadsheet/ccc?key=0Akp-AdfTe-rCdE4weUFsMU1BUWlKMkNLLXBDQ2hiSGc

デモ、実際やってみてください!
名前:
年齢:
性別:

2012年4月17日火曜日

Google Docs スプレットシートAPIテスト

<html>
<head>
<title>GoogleスプレットシートAPIテスト</title>
</head>
<body>
<div id="data"></div>
<script type="text/javascript">
<!--
 function drawTable(json)
{
  var table = document.createElement('table');
  table.setAttribute('id', 'output');
  var tbody = document.createElement('tbody');
  
  var tr;
  for (var i=0; i < json.feed.entry.length; i++) {

    var entry = json.feed.entry[i];
    if (entry.gs$cell.col == '1') {
      if (tr != null) {
        tbody.appendChild(tr);
      }

      tr = document.createElement('tr');
    }
    
    var td = document.createElement('td');
    td.appendChild(document.createTextNode(entry.content.$t));
    tr.appendChild(td);
  }
  tbody.appendChild(tr);
  table.appendChild(tbody);
  document.getElementById('data').appendChild(table);
}
-->
</script>
<script type="text/javascript" src="https://spreadsheets.google.com/feeds/cells/0Akp-AdfTe-rCdDZEN2ZIWFMyMWhCV2dsRlkxb1N6bGc/od6/public/values?alt=json-in-script&callback=drawTable"></script>

</body>
基本ここのパクリが、時間あったらもうちょっと遊んでみる
Google Docsの公開URLは
https://docs.google.com/spreadsheet/ccc?key=0Akp-AdfTe-rCdDZEN2ZIWFMyMWhCV2dsRlkxb1N6bGc
一般公開しているので、変なこと書き込まないでいただきたいm(_ _)m

結果はこれ:2011年世界GDP順位だそうです




Google Spreadsheets API

2012年4月4日水曜日

凄すぎるcssのみで綺麗カッコイイボタンが作れちゃうオンラインツール

http://www.cssbutton.me/←ここです、マジいい、使える。
こんなのが作れちゃう、cssだけで!
※IEはダメだけど…どうでもいいけど…

発射

押して!
.sexybutton {
    background: -webkit-gradient(linear, left top, left bottom, color-stop(23%,#f20505), color-stop(100%,#cf0606));
    background: -moz-linear-gradient(center top, #f20505 23%, #cf0606 100%);
    -webkit-box-shadow: 2px 3px 4px #2b2b2b;
    -moz-box-shadow: 2px 3px 4px #2b2b2b;
    box-shadow: 2px 3px 4px #2b2b2b;
    -webkit-border-radius: 4px;
    -moz-border-radius: 4px;
    border-radius: 4px;
    padding: 10px 10px;
    margin: 5px 5px;
    border-color: #cde2fc;
    border-width: 1px;
    border-style: solid;
    font-weight: bold;
    width: 150px;
    height: 20px;
    text-align: center;
    vertical-align: middle;
    color: #FFFFFF
}


Google



2012年3月28日水曜日

vbaを使ってwebページを取り込むサンプル

Sub readUrl()

    Dim url As String
    Dim mySheet As String
    
    url = "http://typhoon.yahoo.co.jp/weather/jp/earthquake/list/"
    ActiveSheet.Range("A1").Select

    With ActiveSheet.QueryTables.Add(Connection:="URL;" & url, Destination:=ActiveSheet.Range("A1"))
        .Name = "test"
        .FieldNames = True
        .RowNumbers = False
        .Refresh BackgroundQuery:=False
        .RefreshPeriod = 0
        .RefreshOnFileOpen = False
        .PreserveFormatting = True
        .AdjustColumnWidth = True
        .FillAdjacentFormulas = False
        .RefreshStyle = xlInsertEntireRows
        .SavePassword = False
        .SaveData = True
        .WebSelectionType = xlAllTables
        .WebFormatting = xlWebFormattingNone
        .WebPreFormattedTextToColumns = True
        .WebConsecutiveDelimitersAsOne = True
        .WebSingleBlockTextImport = False
        .WebDisableDateRecognition = False
        .WebDisableRedirections = True
        .Refresh
        .Parent.Names(.Name).Delete
    End With
    
End Sub

2012年3月25日日曜日

amchartのamstockとRuby on Railsでファンドの基準価額を描画する、

javascriptベースのamchartではなく一つ古いのflash版でやりました。http://www.amcharts.com/

amchartに食わせるデータは基本2つ:
①チャートの設定ファイル、よくあるのはsettings.xml
②データファイル、xml,csv,jsonなど対応して、実際の描画用のデータが渡される。
※データファイルが設定ファイルの中にインクルードされる方法と、設定ファイルの中に直接データを書き出し(データファイルが無くでもいける)

今回はsetting.xmlを固定ファイルにして、データだけrailsで動的に生成するやり方で作った

setting.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- Only the settings with values not equal to defaults are in this file. If you want to see the
full list of available settings, check the amstock_settings.xml file in the amstock folder. -->
<settings>
  <margins>0</margins>
  <text_size>10</text_size>

  <number_format>
    <letters>
       <letter number="1000">千</letter>
       <letter number="1000000">百万</letter>
       <letter number="1000000000">億</letter>
    </letters>
  </number_format>

  <date_formats>
    <x_axis>
      <days>MM/DD</days>
      <months>MM</months>
    </x_axis>
    <legend>
      <days>YYYY/MM/DD</days>
      <weeks>YYYY/MM/DD</weeks>
      <months>YYYY/MM/DD</months>
    </legend>
  </date_formats>
  
  <data_sets>
    
    <data_set did="0">
       <title>ファンドA</title>
       <color>FF0000</color>
       <file_name>../../fund/search/data/123</file_name>
       <main_drop_down selected="true"></main_drop_down>
       <csv>
         <reverse>true</reverse>
         <separator>,</separator>
         <date_format>YYYY-MM-DD</date_format>
         <decimal_separator>.</decimal_separator>
         <columns>
           <column>date</column>
           <column>close</column>
         </columns>
       </csv>
    </data_set>

    <data_set did="1">
       <title>ファンドB</title>
       <color>FF00BB</color>
       <short>[ぶどうの実]</short>
       <file_name>../../fund/search/data/456</file_name>
       <csv>
         <reverse>true</reverse>
         <separator>,</separator>
         <date_format>YYYY-MM-DD</date_format>
         <decimal_separator>.</decimal_separator>
         <columns>
           <column>date</column>
           <column>close</column>
         </columns>
       </csv>
    </data_set> 

    <data_set did="3">
       <title>日経平均株価(日経225)</title>
       <short>日経255</short>
       <compare_list_box selected="true"></compare_list_box>
       <color>999999</color>
       <file_name>../../fund/search/data/634</file_name>
       <csv>
         <reverse>true</reverse>
         <separator>,</separator>
         <date_format>YYYY-MM-DD</date_format>
         <decimal_separator>.</decimal_separator>
         <columns>
           <column>date</column>
           <column>close</column>
         </columns>
       </csv>
    </data_set>

  </data_sets>

  <charts>
   <chart cid="0">
    <bg_color>f5f5f5,ffffff</bg_color>
      <border_color>#CCCCCC</border_color>
      <border_alpha>100</border_alpha>
     
      <grid>
        <x>
          <dashed>true</dashed>
        </x>
        <y_right>
          <color>cccccc</color>
          <alpha>100</alpha>
          <dashed>true</dashed>
        </y_right>
      </grid>

      <legend>
        <show_date>true</show_date>
      </legend>

    <graphs>
     <graph gid="0">
       <axis>right</axis>
      <type>line</type>
      <data_sources>
        <close>close</close>
          </data_sources>
          
          <compare_source>close</compare_source>

        <legend>
            <date key="true" title="true"><![CDATA[<b>{close}</b>]]></date>
            <period key="true" title="true"><![CDATA[open:<b>{open}</b> low:<b>{low}</b> high:<b>{high}</b> close:<b>{close}</b>]]></period>
            <date_comparing key="true" title="true"><![CDATA[{close.percents}]]></date_comparing>
            <period_comparing key="true" title="true"><![CDATA[{close.percents}]]></period_comparing>
          </legend>
     </graph>
    </graphs>
   </chart>
  </charts>
  
  
  <data_set_selector>
  <position>top</position>
    <width>300</width>
    <max_comparing_count>4</max_comparing_count>
   <main_drop_down_title>選択</main_drop_down_title>
   <compare_list_box_title>比較</compare_list_box_title>
  </data_set_selector>
  
  <period_selector>
    <button>
      <bg_color_hover>b81d1b</bg_color_hover>
      <bg_color_selected>b81d1b</bg_color_selected>
      <text_color_hover>ffffff</text_color_hover>
      <text_color_selected>ffffff</text_color_selected>
    </button>
  
  <periods>  
     <period type="MM" count="1">1ヶ月</period>
     <period type="MM" count="3">3ヶ月</period>
     <period type="MM" count="6">6ヶ月</period>
     <period selected="true" type="YYYY" count="1">1年</period>
     <period type="YYYY" count="3">3年</period>
     <period type="YYYY" count="5">5年</period>
     <period type="YYYY" count="7">7年</period>
     <period type="MAX">設定来</period>
  </periods>
  
  <periods_title>期間:</periods_title>
  <custom_period_title>任意期間:</custom_period_title>
  </period_selector>

  <header>
    <enabled></enabled>
    <text><![CDATA[<b>{title}</b> {short} {description}]]></text>
    <text_size>12</text_size>
  </header>

  <plot_area>
    <border_color>cccccc</border_color>
  </plot_area>

  <scroller>
    <enabled>true</enabled>
    <height>50</height>
    <graph_data_source>close</graph_data_source>
    <bg_color>f5f5f5,ffffff</bg_color>
    <resize_button_color>b81d1b</resize_button_color>
  </scroller>

</settings>

controllers/fund/search_controller.rbに追加
3年以内の分配金再投資基準価額を純資産降順でcsv作成、csvは行は「yyyy-mm-dd,修正基準価額」になっている
.....
.....
  def data
    @fundCorrectionIndex = FundCorrectionIndex.find(:all, :conditions => ["fund_id=? and as_of_date >= (NOW() - INTERVAL 3 YEAR)",  params[:id]], :order => 'as_of_date desc')
    csv_data = ""
    @fundCorrectionIndex.each do |rec|
      csv_data += "#{rec.as_of_date.strftime("%Y-%m-%d")},#{rec.correction_value}\r\n"
    end
    render :text => csv_data
  end
.....
.....

htmlは
<!-- headに -->
<script type="text/javascript" src="/rsrc/amcharts/swfobject.js"></script>
<script type="text/javascript" src="/rsrc/amcharts/stockchart.js"></script>

<!-- bodyに -->
<body onLoad="draw_stock('stock','/market/special/asia/settings.xml')">

<!-- 描画用divを追加 -->
<div id="stock"></div>

stockchart.js
function draw_stock(id,setting_url,width,height) {
 if(width == undefined){
  width = "700"; 
  } 
 if(height == undefined){
  height = "500"; 
  } 
 if(setting_url == undefined){
  setting_url = "settings.xml"
  }

 var params = {
   bgcolor:"#FFFFFF"
  };
 var flashVars = {
   path: "/rsrc/amcharts/",
   settings_file: setting_url,
   data_file: "data.xml",
   chart_id: id
  };
 swfobject.embedSWF("/rsrc/amcharts/amstock.swf", id, width, height, "8.0.0", "/rsrc/amcharts/expressInstall.swf", flashVars, params);
}

お名前のニュース配信を解除

http://www.onamae.com/support/faq/dom_other/other_01.php

Q.お名前.com会員に配信される「お名前.comドメインニュース」を配信停止してほしい

A.お名前.comドメインニュースの配信停止方法につきましては、下記手順にてお手続きください。


■ドメインニュースの配信停止方法の流れ

ドメインNavi にアクセスし、ユーザーID(お名前ID)とパスワードでログイン
上部メニューバーの「お名前.com会員情報」をクリック
会員情報設定の「会員情報の編集」をクリック
現在の会員情報が表示されますので、 「ドメインニュース配信」にて「配信無し」をご選択の上、「確認画面へ進む」をクリック
※その他、会員情報にご変更があれば最新の情報にあわせてご変更ください
ご入力内容をご確認の上、「設定する」をクリック
受付画面が表示され、変更された会員情報を記載したメールがお名前.com会員情報のご連絡先メールアドレス宛に送信されます

結構探した…本当にうるさかった。

2012年3月24日土曜日

bloggerをgoogle siteに埋め込む(embed)方法

<iframe src ="http://kagen88.blogspot.jp/" width="755px" height="3000">
<p>あなたのブラウザがiframeを対応していないみたい</p>
</iframe>
google siteのページのhtmlを編集して保存すれば、google siteにブログを貼ることができる。
もう一回編集してみると、先のiframタグが訳がわからないタグに変わった、多分サイトがiframeタグを
よろしく変更してくれたね。
横スクロールを非表示や、縦スクロールの範囲指定等色々やりたいができないことも有ります。
googleがbloggerを埋め込む用のガジェットを作ってくれないかなぁー

2012年3月23日金曜日

javascriptでXMLを読み込むライブラリーjkl-parsexml.js

ライブラリーはここからダウンロード
http://www.kawa.net/works/js/jkl/parsexml.html

そして読み込むXMLを作成、ファイル名をuser.xmlにします。
<?xml version="1.0" standalone="yes"?>
<Users>
    <User>
        <Id>1</Id>
        <Name>田中</Name>
    </User>
    <User>
        <Id>2</Id>
        <Name>佐藤</Name>
    </User>
</Users>

HTMLはこちら
<html>
<head>
<title>XMLファイルの読み込み</title>
<script type="text/javascript" src="jkl-parsexml.js"></script>
<script type="text/javascript">
<!--
function requestFile(url){
    var xml = new JKL.ParseXML( url );
    var data = xml.parse();
    var strHtml = "<table border=1>";
    for (var u in data.Users.User){
      strHtml += "<tr>";
      strHtml += "<td>" + data.Users.User[u].Id + "</td><td>" + data.Users.User[u].Name + "</td>";
      strHtml += "</tr>";
    }
    strHtml += "</table>";
    document.getElementById("resultDiv").innerHTML = strHtml;
}
// -->
</script>
</head>
<body>
<input id="Button" type="button" value="実行" onclick="javascript:requestFile('./user.xml')">
<div id="resultDiv">
</div>
</body>
</html>
結果はこんな感じ
1田中
2佐藤

2012年3月21日水曜日

RailsのActiveRecordのfindメソッドの基礎的書き方の一例

FundIndex.find(:all,
                    :select =>["fund_id,value,as_of_date"],
                    :conditions => ["fund_id=? and fund_index_type_id=?", 564,2],
                    :limit => 100)