管理人さんのサイト開発・運用報告+αの書


[携帯版(QRコード)] 総閲覧回数:3,045,341回 / ブログ拍手:1,915

作品DB等各サービスの機能追加情報や、技術系・面白系記事を中心に提供。
記事の投稿は基本Twitterでも告知させて頂いています。
連絡は作品DBの論客の方なら私書、DB外ユーザの方ならメールTwitterで可能です。
 27日26日25日24日23日22日21日20日
閲覧739 (+37)702 (-16)718 (-10)728 (-42)770 (+72)698 (-39)737 (+5)732

アクセス記録[推移 / PV内訳(過去1日 / 過去1週間) / 外部アクセス元 (昨日 / 過去1週間) / ログイン論客足跡]
プロフィール私書(メール)
   /   /送済
評価(一覧   /)
投票   /共:   /
ファン登録
作品/情報/
DB構築()
ブログ
[書く]
攻略記事リンク集
My Play List
 作成日時分類記事タイトル
12015/03/17旅行フランス::19-25までパリ行ってきます
22015/03/16Web APIBacklog::Backlog APIでその期限日に完了したタスクリストを...
32015/03/10作品DB開発/運用確定申告の作業中(他はそれが終わってから)
42015/03/08会計マネーフォワードクラウド確定申告使い方メモ
52015/03/05Google Apps Scriptカレンダーから指定した日付以降のイベントリストを得る
=>古記事6. 2015/03/02 Pentahoのインストールメモ、転じてTableau
 反応日時来客名来客者の最近のメッセージ
12015/03/17金龍フランスいいですね〜パリだとみんなノートルダムやルーブル...
22015/03/16 非論客コメント
32015/03/11雪霞頑張ってください。お金やモノの出入りがあるたびに――は無...
42015/03/05永田こんばんは。今まで管理人様のスタンスが分からなかったもの...
52015/03/01永田こんばんは。失礼致します。前から疑問に思っていたのですが...
その他最近のコメント
1.
2015/03/17 旅行 > フランス > 19-25までパリ行ってきます」
[この書込みのみ表示(記事URL紹介用) / 編集 / 削除 / トラバ送信 / 共有分類に追加(タグ付け)]拍手:12個

パリとモンサンミッシェル行ってきます。
いわゆる新婚旅行的な。

日本国内は相方とかなり旅行行ってますが(特に北海道は先日の稚内でほぼ行き尽くした)、海外は
http://sakuhindb.com/pj/6_B4C9CDFDBFCDA4B5A4F3/profile.html#8_6_B3A4B3B0B5ADCFBF202B20BCCCBFBF
を見ると10年位ぶりじゃないかな。
確定申告で一週間(以上?)潰したので、これか旅行計画立て予定。

コメントする12個


管理人さん さんのコメント (2015/03/17) [編集/削除(書込み者/所有者が可能)]
金龍さん、アドバイスありがとうございます。
地球の歩き方とるるぶを揃えましたが、
行くまで時間がないので、頂いたキーワードのところとかを調べみようと思います!
金龍 さんのコメント (2015/03/17) [編集/削除(書込み者/所有者が可能)]
フランスいいですね〜
パリだとみんなノートルダムやルーブルに行くと思いますが、
ちょっと余裕があったらサント・シャペルがおススメです。

四方をステンドグラスで囲まれた教会内部は圧巻です。
奥様との楽しい1週間の旅になりますように

2.
2015/03/16 Web API > Backlog > Backlog APIでその期限日に完了したタスクリストを得る&転じてサイト関連のKPI生成」
[この書込みのみ表示(記事URL紹介用) / 編集 / 削除 / トラバ送信 / 共有分類に追加(タグ付け)]

1. Backlogの完了チケット数を日付と組み合わせて得る方法
2. 上記の動きを応用してサイト関連のベースとなるKPIを作る

   1. Backlogの完了チケット数を日付と組み合わせて得る方法

ドメインは自分が使っているところで
$APIKEYは個人設定のリンク先にあるAPIのところで得る。

# まずプロジェクトIDを確認
※URLは自分のもので
https://1stclass.backlog.jp/api/v2/projects?apiKey=$APIKEY

