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);

まぁ関係ない関係ない.