-Поиск по дневнику

Поиск сообщений в rss_rss_hh_new

 -Подписка по e-mail

 

 -Статистика

Статистика LiveInternet.ru: показано количество хитов и посетителей
Создан: 17.03.2011
Записей:
Комментариев:
Написано: 51

Habrahabr/New








Добавить любой RSS - источник (включая журнал LiveJournal) в свою ленту друзей вы можете на странице синдикации.

Исходная информация - http://habrahabr.ru/rss/new/.
Данный дневник сформирован из открытого RSS-источника по адресу http://feeds.feedburner.com/xtmb/hh-new-full, и дополняется в соответствии с дополнением данного источника. Он может не соответствовать содержимому оригинальной страницы. Трансляция создана автоматически по запросу читателей этой RSS ленты.
По всем вопросам о работе данного сервиса обращаться со страницы контактной информации.

[Обновить трансляцию]

Автоэнкодеры в Keras, Часть 5: GAN(Generative Adversarial Networks) и tensorflow

Четверг, 29 Июня 2017 г. 18:33 + в цитатник

Содержание



При всех преимуществах вариационных автоэнкодеров VAE, которыми мы занимались в предыдущих постах, они обладают одним существенным недостатком: из-за плохого способа сравнения оригинальных и восстановленных объектов, сгенерированные ими объекты хоть и похожи на объекты из обучающей выборки, но легко от них отличимы (например, размыты).

Этот недостаток в куда меньшей степени проявляется у другого подхода, а именно у генеративных состязающихся сетейGAN’ов.

Формально GAN’ы, конечно, не относятся к автоэнкодерам, однако между ними и вариационными автоэнкодерами есть сходства, они также пригодятся для следующей части. Так что не будет лишним с ними тоже познакомиться.

Коротко о GAN


GAN’ы впервые были предложены в статье [1, Generative Adversarial Nets, Goodfellow et al, 2014] и сейчас очень активно исследуются. Наиболее state-of-the-art генеративные модели так или иначе используют adversarial.

Схема GAN:




GAN’ы состоят из 2 нейронных сетей:
  • 1-ая — генератор сэмплит случайные числа из какого-то заданного распределения P(Z), например N(0,I) и генерируют из них объекты X_p = G(Z; \theta_g), которые идут на вход второй сети,
  • 2-ая — дискриминатор получает на вход объекты из выборки X_s и созданные генератором X_p, и учится предсказывать вероятность того, что конкретный объект реальный, выдавая скаляр D(X; \theta_d).


При этом генератор тренируется создавать объекты, который дискриминатор не отличит от реальных.

Рассмотрим процесс обучения GAN.

Генератор и дискриминатор обучаются отдельно, но в рамках одной сети.

Делаем k шагов обучения дискриминатора: за шаг обучения дискриминатора параметры \theta_d обновляются в сторону уменьшения кросс-энтропии:

\theta_d = \theta_d - \nabla_{\theta_d} \left(\log(D(X_s)) + \log(1 - D(G(Z))) \right)

Далее шаг обучения генератора: обновляем параметры генератора \theta_g в сторону увеличения логарифма вероятности дискриминатору присвоить сгенерированному объекту лейбл реального.

\theta_g = \theta_g + \nabla_{\theta_g} \log(1 - D(G(Z)))

Схема обучения:


На левой картинке шаг обучения дискриминатора: градиент (красные стрелки) протекает от лосса только до дискриминатора, где обновляются \theta_d (зеленые) в сторону уменьшения лосса. На правой картинке градиент от правой части лосса (ошибка идентификации сгенерированного объекта) протекает до генератора, при этом обновляются только веса генератора \theta_g (зеленые) в сторону увеличения вероятности дискриминатора ошибиться.

Задача, которую решает GAN формулируется так:

\min_G \max_D \mathbb{E}_{X \sim P}[ \log(D(X))] + \mathbb{E}_{Z \sim P_z}[ \log(1 - D(G(Z)))]


При заданном генераторе оптимальный дискриминатор выдает вероятность D^*(X) = \frac{P(X)}{P_g(X) + P(X)}, что почти очевидно, предлагаю задуматься об этом немножно.



В [1] показывается, что при достаточной мощности обеих сетей у данной задачи есть оптимум, в котором генератор научился генерировать распределение P_g(X), совпадающее с P(X), а везде на X^{} дискриминатор выдает вероятность 1/2.



Иллюстрация из [1]

Обозначения:
  • черная точечная кривая — настоящее распределение P(X),
  • зеленая — распределение генератора P_g(X),
  • синяя — распределение вероятности D(X;\theta_d) дискриминатора предсказать класс реального объекта,
  • нижняя и верхняя прямые — множество всех Z и множество всех X, стрелочки олицетворяют отображение G(Z;\theta_g).

На картинке:
  • (a) P(X) и P_g(X) довольно разные, но дискриминатор неуверенно отличает одно от другого,
  • (b) дискриминатор после k шагов обучения уже отличает их увереннее,
  • (с) это позволяет генератору G, руководствуясь хорошим градиентом дискриминатора D, на границе двух распределений подвинуть P_g(X) ближе к P(X),
  • (d) в результате многих повторений шагов (а), (b), (с) P_g совпало с P, и дискриминатор более не способен отличать одно от другого: D(X) = 1/2. Точка оптимума достигнута.

Conditional GAN


Точно как в прошлой части мы сделали Conditional VAE, просто передавая в энкодер и декодер лейбл цифры, здесь мы будем передавать его в генератор и дискриминатор [2]



Код


В отличие от предыдущих частей, где получалось обходиться одним keras’ом, здесь с этим возникает проблема. А именно, нужно в одной и той же сети по очереди обновлять либо только параметры генератора, либо только дискриминатора. Если исхитриться, то можно сделать это и чисто в keras’е, но по мне проще и полезнее подключить сюда и tensorflow.
В блоге keras’а есть небольшой туториал [3], как это делать.

Благо keras легко сочетается с tensorflow — не даром он попал в tensorflow.contrib.

Начнем с импортирования нужных модулей и загрузки датасета.

from IPython.display import clear_output
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

from keras.layers import Dropout, BatchNormalization, Reshape, Flatten, RepeatVector
from keras.layers import Lambda, Dense, Input, Conv2D, MaxPool2D, UpSampling2D, concatenate
from keras.layers.advanced_activations import LeakyReLU
from keras.models import Model, load_model


from keras.datasets import mnist
from keras.utils import to_categorical
(x_train, y_train), (x_test, y_test) = mnist.load_data()

x_train = x_train.astype('float32') / 255.
x_test  = x_test .astype('float32') / 255.
x_train = np.reshape(x_train, (len(x_train), 28, 28, 1))
x_test  = np.reshape(x_test,  (len(x_test),  28, 28, 1))

y_train_cat = to_categorical(y_train).astype(np.float32)
y_test_cat  = to_categorical(y_test).astype(np.float32)

Для работы в keras и tensorflow одновременно надо зарегистрировать tensorflow сессию в keras, это нужно для того чтобы keras создавал все внутренние переменные в рамках используемой сессии.

from keras import backend as K
import tensorflow as tf
sess = tf.Session()
K.set_session(sess)

Определим основные глобальные константы:

batch_size = 256
batch_shape = (batch_size, 28, 28, 1)
latent_dim = 2
num_classes = 10
dropout_rate = 0.3

Обучать модель мы теперь будем не с помощью метода .fit, а напрямую из tensorflow, поэтому напишем итератор, возвращающий очередной батч:

def gen_batch(x, y):
    n_batches = x.shape[0] // batch_size
    while(True):
        for i in range(n_batches):
            yield x[batch_size*i: batch_size*(i+1)], y[batch_size*i: batch_size*(i+1)]
        idxs = np.random.permutation(y.shape[0])
        x = x[idxs]
        y = y[idxs]


train_batches_it = gen_batch(x_train, y_train_cat)
test_batches_it  = gen_batch(x_test,  y_test_cat)

Оборачиваем placeholder’ы для картинок, лейблов и скрытых переменных во входящие слои для keras моделей:

x_ = tf.placeholder(tf.float32, shape=(None, 28, 28, 1),   name='image')
y_ = tf.placeholder(tf.float32, shape=(None, num_classes), name='labels')
z_ = tf.placeholder(tf.float32, shape=(None, latent_dim),  name='z')

img = Input(tensor=x_)
lbl = Input(tensor=y_)
z   = Input(tensor=z_)

Реализовывать будем сразу CGAN, так как он лишь минимально отличается от обычного.
Напишем модель генератора. Keras работает со scope’ами, а нам нужно разделить генератор и дискриминатор, чтобы потом обучать их по-отдельности

with tf.variable_scope('generator'):
    x = concatenate([z, lbl])
    x = Dense(7*7*64, activation='relu')(x)
    x = Dropout(dropout_rate)(x)
    x = Reshape((7, 7, 64))(x)
    x = UpSampling2D(size=(2, 2))(x)

    x = Conv2D(64, kernel_size=(5, 5), activation='relu', padding='same')(x)
    x = Dropout(dropout_rate)(x)

    x = Conv2D(32, kernel_size=(3, 3), activation='relu', padding='same')(x)
    x = Dropout(dropout_rate)(x)
    x = UpSampling2D(size=(2, 2))(x)

    generated = Conv2D(1, kernel_size=(5, 5), activation='sigmoid', padding='same')(x)
generator = Model([z, lbl], generated, name='generator')

Далее модель дискриминатора. Здесь нам нужно добавить ко входящему изображению еще лейбл цифры. Для этого после применения первого сверточного слоя добавим к фильтрам лейблы. Сперва функция, которая это делает, потом модель дискриминатора.

def add_units_to_conv2d(conv2, units):
    dim1 = int(conv2.shape[1])
    dim2 = int(conv2.shape[2])
    dimc = int(units.shape[1])
    repeat_n = dim1*dim2
    units_repeat = RepeatVector(repeat_n)(lbl)
    units_repeat = Reshape((dim1, dim2, dimc))(units_repeat)
    return concatenate([conv2, units_repeat])


with tf.variable_scope('discrim'):
    x = Conv2D(128, kernel_size=(7, 7), strides=(2, 2), padding='same')(img)
    x = add_units_to_conv2d(x, lbl)
    x = LeakyReLU()(x)
    x = Dropout(dropout_rate)(x)
    x = MaxPool2D((2, 2), padding='same')(x)
    
    l = Conv2D(128, kernel_size=(3, 3), padding='same')(x)
    x = LeakyReLU()(l)
    x = Dropout(dropout_rate)(x)

    h = Flatten()(x)
    d = Dense(1, activation='sigmoid')(h)
discrim = Model([img, lbl], d, name='Discriminator')

Определив модели, мы можем применять их напрямую к placeholder’ам как обычные tensorflow операции.


generated_z = generator([z, lbl])

discr_img   = discrim([img, lbl])
discr_gen_z = discrim([generated_z, lbl])

gan_model = Model([z, lbl], discr_gen_z, name='GAN')
gan   = gan_model([z, lbl])

Теперь лосс ошибки определения реального изображения, и лосс сгенерированного, а также на их основе лоссы генератора и дискриминатора.

log_dis_img   = tf.reduce_mean(-tf.log(discr_img + 1e-10))
log_dis_gen_z = tf.reduce_mean(-tf.log(1. - discr_gen_z + 1e-10))

L_gen = -log_dis_gen_z
L_dis = 0.5*(log_dis_gen_z + log_dis_img)

Обычно в tensorflow, передавая в оптимизатор лосс, он будет пытаться минимизировать сразу все переменные, от которых он зависит. Нам сейчас этого не надо: при обучении генератора, ошибка не должна трогать дискриминатор, хотя должна сквозь него течь и наоборот.

Для этого дополнительно в оптимизатор надо передать список переменных, которые он будет оптимизировать. Достанем эти переменные из нужных scope’ов с помощью tf.get_collection

optimizer_gen = tf.train.RMSPropOptimizer(0.0003)
optimizer_dis = tf.train.RMSPropOptimizer(0.0001)

# Переменные генератора и дискриминаторы (отдельно) для оптимизаторов
generator_vars = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, "generator")
discrim_vars   = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, "discrim")

step_gen = optimizer_gen.minimize(L_gen, var_list=generator_vars)
step_dis = optimizer_dis.minimize(L_dis, var_list=discrim_vars)

Инициализируем переменные:

sess.run(tf.global_variables_initializer())

Отдельно напишем функции, которые будем вызывать для обучения генератора и дискриминатора:

# Шаг обучения генератора
def step(image, label, zp):
    l_dis, _ = sess.run([L_dis, step_gen], feed_dict={z:zp, lbl:label, img:image, K.learning_phase():1})
    return l_dis

# Шаг обучения дискриминатора
def step_d(image, label, zp):
    l_dis, _ = sess.run([L_dis, step_dis], feed_dict={z:zp, lbl:label, img:image, K.learning_phase():1})
    return l_dis


Код сохранения и визуализации картинок:

Код

# Массивы, в которые будем сохранять результаты, для последующей визуализации
figs = [[] for x in range(num_classes)]
periods = []

save_periods = list(range(100)) + list(range(100, 1000, 10))

n = 15 # Картинка с 15x15 цифр
from scipy.stats import norm
# Так как сэмплируем из N(0, I), то сетку узлов, в которых генерируем цифры, берем из обратной функции распределения
grid_x = norm.ppf(np.linspace(0.05, 0.95, n))
grid_y = norm.ppf(np.linspace(0.05, 0.95, n))
grid_y = norm.ppf(np.linspace(0.05, 0.95, n))
def draw_manifold(label, show=True):
    # Рисование цифр из многообразия
    figure = np.zeros((28 * n, 28 * n))
    input_lbl = np.zeros((1, 10))
    input_lbl[0, label] = 1.
    for i, yi in enumerate(grid_x):
        for j, xi in enumerate(grid_y):
            z_sample = np.zeros((1, latent_dim))
            z_sample[:, :2] = np.array([[xi, yi]])

            x_generated = sess.run(generated_z, feed_dict={z:z_sample, lbl:input_lbl, K.learning_phase():0})
            digit = x_generated[0].squeeze()
            figure[i * 28: (i + 1) * 28,
                   j * 28: (j + 1) * 28] = digit
    if show:
        # Визуализация
        plt.figure(figsize=(10, 10))
        plt.imshow(figure, cmap='Greys')
        plt.grid(False)
        ax = plt.gca()
        ax.get_xaxis().set_visible(False)
        ax.get_yaxis().set_visible(False)
        plt.show()
    return figure


n_compare = 10
def on_n_period(period):
    clear_output() # Не захламляем output

    # Рисование многообразия для рандомного y
    draw_lbl = np.random.randint(0, num_classes)    
    print(draw_lbl)
    for label in range(num_classes):
        figs[label].append(draw_manifold(label, show=label==draw_lbl))

    periods.append(period)


Обучим теперь наш CGAN.
Важно, чтобы в самом начале дискриминатор не слишком стал побеждать, иначе обучение остановится. Поэтому здесь добавлены внутренние циклы как для дискриминатора, так и для генератора, и выход из них, когда одна сеть почти догоняет другую.
Если дискриминатор сразу выигрывает у декодера, и обучение даже не успевает начаться, то можно попробовать замедлить обучение дискриминатора, либо несколько раз начинать заново.


batches_per_period = 20 # Как часто сохранять картинки
k_step = 5 # Количество шагов, которые могут делать дискриминатор и генератор во внутреннем цикле

for i in range(5000):
    print('.', end='')
    # Достанем новый батч
    b0, b1 = next(train_batches_it)
    zp = np.random.randn(batch_size, latent_dim)
    # Шаги обучения дискриминатора
    for j in range(k_step):
        l_d = step_d(b0, b1, zp)
        b0, b1 = next(train_batches_it)
        zp = np.random.randn(batch_size, latent_dim)
        if l_d < 1.0:
            break

    # Шаги обучения генератора
    for j in range(k_step):
        l_d = step(b0, b1, zp)
        if l_d > 0.4:
            break
        b0, b1 = next(train_batches_it)
        zp = np.random.randn(batch_size, latent_dim)

    # Периодическое рисование результата
    if not i % batches_per_period:
        period = i // batches_per_period
        if period in save_periods:
            on_n_period(period)
        print(l_d)


Код рисования гифок:

Код

from matplotlib.animation import FuncAnimation
from matplotlib import cm
import matplotlib

def make_2d_figs_gif(figs, periods, c, fname, fig, batches_per_period): 
    norm = matplotlib.colors.Normalize(vmin=0, vmax=1, clip=False)
    im = plt.imshow(np.zeros((28,28)), cmap='Greys', norm=norm)
    plt.grid(None)
    plt.title("Label: {}\nBatch: {}".format(c, 0))

    def update(i):
        im.set_array(figs[i])
        im.axes.set_title("Label: {}\nBatch: {}".format(c, periods[i]*batches_per_period))
        im.axes.get_xaxis().set_visible(False)
        im.axes.get_yaxis().set_visible(False)
        return im
    
    anim = FuncAnimation(fig, update, frames=range(len(figs)), interval=100)
    anim.save(fname, dpi=80, writer='imagemagick')

for label in range(num_classes):
    make_2d_figs_gif(figs[label], periods, label, "./figs4_5/manifold_{}.gif".format(label), plt.figure(figsize=(10,10)), batches_per_period)


Результаты:


GAN


Многообразие цифр для обычного GAN (без передачи лейблов)


Стоит отметить, что цифры получаются лучше, чем в VAE (без лейблов)

Гифка обучения


CGAN


Многообразия цифр для каждого лейбла



Тяжелые гифки




Полезные ссылки и литература


Оригинальная статья:
[1] Generative Adversarial Nets, Goodfellow et al, 2014, https://arxiv.org/abs/1406.2661

Conditional GANs:
[2] Conditional Generative Adversarial Nets, Mirza, Osindero, 2014, https://arxiv.org/abs/1411.1784

Туториал про использование keras вместе с tensorflow:
[3] https://blog.keras.io/keras-as-a-simplified-interface-to-tensorflow-tutorial.html
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/331970/


Метки:  

Переход в двоичную систему

Четверг, 29 Июня 2017 г. 17:57 + в цитатник
Хабр, привет! Внезапно подкрался мой сотый пост здесь и я подумала, что настало время познакомиться. Я Schvepsss, но друзья называют Лизой или Ли, верю в людей, искусственный интеллект, программистов и в мир во всём мире, а ещё ценю моменты, грамотные тексты и перфекционизм. Если вы читаете новости из блога Microsoft, то наверняка встречали мои статьи. После долгих размышлений я поняла, что хочу посвятить этот пост людям, которые стремятся изменить этот мир и делают крутые проекты.



Нет, здесь не будет текстов про героев нашего времени, выдающихся изобретателей или программистов. Всё это вы можете прочитать без моей помощи.

За прошедшие 99 постов и несколько десятков статей для разных изданий, написанных за прошедший год, заметила, что в мире каждый день создаётся что-то интересное. К сожалению, мы зачастую упускаем это из виду из-за тонн информации, окружающей нас. Поэтому хочу рассказать вам про 5 проектов, которые поразили меня, а после этого поделюсь одной идеей.

«Следующий Рембрандт»


Коллаборация технологий и искусства порой даёт интересные результаты, как это случилось в прошлом году. Агентство JWT Amsterdam, совместно с Microsoft, разработало проект «Следующий Рембрандт» для ING Bank, который был призван подчеркнуть приверженность банка инновациям и поддержке классического искусства.





Изначально было проанализировано 346 доподлинно известные картин Рембрандта, из которых получили 168263 фрагментов изображений (или 150 ГБ). Далее, с помощью алгоритмов распознавания изображений определили наиболее типичные штрихи и геометрические узоры мастера, что позволило максимизировать идентичность стилистики будущего произведения со стилем Рембрандта. Ещё один интересный момент: для придания объёма мазкам на картине, потребовалось проанализировать 3D-сканы картин. На итоговую обработку данных ушло больше 500 часов.

Подробнее про проект можно прочитать здесь.

Восьмибитная музыка в ритме VR


Неконтролируемые рейвы 80-ых позволяли музыкантам со скоростью звука набирать популярность и собирать поклонников вокруг себя. За последние 30 лет ситуация сильно изменилась. Сегодня, чтобы проникнуть в сердце аудитории, нужно быть чем-то большим, чем просто крутым диджеем или мелодичным певцом. У Microsoft есть программа Music x Technology, которая с помощью технологий помогает преобразовывать музыку в нечто осязаемое.





В моей статье для Rolling Stone описаны 6 проектов, реализованные совместно с M83, Childish Gambino, Broods, Grimes, Matthew Dear и Phantogram. Например, в результате работы над первым из них была выпущена браузерная игра «Meet Me at Go!» в которой игрок участвуете в гонке за утраченной любовью, перемещаясь на машине по городу с ретро-футуристическим пейзажем, собирая предметы и обходя препятствия. Она создана на движке Unity и экспортирована на платформу UWP. Интересный момент, который вы сможете заметить во время игры — звуковые эффекты трека полностью соответствуют тому, что происходит на экране: когда машина ускоряется, музыка также начинает ускорятся, и аналогично с замедлением.

Лицом в клавиатуру


В Microsoft есть научно-исследовательское подразделение Microsoft Research, существующее более 25 лет. В конце прошлого года они проанализировали анонимные данные об активности пользователей в интернете, чтобы понять, как качество сна влияет на скорость реакции людей в течение дня. После чего были получены результаты, основанные на анализе данных о скорости ввода поисковых запросов и перехода по ссылкам в поисковике.


Источник изображения giphy.com

В Microsoft Research доказали, что люди, которые две ночи подряд спали меньше шести часов, испытывают вялость в течение следующих шести дней. Интересная статистика, на мой взгляд.

Детальные подробности об этом исследовании можно прочитать в статье.

Кто такие фузионисты


Зачастую для создания чего-то выдающегося, человек должен выйти за границы разумного. Следующая статья про Асту Розуэй — человека, которому это удалось. Она разработала татуировки DuoSkin для управления IoT-устройствами, а в далёком 2011 году стала идеологом «Печатающего платья» (The Printing Dress). Также она является одним из основателей выставки FoodFutures, созданной для решения проблем городского сельского хозяйства.



Подробнее про её проекты можно почитать RB, а я хочу поделиться небольшой историей, возникшей по результатам этого материала. Конечно же хотелось «приземлить» эти кейсы в российские реалии, для этого мы нашли двух человек, которые согласились прокомментировать статью. Одной из них была Оксана Селендеева, основатель школы программирования для детей CODDY. В нашей переписке ещё до выхода она восхитилась идеей фузионизма и она сказала, что хочет запустить курсы по этой теме. Тогда я подумала, что это просто временный запал, но как оказалось потом, они правда появились. Не знаю насколько они популярны и будут ли востребованы, но приятно знать, что статья о фузионистах действительно вдохновила кого-то.

Облачные сервисы могут спасти нашу планету


Часто вижу материалы, в которых идут дискуссии «Что лучше: облако или локальный сервер?» Даже сейчас в топе висит статья dracon134 на эту тему. Если отвлечься от технических проблем, то есть другие темы вокруг облачных платформ, о которых можно поспорить. Экология — одна из них.



Весной прошлого года на Хабре вышла статья про экономию энергии в процессе сбора данных при использовании облачных технологий, на которую захотелось взглянуть под другим углом. Помимо видимых и «прямых» доводов о вреде технологий, существуют кейсы, доказывающие обратное. Так, например, есть истории использования облачных сервисов во благо экологии, описанные в ещё одной моей статье для RB. Например, один из кейсов о том, что рост популярности здорового питания приводит к повышению угрозы для целостности экосистемы по всему миру, за счёт увеличения количества обрабатываемых земель. Для того, чтобы фермеры могли более эффективно использовать уже существующие поля и продавать максимальное количество урожая, была разработана облачная платформа для оптимизации процесса и обмена опытом среди фермеров по всему миру.

Про идею


