* merging manifest
This commit is contained in:
commit
7df02c0778
|
|
@ -16,6 +16,7 @@ CREATE INDEX geoiplocations_geog_gix ON geoiplocations USING GIST (geog);
|
|||
|
||||
ALTER TABLE geoipblocks DROP COLUMN geom;
|
||||
ALTER TABLE geoipblocks ADD COLUMN geom geometry(polygon);
|
||||
-- DROP INDEX geoipblocks_geom_gix;
|
||||
UPDATE geoipblocks SET geom = ST_MakeEnvelope(beginip, -1, endip, 1);
|
||||
CREATE INDEX geoipblocks_geom_gix ON geoipblocks USING GIST (geom);
|
||||
|
||||
|
|
@ -24,13 +25,12 @@ ALTER TABLE jamisp ADD COLUMN geom geometry(polygon);
|
|||
UPDATE jamisp SET geom = ST_MakeEnvelope(beginip, -1, endip, 1);
|
||||
CREATE INDEX jamisp_geom_gix ON jamisp USING GIST (geom);
|
||||
|
||||
delete from cities;
|
||||
insert into cities (city, region, countrycode) select distinct city, region, countrycode from geoiplocations where length(city) > 0 and length(countrycode) > 0;
|
||||
DELETE FROM cities;
|
||||
INSERT INTO cities (city, region, countrycode) SELECT DISTINCT city, region, countrycode FROM geoiplocations WHERE length(city) > 0 AND length(countrycode) > 0;
|
||||
DELETE FROM regions;
|
||||
INSERT INTO regions (region, countrycode) SELECT DISTINCT region, countrycode FROM cities;
|
||||
DELETE FROM countries;
|
||||
INSERT INTO countries (countrycode) SELECT DISTINCT countrycode FROM regions;
|
||||
|
||||
delete from regions;
|
||||
insert into regions (region, countrycode) select distinct region, countrycode from cities;
|
||||
|
||||
delete from countries;
|
||||
insert into countries (countrycode) select distinct countrycode from regions;
|
||||
|
||||
VACUUM ANALYSE;
|
||||
|
|
|
|||
|
|
@ -131,4 +131,6 @@ connection_client_type.sql
|
|||
add_countries_regions_and_cities.sql
|
||||
plays_refactor.sql
|
||||
fix_max_mind_isp_and_geo.sql
|
||||
events.sql
|
||||
update_get_work_for_client_type.sql
|
||||
events.sql
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,16 @@
|
|||
DROP FUNCTION get_work (mylocidispid BIGINT);
|
||||
CREATE FUNCTION get_work (mylocidispid BIGINT) RETURNS TABLE (client_id VARCHAR(64)) ROWS 5 VOLATILE AS $$
|
||||
BEGIN
|
||||
CREATE TEMPORARY TABLE foo (locidispid BIGINT, locid INT);
|
||||
INSERT INTO foo SELECT DISTINCT locidispid, locidispid/1000000 FROM connections where client_type = 'client';
|
||||
DELETE FROM foo WHERE locidispid IN (SELECT DISTINCT blocidispid FROM current_scores WHERE alocidispid = mylocidispid AND (current_timestamp - score_dt) < interval '24 hours');
|
||||
DELETE FROM foo WHERE locid NOT IN (SELECT locid FROM geoiplocations WHERE geog && st_buffer((SELECT geog from geoiplocations WHERE locid = mylocidispid/1000000), 806000));
|
||||
CREATE TEMPORARY TABLE bar (client_id VARCHAR(64), locidispid BIGINT, r DOUBLE PRECISION);
|
||||
INSERT INTO bar SELECT l.client_id, l.locidispid, random() FROM connections l, foo f WHERE l.locidispid = f.locidispid and l.client_type = 'client';
|
||||
DROP TABLE foo;
|
||||
DELETE FROM bar b WHERE r != (SELECT max(r) FROM bar b0 WHERE b0.locidispid = b.locidispid);
|
||||
RETURN QUERY SELECT b.client_id FROM bar b ORDER BY r LIMIT 5;
|
||||
DROP TABLE bar;
|
||||
RETURN;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
|
@ -8,7 +8,7 @@ class JamRuby::EventSession < ActiveRecord::Base
|
|||
|
||||
|
||||
validates :event, presence: true
|
||||
validates :pinned_state, :inclusion => {:in => [nil, :not_started, :over]}
|
||||
validates :pinned_state, :inclusion => {:in => [nil, 'not_started', 'over']}
|
||||
validate :one_of_user_band
|
||||
|
||||
before_validation :sanitize_active_admin
|
||||
|
|
|
|||
|
|
@ -15,7 +15,97 @@ module JamRuby
|
|||
end
|
||||
|
||||
def self.import_from_max_mind(file)
|
||||
# todo implement import_from_max_mind
|
||||
|
||||
# File Geo-134
|
||||
# Format:
|
||||
# startIpNum,endIpNum,locId
|
||||
|
||||
GeoIpBlocks.transaction do
|
||||
GeoIpBlocks.delete_all
|
||||
File.open(file, 'r:ISO-8859-1') do |io|
|
||||
s = io.gets.strip # eat the copyright line. gah, why do they have that in their file??
|
||||
unless s.eql? 'Copyright (c) 2011 MaxMind Inc. All Rights Reserved.'
|
||||
puts s
|
||||
puts 'Copyright (c) 2011 MaxMind Inc. All Rights Reserved.'
|
||||
raise 'file does not start with expected copyright (line 1): Copyright (c) 2011 MaxMind Inc. All Rights Reserved.'
|
||||
end
|
||||
|
||||
s = io.gets.strip # eat the headers line
|
||||
unless s.eql? 'startIpNum,endIpNum,locId'
|
||||
puts s
|
||||
puts 'startIpNum,endIpNum,locId'
|
||||
raise 'file does not start with expected header (line 2): startIpNum,endIpNum,locId'
|
||||
end
|
||||
|
||||
saved_level = ActiveRecord::Base.logger ? ActiveRecord::Base.logger.level : 0
|
||||
count = 0
|
||||
|
||||
stmt = "insert into #{GeoIpBlocks.table_name} (beginip, endip, locid) values"
|
||||
|
||||
vals = ''
|
||||
sep = ''
|
||||
i = 0
|
||||
n = 20
|
||||
|
||||
csv = ::CSV.new(io, {encoding: 'ISO-8859-1', headers: false})
|
||||
csv.each do |row|
|
||||
raise "file does not have expected number of columns (3): #{row.length}" unless row.length == 3
|
||||
|
||||
beginip = MaxMindIsp.ip_address_to_int(MaxMindIsp.strip_quotes(row[0]))
|
||||
endip = MaxMindIsp.ip_address_to_int(MaxMindIsp.strip_quotes(row[1]))
|
||||
locid = row[2]
|
||||
|
||||
vals = vals+sep+"(#{beginip}, #{endip}, #{locid})"
|
||||
sep = ','
|
||||
i += 1
|
||||
|
||||
if count == 0 or i >= n then
|
||||
GeoIpBlocks.connection.execute stmt+vals
|
||||
count += i
|
||||
vals = ''
|
||||
sep = ''
|
||||
i = 0
|
||||
|
||||
if ActiveRecord::Base.logger and ActiveRecord::Base.logger.level > 1 then
|
||||
ActiveRecord::Base.logger.debug "... logging inserts into #{GeoIpBlocks.table_name} suspended ..."
|
||||
ActiveRecord::Base.logger.level = 1
|
||||
end
|
||||
|
||||
if ActiveRecord::Base.logger and count%10000 < n then
|
||||
ActiveRecord::Base.logger.level = saved_level
|
||||
ActiveRecord::Base.logger.debug "... inserted #{count} into #{GeoIpBlocks.table_name} ..."
|
||||
ActiveRecord::Base.logger.level = 1
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if i > 0 then
|
||||
GeoIpBlocks.connection.execute stmt+vals
|
||||
count += i
|
||||
end
|
||||
|
||||
if ActiveRecord::Base.logger then
|
||||
ActiveRecord::Base.logger.level = saved_level
|
||||
ActiveRecord::Base.logger.debug "loaded #{count} records into #{GeoIpBlocks.table_name}"
|
||||
end
|
||||
|
||||
sts = GeoIpBlocks.connection.execute 'ALTER TABLE geoipblocks DROP COLUMN geom;'
|
||||
ActiveRecord::Base.logger.debug "DROP COLUMN geom returned sts #{sts.cmd_status}" if ActiveRecord::Base.logger
|
||||
# sts.check [we don't care]
|
||||
|
||||
sts = GeoIpBlocks.connection.execute 'ALTER TABLE geoipblocks ADD COLUMN geom geometry(polygon);'
|
||||
ActiveRecord::Base.logger.debug "ADD COLUMN geom returned sts #{sts.cmd_status}" if ActiveRecord::Base.logger
|
||||
sts.check
|
||||
|
||||
sts = GeoIpBlocks.connection.execute 'UPDATE geoipblocks SET geom = ST_MakeEnvelope(beginip, -1, endip, 1);'
|
||||
ActiveRecord::Base.logger.debug "SET geom returned sts #{sts.cmd_tuples}" if ActiveRecord::Base.logger
|
||||
sts.check
|
||||
|
||||
sts = GeoIpBlocks.connection.execute 'CREATE INDEX geoipblocks_geom_gix ON geoipblocks USING GIST (geom);'
|
||||
ActiveRecord::Base.logger.debug "CREATE INDEX geoipblocks_geom_gix returned sts #{sts.cmd_status}" if ActiveRecord::Base.logger
|
||||
sts.check
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -2,21 +2,149 @@ module JamRuby
|
|||
class GeoIpLocations < ActiveRecord::Base
|
||||
|
||||
self.table_name = 'geoiplocations'
|
||||
CITIES_TABLE = 'cities'
|
||||
REGIONS_TABLE = 'regions'
|
||||
COUNTRIES_TABLE = 'countries'
|
||||
|
||||
def self.lookup(locid)
|
||||
GeoIpLocations.where(locid: locid)
|
||||
self.where(locid: locid)
|
||||
.limit(1)
|
||||
.first
|
||||
end
|
||||
|
||||
def self.createx(locid, countrycode, region, city, postalcode, latitude, longitude, metrocode, areacode)
|
||||
c = connection.raw_connection
|
||||
c.exec_params('insert into geoiplocations (locid, countrycode, region, city, postalcode, latitude, longitude, metrocode, areacode, geog) values($1, $2, $3, $4, $5, $6, $7, $8, $9, ST_SetSRID(ST_MakePoint($7, $6), 4326)::geography)',
|
||||
c.exec_params("insert into #{self.table_name} (locid, countrycode, region, city, postalcode, latitude, longitude, metrocode, areacode, geog) values($1, $2, $3, $4, $5, $6, $7, $8, $9, ST_SetSRID(ST_MakePoint($7, $6), 4326)::geography)",
|
||||
[locid, countrycode, region, city, postalcode, latitude, longitude, metrocode, areacode])
|
||||
end
|
||||
|
||||
def self.i(s)
|
||||
return 'NULL' if s.nil? or s.blank?
|
||||
return s.to_i
|
||||
end
|
||||
|
||||
def self.import_from_max_mind(file)
|
||||
# todo implement import_from_max_mind
|
||||
|
||||
# File Geo-134
|
||||
# Format:
|
||||
# locId,country,region,city,postalCode,latitude,longitude,metroCode,areaCode
|
||||
|
||||
self.transaction do
|
||||
self.delete_all
|
||||
File.open(file, 'r:ISO-8859-1') do |io|
|
||||
s = io.gets.strip # eat the copyright line. gah, why do they have that in their file??
|
||||
unless s.eql? 'Copyright (c) 2012 MaxMind LLC. All Rights Reserved.'
|
||||
puts s
|
||||
puts 'Copyright (c) 2012 MaxMind LLC. All Rights Reserved.'
|
||||
raise 'file does not start with expected copyright (line 1): Copyright (c) 2012 MaxMind LLC. All Rights Reserved.'
|
||||
end
|
||||
|
||||
s = io.gets.strip # eat the headers line
|
||||
unless s.eql? 'locId,country,region,city,postalCode,latitude,longitude,metroCode,areaCode'
|
||||
puts s
|
||||
puts 'locId,country,region,city,postalCode,latitude,longitude,metroCode,areaCode'
|
||||
raise 'file does not start with expected header (line 2): locId,country,region,city,postalCode,latitude,longitude,metroCode,areaCode'
|
||||
end
|
||||
|
||||
saved_level = ActiveRecord::Base.logger ? ActiveRecord::Base.logger.level : 0
|
||||
count = 0
|
||||
|
||||
stmt = "INSERT INTO #{self.table_name} (locid, countrycode, region, city, postalcode, latitude, longitude, metrocode, areacode) VALUES"
|
||||
|
||||
vals = ''
|
||||
sep = ''
|
||||
i = 0
|
||||
n = 20
|
||||
|
||||
csv = ::CSV.new(io, {encoding: 'ISO-8859-1', headers: false})
|
||||
csv.each do |row|
|
||||
raise "file does not have expected number of columns (9): #{row.length}" unless row.length == 9
|
||||
|
||||
locid = row[0]
|
||||
countrycode = row[1]
|
||||
region = row[2]
|
||||
city = row[3]
|
||||
postalcode = row[4]
|
||||
latitude = row[5]
|
||||
longitude = row[6]
|
||||
metrocode = row[7]
|
||||
areacode = row[8]
|
||||
|
||||
vals = vals+sep+"(#{locid}, '#{countrycode}', '#{region}', #{MaxMindIsp.quote_value(city)}, '#{postalcode}', #{latitude}, #{longitude}, #{i(metrocode)}, '#{areacode}')"
|
||||
sep = ','
|
||||
i += 1
|
||||
|
||||
if count == 0 or i >= n then
|
||||
self.connection.execute stmt+vals
|
||||
count += i
|
||||
vals = ''
|
||||
sep = ''
|
||||
i = 0
|
||||
|
||||
if ActiveRecord::Base.logger and ActiveRecord::Base.logger.level > 1 then
|
||||
ActiveRecord::Base.logger.debug "... logging inserts into #{self.table_name} suspended ..."
|
||||
ActiveRecord::Base.logger.level = 1
|
||||
end
|
||||
|
||||
if ActiveRecord::Base.logger and count%10000 < n then
|
||||
ActiveRecord::Base.logger.level = saved_level
|
||||
ActiveRecord::Base.logger.debug "... inserted #{count} into #{self.table_name} ..."
|
||||
ActiveRecord::Base.logger.level = 1
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if i > 0 then
|
||||
self.connection.execute stmt+vals
|
||||
count += i
|
||||
end
|
||||
|
||||
if ActiveRecord::Base.logger then
|
||||
ActiveRecord::Base.logger.level = saved_level
|
||||
ActiveRecord::Base.logger.debug "loaded #{count} records into #{self.table_name}"
|
||||
end
|
||||
|
||||
sts = self.connection.execute "ALTER TABLE #{self.table_name} DROP COLUMN geog;"
|
||||
ActiveRecord::Base.logger.debug "DROP COLUMN geog returned sts #{sts.cmd_status}" if ActiveRecord::Base.logger
|
||||
# sts.check [we don't care]
|
||||
|
||||
sts = self.connection.execute "ALTER TABLE #{self.table_name} ADD COLUMN geog geography(point, 4326);"
|
||||
ActiveRecord::Base.logger.debug "ADD COLUMN geog returned sts #{sts.cmd_status}" if ActiveRecord::Base.logger
|
||||
sts.check
|
||||
|
||||
sts = self.connection.execute "UPDATE #{self.table_name} SET geog = ST_SetSRID(ST_MakePoint(longitude, latitude), 4326)::geography;"
|
||||
ActiveRecord::Base.logger.debug "SET geog returned sts #{sts.cmd_tuples}" if ActiveRecord::Base.logger
|
||||
sts.check
|
||||
|
||||
sts = self.connection.execute "CREATE INDEX #{self.table_name}_geog_gix ON #{self.table_name} USING GIST (geog);"
|
||||
ActiveRecord::Base.logger.debug "CREATE INDEX #{self.table_name}_geog_gix returned sts #{sts.cmd_status}" if ActiveRecord::Base.logger
|
||||
sts.check
|
||||
|
||||
sts = self.connection.execute "DELETE FROM #{CITIES_TABLE};"
|
||||
ActiveRecord::Base.logger.debug "DELETE FROM #{CITIES_TABLE} returned sts #{sts.cmd_status}" if ActiveRecord::Base.logger
|
||||
sts.check
|
||||
|
||||
sts = self.connection.execute "INSERT INTO #{CITIES_TABLE} (city, region, countrycode) SELECT DISTINCT city, region, countrycode FROM #{self.table_name} WHERE length(city) > 0 AND length(countrycode) > 0;"
|
||||
ActiveRecord::Base.logger.debug "INSERT INTO #{CITIES_TABLE} returned sts #{sts.cmd_status}" if ActiveRecord::Base.logger
|
||||
sts.check
|
||||
|
||||
sts = self.connection.execute "DELETE FROM #{REGIONS_TABLE};"
|
||||
ActiveRecord::Base.logger.debug "DELETE FROM #{REGIONS_TABLE} returned sts #{sts.cmd_status}" if ActiveRecord::Base.logger
|
||||
sts.check
|
||||
|
||||
sts = self.connection.execute "INSERT INTO #{REGIONS_TABLE} (region, countrycode) SELECT DISTINCT region, countrycode FROM #{CITIES_TABLE};"
|
||||
ActiveRecord::Base.logger.debug "INSERT INTO #{REGIONS_TABLE} returned sts #{sts.cmd_status}" if ActiveRecord::Base.logger
|
||||
sts.check
|
||||
|
||||
sts = self.connection.execute "DELETE FROM #{COUNTRIES_TABLE};"
|
||||
ActiveRecord::Base.logger.debug "DELETE FROM #{COUNTRIES_TABLE} returned sts #{sts.cmd_status}" if ActiveRecord::Base.logger
|
||||
sts.check
|
||||
|
||||
sts = self.connection.execute "INSERT INTO #{COUNTRIES_TABLE} (countrycode) SELECT DISTINCT countrycode FROM #{REGIONS_TABLE};"
|
||||
ActiveRecord::Base.logger.debug "INSERT INTO #{COUNTRIES_TABLE} returned sts #{sts.cmd_status}" if ActiveRecord::Base.logger
|
||||
sts.check
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -4,6 +4,8 @@ module JamRuby
|
|||
class JamIsp < ActiveRecord::Base
|
||||
|
||||
self.table_name = 'jamisp'
|
||||
COMPANY_TABLE = 'jamcompany'
|
||||
GEOIPISP_TABLE = 'geoipisp'
|
||||
|
||||
def self.ip_to_num(ip_addr)
|
||||
begin
|
||||
|
|
@ -24,7 +26,7 @@ module JamRuby
|
|||
|
||||
def self.createx(beginip, endip, coid)
|
||||
c = connection.raw_connection
|
||||
c.exec_params('insert into jamisp (beginip, endip, coid, geom) values($1::bigint, $2::bigint, $3, ST_MakeEnvelope($1::bigint, -1, $2::bigint, 1))',
|
||||
c.exec_params("insert into #{self.table_name} (beginip, endip, coid, geom) values($1::bigint, $2::bigint, $3, ST_MakeEnvelope($1::bigint, -1, $2::bigint, 1))",
|
||||
[beginip, endip, coid])
|
||||
end
|
||||
|
||||
|
|
@ -37,7 +39,117 @@ module JamRuby
|
|||
end
|
||||
|
||||
def self.import_from_max_mind(file)
|
||||
# todo implement import_from_max_mind
|
||||
|
||||
# File Geo-124
|
||||
# Format:
|
||||
# startIpNum,endIpNum,isp
|
||||
|
||||
GeoIpLocations.transaction do
|
||||
GeoIpLocations.delete_all
|
||||
File.open(file, 'r:ISO-8859-1') do |io|
|
||||
#s = io.gets.strip # eat the copyright line. gah, why do they have that in their file??
|
||||
#unless s.eql? 'Copyright (c) 2012 MaxMind LLC. All Rights Reserved.'
|
||||
# puts s
|
||||
# puts 'Copyright (c) 2012 MaxMind LLC. All Rights Reserved.'
|
||||
# raise 'file does not start with expected copyright (line 1): Copyright (c) 2012 MaxMind LLC. All Rights Reserved.'
|
||||
#end
|
||||
|
||||
#s = io.gets.strip # eat the headers line
|
||||
#unless s.eql? 'locId,country,region,city,postalCode,latitude,longitude,metroCode,areaCode'
|
||||
# puts s
|
||||
# puts 'locId,country,region,city,postalCode,latitude,longitude,metroCode,areaCode'
|
||||
# raise 'file does not start with expected header (line 2): locId,country,region,city,postalCode,latitude,longitude,metroCode,areaCode'
|
||||
#end
|
||||
|
||||
saved_level = ActiveRecord::Base.logger ? ActiveRecord::Base.logger.level : 0
|
||||
count = 0
|
||||
|
||||
stmt = "insert into #{GEOIPISP_TABLE} (beginip, endip, company) values"
|
||||
|
||||
vals = ''
|
||||
sep = ''
|
||||
i = 0
|
||||
n = 20
|
||||
|
||||
csv = ::CSV.new(io, {encoding: 'ISO-8859-1', headers: false})
|
||||
csv.each do |row|
|
||||
raise "file does not have expected number of columns (3): #{row.length}" unless row.length == 3
|
||||
|
||||
beginip = MaxMindIsp.ip_address_to_int(MaxMindIsp.strip_quotes(row[0]))
|
||||
endip = MaxMindIsp.ip_address_to_int(MaxMindIsp.strip_quotes(row[1]))
|
||||
company = row[2]
|
||||
|
||||
vals = vals+sep+"(#{beginip}, #{endip}, #{MaxMindIsp.quote_value(company)})"
|
||||
sep = ','
|
||||
i += 1
|
||||
|
||||
if count == 0 or i >= n then
|
||||
GeoIpLocations.connection.execute stmt+vals
|
||||
count += i
|
||||
vals = ''
|
||||
sep = ''
|
||||
i = 0
|
||||
|
||||
if ActiveRecord::Base.logger and ActiveRecord::Base.logger.level > 1 then
|
||||
ActiveRecord::Base.logger.debug "... logging inserts into #{GEOIPISP_TABLE} suspended ..."
|
||||
ActiveRecord::Base.logger.level = 1
|
||||
end
|
||||
|
||||
if ActiveRecord::Base.logger and count%10000 < n then
|
||||
ActiveRecord::Base.logger.level = saved_level
|
||||
ActiveRecord::Base.logger.debug "... inserted #{count} into #{GEOIPISP_TABLE} ..."
|
||||
ActiveRecord::Base.logger.level = 1
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if i > 0 then
|
||||
GeoIpLocations.connection.execute stmt+vals
|
||||
count += i
|
||||
end
|
||||
|
||||
if ActiveRecord::Base.logger then
|
||||
ActiveRecord::Base.logger.level = saved_level
|
||||
ActiveRecord::Base.logger.debug "loaded #{count} records into #{GEOIPISP_TABLE}"
|
||||
end
|
||||
|
||||
sts = GeoIpLocations.connection.execute "DELETE FROM #{COMPANY_TABLE};"
|
||||
ActiveRecord::Base.logger.debug "DELETE FROM #{COMPANY_TABLE} returned sts #{sts.cmd_status}" if ActiveRecord::Base.logger
|
||||
sts.check
|
||||
|
||||
sts = GeoIpLocations.connection.execute "ALTER SEQUENCE #{COMPANY_TABLE}_coid_seq RESTART WITH 1;"
|
||||
ActiveRecord::Base.logger.debug "ALTER SEQUENCE #{COMPANY_TABLE}_coid_seq returned sts #{sts.cmd_status}" if ActiveRecord::Base.logger
|
||||
sts.check
|
||||
|
||||
sts = GeoIpLocations.connection.execute "INSERT INTO #{COMPANY_TABLE} (company) SELECT DISTINCT company FROM #{GEOIPISP_TABLE} ORDER BY company;"
|
||||
ActiveRecord::Base.logger.debug "INSERT INTO #{COMPANY_TABLE} returned sts #{sts.cmd_status}" if ActiveRecord::Base.logger
|
||||
sts.check
|
||||
|
||||
sts = GeoIpLocations.connection.execute "DELETE FROM #{self.table_name};"
|
||||
ActiveRecord::Base.logger.debug "DELETE FROM #{self.table_name} returned sts #{sts.cmd_status}" if ActiveRecord::Base.logger
|
||||
sts.check
|
||||
|
||||
sts = GeoIpLocations.connection.execute "INSERT INTO #{self.table_name} (beginip, endip, coid) SELECT x.beginip, x.endip, y.coid FROM #{GEOIPISP_TABLE} x, #{COMPANY_TABLE} y WHERE x.company = y.company;"
|
||||
ActiveRecord::Base.logger.debug "INSERT INTO #{self.table_name} returned sts #{sts.cmd_status}" if ActiveRecord::Base.logger
|
||||
sts.check
|
||||
|
||||
sts = GeoIpLocations.connection.execute "ALTER TABLE #{self.table_name} DROP COLUMN geom;"
|
||||
ActiveRecord::Base.logger.debug "DROP COLUMN geom returned sts #{sts.cmd_status}" if ActiveRecord::Base.logger
|
||||
#sts.check [we don't care]
|
||||
|
||||
sts = GeoIpLocations.connection.execute "ALTER TABLE #{self.table_name} ADD COLUMN geom geometry(polygon);"
|
||||
ActiveRecord::Base.logger.debug "ADD COLUMN geom returned sts #{sts.cmd_status}" if ActiveRecord::Base.logger
|
||||
sts.check
|
||||
|
||||
sts = GeoIpLocations.connection.execute "UPDATE #{self.table_name} SET geom = ST_MakeEnvelope(beginip, -1, endip, 1);"
|
||||
ActiveRecord::Base.logger.debug "SET geom returned sts #{sts.cmd_tuples}" if ActiveRecord::Base.logger
|
||||
sts.check
|
||||
|
||||
sts = GeoIpLocations.connection.execute "CREATE INDEX #{self.table_name}_geom_gix ON #{self.table_name} USING GIST (geom);"
|
||||
ActiveRecord::Base.logger.debug "CREATE INDEX #{self.table_name}_geom_gix returned sts #{sts.cmd_status}" if ActiveRecord::Base.logger
|
||||
sts.check
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -539,8 +539,13 @@ module JamRuby
|
|||
notifications, online_followers, offline_followers = [], [], []
|
||||
notification_msg = format_msg(NotificationTypes::BAND_SESSION_JOIN, nil, band)
|
||||
|
||||
band.followers.each do |bf|
|
||||
follower = bf.user
|
||||
followers = band.followers.map { |bf| bf.user }
|
||||
|
||||
# do not send band session notifications to band members
|
||||
followers = followers - band.users
|
||||
|
||||
followers.each do |f|
|
||||
follower = f
|
||||
notification = Notification.new
|
||||
notification.band_id = band.id
|
||||
notification.description = NotificationTypes::BAND_SESSION_JOIN
|
||||
|
|
|
|||
|
|
@ -75,8 +75,13 @@ module JamRuby
|
|||
to_delete = Set.new(connection_tracks)
|
||||
to_add = Array.new(tracks)
|
||||
|
||||
tracks.each do |track|
|
||||
instruments << track[:instrument_id]
|
||||
end
|
||||
|
||||
connection_tracks.each do |connection_track|
|
||||
tracks.each do |track|
|
||||
|
||||
if track[:id] == connection_track.id || track[:client_track_id] == connection_track.client_track_id
|
||||
to_delete.delete(connection_track)
|
||||
to_add.delete(track)
|
||||
|
|
@ -85,8 +90,6 @@ module JamRuby
|
|||
connection_track.sound = track[:sound]
|
||||
connection_track.client_track_id = track[:client_track_id]
|
||||
|
||||
instruments << track[:instrument_id]
|
||||
|
||||
result.push(connection_track)
|
||||
|
||||
if connection_track.save
|
||||
|
|
|
|||
Binary file not shown.
|
After Width: | Height: | Size: 1.8 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 1.6 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 2.1 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 2.4 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 5.2 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 2.6 KiB |
|
|
@ -16,10 +16,21 @@
|
|||
float:left;
|
||||
}
|
||||
|
||||
div.test-user-desc {
|
||||
span.testimonial-user-desc {
|
||||
font-style: italic !important;
|
||||
}
|
||||
|
||||
span.press-date {
|
||||
font-style: italic !important;
|
||||
color:#999;
|
||||
line-height:160%;
|
||||
}
|
||||
|
||||
ul.no-style {
|
||||
padding-left: 0px !important;
|
||||
list-style-type: none !important;
|
||||
}
|
||||
|
||||
#nav {
|
||||
margin-top:40px;
|
||||
margin-bottom:30px;
|
||||
|
|
@ -57,8 +68,6 @@ div.test-user-desc {
|
|||
cursor:default;
|
||||
}
|
||||
|
||||
|
||||
|
||||
body.corporate {
|
||||
background-image:url(<%= asset_path('corp/bkg_corporate.gif') %>);
|
||||
background-repeat:repeat-x;
|
||||
|
|
@ -115,6 +124,13 @@ body.corporate ul {
|
|||
font-size:20px;
|
||||
}
|
||||
|
||||
.wrapper h3 {
|
||||
font-weight:300;
|
||||
font-size:16px;
|
||||
line-height:160%;
|
||||
}
|
||||
|
||||
|
||||
#terms-toc a {
|
||||
display:block;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,12 @@
|
|||
.landing-band.event {
|
||||
|
||||
}
|
||||
.landing-details.event {
|
||||
.time {
|
||||
margin-bottom:30px;
|
||||
}
|
||||
|
||||
.bio {
|
||||
line-height:16px;
|
||||
}
|
||||
}
|
||||
|
|
@ -18,5 +18,6 @@
|
|||
*= require web/recordings
|
||||
*= require web/welcome
|
||||
#= require web/sessions
|
||||
*= require web/events
|
||||
*= require users/signinDialog
|
||||
*/
|
||||
|
|
@ -6,11 +6,7 @@ class CorpsController < ApplicationController
|
|||
|
||||
end
|
||||
|
||||
def contact
|
||||
|
||||
end
|
||||
|
||||
def help
|
||||
def news
|
||||
|
||||
end
|
||||
|
||||
|
|
@ -18,11 +14,44 @@ class CorpsController < ApplicationController
|
|||
|
||||
end
|
||||
|
||||
def overview
|
||||
|
||||
end
|
||||
|
||||
def features
|
||||
|
||||
end
|
||||
|
||||
def faqs
|
||||
|
||||
end
|
||||
|
||||
def screenshots
|
||||
|
||||
end
|
||||
|
||||
def photos
|
||||
|
||||
end
|
||||
|
||||
def logos
|
||||
|
||||
end
|
||||
|
||||
def testimonials
|
||||
|
||||
end
|
||||
|
||||
def news
|
||||
def audio
|
||||
|
||||
end
|
||||
|
||||
def videos
|
||||
|
||||
end
|
||||
|
||||
# TODO: FIX THIS
|
||||
def press_releases_launch
|
||||
|
||||
end
|
||||
|
||||
|
|
@ -34,6 +63,10 @@ class CorpsController < ApplicationController
|
|||
|
||||
end
|
||||
|
||||
def help
|
||||
|
||||
end
|
||||
|
||||
def cookie_policy
|
||||
|
||||
end
|
||||
|
|
|
|||
|
|
@ -33,6 +33,7 @@ module EventSessionHelper
|
|||
end
|
||||
|
||||
def event_session_start_hour(event_session)
|
||||
return 'TBD' unless event_session.starts_at
|
||||
timezone = ActiveSupport::TimeZone.new('Central Time (US & Canada)')
|
||||
timezone.at(event_session.starts_at.to_i).strftime('%l:%M %P')
|
||||
end
|
||||
|
|
@ -41,12 +42,12 @@ module EventSessionHelper
|
|||
|
||||
state = nil # can be :not_started, :over, :playing
|
||||
state = event_session.pinned_state if event_session.pinned_state
|
||||
if !state && (event_session.user_id || event_session.band_id)
|
||||
if !state && (event_session.starts_at && event_session.ends_at && (event_session.user_id || event_session.band_id))
|
||||
# if no pinned state, then we try to find if there is a session currently on going during the specified time range
|
||||
# if so, then we are playing.
|
||||
# if there has been none, we say it's still coming,
|
||||
# if there has been at least one, and it's over, we say session over
|
||||
query = MusicSessionHistory.where(created_at: event_session.event.event_day..(event_session.event.event_day + 1.day))
|
||||
query = MusicSessionHistory.where(created_at: event_session.starts_at..event_session.ends_at)
|
||||
if event_session.user_id
|
||||
query = query.where(user_id: event_session.user_id)
|
||||
elsif event_session.band_id
|
||||
|
|
@ -69,7 +70,7 @@ module EventSessionHelper
|
|||
end
|
||||
|
||||
if state == 'over'
|
||||
content_tag(:a, 'SESSION ENDED', href: music_session_detail_path(music_session_history.id), class: 'button-grey')
|
||||
content_tag(:a, 'SESSION ENDED', href: music_session_history.nil? ? '#' : music_session_detail_path(music_session_history.id), class: 'button-grey')
|
||||
elsif state == 'playing'
|
||||
content_tag(:a, '', href: music_session_detail_path(music_session_history.id), class: 'button-orange') do
|
||||
image_tag 'content/icon_playbutton.png', :width => 20, height: 20, align: 'absmiddle'
|
||||
|
|
@ -84,8 +85,8 @@ module EventSessionHelper
|
|||
end
|
||||
|
||||
def event_session_description(event_session)
|
||||
event_session.band.biography if event_session.band
|
||||
event_session.user.biography if event_session.user
|
||||
return event_session.band.biography if event_session.band
|
||||
return event_session.user.biography if event_session.user
|
||||
''
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -0,0 +1,37 @@
|
|||
<% provide(:title, 'Audio Recordings') %>
|
||||
<% provide(:purpose, 'media_center') %>
|
||||
|
||||
<h1>Audio Recordings</h1>
|
||||
|
||||
<p>
|
||||
The following audio recordings demonstrate both the quality of the real-time audio that musicians hear in their headphones while playing together using the service, and the quality of the automatically mastered recordings that the service generates.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
The recordings below labeled “Real-Time Streamed Recording” are from the musicians’ headphones while playing in real-time.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
The recordings below labeled “Mastered Recording” are recordings that the JamKazam service automatically produced by taking the raw audio files captured by the musicians’ audio interfaces and mixing these together as a post process following the actual performance.
|
||||
</p>
|
||||
|
||||
|
||||
<h3>Classical: Pachelbel’s “Canon in D”</h3>
|
||||
<ul>
|
||||
<li><a href="http://www.jamkazam.com/recordings/b3071f33-4514-4f05-8b36-8db8edeab23e" target="_blank">Real-Time Streamed Recording</a></li>
|
||||
<li><a href="http://www.jamkazam.com/recordings/70e9a449-b142-436c-9fb0-cec133a0b429" target="_blank">Mastered Recording</a></li>
|
||||
</ul>
|
||||
|
||||
|
||||
<h3>Rock: Poison’s “Nothin’ But a Good Time”</h3>
|
||||
<ul>
|
||||
<li><a href="http://www.jamkazam.com/recordings/c9e5aec1-662e-4e75-89a9-546f6399c342" target="_blank">Real-Time Streamed Recording</a></li>
|
||||
<li><a href="http://www.jamkazam.com/recordings/05a9ae58-f183-43ae-b57d-54ccf932d15c" target="_blank">Mastered Recording</a></li>
|
||||
</ul>
|
||||
|
||||
|
||||
<h3>Jazz: Jimmy Van Heusen’s and Johnny Burke’s “But Beautiful”</h3>
|
||||
<ul>
|
||||
<li><a href="http://www.jamkazam.com/recordings/eaf88dd0-4b66-4e2b-a856-7e312c392cff" target="_blank">Real-Time Streamed Recording</a></li>
|
||||
<li><a href="http://www.jamkazam.com/recordings/df68065a-8159-4315-957f-9530549dbbac" target="_blank">Mastered Recording</a></li>
|
||||
</ul>
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
<% provide(:title, 'Frequently Asked Questions') %>
|
||||
<% provide(:purpose, 'media_center') %>
|
||||
|
||||
<h1>Frequently Asked Questions</h1>
|
||||
|
||||
<p>
|
||||
The JamKazam FAQ can be found on our support site here: <a href="https://jamkazam.desk.com/customer/portal/articles/1305119-frequently-asked-questions-faq-" target="_blank">JamKazam Frequently Asked Questions</a>.
|
||||
</p>
|
||||
|
|
@ -0,0 +1,83 @@
|
|||
<% provide(:title, 'Features & Benefits') %>
|
||||
<% provide(:purpose, 'media_center') %>
|
||||
|
||||
<h1>Features & Benefits</h1>
|
||||
|
||||
<p>
|
||||
Musicians can enjoy four major features of the new JamKazam service, as described below. Also, several <a href="https://jamkazam.desk.com/customer/portal/articles/1304097-tutorial-videos" target="_blank">Tutorial Videos</a> are available to see how various features work in more detail.
|
||||
</p>
|
||||
|
||||
<br/>
|
||||
|
||||
<h2>FEATURE: Real-Time Online Sessions
</h2><br/>
|
||||
<p>
|
||||
Musicians can create either public or private sessions, or can find and join other musicians’ public sessions, and can play music together in real time in these sessions from different locations over the Internet as if they are sitting in the same room.
|
||||
</p>
|
||||
|
||||
<h2>BENEFITS:</h2>
|
||||
<p>
|
||||
<ul>
|
||||
<li>
|
||||
Musicians today often spend more time packing, transporting, and setting up and tearing down their gear than they spend actually playing together. With JamKazam, a musician can set up and be ready to play with others in 5 minutes without leaving home.
|
||||
</li>
|
||||
<li>
|
||||
Musicians today often struggle to find a place to play together. Apartments and condos won’t work due to noise and space problems. And musicians in homes often have families and children, which makes weeknights impossible again due to noise issues. With JamKazam, musicians can play together from each of their homes, and because JamKazam digitizes and mixes the audio together into the musicians’ headphones, the level of audio disturbance in each musician’s home can be very low to even silent. For example, keyboards and bass guitars can plug straight into an audio interface, and are effectively silent in the musician’s home, and electric guitar players can either plug straight in, or can run their amp at or below the volume of an acoustic guitar, and can mic the amp and adjust the input gain on the audio interface to make the electric guitar as loud as they want it to be in the master mix digitally. Of course, the volume of acoustic instruments like vocals, wind instruments, and drums will be unchanged. But only one home will have to deal with the volume of the drums, and even in this instance, electronic drum kits can be used, again delivering an effectively silent in-home acoustic experience.
|
||||
</li>
|
||||
<li>
|
||||
Musicians today can effectively play only with other musicians in very close geographic proximity – i.e. in the same town, or the same general area of a larger metropolitan area. Often musicians have friends and colleagues who are too far away to allow for creative collaboration. With JamKazam, musicians can play with other musicians in a far greater geographic area, allowing for collaboration with other musicians who are hundreds of miles away.
|
||||
</li>
|
||||
</ul>
|
||||
</p>
|
||||
|
||||
<br/>
|
||||
|
||||
<h2>FEATURE: Session Recording</h2><br/>
|
||||
<p>
|
||||
Musicians can record performances during their real-time, remote sessions. Recordings capture both the composite mix of all performers, as well as each of the individual instrumental and vocal performances at the track level. Musicians can easily share the recording mixes with friends, family and fans via Facebook, Twitter, and email, and they can also open and play back the track-level. In addition, the JamKazam service automatically creates a “mastered” version of recordings using the high-quality tracks captured by the musicians’ audio interfaces prior to encoding and streaming, so mastered recordings are comparable in quality to what can be produced in home studios.
|
||||
</p>
|
||||
|
||||
<h2>BENEFITS:</h2>
|
||||
<p>
|
||||
<ul>
|
||||
<li>
|
||||
Musicians can easily share recordings of their online performances with family, friends, and family.
|
||||
</li>
|
||||
<li>
|
||||
Musicians can open recordings and play along with the recorded tracks, effectively playing with their bandmates or musical collaborators even when those musicians are unavailable. This allows for a variety of practice, experimentation, and creativity difficult to achieve today.
|
||||
</li>
|
||||
<li>
|
||||
Musicians can create recordings comparable in quality to what can be achieved in a home studio, without even being in the same place, and can do so in real-time rather than recording, uploading and mixing tracks asynchronously as happens today. These mastered tracks can be exported into popular DAW software applications for further editing.
|
||||
</li>
|
||||
</ul>
|
||||
</p>
|
||||
|
||||
<br/>
|
||||
|
||||
<h2>FEATURE: Session Broadcasts</h2><br/>
|
||||
<p>
|
||||
In addition to recording sessions, musicians can live broadcast their sessions so that family, friends and fans can tune in and listen to these live performances from any location using a computer, tablet or smartphone. Like recordings, live sessions can easily be shared via Facebook, Twitter, or email.
|
||||
</p>
|
||||
|
||||
<h2>BENEFITS:</h2>
|
||||
<p>
|
||||
<ul>
|
||||
<li>
|
||||
Today sessions are effectively private, held in musicians’ homes and open only to the musicians themselves. With JamKazam, musicians can open practice sessions up to others. For example, they can have other musician friends listen in to provide suggestions and constructive criticisms on the musical performances. Or they can allow fans into the “inner circle” to reward and bind super fans closer to the group, providing a level of access that has been impossible.
|
||||
</li>
|
||||
<li>
|
||||
With JamKazam, bands and musicians can also effectively use JamKazam to live broadcast more polished concert performances, with very high quality performance audio streamed live to fans’ computers, tablets, and smartphones, either with the band members in different locations, or with the band playing together in one location.
|
||||
</li>
|
||||
</ul>
|
||||
</p>
|
||||
|
||||
<br/>
|
||||
|
||||
<h2>FEATURE: Social Networking</h2><br/>
|
||||
<p>
|
||||
Finally, musicians can use JamKazam to find other musicians in their area, check out their skills, styles, and listen to their performances, and connect to play together online and/or offline.
|
||||
</p>
|
||||
|
||||
<h2>BENEFITS:</h2>
|
||||
<p>
|
||||
Everyone who plays music knows that it’s far more fun to play with others than to play alone. But many musicians – especially amateur musicians – are not in bands and don’t have established networks of musician friends to play with, simply because of the time and logistical challenges of playing with others, as described earlier. With JamKazam, musicians can easily find other musicians in their area who want to play together online, and who have complementary instruments, skill levels, and musical interests. And they can easily try playing with others without the risk or investment of time to meet in person.
|
||||
</p>
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
<% provide(:title, 'Logos') %>
|
||||
<% provide(:purpose, 'media_center') %>
|
||||
|
||||
<h1>Logos</h1>
|
||||
|
||||
<p>Following are links to view and download JamKazam logo image files:</p>
|
||||
|
||||
<ul class="no-style">
|
||||
<li><a href="http://i1356.photobucket.com/albums/q730/jamkazam/JK_Logo_2c_zpse9c6687e.png" target="_blank">Two Color Logo</a></li>
|
||||
<li><a href="http://i1356.photobucket.com/albums/q730/jamkazam/JK_Logo_White_zps440c30b9.png" target="_blank">White Logo</a></li>
|
||||
<li><a href="http://i1356.photobucket.com/albums/q730/jamkazam/JK_Logo_Black_zpsa2eeffbe.png" target="_blank">Black Logo</a></li>
|
||||
</ul>
|
||||
|
|
@ -4,7 +4,7 @@
|
|||
<h1>Media Center</h1>
|
||||
<br/>
|
||||
<br/>
|
||||
<table class="w90 media_center">
|
||||
<table class="w100 media_center">
|
||||
<tbody>
|
||||
<tr>
|
||||
<td valign="top" width="33%">
|
||||
|
|
@ -16,39 +16,38 @@
|
|||
<br clear="all"><br>
|
||||
|
||||
<ul class="media_links">
|
||||
<li><a href='#'>Overview</a></li>
|
||||
<li><a href='#'>Benefits</a></li>
|
||||
<li><a href='#'>Features</a></li>
|
||||
<li><a href='#'>Screenshots</a></li>
|
||||
<li><a href='#'>Photos</a></li>
|
||||
<li><a href='/corp/overview'>Overview</a></li>
|
||||
<li><a href='/corp/features'>Feature & Benefits</a></li>
|
||||
<li><a href='/corp/faqs'>Frequently Asked Questions</a></li>
|
||||
<li><a href='/corp/screenshots'>Screenshots</a></li>
|
||||
<li><a href='/corp/photos'>Photos</a></li>
|
||||
<li><a href='/corp/logos'>Logos</a></li>
|
||||
</ul>
|
||||
</td>
|
||||
|
||||
<td valign="top">
|
||||
<td valign="top" width="33%">
|
||||
<div class="left mr20"><%= image_tag("content/icon_users.png", height: '58', width: '58') %></div>
|
||||
<br>
|
||||
|
||||
<h2>User Content</h2>
|
||||
<br clear="all"><br>
|
||||
<br clear="all"><br/>
|
||||
|
||||
<ul class="media_links">
|
||||
<li><a href='/corp/testimonials'>User Testimonials</a></li>
|
||||
<li><a href='#'>Barton Strings</a></li>
|
||||
<li><a href='#'>LC Rocks</a></li>
|
||||
<li><a href='#'>Jazz Quartet</a></li>
|
||||
<li><a href='/corp/audio'>Audio Recordings</a></li>
|
||||
<li><a href='/corp/videos'>Videos</a></li>
|
||||
</ul>
|
||||
</td>
|
||||
<td valign="top">
|
||||
<td valign="top" width="33%">
|
||||
<div class="left mr20"><%= image_tag("content/icon_pr.png", height: '58', width: '58') %></div>
|
||||
<br>
|
||||
|
||||
<h2>Press Releases</h2>
|
||||
<br clear="all"><br>
|
||||
|
||||
<br clear="all"><br/>
|
||||
<ul class="media_links">
|
||||
<li><%= link_to "Press Release #1", corp_media_center_path %></li>
|
||||
<li><%= link_to "Press Release #2", corp_media_center_path %></li>
|
||||
<li><%= link_to "Press Release #3", corp_media_center_path %></li>
|
||||
<li>
|
||||
<span class="press-date">March 12, 2014</span><a href="/press-releases/launch">JamKazam Lets Musicians Play Together from Different Locations</a> - Six Bands at SXSW to Use JamKazam to Perform in “Virtual Jam Fest”
|
||||
</li>
|
||||
</ul>
|
||||
</td>
|
||||
</tr>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,10 @@
|
|||
<% provide(:title, 'Overview') %>
|
||||
<% provide(:purpose, 'media_center') %>
|
||||
|
||||
<h1>Overview</h1>
|
||||
|
||||
<p>
|
||||
JamKazam develops an innovative live music platform and social network for musicians. The company’s Internet service enables musicians to play music together in real time from different locations over the Internet as if they are sitting in the same room. The service is currently available to musicians and music fans as a free public beta. JamKazam is a private company headquartered in Austin, Texas.
|
||||
<br/><br/>
|
||||
For a great introduction to the service, please watch the <a href="http://www.youtube.com/watch?v=ylYcvTY9CVo" target="_blank">JamKazam Overview video</a>.
|
||||
</p>
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
<% provide(:title, 'Photos') %>
|
||||
<% provide(:purpose, 'media_center') %>
|
||||
|
||||
<h1>Photos</h1>
|
||||
|
||||
<p>JamKazam has no photos to share at this time.</p>
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
<% provide(:title, 'Screenshots') %>
|
||||
<% provide(:purpose, 'media_center') %>
|
||||
|
||||
<h1>Screenshots</h1>
|
||||
|
||||
<p>Following are links to view and download JamKazam product screenshots:</p>
|
||||
|
||||
<ul class="no-style">
|
||||
<li><a href="http://i1356.photobucket.com/albums/q730/jamkazam/JamKazamHomeLandingPage_zps632631fa.png" target="_blank">Website Landing Page</a></li>
|
||||
<li><a href="http://i1356.photobucket.com/albums/q730/jamkazam/JamKazamMusiciansPage_zpsdf5d0e07.png" target="_blank">Website Musicians Page</a></li>
|
||||
<li><a href="http://i1356.photobucket.com/albums/q730/jamkazam/JamKazamBandsPage_zps194c9536.png" target="_blank">Website Bands Page</a></li>
|
||||
</ul>
|
||||
|
||||
<ul class="no-style">
|
||||
<li><a href="http://i1356.photobucket.com/albums/q730/jamkazam/JamKazamAppHomePage_zps4f416fd1.png" target="_blank">App Home Page</a></li>
|
||||
<li><a href="http://i1356.photobucket.com/albums/q730/jamkazam/JamKazamAppCreateSessionPage_zpsa37427fe.png" target="_blank">App Create Session Page</a></li>
|
||||
<li><a href="http://" target="_blank">App Find Session Page</a></li>
|
||||
<li><a href="http://i1356.photobucket.com/albums/q730/jamkazam/JamKazamAppInSessionPage_zpsb454c4d3.png" target="_blank">App In Session Page</a></li>
|
||||
</ul>
|
||||
|
|
@ -1,60 +1,73 @@
|
|||
<% provide(:title, 'Testimonials') %>
|
||||
<% provide(:purpose, 'Testimonials') %>
|
||||
<% provide(:purpose, 'media_center') %>
|
||||
|
||||
<h1>Testimonials</h1>
|
||||
|
||||
<p><h2>JULIE BONK</h2></p>
|
||||
<div class="test-user-desc">Julie is a well-respected and oft-recorded pianist and teacher in jazz and blues improvisation, composition, and theory, and has mentored students including Grammy winner Norah Jones.</div><br/>
|
||||
<ul>
|
||||
<li>I've been hoping and waiting for something like this for a long time. It's amazing!</li>
|
||||
<li>I use Skype to give music lessons, but it won't work for rehearsals, and this will really help with preparation.</li>
|
||||
<li>I'll be using this every week.</li>
|
||||
</ul>
|
||||
<p>
|
||||
<span class="testimonial-user-desc">Julie is a well-respected and oft-recorded pianist and teacher in jazz and blues improvisation, composition, and theory, and has mentored students including Grammy winner Norah Jones.</span><br/>
|
||||
<ul class="no-style">
|
||||
<li>I've been hoping and waiting for something like this for a long time. It's amazing!</li>
|
||||
<li>I use Skype to give music lessons, but it won't work for rehearsals, and this will really help with preparation.</li>
|
||||
<li>I'll be using this every week.</li>
|
||||
</ul>
|
||||
</p>
|
||||
|
||||
<br/>
|
||||
|
||||
<p><h2>JUSTIN PIERCE</h2></p>
|
||||
<div class="test-user-desc">Justin holds a master's degree in jazz studies, performs regularly with bands in Texas, and has played with John Clayton, The Temptations, Wayne Newton, and others.</div><br/>
|
||||
<ul>
|
||||
<li>The sound quality is exceptional. It reminds me of recording in a studio.</li>
|
||||
<li>The service met and exceeded my expectations, and I'm excited for its future.</li>
|
||||
<li>The sound quality is significantly better than Skype for giving remote lessons.</li>
|
||||
</ul>
|
||||
<p>
|
||||
<div class="testimonial-user-desc">Justin holds a master's degree in jazz studies, performs regularly with bands in Texas, and has played with John Clayton, The Temptations, Wayne Newton, and others.</div><br/>
|
||||
<ul class="no-style">
|
||||
<li>The sound quality is exceptional. It reminds me of recording in a studio.</li>
|
||||
<li>The service met and exceeded my expectations, and I'm excited for its future.</li>
|
||||
<li>The sound quality is significantly better than Skype for giving remote lessons.</li>
|
||||
</ul>
|
||||
</p>
|
||||
|
||||
<br/>
|
||||
|
||||
<p><h2>CHRIS BENNETT</h2></p>
|
||||
<div class="test-user-desc">Chris has decades of musical experience in touring bands, has been published in Classic Drummer and Not So Modern Drummer, started Bopworks Drumsticks, and teaches at the Austin School of Music.</div><br/>
|
||||
<ul>
|
||||
<li>Far from being futuristically cold and isolating, playing was way easier than a studio.</li>
|
||||
<li>Given the fact that I had never met, seen, or played with any of the musicians I played with using JamKazam, the experience was great.</li>
|
||||
</ul>
|
||||
<p>
|
||||
<div class="testimonial-user-desc">Chris has decades of musical experience in touring bands, has been published in Classic Drummer and Not So Modern Drummer, started Bopworks Drumsticks, and teaches at the Austin School of Music.</div><br/>
|
||||
<ul class="no-style">
|
||||
<li>Far from being futuristically cold and isolating, playing was way easier than a studio.</li>
|
||||
<li>Given the fact that I had never met, seen, or played with any of the musicians I played with using JamKazam, the experience was great.</li>
|
||||
</ul>
|
||||
</p>
|
||||
|
||||
<br/>
|
||||
|
||||
<p><h2>SARA NELSON</h2></p>
|
||||
<div class="test-user-desc">Sara holds a bachelor's degree in music, performs as a cellist for the Austin Lyric Opera, and has also played with the Austin Symphony Orchestra and bands such as David Byrne and Bob Schneider.</div><br/>
|
||||
<ul>
|
||||
<li>JamKazam is a great tool for musicians who want to rehearse without the hassle of finding a common location to meet.</li>
|
||||
<li>Being able to play with people in different cities is very exciting!</li>
|
||||
</ul>
|
||||
<p>
|
||||
<div class="testimonial-user-desc">Sara holds a bachelor's degree in music, performs as a cellist for the Austin Lyric Opera, and has also played with the Austin Symphony Orchestra and bands such as David Byrne and Bob Schneider.</div><br/>
|
||||
<ul class="no-style">
|
||||
<li>JamKazam is a great tool for musicians who want to rehearse without the hassle of finding a common location to meet.</li>
|
||||
<li>Being able to play with people in different cities is very exciting!</li>
|
||||
</ul>
|
||||
</p>
|
||||
|
||||
<br/>
|
||||
|
||||
<p><h2>GEORGE PRADO</h2></p>
|
||||
<div class="test-user-desc">George spent 15 years in LA performing and recording with numerous industry greats including Eartha Kitt and Chuck Berry, founded the legendary Regency Jazz Band, and has played and taught 40+ years.</div><br/>
|
||||
<ul>
|
||||
<li>An exciting tool with great sound and fidelity, this has unlimited potential for musicians and others in the entertainment industry, not to mention its use for educators. Check it out!</li>
|
||||
<li>Working for over 50 years as a professional musician, I am excited about this new method of sharing musical ideas. It allows me to connect with friends far away and close by through the means of this technology.</li>
|
||||
</ul>
|
||||
<p>
|
||||
<div class="testimonial-user-desc">George spent 15 years in LA performing and recording with numerous industry greats including Eartha Kitt and Chuck Berry, founded the legendary Regency Jazz Band, and has played and taught 40+ years.</div><br/>
|
||||
<ul class="no-style">
|
||||
<li>An exciting tool with great sound and fidelity, this has unlimited potential for musicians and others in the entertainment industry, not to mention its use for educators. Check it out!</li>
|
||||
<li>Working for over 50 years as a professional musician, I am excited about this new method of sharing musical ideas. It allows me to connect with friends far away and close by through the means of this technology.</li>
|
||||
</ul>
|
||||
</p>
|
||||
|
||||
<br/>
|
||||
|
||||
<p><h2>CHRIS MAX</h2></p>
|
||||
<div class="test-user-desc">Chris is the lead guitar player and backing vocalist for LC Rocks, which has been playing top Austin clubs since 2002, and also frequently plays solo gigs throughout Central Texas.</div><br/>
|
||||
<ul>
|
||||
<li>JamKazam, now here's a concept whose time has come!</li>
|
||||
<li>No loading gear, driving, or rehearsal room rental fees. Just plug into your home computer, interface with your bandmates, and start getting ready for your upcoming shows.</li>
|
||||
</ul>
|
||||
<p>
|
||||
<div class="testimonial-user-desc">Chris is the lead guitar player and backing vocalist for LC Rocks, which has been playing top Austin clubs since 2002, and also frequently plays solo gigs throughout Central Texas.</div><br/>
|
||||
<ul class="no-style">
|
||||
<li>JamKazam, now here's a concept whose time has come!</li>
|
||||
<li>No loading gear, driving, or rehearsal room rental fees. Just plug into your home computer, interface with your bandmates, and start getting ready for your upcoming shows.</li>
|
||||
</ul>
|
||||
</p>
|
||||
|
||||
</body></html>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
<% provide(:title, 'Videos') %>
|
||||
<% provide(:purpose, 'media_center') %>
|
||||
|
||||
<h1>Videos</h1>
|
||||
|
||||
<p>
|
||||
For a great introduction to the service, please watch the <a href="http://www.youtube.com/watch?v=ylYcvTY9CVo" target="_blank">JamKazam Overview video</a>.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
These three videos show three different groups playing together using the JamKazam service for the first time:
|
||||
<ul>
|
||||
<li>
|
||||
<a href="http://www.youtube.com/watch?v=Q-hnNYp7Gs8" target="_blank">Barton Strings</a> – This string quartet played the Pachelbel “Canon in D” from four homes across the Austin, Texas metropolitan area.
|
||||
</li>
|
||||
<li>
|
||||
<a href="http://www.youtube.com/watch?v=G4SSNHkGcfg" target="_blank">LC Rocks</a> – This rock cover band played Poison’s “Nothin’ But a Good Time” from four homes across the Austin, Texas metropolitan area.
|
||||
</li>
|
||||
<li>
|
||||
<a href="http://www.youtube.com/watch?v=-_udfQbB9hQ" target="_blank">Jazz Quartet</a> – This group of jazz musicians did not know each other and had never played together at all. They played John Coltrane’s “Equinox” from homes in Denton, Lewisville, Austin, and San Antonio, Texas.
|
||||
</li>
|
||||
</ul>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Also, several <a href="https://jamkazam.desk.com/customer/portal/articles/1304097-tutorial-videos" target="_blank">Tutorial Videos</a> are available to see how various features work in more detail.
|
||||
</p>
|
||||
|
|
@ -1,19 +1,19 @@
|
|||
%hr{ class:'w60' }
|
||||
.landing-band
|
||||
.landing-band.event
|
||||
= event_session_img(event_session)
|
||||
%br
|
||||
%br
|
||||
%span= event_session_title(event_session)
|
||||
|
||||
.landing-details
|
||||
.left.f20.teal
|
||||
.landing-details.event
|
||||
.left.f20.teal.time
|
||||
%strong
|
||||
= event_session_start_hour(event_session)
|
||||
.right
|
||||
= event_session_button(event_session)
|
||||
%br{ clear:'all' }
|
||||
%br
|
||||
.left
|
||||
|
||||
.left.bio
|
||||
= event_session_description(event_session)
|
||||
%br
|
||||
%br
|
||||
|
|
@ -16,8 +16,9 @@
|
|||
%br
|
||||
%br
|
||||
%div{align:'center'}
|
||||
%span SPONSORED BY:
|
||||
= image_tag 'content/logo_centurylink.png', width:320, height:80, class:'play-icon', alt:'CenturyLink logo'
|
||||
- if @event.show_sponser?
|
||||
%span SPONSORED BY:
|
||||
= image_tag 'content/logo_centurylink.png', width:320, height:80, class:'play-icon', alt:'CenturyLink logo'
|
||||
%br
|
||||
%br
|
||||
%br
|
||||
|
|
|
|||
|
|
@ -87,14 +87,40 @@ SampleApp::Application.routes.draw do
|
|||
end
|
||||
|
||||
scope '/corp' do
|
||||
# about routes
|
||||
match '/about', to: 'corps#about', as: 'corp_about'
|
||||
match '/contact', to: 'corps#contact', as: 'corp_contact'
|
||||
match '/help', to: 'corps#help', as: 'corp_help'
|
||||
|
||||
# news routes
|
||||
match '/news', to: 'corps#news', as: 'corp_news'
|
||||
|
||||
# media center routes
|
||||
match '/media_center', to: 'corps#media_center', as: 'corp_media_center'
|
||||
match '/overview', to: 'corps#overview', as: 'corp_overview'
|
||||
match '/features', to: 'corps#features', as: 'corp_features'
|
||||
match '/faqs', to: 'corps#faqs', as: 'corp_faqs'
|
||||
match '/screenshots', to: 'corps#screenshots', as: 'corp_screenshots'
|
||||
match '/photos', to: 'corps#photos', as: 'corp_photos'
|
||||
match '/logos', to: 'corps#logos', as: 'corp_logos'
|
||||
|
||||
match '/testimonials', to: 'corps#testimonials', as: 'corp_testimonials'
|
||||
match '/news', to: 'corps#news', as: 'corp_news'
|
||||
match '/audio', to: 'corps#audio', as: 'corp_audio'
|
||||
match '/videos', to: 'corps#videos', as: 'corp_videos'
|
||||
|
||||
# TODO: make this more dynamic and managed via admin
|
||||
match '/press-releases/launch', to: 'corps#press_releases_launch', as: 'corp_press_releases_launch'
|
||||
|
||||
# contact routes
|
||||
match '/contact', to: 'corps#contact', as: 'corp_contact'
|
||||
|
||||
# privacy routes
|
||||
match '/privacy', to: 'corps#privacy', as: 'corp_privacy'
|
||||
|
||||
# terms routes
|
||||
match '/terms', to: 'corps#terms', as: 'corp_terms'
|
||||
|
||||
# help routes
|
||||
match '/help', to: 'corps#help', as: 'corp_help'
|
||||
|
||||
match '/cookies_policy',to: 'corps#cookie_policy', as: 'corp_cookie_policy'
|
||||
match '/premium_accounts',to: 'corps#premium_accounts', as: 'corp_premium_accounts'
|
||||
end
|
||||
|
|
|
|||
|
|
@ -24,6 +24,15 @@ namespace :db do
|
|||
JamIsp.import_from_max_mind ENV['file']
|
||||
end
|
||||
|
||||
desc "Help"
|
||||
task help: :environment do
|
||||
puts "bundle exec rake db:import_maxmind_isp file=/path/to/GeoIPISP-142.csv"
|
||||
puts "bundle exec rake db:import_maxmind_geo file=/path/to/GeoIPCity.csv"
|
||||
puts "bundle exec rake db:import_geoip_blocks file=/path/to/GeoIPCity-134-Blocks.csv"
|
||||
puts "bundle exec rake db:import_geoip_locations file=/path/to/GeoIPCity-134-Location.csv"
|
||||
puts "bundle exec rake db:import_jam_isp file=/path/to/GeoIPISP.csv"
|
||||
end
|
||||
|
||||
desc "Create a fake set of maxmind data"
|
||||
task phony_maxmind: :environment do
|
||||
MaxMindManager.active_record_transaction do |manager|
|
||||
|
|
|
|||
Loading…
Reference in New Issue