Страницы

Поиск по вопросам

среда, 12 февраля 2020 г.

Как разделить строку на три части и получить из неё числа?

#php


Я получаю строку в виде "1990-03-02".

Это, как видите, дата. Как разделить эту дату на 3 части, чтобы было:

$a = 1990;
$b = 3;
$c = 2;

    


Ответы

Ответ 1



Раз вы работаете с датой, то можно использовать специализированные средства PHP для работы с датой/временем, а именно класс \DateTime. А сделать это можно вот так: $d = DateTime::createFromFormat('Y-m-d', '1990-03-02'); $a = (int)$d->format('Y'); $b = (int)$d->format('j'); $c = (int)$d->format('n'); Рабочий пример на IDEOne. Замечание: Для данной конкретной задачи с разбиением строки на три переменные подход с использованием \DateTime является несколько избыточным. Однако, он дает вам с одной стороны невероятную гибкость форматирования результата, а с другой позволяет думать о дате именно как о дате, а не наборе из трех переменных. Все это, в конечном счете, позволяет повысить уровень абстракции кода и снизить его суммарную сложность. А еще, при таком подходе вы можете запросто получать другие параметры вашей исходной даты с нулевыми трудозатратами. Вот так, например, можно получить номер недели: $week = (int)$d->format('W'); Использование специального типа данных для даты позволяет вам делать и более крутые штуки выражаясь четким высокоуровневым языком. Например, вы можете прибавить к вашей дате произвольный интервал, предположим, неделю: $new_date = $d->add(new DateInterval('P1W'));

Ответ 2



Можно использовать функцию sscanf() для разбора форматированной строки: $dateString = "1990-03-02"; list($a, $b, $c) = sscanf($dateString, "%d-%d-%d");

Ответ 3



$a = explode('-', $str); так получите разделенный массив. Ну а на ноль спереди проверить каждый элемент массива не проблема... $str = "1990-03-02"; $a = explode('-', $str); $year = $a[0]; if($a[1][0]==0){$month = $a[1][1];}else{$month = $a[1];} if($a[2][0]==0){$day = $a[2][1];}else{$day = $a[2];} либо тернарная проверка $str = "1990-03-02"; $a = explode('-', $str); $year = $a[0]; $a[1][0]==0 ? $month = $a[1][1] : $month = $a[1]; $a[2][0]==0 ? $day = $a[2][1] : $day = $a[2];

Ответ 4



list($a, $b, $c) = explode('-', '1990-03-02');

Узнать количество символов в массиве BYTE

#c #windows


Узнать количество символов в строке можно так:

TCHAR* someStr = "Hello World!";
size_t sizeStr = strlen(someStr);


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

BYTE * someByte = "\xFF\xAA\x55";
size_t sizeByte = strlen((TCHAR*)someByte );


Работает не корректно, особенно при юникоде. Как быть?
    


Ответы

Ответ 1



Для разных типов строк следует использовать разные функции. С описанием можно ознакомиться в документации на MSDN

Ответ 2



Юникод бывает разный: мультибайтный (utf-8) Для него подойдет стандартный ASCII-Z подход и класс std::string Но при этом, будет считаться не длина строки в символах, а количество байт. Работа на уровне символов с utf-8 стандартом C++ не поддерживается - нужны внешние библиотеки. двухбайтный (utf-16) Тут поможет тип wchar_t* и класс std::wstring, остальное по аналогии с ASCII-Z, только признаком конца строки будет слово (16 бит), равное 0. Для этих строк существуют аналоги восьмибитных функций из стандартной библиотеки C, для измерения длины - wcslen(), например При этом, работа этих аналогов будет происходить как раз на уровне символов. четырехбайтный (utf-32) стандартной библиотекой C++ не поддерживается.

Ответ 3



wchar_t* wstr1 = L"Count."; wprintf(L"Length of '%s' : %d\n", wstr1, wcslen(wstr1) );

Ответ 4



Ты задаешь этот вопрос, потому что не понимаешь базовых вещей. Надо для начала понять, что такое обычная строка Видишь указатель = 4 байта, которые указывают на массив данных на самом деле. strlen() - работает так, он бежит по массиву и ищет \0 (конец строки), т.е. strlen() - это просто функция подсчета элементов. Дальше еще интереснее.. Если ты говоришь об юникоде. То у него структура совсем другая. Обычно используется вспомогательный класс, например CString. Его структура приблизительно такая. char (для символьных строк ANSI). wchar_t (для символьных строк в юникоде). TCHAR (и для символьных строк ANSI и юникод). Т.е. видишь что? Это разные совсем структуры. И у них разная функция. Для wchar_t(юникод) используй wslen() как то так что ли называется.. Кстати еще у компилятора есть, деректива в настройках. Какой тип будет по умолчанию ansi или unicode. Советую ставить unicode. Насчет твоего примера. Он изначально сделан криво. Скорее всего ты либо получаешь из сокета строку, либо из файла читаешь. Читай в буфер, а сразу в нормальную структуру, какую нибудь CString.

Вывод массива слов в строку через запятую JAVA

#java


Как осуществить вывод слов через запятую? Есть вариант создать StringBuilder, записать
в него "word_from_array" + ",". И потом удалить лишнюю запятую в конце. Но может есть
какой-то красивый способ это сделать?
    


Ответы

Ответ 1



Вы можете воспользоваться String.join: String result = String.join(",", container); Проверка: http://ideone.com/9fXTJT Ну или используйте StringJoiner, которым String.join пользуется внутри: StringJoiner joiner = new StringJoiner(","); for (String s : container) joiner.add(s); String result = joiner.toString(); Проверка: http://ideone.com/myQarW Если вы пользуетесь Stream API, подойдёт ещё Collectors.joining.

MSSQL не понимает кириллицу

#sql_server


Проблема следующая. Создаю базу   

create database MyTestDB on primary
(name = MyTestDB, filename = 'd:\MyTestDB.mdf',
size = 12MB,
maxsize = 20MB,
filegrowth = 2MB )
LOG ON
(name = MyTestDB_Log, filename = 'd:\\MyTestDB_Log.ldf',
size = 2MB,
maxsize = 12MB,
filegrowth = 1MB)
COLLATE Latin1_General_CI_AI;


Затем создаю табличку

CREATE TABLE Students(
  ID int IDENTITY(1,1) NOT NULL CONSTRAINT PK_Students PRIMARY KEY,
  Name nvarchar(30) NOT NULL
)


Ну и собственно заполняю её (текстовые поля - кириллицой). Как итог, всё то что на
кириллице в таком виде ?????
Подскажите, в чем может быть проблема ? Где-то с кодировкой накосячил? Да вроде универсальная.
    


Ответы

Ответ 1



Строковые литералы Unicode - nvarchar - нужно задавать с префиксом N: N'Иванов' Без префикса строка будет преобразована с использованием кодовой страницы базы, и часть символов скорее всего будет испорчена: Prefix Unicode character string constants with the letter N. Without the N prefix, the string is converted to the default code page of the database. This default code page may not recognize certain characters.

Как обозначить i+2 элемент массива

#python_3x


Помогите. Есть программа, которая расшифровывает нужный мне шифр по типу: 
                           А -- В (толко с инглишем)
                           Г -- Е
Буква вводится с клавиатуры и сравнивается с буквой в алфавите (который представлен
в массиве) и, если введеная буква совпадает с i- элементом, то в другой (пустой) массив
добавляется буква, идущая через 1 от этот i в алфавите, то есть i+2.
Но у меня вылетает :
Can't convert 'int' object to str implicitly

Как правильно обозначить i+2 элемент?

http://ideone.com/Kcv64C

n = 1
while n:
x = (input('х : '))
exp = []
a = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
     'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
for i in a:

    if x == i:
        ex = i + 2
        exp.append(ex)
    elif x == 'y':
        exp.append('a')
if x == ' ':
    exp.append(x)
elif x == '.':
    exp.append(x)
print(exp)

    


Ответы

Ответ 1



Это называется "шифр Цезаря". Можно использовать функцию enumerate, чтобы знать текущую позицию в списке. for i, char in enumerate(a): if x == char: exp.append(a[i + 2]) Чтобы не вываливалось IndexError в конец массива и не приходилось костыли приписывать, можно использовать типичный для таких случаев трюк с оператором %, чтобы индекс не выходил за предел: for i, char in enumerate(a): if x == char: exp.append(a[(i + 2) % 26]) Если вы хотите проверить является символ буквой, то можно воспользоваться следующим методом, а не писать на каждый символ свое условие: x.isalpha() К слову: вам не обязательно пробегать по списку, ведь у букв есть известный порядок. Вы можете узнать номер буквы в таблице юникода с помощью функции ord() - прописные латинские начинаются с 97 позиции (a) и следуют до 122 (z). Затем прибавляем к номеру 2 и узнаем какая буква находится на этой позиции через функцию chr(). Только нужно опять быть аккуратным и не выскочить за границы 97-122, а также корректно обрабатывать заглавные.

Ответ 2



А вообще я бы сделал так: crypt = {'a': 'c', 'b': 'd', 'c': 'e', ... 'x': 'z', 'y': 'a', 'z': 'b'} def crypt_str(s): r = "" for c in s: try: r += crypt[c] except KeyError: r += c return r print crypt_str("any text")

получить адрес из инструкции “call”

#cpp #ассемблер


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

Проблема в следующем, при просмотре программы в дизассемблере, есть инструкция по
адресу 0x11BC132 , выглядит она так 

call test.exe+CBB18

Вот как мне программно получить этот адрес "test.exe+CBB18"? Пробовал так:

DWORD call = *(DWORD*)0x11BC132 


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


Ответы

Ответ 1



Для 32-битного приложения Команда call имеет опкод E8 + delta (4b), где delta = to - (from + 5) from - адрес команды call to - адрес вызываемой функции const size_t from = 0x11BC132; int delta = *(int*)((unsigned char*)from + 1); // приведение к unsigned char* нужно, если арифметика типа from отличается от стандартной size_t to = from + delta + 5; Чтобы преобразовать call something в call test.exe + something_else, нужно вычесть из something так называемый image_base. Для типичных 32-битных PE он равняется 0x400000. То есть в Вашем случае адрес функции с большой вероятность равен 0x4CBB18. Для 64-битного приложения Команда call может иметь аналогичный вид, если delta <= 0xFFFFFFFF, поэтому можно проверять следующим образом: const size_t from = 0x11BC132; if (*((unsigned char *)from) == 0xE8) { int delta = *(int*)((unsigned char*)from + 1); size_t to = from + delta + 5; } Крайне сомневаюсь, что delta может превысить 2 гигабайта, поэтому можно использовать этот вариант (даже без if, если уверены, что это call)

