Страницы

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

среда, 27 февраля 2019 г.

Слияние в GIT и командная работа

Помогите, пожалуйста, разобраться с командной работой в Git. Пока работа настроена так: 2 программиста: 1 делает работу, другой проверяет.
Тот который делает получает таски, для выполнения каждого таска создает новую ветку после после того как выполнил задание пушит эту ветку на сервер, сливает ветку со своим мастером делает новую ветку для таска и т.д.
Проверяющий забирает ветки с сервера и делает проверку если все ок вливает их в мастер отправляет на сервер. Если сделаны ошибки возобновляет таск.
Это все как-то коряво, я думаю можно сделать лучше, подскажите как, наведите на правильный путь!
Сейчас проблемы возникают на этапе проверки при слиянии веток. Как можно слить только те комиты которые были сделаны в сливаемой ветке ?


Ответ

Как можно слить только те комиты которые были сделаны в сливаемой ветке ?
В git под термином «ветка» (branch) подразумевается указатель на коммит, а не набор коммитов, как в некоторых других системах управления версиями файлов.
Иными словами, это точка, а не отрезок
Вам требуется перенести несколько коммитов (отрезок), а для этого нужно указать две точки
К примеру: одобренная задача решалась в ветке task125, а предыдущая, пока не одобренная задача, решалась в ветке task124.
Тогда для включения (в текущую ветку) одобренных коммитов (отрезка между этими двумя точками) можно использовать такую, например, команду:
git cherry-pick task124..task125

Свой атрибут/описание для public поля класса

Есть у меня классы, у них открытые переменные. Я через reflection добираюсь до их значений для последующего отображения/изменения.
По умолчанию - есть некоторый диапазон для изменения, условно -+20%.
Но для некоторых переменных есть свои особенности: -10%/+20% или 0..100. Это исключения, они не многочисленны, но они есть.
Мне хочется, когда буду перебирать переменные, чтобы можно было прямо в коде задать для переменной свой атрибут или не знаю как это называется - описание, которое я мог бы пропарсить:
public int Length;
// Min: 0. Max: 100 public int Size;
[Range:20%] public int Weight;
Чтобы было более наглядно: у Unity3D есть HideInInspector. Что-то похожее хочу сделать, но более информативно.


Ответ

Используйте для этого кастомные классы атрибутов, они для того и созданы, чтобы предоставлять мета-информацию об объектах в отражениях.
Например, вот атрибут, позволяющий задавать диапазон для полей:
[AttributeUsage(AttributeTargets.Field)] class RangeAttribute : Attribute { public int Percent { get; set; }
public RangeAttribute (int percent) { Percent = percent; } }
Задавать значение диапазона на поле можно так:
class Foo { [Range(20)] public int Bar; }
Ну а дальше — отражения:
FieldInfo barField = typeof(Foo).GetField("Bar"); RangeAttribute barRange = barField.GetCustomAttribute(); int range = barRange != null ? barRange.Percent : 20; var foo = new Foo(); barField.SetValue(foo, 10);
См.:
Attributes Tutorial (MSDN) Writing Custom Attributes (MSDN) Creating Custom Attributes (MSDN)

Статистика по вопросам, сгруппированная по меткам (Data.SE)

