Страницы

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

воскресенье, 12 января 2020 г.

Goroutines - суть потоки?

#golang


В документации Golang как-то неясно раскрывается суть goroutines. Скажите, goroutines
-  это ничто иное как потоки операционной системы?
(т.е. как я пониманию, компилятор Go сам заботится о внутренней реализации этих потоков
в зависимости от операционной системы)    


Ответы

Ответ 1



по простому - это более высокоуровневые потоки. К примеру, если нужно выполнять очень мелкие действия в отдельных потоках, то обычные потоки будут накладными - система будет дольше их создавать. для goroutines run-time может переиспользовать один и тот же поток, эмулируя работу настоящих потоков. В результате получается быстро и дешево. Проблема номер два - некоторые процессы могут создавать очень большое количество потоков (например, из за ошибки программиста). goroutines такого не должно случиться - они будут прост в очереди. Можно считать, что goroutines - это такой встроенный в язык thread pool.

Ответ 2



Если бы это была бы просто параллельность средствами операционной системы, то не следовало бы и язык городить. Другие языки для этих целей прекрасно обходятся библиотеками. ГоРутины - это сильно кастрированные потоки, если сравнивать их с теми, что предоставляет нам операционная система, нет особых гарантий параллельности, некоторые особо рьяно работающие ГоРутины могут заблокировать своей активностью другие ГоРутины. Но при этом, как верно заметили выше, они очень не накладны и на этапе разработки программы и на этапе выполнения программы. Наиболее близкий аналог - green threads

Ответ 3



Наиболее близкий аналог - green threads Да вот не похоже что так. green threads 100%-блокируется на i/o

Output caching и кэширование на уровне Jit компиляции

#aspnet_mvc


Здравствуйте, я возможно сейчас один глупый вопрос задам, но все же:
Мне не совсем понятно за счет чего страница закэшированная на уровне контроллера(OutputCache)
должна обрабатываться быстрее , чем любая другая страница по дефолту кэшируемая Jit
компилятором.По поводу этого в одной книге было следующее:
[OutputCache] is actually implemented using the core ASP.NET platform’s output-caching
technology, which means that if there’s a cache entry for a particular URL, it will
be served without invoking any part of ASP.NET MVC

Но разве кеш Jit компилятора это не уровень веб-сервера?И все запросы, кроме первого
, должны быть так же обработаны напрямую, не затрагивая ASP.NET MVC.
Спасибо.    


Ответы

Ответ 1



Вы пытаетесь сравнить два механизма, работающих на абсолютно разных уровнях: JIT-компилятор выполняет компиляцию IL-кода при первом обращении приложения к этому коду. После этой операции он сохраняет скомпилированный код в памяти, чтобы не выполнять компиляцию при повторном обращении. Это верно не только для ASP.NET Web-приложений, но и для всех .NET-приложений (если они не были заранее скомпилированы в native code, например с помощью NGen). Атрибут OutputCache обеспечивает кэширование всех, либо некоторых действий контроллера. Это значит, что после первого обращения приложения к действию контроллера, результат этого действия будет закеширован, согласно параметрам атрибута. По умолчанию, он будет сохранен на Web-сервере, всех proxy-серверах (если таковые имеются) и в браузере пользователя. При последующих обращениях приложения к этому действию, оно не будет вызываться, а Web-сервер будет сразу возвращать результат из своего кэша. Такое кэширование (как вы указали в вопросе) реализовано платформой ASP.NET и характерно именно для Web-приложений. Отсюда и ответ на ваш вопрос: ВЕСЬ код приложения компилируется по мере обращения к нему и сохраняется JIT-компилятором. Но это всего лишь код. Атрибут OutputCache обеспечивает кэширование результата выполнения этого кода, за счет чего код не будет вызываться повторно. Поэтому, при использовании [OutputCache] и достигается выигрыш в скорости.

Ответ 2



Попробую на свой вопрос что ли ответить: Кэш Jit-компилятора хранит IL сборку (результат первого этапа компиляции) (.net исходник -> IL assembly) Кэш [OutputCache] атрибута это готовый HTML, который не меняется определенное время (результат второго этапа компиляции) (IL assembly + .aspx/.cshtml views -> html page) Вроде так, если ничего не напутал. Т.е при jit компиляции CLR среда вроде как затрагивается.

Скачивание нескольких файлов с сервера

#php


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


Ответы

Ответ 1



Можно сделать архив на стороне PHP, и все файлы вернуть в одном архиве.

Ответ 2



Тут показано как выбрать несколько файлов и скачать одним архивом. http://ruseller.com/lessons.php?rub=37&id=1763 Помещаем выбранные файлы в ZIP формат: 0) { // проверяем выбранные файлы $zip = new ZipArchive(); // подгружаем библиотеку zip $zip_name = time().".zip"; // имя файла if($zip->open($zip_name, ZIPARCHIVE::CREATE)!==TRUE) { $error .= "* Sorry ZIP creation failed at this time"; } foreach($post['files'] as $file) { $zip->addFile($file_folder.$file); // добавляем файлы в zip архив } $zip->close(); if(file_exists($zip_name)) { // отдаём файл на скачивание header('Content-type: application/zip'); header('Content-Disposition: attachment; filename="'.$zip_name.'"'); readfile($zip_name); // удаляем zip файл если он существует unlink($zip_name); } } else $error .= "* Please select file to zip "; } else $error .= "* You dont have ZIP extension"; } ?> Автор: Евгений Попов, под собственной лицензией.

Ответ 3



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

Как обработать кириллические символы в urllib.request.urlopen()?

#python #http #python_3x #urllib


Здравствуйте! У меня такой вопрос, urllib.request.urlopen() не принимает кириллические
символы в http запросе,
Выполняю:

urllib.request.urlopen('http://exemple.com/sent?"русский_текст"')

получаю:
self._output(request.encode('ascii'))  UnicodeEncodeError: 'ascii' codec can't encode
characters in position 11-17: ordinal not in range(128)

Прочитав документацию по urllib.request понял, что urllib.request.urlopen() пытается
перевести мой запрос в кодировку latin 1 (iso8859-1) и именно на это он и ругается,
как правильно обработать запрос с кириллическими символами?    


Ответы

Ответ 1



urllib.request.urlopen('http://example.com/send?{0}'.format(quote_plus('"русский_текст"'))) или даже так: urlopen(urlunparse(('http', 'example.com', '/send', None, quote_plus('"русский текст"'), None), )) а вообще либой requests многие штуки чуточку удобнее делать

Установка библиотеки boost в QtCreator

#boost #qt


Доброй ночи, уважаемые коллеги!

У меня возникла следующая проблема. Мне надо установить в Qt creatore библиотеку
boost. Я скачал библиотеку, установил ее в папке D:\boost_1_54_0. (Я пытаюсь сделать
как сказано здесь) Далее в теле программы в проекте .pro  я пишу следующие вещи.

TEMPLATE = app 
CONFIG += console    
CONFIG -= app_bundle    
CONFIG -= qt    
SOURCES += main.cpp    
win32 {   
    INCLUDEPATH += D:/boost_1_54_0       
    LIBS += -LC:/boost/lib \       
            -lboost_serialization-mgw46-mt-d-1_54 \       
            -lboost_filesystem-mgw46-mt-d-1_54 \      
            -lboost_system-mgw46-mt-d-1_54      
}


Когда же я пытаюсь скомпилировать код программы, мне выдается ошибка 

cannot find -lboost_filesystem-mgw46-mt-d-1_54

collect2: ld returned 1 exit status


Подскажите, пожалуйста, что я делаю не так? Либо,если это можно, скиньте, пожалуйста,
инструкцию, как устанавливать boost на Qt. 

Обновление

Вот смотрите, я правильно понял, что надо было в строке 

INCLUDEPATH += 


написать, где находится папка boost_1_54_0? Я ее скопировал в D. При этом сам QtSDK
находится на С. Мне надо скинуть всю папку boost_1_54_0 в какое то определенное место?
Я просто, честно говоря, не совсем еще понимаю,что нужно прописывать в либах. Я пытаюсь
прописать LD:/boost_1_54_0\lib, однако проблема не решается. Нужно ли какой-нибудь
дополнительный дистрибутив ставить?
    


Ответы

Ответ 1



-L"PATH" говорит что указывается папка где линковищик будет искать lib файлы. Проверьте что в папке C:/boost/lib которую вы указали лежит скомпиленая либа boost_filesystem-mgw46-mt-d-1_54.lib Вот пример указания где у меня лежит . Лень перекладывать было указал как есть. -L"C:\usr\lib\boost_1_57_0\bin.v2\libs\system\build\msvc-12.0\debug\architecture-ia64\link-static\threading-multi" -llibboost_system-vc120-mt-gd-1_57 P.S. Если вы просто распаковали сорцы, то и либы не будет. Надо все это дело собирать. Читайте доки как собрать в папке буста.

Измерить время выполнения одной инструкции

#cpu


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

Каждая инструкция состоит из нескольких составляющих ее операций, которые далеко
не факт что будут выполняться за одинаковое время - допустим, при fetching'е операнда
из памяти или на стадии Write back может произойти cache miss, и в итоге время доступа
вырастет очень существенно, от десятков наносекунд до микро или даже милисекунд.
Также на многих процессорах используются конвеерные оптимизации, т.е. опредленная
последовательность инструкций (паттерн) будет отрабатывать быстрее, нежели другой,
менее удачливый набор, опять-таки, из-за особенностей конвеера и стадий обработки инструкции.
Получается, это невозможно? 
Скажите, прав я или нет?
    


Ответы

Ответ 1



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

Вывести на экран кодировку строки в Perl

#encoding #perl


Есть строка $str в неизвестной кодировке. Как вывести на экран эту самую кодировку?    


Ответы

Ответ 1



Кажется, так: use Encode::Detect::Detector; my $encoding_name = Encode::Detect::Detector::detect($str); print $encoding_name;

Установка списка отзывов (*.crl) в хранилище компьютера

#c_sharp #сертификат


Ребята, подскажите пожалуйста как в C# установить *.crl в хранилище компьютера.
Есть код для установки сертификата в корневые сертификаты:

private static void InstallRootCertificate(string cerFileName)
{
   X509Store store = new X509Store(StoreName.AuthRoot, StoreLocation.LocalMachine);
   X509Certificate2 certificate = new X509Certificate2(cerFileName);
   store.Open(OpenFlags.ReadWrite);
   store.Add(certificate);
   store.Close();
}


Но он, по понятным причинам не подходит для crl.
Заранее спасибо.
    


