Страницы

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

четверг, 20 декабря 2018 г.

Почему коммит прерывается с ошибкой “Aborting commit due to empty commit message”?

пытаюсь сделать commit в git, пишу команду
git commit
Выводит описание комита через gedit (я думаю это не сильно важно каким текстовым редактором пользоваться?), я сохраняю изменения и закрываю его. И выводится
Aborting commit due to empty commit message.
Всё прекрасно работает с помощью
git commit -m 'commit'
Но хотелось бы до конца разобраться. Кто-то может подсказать, почему так происходит?


Ответ

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

Android: Как правильно хранить данные?

Здравствуйте! Меня интересует такой вопрос: как правильно организовать хранение часто используемых данных? У меня есть 3 коллекции, данные которые они хранят используются для вывода нескольких ListView. Изначально я запихнул коллекции в статичные переменные в базовую активити и они были доступны отовсюду. Сейчас я переделал эту схему на выборку из базы, каждый раз когда эти данные требуются, и вот не пойму, правильно я сделал, или хранение в статических переменных это нормальная практика для подобных задач?


Ответ

Глобальные переменные зло, если только с ними неправильно обращаться. По самой сути явления всегда есть переменные, которые должны быть глобальными - скажем хэндлер к БД (или если угодно хэндлер к DAO) - он по сути своей глобален - нравится это кому то или нет.
Идеальным местом для хранения таких глобальных вещей является объект Application, который является естественным синглтоном для Android аппликации.
Надо декларировать в манифесте кастомный Application класс и "положить" туда свои глобальные переменные туда (обложив сеттерами/геттерами). Application практически везде доступен через Activity.getApplication()
public class MyApplication extends Application { private MyPreciousClass myPreciousObject;
public MyPreciousClass getMyPreciousObject() { return this.myPreciousObject; } }
//где в коде MyApplication myApp=(MyApplication)this.getApplication(); myPreciousObject=myApp.getMyPreciousObject();

Доступ потоков к элементу типа List

Всем привет, у меня есть список, и я в него с помощью потоков, создаваемых в цикле записываю значения. Ничего не записывается, я подозреваю, что из-за обращений к элементу типа List. Код: puplic class MyClass(){
List list = new List();
public MyClass(){ FillList(); }
public void FillList(){ for(int i = 0; i < 50; i++) { new System.Threading.Thread(delegate() {Do(i);}).Start();
}
}
void Do(int i){ list.Add(i); } } Упрощенный пример, повторяет мою реализацию. Подозреваю нужно использовать Lock. Но могу разобраться, как правильно. Помогите, пожалуйста.


Ответ