По совместительству я администратор официальных сообществ Microsoft Developer в социальных сетях (если вдруг не встречали: VK, Fb, Twitter, YouTube, Telegram + Telegram Chat). Как я уже писала в начале, многие интересные идеи и проекты остаются без внимания, поэтому предлагаю провести эксперимент. Вы можете делиться в соц. сетях (VK, Twitter) идеями своих проектов с использованием любых технологий MS с тегом #msdevproject, или написать о них в комментариях к этой записи. В зависимости от количества участников, раз в период (например, неделю) мы будем рассказывать в своих сообществах о самом интересном проекте. А по результатам квартала проведём голосование и напишем в блог на Хабр про проект-победитель.

Буду рада услышать ваше мнение по поводу этой идеи и ответить на любые вопросы. :)
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/331930/


Метки:  

Как начинать тушить огонь до пожара или наш список общих принципов IT безопасности

Четверг, 29 Июня 2017 г. 17:20 + в цитатник

Разбирая последствия работы вирусов WannaCry и Petya, а так же то, как они повлияли на наших клиентов, представляем здесь выводы и советы, которые мы можем дать уважаемому сообществу. В основном эти советы будут относится к системным администраторам Windows, а они, как известно, и пострадали от этих вирусов. 

1. Сервера:
  • Уровень леса Active Directory должен быть не менее  2012r2, а пользователи должны находится в группе защищенных пользователей, в этом случае перехват паролей mimikatz невозможен.
  • Доступ к общим файлам должен быть реализован через систему с поддержкой версионности или снапшотов, например, Sharepoint + OneDrive Pro 
  • На гипервизорах должен быть включен secure boot, шифровальщик не сможет запуститься вместо родной ОС. 
  • Настройки почтовых серверов должны запрещать получение исполняемых файлов и неоткрываемых архивов, крайней мерой можно сделать изменение формата писем на plain text, что исключит ссылки в теле писем. 
  • Обновления должны ставится регулярно, не реже раза в две недели. Проведение регламентного обновления ОС серверов, драйверов, прошивок. Это один из самых важных пунктов ИБ, один он очень серьезно усилит вашу защиту. У вас должен быть четкий план выполнения обновлений с указанием даты последнего выполнения и ответственного. 
  • Вынесение системы резервного копирования вне границ текущей среды. Настройка репликации на резервную площадку.  

2. Рабочие станции:
  • Клиентские компьютеры должны работать на Windows 10 LTSB. LTSB имеет меньше потенциально опасных компонентов и, теоретически, не следит за пользователем, хотя запретить телеметрию все равно не помешает.
  • Включить UEFI и secure boot. Как и на серверах шифровальщик не сможет запустится вместо родной ОС. Вирус Petya перегружает машину для начала шифрования. Эти две настройки не дадут ему запустится. Есть большой шанс, что будущие шифровальщики будут использовать эту стратегию.
  • Обновления должны автоматически ставится не только на саму операционную систему, но и на все приложения, особенно на офис. С WSUS или напрямую с серверов Микрософт -  не принципиально. Этот пункт не нуждается в комментариях: если на серверах обновления надо ставить вручную, контролируя процесс чтобы не остановить работу, то на рабочих станциях надо ставить автоматически. 
  • Системные администраторы не должны работать на рабочих станциях с правами доменного  администратора.

3. Общее: 
  • Разделение рабочей среды и интернет серфинга, разделение разных направлений/отделов компании в изолированные среды, например, как указанно здесь
  • Разделение инфраструктурных сред по VLAN, между которыми должна быть настроена фильтрация трафика. В этом случае перекрыв доступ по определённым портам можно остановить сетевое распространение зловреда, как в случае Petya блокируют 135, 139, 445 TCP-порты (служб SMB и WMI)
  • Желательно не пользоваться серверными программами требующим сетевой доступ к общим папкам.  Бизнес софт, такой как 1С должен быть на SQL Server. 
  • На пользовательский станциях и серверах должен быть настроен сетевой фильтр на запрещение исходящего доступа всем приложениям кроме необходимых. Подробная информация как и зачем в статье 
  • На серверах и рабочих станциях должен быть выключена SMBv1, а по возможности и SMBv2  
  • Специализированные и редкие программы, типа M.E.doc интернет банкинг(особенно на Java), должны запускаться на отдельной виртуальной машине с жестко настроенным фаерволом.
  • Не полагайтесь на антивирусы, они создают ложное ощущения безопасности, пример последних вирусов и реакции на них ведущих производителей. Например даже стандартный Windows Defender обновился одними из первых.
  • Способствуйте получению технических сертификатов вашего IT штата. Аутсорсера выбирайте с действующими профессиональными сертификатами по требуемым вами направлениям.
  • Проводите семинары и другие мероприятия для повышения уровня IT осведомленности и IT культуры всех сотрудников, с обязательным приведением реальных примеров и последствий.

 Замечания, дополнения рады обсудить в комментариях.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/331966/


Метки:  

Сравниваем #NotPetya и #Petya — реально ли расшифровать свои файлы?

Четверг, 29 Июня 2017 г. 16:33 + в цитатник


Эксперт Positive Technologies Дмитрий Скляров представил сравнительный анализ нашумевшего вируса-вымогателя NotPetya, атаковавшего компании в этот вторник, с образцом Petya от 2016 года, и поделился своими наблюдениями по поводу возможности восстановления зашифрованных ими данных.

Мы исследовали части двух вирусов, отвечающие за шифрование MFT. Данное шифрование выполняется при наличии у вымогателя прав администратора.

Что делает NotPetya



В момент заражения (еще под Windows) вирус пишет в начало диска код, который будет запущен после перезагрузки, а в определенные сектора — свою конфигурацию, данные для проверки и оригинальный MBR.

В первую очередь, посмотрим на сектор 0x20 диска, который является чем-то вроде «конфига» для конкретной машины. При заражении в сектор 0x20 записываются следующие значения:

— Признак того, что MFT не была зашифрована (значение 0)
— EncryptionKey (случайная последовательность длиной 32 байта)
— Nonce (случайная последовательность длиной 8 байт)
— Personal installation key (случайная последовательность длиной 60 символов из алфавита «123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz»)

Случайные данные получаются через функцию CryptGenRandom, которая считается криптографически стойкой.

В сектор 0x21 записывается 512 байт со значением 0x07.

В сектор 0x22 записывается оригинальный MBR, в котором каждый байт поXORен со значением 0x07.

После первой перезагрузки происходит зашифрование MFT. Перед этим:
— читается сектор 0x20,
— устанавливается признак зашифрования MFT (значение 1),
— EncryptionKey копируется во временный буфер,
— поле с EncryptionKey затирается нулевыми байтами
— сектор 0x20 записывается на диск,
— читается сектор 0x21 (все 0x07),
— его содержимое зашифровывается на EncryptionKey + Nonce,
— сектор 0x21 записывается на диск.

Затем сектора MFT зашифровываются на том же EncryptionKey + Nonce. Код алгоритма шифрования очень похож на алгоритм Salsa20, но есть отличия. Вместо константы «expand 32-byte k» используется константа «-1nvalid s3ct-id». И пока мне не удалось повторить результаты зашифрования на известном ключе. Возможно, у них где-то ошибка, что, похоже, подтверждается этим постом: twitter.com/kryptoslogic/status/880058211516260352

Алгоритм Salsa20 считается стойким.

Когда все зашифровано, машина снова перезагружается, показывается текст с требованием выкупа и предлагается ввести ключ расшифрования.

Ключ должен быть строкой символов из набора «0123456789abcdef» длиной 32. Эта строка прогоняется через некую функцию, принимающую на вход произвольное кол-во байт, и выдающую 32 бата. Предположительно это хеш-функция SPONGENT (надо проверять). Затем выход циклически прогоняется через ту же функцию 128 раз, и этот результат принимается как EncryptionKey. Для проверки правильности ключа делается попытка расшифровать содержимое сектора 0x21, и если там оказывается ожидаемый открытый текст (все 0x07) – запускается процесс расшифрования MFT и восстановления MBR.

Могут ли злоумышленники расшифровать файлы пользователей



На мой взгляд, возможность восстановления после оплаты не была предусмотрена авторами. И вот почему:

  1. Personal installation key, который надо сообщить авторам вируса после выплаты выкупа, никак не связан с EncryptionKey. И то, и другое — случайные данные. Из одного невозможно получить другое, если только злоумышленники не знают что-то про CryptGenRandom. Еще вариант — они должны отправлять пару EncryptionKey + Personal installation key на свой сервер, но о такой активности вроде никто не сообщал (и я ее в коде не видел, хотя это не исключено на 100%).
  2. Если я угадал с хеш-функцией SPONGENT, ключ расшифрования должен быть выходом хеша, и чтобы вычислить то, что должен ввести пользователь, надо этот хеш обратить (129 раз), что вряд ли реализуемо на современной технике.
  3. Энтропия EncryptionKey составляет 32*8 == 256 бит. Энтропия hex-ключа, вводимого пользователем, составляет 32*4 == 128 бит. Любая операция может только уменьшить энтропию. Из 32 шестнадцатеричных символов невозможно получить 32 байта с определенными значениями.


Отличия от Petya образца 9 января 2016



Petya не захотел инфицировать мою тестовую машину. Может ему нужна сеть или что-то еще. Пришлось дампить из памяти.

Я не успел посмотреть код, который формирует сектора, используемые из устанавливаемого вредоносом MBR, но посмотрел скриншоты и код, который выполнится после перезагрузки.

Отличия:

  1. Используются сектора 0x36-0x39 (против 0x20-0x23 у NotPetya).
  2. Большинство сервисных функций (вывод текста, чтение/запись секторов) идентичны Petya.
  3. Присутствует функция и строки для вывода баннера с черепом. В NotPetya очень похожая функция тоже есть, но, вероятно, она никогда не вызывается, а строки обнулены.
  4. Длина Personal installation key составляет 90 символов (15 групп по 6 символов) против 60 у NotPetya. Используя алфавит из 58 символов можно закодировать максимум 527 бит информации (против 351 у NotPetya).
  5. В дампе Petya видны строки secp256k1 и secp192k1, что подталкивает к мысли о том, что Personal installation key является производным от EncryptionKey, вычисленной при помощи криптографии на эллиптических кривых.
  6. Ключ, вводимый пользователем для запуска расшифрования, должен быть строкой из алфавита «123456789abcdefghijkmnopqrstuvwxABCDEFGHJKLMNPQRSTUVWX» длиной 16 символов.
  7. Нет ничего похожего на SPONGENT (или какой-то другой хеш).
  8. В Salsa20 используется оригинальная константа «expand 32-byte k». При этом, код функций почти идентичен, и если код Petya наверняка был сгенерирован компилятором (сработала оптимизация на повторяющихся символах), то в NotPetya, похоже, просто заменили константы.


Petya:



NotPetya



Я бы предположил, что существовал другой образец Petya, на базе которого и был создан NotPetya путем замены констант и строк.
Еще раз повторюсь, что в NotPetya скорее всего не была предусмотрена возможность расшифровки файлов своих жертв, а в Petya с этим все было нормально. Что касается самостоятельного восстановления диска — это может оказаться реальным. Оба вируса имеют очень похожие ошибки реализации алгоритмов шифрования, что приводит к возможности быстрого подбора ключа шифрования и восстановления всех зашифрованных данных. В 2016 году исследователи описали метод восстановления данных, зашифрованных Petya, без уплаты выкупа.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/331962/


Метки:  

Использование GAP-анализа для выявления и согласования задач по проекту

Четверг, 29 Июня 2017 г. 16:10 + в цитатник
Использование GAP-анализаСуществует множество методов оценки эффективности работы компании в целом или на уровне определенных бизнес-процессов, которые включают в себя выявление «узких мест», описание непосредственно проблематики, выявление разницы между желаемым уровнем эффективности и реальной ситуацией. Я уже рассказывал о том, как на практике можно использовать использовать различные методы для выявления проблемных «узких мест», для планирования работы, для взаимодействия с заказчиком и демонстрации предложенных решений. Все это и многое другое вы можете прочитать в статьях Краткое описание BPMN с примером и Знакомство с нотацией IDEF0 и пример использования.

Сейчас я хочу рассказать еще об одной из распространенных сегодня методик – использовании GAP-анализа. В переводе с английского «gap» означает «разрыв», т.е. этот вид анализа можно назвать полностью по-русски анализом разрывов. Здесь в наглядной графической форме показаны графики желаемого развития событий и реального, видны проблемные «узкие места» в бизнес-процессах, что дает возможность руководителю сконцентрироваться на том участке, который действительно требует переосмысления и внедрения изменений, и, как следствие, принятию грамотных управленческих решений.

Для специалистов в сфере бизнес-консалтинга этот инструмент может стать эффективным помощником в следующих вопросах:

  • Определение участка приложения усилий;
  • Постановка задач и планирование действий;
  • Оценка стоимости проведения работ;
  • Согласование необходимых работ и решений с заказчиком.

Но давайте обо всем по порядку. И для начала, нужно разобраться, как вообще строится сотрудничество консалтинговых специалистов и заказчиков. Причем, речь здесь идет о любых видах консалтинга в сфере бизнеса: IT-консалтинг, бизнес-консультирование, оптимизация бизнес-процессов, внедрение различных аппаратных и программных решений и т.д.

Основные этапы работы по проекту


Сотрудничество компании с приглашенными на условиях консалтинга специалистами чаще всего реализуется в одном из двух вариантов – постоянное сервисное обслуживание и некий проект, ограниченный выполнением определенной задачи в определенных сроки. И если при обслуживании просто оговариваются обязанности, которые на постоянной основе и по мере необходимости должны выполнять приглашенные специалисты, то этапы проекта стоит рассмотреть подробнее.

Основные этапы сотрудничества по проекту (Источник “Управленческое консультирование. Введение в профессию” под редакцией Милана Кубра):

  1. Знакомство;
  2. Диагностика;
  3. Планирование действий;
  4. Внедрение;
  5. Завершение сотрудничества.

Если этап знакомства обычно вопросов не вызывает, как и внедрение или завершение сотрудничества, то о диагностике стоит поговорить подробнее. Я считаю диагностику – важнейшим этапом работы, который условно можно также разделить на некую последовательность действий:

  1. Анализ цели;
  2. Анализ проблемы;
  3. Сбор информации;
  4. Обратная связь с клиентом.

Именно грамотный анализ и понимание, что именно нужно сделать и какие результаты должны получить, являются залогом качества на выходе. Далее идет планирование – на основе понимания реальной ситуации и поставленных задач создается последовательность необходимых действий. Утвержденный план реализуют на этапе внедрения. После чего заказчик принимает выполненную работу, и проект завершается.

Почему так важна диагностика?


Для начала, давайте разберемся, что ожидает от диагностики заказчик, и какой результат этого этапа важен для исполнителя-специалиста.

Основная цель диагностики – это получение готового перечня задач, согласованных с клиентом, на основе которых можно будет реализовывать последующие этапы работы.

Для заказчика помимо этого также важна стоимость выполнения работ, которую ни один настоящий специалист не сможет назвать до того, как перечень задач будет точно сформирован. Как известно, услуга без цены – это не услуга, а просто перечень идей. А потому согласованный перечень задач и сумма – одинаково важные составляющие результатов диагностики.

В различных случаях этап диагностики может занимать и менее 1 дня, и 2 недели и даже более. Все зависит от сложности поставленных задач и необходимых работ, относящихся к этому этапу. В отдельных случаях (при выполнении предпроектного обследования и т.д.) этап диагностики может быть очень трудоемким, а результат этого этапа будет отдельной оплачиваемой услугой.

Но в любом случае результаты должны быть следующие:

  1. Список задач (на основе обсуждения с заказчиком или по итогам проведенного обследования ситуации в компании);
  2. Предлагаемые решения и их обоснование;
  3. Цена каждой задачи и срок ее выполнения.

Именно такой перечень необходим заказчику для принятия решения, а исполнителю для реализации следующих этапов работ после согласования всех нюансов.

Виды диагностики


В зависимости от сложности необходимых работ, а также от того, что желает получить заказчик, диагностика может быть как очень простой и даже «символической», так и полноценным и сложным этапом.

Самые распространенные варианты я разделяю следующим образом:

  • Экспресс-диагностика;
  • Разработка технического задания (ТЗ);
  • Предпроектное обследование;
  • GAP-анализ.

Давайте разберем каждый из этих видов подробнее.

Экспресс-диагностика


В этом случае заказчик высылает или озвучивает перечень задач, которые с точки зрения исполнителя являются типовыми. Т.е. исполнитель понимает, каким образом будут реализованы поставленные задачи, может быстро оценить сроки и озвучить цену выполнения работ. Максимум, что может потребоваться в процессе экспресс-диагностики, это проведение интервью с заказчиком или руководителем подразделения, с которым будет проводиться работа, для уточнения тех или иных особенностей работы компании.

Например, может понадобиться уточнить, с какой учетной системой работает компания, на какой CMS реализован сайт, кто является телефонным провайдером или уточнить еще какие-то моменты, способные повлиять на методы реализации и, как следствие, на общую стоимость работ. Этот вид диагностики можно применять в случаях, когда заказчику требуются какие-то виды типовых услуг, которые будут проводиться по шаблону. Длительность этого вида диагностики – до 1 рабочего дня (чаще 1-2 часа). Результат – калькуляция для клиента или выставленный счет к оплате.

Разработка технического задания (ТЗ)


В некоторых случаях клиент высылает готовое ТЗ, тогда диагностика и даже планирование сводятся к минимуму. Но часто специалистам приходится составлять техзадание самостоятельно, на основе интервью с заказчиком и анализа проблем. В этом документе описываются все требования, желаемый результат, полный перечень задач по проекту, необходимых технических решений и т.д. Техническое задание также является основанием для оценки сроков и подсчета стоимости выполнения работ.

ТЗ от заказчика: плюсы и минусы:

  • Плюс получения готового техзадания очевиден – экономия времени специалистов. Готовый документ с перечнем всех задач, которые максимум, могут потребовать небольших корректировок со стороны специалиста, причем, далеко не всегда.
  • Основной минус заключается в том, что заказчики редко являются достаточно компетентными, чтобы составить качественное ТЗ. Если бы у них были необходимые знания, скорей всего, они бы не стали обращаться к сторонним специалистам, за исключением отдельных технических исполнителей с узкой специализацией (специалист 1С, веб-разработчик и т.д.).

Желание заказчика добросовестно описать все свои пожелания иногда выливается даже в анекдотичные случаи. Так, когда-то я получил техническое задание, состоящее из 300 страниц! К нему прилагалось письмо от заказчика, который сетовал, что он никак не может выбрать исполнителя, так как все, к кому он обращался, либо отказываются от работы, либо выставляют счета, явно очень завышенные. Очевидно, что такие ТЗ просто никто не читает, именно потому и возникли перечисленные в письме проблемы.

В результате очень часто заказчик чаще всего в свободной форме перечисляет все свои пожелания, исполнитель составляет техническое задание самостоятельно, после чего этот документ согласоваться с заказчиком (возможно с привлечением экспертов).

Предпроектное обследование


Такое обследование является само по себе отдельным видом работы, сравнительно сложным и трудоемким. В процессе обследования специалист:

  • Изучает работу компании на основе документальной информации;
  • Проводит интервью с руководителем компании, начальниками и сотрудниками различных подразделений;
  • Часто лично бывает на производстве или наблюдает работу склада, отдела продаж, магазина и пр.

В результате обследования сторонний специалист (бизнес-консультант) самостоятельно анализирует существующие бизнес-процессы, их различные этапы, оценивает эффективность работы, выявляет «узкие места». Оценивает возможности тем или иным методом решить задачи, поставленные заказчиком в процессе предварительных переговоров (на этапе знакомства), может выявить какие-то сопутствующие проблемы и продолжить варианты их решения.

В отличие от техзадания, результатом предпроектного обследования становится отчет, в котором отражаются описание окружения, проблематики, существующей ситуации. Также в отчете описывается, что нужно сделать для решения поставленных задач, какие могут быть стратегические предложения и т.д.

Это уже не просто задание, а некий всеобъемлющий документ, который описывает что имеется в реальности, что нужно сделать, что будет на выходе, и сколько это все будет стоить. Такой документ может занимать от 2-3 страниц до 15 и более. Причем, часто предпроектный отчет при всей своей информационной насыщенности оказывается менее объемным, чем техническое задание.

Причина такого явления – отсутствие в отчете предпроектного обследования необходимых в ТЗ технических данных, часто собранных в таблицы: соответствие и описание определенных параметров, например, соответствие полей в CRM и 1С при постановке задачи интеграции, другие таблицы с техническими параметрами. Одно такое описание вместе с комментариями к нему может занимать 3-5 страниц.

В отчете таких подробных описаний технических деталей нет. Они и не нужны клиенту для принятия решения. Зато здесь присутствует все, что необходимо заказчику: выявленная проблематика, подробное описание решения, информация для оценки возможных рисков. Такой документ содержит много полезной информации и решений, но он сам по себе обычно стоит сравнительно дорого.

GAP-анализ


При проведении GAP-анализа составляется некая нотация бизнес-процессов, где отражается одновременно существующая ситуация в реальности и результатом, который хотел бы получить заказчик. Чаще всего результаты GAP-анализа отображаются в графическом виде. Текстовое описание разрывов также возможно, но в этом случае результаты анализа теряют свою наглядность.

Нотации GAP-анализа позволяют в сжатые сроки оценить наиболее проблемные места, так называемые «разрывы», сконцентрировать на них максимум внимания при выборе решения и подробной разработкой этапов его реализации. В некоторых случаях к GAP-анализу для заказчиков также прилагается вариант решения.

Здесь очень важно понимать грань. Часто специалисты, которые сами выявляют «тонкие места» в бизнесе, предлагают решения для реализации бизнес-процессов так, как они видят, что и как должно быть. При работе с GAP-анализом я всегда показываю разрыв между ситуацией реальной и тем, как должно быть с точки зрения заказчика, в его формулировках, в его видении. Т.е. концентрируюсь на решении поставленных задач. И здесь графические нотации нужны именно для понимания заказчиком всех нюансов.

Свое видение того, как должно быть, я могу предлагать заказчикам в рамках предпроектного обследования, так как в таком случае часто заказывают услуги бизнес-консультанта именно для выявления проблем и поиска решений с точки зрения специалиста. Но если поставлена четкая задача, то и работать надо в рамках того, как именно заказчик видит желаемый результат.

Также я обычно предлагаю определенные решения, которые помогут исправить «разрывы», т.е. перейти от того, что есть сейчас, к тем результатам, которые являются желаемыми для заказчика.
Чаще всего подобный вариант анализа проводится в случае работы с определенным сегментом бизнеса, например, описывается отдельно бизнес-процесс отгрузки товара, обработки заявки с сайта и т.д.

Графические решения оформляются в удобном формате, я лично предпочитаю формат BPMN. В любом случае в результате заказчики видят наглядно существующие проблемные места в бизнес-процессе, а также идеи и решения. Заказчик видит в простой и наглядной форме, что вы точно поняли поставленную задачу и предлагаете ее решение.

Преимущества GAP-анализа


О том, что графические нотации – это один из очень удобных и эффективных вариантов работы с заказчиками при обсуждении любых изменений в бизнесе (внедрение IT-программ, оборудования для автоматизации, внедрение изменений в управленческий процесс и т.д.). Графические нотации позволяют избавиться от тысячи слов, а взаимопонимание с заказчиком будет намного выше, чем при отправке многостраничного текстового отчета. При этом экономится время – и ваше, и вашего клиента.

При этом GAP-анализ или, иначе говоря, анализ разрывов – это возможность показать на одной графической диаграмме одновременно и реальную ситуацию, и желаемую, а также увидеть наглядно, на каких именно этапах происходит снижение качества работы. Применение такого вида нотаций удобно и в процессе анализа и поиска эффективных решений поставленной задачи, и на этапе обоснования ваших решений заказчику.