# 見たいプロジェクトの$DATEを期限日としたタスクで、完了したものを得る。
2015-03-09 00:00:00 - 2015-03-10 00:00:00の間のものを得たい時
https://1stclass.backlog.jp/api/v2/issues?projectId[]=3335&dueDateSince=2015-03-09&dueDateUntil=2015-03-10&apiKey=$APIKEY
   2. 上記の動きを応用してサイト関連のベースとなるKPIを作る

事務作業は自動化しなくてはならない。
さもなくば事務作業が本業を殺すだろう。

ということで、Google Spread SheetにGoogle Analyticsの主要要素 + Backlogの完了数&チケットタイトル + Google Calenderの関連イベントを入れるGoogle Apps Scriptを作ってみた。
諸々の活動がクラウド上に移動していくと、Google Apps Scriptを媒介にして、Google Spread Sheetが数字系の全てのコネクターになっていくという構図を作れる。

function onOpen() {
  showMenu();
}

function showMenu() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var menu = [
    {name: "GAデータ取得", functionName: "run"}
  ];
  ss.addMenu("追加メニュー", menu);
}

function run() {
  var start_date_str = "2015/01/01";
  var profile_id = 96186554; /* 自分の入れて end of analytics url's numbver */
  var event_match_str = 'スプリント'; // スプリントと入っているイベントだけGoogleカレンダーから引っこ抜く(どのスプリントの期間の数字か把握する為)
  record_uu(profile_id, start_date_str, event_match_str);
}


function toDoubleDigits(num) {
   num += "";
   if (num.length === 1) {
     num = "0" + num;
   }
  return num;    
}

function record_uu(profileId, start_date_str, event_match_str) {
  var start_time_str = start_date_str + ' 00:00:00';
  var start_date = new Date(start_time_str);
  ////// Google Calender //////
  var date2events = listEvents(start_time_str, event_match_str);
  
  //Logger.log(date2events);
  var today = new Date();
  var yesterday = new Date(today.getFullYear()+'/'+(today.getMonth() + 1)+'/'+today.getDate());
  yesterday.setDate(yesterday.getDate() - 1);

  var date_cursor = yesterday;
  var spreadsheet = SpreadsheetApp.getActive();
  var sheet = spreadsheet.getActiveSheet();
  
  var line_num = 0;
  line_num++;
  var item_names = new Array("Date", "UU", "PV", "PV/UU", "Bounce Rate", "Avg Load Time", "Events", "Done", "Tickets");
  var tableId  = 'ga:' + profileId;
  var metric = 'ga:users,ga:pageviews,ga:bounceRate,ga:avgPageLoadTime';
  var options = {
    'dimensions': 'ga:date',
    'sort': '-ga:date',
  };
  
  var item_loc = 0;
  for each (var item_name in item_names){
    item_loc++;
    sheet.getRange(line_num, item_loc).setValue(item_name);
  }
  
  var in_startDate = Utilities.formatDate(date_cursor, Session.getTimeZone(),start_date.getFullYear()+'-'+toDoubleDigits(start_date.getMonth()+1)+"-"+toDoubleDigits(start_date.getDate()) );
  
  
  var yesterday_str = Utilities.formatDate(date_cursor, Session.getTimeZone(),yesterday.getFullYear()+'-'+toDoubleDigits((yesterday.getMonth() + 1))+'-'+toDoubleDigits(yesterday.getDate()));
  
  var today_str = Utilities.formatDate(date_cursor, Session.getTimeZone(),today.getFullYear()+'-'+toDoubleDigits((today.getMonth() + 1))+'-'+toDoubleDigits(today.getDate()));;
  
  line_num++;

  /////// Google Analytics Data /////////
  var report = Analytics.Data.Ga.get(tableId, in_startDate, yesterday_str, metric, options);

  
  
  /////// Backlog ////////
  var project_id = 自分の入れて;
  var backlog_apikey = '自分の入れて';
  var backlogurl = '自分の入れて';
  var offset = 0;
  var pgsz = 100;
  var date2backlog_finished_cnt = new Array();
  var date2backlog_finished_tickets = new Array();
  while(1==1){
    var backlog_url = 'https://'+backlogurl+'.backlog.jp/api/v2/issues?offset='+offset+'&count='+pgsz+'&projectId[]=' + project_id + '&dueDateSince=' + in_startDate + '&dueDateUntil=' + today_str + '&apiKey='+backlog_apikey;
    var response = UrlFetchApp.fetch(backlog_url);
    var json = response.getContentText();
    var data = JSON.parse(json);
    for(var i =0;i < data.length;i++){
      var in_date_str = data[i].dueDate.replace(/T.*/, "");
      if(date2backlog_finished_cnt[in_date_str]){
        date2backlog_finished_cnt[in_date_str]++;
        date2backlog_finished_tickets[in_date_str] += '、' + data[i].summary;
      }
      else{
        date2backlog_finished_cnt[in_date_str] = 1;
        date2backlog_finished_tickets[in_date_str] = data[i].summary;
      }
    }
    if(data.length < offset+pgsz){
      break;
    }
    offset += pgsz;
  }
  ///////////

  
  if (report.rows) {
    for(var i =0;i < report.rows.length;i++){
      var in_date_str = report.rows[i][0];
      var show_date = in_date_str.substr(0,4)+'/'+in_date_str.substr(4,2)+'/'+in_date_str.substr(6,2);
      var bar_show_date = in_date_str.substr(0,4)+'-'+in_date_str.substr(4,2)+'-'+in_date_str.substr(6,2);
      
      var uu = report.rows[i][1];
      var pv = report.rows[i][2];
      var bounce_rate = report.rows[i][3];
      var avg_load_time = report.rows[i][4];
      var pv_uu = 0;
      if(uu && pv){
        pv_uu = (pv/uu).toFixed(2);
      }
      var events_str = '';
      if(date2events[show_date]){
        events_str = date2events[show_date];
      }

      var done_cnt = 0;
      if(date2backlog_finished_cnt[bar_show_date]){
        done_cnt = date2backlog_finished_cnt[bar_show_date];
      }
      
      var tickets = '';
      if(date2backlog_finished_tickets[bar_show_date]){
        tickets = date2backlog_finished_tickets[bar_show_date];
      }
      
      var loc_num = 0;
      
      loc_num++;
      sheet.getRange(line_num, loc_num).setValue(show_date);
      
      loc_num++;
      sheet.getRange(line_num, loc_num).setValue(uu);
      
      loc_num++;
      sheet.getRange(line_num, loc_num).setValue(pv);
      
      loc_num++;
      sheet.getRange(line_num, loc_num).setValue(pv_uu);
      
      loc_num++;
      sheet.getRange(line_num, loc_num).setValue(bounce_rate);

      loc_num++;
      sheet.getRange(line_num, loc_num).setValue(avg_load_time);


      loc_num++;
      sheet.getRange(line_num, loc_num).setValue(events_str);
      
      loc_num++;
      sheet.getRange(line_num, loc_num).setValue(done_cnt);
      
      loc_num++;
      sheet.getRange(line_num, loc_num).setValue(tickets);
      
      line_num++;

    }
    
  }
}