Ответы

Ответ 1



Хотя вопрос был задан очень давно, и уже, возможно, не актуален, все же предложу решение, поскольку проблема интересная. Ее решение может быть полезно, например, когда нужно автоматизировать обновление списков отозванных сертификатов на десятках серверов. К сожалению, никаких стандартных средств для решения этой задачи .NET не предоставляет. Придется использовать обертки для crypt32.dll и unsafe-код. Ниже приведет пример решения. Его основу составляет класс CrlFile, который позволят открыть crl-файл и импортировать его в стандартное хранилище (класс System.Security.Cryptography.X509Certificates.X509Store). Дополнительная информация: https://msdn.microsoft.com/en-us/library/windows/desktop/aa376011(v=vs.85).aspx https://blogs.msdn.com/b/gproano/archive/2005/03/22/400645.aspx?Redirected=true class Program { static void Main(string[] args) { var store = new X509Store(StoreName.CertificateAuthority, StoreLocation.CurrentUser); store.Open(OpenFlags.ReadWrite); var crl = new CrlFile(@"d:\tmp\ca\root.crl"); crl.Import(store, CrlAddDisposition.CERT_STORE_ADD_REPLACE_EXISTING); store.Close(); } } public class CrlFile { // по уму здесь нужна реализация SafeHandle, // но чтобы не удлинять код оставим, как есть private IntPtr _context; private readonly string _file; public CrlFile(string file) { _file = file; } public bool Import(X509Store store, CrlAddDisposition disp, ref IntPtr storeContext) { EnsureCrlContext(); return Crypto32Interop.CertAddCRLContextToStore(store.StoreHandle, _context, (uint)disp, storeContext); } public bool Import(X509Store store, CrlAddDisposition disp) { var storeContext = IntPtr.Zero; return Import(store, disp, ref storeContext); } private unsafe void EnsureCrlContext() { if (_context != IntPtr.Zero) return; var context = new IntPtr(Crypto32Interop.CERT_QUERY_CONTENT_CRL); var handle = GCHandle.Alloc(_file, GCHandleType.Pinned); var data = handle.AddrOfPinnedObject(); bool ret = Crypto32Interop.CryptQueryObject( Crypto32Interop.CERT_QUERY_OBJECT_FILE, data, Crypto32Interop.CERT_QUERY_CONTENT_FLAG_CRL, Crypto32Interop.CERT_QUERY_FORMAT_FLAG_ALL, 0, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero, new IntPtr(&context)); _context = Crypto32Interop.CertDuplicateCRLContext(context); Crypto32Interop.CertFreeCRLContext(context); handle.Free(); } ~CrlFile() { if (_context != IntPtr.Zero) Crypto32Interop.CertFreeCRLContext(_context); } } public static class Crypto32Interop { public const uint CERT_QUERY_CONTENT_CTL = 2; public const uint CERT_QUERY_CONTENT_CRL = 3; public const uint CERT_QUERY_OBJECT_FILE = 1; public const uint CERT_QUERY_FORMAT_BINARY = 1; public const uint CERT_QUERY_FORMAT_BASE64_ENCODED = 2; public const uint CERT_QUERY_FORMAT_ASN_ASCII_HEX_ENCODED = 3; public const uint CERT_QUERY_CONTENT_FLAG_CRL = (1 << (int)CERT_QUERY_CONTENT_CRL); public const uint CERT_QUERY_CONTENT_FLAG_CTL = (1 << (int)CERT_QUERY_CONTENT_CTL); public const uint CERT_QUERY_FORMAT_FLAG_BINARY = (1 << (int)CERT_QUERY_FORMAT_BINARY); public const uint CERT_QUERY_FORMAT_FLAG_BASE64_ENCODED = (1 << (int)CERT_QUERY_FORMAT_BASE64_ENCODED); public const uint CERT_QUERY_FORMAT_FLAG_ASN_ASCII_HEX_ENCODED = (1 << (int)CERT_QUERY_FORMAT_ASN_ASCII_HEX_ENCODED); public const uint CERT_QUERY_FORMAT_FLAG_ALL = (CERT_QUERY_FORMAT_FLAG_BINARY | CERT_QUERY_FORMAT_FLAG_BASE64_ENCODED | CERT_QUERY_FORMAT_FLAG_ASN_ASCII_HEX_ENCODED); [DllImport("crypt32.dll", CharSet = CharSet.Auto, SetLastError = true)] public static extern IntPtr CertDuplicateCRLContext(IntPtr pCrlContext); [DllImport("crypt32.dll", CharSet = CharSet.Auto, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool CertFreeCRLContext(IntPtr pCrlContext); [DllImport("crypt32.dll", CharSet = CharSet.Auto, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool CertAddCRLContextToStore( [In] IntPtr hCertStore, [In] IntPtr pCrlContext, [In] uint dwAddDisposition, [Out] IntPtr ppStoreContext); [DllImport("crypt32.dll", CharSet = CharSet.Auto, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool CryptQueryObject( [In] uint dwObjectType, [In] IntPtr pvObject, [In] uint dwExpectedContentTypeFlags, [In] uint dwExpectedFormatTypeFlags, [In] uint dwFlags, [Out] IntPtr pdwMsgAndCertEncodingType, [Out] IntPtr pdwContentType, [Out] IntPtr pdwFormatType, [In, Out] IntPtr phCertStore, [In, Out] IntPtr phMsg, [In, Out] IntPtr ppvContext); } public enum CrlAddDisposition : uint { CERT_STORE_ADD_NEW = 1, CERT_STORE_ADD_USE_EXISTING = 2, CERT_STORE_ADD_REPLACE_EXISTING = 3, CERT_STORE_ADD_ALWAYS = 4, CERT_STORE_ADD_REPLACE_EXISTING_INHERIT_PROPERTIES = 5, CERT_STORE_ADD_NEWER = 6, CERT_STORE_ADD_NEWER_INHERIT_PROPERTIES = 7, }

Защита приложения Андроид

#android #google_play


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


Ответы

Ответ 1



Application Licensing С помощью этой штуки можно проверить лицензию конкретного пользователя на использование конкретного приложения(платного, или бесплатного), и решить, разрешать ему запуск, или нет... Но количество выложенных платных приложений, на пример на 4pda подтверждает тот факт, что почти любую защиту можно обойти. Я бы советовал делать какую-то авторизацию на сервере для защиты...

Ответ 2



Методы защиты есть, но они не работают. Из не сломанных на 4pda я помню только Poweramp (Возможно уже все изменилось). Лучше придумайте способ монетизации отличный от продажи.

Подсветка svg элементов

#css3 #svg #javascript #css


Доброго времени суток.
У меня есть задача сделать подсветку svg элемента при наведении на него курсора мыши.
Проблема заключается в том что кастомные стили элемента не должны изменяться. А подсветка
должна появляться по бокам элемента.
Частично я уже понимаю что решить задачу можно с помощью svg фильтров. Только вот
поверх элемента может быть расположен другой полупрозрачный элемент и подсветка первого
будет частично затухать (если так можно выразиться).
Посоветуйте как быть.    


Ответы

Ответ 1



Это можно сделать с помощью css свойства filter и селектора :hover. Вот пример http://jsfiddle.net/FvjA3/ . #rect:hover { filter: url("#glow-filter"); }

SSL авторизация на сайте по сертификату в связке с логином и паролем

#ssl #java


Подскажите что я делаю не так? 

Необходима авторизация на сайте https://test.local, для авторизации используется
сертификат cert.pfx и связка логин:пароль. 
cert.pfx - я экспортировал из браузера firefox, что бы действительно убедиться что
сертификат верный я его импортировал(в веб браузер) на другие машины. авторизация проходила
успешно.

Из полученного сертифката я создал keystore.jks 

openssl pkcs12 -in custom_cert.p12 -out custom_cert.pem -nodes -nokeys
openssl pkcs12 -in custom_cert.p12 -out custom_key.pem -nodes -nocerts

openssl pkcs8 -topk8 -nocrypt -in custom_key.pem -inform PEM -out custom_key.der
-outform DER
openssl x509 -in custom_cert.pem -inform PEM -out custom_cert.der -outform DER


Вот так вот выглядит мое подключение

String URL = "test.local";

 try {

            KeyStore kS = KeyStore.getInstance( KeyStore.getDefaultType() );
            FileInputStream fIS = new FileInputStream("keystore.jks"); 
            kS.load(fIS, "123456".toCharArray());

            KeyManagerFactory kMF = KeyManagerFactory.getInstance("SunX509");
            kMF.init(kS, "123456".toCharArray());
            KeyManager[] kMs = kMF.getKeyManagers();

            TrustManagerFactory tMF = TrustManagerFactory.getInstance("SunX509");
            tMF.init(kS);
            TrustManager[] tM = tMF.getTrustManagers();


            SSLContext sslContext = SSLContext.getInstance("SSL");
            sslContext.init(kMs, tM, new SecureRandom());
            SSLContext.setDefault(sslContext);
            javax.net.ssl.SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

            SSLSocket sslClientSocket = (SSLSocket) sslSocketFactory.createSocket(URL,443);
            sslClientSocket.startHandshake();


            HttpHost targetHost = new HttpHost(URL, 443, "https");
            SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext,
SSLConnectionSocketFactory.STRICT_HOSTNAME_VERIFIER);



            CredentialsProvider credsProvider = new BasicCredentialsProvider();
            credsProvider.setCredentials(
                    new AuthScope(targetHost.getHostName(),443),
                    new UsernamePasswordCredentials("Fedya.Ivakin", "191919"));

            HttpClient httpclient = HttpClients.custom()
                    .setSSLSocketFactory(sslsf)
                    .setDefaultCredentialsProvider(credsProvider)
                    .setSslcontext(sslContext)
                    .build();

            AuthCache authCache = new BasicAuthCache();           
            BasicScheme basicAuth = new BasicScheme();
            authCache.put(targetHost, basicAuth);

            HttpClientContext context = HttpClientContext.create();
            context.setCredentialsProvider(credsProvider);

            HttpGet httpget = new HttpGet("/");

            HttpResponse response = httpclient.execute(targetHost, httpget, context);
            System.out.println(response.getStatusLine());


В результате получаю HTTP/1.1 403 Forbidden.

Хотя ошибок ни каких нет, куда копать? подскажите пожалуйста.
    


Ответы

Ответ 1