При этом как инструмент в работе GAP-анализ достаточно прост, чтобы им сумел пользоваться не только профессиональный маркетолог, но также и разработчик ПО, занимающийся консалтингом, или любой другой специалист, который предлагает для бизнеса те или иные решения.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/331946/


Метки:  

Безопасная флешка. Миф или реальность

Четверг, 29 Июня 2017 г. 16:08 + в цитатник


Привет, Хабр!


Сегодня мы расскажем вам об одном из простых способов сделать наш мир немного безопаснее.


Флешка — привычный и надежный носитель информации. И несмотря на то, что в последнее время облачные хранилища все больше и больше их вытесняют, флешек все равно продается и покупается очень много. Все-таки не везде есть широкий и стабильный интернет-канал, а в каких-то местах и учреждениях интернет вообще может быть запрещен. Кроме того, нельзя забывать, что значительное количество людей по разным причинам с недоверием относятся к разного рода «облакам».



К флешкам мы все давно уже привыкли и многие из нас помнят, как сначала робко появилась поддержка usb mass storage в Windows 2000, а потом, немного погодя и в Windows Me. Многие понимают, насколько удобно сейчас пользоваться флешками и помнят, как раньше мы все мучались с ненадежными дискетами и непрактичными оптическими дисками.


Автор этих строк примерно в 2004-м году был счастливейшим обладателем симпатичного 128-мегабайтного носителя в моднейшем корпусе с металлической вставкой. Он был моим верным спутником и хранителем ценной для меня информации долгие годы, пока я наконец не потерял его вместе со связкой ключей, к которой он был прицеплен.


И, казалось бы, потеря ключей — это довольно рядовое событие, которое наверняка происходило с каждым, но меня оно заставило срочным образом поменять все замки в доме.


Все дело в том, что в дебрях файловой системы моей флешки лежали сканы моего паспорта, сделанные на всякий случай (кто же знает, когда могут пригодиться сканы паспорта?). А в сочетании с настоящими ключами от реальной квартиры, данные о прописке превращаются в заманчивую возможность даже для тех людей, которые раньше может быть и не помышляли о квартирных кражах.


Чему этот инцидент меня научил?


В первую очередь — бережнее относиться к своим вещам, а во вторую — тому, что любую информацию, которую хоть каким-либо даже косвенным образом можно использовать во вред тебе, необходимо защищать.


Что могут предложить флешки в плане защиты?


Первый, самый очевидный вариант, флешки с аппаратной защитой и без внешнего программного управления, у них обычно клавиатура на корпусе — все в них вроде бы неплохо, но стоят они в большинстве своем совершенно диких денег, может быть за счет своей малосерийности, а может быть и жадности продавцов. Очевидно, ввиду высокой стоимости, особого распространения не нашли.


Второй вариант — навесная программная защита для обычной флешки.


Вариантов много (их можно легко нагуглить), но все они имеют явный плюс в виде почти нулевой стоимости и неизбежные ограничения, связанные с необходимостью установки специального программного обеспечения на компьютер. Но главный минус навесной защиты — это ее слабость.


В чем же слабость — спросите вы.


А дело в том, что любая шифрующая диски программа использует в качестве ключа шифрования последовательность полученную по особому алгоритму, например PBKDF, из пароля, который вы будете использовать для разблокировки. И что-то мне подсказывает, что вряд ли пароль, который придется часто набирать, будет длинным и сложным.


А если пароль короткий и простой, то подобрать его по словарю будет не таким уж и сложным делом.


Злоумышленник, завладев вашей зашифрованной флешкой даже на короткое время, может скопировать с нее криптоконтейнер. Вы так и будете думать, что данные по-прежнему в безопасности. А на самом деле все это время кто-то усиленно подбирает ключ к вашему контейнеру и с каждой минутой подходит все ближе к своей цели.


Поэтому, если вы не враг самому себе, то пароль должен быть «стойким». Но поскольку вам же потом этот же «стойкий» пароль придется многократно набирать — это начинает противоречить утверждению на предыдущей строке.


Что же делать — спросите вы.



Можно ли поставить между защищаемой флеш-памятью и компьютером аппаратную защиту так, чтобы это было удобно, надежно и более-менее доступно? Чтобы хотя бы можно было обойтись без монструозного корпуса с аппаратными кнопками.


Оказывается, да, можно, если вы российский производитель устройств электронной подписи (токенов и смарт-карт).


Безопасная флешка все-таки существует


В устройствах Рутокен ЭЦП 2.0 Flash флеш-память подключена через специальный защищенный контроллер, прошивка которого, карточная операционная система Рутокен, целиком и полностью разработана специалистами компании «Актив» (карточная ОС Рутокен находится в реестре отечественного ПО Минкомсвязи).





В эту прошивку встроен специальный управляющий модуль, который контролирует потоки данных, входящие на флешку и выходящие из нее.


А так как в карточной операционной системе Рутокен испокон веков есть функциональность, обеспечивающая доступ к криптографическим ключам электронной подписи по PIN-кодам, мы реализовали в ней своего рода «вентиль», который может быть открыт, закрыт или открыт в одностороннем режиме (например, только для чтения). Вентиль этот как раз и управляется PIN-кодом. Не зная его, этот вентиль невозможно повернуть.


Теперь представьте, что такой вентиль по умолчанию находится в положении «закрыт». А чтобы открыть его, нужно предъявить PIN-код, который знаете только вы. Причем, вентиль автоматически закрывается при извлечении устройства из компьютера. И количество попыток ввода неправильного PIN-кода жестко ограничено. Причем, устройство защищено от физического взлома и извлечения флеш-карты.


Получается вполне безопасная, надежная и удобная система. Мы реализовали ее в виде небольшой управляющей программы, которая называется — «Рутокен Диск».


Флеш-память устройства Рутокен ЭЦП 2.0, на котором работает «Рутокен Диск», разбита на 2 области: одна служебная, для эмулирующего CD-ROM раздела с управляющей программой; вторая — для пользовательских данных.


При подключении такого устройства к компьютеру вы увидите два физических диска. CD-ROM раздел сразу доступен для чтения и автоматически монтируется, а в операционных системах Windows еще и всплывает симпатичное окошко.





Защищенный раздел выглядит как ридер карт памяти, но без вставленной в него карты, доступа к данным нет.


Однако, запустив приложение и введя простой PIN-код, вы моментально получаете доступ к своим файлам.









Сам токен уже много лет продается и возможность реализации защищенной флешки в нем была изначально. Но сейчас мы написали удобное приложение и если у кого-то из читателей уже есть такое устройство – программное обеспечение «Рутокен Диск» можно загрузить с нашего сайта и инсталлировать на устройство по инструкции.


Вместо резюме:


Если вы доверяете свою информацию обычной флешке — храните ее, как зеницу ока. В случае же с Рутокеном ЭЦП 2.0 Flash и Рутокен.Диском — можно быть гораздо спокойнее за конфиденциальность своих данных. Хотя и полностью расслабляться никогда не стоит.


Заранее отвечу на некоторые вопросы, которые обязательно у кого-нибудь появятся:


  • GUI под macOS и linux — будет.
  • Возможность открывать защищенный раздел в режиме read-only, чтобы без опаски засовывать флешку в самые непредсказуемые места — будет.
  • Кнопочка для безопасного извлечения раздела, чтобы не тыкать мышкой в трей — будет.

Остальные вопросы, пожелания и замечания оставляйте в комментариях — постараемся ответить на все вопросы.



Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/331862/


Метки:  

Baking Boards или секретный ингредиент идеальной Agile кухни

Четверг, 29 Июня 2017 г. 15:52 + в цитатник
Привет, Хабр!

Сегодня мы расскажем о том, как разные команды в JetBrains “готовят” Agile и работают с Agile досками.

За продуктами JetBrains стоит множество команд: продуктовые, команды маркетинга, технической документации, дизайна и многие другие. Каждая команда придерживается собственного процесса, в зависимости от целей, ресурсов и особенности самой команды. На примере нашей компании мы расскажем о том, насколько гибкие бывают процессы, как найти подходящий для своей команды, и как настроить свою Agile доску, на примере YouTrack.

Как “готовит” Scrum Команда YouTrack


Начнем с описания целей, которые ставит перед собой команда, внедряя тот или иной процесс. В нашем случае, цели можно сформулировать так:

  • Перейти на цикл постоянных релизов: мажорный релиз каждые 2-3 месяца.
  • Ускорить процесс разработки.
  • Улучшить качество кода (в рамках постоянных релизов).
  • Вовлечь в процесс всех участников команды.

Наша команда практикует методологию Scrum c некоторыми дополнениями. Спринты длятся две недели. Начинаем работу над спринтом с планирования, а по истечении двух недель проводим демо и ретроспективу. Планирование состоит из двух частей: общей, где присутствует вся команда, включая маркетологов, технических писателей и инженеров тех. поддержки, и технической. В рамках общей части мы обсуждаем истории, которые собираемся взять на спринт, а в технической части программисты разбивают их на подзадачи. Каждый день мы проводим стендап, на котором каждый член команды в течение минуты рассказывает, над чем работает, и поднимает вопрос для обсуждения, после чего мы смотрим на состояние задач на доске и обсуждаем возникшие вопросы.

Колонки на доске разбиты по состоянию задач: open, in progress/to be discussed и fixed. Если задача находится в прогрессе более чем три дня, мы разбиваем ее на подзадачи. Мы ввели это правило, чтобы разработчик не “зависал” на задаче и двигался дальше. Ежедневно мы получаем запросы в тех. поддержку. Чтобы мониторить прогресс по тем, которые требуют внимания разработчиков, на доске есть отдельный swimlane для запросов от пользователей.



Планирование задач мы ведем в бэклоге. В YouTrack бэклог — это сохраненный поиск, который можно открыть прямо на доске и приоритизировать задачи вручную. Благодаря тому, что вся команда активно вовлечена в процесс и следит за состоянием задачам на доске, нам удается их правильно приоритезировать, оперативно решать проблемы пользователей, чинить важные баги и разрабатывать новую функциональность. Переход на цикл постоянных релизов позволил нам получать фидбэк от внутренних и внешних пользователей на самом раннем этапе (в рамках экспериментальной функциональности) и вносить нужные изменения на этапе разработки, а не после релиза.

Как команда дизайна создает материалы для 23 продуктов


Речь идет о команде дизайна, которая обеспечивает визуальное представление всех наших продуктов на рынке, начиная с сайта, маркетинговых материалов, и заканчивая печатными материалами. UI/UX дизайнеры входят в продуктовые команды и являются частью их процессов.
В основном дизайнеры получают задания от коллег (PMM) из продуктовых команд, которым нужен дизайн чего-то, желательно вчера. При таком процессе важно отслеживать поступление новых задач и равномерно распределять их внутри команды.

Цели:
  • Взаимодействовать со всеми продуктовыми командами.
  • Равномерно распределять задачи.
  • Следить за поступлением новых задач.
  • Приоритезировать задачи в зависимости от срока исполнения.

Спринты на доске соответствуют сезонам: зима, весна, лето, осень. Все новые созданные задачи автоматически попадают на доску на текущий спринт. Задачи объединяются в свимлэйны по членам команды. Назначать исполнителя на задачу может только руководитель команды. Это правило реализуется при помощи custom workflow. Таким образом, новая задача сначала попадает в свимлейн uncategorized, а “переплывает” в свимлейн определенного дизайнера, как только его назначили исполнителем.



Каждый дизайнер работает в рамках своего свимлэйна, а руководитель, окинув взглядом доску, оценивает загруженность каждого сотрудника и равномерно распределяет задачи. Благодаря такому процессу задачи не задерживаются в состоянии open и завершаются в срок, а каждый заказчик может легко отследить место своей задачи в очереди дизайнера.

Как работают продуктовые менеджеры по маркетингу YouTrack и Hub


Маркетологи в JetBrains взаимодействуют с множеством коллег из разных команд. Чтобы следить за исполнением своих задач, необходимо держать около 20 проектов на доске: маркетинг, дизайн, локализация, веб, аналитика, интернет-маркетинг и так далее.

Цели:
  • Следить за своими задачами в разных проектах.
  • Вовремя давать обратную связь исполнителям.
  • Приоритезировать задачи в зависимости от дедлайна.

Маркетинговая доска представляет собой набор задач из 20 проектов, объединенных в свимлейны по разным активностям. Например, релиз продукта, рекламная кампания, исследование, серия блог постов или видео, и т. д. В качестве колонок мы используем значения поля Состояние из разных проектов. Поскольку набор состояний может отличаться от проекта к проекту, добавить на доску нужно все значения, которые важно отслеживать, а затем объединить несколько состояний в одну колонку. Таким образом у нас на доске 5 колонок. Свимлейны мы определяем по типу задачи. Каждая задача типа Epic или Feature образует свимлейн. Задачи, которые не относятся к крупной активности, попадают в нижнюю часть доски (uncategorized cards).



Когда коллеги из других проектов начинают работать над нашей задачей, они меняют ее состояние, задача перемещается по доске и мы следим за ее прогрессом. Если необходима обратная связь или задача выполнена и ждет проверки с нашей стороны, ее переводят в состояние in review. Таким образом работа над задачами становится более продуктивной и мы лишний раз не “дергаем” коллег. Для нас же ключевым моментом является визуализация наших активностей: в каждый момент времени наглядно видно, что сделано, а что осталось для завершения каждой активности. Например, глядя на свимлейн с рекламной кампанией, я сразу могу сказать, что нам не хватает только баннеров для запуска.

Как готовят Kanban Команды CLion и AppCode


Эти команды придерживаются методологии Kanban. Их процессы очень похожи между собой, потому что во многом их задачи пересекаются и работают над ними одни и те же сотрудники.

Цели:
  • Планировать задачи в условия частых релизов (3 раза в год).
  • Вовлечь в процесс всех членов команды.
  • Управлять нагрузкой на команду на всех стадиях разработки.
  • Визуально приоритезировать задачи.

Команды работают с Kanban доской без спринтов. Однако задачи объединены в свимлейны по приоритету задач (general и priority). Колонки отражают этапы разработки. Планирование задач ведется в бэклоге, а их приоритет обсуждается на ежедневных стендапах. В каждой колонке заданы ограничения на WIP (количество задач в колонке). Это помогает команде контролировать нагрузку на каждом этапе и визуализировать проблемы с нагрузкой на каждом шаге. Если количество задач превышает допустимое значение, команда не начинает работу над новыми задачами, пока не справится с текущей нагрузкой.



Чтобы автоматизировать процесс, команды используют набор custom workflow. Например, если разработчик перетащил задачу из бэклога на доску, он автоматически назначается исполнителем задачи. Если задача переходит в колонку QA, то она автоматически назначается на QA-инженера.

Персональная доска продуктового менеджера по маркетингу IntelliJ IDEA


Цели:
  • Взаимодействовать с различными командами.
  • Следить за своими маркетинговыми активностями.
  • Управлять собственными задачами.

Андрею, как и остальным нашим PMM, необходимо следить за задачами во многих проектах, чтобы координировать различные активности для продвижения IntelliJ IDEA.
Задачи на доске объединены в свимлейны по проектам. Колонок на доске нет, точнее все состояния задачи объединены в одну колонку. Настроить доску таким образом можно, выбрав шаблон “Персональная доска”.



Андрей также использует расширение для Chrome “YouTrack Tweaks”, которое позволяет добавлять на карточку поля и раскрашивать их в разные цвета. Расширение также позволяет использовать доску в режиме Darcula. Карточки не перемещаются по доске, а просто присутствуют на ней до тех пор, пока задача не выполнена. Выполненные задачи просто пропадают с доски. Такой процесс позволяет сконцентрировать на открытых задачах и отслеживать прогресс по своим задачам в разных проектах.

Итак, каких же правил нужно придерживаться, чтобы наладить процесс в своей команде? Что общего между всеми этими примерами?

  1. Agile — это игра, а мы все любим играть. В этой игре важно установить правила и обязательно их соблюдать.
  2. Agile вовлекает каждого члена команды, дает возможность влиять на принятие решений и совершенствовать процесс. Участие в принятии решений накладывает ответственность за решение, в той или иной степени. Это заставляет серьезнее относиться к своей работе и работе команды в целом.
  3. Каждый участник Agile команды способен самоорганизовываться.
  4. Agile процесс очень динамичен, его нельзя зафиксировать, и необходимо постоянно улучшать.

И помните: продукт, который вы выбираете для управления задачами, должен быть гибким настолько, чтобы подстроиться под ваш процесс.

Если тема вас заинтересовала, то вы можете прочитать всю серию статей или посмотреть видео с подробной инструкцией по настройке досок в нашем блоге.

Ваша команда YouTrack JetBrains
The Drive to Develop
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/331954/


Дни открытых дверей перед запуском нового курса по Python

Четверг, 29 Июня 2017 г. 15:40 + в цитатник
Мы в OTUS снова рады открыть свои двери 30 июня и 1 июля в 20:00 по Москве для нового набора — теперь по курсу углубленного изучения Python.
image

Формат проведения — онлайн, подключайтесь из любой точки мира!

На Дне открытых дверей познакомимся с преподавателем курса Станиславом Ступниковым — программистом Mail.ru с более чем 6-ти летним стажем промышленной разработки, в том числе для крупных государственных заказчиков и более 4-х лет преподавания студентам МГТУ им. Баумана, который ответит на все вопросы касаемо программы курса, и не только.
Также расскажем почему OTUS больше, чем просто образовательный проект, какие перспективы готовы предложить выпускникам компании-партнеры, обсудим все подробности обучения, а также ответим на все интересующие вопросы.
В планах курса по Python 5 месяцев обучения с домашними заданиями, являющимися иллюстрацией навыков и знаний для новых работодателей, с выпускным проектом, который можно будет представить в качестве портфолио, масса новых знаний, приятное и полезное общение с преподавателем и одногруппниками.
А еще по доброй традиции среди успешно прошедших тест мы разыграем бесплатные места в новой группе!
Проходите тест и регистрируйтесь на День открытых дверей.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/331956/


Метки:  

[Из песочницы] Пример создания WCF-сервиса, работающего внутри службы Windows

Четверг, 29 Июня 2017 г. 15:39 + в цитатник
Windows Communication Foundation – программная платформа от Microsoft для создания, настройки и развертывания распределенных сетевых сервисов. WCF-runtime и его пространство имен System.ServiceModel, представляющее его главный программный интерфейс, это преемник технологий создания распределенных систем, успешно применяемых разработчиками для создания распределенных приложений на платформе Windows в последнее десятилетие. Разберём тестовый пример создания WCF-сервиса.

Открываем Visual Studio 2015 и создаём новый проект типа Class Library. Проект назовём WCFMyServiceLibrary.




Файл Class1.cs переименуем в MyService.cs и добавим ещё один класс, файл для которого назовём IMyService.cs.

Добавим ссылку на сборку System.ServiceModel.

В файле IMyService.cs опишем интерфейс:
using System.ServiceModel;

namespace WCFMyServiceLibrary
{

[ServiceContract]
public interface IMyService
  {
    [OperationContract]
    string Method1(string x);
    [OperationContract]
    string Method2(string x);
  }
}


В файле MyService.cs опишем реализацию интерфейса:
namespace WCFMyServiceLibrary
{
  public class MyService : IMyService
  {
    public string Method1(string x)
    {
      string s = $"1 You entered: {x} = = = 1";
      return s;
    }

    public string Method2(string x)
    {
      string s = $"2 you entered: {x} = = = 2";
      return s;
    }
  }
}

На этом разработка сервиса завершена. Переходим к созданию службы Windows, которая будет контейнером для данного сервиса.

В том же решении (Solution) создадим новый проект типа «Служба Windows». Называем проект WindowsServiceHostForMyService.



Затем файл Service1.cs (только что созданного проекта) переименуем в MyService.cs. В этот проект добавим ссылку на сборку System.ServiceModel, а также не забываем указывать в файле MyService.cs директивы:

using System.ServiceModel;
using System.ServiceModel.Description;

В классе MyService добавляем новый член:

private ServiceHost service_host = null;

Также необходимо добавить ссылку на проект WCFMyServiceLibrary, который находится в этом же решении:



Затем в классе MyService изменим метод OnStart таким образом, чтобы в этом методе добавлялись конечные точки нашего сервиса (endpoint):

метод OnStart
    protected override void OnStart(string[] args)
    {
      if (service_host != null) service_host.Close();

      string address_HTTP = "http://localhost:9001/MyService";
      string address_TCP = "net.tcp://localhost:9002/MyService";

      Uri[] address_base = { new Uri(address_HTTP), new Uri(address_TCP) };
      service_host = new ServiceHost(typeof(WCFMyServiceLibrary.MyService), address_base);

      ServiceMetadataBehavior behavior = new ServiceMetadataBehavior();
      service_host.Description.Behaviors.Add(behavior);

      BasicHttpBinding binding_http = new BasicHttpBinding();
      service_host.AddServiceEndpoint(typeof(WCFMyServiceLibrary.IMyService), binding_http, address_HTTP);
      service_host.AddServiceEndpoint(typeof(IMetadataExchange),   MetadataExchangeBindings.CreateMexHttpBinding(), "mex");

      NetTcpBinding binding_tcp = new NetTcpBinding();
      binding_tcp.Security.Mode = SecurityMode.Transport;
      binding_tcp.Security.Transport.ClientCredentialType = TcpClientCredentialType.Windows;
      binding_tcp.Security.Message.ClientCredentialType = MessageCredentialType.Windows;
      binding_tcp.Security.Transport.ProtectionLevel = System.Net.Security.ProtectionLevel.EncryptAndSign;
      service_host.AddServiceEndpoint(typeof(WCFMyServiceLibrary.IMyService), binding_tcp, address_TCP);
      service_host.AddServiceEndpoint(typeof(IMetadataExchange),  MetadataExchangeBindings.CreateMexTcpBinding(), "mex");

      service_host.Open();
    }

Затем реализуем остановку сервиса в методе OnStop:

    protected override void OnStop()
    {
      if (service_host != null)
      {
        service_host.Close();
        service_host = null;
      }
    }

Затем в Обозревателе решения — двойной клик на файле MyService.cs (проекта WindowsServiceHostForMyService) откроет этот файл в режиме конструктора (Design Mode).



На пустом пространстве вызываем контекстное меню (щелчок правой кнопкой мыши) и выбираем «Добавить установщик».



При этом будет создан новый класс ProjectInstaller.cs
Переименуем файл ProjectInstaller.cs в MyServiceInstaller.cs.
При этом выйдет окно с вопросом, следует ли переименовать зависимые объекты – отвечаем «Да».

Добавим в файл ссылку

using System.ServiceProcess;

Затем изменим код конструктора класса MyServiceInstaller:

    public MyServiceInstaller()
    {
      // InitializeComponent();
      serviceProcessInstaller1 = new ServiceProcessInstaller();
      serviceProcessInstaller1.Account = ServiceAccount.LocalSystem;
      serviceInstaller1 = new ServiceInstaller();
      serviceInstaller1.ServiceName = "WindowsServiceHostForMyService";
      serviceInstaller1.DisplayName = "WindowsServiceHostForMyService";
      serviceInstaller1.Description = "WCF Service Hosted by Windows NT Service";
      serviceInstaller1.StartType = ServiceStartMode.Automatic;
      Installers.Add(serviceProcessInstaller1);
      Installers.Add(serviceInstaller1);
    }

Заметим, что вызов метода InitializeComponent() мы заблокировали с помощью комментария.
На этом разработка службы Windows завершена. Собираем всё решение (Build Solution) и переходим к следующему этапу – установка службы Windows.

Для установки нашей службы создадим bat-файл (с произвольным названием, например Install_Windows_Service.bat) следующего содержания:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe WindowsServiceHostForMyService.exe

Нужно скопировать этот bat-файл в ту же папку, где находится скомпилированный файл WindowsServiceHostForMyService.exe (вам нужно заранее продумать, в какой папке будет лежать этот файл, который будет всегда запущен в качестве службы Windows).