function listEvents(start_time, match_str) {
  var calendarId = 'primary';
  var date2events = {};
  var start_time_obj = new Date(start_time);
  var events = Calendar.Events.list(calendarId, {
    timeMin: start_time_obj.toISOString(),
    singleEvents: true,
    orderBy: 'startTime'
  });
  if (events.items && events.items.length > 0) {
    for (var i = 0; i < events.items.length; i++) {
      var event = events.items[i];
      if (event.start.date) {
        var start = parseDate(event.start.date);
        var start_obj = new Date(start);
        
        var end = parseDate(event.end.date);
        var end_obj = new Date(end);
        
        var cursor_obj = start_obj;
        if(event.summary.indexOf(match_str) >= 0){
          var cursor_time = cursor_obj.getTime();   
          while(cursor_time < end_obj.getTime()){
          //  Logger.log('%s %s', toLocaleDate(new Date(cursor_obj)), event.summary);
            date2events[toLocaleDate(new Date(cursor_obj))] = event.summary;
            cursor_obj.setTime(cursor_obj.getTime()+60*60*24*1000);
            cursor_time = cursor_obj.getTime();
          }
        }
      } 
    }
  }
  return date2events
}

function parseDate(string) {
  var parts = string.split('T');
  parts[0] = parts[0].replace(/-/g, '/');
  return new Date(parts.join(' '));
}

function toLocaleDate( date ){
  var year = date.getFullYear();
  var mon = date.getMonth() + 1;
  var mday = date.getDate() + '';
  mon += '';
  if(mon.length < 2){
    mon = '0' + mon;
  }
  
  if(mday.length < 2){
    mday = '0' + mday;
  }
  return year + '/' + mon + '/' + mday;
}