Дано:
Posts — сообщения двух типов: вопросы и ответы, связаны через ParentId, тип указан в PostTypeId (1 — вопрос, 2 — ответ). Вопрос закрыт, если ClosedDate is not null Вопрос отвечен, если AcceptedAnswerId is not null или есть ответ со Score > 0 Вопросы содержат счётчики AnswerCount, ViewCount, CommentCount — количество ответов, просмотров, комментариев. Tags — текстовые метки, связанные многие-ко-многим с вопросами через PostTags
Требуется:
Собрать статистику по вопросам, сгруппированную по меткам: сколько всего вопросов, сколько закрыто, сколько имеет хоть какой-то ответ, сколько отвечено. А также собрать статистику: сколько в среднем ответов, просмотров, комментариев. Статистика должна быть за некоторый временной период (например, за последние 8 недель, кроме последних 3 дней).
Решение:
declare @IncludeRecentWeeks int = 8 declare @ExcludeRecentDays int = 3
declare @LastDate datetime = (select max(CreationDate) from Posts) declare @StartDate datetime = dateadd(week, -@IncludeRecentWeeks, @LastDate) declare @EndDate datetime = dateadd(day, -@ExcludeRecentDays, @LastDate)
;with
Questions as ( select q.*, pt.TagId from Posts as q inner join PostTags as pt on pt.PostId = q.Id where q.PostTypeId = 1 -- question and q.CreationDate > @StartDate and q.CreationDate < @EndDate ),
TagStats as ( select t.TagName as [Tag], ( select count(q.Id) from Questions as q where q.TagId = t.Id ) as [QuestionCount], ( select count(q.Id) from Questions as q where q.TagId = t.Id and q.ClosedDate is not null ) as [ClosedQuestionCount], ( select count(q.Id) from Questions as q where q.TagId = t.Id and q.AnswerCount > 0 ) as [AnsweredQuestionCount], ( select count(*) from ( select q.Id from Questions as q inner join Posts as a on a.ParentId = q.Id where q.TagId = t.Id and (a.Score > 0 or q.AcceptedAnswerId = a.Id) group by q.Id ) as _ ) as [UpvotedAnsweredQuestionCount], ( select sum(AnswerCount) from Questions as q where q.TagId = t.Id ) as [TotalAnswerCount], ( select sum(ViewCount) from Questions as q where q.TagId = t.Id ) as [TotalViewCount], ( select sum(CommentCount) from Questions as q where q.TagId = t.Id ) as [TotalCommentCount] from Tags as t )
select top 50 Tag, QuestionCount as [Qs], format(1.0 * ClosedQuestionCount / QuestionCount, 'p') as [Qs Closed %], format(1.0 * AnsweredQuestionCount / (QuestionCount - ClosedQuestionCount), 'p') as [Qs with As %], format(1.0 * UpvotedAnsweredQuestionCount / (QuestionCount - ClosedQuestionCount), 'p') as [Qs with + As %], format(1.0 * TotalAnswerCount / QuestionCount, 'f') as [Avg As], format(1.0 * TotalViewCount / QuestionCount, 'f') as [Avg views], format(1.0 * TotalCommentCount / QuestionCount, 'f') as [Avg Cs] from TagStats order by QuestionCount desc
Запрос на Data.StackExchange.com, где можно посмотреть результаты выполнения.
Вопрос:
В получившемся вопросе присутствует большое количество подзапросов, что вряд ли положительно сказывается на производительности. Можно ли оптимизировать запрос и избавиться от такого большого числа подзапросов?
Предупреждение:
Этот запрос — продукт технологий программирования SODD (Stack Overflow Driven Development) и CPDD (Copy-Paste Driven Development). SQL я не умею, поэтому любые замечания по качеству кода приветствуются.


Ответ

На самом деле разница если и получится, то не очень большая. Проблему составляет выборка "вопросы помноженные на метки", которые нужны все для сортировки и они занимают около 100% времени выполнения. Остальные операции занимают сущие копейки. Тем не менее, данные можно получить одним запросом (ну почти), код просто будет короче и местами быстрее:
declare @IncludeRecentWeeks int = 8 declare @ExcludeRecentDays int = 3
declare @LastDate datetime = (select max(CreationDate) from Posts) declare @StartDate datetime = dateadd(week, -@IncludeRecentWeeks, @LastDate) declare @EndDate datetime = dateadd(day, -@ExcludeRecentDays, @LastDate)
select top 50 tagname Tag, cnt Qs, format(1.0*closed/cnt,'p') [Qs Closed %], format(1.0*answered/(cnt-closed),'p') [Qs with As %], format(1.0*accepted/(cnt-closed),'p') [Qs with + As %], format(avganswers, 'f') [Avg As], format(avgviews, 'f') [Avg views], format(avgcomments,'f') [Avg Cs] from ( select t.tagname, count(pt.postid) cnt, sum(iif(q.ClosedDate is not null,1,0)) closed, sum(iif(q.AnswerCount>0,1,0)) answered, sum(iif(q.AcceptedAnswerId is not null or a.upvotedanswers>0,1,0)) accepted, sum(q.AnswerCount) answers, avg(q.AnswerCount+0.0) avganswers, sum(q.ViewCount) views, avg(q.ViewCount+0.0) avgviews, sum(q.CommentCount) comments, avg(q.CommentCount+0.0) avgcomments from postTags pt join Tags t on pt.tagid = t.id join Posts q on pt.postId = q.id join (select qq.id postId, sum(isnull(aa.id,0)) upvotedanswers from Posts qq left join Posts aa on qq.id = aa.parentid and aa.score>0 where qq.CreationDate between @StartDate and @EndDate group by qq.id ) a on q.id = a.postid where q.CreationDate between @StartDate and @EndDate group by t.tagname ) aggtags order by aggtags.cnt desc
http://data.stackexchange.com/ru/query/313286/tags-stats-mod
ЗЫ Добавил также фильтр по дате для вопросов с заплюсованными ответами, но (лень план запроса разбирать подробно) индекса либо нет, либо он не используется - разницы не заметил.

