Команда Университета ИТМО вышла в финал Всемирной олимпиады роботов |
Метки: author itmo разработка робототехники блог компании университет итмо университет итмо wro 2017 робототехника |
Подборка интересных мероприятий на неделю в Москве |
Метки: author rvnikita хакатоны учебный процесс в it мероприятие мероприятия конференции митап митапы конференция хакатон маркетинг аналитика it |
[Перевод] Как эффективно работать с рекламным форматом Playable ads: пять типичных ошибок |
|
VMware vCloud Director. Что нового в версии 9.0? |
|
[Перевод] [Перевод] Переосмысление drag&drop |
react-beautiful-dnd
react-beautiful-dnd
, которая делает перетаскивание (drag&drop) внутри списков в вебе красивыми, естественными и доступными. react-beautiful-dnd
заключается в осязании (physicality): хочется, чтобы у пользователей было ощущение будто они передвигают физические объекты. Это лучше всего продемонстрировать контрастными примерами — поэтому давайте рассмотрим некоторые стандартные принципы использования этой техники, и посмотрим как можно их улучшить.react-beautiful-dnd
действия перетаскиваемых элементов основаны на центре притяжения — независимо от того, откуда пользователь берет элемент. К действиям перетаскиваемых объектов применимы те же правила, что и к набору гирь. Ниже приведены некоторые правила, которые используются даже с подвижными элементами при естественном перетаскивании:react-beautiful-dnd
поддерживает возможность осуществлять функцию перетаскивания с помощью одной лишь клавиатуры. Это позволяет пользователям получить опыт использования этой функции еще и с клавиатуры и открывает возможность узнать об этой функции тем, кто был с ней ранее не знаком.React-beautiful-dnd
усердно работает, чтобы избежать периодов отсутствия интерактивности настолько, насколько это возможно. Пользователь должен иметь ощущение, что он контролирует интерфейс, а не ждет пока закончится анимация, прежде чем он сможет продолжить взаимодействие с интерфейсом. react-motion
). Это приводит к тому, что когда элемент падает он кажется более весомым и ощутимым.React-beautiful-dnd
упорно трудится, чтобы убедиться, что он не влияет на обычные вкладки потока документов. Например, если вы добавляете теги привязки, то пользователь по-прежнему сможет перейти непосредственно к привязке, а не к элементу, к которому осуществляли привязку. Мы добавляем tab-index
к определяемым элементам, чтобы убедиться, что даже если вы не добавляете что-либо к тому, что обычно является интерактивным элементом, (например, div
), то пользователь все равно сможет получить доступ к нему с помощью своей клавиатуры, чтобы перетащить его куда-либо.react-dnd
. Она проделывает невероятную работу по обеспечению огромным набором примитивов функции перетаскивания, которые особенно хорошо работают с HTML5, несмотря на то что HTML5 мало с чем совместим. React-beautiful-dnd
это абстракция высокого уровня, построенная специально для вертикальных и горизонтальных списков. С таким подмножеством функциональности react-beautiful-dnd
предлагает действенный, красивый и естественный опыт использования функции перетаскивания. Однако, react-beautiful-dnd
не обеспечивает широтой возможностей, предоставляемых react-dnd
. Таким образом, эта библиотека может быть не для вас, все зависит от того в каких целях вы собираетесь её использовать.React-beautiful-dnd
спроектирована быть чрезвычайно производительной — это часть её ДНК. Она основана на предыдущих исследованиях производительности реакции, которые можно прочитать здесь и здесь. React-beautiful-dnd
предназначена для выполнения минимального количества исполнений, необходимых для каждой задачи. react-redux
, reselect
и memoize-one
.requestAnimationFrame
- благодаря raf-schd
memoize-one
React-beautiful-dnd
использует несколько различных стратегий тестирования, в том числе модульное тестирование, тестирование производительности и интеграционное тестирование. Проверка различных аспектов системы способствует повышению ее качества и стабильности.flowtype
для повышения внутренней согласованности и устойчивости кода. Она также предоставляет историю документации разработчика о том, как работает API.react-beautiful-dnd
. Для получения дополнительной информации и примеров перейдите в архив.react-beautiful-dnd
была невероятной! Большое спасибо. Мы уже добавили некоторые новые функции, такие как перемещение по-горизонтали.react-beautiful-dnd
работать на мобильных и планшетных устройствах). Это всегда было в планах и мы уже очень скоро начнем над этим работать! Библиотека еще совсем новая.react-beautiful-dnd
. Я написал блог. “Естественное движение клавиатуры между списками", в котором говорится о том, как мы пришли к тому, чтобы создать это обновление таким образом, чтобы оно ощущалось естественным.
Метки: author MagisterLudi интерфейсы веб-дизайн usability блог компании edison дизайн react ui frontend development javascript ux edisonsoftware |
Разбираем WeChat — второй по популярности мессенджер в мире |
private static void Write7BitEncodedInt(BinaryWriter store, int value)
{
Debug.Assert(store != null);
// Write out an int 7 bits at a time. The high bit of the byte,
// when on, tells reader to continue reading more bytes.
uint v = (uint)value; // support negative numbers
while (v >= 0x80)
{
store.Write((byte)(v | 0x80));
v >>= 7;
}
store.Write((byte)v);
}
Метки: author Sqwony блог компании бринго reverse engineering криптография информационная безопасность мессенджеры messengers |
[Перевод] Три карьерных пути в IT: основатель, руководитель или наёмный работник |
Метки: author m1rko развитие стартапа карьера в it-индустрии стартап основатель руководитель наемный сотрудник карьера |
Аналитика Solar JSOC: как атакуют российские компании |
|
[Из песочницы] Пишем генератор ip-адресов на Python со свистелками, дуделками и графической оболочкой Tkinter |
generator()
, которой передаём аргумент amount
:def generator(amount):
for n in range(amount):
#следуя Дзену Питона, явно создаю 4 переменных для наглядности
a = randint(0,255)
b = randint(0,255)
c = randint(0,255)
d = randint(0,255)
#открываем файл в режиме редактирования
f = open('ip-addresses.txt', 'a', encoding='utf-8')
f.write(str(a)+'.'+str(b)+'.'+str(c)+'.'+str(d)+'\n')
f.close()
#ну и почему бы не выдать в консоль сообщение об успешной генерации?
print('Success!')
from random import randint
, чтобы не засорять пространство имён).Entry
), кнопку (виджет Button
), желательно поле вывода логов, ну и добавить название программы, чтобы было с первого взгляда понятно, для чего она предназначена:from tkinter import *
#создаём главное окно
root = Tk()
label1=Label(root, text="Генератор ip-адресов")
label1.grid()
#создаём поле Frame, далее упаковываем виджеты в него
frame = Frame(root)
frame.grid()
label2=Label(frame, text='Количество:')
label2.grid(row=1,column=1)
#поле ввода количества адресов
entry_amount = Entry(frame, width=4, borderwidth=5)
entry_amount.grid(row=1,column=2)
#кнопка генерации
button1 = Button(frame, text="Сгенерировать")
button1.grid(row=1, column=3, padx=(10,0))
#поле вывода логов
output = Text(frame, bg="lightblue", font="Arial 9", width=45, height=3)
output.grid(row=2, columnspan=8)
root.mainloop()
def handler():
try:
#считываем методом .get()
amount = int(entry_amount.get())
generator(amount)
except ValueError:
notif("Невозможно определить количество")
#создаём также функцию, передающую лог в поле вывода сообщений
def notif(value):
output.delete("0.0","end") #очищаем поле перед следующим логом
output.insert("0.0",value)
def notif(value)
, в которую передаётся аргумент-запись, чтобы упростить код при написании функционала, когда потребуется выводить другие ошибки. Также следует добавить в описание виджета button1
метод со значением нашей функции обработчика command=handler
(без круглых скобок в конце). button1 = Button(frame, text="Сгенерировать", command=handler)
command
возможно потребуется прописать from distutils import command
в импортах. Вот и всё, собственно, программа выполняет свою основную задачу.def delete()
:def delete():
try:
remove('ip-addresses.txt')
inserter("Файл ip-addresses.txt успешно удален")
except:
inserter("Невозможно удалить несуществующий файл")
delete
:button2 = Button(frame, text="Удалить файл", command=delete)
button2.grid(row=1, column=4, padx=(10,0))
frame
. Не забываем добавить в импорты строчку from os import remove
. Всё, с кнопкой «Удалить» разобрались.generator
:def generator(amount, port=''):
for n in range(amount):
a = randint(0,255)
b = randint(0,255)
c = randint(0,255)
d = randint(0,255)
f = open('ip-addresses.txt', 'a', encoding='utf-8')
f.write(str(a)+'.'+str(b)+'.'+str(c)+'.'+str(d)+port+'\n')
f.close()
#для каждого хода цикла присваиваем переменной prc целочисленное значение, которое n составляет от amount при условии, что amount — 100%
prc = int(n//(amount/100))
print(str(prc)+'%')
print('Success!')
#выводим уже в GUI сообщение об успешной генерации txt-файла
notif("IP-адреса успешно сгенерированы и записаны в\nip-addresses.txt")
def generator(amount, port=''):
prc_bfr=0 #здесь будем запоминать прогресс предыдущего хода цикла
for n in range(amount):
a = randint(0,255)
b = randint(0,255)
c = randint(0,255)
d = randint(0,255)
f = open('ip-addresses.txt', 'a', encoding='utf-8')
f.write(str(a)+'.'+str(b)+'.'+str(c)+'.'+str(d)+port+'\n')
f.close()
prc = int(n//(amount/100))
#проверяем, равняется ли предыдущее значение переменной prc текущему
if(prc!=prc_bfr):
print(str(prc)+'%')
prc_bfr = prc
print('Success!')
notif("IP-адреса успешно сгенерированы и записаны в\nip-addresses.txt")
Radiobutton
, которые будут определять два режима: генерация с портами и без портов. Также следует добавить виджет Entry
для ввода порта:label2 = Label(frame, text='Указать порт:')
label2.grid(row=2,column=1)
entry_port = Entry(frame, width=4, borderwidth=5, state=DISABLED)
entry_port.grid(row=2,column=2)
#объявляем var1 для работы с radiobutton'ами
var1 = IntVar()
check_port1 = Radiobutton(frame, text='С портами', variable=var1, value=1, command=lock)
check_port1.grid(row=2,column=3)
check_port2 = Radiobutton(frame, text="Без портов", variable=var1, value=0, command=lock)
check_port2.grid(row=2,column=4)
entry_port
по умолчанию у нас скрыт. Каждый check_port
выполняет функцию lock()
при активации, которая соответственно скрывает/активирует поле ввода портов. Опишем функцию lock
:def lock():
#если активирован check_port2:
if var1.get() == 1:
entry_port.configure(state=NORMAL)
#если активирован check_port1:
elif var1.get() == 0:
entry_port.configure(state=DISABLED)
handler
конструкцию if-else, которая выполняется в зависимости от режима генерации (от значения var1
):def handler():
try:
amount = int(entry_amount.get())
#проверяем режим генерации
if var1.get() == 1:
port = ':'+str(int(entry_port.get())) #выполняем явное преобразование в int для проверки целочисленности данных, и снова в str, чтобы добавить двоеточие к порту
generator(amount, port)
else:
#иначе передаём генератору один аргумент — количество
generator(amount)
except ValueError:
notif("Невозможно определить количество/порт")
def generator(amount, port='')
port
непосредственно в объявлении функции, мы сделали его необязательным, и он у нас изменит значение при вызове функции в режиме генерации с портами. Также добавляем его при записи в текстовый файл: f.write(str(a)+'.'+str(b)+'.'+str(c)+'.'+str(d)+port+'\n')
import tkinter
import random
from tkinter import *
from random import randint
from os import remove
from distutils import command
print('Logs terminal:')
def generator(amount, port=''):
prc_bfr=0
for n in range(amount):
a = randint(0,255)
b = randint(0,255)
c = randint(0,255)
d = randint(0,255)
f = open('ip-addresses.txt', 'a', encoding='utf-8')
f.write(str(a)+'.'+str(b)+'.'+str(c)+'.'+str(d)+port+'\n')
f.close()
prc = int(n//(amount/100))
if(prc!=prc_bfr):
print(str(prc)+'%')
prc_bfr = prc
print('Success!')
notif("IP-адреса успешно сгенерированы и записаны в\nip-addresses.txt")
def notif(value):
output.delete("0.0","end")
output.insert("0.0",value)
def handler():
try:
amount = int(entry_amount.get())
if var1.get() == 1:
port = ':'+str(int(entry_port.get()))
generator(amount, port)
else:
generator(amount)
except ValueError:
notif("Невозможно определить количество/порт")
def delete():
try:
remove('ip-addresses.txt')
notif("Файл ip-addresses.txt успешно удален")
except:
notif("Невозможно удалить несуществующий файл")
def lock():
if var1.get() == 1:
entry_port.configure(state=NORMAL)
elif var1.get() == 0:
entry_port.configure(state=DISABLED)
root = Tk()
label1=Label(root, text="Генератор ip-адресов")
label1.grid()
frame = Frame(root)
frame.grid()
label2=Label(frame, text='Количество:')
label2.grid(row=1,column=1)
entry_amount = Entry(frame, width=4, borderwidth=5)
entry_amount.grid(row=1,column=2)
button1 = Button(frame, text="Сгенерировать", command=handler)
button1.grid(row=1, column=3, padx=(10,0))
button2 = Button(frame, text="Удалить файл", command=delete)
button2.grid(row=1, column=4, padx=(10,0))
label2=Label(frame, text='Указать порт:')
label2.grid(row=2,column=1)
entry_port = Entry(frame, width=4, borderwidth=5, state=DISABLED)
entry_port.grid(row=2,column=2)
var1 = IntVar()
check_port1 = Radiobutton(frame, text='С портами', variable = var1, value=1, command=lock)
check_port1.grid(row=2,column=3)
check_port2 = Radiobutton(frame, text="Без портов", variable = var1, value=0, command=lock)
check_port2.grid(row=2,column=4)
output = Text(frame, bg="lightblue", font="Arial 9", width=45, height=3)
output.grid(row=3, columnspan=8)
root.mainloop()
Метки: author Nautics889 python tkinter ip генератор туториал |
Отладка PL/SQL кода для внешней сессии БД |
create or replace procedure checkout_with_pipe_and_alert(p_cycle_size in number) is
c_method_error constant number := -20000;
c_method_error_message constant varchar2(4000) := 'Cycle size should be > 0';
l_power_value number;
l_i_value number := 1;
l_pipe pls_integer;
begin
if p_cycle_size > 0 then
for i in 1 .. p_cycle_size
loop
l_power_value := power(i, 2);
l_i_value := l_i_value * i;
--Send pipe info
l_pipe := dbms_pipe.create_pipe(pipename => 'pipe');
dbms_pipe.pack_message(i || '.l_power_value:=' || l_power_value || ' l_i_value=' || l_i_value);
l_pipe := dbms_pipe.send_message(pipename => 'pipe');
--Send alert info
dbms_alert.register('alert');
dbms_alert.signal(name => 'alert',
message => i || '.l_power_value:=' || l_power_value || ' l_i_value=' || l_i_value);
dbms_alert.remove(name => 'alert');
end loop;
else
raise_application_error(c_method_error, c_method_error_message);
end if;
end checkout_with_pipe_and_alert;
begin
checkout_with_pipe_and_alert(5);
end;
Метки: author ympukhov отладка oracle pl/sql developer oracle pl/sql |
3 кейса применения анализа данных в сфере недвижимости. Data Science Week 2017. Обзор. Часть 1 |
model = sm.tsa.statespace.SARIMAX(table_name[:], exog = Cal[:],
order=(1,1,0), seasonal_order=(2,1,0,7), enforce_stationarity =
False).fit()
model2 = sm.tsa.statespace.SARIMAX(table_name[:], exog = Cal[:],
order=(1,0,0), seasonal_order=(2,0,0,7), enforce_stationarity =
False).fit()
forecast['forecast'] = model.forecast(b, exog =
Cal_Pred[:b])*2/3+model2.forecast(b, exog = Cal_Pred[:b])*1/3
Метки: author a-pichugin обработка изображений машинное обучение data mining big data блог компании new professions lab data science week dsw real estate anti-fraud |
[Перевод] Что последует за вебом? |
Со временем многие технологии сошлись на концепции источника как на удобной единице изоляции. Однако многие из ныне используемых технологий, такие как куки [RFC6265], созданы раньше, чем современная концепция источника в вебе. У этих технологий часто другие единицы изоляции, что ведёт к уязвимостям.
enum SortBy {
Featured,
Relevance,
PriceLowToHigh,
PriceHighToLow,
Reviews
}
@PermazenType
class AmazonSearch(
val query: String,
val sortBy: SortBy?
) : LinkPacket
@PermazenType
. Что это значит?Permazen — совершенно новый подход к стойкому программированию. Вместо того, чтобы начинать разработку со стороны технологии хранения, он начинает со стороны языка программирования, задавая простой вопрос: «Какие проблемы присущи стойкому программированию, независимо от языка программирования или технологии СУБД, и как их можно решить на уровне языка наиболее простым, самым корректным и самым естественным с точки зрения языка способом?»
Any
), среда выполнения может попробовать определить, какими должны быть исходные типы, и транслировать эту информацию обратно в IDE. Затем она может предложить замену на лучшие аннотации типов. Если разработчик сталкивается с ошибками приведения типа во время работы программы, то IDE может предложить снова ослабить ограничение.
|
[Перевод] Симуляция физического мира |
|
В абзаце всё должно быть прекрасно |
Метки: author pantlmn типографика веб-дизайн абзац пробел пробелы latex indesign |
Профилирование PL/SQL кода при помощи IDE PL/SQL Developer |
create or replace procedure check_cycle_performance(p_cycle_size in number) is
c_method_error constant number := -20000;
c_method_error_message constant varchar2(4000) := 'Cycle size should be > 0';
l_power_value number;
l_dual_value number;
begin
if p_cycle_size > 0 then
--Cycle with power calculation
for i in 1 .. p_cycle_size
loop
l_power_value := power(i, 2);
end loop;
--Cycle with switching context(sql-pl/sql)
for i in 1 .. p_cycle_size
loop
select i into l_dual_value from dual;
end loop;
else
raise_application_error(c_method_error, c_method_error_message);
end if;
end check_cycle_performance;
Метки: author ympukhov программирование высокая производительность oracle oracle pl/sql профилирование pl/sql developer |
Про интервальные индексы |
create table reservations(during tsrange);
insert into reservations(during) values
('[2016-12-30, 2017-01-09)'),
('[2017-02-23, 2017-02-27)'),
('[2017-04-29, 2017-05-02)');
create index on reservations using gist(during);
select * from reservations where during && '[2017-01-01, 2017-04-01)';
create table test_points_8d (p integer[8]);
COPY test_points_8d from '/home/.../data.csv';
create index zcurve_test_points_8d on test_points_8d (zcurve_num_from_8coords (p[1], p[2], p[3], p[4], p[5], p[6], p[7], p[8]));
{210000,200000,210000,200000,0,0,0,0}
{210000,200000,210000,200000,10,0,1,1}
{210000,200000,210000,200000,20,0,2,2}
{210000,200000,210000,200000,30,0,3,3}
{210000,200000,210000,200000,40,0,4,4}
{210000,200000,210000,200000,50,0,5,5}
{210000,200000,210000,200000,60,0,6,6}
{210000,200000,210000,200000,70,0,7,7}
{210000,200000,210000,200000,80,0,8,8}
{210000,200000,210000,200000,90,0,9,9}
...
select c, t_row from (select c, (select p from test_points_8d t where c = t.ctid) t_row
from zcurve_8d_lookup_tidonly('zcurve_test_points_8d',
200000,0,200000,0,100,0,10,0,
1000000,300000,1000000,300000,1000000,1000,1000000,11
) as c) x;
c | t_row
-------------+-------------------------------------------
(0,11) | {210000,200000,210000,200000,100,0,10,10}
(0,12) | {210000,200000,210000,200000,110,0,11,11}
(103092,87) | {260000,250000,210000,200000,100,0,10,10}
(103092,88) | {260000,250000,210000,200000,110,0,11,11}
(10309,38) | {210000,200000,260000,250000,100,0,10,10}
(10309,39) | {210000,200000,260000,250000,110,0,11,11}
(113402,17) | {260000,250000,260000,250000,100,0,10,10}
(113402,18) | {260000,250000,260000,250000,110,0,11,11}
(206185,66) | {310000,300000,210000,200000,100,0,10,10}
(206185,67) | {310000,300000,210000,200000,110,0,11,11}
(216494,93) | {310000,300000,260000,250000,100,0,10,10}
(216494,94) | {310000,300000,260000,250000,110,0,11,11}
(20618,65) | {210000,200000,310000,300000,100,0,10,10}
(20618,66) | {210000,200000,310000,300000,110,0,11,11}
(123711,44) | {260000,250000,310000,300000,100,0,10,10}
(123711,45) | {260000,250000,310000,300000,110,0,11,11}
(226804,23) | {310000,300000,310000,300000,100,0,10,10}
(226804,24) | {310000,300000,310000,300000,110,0,11,11}
(18 rows)
EXPLAIN (ANALYZE,BUFFERS) select c, t_row from (select c, (select p from test_points_8d t where c = t.ctid) t_row
from zcurve_8d_lookup_tidonly('zcurve_test_points_8d',
200000,0,200000,0,0,0,10,0,
1000000,300000,1000000,300000,1000000,1000,1000000,11) as c) x;
Метки: author zzeng алгоритмы postgresql open source spatial index r-tree zorder субд rdbms |
Смарт контракты Ethereum: что делать при ошибке в смартконтракте или техники миграции |
contract ERC20base {
uint public totalSupply;
function balanceOf(address _who) public constant returns(uint);
}
contract NewContract {
uint public totalSupply;
mapping (address => uint) balanceOf;
function NewContract(address _migrationSource, address [] _holders) public {
for(uint i=0; i<_holders.length; ++i) {
uint balance = ERC20base(_migrationSource).balanceOf(_holders[i]);
balanceOf[_holders[i]] = balance;
totalSupply += balance;
}
require(totalSupply == ERC20base(_migrationSource).totalSupply());
}
}
contract NewContract {
uint public totalSupply;
mapping (address => uint) balanceOf;
address public migrationSource;
address public owner;
function NewContract(address _migrationSource) public {
migrationSource = _migrationSource;
owner = msg.sender;
}
function migrate(address [] _holders) public
require(msg.sender == owner);
for(uint i=0; i<_holders.length; ++i) {
uint balance = ERC20base(_migrationSource).balanceOf(_holders[i]);
balanceOf[_holders[i]] = balance;
totalSupply += balance;
}
}
}
address [] public holders;
mapping (address => bool) public isHolder;
address [] public holders;
….
if (isHolder[_who] != true) {
holders[holders.length++] = _who;
isHolder[_who] = true;
}
contract MigrationAgent {
function migrateFrom(address _from, uint256 _value);
}
contract TokenMigration is Token {
address public migrationAgent;
// Migrate tokens to the new token contract
function migrate() external {
require(migrationAgent != 0);
uint value = balanceOf[msg.sender];
balanceOf[msg.sender] -= value;
totalSupply -= value;
MigrationAgent(migrationAgent).migrateFrom(msg.sender, value);
}
function setMigrationAgent(address _agent) external {
require(msg.sender == owner && migrationAgent == 0);
migrationAgent = _agent;
}
}
contract NewContact is MigrationAgent {
uint256 public totalSupply;
mapping (address => uint256) public balanceOf;
address public migrationHost;
function NewContract(address _migrationHost) {
migrationHost = _migrationHost;
}
function migrateFrom(address _from, uint256 _value) public {
require(migrationHost == msg.sender);
require(balanceOf[_from] + _value > balanceOf[_from]); // overflow?
balanceOf[_from] += _value;
totalSupply += _value;
}
}
function () payable {
if (state = State.Migration) {
migrate();
} else { … }
}
Метки: author isvirin solidity блокчейн смартконтракт ethereum миграция |
Сказка о хорошо выстроенных бизнес-процессах, или как одна проблема хакнула идеально работающую систему разработки |
Метки: author NickPasko управление разработкой управление проектами управление продуктом agile разработка программного обеспечения бизнес-процессы scrum инженеры шутят |
Дайджест свежих материалов из мира фронтенда за последнюю неделю №282 (25 сентября — 1 октября 2017) |
|
Электронные документы в российских судах, как критерий электронной зрелости России |
Метки: author akolesov ecm/ сэд электронные документы суд |