Merge branch 'master' of gitlab.odin.cse.buffalo.edu:odin-lab/Website

This commit is contained in:
Oliver Kennedy 2016-09-22 14:58:34 -04:00
commit 12f98e057c
9 changed files with 432 additions and 352 deletions

2
.gitignore vendored
View file

@ -3,3 +3,5 @@ build
*.aux *.aux
*.log *.log
artifacts artifacts
*.pdf
*.tex

View file

@ -149,3 +149,32 @@ directory "build/artifacts"
task :deploy => [:documents,:odin_lab,"build/artifacts"] do task :deploy => [:documents,:odin_lab,"build/artifacts"] do
system("cp -r artifacts/*.{pdf,json} build/artifacts/") system("cp -r artifacts/*.{pdf,json} build/artifacts/")
end end
###################### Specialized Stuff for Individual Use ######################
file "okennedy_short.tex" => (["db/cv/okennedy.json", "lib/cv.rb", "Rakefile"]+Dir["db/cv/okennedy/**"]) do
File.open("okennedy_short.tex", "w+") do |fh|
CV.make("okennedy", fh,
title: "Recent Activities",
since: {
education: 2008,
reviewer: 2015,
general_service: 2015,
volunteering: 2015,
talks: 2015,
courses: 2015,
publications: 2014
},
skip: [
:employment,
:memberships,
:dept_service,
:tech_reports
]
)
end
end
file "okennedy_short.pdf" => "okennedy_short.tex" do
system("pdflatex okennedy_short.tex")
end

View file