Заработает ли Intel C++ Compiler на AMD процессоре?

Кто нибудь устанавливал его не на процессоры семейства Intel?


Ответ

AMD и Intel базируются на одной архитектуре x86 или amd64. Хотя в новейших процессорах у них и могут быть разночтения в наборе команд, большая часть оных одинакова. Разумеется никто в здравом уме не станет использовать такие инструкции, которые не позволят запускать компилятор на процессоре конкурента. Это потеря рынка равноценна экономическому самоубийству, учитывая тот факт, что компилятор от Intel, мягко говоря, не на ведущих ролях. Таким образом ответ на вопрос - да, заработает и по другому быть не может.
Генерирует ли компилятор от Intel такой код, что он будет быстрее на Intel? Лучше этот вопрос адресовать разработчикам от Intel, но вероятность этого есть, хотя и небольшая.

navigation drawer: тормоза при выбор элемента списка

Всем привет. В качестве меню в приложении использую navigation drawer. Всё делала согласно туториалам. При свайпе всё отлично, всё красиво, меню выдвигается и прячется на место очень гармонично. Но если я выбираю элемент из списка, то меню прячется скачками. Кто-нибудь сталкивался? В чём может быть проблема?
Что у меня есть: ParrentActivity extends ActionBarActivit,
Стандартный макет для него



При выбор элемента списка открывается один из фрагментов.
Fragment fragment = null; Bundle args = new Bundle(); switch (position){ case 1: fragment = NewsFeedFragment.newInstance(); args.putString("arg","arg"); break; case 2: fragment = ArticlesFragment.newInstance(); args.putString("arg","arg"); break; case 3: fragment = BlogsFragment.newInstance(); args.putString("arg","arg"); break; case 4: fragment = Research2Fragment.newInstance(); args.putString("arg","arg"); break; case 5: fragment = AuthorsFragment.newInstance(); args.putString("arg","arg"); break; default:break; } fragment.setArguments(args); FragmentManager frgManager = getSupportFragmentManager(); frgManager.beginTransaction().replace(R.id.content_frame, fragment) .commit();


Ответ

В отдельном потоке фрагменты заменяю. Теперь всё окей.
private class DrawerItemClickListener implements ListView.OnItemClickListener { @Override public void onItemClick(AdapterView parent, View view, final int position, long id) { mDrawerLayout.closeDrawer(mDrawerList); new Handler().postDelayed(new Runnable() { @Override public void run() { selectItem(position);
} }, 300); } }

Qr коды(создание/чтение) android

