Страницы

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

воскресенье, 10 марта 2019 г.

Копирование файла настроек в шаблоне проекта Visual Studio

Делаю шаблон проекта VS и хочу, чтобы создаваемый проект содержал настройки и аргументы запуска внешней программы. Файл с настройками должен быть просто скопирован в каталог проекта.
Сами настройки VS хранит в файле $projectname$.csproj.user на который нет никаких ссылок из файла проекта (.csproj).
Тут возникает проблема: VS не копирует файлы, которые не задействованы в файле проекта. В $projectname$.csproj должно быть прописано что-то вроде такого , чтобы файл $projectname$.csproj.user был, все-таки, скопирован. Но тогда он появляется в Solution Explorer и настройки из него считываются только после переоткрытия решения.
Project.vstemplate:
AssemblyInfo.cs ProjectTemplate.csproj.user
Как можно решить эту проблему?


Ответ


Можно скрыть элемент в Solution Explorer, если указать значение метасвойства Visible

За старый формат проекта не отвечаю. Скорее всего, там надо указывать отдельным элементом:
false
Это поможет избавиться от лишнего элемента в проекте, но вряд ли поможет с чтением настроек только после переоткрытия решения. Это попахивает ограничением IDE: разработчики, скорее всего, просто не рассчитывали, что пользовательские настройки будут создаваться не пользователем.
Кстати, если перейдёте на новый формат проекта, то там профили запуска лежат отдельным красивым файлом launchSettings.json, и профилей может быть много с разными настройками. Рекомендую.

Почему insertBefore меняет элементы местами до поставленных условий

Очень долго ломал голову, но никак не смог решить проблему.
Как видно, есть 3 бутстраповских блока: простой container , container art-projects и container-design-projects.
Я написал скрипт, который меняет местами два элемента: swap-element и swap-el второго блока art projects при ширине меньше 990 пикселей.
Проблема в том что они меняются еще до 990 пикселей (начиная 1005 пикселей), а это ломает мою верстку.
Вот ссылка на codepen
Помогите, а то запутался, почему же так происходит?
document.addEventListener("DOMContentLoaded", ()=> { let w = document.documentElement.clientWidth; if (w < 990) { swapElements(); } if (w >= 990){ preventDefaultSwap(); } }) window.onresize = () => { let w = document.documentElement.clientWidth; if (w < 990) { swapElements(); } if(w >= 990) { preventDefaultSwap(); } } swapElements = () => { let swapElement = document.querySelector(".swap-element"); let swapElementSecond = document.querySelector(".swap-el"); let swapBlock = document.querySelector(".swap-block"); swapBlock.insertBefore(swapElementSecond, swapElement); } preventDefaultSwap = () => { let swapElement = document.querySelector(".swap-element"); let swapElementSecond = document.querySelector(".swap-el"); let swapBlock = document.querySelector(".swap-block"); swapBlock.insertBefore(swapElement, swapElementSecond); }

what we do?

creative

kitchen

Lorem ipsum, dolor sit amet consectetur adipisicing elit. Expedita, culpa ab maiores debitis, non ipsa voluptatem vel ipsum modi ex rem magni, ad labore. Maiores facilis accusamus voluptatum nemo eius?

Lorem ipsum, dolor sit amet consectetur adipisicing elit. Expedita, culpa ab maiores debitis, non ipsa voluptatem vel ipsum modi ex rem magni, ad labore. Maiores facilis accusamus voluptatum nemo eius?

art

installation

Lorem ipsum, dolor sit amet consectetur adipisicing elit. Expedita, culpa ab maiores debitis, non ipsa voluptatem vel ipsum modi ex rem magni, ad labore. Maiores facilis accusamus voluptatum nemo eius?

Lorem ipsum, dolor sit amet consectetur adipisicing elit. Expedita, culpa ab maiores debitis, non ipsa voluptatem vel ipsum modi ex rem magni, ad labore. Maiores facilis accusamus voluptatum nemo eius?

print

design

Lorem ipsum, dolor sit amet consectetur adipisicing elit. Expedita, culpa ab maiores debitis, non ipsa voluptatem vel ipsum modi ex rem magni, ad labore. Maiores facilis accusamus voluptatum nemo eius?

Lorem ipsum, dolor sit amet consectetur adipisicing elit. Expedita, culpa ab maiores debitis, non ipsa voluptatem vel ipsum modi ex rem magni, ad labore. Maiores facilis accusamus voluptatum nemo eius?



Ответ

Scrollbar не является частью document.documentElement, он находится внутри окна, поэтому ширину надо тоже брать у окна: window.innerWidth

Убрать тэги из текстового столбца DataFrame

В папке all_file лежит 200 текстовых файлов, где каждый состоит из 1 строчки текста содержащего html-теги.
Код создания data frame:
dir_input='/data/home/maksim.ilin/data/all_file/*.txt' files=glob.glob(dir_input) df=pd.concat([pd.read_csv(f,header=None,sep='\t') for f in files],ignore_index=True)
В результате соединения получается одновекторный data frame info:
RangeIndex: 200 entries, 0 to 199 Data columns (total 1 columns): 0 200 non-null object dtypes: object(1) memory usage: 1.6+ KB
Data frame выглядит вот так :
Удаление тегов:
df[0]=df[0].astype(str) texts=[] for a in df.iterrows(): texts.append(BeautifulSoup(a['description']).text)
В итоге ошибка:
---> 22 texts.append(BeautifulSoup(a['description']).text) TypeError: tuple indices must be integers or slices, not str
Пример строчки из файла:

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

Требования:
Мужчина/женщина,
25-40 лет,
образование высшее (желательно маркетинг),
с опытом работы от 3 лет на позиции бренд-менеджера (в компании, занимающейся бытовой техникой или в очень крупной компании).
Обязательно хороший уровень английского (устный и письменный),
сильные навыки управления проектами.
Сильные презентационные навыки.
ПК: MS Office, Power Point – обязательно.

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

Условия:
Офис в центре.
Возможны командировки.


Преобразование в текст есть, получается не преобразует. Как правильно? И примет ли BeautifulSoup в такой форме данные?


Ответ

Чтобы заменить все невложенные теги на пробелы в столбце 0
df[0] = df[0].str.replace(r'\<[^\>]*\>', ' ')
Результат для приведенной в качестве примера строки:
In [87]: df[0].str.replace(r'\<[^\>]*\>', ' ').values[0] Out[87]: ' Приглашается Бренд-менеджер в известную компанию (сеть магазинов бытовой, видео, аудио-техники). Требования: Мужчина/женщина, 25-40 лет , образование высшее (желательно маркетинг), с опытом работы от 3 лет на позиции бренд-менеджера (в компании, занимающейся бытовой техникой или в о чень крупной компании). Обязательно хороший уровень английского (устный и письменный), сильные навыки управления проектами. Сильные презентационны е навыки. ПК: MS Office, Power Point – обязательно. Обязанности: продвижение бренда компании, маркетинговые исследования, вывод собственных бре ндов на рынок, имиджевая реклама. Условия: Офис в центре. Возможны командировки. '

Как получить имя папки “Мой компьютер”

Как можно получить имя папки "Мой компьютер" для windows 10.
// тут должно быть имя This PC, а не MyComputer. string name=Environment.SpecialFolder.MyComputer.ToString();


Ответ

Имя для виртуального каталога проводника можно получить с помощью интерфейса IShellItem
using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices;
namespace WindowsFormsTest1 { class ShellFolder { //Получает локализованное имя для системной папки public static string GetKnownFolderName(ref Guid FolderID) { //https://stackoverflow.com/questions/41423491/how-to-get-localized-name-of-known-folder IntPtr p = IntPtr.Zero; IShellItem pItem = null; IntPtr pString = IntPtr.Zero;
Guid guid = new Guid("43826D1E-E718-42EE-BC55-A1E261C37BFE");//IShellItem int hr;
hr = SHGetKnownFolderIDList(ref FolderID, 0, IntPtr.Zero, out p); if (hr != 0) throw Marshal.GetExceptionForHR(hr);
try {
hr = SHCreateItemFromIDList(p, ref guid, out pItem); if (hr != 0) throw Marshal.GetExceptionForHR(hr);
hr = pItem.GetDisplayName(0, out pString); if (hr != 0) throw Marshal.GetExceptionForHR(hr);
string s = Marshal.PtrToStringUni(pString);
return s; } finally { if (p != IntPtr.Zero) IlFree(p); if (pString != IntPtr.Zero) CoTaskMemFree(pString); if (pItem != null) Marshal.ReleaseComObject(pItem); } }
//Получает локализованное имя для системной папки (устаревший вариант) public static string GetKnownFolderName(uint csidl) { //https://stackoverflow.com/questions/41423491/how-to-get-localized-name-of-known-folder IntPtr p = IntPtr.Zero; IShellItem pItem = null; IntPtr pString = IntPtr.Zero;
Guid guid = new Guid("43826D1E-E718-42EE-BC55-A1E261C37BFE");//IShellItem int hr;
hr = SHGetFolderLocation(IntPtr.Zero, (int)csidl, IntPtr.Zero, 0, out p); if (hr != 0) throw Marshal.GetExceptionForHR(hr);
try {
hr = SHCreateItemFromIDList(p, ref guid, out pItem); if (hr != 0) throw Marshal.GetExceptionForHR(hr);
hr = pItem.GetDisplayName(0, out pString); if (hr != 0) throw Marshal.GetExceptionForHR(hr);
string s = Marshal.PtrToStringUni(pString);
return s; } finally { if (p != IntPtr.Zero) IlFree(p); if (pString != IntPtr.Zero) CoTaskMemFree(pString); if (pItem != null) Marshal.ReleaseComObject(pItem); } }
public static Guid FOLDERID_ComputerFolder = new Guid("0AC0837C-BBF8-452A-850D-79D08E667CA7"); public static Guid FOLDERID_NetworkFolder = new Guid("D20BEEC4-5CA8-4905-AE3B-BF251EA09B53"); //https://www.pinvoke.net/default.aspx/shell32.shgetknownfolderpath
//CSIDL Folder Constants public const uint CSIDL_DESKTOP = 0x00;//Рабочий стол public const uint CSIDL_NETWORK = 0x12;//Сетевое окружение public const uint CSIDL_DRIVES = 0x0011;//Компьютер //... //https://github.com/lxn/win/blob/master/shell32.go
[DllImport("shell32.dll")] static extern int SHCreateItemFromIDList( /*PCIDLIST_ABSOLUTE*/ IntPtr pidl, ref Guid riid, [Out, MarshalAs(UnmanagedType.Interface)] out IShellItem ppv);
[DllImport("shell32.dll")] public static extern int SHGetKnownFolderIDList(ref Guid rfid, int dwFlags, IntPtr hToken, out IntPtr ppidl);
[DllImport("shell32.dll")] static extern int SHGetFolderLocation(IntPtr hwndOwner, int nFolder, IntPtr hToken, uint dwReserved, out IntPtr ppidl);
[DllImport("shell32.dll", EntryPoint = "ILFree")] static extern void IlFree(IntPtr p);
[DllImport("ole32.dll")] static extern void CoTaskMemFree(IntPtr pv); }
[ComImport, Guid("43826D1E-E718-42EE-BC55-A1E261C37BFE"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] public interface IShellItem { int a(); int b();
[PreserveSig] int GetDisplayName([In] uint sigdnName, out IntPtr ppszName); //SIGDN_NORMALDISPLAY = 0x00000000
int c(); int d(); }
}
Использование:
private void button1_Click(object sender, EventArgs e) { string name = ShellFolder.GetKnownFolderName(ref ShellFolder.FOLDERID_ComputerFolder); MessageBox.Show(name); }

