Rでミリ秒を扱う [BI]
備忘録です
#秒の定義をmsec(ミリ秒)にする
options(digits.secs=3)
#msecまで含まれた文字列投入
t1 <- "2015/05/04 21:18:03.024"
#POSIXltに変換
d1 <- strptime(t1,"%Y/%m/%d %H:%M:%OS")
#値を確認
unclass(d1)
#秒の定義をmsec(ミリ秒)にする
options(digits.secs=3)
#msecまで含まれた文字列投入
t1 <- "2015/05/04 21:18:03.024"
#POSIXltに変換
d1 <- strptime(t1,"%Y/%m/%d %H:%M:%OS")
#値を確認
unclass(d1)
Talend Open Studio (ETLツール) でデータ統合(13)~kintoneにファイルを添付する [BI]
ファイル取得(GET)までやったので、ついでにファイル添付(PUT)のやり方も載せておきます。どちらかというと動かせるだろうということを確認したぐらいなので、実用するにはもう少しいじる必要がある設定になっていますが、誰かの参考になるかもしれないので載せておきます。
○ファイルをアップロードし、ファイルキーを取得
ジョブの左側のほうです。ファイルは"c:\tmp\test.zip"です。tLogRowでつないでいますが、サーバの応答を見ているだけで、実際に欲しいデータのfileKeyはこんな感じに設定すると、"c:\tmp\logs_file.log"に取得されます。
○アップロードしたファイルをAppに紐づける
この時点ではまだテンポラリ領域にファイルがアップされただけです。なので、紐づけるJSONをRESTで送ります。
とりあえずこれでZIPファイルを転送して、kintoneの画面からダウンロードしたものが壊れず開けることまでは確認しました。ただ、今回は特に連続処理とかする予定がなかったのでBODYにそのままfileKeyを埋め込んでいます。実際にちゃんとしたjobを組む場合はfileKeyとapp-id,record-idの一覧から毎回JSONに変換するというコードを記述する必要があります。これは実際にやる必要ができたら試してみようと思います。
○ファイルをアップロードし、ファイルキーを取得
ジョブの左側のほうです。ファイルは"c:\tmp\test.zip"です。tLogRowでつないでいますが、サーバの応答を見ているだけで、実際に欲しいデータのfileKeyはこんな感じに設定すると、"c:\tmp\logs_file.log"に取得されます。
○アップロードしたファイルをAppに紐づける
この時点ではまだテンポラリ領域にファイルがアップされただけです。なので、紐づけるJSONをRESTで送ります。
とりあえずこれでZIPファイルを転送して、kintoneの画面からダウンロードしたものが壊れず開けることまでは確認しました。ただ、今回は特に連続処理とかする予定がなかったのでBODYにそのままfileKeyを埋め込んでいます。実際にちゃんとしたjobを組む場合はfileKeyとapp-id,record-idの一覧から毎回JSONに変換するというコードを記述する必要があります。これは実際にやる必要ができたら試してみようと思います。
Talend Open Studio (ETLツール) でデータ統合(12)~kintoneの添付ファイルをごっそり抜く [BI]
社内でとあるアイデアコンテストを開催し、投稿先をkintoneにしていたのですが、思いのほか件数が集まってしまったのでちまちまやるのは面倒くさいな~ということで一念発起でジョブを作りました。
○処理内容: 以下の(1)、(3)を
(1)とあるアプリのid,fileKey,ファイル名を取得し、テキストファイルで保存
(2)ファイル名に重複がある場合はリネームする(これは手動)
(3)上記のテキストファイルを元にファイルを連続ダウンロードする
○参考URL
https://developers.cybozu.com/ja/kintone-api/apprec-readapi.html
(1)とあるアプリのid,fileKey,ファイル名を取得し、テキストファイルで保存
全体はこんな感じです
○RESTコンポーネント(tREST)
・URL
ここにアプリID、クエリをエンコードして記述します。例ではid=511のアプリに対して2つのフィールド("レコード番号($id)"と"filename")をOffset100をかけて持ってくるクエリを記述しています。
"https://(要変更).cybozu.com/k/v1/records.json?app=511&fields%5b0%5d=filename&fields%5b1%5d=$id&query=offset%20100"
※注意点1:&field[0]=ファイルのような形でエンコードしますが、
・"="や"&"はエンコードしない
・日本語のフィールドコードはUTF8でエンコードする
※注意点2:$idはtalendのJSONパーサーでエラーになりますので後段にtReplaceを配置。
・HTTPメソッド
GETを指定
・HTTPヘッダー
ログイン方法に応じてAuthorizationを指定、base64でユーザー名:パスワード をエンコードします。Hostも必須。
○tReplace
talendのJSONパーサーが"$"を扱えないので変換をかけます。ここではレコード番号の$idをidに変更しました。
○JSON変換(tExtractJSONFields)
・kintoneのJSONはトップにrecords(複数レコード抽出の場合)、その下にフィールドの構造がありますので、"フィールド名/value"のように指定します。
○テキスト保存
UTF8で3カラム分保存します。
これを実行すると、fileKey、ファイル名、IDが出力されます。100件以上ある場合はtRESTのクエリでoffsetをかけながらループをしてテキストファイルに追記モードで追加してください。
(2)ファイル名に重複がある場合はリネームする(これは手動)
上手く動いた!と思ったらファイル名重複でファイル数不足、、、的なことがあったのでご注意ください。
面倒なので今回は手でリストをリネームしました。
(3)上記のテキストファイルを元にファイルを連続ダウンロードする
テキストファイルをUTF8でInputから流します
○tFlowToIterate
テキストファイルのデータをグローバル変数に入れて繰り返しを発生させます。後段とはIterateで繋いでください。
○tFileFetch
画像のような感じで設定すると、ファイル単位で連続処理が行われます。
○処理内容: 以下の(1)、(3)を
(1)とあるアプリのid,fileKey,ファイル名を取得し、テキストファイルで保存
(2)ファイル名に重複がある場合はリネームする(これは手動)
(3)上記のテキストファイルを元にファイルを連続ダウンロードする
○参考URL
https://developers.cybozu.com/ja/kintone-api/apprec-readapi.html
(1)とあるアプリのid,fileKey,ファイル名を取得し、テキストファイルで保存
全体はこんな感じです
○RESTコンポーネント(tREST)
・URL
ここにアプリID、クエリをエンコードして記述します。例ではid=511のアプリに対して2つのフィールド("レコード番号($id)"と"filename")をOffset100をかけて持ってくるクエリを記述しています。
"https://(要変更).cybozu.com/k/v1/records.json?app=511&fields%5b0%5d=filename&fields%5b1%5d=$id&query=offset%20100"
※注意点1:&field[0]=ファイルのような形でエンコードしますが、
・"="や"&"はエンコードしない
・日本語のフィールドコードはUTF8でエンコードする
※注意点2:$idはtalendのJSONパーサーでエラーになりますので後段にtReplaceを配置。
・HTTPメソッド
GETを指定
・HTTPヘッダー
ログイン方法に応じてAuthorizationを指定、base64でユーザー名:パスワード をエンコードします。Hostも必須。
○tReplace
talendのJSONパーサーが"$"を扱えないので変換をかけます。ここではレコード番号の$idをidに変更しました。
○JSON変換(tExtractJSONFields)
・kintoneのJSONはトップにrecords(複数レコード抽出の場合)、その下にフィールドの構造がありますので、"フィールド名/value"のように指定します。
○テキスト保存
UTF8で3カラム分保存します。
これを実行すると、fileKey、ファイル名、IDが出力されます。100件以上ある場合はtRESTのクエリでoffsetをかけながらループをしてテキストファイルに追記モードで追加してください。
(2)ファイル名に重複がある場合はリネームする(これは手動)
上手く動いた!と思ったらファイル名重複でファイル数不足、、、的なことがあったのでご注意ください。
面倒なので今回は手でリストをリネームしました。
(3)上記のテキストファイルを元にファイルを連続ダウンロードする
テキストファイルをUTF8でInputから流します
○tFlowToIterate
テキストファイルのデータをグローバル変数に入れて繰り返しを発生させます。後段とはIterateで繋いでください。
○tFileFetch
画像のような感じで設定すると、ファイル単位で連続処理が行われます。
Talend Open Studio (ETLツール) でデータ統合(11)~kintoneのデータを抜いてみる [BI]
talendのリセーラーに何度もリクエスト出しているんですが一向にリアクションが無く、一方で社内のkintone化が進んでいく上で基幹との連携が早晩問題になることが考えられるので、kintoneのREST API経由でtalendを使ってデータを無理矢理抜いてみました。コンポーネントを誰か作ってくれるまでの最終手段として使用する予定ですが、だれかtKintoneInputとか作ってくれないかなあ、、、
○参考URL
https://developers.cybozu.com/ja/kintone-api/apprec-readapi.html
○RESTコンポーネント(tREST)
・URL
ここにアプリID、クエリをエンコードして記述します。例ではid=82のアプリに対して2つのフィールド("Address"と"経度")を持ってくるクエリを記述しています。
※注意点1:&field[0]=経度のような形でエンコードしますが、
・"="や"&"はエンコードしない(上記の例の場合は経度のみURLエンコード)
・日本語のフィールドコードはUTF8でエンコードする
※注意点2:$revision のコラムはtalendのJSONパーサーがうまく拾えないっぽいので、フィールドコード指定のクエリを書くことでこのカラムを除く
#やりようが無いので、必要な時はtReplaceを配置。(最新記事を参考にしてください)
・HTTPメソッド
GETを指定
・HTTPヘッダー
ログイン方法に応じてAuthorizationを指定、base64でユーザー名:パスワード をエンコードします。Hostも必須。
→この結果はJSONとして吐き出されます
○JSON変換(tExtractJSONFields)
・kintoneのJSONはトップにrecords(複数レコード抽出の場合)、その下にフィールドの構造がありますので、"フィールド名/value"のように指定します。
・tRESTのスキーマは固定なので、それのBodyだけを引っ張るようにします。
○実行結果
添付画像のようになります。ちなみにkintone APIの制限から一回に100行しか取ってこれないので、大量に取得したい場合はグローバル変数などを使用して適切にループさせる必要がありそうです。
だれかtKintoneInputとか作ってくれないかなあ、、、(←念押し)
○参考URL
https://developers.cybozu.com/ja/kintone-api/apprec-readapi.html
○RESTコンポーネント(tREST)
・URL
ここにアプリID、クエリをエンコードして記述します。例ではid=82のアプリに対して2つのフィールド("Address"と"経度")を持ってくるクエリを記述しています。
※注意点1:&field[0]=経度のような形でエンコードしますが、
・"="や"&"はエンコードしない(上記の例の場合は経度のみURLエンコード)
・日本語のフィールドコードはUTF8でエンコードする
※注意点2:$revision のコラムはtalendのJSONパーサーがうまく拾えないっぽいので、フィールドコード指定のクエリを書くことでこのカラムを除く
#やりようが無いので、必要な時はtReplaceを配置。(最新記事を参考にしてください)
・HTTPメソッド
GETを指定
・HTTPヘッダー
ログイン方法に応じてAuthorizationを指定、base64でユーザー名:パスワード をエンコードします。Hostも必須。
→この結果はJSONとして吐き出されます
○JSON変換(tExtractJSONFields)
・kintoneのJSONはトップにrecords(複数レコード抽出の場合)、その下にフィールドの構造がありますので、"フィールド名/value"のように指定します。
・tRESTのスキーマは固定なので、それのBodyだけを引っ張るようにします。
○実行結果
添付画像のようになります。ちなみにkintone APIの制限から一回に100行しか取ってこれないので、大量に取得したい場合はグローバル変数などを使用して適切にループさせる必要がありそうです。
だれかtKintoneInputとか作ってくれないかなあ、、、(←念押し)
Talend Open Studio (ETLツール) でデータ統合(10)~tMapでの型変換 [BI]
備忘録です。
tMapで型変換する際に使う関数です。
変換元のテーブルとオブジェクトはそれぞれtbl、objとします。
(tMap上の表記はtbl.objとなる)
BigDecimal→Int tbl.obj.intValue()
BigDecimal→Long tbl.obj.longValue()
BigDecimal→String tbl.obj.toString()
Int→Float tbl.obj.floatValue()
Int→String String.valueOf(tbl.obj)
String→Short Short.parseShort(tbl.obj)
String→Int Integer.parseInt(tbl.obj)
int→BigDecimal new BigDecimal(tbl.obj)Date→BigDecimal new String→BigDecimal(TalendDate.formatDate("yyyyMMdd", tbl.obj))
tMapで型変換する際に使う関数です。
変換元のテーブルとオブジェクトはそれぞれtbl、objとします。
(tMap上の表記はtbl.objとなる)
BigDecimal→Int tbl.obj.intValue()
BigDecimal→Long tbl.obj.longValue()
BigDecimal→String tbl.obj.toString()
Int→Float tbl.obj.floatValue()
Int→String String.valueOf(tbl.obj)
String→Short Short.parseShort(tbl.obj)
String→Int Integer.parseInt(tbl.obj)
int→BigDecimal new BigDecimal(tbl.obj)Date→BigDecimal new String→BigDecimal(TalendDate.formatDate("yyyyMMdd", tbl.obj))
Talend Open Studio (ETLツール) でデータ統合(9)~グローバル変数の利用と連続処理 [BI]
データのリカバリの時などに、数千万件のテーブルを集計してデータを流すことというのはよくあると思います。しかしその処理をtAggregateRowで単純にやろうとすると「メモリ足りないよん」とつれない返事をされて終わってしまうことがあります。
という状態になって困っていたので某社のサポートに聞いたらこれまたつれない返事が返ってきたので、自分でいろいろ試してこの方法にたどり着きました。
◯概要
DBからDISTINCTで日付一覧を取得、それをIterateに展開しグローバル変数にセット、それをIterate先の処理で利用すると、これが実現出来ます。今回のサンプルはtMapを使用していませんが、Iterate先をtAggregateRowにして、これに流しこむ先のクエリのWHERE句にグローバル変数を渡せば、区切った状態で連続処理が可能になります。
※以下はテスト用に作った全く別のジョブです。上記を実現するにはIterate先をtAggregateRowに作り変えて利用して下さい。
◯詳細1:全体像
こんなジョブです。Iterate先をテスト用にtSendMailにしています。
◯詳細2:クエリ
ここではテストのために販売テーブルから日付を2つ取ってきました。一覧を取得するにはDISTINCTで取ると良いでしょう。
◯詳細3:データからIterate(繰り返し)を生成
ここポイントです。tFlowToIterateというコンポーネントを使用します。キーというのがグローバル変数名(自分で勝手に命名して良い)、値はスキーマで定義したカラムを指定します。「グローバル変数名にデフォルト、、、」的な項目にチェックをしておくと、おそらくコンポーネント+"なんちゃらとかいう感じのグローバル変数がセットされるはずですが調べてないのでよく分かりません…。
◯詳細4:グローバル変数をIterate先で使用する
ここではtSendMailで件名に先ほど定義したグローバル変数をセットしました。これで日付が件名にセットされたメールが2通届きます。
という状態になって困っていたので某社のサポートに聞いたらこれまたつれない返事が返ってきたので、自分でいろいろ試してこの方法にたどり着きました。
◯概要
DBからDISTINCTで日付一覧を取得、それをIterateに展開しグローバル変数にセット、それをIterate先の処理で利用すると、これが実現出来ます。今回のサンプルはtMapを使用していませんが、Iterate先をtAggregateRowにして、これに流しこむ先のクエリのWHERE句にグローバル変数を渡せば、区切った状態で連続処理が可能になります。
※以下はテスト用に作った全く別のジョブです。上記を実現するにはIterate先をtAggregateRowに作り変えて利用して下さい。
◯詳細1:全体像
こんなジョブです。Iterate先をテスト用にtSendMailにしています。
◯詳細2:クエリ
ここではテストのために販売テーブルから日付を2つ取ってきました。一覧を取得するにはDISTINCTで取ると良いでしょう。
◯詳細3:データからIterate(繰り返し)を生成
ここポイントです。tFlowToIterateというコンポーネントを使用します。キーというのがグローバル変数名(自分で勝手に命名して良い)、値はスキーマで定義したカラムを指定します。「グローバル変数名にデフォルト、、、」的な項目にチェックをしておくと、おそらくコンポーネント+"なんちゃらとかいう感じのグローバル変数がセットされるはずですが調べてないのでよく分かりません…。
◯詳細4:グローバル変数をIterate先で使用する
ここではtSendMailで件名に先ほど定義したグローバル変数をセットしました。これで日付が件名にセットされたメールが2通届きます。
Talend Open Studio (ETLツール) でデータ統合(8)~tMapでのIf(条件分岐) [BI]
備考録シリーズ、Talend の tMap で条件分岐で処理する際のTipsです。
例えばあるコラムの文字列を見て、中身の処理を変える場合は以下のようにするらしいです。
row1.col1.equals("はい") ? "Yes" : "No"
row1.col1=="はい"? "Yes" : "No"
とか
If(row1.col1=="はい")
{ } else { }
とかやるとドツボにはまるので気をつけて下さい。
例えばあるコラムの文字列を見て、中身の処理を変える場合は以下のようにするらしいです。
row1.col1.equals("はい") ? "Yes" : "No"
row1.col1=="はい"? "Yes" : "No"
とか
If(row1.col1=="はい")
{ } else { }
とかやるとドツボにはまるので気をつけて下さい。
SSRS のレポートを iPhone から見る [BI]
MicrosoftがSSRSをHTML5対応してくれるのはそこそこ先の話になりそうなので、どうしようか困っていましたが、ちゃんとさがしたらアプリがありました。
プロ版~Mobi Reports Pro
http://itunes.apple.com/app/sketch-reports-pro/id378563211
無償版(テスト用、1ソースのみ)~Mobi SSRS
http://itunes.apple.com/us/app/mobi-ssrs/id457786540?ls=1&mt=8
ちゃんとグループ化にも対応しており、日本語もちゃんと表示されます。日本語フォントの文字幅判定起因かはわかりませんが、一部レイアウトが崩れることがありますが調整しておけば問題無いと思います。
会社とかで使うにはVPN設定の一発起動ショートカットをホームに作っておけばOK。かなり快適なSSRS閲覧環境が構築できるでしょう。
プロ版~Mobi Reports Pro
http://itunes.apple.com/app/sketch-reports-pro/id378563211
無償版(テスト用、1ソースのみ)~Mobi SSRS
http://itunes.apple.com/us/app/mobi-ssrs/id457786540?ls=1&mt=8
ちゃんとグループ化にも対応しており、日本語もちゃんと表示されます。日本語フォントの文字幅判定起因かはわかりませんが、一部レイアウトが崩れることがありますが調整しておけば問題無いと思います。
会社とかで使うにはVPN設定の一発起動ショートカットをホームに作っておけばOK。かなり快適なSSRS閲覧環境が構築できるでしょう。
SSRSのメール購読のSMTPを使用する [BI]
備忘録です。どうやらSSRS→Gmailの直接送信はSSRSの設定上不可能らしく、一回ローカルSMTPを経由して飛ばさなくてはいけないらしいです。
http://social.msdn.microsoft.com/Forums/en-US/sqlreportingservices/thread/49fd92b9-810d-4a2c-af18-a63fbf6e1a46/
http://social.msdn.microsoft.com/Forums/en-US/sqlreportingservices/thread/49fd92b9-810d-4a2c-af18-a63fbf6e1a46/
プログラマではないけど Visual Studio LightSwitch でカンタン業務アプリを作ってみる(3)~Excelインポート [BI]
LightswitchはデータのCRUDをメイン機能とするアプリケーションです。さてここでひとつ困ったのはデータのインポートです。出力に関してはテーブル表示をした時にexcelのアイコンをクリックすると現在表示されているリストをExcelにエクスポートすることができます。しかしデータのインポート機能は標準では用意されていません。SQL Serverをデータソースとしている場合はDBにロードしてしまえば目的は達成することができますが、一般ユーザーにそれをお願いできませんよね。そういう時はExcelインポートのエクステンションを使用します。
◯Excelインポートエクステンションのインストール
(1)以下からエクステンションをダウンロード
http://code.msdn.microsoft.com/silverlight/Excel-Importer-for-Visual-61dd4a90
(2)インストール
\VB\ExcelImporter\Binaries\ExcelImporter.vsix
を実行するとインストールできます。エクステンションを利用するにはLightswitchを再起動して下さい。
◯エクステンションの利用方法
http://blogs.msdn.com/b/lightswitch/archive/2011/04/13/how-to-import-data-from-excel.aspx
に詳細なやり方が書いてありますが、要約すると以下です。
(1)プロジェクトのプロパティの「拡張機能」→「Excel Importer」にチェックを入れる。
(2)ボタンを追加し、新しいメソッドを定義する。コントロールをダブルクリックして
以下のE~のところのコードを追加して下さい。(Table1ItemSetのところはデータセットの名前を選択して下さい)
Private Sub ExcelImp_Execute()
' Write your code here.
ExcelImporter.Importer.ImportFromExcel(Me.Table1ItemSet)
End Sub
(3)これを実行すると以下の画面になります。
Excelファイルを読み込んで下さい。ちなみにセキュリティ設定によってはMy Documents以下にあるファイル以外の読み込みはエラーになることがあります。
(4)読み込み設定
Excelファイルはタイトル行の下にデータ行が続く形式にしておくと読み込み時の設定がしやすいです。
(画面)読み込み設定中。Excelのタイトル列と、LightSwitchのデータセットの列の対応を取ります。
これでExcelからの読み込みができます。一般ユーザーでも安心の操作感ですね。
◯Excelインポートエクステンションのインストール
(1)以下からエクステンションをダウンロード
http://code.msdn.microsoft.com/silverlight/Excel-Importer-for-Visual-61dd4a90
(2)インストール
\VB\ExcelImporter\Binaries\ExcelImporter.vsix
を実行するとインストールできます。エクステンションを利用するにはLightswitchを再起動して下さい。
◯エクステンションの利用方法
http://blogs.msdn.com/b/lightswitch/archive/2011/04/13/how-to-import-data-from-excel.aspx
に詳細なやり方が書いてありますが、要約すると以下です。
(1)プロジェクトのプロパティの「拡張機能」→「Excel Importer」にチェックを入れる。
(2)ボタンを追加し、新しいメソッドを定義する。コントロールをダブルクリックして
以下のE~のところのコードを追加して下さい。(Table1ItemSetのところはデータセットの名前を選択して下さい)
Private Sub ExcelImp_Execute()
' Write your code here.
ExcelImporter.Importer.ImportFromExcel(Me.Table1ItemSet)
End Sub
(3)これを実行すると以下の画面になります。
Excelファイルを読み込んで下さい。ちなみにセキュリティ設定によってはMy Documents以下にあるファイル以外の読み込みはエラーになることがあります。
(4)読み込み設定
Excelファイルはタイトル行の下にデータ行が続く形式にしておくと読み込み時の設定がしやすいです。
(画面)読み込み設定中。Excelのタイトル列と、LightSwitchのデータセットの列の対応を取ります。
これでExcelからの読み込みができます。一般ユーザーでも安心の操作感ですね。