Однажды я рассказал, как съездил с докладом на TAdviser SummIT 2018, и что из этого вышло в плане нетворкинга и проверки бизнесовых гипотез для разработчика софта (кому интересно — дам ссылку, а то вдруг сочтут рекламой). Обещал сравнение саммита с двухдневным сколковским Startup Village — выполняю.
Новости информационных технологий - 26654
Стоит ли участвовать в российских IT-мероприятиях
1970-01-01 в 0:00, admin, рубрики: Исследования и прогнозы в IT, конференции, управление проектами, управление разработкойПривет, читатель.
Сегодня мы будем писать простейшего бота Telegram, который будет отвечать на команды. Такая статья была, но писали бота на Питоне.
1. Виртуальная машина хоть и долгая, но если обрабатывать события в несколько потоков, то будет работать быстро.(Вообще для многих серверов/мультиплеерных игр в одном потоке не всегда получится обрабатывать события, в Jav'e сделать это гораздо проще)
2. Наличие хорошей документации и Javadoc'ов, которые можно сделать для всех библиотек(не только для системных)
0. А что такое «бот»?
Бот — это профиль в соцсети/мессенджере(в данном случае Telegram) который отвечает на команды.( В любом случае все действия буду происходить после выполнения команды)
Тип чата с ботом — это переписка 1 на 1.
1.С чего же начинать?
Здесь качать библиотеку Telegram(обязательно with-dependiciens)
IDE можно выбрать любую, я бы порекомендовал eclipse.
Импотрируем библиотеку Телеграма и приступаем.
Читать полностью »
Передача массива в функцию, подсчет длины массива по указателю
1970-01-01 в 0:00, admin, рубрики: ПесочницаВ С++ существует несколько возможностей передачи массива в функцию.
- В С++ массивы можно инициализировать следующим образом:
int arr[] = {p1, p2, p3, ...}; // длина массива определяется после инициализации
Как следствие, его можно передать в функцию таким же способом:
void func(int arr[]){ //your code }
- Еще один вариант — передать массив по указателю. Например:
void func(int* arr){ //your code } int arr[5] = {1, 2, 3, 4, 5};
Мы привыкли обращаться к элементам массива по индексам, но попробуйте скомпилировать и запустить следующие строки:
int main(){ int arr[5] = {1, 2, 3, 4, 5}; cout << arr << endl; //в данном случае мы увидим адрес начала массива return 0; //его мы и передаем в массив }
При использовании любого из данных вариантов, перед нами становится вопрос определения длины полученного массива. Длину можно передавать через второй параметр в функцию.
Например:
void func(int* arr, int length){
//your code
}
Но в ряде задач длина входного массива может быть неизвестной. На этот случай тоже есть решение, мы можем анализировать данные, которые поступили в функцию по указателю, например:
int len(int* arr){
int count = 0;
while(*x++ < ?) count++;
return count;
}
Крайне важно понять критерий по которому мы будем оценивать содержимое. В противном случае, можно получить не совсем то, что ожидалось.
Читать полностью »
Криптовалюта и интернет-магазин. История подлючения и немного 54-ФЗ
1970-01-01 в 0:00, admin, рубрики: ПесочницаЗдравствуйте, дорогие хабрачитатели!
Появилась недавно задача подключить к одному интернет-магазину оплату криптовалютой. Причем не только популярными биткоинами, но и такими валютами, о которых мне раньше и слышать не приходилось. Реализовывать полноценный функционал взаимодействия с каждой криптовалютой отдельно, задача не из простых. Если для того же биткоина есть библиотеки, позволяющие начать работу практически из коробки (но без допиливания и танцев с бубном, как показывает практика, не обходится), то, например, для dogecoin нужно писать все с нуля. Так как данный вид оплаты для сайта не предполагался как основной, а скорее как фишка для рекламы и раскрутки, то и бюджет не предполагал крупной разработки. Читать полностью »
Экономика продукта. Анализ выручки
1970-01-01 в 0:00, admin, рубрики: growth hacking, бизнес-модели, Управление продуктом, финансы, финансы в ITВ прошлой статье [https://habr.com/sandbox/121807/] я рассказал о начале анализа продукта с его валовой прибыли. Продолжим подход "top-down" и разложим на составляющие выручку.
Общая картина теперь будет такой:
Элегантное решение задачи о спичках [спортивное программирование]
1970-01-01 в 0:00, admin, рубрики: ПесочницаВ этой статье будет описан способ решения одной не очень известной задачи спортивного программирования. Решение требует всего несколько строк кода и очень эффективно, однако требует объяснения.
Читать полностью »
Речь в статье пойдет о составных операторах begin-end, форматировании кода и синтаксисе языка Pascal. А начнем мы с цитаты из книги Стива Макконнелла «Совершенный код».
«Большинство споров по поводу форматирования возникает из-за несовершенства большинства популярных языков программирования. Хорошо спроектированный
язык имеет явную структуру блоков, которая приводит к естественному стилю отступов.»
Because of the complexity или кроссплатформенная работа с фискальным принтером Posnet Temo HS FV Ej
1970-01-01 в 0:00, admin, рубрики: ПесочницаИстория началась с того, что наша маленькая, но гордая компания решила создать приложение для собственных логистических нужд. Обсудив нюансы работы и обозначив конкретные цели, я приступил к реализации. Спустя некоторое время была написана первая версия java приложения и отдана на растерзание тестирование логистам и сотрудникам склада. Более года все шло хорошо, баги успешно создавались и фиксились, функционал приложения постоянно расширялся и совершенствовался, автоматизируя все больше процессов, пока мы не столкнулись с необходимостью использования фискального принтера Posnet Temo HS FV Ej.
Читать полностью »
Алгоритм подсчета кол-ва расстановок n ферзей со сложностью меньше чем O(n!)
1970-01-01 в 0:00, admin, рубрики: ПесочницаПронумеруем строки и столбцы доски размером nxn номерами от 0 до n-1. Номер клетки будет иметь вид (i,j), где i – номер строки, j – номер столбца. Координаты ферзей будут иметь вид (i,p(i)).
Пускай у нас уже расставлены k ферзей в строках от 0 до k-1.
Тогда ферзь с координатами (i,p(i)), где i<k, может бить клетки в строке k с координатами (k,p(i)), (k,p(i)-(k-i)) и (k,p(i)+(k-i)), при этом нас интересуют только клетки с номерами столбцов от 0 до n-1.
Теперь определим битовую маску, для того чтобы определить, в какие клетки строки k нельзя ставить ферзя.
SV(k)=Sum(i=0..k-1,2^p(i))
SD1(k)=Sum(i=0..k-1,2^p(i) shr (k-i))
Если p(i)-(k-i)<0, то 2^p(i) shr (k-i)=0.
SD2(k)=Sum(i=0..k-1,2^p(i) shl (k-i)) and (2^n-1)
Если p(i)+(k-i)>=n, то 2^p(i) shl (k-i) будет отброшено при помощи and (2^n-1).
S(k)=SV(k) or SD1(k) or SD2(k)
где ^ – возведение в степень, or – побитовое или, and – побитовое и, shl – сдвиг влево, shr – сдвиг вправо.
В данном случае используется Sum вместо or, т.к. на любой вертикали или диагонали не может быть более одного ферзя.
Если записать рекуррентно, то получится
SV(0)=0
SD1(0)=0
SD2(0)=0
SV(k+1)=SV(k) or 2^p(k)
SD1(k+1)=(SD1(k) or 2^p(k)) shr 1
SD2(k+1)=((SD2(k) or 2^p(k)) shl 1) and (2^n-1)
Читать полностью »
Это рассказ о новой разработке RemObjects — компании, которая начинала с компонентов для Delphi, а сейчас выпускает целый набор компиляторов Elements для всех популярных платформ: Windows, .NET, JVM, Android, iOS, Cocoa. В набор входят компиляторы с языков Oxygene (клон Паскаля-Delphi), C#, Swift (бесплатный), на любом из которых можно писать для любой указанной выше платформы. И вот теперь в этот список добавляется новый язык — Java. Чем не повод для статьи на Habrahabr?
Читать полностью »