Кучу сайтов перерыл. Встречал такие утверждения, что pkcs12 сертификаты java не понимает и надо их конвертировать и кучу еще чего. Но вот так у меня проходит авторизация по сертификату + логин пароль. String URL = "https://test.local:443"; URL url = new URL(URL); HttpsURLConnection con = (HttpsURLConnection) url.openConnection(); con.setSSLSocketFactory(getFactory1(new File("key/User.pfx"), "123456")); Authenticator.setDefault(new MyAuthenticator()); con.setAllowUserInteraction(true); con.setRequestMethod("GET"); con.connect(); domain необходимо указывать именно через два слеша, плюс не нужно указывать зону(ru и тп). Например логин и пароль у нас такой Ivan.Petrov@domain.ru - это логин, 123456 - это пароль class MyAuthenticator extends Authenticator { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("domain\\Ivan.Petrov", "123456".toCharArray()); } } == private SSLSocketFactory getFactory1(File pKeyFile, String pKeyPassword) throws NoSuchAlgorithmException, KeyStoreException, IOException, CertificateException, UnrecoverableKeyException, KeyManagementException { KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("SunX509"); KeyStore keyStore = KeyStore.getInstance("PKCS12"); InputStream keyInput = new FileInputStream(pKeyFile); keyStore.load(keyInput, pKeyPassword.toCharArray()); keyInput.close(); keyManagerFactory.init(keyStore, pKeyPassword.toCharArray()); TrustManager[] trustAllCerts = new TrustManager[]{ new X509TrustManager() { @Override public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException { //To change body of implemented methods use File | Settings | File Templates. } public java.security.cert.X509Certificate[] getAcceptedIssuers() { return null; } public void checkServerTrusted(X509Certificate[] certs, String authType) { } } }; SSLContext context = SSLContext.getInstance("TLS"); context.init(keyManagerFactory.getKeyManagers(), trustAllCerts, new SecureRandom()); return context.getSocketFactory(); } Ничего ни пришлось конвертировать и тп. Необходимо экспортировать сертификат пользователя из браузера и закинуть его в приложение.

Ответ 2



Здравствуйте, попробуйте как описано здесь

Как работать со своей отдельной веткой в репозитории?

#git #git_push #git_pull


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

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

Как вообще в таком случае поступать надо? Клонировать весь проект и работать с теми
файлами, которые тебе предназначены, или как только свою ветку клонировать или pull-ить? 

И потом еще как push-ить именно в свою ветку?
    


Ответы

Ответ 1



предположим, что до этого вы работали с веткой master. и вас известили, что в основном репозитории для вас создали ветку test. получите все обновления из основного репозитория: $ git fetch после этого вы увидите ветку test из основного репозитория (вывод команды — ориентировочный): $ git branch -r origin/HEAD -> origin/master origin/master origin/test создайте в своём локальном репозитории ветку (например, test), сразу же «привязав» её к ветке test из основного репозитория: $ git checkout -b test origin/test Branch test set up to track remote branch test from origin. Switched to a new branch 'test' теперь вы можете вносить изменения, коммитить их, отправлять в основной репозиторий командой: $ git push и получать обновления из этой ветки основного репозитория командой: $ git pull и «мёрджить» коммиты из другой ветки: $ git merge другая-ветка в любой момент (ну, почти в любой) вы можете переключить свою рабочую копию файлов на другую ветку: $ git checkout другая-ветка и «вернуться обратно»: $ git checkout test

Пишу проект на Qt. Где нужно указать, что используется ПО с открытым исходным кодом?

#лицензирование #opensource


Здравствуйте. Пишу проект для себя (если кому-то будет интересно, то и для людей)
с использованием Qt. Qt под GPLv3, мой проект под MIT. Так вот, где мне нужно указать,
что используется ПО с открытым исходным кодом (в данном случае Qt)?    


Ответы

Ответ 1



Если я правильно читал документацию, то нужно сделать так в корневой каталог положите копии лицензий Qt и MIT (той, которую Вы используете) создайте файл LICENSE.txt, где напишите, что это Ваш проект под лицензией MIT и Вы используете Qt под GPLv3 во всех своих файлах в верху добавьте короткую вставку с указанием авторства, даты создания, лицензии и подобного. там, где добавить вставку невозможно (к примеру, папка с картинками), вставьте текстовый документ с подобных текстом (картинки созданы таким то, лицензия такая то). также, неплохо добавить в пункт меню "помощь" рядом с " о программе" пункт "о Qt", с вызовом стандартного окошка. в любом случае, всегда можно им написать напрямую и уточнить детали - http://qt.digia.com/licensing/

CAUTION: provisional headers are shown

#google_chrome #header #php #http


Привет...
У меня проблема в Chrome.
Запрос вроде не отправляется и в консоли на этом пакете выводится это сообщение.
Что может означать это и по каким причинам:

Запрос не отправляется?
Ответ не приходит?
Сервер не  генерирует ответ на вопрос?
    


Ответы

Ответ 1



Какое-то расширение блокирует запрос. Попробуйте запустить Chrome в режиме Инкогнито (Ctrl + Shift + N). Дополнения будут отключены.

Ответ 2



Ресурс может блокироваться расширением Сообщение есть, потому что запрос на получение этого ресурса никогда не был выполнен, поэтому отображаемые заголовки не являются реальностью. Как пояснялось в проблеме, на которую вы ссылались, реальные заголовки обновляются, когда сервер отвечает, но нет ответа, если запрос был заблокирован. Введите chrome://net-internals в адресную строку и нажмите enter. Откройте страницу с проблемами. Вернитесь к сетевым внутренним элементам, нажмите events (###) и используйте текстовое поле, чтобы найти событие, связанное с вашим ресурсом (используйте части URL-адреса). Наконец, нажмите на событие и посмотрите, подскажет ли вам информация.

POST/GET request и tor hidden service (.onion)

#http_redirect #php


Здравствуйте, люди. Подскажите пожалуйста, возможно ли отправить POST запрос к tor
hidden service (то есть к хосту, который имеет .onion домен). На VPS установлен tor,
и он открывает socks5 (127.0.0.1:9050) для доступа в tor-сеть. Пробую примерно как
в примере ниже, но с той стороны нет ответа, как будто ничего не доходит. 

    


Ответы

Ответ 1



К сожалению, не хватает респектов для ответа на собственный вопрос, поэтому кину сюда. $proxy = "127.0.0.1"; $port = "9050"; $url = "https://mydomain.onion/input.php"; $ch = curl_init(); curl_setopt ($ch, CURLOPT_URL, $url); curl_setopt ($ch, CURLOPT_HEADER, 0); curl_setopt ($ch, CURLOPT_PROXYTYPE, 7 ); curl_setopt ($ch, CURLOPT_PROXY, $proxy.':'.$port ); ob_start(); curl_exec ($ch); curl_close ($ch); $result = ob_get_contents(); ob_end_clean(); var_dump($result); Тут нет собственно самих данных, они добавляются также curl_setopt

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

#c #borland


Я использую Open Watcom копилятор для сборки DOS 16 приложения под 80188 подобную
архитектуру. Проблема заключается в том, что я не могу подключить библиотеку собранную
в BC 3.1. После, казалось бы, успешной линковки, при использовании некоторых функций
из этой библиотеки, я получаю сообщения от линковщика, что не найден символ _malloc()
или _free(). Использование функции malloc() в пользовательском коде проходит линковку. 
Как я понял проблема возникает только, когда какя либо функция библиотеки вызывает
malloc() или free(), то есть библиотека нифига не стэндалон и тянет зависимости из
стандартной бибилотеки собранной для BC 3.1. Проверить это я никак не могу и пересобрать
библиотеку тоже, так как ее исходников нет. 
Всвязи с этим у меня вопрос: как портировать билиотеку на Open Watcom ? malloc()
и free() есть в библиотеках Open Watcom но их символы скомпилированы видимо не так
как того ожидает борландовская библиотека.    


Ответы

Ответ 1



Ну да, похоже что библиотека BC из себя обращается к malloc() и free(), ожидая при этом имена в формате с подчёркиванием в начале. А в библиотеках Watcom эти функции могут быть без подчёркивания, или вообще с подчёркиванием в конце... Проверить это можно просто посмотрев дамп имён ваткомовской библиотеки (clib кажись). wlib из их стандартной поставки должен это уметь, а может и wlink... Если там не обнаружится имён _malloc и _free, то самый простой выход - сделать свои обёртки: void * _malloc( size_t sz ) { return malloc(sz); }; void _free( void * mem ) { free(mem); }; И линковать их с проектом. UPD: Таки проверил. Действительно, Open Watcom 1.8.0, clib3r.lib (register calling): free_ .... nfree.c malloc_ .... nmalloc.c И для clib3s.lib (stack calling, чего борланд и ожидает): free .... nfree.c malloc .... nmalloc.c Так что - обёртка.

Зачем нужны миграции?

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


Зачем их придумали, если можно вместе с исходниками выкидывать дамп?
Чувствую, что вопрос наитупейший ^^ тапками не кидайте.    


Ответы

Ответ 1



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

Работа с AF_UNIX SOCK_DGRAM SO_BROADCAST сокетом

#c #сокет #unix #select #unix_socket


Здравствуйте, пишу чатик, начал с параллельного эхо-сервера.
Теперь пытаюсь сделать так, чтобы сообщения от одного подключенного клиента рассылались
всем подключенным клиентам.
В процессе-родителе создаю сокет в файловом пространстве, и делаю его широковещательным:
  int commfd;
  struct sockaddr commaddr;

  if( ( commfd = socket( AF_UNIX, SOCK_DGRAM, 0 ) ) < 0 )
    perror( "error in common socket" );

  bzero( &commaddr, sizeof( commaddr ) );
  commaddr.sa_family = AF_UNIX;
  strcpy( commaddr.sa_data, COMM_SOCK_NAME );

  if( bind( commfd, &commaddr, sizeof( commaddr ) ) < 0 )
    perror( "error in bind for commfd" );

  int n=1;
  if( setsockopt( commfd, SOL_SOCKET, SO_BROADCAST, &n, sizeof(n) ) < 0 )
    perror( "error in setsockopt" );

И в дочернем процессе-обработчике клиента подключаюсь к этому сокету, и через select
жду, пока сокет этот будет доступен на чтение. 
В общем суть задумки: клиент пишет сообщение серверу (а на сервере для этого клиента
свой процесс-обработчик), это сообщение отсылается назад этому же клиенту, и это же
сообщение пишется в широковещательный сокет. В это же время процессы - обработчики
других клиентов ждут того самого сообщения, принимают, и выводят на экран.
Но не срабатывает select в обработчике, что я не так делаю?
Весь код сервера здесь: http://paste.ubuntu.com/7617694/    


Ответы

Ответ 1



UNIX-cокеты не поддерживают широковещательную передачу. Приём-передача широковещательных udp-пакетов осуществляется с использованием (кроме опции SO_BROADCAST) широковещательных адресов, которые не предусмотрены в AF_UNIX. Так же невозможно забиндить более одного сокета на один AF_UNIX-адрес, что потребовалось бы для приёма.

File not found: Example.java

#java


Я новичок в Java, пытаюсь скомпилировать свой первый файл Example.java:
class Example {

  public static void main(String args[]) {

  System.out.println("JAVA Drives the WEB.")

  }

}

Запускаю так:
C:\MyJava\javac Example.java

В консоли появляется ошибка:
javac: file not found: Example.java
Usage: javac  
use -help for a list of possible options

Пробовал 
C:\MyJava\javac -cp . Example.java

результат тот же.
Путь  к папке C:\MyJava  прописан в переменной среды CLASSPATH.
Путь C:\Program Files\Java\jdk1.8.0_05 прописан в PATH.
В чем проблема? Выручите, пожалуйста.    


Ответы

Ответ 1



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

Ответ 2



В исходнике есть ошибка: System.out.println("JAVA Drives the WEB.") ; //точку с запятой потеряли Надо указывать путь к файлу для компиляции: C:\MyJava\javac -cp . <путь_к_файлу>\Example.java

Как вывести данные с объекта ?

#javascript


Нужно с помощью console.log () вывести из объекта "data" данные в соответствии массива
"digCnt" 
Например, в первая цифра в массиве 2 значит нужно вывести данные c объекта "1 : {
2: здесь должен быть текст 2}"
var digCnt = [2,1,4,5];
var data = {
    1: {
        1: 'здесь должен быть текст 1',
        2: 'здесь должен быть текст 2',
        3: 'здесь должен быть текст 3',
        4: 'здесь должен быть текст 4',
        5: 'здесь должен быть текст 5',
        6: 'здесь должен быть текст 6',
    },
    2: {
        0: 'здесь должен быть текст 0',
        1: 'здесь должен быть текст 1', 
        2: 'здесь должен быть текст 2', 
        3: 'здесь должен быть текст 3', 
        4: 'здесь должен быть текст 4', 
        5: 'здесь должен быть текст 5',          
    },
    3: {
        0: 'здесь должен быть текст 0',
        1: 'здесь должен быть текст 1', 
        2: 'здесь должен быть текст 2', 
        3: 'здесь должен быть текст 3', 
        4: 'здесь должен быть текст 4', 
        5: 'здесь должен быть текст 5',          
    },
    4: {
        1: 'здесь должен быть текст 1', 
        2: 'здесь должен быть текст 2', 
        3: 'здесь должен быть текст 3', 
        4: 'здесь должен быть текст 4', 
        5: 'здесь должен быть текст 5',          
    }
};
    


Ответы

Ответ 1



В цикле обходите массив digCnt и выводите нужные значения. Примерно так: for(var i = 0; i < digCnt.length; i++) { console.log(data[i + 1][digCnt[i]]); } Пример: JSFiddle

Ограничить пользователей ресурсами

#highload #производительность #limits #linux


Есть linux, пользователи пользуются ресурсами данной машины. Но делают это, не понимая,
что сервер один на всех )) и грузят его максимально тем самым мешая друг другу.Дано:
Виртуалка CentOS6.3 x64, 4GB RAMВот имею примерно такой вывод atop по самым пожирателям.NPROCS
  SYSCPU    USRCPU   VSIZE    RSIZE   RDDSK    WRDSK  RNET   SNET   CPU  RUID 1/155
   0.05s     1.88s   14.6G   877.6M      0K       0K     ?      ?   39%   user156 
  0.06s     0.45s   12.8G   603.1M      0K      32K     ?      ?   19%   user257  
 0.01s     0.04s   12.0G   594.8M      0K      24K     ?      ?   11%   user3 3   
0.00s     0.00s  401.9M    6632K      0K       0K     ?      ?    0%   user4Хочу в
/etc/sucurity/limits.conf зарезать немного их аппетиты, но пока выходит не очень.хочу
кол-во процессов на юзера сделать soft/hard - 50/65, уменьшить значение VSIZE (virtual
memory?), RSIZE (real memory?), и чтобы не жрали USRCPU (значение задается в минутах,
т.е. как я понимаю сейчас значение 1.88s = это 1 минута 88сек??? а почему не 2.28s
в любом случае процессор надо лимитировать)Все пользователи входят в группу @domainusers,
при попытке дать лимиты этой группе понял что это неверно т.к. все лимиты делятся пропорционально
на зашедших в систему юзеров и в итоге хватает ресурсов только на одного.. ))Остается
только пологинно перечислять всех в limits.confuser1  soft         nproc   50user1
 hard         nproc   65user1  soft         cpu     1user1  hard         cpu     2user1
 soft         as   1500000user1  hard         as   2000000user1  soft         rss 
