Страницы

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

среда, 5 июня 2019 г.

Не работает ввод русских букв в EditText в Android Studio

Добрый день! Почему-то не работает ввод русских букв в EditText в Android Studio. Пробовала через стандартный эмулятор и Genimotion. Как только меняю раскладку - пишет на англ. нормально, на русском не пишет, даже в логах ничего нет. Заранее спасибо.


Ответ

В случае с Genymotion вам поможет включение в настройках эмулятора (в списке эмуляторов) использования виртуальной клавиатуры.

Возможно ли “виртуальное клонирование” в С++?

Наткнулся в "More Exceptional C++" на информацию, что виртуальные методы могут вместо указателей на объекты базового класса возвращать объекты перегруженного класса. Решил попробовать смоделировать "самоопределяющийся" объект - с виртуальным методом, вместо указателя базового класса возвращающим указатель на объект производного, чтобы можно было вызывать функции, отсутствующие в базовом классе. Вот пример с "виртуальным клонированием": #include #include
class Base { public: Base(){} virtual ~Base()=0; virtual Base* clone() { qDebug()<<"Base clone"; return 0; } };
Base::~Base(){}
class Derived: public Base { public: Derived(){} virtual Derived* clone() { qDebug()<<"Derived clone"; return new Derived(*this); } QString derivedOnly(){return "derivedOnly";} virtual ~Derived(){} };
int main(int argc, char *argv[]) { Derived d1; Base * b1=&d1; Base * b2=b1->clone(); b2=b2; Derived * d2=d1.clone(); delete d2; // Derived * d3=b1->clone(); delete d3; } Так всё работает, и вывод qDebug показывает, что запускается клонирование производного класса. Однако, раскомментировав последнюю строку, при компиляции получаю сообщение об ошибке "invalid conversion from 'Base' to 'Derived' [-fpermissive]". Выводы: Очевидно, что компилятор (g++, Windows/MinGW) проигнорировал описание Derived * Derived::clone(), сгенерировав вместо него код для Base * Derived::clone(). Эту подмену транслятор сделал, никак меня не уведомив. Я рассчитываю получить указатель типа Derived, а получаю Base - и ничего об этом не знаю! Я понимаю, для чего это сделано. Я мог бы написать что-нибудь типа b1->clone()->derivedOnly(), и транслятор не знал бы, допустима ли такая конструкция, так как статически неизвестно, будет ли при исполнении b1 указывать на Base или на Derived. Вопросы: Почему так происходит - является ли это частью стандарта (где можно посмотреть?) или самоуправством g++ (4.6.2)? Можно ли сделать так, чтобы выдавался warning? Ведут ли себя так же другие трансляторы? Есть ли возможность решить изначальную задачу, то есть "развернуть" объект из указателя на базовый класс, не указывая, в какой именно класс мы его разворачиваем (т. е. без dynamic_cast'ов)?


Ответ

О выводах Выводы неверные. Пункт 3 верный. Он же является ответом на Ваш вопрос. А вот пункт 1 и, следовательно, 2 - неверные. Derived* Derived::clone(); Base* Base::clone(); Какой из методов Вы бы выбрали, будь у Вас указатель на тип Base*? Ответы 1) Вы же сами отвечаете себе на этот вопрос в выводе 3: статически неизвестно, будет ли при исполнении b1 указывать на Base или на Derived Это приводит к тому, что компилятор использует статический тип объекта, то есть Base*. У объекта такого типа метод Base* clone() возвращает Base*, чтобы привести его к Derived* нужно явное преобразование. Ссылка на стандарт: раздел 10.3.8 [...] its result is converted to the type returned by the (statically chosen) overridden function (5.2.2) 2) Тут я поразмышляю о другом warning'е. Который не будет показан, если написать, например: Derived* d2 = dynamic_cast( b1->clone() ); Явное преобразование static_cast( b1->clone() ) это как бы уже warning. Страуструп пишет в "Дизайн и эволюция C++", что намеренно завел вместо лаконичного, но скрытного синтаксиса приведения типов C, громоздкий и неудобный, привлекающий внимание синтаксис приведения типов в стиле C++ (с _cast<>'ами). Кто Вам гарантирует, что b1 всегда будет указывать на Derived-объект? Только Вы сами и гарантируете. За этот архитектурный "косяк" (см. п.4) Вы и расплачиваетесь dynamic_cast'ом. Или, если производительность важна, static_cast'ом, подкладывая себе мину замедленного действия Относитесь к явным преобразованиям типов, как к warning'ам, ругающим Вашу архитектуру. 3) да. См. п. 1 Например, VS2013: error C2440: 'initializing' : cannot convert from 'Base *' to 'Derived *' Cast from base to derived requires dynamic_cast or static_cast 4) Итак, Вы хотите реализовать виртуальный метод клонирования. Сам метод реализован правильно, и работает правильно. Неправильно Вы используете результат клонирования - считаете, что там какой-то определенный потомок. На самом деле, имея указатель Base*, Вы можете полагаться только на интерфейс класса Base, никаких QString derivedOnly() Как же быть? Вариант 0. Вы точно знаете, что Base* в данном контексте - это Derived*. Тогда Вы можете либо сразу указать тип Derived*, либо сделать dynamic_cast Вариант1. Код оперирует указателем Base* и неизвестно, на какой из наследников есть указатель: Derived1* или Derived2*. Вы клонируете объект, думая, что там Derived1, а на самом деле не он. Что тогда? Логика программы развалилась. Из-за того, что Вы полагаетесь на различный интерфейс сущностей, которые по контракту все имеют единый интерфейс Base*

Самый простой способ добавить элемент в начало и удалить в конце в Java

Привет! Подскажите, как Java создать динамический массив (карту) и обработать его, такого вида: Создаем: [20,30,40,50,60] Добавляем элемент в начало и убираем в конце: [10,20,30,40,50] Т.е. мне необходимо оставить тело 20,30,40,50, не трогать, а к нему добавить голову 10, и убрать хвост 60. Как реализовать это самым быстрым и дешевым методом это в Java?


Ответ

@Andrew F
создать динамический массив (карту)
для начала определись чего ты хочешь. карту или динамический массив. Я вижу что ты используешь список, так что твой выход - интерфейс Deque и его встроенная реализация LinkedList
насколько дорого? что значит дорого ? В хвосты/голову вствляет быстро. тут подробнее

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

Посмотрите в начало стр. 5 здесь и объясните популярно, зачем в принципе нужен заголовок calc.h, если проект спокойно компилируется и запускается без заголовков вообще через: Andrey@AsusP5B ~/2 $ gcc driver.c calc.c -o prog
Andrey@AsusP5B ~/2 $ ./prog
Square of 5 is 25
Andrey@AsusP5B ~/2 $ Это что, новым компиляторам уже на заголовки наплевать или на прототипы функций, или это чистота написания кода, или просто лучше заголовки лучше сразу создавать, чтобы не было путаницы или х.з., так как в будущем они понадобятся для других целей... В теории, ПОЧЕМУ?


Ответ

Все работает, потому что си компилятор полагается на то, что Вы самостоятельно угадали сигнатуру. Возьмите driver.c, закомментируйте #include "calc.h" и "сделайте ошибку в вызове функции, где-то так: printf("
Square of %d is %d
", x, square()); Код скомпилируется и даже никто не ругнется. Но вот только работать он будет странно (как именно странно - зависит от ситуации, может упасть, а может выводить странные результаты). У меня, к примеру, выводит просто "Square of 5 is 1". Правильные заголовочные файлы позволяют компилятору знать правильную сигнатуру функции и находить подобные ошибки. Но почему же оно все-таки компилируется? Да все просто. Когда компилятор видит объявление функции, он генерирует для нее код и запоминает адрес начала в специальной таблице в виде имя-адрес (да, там нет параметров!). Когда нужно вставить вызов функции, просто смотрит в таблицу и поставляет "call адрес". Сами параметры перед этим напихает в стек push'ем. Но тут есть ещё одна хитрость. На самом деле вначале туда проставляются не адреса. Адреса уже проставляет линковщик. Именно по этой причине порядок компиляции файлов не столь важен. Почему же оно не работает, хотя и компилируется? Вызывающая сторона в стек параметры добавляет, но их фактическое кол-во нигде не отмечает. Вызываемая сторона просто достает с стека их. Но опять же, она не может никак узнать, что там именно то, что положила вызывающая сторона. Поэтому, что достали с стека, то и обработали. В с++ этот трюк уже не проходит. Там компилятор делает "манглироване имен". То есть в таблицу функций вставляет имя функции с хитрым описанием типов параметров. Это нужно, так как в С++ есть возможность создать несколько функций с одним именем и разным кол-вом/типом параметров.

Отладка приложения - количество памяти

Как узнать сколько памяти потребляет приложение (на С#) при работе? Либо "участок кода" - допустим есть метод который считывает данные, можно ли узнать сколько памяти он потребляет во время работы.
ds.ReadXml(xml);
IDE - VS2012


Ответ

Отслеживание изменений в оперативной памяти:
С помощью кода:
long before = GC.GetTotalMemory(false); // ваш код тут long after = GC.GetTotalMemory(false); int consumedInMegabytes = (after - before) / (1024 * 1024);
Опционально может потребоваться собрать мусор до и/или после тестируемого кода (параметр GetTotalMemory поставить в true). С помощью профайлеров (суть аналогична): снять снэпшот до тестируемого кода, выполнить код, снять снэпшот после, сравнить два снэпшота. Профайлер поможет ответить не только на на вопрос "сколько?", но и "на что?".

Разные лейауты для разных телефонов

Такая проблема. Создаем приложение для зоопарка устройств. и необходимо чтобы дизайн совпадал пиксель в пиксель. Впринципе все смогли разрулить с помощью dpi, выставляя значения в них. на разных екранах делаем скрин, вставляем в фотошоп и все накладывается пиксель в пиксель. Но есть такие телефоны типо нексуса 6, у которых нет конкретного размера в dpi тоесть он между xxhdpi и xxxhdpi. И соотвественно когда я указываю размер кнопки например 50dpi то она выглядит иначе чем я ожидаю. Я не знаю как это решить. Из этого вопросы
Как это решается? Как сделать чтобы на определенном телефоне поставлялся определенный лейаут?
НАШЕЛ
res/layout-sw600dp/main_activity.xml # For 7” tablets (600dp wide and bigger) res/layout-sw720dp/main_activity.xml # For 10” tablets (720dp wide and bigger)
смущает 600dp wide and bigger это что этот лейаут будет и для экранов с большей плотностью тоже? а как сделать только для конкретного экрана?


Ответ

Можно например так:
if(android.os.Build.MODEL.contains("Nexus 6")) setContentView(R.layout.my_layout_for_nexus_6);
Мне и самому то не нравится такое выделывать, но что делать раз Nexus такой специфичный :)

