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


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

作品DB等各サービスの機能追加情報や、技術系・面白系記事を中心に提供。
記事の投稿は基本Twitterでも告知させて頂いています。
連絡は作品DBの論客の方なら私書、DB外ユーザの方ならメールTwitterで可能です。
 27日26日25日24日23日22日21日20日
閲覧901 (+162)739 (+79)660 (-141)801 (+62)739 (-716)1,455 (+664)791 (+37)754

アクセス記録[推移 / PV内訳(過去1日 / 過去1週間) / 外部アクセス元 (昨日 / 過去1週間) / ログイン論客足跡]
プロフィール私書(メール)
   /   /送済
評価(一覧   /)
投票   /共:   /
ファン登録
作品/情報/
DB構築()
ブログ
[書く]
攻略記事リンク集
My Play List
 作成日時分類記事タイトル
12015/04/27AnsibleAnsibleのキーワード
22015/04/18AWS設定
32015/03/29meteorMeteor関連のリソース
42015/03/17旅行フランス::19-25までパリ行ってきます
52015/03/16Web APIBacklog::Backlog APIでその期限日に完了したタスクリストを...
=>古記事6. 2015/03/10 確定申告の作業中(他はそれが終わってから)
 反応日時来客名来客者の最近のメッセージ
12015/04/20 非論客コメント
22015/03/17金龍フランスいいですね〜パリだとみんなノートルダムやルーブル...
32015/03/16 非論客コメント
42015/03/11雪霞頑張ってください。お金やモノの出入りがあるたびに――は無...
52015/03/05永田こんばんは。今まで管理人様のスタンスが分からなかったもの...
その他最近のコメント
1.
2015/04/27(下げ記事) Ansible > Ansibleのキーワード」
[この書込みのみ表示(記事URL紹介用) / 編集 / 削除 / トラバ送信 / 共有分類に追加(タグ付け)]

1. キー機能
2. モジュール

1. キー機能

vars:
templates/
handelrs:
2. モジュール

Copy:
service:

コメントする

2.
2015/04/18 AWS > 設定」
[この書込みのみ表示(記事URL紹介用) / 編集 / 削除 / トラバ送信 / 共有分類に追加(タグ付け)]

1. まずはec2から
2. IP割り当て
3. 性能見てみる
4. 自動化(Ansible)

1. まずはec2から

subnetは1cで
2. IP割り当て

立ち上がったらelastic ipを割り当てる
3. 性能見てみる

http://sakuhindb.com/pj/6_B4C9CDFDBFCDA4B5A4F3/20121226.html
を参考に

Version 5.1.3 Based on the Byte Magazine Unix Benchmark

Multi-CPU version Version 5 revisions by Ian Smith,
Sunnyvale, CA, USA
January 13, 2011 johantheghost at yahoo period com

1 x Dhrystone 2 using register variables 1 2 3 4 5 6 7 8 9 10

1 x Double-Precision Whetstone 1 2 3 4 5 6 7 8 9 10

1 x Execl Throughput 1 2 3

1 x File Copy 1024 bufsize 2000 maxblocks 1 2 3

1 x File Copy 256 bufsize 500 maxblocks 1 2 3

1 x File Copy 4096 bufsize 8000 maxblocks 1 2 3

1 x Pipe Throughput 1 2 3 4 5 6 7 8 9 10

1 x Pipe-based Context Switching 1 2 3 4 5 6 7 8 9 10

1 x Process Creation 1 2 3

1 x System Call Overhead 1 2 3 4 5 6 7 8 9 10

1 x Shell Scripts (1 concurrent) 1 2 3

1 x Shell Scripts (8 concurrent) 1 2 3

========================================================================
BYTE UNIX Benchmarks (Version 5.1.3)

System: ip-172-31-22-216: GNU/Linux
OS: GNU/Linux -- 3.13.0-48-generic -- #80-Ubuntu SMP Thu Mar 12 11:16:15 UTC 2015
Machine: x86_64 (x86_64)
Language: en_US.utf8 (charmap="UTF-8", collate="UTF-8")
CPU 0: Intel(R) Xeon(R) CPU E5-2670 v2 @ 2.50GHz (5000.2 bogomips)
Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET
14:34:03 up 17 min, 1 user, load average: 0.21, 0.10, 0.07; runlevel 2

------------------------------------------------------------------------
Benchmark Run: Sat Apr 18 2015 14:34:03 - 15:02:06
1 CPU in system; running 1 parallel copy of tests

Dhrystone 2 using register variables 33106094.2 lps (10.0 s, 7 samples)
Double-Precision Whetstone 4260.8 MWIPS (9.9 s, 7 samples)
Execl Throughput 4818.9 lps (30.0 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks 1241123.8 KBps (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks 334574.2 KBps (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks 3424006.7 KBps (30.0 s, 2 samples)
Pipe Throughput 2452003.5 lps (10.0 s, 7 samples)
Pipe-based Context Switching 362076.4 lps (10.0 s, 7 samples)
Process Creation 15885.8 lps (30.0 s, 2 samples)
Shell Scripts (1 concurrent) 8773.1 lpm (60.0 s, 2 samples)
Shell Scripts (8 concurrent) 1154.8 lpm (60.0 s, 2 samples)
System Call Overhead 4547527.7 lps (10.0 s, 7 samples)

System Benchmarks Index Values BASELINE RESULT INDEX
Dhrystone 2 using register variables 116700.0 33106094.2 2836.9
Double-Precision Whetstone 55.0 4260.8 774.7
Execl Throughput 43.0 4818.9 1120.7
File Copy 1024 bufsize 2000 maxblocks 3960.0 1241123.8 3134.2
File Copy 256 bufsize 500 maxblocks 1655.0 334574.2 2021.6
File Copy 4096 bufsize 8000 maxblocks 5800.0 3424006.7 5903.5
Pipe Throughput 12440.0 2452003.5 1971.1
Pipe-based Context Switching 4000.0 362076.4 905.2
Process Creation 126.0 15885.8 1260.8
Shell Scripts (1 concurrent) 42.4 8773.1 2069.1
Shell Scripts (8 concurrent) 6.0 1154.8 1924.7
System Call Overhead 15000.0 4547527.7 3031.7
========
System Benchmarks Index Score 1919.5
メモリー量が多くない&マルチコアではない等は別として、シングルコアとしては悪くはない
4. 自動化(Ansible)

AMI(ベースとするイメージ)をまず作ってAMI-idを得る。

https://console.aws.amazon.com/iam/home

で適切な権限のグループを作り、ユーザーを割り当てる

route53にdns設定する

key_nameは
https://ap-northeast-1.console.aws.amazon.com/ec2/v2/home
のキーペアの値

セキュリティグループを設定する
httpが必要なのはhttp、sshが必要ならsshも

pip install boto
./ec2.py --list
export ANSIBLE_HOSTS=`pwd`/ec2.py

aws configure --region ap-northeast-1

コメントする

3.
2015/03/29 meteor > Meteor関連のリソース」
[この書込みのみ表示(記事URL紹介用) / 編集 / 削除 / トラバ送信 / 共有分類に追加(タグ付け)]

Meteor関連の情報リソースを整理します。

https://www.meteor.com/
まずここに行き

https://www.meteor.com/install
を全部こなします。

http://docs.meteor.com/#/basic/
を頭から末尾まで読みます。

https://atmospherejs.com/
ざっとモジュールの存在を把握してみます。

http://meteorpedia.com/read/Main_Page
トップページで役立つ情報ソースを確認

https://book.discovermeteor.com/
お金かかるけど買ってみよう

http://projectricochet.com/blog/meteor-js-performance#.VRmTaUaX0dU
# 関係ない部分でreactiveが発動しないように絞る
var employee_ids = Employees.find({}, {fields: {_id: 1}}).fetch();

# reactiveである必要がない場合
var employees = Employees.find({}, {reactive: false}).fetch();
と、役立つ基本ノウハウが諸々。

https://github.com/oortcloud/unofficial-meteor-faq

コメントする

4.
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週間の旅になりますように

5.
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;
}


コメントする

=>古記事6. 2015/03/10 確定申告の作業中(他はそれが終わってから)
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
66.Ansible
日記の主な内容
サイト運営/開発
検索エンジン情報
・技術ネタ(Berkeley DB,
Linux, Perl, サイト作成)等

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

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

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

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






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

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