400000user1  hard         rss  500000....user2 ....p.s. "as" как говорит (гугл) это
и есть виртуальная памятьВсе ли я верно делаю?P.S. эксперименты с limits.conf не внушают
мне надежды. Когда лимиты подходят к своему пределу система становиться нестабильна
и доходит до выпадания в корку. К примеру тупо не хватает свободных процессов, чтобы
открыть вкладку и, к примеру, браузер рушиться в этот момент какая-нибудь дебаг-тулуза
хочет отправить отчет и тоже валится и все крайне нестабильно начинает существовать.P.P.S.
Начал разбирать тему с cgroups/cgrules - этот механизм вроде более жизнеспособен.    


Ответы

Ответ 1



Вариант: PAM и его limits.conf

Ответ 2



cgroup самый правильный и скорее всего единственный инструмент в linux-e для этого

C++ в современном мире

#cpp


В современное время, как правило, выделяют три "мейнстримовых" языка: C#, Java и C++.
(ну, допустим, что это так хотя бы в контексте данного поста ). Собственно, С# "вытек"
из-за Java, а Java пришел на смену C\C++, упрощая разработку и привнося почти абсолютную
кроссплатформенность. Java и C# - такие языки, что им нравится обучаться, реально ощущая
их мощь, актуальность и спектр, где их можно задействовать.

Что же касается C++. Несомненно, этот язык занимает заслуженное место в топе "мэйнстримовых"
языков и используется повсеместно. Тем не менее, изучая этот язык, можно довольно быстро
заскучать начинающим: они видят, как использовать те же STL контейнеры, узнают об указателях
и , возможно, даже о библиотеке Boost, но где все это реально можно применить( наверное,
кроме олимпиад ), они могут недопонять.

C++ широко используется в научных разработках, биоинженерии, генетике, космонавтике(
так, софт луноходов-марсоходов писан на СИ ) и т.д. 

Собственно, вопрос такой:
Может быть изначально стоит лишь ознакомиться с C++, затем бросить его в "отдаленный
уголок" мозга и продолжить изучать тот же Java или C#, четко зная, как и где их можно
"круто" применить? А в будущем, если это потребуется, добраться до того "отдаленного
участка" мозга, развернуть те "C++ крошки" и уже на их основе обучаться далее C++,
но уже на практике?

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


Ответы

Ответ 1



С++ - это всего лишь один из огромного множества языков программирования. Не лучше и не хуже других (разумеется, чем-то лучше, чем-то хуже, не суть). Поэтому нельзя говорить, что он прям обязателен к изучению. Это всего лишь один из инструментов работы программиста. Нужно ли изучать каждый отдельно взятый язык обычно зависит от области деятельности, которой программист хочет себя посвятить. То есть первична должна быть задача, под которую выбирается язык, а не язык, под который подбираются задачи. Учить язык только ради того, что это С++ вряд ли разумно. Что же касается того, "почему он кажется таким скучным" - так язык и не должен никого развлекать. Он должен выполнять возложенные на него задачи (в частности, от С++ требуется сохранение высокой производительности и средств низкоуровнего программирования вместе с наличием высокоуровневых абстракций). Более того, C#/Java/etc тоже ведь вроде не жонглируют горящими топорами, не рассказывают анекдотов и не пропукивают лезгинку в угоду развлечению пользователя. Вряд ли от промышленного языка программирования разумно требовать того, чтобы он был еще и интересным (субъективное свойство кстати - ведь довольно сложно сказать, что делает язык "интересным")

Ответ 2



https://www.embarcadero.com/ru/products/cbuilder Если вы используете C++Builder XE6 для разработки приложений на стандартном С++ для различных устройств, вы сможете создавать «нативные» приложения для ПК, планшетов, смартфонов и даже носимых гаджетов типа Google Glass на основе единого исходного кода в рекордные сроки. Нужно быстродействие? С помощью C++Builder вы создаёте действительно «нативные» приложения, которые исполняются максимально быстро прямо на CPU устройства, а не на основе скриптов или виртуальной машины. Ваши приложения получат полный доступ к возможностям платформы, обеспечивая высочайший уровень пользовательского взаимодействия. Отрывок из рекламы с++ билдера))) Намёк на то, что Java и C# - отстой)))

Как сделать динамическое меню в Bootstrap?

#html #css #bootstrap #ui_bootstrap


Как сделать динамическое меню в Bootstrap, как показано на картинке?


    


Ответы

Ответ 1



Navbar Navbars are responsive meta components that serve as navigation headers for your application or site. They begin collapsed (and are toggleable) in mobile views and become horizontal as the available viewport width increases.

Ответ 2