Memcache - как сделать продление жизни

#php #memcache


Как в memcache сделать продление жизни элемента? Есть идея делать replace с новым
значением времени жизни, стоит ли так делать есть ли другой способ? Хотелось бы выслушать
чужое мнение.
    


Ответы

Ответ 1



При использовании расширения memcache только replace. В расширении memcached есть метод touch который позволяет выставить новое время хранения.

Правильный вывод степени

#cpp #winapi


Как в окне правильно вывести степени, т.е. не x^2, а чтобы двойка находилась выше?
    


Ответы

Ответ 1



Для начала, вам нужно настроить правильный вывод Unicode. Как это делать, описано в этом вопросе. Имея вывод в Unicode, легко подсмотреть номера юникодных символов, и написать функцию перекодировки. Например, такую: wchar_t digitToSuperscript(unsigned int digit) { if (digit >= 10) throw std::out_of_range("digit"); switch (digit) { case 1: return 0x00B9; case 2: return 0x00B2; case 3: return 0x00B3; default: return 0x2070 + digit; } } (Ну или если вам больше нравится, lookup в таблице из 10 элементов.) Пробуем: #include "stdafx.h" #include #include #include #include wchar_t digitToSuperscript(unsigned int digit) { if (digit >= 10) throw std::out_of_range("digit"); switch (digit) { case 1: return 0x00B9; case 2: return 0x00B2; case 3: return 0x00B3; default: return 0x2070 + digit; } } int wmain(int argc, wchar_t* argv[]) { _setmode(_fileno(stdout), _O_U16TEXT); _setmode(_fileno(stdin), _O_U16TEXT); _setmode(_fileno(stderr), _O_U16TEXT); std::wcout << L"x"; for (int d = 0; d < 10; d++) std::wcout << digitToSuperscript(d); return 0; } Результат:

Деление заменить смещением(сдвигом)

#математика #деление


int b=(a<<6)+(a<<5)+(a<<2);//умножить на 100
int c=(a<<10)-((a<<4)+(a<<3));//умножить на 1000
int d=(a<<3)+(a<<1);//умножить на 10


Подскажете как поделить на 10,100,1000 любого числа 'a' со смещением(сдвигом)? Целочисленный
int (остаток от деления не важен).
    


Ответы

Ответ 1



Запросто :) 0.110 = 0.00011001100110012. То есть деление на 10 — это 1 / 16 + 1 / 32 + 1 / 256 + 1 / 512 + ... Дальше пояснять? :) А если серьезно - возьмите книгу Уоррена «Алгоритмические трюки для программистов», там есть глава 10, «Целое деление на константы». Там много стоящего. То же деление на 10: unsigned divu10(unsigned n) { unsigned q, r; q = (n >> 1) + (n >> 2); q = q + (q >> 4); q = q + (q >> 8); q = q + (q >> 16); q = q >> 3; r = n - q * 10; return q + ((r + 6) >> 4); // return q + (r > 9); }

Есть ли способ закрыть блок при клике на его after?

#html #jquery #css


Давно мучает этот вопрос меня , реализовал для примера вот такую конструкцию :



$(document).ready(function(){
    $(".box1:after").click(function(){
        $(".box1").hide();
    });
});
*{
  margin:0;
  padding:0;
  line-height:1;
}
html,body{
  height:100%;
}
section{
  display:block;
  height:100%;
  background:rgba(0,0,0,.3);
  position:relative;
}
.box1{
  width:50%;
  min-height:200px;
  max-height:450px;
  padding:20px;
  position:absolute;
  top:0;left:0;
  bottom:0;right:0;
  margin:auto;
  background:#fff;
}
.box1 p{
  font:800 20px Georgia;
  color:#909090;
  line-height:1.7;
}
.box1:after{
  content:"";
  position:absolute;
  top:0; left:0;
  display:block;
  width:20px;
  height:20px;
  background:#909090;
  border-radius:100%;
  margin:3px;
  transition:all .1s;
}
.box1:hover:after{
  content:"close";
  width:60px;
  text-align:center;
  line-height:20px;
  color:#fff;
  cursor:pointer;
}
.none{
  display:none;
}

People tend to read writing. Default text is for web developers and designers that need default text quickly. If it is not real text, they will focus on the design. Default text is for web developers and designers that need default text quickly. I hope you enjoyed the fake text. A designer can use default text to simulate what text would look like. Using default text is a simple way to create the appearance of content without having to create it. Thank you for using this application. This text will not appear in a consistent order. This string is randomly generated.



Ответ 2



Псевдоэлементы before и after (и все остальные псевдоэлементы) - это shadow dom, они скрыты браузером от манипуляции через javascript. Поэтому, на них невозможно повесить обработчики событий, невозможно получить и изменить их стили и т.п. Исходя из этого, вашу задачу решить средствами js невозможно. Такую задачу можно попробовать решить на чистом css при помощи чекбоксов или псевдокласса target (это обычные средства для реализации табов, всплывающих окон и т.п. на css), но я сходу не соображу, насколько эта техника совместима с псевдоэлементами.

libcurl - как парсить HTTP заголовок?

#cpp #http #curl #парсер #веб_сервер


Учусь писать HTTP веб-сервер. Сам сервер есть. Запускаю сервак, посылаю HTTP-запрос
curl -D dumpbin 127.0.0.1:2000. На сервере сохраняю запрос в строковую переменную.
Теперь (и я не знаю, как это сделать) мне надо распарсить весь полученный запрос, составить
ответ и отправить обратно. С отправкой я справлюсь, а вот с парсингом и с составлением
ответа возникли проблемы. 
Сказали, что следует использовать libcurl, но я не понимаю, как им можно парсить
готовые строки и можно ли.
Помогите, пожалуйста, примером такого использования этой либы, если он возможен.
Посоветуйте, какие можно использовать библиотеки еще, чтобы решить эту задачу.

//Вид запроса (это то, что вернул мой эхо-сервер при использовании утилиты curl): 

    request = "GET /index.html HTTP/1.1\r\n"
              "Host: 127.0.0.1:5991\r\n"
              "User-Agent: curl/7.47.0\r\n"
              "Accept: */*\r\n"
              "\r\n";

    //Вид ответа (это я прочитал в комментах к заданию на степике):
    answer = "HTTP/1.0 200 OK\r\n"
             "Content-length: %d\r\n"
             "Connection: close\r\n"
             "Content-Type: text/html\r\n"
             "\r\n"
             "%s";


Суть в том, что есть данные, которые разделены \r\n и заканчиваются двойным переводом
каретки и строки \r\n\r\n
    


Ответы

Ответ 1



tl;dr см. конец ответа для реализации парсера заголовков licurl используют, как правило, для написания клиентов, смотрите FAQ: 5.17 Can I write a server with libcurl? No. libcurl offers no functions or building blocks to build any kind of internet protocol server. libcurl is only a client-side library. For server libraries, you need to continue your search elsewhere but there exist many good open source ones out there for most protocols you could possibly want a server for. And there are really good stand-alone ones that have been tested and proven for many years. There's no need for you to reinvent them! В вольном переводе: 5.17 Могу ли я использовать libcurl для написания сервера? Нет. libcurl не предлагает функций или других строительных блоков для создания какого либо IP сервера. libcurl это только клиентская библиотека. Вам нужно продолжить ваши поиски библиотеки для построения сервера. Существует большое количество таких библиотек с открытым исходным кодом для большинства протоколов. Также существует большое кол-во проверенных годами stand-alone приложений. Вам не стоит изобретать их заново. Хотя для построения клиента libcurl действительно очень удобная вещь, как упомянул в своем ответе @Pink Tux. В том числе заголовки вы получаете уже разбитые по одному. Для построения сервера, как один из вариантов, можно использовать mongoose (на c, в виде пары .c/.h, добавляемой к вашему проекту, либо одну из многочисленных c++ оберток). Пример минимального сервера достаточно громоздкий, поэтому приводить здесь не буду. Можно посмотреть здесь. Еще один вариант - библиотека cpp-netlib которая изначально планировалась как часть boost (но потом планы разработчиков поменялись). В простейшем виде http сервер выглядит так: namespace http = boost::network::http; struct handler; typedef http::server http_server; struct handler { void operator() (http_server::request const &request, http_server::response &response) { response = http_server::response::stock_reply( http_server::response::ok, "Hello, world!"); } void log(http_server::string_type const &info) { std::cerr << "ERROR: " << info << '\n'; } }; int main(int arg, char * argv[]) { handler handler_; http_server::options options(handler_); http_server server_( options.address("0.0.0.0") .port("8000")); server_.run(); } Если вам нужно что-то еще более высокоуровневое (с поддержкой шаблонов, json, middlewares), можно взять crow, которая подключается к вашему проекту одним заголовочным файлом. По духу это напоминает Python Flask. Пример сервера: #include "crow_all.h" int main() { crow::SimpleApp app; CROW_ROUTE(app, "/")([](){ return "Hello world"; }); app.port(18080).multithreaded().run(); } Если все-таки интересно самому разобрать заголовки, то можно например таким кодом: std::istringstream rawstream(raw); std::map headers; std::string header; while (std::getline(rawstream, header) && header != "\r") { std::string::size_type index = header.find(':'); if (index != std::string::npos) { headers.insert(std::make_pair( boost::algorithm::trim_copy(header.substr(0, index)), boost::algorithm::trim_copy(header.substr(index + 1)) )); } } В raw типа std::string помещаете строку с вашими заголовками (либо даже целиком запрос клиента), в headers получаете map из имен/значений заголовков. Используете к примеру так: std::cout << headers["Content-Type"] << std::endl; Обратите внимание, что по стандарту имя заголовка может иметь любой регистр. Поэтому CONTENT-TYPE, content-type и Content-Type это все один заголовок, и для удобства можно перед добавлением в map привести имя заголовка в нижний регистр: headers.insert(std::make_pair( boost::algorithm::to_lower_copy(boost::algorithm::trim_copy(header.substr(0, index))), boost::algorithm::trim_copy(header.substr(index + 1)) )); Действующий пример на Ideone.com. P.S. Для тестирования вместо curl можно использовать postman в котором можно задавать заголовки, тело страниц (в том числе json), сохранять наборы запросов и т.д.

Ответ 2



libcurl предоставляет возможность задавать обработчик для разных данных. Например, чтобы "поймать" заголовки ответа, можно воспользоваться следующим подходом: static size_t header_callback(char *buffer, size_t size, size_t nitems, void *userdata) { /* * Эта функция будет вызываться на каждый возвращаемый заголовок. */ return nitems * size; } int main() { CURL *curl = curl_easy_init(); if(curl) { curl_easy_setopt(curl, CURLOPT_URL, "http://yahoo.com/"); curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, header_callback); curl_easy_perform(curl); } return 0; } Подробней - см. в документации по libcurl. Кроме того, для C++ есть обёртки, например, curlcpp.