pyHook ошибка с кириллицей

Написал что-то на подобие простого кейлоггера, но столкнулся с проблемой: Программа вылетает как только перехожу в другое окно, в названии или пути которого есть кириллица
С ошибкой
F:\Programs\Python36\python.exe F:/Files/MyProjects/KLPy/main.py TypeError: KeyboardSwitch() missing 8 required positional arguments: 'msg', 'vk_code', 'scan_code', 'ascii', 'flags', 'time', 'hwnd', and 'win_name' Process finished with exit code -1073740771 (0xC000041D)
Код программы
def OnKeyboardEvent(event): data = str(event.Key) f = open('Logfile.txt', 'a') f.write(data) f.close()
hook = pyHook.HookManager() hook.KeyDown = OnKeyboardEvent hook.HookKeyboard() pythoncom.PumpMessages()
Как это пофиксить?


Ответ

В pyHook не используется Unicode. В его форке pyhook_py3k добавлена поддержка Unicode. Поддержка Unicode выполнена в файле cpyHook.i, который в бинарной сборке скомпилирован в _cpyHook.xxx.pyd, поэтому так просто его не изменить.
Варианты решения проблемы:
скомпилировать pyhook_py3k под Ваши нужды; использовать Pywinauto (пример установки хуков на клавиатуру)

ES6 синтаксис. Как правильно записать?

const handleFiles = () => { return async handle => { let result; result = 'hello'; return result; }; }; handleFiles().then(result => console.log(result)).catch(console.log(e));
Почему не срабатывает данный скрипт?
Uncaught TypeError: handleFiles(...).then is not a function


Ответ

Проблема в том, что handleFiles возвращает функцию, а не Promise, у которого есть метод then
Для решению нужно либо вызвать возвращенную функцию, либо возвращать результат вызова:
const handleFiles = () => { return async handle => { let result; result = 'hello'; return result; }; }; handleFiles()().then(result => console.log(result)).catch(e => console.log(e)); const handleFiles2 = () => { return (async handle => { let result; result = 'hello'; return result; })(); }; handleFiles2().then(result => console.log(result)).catch(e => console.log(e));

Lock file in unix(Solaris)

Вопрос следующий: в man-е Solaris написано, что захват файлов наследуется при exec, однако, когда я захватываю файл на запись, а затем вызываю execlp(...) — открываю файл в редакторе. Затем я создаю новую сессию и запускаю ту же программу, по идее процесс должен остановиться в ожидании из-за флага F_SETLKW в fcntl(), но он также открывает редактор... В чем может быть дело?
#include #include #include #include #include #include #include
#define editor "nano"
int main(int argc, char *argv[]) { struct flock lock; int fd;
if ((fd = open(argv[1], O_RDWR)) == -1) { perror("Cannot open file"); exit(EXIT_FAILURE); } lock.l_type = F_WRLCK; lock.l_whence = SEEK_SET; lock.l_start = 0; lock.l_len = 0;
if (fcntl(fd, F_SETLKW, &lock) == -1) { perror("fcntl failed"); exit(EXIT_FAILURE); }
execlp(editor, editor, argv[1], NULL); perror("exec is not working"); exit(EXIT_FAILURE);
}


Ответ

man 2 fcntl (Solaris) All locks associated with a file for a given process are removed when a file descriptor for that file is closed by that process or the process holding that file descriptor terminates
В linux этот момент расписан более подробно:
man 2 fcntl (Linux [man-pages-ru]) Если процесс закрывает любой файловый дескриптор, ссылающийся на файл, то освобождаются все блокировки процесса для этого файла, независимо от файлового дескриптора(ов), на который получена блокировка. Это плохо: это означает, что процесс может потерять свои блокировки на файл, такой как /etc/passwd или /etc/mtab, когда какой-либо причине библиотечная функция решает их открыть, прочитать и закрыть.
В данном случае происходит следующее: nano открывает тот же файл, на который удерживается блокировка (на другом дескрипторе), читает его и закрывает. В момент закрытия блокировка теряется, как и описано выше.

Имя интернет сети с++

Как узнать имя интернет сети к которой подключен комп. Подключен ли интернет проверяю так:
#include typedef BOOL(WINAPI* INETCHECKPROC) (LPDWORD lpdwFlags, DWORD dwReserved); bool GetStatusConnect() { bool bRetVal; HINSTANCE hLib = NULL; INETCHECKPROC pfnInternetGetConnectedState; hLib = LoadLibrary("wininet.dll"); if (!hLib) return 0; pfnInternetGetConnectedState = (INETCHECKPROC)GetProcAddress(hLib, "InternetGetConnectedState"); if (!pfnInternetGetConnectedState) return false; DWORD lpdwFlags; bRetVal = pfnInternetGetConnectedState(&lpdwFlags, 0) != 0; FreeLibrary(hLib); return bRetVal; }
Вот только как узнать имя сети?


Ответ