Одним navbar здесь не обойтись. Кнопка справа вверху на 2-ом скрине при таком раскладе не нужна, т.к. в неё, согласно этому ТЗ ничего не прячется (если всё-таки нужно – см. сниппет http://bootsnipp.com/snippets/featured/navbar-lateral-slide-menu). В данном случае, если интересует IE9+: @media (max-width: 768) { // меньше 768 .content-menu > ul > li{ display: block; text-align: left; } }

Как сделать масштабируемый текст на QLabel?

#qt5 #qt #cpp


Я пишу игру Угадай "ЧтоУгодноПоКартинке". У меня есть картинка и шесть кнопок. Три
вверху и три внизу. 
Хочу сделать кнопки:

Прозрачными
WordWrap
Относительный размер шрифта. Шрифт масштабируемый при увеличении/уменьшение размеров
окна.
При нажатии на кнопку цвет текста и цвет фона кнопки меняется

Все сделано кроме 4 пункта. Все очень коряво работает.
Помогите привести все человеческий вид.
#ifndef MYBUTTON_H
#define MYBUTTON_H

#include 
#include 
#include 

class MyButton : public QPushButton
{
    Q_OBJECT
public:
    explicit MyButton(QWidget *parent = 0);

    QString text() const;
    void setText(const QString& text);
    void setFont(const QFont& font_);

signals:

public slots:

private:
    QLabel* label;
    QHBoxLayout* layout;
    QFont font;

protected:
   virtual void resizeEvent(QResizeEvent *event);
};

#endif // MYBUTTON_H

#include "mybutton.h"

MyButton::MyButton(QWidget *parent) :
    QPushButton(parent)
{
    label = new QLabel;
    label->setWordWrap(true);
    label->setMouseTracking(false);
    label->setTextInteractionFlags(Qt::NoTextInteraction);
    label->setAlignment(Qt::AlignCenter);
    label->setStyleSheet(
                "QLabel {"
                "color: blue;"
                "background-color: rgba(255, 255, 255, 10);"
                "}"
                );

    label->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);

    this->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
    this->setFlat(true);

    layout = new QHBoxLayout;
    layout->addWidget(label);
    layout->setMargin(1);
    layout->setSpacing(1);

    label->setFont(font);

    this->setLayout(layout);
}

QString MyButton::text() const
{
    return label->text();
}

void MyButton::setText(const QString &text)
{
    label->setText(text);
}

void MyButton::setFont(const QFont &font_)
{
    font = font_;
    label->setFont(font);
}

void MyButton::resizeEvent(QResizeEvent *event)
{
    int pixelsHeight = this->size().height()/2;
    if(pixelsHeight > 24) pixelsHeight = 24;
    if(pixelsHeight < 8) pixelsHeight = 8;

    font.setPixelSize(pixelsHeight);
    label->setFont(font);
}
    


Ответы

Ответ 1



4.При нажатии на кнопку цвет текста и цвет фона кнопки меняется Поставьте кнопке setCheckable(true) и проверяйте bool isChecked() и задавайте цвет фона в слоте обработки клика по кнопке. Либо цвет можно задать через setStyleSheet() (что я считаю более правильным вариантом). Сам текст стайлшита: QPushButton::checked { color: rgb(255, 255, 0); // цвет текста желтый background-color: rgba(255, 50, 50, 90) // красный полупрозрачный фон rgba } QPushButton { color: rgb(255, 255, 0); // цвет текста желтый background-color: rgba(0, 255, 0, 90) // зеленый полупрозрачный фон rgba } Все данные параметры можно задавать как в коде, так и в редакторе форм QtCreator.

Из полноэкранного режима в оконный и наоборот

#c_sharp #winapi #net


Нужно программно перевести игру в полноэкранный режим и наоборот из полноэкранного
в оконный. Хэндл окна нахожу функцией FindWindowByCaption.
Если это возможно, покажите пожалуйста пример как это сделать. Спасибо.
P.s: сочетание клавиш Alt+Enter не срабатывает.
Перевести в полноэкранный режим у меня получилось так:
[DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
static extern IntPtr FindWindowByCaption(IntPtr zeroOnly, string lpWindowName);

[DllImport("user32.dll", EntryPoint = "SetWindowLong")]
private static extern int SetWindowLong32(IntPtr hWnd, int nIndex, long dwNewLong);

[DllImport("user32.dll", EntryPoint = "SetWindowLongPtr")]
private static extern IntPtr SetWindowLongPtr64(IntPtr hWnd, int nIndex, long dwNewLong);

public static IntPtr SetWindowLongPtr(IntPtr hWnd, int nIndex, long dwNewLong)
{
    return IntPtr.Size == 8
        ? SetWindowLongPtr64(hWnd, nIndex, dwNewLong)
        : new IntPtr(SetWindowLong32(hWnd, nIndex, dwNewLong));
}

public static void SetWindowFullScreen(string windowName)
{
    IntPtr hWnd = FindWindowByCaption(IntPtr.Zero, windowName);

    SetWindowLongPtr(hWnd, GWL_STYLE, WS_POPUP);
    SetWindowLongPtr(hWnd, GWL_EXSTYLE, WS_EX_TOPMOST);
    ShowWindow(hWnd, SW_SHOWMAXIMIZED);
}

А вот из полноэкранного обратно в оконный не получается :(    


Ответы

Ответ 1



Для такого рода задач существует утилита Spy ++ с помощью нее можете посмотреть значение окна и уже на основании этих данных производить поиск этого окна. Spy ++ идет в комплекте со студией Пример работы [пример]:http://www.pinvoke.net/default.aspx/user32.findwindow

Ответ 2



Ваша ошибка в том, что вы устанавливаете свои значения стилей, полностью игнорируя изначальные значения. Обычно стили добавляют с помощью OriginalStyle |= ExtraStyle и удаляют с помощью OriginalStyle &= ~ExtraStyle. Это, так сказать, правило хорошего тона, чтобы ничего не испортить. Чтобы проделать эти операции, нужно сначала получить исходные значения. А чтобы восстановить исходные значения, нужно эти исходные значения сохранить. Так что вперёд и с песней к GetWindowLong.

Android Wear простой пример обмена данными со смартфоном

#android #android_wear


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


Ответы

Ответ 1



Посмотрите тут и тут. #1 Отправка сообщения из активити на часах @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.my_activity); initApi(); } //Конектимся к API private void initApi() { client = getGoogleApiClient(this); retrieveDeviceNode(); client.connect(); } /** * Returns a GoogleApiClient that can access the Wear API. * * @param context * @return A GoogleApiClient that can make calls to the Wear API */ private GoogleApiClient getGoogleApiClient(Context context) { return new GoogleApiClient.Builder(context) .addApi(Wearable.API) .build(); } /** * Connects to the GoogleApiClient and retrieves the connected device's Node ID. If there are * multiple connected devices, the first Node ID is returned. */ private void retrieveDeviceNode() { new Thread(new Runnable() { @Override public void run() { client.blockingConnect(CONNECTION_TIME_OUT_MS, TimeUnit.MILLISECONDS); NodeApi.GetConnectedNodesResult result = Wearable.NodeApi.getConnectedNodes(client).await(); List nodes = result.getNodes(); if (nodes.size() > 0) { nodeId = nodes.get(0).getId(); } client.disconnect(); } }).start(); } /** * Отправляем "сообщение" к подключенному телефону, передаем параметр yourData (какие то ваши данные), или null вместо него. */ private void sendMessageToMobile() { if (nodeId != null) { new Thread(new Runnable() { @Override public void run() { client.blockingConnect(CONNECTION_TIME_OUT_MS, TimeUnit.MILLISECONDS); Wearable.MessageApi.sendMessage(client, nodeId, MESSAGE, new byte[]{yourData}); client.disconnect(); } }).start(); } } #2 Принимаем "сообщение" на телефоне public class ListenerService extends WearableListenerService { @Override public void onMessageReceived(MessageEvent messageEvent) { //Ваши действия } В манифесте: А так же в манифесте wear модуля нужно добавить гугл плей сервис

Авторизация и сессии [закрыт]

#веб_программирование #php #пароль #сессия #авторизация


        
             
                
                    
                        
                            Закрыт. На этот вопрос невозможно дать объективный ответ.
Ответы на него в данный момент не принимаются.
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            Хотите улучшить этот вопрос? Переформулируйте вопрос,
чтобы на него можно было дать ответ, основанный на фактах и цитатах, отредактировав его.
                        
                        Закрыт 4 года назад.
                                                                                
           
                
        
Подскажите, как в наше время делают авторизацию и где хранят сессии. Давно не занимался
сайтами, возможно отстал от прогресса.
Собственно:

Храню пароль в виде md5($salt.$pass.$salt). Вроде их уже легко ломают?
sessionhash=md5(uniqid(microtime()));
Сессии хранятся в таблице MySQL в sissionid, userid, sessionhash
sissionid и sessionhash отдаются в куках.

Как сейчас это делается?    


Ответы

Ответ 1



Данные, хранящиеся на стороне пользователя, надо зашифровать ключом, хранящимся на сервере. Тут это разбирается на примере Node.JS и для PHP: Раз и Два

Ответ 2



По пункту 1: В настоящее время существуют очень эффективные реализации перебора хэшей. Поэтому даже длинные пароли, подвергнутые однократному хэшированию, перестали быть безопасными. В версии php 5.5 реализован алгоритм PBKDF2. Его рекомендууется использовать для получения устойчивых хэшей. http://php.net/manual/ru/function.hash-pbkdf2.php.

Ответ 3



Советую посмотреть в сторону фреймворка CodeIgniter. Всё удобно, защищено и очень просто. + Есть библиотека аутентификации и регистрации.

Selenium и клик по кнопке

#xpath #selenium #java


Здравствуйте.
Есть такая кнопка: 


Пытаюсь нажать её так:

driver.findElement(By.xpath("//input[@class=\"button primary\"][0]")).click();

Не выходит.Прошу помощи.    


Ответы

Ответ 1



Привет. Используйте следующий код driver.findElements(By.xpath(".//input[@class='button primary']")).get(0).click

Ответ 2



Посмотри используя firebug находится ли твой элемент в пределах заданной страницы в коде css. Возможно при даже верном xpath тебе не удасться это сделать. Таким образом найдя видимый элеент кликай на него, можно пробовать js (JavascriptExecutor) или action (Actions) на крайняк. Кстати твой xpath можно написать так: //input[@value='Начать переписку'] //input[@type='submit'] //input[@accesskey='s'] //input[@class='button primary'] - наиболее подходит

Ответ 3



driver.findElement(By.xpath("//input[@class='button primary']")).click();

Плавный скролл страницы

#jquery #javascript #frontend


Здравствуйте, уважаемые форумчане!
Есть такой вопрос, кто как делает плавный скроллинг страниц?
Сам на данный момент использую nicescroll, но не все так идеально как хотелось бы.
Вот пример моей работы http://skferson.ru/    


Ответы

Ответ 1



В топку ненужные библиотеки, jQuery у вас уже есть, и вот код для плавного скрола, 3 строчки: $('.click-menu-element').click(function(){ $('html, body').animate({scrollTop:$('#elementId').position().top}, 2000); }); где click-menu-element - это элемент меню, elementId - это id у заголовка нужного вам контента, находящегося в том месте, куда вам нужно переместиться (для корректировки можно уменьшить пикселей на 60), 2000 - скорость перехода на нужный элемент в мс. Пример тут Внутри можно повесить также необхимый фукнционал для того, чтобы нужные пункты становились активными, ну и для определения, какой именно пункт нажал юзер. Я так понял, у вас проблемы именно с определением активного пункта меню. :)

Ответ 2



Чистый JS без библиотек function smoothScroll(Element) { Element = document.getElementById(Element); var selectedPosX = 0; var selectedPosY = 0; while (Element != null) { selectedPosX += Element.offsetLeft; selectedPosY += Element.offsetTop; Element = Element.offsetParent; } window.scrollTo(selectedPosX, selectedPosY); } и css html { scroll-behavior: smooth; } элемент к которому тянуть

тут



Ответ 3



В нашем проекте по видеоредактированию в браузере мы скроллим таймлайн по мере воспроизведения видео. Фронтендом занимаюсь не я, но попробую объяснить, как сделали. Испытывали разные подходы, остановились на следующем: Анимация делается CSS3 transition'ом - так плавнее всего. Длинный скролл (вам это не понадобится) бьётся на серию маленьких. Каждый следующий запускается по завершению предыдущей. Для глаза не заметно.

Как раскидать картинки по папкам mdpi, hdpi, xhdpi, ldpi?

#java #android #android_sdk #dpi


Объясните мне, пожалуйста, принцип того, как раскидать картинки по папкам mdpi, hdpi,
xhdpi, ldpi. Вот у меня есть картинка размером 800x1280, как мне узнать, какой у нее
dpi, чтобы  от него уже делать выводы, куда кидать... Я знаю, что ldpi = 0.75, mdpi
= 1.0, hdpi = 1.5, xhdpi = 2.0.

Я просто хочу делать программы под разные экраны, но как делать, не знаю.
    


Ответы

Ответ 1



dpi - зависит от разрешения экрана в пикселах и его физического размера в дюймах. Как узнать? Есть экран девайса 800 на 1280, (800Х800)+(1280Х1280) извлекаем корень = 1509,4. Теперь магия. Если экран 4,7", то 1509,4/4,7 = 321 DPI ~ xhdpi (2.0), если хотим вашу картинку на весь экран на этом девайсе, то кладём её в xhdpi - это будет как бы базовый девайс. Для дугих девайсов кладём в mdpi картинку (400 на 640), в hdpi картинку (600 на 960) и так далее. Обновление Это на 100% работает в идеальном мире. ) Уж очень разные экраны бывают. "Но ведь не может быть в mdpi базовым 800 на 1280" на экране в 9,4", будет. Можете пересчитать. ) Можно прикинуть примерно и посмотреть на эмуляторе или в редакторе xml, как это будет выглядеть на разных девайсах. Вы можете закинуть эту картинку, не изменяя во все папки и тоже посмотреть, что будет. Android растянет или сожмёт. НО память будет не оптимально расходоваться. Не кидайте все картинки только в mdpi, на девайсах с высоким DPI некоторые (особенно большие) после принудительного увеличения могут очень много памяти съедать.

Ответ 2



Оригинальную картинку надо масштабировать и ложить так: ldpi=36*36 mdpi=48*48 hdpi=72*27 xhdpi=96*96 xxhdpi=144*144 xxxhdpi=192*192 А аппарат сам выберет какую из них показывать, не думай обо всяких dpi, ось сама о них позаботится Update Про картинки. Берете картинку в лучшем разрешении и объявляете ее xxxhdpi, далее по нисходящей масштабируете на *dpi сохраняя коэффициент сжатия аналогичный иконкам приведенным выше.

Ответ 3



@xTIGRx, могу Вам посоветовать воспользоваться сайтом. На нем Вы сможете переделать любую картинку под все необходимые Вам форматы за раз. Единственное неудобство этого сайта - готовые картинки называются ic_launcher. То есть приходит переименовывать каждую перед перемещением в проект.

Зачем закрывать подключения?

#mysqli #php #mysql


Здравствуйте.
Разбираюсь с mysqli, в частности с этим примером:


И напросился вопрос: зачем нужно очищать результат набора, mysqli_free_result($result);,
закрывать подключения mysqli_close($link); и чем плохо, если этого не делать?    


Ответы

Ответ 1



Непонятно, откуда предыдущий оратор вообразил какой-то "таймаут". Соединение с БД закрывать не надо - оно закроется само по окончании работы скрипта. Сразу. БЕЗ каких-либо "таймаутов". Резалтсет в большинстве случаев очищать не нужно, поскольку как только закончит выполнение вызвавшая его функция, он так же обнулится.

Ответ 2



Незакрытые соединения прибьются по таймауту. Но если таких подключений будет очень много, система будет тормозить очень сильно, так как всё это потребляемые ресурсы. Поэтому "уходя, гасите свет". mysql_options php.su и оф. доки dev.mysql.com/doc/mysql-options Рекомендую для общего развития установить VirtualBox с *nix системой, установить веб-сервер+mysql и поиграться с настройками, чтобы наглядно увидеть, что и как работает. mysqli_free_result - очищает используемый блок памяти. Если простыми словами то - при выполнения кода, к примеру запрос съел 100мб памяти и не была применена команда mysqli_free_result то если дальше по коду есть ещё запросы то они будут ещё дожирать память в дополнение к уже используемой. А если выполним mysqli_free_result то память занятая запросом очистится и мы сможем повторно её использовать в этом же коде. Если у Вас в выполняемом коде один запрос, то mysqli_free_result необязателен, так как при завершении выполнении кода память всё равно очистится, но если по коду будет множество запросов то лучше очищать используемую память. Пример 1: php-код 1 sql-запрос # использовал 10мб памяти php-код 2 sql-запрос # использовал 5мб памяти В итоге получается что для выполнения кода потребовалось 15мб памяти, так как используемую память мы не очищали и она содержала первый запрос. Пример 2: php-код 1 sql-запрос # использовал 10мб памяти mysqli_free_result (очищает уже задействованные 10мб памяти в которые можно записать последующие запросы) php-код 2 sql-запрос # использовал 5мб памяти Для выполнения кода потребовалось 10мб памяти, так как мы очистили память от первого запроса и записали в неё второй.

Как можно узнать высоту Laoyut?

#android #android_layout


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

FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) fr.getLayoutParams();
params.height = -2;
fr.setLayoutParams(params);


