Last active
April 23, 2018 04:38
-
-
Save wynemo/27617eec4a258133af1938b8c88e025c to your computer and use it in GitHub Desktop.
test.ipynb
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
" wget -c https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh\n", | |
" sh Anaconda2-4.2.0-Linux-x86_64.sh\n", | |
" ~/miniconda3/bin/conda create -vv -n py3k python=3\n", | |
" ~/miniconda3/bin/conda install -n py3k requests pyquery sqlalchemy matplotlib numpy flask tenjin\n", | |
" ~/miniconda3/envs/py3k/bin/python\n", | |
" " | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 55, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"2 % 2 = 0\n", | |
"3 % 3 = 0\n", | |
"4 % 2 = 0\n", | |
"6 % 3 = 0\n", | |
"8 % 2 = 0\n", | |
"9 % 3 = 0\n", | |
"10 % 2 = 0\n", | |
"12 % 3 = 0\n", | |
"14 % 2 = 0\n", | |
"15 % 3 = 0\n", | |
"0\n", | |
"1\n", | |
"2\n", | |
"3\n", | |
"4\n", | |
"5\n", | |
"6\n", | |
"7\n", | |
"8\n", | |
"9\n", | |
"10\n", | |
"11\n", | |
"12\n", | |
"13\n", | |
"14\n", | |
"/home/user/miniconda3/envs/py3k/lib/python3.6/site-packages/ipykernel_launcher.py\n" | |
] | |
} | |
], | |
"source": [ | |
"import sys\n", | |
"\n", | |
"\n", | |
"def test_yield():\n", | |
" for i in range(0, 15):\n", | |
" yield i\n", | |
"\n", | |
"\n", | |
"if __name__ == '__main__':\n", | |
" i = 0\n", | |
" while 1:\n", | |
" i += 1\n", | |
" if i % 3 == 0:\n", | |
" print('%s %% 3 = 0' % i)\n", | |
" elif i % 2 == 0:\n", | |
" print('%s %% 2 = 0' % i)\n", | |
" else:\n", | |
" continue\n", | |
" if i == 15:\n", | |
" break\n", | |
" \n", | |
" for each in test_yield():\n", | |
" print(each)\n", | |
" \n", | |
" print(sys.argv[0])\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 44, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"<div class=\"contentLayout2\">\n", | |
"<div class=\"columnLayout single\" data-layout=\"single\">\n", | |
"<div class=\"cell normal\" data-type=\"normal\">\n", | |
"<div class=\"innerCell\">\n", | |
"<h2 id=\"RoadDBR&DTrainingSessions(ONTVmonitor)-April\"><em><strong>April</strong></em></h2></div>\n", | |
"</div>\n", | |
"</div>\n", | |
"<div class=\"columnLayout single\" data-layout=\"single\">\n", | |
"<div class=\"cell normal\" data-type=\"normal\">\n", | |
"<div class=\"innerCell\">\n", | |
"<div class=\"table-wrap\"><table class=\"confluenceTable\"><tbody><tr><th class=\"confluenceTh\">Team</th><th class=\"confluenceTh\">Time</th><th class=\"confluenceTh\">Session</th><th colspan=\"1\" class=\"confluenceTh\">Content</th><th colspan=\"1\" class=\"confluenceTh\">Lecturer</th></tr><tr><td class=\"confluenceTd\">SAM</td><td class=\"confluenceTd\"><time datetime=\"2018-04-04\" class=\"date-past\">04 Apr 2018</time> </td><td class=\"confluenceTd\"><span>非线性最小二乘优化(Powell’s Dog Leg)</span></td><td colspan=\"1\" class=\"confluenceTd\"> </td><td colspan=\"1\" class=\"confluenceTd\"><a class=\"confluence-userlink user-mention\" data-us\n" | |
] | |
}, | |
{ | |
"data": { | |
"text/html": [ | |
"\n", | |
"<div class=\"columnLayout single\" data-layout=\"single\">\n", | |
"<div class=\"cell normal\" data-type=\"normal\">\n", | |
"<div class=\"innerCell\">\n", | |
"<h2 id=\"RoadDBR&DTrainingSessions(ONTVmonitor)-April\"><em><strong>April</strong></em></h2></div>\n", | |
"</div>\n", | |
"</div>\n", | |
"<div class=\"columnLayout single\" data-layout=\"single\">\n", | |
"<div class=\"cell normal\" data-type=\"normal\">\n", | |
"<div class=\"innerCell\">\n", | |
"<div class=\"table-wrap\"><table class=\"confluenceTable table-dark\" style=\"width: 100%\"><tbody><tr><th class=\"confluenceTh\">Team</th><th class=\"confluenceTh\">Time</th><th class=\"confluenceTh\">Session</th><th colspan=\"1\" class=\"confluenceTh\">Content</th><th colspan=\"1\" class=\"confluenceTh\">Lecturer</th></tr><tr><td class=\"confluenceTd\">SAM</td><td class=\"confluenceTd\"><time datetime=\"2018-04-04\" class=\"date-past\">04 Apr 2018</time> </td><td class=\"confluenceTd\"><span>非线性最小二乘优化(Powell’s Dog Leg)</span></td><td colspan=\"1\" class=\"confluenceTd\"> </td><td colspan=\"1\" class=\"confluenceTd\"><a class=\"confluence-userlink user-mention\" data-username=\"Jie.Feng\" href=\"/display/~Jie.Feng\" data-linked-resource-id=\"19641093\" data-linked-resource-version=\"1\" data-linked-resource-type=\"userinfo\" data-base-url=\"https://confluence.ygomi.com:8443\">Jie Feng</a></td></tr><tr><td class=\"confluenceTd\">STORM</td><td class=\"confluenceTd\"><time datetime=\"2018-04-09\" class=\"date-past\">09 Apr 2018</time> </td><td class=\"confluenceTd\">Atlassian 系列产品使用技巧与规范</td><td colspan=\"1\" class=\"confluenceTd\"><p>Confluence / JIRA 使用技巧与规范</p><p>Stash / Sourcetree 使用技巧与规范</p></td><td colspan=\"1\" class=\"confluenceTd\"><a class=\"confluence-userlink user-mention\" data-username=\"Zhixun.Xia\" href=\"/display/~Zhixun.Xia\" data-linked-resource-id=\"9863543\" data-linked-resource-version=\"1\" data-linked-resource-type=\"userinfo\" data-base-url=\"https://confluence.ygomi.com:8443\">Zhixun Xia</a></td></tr><tr><td class=\"confluenceTd\"><span>STORM</span></td><td class=\"confluenceTd\"><time datetime=\"2018-04-12\" class=\"date-upcoming\">12 Apr 2018</time> </td><td class=\"confluenceTd\">算法开发过程</td><td colspan=\"1\" class=\"confluenceTd\"><p>算法调研;</p><p>算法仿真与实验报告;</p><p>算法实现与维护</p></td><td colspan=\"1\" class=\"confluenceTd\"><a class=\"confluence-userlink user-mention\" data-username=\"Yao.Chen\" href=\"/display/~Yao.Chen\" data-linked-resource-id=\"12754278\" data-linked-resource-version=\"1\" data-linked-resource-type=\"userinfo\" data-base-url=\"https://confluence.ygomi.com:8443\">Yao Chen</a></td></tr><tr><td class=\"confluenceTd\"><span>STORM</span></td><td class=\"confluenceTd\"><time datetime=\"2018-04-16\" class=\"date-upcoming\">16 Apr 2018</time> </td><td class=\"confluenceTd\">提高研发效率</td><td colspan=\"1\" class=\"confluenceTd\">工作计划,时间统筹,风险控制</td><td colspan=\"1\" class=\"confluenceTd\"><a class=\"confluence-userlink user-mention\" data-username=\"Zhixun.Xia\" href=\"/display/~Zhixun.Xia\" data-linked-resource-id=\"9863543\" data-linked-resource-version=\"1\" data-linked-resource-type=\"userinfo\" data-base-url=\"https://confluence.ygomi.com:8443\">Zhixun Xia</a></td></tr></tbody></table></div></div>\n", | |
"</div>\n", | |
"</div>\n" | |
], | |
"text/plain": [ | |
"<IPython.core.display.HTML object>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"import requests\n", | |
"from pyquery import PyQuery as pq\n", | |
"from IPython.core.display import HTML\n", | |
"\n", | |
"\n", | |
"bamboo_name = 'roaddb_devops'\n", | |
"bamboo_pw = '******'\n", | |
"auth = (bamboo_name, bamboo_pw,)\n", | |
"r = requests.get('https://confluence.ygomi.com:8443/rest/api/content/40928055?expand=body.view', auth=auth)\n", | |
"info = r.json()\n", | |
"html = info['body']['view']['value']\n", | |
"print(html[:1000])\n", | |
"doc = pq(html)\n", | |
"element = doc('table')\n", | |
"element.css('width', '100%')\n", | |
"element.toggle_class('table-dark')\n", | |
"display(HTML(doc.html()))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 12, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"2018-04-11 12:46:32,692 INFO sqlalchemy.engine.base.Engine SHOW VARIABLES LIKE 'sql_mode'\n", | |
"2018-04-11 12:46:32,694 INFO sqlalchemy.engine.base.Engine {}\n", | |
"2018-04-11 12:46:33,365 INFO sqlalchemy.engine.base.Engine SELECT DATABASE()\n", | |
"2018-04-11 12:46:33,367 INFO sqlalchemy.engine.base.Engine {}\n", | |
"2018-04-11 12:46:34,706 INFO sqlalchemy.engine.base.Engine SELECT CAST('test plain returns' AS CHAR(60)) AS anon_1\n", | |
"2018-04-11 12:46:34,707 INFO sqlalchemy.engine.base.Engine {}\n", | |
"2018-04-11 12:46:35,378 INFO sqlalchemy.engine.base.Engine SELECT CAST('test unicode returns' AS CHAR(60)) AS anon_1\n", | |
"2018-04-11 12:46:35,380 INFO sqlalchemy.engine.base.Engine {}\n", | |
"2018-04-11 12:46:36,048 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)\n", | |
"2018-04-11 12:46:36,383 INFO sqlalchemy.engine.base.Engine \n", | |
"SELECT sum(x.checked), sum(x.covered), x.team, x.date1 from\n", | |
" (select sum(uaf.lines_check) as checked, sum(uaf.cov_lines) as covered, uaf.team as team, CAST(uaf.date_time as date) as date1\n", | |
" from ut_all_files uaf\n", | |
" left JOIN ut_details utd on uaf.src_file = utd.src_file and uaf.team = utd.team and uaf.buildnum = utd.buildnum\n", | |
" left join ut_exclude_head_file uehf on uaf.src_file = uehf.file_name and uaf.team = uehf.team and CAST(uaf.date_time as date) = CAST(uehf.date as date)\n", | |
" WHERE IS_UT_FILE(uaf.src_file, uaf.team) = 0 and utd.src_file is NULL and uehf.file_name is NULL and uaf.date_time >= %s and uaf.date_time < %s \n", | |
" GROUP BY uaf.team, date1\n", | |
" union\n", | |
" select sum(utd.lines_check) as checked, sum(utd.cov_lines) as covered, utd.team as team, CAST(utd.date_time as date) as date1\n", | |
" from ut_details utd\n", | |
" left join ut_exclude_head_file uehf on utd.src_file = uehf.file_name and utd.team = uehf.team and CAST(utd.date_time as date) = CAST(uehf.date as date)\n", | |
" WHERE IS_UT_FILE(utd.src_file, utd.team) = 0 and uehf.file_name is NULL and utd.date_time >= %s and utd.date_time < %s\n", | |
" GROUP BY utd.team, date1) x\n", | |
"GROUP BY x.team, x.date1\n", | |
"\n", | |
"2018-04-11 12:46:36,385 INFO sqlalchemy.engine.base.Engine ('2018-04-01', '2018-04-06', '2018-04-01', '2018-04-06')\n", | |
"DB 37328 32416 2018-04-01\n", | |
"DB 37328 32416 2018-04-02\n", | |
"DB 27996 24312 2018-04-03\n", | |
"DB 37328 32416 2018-04-04\n", | |
"FWS 87244 65065 2018-04-01\n", | |
"FWS 87653 65355 2018-04-02\n", | |
"FWS 67344 50275 2018-04-03\n", | |
"FWS 89792 67022 2018-04-04\n", | |
"FWV 143312 116991 2018-04-01\n", | |
"FWV 143312 116965 2018-04-02\n", | |
"FWV 107484 87749 2018-04-03\n", | |
"FWV 143399 116958 2018-04-04\n", | |
"SAM 85424 48571 2018-04-01\n", | |
"SAM 84811 53431 2018-04-02\n", | |
"SAM 63642 40313 2018-04-03\n", | |
"SAM 84858 53754 2018-04-04\n", | |
"SLAM 84508 42768 2018-04-01\n", | |
"SLAM 84508 42768 2018-04-02\n", | |
"SLAM 63381 32076 2018-04-03\n", | |
"SLAM 84508 42768 2018-04-04\n", | |
"STORM 43912 24388 2018-04-01\n", | |
"STORM 43912 24388 2018-04-02\n", | |
"STORM 32934 18291 2018-04-03\n", | |
"STORM 43912 24388 2018-04-04\n", | |
"SYS 76040 60502 2018-04-01\n", | |
"SYS 76040 60488 2018-04-02\n", | |
"SYS 57030 45371 2018-04-03\n", | |
"SYS 76040 60466 2018-04-04\n", | |
"2018-04-11 12:47:04,362 INFO sqlalchemy.engine.base.Engine COMMIT\n" | |
] | |
} | |
], | |
"source": [ | |
"#!/usr/bin/env python3\n", | |
"import json\n", | |
"import sys\n", | |
"\n", | |
"from sqlalchemy import create_engine\n", | |
"\n", | |
"query = '''\n", | |
"SELECT sum(x.checked), sum(x.covered), x.team, x.date1 from\n", | |
" (select sum(uaf.lines_check) as checked, sum(uaf.cov_lines) as covered, uaf.team as team, CAST(uaf.date_time as date) as date1\n", | |
" from ut_all_files uaf\n", | |
" left JOIN ut_details utd on uaf.src_file = utd.src_file and uaf.team = utd.team and uaf.buildnum = utd.buildnum\n", | |
" left join ut_exclude_head_file uehf on uaf.src_file = uehf.file_name and uaf.team = uehf.team and CAST(uaf.date_time as date) = CAST(uehf.date as date)\n", | |
" WHERE IS_UT_FILE(uaf.src_file, uaf.team) = 0 and utd.src_file is NULL and uehf.file_name is NULL and uaf.date_time >= %s and uaf.date_time < %s \n", | |
" GROUP BY uaf.team, date1\n", | |
" union\n", | |
" select sum(utd.lines_check) as checked, sum(utd.cov_lines) as covered, utd.team as team, CAST(utd.date_time as date) as date1\n", | |
" from ut_details utd\n", | |
" left join ut_exclude_head_file uehf on utd.src_file = uehf.file_name and utd.team = uehf.team and CAST(utd.date_time as date) = CAST(uehf.date as date)\n", | |
" WHERE IS_UT_FILE(utd.src_file, utd.team) = 0 and uehf.file_name is NULL and utd.date_time >= %s and utd.date_time < %s\n", | |
" GROUP BY utd.team, date1) x\n", | |
"GROUP BY x.team, x.date1\n", | |
"'''\n", | |
"\n", | |
"\n", | |
"def connection_str():\n", | |
" conn_str = 'mysql+mysqlconnector://%s:%s@%s/%s' % ('devops', '****',\n", | |
" '10.74.16.252', 'cm_data')\n", | |
" return conn_str\n", | |
"\n", | |
"\n", | |
"def create_mysql_engine():\n", | |
" global engine\n", | |
" conn_str = connection_str()\n", | |
" engine = create_engine(conn_str, echo=True, pool_size=20, pool_recycle=3600)\n", | |
"\n", | |
"\n", | |
"if __name__ == '__main__':\n", | |
" begin = '2018-04-01'\n", | |
" end = '2018-04-06'\n", | |
" create_mysql_engine()\n", | |
" with engine.begin() as connection:\n", | |
" r1 = connection.execute(query, begin, end, begin, end)\n", | |
" if r1:\n", | |
" for checked, covered, team, date, in r1:\n", | |
" print(team, checked, covered, date)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 17, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"2018-04-11 12:52:51,359 INFO sqlalchemy.engine.base.Engine SHOW VARIABLES LIKE 'sql_mode'\n", | |
"2018-04-11 12:52:51,361 INFO sqlalchemy.engine.base.Engine {}\n", | |
"2018-04-11 12:52:52,032 INFO sqlalchemy.engine.base.Engine SELECT DATABASE()\n", | |
"2018-04-11 12:52:52,035 INFO sqlalchemy.engine.base.Engine {}\n", | |
"2018-04-11 12:52:53,373 INFO sqlalchemy.engine.base.Engine SELECT CAST('test plain returns' AS CHAR(60)) AS anon_1\n", | |
"2018-04-11 12:52:53,375 INFO sqlalchemy.engine.base.Engine {}\n", | |
"2018-04-11 12:52:54,043 INFO sqlalchemy.engine.base.Engine SELECT CAST('test unicode returns' AS CHAR(60)) AS anon_1\n", | |
"2018-04-11 12:52:54,044 INFO sqlalchemy.engine.base.Engine {}\n", | |
"2018-04-11 12:52:55,047 INFO sqlalchemy.engine.base.Engine SHOW FULL TABLES FROM `cm_data`\n", | |
"2018-04-11 12:52:55,048 INFO sqlalchemy.engine.base.Engine {}\n", | |
"2018-04-11 12:52:55,720 INFO sqlalchemy.engine.base.Engine SHOW CREATE TABLE `aws_billing`\n", | |
"2018-04-11 12:52:55,721 INFO sqlalchemy.engine.base.Engine {}\n", | |
"2018-04-11 12:52:56,409 INFO sqlalchemy.engine.base.Engine SHOW CREATE TABLE `aws_cpu_utilization`\n", | |
"2018-04-11 12:52:56,410 INFO sqlalchemy.engine.base.Engine {}\n", | |
"2018-04-11 12:52:57,082 INFO sqlalchemy.engine.base.Engine SHOW CREATE TABLE `aws_instances_daily`\n", | |
"2018-04-11 12:52:57,082 INFO sqlalchemy.engine.base.Engine {}\n", | |
"2018-04-11 12:52:57,752 INFO sqlalchemy.engine.base.Engine SHOW CREATE TABLE `aws_resource_name`\n", | |
"2018-04-11 12:52:57,753 INFO sqlalchemy.engine.base.Engine {}\n", | |
"2018-04-11 12:52:58,425 INFO sqlalchemy.engine.base.Engine SHOW CREATE TABLE `bamboo_error_team`\n", | |
"2018-04-11 12:52:58,427 INFO sqlalchemy.engine.base.Engine {}\n", | |
"2018-04-11 12:52:59,099 INFO sqlalchemy.engine.base.Engine SHOW CREATE TABLE `bamboo_incremental_dependencies_info`\n", | |
"2018-04-11 12:52:59,101 INFO sqlalchemy.engine.base.Engine {}\n", | |
"2018-04-11 12:52:59,773 INFO sqlalchemy.engine.base.Engine SHOW CREATE TABLE `bamboo_incremental_job_info`\n", | |
"2018-04-11 12:52:59,775 INFO sqlalchemy.engine.base.Engine {}\n", | |
"2018-04-11 12:53:00,447 INFO sqlalchemy.engine.base.Engine SHOW CREATE TABLE `bamboo_incremental_plan_info`\n", | |
"2018-04-11 12:53:00,449 INFO sqlalchemy.engine.base.Engine {}\n", | |
"2018-04-11 12:53:01,121 INFO sqlalchemy.engine.base.Engine SHOW CREATE TABLE `bamboo_package_size`\n", | |
"2018-04-11 12:53:01,123 INFO sqlalchemy.engine.base.Engine {}\n", | |
"2018-04-11 12:53:01,799 INFO sqlalchemy.engine.base.Engine SHOW CREATE TABLE `bamboo_plan_duration`\n", | |
"2018-04-11 12:53:01,800 INFO sqlalchemy.engine.base.Engine {}\n", | |
"2018-04-11 12:53:02,475 INFO sqlalchemy.engine.base.Engine SHOW CREATE TABLE `bamboo_repos_file_size`\n", | |
"2018-04-11 12:53:02,476 INFO sqlalchemy.engine.base.Engine {}\n", | |
"2018-04-11 12:53:03,147 INFO sqlalchemy.engine.base.Engine SHOW CREATE TABLE `bamboo_repos_size`\n", | |
"2018-04-11 12:53:03,149 INFO sqlalchemy.engine.base.Engine {}\n", | |
"2018-04-11 12:53:03,820 INFO sqlalchemy.engine.base.Engine SHOW CREATE TABLE `team_dates`\n", | |
"2018-04-11 12:53:03,822 INFO sqlalchemy.engine.base.Engine {}\n", | |
"2018-04-11 12:53:04,493 INFO sqlalchemy.engine.base.Engine SHOW CREATE TABLE `team_names`\n", | |
"2018-04-11 12:53:04,496 INFO sqlalchemy.engine.base.Engine {}\n", | |
"2018-04-11 12:53:05,166 INFO sqlalchemy.engine.base.Engine SHOW CREATE TABLE `team_paths`\n", | |
"2018-04-11 12:53:05,168 INFO sqlalchemy.engine.base.Engine {}\n", | |
"2018-04-11 12:53:05,838 INFO sqlalchemy.engine.base.Engine SHOW CREATE TABLE `team_size_check_paths`\n", | |
"2018-04-11 12:53:05,840 INFO sqlalchemy.engine.base.Engine {}\n", | |
"2018-04-11 12:53:06,511 INFO sqlalchemy.engine.base.Engine SHOW CREATE TABLE `team_total_lines`\n", | |
"2018-04-11 12:53:06,512 INFO sqlalchemy.engine.base.Engine {}\n", | |
"2018-04-11 12:53:07,183 INFO sqlalchemy.engine.base.Engine SHOW CREATE TABLE `test_1`\n", | |
"2018-04-11 12:53:07,185 INFO sqlalchemy.engine.base.Engine {}\n", | |
"2018-04-11 12:53:07,854 INFO sqlalchemy.engine.base.Engine SHOW CREATE TABLE `ut_all_files`\n", | |
"2018-04-11 12:53:07,857 INFO sqlalchemy.engine.base.Engine {}\n", | |
"2018-04-11 12:53:08,530 INFO sqlalchemy.engine.base.Engine SHOW CREATE TABLE `ut_coverage_tmp`\n", | |
"2018-04-11 12:53:08,531 INFO sqlalchemy.engine.base.Engine {}\n", | |
"2018-04-11 12:53:09,201 INFO sqlalchemy.engine.base.Engine SHOW CREATE TABLE `ut_details`\n", | |
"2018-04-11 12:53:09,202 INFO sqlalchemy.engine.base.Engine {}\n", | |
"2018-04-11 12:53:09,873 INFO sqlalchemy.engine.base.Engine SHOW CREATE TABLE `ut_exclude_head_file`\n", | |
"2018-04-11 12:53:09,875 INFO sqlalchemy.engine.base.Engine {}\n", | |
"2018-04-11 12:53:10,549 INFO sqlalchemy.engine.base.Engine SHOW CREATE TABLE `weekly_remain_instance`\n", | |
"2018-04-11 12:53:10,551 INFO sqlalchemy.engine.base.Engine {}\n", | |
"2018-04-11 12:53:11,256 INFO sqlalchemy.engine.base.Engine BEGIN (implicit)\n", | |
"2018-04-11 12:53:11,591 INFO sqlalchemy.engine.base.Engine SELECT bamboo_error_team.plan_key AS bamboo_error_team_plan_key, bamboo_error_team.build_num AS bamboo_error_team_build_num \n", | |
"FROM bamboo_error_team \n", | |
"WHERE bamboo_error_team.state = %(state_1)s AND bamboo_error_team.end_date + %(end_date_1)s < %(param_1)s\n", | |
"2018-04-11 12:53:11,592 INFO sqlalchemy.engine.base.Engine {'state_1': 0, 'end_date_1': 7200, 'param_1': 1523422391.255745}\n", | |
"set()\n", | |
"2018-04-11 12:53:11,930 INFO sqlalchemy.engine.base.Engine COMMIT\n" | |
] | |
} | |
], | |
"source": [ | |
"#!/usr/bin/env python3\n", | |
"from contextlib import contextmanager\n", | |
"import datetime\n", | |
"import json\n", | |
"import sys\n", | |
"\n", | |
"from sqlalchemy.ext.automap import automap_base\n", | |
"from sqlalchemy.orm import sessionmaker\n", | |
"from sqlalchemy import create_engine\n", | |
"\n", | |
"@contextmanager\n", | |
"def session_scope():\n", | |
" \"\"\"Provide a transactional scope around a series of operations.\"\"\"\n", | |
" Session = sessionmaker(bind=engine)\n", | |
" session = Session()\n", | |
" try:\n", | |
" yield session\n", | |
" session.commit()\n", | |
" except:\n", | |
" session.rollback()\n", | |
" raise\n", | |
" finally:\n", | |
" session.close()\n", | |
" \n", | |
" \n", | |
"def connection_str():\n", | |
" conn_str = 'mysql+mysqlconnector://%s:%s@%s/%s' % ('devops', '*******',\n", | |
" '10.74.16.252', 'cm_data')\n", | |
" return conn_str\n", | |
"\n", | |
"def get_class_bamboo_failures():\n", | |
" global engine, BambooFailures\n", | |
" conn_str = connection_str()\n", | |
" Base = automap_base()\n", | |
" engine = create_engine(conn_str, echo=True, pool_size=20, pool_recycle=3600)\n", | |
" Base.prepare(engine, reflect=True)\n", | |
" BambooFailures = Base.classes.bamboo_error_team\n", | |
"\n", | |
"\n", | |
"def create_mysql_engine():\n", | |
" global engine\n", | |
" conn_str = connection_str()\n", | |
" engine = create_engine(conn_str, echo=True, pool_size=20, pool_recycle=3600)\n", | |
"\n", | |
"\n", | |
"def main():\n", | |
" get_class_bamboo_failures()\n", | |
"\n", | |
" now = datetime.datetime.utcnow()\n", | |
" now_stamp = (now - datetime.datetime(1970, 1, 1)).total_seconds()\n", | |
" with session_scope() as session:\n", | |
" failures = session.query(BambooFailures.plan_key, BambooFailures.build_num).filter(\n", | |
" BambooFailures.state == 0, BambooFailures.end_date + 7200 < now_stamp)\n", | |
"\n", | |
" to_check_list = set()\n", | |
" for each in failures:\n", | |
" print(each)\n", | |
" to_check_list.add(each)\n", | |
" \n", | |
" print(to_check_list)\n", | |
"\n", | |
"\n", | |
"if __name__ == '__main__':\n", | |
" main() " | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 34, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<Figure size 864x288 with 1 Axes>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"import datetime\n", | |
"import matplotlib.pyplot as plt\n", | |
"from matplotlib.dates import DayLocator, HourLocator, DateFormatter, drange\n", | |
"from numpy import arange, array\n", | |
"\n", | |
"\n", | |
"def generate_chart(start_day, end_day):\n", | |
" delta = datetime.timedelta(hours=24)\n", | |
" dates = drange(start_day, end_day, delta)\n", | |
"\n", | |
" costs = [1, 2, 3, 4, 5, 6, 7]\n", | |
" y1 = array(costs)\n", | |
" costs = [7, 9, 31, 14, 15, 1, 7]\n", | |
" y2 = array(costs)\n", | |
"\n", | |
" fig, ax = plt.subplots()\n", | |
" end_day = end_day - datetime.timedelta(days=1)\n", | |
" ax.set_title('Cost Chart from %s to %s' % (start_day.strftime('%Y-%m-%d'), end_day.strftime('%Y-%m-%d')))\n", | |
" font = {\n", | |
" 'size': '16'\n", | |
" }\n", | |
" ax.set_ylabel('cost($)', fontdict=font)\n", | |
" ax.plot_date(dates, y1, '-')\n", | |
" ax.plot_date(dates, y2, '-')\n", | |
" plt.legend(['cost1', 'cost2'], loc='upper left')\n", | |
" fig.set_figwidth(12)\n", | |
"\n", | |
" # this is superfluous, since the autoscaler should get it right, but\n", | |
" # use date2num and num2date to convert between dates and floats if\n", | |
" # you want; both date2num and num2date convert an instance or sequence\n", | |
" ax.set_xlim(dates[0], dates[-1])\n", | |
"\n", | |
" # The hour locator takes the hour or sequence of hours you want to\n", | |
" # tick, not the base multiple\n", | |
"\n", | |
" ax.xaxis.set_major_locator(DayLocator())\n", | |
" ax.xaxis.set_minor_locator(HourLocator(arange(0, 25, 6)))\n", | |
" ax.xaxis.set_major_formatter(DateFormatter('%Y-%m-%d'))\n", | |
"\n", | |
" ax.fmt_xdata = DateFormatter('%Y-%m-%d %H:%M:%S')\n", | |
" fig.autofmt_xdate()\n", | |
"\n", | |
" plt.plot()\n", | |
"\n", | |
"\n", | |
"if __name__ == '__main__':\n", | |
" start_day = datetime.datetime.strptime('2018-04-01', '%Y-%m-%d')\n", | |
" end_day = datetime.datetime.strptime('2018-04-08', '%Y-%m-%d')\n", | |
" generate_chart(start_day, end_day)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 32, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"-1\n" | |
] | |
}, | |
{ | |
"data": { | |
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA68AAAGrCAYAAAAvlqHWAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzt3Xu4XWV9L/rvLyEQIBH3xoBAjMGtRWiAgBGpCgSxRyy06lGLCFr0eGJlW/EWobvytHTrKSpWrBXdqGyrlUsLRSpaKz1AgUrlogkXUy+ksQa8AC2Va8Tw7j/mDC4WSVhZWWuuMZPP53nWkznHeMd4f3PlfeZc3/mOS7XWAgAAAF02baoLAAAAgCcivAIAANB5wisAAACdJ7wCAADQecIrAAAAnSe8AgAA0HnCKwAMkaq6r6qesZH1q6rqxYOsCQAGQXgFgE0wUeGwqk6oqmueoM2VVfWmkctaa7Naayv76z9bVe/b3FoAYBgIrwAAAHSe8AoAY1RVn08yL8mX+ofvvqe//OCq+npV3VNVy6tq8YhtTqiqlVV1b1X9a1UdV1V7J/lkkl/r7+ee9fT1/iSHJPnzfps/7y9vVfXMqlqS5Lgk7+mv/9J69jGtqk6pqtuq6u6q+quq+q+T8KsBgElXrbWprgEAhkZVrUryptbaP/Sf75HkpiSvS/LVJEckOT/Js5M8kORHSZ7bWvtOVe2W5L+21m6tqhP6+3nhRvq6MslfttY+PWJZS/Ks1tr3q+qzSVa31t67vvqq6qQkxyZ5VZI7k/xZkie11o6diN8FAAySmVcA2DzHJ/lKa+0rrbVHWmuXJbkhyW/01z+SZEFVbd9a+1Fr7dYB1va7Sf6gtba6tbYmyR8leVVVbTPAGgBgQgivALB5np7k1f1Dhu/pHwL8wiS7tdbuT3JMeiHyR1X15ap69oBru3hEXSuSrE2y6wBrAIAJIbwCwKYZfb7ND5N8vrX25BE/O7bWTk+S1trft9Z+PcluSf4lyac2sJ+x9LWp63+Y5KWjapvZWrt9DH0DQKcIrwCwaX6SZOR9Vv8yyW9W1UuqanpVzayqxVU1t6p2raqXVdWOSdYkuS+9w4jX7WduVW27CX1t6vpPJnl/VT09SapqTlW9bOMvDwC6SXgFgE3zJ0ne2z8U992ttR8meVmS/5HeRZF+mGRpep+x05K8M8kdSf49yWFJ3tLfz+VJbk3y46q6awN9fTS9c1T/o6r+bD3rP5Nkn34tX9zA9n+b5GtVdW+Sf07yvE1+xQDQAa42DAAAQOeZeQUAAKDzhFcAAAA6T3gFAACg84RXAAAAOm+bqS7giTzlKU9p8+fPn+oyAAAAmGA33njjXa21OWNp2/nwOn/+/Nxwww1TXQYAAAATrKp+MNa2DhsGAACg84RXAAAAOk94BQAAoPM6f87r+jz88MNZvXp1HnrooakupfNmzpyZuXPnZsaMGVNdCgAAwLgNZXhdvXp1Zs+enfnz56eqprqczmqt5e67787q1auz5557TnU5AAAA4zaUhw0/9NBD2XnnnQXXJ1BV2Xnnnc1QAwAAQ28ow2sSwXWM/J4AAIAtwdCGVwAAALYeQ3nO62i7XLLHhO7vpy+7fUL3tyne9KY35Z3vfGf22WefKasBAACga7aI8DqVWmtprWXatImZxP70pz89IfsBAADYkjhseBxWrVqVvfbaK69//euzYMGCTJ8+/dF1F154YU444YQkyQknnJC3ve1tef7zn59nPOMZufDCC5MkV155ZRYvXpxXvepVefazn53jjjsurbUkyeLFi3PDDTckSWbNmpU/+IM/yP7775+DDz44P/nJT5Ikt912Ww4++ODsu+++ee9735tZs2YN8NUDAAAMnvA6Tt/73vdy4okn5tZbb82OO+64wXY/+tGPcs011+TSSy/NKaec8ujyb33rWznzzDPz7W9/OytXrsw//dM/PW7b+++/PwcffHCWL1+eQw89NJ/61KeSJCeddFJOOumk3HzzzZk7d+7EvzgAAICOEV7H6elPf3oOPvjgJ2z38pe/PNOmTcs+++zz6Mxpkhx00EGZO3dupk2bloULF2bVqlWP23bbbbfN0UcfnSR5znOe82iba6+9Nq9+9auTJK997Ws3/8UAAAB03MDDa1U9uaourKp/qaoVVfVrg65hIoycbR15O5rR91TdbrvtHn287tDg0cunT5+eX/ziF4/rY8aMGY/ue0NtAAAAtgZTMfP60SRfba09O8n+SVZMQQ0Tatddd82KFSvyyCOP5OKLL570/g4++OBcdNFFSZLzzz9/0vsDAACYagO92nBV7ZTk0CQnJElr7edJfr65+53KW9skyemnn56jjz46c+bMyaJFi3LfffdNan9nnnlmjj/++Lz//e/PkUcemZ122mlS+wMAAJhqNfJQ1knvrGphkrOTfDu9Wdcbk5zUWrt/VLslSZYkybx5857zgx/84DH7WbFiRfbee++B1NxFDzzwQLbffvtUVc4///ycd955ueSSSzbYfmv/fQEAwOba5ZI9xr3tqbefPO5t37xy6bi3TZJtz1izWdtPtqq6sbW2aCxtB33Y8DZJDkzyidbaAUnuT3LK6EattbNba4taa4vmzJkz4BK778Ybb8zChQuz33775ayzzsqHP/zhqS4JAABgUg30sOEkq5Osbq19o//8wqwnvLJxhxxySJYvXz7VZQAAAAzMQGdeW2s/TvLDqtqrv+iI9A4hBgAAgA0a9Mxrkvxeki9U1bZJViZ5wxTUAAAAwBAZeHhtrS1LMqYTcgEAACCZmvu8AgAAwCaZisOGJ9zHzvqzCd3f7534tk3e5swzz8ySJUuyww47TGgtY7V48eKcccYZWbTIpDYAALDlMfM6Qc4888w88MADU10GAADAFkl4HYf7778/Rx11VPbff/8sWLAgp512Wu64444cfvjhOfzww5Mk5513Xvbdd98sWLAgJ5/8y5sSz5o1K+94xzvyq7/6qzniiCNy5513JunNnJ500klZuHBhFixYkOuuu+7Rvt74xjfmoIMOygEHHJBLLrkkSfLggw/mNa95Tfbee++84hWvyIMPPjjg3wIAAMDgCK/j8NWvfjW77757li9fnltuuSVvf/vbs/vuu+eKK67IFVdckTvuuCMnn3xyLr/88ixbtizXX399vvjFLybphdFFixbl1ltvzWGHHZbTTjvt0f0+8MADWbZsWc4666y88Y1vTJK8//3vz4te9KJcd911ueKKK7J06dLcf//9+cQnPpEddtghK1asyGmnnZYbb7xxSn4XAAAAgyC8jsO+++6byy67LCeffHKuvvrq7LTTTo9Zf/3112fx4sWZM2dOttlmmxx33HG56qqrkiTTpk3LMccckyQ5/vjjc8011zy63bHHHpskOfTQQ/Ozn/0s99xzT772ta/l9NNPz8KFC7N48eI89NBD+bd/+7dcddVVOf7445Mk++23X/bbb79BvHQAAIApsUVcsGnQfuVXfiXf/OY385WvfCXvfe97c8QRR4x7X1W13sfrnrfWctFFF2WvvfYadx8AAADDzszrONxxxx3ZYYcdcvzxx2fp0qX55je/mdmzZ+fee+9Nkhx00EH5x3/8x9x1111Zu3ZtzjvvvBx22GFJkkceeSQXXnhhkuTcc8/NC1/4wkf3e8EFFyRJrrnmmuy0007Zaaed8pKXvCQf+9jH0lpLknzrW99K0pudPffcc5Mkt9xyS2666abBvHgAAIApsEXMvI7n1jab4+abb87SpUszbdq0zJgxI5/4xCdy7bXX5sgjj3z03NfTTz89hx9+eFprOeqoo/Kyl70sSbLjjjvmuuuuy/ve977ssssujwbWJJk5c2YOOOCAPPzwwznnnHOSJKeeemre/va3Z7/99ssjjzySPffcM5deemne8pa35A1veEP23nvv7L333nnOc54z0N8BAADAINW6Gb2uWrRoUbvhhhses2zFihXZe++9p6iizTNr1qzcd999j1s+mfdpHebfFwAAdMEul+wx7m1Pvf3kJ260AW9euXTc2ybJtmes2aztJ1tV3dhaG1MIctgwAAAAnbdFHDY8TNY365okV1555WALAQAAGCJmXgEAAOg84RUAAIDOE14BAADoPOEVAACAztsiLtj083dvN6H7e6LLSd9zzz0599xzc+KJJ26wzapVq/L1r389r33taze6r1WrVuXoo4/OLbfcMq5aAQAAtgZmXsfhnnvuyVlnnbXRNqtWrcq55547oIoAAAC2bMLrOJxyyim57bbbsnDhwixdujRLly7NggULsu++++aCCy54tM3VV1+dhQsX5iMf+UhWrVqVQw45JAceeGAOPPDAfP3rX5/iVwEAADA8tojDhgft9NNPzy233JJly5bloosuyic/+cksX748d911V5773Ofm0EMPzemnn54zzjgjl156aZLkgQceyGWXXZaZM2fme9/7Xo499tjccMMNU/xKAAAAhoPwupmuueaaHHvssZk+fXp23XXXHHbYYbn++uvzpCc96THtHn744bz1rW/NsmXLMn369Hz3u9+doooBAACGj/A6IB/5yEey6667Zvny5XnkkUcyc+bMqS4JAABgaDjndRxmz56de++9N0lyyCGH5IILLsjatWtz55135qqrrspBBx30mDZJ8p//+Z/ZbbfdMm3atHz+85/P2rVrp6p8AACAobNFzLw+0a1tJtrOO++cF7zgBVmwYEFe+tKXZr/99sv++++fqsoHP/jBPPWpT83OO++c6dOnZ//9988JJ5yQ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\n", | |
"text/plain": [ | |
"<Figure size 1152x504 with 1 Axes>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"def generate_group_bar_chart(title, ylabel, teams, *other):\n", | |
" fig, ax = plt.subplots()\n", | |
" ax.set_title('test title')\n", | |
" font = {\n", | |
" 'size': '16'\n", | |
" }\n", | |
" ax.set_ylabel(ylabel, fontdict=font)\n", | |
"\n", | |
" x = arange(len(teams))\n", | |
"\n", | |
" width = 0.1\n", | |
" i = -int(len(other) / 2)\n", | |
" print(i)\n", | |
" for y, label, color in other:\n", | |
" ax.bar(x + i * width, y, width=width, align='center', color=color, label=label)\n", | |
" i += 1\n", | |
"\n", | |
" plt.legend()\n", | |
"\n", | |
" ax.autoscale_view()\n", | |
" fig.set_figwidth(16)\n", | |
" fig.set_figheight(7)\n", | |
"\n", | |
" plt.xticks(x + (i - 1) * width, teams)\n", | |
"\n", | |
" plt.plot()\n", | |
" \n", | |
"if __name__ == '__main__':\n", | |
" teams = ['TEST', 'SYS', 'DELIVERY', 'SAM', 'SLAM', 'STORM']\n", | |
" num1s = [1, 2, 3, 4, 5, 6]\n", | |
" num2s = [1, 2, 3, 4, 5, 6]\n", | |
" num3s = [1, 2, 3, 4, 5, 6]\n", | |
" y, z, k = (num1s, 'running', 'xkcd:green'), (num2s, 'stopped', 'xkcd:grey'), (num3s, 'total', 'xkcd:orange') \n", | |
" generate_group_bar_chart('test title', 'y data', teams, y, z, k)\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"import sys\n", | |
"from flask import Flask, request\n", | |
"import jinja2\n", | |
"import requests\n", | |
"from pyquery import PyQuery as pq\n", | |
"\n", | |
"@app.route(\"/flask/api/training\")\n", | |
"def training():\n", | |
" bamboo_name = config['bamboo_name']\n", | |
" bamboo_pw = config['bamboo_pw']\n", | |
" auth = (bamboo_name, bamboo_pw,)\n", | |
" r = requests.get('https://confluence.ygomi.com:8443/rest/api/content/40928055?expand=body.view', auth=auth)\n", | |
" info = r.json()\n", | |
" html = info['body']['view']['value']\n", | |
" doc = pq(html)\n", | |
" element = doc('table')\n", | |
" element.css('width', '100%')\n", | |
" element.toggle_class('table-dark')\n", | |
"\n", | |
" rv = '''<link rel=\"stylesheet\" href=\"http://dashboard.ygomi.com/public/build/grafana.dark.css?v5.0.1\">\n", | |
" <div class=\"markdown-html panel-text-content\">''' + doc.html() + '</div>'\n", | |
" return rv\n", | |
"\n", | |
"\n", | |
"@app.route(\"/flask/bamboo.html\")\n", | |
"def bamboo_html():\n", | |
" plan_name = request.args.get('plan_name')\n", | |
" s = render('templates/bamboo.html', {'plan_name': plan_name})\n", | |
" return s\n", | |
"\n", | |
"\n", | |
"if __name__ == \"__main__\":\n", | |
" port = int(os.environ.get(\"PORT\", 5000))\n", | |
" app = Flask(__name__)\n", | |
" if len(sys.argv) > 1:\n", | |
" config_file = sys.argv[1]\n", | |
" else:\n", | |
" config_file = 'config.json'\n", | |
" with open(config_file, 'rb') as f:\n", | |
" config = json.load(f)\n", | |
" app.run(host='0.0.0.0', port=port)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"<html>\n", | |
"<head>\n", | |
" <link rel=\"stylesheet\" href=\"http://dashboard.ygomi.com/public/build/grafana.dark.css?v5.0.1\">\n", | |
" <script type=\"text/javascript\" src=\"http://cdn.jsdelivr.net/jquery/1/jquery.min.js\"></script>\n", | |
"</head>\n", | |
"<script>\n", | |
" window.onload = function () {\n", | |
" $.ajax({\n", | |
" url: \"/flask/api/bamboo?plan_name={{ plan_name }}\",\n", | |
" }).done(function (msg) {\n", | |
" let data = JSON.parse(msg);\n", | |
" let data_len = data['contents'].length;\n", | |
" let contents = data['contents'];\n", | |
" console.log(data_len);\n", | |
" if (data_len > 1) {\n", | |
" let count = data_len < 9 ? data_len : 9;\n", | |
" for (let i = 0; i < count; i++) {\n", | |
" var s = '<li><a class=\"table-panel-page-link pointer \">' + (i + 1).toString() + '</a></li>'\n", | |
" $('.table-panel-footer ul').append($(s));\n", | |
" $('.table-panel-footer ul').children().first().children().addClass('active');\n", | |
" }\n", | |
" }\n", | |
" if (data_len > 0) {\n", | |
" var s = '<table style=\"width: 100%\"><tbody><tr><th>num</th><th>status</th><th>date</th><th>duration</th></tr>';\n", | |
" if (\"{{ plan_name }}\" === \"0_L1_rdb_2_0_build\") {\n", | |
" s = '<table style=\"width: 100%\"><tbody><tr><th>num</th><th>status</th><th>date</th><th>duration</th><th>ut</th><th>e2e</th></tr>';\n", | |
" }\n", | |
" for (let i = 0; i < 20; i++) {\n", | |
" let line = contents[i];\n", | |
" s += '<tr>' + '<td>' + line['num'] + '</td>' + '<td>' + line['status'] + '</td>' + '<td>' + line['date'] + '</td>' + '<td>' + line['duration'] + '</td>';\n", | |
" if (\"{{ plan_name }}\" === \"0_L1_rdb_2_0_build\") {\n", | |
" let link = \"https://bamboo-aws.ygomi.com:8443/browse/TOOL-UT-\" + line['num'] + \"/artifact/shared/Coverage_Report/ut_group_details\";\n", | |
" let text = 'ut_' + line['num'];\n", | |
" s += '<td><a target=\"_blank\" href=\"' + link + '\">' + text + '</a></td>';\n", | |
" link = \"http://10.69.130.22/RDB20/\" + line['num'];\n", | |
" text = 'e2e_' + line['num'];\n", | |
" s += '<td><a target=\"_blank\" href=\"' + link + '\">' + text + '</a></td>';\n", | |
" }\n", | |
" s += '</tr>';\n", | |
" }\n", | |
" s += '</tbody></table>';\n", | |
" $('div.markdown-html.panel-text-content').append($(s));\n", | |
" }\n", | |
" });\n", | |
" };\n", | |
"</script>\n", | |
"<body>\n", | |
"<div class=\"markdown-html panel-text-content\">\n", | |
"\n", | |
"</div>\n", | |
"\n", | |
"<div class=\"table-panel-footer\">\n", | |
" <ul>\n", | |
" </ul>\n", | |
"</div>\n", | |
"</body>\n", | |
"</html>" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python 3", | |
"language": "python", | |
"name": "python3" | |
}, | |
"language_info": { | |
"codemirror_mode": { | |
"name": "ipython", | |
"version": 3 | |
}, | |
"file_extension": ".py", | |
"mimetype": "text/x-python", | |
"name": "python", | |
"nbconvert_exporter": "python", | |
"pygments_lexer": "ipython3", | |
"version": "3.6.4" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 2 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment