Merge branch 'master' of gitlab.odin.cse.buffalo.edu:odin-lab/Website
This commit is contained in:
commit
12f98e057c
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -3,3 +3,5 @@ build
|
|||
*.aux
|
||||
*.log
|
||||
artifacts
|
||||
*.pdf
|
||||
*.tex
|
29
Rakefile
29
Rakefile
|
@ -149,3 +149,32 @@ directory "build/artifacts"
|
|||
task :deploy => [:documents,:odin_lab,"build/artifacts"] do
|
||||
system("cp -r artifacts/*.{pdf,json} build/artifacts/")
|
||||
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",
|
||||
|
|
180
lib/cv.rb
180
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")
|
||||
|
||||
unless skip? :reviewer
|
||||
subsection!("Reviewer / Program Comittee Member")
|
||||
render_one_activity_class(@data["reviewer"],
|
||||
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
|
||||
|
||||
unless skip? :general_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")
|
||||
render_one_activity_class(@data["memberships"], "org")
|
||||
render_one_activity_class(:memberships, @data["memberships"], "org")
|
||||
end
|
||||
|
||||
unless skip? :volunteering
|
||||
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")
|
||||
build_itemize(@data["service"]["dept"]) do |dept|
|
||||
puts dept["org"]
|
||||
render_one_activity_class(dept["service"], "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,13 +269,12 @@ 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]
|
||||
since = @since[:courses]
|
||||
courses = courses.map do |dept|
|
||||
dept = dept.clone
|
||||
dept["courses"] = dept["courses"].select do |c|
|
||||
|
@ -270,11 +285,10 @@ class CV < Latex::Builder
|
|||
end
|
||||
dept unless dept["courses"].empty?
|
||||
end.compact
|
||||
end
|
||||
|
||||
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,6 +344,9 @@ class CV < Latex::Builder
|
|||
test_for_since.call(r)
|
||||
}.sort { |a,b| to_date(b["start"]) <=> to_date(a["start"])}
|
||||
|
||||
|
||||
unless grants_in_category.empty?
|
||||
|
||||
## Header for the category
|
||||
subsection!("#{sec} (#{grants_in_category.length})")
|
||||
|
||||
|
@ -426,6 +440,7 @@ class CV < Latex::Builder
|
|||
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,33 +538,29 @@ 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
|
||||
unless skip?(:journal_pubs)
|
||||
render_one_pub_or_artifact(
|
||||
"Journal Publications",
|
||||
all_my_pubs.where do |r|
|
||||
|
@ -575,7 +586,9 @@ class CV < Latex::Builder
|
|||
end,
|
||||
global_filter
|
||||
)
|
||||
end
|
||||
|
||||
unless skip?(:conference_pubs)
|
||||
render_one_pub_or_artifact(
|
||||
"Conference Publications",
|
||||
all_my_pubs.where do |r|
|
||||
|
@ -595,7 +608,9 @@ class CV < Latex::Builder
|
|||
end,
|
||||
global_filter
|
||||
)
|
||||
end
|
||||
|
||||
unless skip?(:workshop_pubs)
|
||||
render_one_pub_or_artifact(
|
||||
"Workshop Publications",
|
||||
all_my_pubs.where do |r|
|
||||
|
@ -615,7 +630,9 @@ class CV < Latex::Builder
|
|||
end,
|
||||
global_filter
|
||||
)
|
||||
end
|
||||
|
||||
unless skip?(:book_chapters)
|
||||
render_one_pub_or_artifact(
|
||||
"Book Chapters",
|
||||
all_my_pubs.where do |r|
|
||||
|
@ -640,6 +657,7 @@ class CV < Latex::Builder
|
|||
end,
|
||||
global_filter
|
||||
)
|
||||
end
|
||||
|
||||
render_one_pub_or_artifact(
|
||||
"Submitted Publications",
|
||||
|
@ -655,6 +673,7 @@ class CV < Latex::Builder
|
|||
global_filter
|
||||
) if @include_pending_papers
|
||||
|
||||
unless skip?(:tech_reports)
|
||||
render_one_pub_or_artifact(
|
||||
"Technical Reports",
|
||||
all_my_pubs.where do |r|
|
||||
|
@ -673,8 +692,10 @@ class CV < Latex::Builder
|
|||
puts get_pub_length_string(r)
|
||||
end,
|
||||
global_filter
|
||||
) if args.fetch(:show_tech_reports, true)
|
||||
)
|
||||
end
|
||||
|
||||
unless skip?(:patents)
|
||||
render_one_pub_or_artifact(
|
||||
"Patents",
|
||||
all_my_pubs.where do |r|
|
||||
|
@ -690,23 +711,25 @@ class CV < Latex::Builder
|
|||
end,
|
||||
global_filter
|
||||
)
|
||||
end
|
||||
|
||||
unless skip?(:artifacts)
|
||||
render_one_pub_or_artifact(
|
||||
"Artifacts",
|
||||
@data["artifacts"],
|
||||
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
|
||||
print_direct "\\textit{#{safe_text r["description"]}}"
|
||||
unless r["url"].nil?
|
||||
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?
|
||||
endl
|
||||
|
@ -735,5 +758,6 @@ class CV < Latex::Builder
|
|||
end
|
||||
) 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