Запускаем bat-файл, после чего наша программа WindowsServiceHostForMyService.exe будет установлена в качестве службы Windows.

Запустим эту службу с помощью стандартной программы управления службами.

Следующий этап – разработка клиентского приложения для использования предоставляемых сервисом услуг.

Для этого прежде всего нужно организовать так называемый «переходник» — Service Proxy – набор настроек, описывающих сервис для клиентского приложения.

Воспользуемся для этого стандартной утилитой SvcUtil.exe. Создадим файл Generate_Proxy.bat следующего содержания

SvcUtil  http://localhost:9001/MyService  /out:MyServiceProxy.cs  /config:App.config

Запустим этот файл (стандартная утилита SvcUtil.exe находится в папке C:\Program Files\Microsoft SDKs\Windows\v7.0\Bin).

Этот файл нужно запустить во время работы нашего сервиса, т.е. в данном случае, после успешного запуска службы Windows WindowsServiceHostForMyService.

В случае успешного запуска, программа SvcUtil.exe сгенерирует 2 файла — MyServiceProxy.cs и App.config.

Эти файлы необходимо добавить для клиентского приложения, чтобы это приложение могло вызывать методы нашей службы (чуть ниже вы узнаете, что файл App.config я решил не добавлять — обойдёмся и без него).

Примечание. Аналогичного результата можно было добиться, запустив

SvcUtil net.tcp://localhost:9002/MyService /out:MyServiceProxy.cs /config:App.config

Т.е. можно запускать эту утилиту, указав только одну конечную точку, либо http либо net.tcp.

В том же решении (Solution) создадим обычное приложение Windows Forms. Назовем его WindowsFormsApplication1



Добавим в этот проект ссылку на System.ServiceModel и, конечно же,

using System.ServiceModel в файле формы.

Добавим в этот проект файл MyServiceProxy.cs (именно его мы сгенерировали утилитой SvcUtil.exe). При этом следует добавить в файл MyServiceProxy.cs следующие строки:

namespace ServiceReference1
{
  using System.Runtime.Serialization;
  using System;
  … затем идёт содержимое файла MyServiceProxy.cs …
и конечно, не забываем поставить завершающую скобку для namespace
}

После этого, мы сможем ссылаться на класс MyServiceClient (этот класс создан программой SvcUtil.exe), указав в файле формы директиву.

 using ServiceReference1;

Пример готового файла MyServiceProxy.cs (комментарии удалены):
namespace ServiceReference1
{
  using System.Runtime.Serialization;
  using System;

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
[System.ServiceModel.ServiceContractAttribute(ConfigurationName="IMyService")]
public interface IMyService
{
    
 [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IMyService/Method1", ReplyAction="http://tempuri.org/IMyService/Method1Response")]
    string Method1(string x);
    
    [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IMyService/Method2", ReplyAction="http://tempuri.org/IMyService/Method2Response")]
    string Method2(string x);
}

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
public interface IMyServiceChannel : IMyService, System.ServiceModel.IClientChannel
{
}

[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
public partial class MyServiceClient : System.ServiceModel.ClientBase, IMyService
{
    public MyServiceClient()
    {
    }
    
    public MyServiceClient(string endpointConfigurationName) : 
            base(endpointConfigurationName)
    {
    }
    
    public MyServiceClient(string endpointConfigurationName, string remoteAddress) : 
            base(endpointConfigurationName, remoteAddress)
    {
    }
    
    public MyServiceClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) : 
            base(endpointConfigurationName, remoteAddress)
    {
    }
    
    public MyServiceClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : 
            base(binding, remoteAddress)
    {
    }
    
    public string Method1(string x)
    {
        return base.Channel.Method1(x);
    }
    
    public string Method2(string x)
    {
        return base.Channel.Method2(x);
    }
}
}


Поступим неординарно – и не будем добавлять файл App.Config в проект клиента!

Затем набросаем на форму 3 кнопки, текстовое поле textBox1 (пользователь вводит сюда строку для отправки на сервер) и поле richTextbox1 (имитация подсистемы сообщений нашего приложения – именно в это поле будут поступать сообщения от программы, в том числе и те, что вернул нам сервис)

Кнопка btn_Start – создаёт клиента
Кнопка btn_Send – отправляет сервису текстовую строку из текстового поля
Кнопка btn_Close – удаляет клиента из памяти и закрывает приложение

Код формы:
using System;
using System.ServiceModel;
using System.Windows.Forms;
using ServiceReference1;

namespace WindowsFormsApplication1
{

  public partial class Form1 : Form
  {

    MyServiceClient client = null;

    public Form1()
    {
      InitializeComponent();
    }

    private void Print(string text)
    {
      richTextBox1.Text += text + "\n\n";
      richTextBox1.SelectionStart = richTextBox1.Text.Length;
      richTextBox1.ScrollToCaret();
    }

    private void Print(Exception ex)
    {
      if (ex == null) return;
      Print(ex.Message);
      Print(ex.Source);
      Print(ex.StackTrace);
    }

    private void Create_New_Client()
    {
      if (client == null)      
        try { Try_To_Create_New_Client(); }
        catch (Exception ex)
        {
          Print(ex);
          Print(ex.InnerException);
          client = null;
        }
      else
      {
        Print("Cannot create a new client. The current Client is active.");
      }
    }

    private void Try_To_Create_New_Client()
    {
      try
      {

        NetTcpBinding binding = new NetTcpBinding(SecurityMode.Transport);

        binding.Security.Message.ClientCredentialType = MessageCredentialType.Windows;
        binding.Security.Transport.ClientCredentialType = TcpClientCredentialType.Windows;
        binding.Security.Transport.ProtectionLevel = System.Net.Security.ProtectionLevel.EncryptAndSign;

        string uri = "net.tcp://192.168.1.2:9002/MyService";

        EndpointAddress endpoint = new EndpointAddress(new Uri(uri));

        client = new MyServiceClient(binding, endpoint);

        client.ClientCredentials.Windows.ClientCredential.Domain = "";
        client.ClientCredentials.Windows.ClientCredential.UserName = "Vasya";
        client.ClientCredentials.Windows.ClientCredential.Password = "12345";

        Print("Creating new client ....");
        Print(endpoint.Uri.ToString());
        Print(uri);

        string test = client.Method1("test");

        if (test.Length < 1)
        {
          throw new Exception("Проверка соединения не удалась");
        }
        else
        {
          Print("test is OK  ! " + test);
        }

      }
      catch (Exception ex)
      {
        Print(ex);
        Print(ex.InnerException);
        client = null;
      }
    }

    private void btn_Start_Click(object sender, EventArgs e)
    {
      Create_New_Client();
    }

    private void btn_Send_Click(object sender, EventArgs e)
    {
      Print("sending message . . .");
      string s = textBox1.Text;
      string x = "";
      if (client != null)
      {
        x = client.Method1(s);
        Print(x);
        x = client.Method2(s);
        Print(x);
      }
      else
      {
        Print("Error! Client does not exist!");
      }
    }

    private void btn_Close_Click(object sender, EventArgs e)
    {
      if (client != null)
      {
        Print("Closing a client ...");
        client.Close();
        client = null;
      }
      else
      {
        Print("Error! Client does not exist!");
      }
      this.Close();
    }
  }
}


Компилируем и запускаем с другой машины из той же сети – и тестируем сервис, нажав сначала btn_Start, а затем отправляя сервису сообщения нажатием btn_Send.



Заметим, что в данном примере на клиенте мы совсем не использовали конечную точку

http://localhost:9001/MyService
а работали только с

net.tcp://localhost:9002/MyService
(вы легко сможете это сделать самостоятельно – раз уж вам net.tcp по плечу, то уж http-то с закрытыми глазами сделаете).

Кроме того, мы не использовали файл App.config, создав на клиенте конечную точку не с помощью настроек, а с помощью кода C#. Причины тому – субъективные – автор не любит возиться с XML-настройками, а по возможности всё делает явно в коде. Спасибо за внимание!

Лирическое отступление. Автор статейки познакомился с языком C# в марте сего года, первое приложение на C# написал в мае (до этого много лет формошлёпил на Delphi и даже на MS Access).
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/331952/


Метки:  

Что делать, если в PK Identity закончились значения?

Четверг, 29 Июня 2017 г. 15:10 + в цитатник
Иногда, при дизайне БД разработчики недооценивают масштабы проекта. А потом, проект выстреливает и становится высоконагруженным. Затем, в какой-то момент, кто-то замечает, что в качестве первичного ключа большой таблицы выбран identity типа INT, с ограничением 2,147,483,647.

Изначально кажется, что 2 миллиарда записей (records) – это много. Но если, у вас ежедневно добавляется 10 млн. новых записей? И уже израсходовано более 1 млрд. значений? У вас приложение, работающее в режиме 24/7? То у вас осталось всего 114 дней, чтобы это исправить тип первичного ключа. Это не так уж и много, если у вас используется значение ключа как в веб-приложении, так и в клиентском.


Если описанная ситуация вам знакома, и Вы заметили эту прискорбную деталь – у Вас заканчиваются значения первичного ключа – слишком поздно, то данная статья – для Вас. В нашей статье Вы найдете скрипты, которые приведены для таблицы TableWithPKViolation, в которой поле TableWithPKViolationId вызывает проблему.

В худшем случае, Вы столкнулись с ошибкой “Arithmetic overflow error converting IDENTITY to data type int”. Это означает, что значения первичного ключа уже закончились, и Ваше приложение перестало работать. В данном случае Вы можете использовать следующие решения:

  1. Поменять тип первичного ключа на BIGINT. Всем и каждому понятно, что лучший вариант — это сесть в машину времени и изменить INTна BIGINT там, в прошлом. Но Вы можете сделать это и сейчас, если поле TableWithPKViolationId не используется в серверном и клиентском приложении, то у вас есть возможность оперативно и безболезненно поменять тип. Сделайте это, и не тратьте время на остальную статью. Обратите внимание, что если в Вашей таблице больше 1 млрд. записей, то изменение будет применяться, т.е. может занять больше 3 часов, в зависимости от мощности вашего сервера, и потребует дополнительного места в логе транзакций (если можете, переключитесь на модель Recovery Mode в Simple). Скрипт для изменения следующий:

    ALTER TABLE TableWithPKViolation ALTER COLUMN TableWithPKViolationId BIGINT;

    Если данный способ Вам недоступен, рекомендуем запланировать переход ключа на BIGINT как можно быстрее.

  2. Использовать отрицательные значения. Обычно, при использовании identity используется по умолчанию IDENTITY(1,1), когда значение подходит к 2 миллиардам записей, Вы можете сделать сброс начального значения, используя следующую команду:

    DBCC CHECKIDENT (TableWithPKViolation, - 2147483647, reseed) 

    и таким образом получить гораздо больше времени для перехода на BIGINT. Единственное неудобство данного решения – это отрицательные значения первичного ключа. Проверьте, что Ваша бизнес-логика допускает отрицательные значения. Пожалуй, это самое легкое решение.

  3. III. Сформировать таблицу с неиспользованными значениями. Посчитайте значения, которые пропущены, и сформируйте таблицу со списком неиспользованных значений. Это даст Вам дополнительное время для перехода на BIGINT.

    Данный способ Вам подойдет, если Вы не опираетесь на порядок записей в таблице, то есть не используете ORDERY BY Id. Либо, таких мест не много, и Вы можете изменить порядок сортировки, основываясь на другом поле, например, на дате добавления записи.

    Сформировать таблицу с неиспользованными значениями можно двумя способами:

    Способ А. Пропущенные значения.

    Когда вы используете Identity, у вас всегда есть пропущенные значения, так как, значения резервируются при начале транзакции, и, в случае ее отката, следующей транзакции присваивается новое, следующее за зарезервированным, значение первичного ключа. Зарезервированное значение, которое было сформировано для отмененной транзакции, так и останется неиспользованным. Данные неиспользованные значения можно сформировать в отдельную таблицу и применить, используя код, который будет приведен ниже.

    Способ В. Удаленные значения.

    Если Вы обычно удаляете записи из таблицы, в которой заканчиваются значения первичного ключа, то все удаленные значения можно использовать повторно в качестве свободных. Приведу пример кода для этого варианта ниже.

    Исходная таблица TableWithPKViolation.

    CREATE TABLE [dbo].[TableWithPKViolation](
    	[TableWithPKViolationId] [int] IDENTITY(1,1) NOT NULL
    ) ON [PRIMARY]


    1. Создаем таблицу для хранение свободных ID
    10-CreateNewId.sql

    
    CREATE TABLE [dbo].[NewIds](
    	[NewId] [int] NOT NULL,
    	[DateUsedUtc] [datetime] NULL
    ) ON [PRIMARY]
    

    Далее, в зависимости от способа:

    Для генерации последовательности способом А. Пропущенные значения:

    2. Генерируем последовательность из пропущенных идентификаторов
    20-GenerateGaps.sql
    «Option1 FindGaps\20-GenerateGaps.sql»

    
    CREATE PROCEDURE [dbo].[spNewIDPopulateInsertFromGaps]
    	@batchsize INT = 10000,
    	@startFrom INT = NULL
    AS
    BEGIN
    	SET NOCOUNT ON;
    	SET XACT_ABORT ON;
    
    	IF @startFrom IS NULL
    	BEGIN
    		SELECT @startFrom = MAX([NewId])
    		FROM dbo.NewIds; 
    	END;
    
    	DECLARE @startId INT = ISNULL(@startFrom,0);
    	DECLARE @rowscount INT = @batchsize;
    	DECLARE @maxId INT;
    
    	SELECT @maxId = MAX(TableWithPKViolationId)
    	FROM dbo.TableWithPKViolation;
    
    	WHILE @startId < @maxId
    	BEGIN
    		INSERT INTO dbo.NewIds
    		([NewId])
    		SELECT id
    		FROM (
    			SELECT TOP (@batchsize)
    				@startId + ROW_NUMBER() 
                                    OVER(ORDER BY TableWithPKViolationId) AS id
    			FROM dbo.TableWithPKViolation --any table where you have @batchsize rows
    			) AS genids
    		WHERE id < @maxId
    			AND NOT EXISTS 
    			  (
    			   SELECT 1 
    			   FROM [dbo].[TableWithPKViolation] as Tb WITH (NOLOCK)
    			   WHERE Tb.TableWithPKViolationId = genids.id
    			  ); 
    
    		SET @rowscount = @@ROWCOUNT;
    				
    		SET @startId = @startId + @batchsize;
    
    		PRINT CONVERT(VARCHAR(50),GETDATE(),121)+' '+ CAST(@startId AS VARCHAR(50));
    	END
    END
    

    Для генерации последовательности способом B Удаленные значения:
    2. Создаем таблицу для генерации последовательности и заполняем ее данными от 1 до 2,147,483,647
    15-CreateInt.sql

    
    CREATE TABLE [dbo].[IntRange](
    	[Id] [int] NOT NULL
    ) ON [PRIMARY]
    

    20-GenerateInt.sql

    
    CREATE PROCEDURE [dbo].[spNewIDPopulateInsert]
    	@batchsize INT = 10000,
    	@startFrom INT = NULL
    AS
    BEGIN
    	SET NOCOUNT ON;
    	SET XACT_ABORT ON;
    
    	IF @startFrom IS NULL
    	BEGIN
    		SELECT @startFrom = MAX(id)
    		FROM dbo.IntRange; 
    	END;
    
    	DECLARE @startId INT = ISNULL(@startFrom,0);
    	DECLARE @rowscount INT = @batchsize;
    	DECLARE @maxId INT = 2147483647;
    
    	WHILE @rowscount = @batchsize
    	BEGIN
    		INSERT INTO dbo.IntRange
    		(id)
    		SELECT id
    		FROM (
    			SELECT TOP (@batchsize)
    				@startId + ROW_NUMBER() 
                                    OVER(ORDER BY TableWithPKViolationId) AS id
    			FROM dbo.TableWithPKViolation --any table where you have @batchsize rows
    			) AS genids
    		WHERE id < @maxId; 
    
    		SET @rowscount = @@ROWCOUNT;
    				
    		SET @startId = @startId + @rowscount;
    
    		PRINT CONVERT(VARCHAR(50),GETDATE(),121)+' '+ CAST(@startId AS VARCHAR(50));
    	END
    END
    

    25-PopulateRange.sql

    
    exec dbo.spNewIDPopulateInsert
    	@batchsize = 10000000
    

    В скрипте используется таблица TableWithPKViolation для генерации последовательности, на самом деле, вы можете использовать любой, наиболее любимый способ для этого, в том числе, последовательность встроенную в MS SQL (Sequence), данный способ был выбран, потому что работал быстрее по сравнению с другими.

    30-CreateIndexOnInt.sql

    
    ALTER TABLE [dbo].[IntRange] ADD PRIMARY KEY CLUSTERED 
    (
    	[Id] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = OFF) ON [PRIMARY]
    

    и заполняем ее
    50-GenerateNewId.sql

    
    CREATE PROCEDURE [dbo].[spNewIDPopulateInsertFiltered]
    	@batchsize INT = 10000,
    	@startFrom INT = NULL,
    	@endTill INT = NULL
    AS
    BEGIN
    	SET NOCOUNT ON;
    	SET XACT_ABORT ON;
    
    	IF @startFrom IS NULL
    	BEGIN
    		SELECT @startFrom = MAX([NewId])
    		FROM dbo.NewIds; 
    	END;
    
    	DECLARE @startId INT = ISNULL(@startFrom,0);
    	DECLARE @rowscount INT = @batchsize;
    	DECLARE @maxId INT = ISNULL(@endTill,2147483647);
    	DECLARE @endId INT = @startId + @batchsize;
    
    	WHILE @startId < @maxId
    	BEGIN
    		INSERT INTO [NewIds] 
    		([NewId])
    		SELECT IR.id
    		FROM [dbo].[IntRange] AS IR
    		WHERE IR.id >= @startId
    			AND IR.id < @endId
    			AND NOT EXISTS 
    			  (
    			   SELECT 1 
    			   FROM [dbo].[TableWithPKViolation] as Tb WITH (NOLOCK)
    			   WHERE Tb.TableWithPKViolationId = IR.id
    			  );
    
    		SET @rowscount = @@ROWCOUNT;
    				
    		SET @startId = @endId;
    		SET @endId = @endId + @batchsize;
    
    		IF @endId > @maxId 
    			SET @endId = @maxId;
    
    		PRINT CONVERT(VARCHAR(50),GETDATE(),121)+' '+ CAST(@startId AS VARCHAR(50));
    	END
    END
    

    55-ExecGeneration.sql

    
    -----Run each part in separate window in parallel
    -----
    
    --part 1
    exec dbo.spNewIDPopulateInsertFiltered @batchsize = 10000000, 
    @startFrom = 1, @endTill= 500000000
    --end of part 1
    
    --part 2
    exec dbo.spNewIDPopulateInsertFiltered @batchsize = 10000000, 
    @startFrom = 500000000, @endTill= 1000000000
    --end of part 2
    
    --part 3
    exec dbo.spNewIDPopulateInsertFiltered @batchsize = 10000000, 
    @startFrom = 1000000000, @endTill= 1500000000
    --end of part 3
    
    --part 4
    DECLARE @maxId INT
    
    SELECT @maxId = MAX(TableWithPKViolationId)
    FROM dbo.TableWithPKViolation
    
    exec dbo.spNewIDPopulateInsertFiltered @batchsize = 10000000, 
    @startFrom = 1500000000, @endTill= @maxId
    --end of part 4
    