@ -101,7 +101,10 @@
} }
], ],
"honors" : [ "honors" : [
"The pVLDB 2012 paper titled \"DBToaster: Higher-order Delta Processing for Dynamic, Frequently Fresh Views\" was accepted to the \"Best of VLDB 2012\" issue of the VLDB Journal" { "description" :
"The pVLDB 2012 paper titled \"DBToaster: Higher-order Delta Processing for Dynamic, Frequently Fresh Views\" was accepted to the \"Best of VLDB 2012\" issue of the VLDB Journal",
"year" : 2012
}
], ],
"reviewer" : [ "reviewer" : [
{ "venue" : "VLDBJ", "years" : [ 2013 ] }, { "venue" : "VLDBJ", "years" : [ 2013 ] },
@ -165,8 +168,14 @@
{ "code" : "CSE 562", { "code" : "CSE 562",
"title" : "Graduate Database Systems (planned)", "title" : "Graduate Database Systems (planned)",
"semester" : "Spring 2017" }, "semester" : "Spring 2017" },
{ "code" : "CSE 199",
"title" : "Undergraduate CS Seminar (Recitation)",
"semester" : "Fall 2016" },
{ "code" : "CSE 705",
"title" : "Database Research Seminar",
"semester" : "Fall 2016" },
{ "code" : "CSE 662", { "code" : "CSE 662",
"title" : "Languages and Runtimes for Big Data (planned)", "title" : "Languages and Runtimes for Big Data",
"semester" : "Fall 2016" }, "semester" : "Fall 2016" },
{ "code" : "CSE 462", { "code" : "CSE 462",
"title" : "Undergraduate Database Systems", "title" : "Undergraduate Database Systems",

View file

@ -1,7 +1,11 @@
[ [
{ "talk" : "TBD", "date" : "Oct. 2016",
"venue" : "Airbus" },
{ "talk" : "TBD", "date" : "Oct. 2016",
"venue" : "RIT" },
{ "talk" : "Just-In-Time Data Structures", "date" : "Jun. 2016", { "talk" : "Just-In-Time Data Structures", "date" : "Jun. 2016",
"venue" : "LogicBlox" }, "venue" : "LogicBlox" },
{ "talk" : "Embracing Uncertainty with Mimir", "date" : "May 2016", { "talk" : "Embracing Uncertainty with Mimir", "date" : "May. 2016",
"venue" : "NYU" }, "venue" : "NYU" },
{ "talk" : "Embracing Uncertainty with Mimir", "date" : "Mar. 2016", { "talk" : "Embracing Uncertainty with Mimir", "date" : "Mar. 2016",
"venue" : "HPE/Vertica" }, "venue" : "HPE/Vertica" },

View file

@ -34,11 +34,6 @@
"projects" : ["mimir"], "projects" : ["mimir"],
"ubit" : "poonamku" "ubit" : "poonamku"
}, },
"Patrick Coonan" : {
"status" : "BS/MS",
"projects" : ["insider-threats"],
"ubit" : "pcoonan"
},
"William Spoth" : { "William Spoth" : {
"status" : "PhD", "status" : "PhD",
"projects" : ["mimir"], "projects" : ["mimir"],
@ -73,10 +68,6 @@
"advisor" : ["Luke Ziarek", "Geoff Challen"], "advisor" : ["Luke Ziarek", "Geoff Challen"],
"joint_advisor": true "joint_advisor": true
}, },
"Michael Kulbacki" : {
"status" : "BS",
"projects" : ["mimir"]
},
"Jacob Varghese" : { "Jacob Varghese" : {
"status" : "BS", "status" : "BS",
"projects" : ["mimir"] "projects" : ["mimir"]
@ -86,6 +77,17 @@
"projects" : ["mimir"] "projects" : ["mimir"]
} }
}, },
"temp-leave" : {
"Michael Kulbacki" : {
"status" : "BS",
"projects" : ["mimir"]
},
"Patrick Coonan" : {
"status" : "BS/MS",
"projects" : ["insider-threats"],
"ubit" : "pcoonan"
}
},
"collaborators" : [ "collaborators" : [
"Lukasz Ziarek", "Lukasz Ziarek",
"Geoff Challen", "Geoff Challen",

180
lib/cv.rb
View file

@ -36,14 +36,19 @@ class CV < Latex::Builder
@who = who @who = who
@include_rejected_grants = options.fetch(:include_rejected_grants, false) @include_rejected_grants = options.fetch(:include_rejected_grants, false)
@include_pending_papers = options.fetch(:include_pending_papers, false) @include_pending_papers = options.fetch(:include_pending_papers, false)
@title = options.fetch(:title, "Curriculum Vitae")
@since = Hash.new { |h,k| if h.has_key? :rest then h[:rest] else 0 end }
options[:since].each { |k, v| @since[k] = v } if options.has_key?(:since)
@skip = options.fetch(:skip, [])
gen gen
end end
def CV.make(who, out) def CV.make(who, out, options = {})
CV.new(who, out) CV.new(who, out, options)
end end
def my_section(title) def make_section(title)
section!(title) section!(title)
print_direct "~" print_direct "~"
endl("-0.4in") endl("-0.4in")
@ -60,6 +65,7 @@ class CV < Latex::Builder
documentclass("11pt", "article") documentclass("11pt", "article")
usepackage "fullpage" usepackage "fullpage"
usepackage "bibentry" usepackage "bibentry"
usepackage "enumitem"
document do document do
pagestyle "empty" pagestyle "empty"
@ -70,23 +76,38 @@ class CV < Latex::Builder
render_contact_details render_contact_details
vspace! "-0.1in" vspace! "-0.1in"
render_education render_education unless skip?(:education)
render_employment_history render_employment_history unless skip?(:employment)
render_honors render_honors unless skip?(:honors)
render_professional_activities render_professional_activities unless skip?(:service)
render_invited_talks render_invited_talks unless skip?(:invited_talks)
render_courses_taught render_courses_taught unless skip?(:courses)
render_grant_support render_grant_support unless skip?(:grants)
render_pubs_and_artifacts render_pubs_and_artifacts unless skip?(:pubs)
end end
end end
def filter_records(category, records)
records.select { |record|
duration_is_since?(record, @since[category])
}
end
def build_filtered_itemize(category, records, *args)
args.unshift(filter_records(category, records))
build_itemize(*args) { |record| yield record }
end
def skip?(category)
@skip.include? category
end
############### HEADER ################ ############### HEADER ################
def render_header def render_header
noindent noindent
textbf { huge; puts "Curriculum Vitae" } textbf { huge; puts @title }
hfill hfill
textbf { huge; puts @data["name"] } textbf { huge; puts @data["name"] }
vspace "0.05in" vspace "0.05in"
@ -128,8 +149,8 @@ class CV < Latex::Builder
############### EDUCATION ################ ############### EDUCATION ################
def render_education def render_education
my_section("Education") make_section("Education")
build_itemize(@data["education"]) do |r| build_filtered_itemize(:education, @data["education"], "label=,leftmargin=0mm") do |r|
textit { puts "#{r["degree"]}," } textit { puts "#{r["degree"]}," }
puts "#{r["university"]}, #{r["city"]}" puts "#{r["university"]}, #{r["city"]}"
hfill hfill
@ -150,17 +171,9 @@ class CV < Latex::Builder
############### EMPLOYMENT HISTORY ################ ############### EMPLOYMENT HISTORY ################
def render_employment_history(args = {}) def render_employment_history
employment = @data["employment"]; make_section("Employment History")
build_filtered_itemize(:employment, @data["employment"]) do |r|
if args.has_key?(:since) then
since = args[:since]
employment =
employment.select { |r| duration_is_since?(r, since) }
end
my_section("Employment History")
build_itemize(employment) do |r|
puts "#{r["title"]}, #{r["employer"]}" puts "#{r["title"]}, #{r["employer"]}"
hfill hfill
puts duration(r) puts duration(r)
@ -170,15 +183,15 @@ class CV < Latex::Builder
############### HONORS ################ ############### HONORS ################
def render_honors def render_honors
my_section("Honors") make_section("Honors")
build_itemize(@data["honors"]) do |r| build_filtered_itemize(:honors, @data["honors"], "label=,leftmargin=0mm") do |r|
puts r puts r["description"]
end end
end end
############### PROFESSIONAL ACTIVITIES ################ ############### PROFESSIONAL ACTIVITIES ################
def render_one_activity_class(data, role_title) def render_one_activity_class(activity_class, data, role_title)
role_title = role_title =
case role_title case role_title
when Proc then role_title when Proc then role_title
@ -186,12 +199,12 @@ class CV < Latex::Builder
orig_role_title = role_title orig_role_title = role_title
lambda { |r| r[orig_role_title] } lambda { |r| r[orig_role_title] }
end end
build_itemize(data) do |r| build_filtered_itemize(activity_class, data, "noitemsep,leftmargin=5mm,label=--") do |r|
puts(role_title.call(r)) puts(role_title.call(r))
hfill hfill
puts duration(r) puts duration(r)
unless r["roles"].nil? unless r["roles"].nil?
build_itemize(r["roles"]) do |role| build_itemize(r["roles"], "noitemsep") do |role|
puts role["title"] puts role["title"]
hfill hfill
puts duration(role) puts duration(role)
@ -201,44 +214,47 @@ class CV < Latex::Builder
end end
def render_professional_activities(args = {}) def render_professional_activities(args = {})
my_section("Professional Activities") make_section("Professional Activities")
unless skip? :reviewer
subsection!("Reviewer / Program Comittee Member") subsection!("Reviewer / Program Comittee Member")
render_one_activity_class(@data["reviewer"], render_one_activity_class(:reviewer, @data["reviewer"],
lambda { |r| lambda { |r|
venue = LabMetadata.complete_venue(r)["type"] venue = LabMetadata.complete_venue(r)["type"]
raise "Unknown Venue: #{r}" unless venue; raise "Unknown Venue: #{r}" unless venue;
"#{venue.capitalize}: #{LabMetadata.venue_name(r)}" "#{venue.capitalize}: #{LabMetadata.venue_name(r)}"
}) })
end
unless skip? :general_service
subsection!("Service") subsection!("Service")
render_one_activity_class(@data["service"]["general"], "description") render_one_activity_class(:general_service, @data["service"]["general"], "description")
end
unless skip? :memberships
subsection!("Professional Memberships") subsection!("Professional Memberships")
render_one_activity_class(@data["memberships"], "org") render_one_activity_class(:memberships, @data["memberships"], "org")
end
unless skip? :volunteering
subsection!("Volunteer Work") subsection!("Volunteer Work")
render_one_activity_class(@data["volunteering"], "org") render_one_activity_class(:volunteering, @data["volunteering"], "org")
end
unless skip? :dept_service
subsection!("Departmental Service") subsection!("Departmental Service")
build_itemize(@data["service"]["dept"]) do |dept| build_itemize(@data["service"]["dept"]) do |dept|
puts dept["org"] puts dept["org"]
render_one_activity_class(dept["service"], "org") render_one_activity_class(:dept_service, dept["service"], "org")
end
end end
end end
############### INVITED TALKS ################ ############### INVITED TALKS ################
def render_invited_talks(args = {}) def render_invited_talks
talks = @data["talks"] make_section("Invited Talks")
build_filtered_itemize(:talks, @data["talks"], "noitemsep,leftmargin=5mm,label=--") do |r|
if args.has_key? :since
since = args[:since]
talks = talks.select { |r| date_to_time(r["date"]).year >= since }
end
my_section("Invited Talks")
build_itemize(talks) do |r|
textit { puts r["venue"] } textit { puts r["venue"] }
wrap { wrap {
small small
@ -253,13 +269,12 @@ class CV < Latex::Builder
############### COURSES ################ ############### COURSES ################
def render_courses_taught(args = {}) def render_courses_taught
my_section("Courses") make_section("Courses")
courses = @data["courses"] courses = @data["courses"]
if args.has_key? :since since = @since[:courses]
since = args[:since]
courses = courses.map do |dept| courses = courses.map do |dept|
dept = dept.clone dept = dept.clone
dept["courses"] = dept["courses"].select do |c| dept["courses"] = dept["courses"].select do |c|
@ -270,11 +285,10 @@ class CV < Latex::Builder
end end
dept unless dept["courses"].empty? dept unless dept["courses"].empty?
end.compact end.compact
end
build_itemize(courses) do |dept| build_itemize(courses, "leftmargin=1mm,label=") do |dept|
puts dept["venue"] puts dept["venue"]
build_itemize(dept["courses"]) do |r| build_itemize(dept["courses"], "noitemsep,leftmargin=7mm") do |r|
texttt { puts r["code"] } texttt { puts r["code"] }
puts ":" puts ":"
wrap { wrap {
@ -292,21 +306,18 @@ class CV < Latex::Builder
############### GRANT SUPPORT ################ ############### GRANT SUPPORT ################
def render_grant_support(args = {}) def render_grant_support(args = {})
my_section("Grant Support") make_section("Grant Support")
test_for_since = test_for_since = proc { |r| duration_is_since?(r, @since[:grants]) }
if args.has_key? :since then
proc { |r| duration_is_since?(r, args[:since]) }
else
proc { true }
end
grant_categories = [ grant_categories = [
["Pending Applications", "submitted", ["grant", "gift"]], ["Pending Applications", "submitted", ["grant", "gift"]],
["Awarded Grants", "accepted", ["grant"]], ["Awarded Grants", "accepted", ["grant"]],
["Gifts", "accepted", ["gift"]], ["Gifts", "accepted", ["gift"]],
["Completed", "completed", ["grant", "gift"]]
] ]
grant_categories += [
["Completed", "completed", ["grant", "gift"]]
] unless skip?(:completed_grants)
grant_categories += [ grant_categories += [
["Declined", "rejected", ["grant", "gift"]] ["Declined", "rejected", ["grant", "gift"]]
] if args.fetch(:include_rejected, @include_rejected_grants) ] if args.fetch(:include_rejected, @include_rejected_grants)
@ -333,6 +344,9 @@ class CV < Latex::Builder
test_for_since.call(r) test_for_since.call(r)
}.sort { |a,b| to_date(b["start"]) <=> to_date(a["start"])} }.sort { |a,b| to_date(b["start"]) <=> to_date(a["start"])}
unless grants_in_category.empty?
## Header for the category ## Header for the category
subsection!("#{sec} (#{grants_in_category.length})") subsection!("#{sec} (#{grants_in_category.length})")
@ -426,6 +440,7 @@ class CV < Latex::Builder
end # block("tabular") (field table) end # block("tabular") (field table)
endl("0.2in") endl("0.2in")
end # grants_in_category.each end # grants_in_category.each
end # unless grants_in_category.empty?
end # grant_categories.each end # grant_categories.each
end end
@ -523,33 +538,29 @@ class CV < Latex::Builder
end end
def render_paper_title(title) def render_paper_title(title)
print_direct "``#{title}''" print_direct "\\textsc{#{title}}"
end end
def render_one_pub_or_artifact(title,list,fmt,filter = proc { true }) def render_one_pub_or_artifact(title,list,fmt,filter = proc { true })
list = list.select { |r| filter.call(r) } list = list.select { |r| filter.call(r) }
unless list.empty? unless list.empty?
subsection!("#{title} (#{list.length})") subsection!("#{title} (#{list.length})")
build_itemize(list) { |r| fmt.call(r) } build_itemize(list, "leftmargin=0mm,label=,noitemsep") { |r| fmt.call(r) }
end end
end end
def render_pubs_and_artifacts(args = {}) def render_pubs_and_artifacts(args = {})
global_filter = global_filter =
if args.has_key? :since then proc { |r| duration_is_since?(r, @since[:publications])}
since = args[:since]
proc { |r| r["year"].to_i >= since }
else
proc { true }
end
all_my_pubs = LabMetadata.publications_for(@who) all_my_pubs = LabMetadata.publications_for(@who)
my_section("Publications and Artifacts") make_section("Publications and Artifacts")
# block("center") do # block("center") do
# puts "(Author lists marked with a * are not correlated with level of contribution)" # puts "(Author lists marked with a * are not correlated with level of contribution)"
# end # end
unless skip?(:journal_pubs)
render_one_pub_or_artifact( render_one_pub_or_artifact(
"Journal Publications", "Journal Publications",
all_my_pubs.where do |r| all_my_pubs.where do |r|
@ -575,7 +586,9 @@ class CV < Latex::Builder
end, end,
global_filter global_filter
) )
end
unless skip?(:conference_pubs)
render_one_pub_or_artifact( render_one_pub_or_artifact(
"Conference Publications", "Conference Publications",
all_my_pubs.where do |r| all_my_pubs.where do |r|
@ -595,7 +608,9 @@ class CV < Latex::Builder
end, end,
global_filter global_filter
) )
end
unless skip?(:workshop_pubs)
render_one_pub_or_artifact( render_one_pub_or_artifact(
"Workshop Publications", "Workshop Publications",
all_my_pubs.where do |r| all_my_pubs.where do |r|
@ -615,7 +630,9 @@ class CV < Latex::Builder
end, end,
global_filter global_filter
) )
end
unless skip?(:book_chapters)
render_one_pub_or_artifact( render_one_pub_or_artifact(
"Book Chapters", "Book Chapters",
all_my_pubs.where do |r| all_my_pubs.where do |r|
@ -640,6 +657,7 @@ class CV < Latex::Builder
end, end,
global_filter global_filter
) )
end
render_one_pub_or_artifact( render_one_pub_or_artifact(
"Submitted Publications", "Submitted Publications",
@ -655,6 +673,7 @@ class CV < Latex::Builder
global_filter global_filter
) if @include_pending_papers ) if @include_pending_papers
unless skip?(:tech_reports)
render_one_pub_or_artifact( render_one_pub_or_artifact(
"Technical Reports", "Technical Reports",
all_my_pubs.where do |r| all_my_pubs.where do |r|
@ -673,8 +692,10 @@ class CV < Latex::Builder
puts get_pub_length_string(r) puts get_pub_length_string(r)
end, end,
global_filter global_filter
) if args.fetch(:show_tech_reports, true) )
end
unless skip?(:patents)
render_one_pub_or_artifact( render_one_pub_or_artifact(
"Patents", "Patents",
all_my_pubs.where do |r| all_my_pubs.where do |r|
@ -690,23 +711,25 @@ class CV < Latex::Builder
end, end,
global_filter global_filter
) )
end
unless skip?(:artifacts)
render_one_pub_or_artifact( render_one_pub_or_artifact(
"Artifacts", "Artifacts",
@data["artifacts"], @data["artifacts"],
proc do |r| proc do |r|
print_direct "\\textbf{#{safe_text r["name"]}} (#{safe_text r["class"]})" print_direct "\\textsc{#{safe_text r["name"]}} (#{safe_text r["class"]})"
unless r["released"].nil?
d = to_date(r["released"])
hfill
puts "First released #{d.strftime("%B %Y")}"
end
endl endl
print_direct "\\textit{#{safe_text r["description"]}}" print_direct "\\textit{#{safe_text r["description"]}}"
unless r["url"].nil? unless r["url"].nil?
endl endl
url(r["url"]) url(r["url"])
end end
unless r["released"].nil?
d = to_date(r["released"])
endl
puts "First released #{d.strftime("%B %Y")}"
end
unless r["metrics"].nil? unless r["metrics"].nil?
unless r["metricsasof"].nil? unless r["metricsasof"].nil?
endl endl
@ -735,5 +758,6 @@ class CV < Latex::Builder
end end
) if args.fetch(:show_artifacts, true) ) if args.fetch(:show_artifacts, true)
end end
end
end end

View file

@ -56,7 +56,7 @@ module Latex
latex_command(:smallskip) latex_command(:smallskip)
latex_command(:medskip) latex_command(:medskip)
latex_command(:bigskip) latex_command(:bigskip)
latex_command(:itemize , environment: true) latex_command(:itemize , arg_optional:[true], environment: true)
latex_command(:enumeate, environment: true) latex_command(:enumeate, environment: true)
latex_command(:item) latex_command(:item)
latex_command(:tabular, environment: true) latex_command(:tabular, environment: true)
@ -125,9 +125,10 @@ module Latex
end end
end end
def build_itemize(array) def build_itemize(array, *args)
if(array.length > 0) if(array.length > 0)
itemize do itemize(*args) do
array.each do |r| array.each do |r|
item item
yield r yield r

View file

@ -94,6 +94,15 @@ module Text
return date_to_time(r["end"]).year >= year return date_to_time(r["end"]).year >= year
elsif not r["years"].nil? elsif not r["years"].nil?
return r["years"].map {|y|y.to_i}.max >= year return r["years"].map {|y|y.to_i}.max >= year
elsif not r["year"].nil?
return r["year"].to_i >= year
elsif not r["date"].nil?
extracted_year =
case r["date"]
when /[a-z]+\. (\d\d\d\d)/ then $1
else raise "Invalid date format: #{r["date"]}"
end
return extracted_year.to_i >= year
else else
raise "Invalid time range : #{r}" raise "Invalid time range : #{r}"
end end

Binary file not shown.