Можно ли IEnumerator<T> привести к IEnumerable<T>?

#c_sharp


Объясните,пожалуйста,почему в ниже приведенном коде возможен Upcast типа IEnumerator
к типу IEnumerable,ведь IEnumerator не наследуется от IEnumerable



static IEnumerator GetOddNumbers(params int[] numbers)
{
    foreach (var number in numbers)
    {
        if (number % 2 != 0) yield return number;
    }
}

static void Main(string[] args)
{

    IEnumerable enumerable = (IEnumerable)GetOddNumbers(1, 2, 3);
    IEnumerator enumerator = GetOddNumbers(1, 2, 3);



    //List oddnumbers = new List(GetOddNumbers(1, 2, 3));

    //foreach (var number in oddnumbers)
    //{
    //    Console.WriteLine(number);
    //}

    //Console.ReadLine();
}

    


Ответы

Ответ 1



Извините, неверно прочитал вопрос вначале, ответ полностью переписан. Дело в том, что в C# любой объект можно закастить к любому интерфейсу на этапе компиляции: interface I1 { } class Program { static void Main(string[] args) { I1 i1 = (I1)(new Program()); } } В рантайме, если объект реально не имплементирует интерфейс, выбросится исключение InvalidCastExcetion. Почему же разрешён каст к интерфейсу, хотя объект на самом деле не имплементирует этот интерфейс? Рассмотрим код Program p = new Program(); I1 i1 = (I1)p; В этой точке статический тип выражения p, на которое навешен каст — Program. Но реальный, динамический тип может быть любой, производный от Program. И этот тип вполне может имплементировать интерфейс! Поэтому компилятор не может доказать, что каст невозможен, и откладывает проверку до момента реального выполнения. Сравните: interface I1 { } sealed class Program // добавили sealed { static void Main(string[] args) { I1 i1 = (I1)(new Program()); // Не компилируется, ошибка CS0030 } } В этих условиях компилятор таки может доказать, что выражение не может имплементировать интерфейс, ведь класс Program этот интерфейс не имплементирует, а производных классов быть не может. Вот этот код и не компилируется. Компилятор, конечно, мог бы быть суперумным, и увидеть, что выражение GetOddNumbers(...) есть вызов функции-генератора, и не имплементирует IEnumerable. Но при этом он должен был бы решать это не по декларируемому типу (IEnumerator), а анализируя поток выполнения программы. Это в общем случае неразрешимая задача, так что компилятор C# и не пробует браться за неё. (За исключением нескольких простых случаев, да.)

Кросс доменная авторизация на yii2

#php #yii2 #framework


Всем привет!
Возникла такая проблема, нужно реализовать кросс доменную авторизацию.
Схема такая:
1. На первом домене(user.mysite.com) находится личный кабинет пользователя который
работает на yii2 и через который будет проходить авторизация.
2. На втором домене(mysite.com) находится интернет магазин на "самописном" движке
который должен работать с авторизированным пользователем. 
 
3. БД у них одна.
4. Лежат на одном сервере, в соседних каталогах.
5. должна быть реализована опция "запомнить меня"

Подскажите, можно ли это заставить работать? И как это лучше сделать?
    


Ответы

Ответ 1



В конфиге 'user' => [ 'identityClass' => 'common\models\User', 'enableAutoLogin' => true, 'identityCookie' => [ 'name' => '_identity', 'httpOnly' => true, 'domain' => '.' . DOMAIN, ], ], 'session' => [ 'cookieParams' => [ 'domain' => '.' . DOMAIN, 'httpOnly' => true, ], ], В index.php defined('DOMAIN') or define('DOMAIN', 'mysite.com'); Куки будут общими для домена и сабдоменов

Ответ 2



Надо чтобы на обоих доменах совпадали класс аутентификации, вероятно так и есть, если используются родные механизмы Yii; домен, где сохраняется аутентификационная кука. в настройках сайта на под-домене укажите родительский домен; база с пользовательскими аккаунтами. вы сказали, что БД общая - ок. На всякий случай скажу: Не тестируйте это на домене localhost. Браузеры чудят с куками на доменах первого уровня. Если надо испытать локально, заведите в hosts синоним для локалхоста, типа localhost.com. Обратите внимание в настройках на точку перед именем домена, это каноническая форма! См. http://yiiframework.ru/doc/cookbook/ru/install.cookie.subdomains https://stackoverflow.com/questions/29378697/automagically-log-into-multiple-domains-in-yii2

Смена картинки imageView

#java #android #imageview


Как можно сменить картинку, которая есть в ресурсах. В ресурсах нет imageName, а
есть картинки p1, p2 ,p3,.. и т.д. Нужно, чтобы каждый раз показывались разные картинки
в зависимости от position

String imageName = ("p"+position);
imageView.setImageDrawable(R.drawable.imageName);

    


Ответы

Ответ 1



Вам нужно получить идентификатор ресурса по его имени: String mDrawableName = "p" + position; int resID = imageView.getContext().getResources().getIdentifier(mDrawableName , "drawable", imageView.getContext().getPackageName()); imageView.setImageResource(resID);

Как узнать установлена ли определенная программа на телефоне?

#java #android


Мне в приложении нужно давать возможность пользователю отправлять сообщения через
месседжеры, которые установлены у него на телефоне, как узнать установлен ли у пользователя
Viber, WhatsApp и тому подобные программы?      
    


Ответы

Ответ 1



private boolean isPackageInstalled(String packagename, Context context) { PackageManager pm = context.getPackageManager(); try { pm.getPackageInfo(packagename, PackageManager.GET_ACTIVITIES); return true; } catch (NameNotFoundException e) { return false; } } В packagename передавать имя пакета приложения. Например, у вайбера это com.viber.voip

Java. БД. Консольный ввод-вывод

#java #база_данных


Всем привет.

Есть следующая задача:


  Реализовать консольный ввод-вывод имени и фамилии используя БД (программа позволяет
ввести ФИО, сохранить ФИО, вывести список всех данных из БД).


Я еще ни разу не сталкивалась с работой с БД. С чего начать вообще? Так-то я могу
просто записывать все в какой-нибудь ArrayList и сортировать по алфавиту, но подозреваю,
что это как-то по-другому должно выглядеть.
    


Ответы

Ответ 1



Данная задача решается с помощью JDBC. 1.Создай локальную БД. К примеру, CREATE TABLE USERS (user_name text) 2.Подключи к проекту соответствующей БД JDBC-драйвер. 3.Создай метод или класс обращения к JDBC. К примеру такой: Connection connection = null; Statement statement = null; ResultSet result = null; String url = "CONNECTION_URL"; // url конекшена JDBC String login = "LOGIN"; // логин БД String password = "PASSWORD"; // пароль БД try { Class.forName("org.mysql.Driver"); // путь к драйверу connection = DriverManager.getConnection(url, login, password); statement = connection.createStatement(); result = statement.executeQuery("SELECT * FROM USERS"); while(result.next()) { System.out.println(result.getString("user_name")); // считываем имя пользователя, полученной записи } } catch(ClassNotFoundException | SQLException exc) { } finally { try { if(connection!=null) connection.close(); if(statement!=null) statement.close(); if(result!=null) result.close(); } catch (SQLException exc) {} } Cоветую ознакомиться с документацией Оракла, там все довольно понятно объяснено и много примеров. Ну, а также еще советую этот источник.

Создание меню toolbar (три точки)

#java #android #интерфейс


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

public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu, menu);
        return true;
    }


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

UPD
Решение нашел в соответствии с этой статьей.
    


Ответы

Ответ 1



В три точки (Overflow) убираются элементы меню со значениями ifRoom/never атрибута app:showAsAction. ifRoom элементы убирутся только если не поместятся в тулбар. иконку ставить как-то так: toolbar.setIcon(R.drawable.ic_launcher);

Ответ 2



