Merge branch 'master' of github.com:ClickHouse/ClickHouse

This commit is contained in:
Sergei Shtykov 2020-02-14 16:52:29 +03:00
commit adc8cf5f54
17 changed files with 222 additions and 208 deletions

1
.gitignore vendored
View File

@ -15,6 +15,7 @@
/docs/build
/docs/publish
/docs/edit
/docs/website
/docs/tools/venv/
/docs/en/single.md
/docs/ru/single.md

View File

@ -1,15 +1,15 @@
[![ClickHouse — open source distributed column-oriented DBMS](https://github.com/ClickHouse/ClickHouse/raw/master/website/images/logo-400x240.png)](https://clickhouse.yandex)
[![ClickHouse — open source distributed column-oriented DBMS](https://github.com/ClickHouse/ClickHouse/raw/master/website/images/logo-400x240.png)](https://clickhouse.tech)
ClickHouse is an open-source column-oriented database management system that allows generating analytical data reports in real time.
## Useful Links
* [Official website](https://clickhouse.yandex/) has quick high-level overview of ClickHouse on main page.
* [Tutorial](https://clickhouse.yandex/tutorial.html) shows how to set up and query small ClickHouse cluster.
* [Documentation](https://clickhouse.yandex/docs/en/) provides more in-depth information.
* [Official website](https://clickhouse.tech/) has quick high-level overview of ClickHouse on main page.
* [Tutorial](https://clickhouse.tech/docs/en/getting_started/tutorial/) shows how to set up and query small ClickHouse cluster.
* [Documentation](https://clickhouse.tech/docs/en/) provides more in-depth information.
* [YouTube channel](https://www.youtube.com/c/ClickHouseDB) has a lot of content about ClickHouse in video format.
* [Blog](https://clickhouse.yandex/blog/en/) contains various ClickHouse-related articles, as well as announces and reports about events.
* [Contacts](https://clickhouse.yandex/#contacts) can help to get your questions answered if there are any.
* [Contacts](https://clickhouse.tech/#contacts) can help to get your questions answered if there are any.
* You can also [fill this form](https://forms.yandex.com/surveys/meet-yandex-clickhouse-team/) to meet Yandex ClickHouse team in person.
## Upcoming Events

View File

@ -0,0 +1,65 @@
<test>
<type>once</type>
<stop_conditions>
<all_of>
<total_time_ms>30000</total_time_ms>
</all_of>
</stop_conditions>
<settings>
<max_threads>1</max_threads>
</settings>
<substitutions>
<substitution>
<name>aggregationscale</name>
<values>
<value>11111111</value>
<value>11111</value>
</values>
</substitution>
</substitutions>
<create_query>
create table mingroupby_orderbylimit1_{aggregationscale}_tuple
Engine=MergeTree order by tuple() AS
select toUInt64( number % {aggregationscale} ) key, toUInt64(1) value
from numbers(10000000);
</create_query>
<create_query>
create table mingroupby_orderbylimit1_{aggregationscale}_key_value
Engine=MergeTree order by (key,value) AS
select toUInt64( number % {aggregationscale} ) key, toUInt64(1) value
from numbers(10000000);
</create_query>
<query tag='UsingGroupbyMinTuple'>
SELECT key, min(value)
FROM mingroupby_orderbylimit1_{aggregationscale}_tuple
group by key format Null;
</query>
<query tag='UsingGroupbyMinKV'>
SELECT key, min(value)
FROM mingroupby_orderbylimit1_{aggregationscale}_key_value
group by key format Null;
</query>
<query tag='UsingOrderbyLimit1Tuple'>
SELECT key, value
FROM mingroupby_orderbylimit1_{aggregationscale}_tuple
order by key, value limit 1 by key format Null;
</query>
<query tag='UsingOrderbyLimit1KV'>
SELECT key, value
FROM mingroupby_orderbylimit1_{aggregationscale}_key_value
order by key, value limit 1 by key format Null;
</query>
<drop_query> DROP TABLE IF EXISTS mingroupby_orderbylimit1_{aggregationscale}_tuple </drop_query>
<drop_query> DROP TABLE IF EXISTS mingroupby_orderbylimit1_{aggregationscale}_key_value </drop_query>
</test>

View File

@ -18,6 +18,7 @@ RUN apt-get update \
python3 \
python3-dev \
python3-pip \
rsync \
tree \
tzdata \
vim \

View File

@ -45,7 +45,10 @@ function configure
sed -i 's/<tcp_port>9000/<tcp_port>9001/g' left/config/config.xml
sed -i 's/<tcp_port>9000/<tcp_port>9002/g' right/config/config.xml
cat > right/config/config.d/zz-perf-test-tweaks.xml <<EOF
mkdir right/config/users.d ||:
mkdir left/config/users.d ||:
cat > right/config/config.d/zz-perf-test-tweaks-config.xml <<EOF
<yandex>
<logger>
<console>true</console>
@ -59,7 +62,20 @@ function configure
</yandex>
EOF
cp right/config/config.d/zz-perf-test-tweaks.xml left/config/config.d/zz-perf-test-tweaks.xml
cat > right/config/users.d/zz-perf-test-tweaks-users.xml <<EOF
<yandex>
<profiles>
<default>
<query_profiler_real_time_period_ns>10000000</query_profiler_real_time_period_ns>
<query_profiler_cpu_time_period_ns>0</query_profiler_cpu_time_period_ns>
<allow_introspection_functions>1</allow_introspection_functions>
</default>
</profiles>
</yandex>
EOF
cp right/config/config.d/zz-perf-test-tweaks-config.xml left/config/config.d/zz-perf-test-tweaks-config.xml
cp right/config/users.d/zz-perf-test-tweaks-users.xml left/config/users.d/zz-perf-test-tweaks-users.xml
rm left/config/config.d/metric_log.xml ||:
rm left/config/config.d/text_log.xml ||:
@ -81,6 +97,13 @@ EOF
left/clickhouse client --port 9001 --query "create database test" ||:
left/clickhouse client --port 9001 --query "rename table datasets.hits_v1 to test.hits" ||:
while killall clickhouse ; do echo . ; sleep 1 ; done
echo all killed
# Remove logs etc, because they will be updated, and sharing them between
# servers with hardlink might cause unpredictable behavior.
rm db0/data/system/* -rf ||:
}
function restart
@ -125,11 +148,36 @@ function run_tests
rm -v test-times.tsv ||:
# Why the ugly cut:
# 1) can't make --out-format='%n' work for deleted files, it outputs things
# like "deleted 1.xml";
# 2) the output is not tab separated, but at least it's fixed width, so I
# cut by characters.
changed_files=$(rsync --dry-run --dirs --checksum --delete --itemize-changes left/performance/ right/performance/ | cut -c13-)
# FIXME remove some broken long tests
rm right/performance/{IPv4,IPv6,modulo,parse_engine_file,number_formatting_formats,select_format}.xml ||:
test_files=$(ls right/performance/*)
# FIXME a quick crutch to bring the run time down for the flappy tests --
# run only those that have changed. Only on my prs for now.
if grep Kuzmenkov right-commit.txt
then
if [ "PR_TO_TEST" != "0" ]
then
test_files=$(cd right/performance && readlink -e $changed_files)
fi
fi
# Run only explicitly specified tests, if any
if [ -v CHPC_TEST_GLOB ]
then
test_files=$(ls right/performance/${CHPC_TEST_GLOB}.xml)
fi
# Run the tests
for test in right/performance/${CHPC_TEST_GLOB:-*}.xml
for test in $test_files
do
test_name=$(basename $test ".xml")
echo test $test_name
@ -138,8 +186,19 @@ function run_tests
{ time "$script_dir/perf.py" "$test" > "$test_name-raw.tsv" 2> "$test_name-err.log" ; } 2>&1 >/dev/null | grep -v ^+ >> "wall-clock-times.tsv" || continue
grep ^query "$test_name-raw.tsv" | cut -f2- > "$test_name-queries.tsv"
grep ^client-time "$test_name-raw.tsv" | cut -f2- > "$test_name-client-time.tsv"
right/clickhouse local --file "$test_name-queries.tsv" --structure 'query text, run int, version UInt32, time float' --query "$(cat $script_dir/eqmed.sql)" > "$test_name-report.tsv"
# this may be slow, run it in background
right/clickhouse local --file "$test_name-queries.tsv" --structure 'query text, run int, version UInt32, time float' --query "$(cat $script_dir/eqmed.sql)" > "$test_name-report.tsv" &
done
wait
# Collect the profiles
left/clickhouse client --port 9001 --query "select * from system.trace_log format TSVWithNamesAndTypes" > left-trace-log.tsv ||: &
left/clickhouse client --port 9001 --query "select arrayJoin(trace) addr, concat(splitByChar('/', addressToLine(addr))[-1], '#', demangle(addressToSymbol(addr)) ) name from system.trace_log group by addr format TSVWithNamesAndTypes" > left-addresses.tsv ||: &
right/clickhouse client --port 9002 --query "select * from system.trace_log format TSVWithNamesAndTypes" > right-trace-log.tsv ||: &
right/clickhouse client --port 9002 --query "select arrayJoin(trace) addr, concat(splitByChar('/', addressToLine(addr))[-1], '#', demangle(addressToSymbol(addr)) ) name from system.trace_log group by addr format TSVWithNamesAndTypes" > right-addresses.tsv ||: &
wait
}
# Analyze results
@ -156,7 +215,7 @@ create table queries engine Memory as select
-- remove them altogether because we want to be able to detect regressions,
-- but the right way to do this is not yet clear.
not short and abs(diff) < 0.05 and rd[3] > 0.05 as unstable,
not short and abs(diff) > 0.05 and abs(diff) > rd[3] as changed,
not short and abs(diff) > 0.10 and abs(diff) > rd[3] as changed,
*
from file('*-report.tsv', TSV, 'left float, right float, diff float, rd Array(float), query text');
@ -201,7 +260,7 @@ create table test_times_tsv engine File(TSV, 'test-times.tsv') as
floor(real / queries, 3) avg_real_per_query,
floor(query_min, 3)
from test_time join wall_clock using test
order by query_max / query_min desc;
order by avg_real_per_query desc;
create table all_queries_tsv engine File(TSV, 'all-queries.tsv') as
select left, right, diff, rd, test, query

View File

@ -8,7 +8,7 @@ select
query
from
(
select query, quantiles(0.05, 0.5, 0.95)(abs(time_by_label[1] - time_by_label[2])) rd_quantiles -- quantiles of randomization distribution
select query, quantiles(0.05, 0.5, 0.95, 0.99)(abs(time_by_label[1] - time_by_label[2])) rd_quantiles -- quantiles of randomization distribution
from
(
select query, virtual_run, groupArrayInsertAt(median_time, random_label) time_by_label -- make array 'random label' -> 'median time'

View File

@ -10,6 +10,15 @@ import pprint
import time
import traceback
stage_start_seconds = time.perf_counter()
def report_stage_end(stage_name):
global stage_start_seconds
print('{}\t{}'.format(stage_name, time.perf_counter() - stage_start_seconds))
stage_start_seconds = time.perf_counter()
report_stage_end('start')
parser = argparse.ArgumentParser(description='Run performance test.')
# Explicitly decode files as UTF-8 because sometimes we have Russian characters in queries, and LANG=C is set.
parser.add_argument('file', metavar='FILE', type=argparse.FileType('r', encoding='utf-8'), nargs=1, help='test description file')
@ -35,6 +44,8 @@ if infinite_sign is not None:
servers = [{'host': host, 'port': port} for (host, port) in zip(args.host, args.port)]
connections = [clickhouse_driver.Client(**server) for server in servers]
report_stage_end('connect')
# Check tables that should exist
tables = [e.text for e in root.findall('preconditions/table_exists')]
for t in tables:
@ -47,6 +58,8 @@ for c in connections:
for s in settings:
c.execute("set {} = '{}'".format(s.tag, s.text))
report_stage_end('preconditions')
# Process substitutions
subst_elems = root.findall('substitutions/substitution')
@ -61,6 +74,8 @@ parameter_combinations = [dict(zip(parameter_keys, parameter_combination)) for p
def substitute_parameters(query_templates, parameter_combinations):
return list(set([template.format(**parameters) for template, parameters in itertools.product(query_templates, parameter_combinations)]))
report_stage_end('substitute')
# Run drop queries, ignoring errors
drop_query_templates = [q.text for q in root.findall('drop_query')]
drop_queries = substitute_parameters(drop_query_templates, parameter_combinations)
@ -86,6 +101,8 @@ for c in connections:
for q in fill_queries:
c.execute(q)
report_stage_end('fill')
# Run test queries
def tsv_escape(s):
return s.replace('\\', '\\\\').replace('\t', '\\t').replace('\n', '\\n').replace('\r','')
@ -93,6 +110,8 @@ def tsv_escape(s):
test_query_templates = [q.text for q in root.findall('query')]
test_queries = substitute_parameters(test_query_templates, parameter_combinations)
report_stage_end('substitute2')
for q in test_queries:
# Prewarm: run once on both servers. Helps to bring the data into memory,
# precompile the queries, etc.
@ -115,9 +134,13 @@ for q in test_queries:
client_seconds = time.perf_counter() - start_seconds
print('client-time\t{}\t{}\t{}'.format(tsv_escape(q), client_seconds, server_seconds))
report_stage_end('benchmark')
# Run drop queries
drop_query_templates = [q.text for q in root.findall('drop_query')]
drop_queries = substitute_parameters(drop_query_templates, parameter_combinations)
for c in connections:
for q in drop_queries:
c.execute(q)
report_stage_end('drop')

View File

@ -294,6 +294,7 @@ if __name__ == '__main__':
arg_parser.add_argument('--skip-single-page', action='store_true')
arg_parser.add_argument('--skip-pdf', action='store_true')
arg_parser.add_argument('--skip-website', action='store_true')
arg_parser.add_argument('--minify', action='store_true')
arg_parser.add_argument('--save-raw-single-page', type=str)
arg_parser.add_argument('--verbose', action='store_true')

View File

@ -1,78 +1,9 @@
@font-face {
font-family: 'Yandex Sans Text Web';
src: url(https://yastatic.net/adv-www/_/yy5JveR58JFkc97waf-xp0i6_jM.eot);
src: url(https://yastatic.net/adv-www/_/yy5JveR58JFkc97waf-xp0i6_jM.eot?#iefix) format('embedded-opentype'),
url(https://yastatic.net/adv-www/_/CYblzLEXzCqQIvrYs7QKQe2omRk.woff2) format('woff2'),
url(https://yastatic.net/adv-www/_/pUcnOdRwl83MvPPzrNomhyletnA.woff) format('woff'),
url(https://yastatic.net/adv-www/_/vNFEmXOcGYKJ4AAidUprHWoXrLU.ttf) format('truetype'),
url(https://yastatic.net/adv-www/_/0w7OcWZM_QLP8x-LQUXFOgXO6dE.svg#YandexSansTextWeb-Bold) format('svg');
font-weight: 700;
font-style: normal;
font-stretch: normal
}
@font-face {
font-family: 'Yandex Sans Text Web';
src: url(https://yastatic.net/adv-www/_/LI6l3L2RqcgxBe2pXmuUha37czQ.eot);
src: url(https://yastatic.net/adv-www/_/LI6l3L2RqcgxBe2pXmuUha37czQ.eot?#iefix) format('embedded-opentype'),
url(https://yastatic.net/adv-www/_/z3MYElcut0R2MF_Iw1RDNrstgYs.woff2) format('woff2'),
url(https://yastatic.net/adv-www/_/1jvKJ_-hCXl3s7gmFl-y_-UHTaI.woff) format('woff'),
url(https://yastatic.net/adv-www/_/9nzjfpCR2QHvK1EzHpDEIoVFGuY.ttf) format('truetype'),
url(https://yastatic.net/adv-www/_/gwyBTpxSwkFCF1looxqs6JokKls.svg#YandexSansTextWeb-Regular) format('svg');
font-weight: 400;
font-style: normal;
font-stretch: normal
}
@font-face {
font-family: 'Yandex Sans Text Web';
src: url(https://yastatic.net/adv-www/_/ayAFYoY8swgBLhq_I56tKj2JftU.eot);
src: url(https://yastatic.net/adv-www/_/ayAFYoY8swgBLhq_I56tKj2JftU.eot?#iefix) format('embedded-opentype'),
url(https://yastatic.net/adv-www/_/lGQcYklLVV0hyvz1HFmFsUTj8_0.woff2) format('woff2'),
url(https://yastatic.net/adv-www/_/f0AAJ9GJ4iiwEmhG-7PWMHk6vUY.woff) format('woff'),
url(https://yastatic.net/adv-www/_/4UDe4nlVvgEJ-VmLWNVq3SxCsA.ttf) format('truetype'),
url(https://yastatic.net/adv-www/_/EKLr1STNokPqxLAQa_RyN82pL98.svg#YandexSansTextWeb-Light) format('svg');
font-weight: 300;
font-style: normal;
font-stretch: normal
}
@font-face {
font-family: 'Yandex Sans Display Web';
src: url(https://yastatic.net/adv-www/_/H63jN0veW07XQUIA2317lr9UIm8.eot);
src: url(https://yastatic.net/adv-www/_/H63jN0veW07XQUIA2317lr9UIm8.eot?#iefix) format('embedded-opentype'),
url(https://yastatic.net/adv-www/_/sUYVCPUAQE7ExrvMS7FoISoO83s.woff2) format('woff2'),
url(https://yastatic.net/adv-www/_/v2Sve_obH3rKm6rKrtSQpf-eB7U.woff) format('woff'),
url(https://yastatic.net/adv-www/_/PzD8hWLMunow5i3RfJ6WQJAL7aI.ttf) format('truetype'),
url(https://yastatic.net/adv-www/_/lF_KG5g4tpQNlYIgA0e77fBSZ5s.svg#YandexSansDisplayWeb-Regular) format('svg');
font-weight: 400;
font-style: normal;
font-stretch: normal
}
@font-face {
font-family: 'Yandex Sans Display Web';
src: url(https://yastatic.net/adv-www/_/g8_MyyKVquSZ3xEL6tarK__V9Vw.eot);
src: url(https://yastatic.net/adv-www/_/g8_MyyKVquSZ3xEL6tarK__V9Vw.eot?#iefix) format('embedded-opentype'),
url(https://yastatic.net/adv-www/_/LGiRvlfqQHlWR9YKLhsw5e7KGNA.woff2) format('woff2'),
url(https://yastatic.net/adv-www/_/40vXwNl4eYYMgteIVgLP49dwmfc.woff) format('woff'),
url(https://yastatic.net/adv-www/_/X6zG5x_wO8-AtwJ-vDLJcKC5228.ttf) format('truetype'),
url(https://yastatic.net/adv-www/_/ZKhaR0m08c8CRRL77GtFKoHcLYA.svg#YandexSansDisplayWeb-Light) format('svg');
font-weight: 300;
font-style: normal;
font-stretch: normal
}
body {
font: 300 14pt/200% 'Yandex Sans Text Web', Arial, sans-serif;
}
body.md-lang-zh {
font: 400 14pt/200% 'Yandex Sans Text Web', -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
font: 300 14pt/200% -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial, sans-serif, Apple Color Emoji,Segoe UI Emoji;
}
a:link, a:visited {
color: #08f;
color: #f14600;
text-decoration: none;
}
@ -84,26 +15,23 @@ a:link, a:visited {
color: #888 !important;
}
.md-nav__link:hover, .md-nav__link:active {
color: #08f !important;
color: #f14600 !important;
text-decoration: none;
}
a:hover, a:active {
color: #f00;
text-decoration: underline;
}
.md-typeset pre {
font: 13px/18px monospace, "Courier New";
font: 13px/18px SFMono-Regular, Consolas, Liberation Mono, Menlo, monospace;
display: block;
padding: 1rem 3rem 1rem 1rem;
overflow: scroll;
}
h1, h2, h3, .md-logo {
font-family: 'Yandex Sans Display Web', Arial, sans-serif;
color: #000 !important;
}
@ -117,12 +45,11 @@ h1, h2, h3, .md-logo {
.md-header-nav__title {
font-size: 3rem;
font-family: 'Yandex Sans Display Web', Arial, sans-serif;
}
.md-content__icon:hover {
text-decoration: none !important;
color: #08f !important;
color: #f14600 !important;
}
.md-search-result__link {
@ -229,3 +156,7 @@ h1, h2, h3, .md-logo {
overflow-x: hidden;
overflow-y: auto;
}
.md-typeset a:active, .md-typeset a:hover {
color: #f14600 !important;
}

View File

@ -4,7 +4,6 @@ set -ex
BASE_DIR=$(dirname $(readlink -f $0))
BUILD_DIR="${BASE_DIR}/../build"
PUBLISH_DIR="${BASE_DIR}/../publish"
IMAGE="clickhouse/website"
GIT_TEST_URI="git@github.com:ClickHouse/clickhouse-test.github.io.git"
GIT_PROD_URI="git@github.com:ClickHouse/clickhouse.github.io.git"
@ -14,8 +13,6 @@ then
else
TAG="$1"
fi
FULL_NAME="${IMAGE}:${TAG}"
REMOTE_NAME="registry.yandex.net/${FULL_NAME}"
DOCKER_HASH="$2"
if [[ -z "$1" ]]
then
@ -37,10 +34,7 @@ then
git commit -a -m "add new release at $(date)"
git push origin master
cd "${BUILD_DIR}"
docker build -t "${FULL_NAME}" "${BUILD_DIR}"
docker tag "${FULL_NAME}" "${REMOTE_NAME}"
DOCKER_HASH=$(docker push "${REMOTE_NAME}" | tail -1 | awk '{print $3;}')
docker rmi "${FULL_NAME}"
DOCKER_HASH=$(head -c 16 < /dev/urandom | xxd -p)
else
rm -rf "${BUILD_DIR}" || true
rm -rf "${PUBLISH_DIR}" || true
@ -67,8 +61,4 @@ then
else
QLOUD_ENV="${QLOUD_PROJECT}.prod"
fi
QLOUD_COMPONENT="${QLOUD_ENV}.nginx"
QLOUD_VERSION=$(curl -v -H "Authorization: OAuth ${QLOUD_TOKEN}" "${QLOUD_ENDPOINT}/environment/status/${QLOUD_ENV}" | python -c "import json; import sys; print json.loads(sys.stdin.read()).get('version')")
curl -v -H "Authorization: OAuth ${QLOUD_TOKEN}" -H "Content-Type: application/json" --data "{\"repository\": \"${REMOTE_NAME}\", \"hash\": \"${DOCKER_HASH}\"}" "${QLOUD_ENDPOINT}/component/${QLOUD_COMPONENT}/${QLOUD_VERSION}/deploy" > /dev/null
echo ">>> Successfully deployed ${TAG} ${DOCKER_HASH} to ${QLOUD_ENV} <<<"

View File

@ -21,25 +21,27 @@ def build_website(args):
)
)
def minify_website(args):
for root, _, filenames in os.walk(args.output_dir):
for filename in filenames:
path = os.path.join(root, filename)
if not (
filename.endswith('.html') or
filename.endswith('.css') or
filename.endswith('.js')
):
continue
logging.info('Minifying %s', path)
with open(path, 'rb') as f:
content = f.read().decode('utf-8')
if filename.endswith('.html'):
content = htmlmin.minify(content, remove_empty_space=False)
elif filename.endswith('.css'):
content = cssmin.cssmin(content)
elif filename.endswith('.js'):
content = jsmin.jsmin(content)
with open(path, 'wb') as f:
f.write(content.encode('utf-8'))
def minify_website(args):
if args.minify:
for root, _, filenames in os.walk(args.output_dir):
for filename in filenames:
path = os.path.join(root, filename)
if not (
filename.endswith('.html') or
filename.endswith('.css') or
filename.endswith('.js')
):
continue
logging.info('Minifying %s', path)
with open(path, 'rb') as f:
content = f.read().decode('utf-8')
if filename.endswith('.html'):
content = htmlmin.minify(content, remove_empty_space=False)
elif filename.endswith('.css'):
content = cssmin.cssmin(content)
elif filename.endswith('.js'):
content = jsmin.jsmin(content)
with open(path, 'wb') as f:
f.write(content.encode('utf-8'))

View File

@ -1 +1,3 @@
# -*- coding: utf-8 -*-
# REMOVE ME

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 66.12 10.29"><defs><style>.a{fill:#231f20;}</style></defs><title>ClickHouse</title><path class="a" d="M58.54,74.8a5,5,0,0,1-1.88-.34,4.26,4.26,0,0,1-1.48-1,4.46,4.46,0,0,1-1-1.55,6.32,6.32,0,0,1,0-4.21,4.39,4.39,0,0,1,2.58-2.57,5.36,5.36,0,0,1,1.93-.34,5.84,5.84,0,0,1,1.56.18,6.38,6.38,0,0,1,1.2.46l-0.36,1.13A5.17,5.17,0,0,0,60,66a4.23,4.23,0,0,0-1.43-.22,3.07,3.07,0,0,0-2.35,1.06,3.81,3.81,0,0,0-.72,1.27,5.17,5.17,0,0,0-.27,1.73,5.35,5.35,0,0,0,.25,1.69,3.61,3.61,0,0,0,.69,1.25,2.88,2.88,0,0,0,1.06.77,3.49,3.49,0,0,0,1.38.27,4,4,0,0,0,1.27-.2A5.71,5.71,0,0,0,61,73.09l0.35,0.85a3.86,3.86,0,0,1-1.12.59A5,5,0,0,1,58.54,74.8Z" transform="translate(-53.86 -64.51)"/><path class="a" d="M64.07,64.51V74.66H62.88V64.51h1.19Z" transform="translate(-53.86 -64.51)"/><path class="a" d="M66.64,66.55a0.71,0.71,0,0,1-.76-0.74,0.78,0.78,0,0,1,.2-0.55,0.79,0.79,0,0,1,1.1,0,0.77,0.77,0,0,1,.21.55,0.72,0.72,0,0,1-.21.53A0.74,0.74,0,0,1,66.64,66.55Zm0.6,1.06v7H66.06v-7h1.19Z" transform="translate(-53.86 -64.51)"/><path class="a" d="M72.29,74.8a3.78,3.78,0,0,1-1.37-.25,3.08,3.08,0,0,1-1.11-.72,3.45,3.45,0,0,1-.74-1.15,4.48,4.48,0,0,1,0-3.08,3.35,3.35,0,0,1,.76-1.15A3.19,3.19,0,0,1,71,67.72a4,4,0,0,1,1.41-.25,4.68,4.68,0,0,1,1.13.13,2.68,2.68,0,0,1,.84.35L74,69a4,4,0,0,0-.79-0.47,2.32,2.32,0,0,0-.92-0.16,2.28,2.28,0,0,0-.88.17,2,2,0,0,0-.73.52,2.52,2.52,0,0,0-.49.85A3.5,3.5,0,0,0,70,71.11a2.8,2.8,0,0,0,.66,2,2.4,2.4,0,0,0,1.79.67,3,3,0,0,0,1.62-.52l0.27,0.88a2.89,2.89,0,0,1-.89.45A3.88,3.88,0,0,1,72.29,74.8Z" transform="translate(-53.86 -64.51)"/><path class="a" d="M77,64.51V74.66H75.79V64.51H77ZM80.1,74.66L77.16,70.9l2.9-3.28H81.3l-2.87,3.14,3.07,3.9H80.1Z" transform="translate(-53.86 -64.51)"/><path class="a" d="M89.17,70.34h-5v4.31H82.88V64.93h1.29v4.44h5V64.93h1.29v9.73H89.17V70.34Z" transform="translate(-53.86 -64.51)"/><path class="a" d="M95.55,74.8a3.49,3.49,0,0,1-1.3-.25,3.11,3.11,0,0,1-1.08-.71,3.44,3.44,0,0,1-.73-1.15,4.6,4.6,0,0,1,0-3.12,3.36,3.36,0,0,1,.73-1.14,3.16,3.16,0,0,1,1.08-.71,3.49,3.49,0,0,1,1.3-.25,3.55,3.55,0,0,1,1.31.25,3.22,3.22,0,0,1,1.09.71,3.39,3.39,0,0,1,.75,1.14,4.49,4.49,0,0,1,0,3.12A3.47,3.47,0,0,1,98,73.84a3.16,3.16,0,0,1-1.09.71A3.55,3.55,0,0,1,95.55,74.8Zm0-.91a2.37,2.37,0,0,0,.82-0.15,1.79,1.79,0,0,0,.71-0.48,2.48,2.48,0,0,0,.5-0.86,3.79,3.79,0,0,0,.19-1.27,3.73,3.73,0,0,0-.19-1.27,2.48,2.48,0,0,0-.5-0.85,1.79,1.79,0,0,0-.71-0.48,2.37,2.37,0,0,0-.82-0.15,2.25,2.25,0,0,0-.8.15,1.82,1.82,0,0,0-.69.48,2.4,2.4,0,0,0-.49.85,3.86,3.86,0,0,0-.18,1.27,3.92,3.92,0,0,0,.18,1.27,2.4,2.4,0,0,0,.49.86,1.81,1.81,0,0,0,.69.48A2.25,2.25,0,0,0,95.55,73.89Z" transform="translate(-53.86 -64.51)"/><path class="a" d="M104.21,74.39a2.69,2.69,0,0,1-1.55.41,2.15,2.15,0,0,1-1.58-.6,2.49,2.49,0,0,1-.6-1.84V67.61h1.2v4.75a2.14,2.14,0,0,0,.1.7,1.08,1.08,0,0,0,.28.45,1,1,0,0,0,.42.24,1.82,1.82,0,0,0,.52.07,2,2,0,0,0,1.27-.38,3,3,0,0,0,.82-1V67.61h1.19v7h-1.05l-0.11-1.26h0A2.5,2.5,0,0,1,104.21,74.39Z" transform="translate(-53.86 -64.51)"/><path class="a" d="M110.11,74.8a7.07,7.07,0,0,1-.9,0,5.45,5.45,0,0,1-.67-0.13,3.23,3.23,0,0,1-.51-0.17,3.55,3.55,0,0,1-.4-0.21l0.39-1a1.88,1.88,0,0,0,.28.19,3.34,3.34,0,0,0,.45.21,3.64,3.64,0,0,0,.61.18,3.74,3.74,0,0,0,.75.07,1.87,1.87,0,0,0,1.15-.3,1,1,0,0,0,.39-0.83,0.87,0.87,0,0,0-.32-0.71,3.35,3.35,0,0,0-1.11-.5l-0.86-.29a3,3,0,0,1-.73-0.38,1.8,1.8,0,0,1-.52-0.58,1.76,1.76,0,0,1-.2-0.88A1.68,1.68,0,0,1,108.6,68a3.23,3.23,0,0,1,1.89-.48,5.65,5.65,0,0,1,1.25.12,4.16,4.16,0,0,1,.84.27l-0.28,1a6.73,6.73,0,0,0-.7-0.3,3.05,3.05,0,0,0-1.06-.16,2.36,2.36,0,0,0-1.09.21,0.79,0.79,0,0,0-.41.77,0.73,0.73,0,0,0,.13.43,1.11,1.11,0,0,0,.34.31,2.48,2.48,0,0,0,.5.23l0.6,0.18,0.81,0.27a2.74,2.74,0,0,1,.72.39,1.74,1.74,0,0,1,.71,1.5,1.91,1.91,0,0,1-.23,1,2,2,0,0,1-.61.66,2.6,2.6,0,0,1-.87.38A4.33,4.33,0,0,1,110.11,74.8Z" transform="translate(-53.86 -64.51)"/><path class="a" d="M119.76,74.05a3,3,0,0,1-1,.53,4.15,4.15,0,0,1-1.37.21,3.35,3.35,0,0,1-2.58-1,3.82,3.82,0,0,1-.9-2.71,4.38,4.38,0,0,1,.25-1.53,3.42,3.42,0,0,1,.69-1.15,2.91,2.91,0,0,1,1-.72,3.34,3.34,0,0,1,1.28-.25,3.2,3.2,0,0,1,1.28.25,2.31,2.31,0,0,1,.94.73,2.75,2.75,0,0,1,.5,1.2,5,5,0,0,1,0,1.66h-4.76q0.08,2.51,2.37,2.51a3.11,3.11,0,0,0,1.08-.17,4.26,4.26,0,0,0,.88-0.44Zm-2.59-5.74a1.77,1.77,0,0,0-1.29.54,2.71,2.71,0,0,0-.68,1.62h3.57a2.18,2.18,0,0,0-.37-1.63A1.53,1.53,0,0,0,117.17,68.31Z" transform="translate(-53.86 -64.51)"/></svg>

After

Width:  |  Height:  |  Size: 4.3 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 66.12 10.29"><defs><style>.a{fill:#fff;}</style></defs><title>ClickHouse white</title><path class="a" d="M58.54,74.8a5,5,0,0,1-1.88-.34,4.26,4.26,0,0,1-1.48-1,4.46,4.46,0,0,1-1-1.55,6.32,6.32,0,0,1,0-4.21,4.39,4.39,0,0,1,2.58-2.57,5.36,5.36,0,0,1,1.93-.34,5.84,5.84,0,0,1,1.56.18,6.38,6.38,0,0,1,1.2.46l-0.36,1.13A5.17,5.17,0,0,0,60,66a4.23,4.23,0,0,0-1.43-.22,3.07,3.07,0,0,0-2.35,1.06,3.81,3.81,0,0,0-.72,1.27,5.17,5.17,0,0,0-.27,1.73,5.35,5.35,0,0,0,.25,1.69,3.61,3.61,0,0,0,.69,1.25,2.88,2.88,0,0,0,1.06.77,3.49,3.49,0,0,0,1.38.27,4,4,0,0,0,1.27-.2A5.71,5.71,0,0,0,61,73.09l0.35,0.85a3.86,3.86,0,0,1-1.12.59A5,5,0,0,1,58.54,74.8Z" transform="translate(-53.86 -64.51)"/><path class="a" d="M64.07,64.51V74.66H62.88V64.51h1.19Z" transform="translate(-53.86 -64.51)"/><path class="a" d="M66.64,66.55a0.71,0.71,0,0,1-.76-0.74,0.78,0.78,0,0,1,.2-0.55,0.79,0.79,0,0,1,1.1,0,0.77,0.77,0,0,1,.21.55,0.72,0.72,0,0,1-.21.53A0.74,0.74,0,0,1,66.64,66.55Zm0.6,1.06v7H66.06v-7h1.19Z" transform="translate(-53.86 -64.51)"/><path class="a" d="M72.29,74.8a3.78,3.78,0,0,1-1.37-.25,3.08,3.08,0,0,1-1.11-.72,3.45,3.45,0,0,1-.74-1.15,4.48,4.48,0,0,1,0-3.08,3.35,3.35,0,0,1,.76-1.15A3.19,3.19,0,0,1,71,67.72a4,4,0,0,1,1.41-.25,4.68,4.68,0,0,1,1.13.13,2.68,2.68,0,0,1,.84.35L74,69a4,4,0,0,0-.79-0.47,2.32,2.32,0,0,0-.92-0.16,2.28,2.28,0,0,0-.88.17,2,2,0,0,0-.73.52,2.52,2.52,0,0,0-.49.85A3.5,3.5,0,0,0,70,71.11a2.8,2.8,0,0,0,.66,2,2.4,2.4,0,0,0,1.79.67,3,3,0,0,0,1.62-.52l0.27,0.88a2.89,2.89,0,0,1-.89.45A3.88,3.88,0,0,1,72.29,74.8Z" transform="translate(-53.86 -64.51)"/><path class="a" d="M77,64.51V74.66H75.79V64.51H77ZM80.1,74.66L77.16,70.9l2.9-3.28H81.3l-2.87,3.14,3.07,3.9H80.1Z" transform="translate(-53.86 -64.51)"/><path class="a" d="M89.17,70.34h-5v4.31H82.88V64.93h1.29v4.44h5V64.93h1.29v9.73H89.17V70.34Z" transform="translate(-53.86 -64.51)"/><path class="a" d="M95.55,74.8a3.49,3.49,0,0,1-1.3-.25,3.11,3.11,0,0,1-1.08-.71,3.44,3.44,0,0,1-.73-1.15,4.6,4.6,0,0,1,0-3.12,3.36,3.36,0,0,1,.73-1.14,3.16,3.16,0,0,1,1.08-.71,3.49,3.49,0,0,1,1.3-.25,3.55,3.55,0,0,1,1.31.25,3.22,3.22,0,0,1,1.09.71,3.39,3.39,0,0,1,.75,1.14,4.49,4.49,0,0,1,0,3.12A3.47,3.47,0,0,1,98,73.84a3.16,3.16,0,0,1-1.09.71A3.55,3.55,0,0,1,95.55,74.8Zm0-.91a2.37,2.37,0,0,0,.82-0.15,1.79,1.79,0,0,0,.71-0.48,2.48,2.48,0,0,0,.5-0.86,3.79,3.79,0,0,0,.19-1.27,3.73,3.73,0,0,0-.19-1.27,2.48,2.48,0,0,0-.5-0.85,1.79,1.79,0,0,0-.71-0.48,2.37,2.37,0,0,0-.82-0.15,2.25,2.25,0,0,0-.8.15,1.82,1.82,0,0,0-.69.48,2.4,2.4,0,0,0-.49.85,3.86,3.86,0,0,0-.18,1.27,3.92,3.92,0,0,0,.18,1.27,2.4,2.4,0,0,0,.49.86,1.81,1.81,0,0,0,.69.48A2.25,2.25,0,0,0,95.55,73.89Z" transform="translate(-53.86 -64.51)"/><path class="a" d="M104.21,74.39a2.69,2.69,0,0,1-1.55.41,2.15,2.15,0,0,1-1.58-.6,2.49,2.49,0,0,1-.6-1.84V67.61h1.2v4.75a2.14,2.14,0,0,0,.1.7,1.08,1.08,0,0,0,.28.45,1,1,0,0,0,.42.24,1.82,1.82,0,0,0,.52.07,2,2,0,0,0,1.27-.38,3,3,0,0,0,.82-1V67.61h1.19v7h-1.05l-0.11-1.26h0A2.5,2.5,0,0,1,104.21,74.39Z" transform="translate(-53.86 -64.51)"/><path class="a" d="M110.11,74.8a7.07,7.07,0,0,1-.9,0,5.45,5.45,0,0,1-.67-0.13,3.23,3.23,0,0,1-.51-0.17,3.55,3.55,0,0,1-.4-0.21l0.39-1a1.88,1.88,0,0,0,.28.19,3.34,3.34,0,0,0,.45.21,3.64,3.64,0,0,0,.61.18,3.74,3.74,0,0,0,.75.07,1.87,1.87,0,0,0,1.15-.3,1,1,0,0,0,.39-0.83,0.87,0.87,0,0,0-.32-0.71,3.35,3.35,0,0,0-1.11-.5l-0.86-.29a3,3,0,0,1-.73-0.38,1.8,1.8,0,0,1-.52-0.58,1.76,1.76,0,0,1-.2-0.88A1.68,1.68,0,0,1,108.6,68a3.23,3.23,0,0,1,1.89-.48,5.65,5.65,0,0,1,1.25.12,4.16,4.16,0,0,1,.84.27l-0.28,1a6.73,6.73,0,0,0-.7-0.3,3.05,3.05,0,0,0-1.06-.16,2.36,2.36,0,0,0-1.09.21,0.79,0.79,0,0,0-.41.77,0.73,0.73,0,0,0,.13.43,1.11,1.11,0,0,0,.34.31,2.48,2.48,0,0,0,.5.23l0.6,0.18,0.81,0.27a2.74,2.74,0,0,1,.72.39,1.74,1.74,0,0,1,.71,1.5,1.91,1.91,0,0,1-.23,1,2,2,0,0,1-.61.66,2.6,2.6,0,0,1-.87.38A4.33,4.33,0,0,1,110.11,74.8Z" transform="translate(-53.86 -64.51)"/><path class="a" d="M119.76,74.05a3,3,0,0,1-1,.53,4.15,4.15,0,0,1-1.37.21,3.35,3.35,0,0,1-2.58-1,3.82,3.82,0,0,1-.9-2.71,4.38,4.38,0,0,1,.25-1.53,3.42,3.42,0,0,1,.69-1.15,2.91,2.91,0,0,1,1-.72,3.34,3.34,0,0,1,1.28-.25,3.2,3.2,0,0,1,1.28.25,2.31,2.31,0,0,1,.94.73,2.75,2.75,0,0,1,.5,1.2,5,5,0,0,1,0,1.66h-4.76q0.08,2.51,2.37,2.51a3.11,3.11,0,0,0,1.08-.17,4.26,4.26,0,0,0,.88-0.44Zm-2.59-5.74a1.77,1.77,0,0,0-1.29.54,2.71,2.71,0,0,0-.68,1.62h3.57a2.18,2.18,0,0,0-.37-1.63A1.53,1.53,0,0,0,117.17,68.31Z" transform="translate(-53.86 -64.51)"/></svg>

After

Width:  |  Height:  |  Size: 4.3 KiB

View File

@ -1,71 +1,6 @@
@font-face {
font-family: 'Yandex Sans Text Web';
src: url(https://yastatic.net/adv-www/_/yy5JveR58JFkc97waf-xp0i6_jM.eot);
src: url(https://yastatic.net/adv-www/_/yy5JveR58JFkc97waf-xp0i6_jM.eot?#iefix) format('embedded-opentype'),
url(https://yastatic.net/adv-www/_/CYblzLEXzCqQIvrYs7QKQe2omRk.woff2) format('woff2'),
url(https://yastatic.net/adv-www/_/pUcnOdRwl83MvPPzrNomhyletnA.woff) format('woff'),
url(https://yastatic.net/adv-www/_/vNFEmXOcGYKJ4AAidUprHWoXrLU.ttf) format('truetype'),
url(https://yastatic.net/adv-www/_/0w7OcWZM_QLP8x-LQUXFOgXO6dE.svg#YandexSansTextWeb-Bold) format('svg');
font-weight: 700;
font-style: normal;
font-stretch: normal
}
@font-face {
font-family: 'Yandex Sans Text Web';
src: url(https://yastatic.net/adv-www/_/LI6l3L2RqcgxBe2pXmuUha37czQ.eot);
src: url(https://yastatic.net/adv-www/_/LI6l3L2RqcgxBe2pXmuUha37czQ.eot?#iefix) format('embedded-opentype'),
url(https://yastatic.net/adv-www/_/z3MYElcut0R2MF_Iw1RDNrstgYs.woff2) format('woff2'),
url(https://yastatic.net/adv-www/_/1jvKJ_-hCXl3s7gmFl-y_-UHTaI.woff) format('woff'),
url(https://yastatic.net/adv-www/_/9nzjfpCR2QHvK1EzHpDEIoVFGuY.ttf) format('truetype'),
url(https://yastatic.net/adv-www/_/gwyBTpxSwkFCF1looxqs6JokKls.svg#YandexSansTextWeb-Regular) format('svg');
font-weight: 400;
font-style: normal;
font-stretch: normal
}
@font-face {
font-family: 'Yandex Sans Text Web';
src: url(https://yastatic.net/adv-www/_/ayAFYoY8swgBLhq_I56tKj2JftU.eot);
src: url(https://yastatic.net/adv-www/_/ayAFYoY8swgBLhq_I56tKj2JftU.eot?#iefix) format('embedded-opentype'),
url(https://yastatic.net/adv-www/_/lGQcYklLVV0hyvz1HFmFsUTj8_0.woff2) format('woff2'),
url(https://yastatic.net/adv-www/_/f0AAJ9GJ4iiwEmhG-7PWMHk6vUY.woff) format('woff'),
url(https://yastatic.net/adv-www/_/4UDe4nlVvgEJ-VmLWNVq3SxCsA.ttf) format('truetype'),
url(https://yastatic.net/adv-www/_/EKLr1STNokPqxLAQa_RyN82pL98.svg#YandexSansTextWeb-Light) format('svg');
font-weight: 300;
font-style: normal;
font-stretch: normal
}
@font-face {
font-family: 'Yandex Sans Display Web';
src: url(https://yastatic.net/adv-www/_/H63jN0veW07XQUIA2317lr9UIm8.eot);
src: url(https://yastatic.net/adv-www/_/H63jN0veW07XQUIA2317lr9UIm8.eot?#iefix) format('embedded-opentype'),
url(https://yastatic.net/adv-www/_/sUYVCPUAQE7ExrvMS7FoISoO83s.woff2) format('woff2'),
url(https://yastatic.net/adv-www/_/v2Sve_obH3rKm6rKrtSQpf-eB7U.woff) format('woff'),
url(https://yastatic.net/adv-www/_/PzD8hWLMunow5i3RfJ6WQJAL7aI.ttf) format('truetype'),
url(https://yastatic.net/adv-www/_/lF_KG5g4tpQNlYIgA0e77fBSZ5s.svg#YandexSansDisplayWeb-Regular) format('svg');
font-weight: 400;
font-style: normal;
font-stretch: normal
}
@font-face {
font-family: 'Yandex Sans Display Web';
src: url(https://yastatic.net/adv-www/_/g8_MyyKVquSZ3xEL6tarK__V9Vw.eot);
src: url(https://yastatic.net/adv-www/_/g8_MyyKVquSZ3xEL6tarK__V9Vw.eot?#iefix) format('embedded-opentype'),
url(https://yastatic.net/adv-www/_/LGiRvlfqQHlWR9YKLhsw5e7KGNA.woff2) format('woff2'),
url(https://yastatic.net/adv-www/_/40vXwNl4eYYMgteIVgLP49dwmfc.woff) format('woff'),
url(https://yastatic.net/adv-www/_/X6zG5x_wO8-AtwJ-vDLJcKC5228.ttf) format('truetype'),
url(https://yastatic.net/adv-www/_/ZKhaR0m08c8CRRL77GtFKoHcLYA.svg#YandexSansDisplayWeb-Light) format('svg');
font-weight: 300;
font-style: normal;
font-stretch: normal
}
body {
background: #fff;
font: 300 14pt/200% 'Yandex Sans Text Web', Arial, sans-serif;
font: 300 14pt/200% -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial, sans-serif, Apple Color Emoji,Segoe UI Emoji;
margin: 0;
padding: 0;
}
@ -93,8 +28,12 @@ body {
font-size: 110%;
}
#logo-text {
width: 200px;
height: 44px;
}
#main-title {
font: 400 42pt/90% 'Yandex Sans Display Web', Arial, sans-serif;
margin: 0;
}
@ -134,22 +73,21 @@ body {
h2 {
margin: 47px 0 23px;
font: 400 200%/133% 'Yandex Sans Display Web', Arial, sans-serif;
font-size: 200%;
}
a:link, a:visited {
color: #08f;
color: #f14600;
text-decoration: none;
}
a:hover, a:active {
color: #f00;
text-decoration: underline;
}
#top-menu {
margin: 12px 0 0 0;
font: 400 18pt 'Yandex Sans Display Web', Arial, sans-serif;
margin: 8px 0 0 0;
font-size: 18pt;
float: right;
}
@ -171,11 +109,10 @@ a:hover, a:active {
.index_item:active,
.index_item:visited {
color: #ededed;
font: 300 100% 'Yandex Sans Display Web', Arial, sans-serif;
}
#short-description {
font: 300 125%/150% 'Yandex Sans Display Web', Arial, sans-serif;
font-size: 125%;
margin: 0 1em 1.75em 0;
text-align: left;
}
@ -215,7 +152,7 @@ a:hover, a:active {
#announcement {
margin: 0 0 60px 0;
padding: 20px 0;
font: 400 125%/133% 'Yandex Sans Display Web',Arial,sans-serif;
font-size: 125%;
}
.announcement-link {
color: #000!important;
@ -268,7 +205,7 @@ a:hover, a:active {
}
pre {
font: 13px/18px monospace, "Courier New";
font: 13px/18px SFMono-Regular, Consolas, Liberation Mono, Menlo, monospace;
display: block;
border-left: 5px solid #ffdb4d;
padding: 5px 10px;
@ -313,9 +250,9 @@ img {
}
.distributive_not_selected {
color: #08f;
color: #f14600;
cursor: pointer;
border-bottom: 1px solid #08f;
border-bottom: 1px solid #f14600;
}
#tutorial_logo {
@ -326,7 +263,7 @@ img {
}
#tutorial_title {
font: normal 100px 'Yandex Sans Display Web', Arial, sans-serif;
font-size: 100px;
margin-top: 25px;
margin-bottom: 0;
text-align: center;
@ -349,8 +286,8 @@ img {
}
.spoiler_title {
color: #08f;
border-bottom: 1px dotted #08f;
color: #f14600;
border-bottom: 1px dotted #f14600;
}
.spoiler_title:hover {

View File

@ -47,7 +47,7 @@
<path class="orange" d="M8,3.25 h1 v1.5 h-1 z"></path>
</svg>
ClickHouse
<img id="logo-text" src="images/clickhouse-black.svg" alt="ClickHouse" />
</h1>
</a>
</div>
@ -450,7 +450,7 @@ sudo clickhouse-client-$LATEST_VERSION/install/doinst.sh
<a href="https://hub.docker.com/r/yandex/clickhouse-server/" rel="external nofollow"
target="_blank">
official Docker images of ClickHouse</a>, this is not the only <a href="https://clickhouse.tech/docs/en/getting_started/">option</a> though.
Alternatively, you can easily get a running ClickHouse instance or cluster at
Alternatively, you can easily get a running ClickHouse instance or cluster at
<a href="https://cloud.yandex.com/services/managed-clickhouse?utm_source=referrals&utm_medium=clickhouseofficialsite&utm_campaign=link1" rel="external nofollow" target="_blank">
Yandex Managed Service for ClickHouse</a>.
</p>
@ -529,15 +529,15 @@ sudo clickhouse-client-$LATEST_VERSION/install/doinst.sh
line = line.split('](');
var tail = line[1].split(') ');
result.push(
'<a class="announcement-link" rel="external nofollow" target="_blank" href="' +
tail[0] + '">' + line[0].replace('* [', '').replace('ClickHouse Meetup in ', '') +
'<a class="announcement-link" rel="external nofollow" target="_blank" href="' +
tail[0] + '">' + line[0].replace('* [', '').replace('ClickHouse Meetup in ', '') +
'</a> ' + tail[1].slice(0, -1)
);
}
});
if (result.length) {
if (result.length == 1) {
result = 'Upcoming Meetup: ' + result[0];
result = 'Upcoming Meetup: ' + result[0];
} else {
result = 'Upcoming Meetups: ' + result.join(', ');
var offset = result.lastIndexOf(', ');