как определить при старте приложения что получена нотификация?

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


Ответ

Вобщем всем спасибо за ответы. Ближе всех был @pepyakin Так как я юзаю БД у себя в проекте я сделал так. когда получаю нотификацию, то в своем сервисе делаю просто
public void broadcast(String messageType, final Bundle message) { if (!ScanActivity.ACTIVITY_STATUS) { new NotificationStorage() .setTicker("Receipt") .setTitle("Receipt") .setBundle(message) .setMessage(message.getString("receipt_id")).generateNotification(this); ReceiptQueue receiptQueue = new ReceiptQueue(); receiptQueue.setReceptId(message.getString("receipt_id")); ReceiptQueueDao.save(receiptQueue); }
if (ScanActivity.ACTIVITY_STATUS) { Observer.getInstance().send(MessageType.RECEIPT_SHOW, message); }
}
тоесть тут моя проверка небольшая (открыто ли уже активити или нет). если открыто - я шлю обсервером нужное мне. если закрыто, то сохраняю данные нужные мне в БД. Дале два пути: 1. юзер тыкает на нотификацию 2. Юзер открывает через лаунчер В любом случае открывается активити, в котором я достаю данные из БД и если там чтото есть, делаю то что мне нужно. После этого очищаю табличку с этим данными. ВСЕ!)))

Как удалить лишние пробелы в строке(StringBuffer)

Как удалить лишние пробелы в строке, если она типа StringBuffer? Важно не использовать переход в String
допустим строка:
StringBuffer str = new StringBuffer("this is а test message");
должна превратиться в:
"this is a test message"


Ответ

Пробегаем по StringBuffer и перемещаем в начало все непробельные символы. Если встречаем пробел, и он идет первым, также перемещаем его и запоминаем индекс. Все последующие пробелы игнорируем. При встрече непробельного символа сбрасываем индекс пробела.
static void removeWhiteSpaces(StringBuffer sb) { int end = 0; int spaceIndex = -1;
for (int i = 0; i < sb.length; i++) { if (!Character.isWhitespace(sb.charAt(i))) { sb.setCharAt(end++, sb.charAt(i)); spaceIndex = -1; } else if (spaceIndex < 0) { sb.setCharAt(end++, sb.charAt(i)); spaceIndex = i; } }
sb.setLength(end); }

Ассоциация программы с собственным типом файла

Имеется файл программы в виде:
[project] type=MyApp 1.0 project directory=D:\Папка проекта Еще какие-то значения.
При открытии файла внутри программы (Файл->Открыть проект) всё работает замечательно. Но появилась нужда открывать этот файл двойным щелчком. С помощью ClickOne создал файл ассоциаций.
Открытие проекта пытаюсь сделать так:
private void MainForm_Load(object sender, EventArgs e) { string[] args = Environment.GetCommandLineArgs(); if (args.Length >= 2) { MessageBox.Show("Открыт проект! УРА!"); OpenProject(args[1]); } }
В Program.cs прописано, что принимаются аргументы:
public static void Main(string[] args)
Как решить эту проблему?


Ответ

При регистрации с помощью ClickOnce аргументы приходят не в командную строку, а в AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData
foreach (string arg in AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData) MessageBox.Show(arg);

Добавление приложения в “Open With” диалог Android

Мое приложение работает с базами данных SQLite, хотелось бы, чтобы пользователь мог увидеть мое приложение в диалоге "Открыть с помощью" при попытке открытии базы даных в файловой системе. Как реализовать такое?


Ответ