Так можно получить названия адаптера и соответствующего сетевого подключения:
#include #include #include #include #include #include
#include #pragma comment(lib, "ole32.lib") // Link with Iphlpapi.lib #pragma comment(lib, "IPHLPAPI.lib")
#define WORKING_BUFFER_SIZE 15000 #define MAX_TRIES 3
#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x)) #define FREE(x) HeapFree(GetProcessHeap(), 0, (x))
/********************************************************************************/
//Получает информацию о соединении по GUID адаптера NLM_CONNECTIVITY GetAdapterConnectivity(LPCWSTR adapter){
INetworkListManager *pNetworkListManager = NULL; HRESULT hr = CoCreateInstance(CLSID_NetworkListManager, NULL, CLSCTX_ALL, IID_INetworkListManager, (LPVOID *)&pNetworkListManager); if(FAILED(hr)){ printf("CoCreateInstance failed: 0x%x
",(UINT)hr); return (NLM_CONNECTIVITY)0; }
IEnumNetworkConnections* pEnum = NULL; hr = pNetworkListManager->GetNetworkConnections(&pEnum); if(FAILED(hr)){ pNetworkListManager->Release(); printf("GetNetworkConnections failed: 0x%x
",(UINT)hr); return (NLM_CONNECTIVITY)0; }
const int NUM_CONNECTION = 10; INetworkConnection* pNetworkConnections[NUM_CONNECTION]; ULONG cFetched = 0; BOOL bDone = FALSE; GUID guid; NLM_CONNECTIVITY nlmc=(NLM_CONNECTIVITY)0;
while (!bDone) { hr = pEnum->Next(NUM_CONNECTION, pNetworkConnections, &cFetched); if (SUCCEEDED(hr) && (cFetched > 0)) { for (ULONG i = 0; i < cFetched; i++) { pNetworkConnections[i]->GetAdapterId(&guid);
OLECHAR* guidString; StringFromCLSID(guid, &guidString); if(wcscmp(adapter,guidString) == 0){ pNetworkConnections[i]->GetConnectivity(&nlmc); } // ensure memory is freed ::CoTaskMemFree(guidString); pNetworkConnections[i]->Release(); } } else { bDone = TRUE; } }
pEnum->Release(); pNetworkListManager->Release(); return nlmc; }
int _tmain(int argc, _TCHAR* argv[]) { setlocale(LC_ALL,"Russian"); CoInitialize(NULL);
/* Declare and initialize variables */
DWORD dwSize = 0; DWORD dwRetVal = 0;
unsigned int i = 0;
// Set the flags to pass to GetAdaptersAddresses ULONG flags = GAA_FLAG_INCLUDE_PREFIX;
// default to unspecified address family (both) ULONG family = AF_UNSPEC;
LPVOID lpMsgBuf = NULL;
PIP_ADAPTER_ADDRESSES pAddresses = NULL; ULONG outBufLen = 0; ULONG Iterations = 0;
PIP_ADAPTER_ADDRESSES pCurrAddresses = NULL; PIP_ADAPTER_UNICAST_ADDRESS pUnicast = NULL; PIP_ADAPTER_ANYCAST_ADDRESS pAnycast = NULL; PIP_ADAPTER_MULTICAST_ADDRESS pMulticast = NULL; IP_ADAPTER_DNS_SERVER_ADDRESS *pDnServer = NULL; IP_ADAPTER_PREFIX *pPrefix = NULL;
// Allocate a 15 KB buffer to start with. outBufLen = WORKING_BUFFER_SIZE;
do {
pAddresses = (IP_ADAPTER_ADDRESSES *) MALLOC(outBufLen); if (pAddresses == NULL) { printf ("Memory allocation failed for IP_ADAPTER_ADDRESSES struct
"); goto End; }
dwRetVal = GetAdaptersAddresses(family, flags, NULL, pAddresses, &outBufLen);
if (dwRetVal == ERROR_BUFFER_OVERFLOW) { FREE(pAddresses); pAddresses = NULL; } else { break; }
Iterations++;
} while ((dwRetVal == ERROR_BUFFER_OVERFLOW) && (Iterations < MAX_TRIES));
if (dwRetVal == NO_ERROR) { // If successful, output some information from the data we received wprintf(L"*** Network connections ***

"); pCurrAddresses = pAddresses; while (pCurrAddresses) {
WCHAR* adapter = NULL; int c = strlen(pCurrAddresses->AdapterName); adapter = (WCHAR*)MALLOC((c+1) * 2); ZeroMemory(adapter,(c+1) * 2); MultiByteToWideChar(CP_ACP,0,pCurrAddresses->AdapterName,c,adapter,c); //wprintf(L"\tGUID: %s
", adapter); NLM_CONNECTIVITY nlmc = GetAdapterConnectivity(adapter); if(nlmc != NLM_CONNECTIVITY_DISCONNECTED){ wprintf(L"Adapter: %s
", pCurrAddresses->Description); wprintf(L"Network: %s
", pCurrAddresses->FriendlyName); wprintf(L"Connected to:", (UINT)nlmc); if (nlmc & NLM_CONNECTIVITY_IPV4_LOCALNETWORK) wprintf(L" IPv4 LAN;"); if (nlmc & NLM_CONNECTIVITY_IPV4_INTERNET) wprintf(L" IPv4 Internet;"); if (nlmc & NLM_CONNECTIVITY_IPV6_LOCALNETWORK) wprintf(L" IPv6 LAN;"); if (nlmc & NLM_CONNECTIVITY_IPV6_INTERNET) wprintf(L" IPv6 Internet"); wprintf(L"

"); } FREE(adapter);
pCurrAddresses = pCurrAddresses->Next; } } else { printf("Call to GetAdaptersAddresses failed with error: %d
", dwRetVal); if (dwRetVal == ERROR_NO_DATA) printf("\tNo addresses were found for the requested parameters
"); else {
if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dwRetVal, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language (LPTSTR) & lpMsgBuf, 0, NULL)) { printf("\tError: %s", lpMsgBuf); LocalFree(lpMsgBuf); if (pAddresses) FREE(pAddresses); goto End; } } }
if (pAddresses) { FREE(pAddresses); }
End: system("PAUSE"); return 0; }
А так - имя сети:
#include #include #include #include
#include #pragma comment(lib, "ole32.lib")
/********************************************************************************/
int _tmain(int argc, _TCHAR* argv[]) { setlocale(LC_ALL,"Russian"); CoInitialize(NULL);
INetworkListManager *pNetworkListManager = NULL; IEnumNetworkConnections* pEnum = NULL;
//инициализация Network List Manager API HRESULT hr = CoCreateInstance(CLSID_NetworkListManager, NULL, CLSCTX_ALL, IID_INetworkListManager, (LPVOID *)&pNetworkListManager);
if(FAILED(hr)){ printf("CoCreateInstance failed: 0x%x
",(UINT)hr); goto End; }
hr = pNetworkListManager->GetNetworkConnections(&pEnum); //получаем сетевые подключения if(FAILED(hr)){ printf("GetNetworkConnections failed: 0x%x
",(UINT)hr); goto End; }
wprintf(L"*** Networks ***

");
const int NUM_CONNECTION = 10; INetworkConnection* pNetworkConnections[NUM_CONNECTION]; ULONG cFetched = 0; BOOL bDone = FALSE; NLM_CONNECTIVITY nlmc; INetwork* pNetwork = NULL; BSTR name;
while (!bDone) { hr = pEnum->Next(NUM_CONNECTION, pNetworkConnections, &cFetched); if (SUCCEEDED(hr) && (cFetched > 0)) { for (ULONG i = 0; i < cFetched; i++) { nlmc=(NLM_CONNECTIVITY)0; name = NULL;
hr = pNetworkConnections[i]->GetNetwork(&pNetwork); //получаем сеть, соответствующую подключению if(SUCCEEDED(hr)){ hr = pNetwork->GetName(&name); //получаем имя сети if(SUCCEEDED(hr) && name != NULL){ wprintf(L"%s ",name);
pNetworkConnections[i]->GetConnectivity(&nlmc); if(nlmc != 0) wprintf(L"- connected to:");
if (nlmc & NLM_CONNECTIVITY_IPV4_LOCALNETWORK) wprintf(L" IPv4 LAN;"); if (nlmc & NLM_CONNECTIVITY_IPV4_INTERNET) wprintf(L" IPv4 Internet;"); if (nlmc & NLM_CONNECTIVITY_IPV6_LOCALNETWORK) wprintf(L" IPv6 LAN;"); if (nlmc & NLM_CONNECTIVITY_IPV6_INTERNET) wprintf(L" IPv6 Internet"); wprintf(L"
"); } pNetwork->Release(); } // ensure memory is freed pNetworkConnections[i]->Release(); } } else { bDone = TRUE; } }
End: if(pEnum!=NULL)pEnum->Release(); if(pNetworkListManager!=NULL)pNetworkListManager->Release();
system("PAUSE"); return 0; }
Ссылки:
Network Awareness in Windows Vista and Windows 7
GetAdaptersAddresses function

Почему Convert.ChangeType не может конвертировать из char в double (или float)

У меня есть такой метод:
public static T To(this char o) where T : struct { return (T)Convert.ChangeType(o, typeof(T)); }
Если я на месте T стоит double (или float), то выдается InvalidCastException с текстом вроде System.InvalidCastException: Недопустимое приведение "Char" к "Double". Ну что не так с double? Тип явно больше char. Сейчас этот метод выглядит так:
public static T To(this char o) where T : struct { var obj = Convert.ChangeType(o, typeof(int)); return (T)Convert.ChangeType(obj, typeof(T)); }
Сам вопрос - в заголовке. Это как-то объясняется где-нибудь с точки зрения логики? Я ответа не нашел.


Ответ

Метод Convert.ChangeType внутри себя пытается привести аргумент к IConvertible и вызвать соответствующий метод.
Для случая с Char, будет вызываться его метод .ToDouble
/// double IConvertible.ToDouble(IFormatProvider provider) { throw new InvalidCastException(Environment.GetResourceString("InvalidCast_FromTo", "Char", "Double")); }
В котором явно бросается исключение.

Почему метод .ToDouble не поддерживается?
Не только этот метод. .ToBoolean, .ToDateTime, .ToDecimal и .ToSingle тоже не поддерживаются, все они бросают InvalidCastException так же как и .ToDouble
В этом случае дизайн .NET пытается уберечь вас от проблем. Преобразование char в целые типы имеет смысл, вы можете посмотреть на таблицы Unicode и посчитать количество codepoint. Но что должно означать преобразование в Boolean? Какой из Unicode code point будет True? Как символ вообще может быть дробным значением? Нет половинных или четвертных codepoint
перевод ответа @HansPassant

Стоит так же отметить, что тип char может быть неявно преобразован в тип ushort, int, uint, long, ulong, float, double или decimal
То есть следующий код отработает без ошибок:
char c = 'c'; double a = (double)c; double b = c;

Поле и/или переменная? Вот в чем вопрос. (Java)

По ходу моего обучения языка java термин "поле" не дает мне покоя. Я ни в книгах, ни в сети не нашел понятного объяснения этого явления. Кто-то говорит, что "поле" - это "переменная", просто название другое (для примера: объект и экземпляр). В других источниках - это разные вещи.
Так вот, что такое "поле"? Дополнил примером. Он верный?
class MyClass{
int weigth = 50; //---поле int height = 100; //---поле String str; //---поле
int myMethod(){
int a; //---локальная переменная (НЕ поле) int b; //---локальная переменная (НЕ поле) str = "Это строка"; //---полю присваивается значение
... }}


Ответ

Понятие "поле" отнюдь не является чем-то новым в Java. Оно скорее переехало из других языков, существовавших задолго до Java. Так для меня "поле" всегда ассоциировалось с названием колонки в таблице. В Java объекты имеют определенный тип, который может быть классом, интерфейсом, или перечисляемым типом. Внутри этих объектов мы можем определять переменные, которые определяют состояние этих объектов. И наподобие с таблицами, которые имею названия полей для каждой записи, мы имеем названия переменных для каждого объекта класса.
Не исключено, что внутри класса вы можете создавать другие переменные, например локальные переменные, или переменные параметры, которые видны в пределах блока или метода и тем самым не могут повлиять на состояние объекта. Такие переменные не являются полями. Более подробно можно почитать здесь.
Понятие "поле" также имеет широкий спектр значений принятых в информатике и означает место, где находятся данные

напечатать отчет по конфигурации и состоянии компьютера

Руководство поставило задачу напечатать отчеты по конфигурации и состоянии компьютеров. Отчет включает в себя:
Название материнки Кратко о процесоре(название, архитектура, сокет, частота, кол. ядер, ) Количество слотов памяти Количество установленных плашек Общий объем памяти напряжение по линиям 3.3 5 12 информация о жестких дисках (модель, объем, S.M.A.R.T.) сетевые устройства
Сейчас информация собирается вручную, потом перепечатывается уже в файл. На один компьютер уходит более часа монотонного труда. Отсюда вопрос
Как автоматизировать создание отчет кастомизацией вывода?


Ответ

Вот например. Без вольтажа.
#!/bin/bash # version:0.03
echo -e "\"cpu\" { `dmidecode -t processor | grep -E "(Version|Core Count|Socket|Max Speed)"` } \"mb\" { `echo "$(dmidecode -t baseboard | grep "Manufacturer" | sed "s/\tManufacturer: //") - $(dmidecode -t baseboard | grep "Product Name" | sed "s/\tProduct Name: //")"` } \"gpu\" { `lspci | grep VGA | sed \"s/^.*: //g\"` } \"hdd\" { `egrep -o \"Model.*$\" /proc/scsi/scsi` } \"ram\" { `dmidecode -t 17 | nawk '{if ($0==\"Memory Device\") I+=1 ; if ($1==\"Size:\") {sub(/\t/,\"\",$0) ;SIZE[I]=$0 } ; if ($1==\"Speed:\") { sub(/\t/,\"\",$0) ; SPEED[I]=$0 }; ; if ($1==\"Type:\") { sub(/\t/,\"\",$0) ; TYPE[I]=$0 } } END { for(i=1;i<=I;i++) print SIZE[i]\" \"SPEED[i]\" \"TYPE[i]}'` } \"os\" { `cat /etc/issue.net` } \"hostname\" { `hostname` } \"mac_addr\" { `ip a | awk '/link\/ether/ {print $2}'` } " | sed 's/^$//g'

Как правильно разрабатывать UI для iOS приложения? Advanced UIKit?

Не имею четкого представления и понимания о правильных подходах к реализации/программированию именно UI-части приложения, с так скажем "backend" частью пока особых проблем нет. Приведу пример: Когда понял, что приложение нуждается в подчинении чему-то более продвинутому и современному чем простой MVC, изучил вопрос архитектурных паттернов, выбрал подходящую(VIPER), изучил более подробно и реализовал.
Однако следующие задачи:
Сделать переиспользуемую сетку с элементами вида "иконка - подпись", причем на маленьком экране показывать в три столбца, на больших в четыре, плюс слегка увеличивать-уменьшать размер самих этих иконок и подписей. В итоге создал xib-файл для одного такого элемента сетки, и класс-наследник UIView, в который передается массив картинок/подписей и он там у себя все высчитывает и строит Два блока(верхний и нижний) могут изменяться в размерах относительно контента, а блок между ними(label) занимать все оставшееся место. При этом текст в UILabel не должен уходить половиной строки под frame. Пришлось в коде слегка обрезать высоту label чтобы длина была кратна высоте одной строки Переиспользовать таблицу, убрав некоторые кнопки из tab-bar. Например есть основная лента элементов, а есть такая же лента, только с избранными
вызвали у меня намного больше проблем и гуглить их реализацию было намного сложнее. В итоге все сделал сам, однако уверен что есть более правильные и элегантные подходы к решению тех задач с UI, которые появляются с каждым днем. Также есть вопрос: Storyboard или UI в коде? Или часть там, часть - там? Пока что у меня второй вариант с отдельным сторибордом для каждого контроллера и вкраплениями xib-файлов для каких-нибудь переиспользуемых вьюшек вроде круглая иконка и подпись. Однако есть подозрения что лучше делать это в коде (задание размеров, позиций, constraint-ов), с использованием сторонних библиотек для layout-а, т.к. быстрее с точки зрения работы приложения , удобнее и легче с точки зрения контроля версий.
Вопрос не по конкретно вышеперечисленным моментам, а по общей теоретической подготовке и хорошим практикам по работе с UIKit. Ибо просто накидать нужный не-адаптивный интерфейс, связать аутлетами и заполнить view нужным контентом я могу уже давно, даже 70 процентов задач autolayout удается реализовать вполне себе хорошо. Однако в процессе разрастания и усложнения ui и возможностей приложения, все сильнее нуждаюсь в теории и практикам по UIKit уровня выше junior. Подскажите пожалуйста, какие на данный момент bad/best practices, что считается хорошим тоном, а что нет? Может есть какие-нибудь сайты/туториалы, где показывают как создавать переиспользуемые UI-компоненты, как строить сложный autolayout(как правило все туториалы очень простые и в реальной жизни приходится делать что-то в разы сложнее, а правильной теоретической базы по решению тех или инных более менее сложных и реальных задач UI нет).


Ответ

Тут вопрос зависит от ваших ресурсов, если не требуется детальная обработка UIView, то лучше использовать XIB или Storyboard, это сэкономит вам уму времени. Если нужно нарисовать сложный UI то лучше сдлетаь это кодом в кастомном классе наследуемом от UIView, с добавлением Core Graphics и Core Animation
Вот тут более детально описываются плюсы и минусы. Статья довольно старая, но концепция не изменилась. Ручная верстка vs Storyboard/Nib
По воду практики могу посоветовать только платные курсы. С свое время они мне очень сильно помогли. Custom Controls in iOS, Drawing in iOS Предпочтительнее пройти второй курс, так-как он написан на swift 4.
Так-ж если собираетесь создавать UIView кодом. Эта библиотека очень упростит вам жизнь. SnapKit

Как безопасно добавить элементы в коллекцию при использовании итератора?

В коллекцию постоянно добавляются сообщения об изменении в программе и мне нужно выводить эти изменения в textbox. Для этого использую метод Print, где получаю строку для вывода.
class Journal { // Коллекция для событий private List journal = new List();
// Добавить событие в коллекцию public void Add(string Name, string Type_of_Change) { journal.Add(new CollectionHandlerEventArgs(Name, Type_of_Change)); }
// Обработчик изменений на сервере public void ServerChanged(CollectionHandlerEventArgs e) { CollectionHandlerEventArgs je = new CollectionHandlerEventArgs(e.Name, e.Type_of_Change); journal.Add(je); }
// Обработчик изменений клиента public void ClientChanged(CollectionHandlerEventArgs e) { CollectionHandlerEventArgs je = new CollectionHandlerEventArgs(e.Name, e.Type_of_Change); journal.Add(je); }
// Получение строки с изменениями public string Print() { string s = null; foreach (CollectionHandlerEventArgs j in journal) { s += j.Name + ": " + j.Type_of_Change + "
"; } return s; } }
Нашел ошибку в том, что во время итерации нельзя изменять коллекцию, однако мне необходимо это сделать. Как исправить?


Ответ

Ошибка вызвана изменениями в списке в то время, когда существует энумератор этого списка. В цикле for никакого энумератора не создается.
for (int i = 0; i < journal.Count; i++) { CollectionHandlerEventArgs item = journal[i]; s += item.Name + ": " + item.Type_of_Change + "
"; }
Потоко-безопасный вариант:
private ConcurrentBag journal = new ConcurrentBag();
...
foreach (CollectionHandlerEventArgs j in journal.ToArray()) { s += j.Name + ": " + j.Type_of_Change + "
"; }

Deeplink как открыть приложение напрямую

Основное, что мне нужно сделать это открыть приложение напрямую без pop-up который предлагает открыть приложение всеми доступными способами.
Согласно документации в манифесте диплинк можно обьявить 2-мя способами
The following XML snippet shows how you might specify an intent filter in your manifest for deep linking. The URIs “example://gizmos” and “http://www.example.com/gizmos” both resolve to this activity.
И в манифесте это вот так:

Если я правильно понимаю то я не могу просто открыть вот такую ссылку: example://gizmos это ссылка, которую я могу открыть из внешней аппликации при использовании интента.
А вот эта ссылка: http://www.example.com/gizmos как раз для того, чтобы ее отправлять по мейлу(допустим) и открывать ее при нажатии.
Верно ли я понимаю? Потому что я уже разными способами попробовал отправить себе ссылку такого вида: example://gizmos, но она никак не распознается.
Или как правильно это сделать?
Мне нужно, чтоб человек нажал ссылку и приложение сразу открылось.


Ответ

Судя по всему проблема в отсутствии домена в хосте. Т.е. вот так должно работать
android:host="gizmos.ru"
Проверял на 2 девайсах - ссылка в html в Chrome при нажатии открывает приложение. Вот html для теста:

Test of deep link


example://gizmos.ru


На эмуляторах проверить не удалось - они или хрома у меня не содержат или умирают при попытке протестировать такое. Стоящее на одном из эмуляторов приложение HtmlViewer открывал ссылку в себе, не пытаясь проверить есть ли кто для её запуска.

Key Hook не определяет 4 кнопки сразу

Хочу выводить нажатые клавиши пользователем, в том числе сочетания. Пробовал разные Key Lisener/Hook (они работают по одному и тому же принципу), но везде одна и та же проблема - у меня получается нажать 4 клавиши одновременно: A + S + D + F, но вот никак не получается нажать G + H + V или все 4 стрелочки.
Хотелось бы поддерживать 5 одновременных нажатий.
Использую этот гист: https://gist.github.com/Ciantic/471698
Код формы:
public partial class KeyDisplayerForm : Window { private KeyboardListener KListener; private List keys;
public KeyDisplayerForm() { InitializeComponent();
KListener = new KeyboardListener(); KListener.KeyDown += new RawKeyEventHandler(KListener_KeyDown); KListener.KeyUp += new RawKeyEventHandler(KListener_KeyUp);
keys = new List(); }
private void KListener_KeyUp(object sender, RawKeyEventArgs e) { keys.RemoveAll(x => x == e.Key.ToString()); Show(); }
private void KListener_KeyDown(object sender, RawKeyEventArgs e) { if (!keys.Exists(x => x == e.Key.ToString())) { keys.Add(e.Key.ToString()); Show(); } }
private void Show() { label.Content = ""; foreach (var key in keys) { label.Content += $"{key} + "; } }
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) { KListener.Dispose(); } }
Разметка формы:


Ответ

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

Алгоритм Дейкстры

Мне нужно восстановить минимальный путь в графе, от вершины s до f, используя алгоритм Дейкстры. Моя идея - запоминать вершину-родителя для каждой вершины, относительно минимального расстояния для которой мы уверены. Решение не проходит половину тестов, не могли вы помочь мне, указав на ошибку?
#include #include #include #include #include
using namespace std;
vector > graph; vector dist; vector used; vector parrent;
void djkstera(long long u, long long &n, long long &v){ set > que; que.insert({0, u}); dist[u] = 0; long long parr = u;
while(!que.empty()){
while(!que.empty() && used[(*que.begin()).second]){ que.erase(que.begin()); }
if(que.empty()) break;
u = (*que.begin()).second; used[u] = true; parrent[u] = parr; parr = u; que.erase(que.begin());
for(long long i = 0; i < n; ++i){ if(graph[u][i] != -1 and u!=i){ dist[i] = min(dist[i], dist[u] + graph[u][i]); que.insert({dist[i], i}); } } } }
int main() { long long n,s,f; cin >> n >> s >> f; // s - start, f - finish s--; f--; graph.assign(n, vector(n)); used.assign(n, false); dist.assign(n, INT64_MAX); parrent.resize(n);
//Граф задаётся матрицой смежности for(long long i = 0; i < n; ++i){ for(long long j = 0; j < n; ++j){ cin >> graph[i][j]; } } djkstera(s, n, f);
//Пути не существует if(dist[f] == INT64_MAX){ cout << "No solution"; return 0; }
vector res; for(long long i = f; i != s; i = parrent[i]){ res.push_back(i + 1); } res.push_back(s + 1); reverse(res.begin(), res.end());
copy(res.begin(), res.end(), ostream_iterator(cout, " "));
return 0; }


Ответ

Всё, сам разобрался. Родителя следует определять после удачной релаксации(если значение в массиве dist было изменено). Получается вот так:
for(long long i = 0; i < n; ++i){ if(graph[u][i] != -1 and u!=i){ if(dist[u] + graph[u][i] < dist[i]){ parrent[i] = u; dist[i] = dist[u] + graph[u][i]; } que.insert({dist[i], i}); } }

Вывод определенных столбцов из csv

Есть сsv файл с именованными колонками вида:
id;name;address;zip 1;vasya;moscow;11111 2;oleg;sochi;22222
Как мне с помощью стандартного модуля csv вывести только столбцы к примеру name и zip? В дальнейшем необходимо сформировать новый csv файл только с этими двумя колонками.


Ответ

Решил, может кому пригодится:
import csv
with open('f_name', 'r') as f: incl_col = [1, 3] # индексы нужных столбцов new_csv = [] # новый список для нового файла reader = csv.reader(f, delimiter=";") for row in reader: col = list(row[i] for i in incl_col) print(col) # вывод нужных столбцов new_csv.append(col) # заполняем новый список нужными столбцами
with open('new.csv', 'w') as f: # создаем новый файл writer = csv.writer(f, delimiter=";") writer.writerows(new_csv)

Загрузка изображения в Image из бинарных данных

Доброго времени суток!
Необходимо загружать и выгружать данные из Image в бинарные данные, но не понимаю как. Ранее использовал binding к ресурсам или физическому файлу на диске.
Что я делал (код писал по памяти, потому могут быть опечатки или некоторые не точности)?
Создал окно, в которое поместил Image Source="{Binding myImage, converter={x:static StringToBitmapImageConverter}}" Как видно в свойстве myImage расположен string в формате base64 (данных загружаются из XML) и при помощи конвертера я их привожу в формат класса BitmapImage Конвертер, если получает пустую строку, или не валидные данные, загружает из ресурсов значок по умолчанию. При клике по картинке, открывается диалог выбора файла, откуда я считываю его бинарное представление и перевожу его в формат string Base64 После открытия файла - я не вижу картинку (она не отображается). Однако картинка по умолчанию загружается корректно.
Не могу понять в чем проблема.
Попробую привести пример кода, связанного с проблемным местом (как я думаю)
Конвертер
public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { if (value is string && targetType != null && targetType.Equals(typeof(ImageSource))) // здесь я экспериментировал с проверкой типа, по отладке понял, что от окна приходит ImageSource { var bitmap = new BitmapImage(); try { var buffer = System.Convert.FromBase64String(value as string); using (var ms = new MemoryStream()) { // Здесь загрузка проходит, но изображение не появляется на экране ms.Write(buffer, 0, buffer.Length); ms.Seek(0, SeekOrigin.Begin); bitmap.BeginInit(); bitmap.StreamSource = ms; bitmap.CreateOptions = BitmapCreateOptions.IgnoreColorProfile; bitmap.CacheOption = BitmapCacheOption.Default; bitmap.EndInit(); } } catch (Exception ex) { Trace.WriteLine(ex.Message); } return bitmap; } return GetDefaultBitmapImage(new Uri("pack://application:,,,/Money;Component/Ribbon/Coins/blue.png")); }
private object GetDefaultBitmapImage(Uri uri) { // Здесь загрузка проходит корректно var bitmap = new BitmapImage(); bitmap.BeginInit(); bitmap.UriSource = uri; bitmap.EndInit(); return bitmap; }
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { if (value is BitmapSource && targetType != null && targetType.Equals(typeof(string))) { var bitmap = value as BitmapImage; if (bitmap != null && bitmap.StreamSource.CanRead) { byte[] buffer = new byte[bitmap.StreamSource.Length]; var count = bitmap.StreamSource.Read(buffer, 0, buffer.Length); if (count == buffer.Length) { return System.Convert.ToBase64String(buffer, Base64FormattingOptions.InsertLineBreaks); } } } return string.Empty; }
Описание класса к которому идет привязка
public class CoinViewModel : Vm { private Guid _ID; public Guid ID { get => _ID; set => Set(ref _ID, value, nameof(ID)); }
private string _Front; public string Front { get => _Front; set => Set(ref _Front, value, nameof(Front)); }
private string _Back; public string Back { get => _Back; set => Set(ref _Back, value, nameof(Back)); }
public static explicit operator CoinDataView(CoinViewModel vm) { return new CoinDataView() { ID = vm.ID, Name = vm.Name, Count = vm.Count, SeriaID = vm.SeriaID, Back = vm.Back, Front = vm.Front }; } }
ну и собственно говоря, так происходит привязка


Ответ

Ваша ошибка в том, что вы освобождаете поток с данными, который использует BitmapImage, этого не надо делать — уберите using и напишите просто:
bitmap.StreamSource = new MemoryStream(buffer);

Oбьединить две DataFrame таблицы, провести агрегацию данных с помощью pandas

Написал код:
array = pd.DataFrame(np.object, index=[], columns=[]) array = array.append({'Project': b.name, 'Summary': card.name, \ 'Key': card.id, 'Assignee': m, 'Points': s}, \ ignore_index=True) array1 = pd.read_excel('ProjectCostUCP.xlsx', 'Лист1') result = array[['Project', 'Assignee', 'Points']].groupby(['Project', 'Assignee']).sum(axis=1) print(result.columns.tolist()) result = result.merge(array1, on=['Project']) result['Value'] = result.Points * result.Price writer = pd.ExcelWriter('third.xlsx') array.to_excel(writer, "June") result.to_excel(writer, "June_agregation") writer.save()
Нужно обьединить две таблицы - result и array1 по наименованию колонки - 'Project'. Но, как показывает строчка print(result.columns.tolist()) в таблице result только одна колонка - 'Points'. Хотя до операции groupby() была еще и колонка 'Project'. groupby() поместил 'Project' в какой-то MultiIndex, с которого я не могу вытянуть данные. Помогите, пожалуйста, как исправить код, чтобы он заработал ? Конечным результатом работы кода, должна быть таблица:
Project Assignee Price Points Value srnd-demo Serhii 5,5 23 126,5
а после выполнения строчки
result = array[['Project', 'Assignee','Points']].groupby(['Project', 'Assignee']).sum(axis=1)
получается таблица:
Points Project Assignee srnd-demo Serhii 23
Points - оказались наименованием Columns, а Project Assignee попали в тип MultiIndex, с которым не возможно работать (а именно вытягивать с него данные) таблица array1 имеет вид:
Project Price srnd-demo 5.5
где Project Price - это название columns. Нужно обьединить таблицы result и array1 по названию columns Project, после чего перемножить Price на Points и поместить значение в колонку Value. Использование
result.reset_index().merge(array1)
привело к созданию таблицы:
Project Assignee Price_x Points Price_y 0 srnd-demo Serhii 5.5 23.0 5.5
Как добится, чтобы все-таки Price в таблице была одна?


Ответ

Воспользуйтесь методом .reset_index() чтобы превратить все столбцы индекса/мульти-индекса в обычные столбцы:
In [245]: result Out[245]: Points Project Assignee srnd-demo Serhii 23
In [246]: array1 Out[246]: Project Price 0 srnd-demo 5.5
In [247]: result.reset_index().merge(array1) Out[247]: Project Assignee Points Price 0 srnd-demo Serhii 23 5.5

UPDATE:
Если в DataFrame's присутствуют столбцы с одинаковыми наименованиями, которые не учавствуют в объединении (т.е. не были указаны в качестве параметра on, left_on, right_on), то в результате у этих столбцов появятся суффиксы (по умолчанию: '_x' - для левого DF и '_y' - для правого).
Пример:
In [259]: result Out[259]: Points Price Project Assignee srnd-demo Serhii 23 5.5
In [260]: array1 Out[260]: Project Price 0 srnd-demo 5.5
In [257]: result.reset_index().merge(array1, on='Project') Out[257]: Project Assignee Points Price_x Price_y 0 srnd-demo Serhii 23 5.5 5.5
избавьтесь от дублирующих столбцов в одном из DF:
In [258]: result.reset_index().merge(array1.drop(['Price'], axis=1), on='Project') Out[258]: Project Assignee Points Price 0 srnd-demo Serhii 23 5.5

C# Короткая запись метода с помощью анонимного делегата

Подскажите пожалуйста, как реализовать Вот исходный код
vm.RegisterCommand('+', v => Inc(v)); private static void Inc(IVirtualMachine v) { if (v.Memory[v.MemoryPointer] == (char)255) v.Memory[v.MemoryPointer] = (char)0; else v.Memory[v.MemoryPointer]++; }
Хочу заменить на что то вроде
vm.RegisterCommand('+', b => (b.Memory[b.MemoryPointer] == 255) ? 1 : 2 );
на 1:2 не обращайте внимания это для сокращения кода


Ответ

Ну у вас по сути сложение по модулю, поэтому можно записать вместо if что-то вроде v.Memory[v.MemoryPointer] = (char)((v.Memory[v.MemoryPointer] + 1) % 256), ну и, соответственно, в виде лямбды:
vm.RegisterCommand('+', v => v.Memory[v.MemoryPointer] = (char)((v.Memory[v.MemoryPointer] + 1) % 256));
Если IVirtualMachine.Memory – это реально byte-массив, то код можно сократить:
vm.RegisterCommand('+', v => v.Memory[v.MemoryPointer]++));
Если вы хотите переписать свой метод дословно, то это будет выглядеть так:
vm.RegisterCommand('+', v => { if (v.Memory[v.MemoryPointer] == (char)255) v.Memory[v.MemoryPointer] = (char)0; else v.Memory[v.MemoryPointer]++; });
Но это не улучшает читаемость, а даже скорее наоборот.
А с использованием тернарного оператора, например, так:
vm.RegisterCommand('+', v => v.Memory[v.MemoryPointer] = (char)(v.Memory[v.MemoryPointer] == 255 ? 0 : (v.Memory[v.MemoryPointer] + 1) ));

Имею ли я право на использование JDK в своём продукте?

Всем привет, вопрос такой. Я разрабатываю IDE с использованием JDK. Имею ли я право так делать? Мне надо спросить у пользователя принять лицензионное соглашение? Где его взять, как подать?


Ответ

Вопросы о лицензировании и распространении
Официальная лицензия на сайте Oracle
Да, программное обеспечение Java можно распространять вместе с разработанным вами программным обеспечением при условии соблюдения положений и условий лицензионного соглашения о распространении двоичного кода Java.
Программное обеспечение Java можно распространять на компакт-дисках cреди пользователей организации. Кроме того, вы вправе включать Java в состав разрабатываемых вами приложений и распространять их в едином пакете за пределами вашей организации. Распространение программного обеспечения Java на компакт-дисках за пределами организации без включения его в состав разрабатываемых вами приложений запрещено.

Заполнение массива данными php

Есть форма ввода. Надо заполнить массив данными из формы и вывести. Но у меня не получается аккумулировать записи. Каждый ввод стирает предыдущий. Как сделать так чтобы записи добавлялись к массиву?




Ответ

Как сделать так чтобы записи добавлялись к массиву?
Использовать сессию для ввода/вывода notes.php, до завершения надо сохранить в один из вариантов представленных ниже:

Использовать файлы для ввода/вывода записей (не самый удачный)
$note = filter_var ($_POST['text'], FILTER_SANITIZE_STRING); $yor_file = file_put_contents('notes.txt', $note.PHP_EOL , FILE_APPEND | LOCK_EX);

Использовать базу данных для ввода/вывода записей (рекомендованный)
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password); // set the PDO error mode to exception $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sql = "INSERT INTO notes (text) VALUES (:text)"; $stmt = $conn->prepare($sql); $stmt->bindParam(':text', $_POST['text']); $stmt->execute();

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

$_SESSION - Ассоциативный массив, содержащий переменные сессии, которые доступны для текущего скрипта. file_put_contents - Если notes.txt не существует, файл будет создан. Добавит в файл новую запись FILE_APPEND. Класс PDO - Представляет соединение между PHP и сервером базы данных.

Использование буферов OpenGL в OpenCL - ошибка “InvalidContext”

Мне требуется использовать буферы OpenGL в OpenCL. при использовании метода clCreateFromGLBuffer выдаёт ошибку InvalidContext. я где то прочитал что нужно добавить свойства при создании контекста OpenCl
ContextProperty[] contextProperties = new[] { new ContextProperty(ContextProperties.CL_GL_CONTEXT_KHR, Win32.wglGetCurrentContext()), new ContextProperty(ContextProperties.CL_WGL_HDC_KHR,Win32.GetDC(Process.GetCurrentProcess().MainWindowHandle)), new ContextProperty(ContextProperties.CL_CONTEXT_PLATFORM,_platform.handle), }
я добавил но появилась ошибка при создании контекста
System.AccessViolationException: Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена.
Также, констант CL_GL_CONTEXT_KHR и CL_WGL_HDC_KHR не было в библиотеке которую я скачал в NuGet значения констант я нашёл на на этом сайте
Как это исправить?
полный код
Glfw.Init(); window = Glfw.CreateWindow(500, 500, ""); Glfw.MakeContextCurrent(window); OpenGL gl = new OpenGL();
Platform[] platforms = Cl.GetPlatformIDs(out errorCode); foreach (Platform platform in platforms) { Device[] devices = Cl.GetDeviceIDs(platform, DeviceType.Gpu, out errorCode);
if (devices.Length == 0) { continue; }
_platform = platform; _device = devices[0]; break; } ContextProperty[] contextProperties = new[] { new ContextProperty(ContextProperties.CL_GL_CONTEXT_KHR, Win32.wglGetCurrentContext()), new ContextProperty(ContextProperties.CL_WGL_HDC_KHR,Win32.GetDC(window.Ptr)), new ContextProperty(ContextProperties.CL_CONTEXT_PLATFORM,_platform.handle),
}; _context = Cl.CreateContext(contextProperties, 1, new Device[] {_device}, null, IntPtr.Zero, out errorCode);


Ответ

вообщем ему не хватало одного элемента в массиве.
ContextProperty[] contextProperties = new[] { new ContextProperty(ContextProperties.CL_GL_CONTEXT_KHR, wglGetCurrentContext()), new ContextProperty(ContextProperties.CL_WGL_HDC_KHR,wglGetCurrentDC()), new ContextProperty(ContextProperties.CL_CONTEXT_PLATFORM,_platform.handle), new ContextProperty(0,IntPtr.Zero),
};
вот так всё работает.

Вернуть первый не повторяющийся символ из строки, есть ли решение получше?

Например, для строки abacabad результат будет c хоть и есть еще не повторяющийся символ d, но он после c.
Если нет такого символа, то вернуть null. Пример: bcccccccb, результат: null
Мое решение:
function firstNotRepeatingCharacter (s) { let o = {} for (let l of s) o[l] = !o.hasOwnProperty(l) for (k in o) if (o[k]) return k return null }


Ответ

Если поддерживается ES2018, то можно так:
function check(s) { var match = s.match(/(.)(?!.*\1)(?

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

Написал скрипт, который при скролле меняет задний цвет страницы, но вот проблема в том, что туда невозможно добавить код из хекса или имя оттенка цвета.
Чтобы скрипт сработал нужно написать имя (в атрибут data-color) цвета типа: yellow, red, violet и т.д. Притом, если в атрибут data-color написать имя цвета типа french rose (из википедии ), то это не будет работать.
Мне надо задавать цвет хексом. Подскажите, как это можно реализовать, чтобы можно было туда написать цвет хексом или хотя бы имена цветов из ссылки которую я предоставил работали?
$(window).scroll(function() { // селекторы var $window = $(window), $body = $('body'), $panel = $('.panel'); // var scroll = $window.scrollTop() + ($window.height() / 3); $panel.each(function() { var $this = $(this); if ($this.position().top <= scroll && $this.position().top + $this.height() > scroll) { // Удаляет все классы с body которые с классом color- $body.removeClass(function(index, css) { return (css.match(/(^|\s)color-\S+/g) || []).join(' '); }); // добавить класс активному диву $body.addClass('color-' + $(this).data('color')); } }); }).scroll(); /* Setting fade transition and default settings */ body { color: #000; transition: background-color 1s ease; } /* panel styles */ .panel { /* min height incase content is higher than window height */ min-height: 100vh; display: flex; justify-content: space-around; align-items: center; font-family: sans-serif; /* outline: 10px solid hotpink; */ /* turn above on to see the edge of panels */ } /* colours */ .color-violet { background-color: #7A4EAB !important; } .color-indigo { background-color: #4332CF !important; } .color-blue { background-color: #2F8FED !important; } .color-green { background-color: #4DCF42 !important; } .color-yellow { background-color: #FFEA00 !important; } .color-orange { background-color: #F19031 !important; } .color-red { background-color: #F2293A !important; } /* styling for demo, can ignore */ body { text-align: center; font-size: 120%; line-height: 1.618; } h1, h2 { font-size: 3em; letter-spacing: -0.05em; line-height: 1.1; } p { max-width: 30em; margin-bottom: 1.618em; } a { color: #4332CF; } #header { height: 100px; position: fixed; background-color: yellow; width: 100%; z-index: 99; transition: ease-in-out background-color .6s; } #header .logo img { padding: 10px 0; } #header .nav .nav-panel { display: -webkit-box; display: -moz-box; display: -ms-flexbox; display: -webkit-flex; display: flex; } #header .nav .nav-panel .top-panel { display: -webkit-box; display: -moz-box; display: -ms-flexbox; display: -webkit-flex; display: flex; color: #3116f8 !important; } #header .nav .nav-panel .top-panel span { line-height: 1.8; } #header .nav .nav-panel .top-panel a { font-size: 16px; text-decoration: none; font-weight: 900; padding: 0 10px; } #header .nav .nav-panel .top-panel a:hover { color: #3116f8 !important; } #header .nav .nav-panel .top-panel .langs ul { list-style-type: none; } #header .nav .nav-panel .top-panel .langs ul li a span { line-height: 1; }

Magic scrolling colours

Scroll to animate the background colour of the body as a full height panel becomes visible.

I have tried to comment the code, particurly the JavaScript, as much as possible. I hope it's clear to understand.

Violet panel

Indigo panel

Blue panel

Green panel

Yellow panel

Orange panel

Red panel



Ответ

Записывай цвет в data-color без #, а потом в JS добавляй при установке цвета обратно. Вроде проблем с этим никаких нет.
$(window).scroll(function() { // селекторы var $window = $(window), $body = $('body'), $panel = $('.panel'); // var scroll = $window.scrollTop() + ($window.height() / 3); $panel.each(function() { var $this = $(this); if ($this.position().top <= scroll && $this.position().top + $this.height() > scroll) { // устанавливаем цвет $body.css('background-color', `#${$(this).data('color')}`); } }); }).scroll(); /* Setting fade transition and default settings */ body { color: #000; transition: background-color 1s ease; } /* panel styles */ .panel { /* min height incase content is higher than window height */ min-height: 100vh; display: flex; justify-content: space-around; align-items: center; font-family: sans-serif; /* outline: 10px solid hotpink; */ /* turn above on to see the edge of panels */ } /* styling for demo, can ignore */ body { text-align: center; font-size: 120%; line-height: 1.618; } h1, h2 { font-size: 3em; letter-spacing: -0.05em; line-height: 1.1; } p { max-width: 30em; margin-bottom: 1.618em; } a { color: #4332CF; } #header { height: 100px; position: fixed; background-color: yellow; width: 100%; z-index: 99; transition: ease-in-out background-color .6s; } #header .logo img { padding: 10px 0; } #header .nav .nav-panel { display: -webkit-box; display: -moz-box; display: -ms-flexbox; display: -webkit-flex; display: flex; } #header .nav .nav-panel .top-panel { display: -webkit-box; display: -moz-box; display: -ms-flexbox; display: -webkit-flex; display: flex; color: #3116f8 !important; } #header .nav .nav-panel .top-panel span { line-height: 1.8; } #header .nav .nav-panel .top-panel a { font-size: 16px; text-decoration: none; font-weight: 900; padding: 0 10px; } #header .nav .nav-panel .top-panel a:hover { color: #3116f8 !important; } #header .nav .nav-panel .top-panel .langs ul { list-style-type: none; } #header .nav .nav-panel .top-panel .langs ul li a span { line-height: 1; }

Magic scrolling colours

Scroll to animate the background colour of the body as a full height panel becomes visible.

I have tried to comment the code, particurly the JavaScript, as much as possible. I hope it's clear to understand.

Violet panel

Indigo panel

Blue panel

Green panel

Yellow panel

Orange panel

Red panel


проблема с удалением кук

Ситуация такая
есть два сайта (domain.com , a.domain.com), с единой БД и тд.
Если авторизоваться и выйти с главного домена, то куки создаются и удаляются для всех доменов.
Если авторизоваться с a.domain.com, то куки создаются для всех доменом, но, при этом не удаляются, если выйти с главного домена, куки на А остаются :( а выйти с основного, остаются на А.
Как это побороть?
При выходе указываю, что нужно уйти со всех субдоменов, ставя точку перед доменом: .domain.com
public static function authorize($user) { if (self::isAuthorize()) { return; } $_SESSION[self::KEY_TOKEN] = $user->token; $_SESSION[self::KEY_ID] = $user->id; setcookie(self::KEY_TOKEN, $user->token, time() + 3600 * 24 * 365, '/', 'domain.com', self::isHttps(), self::HTTP_ONLY); setcookie(self::KEY_ID, $user->id, time() + 3600 * 24 * 365, '/', 'domain.com', self::isHttps(), self::HTTP_ONLY); }
# выходим с авторизации public static function exit() { unset($_SESSION[self::KEY_TOKEN]); unset($_SESSION[self::KEY_ID]); setcookie(self::KEY_TOKEN, null, null, '/', '.domain.com', self::isHttps(), self::HTTP_ONLY); setcookie(self::KEY_ID, null, null, '/', '.domain.com', self::isHttps(), self::HTTP_ONLY);
}


Ответ

Почему вы куку ставите на domain.com а снимаете с .domain.com? PHP отправляет это в заголовок Set-Cookie как есть, а браузеры могут не понять. Второй момент - попробуйте два последних параметра self::isHttps(), self::HTTP_ONLY убрать: для эксперимента(обычно их всегда по умолчанию оставляют).
Ещё один момент - попробуйте убирать куки, проставляя настоящее время в прошлом вместо null
setcookie(self::KEY_TOKEN, '', time() - 86400, '/', 'domain.com');//например так
Иначе, говорят, не все браузеры поймут что это сброс - опять-же. А так ошибок нет, кука с поддомена, живущая в пространстве основного домена: это нормально, а наоборот: политика безопасности не пропустит.

Сделать вкладки внутри страницы

Хочу сделать вкладки на странице, Например как в Google Chrome.


Ответ

var tab; // заголовок вкладки var tabContent; // блок содержащий контент вкладки window.onload = function() { tabContent = document.getElementsByClassName('tabContent'); tab = document.getElementsByClassName('tab'); hideTabsContent(1); } document.getElementById('tabs').onclick = function(event) { var target = event.target; if (target.className == 'tab') { for (var i = 0; i < tab.length; i++) { if (target == tab[i]) { showTabsContent(i); break; } } } } function hideTabsContent(a) { for (var i = a; i < tabContent.length; i++) { tabContent[i].classList.remove('show'); tabContent[i].classList.add("hide"); tab[i].classList.remove('whiteborder'); } } function showTabsContent(b) { if (tabContent[b].classList.contains('hide')) { hideTabsContent(0); tab[b].classList.add('whiteborder'); tabContent[b].classList.remove('hide'); tabContent[b].classList.add('show'); } } #tabs .tab { display: inline-block; padding: 5px 10px; cursor: pointer; position: relative; z-index: 5; } #tabs .whiteborder { border: 1px solid #707070; border-bottom: 1px solid #fff; border-radius: 3px 3px 0 0; } #tabs .tabContent { width: 300px; height: 60px; border: 1px solid #707070; position: relative; top: -1px; z-index: 1; padding: 10px; border-radius: 0 0 3px 3px } #tabs .hide { display: none; } #tabs .show { display: block; }

Tab 1
Tab 2
Tab 3
1
2
3

как изогнуть изображение на bitmap

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

Методы матрицы (например setPolyToPoly() ) позволяют только растягивать и скашивать изображение , но не изгибать


Ответ

Оказывается у Canvas есть методы drawBitmapMesh() и drawVertices() , которые делают именно то что нужно:

Как можно сделать вот такой элемент на CSS


Не знаю как лучше оформить такое решение на css


Ответ

Вроде бы не сложная вёрстка
.orient { width: 200px; height: 300px; border: 6px solid gold; transform: translate(80px, 30px); position: relative; } .bottom { background: #fff; position: absolute; bottom: 60px; transform: translateX(-50%); padding: 10px; } .bottom a { color: gold; } .top { width: 100px; height: 130px; background: #fff; transform: translate(-50%, 30px); }


Помогите поправить массив php

Я новичок в php... Но пытаюсь полученные данные привести к определенному виду массива..Мой скрипт извлекает данные из XML и записывает их массив в CSV файл в виде:
Array ( [Code] => 209113 [URL] => https://source.dclink.com.ua/images/490432-1.jpg ) Array ( [Code] => 209125 [URL] => https://source.dclink.com.ua/images/489002-new.jpg ) Array ( [Code] => 205366 [URL] => https://source.dclink.com.ua/images/477802-new.jpg ) Array ( [Code] => 205366 [URL] => https://source.dclink.com.ua/images/477803-new.jpg ) Array ( [Code] => 209116 [URL] => https://source.dclink.com.ua/images/493445-new.jpg )
с помощью вот такого скрипта
$start = microtime(true); $fpfinal = fopen(__DIR__.'/PicURlbyCode.csv','w+'); $headers = array ('Code','link'); fputcsv($fpfinal,$headers,';','"');
foreach(glob(__DIR__."/PicList/*.xml") as $FileName){ $items = array(); $xml = simplexml_load_file($FileName);
foreach($xml->Product as $product){
$items= get_object_vars($product);
fputcsv($fpfinal,$items,';','"');
}
} fclose($fpfinal);
echo (memory_get_usage(true)); echo 'Время выполнения скрипта: '.round(microtime(true) - $start, 4).' сек.';
как видите CODE повторяется а ссылки URL разные, Помогите привести массив $items к виду
Array ( [Code] => 205366 [URL] => https://source.dclink.com.ua/images/477802-new.jpg [URL2] => https://source.dclink.com.ua/images/477803-new.jpg )
как бы один код и к нему несколько ссылок...а не 1 и тот же код одна ссылка... и ЗАПИСАТЬ ВСЕ в CSV файл


Ответ

Изначально имеем следующий многомерный массив:
$array = [ ['Code' => '209113', 'URL' => 'https://source.dclink.com.ua/images/490432-1.jpg'], ['Code' => '209125', 'URL' => 'https://source.dclink.com.ua/images/489002-new.jpg'], ['Code' => '205366', 'URL' => 'https://source.dclink.com.ua/images/477802-new.jpg'], ['Code' => '205366', 'URL' => 'https://source.dclink.com.ua/images/477803-new.jpg'], ['Code' => '209116', 'URL' => 'https://source.dclink.com.ua/images/493445-new.jpg'] ];
Первый способ, он прекрасно работает, но я считаю, что он слишком запутан:
foreach ($array as $key => $value) { $new[$value['Code']][] = $value['URL']; }
foreach ($new as $key => $value) { $new[$key] = [];
foreach ($value as $k => $v) { $new[$key]['URL'.(($k + 1) > 1 ? $k + 1 : false)] = $value[$k]; } }
$i = 0;
foreach ($new as $key => $value) { $data[$i]['Code'] = $key;
foreach ($value as $k => $v) { $data[$i][$k] = $v; }
$i++; }
print_r($data);
Второй способ, более упрощенный и оптимальный вариант, как по мне:
$result = [];
foreach ($array as $row) { if (!isset($result[$row['Code']])) { $result[ $row['Code'] ] = [ 'Code' => $row['Code'], 'URL' => $row['URL'] ]; } else { $result[$row['Code']]['URL'.count($result[$row['Code']])] = $row['URL']; } }
$result = array_values($result);
print_r($result);

В разница между командами hlt и pause? Что лучше использовать?

hlt "останавливает" процессор до прихода прерывания, что снижает нагрузку. pause тоже "останавливает", но не могу найти конкретного описания. Коды у них разные.


Ответ

Ух. Попробую ответить.
Основная идея, как я понял, в том, что HLT (halt) - останавливает логический процессор, освобождая доступ к общим ресурсам в физическом пакете, которыми могут воспользоваться все активные логические процессоры в этом же пакете.
А PAUSE используется для того чтобы повысить производительность в процессорах с технологией Hyper-Threading. Суть в том что код, который ожидает освобождения чего-либо путем обращения к семафору, находится в wait цикле. Если код выйдет из цикла и обнаружит, что порядок в памяти нарушен (memory order violation), процессор просто сбросит конвейер (pipeline flush). Это приведет к проседанию производительности в целом. PAUSE таким образом нужен для того, чтобы подсказать процессору что кодовая последовательность является wait циклом, и помогает избежать memory order violation и pipeline flush. Также эта инструкция дает какие-то бонусы в энергопотреблении, но я не вчитывался.
Можете почитать еще тут: https://xem.github.io/minix86/manual/intel-x86-and-64-manual-vol3/o_fe12b1e2a880e0ce-302.html

Свойства в Java

У меня сравнительный вопрос по C# и Java. В C# есть свойства: class SomeClass { int SomeProperty { get; private set; } } А как в Java делается подобное?


Ответ

В Java это будет так (в случае someProperty типа int) class SomeClass { private int someProperty; public int getSomeProperty() { return someProperty; } public void setSomeProperty(int newProperty){ someProperty = newProperty; } } Здесь можно найти более детальное сравнение Java и C# Более компактный вариант class SomeClass { private int someProperty; public int getSomeProperty() {return someProperty;} public void setSomeProperty(int newProperty){someProperty = newProperty;} }

Исключения в C

Возможно ли в C добавить обработку исключений наподобие механизма C++? try { } catch { } Если да, то каким образом?


Ответ

Исключения в C реализуются с помощью пары setjmp/longjmp

Агрессивные коровы [закрыт]

Помогите найти оптимальное решение задачи (спортивное программирование): ФД построил новый длинный амбар с N (2 <= N <= 100,000) стойлами. Стойла расположены вдоль прямой линии на позициях x1,...,xN (0 <= xi <= 1,000,000,000). Его C (2 <= C <= N) коровам не нравится такой амбар и они становятся агрессивными при установке их в стойла. Чтобы избежать прямых столкновений, ФД хочет назначить коровам стойла так, чтобы минимальное расстояние между любыми двумя из них было максимальным насколько это возможно. Каково это минимальное расстояние? Формат ввода: Строка 1: Два разделенных пробелом целых числа N и C Строки 2..N+1: Строка i+1 содержит целые числа - места расположения стойл - xi Пример ввода: 5 3 1 2 8 4 9 OUTPUT FORMAT: Строка 1: Одно целое число - максимальное минимальное расстояние Пример вывода: 3 Пояснения к выводу. ФД может расставить 3 своих коровы в стойла в позициях 1, 4 и 8, в результате чего получиться минимальное расстояние 3.


Ответ

ПРИДУМАЛ! решение за NlogN. отсортируем все позиции по возрастанию (NlogN - qsort). затем будем делать дихотомию по ответу (если можно так сказать), т. е. дихотомией перебираем возможный ответ M (за всего log(10^9) ~ 35 шагов) и пробуем расставить максимальное (не из условия а вообще максимальное) количество коров, чтобы расстояние между соседними не превышало M. (за линейное время - количество стойл 10^5). Если расставили больше коров, чем надо, то увеличиваем нижнюю границу дихотомии (ищем расстояние больше), иначе уменьшаем верхнюю(мы не сможем расставить требуемое количество коров следовательно, делаем верхнюю границу приближенного ответа меньше). @gecube: А теперь бы увидеть код и погонять его :-) легко ))) (Простите за pascal, просто мне нравиться решать задачи именно в нём) const maxN = 111111;
var i,n,c,j,count,cur : longint;
a : array [1..maxN] of longint;
l,r,m : longint;
ans : longint;
procedure swap(var w1,w2 : longint); var temp : longint; begin temp := w1; w1 := w2; w2 := temp; end;
procedure qsort(left,right : longint); var i,j,key : longint; begin i := left; j := right; key := a[(i + j) shr 1]; repeat while (a[i] < key) do inc(i); while (a[j] > key) do dec(j); if (i <= j) then begin swap(a[i],a[j]); inc(i); dec(j); end; until i>j; if (i < right) then qsort(i,right); if (j > left) then qsort(left,j); end;
begin readln(n,c); for i := 1 to n do begin read(a[i]); if a[i] > r then r := a[i]; end;
qsort(1,n);
while l < r do begin m := (l + r + 1) shr 1;
count := 1; cur := a[1]; for i := 2 to n do if a[i] - cur < m then continue else begin cur := a[i]; inc(count); end;
if count >= c then begin l := m; if count >= c then ans := m; end else begin r := m-1; end; end;
writeln(ans);
end.

Как узнать, что пользователь вошел в систему Windows?

Как узнать, что пользователь вошел в систему (Windows 2000 и более новые)? Необходимо в Win-сервисе узнать, что пользователь интерактивно вошел в систему. Получить некоторое уведомление или еще что то. Какие есть способы узнать это?


Ответ

Варианты. Для Windows 2000, XP, 2003 - создать пакет уведомления Winlogon Для Windows Vista, 7 - подписаться на службу системных сообщений SENSE Еще API для удаленного рабочего стола содержит уведомление WM_WTSSESSION_CHANGE. И возможно, что WMI класс Win32_LogonSession может содержать нужные события.

Как в Spring 3 задавать при сериализации в JSON другой Content-Type, либо отлавливать любой ответ с сервера на клиенте в ExtJS?

Здравствуйте. Столкнулся с такой задачей:      Использую в разработке Ext Js 3.1 и Spring 3. Используя функцию fp.getForm().submit({ url: 's3/uploadform.form', waitMsg: 'Загрузка файла...', success: function(fp, o){ msg('Success', 'Загрузка завершена'); } }); Ext JS отправляет данные на сервер, где происходят нужные операции, и клиент ждет от сервера ответ {success:true} В Spring 3 есть удобная вещь, которая автоматически сериализует возвращаемые объекты в JSON при помощи библиотеки jackson. Для удобства, я создал объект со всеми нужными полями плюс поле boolean success. Он прекрасно срабатывает, и отправляет назад клиенту {"success":true, "anyField":"anyString"} При этом используется подобная функция: @RequestMapping(value = "/uploadform.form", method = RequestMethod.POST) public @ResponseBody TransactionResultMessage uploadForm(@Valid ImportXfd xfd, BindingResult validationResults) { /* Тут все что надо и возвращение моего объекта TransactionResultMessage */ } И Ext JS не хочет принимать это. В консоли ошибок JavaScript браузера, выводится Resource interpreted as Document but transferred with MIME type application/json. Такое выводится в google chrome. Mozilla вообще с какого-то этапа стала предлагать сохранить пришедший ответ с сервера на диске. Тут, как я начал понимать, ExtJs ругается на то, что приходит тип application/json. Но этот MIME тип генерирует Spring, и у меня, логически, нет доступа к этому. Так вот новый вопрос:       Как мне сделать Content-type, отправляемый с сервера, типа text/html, либо принимать любой ответ с сервера как текстовый? Заранее спасибо.


Ответ

Как утверждают доки ExtJS, форма ожидает text/html и с этим, видимо, ничего не поделать. Но можно попробовать возвращать с сервера в методе обработчике бин, обернутый в ResponseEntity TransactionResultMessage message; // Тут все что надо HttpHeaders headers = new HttpHeaders(); headers.setContentType(new MediaType("text", "html", Charset.forName("UTF-8"))); return new ResponseEntity(message, headers, HttpStatus.OK);

Платформа для настольных приложений на Java

Изучаю Java для реализации долгосрочного проекта. При создании проекта настольного приложения на NetBeans есть предупреждение о том, что Swing не будет дорабатываться. Значит ли это, что новые проекты на Swing начинать не стоит? Какую лучше платформу выбрать для настольных приложений? Особенности использования этих платформ на NetBeans и IDEA (или в других)?


Ответ

Долгое время занимался разработкой клиентских приложений на Swing (b2b клиенты и пр.) и пришел к такому выводу: Для корпоративных приложений (клиент банки, b2b) связка Java+Swing годится, когда на бекенде у приложения java сервер. Для настольных GUI приложений java это зло. К примеру такие классные апликухи как azureus или personalbrain убивают своей монструозностью. То есть легкое десктопное приложение на джаве не получить. Я пока для себя остановился на wxpython+python для более менее больших приложений где много гуя и чистый wxwidgets+c++ для апликух по меньше, где важна легковесность. Особенности использования этих платформ на NetBeans и IDEA (или в других)? Netbeans со своим визуальным редактором хорош для визуального проектирования, мышкой накидал форму и закодил функционал, но для серьезных проектов эффективнее гуй писать вручную, а там уже любая ide подойдет.

javascript alert синхронность или задержка выполнения скрипта

Хочу перегрузить стандартное поведение alert. Делается это просто: function alert(_m){ //code // предположим здесь я рисую окошко из div элементов и одной кнопкой, просто дизайн меняю. } Вопрос в том, как мне задержать выполнение функции, пока мой пользователь не выполнит в моем окне нужные действия. Задержка не подходит, так как это самый худший вариант. Сам я полагаю, что есть определенный способ управления сценарием, и можно как то приостановить его, а потом с точки останова или другой точки продолжить. П.С.: firebug как то позволяет дебагить, значит существует механизм...


Ответ

Во-первых, Firebug - это все-таки не просто скрипт, а расширение, имеющее доступ к API платформы (например, Mozilla). Потому и остановы в указанных точках он делает с помощью движка. Во-вторых, у браузеров есть такое понятие как "UI thread" - это поток, разделяемый (в смысле "shared") UI-событиями на странице и пользовательским JS на этой же странице. Это разделение означает, что нельзя одновременно выполнять JS-код и выдавать пользователю отзывчивую страницу. Можно организовать нечто похожее и рабочее (так обычно и делают) с помощью setTimeout()/setInterval(), но по сути это лишь откладывание на потом - это не запуск отдельного потока в полном смысле этого слова, это, скорее, перенесение части кода в "будущее" все того же UI-потока. Из вышеприведенного можно сделать вывод, что на пользовательском JS создать блокирующую функцию, чтобы она работала в точности как alert(), нельзя. В конце концов, вам понадобится нечто вроде бесконечного цикла для проверки какого-нибудь условия, который займет всю работу UI-потока. При этом вам нельзя будет использовать setInterval(), так как тогда ваша alert() не будет блокирующей. Возможно, в мои размышления вкралась ошибка, буду рад любым возражениям.