И еще вопрос: если я назначу 

params.height = 100;


в чем это значение измеряется - в px или dp?
    


Ответы

Ответ 1



Приведённый вами в вопросе код спокойно вернёт в params.height высоту элемента. Проблема может возникнуть, если она изначально = "wrap_content" || "match_parent"; //вернёт -2 || -1, а не высоту в пикселях Тогда вариантов несколько. Например можно получить координаты "верха" и "низа" элемента: FrameLayout fr = //находим элемент int topYcoord = fr.getTop(); int bottomYcoord = fr.getBottom(); И из них вычислить высоту элемента: int calculatedHeight = bottomYcoord-topYcoord; И применить к элементу: FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) fr.getLayoutParams(); params.height = calculatedHeight; fr.setLayoutParams(params); UPD 0: Всё вышеописанное работает в onResume() активити, когда система подсчитала все координаты всех лэйаутов. До onResume() можно, например так: //int h = fr.getMeasuredHeight(); вернёт 0, т.к. не измерялось ещё. //вроде как принудительно измеряет элемент //"0" здесь - это какие-то константы. Что и как они конкретно делают - магия для меня fr.measure(0,0); //теперь высота измерена и вернет !0 int h = fr.getMeasuredHeight(); UPD 1: Поэкспериментировал. Выводы: FrameLayout возвращает 0 всегда, если в нём нет детей. Если есть ребёнок, возвращает его высоту, даже если он (ребёнок) занимает его не полностью. С RelativeLayout всё работает. Вывод: Пользуйте RelativeLayout.

Хешкод, переопределение метода GetHashCode

#c_sharp #c_sharp_faq #hashcode


Господа, не могу понять каким образом переопределять метод GetHashCode(). Ведь, насколько
я понял, хешкод берется из скрытой переменной в объекте, к которой нет доступа. Тогда
как мне его переопределить ?? Если не затруднит, то хотелось бы увидеть какой-то элементарный
пример.
И еще не пойму, почему разные хешкоды в коде
using System;
class a
{
    public int x;
    public a(int y)
    {
        x = y;
    }
}
class b
{
    static void Main()
    {
        Console.WriteLine(new a(5).GetHashCode() + " " + new a(5).GetHashCode());
    }
}

Ведь тут написано https://msdn.microsoft.com/ru-ru/library/system.object.gethashcode(v=vs.110).aspx


Для двух одинаковых объектов
возвращенные хэш-коды равны
    


Ответы

Ответ 1