Хочу научится работать с QR кодами. Решил сделать так: создать QR, и считать QR. Для создания QR-кода, я решил использовать библиотеку zxing. Скачал zxing-1.3.jar и подключил. Все вроде работает, но когда я создаю qr с русскими символами, то мне выдает непонятную штуку, я решил ее так:
final QRCodeWriter writer = new QRCodeWriter();
//картинка где выводить ImageView tnsd_iv_qr = (ImageView)findViewById(R.id.qrImage);
//кодировка Charset charset = Charset.forName("UTF-8"); CharsetEncoder encoder = charset.newEncoder();
byte[] b = null;
try { // кодирую строку ByteBuffer bbuf = encoder.encode( CharBuffer.wrap( phone + "/" + name + "/" + id ) );
b = bbuf.array(); } catch (CharacterCodingException e) { Log.e(e.toString(), e.toString()); }
String data;
try { data = new String(b, "ISO-8859-1"); Hashtable hints = new Hashtable(2); hints.put(EncodeHintType.CHARACTER_SET, "ISO-8859-1");
ByteMatrix bitMatrix = writer.encode(data, BarcodeFormat.QR_CODE, 512, 512, hints);
int width = 512; int height = 512;
Bitmap bmp = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { if (bitMatrix.get(x, y)==0) { bmp.setPixel(x, y, Color.BLACK); } else { bmp.setPixel(x, y, Color.WHITE); } } } //создаю qr tnsd_iv_qr.setImageBitmap(bmp); } catch (WriterException | UnsupportedEncodingException e) { e.printStackTrace(); }
Проблема решилась(я так думал), русские символы зашивает, пока я не протестировал код на других устройствах, получается та же проблема с кодировкой русских символов.
Читаю я QR библиотекой ZBarScanner вот так:
//при нажатой кнопке Intent intent = new Intent(getApplicationContext(), ZBarScannerActivity.class); intent.putExtra(ZBarConstants.SCAN_MODES, new int[]{Symbol.QRCODE}); startActivityForResult(intent, ZBAR_SCANNER_REQUEST);
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == RESULT_OK) { String contents = data.getStringExtra(ZBarConstants.SCAN_RESULT); int format = data.getIntExtra(ZBarConstants.SCAN_RESULT_TYPE, 0);
Log.e("add sale", contents);
if(format == 64) { setInformClient(contents); } } else if(resultCode == RESULT_CANCELED) { Toast.makeText(this, "Camera unavailable", Toast.LENGTH_SHORT).show(); } }
Хочу спросить, какие библиотеки используете вы для создание qr с использованием русских символов? И подскажите почему у меня проблема с кодировками?
UPD
При чтении некоторых qr где есть русские символы некоторые слова выводило нормально, а некоторые типа такого плана: ミ籍スムひセミス ミ漬セミサム糊エム糊コミセ (в гугл трансейт даже можно перевести =) ). Начал использовать для чтения QR библиотеку zxing, все хорошо, только не нравится что когда я запускаю на телефоне, на телефоне вместо одного приложения ставятся 2, одно мое приложение, а второе с аналогичным названием и иконкой, только когда я его запускаю то сразу включается сканер


Ответ

Судя по коду, вы:
Создаете строку в UTF-8 Преобразуете её в массив байт Читаете получившийся масив байт обратно в строку, указывая что у вас в массиве лежит строка в кодировке ISO-8859-1. И уже эту новую строку вы пишете в QR-код.
Собственно в этом и есть вся проблема. Уберите это мягко говоря странное преобразование, и тупо записывайте строку в UTF-8. Если строка содержит не латинские символы, то для записи в QR лучше использовать именно её:
private BufferedImage getQRImage(String phone, String name, int id) throws WriterException { QRCodeWriter writer = new QRCodeWriter();
Hashtable hints = new Hashtable(); hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
String contents = phone + "/" + name + "/" + id; BitMatrix matrix = writer.encode(contents, BarcodeFormat.QR_CODE, 512, 512, hints);
return MatrixToImageWriter.toBufferedImage(matrix); }
Выдает картинку, которая читается всеми имеющимися у меня устройствами.

Зафиксировать отображение в WebView

Есть простой WebView mWeb:

в который я передаю стороку html:
mWeb.loadData(myhtml, "text/html; charset=utf-8", "UTF-8");
Все работает нормально, но когда при прокрутке нечайно сделаешь свайп влево или прово, текст начинает съезжать. Так вроде и ничего, но тут тоже проблема, текст стает не на прежнее место после свайпа. Как можно зафиксировать отображение содержимого в WebView чтобы не свайпилось по бокам?


Ответ

Вам нужно указать действие на свайп:
findViewById(R.id.html).setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent event) { if(event.getAction() == MotionEvent.ACTION_MOVE) return false; } });