コメントする

3.
2015/03/10 作品DB開発/運用 > 確定申告の作業中(他はそれが終わってから)」
[この書込みのみ表示(記事URL紹介用) / 編集 / 削除 / トラバ送信 / 共有分類に追加(タグ付け)]拍手:2個

締め切りFirstなので、それが終わってから、時間がかかりそうなもの(運用掲示板のとか)の返信等は行わせていただきます。
宜しくお願い致します。

コメントする2個


管理人さん さんのコメント (2015/03/16) [編集/削除(書込み者/所有者が可能)]
完了しましたー。
でも来年からは大した額でなくても、可能な限り外に投げる方法を模索しようと思います。
freeeとかクラウドベースの会計ソフトを使っていると、そういうのが出来そうなので。。。
本業でないのにこんな事にこんなに時間を使っていては死んでしまう。

ということで、まず、口座とかカードとか、綺麗に分けなきゃね、とかも理解した今年の確定申告でした(毎年何かしら学びがあってしまう)。
雪霞 さんのコメント (2015/03/11) [編集/削除(書込み者/所有者が可能)]
頑張ってください。

お金やモノの出入りがあるたびに――は無理でも、毎月くらいの頻度でこまめに入力すればいいのがわかっていても、
ついつい後回しになって溜まるというパターン……でしょうか、管理人さんもやっぱり。

4.
2015/03/08 会計 > マネーフォワードクラウド確定申告使い方メモ」
[この書込みのみ表示(記事URL紹介用) / 編集 / 削除 / トラバ送信 / 共有分類に追加(タグ付け)]

1. 文章目的
2. ノウハウ
    1. CSV形式からのインポート
    2. 自動仕訳

1. 文章目的

money fowardの確定申告の使い方ノウハウ
2. ノウハウ

事業専用の銀行口座、クレジットカードに分けておく。
これが最大に楽になる大前提。

まず口座連携取り込み系データで仕訳されていない項目を無くす。

また、取り込み系データで仕訳されたもので、未払金、売掛金になっているものの期間内分を相殺する。

その次に決算・申告書を編集して、入れれる項目を全て埋める。

家事按分の仕訳を一括仕訳から作成する。

期の最初の状態を見ておかしなデータがあったら補正する。

「決算・申告書」の設定を間違いがないようにきっちりやっておく

発生主義で広告収入を計上するには、発生収入は別にExcelで管理して、最後に取り込み、そして自動取り込みの方では売掛け金として消し込むようにする。

印刷日に提出日をその日に修正する事を忘れない
   1. CSV形式からのインポート

取引No取引日借方勘定科目借方補助科目借方税区分借方部門借方金額(円)貸方勘定科目貸方補助科目貸方税区分貸方部門貸方金額(円)摘要タグ仕訳メモ
12014/4/3現金対象外A部門100000売上高課税売上(5%)100000タグA     
22014/4/21現金対象外20000売上高課税売上(5%)10000業務外臨時収入      
22014/4/210雑収入課税売上(5%)A部門5000        
22014/4/210売上値引・返品対象外5000         
32014/4/19現金小口現金対象外B部門3000事業主借対象外3000タグA|タグB    
42014/4/21仕入高課税仕入(5%)30000現金対象外30000       
52014/4/21修繕費不明5000現金小口現金対象外5000      

   2. 自動仕訳

右上の設定から、自動仕訳設定が出来るので、それを十分に活用する。

コメントする

5.
2015/03/05 Google Apps Script > カレンダーから指定した日付以降のイベントリストを得る」
[この書込みのみ表示(記事URL紹介用) / 編集 / 削除 / トラバ送信 / 共有分類に追加(タグ付け)]

例えば、今年一年のGoogle Calendarのイベントリストを得るスクリプト。
手始めとして
https://script.google.com/
で、Calendar系のAPIをONにして走らせてみて下さい。

これだけだと開始・終了日時とイベントリストを得るだけですが、そこをベースに例えば日時と組み合わせた何かしらのレポートを作ったり、アクションを起こさせたりするものを作る際にベースにできます。
つまり結果としてGoogle CalendarをGoogle APIを叩いて実現出来る各種アクションの制御センターにする事もできます。
何かをさせたいという時には、Google Calendarにイベントを作成、そうするとその日時に自動的にそれが実行されるといった。
その為の基本となるスクリプトとしてお使い下さい。
結果は、表示→ログで確認。