Ведь, насколько я понял, хешкод берется из скрытой переменной в объекте, к которой нет доступа. Так ведь и метод вы переопределяете в своем же классе :). Что-то типа: class a { public int x; public a(int y) { x = y; } public override int GetHashCode() { return x; } } Есть несколько правил для переопределения GetHashCode(), основные: 1) Используемая функция должна давать хорошее распределение. Это, строго говоря, зависит от данных, однако часто хорошо подходит подобная функция: public override int GetHashCode() { int hashcode = field1.GetHashCode(); hashcode = 31 * hashcode + field2.GetHashCode(); hashcode = 31 * hashcode + field3.GetHashCode(); // и т.д. для остальный полей return hashcode; } 2) Эта функция должна быть быстрой. 3) GetHashCode() не должен выбрасывать исключения. 4) В идеале GetHashCode() не должен меняться в течение жизни объекта, т.е. полагаться только на неизменяемые члены класса. На практике этим часто пренебрегают, пока не стрельнет. Так же не забудьте, что Equals() и GetHashCode() всегда должны идти в паре: переопределили один метод, переопределяйте и другой. И если два объекта равны, то у них должен быть одинаковый хэшкод. Обратное необязательно верно (хэш-функция может вернуть одинаковое дначение для разных объектов). Что почитать (на английском): Про правильное переопределение GetHashCode() Про хэш-функции

.net >=3.5 как отловить возникновение нового процесса в системе

#net


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


Ответы

Ответ 1



Простого хука на событие создания процесса не существует. Если процессы создаются и пропадают слишком быстро, то перечисляйте ещё чаще. Обратите внимание, что ни стандартный Task Manager, ни продвинутый Process Explorer, написанный Руссиновичем, который знает все потроха Windows, не умеют отлавливать быстро завершившиеся процессы, если это не позволяет разрешение таймера. Думаю, если бы такая возможность существовала в нормальном виде, то ей бы воспользовались. Если вы готовы на подвиги (и готовы распрощаться с .NET), то у вас два пути: Написать драйвер, прицепиться к событию создания процесса PsSetCreateProcessNotifyRoutine, прокидывать сообщения в своё приложение. Перехватывать вызовы CreateProcess и подобные. Пример с драйвером можете найти в статье Detecting Windows NT/2K process execution.

Ответ 2



Такой возможности, встроенной во фреймворк, я не знаю. Братский сайт рекомендует WMI (что требует довольно сложного кода и P/Invoke), кроме того упоминается решение с TraceEvent'ами (которое вроде бы «более» синхронное). Заметьте, что с завершением процесса всё гораздо проще: просто воспользуйтесь event'ом Process.Exited.

Реализация внешнего trait для внешнего шаблона, параметризованного локальным типом в Rust

#rust


После перехода с январьской версии компилятора Rust на beta. Обнаружил что код подобный
этому не компилируется http://is.gd/oX7GWN:

use std::fmt::{Display, Formatter, Error};

struct MyLocalType;

type MyResult = Result;

impl Display for MyResult {
    fn fmt(&self, f: &mut Formatter) -> Result<(), Error> {
        f.write_str("some test string")
    }
}

fn main() { 
    let r: MyResult = Ok(MyLocalType); 
    println!("{}" , r); 
}


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


Ответы

Ответ 1



Ответ, скопированый с англоязычного stackoverflow: https://stackoverflow.com/questions/29789877/can-not-implement-trait-from-another-crate-for-generic-type-from-another-crate-p There's no direct way to solve this for a pure alias like type. The code is the same as impl Display for Result and the compiler can't ensure that there will be no conflicting implementations in other crates (aka, can't ensure that the implementation is 'coherent'). Being able to do it is definitely useful sometimes, but it was unfortunately a bug that the compiler accepted it before. Solutions include: defining a proper wrapper type for Result, e.g. struct MyResult(Result);, defining your own enum: enum MyResult { Ok(MyType), Err(String) }, define a wrapper type, but only use it when printing, i.e. write println!("{}", Wrapper(r)); instead of println!("{}", r);. Both of these make MyResult a local type, and so the impl then should be legal. Описание на русском, как его понял я: Теперь нет способа реализовывать типаж для стороннего обобщённого типа, пусть даже и параметризованного локальным типом. Так как компилятор не может быть уверен, что реализация будет согласована со всеми другими реализациями. Чтобы решить эту проблему нужно сделать тип полностью локальным. Eсть несколько способов: «Обернуть» его в локальный тип-обёртку, например: struct MyResult(Result); Объявить свой собственный Result-подобный тип: enum MyResult { Ok(MyType), Err(String) } Или же обернуть его, но использовать обёртку только там, где необходим требуемый типаж, например: println!("{}", Wrapper(r)); вместо println!("{}", r);

Кросплатформенный код на C, теоретические проблемы

#c #кроссплатформенность


Понимаю что вопрос дурацкий, но тем не менее :) В каких случаях неверно утверждение:
"если код на pure C, использующий только стандартные библиотеки, собирается и работает
под linux-32, linux-64 и win-32, то он без дополнительных мер соберётся и корректно
заработает под win64"?

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


Ответы

Ответ 1



Как уже было сказано выше, многое зависит не только от платформы, но и от компилятора - часто именно от компилятора. Для разрешения ситуаций с размерами и разрядностью иногда создаются внутренние типы, фактический смысл которых зависит от платформы. Так например у Apple CGFloat в 32-битной системе это float, а в 64-битной - double. Для пущей совместимости могу посоветовать собирать проект одним и тем же компилятором на разных платформах.

Ответ 2



Ну, например вы используете тип long, который имеет разный размер на разных платформах, и приводите его к другому типу (к указателю) OS arch size Windows IA-32 4 bytes Windows Intel 64 4 bytes Windows IA-64 4 bytes Linux IA-32 4 bytes Linux Intel 64 8 bytes Linux IA-64 8 bytes Mac OS X IA-32 4 bytes Mac OS X Intel 64 8 bytes Visual C, Win32: sizeof(char)=1 sizeof(wchar_t)=2 sizeof(short)=2 sizeof(int)=4 sizeof(long)=4 sizeof(long long)=8 sizeof(void*)=4 sizeof(size_t)=4 Visual C, Win64: sizeof(char)=1 sizeof(wchar_t)=2 sizeof(short)=2 sizeof(int)=4 sizeof(long)=4 sizeof(long long)=8 sizeof(void*)=8 sizeof(size_t)=8 GCC on 32 platform: sizeof(char)=1 sizeof(wchar_t)=4 sizeof(short)=2 sizeof(int)=4 sizeof(long)=4 sizeof(long long)=8 sizeof(void*)=4 sizeof(size_t)=4 GCC on 64 platform: sizeof(char)=1 sizeof(wchar_t)=4 sizeof(short)=2 sizeof(int)=4 sizeof(long)=8 sizeof(long long)=8 sizeof(void*)=8 sizeof(size_t)=8

Ответ 3



Довольно часто код полагается на undefined behaviour, и таким образом зависит от конкретной реализации компилятора. Популярной ошибкой является вызов метода, не использующего локальные переменные, по NULL-указателю. Это может сработать на некоторых платформах, но по стандарту это имеет право привести к чему угодно. То же относится к переполнению знакового целого. GNU toolchain под интеловской платформой доопределяет поведение в этом случае, но другие компиляторы — нет. Более тонкая ошибка: чтение неинициализированной переменной есть UB по стандарту. Очень многие забывают это, считая, что она будет содержать «какое-то там значение», и ничего страшного в обращении к ней нет. Однако, на платформе IA64 (Itanium) это может привести к крешу.

Параметризованный класc. Возврат класса потомка

#c_sharp


Я так понимаю это сделать нельзя, но всё таки спрошу...

Есть у меня базовый абстрактный класс Control, где параметр T - это тоже какой-то
класс Component, но это уже не так важно.

Я создаю потомка Button - наследник от Control.

public class MyButton : Control


В базовом классе у меня есть методы, они что-то делают и возвращают ссылку на самого
себя. Бывает удобно сделать:

new MyButton().Text("Foo").Name("Boo")


Но проблема в том, я могу вернуть только Control в базовом классе.
В итоге у меня получается:

// 1.
MyButton btn = new MyButton();
btn.Text("");

// 2.
Control


Ответы

Ответ 1



Нормально это не поддерживается. Но есть костыль, который работает на одноуровневых иерархиях: class Control where TSelf : Control { public virtual TSelf Foo () { return (TSelf)this; } // ... } class Button : Control { public override Button Foo () { return this; } // ... } Если ниже кнопки по иерархии есть что-то ещё, то костыль уже не работает, к сожалению. Как вариант, можете всегда перекрывать методы с помощью new: class Control { protected virtual Control FooImpl () { return this; } public Control Foo () { return FooImpl(); } // ... } class Button : Control { protected override Control FooImpl () { return this; } public new Button Foo () { return (Button)FooImpl(); } // ... } class SuperButton : Button { protected override Control FooImpl () { return this; } public new SuperButton Foo () { return (SuperButton)FooImpl(); } // ... } Кода больше, но иерархия может быть любой глубины. Также есть вариант с интерфейсами, но он ещё многословнее.

wheel event и сенсорная мышь

#javascript #мышь


Столкнулась с проблемой при отлавливания события wheel при использовании сенсорной мыши.
Дело в том что у мыши с колёсиком wheel срабатывает при переключении порога (или
как там называется шаг прокрутки), а у мышей сенсорных всё куда печальнее.
Во первых для сенсорной мыши не обязательно держать палец на тачпаде чтобы она продолжала
скроллить, то есть если Вы сильно прокрутили пальцем на тацпаде то событие wheel будет
срабатывать ещё некоторое время (а то и секунд 7). Всё это сделано как Я понимаю для
смягчения скролла для удобного (пафосного) использовании сенсорных мышей.

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

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

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

Может есть какое-то свойство что хранит данные которые помогут различить нормальный
wheel от псевдо wheel
    


Ответы

Ответ 1



На событие wheel повесить счетчик += Установить маркер, игнорирующий новые события wheel, пока длится текущее. Через определенный интервал проверять, изменилось ли значение счетчика. Если изменилось - wheel еще происходит, если осталось прежним - событие wheel завершено, убираем интервал и убираем маркер. Важно! Интервал должен быть небольшим, иначе в счетчик может попасть wheel из нового пользовательского события, а нас интересует только текущее. https://jsfiddle.net/rafaylik/sLjyyfox/ []

Ошибка при получении запроса GET в Django

#python #django


Есть данная функция на python, которая обрабатывает запрос из html формы, получает
оттуда значение q, при вводе "1" в строку поиска выдает значение "Ты пытаешься найти:
u'1'" Откуда появляется символ u'' и как его исправить понятия не имею, подскажите
пожалуйста как пофиксить.

def search (request):
    if 'q' in request.GET:
       message = "Ты пытаешься найти: %r" % request.GET.get('q')
    else:
       message = "Пустая форма"
    return HttpResponse(message)

def search_form (request):
    return render_to_response('search_form.html')

    


Ответы

Ответ 1



%r — это результат вызова функции repr(), которая для юникодовых строк представляет именно такую запись с префиксом u. Вам следует воспользоваться %s — это даст результат вызова str(). Ну и в новом коде следует всё-таки переходить на использование функции format(): "Ты пытаешься найти: {0}".format(request.GET.get('q'))

Вопрос по лицензии GPL 2+

#opensource #лицензирование


Хочу инструкцию. Пошаговую и однозначную :)

Локально возникла дискуссия, но все пришли к тому, что неоднозначно понимают GPL.

Итого, сухая выжимка. Есть утилита, которая распространяется по GPL. На её базе делалась
библиотека, исключительно для личного употребления. Если захочется выложить эту библиотеку
публично, что делать? 

Синопсис: некоторые файлы были оставлены без изменений, некоторые модифицированы
(часть - почти до неузнаваемости, разве что на уровне прототипов функций что-то осталось),
добавлены другие.
    


Ответы

Ответ 1



Нужно тоже распространять под GPL версии 2+. Коротко по шагам: В каждом файле разместить требуемую лицензией шапку. Не забыть в шапке также указать всех владельцев авторских прав. К библиотеке приложить текст лицензии. Полезные ссылки: Как применять лицензии GNU со своими программами Лицензия для вашего open-source проекта Практическое руководство по соответствию GPL Ответы на вопросы о лицензиях GNU GNU GPL 3 человеческим языком Мир лицензий: разбираемся с GNU GPL Как GPLv3 совмещается с другими GNU лицензиями => http://копилефт.рф/лицензии/гну-гпл/совместимость-гну-лицензий (увы, ссылка на такой адрес не создается)