    3. После того, как таблица свободных идентификаторов, сгенерированная способом A или B готова, создаем индексы на таблице со свободными ключами
    60-CreateIndex.sql

    
    ALTER TABLE [dbo].[NewIds] ADD  CONSTRAINT [PK_NewIds] PRIMARY KEY CLUSTERED 
    (
    	[NewId] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    GO
    
    CREATE NONCLUSTERED INDEX [IX_NewIds_DateUsedUtc] ON [dbo].[NewIds]
    (
    	[DateUsedUtc] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = OFF)
    
    GO
    
    ALTER TABLE [dbo].[NewIds] SET ( LOCK_ESCALATION = DISABLE )
    GO
    

    Проверяем, что все было правильно сгенерировано, у вас не должно быть ID в таблице NewId, которые есть в основной таблице TableWithPKViolation.
    70-CheckData.sql

    
    declare @maxId INT
    
    
    select @maxId = max(TableWithPKViolationId) 
    from [dbo].[TableWithPKViolation]
    
    IF EXISTS (select 1 from [dbo].[NewIds] WHERE [NewId] > @maxId)
    BEGIN
    	PRINT 'PROBLEM. Wait for cleanup';
    	
    	declare @batchsize INT = 10000
    	DECLARE @rowcount int = @batchsize;
    
    	while @rowcount = @batchsize 
    	begin 
    
    		delete top (@batchsize)
    		from [dbo].[NewIds]
    		where DFVId > @maxId;
    
    		SET @rowcount = @@rowcount;
    	end;
    END
    ELSE
    	PRINT 'OK';
    

    Если вы генерируете последовательно на другом сервере (например на сервере с восстановленной резервной копией БД), то выгрузить данные в файл, можно с помощью скрипта:
    80-BulkOut.sql

    
    declare @command VARCHAR(4096),
    		@dbname VARCHAR(255),
    		@path VARCHAR(1024),
    		@filename VARCHAR(255),
    		@batchsize INT
    
    
    SELECT @dbname = DB_NAME();
    SET @path = 'D:\NewIds';
    SET @filename = 'NewIds-'+@dbname+'.txt';
    SET @batchsize = 10000000;
    SET @command = 'bcp "['+@dbname+'].dbo.NewIds" out  "'+@path+@filename+'" -c -t, -S localhost -T -b '+CAST(@batchsize AS VARCHAR(255));
    
    PRINT @command
    
    exec master..xp_cmdshell @command
    

    4. Создаем процедуру, которая помечает нужное количество доступный ID и возвращает их в результате
    90-GetNewId.sql

    
    create PROCEDURE [dbo].[spGetTableWithPKViolationIds]
    	@batchsize INT = 1
    AS
    BEGIN
    	SET NOCOUNT ON;
    	SET XACT_ABORT ON;
    
    	DECLARE @rowcount INT,
    		@now DATETIME = GETUTCDATE();
    
    	BEGIN TRAN
    
        UPDATE TOP (@batchsize) dbo.NewIds
    	SET DateUsedUtc = @now
    	OUTPUT inserted.[NewId]
    	WHERE DateUsedUtc IS NULL;
    
    	SET @rowcount = @@ROWCOUNT; 
    
    	IF @rowcount != @batchsize
    	BEGIN 
    		DECLARE @msg NVARCHAR(2048);
    
    		SET @msg = 'TableWithPKViolationId out of ids. sp spGetTableWithPKViolationIds, table NewIds. '
    			+'Ids requested '
    			+ CAST(@batchsize AS NVARCHAR(255))
    			+ ', IDs available '
    			+ CAST(@rowcount AS NVARCHAR(255));
    
    		RAISERROR(@msg, 16,1);
    		ROLLBACK;
    	END
    	ELSE
    	BEGIN
    		COMMIT TRAN
    	END;
    END
    

    5. Добавляем во все процедуры, в которых была вставка данных, в таблицу и возвращался SCOPE_IDENTITY(), вызов новой процедуры.

    Если позволяет производительность или вам очень дорого время, а процедур нужно поменять много, можно сделать триггер instead of insert.

    Вот, пример, как можно использовать процедуру для выдачи новых значений первичного ключа:

    
    CREATE TABLE #tmp_Id (Id INT);
    
    INSERT INTO #tmp_Id
    EXEC spGetTableWithPKViolationIds @batchsize=@IDNumber;
    
    SELECT @newVersionId = Id
    FROM #tmp_Id;
    
    SET IDENTITY_INSERT [dbo].[TableWithPKViolation] ON;
    

    Обратите внимание, что для опции SET IDENTITY_INSERT ON нужно, чтобы пользователь вызывающий процедуру имел разрешение на ALTER для таблицы TableWithPKViolation.

    6. Затем можно настроить JOB, который будет очищать таблицу с используемыми идентификаторами
    95-SPsCleanup.sql

    
    create PROCEDURE dbo.spCleanupNewIds @batchSize INT = 4999
    AS
    BEGIN
    	SET NOCOUNT ON
    
    	DECLARE @minId INT
    	DECLARE @maxId INT
    
    	SELECT @minId = Min([NewId]), @maxId = MAX([NewId])
    	FROM dbo.NewIds WITH (NOLOCK)
    	WHERE DateUsedUtc IS NOT NULL;
    
    	DECLARE @totRowCount INT = 0
    	DECLARE @rowCount INT = @batchSize
    
    	WHILE @rowcount = @batchsize
    	BEGIN
    		DELETE TOP (@batchsize)
    		FROM dbo.NewIds
    		WHERE DateUsedUtc IS NOT NULL AND [NewId] >= @minId AND [NewId] <= @maxId
    
    		SET @rowcount = @@ROWCOUNT
    
    		SET @totRowCount = @totRowCount + @rowcount
    	END
    
    	PRINT 'Total records cleaned up - ' + CAST(@totRowCount AS VARCHAR(100))
    END
    

    JOB, который будет удалять использованные записи раз в сутки, не является обязательным. Если, Вы регулярно удаляете записи из основной таблицы, то Вы можете дополнять эту таблицу удаленными значениями.

    Я бы все равно порекомендовала при этом запланировать переход на BIGINT.

    Новые идентификаторы, конечно, будут выдаваться по нарастающей, однако, необходимо продумать логику сотртировки новых идентификаторов таким образом, чтобы они шли после ранее выданных старых идентификаторов, даже если арифметические значение новых меньше.
    Например, Вы можете переключить процедуры, для которых важна последовательность, на другое поле данной таблицы, к примеру, на дату.

Описанные в данной статье временные решения проблемы того, что значения первичного ключа внезапно закончились, помогают Вам выиграть время и поддержать систему в рабочем состоянии, пока Вы будете изменять систему и программу на новый тип данных.

Наилучшим решением является мониторинг пограничных значений и переход на соответствующие типы данных заранее.

Архив с кодом
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/329506/


Метки:  

[Перевод] Получаем фотографии NASA с Марса с помощью aiohttp

Четверг, 29 Июня 2017 г. 15:05 + в цитатник
Я большой фанат книги «Марсианин» Энди Вейера. Читая её, мне было интересно, что же Марк Уотни чувствовал, гуляя по красной планете. Недавно наткнулся на пост на Twillo, в котором упоминалось, что у NASA есть публичный API для доступа к фотографиям с марсоходов. Так что я решил написать собственное приложение для просмотра изображений непосредственно в браузере.

Создание aiohttp приложения


Начнём с простого — установим и запустим aiohttp. Для начала создадим виртуальное окружение. Я советую использовать Python 3.5, в котором появился новый синтаксис async def и await. Если вы хотите развивать это приложение в дальнейшем, чтобы лучше понимать асинхронное программирование, то можете ставить сразу Python 3.6. Наконец, установим aiohttp:

pip install aiohttp

Добавим файл в проект (назовём его nasa.py) с кодом:

from aiohttp import web


async def get_mars_photo(request):
    return web.Response(text='A photo of Mars')


app = web.Application()
app.router.add_get('/', get_mars_photo, name='mars_photo')

Если вы ещё не работали с aiohttp, то поясню несколько моментов:

  • корутина get_mars_photo — обработчик запросов; принимает HTTP запрос в качестве аргумента и подготавливает содержимое для HTTP ответа (ну или бросает исключение)
  • app — высокоуровневый сервер; он поддерживает роутинг, middleware и сигналы (в примере будет показан только роутинг)
  • app.router.add_get — регистрирует обработчик HTTP метода GET по пути '/'

Примечание: обработчиком запросов может также быть и обычная функция, а не только корутина. Но чтобы понять всю мощь asyncio, большинство функций будут определены как async def.

Запуск приложения


Для запуска приложения добавьте строчку в конец файла:

web.run_app(app, host='127.0.0.1', port=8080)

И запустите его как обычный python скрипт:

python nasa.py

Однако, есть способ получше. Среди множества сторонних библиотек я нашёл aiohttp-devtools. Она предоставляет замечательную команду runserver, которая запускает ваше приложение, а также поддерживает live reloading.


pip install aiohttp-devtools
adev runserver -p 8080 nasa.py

Теперь по адресу localhost:8080 вы должны увидеть текст «A photo of Mars».

Использование API NASA


Перейдём непосредственно к получению фотографий. Для этого будем использовать API NASA. У каждого ровера есть свой URL (для Curiosity это api.nasa.gov/mars-photos/api/v1/rovers/curiosity/photos [1]). Мы должны также передавать минимум 2 параметра при каждом вызове:

  1. sol — марсианский день, на который была сделана фотография, начиная с приземления ровера (максимальное значение вы можете найти в разделе rover/max_sol)
  2. API KEY — ключ, предоставляемый NASA (пока можно использовать тестовый DEMO_KEY)

В ответ мы получим список фото с URL, информацией о камере и марсоходе. Чуть подправим файл nasa.py:

import random

from aiohttp import web, ClientSession
from aiohttp.web import HTTPFound

NASA_API_KEY = 'DEMO_KEY'
ROVER_URL = 'https://api.nasa.gov/mars-photos/api/v1/rovers/curiosity/photos'


async def get_mars_image_url_from_nasa():
    while True:
        sol = random.randint(0, 1722)
        params = {'sol': sol, 'api_key': NASA_API_KEY}
        async with ClientSession() as session:
            async with session.get(ROVER_URL, params=params) as resp:
                resp_dict = await resp.json()
        if 'photos' not in resp_dict:
            raise Exception
        photos = resp_dict['photos']
        if not photos:
            continue
        return random.choice(photos)['img_src']


async def get_mars_photo(request):
    url = await get_mars_image_url_from_nasa()
    return HTTPFound(url)

Вот что здесь происходит:

  • мы выбираем случайный sol (для Curiosity max_sol на момент написания статьи равнялся 1722)
  • ClientSession создаёт новую сессию, которую мы используем для получения ответа от NASA API
  • распарсиваем JSON с помощью resp.json()
  • проверяем наличие ключа 'photos' в ответе; если его там нет, значит мы достигли лимита обращений, нужно немного подождать
  • если в текущих сутках нет снимков, запрашиваем другой случайный день
  • используем HTTPFound для редиректа на найденное фото

Получение ключа для NASA API


Публичный ключ DEMO_KEY, предлагаемый NASA по умолчанию, работает нормально, но очень скоро вы упрётесь в лимит вызовов [2]. Я рекомендую получить здесь свой собственный ключ, который станет доступен после регистрации.

После запуска приложения вы можете быть перенаправлены на такое вот изображение с Марса:

image

Это немного не то, чего я ожидал…

Валидация изображения


Изображение выше не очень-то вдохновляющее. Оказыается, роверы снимают кучу очень скучных фото. Я же хочу видеть то же, что и Марк Уотни в своём невероятном приключении. Попробую это исправить.

Нам нужен какой-то механизм валидации получаемых изображений. Адаптируем код:

async def get_mars_photo_bytes():
    while True:
        image_url = await get_mars_image_url_from_nasa()
        async with ClientSession() as session:
            async with session.get(image_url) as resp:
                image_bytes = await resp.read()
        if await validate_image(image_bytes):
            break
    return image_bytes


async def get_mars_photo(request):
    image = await get_mars_photo_bytes()
    return web.Response(body=image, content_type='image/jpeg')

Вот что изменилось:

  • мы получаем сырой поток байт по url картинки с помощью resp.read()
  • проверяем достаточно ли хорошо выглядит изображение
  • если всё в порядке, то помещаем байты в web.Response. Обратите внимание — они передаются в body вместо text, а также задаётся content_type

К тому же мы удалили перенаправление (HTTPFound), так что можем получать следующую случайную картинку с помощью простой перезагрузки страницы.

Осталось описать валидацию фотографии. Самое простое — определить минимальные размеры.

Установим Pillow:

pip install pillow

Наша функция валидации превратится в:

import io
from PIL import Image


async def validate_image(image_bytes):
    image = Image.open(io.BytesIO(image_bytes))
    return image.width >= 1024 and image.height >= 1024

image

Уже что-то! Идём дальше и отбрасываем все чёрно-белые изображения:

async def validate_image(image_bytes):
    image = Image.open(io.BytesIO(image_bytes))
    return image.width >= 1024 and image.height >= 1024 and image.mode != 'L'

Теперь наша программа начинает выдавать более интересные фотографии:

image

И даже иногда селфи:

image

Заключение


Исходный код программы
#!/usr/bin/env python3
import io
import random
from aiohttp import web, ClientSession
from aiohttp.web import HTTPFound
from PIL import Image


NASA_API_KEY = 'DEMO_KEY'
ROVER_URL = 'https://api.nasa.gov/mars-photos/api/v1/rovers/curiosity/photos'


async def validate_image(image_bytes):
    image = Image.open(io.BytesIO(image_bytes))
    return image.width >= 1024 and image.height >= 1024 and image.mode != 'L'


async def get_mars_image_url_from_nasa():
    while True:
        sol = random.randint(0, 1722)
        params = {'sol': sol, 'api_key': NASA_API_KEY}
        async with ClientSession() as session:
            async with session.get(ROVER_URL, params=params) as resp:
                resp_dict = await resp.json()
        if 'photos' not in resp_dict:
            raise Exception
        photos = resp_dict['photos']
        if not photos:
            continue
        return random.choice(photos)['img_src']


async def get_mars_photo_bytes():
    while True:
        image_url = await get_mars_image_url_from_nasa()
        async with ClientSession() as session:
            async with session.get(image_url) as resp:
                image_bytes = await resp.read()
        if await validate_image(image_bytes):
            break
    return image_bytes


async def get_mars_photo(request):
    image = await get_mars_photo_bytes()
    return web.Response(body=image, content_type='image/jpeg')


app = web.Application()
app.router.add_get('/', get_mars_photo, name='mars_photo')
web.run_app(app, host='127.0.0.1', port=8080)


Есть много вещей для усовершенствования (например, получение значения max_sol через API, просмотр изображений с нескольких роверов, кеширование URL), но пока программа выполняет свою работу: мы можем получать случайное фото с Марса и представлять себя на месте будущих поселенцев.

Надеюсь, вам понравилось это короткий туториал. Если заметили ошибку или у вас есть вопросы, дайте знать.

Примечания переводчика:

[1] На самом деле роверов всего 3, их список можно посмотреть запросом api.nasa.gov/mars-photos/api/v1/rovers/?API_KEY=DEMO_KEY.
[2] Я б ещё добавил, что программа работает очень долго из-за случайного перебора изображений
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/331834/


Метки:  

Интересный этюд Factorio: симулятор завода

Четверг, 29 Июня 2017 г. 13:52 + в цитатник
Эта игра — очередная очень интересная с точки зрения механики бета, представляющая заодно своеобразный язык программирования.



И здесь самое забавное — это кривая обучения и интерфейсы. Давайте пройдёмся по этим моментам, благо есть отличные находки.

Вы играете за инженера, очнувшегося на незнакомой планете около обломков своего космического корабля. Поскольку вы инженер, а не какой-нибудь агроном, вместо космической картохи предстоит развить технологию и собрать ракету с нуля. В общем, старая добрая игра, описанная у Вернора Винджа — «восстанови цивилизацию за минимальный срок».

Первая задача — используя технологии бронзового века, получить прединдустриальные, а затем собрать жестяной радар, чтобы найти основную часть корабля. Затем — добраться туда на каком-то транспортном средстве. Там забрать ядро компьютера и получить доступ ко всем данным по тому, как правильно делать ракеты, бронебойные патроны, скафандры и прочую мелочь, важную для выживания.

Самое первое, что до безумия удивляет — это то, что это стратегия, где главный герой играет за скролл. Серьёзно, ваш персонаж по центру экрана — это всегда фокус ввода, внимания и интереса. Вместо того, чтобы обезличивать игру, вы получаете сборочный цех с инвентарём на ножках. Инженер! Как быстро выясняется, ещё наш инженер умеет стрелять. Получается некий гибрид Crimson Land (10%) и симулятора реконструкции отечественного автопрома (90%).

Итак, суть. Есть базовые ресурсы — уголь, камень, медь, железо, вода (позже добавляется знание о нефти и солнечной энергии). Задача — собрать ракету. Используя только свои руки в момент начала. В отличие от обычных craft&explore игр (лучший пример из относительно свежего — Radiation Island для планшетов), здесь основной интерес смещён на конвейерное производство и автоматизацию всего то, до чего не может дотянуться ваш персонаж руками.

А ресурсов надо столько, что руками он просто не сможет всё сделать. Даже чтобы приготовить обычную стальную балку, нужно очень сильно попотеть — открыть принципы переработки стали, организовать переплавку металла, собрать печь, обеспечить подвоз топлива (то есть раскопать угольное месторождение) и так далее.

К счастью, наш персонаж не спит, ничего не ест, быстро лечится от ранений сам и умеет собирать вручную почти всё, включая сложные микросхемы. Правда — с линейной скоростью.

Дальше начинается первый этап — вы вручную делаете немного железных пластин, кирпичей и так далее, и собираете первую автоматизированную линию, добывающую руду и копающую уголь. Плюс осваиваете паровой электродвигатель. На выходе из первого этапа — конвейерная лента с железными пластинами, медными пластинами и провод с настоящим током. Из этого можно уже собрать что угодно.

Дерево науки огромное:





Дальше вы исследуете автоматизацию и начинаете делать линии по сборке разных нужных штук — конвейерных лент, манипуляторов, сборочных автоматов, научных пакетов. В общем, всего-всего. Выглядит это примерно так. На рисунке — простейший пример:



Синяя лента сверху — это приходящая железная руда, которая манипуляторами ставится в печи, затем переплавляется в железную пластину. Потом она выгружается из печи манипуляторами на другую ленту. С другой стороны подходят медные пластины. Цель сборочного этюда — получить красные микросхемы. Для производства красной микросхемы нужны зелёные микросхемы, кабель и стальные пластины. Для кабеля нужна медь. Для зелёной микросхемы нужен кабель и стальная пластина. Всё просто.

Конечно, при legacy-driven-проектировании ситуация может немного усложниться:



К моменту, когда вам понадобятся силовые поля, база начнёт приобретать вот такой вид:



Кстати, обратите внимание. как всё красиво дымит и загрязняет окружающую среду. Планета обитаема (и не только вами), и местным кусакам и плевакам (функциональные названия) совершенно не нравится нюхать ваш дым. Они приходят кусаться и плеваться, соответственно. Поэтому вы ещё играете с ними в «перебей их всех и разрушь их гнёзда». Часто это выглядит вот так:



А вот прямо этюд из последних уровней Кримсона:



Планета выглядит примерно так:



Красное по центру — это ваша база, загрязняющая природу. Красные скопления по краям — это гнёзда «зергов», их надо время от времени пропалывать, если зерги лезут к базе. С краю пустыни сверху видно добывающий аванпост с нефтью. Вообще, распределённая база и коммуникации — это одна из важных граней игры. Например, можно играть в Transport Tycoon:



Или строить сеть на летающих дронах:



Ещё одна вещь, которая нам важна — это экипировка своего скафандра. Силовые щиты, экзоскелетные ноги, батарейки, дронстанция, прибор ночного видения, реактор, наплечная турель — куча всего:



Как только вы с этим освоитесь, начинается самая странная часть игры. А именно — автоматизация автоматизации или рефакторинг. Оказывается, дикое удовольствие может доставлять не только кайфно шипящий тормозами поезд «Hello, world!», не только уничтоженное гнездо кусак, но и то, как вы переделаете все процессы, чтобы они шли без вашего участия.

Вообще, тут надо чуть отвлечься и сказать про то, как распределён даунтайм игры:
  • В самом начале вы делаете всё руками как в обычных крафтовых играх.
  • В середине скорость строительства базы сбалансирована со скоростью получения новых игрушек от автолабораторий, поэтому есть, чем заняться. Если нет — можно побегать по кустам и пошмалять в животных.
  • На поздних этапах становится немного скучно, но если хоть что-то идёт не так хоть где-то — вам надо бежать и править. А здесь уже вопрос того, что может пойти не так. Примеров море: конвейер засорился и по нему не лезут новые ништяки, почему-то вышла задержка с микросхемами, кусаки грызут радар, где-то не хватает синих научных пакетов и надо расширить их производство — и так далее.


То есть вы играете в девелопмент и поддержку большого проекта. Правда, индивидуального. Но незабываемое ощущение отладки остаётся всю игру. Так вот! Вы открываете беспроводные сети управления и дронов. И это много чего меняет в подходе — если до этого у вас были только инструменты циклов, то теперь появляются условия. А с развитием строительных дронов и чертежей — ещё и почти полная машина фон Неймана.



И начинается рефакторинг базы: к чёрту невозобновляемые источнии энергии, рулит бесконечная нефть и солнце. К чёрту громоздкие производственные линии, всё можно упростить. К чёрту перегрузки и недогрузки — теперь всё работает как часы. От этого вот ощущение «Работает как часы» можно тащиться бесконечно. Впервые оно возникает при разгрузке автоматического поезда, а потом появляется с развитием логической сети.

Итог игры — вылетающая ракета. Но настоящая радость — в песочнице, которая позволяет творить любую фигню, например, музыкальные шкатулки. Вот тут парень упоролся и «написал» программируемые динамики на основе комбинаторов логической сети производства:





Ну а самое интересное — всё же кривая обучения. Чтобы начать играть в «Факторию» первый раз, нужно получить очень много информации — от того, что и как работает до шаблонов строительства базы. Вопрос решён гениально: вы находите чужую базу с двумя аванпостами, разбираетесь, как она работает, и чините её. Заодно хороните павших коллег-гуманитариев, построивших её (на самом деле нет, их сожрали кусаки).

Каждая отдельная миссия короткая, имеет конкретную цель и радует экшном — после первой же кампании хочется чего-то ещё. И там есть ряд логических задач, песочница и всё, что угодно.

В общем, это очень странная игра. Странная тем, что в ней надо работать и фармить — но при этом вы играете. Странная тем, что надо отлаживать процессы: всё всегда идёт не так, но надо следить. Но удивительная тем, что показывает, насколько важна сложность: то, что можно делать руками час, ставится на поток за то же время, и делается тысячами. И поверх этого накручивается ещё виток. И ещё. И ещё. До тех пор, пока всё это будет сложно охватить сознательно. В процессе прямо подводит мысли к тому, что роботы должны делать других роботов посложнее, и так далее.

В общем, ещё один интересный учебный курс. Который вместо традиционного обучения. Хотя бы по схемотехнике, потому что вся карта — эта плата, и вы делаете на ней трассировку своими зданиями и чертежами их совокупностей вроде «блок производства красных микросхем».
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/331800/


Метки:  

Дайджест IT событий на июль

Четверг, 29 Июня 2017 г. 13:51 + в цитатник
Сезон отпусков — не помеха саморазвитию. Программисты мало-помалу перебираются из инкубаторов и офисов к палаткам и стендам на открытом воздухе, но упорно продолжают обсуждать профессиональные темы. Публикуем очередной перечень мероприятий для IT-сообщества по всей России для тех, кто еще не определился с планами на июль.



Пользовательские требования

Когда: 1 июля
Где: Санкт-Петербург, Красногвардейский пер., 23, литера Е, офис ГК «СКАУТ»
Условия участия: от 1 500 руб.

Мечта большей части программистов — вообще забыть о существовании заказчиков, но увы, их роль в формировании системных требованиях слишком велика для такой идиллии. Данный тренинг предназначен для тех, кто принял эту реальность и хочет научиться переводить то, что говорят клиенты, на более привычный, технический язык для продуктивной и безболезненной коммуникации. Ведущие обещают раскрыть такие темы, как различия между требованиями и ожиданиями пользователей, классификация требований по ролям пользователей, специфика изложения требований в виде вариантов использования для согласования с заказчиком и дев-командой и применение иллюстративных материалов в этой нелегкой задаче.

Frontend Party

Когда: 1 июля
Где: Казань, Спартаковская 6, ТОЦ Suvar Plaza, эт. 11, офис Яндекса
Условия участия: бесплатно

Яндекс приглашает казанских специалистов в сфере фронтенда собраться и поговорить о наболевшем. Завялены доклады на такие темы, как опыт использования Gemini в тестировании вёрстки, применение MobХ и специфика разработки WebVR-приложений. Спикеры из Яндекса, впрочем, не собираются оккупировать площадку: у участников митапа также будет возможность пообщаться с коллегами и представителями компании в свободной обстановке.

AngelHack

Когда: 1 — 2 июля
Где: Москва, Россия, ул. Краснопролетарская, 4, Штаб-квартира «Билайн»
Условия участия: бесплатно

Заключительный этап юбилейного десятого марафона AngelHack пройдет в Москве в начале месяца. Зрителей ждет кульминация многомесячного соревнования проектов, а участников — реальный шанс пробиться на международную арену. Напоминаем: главный приз — поездка в Кремниевую долину.

IT&City hackathon

Когда: 1 — 2 июля
Где: Нижний Новгород, ул. Алексеевская, 10/16, БЦ Лобачевский Плаза, офис Яндекса, 3 этаж
Условия участия: требуется регистрация

Еще одна инициатива от компании Яндекс при участии Google Developer Group — первый мобильный хакатон для нижегородских Android-разработчиков и дизайнеров. Все, что требуется для участия — предварительная регистрация, ноутбук и, при желании, идея приложения, которую можно на месте обсудить и утвердить с экспертами из Яндекса. Ограничения по тематике минимальные: подойдет любой проект, который может быть полезен жителям города или интересен IT-специалистам. Победители будут выбраны в нескольких номинациях: самый полезный проект, лучший UX, самый фановый проект, самый инновационный проект и, конечно же, приз зрительских симпатий. Возможности для самореализации и получения памятного сувенира, как видите, обширные.



PG Day Russia

Когда: 5 — 7 июля
Где: Санкт-Петербург, ул. Стартовая, 6а, Crowne Plaza Аэропорт
Условия участия: 16 200 руб.

Ежегодная конференция о PostgreSQL на этот раз радует сообщество широтой тематики. Секции будут разбиты по пяти направлениям: PostgreSQL, коммерческие базы данных MySQL/NoSQL, системное администрирование и хранение данных, базы данных и computer science, Greenplum Day Keynote. Для выступления приглашены около 50 спикеров, среди которых — эксперты в сфере Computer Science и технологий хранения данных с мировым именем. Кроме того, у участников будет возможность посетить специализрованные мастер-классы с различными тематиками (PostgreSQL, MySQL, Oracle, MS SQL Server, популярным NoSQL решениям), которые будут посвящен первый день конференции.

2я Летняя школа по финтеху «Финтернет вещей»

Когда: 7 — 21 июля
Где: Москва, Ленинградский проспект, 51, корпус 1, кампус Финуниверситета
Условия участия: от 19 900 руб.

Двухнедельный интенсивный курс занятий — ваш шанс погрузиться в финтех с головой. Организаторы открывают презентацию школы тезисом: «Будущее финтеха — это интернет вещей» и обещают всестороннее раскрытие связи между этими двумя областями и бизнес-моделей, которые она может породить. В частности, слушатели узнают, как IoT встраивается в существующий технологический стек и как применять существующие инструменты анализа данных в новом контексте. Вести курс будут люди, которые по-настоящему разбираются в IoT, больших данных, AI, робоадвайзинге и блокчейне — полный список спикеров и программа занятий приведены на сайте. Завершится школа однодневным хакатоном, на котором учащиеся смогут довести до ума и представить на суд экспертов свои «дипломные» проекты.

Защита интеллектуальной собственности IT-компании. Россия или оффшор?

Когда: 12 июля
Где: Москва, ул. Антонова-Овсеенко, 15, стр. 2
Условия участия: 2000 — 5000 руб.

Юридическая безопасность — проблема похуже безопасности информационной. Организаторы призывают владельцев бизнеса и стартаперов не пожалеть нескольких часов, чтобы в подробностях узнать что все-таки такое интеллектуальная собственность и что о ней говорит законодательство РФ. Основное внимание, естественно, будет сосредоточено на тех действиях, которые стоит предпринять, чтобы избежать осложнений. В частности: что учитывать при заключении договоров с работниками, когда регистрировать товарный знак, как защитить логотип и другие нематериальные активы, по какой схеме осуществлять сотрудничество с иностранными компаниями. Спикеры — профессиональные юристы, не понаслышке знакомые с проблематикой.

Облака и реальность: кейсы, грабли, хорошие новости

Когда: 13 июля
Где: Санкт-Петербург, ул. Гангутская, 4, Dom Boutique Hotel
Условия участия: бесплатно

DataLine впервые организует открытый семинар для всех желающих обсудить темы, связанные с облачным хранением. Речь пойдет о российских и мировых IaaS-практик в контексте размещения критичных для бизнеса систем и IT-сервисов, типичных ошибках мигрирующих (с бонусными лайфхаками, которые помогут их избежать), а также ключевых трендах в развитии технологий и сервиса в целом. Кроме того, для особо загоревшихся представители компании расскажут о расширенном обучающем курсе «Облачные университеты DataLine» и озвучат темы семинаров из цикла.

Презентация RIW

Когда: 13 июля
Где: Москва, Берсеневская набережная, 6, стр. 3, Deworkacy
Условия участия: требуется регистрация

Юбилейная Russian Internet Week — достаточно крупное событие, чтобы начать готовиться к нему заранее. Организаторы предлагают всем, кто планирует участие в осенней IT-конференции, посетить презентацию, на которой будут освещены общая концепция мероприятия, блоки тем, а также сюрпризы и нововведения, которые подготовлены в честь юбилея. У участников будет возможность ознакомиться с предварительной программой, вникнуть в новую систему разделения на потоки, хабы и уровни сложности и принять участие в сессии вопросов-ответов.



IT fest ULCAMP-2017

Когда: 14 — 16 июля
Где: Ульяновск, база «Славянское подворье»
Условия участия: от 2500 руб.

Пляжно-палаточная конференция на берегах Волги. Мероприятие будет проходить в модном, гибком и свободном формате баркемпов с четырьмя заявленными темами (технологии программирования; искусственный интеллект и машинное обучение; управление проектами; веб-дизайн, создание контента и digital-коммуникации). Организаторы с одинаковым радушием принимают заявки как от рядовых слушателей, так и от тех, кто чувствует в себе силы стать спикером. Вознаградить себя за выступления и вклад в дискуссию участники смогут на танцполе, в ресторанной зоне и на спортивной площадке.

SECURITY CONFERENCE 2017

Когда: 15 июля
Где: Орёл, Кромское шоссе, 4, Конгресс-холл «Гринн»
Условия участия: 4500 руб.

Pentestit Security Conference 2017 приглашает местных и иногородних специалистов по практической информационной безопасности прослушать доклады от экспертов и, при желании, присоединиться к команде спикеров. На данный момент уже заявлены выступления от security-специалистов, сотрудников Федеральной Службы Охраны и представителей компании Pentestit на такие темы, как тестирование на проникновения, выявление уязвимостей, обход современных защитных средств, обнаружение и противодействие атакам, криминалистический анализ и расследование инцидентов.

PYCON RUSSIA 2017

Когда: 16 июля — 17 июля
Где: Москва, ст. метро Анино (трансфер в отель «Cronwell Яхонты Таруса» в 95 км от Москвы)
Условия участия: от 15 500 руб.

Еще одна конференция выездного формата, но на этот раз с уклоном в интернациональность. Представители IT-сообщества со всего земного шара (и, в частности, из разных уголков России) по многолетней традиции, соберутся под Москвой для общения, единения с природой и прославления языка Python. Формат конференции остается неизменным — два дня выступлений на разных языках от независимых разработчиков и представителей крупных компаний (Facebook, Spotify, Rambler&Co Venmo, JetBrains и даже Walt Disney Animation Studios), а также Lightning Talks и афтепати.

ИТ-шашлыки или RemoteCamp

Когда: 22 — 23 июля
Где: Санкт-Петербург, Солнечное
Условия участия: бесплатно

Максимум спонтанности, максимум демократии, никакого официоза. Петербургские IT-специалисты тоже устраивают свой выездной баркемп, где программа выступлений составляется на ходу, общими силами и с учетом вкусов большинства, а доклады перемежаются стендапом и маршмеллоу. Если шашлыки в названии вас еще не убедили, ожидаются также доклады от приглашенных спикеров, площадки для нетворкинга и краткий курс выживания в дикой природе (на всякий случай).

DevOps Smart Talk

Когда: 27 июля
Где: Нижний Новгород, ул. Новая, 24
Условия участия: бесплатно

Как намекает название, суть мероприятия — умные разговоры между представителями разных звеньев IT-команды. DevOps представляет собой парадигму разработки и внедрения программного обеспечения, основанную на непрерывном взаимодействии программистов, тестировщиков и системных администраторов. Представители именно этих профессий соберутся, чтобы обсудить этот феномен в неформальной атмосфере. На митапе прозвучат два доклада с фокусом на практическом опыте применения системы, остальное же время будет отдано свободному диалогу за кофе.


IT’Summer

Когда: 29 июля
Где: Барнаул, ул. Власихинская, 69ф, спортивно-развлекательный комплекс «Олимпийский»
Условия участия: 1890 руб.

Сибирские айтишники намерены в очередной раз отметить День системного администратора с огоньком. IT’Summer — это ежегодная неформальная встреча на Алтае, где IT-специалисты весело и плодотворно проводят время в обществе родственных душ. Программа в этом году планируется плотная: будет возможность и послушать приглашенных экспертов из команд Postgres Professional и Лаборатории Касперского, и собрать Машину Голдберга, и поиграть в командные игры, и побеседовать на свободные темы под пиво и живую музыку.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/331890/


Метки:  

Руководство: как использовать Python для алгоритмической торговли на бирже. Часть 2

Четверг, 29 Июня 2017 г. 13:47 + в цитатник


Мы продолжаем публикацию адаптации руководства DataCamp по использованию Python для разработки финансовых приложений. Первая часть материала рассказывала об устройстве финансовых рынков, акциях и торговых стратегиях, данных временных рядов, а также о том, что понадобится для начала разработки.

Теперь, когда вы уже больше знаете про требования к данным, разобрались с понятием временных рядов и познакомились с pandas, пришло время глубже погрузиться в тему финансового анализа, который необходим для создания торговой стратегии.

Jupyter notebook этого руководства можно скачать здесь.

Общий финансовый анализ: подсчет прибыли


При простом подсчете дневного процентного изменения не принимаются во внимание, например, дивиденды и другие факторы — просто отмечается процентное изменение цены приобретенных акций по сравнению с предыдущим торговым днем. Подсчитать такие изменения легко с помощью функции pct_change(), входящей в пакет Pandas.

# Import `numpy` as `np`
import numpy as np

# Assign `Adj Close` to `daily_close`
daily_close = aapl[['Adj Close']]

# Daily returns
daily_pct_change = daily_close.pct_change()

# Replace NA values with 0
daily_pct_change.fillna(0, inplace=True)

# Inspect daily returns
print(daily_pct_change)

# Daily log returns
daily_log_returns = np.log(daily_close.pct_change()+1)

# Print daily log returns
print(daily_log_returns)

Доход будет вычисляться по логарифмической шкале — это позволяет нагляднее отслеживать изменения во времени.

Знание прибыли за день — это хорошо, но что если нам нужно рассчитать этот показатель за месяц или даже квартал? В таких случаях можно использовать функцию resample(), которую мы рассматривали в прошлой части руководства:

# Resample `aapl` to business months, take last observation as value 
monthly = aapl.resample('BM').apply(lambda x: x[-1])

# Calculate the monthly percentage change
monthly.pct_change()

# Resample `aapl` to quarters, take the mean as value per quarter
quarter = aapl.resample("4M").mean()

# Calculate the quarterly percentage change
quarter.pct_change()


Использование pct_change() удобно, но в таком случае сложно понять, как именно вычисляется дневной доход. Поэтому в качестве альтернативы можно использовать фукнцию Pandas под названием shift(). Затем нужно разделить значения daily_close на daily_close.shift(1) -1. При использовании этой функции в начале результирующего датафрейма будут находиться NA-значения.

Для справки, вычисление дневного изменения стоимости акций вычисляется по формуле:

,

Где p — это цена, t — это время (в нашем случае, день), а r — это доход. Можно создать график распределения daily_pct_change:

# Import matplotlib
import matplotlib.pyplot as plt

# Plot the distribution of `daily_pct_c`
daily_pct_change.hist(bins=50)

# Show the plot
plt.show()

# Pull up summary statistics
print(daily_pct_change.describe())

image

Результат выглядит симметричным и нормально распределенным: дневное изменение цены находится в районе bin 0.00. Следует понимать, что для корректной интерпретации результатов гистограммы нужно использовать функцию describe(), примененную к daily_pct_c. В таком случае будет видно, что среднее значение также близко к bin 0.00, а стандартное отклонение составляет 0,02. Также нужно изучить процентили, чтобы понять, какой объём данных выходит за границы -0,010672, 0,001677 и 0,014306.

Показатель суммарной суточной нормы прибыли полезен для определения стоимости инвестиций на регулярных отрезках. Подсчитать суммарную суточную норму прибыли можно используя значения дневных изменений цены активов в процентах, добавляя к ним 1 и вычисляя конечные значения:

# Calculate the cumulative daily returns
cum_daily_return = (1 + daily_pct_change).cumprod()

# Print `cum_daily_return`
print(cum_daily_return)

Здесь снова можно использовать Matplotlib для быстрой отрисовки cum_daily_return. Нужно лишь добавить функцию plot() и, опционально, определить размер графика с помощью figsize.

# Import matplotlib
import matplotlib.pyplot as plt 

# Plot the cumulative daily returns
cum_daily_return.plot(figsize=(12,8))

# Show the plot
plt.show()

image

Все довольно просто. Теперь, если нужно анализировать не дневной доход, а месячный, следует вернуться к функции resample() — с ее помощью можно привести cum_daily_return к месячным значениям:

# Resample the cumulative daily return to cumulative monthly return 
cum_monthly_return = cum_daily_return.resample("M").mean()

# Print the `cum_monthly_return`
print(cum_monthly_return)

Знание того, как можно подсчитать доход — полезный навык, но на практике эти значения редко несут в себе ценную информацию, если не сравнивать их с показателями других акций. Вот почему в различных примерах часто сравнивают между собой две или более акций.

Чтобы тоже это сделать, сначала нужно загрузить больше данных — в нашем случае, c Yahoo! Finance. Для этого можно создать функцию, которая будет использовать ticker акции, а также начальную и конечные даты торгового периода. В примере ниже функция data() берет ticker для получения данных, начиная со startdate до enddate, и возвращает результат функции get(). Данные размечаются с помощью корректных тикеров (ticker), в результате получается датафрейм, содержащий эту информацию.

В коде ниже данные акций Apple, Microsoft, IBM и Google загружены в один общий датафрейм:

def get(tickers, startdate, enddate):
  def data(ticker):
    return (pdr.get_data_yahoo(ticker, start=startdate, end=enddate))
  datas = map (data, tickers)
  return(pd.concat(datas, keys=tickers, names=['Ticker', 'Date']))

tickers = ['AAPL', 'MSFT', 'IBM', 'GOOG']
all_data = get(tickers, datetime.datetime(2006, 10, 1), datetime.datetime(2012, 1, 1))


Примечание: этот код также использовался в руководстве по использованию Pandas для сферы финансов, позднее он был доработан. Также, поскольку в настоящий момент существуют проблемы с загрузкой данных с Yahoo! Finance, для корректной работы, возможно, придется загрузить пакет fix_yahoo_finance — инструкции по установке можно найти здесь или в Jupyter notebook этого руководства.

Вот результат выполнения этого кода:

image

Этот большой датафрейм можно использовать для отрисовки интересных графиков:

# Import matplotlib
import matplotlib.pyplot as plt 

# Isolate the `Adj Close` values and transform the DataFrame
daily_close_px = all_data[['Adj Close']].reset_index().pivot('Date', 'Ticker', 'Adj Close')

# Calculate the daily percentage change for `daily_close_px`
daily_pct_change = daily_close_px.pct_change()

# Plot the distributions
daily_pct_change.hist(bins=50, sharex=True, figsize=(12,8))

# Show the resulting plot
plt.show()

image

Еще один полезный для финансового анализа график — это матрица рассеяния. Получить ее можно с помощью библиотеки pandas. Нужно будет добавить к коду функцию scatter_matrix(). В качестве аргументов передаются daily_pct_change, а в качестве диагонали устанавливается значение по выбору — так, чтобы получить график оценки плотности ядра (Kernel Density Estimate, KDE). Также, с помощью аргумента alpha можно установить прозрачность, а с помощью figsize изменять размер графика.

# Import matplotlib
import matplotlib.pyplot as plt

# Plot a scatter matrix with the `daily_pct_change` data 
pd.scatter_matrix(daily_pct_change, diagonal='kde', alpha=0.1,figsize=(12,12))

# Show the plot
plt.show()

image

В случае локальной работы для построения матрицы рассеяния может понадобиться модуль plotting (т.е. pd.plotting.scatter_matrix()).

В следующей части руководства речь пойдет об использовании для финансового анализа скользящих окон, подсчете волатильности и применении обычной регрессии наименьших квадратов.

Продолжение следует…..

Другие материалы по теме финансов и фондового рынка от ITinvest:


Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/331940/


Метки:  

Настройка Dockerfile для создания и запуска контейнера Docker с вашей программой на Go

Четверг, 29 Июня 2017 г. 13:07 + в цитатник
Вы написали программу (микросервис) на Go, и хотите развернуть ее в контейнере Docker?
В этой небольшой заметке я постараюсь максимально компактно и практично описать этот процесс для новичков, учитывая современный уровень развития docker. В интернете нашел много статей с непонятными или устаревшими инструкциями, и мало практики, поэтому, решил написать свою.

Про Docker в двух словах скажу так — он позволяет запустить контейнер с виртуальной операционной системой и вашим приложением, размещенным в ней. А так же, когда надоест, удалить напрочь этот контейнер, не заботясь о том, что Ваше приложение где-то тайком намусорило в системе.
Вот, собственно, и все преимущества от использования контейнеров docker для новичков :)

В данной заметке я рассматриваю способ компиляции Вашей программы внутри образа, на этапе его сборки. Это самый очевидный способ для начинающих.


Еще пару слов о том, с чем docker работает. Он хранит у себя образы (image) контейнеров, на основе которых Вы можете наклепать сколько угодно экземпляров самих этих контейнеров и настроить им маршрутизацию по сети (мэппинг входящих портов и т.п). Образы собираются на основе других образов (можно сказать, есть наследование образов), которые есть в публичном доступе в репозитории docker. Для программы на Go лучшим готовым выбором будут образы golang:latest (на базе debian) и golang:alpine (на базе alpine linux). Другие названия образов можно посмотреть тут: hub.docker.com/_/golang

Чтобы собрать образ (image), нужно в папке исходников своей программы сделать текстовый файл Dockerfile, без расширения, с таким содержимым:
#имя базового образа
FROM golang:latest

#создаем папку, где будет наша программа
RUN mkdir -p /go/src/app

#идем в папку
WORKDIR /go/src/app

#копируем все файлы из текущего пути к файлу Docker на вашей системе в нашу новую папку образа
COPY . /go/src/app

#скачиваем зависимые пакеты через скрипт, любезно разработанный командой docker
RUN go-wrapper download

#инсталлируем все пакеты и вашу программу
RUN go-wrapper install

#запускаем вашу программу через тот же скрипт, чтобы не зависеть от ее скомпилированного имени
#-web - это параметр, передаваемый вашей программе при запуске, таких параметров может быть сколько угодно
CMD ["go-wrapper", "run", "-web"]

#пробрасываем порт вашей программы наружу образа
EXPOSE 8000

В папке с этим файлом и вашими исходниками запускаем команду:
docker build -t my-golang-app .

Точка в конце — это текущая директория с файлом Docker, не забываем ее указывать.
my-golang-app — это будет название образа, в котором скомпилируется ваша программа.
После выполнения этой команды можно посмотреть наличие успешно собранного образа командой
docker ps -a

Создать и запустить контейнер на базе собранного образа можно так:
docker run -it --rm --name my-running-app my-golang-app

my-running-app — это будет имя создаваемого контейнера на основе образа my-golang-app.

Подробнее по ключам запуска docker и составу файла Dockerfile смотрите тут: docs.docker.com
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/331938/


Метки:  

Как создать альтернативу Google Disk и Dropbox за 3700 часов

Четверг, 29 Июня 2017 г. 13:04 + в цитатник
За 8 месяцев разработки, 3700 рабочих часов, силами 15 человек команда Artezio создала собственную файлообменную платформу SendFile. Сначала мы рассматривали ее как учебный проект, но потом она переросла этот статус. В этой статье я расскажу, как все начиналось и к чему мы пришли сейчас.



Зачем нам это было нужно


Нашей компании Artezio (группа ЛАНИТ) 16 лет, и мы помним времена, когда работу заказчикам приходилось отправлять на дисках бандеролями и заказными пакетами. Представьте, как тяжело было нам и клиентам разбираться в ворохе цифровых носителей! Затем наступило время «небыстрого интернета» и многотомных архивов, которые можно было отправить электронной почтой. Но и она не подходит, если вам нужно переслать большой массив данных. Даже очень либеральные почтовые сервисы не позволят это сделать, а менять настройки корпоративной почты ради этого не имеет смысла.

Источник

Остается использовать для обмена файлами уже существующие площадки? Но вспомните, что еще пять лет назад представляли собой развалы файлов в интернете. Отправлять клиента за файлами в адское пекло из рекламы, скриптов – опасно и стыдно. Справедливости ради стоит сказать, что были и достойные облачные продукты. Но несколько лет назад, когда мы задумались о файлообменной платформе, они были еще слишком дорогими и небезопасными. Впрочем, такими они остаются и сейчас. И вот почему.

Даже если весь контент будет создаваться непосредственно в облаке и передаваться через него же, все равно останутся открытыми несколько вопросов. Например, безопасность (разделение доступа для различных пользователей, ограничение доступа по времени, логирование) или удобство интерфейса для распространения информации.

Мы задумали свой продукт (он получил очевидное название SendFile) как корпоративное приложение с высоким уровнем безопасности и интеграцией с внутренней инфраструктурой компании. В этом плане публичные сервисы типа Google Drive, Yandex.disk или Dropmefiles не представляют интереса. Например, Google Drive есть у любого, кто пользуется почтой Gmail. Это решение отлично с ней интегрировано. Но это же является и слабым местом, потому что требует наличие  Google  аккаунта, что в случае коммерческого использования не всегда удобно.

Сомнения: стриминг и пиратство


В процессе разработки нас часто спрашивали: «Вы не боитесь, что создаете платформу для пиратства?» Особенно часто этот вопрос стал звучать с тех пор, как в России вплотную занялись торрентами и другими площадками, которые распространяют нелегальный контент.

Источник

Если честно, наш файлообменник подходит для того, чтобы обмениваться новыми фильмами и музыкой. Точно так же, как и кухонный нож может стать орудием преступления. Любой инструмент может быть использован как во благо, так и во вред. Но мы встроили некоторые средства обеспечения безопасности, которые в том числе могут пригодиться и при необходимости помочь в борьбе с незаконным копированием. Например, администратор системы знает, кто и когда разместил конкретный файл, кто его получил. Можно определять типы файлов, доступных для передачи в системе. Нужно понимать, что наша разработка — это корпоративная платформа для обмена файлами. Вряд ли кто-то из работников корпораций будет рассчитывать на полную анонимность, если начнет рассылать по офисной сети фильмы и музыку. Однако если вы сделали абсолютно безопасный нож, это значит, что он не режет.

То же самое касается и стриминга. Может показаться, что файлообменные решения — прошлый век. Мол, теперь все решают технологии потоковой передачи данных. Но стриминг предполагает поступление данных в виде потока по частям. При этом, как правило, вы не обладаете полным набором данных ни в какой момент. Это действительно очень удобно в случае просмотра видео или прослушивания аудио — не надо ждать, пока скачается весь фильм. Однако есть много информации, для которой важна целостность. То есть перед тем, как пользоваться информацией, вы должны заполучить ее целиком. Запрос информации из неполной базы данных приведет к непредсказуемому и с большой вероятностью ошибочному результату.

Представьте, что вы «стримите» текстовый файл. Что вы увидите, когда получите только первую часть этого файла? Вы не сможете прочитать текст, не сможете его редактировать, пока не будет завершена передача файла полностью. По аналогии «стриминг» не работает и с другими типами файлов, включая архивы и данные, которые разработчики передают своим заказчикам. Чтобы нормально обмениваться данными на расстоянии, нужен файлообменный сервис.

Люди не любят ждать, поэтому все успешные сервисы будут стараться различными способами предоставить возможность работать с ними как можно быстрее, скрыть задержку, обрабатывать ее на стороне сервера-облака, выдавать результаты по частям. Но пока это не всегда приемлемо, и не думаю, что картина принципиально изменится в ближайшие лет десять.

Как долго мы создавали свой файлообменник


С самого начала над проектом работало два студента, которые мечтали устроиться на работу в нашу компанию. Это очень похоже на историю с возникновением популярной социальной сети, которая родилась в студенческом общежитии. Но с файлообменником вышло проще. В Artezio есть учебное подразделение Juniors Lab, и оно позволяет новобранцам выделиться, реализовать идею, которая наверняка не уйдет в тираж. Никто не ждал, что студенческая поделка будет долго жить и получит развитие. В итоге спонтанная идея и выросла в коммерческий продукт.

На создание файлообменного проекта всего ушло 3700 часов или 8 месяцев работы. (Первоначальную студенческую разработку мы не считаем.) Из этого времени 64% было потрачено только на разработку, 20% — на тестирование, 16% — на менеджмент и анализ. За это время в работе над проектом поучаствовало 15 человек.

В разные периоды состав команды менялся. По мере роста коммерческого потенциала увеличивалась и команда. Сейчас проект не нуждается в большом количестве специалистов. Мы имеем готовый продукт с практичным дизайном, большими возможностями.

Проект разрабатывался в два этапа. Как я уже говорил, в рамках первого — мы создали рабочий прототип силами стажеров Juniors Lab (мы все же взяли их на работу). Вторым этапом стали перспективная доработка, адаптация для коммерческих проектов.

Первые прототипы разработки оказались удачными, и мы начали использовать продукт у себя в компании. Более того, разработка понравилась и нашим коллегам из ЛАНИТ. Поэтому файлообменная система прописалась и в их офисе в качестве корпоративного стандарта. Учитывая, что ЛАНИТ — это группа компаний с коллективом в несколько тысяч человек, наша система стала дополнительным мостиком между офисами, обеспечивая передачу файлов между сотрудниками. Это удобно, когда бизнес ведется разными компаниями, которые не имеют выхода в единую корпоративную сеть. Конечно, система активно использовалась и для отправки информации для клиентов.

Затем была коммерческая интеграция для крупной российской госкомпании, которой была востребована возможность шифрования данных. К сожалению, я не могу раскрыть все детали интеграции и назвать заказчика. Скажу только, что нам пришлось внести специфические изменения, которые усилили безопасность трансфера файлов и идентификацию пользователей. Этот проект стал для файлообменника началом госслужбы. Он работает на ней до сих пор.

Мы не забросили развитие проекта и разработали его обновленную версию.  Этот второй этап разработки уже практически закончился.

Первая версия выглядела так.


А вот обновленная версия.


Из чего мы сделали файлообменник (объясняем на схемах)


При создании платформы мы не делали упор на какие-то прорывные технологии.  Все довольно обычно, если рассматривать инструменты по отдельности, и интересно, когда смотришь на результат.

Мы использовали  open source фреймворк Spring. В качестве антивирусного решения был интегрирован мультиплатформенный пакет Clam AntiVirus. У команды Artezio хорошая экспертиза в области Java, и мы постарались ее использовать на всех этапах разработки.  



Сильные стороны


Аналитический департамент Artezio постоянно проводит исследования рынка, тестирует существующие технологические и программные платформы, составляет рейтинги. Пару месяцев назад мы сравнивали мессенджеры для ведения бизнеса. Последнее исследование посвятили файлообменным системам для корпоративного сектора.

Когда мы говорим о бизнес-решениях, мы фокусируем внимание на конфиденциальности хранения и передачи данных, эффективной антивирусной защите файлообменных платформ. В отдельную категорию вынесена стоимость их использования, которая очень часто является критическим фактором при выборе (тем более, что на рынке есть бесплатные решения).

Файлообменные решения мы оценили по следующим категориям: наличие мобильного клиента, интеграция с Active Directory, шифрование, защита антивирусом, функция запроса файла, отчет об использовании файла, отчет о сетевой активности, управление передачей большого количества файлов, цена (чем дороже решение, тем ниже оценка).

В таблице ниже — результаты нашего сравнения. Мы вошли в ТОП 9.  
Подробнее об исследовании файлообменных платформ вы можете прочитать здесь.

В госреестре


Как я уже говорил, файлообменник мы создавали для себя и успешно им пользуемся внутри компании. Но продукт быстро перерос эти рамки. В конце 2016 года наш продукт был внесен в Единый реестр отечественного ПО.

Чтобы попасть в реестр, нам потребовалось больше трех месяцев. Немало времени ушло на подготовку юридических документов для соблюдения правил регистрации.

Источник

Затевая процедуру регистрации, мы опирались на уже существующий опыт интеграции в государственной компании, о которой упоминалось выше. Тогда мы убедились, что наша разработка подходит для крупных компаний, которые предъявляют высокие требования к безопасности передачи данных.

Будущее, но не для всех...


Мы не планируем делать свой файлообменник публичным или каким-то другим образом лишать его корпоративного фокуса. В этом плане нет смысла соревноваться с Google Drive или Яндекс диск. SendFile позволяет использовать в качестве хранилища как внешнее облако, так и пространство непосредственно на сервере.

Коммерческим компаниям продукт может быть интересен, как инструмент который можно тонко настроить под себя. Конечно, заказчикам важно самим определять, как файлообменные процессы будут у них работать. Такой подход к развитию кажется нам правильным.  Он характерен и для новых проектов Artezio — от домашней бухгалтерии для мобильных устройств до uber-приложения по спасению людей и животных. Но об этом мы расскажем в других статьях.

На 16-летии Artezio
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/331912/


Метки:  

[Перевод] Изучите все языки программирования

Четверг, 29 Июня 2017 г. 12:55 + в цитатник
Когда я был ещё первокурсником, то познакомился с другим студентом, который утверждал, что может писать код на любом языке программирования, который я смогу назвать. Я был несколько шокирован и ответил подначкой:

— Что, даже на том нечитаемом эзотерическом языке, где есть всего пара команд, которые едва-едва симулируют машину Тьюринга?
— Да, этот язык называется brainfuck. Я знаю brainfuck.

И это был не трюк — мы проверили. Я называл известный мне язык программирования, он тратил пару минут в Интернете на то, чтобы освежить свои знания по нему — и был способен писать на этом языке работающие алгоритмы. Я никак не мог понять этого. Ему, как и мне, было тогда около 18 лет — как он мог в этом возрасте знать все эти языки?

image
Интерпретатор brainfuck, написанный на brainfuck

Сегодня у меня всё ещё вызывает уважение та демонстрация умений моего однокурсника, но я уже не шокирован ею. После того, как я сам выучил уже не один язык программирования, мне стало понятно, что отличаются друг от друга они значительно меньше, чем того можно было бы ожидать. На каком-то этапе обучения я уже обращал внимание не столько на синтаксис языка программирования, сколько на лежащие в его основе идеи, модель памяти, принципы выполнения инструкций. Всё это можно назвать теорией языков программирования, с точки зрения которой разные языки просто реализуют несколько различные версии одних и тех же базовых идей.

Сегодня я советую своим студентам «постараться изучить все языки программирования». Подумайте сами — ведь эта идея лучше, чем все вот эти «В этом году я выучу Go! Ой, нет, теперь говорят что в моде Rust — выучу лучше Rust! Или Swift ...». Просто выучите все — не ошибётесь. А эта статья, возможно, вам в этом немного поможет.

И сразу — отказ от ответственности :)