вместо \\.sqlite можете поставить любое другое расширение файла.
И дальше в классе Activity:
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); final Intent intent = getIntent(); final String action = intent.getAction();
if(Intent.ACTION_VIEW.equals(action)){ Uri uri = intent.getData(); new File(uri.getPath()); //дальше делаем все, что надо с файлом } else { Log.d(TAG, "intent was something else: "+action); } }

Преобразование Bitmap ресурса в ImageSource

Имеется Bitmap ресурс Properties.Resources.part1. Нужно установить этот ресурс в свойство заполнения прямоугольника Rectangle.Fill. Но Fill свойство принимает только тип ImageSource


Ответ

Ваша задача имеет два решения:
На одно @Mints97 привел ссылку Get ImageSource from Bitmap?, выглядит оно так:
System.Drawing.Bitmap br = Properties.Resources.part1; System.Windows.Media.Imaging.BitmapSource b = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap( br.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());
Но я бы не помещал рисунок в ресурсы, а поступил иначе:
1.Создал бы в проекте папку, например IMAGES;
2.Поместил ваш рисунок (part1) в эту папку;
3.Тогда бы код выглядел так:
System.Windows.Media.Imaging.BitmapImage b = new BitmapImage( new Uri("pack://application:,,,/IMAGES/part1.bmp"));
Ну и соответственно:
rectangle.Fill = new ImageBrush(b);

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

Необходимо чтобы у определенного слоя или у всего сайта на фоне была яндекс карта.


Ответ

Вот пример
http://jsfiddle.net/znf4pbbd/
// Как только будет загружен API и готов DOM, выполняем инициализацию ymaps.ready(init); function init () { // Создание экземпляра карты и его привязка к контейнеру с // заданным id ("map") var myMap = new ymaps.Map('map', { // При инициализации карты, обязательно нужно указать // ее центр и коэффициент масштабирования center: [56.326944, 44.0075], // Нижний Новгород zoom: 13 }); } *{ padding: 0; margin: 0; box-sizing: border-box; } html { height:100% } body { height: 100%; margin:0px; padding:0px } #map{ height:100%; width: 100%; position: absolute; top: 0; left: 0; } .content{ width: 300px; min-height: 200px; margin: 0 auto; background: #fff; position: relative; z-index: 1; }


Внедрение списка зависимостей с помощью контейнера Castle.Windsor

В качестве IoC-контейнера используется Castle.Windsor.
Корневой элемент приложения - планировщик Scheduler, который выполняет в определенной последовательности различные задания. Задания реализуют интерфейс IWorker, поэтому я решил внедрить(inject) List в Scheduler(список заданий). Впоследствии, планируется много различных типов заданий, сейчас их два: Cleaner и Writer. Cleaner нужен в одном экземпляре, используем Синглтон. Необходимо правильно внедрить N экземпляров Writer, где N - количество XML файлов в поддиректории приложения. Каждый из XML-файлов надо десериализовать и передать в качестве входного параметра каждому Writerу. Т.е. надо внедрить в Schedulerимплементацию для каждого XML. Как это правильно реализовать? Вообще какой паттерн используется в таком случае? Фабрика?
Конфигурация контейнера Castle.Windsor:
var container = new WindsorContainer(); // Для внедрения List container.Kernel.Resolver.AddSubResolver(new ListResolver(container.Kernel, true)); // Регистрация Scheduler container.Register(CastleRegistration.Component.For().ImplementedBy); // Регистрация Workers... container.Register(CastleRegistration.Component.For().ImplementedBy()); container.Register(CastleRegistration.Component.For().ImplementedBy()); // ...количество зависит от количества файлов + каждому надо передать десериализованный XML в качестве параметра container.Register(CastleRegistration.Component.For().ImplementedBy()); // Забираем Scheduler var sched = container.Resolve();
Scheduler
public class Scheduler : IScheduler { public IList Workers { get; set; }
public Scheduler(IList workers) { Workers = workers; } }
Writer
public class Writer : IWorker { public string Source { get; set; }
public Writer() { }
public Writer(string source) { Source = source; } }
Cleaner
public class Cleaner : IWorker { public Cleaner() { } }
UPDATE: Дополнительный вопрос:
Содержимое Xml-файлов переехали в одну из таблиц БД. В Scheduler (корневой компонент) нужно внедрить по Writerу с параметром на каждую запись в таблице. Из полезного совета в ответе(Andrew Prigorshnev), следует, что обращаться к БД будет правильным после настройки контейнера и получения из него корневого компонента.
С точки зрения архитектуры, правильным ли будет внедрить в Scheduler компоненты: WriterFactoryи Repository(слой доступа к БД), после чего получить экземпляр Scheduler, затем в нем с помощью Repository получить список параметров, а потом сделать на каждый параметр по Writerу с помощью WriterFactory?


Ответ

Насколько я понимаю в наиболее общем виде вопрос состоит в следующем: как правильно внедрить список зависимостей с помощью контейнера Castle Windsor?
Ответ следующий. Сам подход с внедрением списка через конструктор вполне корректный и Castle Windsor умеет работать с такими сценариями. Чтобы внедрить список зависимостей надо сделать следующее:
Зарегистрировать в контейнере резолвер списков. Вы это уже сделали в строчке container.Kernel.Resolver.AddSubResolver(new ListResolver(container.Kernel, true)); Зарегистрировать в контейнере несколько компонентов, которые должны быть внедрены в виде списка. При этом если вы внедряете список типа IList контейнер добавит в список все компоненты типа IWorker, которые вы зарегистрируете. Это вы сделали частично. В вашем примере не учтено, что когда вы регистрируете несколько одинаковых компонентов они должны быть именованными (делается с помощью метода .Named()), и по всей видимости вы не знаете как внедрить строку в конструктор компонента - это делается с помощью метода .DependsOn()
Таким образом правильная реализация вашей задачи должна выглядеть вот так:
var container = new WindsorContainer();
// Для внедрения List container.Kernel.Resolver.AddSubResolver(new ListResolver(container.Kernel, true));
// Регистрация Scheduler container.Register(Component.For().ImplementedBy());
// Writers container.Register(Component .For() .ImplementedBy() .DependsOn(Dependency.OnValue("source", "files/first.xml")) .Named("firstWriter"));
container.Register(Component .For() .ImplementedBy() .DependsOn(Dependency.OnValue("source", "files/second.xml")) .Named("secondWriter"));
container.Register(Component .For() .DependsOn(Dependency.OnValue("source", "files/third.xml")) .ImplementedBy() .Named("thirdWriter"));
// Cleaner container.Register(Component.For().ImplementedBy());
// Забираем Scheduler var scheduler = container.Resolve();
И еще несколько замечаний, касающихся конкретно вашей реализации:
Вы хотите передавать в воркеры xml, но это плохая идея. Тогда вам придется прочитать его из файла прямо в корне компоновки, в том месте где вы настраиваете контейнер. Но чтение из файла это отдельная задача, никак не связанная с разрешением зависимостей, поэтому делать ее в корне компоновки не стоит. Пусть этим занимается один из ваших компонентов. В связи с этим, в примере кода выше вы можете увидеть что во Writer'ы передается путь к файлу, а не его содержимое. Если файлы, которые вы обрабатывате меняются редко и их имена и количество известны на этапе написания кода, пример приведенный выше может вас полностью устроить. Но если это не так, надо сделать еще немного дополнительной работы, и как вы правильно предположили, надо использовать фабрики. Возможное решение здесь следующее. Надо добавить новую абстракцию - поставщик воркеров, который будет представлять собой фабрику, создающую воркеры:
public interface IWorkersProvider { IEnumerable GetWorkers(); }
Поставщик Cleaner'ов будет просто возвращать один Cleaner. А поставщик Writer'ов может получать как аргумент конструктора путь к папке, в которой надо искать файлы, и затем в методе GetWorkersсоздавать по одному воркеру на каждый найденный файл:
public class WritersProvider : IWorkersProvider { public WritersProvider(string folderPath) { }
public IEnumerable GetWorkers() { // здесь создаем по одному воркеру на каждый найденный файл } }
При такой архитектуре ваш Sheduler должен получать вместо списка воркеров, список поставщиков воркеров:
public class Scheduler : IScheduler { public Scheduler(IList providers) { // здесь надо опросить все поставщики, чтобы сформировать // список воркеров } }
Регистрация такой конфигурации в Castle Windsor делается с помощью тех же методов, что и регистрация в первом примере, поэтому не буду здесь ее описывать.
UPDATE: Ответ на дополнительный вопрос
Лучше сделать так:
В Scheduler внедрить список поставщиков воркеров (IEnumerable), как описано выше Внедрить Repository в конструктор WritersProvider и уже во WritersProviderопрашивать базу данных
Идея здесь вот в чем. Каждый класс должен выполнять одну единственную задачу. Задача Scheduler-а взять готовый список воркеров и запустить их. Задача поставщиков воркеров - создать воркеры на основе какого-то правила (из xml-файлов, таблиц бд и т.д.). Разделив обязанности таким образом, вы получите код, который легко модифицировать. Если вы захотите поменять что-то в логике запуска воркеров, вы прийдете и поменяете только один класс - Scheduler, при этом вы будете уверены, что вы никак не сломали логику создания воркеров, потому что эту работу выполняют совсем другие классы.
Потенциально у вас может быть множество поставщиков воркеров, работающих по разным правилам. Один поставщик может всегда возвращать один и тот же жестко закодированный воркер, второй создавать по воркеру на каждый xml-файл в какой-нибудь директории, третий создавать воркеры на основе таблицы в базе данных, четвертый получать список воркеров, которые надо создать, у удаленного сервиса и т.д. Более того, в процессе развития проекта у поставщика воркеров может меняться правило, по которому он создает воркеры (у вас это уже произошло - вместо xml-файлов у вас теперь таблица в бд.)
Если поставщику воркеров для выполнения его работы нужен доступ к бд, внедряйте Repository прямо в поставщик. Если потом это правило изменится, прийдете и поменяете только конкретный поставщик, не трогая другие поставщики и не трогая Scheduler
Вариант с фабрикой похуже, но тоже годится. Но если будете внедрять фабрику воркеров то Repository внедряйте уже в нее, а не в Scheduler
Фабрика хуже, потому что, когда количество воркеров вырастет, вы все равно будете вынуждены разнести создание воркеров разных типов по отдельным классам, иначе фабрика будет слишком большой и запутанной. В итоге вы все равно создадите несколько фабрик (что полность аналогично моему варианту со списком поставщиков воркеров, отличие только в названии, фабрика и поставщик в данном случае одно и то же).

“Тонкая блокировка” в хэш-таблицах

В чем суть "тонкой блокировки" в хэш-таблицах и как её реализовать?


Ответ

Суть в том, что с каждым входом (цепочкой синонимов хэш-функции) связывают свой mutex.
Реализация на Си тривиальна:
struct hash_entry { pthread_mutex_t mutex; struct hash_item *list; // если, например, используете односвязный список };
При создании таблицы
struct hash_entry table[HASH_SIZE];
устанавливаете table[i].list в NULL и вызываете pthread_mutex_init(&table[i].mutex, 0); (если нет особых требований к атрибутам мьютекса).

Update
После комментария от @VladD решил добавить немного рассуждений на тему параллельной работы с хэш-таблицей.
В принципе для действий, затрагивающих всю таблицу, можно добавить rwlock (см., например, man pthread_rwlock_init и др. man для pthread_rwlock...). Тогда функции, требующие "тонкой блокировки" будут вызывать
pthread_rwlock_t tablock; ... pthread_rwlock_rdlock(&tablock); // совместная блокировка таблицы int i = hash_func(key, keylen) % HASH_SIZE; pthread_mutex_lock(&table[i].mutex); // блокировка цепочки // действия с цепочкой синонимов ... pthread_mutex_unlock(&table[i].mutex); pthread_rwlock_unlock(&tablock);
а функции, которые затрагивают всю таблицу
pthread_rwlock_wrlock(&tablock); // монопольная блокировка таблицы // действия с таблицей ... pthread_rwlock_unlock(&tablock);
т.е. получаем схему писатель-читатели с вложенной монопольной блокировкой цепочек коллизий.
Однако, на мой взгляд, в большинстве случаев подобные схемы (и вообще "тонкая блокировка") не оправдывают возлагаемых на них надежд из-за накладных расходов на блокировку.
Реально, если не удается вообще уйти (а к этому всегда надо стремиться (KISS-принцип)) от многопоточной работы с таблицей, выгодней просто блокировать ее всю, независимо от вида операций, поскольку обычно цепочки синонимов короткие и большинство операций с элементами таблицы весьма быстрые.
Еще одним доводом в пользу такого подхода может быть тривиальная экономия памяти (размер объекта pthread_mutex_t 40 байт на 64-bit X_86), которая (как это ни странно, на первый взгляд) часто приводит к ускорению программы (поскольку доступ к памяти может быть раз в 100 медленней доступа к кэшу).
Если возникают сомнения по поводу времени работы самой хэш-функции от ключа (например, известно, что ключи на самом деле весьма длинные и используется какая-то изощренная схема хэширования), то ее вычисление можно проводить до блокировки таблицы (а вот вычисление самого индекса, конечно же, уже получив блокировку).

OpenGL Освещение

Проблема: некорректно работает освещение, выглядит так, будто источник света перемещается параллельно с вращением объекта. По идее источник света должен быть статичным. Объект может вращается вокруг своего центра с помощью мыши (и функции glRotated()). Код:
//Инициализация света, находится в методе initializeGL() //Часть параметров такие же как и стандартные GLfloat LightAmbient[]= { 0.5f, 0.5f, 0.5f, 1.0f }; GLfloat LightDiffuse[]= { 1.0f, 1.0f, 1.0f, 1.0f }; GLfloat LightSpecular[]= { 1.0f, 1.0f, 1.0f, 1.0f }; GLfloat LightPosition[]= { 10.0f, 10.0f, 10.0f, 1.0f }; glMatrixMode(GL_MODELVIEW); glLoadIdentity(); //Я предположил, что загрузка единичной матрицы мне поможет, но нет glLightfv(GL_LIGHT1, GL_POSITION, LightPosition); glLightfv(GL_LIGHT1, GL_AMBIENT, LightAmbient); glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse); glLightfv(GL_LIGHT1, GL_SPECULAR, LightSpecular); glEnable(GL_LIGHT1); //Источник света один
//Отрисовка фигуры void Canvas::drawAll() //Отрисовка всех фигур { names = 0; for(int i = 0; i < figures; i++) { glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslated(motionX, motionY, zoom); //motionX/Y вычисляются при перемещении курсора при нажатой ПКМ glRotated(rotationX, 1.0, 0.0, 0.0); //rotationX/Y также, только при ЛКМ glRotated(rotationY, 0.0, 1.0, 0.0); if(allFigures[i]->visible)draw(allFigures[i]); } }
Пишу на Qt5.3. Вот как это выглядит: ссылка


Ответ

Оказалось что это ответ:
Похоже на глючные нормали

Как возвратить несколько списков элементов, находящихся, в исходном списке, между двумя ключами, повторяющимися n раз?

Добрый вечер! Пусть есть список List, содержащий KeyValuePair, такой что:
List> _List = new List>() { new KeyValuePair("IGNORKEY1", "IGNORVALUE1"), new KeyValuePair("IGNORKEY1", "IGNORVALUE2"), new KeyValuePair("IGNORKEY1", "IGNORVALUE3"), new KeyValuePair("TRIGGERKEY", "TRIGGERVALUE"), new KeyValuePair("KEY1", "VALUE1"), new KeyValuePair("KEY2", "VALUE2"), new KeyValuePair("KEY2", "VALUE2"), new KeyValuePair("TRIGGERKEY", "TRIGGERVALUE"), new KeyValuePair("KEY3", "VALUE3"), new KeyValuePair("KEY3", "VALUE4"), new KeyValuePair("KEY4", "VALUE5"), new KeyValuePair("TRIGGERKEY", "TRIGGERVALUE"), new KeyValuePair("KEY5", "VALUE6"), new KeyValuePair("KEY6", "VALUE7"), //... };
Значений в _List довольно много.
Только в начале списка есть значения >2 до первой пары ("TRIGGERKEY", "TRIGGERVALUE"), которые нужно игнорировать.
Пара ("TRIGGERKEY", "TRIGGERVALUE") всегда находится перед обычной группой значений.
Между двумя соседними парами ("TRIGGERKEY", "TRIGGERVALUE") всегда есть >2 значений.
Собственно, вопрос в том, какое хорошее решение можно подобрать, для извлечения списка пар, начиная от пары ("TRIGGERKEY", "TRIGGERVALUE"), и до следующей пары ("TRIGGERKEY", "TRIGGERVALUE"), либо конца списка?
Я использовал грубо цикл, успешно, пытался применить linq выражения, но безуспешно.
Заранее огромное спасибо!


Ответ

var trimmed = _List.SkipWhile(el => !(el.Key == "TRIGGERKEY" && el.Value == "TRIGGERVALUE")); int groupIndex = 0;
var groups = trimmed.GroupBy(el => { if (el.Key == "TRIGGERKEY" && el.Value == "TRIGGERVALUE") { groupIndex++; } return groupIndex; });
var result = groups.Select(g => g.Skip(1).ToList()).ToList();
но в этом решение целиком опирается на особенности текущей реализации GroupBy. Поэтому просто цикл - лучше.
Если задача встречается часто, и не хочется копипастить цикл, то лучше написать метод расширения вида
public static class ListExtensions { public static IEnumerable> SplitBy(this IEnumerable source, Func shouldSplit) { List chunk = new List();
foreach (T item in source) { if (shouldSplit(item)) { yield return chunk; chunk = new List(); } else { chunk.Add(item); } }
if (chunk.Count > 0) { yield return chunk; } } }
и вызывать его повсюду как
var result2 = _List.SplitBy(el => el.Key == "TRIGGERKEY" && el.Value == "TRIGGERVALUE") .Skip(1).ToList();

Запрет листинга корневого каталога при подключении SFTP (SSH File Transfer)

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


Ответ

в openssh, начиная с версии 4.9, добавлена возможность делать chroot для пользователей.
для этого нужно в конец конфигурационного файла sshd (обычно /etc/ssh/sshd_config) добавить такие строки (здесь подразумевается, что домашние каталоги располагаются в каталоге /home):
match group sftponly chrootdirectory /home/%u forcecommand internal-sftp
заодно убедитесь, что в этом файле присутствует строка, начинающаяся с subsystem sftp. если есть, но закомментирована — раскомментируйте. если же совсем отсутствует что-либо подобное, вставьте (выше строки, начинающейся с match) такую строку:
subsystem sftp internal-sftp
после этого надо проверить корректность внесённых изменений:
$ sudo /usr/sbin/sshd -t
если проверка успешна, перезапустите sshd. обычно так:
$ sudo service ssh restart
затем нужно создать группу (вообще имя произвольное, можно использовать и другое, не забыв подправить его в вышеуказанном файле):
$ sudo groupadd sftponly
затем нужного пользователя(-ей) нужно добавить в эту группу. в debian и основанных на нём дистрибутивах (и ещё многих, не основанных) есть удобная программа adduser
$ sudo adduser <имя пользователя> sftponly
в тех дистрибутивах, где нет такой программы, можно сделать примерно так:
$ sudo useradd -a -G sftponly <имя пользователя>
и, наконец, нужно сделать root-а владельцем домашнего каталога выбранного пользователя(-ей) и запретить другим возможность записи в этот каталог:
$ sudo chown root:root /home/<имя пользователя> $ sudo chmod go-w /home/<имя пользователя>

дополнение по поводу домашнего каталога в директиве chrootdirectory
если домашний каталог пользователя находится не в /home, имеет смысл в этой директиве использовать полный путь к домашнему каталогу с помощью %h
chrootdirectory %h

Прозрачность в navigationBar

Каким образом можно сделать прозрачность у Navigation Bar, как на картинке?

update:






Ответ

Работает на api >= 19
Тема:

Теперь мы можем указывать paddingBottom для ListView вместе с android:clipToPadding="false", иначе список будет перекрываться Navigation Barом. В обще это применительно ко всем элементам. Для корневых элементов активности я указываю paddingBottom с отрицательным значением = -navigationBarHeight, потом для дочерних делаю обратный отступ как в примере ниже.
Пример:

android:clipToPadding="false" - не обрезать элементы, выходящие за пределы размеров элемента.
update:

Стили:


28dp -28dp 72dp -72dp

Разметка главной (Toolbar заменяет ActionBar)











Как использовать Toolbar вместо ActionBar, наследуемся (начиная c 22.1) с android.support.v7.app.AppCompatActivity:
Toolbar app_bar = (Toolbar) findViewById(R.id.app_bar); setSupportActionBar(app_bar);
В общем это на изучения с конкретным работающим примером. Ссылку на google play выложить не могу, только завершается разработка версии 1.0.

Как создать ассерт времени компиляции(аналог static_assert) в C?

В некоторых ситуациях для облегчения обнаружения и исправления ошибок в программе может потребоваться сделать несколько утверждений об истинности/ложности какого-то выражения, не только во время выполнения, но и во время компиляции.
В С++ для этого применяется static_assert.
Примеры:
Утверждение о версии подключенной библиотеки:
#include "SomeLibrary.h"
static_assert(SomeLibrary::Version > 2, "Старые версии SomeLibrary не поддерживаются, используйте новые.");
Утверждение о количестве бит в unsigned int:
static_assert(sizeof(unsigned int) * CHAR_BIT == 32, "Компиляция на неподдерживаемой платформе");
Как создавать подобные утверждения в обычном C, где есть только ассерты времени выполнения в виде макроса из assert.h?


Ответ

Для этого можно использовать любую ошибку компиляции, например структуры с битовыми полями отрицательного размера:
#define CT_ASSERT_NULL(x) ((void *)sizeof(struct { int:-!!(x); })) #define CT_ASSERT_ZERO(x) sizeof(struct { int: -!!(x); })) #define CT_ERROR sizeof(struct { int: -1;});
Кроме того такая функция добавлена, начиная со стандарта C11 и в gcc-4.6 теперь можно делать так:
_Static_assert( sizeof(int) == sizeof(long int), "Error!");

Реализация condition variables

Подскажите правильную реализацию condition variables. Реализовал на WaitForMultipleObjects() и PulseEvent() , и получил баг, когда поток не просыпался, оказалось это проблема в PulseEvent(). Подскажите правильную реализацию в которой поток будет точно просыпаться и работать как надо.


Ответ

Начиная с Vista, WinAPI содержит синхронизационные примитивы наподобие CONDITION_VARIABLE, которые делают именно то, что вам нужно.
Вот пример использования (из официальной документации):
CONDITION_VARIABLE cv; CRITICAL_SECTION lock;
InitializeConditionVariable (&cv); InitializeCriticalSection (&lock);
... // ожидание EnterCriticalSection(&lock); while (!(условие)) // защищаемся от spurious wakeup SleepConditionVariableCS(&cv, &lock, INFINITE);
// работать с данными можно только внутри критической секции // и при выполнении условия работаем_с_данными();
LeaveCriticalSection(&lock);

Парсинг html с помощью Jsoup

Есть html строка:

DSC_0320_1


Нужно получить адрес изображения:http://www.postfactum.ks.ua/wp-content/uploads/2015/06/DSC_0320_1-300x163.jpg. Пытаюсь парсить:
Document doc = Jsoup.parse(image_url);
if (doc.select("img[src]").size() > 0) { Element image = doc.select("img[src]").get(0); } else { image_url = "null"; }
Ошибок нету, но строка пуста. В чем может быть проблема?


Ответ

Во-первых вам нужно использовать метод first() или last() в зависимости от порядка елемента. В вашем случае нужно использовать метод first(). Element image = doc.select("img[src]").first();. Во-вторых вы не указали атрибут "src": image_url = image.attr("src");. Полный код:
Document doc = Jsoup.parse(mage_url); if (doc.select("img[src]").size() > 0) { Element image = doc.select("img[src]").first(); image_url = image.attr("src"); } else { image_url = "null"; }

WPF Interactions CallMethodAction для DataTemplate в ListCheckBox ругается на входные параметры метода во ViewModel

Пытаюсь воспользоваться механизмом поведения, однако не могу правильно прописать аргументы в методе во ViewModel. Использую ListBox состоящий из item включающих в себя CheckBox, собственно перепробовал разные комбинации входных параметров метода, но никак не могу получить объект Item из ListBox при снятии галочки у CheckBox
XAML

C#
public void PropertyUnchecked() { MessageBox.Show("Unchecked"); }
в итоге получаю ошибку:
Thrown: "Could not find method named 'PropertyChecked' on object of type 'CheckedListItem 1' that matches the expected signature."(System.ArgumentException) Exception Message = "Could not find method named 'PropertyChecked' on object of type 'CheckedListItem`1' that matches the expected signature.", Exception Type = "System.ArgumentException", Exception WinRT Data = null
Исходя из сообщения, я посчитал, что метод в коде ViewModel не имеет нужных входных параметров (CheckedListItem именно такие итемы хранятся в ListBox), начал экспериментировать:
[1]
public void PropertyUnchecked(CheckedListItemtr, object sender, RoutedEventArgs e) { MessageBox.Show("Unchecked"); }
[2]
public void PropertyUnchecked(object sender, RoutedEventArgs e) { MessageBox.Show("Unchecked"); }
[3]
public void PropertyUnchecked(object sender) { MessageBox.Show("Unchecked"); }
Также поэкспериментировал с разметкой:

С такой разметкой заработал пустой C# метод, а также [2] и [3], однако ничего кроме CheckBox и его свойств как элемента (в sender) мне не пришло, но нужен именно Item в котором сидит объект типа CheckedListItem . Нашел как реализовать нечто подобное командами с параметрами, но мне нужен именно вызов метода, и обойтись без команд.


Ответ

Я получил ответ на свой вопрос, звучит он так: This is probably what you're looking for:
public void PropertyUnchecked(object sender, RoutedEventArgs e) { var item = ((ContentPresenter)((CheckBox)e.Source).TemplatedParent).Content as CheckedListItem; }
Собственно сам вопрос и ответы доступны по ссылке: Вопрос и ответ

Как показать N последних тегов (меток)?

У меня есть репозиторий, в котором достаточно много меток. Я хотел бы увидеть только несколько последних. Если я использую обычную команду, то получаю полный список меток, и он отсортирован в порядке, обратном тому, который мне нужен.
git tag
v1.0.0 v1.1.0 v2.0.0 v2.0.0RC1 v2.0.0RC2 v2.0.0RC3 v2.0.1 v2.1.0 v2.1.0RC1 v2.1.0RC2
Что я хочу:
git magic
v2.1.0RC2 v2.1.0RC1 v2.1.0
Как я могу получить список из N последних меток, отсортированных в нужном мне порядке?

Для будущей пометки связанных вопросов на разных языках: https://stackoverflow.com/questions/30805098/how-to-display-last-n-tags-in-git


Ответ

С помощью git tag --sort (Git v 2.0.0+ )
Обратите внимание, я использую знак минуса -, чтобы инвертировать порядок сортировки (по умолчанию используется от более старых к новым).
UNIX, Linux, OS X: утилита head
git tag --sort=-version:refname | head -n
Windows, UNIX-way
Установите Cygwin Используйте ответ для UNIX
Windows, команда Select
git tag --sort=-version:refname | Select -First
С помощью git describe
git describe --tags $(git rev-list --tags --max-count=)
(Это перевод собственного ответа. Вариант с describe предложен @hsirah.)

Различное отображение rgba у border-color и backgroud

Устанавливаю одно и то же значение rgba(0,0,0,.1) для border-color и background. Получается так, что граница немного темнее фона. Почему так происходит, и можно ли это как-нибудь отключить?
Пример на input'e:
input[type="text"], input[type="password"] { float: left; margin: 0; outline: none; padding: 0 9px; height: 28px; background: rgba(0,0,0,.1); border: 1px solid rgba(0,0,0,.1); border-radius: 3px; line-height: 30px; }
Мне надо, чтобы обводка была темнее, поэтому сделал их одинаковыми. Везде ли так будет?


Ответ

Так происходит, потому-что фон "заползает" под border.
И видно этот эффект, потому-что цвет бордера у вас с прозрачностью, происходит накладывание цветов, поэтому бордер становится чуть темнее.
Это стандартное поведение, если вам необходимо его изменить, то почитайте про свойство background-clip : http://htmlbook.ru/css/background-clip

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

В результате нужно получить индексы ячеек массива с максимальными значениями.
Например, для массива arr[4, 50, 11, 20] это будут 1 и 3 (arr[1], arr[3]) - индексы максимальных значений.


Ответ

Ну, почему бы не пробежаться по массиву и держать текущие k наибольших значений?
Вот вам псевдокод:
list maximalK = empty // инвариант: maximalK содержит отсортированный список наибольших // k из всех просмотренных элементов foreach e in sourceList p = position of e in maximalK // (binary search) if (p >= k) continue insert e into maximalK at position p if maximalK.size > k remove last from maximalK
Заметьте, что при k == sourceList.size вы получаете просто алгоритм сортировки (бинарными) вставками.
Временная сложность: O(n * k) (n — размер списка), за счёт сдвига при вставке. (Используя sorted map для maximalK, можно уменьшить до O(n * log k).)

Дружественная функция из другого класса

Не могу разобраться, как прописать классу дружественную функцию из другого класса. Проблема в том, что классы написаны в разных файлах. Вот код:
// файл Complex.h #include "Float.h" class Complex { private: Float Re, Im; public: Complex(Float re, Float im); void readFloat(Float); }; // файл Complex.cpp #include "Complex.h" #include using namespace std; void Complex::readFloat(Float) { cout << "Чтение из дружественной функции: " << Re.Num; } // файл Float.h class Float { private: float Num; public: Float(float num); friend void Complex::readFloat(Float); };


Ответ

Не получается потому, что для объявления дружественного метода требуется полное определение Complex, ведь вы обращаетесь к его члену.
Самый простой вариант - сделать другом не метод, а весь класс Complex
// файл Float.h class Float { private: float Num; public: Float(float num); friend class Complex; };
Если, всеж таки, необходим именно дружественный метод, тогда нужно обеспечить чтобы полное определение Complex гарантированно происходило до определения Float. Это можно сделать, применив технику с предварительным объявлением (forward declaration) Float в файле Complex.h:
// файл Complex.h // #include "Float.h" // этот инклюд нужно убрать
class Float; // предварительное объявление
class Complex { private: Float * Re; Float * Im;
public: Complex(Float & re, Float & im); ~Complex();
void readFloat(Float &); };
// файл Complex.cpp #include
#include "Complex.h" #include "Float.h" // а здесь он нужен
void Complex::readFloat(Float&) { std::cout << "Чтение из дружественной функции: " << Re.Num; }
// файл Float.h #include "Complex.h" // мы обращаемся к членам Complex // поэтому он должен быть объявлен заранее class Float { private: float Num; public: Float(float num); friend void Complex::readFloat(Float&); };
Техника работает следующим образом. Так как в файле Complex.h используются только указатели и ссылки на Float компилятору для вычисления размеров этих переменных и полей не требуется полное определение класса Float. Ведь размер указателей и ссылок фиксированный и заранее известен, вне зависимости от того, на что они указывают или ссылаются. Компилятору нужно только намекнуть что понимается под именем Float то есть что он класс, а не структура например. Компилятор не может работать с неизвестными именами. Из-за этой тонкости, можно убрать #include "Float.h" из файла Complex.h. Однако, когда мы обращаемся к членам Float необходимо его полное определение, поэтому в файле Complex.cpp обязательно наличие #include "Float.h". После всего этого можно безопасно добавлять #include "Complex.h" в файле Float.h.
В результате всех этих манипуляций получается, что класс Complex всегда определен до Float, хотя объявлен Float раньше Complex. Ну и в итоге, как вы помните, строгий порядок определений классов позволяет нам законно объявить дружественным метод Complex::readFloat.

Как узнать используемую память

Как можно узнать сколько памяти занимает выполнение программы или класса в Intellij Idea?


Ответ

Есть такой инструмент как jmap, выводящий гистограмму с показателями сколько памяти занимают объекты и т.п.

Также, утилиту jstat можно использовать для сбора самых разнообразных статистических данных. Статистика jstat сортируется в "свойства", указанные первым параметром командной строки. Чтобы увидеть список свойств, нужно запустить jstat с параметром -options. В документации утилиты в JDK говорится, что именно показывает каждое из свойств, но большинство из них используется для сбора информации о работе сборщика мусора или его компонентов. Свойство -class показывает загруженные и выгруженные классы (что делает утилиту полезной для обнаружения утечек ClassLoader в пределах сервера приложений или вашего кода), а -compiler и -printcompilation предоставляют сведения о JIT-компиляторе Hotspot. По умолчанию jstat отображает информацию по состоянию на момент обращения. Если нужны регулярные снимки текущего состояния, укажите после -свойств интервалы в миллисекундах. jstat будет постоянно отображать снимки текущего состояния контролируемого процесса. Если нужно, чтобы jstat сделал лишь определенное количество снимков, укажите его за значением интервала/периода.

Не получается сделать правильный массив целых чисел и чисел с десятичными дробями

Всем привет. Вопрос по регулярным выражениям - есть строка
1 × 360.000 руб.
Я пробую из нее вытащить массив:
var quantity = $(".quantity").text().match(/\d+\.\d+/g)
получаю массив ["360.000"] делаю вот так
var quantity = $(".quantity").text().match(/\d+/g) match(/\d+/g)
Я получаю: ["1", "360", "000"]
Мне нужно получить ["1", "360.000"]
Что я делаю не правильно?


Ответ

Необходимо поправить выражение вот так:
var quantity = $(".quantity").text().match(/\d+(?:\.\d+)?/g)
Объяснение:
\d+ - 1 или более цифр (?:\.\d+)? - Необязательная группа, которая находит
\. - точку \d+ - 1 или более цифр
Если необходимо, можно добавить знаки + или -, но мне кажется, что это в Вашем случае не нужно.
А вот как это выражение выглядит на рисунке:

Демо на Debuggex
В сети есть множество сервисов для расшифровки и отладки регулярных выражений, например вышеупомянутый Debuggex и Regex101
Пример кода:
var quantity = $(".quantity").text().match(/\d+(?:\.\d+)?/g) console.log(quantity);

1 × 360.000 руб.

Результат:
["1", "360.000"]

Добавление кода в нативные функции

Как можно добавить немного своего кода в функцию (не свою, а [native code]).
Пример кода:
Math.__defineGetter__('pow', function() { console.log( 'USE: Math.pow' ); return function() { return 100500; }; });
То есть при вызове Math.pow(1,2); в консоль пишется 'USE: Math.pow' и возвращается 100500
Надо сделать так, чтобы функция писала в консоль и продолжала свою "правильную" работу.
Я пишу "юзерскрипт" и хочу знать какие методы использует сайт. Не все, конечно, а, например, только из Math
for (var i in Math ) { eval('Math.__defineGetter__( "' + i + '", function() { console.log( "USE Math.' + i + '" ); return 1; });'); }
Сейчас я могу это узнать, в консоль всё пишет, но функции не работают и вызывают ошибки.


Ответ

Простой пример с Math.pow() для демонстрации идеи:
var savedPow = Math.pow; Math.pow = function(number, exp) { console.log('USE: Math.pow'); return savedPow(number, exp); }; console.log(Math.pow(10, 3));

Как SomeInstance.ToString() всегда возвращает правильное название класса?

Собственно вопрос: как и почему автоматически перегружается виртуальный метод базового класса System.Object ToString(), если мы его явно ни как не трогаем?
В данной технике используется АОП?
Пример кода:
using System;
class A { class B { public void D() { Console.WriteLine(base.ToString()); } } static void Main() { B b = new B(); Console.WriteLine(b.ToString()); } }


Ответ

Проще всего посмотреть имплементацию через Рефлектор или ILSpy. Или на reference source
class object { // ... public virtual string ToString() { return this.GetType().ToString(); } // ... }
Компилятор мог бы применить свою компиляторную магию, но тут она не понадобилась. Метод GetType() возвращает настоящий, runtime-тип объекта, а уж тип знает, как он называется.

Firefox Bookmarks Reference (JSON)

Хочу отпарсить JSON с сохраненными закладками из Firefox, но там очень много параметров, о назначении которых можно только догадываться (в частности, типы папок). А я хочу сделать нормальный импорт закладок из FF в свой софт (не костыльный, а в соответствии с документацией, которую я, к сожалению, на нашел).
Есть ли вообще такое? Или может кто разбирался в этом вопросе и написал свою инструкцию? :)
P.S. На https://developer.mozilla.org/ не нашел. Есть некоторые похожие вопросы, но по сути не то: https://stackoverflow.com/questions/904522/output-firefox-json-data


Ответ

Firefox хранит закладки, историю загрузок и посещений в базе данных SQLite, в файле places.sqlite, который находится в папке %APPDATA%\Mozilla\Firefox\Profiles\[RANDOM.PROFILENAME]
В своей программе Вы можете открыть эту базу и прочесть любые интересующие данные (в том числе и перевести их в формат JSON). Есть небольшое разъяснение по структуре тут: http://kb.mozillazine.org/Places.sqlite и тут: https://developer.mozilla.org/en-US/docs/Mozilla/Tech/Places/Database
Схема для лучшего ознакомления:

При создании профиля, создаётся папка с случайным набором символов, отделяющий себя точкой, в начале названия профиля: [RANDOM.PROFILENAME]. Чтобы узнать полный путь к профилю, Вам понадобиться ещё прочитать INI файл profiles.ini который находится в папке %APPDATA%\Mozilla\Firefox\Profiles
В файле profiles.ini несколько параметров:
[Profile0] Name=default IsRelative=1 Path=Profiles/s0ddpsc9.default Default=1
Вас интересует именно ключ Path, который указывает на полный путь к конкретному профилю.
В Firefox есть ещё возможность сделать резервную копию вручную, в окне закладок, пункт: Import and Backup > Restore... на выходе вы получите готовый JSON файл.

Сосчитать определенное количество элементов в группе

Есть матрица клеток определенного размера. Клетка имеет два состояния: занято и пусто. Нужно сосчитать количество групп клеток и количество клеток в каждой группе. Группой считаются рядом стоящие клетки, но не по диагонали.

На рисунке 4 группы: в 1-ой группе 6 клеток, в остальных - по одной.
Пытался делать сначала функцию для проверки только одной группы. Если группа найдена, то считаем кол-во клеток в ней и для этих клеток делаем состояние - пусто, чтобы при следующей проверке эта группа уже "не мешалась". Основная проблема возникла, конечно же, в условии нахождения группы. Пытался сделать что-то такое, но потом понял, что это бред, плюс за границы массива вываливаемся. Как можно реализовать эту проверку?
public int getNumberCells(final Cell cellOccupied) { int numberRows = field.getNumberRows(); int numberColumns = field.getNumberColumns(); int count = 0;
for (int i = 0; i < numberRows; i++) { for (int j = 0; j < numberColumns; j++) { if (field.getCell(i, j) == field.getCell(i, j + 1) && field.getCell(i, j) == cellOccupied) { count++; }
if (field.getCell(i, j) == field.getCell(i + 1, j) && field.getCell(i, j) == cellOccupied) { count++; } } } return count; }


Ответ

Для поиска групп используем классический алгоритм заливки
public class Test {
static final int columns = 8; static final int rows = 3;
static int[][] matrix = { { 0,0,1,1,1,0,1,0 }, { 0,1,1,0,0,0,0,1 }, { 0,1,0,0,0,0,1,0 } };
static int floodFill(int row, int col) { if (row < 0 || col < 0 || col >= columns || row >= rows) return 0; if (matrix[row][col] != 1) return 0; matrix[row][col] = 2; return 1 + floodFill(row + 1, col) + floodFill(row - 1, col) + floodFill(row, col + 1) + floodFill(row, col - 1); }
public static void main(String []args) { int count = 0;
for (int row = 0; row < rows; row++) { for (int col = 0; col < columns; col++) { if (matrix[row][col] == 1) { count++; System.out.println(floodFill(row, col)); } } } System.out.println(count); } }
Update: добавил подсчёт количества элементов в группе.

Как проверить, является ли выбранный элемент последним элементом в списке?

Как проверить, является ли выбранный элемент с классом one последним элементом с классом one?
HTML:

1 2
3 4
5 6
7 8

JS:
$(document).on('click', '.one', function() { if ($(this) == $('.one:last')) {//нужно подправить console.log("yes") } })


Ответ

Для этого можно использовать .is()
$(document).on('click', '.one', function() { if ($(this).is('.one:last')) { console.log("yes"); } });

1 2
3 4
5 6
7 8

Если элементы с классом .one являются статичными на странице, то несколько лучше (в плане быстродействия) будет использовать такой вариант:
$(document).ready(function() { var $elements = $('.one'); var lastElement = $elements[$elements.length - 1]; $elements.on('click', function() { if (this == lastElement) { console.log("yes"); } }); });
1 2
3 4
5 6
7 8

Почему не работает код php?

Учусь только программировать на PHP. Когда просто перехожу на главною странице(пример сайт.ru), то оно пишет что это главная, а если переходишь на сайт.ru/index или сайт.ru/photo то просто выбивает ошибка 404..делаю по примеру видео-урока, там все в парня работает.
if (!empty($Module)) { $Param = array(); for ($i = 0; $i < count($URL_Parts); $i++) { $Param[$URL_Parts[$i]] = $URL_Parts[++$i]; } } }
if ($Page == 'index') echo 'Главная'; else if ($Page == 'photo') echo 'photo';
?>
Файл htaccess
RewriteEngine on RewriteBase / Options All -Indexes RewriteCond %{REQUEST_FILENAME} -s [OR] RewriteCond %{REQUEST_FILENAME} -l [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^resource/(.*)$ resource/$1 [L] RewriteRule ^.*$ [NC,L] RewriteRule ^.*$ index.php [NC,L]


Ответ

Данный код работает. Проблемы которые могли возникнуть
не работает mod_rewrite в apache. О то что это и как его настроить подробно описано здесь Apache не видит файла .htaccess. Ну тут уже крайне много вариантов - поэтому в гугл за помощью

Как вызвать функцию после отрисовки ng-repeat?

Здравствуйте. Пишу одностраничное приложение на angularjs, где по клику по ссылке с помощью ajax получаю данные с сервера. Полученные данные выводятся с помощью ng-repeat. Проблема в том, что я использую скрипты для подсветки кода в html и для того, чтобы эта подсветка появилась, необходимо вызвать функцию, которая и обновляет эти стили.
Например, у меня есть

code
После полной загрузки страницы вызывается $("pre.java").snippet("java"), но если попробовать вызвать ее после получения ответа по ajax, то она вызывается именно после получения, а не отрисовки на странице. Моя директива:
app.directive("file", function() { return { restrict : "E", scope : true, controller : function($scope, $element) { $scope.fileName = $scope.file.fileName; $scope.fileContent = $scope.file.content; },
link : function(scope, el, attr) { scope.fileName = scope.fileName; scope.fileContent = scope.fileContent; }, template : "

name: {{fileName}}

content: {{fileContent}}
" } });
Пробовал вызывать по условию $last. Функция отрабатывает, добавляет свои классы в блоку
, но после этого не происходит замена fileContent. Возможно кто-то сталкивался с подобной задачей?
    


Ответ

Примерно следующее должно Вам помочь:
Директива:
app.directive('onFinishRender', function ($timeout) { return { restrict: 'A', link: function (scope, element, attr) { if (scope.$last === true) { $timeout(function () { scope.$emit('ngRepeatFinished'); }); } } } });
HTML

{{item.name}}}

Если необходимо получить доступ к событию из контроллера:
$scope.$on('ngRepeatFinished', function(ngRepeatFinishedEvent) { //... });

android studio как сменить эмулятор

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


Ответ

Run -> Edit Configuration -> Вкладка: General -> Секция: Target Device -> отметить "Show chooser dialog" - показать диалог выбора устройства для запуска приложения.
либо
Run -> Edit Configuration -> Вкладка: General -> Секция: Target Device -> отметить "Emulator" и в выпадающем списке ниже выбрать другой эмулятор из имеющихся. Будет запускаться на выбранном эмуляторе.
Короткий путь: В тулбаре студии (значки с действиями сверху) кнопка со значком андроида и названием программы, левее зеленого треугольника запуска приложения. Нажать на нее - в выпавшем меню будет пункт "Edit configuration" - дальше так же, как выше.

Почему меняется атрибут в конструкторе экземпляра класса?

Здравствуйте, пытаюсь разбираться с ООП в python, и возник такой вопрос: я создаю 2 экземпляра класса ListAdder. Сразу после создания первого объекта я меняю ему атрибут x.data и затем создаю второй объект этого же класса, но при этом атрибут y.data - уже не пустой список, который инициализируется в конструкторе, а такой же, как и x.data. Почему так происходит? Разве каждый новый объект не должен создаваться с атрибутом self.data, равным пустому списку?
class ListAdder: def __init__(self, start=[]): self.data = start
def add(self, other): self.data.extend(other) return self.data
if __name__ == '__main__': x = ListAdder() x.add([1, 2]) print(x.data) y = ListAdder() print(y.data)
>>> [1, 2] >>> [1, 2]


Ответ

Потому что значения по-умолчанию параметров функции или метода создаются не каждый раз при вызове этой функции/метода, а единожды в момент из создания. Смотрите, когда создается класс ListAdder, создаются так же и его методы, и тогда создается объект-пустой список, и указывается, что он является значением по-умолчанию для параметра start метода __init__, причем этот один и тот же объект будет значением по-умолчанию для всех вызовов этой функции.
Когда объект неизменяемый, как, например, число или кортеж, это проблемы не вызывает, но когда он изменяемый, то любые изменения, сделанные в этом объекте, в одном из вызовов функции, отражаются на остальных вызовах.
Вот более простой и наглядный пример, показывающий суть проблемы:
>>> def test(l=[]): ... print('id:', id(l)) ... l.append(1) ... return l ... >>> test() id: 139654229177416 [1] >>> test() id: 139654229177416 [1, 1] >>> test() id: 139654229177416 [1, 1, 1]
Функция id возвращает уникальный идентификатор объекта, и тут мы можем видеть, что при каждом вызове test, l ссылается на один и тот же список, что и подтверждается возвращаемым значением функции: при каждом вызове список l увеличивается на один элемент.
Чтоб избежать этой проблемы, нужно создавать изменяемый объект при каждом вызове самостоятельно. Классическим способом это сделать является установка значения по-умолчанию в None с последующей проверкой на то, было ли передано какое-то иное значение, или нет, и в последнем случае, создание нужного объекта (пустого списка в вашем случае).
class ListAdder: def __init__(self, start=None): if start is None: # Здесь каждый раз, когда start задан по умолчанию, # мы создаем новый экземпляр пустого списка, и # присваиваем его переменной start start = [] # Теперь все последующие изменения списка start не # затронут остальные вызовы метода. self.data = start
...

В git status одни и те же файлы в разных секциях

Здесь что-то пошло не так или я что-то не понимаю?
C:\Users\paul\Workspace\someproject>git status # On branch master # Your branch is ahead of 'origin/master' by 57 commits. # (use "git push" to publish your local commits) # # Changes to be committed: # (use "git reset HEAD ..." to unstage) # # new file: common/models/SmsQueue.php # new file: console/components/Sms/Factory.php # new file: console/components/Sms/Gateway.php # new file: console/controllers/SmsQueueController.php # # Changes not staged for commit: # (use "git add ..." to update what will be committed) # (use "git checkout -- ..." to discard changes in working directory) # # modified: common/models/SmsQueue.php # modified: console/components/Sms/Factory.php # modified: console/components/Sms/Gateway.php # modified: console/config/params.php # modified: console/controllers/SmsQueueController.php #
Версия Git:
C:\Users\paul\Workspace\someproject>git --version git version 1.8.3.msysgit.0
Как одни и те же файлы могут быть одновременно и "Changes to be committed", и "Changes not staged for commit"?


Ответ

Значит файлы были исправлены после того, как они были добавлены в stage. Никакого бага здесь нет. После любого изменения нужно помещать файл в stage, иначе это изменение не попадёт в ближайший commit.

Обращение к объекту, как к массиву

Есть ли простой способ обратиться к ключу объекта по его индексу? Может в Underscore есть магические методы?
Вопрос возник на фоне такой задачи. Есть объект:
plane: { 432: { columns: { 543: { name: 'lolo' }, 984: { name: 'lala' }, ... } }, ... }
Где среди n-го количества plane, и n-го количества column нужно выбрать первый plane и первый column внутри него.
Как сделать это проще всего?


Ответ

Хотя ES6 обеспечивает определённый порядок ключей при обходе, гораздо правильнее и удобнее использовать массив, положив тот ключ внутрь объекта, например, в поле id.

Но если уж очень хочется, то можно сделать так (как-нибудь сократив название):
Object.prototype.getByKeyIndex = function (i) { var key = Object.keys(this)[i]; return key && this[key]; }
Тогда на объекте из вопроса будет такое:
plane.getByKeyIndex(0).columns.getByKeyIndex(1).name // "lala"
Вроде, более-менее нормально выглядит.

Ключ сохраняется в переменную и проверяется, чтобы в таком варианте получилось undefined:
({ undefined: 42 }).getByKeyIndex(256)

Я новичок и хочу у Вас спросить - хорошо ли изменять прототип нативных объектов? Что будет если я добавлю метод, а после кто-то другой тоже Ваш ответ увидит и решит добавить свой, но с таким же методом?
В большинстве случаев изменять прототип Object'а не очень хорошо. Но для защиты от прототипных свойств принято фильтровать for-in через hasOwnProperty. Другой вариант - добавлять в прототип не так, как это сделал я, а через скрытое свойство, чтобы оно не перебиралось.
Если двое добавили одинаковое свойство, то одно из них перезапишет другое. По идее, последнее добавленное должно перезаписать предыдущее, но можно пошаманить с readonly, чтобы осталось более раннее. В любом случае, такая ситуация заведомо плохая и лучше в неё не попадать.
Если двое добавят одну и ту же функцию под разными именами, то будет две функции. Тут вроде всё очевидно и вопросов вызывать не должно.
Что касается того, стоит ли изменять прототип. Если это изменение упростит половину кода, то, на мой взгляд, это оправдано. Если же это делается ради одной функции, то, скорее всего, нет. Для любых глобальных изменений стоит проявлять разумность и осторожность.

Пропуск повторов элементов последовательности

Есть ли в LINQ предложение или метод, который бы не выводил повторы элементов последовательности. Например, для последовательности 1, 2, 1, 3, 1, 4, 1, 5, 1, 6 предложение или метод должен определить, что 1 повторяется несколько раз, и выбрать его один раз.
Main.cs
using System; //добавить ссылку using System.Linq;
class Program { public static int Main() { //источник данных int[] ara = new int[] { 1, 2, 1, 3, 1, 4, 1, 5, 1, 6 }; //создание запроса var query = from val in ara //??? select val; //выполнение запроса foreach (var i in ara) { Console.Write("{0} ", i); } Console.WriteLine(); Console.ReadKey(); return 0; } }
Результат должен быть таким: 1 2 3 4 5 6


Ответ

Просто вызвать Distinct(). Ну или извратиться с группировкой :D
http://ideone.com/9xN5RX
using System; using System.Linq;
public class Test { public static void Main() { int[] a = new int[] {1, 2, 1, 3, 1, 4, 1, 5, 1, 6}; var b = from x in a group x by x into t select t.Key; var c = a.Distinct(); Console.WriteLine(String.Join(" ", b)); Console.WriteLine(String.Join(" ", c)); } }

Система тестирования 2. Как правильней спроектировать БД?

В продолжение этого вопроса
Имеется примерно такая структура БД:
Таблица Тест хранит в себе номер вопроса и три ответа к нему.
Таблица Answer - правильный ответ к вопросу.
Интересует, собственно, таблица Тест. Она не расширяема, как видите. Чтобы создать новый тест - нужно создавать новую таблицу, чтобы добавить ещё несколько вариантов ответа - нужно создавать новые столбцы.
Как сделать правильно? Спасибо.


Ответ

Вот хорошее расширяемое решение:
[question] id text qtype
[answer] id text isright question_id order
[user_answer] id user_id question_id answer_id text
Пример данных:
[question] id text qtype 1 "Сколько лун на небе?" 1 2 "Столица Франции?" 1
[answer] id text isright question_id order 1 "Одна" 1 1 1 2 "Две" 0 1 2 3 "Три" 0 1 3 4 "Париж" 1 2 1 5 "Лондон" 0 2 2 6 "Нью-Йорк" 0 2 3
[user_answer] id user_id question_id answer_id text 1 1 1 1 "" 2 1 2 2 ""

Как объединить 60000 файлов в один файл?

В директории есть порядка 60000 текстовых файлов, их надо объединить в один файл.
Команда:
cat * > all.txt
не срабатывает:
-bash: /bin/cat: Argument list too long
Попробовал через:
find ./ -name '*.txt' | xargs grep '' > ../all.txt
но столкнулся с тем, что в all.txt записывается и путь, и название файла:
.//file1.txt:row1 .//file1.txt:row2 ...
Какие еще могут быть варианты?


Ответ

touch ../all.txt find ./ -name "*.txt" | xargs cat >> ../all.txt
То есть cat каждого файла по отдельности, а не сразу всех в одной команде cat.

Проблема с подключением VPN (pptp)

Связался с Линуксом пару недель назад, так что, возможно, чего-то еще не знаю. Ситуация такая: на виртуальной машине, Centos 7, не устанавливается VPN соединение через pptp. По логам что-то смог понять/исправить, что-то - нет. Ниже представлены сделанные мной настройки и логи:
chap-secrets
# client server secret IP addresses mylogin * mypassword *
/etc/ppp/peers/myvpn
pty "pptp vpn.campus.kharkov.ua --nolaunchpppd --debug" user mylogin password "mypassword" #remotename pptp file /etc/ppp/options.pptp lock nodeflate nobsdcomp noauth nopcomp noaccomp
Options.pptp
+###############################################################################
# $Id: options.pptp,v 1.3 2006/03/26 23:11:05 quozl Exp $ # # Sample PPTP PPP options file /etc/ppp/options.pptp # Options used by PPP when a connection is made by a PPTP client. # This file can be referred to by an /etc/ppp/peers file for the tunnel. # Changes are effective on the next connection. See "man pppd". # You are expected to change this file to suit your system. As # packaged, it requires PPP 2.4.2 or later from http://ppp.samba.org/ # and the kernel MPPE module available from the CVS repository also on # http://ppp.samba.org/, which is packaged for DKMS as kernel_ppp_mppe. # Lock the port lock
# Authentication # We don't need the tunnel server to authenticate itself
noauth
# We won't do PAP, EAP, CHAP, or MSCHAP, but we will accept MSCHAP-V2 # (you may need to remove these refusals if the server is not using MPPE)
#refuse-pap #refuse-eap #refuse-chap #refuse-mschap #refuse-mschap-v2
# Compression # Turn off compression protocols we know won't be used
nobsdcomp nodeflate persist
# Encryption # (There have been multiple versions of PPP with encryption support, # choose which of the following sections you will use. Note that MPPE # requires the use of MSCHAP-V2 during authentication) # # Note that using PPTP with MPPE and MSCHAP-V2 should be considered # insecure: # http://marc.info/?l=pptpclient-devel&m=134372640219039&w=2 # https://github.com/moxie0/chapcrack/blob/master/README.md # http://technet.microsoft.com/en-us/security/advisory/2743314
# http://ppp.samba.org/ the PPP project version of PPP by Paul Mackarras # ppp-2.4.2 or later with MPPE only, kernel module ppp_mppe.o # If the kernel is booted in FIPS mode (fips=1), the ppp_mppe.ko module # is not allowed and PPTP-MPPE is not available. # {{{ # Require MPPE 128-bit encryption
#require-mppe-128 require-mschap-v2 # }}}
# http://mppe-mppc.alphacron.de/ fork from PPP project by Jan Dubiec # ppp-2.4.2 or later with MPPE and MPPC, kernel module ppp_mppe_mppc.o # {{{ # Require MPPE 128-bit encryption #mppe required,stateless # }}}
После запуска (pppd call myvpn) tail -f /var/log/messages
Jul 27 23:28:27 Sanduka pppd[2982]: LCP: timeout sending Config-Requests Jul 27 23:28:27 Sanduka pppd[2982]: Connection terminated. Jul 27 23:28:27 Sanduka pppd[2982]: Modem hangup Jul 27 23:28:27 Sanduka pptp[2995]: anon warn[decaps_hdlc:pptp_gre.c:217]: short read (-1): Input/output error Jul 27 23:28:27 Sanduka pptp[2995]: anon warn[decaps_hdlc:pptp_gre.c:229]: pppd may have shutdown, see pppd log Jul 27 23:28:27 Sanduka pptp[3003]: anon log[callmgr_main:pptp_callmgr.c:242]: Closing connection (unhandled) Jul 27 23:28:27 Sanduka pptp[3003]: anon log[ctrlp_rep:pptp_ctrl.c:254]: Sent control packet type is 12 'Call-Clear-Request' Jul 27 23:28:27 Sanduka pptp[3003]: anon log[call_callback:pptp_callmgr.c:81]: Closing connection (call state) Jul 27 23:28:27 Sanduka pppd[2982]: Using interface ppp0 Jul 27 23:28:27 Sanduka pppd[2982]: Connect: ppp0 <--> /dev/pts/2 Jul 27 23:28:27 Sanduka NetworkManager[650]: (ppp0): new Generic device (driver: 'unknown' ifindex: 16) Jul 27 23:28:27 Sanduka NetworkManager[650]: (ppp0): exported as /org/freedesktop/NetworkManager/Devices/15 Jul 27 23:28:27 Sanduka pptp[3007]: anon log[main:pptp.c:333]: The synchronous pptp option is NOT activated Jul 27 23:28:27 Sanduka pptp[3015]: anon log[ctrlp_rep:pptp_ctrl.c:254]: Sent control packet type is 1 'Start-Control-Connection-Request' Jul 27 23:28:27 Sanduka pptp[3015]: anon log[ctrlp_disp:pptp_ctrl.c:754]: Received Start Control Connection Reply Jul 27 23:28:27 Sanduka pptp[3015]: anon log[ctrlp_disp:pptp_ctrl.c:788]: Client connection established. Jul 27 23:28:28 Sanduka pptp[3015]: anon log[ctrlp_rep:pptp_ctrl.c:254]: Sent control packet type is 7 'Outgoing-Call-Request' Jul 27 23:28:28 Sanduka pptp[3015]: anon log[ctrlp_disp:pptp_ctrl.c:873]: Received Outgoing Call Reply. Jul 27 23:28:28 Sanduka pptp[3015]: anon log[ctrlp_disp:pptp_ctrl.c:912]: Outgoing call established (call ID 0, peer's call ID 11291).
Пробовал настроить через KDE (nm-connection-editor, можно ли его вообще настроить таким образом?), на что получил такое сообщение.

В итоге подозрения пали на то, что в ядре не хватает то ли драйверов, то ли модулей. Но опыт у меня в этом деле мизерный. Прошу подсказать знающих: что не так и как исправить?


Ответ

Не стоит светить свой эккаунт с паролем на весь мир, пускай даже и кампусный :) Весьма рекомендую сменить пароль как скомпроментированый! Для поднятия туннеля нужно два файла: /etc/ppp/peers/KHARKOV
# cat /etc/ppp/peers/KHARKOV pty "pptp vpn.campus.kharkov.ua --nolaunchpppd" lock noauth nobsdcomp nodeflate name vasnievda remotename KHARKOV ipparam KHARKOV refuse-pap refuse-eap refuse-chap
3.
# cat /etc/ppp/chap-secrets vasnievda KHARKOV "mysecretpasswd" *
При этом нужно ещё разрешить в файрволле gre, причём не забыть, что это может быть вовсе и не eth0, так как это седьмая версия Центоса :) Естественно всё это делдается от рута!
# iptables --insert OUTPUT 1 --source 0.0.0.0/0.0.0.0 --destination 0.0.0.0/0.0.0.0 --jump ACCEPT --protocol gre --out-interface eth0 # iptables --insert INPUT 1 --source 0.0.0.0/0.0.0.0 --destination 0.0.0.0/0.0.0.0 --jump ACCEPT --protocol gre --in-interface eth0 Приблизительный лог:
Jul 28 12:21:08 myserver pppd[15902]: pppd 2.4.5 started by root, uid 0 Jul 28 12:21:08 myserver pppd[15902]: Using interface ppp0 Jul 28 12:21:08 myserver pppd[15902]: Connect: ppp0 <--> /dev/pts/3 Jul 28 12:21:08 myserver pptp[15903]: anon log[main:pptp.c:314]: The synchronous pptp option is NOT activated Jul 28 12:21:08 myserver pptp[15911]: anon log[ctrlp_rep:pptp_ctrl.c:251]: Sent control packet type is 1 'Start-Control-Connection-Request' Jul 28 12:21:08 myserver pptp[15911]: anon log[ctrlp_disp:pptp_ctrl.c:739]: Received Start Control Connection Reply Jul 28 12:21:08 myserver pptp[15911]: anon log[ctrlp_disp:pptp_ctrl.c:773]: Client connection established. Jul 28 12:21:09 myserver pptp[15911]: anon log[ctrlp_rep:pptp_ctrl.c:251]: Sent control packet type is 7 'Outgoing-Call-Request' Jul 28 12:21:09 myserver pptp[15911]: anon log[ctrlp_disp:pptp_ctrl.c:858]: Received Outgoing Call Reply. Jul 28 12:21:09 myserver pptp[15911]: anon log[ctrlp_disp:pptp_ctrl.c:897]: Outgoing call established (call ID 0, peer's call ID 11305). Jul 28 12:21:10 myserver pppd[15902]: CHAP authentication succeeded Jul 28 12:21:10 myserver pppd[15902]: CCP terminated by peer (No compression negotiated) Jul 28 12:21:10 myserver pppd[15902]: Compression disabled by peer. Jul 28 12:21:10 myserver pppd[15902]: local IP address yyy.yyy.yyy.yyy Jul 28 12:21:10 myserver pppd[15902]: remote IP address xxx.xxx.xxx.xxx
Ещё раз: весьма рекомендую сменить пароль как скомпроментированый!

Мультиязычное приложение на C [закрыт]

Подскажите, как в C обычно делают мультиязичность?


Ответ

например, с помощью gnu/gettext (там присутствует ссылка на подробнейшую англо-язычную документацию).
есть статья в русскоязычной википедии, в которой приведён небольшой пример.
там же, к примеру, упоминается и краткое русско-язычное руководство

Влияние альфа-версии на продвижение приложения в Google-play

При публикации приложения в Google-play, насколько мне известно, оно попадает в раздел "новые" или что-то типа того. Это, так сказать, бонус от Googl-а на продвижение нового приложения, который действует около двух недель с момента публикации. Вопрос в чем: если я опубликую только альфа или бета-версию своего приложения, чтобы его протестировать, включится ли этот бонус в момент ее публикации или он включается только в момент публикации уже рабочей версии?
А то хочется и проверить свое приложение до релиза, и при этом не потерять этот бонус к продвижению.


Ответ

Альфа-, бета- версии только для тестирования. В раздел "новые" приложение попадает только после публикации первой релизной версии.

Какие изменения происходят на удаленном сервере при git push?

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


Ответ

Git оперирует не файлами, а коммитами.
Коммит — это «снимок» текущего состояния рабочей области. Он содержит полные версии файлов, а не изменения (также называемые дельтами или патчами).
Подробнее о коммитах: Каким образом git сохраняет изменившуюся строку при коммите?
Или они сначала сравниваются и заливаются только изменения?
Отчасти вы правы: они действительно сначала сравниваются. Для сравнения файлов используется алгоритм Secure Hash Algorithm. Когда вы заливаете (push) очередные коммиты на удаленный сервер, Git сравнивает значение sha1 для каждого объекта. Если в его истории уже есть объект для этого значения, то повторно закачиваться он не будет. Если нет — то будет закачана полная версия этого файла, а точнее, содержащий его объект типа blob.
на удаленном файл
Как уже отметил alexander barakin, ваш удаленный сервер скорее всего типа bare, то есть не содержит файлов в рабочей области (а только внутренние файлы Git-репозитория).

Как узнать версию .NET Framework, необходимую для запуска сборки?

У меня есть исполнимый EXE файла .NET. Как имея только его узнать необходимую версию .NET Framework необходимую для запуска ?


Ответ

Запустите ildasm из Developer Command Prompt студии (или по полному пути, у меня это C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6 Tools\ildasm.exe).
Откройте в нем exe, и посмотрите MANIFEST - там будут референсы на системные сборки:
// Metadata version: v4.0.30319 .assembly extern mscorlib { .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4.. .ver 4:0:0:0 } .assembly extern System.Core { .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4.. .ver 4:0:0:0 }
их версии совпадают с требуемой версией .NET