Вы не имеете права модифицировать список одновременно из различных потоков. Попробуйте так: List list = new List(); object mutex = new object();
for (int i = 0; i < 50; i++) new Thread(() => Do(i, mutex)).Start();
void Do(int i, object mutex) { // длинные вычисления lock(mutex) list.Add(i); } С другой стороны, зачем вам такие низкоуровневые конструкции? Есть гораздо более удобные высокоуровневые средства. Вы можете, например, использовать PLINQ: List list = Enumerable.Range(0, 50) .AsParallel() .AsOrdered() // если порядок важен .Select(Compute) .ToList();
int Compute(int i) { // длинные вычисления return i; } Обязательно почитайте: http://www.albahari.com/threading/ (там есть ссылка на русский перевод, но он, кажется, неполный).

Как отладить обфусцированную программу, декомпилированную fernflower'ом или приключения джуниора?

Честно говоря ни чем таким раньше не занимался, однако передо мной стоит задача разобрать писанину предыдущего разраба, который психанув, ушёл из проекта, и скажем так восстановить программу из последнего релиза, т.к. он забрал с собой сорцы. Я же совсем новенький в яве, мало чего ещё понимаю, но задачу эту повесили на меня. Но чтож. Немного погуглив, нашёл наиболее хорошо оцениваемый декомпилятор/деобфускатор fernflower. Написал простенькую прогу, скомпилил, а потом декомпильнул ффом. Вроде годный, компилируемый сорц получился. Потом принялся за работу над задачей: Программа в целом состояла из двух частей: стартер/апдейтер и собственно сама программа. Стартер апдейтит прогу при необходимости, после чего запускает её через SwingUtils.InvokeLater runnable ProccessBuilder. Я декомпильнул стартер, получившийся код впряг в новый проджект в моей любомой NetBeans IDE, определил и вынес либы, но код не стал декомпилиться: проблема оказалась в том, что где-то запрашивался класс, не присутствующий в жарнике стартера (крэшрепортер), также заметил что в этом же жарнике лежат "лишние" классы, т.е. те классы, которые вообще не из мира сего. И я сначала свалил всё на фф, но заглянув в папку, куда распаковал собственно жарник стартера (с компилированными классами), я обнаружил что действительно не хватает нужных классов. Тогда я решил, что стоит попробовать декомпильнуть второй жарник, и к моему величайшему удивлению, в нём оказался тот самый класс крэшрепортера, а пошарив по классам второго жарника, нашёл импорты "лишних" классов из первого o_0. Тут я понял, что если не решу это говнище, то меня наверняка выпрут с работы, я впаду в депрессию и сопьюсь, и с такой нехилой мотивацией начал искать и сравнивать с декомпиленными сорцами, в поисках используемой версии, кучу либ... Сейчас добавил больше половины, но при просмотре классов во втором жарнике, обнаружил, что они были обфусцированны, т.к. в большинстве случаев, названия переменных были аля var151 и так далее, но ещё больше меня поразило обилие классов вида a.class, aa.class, ab.class в основном пакете. Также во втором жарнике в классах нередко встречались конструкции аля: try { a = b(); } catch (Exception var7) { ; } И самое ужасное, что обфусцированный код второго жарника теперь кишит ошибками CannotFindSymbol... Я знаю, что спрашивать несколько вопросов в одном - нехорошо, но разносить описание на кучу вопросов - тоже будет неправильно. И как вы поняли дорогие друзья, я прошу вашей помощи: 1. Как объяснить несказанно раскиданные классы (моё предположение, что стартер и основное приложение было одним проектом, а при сборке распихивалось по разным ярникам, т.к. иначе присутствие классов с ошибками импорта в скомпиленном проекте нельзя объяснить) 2. Как быстро распутать белиберду в основном пакете. Может есть какой-то способ автоматом восстановить названия классов, свойств и методов, или всё придётся делать вручную? 3. Как быстро определить версию используемой библиотеки, если нигде про неё не написано. Может есть какая-нибудь программа? 4. Как легче всего отладить программу и убрать все эти непонятные конструкции и cannotfindsymbol'ы? Спасибо, друзья!


Ответ

Для начала, задание по восстановлению сорцов (то есть, логики) из декомпилята — задача не для джуниора, а для профи-специалиста. Если вам платят джуниорскую зарплату при этом — немедленно психуйте, убегайте и ищите себе нормальную работу. (Можете забрать с собой деобфусцированные исходники тоже.) ЗЫ: из хорошей конторы ваш предшественник сломя голову не побежал бы. Если вы и восстановите компилируемость, вам придётся разобраться в логике. Если вы всё же хотите набраться опыта — считайте декомпилированный код «намёком» на правильный, и раскидывайте куски по проектам вручную. Насколько я понимаю, автоматически восстановить обфусцированные названия классов невозможно, если только обфускатор не сохранил где-то информацию о первоначальных именах. Пичалько. Версия использованной библиотеки вполне может быть в метаданных (тут я не спец), поищите информацию. Если нет — придётся подбирать вручную. По поводу непонятных конструкций — присмотритесь к ним, скорее всего, вы найдёте в них какую-то логику, и сможете быстро понять, где оригинальный код, а где добавка от обфускатора. И ещё раз, помните, что это очень сложная и высококвалифицированная работа. Возможно, переписать проект с нуля будет более простым решением! И потребуйте хорошую премию, задание вам досталось крайне сложное.

среда, 19 декабря 2018 г.

Сделать монохромное тепловизионное изображение разноцветным

Вопрос. Нужно монохромное тепловизионное изображение сделать разноцветным с помощью Matlab. Каким образом можно это реализовать, зная только диапазон температур? Как составить алгоритм?


Ответ

Допустим мы умеем на основании черно-белой картинки сопоставлять значение яркости с температурой. Если известен только диапазон температур то можно предполагать линейную зависимость между температурой и яркостью. Теперь берем значение яркости/температуры и строим цветовую модель HSV (hue-saturation-value), где нашу яркость из черно-белой картинки сопоставляем с компонентой Hue (цветность). Самая высокое значение температуры принимаем за красный цвет (hue=0), самое низкую температуру за темно-синий (hue=270) Задаемся некими фиксированными значениями S - насыщенности цвета и V - яркости) Формируем полный цвет по модели HSV (при необходимости переводя его в RGB пространство).

Как перехватить СМС состоящее из 2 или 3 СМС из приложения для андроид

Мой ресивер, он отлично работает когда приходят короткие смс, но при больших, перехватывает кусками. @Override public void onReceive(Context context, Intent intent) { Log.d(LOG_TAG, "onReceive()"); Bundle bundle = intent.getExtras();
SmsMessage[] msgs = null; SmsMessage[] phonenum = null;//
if (bundle != null) { // ---retrieve the SMS message received--- Object[] pdus = (Object[]) bundle.get("pdus");
msgs = new SmsMessage[pdus.length]; for (int i = 0; i < msgs.length; i++) { msgs[i] = SmsMessage.createFromPdu((byte[]) pdus[i]); body += msgs[i].getMessageBody().toString(); }
// ---retrieve the SMS senders number --- phonenum = new SmsMessage[pdus.length]; for (int i = 0; i < phonenum.length; i++) { phonenum[i] = SmsMessage.createFromPdu((byte[]) pdus[i]); PhoneNUMBER += phonenum[i].getOriginatingAddress(); } Получается так, что если приходит большое сообщение, состоящее из 2 или 3 смс, то он его полностью не берет, а помещает в переменную body, только первую часть, а остальные вообще не обрабатывает. Получается пользователь видит первое СМС, цельной картины не видит, а остальные смс приходят обычным путем, через уведомление. Так вот хотел узнать как перехватывать такие сообщения?


Ответ

Держи кусочек код для перехвата мультипартных смсок. Возвращает Map private Map retrieveMessages(Intent intent) { Map msg = null; SmsMessage[] msgs = null; Bundle bundle = intent.getExtras(); if (bundle != null && bundle.containsKey("pdus")) { Object[] pdus = (Object[]) bundle.get("pdus"); if (pdus != null) { int nbrOfpdus = pdus.length; msg = new HashMap(nbrOfpdus); msgs = new SmsMessage[nbrOfpdus]; // There can be multiple SMS from multiple senders, there can be a maximum of nbrOfpdus different senders // However, send long SMS of same sender in one message for (int i = 0; i < nbrOfpdus; i++) { msgs[i] = SmsMessage.createFromPdu((byte[]) pdus[i]); String originatinAddress = msgs[i].getOriginatingAddress(); // Check if index with number exists if (!msg.containsKey(originatinAddress)) { // Index with number doesn't exist // Save string into associative array with sender number as index msg.put(msgs[i].getOriginatingAddress(), msgs[i].getMessageBody()); } else { // Number has been there, add content but consider that // msg.get(originatinAddress) already contains sms:sndrNbr:previousparts of SMS, // so just add the part of the current PDU String previousparts = msg.get(originatinAddress); String msgString = previousparts + msgs[i].getMessageBody(); msg.put(originatinAddress, msgString); } } } } return msg; } Update Вызов: Map msgs = retrieveMessages(intent); for (String address : msgs.keySet()) String msg = msgs.get(address); //сообщение от адресата

Div. Занять оставшееся место

Возникла проблема с блочной вёрсткой. Допустим, у нас есть 3 блока:


Ширина sidebar-left и sidebar-right равна 300px и 250px соответственно. sidebar-left находится слева, sidebar-right – справа, content – между ними.
Как сделать так, чтобы ширина content занимала всё оставшееся место?


Ответ

Вводим дополнительный блок wrapper и работаем с дивами как с таблицей. И резиновое и вашим требованиям соответствует.
.wrapper { display: table; width: 100%; } .sidebar-left { width: 300px; display: table-cell; height: 200px; background: red; } .content { display: table-cell; height: 200px; background: green; } .sidebar-right { width: 250px; display: table-cell; height: 200px; background: blue; }


http://jsfiddle.net/en7dv0jw/
Извиняюсь за дублирование css свойств.