  • Я ни разу не говорю о том, что нужно действительно изучить 500+ (или сколько там сейчас актуальных?) языков программирования. Я говорю о том, что нужно понимать основные парадигмы и реализации паттернов, что даст вам возможность понимать почти любые конструкции в почти любом языке. А забывшееся ключевое слово или функцию из стандартной библиотеки всегда можно подсмотреть в документации
  • Это не пятиминутное дело. Возможно, вы далеко продвинетесь на этом пути за какой-то год. Но, знаете, вполне может уйти и десятилетие
  • Придётся изучить некоторые уже устаревшие или ещё не вошедшие в моду концепции
  • В зависимости от вашей основной работы (или жизненных целей) всё это может вам совершенно никогда не пригодиться

Тогда зачем этим заниматься?


Если вы видите какую-то значительную часть своей карьеры связанной с написанием программного обеспечения, то вам неплохо бы быть знакомым с языками программирования:

  • Даже не выбирая каких-то определённых языков программирования (или выбрав всего один) через пару лет работы программистом вы обнаружите, что уже писали (или читали) код на нескольких языках. Так почему-то случается всегда
  • Вы обнаружите, что имея знания о нескольких языках программирования, вам захочется каждый раз иметь возможность выбирать один из них для решения тех или иных задач
  • Языки программирования расцветают и устаревают. Знания нескольких из них дают вам возможность оставаться на острие прогресса, иметь доступ к более интересным проектам или хорошим компаниям
  • Многие важные проекты требуют фундаментального понимания работы компиляторов и знания нескольких языков программирования. Это реализации средств разработки, стандартных библиотек, предметно-ориентированные языки, IDE, браузеры, базы данных, средства статического анализа, и т.д.

Лично мне очень важным кажется именно последний пункт. Ras Bodik хорошо подчеркнул этот момент в своей лекции студентам Беркли, когда объяснял важность изучения курса разработки компиляторов:

Не будьте разработчиками шаблонного ширпотребного софта. Вместо этого, постарайтесь разрабатывать новые инструменты для пользователей и других программистов. Если провести историческую аналогию, то кем бы вам больше хотелось быть: работником за ткацким станком, ежедневно выполняющим рутинные операции или разработчиком новых моделей таких станков?

Шаг номер 0: перестаньте называться себя «программист на Rails (подставьте свой язык\платформу)»


Это простой, но важный шаг. Да, у вас наверняка уже есть какая-то специализация и вы, возможно, гордитесь ею и продолжаете её совершенствовать — это хорошо. Но в то же время такая самоидентификация создаёт ментальный барьер в вашей голове. Каждая новая технология, каждый новый язык воспринимается с оттенком скепсиса или критики, а возможно и пренебрежения — и это уже плохо. Начните называть себя просто «инженер по разработке программного обеспечения» или «программист».

Примером может быть Alex Gaynor — большой специалист по Python, один из Core Developers таких вещей как Django и PyPy, член совета директоров Python Software Foundation. Но однажды его попросил о помощи United States Digital Service — и Алекс провёл несколько лет в проектах на ASP (даже не на ASP.NET, а на том, старом ASP). А знаете, почему? Потому, что он — «инженер по разработке программного обеспечения», а не «Python-разработчик».

Шаг номер 1: перейдите на мета-уровень


Есть такой старый анекдот о том, как прикладной физик случайно попал на конференцию теоретических физиков. Он обратился к одному из докладчиков и спросил, как ему вообще удаётся думать о всех этих вещах, происходящих в 11 измерениях? Теоретический физик ответил: «О, это просто. Просто представь N измерений, а потом зафиксируй N равным 11».

Хороший программист может использовать тот же трюк. Вы можете слушать все эти россказни маркетологов о том, что «Go — это новый и амбициозный язык программирования», а можете просто определить его для себя, как компилируемый статически типизируемый язык со сборщиком мусора и CSP-стилем конкурентности. Swift может быть «новым и тщательно спроектированным» ну или просто компилируемым мультипарадигменным языком общего назначения реализованным на базе LLVM.

Для тех, кто никогда не имел возможности пройти курс изучения компиляторов, я могу посоветовать несколько отличных книг и онлайн-материалов. Во-первых, это курс от Alex Aiken, который когда-то был доступен на Coursera, а теперь — на собственной платформе Стенфорда (Lagunita). Неплох и курс от Беркли — CS164. Правда, они перестали публиковать в открытом доступе его обновления, но материалы 2012 вроде бы ещё доступны.

Каноническая настольная книга о компиляторах: «Compilers: Principles, Techniques & Tools». Она же — Книга Дракона. Как и все книги такого уровня, она имеет как неистовых фанов, так и непримиримых критиков. Лично я считаю её отличным материалом, но будьте готовым к тому, что некоторые её части придётся перечитывать не один раз до полного понимания. Есть более простая и направленная на практиков книга — это Language Implementation Patterns. Если ваш интерес ограничен какой-то конкретной практической задачей небольшого масштаба (вроде написания предметно-ориентированного языка), то эта книга подойдёт лучше, чем классическая Книга Дракона.

image
Книга Дракона

Шаг номер 2: начните с первоисточников


С хорошим теоретическим базисом будет проще изучать новые языки, но всё же не так легко взять и выучить все 500+ более-менее актуальных сегодня языков программирования. Поэтому начать можно с определения языков, в которых впервые были исследованы и реализованы некоторые принципиально новые идеи. На их основе изучение аналогичных инструментов в более новых языках будет уже тривиальной задачей.

Peter Norvig даёт несколько советов о том, какие парадигмы действительно важны, а также в каких языках они были впервые реализованы:

Выучите хотя бы 5 языков программирования. В ваш багаж знаний должен входить хотя бы один язык с классической абстракцией «классов» (это может быть Java или С++), один функциональный язык (вроде Lisp, ML или Haskell), один язык с поддержкой синтаксической абстракции (вроде Lisp), один язык декларативный язык (Prolog или шаблоны С++), один язык с продвинутой поддержкой параллелизма (Clofure или Go).

Я считаю этот совет отличной базой, но вы можете пойти по этому пути и дальше. Во-первых, я советую вам выучить язык С как можно раньше. Он настолько вездесущ и важен, что его просто нельзя обойти стороной. Кроме того, изучение С сделает намного проще изучение и остальных языков, поскольку ну очень многие из них взяли какие-то идеи или части синтаксиса именно из С.

Я также рекомендую изучить какой-нибудь ассемблер. Это может быть MIPS (если вы хотите потратить меньше времени на обучение) или x86 (если хотите иметь практическую пользу). Это даст вам больше знаний о компьютерной архитектуре и устройстве процессора, чем о языках программирования, но, если в будущем вы захотите написать компилятор, то именно эти знания вам и понадобятся. Возможно, когда-нибудь вместо ассемблера можно будет порекомендовать изучение формата промежуточного кода LLVM.

Peter Norvig рекомендует изучение декларативных языков, но я был бы здесь более конкретным и посоветовал бы изучить язык логического программирования. Это может быть как классический Prolog, так и miniKanren.

В разделе «языков с поддержкой параллелизма» к упомянутым вариантам я бы добавил ещё и CUDA. Это качественно другой масштаб параллелизма, ведь сотни ядер GPU не сравнятся с какими-то 4 ядрами обычных процессоров. Вы не только поймёте лучше устройство GPU, но и заложите для себя хороший фундамент для дальнейшего изучения машинного обучения (там параллелизм и вычисления на GPU очень пригодятся). Но важно понимать, что вам нужны как знания CUDA, так и один из упомянутых языков с параллелизмом для CPU (вроде Go, Clojure или Erlang).

Векторное программирование является ещё одной мощной парадигмой. Norvig зря пропустил языки с его поддержкой, ведь они имеют достаточно конкретное прикладное применение. Классическими примерами могут быть APL/J/K/Q, а также Matlab.

Также есть такая вещь, как узкоспециализированные языки. Иногда создание своего узкоспециализированного языка для каких-то конкретных задач может быть верным решением. Но для того, чтобы решиться на это, нужно изучить конкретные примеры того, когда такой подход оказался успешным. Я советую для этого посмотреть на вещи типа Frink.

Возможно, меня уже несколько понесло, но так трудно остановиться, когда вокруг столько всего вкусного! Кто-то скажет, что нельзя пропустить изучение Forth, чтобы понять стековые языки (хотя мне кажется работу стеков можно понять и в других языках). Кто-то скажет, что я упустил очень важный язык Х или целую категорию языков Y — и это будет правдой, ведь их немало.

Шаг номер 3: практикуйтесь


Достаточно просто составить список языков, которые вы планируете изучить. Но вот действительно взять и изучить — займёт какое-то время. Если вам повезёт, то какие-то из них вы сможете применить в своей основной работе. Но даже если этого не произойдёт, вы должны стараться сами найти способ изучить новый язык не только с теоретической, но и с практической точки зрения. Без теории прогресс будет медленным, но без практики вы вообще застрянете.

Хорошим способом начать изучение нового языка будет прочесть короткую выжимку на Hyperpolyglot или Learn X in Y Minutes. Это даст приблизительное понимание ключевых идей языка и уберёт страх перед незнакомым синтаксисом. Если вы уже знакомы с каким-то похожим языком, то Hyperpolyglot имеет очень удобную функцию сравнения языков — это может на удивление быстро продвинуть вас в изучении нового языка.

Другим полезным упражнением будет изучение даже не синтаксиса языка, а документа, в котором описывается мотивация его создателей. Это даст вам понимание того, почему люди вообще тратили своё время и силы на создание этой вещи, какова была их мотивация и может ли она сейчас или в будущем совпасть с вашей. Например, если вы побаиваетесь глубоко изучать С++ или скептически относитесь к некоторым решениям Страуструпа, вам определённо стоит прочесть книгу The Design and Evolution of C++. Большинство других языков программирования тоже имеют в некоторой мере аналогичные публикации.

image

После этого можно уже почитать книгу по языку или сразу перейти к попыткам написать на нём что-нибудь не очень сложное. Что касается книг, то трудно давать какие-то общие рекомендации, но я бы всё-таки советовал выбирать наиболее устоявшиеся, проверенные годами вещи, написанные для опытных программистов, изучающих новый язык. Такие книги часто написаны самими авторами языка и подчёркивают их основные идеи, в то время как более современные публикации направлены скорее на практическое применение языков в тех или иных сферах.

Наиболее быстрый путь приобщиться к новому языку, по моему мнению, это найти набор небольших задач и постепенно их решать. Хорошим источником может быть Exercism.io. Кроме задач там даже есть тесты, дающие возможность быстро оценить качество вашей реализации. Решение маленьких задач хорошо согласуется с изучением теории и с основной работе над другими проектами.

Как только вы освоитесь с синтаксисом и небольшие задачи уже не будут вызывать у вас проблем, я советую найти большой проект на этом языке. И это должен быть проект именно в той сфере, для которой был создан этот язык. Например, если вы изучаете C или Go — пишите утилиту командной строки с большим количеством системных вызовов. Если изучаете Python или Ruby — попробуйте написать что-то алгоритмическое и не очень требовательное к производительности (ИИ для крестиков ноликов :) ) ну и т.д.