Проблема отображения в ActionBar 3-х точек на андроид устройствах у которых есть hardware menu button уже редко, но все же встречается. Я для своего Samsung GT-i8552 применял в методе onCreate() следующую конструкцию: try { ViewConfiguration config = ViewConfiguration.get(this); Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey"); if (menuKeyField != null) { menuKeyField.setAccessible(true); menuKeyField.setBoolean(config, false); } } catch (Exception ignored) { } Решение тогда нашел где-то на просторах en.SO. P.S.: Но все же потом перешел на Toolbar, хотя для старых версий андроид присутствовала проблема - не было тени под тулбаром на андроид ниже 5.0. Так что дело вкуса.

Адреса при хранении в базе данных

#sql #база_данных


Есть база данных с адресами. Думаю над структурой. На данный момент есть таблицы:
Типы улиц, Улицы, Типы населенных пунктов, Населенные пункты. Вопрос вот в чем. Проспект
Ленина в Красноярске и Проспект Ленина в Томске - это же разные сущности, значит в
таблице Улицы должны быть такие строки?

ИД/Населенный пункт/Тип улицы/Имя

1/1/1/Ленина

2/2/1/Ленина

Или в таблице Улицы не нужен столбец Населенный пункт, а вместо этого сделать отдельную
таблицу для связи [Улица-Населенный пункт] и Проспект Ленина не будет дублироваться
для каждого города?
    


Ответы

Ответ 1



Это абсолютно разные сущности, и вот почему - захотят в Усть-Тарапыгинске переименовать "улицу Ленина" в "Гнилой тупик", и вы получите кучу веселых проблем с выделением этой улицы из всех остальных городов. Причем, вам нужно будет, по хорошему, учитывать, "историчность", потому как часть данных будет относится к старому названию, а часть - к новому. Скопируйте в базу структуру КЛАДР или ФАИС, вам же проще будет.

Странности с закрытием PrintWriter в Java

#java #io


Почему такой пример выполняется, не выдвавая никаких исключений.  

PrintWriter os = new PrintWriter(System.out, true); 
os.close(); 
os.println("text");

    


Ответы

Ответ 1



PrintWriter не совсем обычный класс, если посмотреть документацию к классу, то увидим следующее: Methods in this class never throw I/O exceptions, although some of its constructors may. The client may inquire as to whether any errors have occurred by invoking {@link #checkError checkError()}. Т.е. он проглатывает все ошибки, связанные с вводом-выводом.

Поиск файлов в директориях

#c_sharp


Необходимо найти все файлы на диске. Есть такой код:                 

System.IO.DirectoryInfo number = new System.IO.DirectoryInfo(@"D:\");
int count = number.GetFiles().Length;


Ищет, но не ищет во всех папках. Пробовал так:            

System.IO.DirectoryInfo number = new System.IO.DirectoryInfo(@"D:\");
int count = number.GetFiles(".", SearchOption.AllDirectories).Length;

    


Ответы

Ответ 1



SearchOption.AllDirectories будет ронять весь поиск, если к одному из подкаталогов нет доступа. А учитывая, что ты передаёшь корень диска, там гарантированно попадётся System Volume Information и поиск упадёт. В остальном код работоспособный. Чтобы правильно обработать каталоги, к которым нет доступа, надо вместо передачи этого флага написать рекурсивную функцию, которая будет сама перебирать каталоги и игнорировать (или каким-либо ещё образом обрабатывать) исключения ошибки доступа. PS: https://ru.stackoverflow.com/a/419435/178988 http://bbs.vbstreets.ru/viewtopic.php?f=2&t=44440 http://www.cyberforum.ru/csharp-beginners/thread957151.html

Ответ 2



Раньше пробовала реализовать рекурсивный поиск в папке; может быть, кусочек моего кода Вам пригодится. private string directoryPath = @"D:\Папка"; /* Обработчик нажатия на кнопку "Сканировать". */ private void btnScan_Click(object sender, EventArgs e) { string mask = "*.sln"; // например, можно любую другую DirectoryInfo root = new DirectoryInfo(directoryPath); try { // Ищем файлы в корневой директории. getFiles(root); // Рекурсивный поиск по поддиректориям. getChildDirectories(root); } catch (Exception ex) { // ... } } private void getChildDirectories(DirectoryInfo rootDirectory) { foreach (DirectoryInfo directory in rootDirectory.GetDirectories()) { try { getFiles(directory); getChildDirectories(directory); } catch (Exception ex) { // ... } } } private void getFiles(DirectoryInfo directory) { var files = Directory.EnumerateFiles(directory.FullName, mask, SearchOption.TopDirectoryOnly); foreach (var file in files) { // делаешь что-то хорошее с каждым найденным файлом. } }

Ответ 3



Для целей поиска файлов и каталогов по различным критериям можно использовать следующую библиотеку: https://github.com/VladPVS/FastSearchLibrary/releases Краткий пример использования библиотеки для поиска файлов приведен ниже. using FastSearchLibrary; using System; using System.Collections.Generic; using System.IO; using System.Text.RegularExpressions; using System.Threading; namespace SearchTest { class Program { private static object locker = new object(); static void Main(string[] args) { // Методы с окончанием Fast используют несколько потоков, что ускоряет операцию поиска, но увеличивает нагрузку на процессор. // Методы с окончанием Async не блокируют вызывающий поток, который продолжает выполняться далее. // Использование статических методов FileSearcher: var list = FileSearcher.GetFiles(@"C:\Users", (f) => f.Name.Contains("SomeFile")); var task1 = FileSearcher.GetFilesFastAsync(@"C:\Users", "*.txt"); var task2 = FileSearcher.GetFilesFastAsync(@"C:\", (f) => f.LastAccessTimeUtc >= new DateTime(2018, 3, 1)); List resultFiles1 = FileSearcher.GetFilesFast(@"C:\", (f) => f.Name.Contains("SomePattern")); List resultFiles2 = FileSearcher.GetFilesFast(@"C:\", (f) => f.CreationTime > new DateTime(2018, 1, 10)); List resultFiles3 = FileSearcher.GetFilesFast(@"C:\", (f) => { return (f.Extension == ".mp3") && (f.Length > 10485760) && (f.CreationTime > new DateTime(2018, 1, 10)); }); // Использование экземпляра класса FileSearcher позволяет получать результаты по мере их нахождения, // а также останавливать поиск, не дожидаясь его завершения: CancellationTokenSource tokenSource = new CancellationTokenSource(); FileSearcher searcher = new FileSearcher(@"C:\", (f) => Regex.IsMatch(f.Name, @".*Imagine[\S_]Dragons.*.mp3$"), tokenSource); List files = new List(); searcher.FilesFound += (sender, arg) => { lock (locker) { arg.Files.ForEach((f) => { files.Add(f); Console.WriteLine($"File location: {f.FullName}, \nCreation.Time: {f.CreationTime}"); }); if (files.Count >= 10) searcher.StopSearch(); } }; searcher.SearchCompleted += (sender, arg) => { if (arg.IsCanceled) Console.WriteLine("Search stopped."); else Console.WriteLine("Search completed."); Console.WriteLine($"Quantity of files: {files.Count}"); }; var task = searcher.StartSearchAsync(); task.Wait(); Console.ReadLine(); } } } Аналогично возможно совершать поиск каталогов, но уже с использованием класса DirectorySearcher.

Linq to Entities не распознает метод

#c_sharp #entity_framework


когда я пытаюсь запустить

public static DalUser ToDalUser(this User ormUser)
    {
        return new DalUser()
        {
            Id = ormUser.Id,
            FirstName = ormUser.FirstName,
            LastName = ormUser.LastName,
            About = ormUser.About,
            Email = ormUser.Email,
            Password = ormUser.Password,
            Roles = ormUser.Roles.Select(role => role.ToDalRole())
        };
    }


выскакивает ошибка


  Additional information: LINQ to Entities does not recognize the method 'DAL.Interface.DTO.DalUser
ToDalUser(ORM.User)' method, and this method cannot be translated into a store expression.


во вьюхе

@foreach (var item in Model)
{
    
        
            @Html.DisplayFor(modelItem => item.FirstName)
        
        
            @Html.DisplayFor(modelItem => item.LastName)
        
        
            @Html.DisplayFor(modelItem => item.Email)
        
        
            @Html.DisplayFor(modelItem => item.About)
        
        
            @Html.DisplayTextFor(modelItem => item.Role)
        
    
}


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


Ответы

Ответ 1



LINQ to Entities - не поддерживает вызов пользовательских методов внутри себя, так как не может преобразовать запрос к фактической инструкции для исполнения. Иными словами Вам необходимо сначала получить данные, выгрузить их в память, к примеру вызвать ToList() или ToArray() ну или AsEnumerable(),а затем уже применить Ваш метод ToDalUser для полученных данных, к примеру через .Select(x => ...ToDalUser...).ToList(). И все будет работать. И Вам правильно говорят, что падает оно не на представлении. Оно падает во время выборки (подготовки) данных.

Как сделать чтобы каждые 0.5 секунд к переменной прибавлялось 1?

#java #android


Как сделать чтобы каждые 0.5 секунд к переменной прибавлялось 1?
    


Ответы

Ответ 1



Функция, которая вызывается каждые 500мс и увеличивает переменную counter на 1: new Timer().scheduleAtFixedRate(new TimerTask(){ @Override public void run(){ counter++; Log.i("tag", "A Kiss every 5 seconds"); } }, 0, 500); Понятное дело, переменная counter должна быть определена в доступной области видимости, например - в свойствах текущего класса.

Ответ 2



for(;;) { TimeUnit.MILLISECONDS.sleep(500); counter++; }

Поиск в переменной bash

#bash


Надо узнать MAC-адрес (eth0, например). ifconfig выдаёт помимо mac'а кучу ненужного
мне мусора. Думал вычленить вывод регуляркой, но не знаю как. То что находил проверяло
строку на соответствие регулярке, но не производило поиск/сохранение в массив.
    


Ответы

Ответ 1



хотя программа ifconfig морально и физически устарела для целей управления, диагностики и получения информации в операционных системах, использующих программу linux в качестве ядра, приведу пример и для неё: $ x=$(/sbin/ifconfig имя-интерфейса); x=${x#*HWaddr }; x=${x%% *}; echo $x 11:22:33:44:55:66 или, не «на чистом bash»: $ /sbin/ifconfig имя-интерфейса | awk '/HWaddr/ {print $5}') 11:22:33:44:55:66 а с использованием актуальной программы ip из пакета программ iproute2 — например, так: $ x=$(ip -o l sh имя интерфейса); x=${x#*ether }; x=${x%% *}; echo $x 11:22:33:44:55:66 или, если смонтирована виртуальная файловая система sysfs, то ещё короче: $ cat /sys/class/net/имя-интерфейса/address 11:22:33:44:55:66 подробнее про shell parameter expansion в программе bash — см. документацию.

Как в теге Input можно создать вот такой календарь

#php #html #css #mysql #html5


Здравствуйте! Как в теге Input можно создать вот такого вида календарь (см. на рисунок),
где можно выбрать время и дату, чтоб в дальнейшем записать данные в БД.


    


Ответы

Ответ 1



Это доработка Таймпикера http://jqueryui.com/datepicker/ , называется DateTimePicker (вот похожая модификация, нужно только стили поправить http://trentrichardson.com/examples/timepicker/ ).

Ответ 2



В спецификации HTML 5 появился встроенный календарь http://htmlbook.ru/samhtml5/formy/kalendar

Как правильно закрыть окно Qt?

#cpp #qt


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


Ответы

Ответ 1



Для каждого окна установите атрибут: setAttribute(Qt::WA_DeleteOnClose); Этот атрибут делает следующее: Makes Qt delete this widget when the widget has accepted the close event (see QWidget::closeEvent()). Другими словами, когда окно получает QCloseEvent, оно самоуничтожается

Ответ 2



Виджет-родитель при уничтожении автоматически удалит своих потомков. When QObjects are created on the heap (i.e., created with new), a tree can be constructed from them in any order, and later, the objects in the tree can be destroyed in any order. When any QObject in the tree is deleted, if the object has a parent, the destructor automatically removes the object from its parent. If the object has children, the destructor automatically deletes each child. No QObject is deleted twice, regardless of the order of destruction. Object Trees & Ownership Другими словами если у вас что-то отображается в окне, то достаточно удалить виджет окна, об остальном позаботится система объектных иерархий Qt.

Как лучше работать с конфигурациями в Ruby

#ruby #config #configuration #best_practice


Допустим, у нас есть некая структура конфигурации (взята из YAML, JSON, XML или просто
в виде Hash):  

configuration = {
  gmail: {
    username: 'example@gmail.com',
    password: 'pa$$word',
    host: 'imap.gmail.com',
    ssl: true,
    port: 993
  },
  ftp: {
    username: 'example@gmail.com',
    password: 'pa$$word',
    host: 'imap.gmail.com',
    ssl: true,
    port: 42
  }
}


Далее, на основе этой структуры мы достаём из неё данные:  

mail = Mail.new host: configuration[:gmail][:host], port: configuration[:gmail][:port],
username: configuration[:gmail][:username], password: configuration[:gmail][:password],
ssl: configuration[:gmail][:ssl]
ftp = FTP.new host: configuration[:ftp][:host], port: configuration[:ftp][:port],
username: configuration[:ftp][:username], password: configuration[:ftp][:password],
ssl: configuration[:ftp][:ssl]


Всё работает, но сам код получается «плохочитаемым». 
Т. е. он конечно понятен, но слишком много «сухого» текста, вместо привычного для
языка программирования кода.  

Поделитесь Best Practice, как правильно делать и использовать конфигурации в Ruby.
    


Ответы

Ответ 1



Если имена атрибутов Mail и FTP в вашем примере в точности соответствуют ключам в структурах в конфигурации - вы можете передавать в конструктор хеш напрямую: mail = Mail.new configuration[:gmail] ftp = FTP.new configuration[:ftp] Здесь важно помнить две вещи: Ключи и типы значений в конфигурации должны совпадать с атрибутами и типами значений атрибутов класса; Доступ к конфигурации должен быть только у вас - иначе злоумышленник может, оперируя структурой, создавать объекты с любыми атрибутами класса без ограничений.

Ответ 2



Ну, как минимум вы написали выбор поднабора из хэша с захардкоженными ключами. "Колонна" в вашем коде (которая получается, если код "подровнять"): mail = Mail.new host: configuration[:gmail][:host], port: configuration[:gmail][:port], username: configuration[:gmail][:username], password: configuration[:gmail][:password], ssl: configuration[:gmail][:ssl] # ^^^^^^^^^^^^^^^^^^ это ^^^^^^^^^^^^^^^^^^^^ ...на самом деле же просто хэшмап. Просто {} вокруг него писать оказалось необязательно, т. к. это последний аргумент вызова метода, и это особый случай в синтаксисе Ruby. Если в configuration[:gmail] нет лишних ключей, то можно сделать попросту вот так: Mail.new configuration[:gmail] ...а если лишние ключи хочется отрезать, и вы вооружены aсtivesupport'ом (гем такой, из состава Rails), есть Hash#slice: # Точечная загрузка ActiveSupport require 'active_support/core_ext/hash/slice' # В Rails необязательно, там он обычно весь уже загружен Mail.new configuration[:gmail].slice(:host, :port, :username, :password, :ssl) ...но обычно один набор параметров конфигурации используется в ровно одном месте (или если в нескольких, то как минимум одинаково: скажем, при вызове однотипных конструкторов), поэтому можно себе позволить просто не писать в конфигах лишние ключи. Это не конвенция, такая ситуация сложилась сама и она всех устраивает. "Best bractices" конфигураций, которые вы ждёте, этого всего в основном не касаются и они запакованы, в разных комбинациях, в гемы dotenv, figaro и config. Что в них типично встречается: Сокращённый синтаксис получения конфигурации ключей: a[:b][:c] => a.b.c Фоллбэк (когда конфига нет) к переменным среды в ENV (см. 12-факторные приложения) Конвенции по размещению конфигурационных файлов и их формату — кто на что горазд

Где размещать css и js файлы - в начале или конце документа?

#html #производительность


Как, всё-таки, правильно подключать стили и js файлы? 

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

Или тут есть какие-то "подводные камни" на которые стоит обратить внимание? Просто
весьма интересно. Сам всегда размещаю css в начале, а все js в конце.
    


Ответы

Ответ 1



Почему модель css вверху, js внизу более привлекательная? Тут важный момент это то, что браузер загружает страницу сверху вниз Сценарий №1 Есть страница на которой скрипты и стили вверху Примерный сценарий ее загрузки будет такой: Загрузка стилей Загрузка скриптов Загрузка остальной разметки В данном сценарии есть недостаток, до момента отображения непосредственно контента страницы браузер должен загрузить стили и скрипты, что дает довольно большую задержку если это крупный ресурс. Сценарий №2 Есть страница на которой стили вверху, а скрипты перед закрывающим тегом body Примерный сценарий ее загрузки будет такой: Загрузка стилей Загрузка разметки Загрузка скриптов В данном сценарии есть преимущества по сравнению с первым, до момента отображения непосредственно контента страницы браузер должен загрузить только стили, а скрипты он загрузит в последнюю очередь, что позволяет пользователю быстрее увидеть содержимое страницы. Почему стили стоит оставлять вверху? Если стили также как и скрипты перенести вниз страницы то разметка после загрузки будет не стилизована, что будет выглядеть довольно некрасиво до момента загрузки стилей.

Ответ 2



Вынесите в конец то, что не является необходимым для оформления вашего сайта. Ведь при открытии сайта пользователь вначале видит его, а потом - взаимодействует с ним. Если (условно говоря) в каком-то скрипте у вас стоит изменение шрифтов (в зависимости от устройства, размера экрана, Math.random() =)), то этот скрипт имеет смысл разместить повыше, что бы пользователь скорее увидел сайт в нужном виде. Если же какой-то скрипт занимаются обработкой изображений предпросмотров, подгрузку статей по мере прокрутки или выполняет ещё какие-то действия, не влияющие на то, что видит пользователь в первое мгновение открытия сайта - вынесите это ниже. В общем, перефразируя один лозунг, - "функционал ничто, вид - всё!" :)

перенос программы с С++ Builder на Visual Studio? или другое? [закрыт]

#cpp #visual_studio #embarcadero


        
             
                
                    
                        
                            Закрыт. На этот вопрос невозможно дать объективный ответ.
Ответы на него в данный момент не принимаются.
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            Хотите улучшить этот вопрос? Переформулируйте вопрос,
чтобы на него можно было дать ответ, основанный на фактах и цитатах, отредактировав его.
                        
                        Закрыт 3 года назад.
                                                                                
           
                
        
Есть старая программа на С++ Builder и желание перейти на Visual C++. Всегда считал,
что аналогом нынешнего Embarcadero является проект С++ WinForm в VS. Однако в версии
VS 2013 Community, с которой я начал пробовать, такого типа проектов нет (только WinForms
для С# и VB).
   Что это означает? Что сейчас обычные windows-приложения на С++ таким путём уже
не делают? А что тогда вместо этого позволяет создать форму и таскать на неё компоненты?
Microsoft рекламирует WPF, но это опять не для С++, а только для С# и VB.
  Почитал ссылки на StackOverflow и выясняется, что народ в большинстве советует
вообще использовать Qt.
  Итого: каков же сейчас "правильный" путь перевода старой программы С++ Builder
на VS или другой софт? 

Update:
причина, по которой хочется отказаться от С++ Builder - просто ненадёжность (последнее
пёрышко - ошибка линкера LME288). Если бы не это - программа отличная.
    


Ответы

Ответ 1



По-простому VCL гуйню под WPF/WinForms/Qt Вы всё равно не переведете. Т.е. заимствовать дизайн конечно можно, но всё наполнение придется делать по-новой. Бизнес-логика должна перенестись без особых проблем, если мы говорим о сохранении языка C++, то есть без перехода на C# или ещё что. Т.о. если решение об отказе от Embarcadero окончательное, из всего обозначенного проще всего перейти на реализацию под Qt. P.S. в общем и целом, данный вопрос, не совсем подходящий для StackOverflow.

Ответ 2



Если у вас старая программа на C++ builder, то она, наверное, еще и большая, и использует тонну компонент из VCL, которых нет ни в Visual C++ ни в QT ни в C#. Возможность визуального редактирования формочек окон есть во многих средах разработки, однако VCL (Delphi и C++ Builder) безусловно является лидером по количестку визуальных компонент. Если у вас возникло желание "перевести" вашу программу с одного языка на другой, то для начала нужно определиться с целью этого мероприятия. Цели могут быть разные: Кроссплатформенность Красота кода Привлечение к работе программистов, специализирующихся на определённых языках и технологиях Внешний вид приложения Быстродействие и оптимизация И многое другое. У каждой среды и фреймворка есть свои плюсы и минусы. У VCL - огромное количество визуальных компонентов (многим из них нет аналогов в других фреймворках), в том числе для работы с базами данных, у C# - в том, что это C# - язык с самым большим количеством синтаксического сахара и очень проработанным фреймворком .net, QT - кроссплатформенность, и т.д. В любом случае, вам нужно быть готовым, что большую или даже большую часть кода вам придётся писать заново. Я бы не советовал вам начинать переводить большую программу на какую-либо другую платформу, предварительно не познакомившись с её плюсами и минусами.

Изменение стилей

#javascript #html #css #веб_программирование


Доброго времени суток коллеги, вопрос такой: 
Как изменить стиль элемента при нажатии на другой элемент?



Пример:
У меня есть вот такая кнопка




        
            GOOGLE
        



Как при нажатии на кнопку первая буква меняла цвет на красный(к примеру)?
    


Ответы

Ответ 1



Еще как вариант a { text-decoration: none; display: block; width: 10rem; height: 5rem; line-height: 5rem; background: #111; color: #fff; border-radius: 4px; text-align: center; letter-spacing: 4px; font-family: sans-serif; text-transform: uppercase; font-size: 1.5rem; } a:first-letter { color: cornflowerblue; } a:focus:first-letter{ color: tomato; } GOOGLE

Ответ 2



Можно сделать на основе checkbox, безо всяких скриптов и с корректным сохранением состояния: .logo input { display: none } .logo input + label { background-color: #0b0b0b; border-radius: 4px; border: 4px solid #065284; -webkit-box-shadow: inset 0px 0px 42px 0px rgba(6,82,132,1); -moz-box-shadow: inset 0px 0px 42px 0px rgba(6,82,132,1); box-shadow: inset 0px 0px 42px 0px rgba(6,82,132,1); color: white; cursor: pointer; display: inline-block; font: 1.5rem sans-serif; letter-spacing: 4px; padding: 0.5rem 1rem; text-transform: uppercase } .logo input + label span { color: cornflowerblue } .logo input:checked + label span { color: tomato } Суть состоит в том, что checkbox скрытно хранит состояние, влияя на страницу через стилевой псевдокласс :checked. Пользователь, в свою очередь, может менять это состояние через связанный label. Добавлено: Если необходимо заблокировать обратное переключение, можно организовать подмену label на неинтерактивный div при активации флажка: .logo input + label, .logo .active { background-color: #0b0b0b; border-radius: 4px; border: 4px solid #065284; -webkit-box-shadow: inset 0px 0px 42px 0px rgba(6,82,132,1); -moz-box-shadow: inset 0px 0px 42px 0px rgba(6,82,132,1); box-shadow: inset 0px 0px 42px 0px rgba(6,82,132,1); color: white; display: inline-block; font: 1.5rem sans-serif; letter-spacing: 4px; padding: 0.5rem 1rem; text-transform: uppercase } .logo input + label { cursor: pointer; } .logo input + label span { color: cornflowerblue } .logo .active span { color: tomato } /* Логика переключения */ .logo input, .logo input:checked ~ label, .logo input:not(:checked) ~ .active { display: none }

Ответ 3



Например так: $('.btn').on('click', function(e){ e.preventDefault(); var $this = $(this), chart = $this.find('.myfirstchar'); if(!$this.hasClass('changeColor')){ $this.addClass('changeColor'); } else { $this.removeClass('changeColor'); } }); a { text-decoration: none; display: block; width: 10rem; height: 5rem; line-height: 5rem; background: #111; color: #fff; border-radius: 4px; text-align: center; letter-spacing: 4px; font-family: sans-serif; text-transform: uppercase; font-size: 1.5rem; } .myfirstchar { color: cornflowerblue; } .changeColor .myfirstchar { color: tomato; } GOOGLE

Поиск элемента по имени в WinForms

#c_sharp #winforms #controls


Мне надо на форме именно найти элемент (button, panel и т.д.) по его name (имени
переменной). Как это сделать?
    


Ответы

Ответ 1



Метод Control.ControlCollection.Find - выполняет поиск элементов управления по их свойству Name и создает массив из всех элементов управления, которые соответствуют условиям поиска. Поиск элементов, совпадающих по имени, будет выглядеть так: var textBoxes = this.Controls.Find("textBox", true); Если необходимо просто найти в коллекции элемент по ключу, тут нужно знать ключ (имя элемента), то вот так: var textBox = this.Controls["textBox1"]; Проверить, содержится ли элемент в контролах можно с помощью метода Control.ControlCollection.ContainsKey. К примеру, взять элемент по ключу будет правильнее, если заранее проверить, содержится ли он в коллекции, код будет выглядеть так: var name = "textBox1"; if (this.Controls.ContainsKey(name)) { var textBox = this.Controls[name]; // делаем с этим элементом то, что нам нужно }

SQL. Как посчитать количество строк с нулевым значением (NULL) [дубликат]

#sql


        
             
                
                    
                        
                            На этот вопрос уже даны ответы здесь:
                            
                        
                    
                
                        
                            Как проверить есть ли NULL в списке?
                                
                                    (3 ответа)
                                
                        
                                Закрыт 3 года назад.
            
                    
Подскажите правильный запрос в SQL, чтобы посчитать количество строк с нулевым значением
NULL.
    


Ответы

Ответ 1



Как вариант, хоть ни разу и не оптимальный: SELECT COUNT(*) - COUNT(someField) FROM someTable

Ответ 2



SELECT COUNT(*) from Sometable where SomeField is null

посчитать количество вызовов клиентом сервера

#java #rest


Привет всем!

Подскажите как организовать счетчик, который бы на стороне клиента показывал сколько
раз клиент отправлял запрос( у меня клиент - просто main - выводит в консоль) Есть
совсем простое приложение, которые развернуто на glassfish локально.  

Вот касс с клиентской частью: 

package com.mkyong.client;

import com.mkyong.rest.JSONService;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;

public class JerseyClientPost {

    public static void main(String[] args) {

        try {

            Client client = Client.create();

            WebResource webResource = client
                    .resource("http://localhost:8080/RESTfulExample3/rest/json/metallica/post");

            String input = "{\"singer\":\"Metallica\",\"title\":\"Fade To Black\"}";

            ClientResponse response = webResource.type("application/json")
                    .post(ClientResponse.class, input);


            if (response.getStatus() != 201) {
                throw new RuntimeException("Failed : HTTP error code : "
                        + response.getStatus());
            }

            System.out.println("Output from Server .... \n");
            String output = response.getEntity(String.class);
            System.out.println(output);



        } catch (Exception e) {
            e.printStackTrace();

        }

    }
}


А вот с серверной: 

package com.mkyong.rest;

import com.mkyong.CounterOfCalls;
import com.mkyong.Track;
import com.sun.jersey.spi.inject.Inject;

import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

@Path("/json/metallica")
public class JSONService {


    @GET
    @Path("/get")
    @Produces(MediaType.APPLICATION_JSON)
    public Track getTrackInJSON() {

        Track track = new Track();
        track.setTitle("Enter Sandman");
        track.setSinger("Metallica");

        return track;

    }

    @POST
    @Path("/post")
    @Consumes(MediaType.APPLICATION_JSON)
    public Response createTrackInJSON(Track track) {

        String result = "Track saved : " + track;
        return Response.status(201).entity(result).build();

    }


}


Подскажите как должен выглядеть счетчик.

Это должна быть функция вроде такой? или как вообще и как это потом вызвать из-под
клиента: 

int count = 0;
@POST
@Path("/post")
@Produces(MediaType.APPLICATION_JSON)
public Integer getCountCalls(){
    return count++;
}

    


Ответы

Ответ 1



Все оказалось просто: в классе-клиенте появилось WebResource webResource1 = client.resource("http://localhost:8080/RESTfulExample/rest/json/metallica/counter"); ClientResponse response1 = webResource1.type("application/json").post(ClientResponse.class); String output1 = response1.getEntity(String.class); System.out.println(output1); а на сервере метод static int count = 0; @POST @Path("/counter") @Consumes(MediaType.APPLICATION_JSON) public Response createTackInJSON1() { String result = "Count = " + ++count; return Response.status(201).entity(result).build(); } обязательно нужно сделать переменную count статической , иначе счетчик будет все время показывать единицу.

Изменить курсор на свой C# WinForms

#c_sharp #winforms


Подскажите как изменить курсор на свой? Делаю так :

 Cursor cur = new Cursor(new System.IO.MemoryStream(global::MSU.Properties.Resources.cursorDragDrop));


Пишет ошибку - 


  Наиболее подходящий перегруженный метод для "System.IO.MemoryStream.MemoryStream(int)"
имеет несколько недопустимых аргументов

    


Ответы

Ответ 1



К примеру можно сделать так (из доступных курсоров): Cursor.Current = Cursors.WaitCursor; Или же свой курсор вот так: Cursor.Current = new Cursor("C:\\<путь к файлу>\\icon.cur"); Кстати, обратите внимание на расширение файла .cur, к примеру .gif туда нельзя упаковать. В VisualStudio есть возможность создать Cursor File (по крайней мере была). Все что Вам нужно - это указать путь к файлу и собственно говоря - сам файл. Будет полезно: Cursors - свойства Если хочется зашить в программу, то думаю стоит добавить файл курсора(.cur) в ресурсы проекта. Затем в коде получить этот файл, конвертировать и создать курсор, что-то на подобии этого: var img = new Bitmap(WindowsFormsApplication1.Properties.Resources.myCursor); Icon icon = Icon.FromHandle(img.GetHicon()); Cursor cur = new Cursor(icon.Handle); Cursor.Current = cur; Данный код приведен в качестве альтернативного примера, но в нем имеются свои недостатки в виде утечки нативных ресурсов. Также, если кликнуть мышкой в окне чужой программы - может возникнуть проблема. Поэтому советую ознакомиться с этим ответом Change Cursor HotSpot in WinForms .NET, он будет более правильным, с использованием WinAPI.

Entity Framework прямой запрос без контекста базы

#c_sharp #net #aspnet_mvc #entity_framework


Возможно ли сделать запрос используя средства EF не описывая при этом контекст базы
данных, либо создав и описав его непосредственно в функции перед запросом?
    


Ответы

Ответ 1



Можно создать контекст и выполнить прямой запрос: public class Client { public int Id { get; set; } public string Name { get; set; } } public class Program { public static void Main() { var context = new DbContext("ConnectionString"); var xxx = context.Database.SqlQuery("select Id, Name from Clients").ToList(); } } В нём не будет DBSet'ов, но запросы выполнять через SqlQuery и ExecuteSqlCommand можно. Но зачем использовать EF, если Вы не хотите использовать EF?

Ответ 2



Если вы не хотите описывать контекст, то вам и не нужны все приемущества шаблона единица работы с репозитарием реализуемым Entity Framework. Достаточно воспользоваться технологией ADO.NET (примеры кода) string connectionString = "Data Source=(local);Initial Catalog=Northwind;" + "Integrated Security=true"; // Provide the query string with a parameter placeholder. string queryString = "SELECT ProductID, UnitPrice, ProductName from dbo.products " + "WHERE UnitPrice > @pricePoint " + "ORDER BY UnitPrice DESC;"; // Specify the parameter value. int paramValue = 5; // Create and open the connection in a using block. This // ensures that all resources will be closed and disposed // when the code exits. using (SqlConnection connection = new SqlConnection(connectionString)) { // Create the Command and Parameter objects. SqlCommand command = new SqlCommand(queryString, connection); command.Parameters.AddWithValue("@pricePoint", paramValue); // Open the connection in a try/catch block. // Create and execute the DataReader, writing the result // set to the console window. try { connection.Open(); SqlDataReader reader = command.ExecuteReader(); while (reader.Read()) { Console.WriteLine("\t{0}\t{1}\t{2}", reader[0], reader[1], reader[2]); } reader.Close(); } catch (Exception ex) { Console.WriteLine(ex.Message); } Console.ReadLine(); } Ещё можете посмотреть в сторону LINQ to SQL

Нарисовать круг средствами html4/js (без явного css)

#javascript #html


Всем доброго времени суток! Есть такая интересная задача - нарисовать круг средствами
html и js. По сути, задача сводится к созданию div на разметке определенной ширины/высоты.
Саму методику я могу предложить т.к. есть способ рисовать например ромб 



var obj = document.getElementById('container');
var tmp, k = 0,
  m = 200;
for (var i = 0; i <= m; i++) {
  if (i > m / 2) k--;
  else k++;
  tmp = document.createElement('div');
  //tmp.style.border = '1px solid #111fff'
  tmp.style.width = k + 'px';
  tmp.style.height = '1px';
  obj.appendChild(tmp);
}
#container
{
  width: 100%;
  display: block;
  padding: 10px;
}
#container div
{
  background-color: lightblue;
  margin: 0 auto;
}
Но я хотел бы попросить помощи в алгоритме рисования подобным образом круга. Как правильно составить алгоритм, который построчно нарисует круг с помощью дивов? Я пытался сделать при помощи формулы c = 2R*sin(angle/2), где с - это расстояние между точками на окружности, а angle - это угол в радианах. Но получается капля, а не круг. Код "капли": var obj = document.getElementById('container1'); var tmp, k = 0, m = 300, angl = 0; for (var i = 0; i <= m; i++) { if (angl > 360) angl = 360; tmp = document.createElement('div'); var sinus = Math.sin((Math.PI * angl / 180) / 2); tmp.style.width = m * sinus + 'px'; tmp.style.height = '1px'; obj.appendChild(tmp); var nexAngle = 360 / m; angl += nexAngle; } #container, #container1 { width: 100%; display: block; padding: 10px; } #container1 div { background-color: lightgreen; margin: 0 auto; }
P.S код очень некрасивый т.к. делалось "в лоб" ) UPD: @pavel и @Gleb Kemarsky оба ответили на поставленный вопрос, просто немного разными способами (хоть в итоге все сводится к одной формуле). За реализацию на JQuery спасибо @Elena Semenchenko! @sitev_ru тоже спасибо! Поэтому заинтересованным советую обратить внимание на все ответы данного вопроса. Спасибо !


Ответы

Ответ 1



Думаю, лучше не через угол, а через отрезки. Задаём радиус. Проходим круг по вертикали и рисуем хорды. Половина от длины хорды - корень квадратный из разницы между квадратом радиуса и квадратом "высоты" хорды. var obj = document.getElementById('container1'); var tmp, radius = 200; for (var i = 0; i <= 2 * radius; i++) { var height = Math.abs(radius - i); var chord = 2 * Math.sqrt(radius * radius - height * height); tmp = document.createElement('div'); tmp.style.height = '1px'; tmp.style.width = chord + 'px'; obj.appendChild(tmp); } #container1 div { background-color: lightgreen; margin: 0 auto; }


Ответ 2



Ну как-то так, точную константу вместо 5 подобрать вручную думаю проще. Идея формулы: у нас есть треугольник (равносторонний, высота - (50 - k) пикселей, стороны по 50 пикселей (радиус круга)). Отсюда из теоремы Пифагора его ширина = 2*Sqrt( 50*50 - (50-k)*(50-k) ). Но если так сделать то его сильно сожмёт (из-за границ возможно), поэтому нужно домножать на коэффициент. var obj = document.getElementById('container'); var tmp, k = 0, m = 100; for (var i = 0; i <= m; i++) { if (i > m / 2) k--; else k++; tmp = document.createElement('div'); tmp.style.border = '1px solid #111fff' tmp.style.width = 5*Math.sqrt(50*50 - (50-k)*(50-k)) + 'px'; tmp.style.height = '1px'; obj.appendChild(tmp); } #container { width: 100%; display: block; padding: 10px; } #container div { margin: 0 auto; }


Ответ 3



На jQuery, по формуле окружности получилось вот такое: function arc(r){ $('
',{ class: 'box' }).appendTo('body'); for(var i = 0; i <= 2*r; i++ ){ var y = Math.abs(r - i); var x = 2*Math.sqrt( Math.pow(r,2) - Math.pow(y,2) ); $('',{ class: 'i' }) .css({ 'display': 'block', 'width': x + 'px', 'height': '1px', 'background-color':'lightgreen', 'margin-left': 'auto', 'margin-right': 'auto' }) .appendTo('.box'); } } arc(100);

Ответ 4



как-то так: r = 100; //radius for (var i = 0; i <= 360; i++) { x = r * cos(i); y = r * sin(i); } по координатам x,y рисуешь круг... Но в задании нужно рисовать дивами, переделал свой метод... Вот что получилось: var obj = document.getElementById('container1'); var tmp, radius = 200, ys = 0; for (var i = 0; i < 180; i++) { var x = Math.sin(Math.PI * i / 180) * radius * 2; var y = radius - Math.cos(Math.PI * i / 180) * radius; var h = y; if (i != 0) h = y - ys; ys = y; tmp = document.createElement('div'); tmp.style.height = h + 'px'; tmp.style.width = x + 'px'; obj.appendChild(tmp); } #container1 div { background-color: red; margin: 0 auto; }


Может ли программа понять, что ее config был отредактирован и сменить свое поведение без перезапуска?

#c_sharp #net #config


Например, имеется программа с каким-то app.config, где храниться путь для закачки файлов.

Может ли программа понять, когда запущена, что config был отредактирован и на основании
этого выполнять закачку в другую папку?
    


Ответы

Ответ 1



Да, может. Сначала надо явно загрузить свой файл настроек: var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.PerUserRoamingAndLocal); Дальше надо получить список файлов, из которых этот файл настроек был собран: var files = config.Locations.Cast().Select(loc => loc.Path); Теперь можно начать наблюдение за этими файлами: var monitor = new HostFileChangeMonitor(files.ToArray()); monitor.NotifyOnChanged(_ => { // ... }); Когда поступит сигнал об изменении файлов - надо выждать 100-200 миллисекунд и сделать все с начала.

Jenkins запуск build проекта после push

#gitlab #build #jenkins


Доброго времени суток. Первый раз столкнулся с задачами CI. Проблема - не получается
адекватно настроить Jenkins. Что требуется: после push проекта на GitLab (именно после
push, это важно), Jenkins должен попытаться собрать проект.

Шаги предпринятые для решения этой проблемы:


Jenkins сервер поднят и настроен, и работает по адресу jenkinsaddres:port
На Jenkins сервере есть GitLab connection опция которая настроена на gitlabhost,
GitLab API token задан и test connection возвращает радостное success.
Добавлен проект, Source Code Management, Repository URL, Credentials, Branch Specifier
настроены.
В проекте опции Build when a change is pushed to GitLab. GitLab CI Service URL: jenkinsaddres:port/project/test
активна, GitLab Triggers: Push events опция так же активна.
GitLabProject -> Settings -> Web hook -> jenkinsaddres:port/project/test, и опция
Push Events тоже активна.


Проект build'ится по расписанию, или вручную но никак не хочет собираться даже при
тестовой отправке hook'а с GitLab. POST сообщение доходит следующего вида source: gitlabhost;
destination: jenkinsaddres; Protocol: HTTP; info: POST /project/test HTTP/1.1 (application/json).
Ответ: адреса верные поэтому не буду их показывать, поле info: HTTP/1.1 404 Not Found
(text/html).

Если на Jenkins выключить все secure опции, и посылать hook на jenkinsaddres:port/job/test(сюда
он стягивает проекты) то тогда объект все-таки находится: Found. Но оказывается что
изменений Jenkins не видит (Not Modified), думаю поэтому проект и не ребилдится.
    


Ответы

Ответ 1



Борюсь с подобной же проблемой. Статья https://github.com/jenkinsci/gitlab-plugin/issues/298 дала следующую подсказку - тестируют с POST а не GET, что возвращает 403 так как "anonymous is missing the Job/Build permission". Два решения по починке https://github.com/jenkinsci/gitlab-plugin/issues/375 Если не заработает после правки - стоит проверить имя проекта. Если что есть URL encoded - это проблемма Так Unit Tests не работает, а UnitTests работает.

Ответ 2



Можно использовать триггер с токеном, он позволяет запускать сборку даже анонимному пользователю. Например, в моем дженкинсе аноним имеет разрешение только на просмотр (Read) задач и сборок. Но хуки работают из Гитлаба, curl'ом и просто через браузер. В конфигурации задачи example_jenkins_job: Хук в Гитлабе: http://jenkinsaddress:port/job/example_jenkins_job/build?token=secret_token Или, если задача параметризованная: http://jenkinsaddress:port/job/example_jenkins_job /buildWithParameters?token=secret_token В этом случае будет запущена сборка с дефолтными значениями параметров. Вы можете передавать собственные значения параметров следующим образом: http://jenkinsaddress:port/job/example_jenkins_job /buildWithParameters?token=secret_token¶m1=value1¶m2=value2 Можно добавить причину сборки: &cause=Cause+Text Она сохранится в информации о сборке: И в логе сборки, первой строкой: Started by remote host 127.0.0.1 with note: Cause Text

синхронизация трех датафреймов по времени

#r


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

как их можно синхронизировать по времени чтоб оставить только те наблюдения которые
есть во всех трех фреймах и выкинуть те которые попадаются только в отдельных фреймах 

вот сами дата фреймы

> head(sec1)
        date  time   open   high    low  close vol
1 2016.09.06 08:45 3081.5 3082.5 3080.5 3080.5   6
2 2016.09.06 08:50 3081.5 3081.5 3079.5 3080.5   6
3 2016.09.06 08:55 3081.5 3082.5 3081.5 3082.5  19
4 2016.09.06 09:00 3083.5 3083.5 3081.5 3082.5  19
5 2016.09.06 09:05 3083.5 3085.5 3082.5 3085.5   8
6 2016.09.06 09:10 3086.5 3086.5 3084.5 3086.5  15
> head(sec2)
        date  time  open  high   low close vol
1 2016.09.13 13:00 95.34 95.40 95.33 95.39  36
2 2016.09.13 13:05 95.40 95.43 95.39 95.41  40
3 2016.09.13 13:10 95.42 95.44 95.40 95.42  37
4 2016.09.13 13:15 95.41 95.42 95.39 95.39  25
5 2016.09.13 13:20 95.40 95.41 95.38 95.38  21
6 2016.09.13 13:25 95.39 95.42 95.38 95.42  32
> head(sec3)
        date  time    open    high     low   close vol
1 2016.09.14 18:10 1.12433 1.12456 1.12431 1.12450 137
2 2016.09.14 18:15 1.12444 1.12459 1.12424 1.12455 139
3 2016.09.14 18:20 1.12454 1.12477 1.12446 1.12469 148
4 2016.09.14 18:25 1.12468 1.12474 1.12442 1.12453 120
5 2016.09.14 18:30 1.12452 1.12483 1.12442 1.12482 156
6 2016.09.14 18:35 1.12481 1.12499 1.12472 1.12474 126


Те на выходе должно получиться три датафрейма одинаковой длинны (nrow) и все строчки
датафреймов должны иметь одинаковую дату и время
    


Ответы

Ответ 1



Если я правильно понял задачу, то нужно определить пересекающиеся интервалы дат и времени и отфильтровать наблюдения, попадающие в эти интервалы. Омечу, что приведённые в качестве примера данные не пересекаются по датам. Определим границы для дат: min_date <- list(df1, df2, df3) %>% sapply(. %>% .subset2("date") %>% as.Date(format = "%Y.%m.%d") %>% min()) %>% max() max_date <- list(df1, df2, df3) %>% sapply(. %>% .subset2("date") %>% as.Date(format = "%Y.%m.%d") %>% max()) %>% min() Теперь то же самое для времени: min_time <- list(df1, df2, df3) %>% sapply(. %>% .subset2("time") %>% as.POSIXct(format = "%H:%M") %>% min()) %>% max() max_time <- list(df1, df2, df3) %>% sapply(. %>% .subset2("time") %>% as.POSIXct(format = "%H:%M") %>% min()) %>% min() Теперь можно отфильтровать наблюдения: df1 <- df1 %>% mutate(date = as.Date(date, format = "%Y.%m.%d")) %>% filter(date >= min_date & date <= max_date) %>% mutate(time = as.POSIXct(time, format = "%H:%M")) %>% filter(time >= min_time & time <= max_time) Чтобы код работал, нужно загрузить пакет dplyr.

Ответ 2



Насколько я понимаю, задача сводится к тому, чтобы оставить в каждом датасете только те наблюдения, для которых есть наблюдения с аналогичными значениями date и time в двух других датасетах. Мне видится самым простым решением такое: слить вместе все три датасета сгруппировать наблюдения по переменным date и time посчитать количество наблюдений в группах оставить только те сочетания date и time, которые встречаются 3 раза отфильтровать исходные датасеты по датасету пересекающихся наблюдений Код (не проверял - лень генерировать исходные датасеты; напишите, если где-то что-то упустил, и не работает) library(tidyverse) df_cross <- bind_rows(df1, df2, df3) %>% group_by(date,time) %>% summarise(occurance = n()) %>% ungroup() %>% filter(occurance == 3) %>% select(-occurance) df1_refined <- left_join(df_cross, df1, by = c('date', 'time')) UPD все оказалось еще проще df_cross <- intersect(df1 %>% select(date,time), df2 %>% select(date,time), df3 %>% select(date,time)) df1_refined <- left_join(df_cross, df1, by = c('date', 'time'))

Как в Intellj Idea подключить к проекту файлы class?

#java #intellij_idea #компиляция


Есть папка и в ней лежат уже скомпилированные классы. Как из них вызвать методы?
Закинул в каталог проекта, и написал 

import javax.help;


В результате Error:(15, 18) java: package javax.help does not exist.
    


Ответы

Ответ 1



Пример из консоли Структура каталогов: C:\dev\ TestImp.class c:\dev\mypack\ Test.class Код класса Test: package mypack; public class Test { public Test() { System.out.println("I live!"); } } Код класса TestImp: import mypack.Test; public class TestImp { public static void main(String[] args) { Test t = new Test(); } } В консоли переходим в каталог c:\dev\ и выполняем: java TestImp В консоль выводится: I live! UPD: Что касается Intellj Idea - вам требуется запаковать ваши файлы классов в jar командой jar cf test.jar Test1.class После этого импортируете jar в проект следующим образом: Структура проекта (CTRL + SHIFT + ALT + S on Windows/Linux, ⌘ + ; on Mac OS X) Modules на левой панели. Вкладка Dependencies '+' → JARs or directories UPD2: Intellij IDEA позволяет добавлять не только JAR'ы, но и каталоги с классами. Делается полностью аналогично написанному выше, только выбирается каталог с классами. После выбора откроется диалог, в котором можно исключить какие либо подкаталоги выбранного каталога.

Ошибка при запуске Android Studio

#android #android_studio


После установки андроид студио выбивает ошибку


  Error:CreateProcess error=216, Версия "%1" не совместима с версией Windows, работающей
на этом компьютере. Проверьте сведения о системе, чтобы узнать, какая версия программы
x86 (32-разрядная) или x64 (64-разрядная) вам нужна, и получите ее у поставщика программного
обеспечения


Как это решить?


    


Ответы

Ответ 1



Установите jdk1.8... В AndroidStudio File->Project Structure->SDK Location, выберите местоположение директории JDK Нажмите Ok. По-умолчанию Android Studio использует встроенную (embeded) JDK, где может быть прописан путь к Java RE, а не к JDK. И по этим причинам она приводит к error=216.

Ответ 2



Да все так. Надо прописать путь к JavaSDK, указать папку, например, "C:\Program Files\Java\jdk1.8.0"

Ответ 3



У меня заработало так: В AndroidStudio File->Project Structure->SDK Location. Выберете Use embededded JDK. Нажмите ок. Запустите приложение кнопкой Run (снова появиться ошибка). Опять зайдите в SDK Location. Снимите галочку с Use embededded JDK. пропишите путь C:\Program Files\Java\jdk1.8.0_121 <-ваша версия jdk. Menu -> Build - Rebuild project.

Буферизация при IO в C#

#c_sharp #net


Подскажите, в чем смысл буферизации при чтении и записи?

Почему нельзя читая сразу писать?

Например, нужно скопировать файл из пункта А в пункт Б.

Сначала мы считываем байты в буфер, а потом из этого буфера начинаем запись.

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

Например, в некоторых исходниках .NET классов явным образам пробиты константы размера
буфера.
    


Ответы

Ответ 1



Можно ознакомиться с этим материалом: Sequential File Programming Patterns and Performance with .NET. Написана статья в 2004, но обновление сделано в 2010 (судя по датам в тексте). Приведу выдержку (вольный перевод мой): Для одного диска используйте настройки по умолчанию фреймворка .NET - они предоставляют отличную производительность для последовательного доступа к файлу. Предварительно выделяйте место для больших файлов (используя SetLength() method), когда создаете файл. Это обычно улучшает скорость примерно на 13% в сравнении с фрагментированным файлом. По крайней мере, сейчас, дисковые массивы требуют небуферизованный IO для достижения лучшей производительности. Буферизованный IO может быть в 8 раз медленнее, чем небуферизованный. Мы ожидаем, что эта проблема будет рассмотрена в более поздних выпусках .NET-фреймворка. Если вы делаете свою собственную буферизацию, используйте большие размеры буфера (64 Кб хорошая отправная точка). Используя .NET-фреймворк, один процессор может читать и писать дисковый массив на скорости свыше 800 Мб*сек, используя небуферизованный IO. Самым интересным в этом списке является пункт 3: при копировании данных с одного физического диска на другой физический буферизация вредна (естественно, буферизация на уровне драйвера диска остается). В остальных случаях она, по крайней мере, не вредит. Подумав, решил добавить, что BufferedStream, применяемый поверх NetworkStream фактически хоть и буферизует данные при передаче между физическими устройствами, в данном случае скорее всего будет эффективен, за счёт уменьшения количества пакетов.

Ответ 2



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

setInterval и задержки

#javascript #setinterval


День добрый, Господа! При написании скрипта столкнулся с такой проблемой: я задал
переменной значение, затем я подставил эту переменную в setInterval в задержку, однако
при изменении этой переменной интервал между выполнениями функции не изменялся. Возник
вопрос: можно ли вообще подставить переменную как значение задержки в setInterval.
Такой код есть на данный момент, передаю вам штурвал.



setInterval(ggg, 1000);
var iter = 0;
var pulse = 90;
var time = 100;
setInterval(timer, 1000);
function ggg() {
	var aza = setInterval(ggg, 1000);
	setTimeout(ggg, 1000);
	clearInterval(aza);
	var aza = setInterval(ggg, 2000);
};
function pulsing() {
	heart.style.backgroundColor = 'red';
	setTimeout(back, 300);
		function back() {
			heart.style.backgroundColor = 'black';
		};
};
function timer() {
	time--;
};



	
	Kek
	



Ответы

Ответ 1



Нет, переменную как значение задержки в setInterval подставить нельзя, вот почему: setInterval выполняет код много раз через равные промежутки времени, пока он не будет остановлен вызовом clearInterval. т.е. промежуток задается один раз (при вызове setInterval). Для того, чтобы сделать так, как вы хотите - нужно каждый раз "уничтожать" setInterval и заново создавать его, с уже новым промежутком(который есть у вас в переменной). PS. это можно сделать разными способами, как один из возможных - при помощи Object.prototype.watch() (учитывая его не поддержку:D, можно юзать - полифилл). var timerObj = { interval: 0, timerId: 0, func: my_function}; // объект для интервала timerObj.watch('interval', function(prop, oldval, val) { // тут пересоздавать сам setInterval нужно: if(timerObj.timerId) clearTimeout(timerObj.timerId); timerObj.timerId = setInterval(this.func, val); }); timerObj.interval = 1000; // запустили интервал // много кода timerObj.interval = 5000; // в любом месте меняет, он сам пересоздается) // можно еще придумать методы для полной остановки и т.д. PPS. как в комментариях верно подметили - лучше использовать Object.defineProperty, тогда код выглядел бы так(полифилл не нужен): var timerObj = {timerId: 0, func: my_function}; // объект для интервала Object.defineProperty(timerObj, 'interval', { set:function(val){ if(timerObj.timerId) clearTimeout(timerObj.timerId); timerObj.timerId = setInterval(timerObj.func, val); } }); timerObj.interval = 1000; // много кода timerObj.interval = 5000;

Ответ 2



Под переменной ты понимаешь: переменный период интервала. Период в setInterval статичен - прямо в вызове setInterval нельзя его сделать переменным. Но можно сделать переменный интервал времени другими способами. Держи пример - каждый шаг таймера произвольный, от 0 до 1 сек: var someAction = function(){ console.log(new Date()); //clearTimeout на случай - чтобы при множественном запуске someAction вне, всё было ОК clearTimeout(someAction.timeout); someAction.timeout = setTimeout(someAction, Math.random()*1000); }; someAction();

Ответ 3



В вашем мире слишком много магии. Для начала, вам следует осознать: любое выражение, которое вы напишите, будет вычислено сразу же, еще до того как кто-то воспользуется его значением. Передача переменной в setInterval ничем не отличается от передачи константы. Для того, чтобы изменить интервал выполнения - надо пересоздать таймер. Вставлять вызов пересоздание таймера каждый раз когда надо изменить интервал - неправильно и нарушает принцип DRY ("не повторяйся!"). Поэтому лучше инкапсулировать таймер в объект: function Timer (callback, interval) { this.callback = callback; this.timerId = null; this.setInterval(interval); } Timer.prototype.setInterval = function (interval) { if(this.timerId !== null) clearInterval(timerObj.timerId); this.timerId = setInterval(this.callback, val); } // ... var timer = new Timer(some_function, 1000); // ... timer.setInterval(5000);