Обновление состояния редко изменяемых таблиц

#c_sharp #entity_framework


Имеем алгоритм, который использует набор правил, который хранится в таблице MS SQL
Server. Если переданные на вход параметры a,b,c совпали с хранящимися в таблице - будь
добр, верни то, что хранится в поле d таблицы. Это для простоты, реально в базе в таблице
RulesTree лежит отображение весьма раскидистого дерева правил, и каждый раз рекурсивно
строить это дерево нет никакого желания - лишние запросы к БД, лишние расчеты et cetera.
По грубым оценкам, с построением дерева алгоритм работает 5 секунд, без построения
- 1 секунду, и это не на самой слабой системе.  

Алгоритм реализуем в форме WCF-сервиса ValidationSerice. В static constructor сервиса
вызываем метод pubic void RefreshCliassifiers(), который строит дерево правил, и сохраняет
его в static List rulesList.
Работу с базой ведем через EF.
Но правила имеют свойства меняться. Под это дело есть отдельный интерфейс, изменять
который нельзя (т.е. мы не можем вызывать RefreshClassifiers или сохранять в базе итоговый
набор правил в требуемом нашему алгоритму виде). Ну и классификатор, увы, не один.
Меняются они редко, но меняются.  

Вопросов два:
1. Нужно ли вообще в данном случае хранить дерево как static List rulesList,
или есть другие варианты?
2. Как выяснить, что в таблицу RulesTree внесли изменения без перестроения списка
правил?  

Обновление: Попробовал через SqlDependency. Подготовил БД:  

ALTER DATABASE [testbase] SET ENABLE_BROKER with rollback immediate;;
  CREATE QUEUE CntQueue;
  CREATE SERVICE CntChangeNotifications
  ON QUEUE CntQueue
([http://schemas.microsoft.com/SQL/Notifications/PostQueryNotification]);


Проверяю следующим кодом и ловлю run-time exception: Если SqlDependency используется
без указания значения для Оptions, то перед выполнением команды, добавленной в экземпляр
SqlDependency, необходимо вызвать метод SqlDependency.Start().

private static void Main(string[] args)
{
    var connString = "Server=(local);Database=testbase;User Id=developeruser;Password=developerpassword;";
    SqlDependency.Stop(connString, "CntQueue");
    var sqlCommand = new SqlCommand
    {
        CommandText = "select * from cnt",
        Notification = null,
        Connection = new SqlConnection(connString)
    };
    SqlDependency dependency = new SqlDependency(sqlCommand);
    sqlCommand.Connection.Open();
    SqlDependency.Start(connString, "CntQueue");
    dependency.OnChange += OnChange;
    sqlCommand.ExecuteReader(); //!!!Exception!!!

    while (!changed)
    {
    }
    Console.WriteLine("Changed!");
    Console.ReadKey();
    SqlDependency.Stop(connString, "CntQueue");
}

private static bool changed = false;

private static void OnChange(object sender, SqlNotificationEventArgs e)
{
    changed = true;
}


Но я же вызываю SqlDependency.Start()? Чего-то еще не хватает?
  exception.ToString():  

System.InvalidOperationException: Если SqlDependency используется без указания значения
для Оptions, то перед выполнением команды, добавленной в экземпляр SqlDependency, необходимо
вызвать метод SqlDependency.Start().
   в System.Data.SqlClient.SqlDependency.GetDefaultComposedOptions(String server,
String failoverServer, IdentityUserNamePair identityUser, String database)
   в System.Data.SqlClient.SqlCommand.CheckNotificationStateAndAutoEnlist()
   в System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,
RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1
completion, Int32 timeout, Task& task, Boolean asyncWrite)
   в System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,
RunBehavior runBehavior, Boolean returnStream, String method)
   в System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String
method)
   в System.Data.SqlClient.SqlCommand.ExecuteReader()
   в ConsoleApplication1.Program.Main(String[] args) в c:\csharp\projects\ConsoleApplication1\ConsoleApplication1\Program.cs:строка 33


UPD2. Заработал в итоге такой вариант:

        SqlDependency dependency = new SqlDependency(sqlCommand, "Service=CntChangeNotifications;",
31557600);

    


Ответы

Ответ 1



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

Возможно ли создать интерфейс для создания экземпляра одного из следующих классов?

#c_sharp #проектирование #шаблоны_проектирования


Добрый день! Пусть есть несколько классов, например:

public class ProductA 
{
   public string FieldFirst { get; set; }
   public string FieldSecond { get; set; }
   public string FieldThird { get; set; }
   public string FieldFourth { get; set; }
}

public class ProductB 
{
   public string FieldFirst { get; set; }
   public string FieldSecond { get; set; }
   public string FieldThird { get; set; }
   public List FieldFourth { get; set; }
}

public class ProductC 
{
   public string FieldFirst { get; set; }
   public string FieldSecond { get; set; }
   public List FieldThird { get; set; }
}

public class ProductD 
{
   public string FieldFirst { get; set; }
   public List FieldSecond  { get; set; }
}


Собственно, хотел узнать, возможно ли сделать общий интерфейс для выбора класса и
создания объекта. Нельзя ли найти какой-нибудь единый  интерфейс для них, и использовать,
например  Абстрактную Фабрику. Или это нельзя сделать в данном случае. Заранее огромное
спасибо! 
    


Ответы

Ответ 1



Простое решение Если типы аргументов известны на стадии компиляции и наборы типов параметров уникальны, то можно сделать банальную фабрику: public static class ProductFactory { public static ProductA Create (string fieldFirst, string fieldSecond, string fieldThird, string fieldFourth) { return new ProductA(fieldFirst, fieldSecond, fieldThird, fieldFourth); } public static ProductB Create (string fieldFirst, string fieldSecond, string fieldThird, List fieldFourth) { return new ProductB(fieldFirst, fieldSecond, fieldThird, fieldFourth); } public static ProductC Create (string fieldFirst, string fieldSecond, List fieldThird) { return new ProductC(fieldFirst, fieldSecond, fieldThird); } public static ProductD Create (string fieldFirst, List fieldSecond) { return new ProductD(fieldFirst, fieldSecond); } } Тогда создание объектов будет выглядеть следующим образом: ProductA productA = ProductFactory.Create("1", "2", "3", "4"); ProductD productD = ProductFactory.Create("1", new List()); Здесь я предположил следующие классы продуктов: public class ProductA { public string FieldFirst { get; set; } public string FieldSecond { get; set; } public string FieldThird { get; set; } public string FieldFourth { get; set; } public ProductA (string fieldFirst, string fieldSecond, string fieldThird, string fieldFourth) { FieldFirst = fieldFirst; FieldSecond = fieldSecond; FieldThird = fieldThird; FieldFourth = fieldFourth; } } public class ProductB { public string FieldFirst { get; set; } public string FieldSecond { get; set; } public string FieldThird { get; set; } public List FieldFourth { get; set; } public ProductB (string fieldFirst, string fieldSecond, string fieldThird, List fieldFourth) { FieldFirst = fieldFirst; FieldSecond = fieldSecond; FieldThird = fieldThird; FieldFourth = fieldFourth; } } public class ProductC { public string FieldFirst { get; set; } public string FieldSecond { get; set; } public List FieldThird { get; set; } public ProductC (string fieldFirst, string fieldSecond, List fieldThird) { FieldFirst = fieldFirst; FieldSecond = fieldSecond; FieldThird = fieldThird; } } public class ProductD { public string FieldFirst { get; set; } public List FieldSecond { get; set; } public ProductD (string fieldFirst, List fieldSecond) { FieldFirst = fieldFirst; FieldSecond = fieldSecond; } } Сложное решение Если на стадии компиляции ничего не известно, а аргументы собираются вручную во время выполнения программы, то можно воспользоваться Autofac, например. Вот пример использования, когда выбор делается на основе имён и типов параметров, и имена параметров не совпадают с именами аргументов конструктора: var builder = new ContainerBuilder(); builder .Register((c, p) => { switch (p.Count()) { case 4: if (p.OfType().Any(a => a.Name == "str4")) return new ProductA( p.Named("str1"), p.Named("str2"), p.Named("str3"), p.Named("str4")); else return new ProductB( p.Named("str1"), p.Named("str2"), p.Named("str3"), p.Named>("ints")); case 3: return new ProductC( p.Named("str1"), p.Named("str2"), p.Named>("doubles")); case 2: return new ProductD( p.Named("str1"), p.Named>("floats")); } throw new DependencyResolutionException("Could not resolve product."); }) .As(); IContainer container = builder.Build(); var productA = container.Resolve( new NamedParameter("str1", "1"), new NamedParameter("str2", "2"), new NamedParameter("str3", "3"), new NamedParameter("str4", "4")); var productD = container.Resolve( new NamedParameter("str1", "1"), new NamedParameter("floats", new List())); Предполагается, что продукты реализованы следующим образом: public interface IProduct {} public class ProductA : IProduct { public string FieldFirst { get; set; } public string FieldSecond { get; set; } public string FieldThird { get; set; } public string FieldFourth { get; set; } public ProductA (string fieldFirst, string fieldSecond, string fieldThird, string fieldFourth) { FieldFirst = fieldFirst; FieldSecond = fieldSecond; FieldThird = fieldThird; FieldFourth = fieldFourth; } } public class ProductB : IProduct { public string FieldFirst { get; set; } public string FieldSecond { get; set; } public string FieldThird { get; set; } public List FieldFourth { get; set; } public ProductB (string fieldFirst, string fieldSecond, string fieldThird, List fieldFourth) { FieldFirst = fieldFirst; FieldSecond = fieldSecond; FieldThird = fieldThird; FieldFourth = fieldFourth; } } public class ProductC : IProduct { public string FieldFirst { get; set; } public string FieldSecond { get; set; } public List FieldThird { get; set; } public ProductC (string fieldFirst, string fieldSecond, List fieldThird) { FieldFirst = fieldFirst; FieldSecond = fieldSecond; FieldThird = fieldThird; } } public class ProductD : IProduct { public string FieldFirst { get; set; } public List FieldSecond { get; set; } public ProductD (string fieldFirst, List fieldSecond) { FieldFirst = fieldFirst; FieldSecond = fieldSecond; } }