В документации Golang как-то неясно раскрывается суть goroutines. Скажите, goroutines
- это ничто иное как потоки операционной системы?
(т.е. как я пониманию, компилятор Go сам заботится о внутренней реализации этих потоков
в зависимости от операционной системы)
Ответы
Ответ 1
по простому - это более высокоуровневые потоки. К примеру, если нужно выполнять очень
мелкие действия в отдельных потоках, то обычные потоки будут накладными - система будет
дольше их создавать. для goroutines run-time может переиспользовать один и тот же поток,
эмулируя работу настоящих потоков. В результате получается быстро и дешево. Проблема
номер два - некоторые процессы могут создавать очень большое количество потоков (например,
из за ошибки программиста). goroutines такого не должно случиться - они будут прост
в очереди.
Можно считать, что goroutines - это такой встроенный в язык thread pool.
Ответ 2
Если бы это была бы просто параллельность средствами операционной системы, то не
следовало бы и язык городить. Другие языки для этих целей прекрасно обходятся библиотеками.
ГоРутины - это сильно кастрированные потоки, если сравнивать их с теми, что предоставляет
нам операционная система, нет особых гарантий параллельности, некоторые особо рьяно
работающие ГоРутины могут заблокировать своей активностью другие ГоРутины.
Но при этом, как верно заметили выше, они очень не накладны и на этапе разработки
программы и на этапе выполнения программы.
Наиболее близкий аналог - green threads
Ответ 3
Наиболее близкий аналог - green threads
Да вот не похоже что так.
green threads 100%-блокируется на i/o
Здравствуйте, я возможно сейчас один глупый вопрос задам, но все же:
Мне не совсем понятно за счет чего страница закэшированная на уровне контроллера(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 их скачивание одним потоком? Я имею в виду, сделать так, чтобы окошко
"сохранить как " появилось только один раз.
Ответы
Ответ 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() не принимает кириллические
символы в 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 многие штуки чуточку удобнее делать
Доброй ночи, уважаемые коллеги!
У меня возникла следующая проблема. Мне надо установить в 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. Если вы просто распаковали сорцы, то и либы не будет. Надо все это дело собирать.
Читайте доки как собрать в папке буста.
Всем привет.
Вот недавно возник такой вопрос.
Вопрос носит характер удовлетворения скорее чистого любопытства, а не практический
интерес, хотя, в-принципе, было бы и на практике интересно попробовать возможно ли
такое проверить.
В-общем, насколько я понимаю, такое невозможно на сегодняшних, современных процессорах
(невозможно же?), так как
Instruction pipeline на современных процах конвееризирован.
Каждая инструкция состоит из нескольких составляющих ее операций, которые далеко
не факт что будут выполняться за одинаковое время - допустим, при fetching'е операнда
из памяти или на стадии Write back может произойти cache miss, и в итоге время доступа
вырастет очень существенно, от десятков наносекунд до микро или даже милисекунд.
Также на многих процессорах используются конвеерные оптимизации, т.е. опредленная
последовательность инструкций (паттерн) будет отрабатывать быстрее, нежели другой,
менее удачливый набор, опять-таки, из-за особенностей конвеера и стадий обработки инструкции.
Получается, это невозможно?
Скажите, прав я или нет?
Ответы
Ответ 1
Да, всё зависит от огромного числа факторов, некоторые из которых Вы назвали. Я слышал,
что intel'овские профайлеры умеют показывать некоторые подобные скрытые вещи (насколько
я помню, - например, промахи кэша и ошибки предсказания переходов), используя знания
об архитектуре и некоторые вещи эмулируя (а не измеряя).
Ребята, подскажите пожалуйста как в 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,
}
Подскажите, вот скачал человек приложение с play вытащил apk и теперь может установить
его на любое количество устройств, разместить в сети и т.д.
Существуют ли методы защиты? и вообще это какая дырка мне кажется.
Ответы
Ответ 1
Application Licensing
С помощью этой штуки можно проверить лицензию конкретного пользователя на использование
конкретного приложения(платного, или бесплатного), и решить, разрешать ему запуск,
или нет...
Но количество выложенных платных приложений, на пример на 4pda подтверждает тот факт,
что почти любую защиту можно обойти.
Я бы советовал делать какую-то авторизацию на сервере для защиты...
Ответ 2
Методы защиты есть, но они не работают. Из не сломанных на 4pda я помню только Poweramp
(Возможно уже все изменилось). Лучше придумайте способ монетизации отличный от продажи.
Доброго времени суток.
У меня есть задача сделать подсветку svg элемента при наведении на него курсора мыши.
Проблема заключается в том что кастомные стили элемента не должны изменяться. А подсветка
должна появляться по бокам элемента.
Частично я уже понимаю что решить задачу можно с помощью svg фильтров. Только вот
поверх элемента может быть расположен другой полупрозрачный элемент и подсветка первого
будет частично затухать (если так можно выразиться).
Посоветуйте как быть.
Ответы
Ответ 1
Это можно сделать с помощью css свойства filter и селектора :hover.
Вот пример http://jsfiddle.net/FvjA3/ .
#rect:hover {
filter: url("#glow-filter");
}
Подскажите что я делаю не так?
Необходима авторизация на сайте 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();
}
Ничего ни пришлось конвертировать и тп. Необходимо экспортировать сертификат пользователя
из браузера и закинуть его в приложение.
До этого дня работал в отдельном репозитории и сегодня поступила команда, что для
меня открыт 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. Qt под GPLv3, мой проект под MIT. Так вот, где мне нужно указать,
что используется ПО с открытым исходным кодом (в данном случае Qt)?
Ответы
Ответ 1
Если я правильно читал документацию, то нужно сделать так
в корневой каталог положите копии лицензий Qt и MIT (той, которую Вы используете)
создайте файл LICENSE.txt, где напишите, что это Ваш проект под лицензией MIT и Вы
используете Qt под GPLv3
во всех своих файлах в верху добавьте короткую вставку с указанием авторства, даты
создания, лицензии и подобного.
там, где добавить вставку невозможно (к примеру, папка с картинками), вставьте текстовый
документ с подобных текстом (картинки созданы таким то, лицензия такая то).
также, неплохо добавить в пункт меню "помощь" рядом с " о программе" пункт "о Qt",
с вызовом стандартного окошка.
в любом случае, всегда можно им написать напрямую и уточнить детали - http://qt.digia.com/licensing/
Привет...
У меня проблема в Chrome.
Запрос вроде не отправляется и в консоли на этом пакете выводится это сообщение.
Что может означать это и по каким причинам:
Запрос не отправляется?
Ответ не приходит?
Сервер не генерирует ответ на вопрос?
Ответы
Ответ 1
Какое-то расширение блокирует запрос.
Попробуйте запустить Chrome в режиме Инкогнито (Ctrl + Shift + N). Дополнения будут
отключены.
Ответ 2
Ресурс может блокироваться расширением
Сообщение есть, потому что запрос на получение этого ресурса никогда
не был выполнен, поэтому отображаемые заголовки не являются
реальностью. Как пояснялось в проблеме, на которую вы ссылались,
реальные заголовки обновляются, когда сервер отвечает, но нет ответа,
если запрос был заблокирован.
Введите chrome://net-internals в адресную строку и нажмите enter.
Откройте страницу с проблемами. Вернитесь к сетевым внутренним
элементам, нажмите events (###) и используйте текстовое поле, чтобы
найти событие, связанное с вашим ресурсом (используйте части
URL-адреса). Наконец, нажмите на событие и посмотрите, подскажет ли
вам информация.
Здравствуйте, люди. Подскажите пожалуйста, возможно ли отправить 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
Я использую 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
Так что - обёртка.
Зачем их придумали, если можно вместе с исходниками выкидывать дамп?
Чувствую, что вопрос наитупейший ^^ тапками не кидайте.
Ответы
Ответ 1
Чаще всего миграцию используют для правильного переезда базы на новую структуру.
В проектах часто бывает, что раньше все шли по одной структуре, а потом существующую
базу надо переделать, но данные потерять никак нельзя. Для этого используют миграцию.
Здравствуйте, пишу чатик, начал с параллельного эхо-сервера.
Теперь пытаюсь сделать так, чтобы сообщения от одного подключенного клиента рассылались
всем подключенным клиентам.
В процессе-родителе создаю сокет в файловом пространстве, и делаю его широковещательным:
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-адрес, что потребовалось бы для приёма.
Я новичок в 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
Нужно с помощью 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
Есть 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#, 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, как показано на картинке?
Ответы
Ответ 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;
}
}
Я пишу игру Угадай "ЧтоУгодноПоКартинке". У меня есть картинка и шесть кнопок. Три
вверху и три внизу.
Хочу сделать кнопки:
Прозрачными
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.
Нужно программно перевести игру в полноэкранный режим и наоборот из полноэкранного
в оконный. Хэндл окна нахожу функцией 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.
Собственно, вопрос в названии... Не смог найти простейшего примера обмена данными
между смартфоном и часами...
Прошу именно простейший пример, исходники семплов, что идут вместе с 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 модуля нужно добавить гугл плей сервис
Закрыт. На этот вопрос невозможно дать объективный ответ.
Ответы на него в данный момент не принимаются.
Хотите улучшить этот вопрос? Переформулируйте вопрос,
чтобы на него можно было дать ответ, основанный на фактах и цитатах, отредактировав его.
Закрыт 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. Всё удобно, защищено и очень
просто. + Есть библиотека аутентификации и регистрации.
Здравствуйте.
Есть такая кнопка:
Пытаюсь нажать её так:
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'] - наиболее подходит
Здравствуйте, уважаемые форумчане!
Есть такой вопрос, кто как делает плавный скроллинг страниц?
Сам на данный момент использую 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. Вот у меня есть картинка размером 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, в частности с этим примером:
И напросился вопрос: зачем нужно очищать результат набора, 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мб памяти, так как мы очистили память от первого
запроса и записали в неё второй.
Я сам назначаю ему высоту по контенту, но я хочу узнать его высоту в 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(). Ведь, насколько
я понял, хешкод берется из скрытой переменной в объекте, к которой нет доступа. Тогда
как мне его переопределить ?? Если не затруднит, то хотелось бы увидеть какой-то элементарный
пример.
И еще не пойму, почему разные хешкоды в коде
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()
Про хэш-функции
Собственно, как реализовать наблюдение за возникновением процессов? Вариант с перечислением
процессов по таймеру не подходит, поскольку часть быстро отработавших процессов он
не покажет
Ответы
Ответ 1
Простого хука на событие создания процесса не существует. Если процессы создаются
и пропадают слишком быстро, то перечисляйте ещё чаще.
Обратите внимание, что ни стандартный Task Manager, ни продвинутый Process Explorer,
написанный Руссиновичем, который знает все потроха Windows, не умеют отлавливать быстро
завершившиеся процессы, если это не позволяет разрешение таймера. Думаю, если бы такая
возможность существовала в нормальном виде, то ей бы воспользовались.
Если вы готовы на подвиги (и готовы распрощаться с .NET), то у вас два пути:
Написать драйвер, прицепиться к событию создания процесса PsSetCreateProcessNotifyRoutine,
прокидывать сообщения в своё приложение.
Перехватывать вызовы CreateProcess и подобные.
Пример с драйвером можете найти в статье Detecting Windows NT/2K process execution.
Ответ 2
Такой возможности, встроенной во фреймворк, я не знаю.
Братский сайт рекомендует WMI (что требует довольно сложного кода и P/Invoke), кроме
того упоминается решение с TraceEvent'ами (которое вроде бы «более» синхронное).
Заметьте, что с завершением процесса всё гораздо проще: просто воспользуйтесь event'ом
Process.Exited.
После перехода с январьской версии компилятора 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);
Понимаю что вопрос дурацкий, но тем не менее :) В каких случаях неверно утверждение:
"если код на 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) это может
привести к крешу.
Я так понимаю это сделать нельзя, но всё таки спрошу...
Есть у меня базовый абстрактный класс 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