なお、自分の場合は、ここから、指定したイベントについて、どの期間で行われていたのかを調べて、それを別の履歴とくっつかせて、成果レポートとしてまとめる、といった用途で考えてます。

function run(){
// ここに範囲の開始日時をセット
  var start_time = '2015/01/01 00:00:00';
  listEvents(start_time);
}

function listEvents(start_time) {
  var calendarId = 'primary';
  var start_time_obj = new Date(start_time);
  var events = Calendar.Events.list(calendarId, {
    timeMin: start_time_obj.toISOString(),
    singleEvents: true,
    orderBy: 'startTime'
  });
  if (events.items && events.items.length > 0) {
    for (var i = 0; i < events.items.length; i++) {
      var event = events.items[i];
      if (event.start.date) {
        var start = parseDate(event.start.date);
        var end = parseDate(event.end.date);
        var end_obj = new Date(end);
        end_obj.setTime(end_obj.getTime()-1);
        Logger.log('%s-%s %s', toLocaleDate(new Date(start)), toLocaleDate(end_obj), event.summary);
      } 
      else {
        Logger.log('?-? %s', event.summary);
      }
    }
  } else {
    Logger.log('No events found.');
  }
}

function parseDate(string) {
  var parts = string.split('T');
  parts[0] = parts[0].replace(/-/g, '/');
  return new Date(parts.join(' '));
}

function toLocaleDate( date ){
  var year = date.getFullYear();
  var mon = date.getMonth() + 1;
  var mday = date.getDate() + '';
  mon += '';
  if(mon.length < 2){
    mon = '0' + mon;
  }
  
  if(mday.length < 2){
    mday = '0' + mday;
  }
  return year + '/' + mon + '/' + mday;
}


コメントする

=>古記事6. 2015/03/02 Pentahoのインストールメモ、転じてTableau
RSS購読
RSS
ブログ表示スタイル
リスト/携帯(QRコード)
画像/動画/音声/リンク
表示開始年月
分類
全て
1.このサイトについて
2.作品DB開発/運用
3.ホームページ制作技術
4.Perl
5.C言語 / C++
6.検索エンジン&SEO
7.サッカー
8.自分のこと
9.Linux
10.旅行
11.思ったこと
12.パソコン
13.Berkeley DB
14.その他技術系
15.企画
16.スマートフォン
17.鑑賞
18.皆声.jpニュース
19.インターネット業界
20.運用マニュアル(自分用)
21.技術系以外実用書
22.料理
23.ALEXA
24.アニメ
25.会計
26.漫画
27.設計書
28.色々サイト作成
29.サーバー
30.自分専用
31.生活
32.OP/ED/PV
33.ゲーム
34.DB整備
35.新規開始作品紹介
36.英語圏の話題
37.大道芸
38.映画
39.PHP
40.ダイエット
41.Mac
42.JavaScript
43.MySQL
44.介護
45.作品DB作品追加作業
46.BI
47.Web API
48.パフォーマンス
49.インターネットの活用方法
50.Riak
51.Androidアプリ開発
52.Cassandra
53.スパム
54.写真
55.良い話
56.iOSアプリ開発
57.AWS
58.マーケティング
59.Web漫画
60.法律
61.mongodb
62.開発環境整備
63.Google Apps Script
64.meteor
65.Pentaho
日記の主な内容
サイト運営/開発
検索エンジン情報
・技術ネタ(Berkeley DB,
Linux, Perl, サイト作成)等

サイト管理
全まとめ
サーバー管理
定期処理状況
開発予定
削除提案
作品追加依頼
OP/ED追加依頼
OP/ED not found
作品提案承認欄

格言 fromスクライド
この世の理は即ち速さ
20年かければ馬鹿でも
傑作小説を書ける

助けられたら助け返す
それが俺のルール

強くなるには
一番弱い考えをする事だ
そしてその考えに反逆する






近頃介護DBとかの為に
介護関連の勉強中

作品DB等各サービスの機能追加情報や、技術系・面白系記事を中心に提供。
記事の投稿は基本Twitterでも告知させて頂いています。
連絡は作品DBの論客の方なら私書、DB外ユーザの方ならメールTwitterで可能です。