Продолжайте копать


Учитывая количество языков программирования в мире и тот факт, что мы действительно используем даже очень старые языки вроде С, легко сделать вывод, что человечество уже изобрело все необходимые ему языки программирования. Но это очень спорное предположение. Есть очень существенный пробел между тем, что считается возможным запрограммировать и тем, что мы на сегодняшний день уже научились программировать. И проблема не в вычислительных ресурсах — со всеми существующими сегодня аппаратными платформами и облаками у нас есть где погонять код. Проблема именно в наших способах общения с компьютером, с тем, что мы не всегда можем удобно выразить, что же мы хотим получить на выходе программы и как это должно быть рассчитано.

Gerald Jay Sussman обратил внимание на это в его потрясающем докладе We Really Don’t Know How To Compute. Он использует несколько устаревший инструментарий, но и существующие сегодня инструменты не дают нам каких-то качественно иных подходов к решению освещённых им проблем.

image
Треугольник иллюзий. Человек сразу видит на этом рисунке треугольник, но нужно потратить изрядные усилия, чтобы научить компьютерную программу делать это.

Одним из людей, работающих на передовом крае науки в направлении разработки языков программирования, является Chris Granger, работающий над Eve. Он хочет разработать не только язык, но и весь сопутствующий инструментарий. Язык будет лишь одной из важных компонентов общей платформы. Я не знаю, станет ли его Eve новым поколением мейнстрим-платформ, но верю, что подобный подход, расширяющий и дополняющий язык вспомогательным инструментарием, может стать частью будущего. По крайней мере, это даст возможность лучше объяснить компьютеру, что же мы хотим от него получить. Как уже говорил выше Ras Bodik (и повторил я), мне бы хотелось, чтобы вы были частью этого прогресса. Изучайте все языки программирования, а не один какой-то язык. Понимание основ и принципов позволяет видеть дальше и быть готовым к появлению нового.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/331934/


Метки:  

[Из песочницы] N способов использовать Ahrefs при проведении поискового аудита

Четверг, 29 Июня 2017 г. 12:49 + в цитатник

Вступление


– Что он читает? – спросил соседа путник.
– Вступление для своей книги. Мы собираемся здесь каждое
воскресенье и показываем наброски.
– Вы писатели?
– Мы начинаем.

Мария Фариса. Авантюрин

Сервис Ahrefs — незаменимый инструмент в работе SEO-специалиста. Поэтому не удивительно, что описанию его функционала посвящен ряд обзоров. Но, к сожалению, большинство статей ограничивается перечислением основных функций сервиса, которые доступны в справке, без углубления в детали. И тут на ум приходит диалог из «Алисы в стране чудес»: «Знакомьтесь! Алиса, это пудинг! Пудинг, это Алиса!», который можно перефразировать как: «Знакомьтесь! Читатель, это Ahrefs! Ahrefs, это Читатель!». Но как Алисе хотелось отрезать кусочек пудинга и попробовать его, так и сервис хочется именно «опробовать».
 
Согласитесь, всегда интереснее читать не инструкцию, пусть даже пересказанную своими словами, на блендер/дрель/MozBar/AutoCad/Ahrefs и т.д. (выберите, что ближе), а конкретные «рецепты» использования техники/сервиса/программы. Например, «8 блюд для ребенка, которые можно приготовить при помощи блендера».
 
В данном обзоре мы хотим поделится опытом применения в компании Укрконтекст Ahrefs для проведения аудита сайтов, как на старте работы с проектами, так и для плановых повторяющихся проверок. В качестве примеров мы приводили характеристики сайтов, которые не продвигаются агентством. Данный сервис мы используем для следующих разделов поискового аудита:

  • съем исходных параметров сайта;
  • проверка ссылочных параметров;
  • подбор семантического ядра;
  • анализ конкурентов.

Съем начальных параметров сайта


Меня, напротив, больше интересует начало – в начале всегда столько надежд. У финала нет достоинств, кроме одного – показать, насколько ошибочны были те надежды.
Майнет Уолтерс. Уздечка для сварливых

На этапе съема начальных параметров сайта с помощью сервиса мы обычно фиксируем (рис. 1):

  • Количество ссылок (URL) — данная характеристика принимается в качестве точки отсчета и в дальнейшем позволяет оценить прогресс  в наращивании ссылочной массы в процессе продвижения (рис. 1, позиция 3);

  • Соотношение доменов-доноров к количеству бэклинков — четкие рекомендацие по максимально допустимому значению данного параметра отсутствуют.  Поскольку с одного донора не рекомендуется получать много ссылок, то данное соотношение в идеале должно стремиться к единице (рис. 1, поз. 4: поз. 3).

  • Рейтинг Ahrefs домена и основных страниц сайта — должен расти в процессе продвижения, кроме того, рейтинг более значимых для продвижения страниц должен быть выше, чем у других (рис. 1, поз. 1-2).




Рис. 1 — Параметры сайта, фиксируемые при проведении аудита (на примере interflora.co.uk)

LIFEHACK!
Эти данные уже дают интересную для SEO-специалиста «информацию к размышлению»:

  • есть ли у сайта ссылки в целом или придется наращивать профиль практически с нуля;
  • много ли ссылочных доноров, ведь нередко можно встретить 100 и более ссылок с одного ресурса;
  • распределяются ли внешние ссылки на страницы сайта пропорционально их важности для бизнес-целей клиента и/или продвижения (для этого надо предварительно выяснить и/или сформулировать эти цели).
 
Ряд описанных выше моментов могут показаться очевидными или несущественными, но, как писал создатель «Лолиты» Владимир Набоков: "Пестуйте детали, божественные детали". И хорошего специалиста в любой области отличает именно внимание к деталям.
  

Ссылочный аудит


Всё – сплошная банальность.
Ссылка на ссылку к ссылке.
– Главный вопрос, который теперь задают себе люди,
это не «В чём смысл существования?». – говорят губы.
– Главный вопрос – это «Откуда эта цитата?».

Чак Паланик. Уцелевший

Проведение полноценного ссылочного аудита без Ahrefs займет достаточно большое количество времени. Сервис помогает сэкономить время, позволяя быстро и с высокой степенью достоверности определять ссылочные характеристики, а именно:

  • Ключевые слова в ссылках на сайт (рис. 2). Удобно то, что эти данные доступны, как в виде облака анкоров, при этом  сразу видно, какие запросы преобладают: продающие (со словами «купить», «цена»), брендовые (название компании), безанкорные (no text)


Рис. 2 — Облако анкоров сайта, показываемое сервисом Ahrefs (на примере seicosecurity.com)
 
Также представлен детальный отчет по всем anchor text с возможностью сортировки по количеству ключевых слов, типу ссылок и другим характеристикам (рис. 3).


Рис. 3 — Распределение анкоров backlinks с фильтрацией типам ссылок (на примере seicosecurity.com)

LIFEHACK!
Данная информация будет полезной при составлении ссылочной стратегии продвижения сайта, когда важно не только количество ссылок и качество ссылочных доноров, но и наличие анкорных текстов различного типа.

  • Есть ли ссылки с сайтов подобной/смежной тематики  - данный параметр определяется путем просмотра списка сайтов-доноров (актуальный индекс или live index) и, при необходимости, с переходом на них. Логично, что на продающий судовые насосы сайт, есть ссылки с сайтов морской тематики (рис. 4).


Рис. 4 — Характеристики доменов-доноров (на примере pumpvendor.com)

  • Битые ссылки — это backlinks, которые ведут на удаленные страницы сайта (рис. 5). Хорошо, когда после перехода по ссылке Broken links (битые) показывается сообщение «На данный момент в нашем индексе нет битых бэклинков для запрошенного домена/URL» (рис. 5а). Данные параметр рекомендуется мониторить регулярно, поскольку после очередной проверки можно увидеть совсем другой результат (рис. 5б).


а


б

Рис. 5 — Проверка битых ссылок в разные периоды времени (на примере pumpvendor.com):
а — нет битых ссылок; б — обнаружены битые ссылки

 
Чтобы избавиться от битых ссылок, следует настраивать 301 или 302 редирект со страниц, которые удаляются и на которые ведут backlinks (если есть возможность). При таком решении ресурс не потеряет ссылки, а ссылочный вес будет передаваться на другие URL сайта (рис. 6).


