Merge branch 'master' of gitlab.odin.cse.buffalo.edu:odin-lab/Website
This commit is contained in:
commit
12f98e057c
4
.gitignore
vendored
4
.gitignore
vendored
|
@ -2,4 +2,6 @@ build
|
|||
.DS_Store
|
||||
*.aux
|
||||
*.log
|
||||
artifacts
|
||||
artifacts
|
||||
*.pdf
|
||||
*.tex
|
31
Rakefile
31
Rakefile
|
@ -148,4 +148,33 @@ task :documents => ["artifacts/db.json", :cv, :cnp]
|
|||
directory "build/artifacts"
|
||||
task :deploy => [:documents,:odin_lab,"build/artifacts"] do
|
||||
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
|
||||
|
||||
|
|
|
@ -101,7 +101,10 @@
|
|||
}
|
||||
],
|
||||
"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" : [
|
||||
{ "venue" : "VLDBJ", "years" : [ 2013 ] },
|
||||
|
@ -165,8 +168,14 @@
|
|||
{ "code" : "CSE 562",
|
||||
"title" : "Graduate Database Systems (planned)",
|
||||
"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",
|
||||
"title" : "Languages and Runtimes for Big Data (planned)",
|
||||
"title" : "Languages and Runtimes for Big Data",
|
||||
"semester" : "Fall 2016" },
|
||||
{ "code" : "CSE 462",
|
||||
"title" : "Undergraduate Database Systems",
|
||||
|
|
|
@ -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",
|
||||
"venue" : "LogicBlox" },
|
||||
{ "talk" : "Embracing Uncertainty with Mimir", "date" : "May 2016",
|
||||
{ "talk" : "Embracing Uncertainty with Mimir", "date" : "May. 2016",
|
||||
"venue" : "NYU" },
|
||||
{ "talk" : "Embracing Uncertainty with Mimir", "date" : "Mar. 2016",
|
||||
"venue" : "HPE/Vertica" },
|
||||
|
|
20
db/lab.json
20
db/lab.json
|
@ -34,11 +34,6 @@
|
|||
"projects" : ["mimir"],
|
||||
"ubit" : "poonamku"
|
||||
},
|
||||
"Patrick Coonan" : {
|
||||
"status" : "BS/MS",
|
||||
"projects" : ["insider-threats"],
|
||||
"ubit" : "pcoonan"
|
||||
},
|
||||
"William Spoth" : {
|
||||
"status" : "PhD",
|
||||
"projects" : ["mimir"],
|
||||
|
@ -73,10 +68,6 @@
|
|||
"advisor" : ["Luke Ziarek", "Geoff Challen"],
|
||||
"joint_advisor": true
|
||||
},
|
||||
"Michael Kulbacki" : {
|
||||
"status" : "BS",
|
||||
"projects" : ["mimir"]
|
||||
},
|
||||
"Jacob Varghese" : {
|
||||
"status" : "BS",
|
||||
"projects" : ["mimir"]
|
||||
|
@ -86,6 +77,17 @@
|
|||
"projects" : ["mimir"]
|
||||
}
|
||||
},
|
||||
"temp-leave" : {
|
||||
"Michael Kulbacki" : {
|
||||
"status" : "BS",
|
||||
"projects" : ["mimir"]
|
||||
},
|
||||
"Patrick Coonan" : {
|
||||
"status" : "BS/MS",
|
||||
"projects" : ["insider-threats"],
|
||||
"ubit" : "pcoonan"
|
||||
}
|
||||
},
|
||||
"collaborators" : [
|
||||
"Lukasz Ziarek",
|
||||
"Geoff Challen",
|
||||
|
|
694
lib/cv.rb
694
lib/cv.rb
|
@ -36,14 +36,19 @@ class CV < Latex::Builder
|
|||
@who = who
|
||||
@include_rejected_grants = options.fetch(:include_rejected_grants, 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
|
||||
end
|
||||
|
||||
def CV.make(who, out)
|
||||
CV.new(who, out)
|
||||
def CV.make(who, out, options = {})
|
||||
CV.new(who, out, options)
|
||||
end
|
||||
|
||||
def my_section(title)
|
||||
def make_section(title)
|
||||
section!(title)
|
||||
print_direct "~"
|
||||
endl("-0.4in")
|
||||
|
@ -60,6 +65,7 @@ class CV < Latex::Builder
|
|||
documentclass("11pt", "article")
|
||||
usepackage "fullpage"
|
||||
usepackage "bibentry"
|
||||
usepackage "enumitem"
|
||||
|
||||
document do
|
||||
pagestyle "empty"
|
||||
|
@ -70,23 +76,38 @@ class CV < Latex::Builder
|
|||
render_contact_details
|
||||
vspace! "-0.1in"
|
||||
|
||||
render_education
|
||||
render_employment_history
|
||||
render_honors
|
||||
render_professional_activities
|
||||
render_invited_talks
|
||||
render_courses_taught
|
||||
render_grant_support
|
||||
render_pubs_and_artifacts
|
||||
render_education unless skip?(:education)
|
||||
render_employment_history unless skip?(:employment)
|
||||
render_honors unless skip?(:honors)
|
||||
render_professional_activities unless skip?(:service)
|
||||
render_invited_talks unless skip?(:invited_talks)
|
||||
render_courses_taught unless skip?(:courses)
|
||||
render_grant_support unless skip?(:grants)
|
||||
render_pubs_and_artifacts unless skip?(:pubs)
|
||||
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 ################
|
||||
|
||||
def render_header
|
||||
noindent
|
||||
textbf { huge; puts "Curriculum Vitae" }
|
||||
textbf { huge; puts @title }
|
||||
hfill
|
||||
textbf { huge; puts @data["name"] }
|
||||
vspace "0.05in"
|
||||
|
@ -128,8 +149,8 @@ class CV < Latex::Builder
|
|||
############### EDUCATION ################
|
||||
|
||||
def render_education
|
||||
my_section("Education")
|
||||
build_itemize(@data["education"]) do |r|
|
||||
make_section("Education")
|
||||
build_filtered_itemize(:education, @data["education"], "label=,leftmargin=0mm") do |r|
|
||||
textit { puts "#{r["degree"]}," }
|
||||
puts "#{r["university"]}, #{r["city"]}"
|
||||
hfill
|
||||
|
@ -150,17 +171,9 @@ class CV < Latex::Builder
|
|||
|
||||
############### EMPLOYMENT HISTORY ################
|
||||
|
||||
def render_employment_history(args = {})
|
||||
employment = @data["employment"];
|
||||
|
||||
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|
|
||||
def render_employment_history
|
||||
make_section("Employment History")
|
||||
build_filtered_itemize(:employment, @data["employment"]) do |r|
|
||||
puts "#{r["title"]}, #{r["employer"]}"
|
||||
hfill
|
||||
puts duration(r)
|
||||
|
@ -170,15 +183,15 @@ class CV < Latex::Builder
|
|||
############### HONORS ################
|
||||
|
||||
def render_honors
|
||||
my_section("Honors")
|
||||
build_itemize(@data["honors"]) do |r|
|
||||
puts r
|
||||
make_section("Honors")
|
||||
build_filtered_itemize(:honors, @data["honors"], "label=,leftmargin=0mm") do |r|
|
||||
puts r["description"]
|
||||
end
|
||||
end
|
||||
|
||||
############### PROFESSIONAL ACTIVITIES ################
|
||||
|
||||
def render_one_activity_class(data, role_title)
|
||||
def render_one_activity_class(activity_class, data, role_title)
|
||||
role_title =
|
||||
case role_title
|
||||
when Proc then role_title
|
||||
|
@ -186,12 +199,12 @@ class CV < Latex::Builder
|
|||
orig_role_title = role_title
|
||||
lambda { |r| r[orig_role_title] }
|
||||
end
|
||||
build_itemize(data) do |r|
|
||||
build_filtered_itemize(activity_class, data, "noitemsep,leftmargin=5mm,label=--") do |r|
|
||||
puts(role_title.call(r))
|
||||
hfill
|
||||
puts duration(r)
|
||||
unless r["roles"].nil?
|
||||
build_itemize(r["roles"]) do |role|
|
||||
build_itemize(r["roles"], "noitemsep") do |role|
|
||||
puts role["title"]
|
||||
hfill
|
||||
puts duration(role)
|
||||
|
@ -201,44 +214,47 @@ class CV < Latex::Builder
|
|||
end
|
||||
|
||||
def render_professional_activities(args = {})
|
||||
my_section("Professional Activities")
|
||||
make_section("Professional Activities")
|
||||
|
||||
subsection!("Reviewer / Program Comittee Member")
|
||||
render_one_activity_class(@data["reviewer"],
|
||||
lambda { |r|
|
||||
venue = LabMetadata.complete_venue(r)["type"]
|
||||
raise "Unknown Venue: #{r}" unless venue;
|
||||
"#{venue.capitalize}: #{LabMetadata.venue_name(r)}"
|
||||
})
|
||||
unless skip? :reviewer
|
||||
subsection!("Reviewer / Program Comittee Member")
|
||||
render_one_activity_class(:reviewer, @data["reviewer"],
|
||||
lambda { |r|
|
||||
venue = LabMetadata.complete_venue(r)["type"]
|
||||
raise "Unknown Venue: #{r}" unless venue;
|
||||
"#{venue.capitalize}: #{LabMetadata.venue_name(r)}"
|
||||
})
|
||||
end
|
||||
|
||||
subsection!("Service")
|
||||
render_one_activity_class(@data["service"]["general"], "description")
|
||||
unless skip? :general_service
|
||||
subsection!("Service")
|
||||
render_one_activity_class(:general_service, @data["service"]["general"], "description")
|
||||
end
|
||||
|
||||
subsection!("Professional Memberships")
|
||||
render_one_activity_class(@data["memberships"], "org")
|
||||
unless skip? :memberships
|
||||
subsection!("Professional Memberships")
|
||||
render_one_activity_class(:memberships, @data["memberships"], "org")
|
||||
end
|
||||
|
||||
subsection!("Volunteer Work")
|
||||
render_one_activity_class(@data["volunteering"], "org")
|
||||
unless skip? :volunteering
|
||||
subsection!("Volunteer Work")
|
||||
render_one_activity_class(:volunteering, @data["volunteering"], "org")
|
||||
end
|
||||
|
||||
subsection!("Departmental Service")
|
||||
build_itemize(@data["service"]["dept"]) do |dept|
|
||||
puts dept["org"]
|
||||
render_one_activity_class(dept["service"], "org")
|
||||
unless skip? :dept_service
|
||||
subsection!("Departmental Service")
|
||||
build_itemize(@data["service"]["dept"]) do |dept|
|
||||
puts dept["org"]
|
||||
render_one_activity_class(:dept_service, dept["service"], "org")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
############### INVITED TALKS ################
|
||||
|
||||
def render_invited_talks(args = {})
|
||||
talks = @data["talks"]
|
||||
|
||||
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|
|
||||
def render_invited_talks
|
||||
make_section("Invited Talks")
|
||||
build_filtered_itemize(:talks, @data["talks"], "noitemsep,leftmargin=5mm,label=--") do |r|
|
||||
textit { puts r["venue"] }
|
||||
wrap {
|
||||
small
|
||||
|
@ -253,28 +269,26 @@ class CV < Latex::Builder
|
|||
|
||||
############### COURSES ################
|
||||
|
||||
def render_courses_taught(args = {})
|
||||
my_section("Courses")
|
||||
def render_courses_taught
|
||||
make_section("Courses")
|
||||
|
||||
courses = @data["courses"]
|
||||
|
||||
if args.has_key? :since
|
||||
since = args[:since]
|
||||
courses = courses.map do |dept|
|
||||
dept = dept.clone
|
||||
dept["courses"] = dept["courses"].select do |c|
|
||||
unless /([0-9]{4})/ =~ c["semester"]
|
||||
raise "Invalid Semester: '#{c["semester"]}'"
|
||||
end
|
||||
$1.to_i >= since
|
||||
since = @since[:courses]
|
||||
courses = courses.map do |dept|
|
||||
dept = dept.clone
|
||||
dept["courses"] = dept["courses"].select do |c|
|
||||
unless /([0-9]{4})/ =~ c["semester"]
|
||||
raise "Invalid Semester: '#{c["semester"]}'"
|
||||
end
|
||||
dept unless dept["courses"].empty?
|
||||
end.compact
|
||||
end
|
||||
$1.to_i >= since
|
||||
end
|
||||
dept unless dept["courses"].empty?
|
||||
end.compact
|
||||
|
||||
build_itemize(courses) do |dept|
|
||||
build_itemize(courses, "leftmargin=1mm,label=") do |dept|
|
||||
puts dept["venue"]
|
||||
build_itemize(dept["courses"]) do |r|
|
||||
build_itemize(dept["courses"], "noitemsep,leftmargin=7mm") do |r|
|
||||
texttt { puts r["code"] }
|
||||
puts ":"
|
||||
wrap {
|
||||
|
@ -292,21 +306,18 @@ class CV < Latex::Builder
|
|||
############### GRANT SUPPORT ################
|
||||
|
||||
def render_grant_support(args = {})
|
||||
my_section("Grant Support")
|
||||
make_section("Grant Support")
|
||||
|
||||
test_for_since =
|
||||
if args.has_key? :since then
|
||||
proc { |r| duration_is_since?(r, args[:since]) }
|
||||
else
|
||||
proc { true }
|
||||
end
|
||||
test_for_since = proc { |r| duration_is_since?(r, @since[:grants]) }
|
||||
|
||||
grant_categories = [
|
||||
["Pending Applications", "submitted", ["grant", "gift"]],
|
||||
["Awarded Grants", "accepted", ["grant"]],
|
||||
["Gifts", "accepted", ["gift"]],
|
||||
["Completed", "completed", ["grant", "gift"]]
|
||||
]
|
||||
grant_categories += [
|
||||
["Completed", "completed", ["grant", "gift"]]
|
||||
] unless skip?(:completed_grants)
|
||||
grant_categories += [
|
||||
["Declined", "rejected", ["grant", "gift"]]
|
||||
] if args.fetch(:include_rejected, @include_rejected_grants)
|
||||
|
@ -333,99 +344,103 @@ class CV < Latex::Builder
|
|||
test_for_since.call(r)
|
||||
}.sort { |a,b| to_date(b["start"]) <=> to_date(a["start"])}
|
||||
|
||||
## Header for the category
|
||||
subsection!("#{sec} (#{grants_in_category.length})")
|
||||
|
||||
## For each grant in the category
|
||||
grants_in_category.each do |r|
|
||||
collaborative_total = 0;
|
||||
supplements_total = 0
|
||||
our_total = 0;
|
||||
total_awarded = 0;
|
||||
award_value_is_string = true
|
||||
unless grants_in_category.empty?
|
||||
|
||||
# Derive grant totals for collaborative grants and
|
||||
# grants with supplements, as well as fractional
|
||||
# amounts for us.
|
||||
if r["amount"].is_a? Numeric then
|
||||
collaborative_total =
|
||||
if r["collaborative"].nil? then 0 else
|
||||
r["collaborative"].map { |x| x["amount"].to_f }.sum
|
||||
end
|
||||
supplements_total =
|
||||
if r["supplements"].nil? then 0 else
|
||||
r["supplements"].map { |x| x["amount"].to_f }.sum
|
||||
end
|
||||
our_total = r["amount"].to_f + supplements_total
|
||||
total_awarded = our_total + collaborative_total;
|
||||
award_value_is_string = false
|
||||
end
|
||||
## Header for the category
|
||||
subsection!("#{sec} (#{grants_in_category.length})")
|
||||
|
||||
noindent
|
||||
## For each grant in the category
|
||||
grants_in_category.each do |r|
|
||||
collaborative_total = 0;
|
||||
supplements_total = 0
|
||||
our_total = 0;
|
||||
total_awarded = 0;
|
||||
award_value_is_string = true
|
||||
|
||||
tabular("rl") do
|
||||
# Derive grant totals for collaborative grants and
|
||||
# grants with supplements, as well as fractional
|
||||
# amounts for us.
|
||||
if r["amount"].is_a? Numeric then
|
||||
collaborative_total =
|
||||
if r["collaborative"].nil? then 0 else
|
||||
r["collaborative"].map { |x| x["amount"].to_f }.sum
|
||||
end
|
||||
supplements_total =
|
||||
if r["supplements"].nil? then 0 else
|
||||
r["supplements"].map { |x| x["amount"].to_f }.sum
|
||||
end
|
||||
our_total = r["amount"].to_f + supplements_total
|
||||
total_awarded = our_total + collaborative_total;
|
||||
award_value_is_string = false
|
||||
end
|
||||
|
||||
# For each field being displayed
|
||||
fields_to_display.each do |k|
|
||||
noindent
|
||||
|
||||
# Only display fields if they're available
|
||||
unless r[k].nil?
|
||||
# Field title
|
||||
textit { puts(
|
||||
tabular("rl") do
|
||||
|
||||
# For each field being displayed
|
||||
fields_to_display.each do |k|
|
||||
|
||||
# Only display fields if they're available
|
||||
unless r[k].nil?
|
||||
# Field title
|
||||
textit { puts(
|
||||
case k
|
||||
when "copis" then "Co-PI".pluralize(r["copis"].length)
|
||||
when "collaborative" then
|
||||
"Peer Org.".pluralize(r["collaborative"].length)
|
||||
else k.capitalize
|
||||
end
|
||||
)}
|
||||
# Break
|
||||
print_direct ":&"
|
||||
|
||||
# Post-processing on field value
|
||||
case k
|
||||
when "copis" then "Co-PI".pluralize(r["copis"].length)
|
||||
when "collaborative" then
|
||||
"Peer Org.".pluralize(r["collaborative"].length)
|
||||
else k.capitalize
|
||||
end
|
||||
)}
|
||||
# Break
|
||||
print_direct ":&"
|
||||
|
||||
# Post-processing on field value
|
||||
case k
|
||||
when "title", "agency"
|
||||
parbox("5in") do
|
||||
if k == "title" then textsf { puts r[k] } else puts r[k] end
|
||||
end
|
||||
when "effective dates"
|
||||
puts duration(r)
|
||||
when "copis"
|
||||
puts r["copis"].join(", ")
|
||||
when "amount"
|
||||
unless award_value_is_string
|
||||
puts format_money our_total
|
||||
unless r["collaborative"].nil?
|
||||
puts " (Total Across Collaboration: #{format_money total_awarded})"
|
||||
when "title", "agency"
|
||||
parbox("5in") do
|
||||
if k == "title" then textsf { puts r[k] } else puts r[k] end
|
||||
end
|
||||
else
|
||||
puts r["amount"]
|
||||
end
|
||||
when "collaborative"
|
||||
r["collaborative"].each do |i|
|
||||
puts i["institution"]
|
||||
puts "(#{format_money i["amount"]})"
|
||||
end
|
||||
when "supplements"
|
||||
unless award_value_is_string then
|
||||
puts(r["supplements"].map do |supp|
|
||||
"#{supp["type"]}"
|
||||
end.join(", "))
|
||||
puts "(#{"amount".pluralize(r["supplements"].length)} included in total above)"
|
||||
else
|
||||
puts(r["supplements"].map do |supp|
|
||||
"#{supp["type"]} (#{format_money supp["amount"].to_f})"
|
||||
end.join(", "))
|
||||
end
|
||||
else # case k
|
||||
puts r[k]
|
||||
end # case k
|
||||
endl
|
||||
end # unless r[k].nil?
|
||||
end # fields_to_display.each
|
||||
end # block("tabular") (field table)
|
||||
endl("0.2in")
|
||||
end # grants_in_category.each
|
||||
when "effective dates"
|
||||
puts duration(r)
|
||||
when "copis"
|
||||
puts r["copis"].join(", ")
|
||||
when "amount"
|
||||
unless award_value_is_string
|
||||
puts format_money our_total
|
||||
unless r["collaborative"].nil?
|
||||
puts " (Total Across Collaboration: #{format_money total_awarded})"
|
||||
end
|
||||
else
|
||||
puts r["amount"]
|
||||
end
|
||||
when "collaborative"
|
||||
r["collaborative"].each do |i|
|
||||
puts i["institution"]
|
||||
puts "(#{format_money i["amount"]})"
|
||||
end
|
||||
when "supplements"
|
||||
unless award_value_is_string then
|
||||
puts(r["supplements"].map do |supp|
|
||||
"#{supp["type"]}"
|
||||
end.join(", "))
|
||||
puts "(#{"amount".pluralize(r["supplements"].length)} included in total above)"
|
||||
else
|
||||
puts(r["supplements"].map do |supp|
|
||||
"#{supp["type"]} (#{format_money supp["amount"].to_f})"
|
||||
end.join(", "))
|
||||
end
|
||||
else # case k
|
||||
puts r[k]
|
||||
end # case k
|
||||
endl
|
||||
end # unless r[k].nil?
|
||||
end # fields_to_display.each
|
||||
end # block("tabular") (field table)
|
||||
endl("0.2in")
|
||||
end # grants_in_category.each
|
||||
end # unless grants_in_category.empty?
|
||||
end # grant_categories.each
|
||||
end
|
||||
|
||||
|
@ -523,123 +538,126 @@ class CV < Latex::Builder
|
|||
end
|
||||
|
||||
def render_paper_title(title)
|
||||
print_direct "``#{title}''"
|
||||
print_direct "\\textsc{#{title}}"
|
||||
end
|
||||
|
||||
def render_one_pub_or_artifact(title,list,fmt,filter = proc { true })
|
||||
list = list.select { |r| filter.call(r) }
|
||||
unless list.empty?
|
||||
subsection!("#{title} (#{list.length})")
|
||||
build_itemize(list) { |r| fmt.call(r) }
|
||||
build_itemize(list, "leftmargin=0mm,label=,noitemsep") { |r| fmt.call(r) }
|
||||
end
|
||||
end
|
||||
def render_pubs_and_artifacts(args = {})
|
||||
|
||||
global_filter =
|
||||
if args.has_key? :since then
|
||||
since = args[:since]
|
||||
proc { |r| r["year"].to_i >= since }
|
||||
else
|
||||
proc { true }
|
||||
end
|
||||
proc { |r| duration_is_since?(r, @since[:publications])}
|
||||
|
||||
all_my_pubs = LabMetadata.publications_for(@who)
|
||||
|
||||
my_section("Publications and Artifacts")
|
||||
make_section("Publications and Artifacts")
|
||||
|
||||
# block("center") do
|
||||
# puts "(Author lists marked with a * are not correlated with level of contribution)"
|
||||
# end
|
||||
render_one_pub_or_artifact(
|
||||
"Journal Publications",
|
||||
all_my_pubs.where do |r|
|
||||
case get_venue_type(r)
|
||||
when "journal" then true
|
||||
else false
|
||||
end
|
||||
end,
|
||||
proc do |r|
|
||||
render_paper_title(r["title"])
|
||||
render_author_list(r)
|
||||
puts "---"
|
||||
extra_fields =
|
||||
if r["volume"].nil? then []
|
||||
else ["Volume #{r["volume"]}, Number #{r["number"]}"] end +
|
||||
if r["issuetitle"].nil? then []
|
||||
else [r["issuetitle"]] end
|
||||
textit {
|
||||
puts "#{LabMetadata.venue_name(r)} #{r["year"]}#{if extra_fields.length > 0 then " (#{extra_fields.join("; ")}), " else ", " end}"
|
||||
}
|
||||
puts "#{get_pub_length_string(r)}, "
|
||||
puts render_selectivity(r)
|
||||
end,
|
||||
global_filter
|
||||
)
|
||||
unless skip?(:journal_pubs)
|
||||
render_one_pub_or_artifact(
|
||||
"Journal Publications",
|
||||
all_my_pubs.where do |r|
|
||||
case get_venue_type(r)
|
||||
when "journal" then true
|
||||
else false
|
||||
end
|
||||
end,
|
||||
proc do |r|
|
||||
render_paper_title(r["title"])
|
||||
render_author_list(r)
|
||||
puts "---"
|
||||
extra_fields =
|
||||
if r["volume"].nil? then []
|
||||
else ["Volume #{r["volume"]}, Number #{r["number"]}"] end +
|
||||
if r["issuetitle"].nil? then []
|
||||
else [r["issuetitle"]] end
|
||||
textit {
|
||||
puts "#{LabMetadata.venue_name(r)} #{r["year"]}#{if extra_fields.length > 0 then " (#{extra_fields.join("; ")}), " else ", " end}"
|
||||
}
|
||||
puts "#{get_pub_length_string(r)}, "
|
||||
puts render_selectivity(r)
|
||||
end,
|
||||
global_filter
|
||||
)
|
||||
end
|
||||
|
||||
render_one_pub_or_artifact(
|
||||
"Conference Publications",
|
||||
all_my_pubs.where do |r|
|
||||
case get_venue_type(r)
|
||||
when "conference" then true
|
||||
else false
|
||||
end
|
||||
end,
|
||||
proc do |r|
|
||||
render_paper_title(r["title"])
|
||||
render_author_list(r)
|
||||
puts "---"
|
||||
textit{ puts LabMetadata.venue_name(r) }
|
||||
puts "#{r["year"]}, "
|
||||
puts "#{get_pub_length_string(r)}, "
|
||||
puts render_selectivity(r)
|
||||
end,
|
||||
global_filter
|
||||
)
|
||||
unless skip?(:conference_pubs)
|
||||
render_one_pub_or_artifact(
|
||||
"Conference Publications",
|
||||
all_my_pubs.where do |r|
|
||||
case get_venue_type(r)
|
||||
when "conference" then true
|
||||
else false
|
||||
end
|
||||
end,
|
||||
proc do |r|
|
||||
render_paper_title(r["title"])
|
||||
render_author_list(r)
|
||||
puts "---"
|
||||
textit{ puts LabMetadata.venue_name(r) }
|
||||
puts "#{r["year"]}, "
|
||||
puts "#{get_pub_length_string(r)}, "
|
||||
puts render_selectivity(r)
|
||||
end,
|
||||
global_filter
|
||||
)
|
||||
end
|
||||
|
||||
render_one_pub_or_artifact(
|
||||
"Workshop Publications",
|
||||
all_my_pubs.where do |r|
|
||||
case get_venue_type(r)
|
||||
when "workshop" then true
|
||||
else false
|
||||
end
|
||||
end,
|
||||
proc do |r|
|
||||
render_paper_title(r["title"])
|
||||
render_author_list(r)
|
||||
puts "---"
|
||||
textit { puts LabMetadata.venue_name(r) }
|
||||
puts "#{r["year"]}, "
|
||||
puts "#{get_pub_length_string(r)}, "
|
||||
puts render_selectivity(r)
|
||||
end,
|
||||
global_filter
|
||||
)
|
||||
unless skip?(:workshop_pubs)
|
||||
render_one_pub_or_artifact(
|
||||
"Workshop Publications",
|
||||
all_my_pubs.where do |r|
|
||||
case get_venue_type(r)
|
||||
when "workshop" then true
|
||||
else false
|
||||
end
|
||||
end,
|
||||
proc do |r|
|
||||
render_paper_title(r["title"])
|
||||
render_author_list(r)
|
||||
puts "---"
|
||||
textit { puts LabMetadata.venue_name(r) }
|
||||
puts "#{r["year"]}, "
|
||||
puts "#{get_pub_length_string(r)}, "
|
||||
puts render_selectivity(r)
|
||||
end,
|
||||
global_filter
|
||||
)
|
||||
end
|
||||
|
||||
render_one_pub_or_artifact(
|
||||
"Book Chapters",
|
||||
all_my_pubs.where do |r|
|
||||
case get_venue_type(r)
|
||||
when "chapter" then true
|
||||
else false
|
||||
end
|
||||
end,
|
||||
proc do |r|
|
||||
render_paper_title(r["title"])
|
||||
render_author_list(r)
|
||||
puts "---"
|
||||
textit { puts LabMetadata.venue_name(r) }
|
||||
render_editor_list(r)
|
||||
publisher = get_publisher(r)
|
||||
series = r["series"] || $venues[r["venue"]]["series"]
|
||||
puts "---" if publisher || series
|
||||
puts "#{publisher}#{if series then ";" else "" end}" if publisher
|
||||
puts series if series
|
||||
textit { puts r["year"] }
|
||||
puts "(#{get_pub_length_string(r)}, #{render_selectivity(r)})"
|
||||
end,
|
||||
global_filter
|
||||
)
|
||||
unless skip?(:book_chapters)
|
||||
render_one_pub_or_artifact(
|
||||
"Book Chapters",
|
||||
all_my_pubs.where do |r|
|
||||
case get_venue_type(r)
|
||||
when "chapter" then true
|
||||
else false
|
||||
end
|
||||
end,
|
||||
proc do |r|
|
||||
render_paper_title(r["title"])
|
||||
render_author_list(r)
|
||||
puts "---"
|
||||
textit { puts LabMetadata.venue_name(r) }
|
||||
render_editor_list(r)
|
||||
publisher = get_publisher(r)
|
||||
series = r["series"] || $venues[r["venue"]]["series"]
|
||||
puts "---" if publisher || series
|
||||
puts "#{publisher}#{if series then ";" else "" end}" if publisher
|
||||
puts series if series
|
||||
textit { puts r["year"] }
|
||||
puts "(#{get_pub_length_string(r)}, #{render_selectivity(r)})"
|
||||
end,
|
||||
global_filter
|
||||
)
|
||||
end
|
||||
|
||||
render_one_pub_or_artifact(
|
||||
"Submitted Publications",
|
||||
|
@ -655,85 +673,91 @@ class CV < Latex::Builder
|
|||
global_filter
|
||||
) if @include_pending_papers
|
||||
|
||||
render_one_pub_or_artifact(
|
||||
"Technical Reports",
|
||||
all_my_pubs.where do |r|
|
||||
case get_venue_type(r)
|
||||
when "techreport" then true
|
||||
else false
|
||||
end
|
||||
end,
|
||||
proc do |r|
|
||||
render_paper_title(r["title"])
|
||||
render_author_list(r)
|
||||
puts "---"
|
||||
textit {
|
||||
puts "#{LabMetadata.venue_name(r)}#{if r["id"].nil? then "" else " ##{r["id"]}" end}, "
|
||||
}
|
||||
puts get_pub_length_string(r)
|
||||
end,
|
||||
global_filter
|
||||
) if args.fetch(:show_tech_reports, true)
|
||||
unless skip?(:tech_reports)
|
||||
render_one_pub_or_artifact(
|
||||
"Technical Reports",
|
||||
all_my_pubs.where do |r|
|
||||
case get_venue_type(r)
|
||||
when "techreport" then true
|
||||
else false
|
||||
end
|
||||
end,
|
||||
proc do |r|
|
||||
render_paper_title(r["title"])
|
||||
render_author_list(r)
|
||||
puts "---"
|
||||
textit {
|
||||
puts "#{LabMetadata.venue_name(r)}#{if r["id"].nil? then "" else " ##{r["id"]}" end}, "
|
||||
}
|
||||
puts get_pub_length_string(r)
|
||||
end,
|
||||
global_filter
|
||||
)
|
||||
end
|
||||
|
||||
render_one_pub_or_artifact(
|
||||
"Patents",
|
||||
all_my_pubs.where do |r|
|
||||
case get_venue_type(r)
|
||||
when "patent" then true
|
||||
else false
|
||||
end
|
||||
end,
|
||||
proc do |r|
|
||||
render_paper_title(r["title"])
|
||||
render_author_list(r)
|
||||
puts "--- #{r["country"]} Patent#{if r["status"] == "granted" then "" else " Application" end} ##{r["id"]}"
|
||||
end,
|
||||
global_filter
|
||||
)
|
||||
unless skip?(:patents)
|
||||
render_one_pub_or_artifact(
|
||||
"Patents",
|
||||
all_my_pubs.where do |r|
|
||||
case get_venue_type(r)
|
||||
when "patent" then true
|
||||
else false
|
||||
end
|
||||
end,
|
||||
proc do |r|
|
||||
render_paper_title(r["title"])
|
||||
render_author_list(r)
|
||||
puts "--- #{r["country"]} Patent#{if r["status"] == "granted" then "" else " Application" end} ##{r["id"]}"
|
||||
end,
|
||||
global_filter
|
||||
)
|
||||
end
|
||||
|
||||
render_one_pub_or_artifact(
|
||||
"Artifacts",
|
||||
@data["artifacts"],
|
||||
proc do |r|
|
||||
print_direct "\\textbf{#{safe_text r["name"]}} (#{safe_text r["class"]})"
|
||||
endl
|
||||
print_direct "\\textit{#{safe_text r["description"]}}"
|
||||
unless r["url"].nil?
|
||||
unless skip?(:artifacts)
|
||||
render_one_pub_or_artifact(
|
||||
"Artifacts",
|
||||
@data["artifacts"],
|
||||
proc do |r|
|
||||
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
|
||||
url(r["url"])
|
||||
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["metricsasof"].nil?
|
||||
print_direct "\\textit{#{safe_text r["description"]}}"
|
||||
unless r["url"].nil?
|
||||
endl
|
||||
puts "As of #{r["metricsasof"]}, #{r["name"]} had "
|
||||
else
|
||||
puts "#{r["name"]} has "
|
||||
url(r["url"])
|
||||
end
|
||||
|
||||
metrics = r["metrics"].to_a.map do |m,v|
|
||||
case m
|
||||
when "sitevisits" then "#{safe_text v} unique website visitors"
|
||||
when "downloads" then "#{safe_text v} unique downloads"
|
||||
else puts "#{safe_text v} #{safe_text m}"
|
||||
end
|
||||
end
|
||||
|
||||
case metrics.length
|
||||
when 0 then raise "Empty Metrics Field for #{r["name"]}"
|
||||
when 1 then puts metrics[0]
|
||||
when 2 then puts metrics.join(" and ")
|
||||
unless r["metrics"].nil?
|
||||
unless r["metricsasof"].nil?
|
||||
endl
|
||||
puts "As of #{r["metricsasof"]}, #{r["name"]} had "
|
||||
else
|
||||
metrics.push("and #{metrics.pop}")
|
||||
puts metrics.join(", ")
|
||||
puts "#{r["name"]} has "
|
||||
end
|
||||
|
||||
metrics = r["metrics"].to_a.map do |m,v|
|
||||
case m
|
||||
when "sitevisits" then "#{safe_text v} unique website visitors"
|
||||
when "downloads" then "#{safe_text v} unique downloads"
|
||||
else puts "#{safe_text v} #{safe_text m}"
|
||||
end
|
||||
end
|
||||
|
||||
case metrics.length
|
||||
when 0 then raise "Empty Metrics Field for #{r["name"]}"
|
||||
when 1 then puts metrics[0]
|
||||
when 2 then puts metrics.join(" and ")
|
||||
else
|
||||
metrics.push("and #{metrics.pop}")
|
||||
puts metrics.join(", ")
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
) if args.fetch(:show_artifacts, true)
|
||||
) if args.fetch(:show_artifacts, true)
|
||||
end
|
||||
end
|
||||
|
||||
end
|
|
@ -56,7 +56,7 @@ module Latex
|
|||
latex_command(:smallskip)
|
||||
latex_command(:medskip)
|
||||
latex_command(:bigskip)
|
||||
latex_command(:itemize , environment: true)
|
||||
latex_command(:itemize , arg_optional:[true], environment: true)
|
||||
latex_command(:enumeate, environment: true)
|
||||
latex_command(:item)
|
||||
latex_command(:tabular, environment: true)
|
||||
|
@ -125,9 +125,10 @@ module Latex
|
|||
end
|
||||
end
|
||||
|
||||
def build_itemize(array)
|
||||
def build_itemize(array, *args)
|
||||
|
||||
if(array.length > 0)
|
||||
itemize do
|
||||
itemize(*args) do
|
||||
array.each do |r|
|
||||
item
|
||||
yield r
|
||||
|
|
|
@ -94,6 +94,15 @@ module Text
|
|||
return date_to_time(r["end"]).year >= year
|
||||
elsif not r["years"].nil?
|
||||
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
|
||||
raise "Invalid time range : #{r}"
|
||||
end
|
||||
|
|
BIN
src/papers/2017/VLDB-BetaPDBs-submitted.pdf
Normal file
BIN
src/papers/2017/VLDB-BetaPDBs-submitted.pdf
Normal file
Binary file not shown.
Loading…
Reference in a new issue