Рис. 6 — Перенаправление  backlinks на другие страницы сайта interflora.co.uk)

  • Ссылки с трастовых сайтов с рейтингом Ahrefs выше, чем у проверяемого сайта, — хороший сигнал, как для SEO-специалиста, так и для поисковых систем. Тем не менее, даже у таких доноров мы проверяем количество исходящих ссылок, чтобы убедиться, что они не заспамлены.
 
  • Социальные сигналы, как известно, учитываются поисковыми системами при ранжировании сайтов. Для контентных сайтов (особенно новостных) этот фактор является достаточно весомым. Ahrefs в удобном виде показывает статистику по ресурсу в целом и в разрезе по страницам (рис. 7).


а


б

Рис. 7 — Социальные сигналы из 4 социальных сетей (на примере nytimes.com):
а — для всего сайта; б — для отдельных страниц


  • Отсутствие/наличие «ссылочного взрыва» на сайте определяется при помощи сводного графика изменения количества ссылающихся страниц и доменов. Как видно на проверяемом сайте за последние 30 дней (рис. 8а) и 12 месяцев (рис. 8б) не было резкого колебания в количестве ссылок.

Интерес также представляет сопоставлений чисел на графиках с количеством доменов и ссылающихся страниц. На голубых графиках видно, что количество ссылающихся доменов увеличивается одновременно с уменьшение ссылающихся страниц и составляет 1:4,4.


а


б

Рис. 8 — Динамика изменения количества ссылок и доменов-доноров (на примере pumpvendor.com):
а — в течение 30 дней; б — в течение года


  • Распределение по типам ссылок дает возможность оценить качество имеющейся ссылочной массы. Добротный ссылочный профиль должен включать различные группы и типы ссылок (текстовые, картинки, dofollow, nofollow и др.) с доноров с разнообразными доменными именами (рис. 9).

Ресурс pumpvendor.com, данные по которому показаны на рис. 9, является примером сайта с качественным ссылочным профилем, который выглядит естественно и включает dofollow/nofollow с преобладанием (но не доминированием) ссылок первого типа (рис. 9а). Есть текстовые бэклинки, ссылки-изображения, что хорошо для интернет-магазина с большим ассортиментом (рис. 9б). Среди  ссылочных доноров отсутствуют только домены *.gov и *.edu, хотя для сайта, предлагающего судовые насосы, это не критично (рис. 9в).  


а


б


в

Рис. 9 — Распределение бэклинков и сайтов-доноров по различным группам (на примере pumpvendor.com):
а, б — по типам ссылок; в — по доменным именам


Если рассматривать такой параметр, как языковое разнообразие бэклинков, то подавляющее большинство анкоров должны быть на языке основной аудитории сайта (рис. 10а). Разумеется, ссылочный профиль широко известных цитируемых ресурсов может включать ссылки на десятках языков без полного доминирования одного из них (рис. 10б).  


а

  
б

Рис. 10 — Распределение бэклинков по используемым языкам:
а — для pumpvendor.com; б — для nytimes.com

 
Например, доля англоязычных ссылок для pumpvendor.com составляет 83%, ссылки же на 12 других языках не превышают 0,6% (за исключением голландского — 2,5% от общего количества). У сайта авторитетнейшого издания New York Times присутсвуют бэклинки с анкорами на более чем 50 языках, при этом распределение следующее: на английский приходится почти 75%, 4,2% — на индонезийский — 4,2%; 1,5% и 1,2% — на испанский и немецкий, соответственно. Анкорные тексты на других языках составляют менее 1% каждый.
 
Распределение по языкам подобное New York Times для регионального новостного ресурса или локального коммерческого сайта будет выглядеть неестественно и, с большой долей вероятности, приведет к санкциям со стороны поисковых систем.

LIFEHACK!
При составлении ссылочной стратегии данная информация поможет определиться с типом backlinks, которые планируется получать на сайт разными способами, чтобы не было существенного перевеса ссылок определенного типа.
 

Подбор семантического ядра


Ключевые слова «Свинья», «Оружие» и «Сейф» напрягли мои нервы. Наф-Наф решил ограбить банк, чтобы оплатить ипотеку Ниф-Нифу и Нуф-Нуфу?
Из игры «The Missing: A Search and Rescue Mystery»

При подборе семантического ядра Ahrefs позволяет увидеть по каким ключевым словам сайт уже показывается в поиске, выдавая статистику по частоте запросов (замена Планировщику ключевых слов от Google Adwords, который теперь показывает не конкретные значения, а диапазон количества запросов), по релевантной странице, позиции в выдаче, а также ряду других полезных параметров (рис. 11).


Рис. 11 — Ключевые слова, по которым сайт показывается в ТОП-100 поисковой выдачи (на примере seicosecurity.com)
 
Кроме стандартных сниппетов в поисковой выдаче выдаются и другие результаты поисковой выдачи для сайта по данному запросу — SERP features (видео, контекстная реклама, изображение, расширенный сниппет обычный и т.д.). Например, на рис. 12 можно увидеть, что по ряду ключевых слов сайт показывается в поиске по картинкам, товарным объявлениям, расширенным сниппетам и т.д.


Рис. 12 — Результаты показа сайта в поисковой выдаче по запросу «myers pump parts» (на примере interflora.co.uk)

LIFEHACK!
Если сайт уже показывается по ряду ключевых слов в поисковой выдаче, то на начальном этапе лучше выбрать для продвижения те запросы, которые еще не в ТОП-10 (ТОП-3, ТОП-5), но уже в ТОП-20 (ТОП-30, ТОП-50). Если данных выдаваемых Ahrefs для проверяемого ресурса недостаточно, то можно проверить семантическое ядро конкурентов, с более высокими позициями в поисковой выдаче, или похожих по тематике сайтов. С большой долей вероятности, из их семантического ядра можно будет выбрать релевантные запросы, в достаточном для старта продвижения объеме, не используя другие инструменты.
 
При подборе поисковых запросов на сайт эффективным инструментом является Keywords Explorer, позволяющий подбирать варианты запросов. Для этого надо ввести основные запросы (или загрузить их в файле), которые описывают сайт, задать регион продвижения и выбрать из предлагаемых вариантов (рис. 13).


а


б

Рис. 13 — Подбор запросов с помощью инструмента Keywords Explorer:
а — форма ввода/выбора начальных данных; б — варианты запросов

 

Анализ конкурентов


– У вас там конкурент возле крыльца устроился.
– Конкурент? Мои конкуренты раков в реке кормят.

Артем Каменистый. Самый странный нуб

С помощью Ahrefs сравнение конкурентов можно проводить несколькими способами:

  • самый простой — это перейти по ссылке Competing domains и посмотреть данные по количеству уникальных и совпадающих ключевых слов. Если нужна более подробная информация по сайту-конкуренту, то она отображается в том же окне (рис. 14).


Рис. 14 — Конкуренты в поисковой выдаче (на примере seicosecurity.com)

  • Нередко бывает, что предлагаемый сервисом список конкурентов не устраивает, поскольку не учитывает особенностей бизнеса, предлагаемого ассортимента и ряда других нюансов. В этом случае после отбора конкурентов можно сравнить их основные параметры с сайтом, для которого проводится аудит, используя инструмент Пакетный анализ (рис. 15).


Рис. 15 — Анализ конкурентов в сервисе Ahrefs (на примере pumpvendor.com)
 
  • для более детального анализа ссылочной массы конкурентных ресурсов, в т.ч. и для выявления общих доноров, можно использовать Перекрестный анализ ссылок (рис. 16).


Рис. 16 — Поиск общих ссылочных доноров для сайтов
 
Если же исключить анализируемый сайт из списка, то можно узнать перечень непересекающихся ссылочных доноров для сайтов конкурентов. Вполне возможно, что в этом списке будут обнаружены интересные ресурсы, на которых можно получить ссылку и на свой сайт (рис 17).


Рис. 17 — Исключение сайта из списка при перекрестном анализе ссылок
 

Заключение


– Дживс, – говорю я, – знаете что?
– Нет, сэр.
– Знаете, кого я видел вчера вечером?
– Нет, сэр.
– Дж. Уошберна Стоукера и его дочь Полину.
– В самом деле, сэр?
– Должно быть, они в Англии.
– Такое заключение напрашивается, сэр.

Пэлем Гринвел Вудхауз. Дживс, Вы гений!

Как видно, сервис Ahrefs при его правильном и максимально полном использовании поможет сэкономить десятки часов рабочего времени специалиста по поисковой оптимизации, позволяя в достаточно сжатые сроки провести проверку по ряду пунктов чек-листа поискового аудита. Также хочется отметить, что широкий комплекс предлагаемых функций вполне оправдывает, не самую низкую цену сервиса, особенно если говорить о тарифе для агентств. Экономия времени и сил для получения статистики высокого качества в таком объеме как в Ahrefs, позволит быстро окупить эти затраты.

В данной статье мы постарались раскрыть часть возможностей сервиса, полезных SEO-специалисту. Функционал Ahrefs существенно шире, и, по нашему мнению, представляет интерес для специалистов разного профиля в сфере интернет-маркетинга, позволяя использовать его также для PPC и SMM.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/331916/


Метки:  

Эксплуатация дата-центра: что нужно делать самим

Четверг, 29 Июня 2017 г. 12:46 + в цитатник

Проверяю по чек-листу техническое обслуживание ИБП, проведенное подрядчиком.

Привет, Хабр! Меня зовут Кирилл Шадский. Сейчас я проектирую и строю дата-центры и серверные. До этого долго руководил службой эксплуатации дата-центров DataLine (на тот момент около 3000 стоек). Вместе со своей командой проходил аудит Uptime по процессам эксплуатации (Management and Operations) с результатом 92 балла из 100 возможных, а также вместе с коллегами участвовал в сертификации NORD 4. Сегодня хочу рассказать, как грамотно поделить эксплуатацию дата-центра или серверной между своей командой и подрядчиками.


Рулить дата-центром только собственными силами или силами подрядчика сложно. За весь свой опыт мало встречал какой-то один вариант в чистом виде, в основном какой-то гибрид. Что будет делать своя команда, а что подрядчики — каждая компания определяет сама, исходя из финансов, удобства, наличия квалифицированных инженеров (попробуйте найти специалиста по ДДИБП в Туле), а иногда политики. Каким бы замечательным ни был ваш подрядчик, есть моменты, которые лучше оставить себе. О них и поговорим ниже.


Из чего в целом складывается эксплуатация дата-центра/серверной


Прежде, чем пойдем делить эксплуатацию между собственной командой и подрядчиком, вспомним, что входит в этот процесс. Не буду подробно расписывать по каждому пункту — на эту тему можно целые книги писать. Выделю лишь основные моменты, которые можно условно поделить технические и организационные.


Технические моменты:


  • ТО инженерного оборудования и систем;
  • ремонт;
  • замена/модернизация;
  • мониторинг и обходы/осмотр оборудования и систем;

Организационные моменты:


  • ведение документации (инструкции, регламенты);
  • сбор и анализ статистики по поломкам и ремонтам оборудования;
  • закупка, хранение ЗИП и расходных материалов;
  • контроль за установкой ИТ-оборудования;
  • планирование ТО, назначение нарядов в работу;
  • подготовка и обучение персонала.

Что нельзя отдавать подрядчику


Все, что записано в технической части, можно и иногда нужно отдать на аутсорс. В этом случае у вас остается только функция управления и контроля над подрядчиками. Кто это должен делать с вашей стороны, расскажу чуть ниже.


С организационной составляющей сложнее. Почти все из этого списка придется делать самостоятельно. Давайте разберемся, почему так.


Ведение документации. Регламенты и инструкции нужны для того, чтобы у всей команды по эксплуатации было одинаковое представление о процессах и алгоритмах действий (например, о том, как надо тестировать ДГУ). А еще для того, чтобы «священное знание» не пропало вместе с заболевшим или уволившимся инженером Васей. В теории написание документации тоже можно доверить подрядчику, — тем более не каждый инженер серверной сможет или захочет заниматься бумажками. Но правда в том, что лучше вас ваши процессы никто не знает, а отслеживать все изменения и поддерживать актуальность документации, не работая постоянно на объекте, вовсе из разряда «миссия невыполнима». Как вариант, совместно с подрядчиком можно разработать документацию, а следить за ее актуальностью уже самим на месте.


Сбор и анализ статистики. Ситуация примерно такая же, как и в предыдущем пункте, поэтому берем ручку/клавиатуру и методично записываем «историю болезни» каждого кондиционера, ДГУ и дальше по списку оборудования. Раз в квартал, полгода или хотя бы год заглядываем туда, чтобы понять, что и как часто у нас ломается. Информация пригодится при составлении бюджета на эксплуатацию, планировании ЗИП, а также поможет выявить, есть ли оборудование, которому уже не помогут ремонты, и его нужно полностью менять.



Список поломок и типов ремонта для одного из кондиционеров.


Контроль за установкой ИТ-оборудования и управление мощностью. Про это многие забывают, а зря. Айтишник увидел свободный юнит и воткнул оборудование, не посмотрев, хватает ли мощности в данной стойке, холода, и вообще правильно ли установил. А все претензии потом инженеру эксплуатации — за моргнувшее питание (из-за того, что сервер c одним блоком питания подключен без АВР или обоими блоками питания в одно PDU) или тормоза оборудования из-за локального перегрева.
Чтобы уменьшить количество проблем по этой части, делайте понятные инструкции, чек-листы для тех, кто занимается установкой оборудования, и периодически проверяйте, как установлено ИТ-оборудование (особенно внимательно если загрузка зала перевалила за 50%). Периодичность проверок будет зависеть от того, как часто в машинном зале появляется новое оборудование.



Алгоритм для отработки запроса на установку нового оборудования.


Планирование работ (ТО и наряды на работу). Совместно с подрядчиком согласовываем график работ, исходя из загрузки персонала (не должно быть работ по всем системам в одну неделю). Также выдаем наряды на работу и согласовываем с подрядчиком форму приема работ (акт, чек-лист и пр.).


Бюджетирование. Лучше делать самостоятельно. В зависимости от того, как заведено у вас — каждый месяц, квартал или сразу на год, операционное или инвестиционное. Про составление бюджета своими силами скоро напишу отдельно. Если отдать подрядчику, угадайте, что будет с бюджетом? Правильно, скорее всего, он вырастет. Произойдет это даже не из корыстного умысла подрядчика, а просто потому что он не будет так печься об экономии, как это делали бы вы.


Даже если как-то умудрились отдать подрядчику все описанное выше, то сидеть, закинув ноги на стол, и просто оплачивать счета не получится: подрядчиков нужно обучать и контролировать.


Учить подрядчиков, в первую очередь, нужно жизни правилам работы в дата-центре и серверной. Кроме,«не пить, не курить и не дебоширить», есть и технические нюансы. Например, от вас подрядчик должен узнать, что при ТО кондиционеров нельзя отключать больше одного за раз, а перед тем, как отключить, нужно проверить, что остальные кондиционеры работают исправно.


Контроль за доступом на объект тоже останется на ваших плечах. Проверять актуальность списков, график доступа на объект (круглосуточный или только в рабочие дни), наличие корочек по электробезопасности и прочих необходимых удостоверений — ваша и только ваша задача.


В общем помните, что за работоспособность серверной или дата-центра отвечаете в конечном итоге вы, а не подрядчик.



Выдержка из правил работы в наших дата-центрах для подрядчиков.


«Главный инженер» — ответственный за все


Количество людей в вашей службе эксплуатации будет зависеть от заявленного SLA, объема инфраструктуры и того, как много вы планируете делать собственными силами. Универсальной формулу не подскажу, но вот на что можно опереться.


В каком режиме предоставляем услуги? Если 24х7, нужна круглосуточная служба поддержки как минимум из четырех человек, которые будут работать в четыре смены — сутки через трое. Если 8x5, то людей понадобится вдвое меньше.


Сколько нужно инженеров? Здесь многое будет зависеть от функций. Если нужно просто следить за мониторингом, то хватит и одного, если нужно делать обходы — минимум два человека. Если придется что-то делать руками (тянуть кроссировки, монтировать оборудование, менять фильтры в кондиционерах), то понадобится уже трое.


Храните ли ЗИП и расходники у себя? Если храните почти все, то понадобится кладовщик или закупщик, который будет следить за остатками и заказывать новые.


Вот как выглядит команда нашей площадки NORD на 2720 стоек.




Название должностей и количество людей будет для каждого случая свое, но одна функция обязательно должна присутствовать при любом раскладе. Это функция “быть ответственным”. Условно я называю эту позицию «главный инженер». В нашей иерархии это руководитель службы эксплуатации. Главная его функция — принимать решения, которые не обсуждаются: нужно ли вызывать подрядчика по аварийному вызову, можно ли отложить ремонт резервного кондиционера. Он же дает команду на отключение оборудования на время ТО, согласовывает срочные ремонтные работы, внеплановые закупки, руководит операцией по спасению дата-центра в случае аварий. К нему можно обратиться как в третейский суд, если инженер эксплуатации или подрядчик вдруг не может договориться с энергетиком о тестовых запусках ДГУ.
В целом, «главный инженер» в конечном итоге отвечает за всю эксплуатацию и инженерную инфраструктуру перед бизнесом или клиентам.


Подведем итоги. Программа «минимум» для службы эксплуатации дата-центра или серверной выглядит следующим образом:


  • контроль и обучение подрядчиков;
  • регулирование доступа на объект;
  • назначение нарядов на работу;
  • согласование графиков ТО;
  • ведение документации и учета;
  • анализ и сбор статистики;
  • составление бюджета.

Если у вас есть вопросы, пишите в личку или приходите на мой ближайший семинар 4 июля, сможете обо всем спросить лично.


Другие статьи по управлению инженерной инфраструктурой дата-центра и серверной:
Путь электричества в дата-центре
Ошибки в проекте дата-центра, которые вы ощутите только на этапе эксплуатации
Как создавалась система холодоснабжения дата-центра NORD-4
О животрепещущем в эксплуатации дата-центра
Как тестируют ДГУ в дата-центре
Мониторинг инженерной инфраструктуры в дата-центре. Часть 1. Основные моменты
Мониторинг инженерной инфраструктуры в дата-центре. Часть 2. Система энергоснабжения
Обслуживание инженерных систем ЦОД: что должно быть в договоре подряда
Dumb ways to die, или отчего “падают” дата-центры

Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/331902/


JaCarta Authentication Server и JaCarta WebPass для OTP-аутентификации в Linux SSH

Четверг, 29 Июня 2017 г. 12:21 + в цитатник
В этой статье мы поговорим об основных этапах настройки аутентификации в Linux SSH для замены парольной аутентификации одноразовыми паролями — в статье описан сценарий аутентификации в сессию SSH-подключения к Linux OS посредством одноразовых паролей с использованием устройства JaCarta WebPass.


JaCarta WebPass разработки компании «Аладдин Р.Д.» представляет собой USB-токен с «OTP на борту» для двухфакторной аутентификации пользователей при доступе к защищённым информационным ресурсам с использованием одноразового пароля, либо хранимого в памяти токена многоразового пароля.

Предложенный в статье сценарий подразумевает использование RADIUS сервера для проверки подлинности введённого одноразового кода, а также системы проверки OTP-значения. В качестве системы управления OTP-ключами мы будем использовать JaCarta Authentication Server (JAS) также разработки «Аладдин Р.Д.».

Пользователь, при установленном SSH-соединении, на этапе аутентификации будет вводить OTP-значение вместо пароля. PAM модуль отправит переданное значение на RADIUS Server, который проверит его и разрешит, либо запретит аутентификацию.

Используемое для демонстрации окружение


В данной инструкции производится настройка для следующих версий операционных систем:

  • Microsoft Windows Server 2012;
  • Ubuntu Server 16;
  • Microsoft Windows 7.

Требования к окружению


Для Windows Server необходимо создать домен, добавить роль NPS. Для этого следуйте советам ниже.

Откройте оснастку для добавления роли NPS.



При выборе служб и компонентов выберите Network Policy Server.



После этого вам станет доступна оснастка NPS.



Настройка на стороне RADIUS сервера


На стороне сервера необходимо выполнить следующие шаги:

  • добавьте радиус клиента с IP-адресом, либо именем Linux сервера;
  • выберите оснастку NPS на сервере.



В меню оснастки выберите пункт NPS – RADIUS Clients and Servers – RADIUS Clients, затем правым кликом вызовите контекстное меню и нажмите New.


Введите настройки клиента для подключения к RADIUS серверу: имя, отображаемое в оснастке, адрес либо имя клиента, общий секрет для клиента и сервера (необходимо придумать).


Создайте доменного пользователя, имя которого будет использоваться для аутентификации на Linux сервере.

Подготовка JaCarta WebPass


Для инициализации JaCarta WebPass необходимо открыть приложение Web Pass Tool, которое входит в состав программного обеспечения «Единый Клиент JaCarta». Загрузить ПО можно по ссылке https://www.aladdin-rd.ru/support/downloads/jacarta/.

Откройте приложение JaCarta WebPass Tool, выберите вкладку ОТР.


Выберите слот для инициализации, затем нажмите в меню пункт Инициализация.


В настройках укажите Одноразовый пароль, первый механизм из выпадающего списка, отметьте Сохранение параметров инициализации и нажмите Далее.


Выберите формат файла JAS, а также путь до папки, куда будет сохранён файл инициализации. Этот файл потребуется для подключения ключа к JAS.


Введите PIN-код для ключа и нажмите Далее.


Настройка на стороне JAS


На стороне JAS необходимо выполнить перечисленные ниже шаги.

Добавьте устройство OTP в систему, привяжите пользователя к устройству. Для этого откройте оснастку JAS.

В оснастке выберите Импорт ключевых носителей.


Укажите путь до файла с данными инициализации JaCarta WebPass (файл можно получить при инициализации слота в приложении Web Pass Tool, который входит в состав программного обеспечения «Единый Клиент JaCarta». Загрузить ПО можно по ссылке https://www.aladdin-rd.ru/support/downloads/jacarta/).


В случае успеха нажмите Далее.


Выберите добавленный ключ, нажмите Свойства в меню. Для привязки к пользователю следует указать имя и адрес электронной почты для доменного пользователя.


Перед активацией следует произвести синхронизацию устройства, для этого нажмите Синхронизация в меню, укажите в окно ОТР 1 и нажмите на кнопку устройства JaCarta WebPass, затем повторите с окном ОТР 2.


Для активации выберите пункт Включить.


Настройка на стороне Linux Server


На стороне Linux сервера все операции необходимо производить от имени root.

# sudo -i

# apt-get install libpam-radius-auth 


Добавьте значения для вашего RADIUS сервера, IP-адрес, либо имя сервера, общий секрет в файл /etc/pam_radius_auth.conf.

# nano /etc/pam_radius_auth.conf

#  The timeout field controls how many seconds the module waits before
#  deciding that the server has failed to respond.
#
# server[:port] shared_secret      timeout (s)
[SERVER IP] [Общий секрет]           3 

В файле /etc/pam.d/sshd добавьте строку auth sufficient pam_radius_auth.so над include common-auth, как показано ниже.

# nano /etc/pam.d/sshd 

# PAM configuration for the Secure Shell service

# Standard Un*x authentication.
auth sufficient pam_radius_auth.so
@include common-auth


# Disallow non-root logins when /etc/nologin exists. 

Создайте локального пользователя с именем, соответствующим пользователю в AD.

Проверка решения


Для проверки воспользуемся операционной системой Microsoft Windows 7 с установленным SSH клиентом PUTTY.

Откроем Putty и укажем адрес интересующей нас машины на Linux.


Введите имя пользователя, Ввод, затем нажмите на кнопку устройства JaCarta WebPass, Ввод.


Далее введите команду SSH [Servername2], Ввод, нажмите кнопку на устройстве, Ввод.

Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/331908/



Поиск сообщений в rss_rss_hh_new
Страницы: 1437 ... 1029 1028 [1027] 1026 1025 ..
.. 1 Календарь