Страницы

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

вторник, 25 декабря 2018 г.

Пиксельная линейка в chrome

После переустановки Chrome пропала пиксельная линейка. Говорят, что ее как-то можно включить, если не врут, подскажите как. Спасибо.


Ответ

F12 → сочетание клавиш Ctrl+Shift+M F12 → вторая сверху слева кнопка панельки (Toggle Device Mode):


Чтобы включить также показ линий, ограничивающих элемент на этой линейке нужно включить опцию "Show Rulers". Жмём F12 → F12 и ставим галку в пункте General → Elements → Show Rulers:


Вот что получается:

Можно не включать "Device Mode", тогда пиксельные линейки будут появляться только при инспектировании элемента.

Нестандартный вывод текста в TextView

Необходимо вписать текст в TextView ограниченный кругом. пример Подскажите, в какую сторону копать


Ответ

Написал код onDraw(Canvas canvas) своего класса наследника TextViewрешающий задачу для меня. Комментарии описываю последовательность действий:
@Override protected void onDraw(Canvas canvas) { // круг, в который вписан текст canvas.drawCircle(mRadius, mRadius, mRadius, mGlowPaint); // высота строки float textHeight = mTextPaint.getFontSpacing(); // измеряем длинну текста float widthText = mTextPaint.measureText(mText); if(widthText <= mRadius*2) { // всего одна строка помещается - рисуем ее и выходим canvas.drawText(mText, mRadius, mRadius, mTextPaint); return; } // 1 Делим строку на два, сдвигаем к ближайшему пробелу. получаем индекс пробела, близкого к середине текста int centerSpace = calcCenterSpace(mText); // 2 Сначала рисуем текст вверх : String leftString = mText.substring(0, centerSpace); int cnt = 0; // количество прорисованных строк вверх float widthLine; int n; while (true) { // измеряем длинну строки widthLine = calcWidthLine(mRadius, textHeight * cnt++); // считаем сколько символов поместится в новой строке n = mTextPaint.breakText(leftString, false, widthLine, null); if (n == 0) // прерываем, так как строка слишком длинная break; // создаем строку int rest = leftString.length() - n; // проверка на последнюю строку if (rest != 0) { String s = leftString.substring(leftString.length() - n); // обрезаем до первого пробела int fixed = s.indexOf(' '); // создаем новую аккуратную строку s = s.substring(fixed + 1); // рисуем ее на высоте соответствующую данной строке canvas.drawText(s, mRadius, mRadius - textHeight * cnt + textHeight, mTextPaint); // сокращаем левый кусок текста на длинну отрисованной строки leftString = leftString.substring(0, leftString.length() - s.length()); } else { // последняя строка canvas.drawText(leftString, mRadius, mRadius - textHeight * cnt + textHeight, mTextPaint); break; } } // 3. Теперь рисуем вниз String rightString = mText.substring(centerSpace); cnt = 0; // количество прорисованных строк вверх while(true){ widthLine = calcWidthLine(mRadius, textHeight * cnt++); n = mTextPaint.breakText(rightString, false, widthLine, null); if (n == 0) // прерываем если весь текст не поместился break; int rest = rightString.length() - n; if(rest != 0) { String s = rightString.substring(0, n); int fixed = s.lastIndexOf(' '); s = s.substring(0, fixed); canvas.drawText(s, mRadius, mRadius + textHeight * cnt, mTextPaint); rightString = rightString.substring(s.length(), rightString.length()); } else { canvas.drawText(rightString, mRadius, mRadius + textHeight * cnt, mTextPaint); break; } } }
private static int calcWidthLine(float r, float b){ double a = Math.sqrt(r * r - b * b); return (int)(2*a); }
private static int calcCenterSpace(String text){ int index = text.length()/2; if(text.charAt(index) == ' ') return index; String subLeft = text.substring(0, index); int indexSpaceLeft = subLeft.lastIndexOf(' '); String subRight = text.substring(index + 2); int indexSpaceRight = subRight.indexOf(' '); if(index - indexSpaceLeft <= indexSpaceRight) return indexSpaceLeft; else return indexSpaceRight; }
Алгоритм не идеален, на поставленную задачу выполняет. Еще в планах сделать растягивание строки. Оптимизация и недочеты приветствую. Вот скриншоты:

Как заблокировать всплывание клавиатуры в элементе EditText?

При уставновке фокуса в EditText, на экране появляется клавиатура. Как реализовать её блокировку (убрать всплывание)?


Ответ

Сам уже нашёл. Нужно установить свойство:
editText.setInputType(InputType.TYPE_NULL);

Програмно снять выделение с TreeView

Необходимо снять выделение с TreeView при удалении элемента. По умолчанию выделяется первый элемент, а задать SelectedItem = null не получается так как это свойство только для чтения. Как это реализовать?


Ответ

В обычном случае вы не создаёте элементы TreeView вручную, а генерируете их автоматически, используя ItemsSource + ItemTemplate
При этом treeView.SelectedItem будет не TreeViewItem, а элемент коллекции, привязанной к ItemsSource. Так что приведение к типу TreeViewItem не сработает.
Чтобы получить из этого собственно визуальный элемент, обычно применяется конструкция list.ItemContainerGenerator.ContainerFromItem(selectedItem);. Но в случае TreeView она, к сожалению, работает лишь на верхнем уровне: каждый TreeViewItem рекурсивно сам является TreeView, и заботится сам о своих контейнерах, так что list.ItemContainerGenerator ничего не знает о вложенных частях дерева.
Неплохое универсально работающее (но многословное) решение — следить за изменением выделенного элемента, и запоминать его в code behind.
Пример:


public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); DataContext = new[] { new DataHolder("Привет-привет", null), new DataHolder("Пока-пока", null), new DataHolder(null, new[] { new DataHolder("Я очень", null), new DataHolder("буду ждать", new[] { new DataHolder("звонка", null) }), }), };
TreeViewItem selectedItemTV = null; TV.AddHandler(TreeViewItem.SelectedEvent, (RoutedEventHandler)((sender, args) => selectedItemTV = (TreeViewItem)args.OriginalSource));
TreeViewItem selectedItemTV2 = null; TV2.AddHandler(TreeViewItem.SelectedEvent, (RoutedEventHandler)((sender, args) => selectedItemTV2 = (TreeViewItem)args.OriginalSource));
var dt = new DispatcherTimer() { Interval = TimeSpan.FromSeconds(5) }; dt.Tick += (sender, args) => { if (selectedItemTV != null) { selectedItemTV.IsSelected = false; selectedItemTV = null; } if (selectedItemTV2 != null) { selectedItemTV2.IsSelected = false; selectedItemTV2 = null; } }; dt.Start(); } }

public class DataHolder { public string Key { get; private set; } public IEnumerable Value { get; private set; }
public DataHolder(string key, IEnumerable value) { Key = key; Value = value; } }
Ну или вы можете подписаться обычным способом в XAML'е: TreeViewItem.Selected="TVItemSelected"

Ещё есть решение с полным рекурсивным обходном дерева, и поиском TreeViewItem'а, как описано здесь. Но оно мне кажется слишком уж неэффективным, и наверняка плохо дружит с виртуализацией.

Postgresql Выборка по строке ФИО

Есть строка фильтра. Пользователь вводит в нее часть имени или фамилии или отчества, отображается список частичных совпадений, пользователь вводит польностью фимилию Иванов, отображаются Ивановы, далее он ставит пробел и вводит С, поиск должен найти всех Ивановых, чьи имена или отчества начинаются на С.
В список не должны попадать фамилии на С., в БД ФИО хранятся отдельными полями. Как привильнее всего построить текст запроса? Я разбивал строку на слова и для каждого слова я добавлял условия, получалось следующее:
SELECT * FROM users WHERE (name ILIKE word1 OR surname ILIKE word1 OR patronymic ILIKE word1) AND (name ILIKE word2 OR surname ILIKE word2 OR patronymic ILIKE word2) AND (name ILIKE word3 OR surname ILIKE word3 OR patronymic ILIKE word3)


Ответ

А почему вы не хотите фамилии на С ? Если считать, что пользователь вводит сначала имя Иван, а потом вводит букву С было бы логично показать Ивана Сидорова, а Сидора Иванова наверное не надо. А если он вводит две буквы, то уже начинать искать ? как ему найти "Гевара Че" ?
Предлагаю такую логику: пока слово одно - ищем его во всех трех полях по частичному совпадению. Но возможно надо ограничить минимальный размер слова, если оно из одной буквы, то боюсь результатов слишком много будет. Если слов более одного - то первое слово ищем во всех полях по точному совпадению, а остальные слова - то частичному совпадению.
Запрос, реализующий вышеуказанную логику:
select distinct users.* from ( select split_part(S,' ',N.column1) w1,split_part(S,' ',N.column2) w2, split_part(S,' ',N.column3) w3, substr('%%',2-N.column1/2) p1,substr('%%',2-N.column2/2) p2, substr('%%',2-N.column3/2) p3,(rtrim(S) like '% _')::int+1 np from (values(1,2,3),(1,3,2),(2,1,3),(2,3,1),(3,2,1),(3,1,2)) N, (select Cast('Пушкин А С' as varchar) S) S ) A join users on name LIKE w1||substr(p1,np,1) and surname LIKE w2||substr(p2,np,1) and patronymic LIKE w3||substr(p3,np,1)
Единственный параметр передаваемый в запрос - ваша строка "Пушкин С А". Перед передачей строки из нее надо удалить лишние пробелы, т.е. слова должны быть разделены строго одним пробелом. Если нужен регистронезависимый поиск - приведите строку к нужному регистру в самом запросе
По работе запроса: цифры в подзапросе N - весь набор расположения слов. w1-w3 - выделенные компоненты из строки, согласно номерам в N. p1-p3 - один % для первого слова строки, и %% для остальных. np - признак поиска полного соответствия (когда слов более 1). substr в самом низу по этому признаку берут или не берут % для like.

Android. Как сделать активным касание в любую часть экрана?

У меня на экране есть несколько edit кнопок. После их заполнения нужно, чтобы весь экран стал активным и при нажатии на любую часть экрана переходило на следующий экран. Как это сделать?


Ответ

MainActivity.class
public class MainActivity extends AppCompatActivity{
EditText et; EditText et_2; LinearLayout main_layout;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_layout);
et = (EditText) findViewById(R.id.editText); et_2 = (EditText) findViewById(R.id.editText2); main_layout = (LinearLayout) findViewById(R.id.main_layout);
main_layout.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (et.getText().length() > 0 && et_2.getText().length() > 0) { Toast.makeText(getApplicationContext(), "onTouch работает", Toast.LENGTH_SHORT).show(); } return false; } }); } }
main_layout.xml


Нахождение положительных пиков функции


Требуется программно найти количество и местоположение положительных пиков на графике. Известно, что количество пиков нечетное. Обычно 3, 5 или 7. В данном случае 3. Также известно, что за каждым положительным пиком следует отрицательный. Как лучше решить такую проблему на Python? Желательно без подбора коэффициентов Дополнение: Данные всегда начинаются с положительного пика и заканчиваются отрицательным. Данные представляют собой вертикальную проекцию изображения, обработанную функцией np.gradient(projection)/projection. То есть отношение второй производной функции к её высоте.


Ответ

Поскольку просто локальный экстремум не устраивает, надо добавить проверку превышения порога для отбраковки мелких пиков и артефактов. Порог можно вычислить как СКО выборки, умноженное на некоторую константу, соответствующую доверительному интервалу для математического ожидания. На практике эту константу принимают равной 2.5
UPD С учётом дополнительных условий задачи пиком следует считать максимум на отрезке от "верха" (начальной точки или первого значения выше q) до "низа" (первого значения ниже -q). При этом для массива размерности n возможен следующий алгоритм:
Найти СКО выборки и вычислить порог q Положить top=0 Найти координату bottom первой точки отрезка [top, n-1] со значением меньше -q. Если такой точки нет, перейти к п.7. Найти координату максимума на отрезке [top, bottom-1]. Если значение максимума больше q, записать его в массив пиков. Найти координату top первой точки отрезка [bottom+1, n-1] со значением больше q. Если такой точки нет, перейти к п.7. Перейти к п.3. Использовать массив пиков.

Как запустить файл с рабочего стола?

Есть файл на рабочем столе.
$ file dash-qt dash-qt: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=43eb2b921a6519a2d2de1f30969182f597a13ac7, stripped
Я без проблем запускаю его из терминала командой ./dash-qt
Как запустить его двойным щелчком по иконке?


Ответ

попробуйте создать там же файл с произвольным именем, содержащим суффикс .desktop (bla.bla.desktop, например) и с таким содержимым:
[Desktop Entry] Name=blablabla Exec="/полный/путь/к/вашему/файлу/dash-qt" Terminal=false Type=Application
если программа требует для работы эмулятор терминала, замените в соответствующей строчке false на true
вот по этому файлу и «щёлкайте дважды».
дополнение: вроде бы, нынче некоторые «особо умные» de (desktop environments) начинают «вставлять палки в колёса», сообщая какой-то бред про «запуск недоверенной программы» (или что-то в этом духе), если у данного файла не стоит битов исполнимости. потому, на всякий случай, лучше их поставить:
$ chmod +x bla.bla.desktop
дополнение 2: можно сделать и без desktop-файла, манипулируя mime-типами: Запустить исполняемый файл в kubuntu

dp и dip в values/dimens

В чем разница между:
4.0dip
и
4dp
?


Ответ

Нет никакой разницы. Это абсолютно равнозначные величины.
dp = dip - density independent pixels, независимые от плотности пиксели. Абстрактная единица измерения, основанная на физической плотности экрана с разрешением 160 dp.
При плотности экрана 160dpi 1dp = 1пикселю.

Разные действия Click, LongClick и Touch на одно и то же место

Есть определенные сомнения, но все таки вдруг такое поведение возможно. Суть: у меня есть FrameLayout (отсюда) с событием onTouch для зуминга. В этом Frame есть несколько элементов, которые принимают события onClick и onLongClick:
for (int i = 0; i < locations.size(); i++) { locations.get(i).getView().setOnClickListener(onPoleClick); locations.get(i).getView().setOnLongClickListener(onPoleLongClick); }
если я выставляю слушателя на клик - перестает действовать MyFrame.onTouch и поле не зумится. Если убираю - соответственно, сижу без кликов, но с зумящимся полем. Если ставлю return false; в MyFrame.onTouch, он также перестает работать. Пробовал заменить locations.get(i).onClick на onTouch (MotionEvent.UP) - при return true клик до Frame не доходит, при return false MotionEvent.UP не срабатывает. MotionEvent.DOWN не даст обработать onLongClick...
Дудочка и кувшинчик, в общем. Может быть есть какой-то способ, чтобы onTouch срабатывал "сквозь" клики?


Ответ

Можно попробовать вот так:
public class ZoomFrameLayout extends FrameLayout { public ZoomFrameLayout(Context context) { super(context); }
public ZoomFrameLayout(Context context, AttributeSet attrs) { super(context, attrs); }
public ZoomFrameLayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); }
@Override public boolean onInterceptTouchEvent(MotionEvent ev) { boolean upper = super.onInterceptTouchEvent(ev); if (!upper) { // Детектим жесты здесь стандартным детектором // и если зум - отрабатываем и выставляем return true } return upper; } }
Т.е. вид ZoomFrameLayout будет забирать себе только зум, а клики уйдут детишкам.
И кстати при таком использовании ScaleDetector будут все события перехватываться (там return true в конце). Можно попробовать что-нибуть вроде if (scaleDetector.isInProgress()) return true;

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

Как правильнее работать со строками, длина которых заранее неизвестна?
Т.е. допустим есть функция, которая возврвращает какое-то сообщение. Сообщение может быть очен длинным.
char* get_hello() { char buffer[1024000]; memset(buffer, 0, 1024000 * sizeof(char)); ... while(fgets(...) != NULL) { sprintf(buffer, "%s%s", buffer, row); } ... char* result = malloc(sizeof(buffer) + 1); strncpy(buffer, result, sizeof(buffer)); result[strlen(buffer)] = '\0'; return result; }
Что здесь можно улучшить?


Ответ

У вас непонятно, хотите ли вы считывать весь файл или только строку - до первого
. Если это файл, и весь - то лучше запросить его размер, выделить соответствующий буфер и считать все и сразу.
Если это файл непонятной длины (типа stdin) или вам надо остановиться по прочтении
- то я бы выделил память (не в стеке, а сразу в куче - к чему эти лишние пересылки?) некоторой длины (грубо, каких нибудь 256 байт), и начал бы читать с помощью fgets. Ну, если буфера не хватает - увеличивал бы с помощью realloc, причем сразу в 2 раза, чтоб амортизированное количество переносов сделать O(1) и накапливал считанные куски строки в нем.
Примерно так.
Код нужен или реализуете сами? :)
Update: По просьбам трудящихся :) примерный набросок:
char* getString(FILE* f) { int size = 16, // размер буфера curpos = 0; // текущая позиция char * buf = malloc(size); // if (buf == NULL) - все проверки допишите сами while(fgets(buf+curpos,size-curpos,f)) { curpos += strlen(buf + curpos); if (*(buf+curpos-1) == '
') return buf; if (size - curpos < 2) { buf = realloc(buf,size*=2); } } return buf; };

Как сверстать элемент в виде капли?

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


Ответ

Попробуйте так:
.vashElement { border-radius: 50% 0 50% 50%; }

C# Проблема с указателями при создании связного списка

Добрый день! Требуется создать связный список объектов структуры, в котором текущий элемент должен указывать на следующий, последний - на null. На C++ когда делал подобное - проблем не возникло. На C# первый элемент создается без проблем. Но второй создается с тем-же адресом! Как это исправить?
// Структура объектов очереди struct QueueItem { public int Value; public unsafe QueueItem* Next;
public unsafe QueueItem(int value) : this() { Value = value; Next = null; } }
class QueueWithMinStats { private unsafe QueueItem* _first; private unsafe QueueItem* _last; public unsafe QueueWithMinStats() { _first = null; _last = null; }
// Добавить в очередь значение public unsafe void Enqueue(int value) { // Проблема тут!!! var newItem = new QueueItem(value); var newItemLink = &newItem;
if (_first == null) // Если вводимый элемент - первый _first = newItemLink; else _last->Next = newItemLink;
_last = newItemLink;
} }


Ответ

Применительно к структуре, оператор new не выделяет память, а лишь вызывает конструктор. Сама структура каждый раз создается на стеке в одном и том же месте - неудивительно что указатели одинаковы.
Для того, чтобы структура "перенеслась" в кучу - надо кастануть ее к типу object (эта операция называется упаковкой). Но у упакованной структуры получить адрес средствами языка - не так-то и просто...
Поэтому предлагаю вам сделать все по-другому.
Во-первых, замените структуру на класс (значимый тип на ссылочный). Во-вторых, уберите указатели: для ссылочных типов они не нужны.
Вместе с другими, не столь критичными, исправлениями, получится как-то так:
class QueueWithMinStats { class QueueItem // я перенес этот класс внутрь, потому что за пределами реализации очереди он никому не должен быть интересен { public int Value; public QueueItem Next;
public QueueItem(int value) { Value = value; // Next инициализаровать не надо - поля классов инициализируются значениями по умолчанию автоматически } }
private QueueItem _first; private QueueItem _last;
// Конструктор пока не нужен
public void Enqueue(int value) { // Проблемы больше нет!!! var newItem = new QueueItem(value); // Переменная newItemLink больше не нужна - потому что QueueItem - это ссылочный тип
if (_first == null) // Если вводимый элемент - первый _first = newItem; else _last.Next = newItem;
_last = newItem; } }

EditText как изменить цвет подчеркиваня?

У меня есть разметка с EditText, и у EditText почему-то розовая полоса подчеркивания :)). Я порылся в гугле, но ничего толкового там не подсказали (или возникали ошибки, или попросту не работало). В приложении стоит тема Theme.AppCompat.Light.DarkActionBar. Как можно изменить цвет этого подчеркивания на другой?)


Ответ

В стилях:
Отвечает за нижний контрол ("полоса подчеркивания")
@color/Любой цвет
Отвечает за ползунок:
@color/Любой цвет
Или как уже написали в комментариях, colorAccent будет менять цвет всех контролов для данного стиля. Можете использовать theme editor, там очень наглядно видны эти изменения.

Как создать плавающий TextView

Работаю над приожением в которое пользователь должен вводить информацию. Выглядит так: идет LinearLayout(horizontal) и в нем TextView затем EditText затем TextView. Где пользователь должен вводить информацию в EditText.
Проблема в том, что при реализации, это выглядит так:
|blabla________tatata| | tatata|
То есть если строка не влазит, перенос строки приосходит под 3-й TextView
А мне нужно, чтобы это выглядело вот так:
|blabla________tatata| |tatata |
То есть, если строка не влазит, он бы перебрасывал её в начало новой строки.
Второй вариант, я использовал данную реализацию Flow TextView но, как видно из примера ниже, она больше подходит для картинки.

3-й вариант:
Использую FlowLayout, при этой реализаци вся 3-я часть перепрыгивает на новую строку, а мне нужно, чтобы перепрыгивала только та часть, которая не уместилась. Помогите плиз подфиксить!
Как это выглядит:

public class HorizontalFlowLayout extends RelativeLayout {
/** * Constructor to use when creating View from code. */ public HorizontalFlowLayout(Context context) { super(context); }
/** * Constructor that is called when inflating View from XML. */ public HorizontalFlowLayout(Context context, AttributeSet attrs) { super(context, attrs); }
/** * Perform inflation from XML and apply a class-specific base style. */ public HorizontalFlowLayout(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); }
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // need to call super.onMeasure(...) otherwise get some funny behaviour super.onMeasure(widthMeasureSpec, heightMeasureSpec);
final int width = MeasureSpec.getSize(widthMeasureSpec); int height = MeasureSpec.getSize(heightMeasureSpec);
// increment the x position as we progress through a line int xpos = getPaddingLeft(); // increment the y position as we progress through the lines int ypos = getPaddingTop(); // the height of the current line int line_height = 0;
// go through children // to work out the height required for this view
// call to measure size of children not needed I think?! // getting child's measured height/width seems to work okay without it //measureChildren(widthMeasureSpec, heightMeasureSpec);
View child; MarginLayoutParams childMarginLayoutParams; int childWidth, childHeight, childMarginLeft, childMarginRight, childMarginTop, childMarginBottom;
for (int i = 0; i < getChildCount(); i++) { child = getChildAt(i);
if (child.getVisibility() != GONE) { childWidth = child.getMeasuredWidth(); childHeight = child.getMeasuredHeight();
if (child.getLayoutParams() != null && child.getLayoutParams() instanceof MarginLayoutParams) { childMarginLayoutParams = (MarginLayoutParams)child.getLayoutParams();
childMarginLeft = childMarginLayoutParams.leftMargin; childMarginRight = childMarginLayoutParams.rightMargin; childMarginTop = childMarginLayoutParams.topMargin; childMarginBottom = childMarginLayoutParams.bottomMargin; } else { childMarginLeft = 0; childMarginRight = 0; childMarginTop = 0; childMarginBottom = 0; }
if (xpos + childMarginLeft + childWidth + childMarginRight + getPaddingRight() > width) { // this child will need to go on a new line
xpos = getPaddingLeft(); ypos += line_height;
line_height = childMarginTop + childHeight + childMarginBottom; } else { // enough space for this child on the current line line_height = Math.max( line_height, childMarginTop + childHeight + childMarginBottom); }
xpos += childMarginLeft + childWidth + childMarginRight; } }
ypos += line_height + getPaddingBottom();
if (MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.UNSPECIFIED) { // set height as measured since there's no height restrictions height = ypos; } else if (MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.AT_MOST && ypos < height) { // set height as measured since it's less than the maximum allowed height = ypos; }
setMeasuredDimension(width, height); }
@Override protected void onLayout(boolean changed, int l, int t, int r, int b) { // increment the x position as we progress through a line int xpos = getPaddingLeft(); // increment the y position as we progress through the lines int ypos = getPaddingTop(); // the height of the current line int line_height = 0;
View child; MarginLayoutParams childMarginLayoutParams; int childWidth, childHeight, childMarginLeft, childMarginRight, childMarginTop, childMarginBottom;
for (int i = 0; i < getChildCount(); i++) { child = getChildAt(i);
if (child.getVisibility() != GONE) { childWidth = child.getMeasuredWidth(); childHeight = child.getMeasuredHeight();
if (child.getLayoutParams() != null && child.getLayoutParams() instanceof MarginLayoutParams) { childMarginLayoutParams = (MarginLayoutParams)child.getLayoutParams();
childMarginLeft = childMarginLayoutParams.leftMargin; childMarginRight = childMarginLayoutParams.rightMargin; childMarginTop = childMarginLayoutParams.topMargin; childMarginBottom = childMarginLayoutParams.bottomMargin; } else { childMarginLeft = 0; childMarginRight = 0; childMarginTop = 0; childMarginBottom = 0; }
if (xpos + childMarginLeft + childWidth + childMarginRight + getPaddingRight() > r - l) { // this child will need to go on a new line
xpos = getPaddingLeft(); ypos += line_height;
line_height = childHeight + childMarginTop + childMarginBottom; } else { // enough space for this child on the current line line_height = Math.max( line_height, childMarginTop + childHeight + childMarginBottom); }
child.layout( xpos + childMarginLeft, ypos + childMarginTop, xpos + childMarginLeft + childWidth, ypos + childMarginTop + childHeight);
xpos += childMarginLeft + childWidth + childMarginRight; } } } }
XML



Ответ

Ради интереса решил попробовать справиться с данной задачей. Оказалось довольно-таки просто(Если я правильно понял суть проблемы).
1) В разметку я добавил дополнительный LinearLayout с ориентацией по вертикали







Установил айдишники для этого Layout-а и для TextView, который находится справа от editText-a. Назвал их addedLayout и textViewRight
2) Уж скину всю простыню кода, если что переделаете под себя. Просто я создал голый проект и в нем всё писал=) Собственно, активити:
public class MainActivity extends AppCompatActivity {
private TextView textViewRight; private LinearLayout addedLayout;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
textViewRight = (TextView) findViewById(R.id.textViewRight); addedLayout = (LinearLayout) findViewById(R.id.addedLayout); }
@Override public void onResume() { super.onResume(); textViewRight.post(new Runnable() { @Override public void run() { int lineCount = textViewRight.getLineCount(); if (lineCount == 1) return;
String allText = textViewRight.getText().toString(); String firstLine = allText.substring(0, textViewRight.getLayout().getLineEnd(0)); textViewRight.setText(firstLine); TextView textView = new TextView(getApplicationContext()); textView.setTextColor(Color.parseColor("#000000")); textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20); textView.setText(allText.substring(firstLine.length())); addedLayout.addView(textView); } });
} }
Принцип строится на том, что мы в onResume смотрим, сколько линий занимает текст справа от поля ввода, если линий больше 1, то создаем новый TexView , кладем его в наш дополнительный layout addedLayout. В правый текствью кладем только первую линию. Остальное "отрезаем" и кладем, в новый создавшийся textView
3) Результат:

SQL обновление нескольких записей одним запросом

Есть таблица с колонкой active, в один момент времени может быть активна только одна запись. Необходимо делать UPDATE записи и ставить значение active в true, и одновременно ставить в false значение active в старой записи. Подскажите как это сделать одним запросом.
Пример
Исходная таблица
id name active 1 a true 2 b false 3 c false
После
id name active 1 a false 2 b true 3 c false


Ответ

Update меняющий у одной записи active на true и у всех других записей, которые сейчас active на false (гарантирует, что в таблице только одна запись может быть true):
with Q as ( select * from testBool where active=true or id=3 ) update testBool T set active=not T.active from Q where exists(select 1 from Q where active=false) and T.id=Q.id

JavaScript, приватные переменные

Как можно создать в классе (ecma6 class) приватную переменную?


Ответ

В es6 такой возможности нет. Многие думают, что классы es6 это какая-то новая конструкция или реализация , нет. Это обычный , новый синтаксис для старого доброго прототипного наследования.
class Animal { constructor() { this.name = "dog" } say() { alert("gaf") } }
То же самое, что и
function Animal() { this.name = "dog" } Animal.prototype.say = function () { alert("gaf") }
Поэтому приватных методов в классе не реализовано, вам придется решать эту проблему самому. Как? Например, через замыкание
const Animal = function () { let privateProp = "i am private";
class Animal { constructor() { this.name = "dog"; } // гетеры и сеттеры для свойства get PrivateProp() { return privateProp } set PrivateProp(value) { privateProp = value } }
return new Animal(); };
let dog = new Animal(); dog.privateProp; // приватное свойство dog.privateProp = "new private prop"; // меняем приватное свойство
Тут методы get/set просто для примера, в реальности скорее всего их не будет, если уже переменная приватная. Тут get/set единственные способы достучатся до privateProp, больше никак, уберете get/set privateProp станет настоящим приватным способом.
UPD Чуть ошибся, переменная создавалась бы одна для всех экземпляров, как написали в комментарии, поправил ответ. Теперь всегда будет создаваться свой экземпляр приватной переменной

Можно ли каким-либо способом запретить смену ориентации для устройства определённого размера (small, normal)?

Доброго времени суток!
Моё приложение состоит из одного функционального Activity, в котором смена контента заключается в смене Fragment-ов. В Layout-файле самого Activity почти ничего нет (Toolbar, иконка загрузки, FAB), все основные элементы располагаются в Layout-ах фрагментов. Теперь непосредственно вопрос. Можно ли как-то сделать так, чтобы:
На устройствах одного размера (в моём случаи small и normal) смена ориентации была запрещена (точнее, разрешена только портретная)... ...но при этом на устройствах другого размера (large и xlarge) смена ориентации была разрешена? Или, как вариант, разрешена только land ориентация.
Способ подойдёт любой, хотя желательно, конечно, декларативный (через манифест или файлы проекта). Ну и желательно без костылей по-типу "программная смена ориентации в OnCreate при обнаружении устройства какого-то размера".


Ответ

Вариант с setRequestedOrientation в onCreate имеет один неприятный эффект. Если пользователь держал устройство в ориентации которую вы хотите запретить, то при запуске приложения не смотря на вызов setRequestedOrientation на короткое время успеет создастся активити с лайаутом для тукущей, а не нужной конфигурацией и если у вас он сильно отличается между конфигурациями и вы начнете работать с ним как с правильным лайаутом, то возможно словите краш. Ну и даже без краша будет визуально некрасиво что сначала приложение покажется в текущей ориентации и тут же перевернется в правильную.
Через манифест к сожалению не сделать разные ориентации для разных типов устройств, но можно немного схитрить. Можно унаследовать от вашей основной активити (будем звать её BaseMainActivity) две другие (назовем их PhoneMainActivity и TabletMainActivity), в которых ничего нового делать не будем, они нужны только для того что бы в манифесте прописать для них разные ориентации. Так же нам понадобиться отдельная активит с которой приложение будет запускаться (назовем её SplashActivity), на ней можно какуюнить загрузочную картинку показывать, или закрывать сразу в onCreate, главное что в ней нужно сделать это проверить тип устройства и в зависимости от него запустить PhoneMainActivity или TabletMainActivity.

При отправке POST запроса при помощи httpurlconnection %20 заменяются на пробелы

Для отправки запросов на сервер пользовался httpurlconnection. На определённый адрес отправлял пост запросы примерно такого вида act=GETCOMMENTS&connectid=... и т.д. И всё вполне работало, приходил ответ от сервера и я его парсил. Но проблема возникла, когда мне посредством этого запроса надо было отправить некий текст. А именно отправка комментария, где в одном из ключей запроса пишется сам комментарий. Примерно так: &commenttext=test%20test2. На сервер должно было это прийти именно в таком виде, а сервер сам производит замену %20 на пробел. Но на сервер приходит именно test test2 с настоящим пробелом, а не %20, а там настоящие пробелы обрезаются. Вот код метода, который осуществляет все запросы:
private String serverRequester2 (String reqParam){ try { URL url = new URL("http:/...определённыйСайт.../test.php"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("POST"); connection.setRequestProperty("USER-AGENT", "Mozilla/5.0"); connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); connection.setRequestProperty("Accept-Charset", "UTF-8"); connection.setDoOutput(true); DataOutputStream dStream = new DataOutputStream(connection.getOutputStream()); dStream.writeBytes(reqParam); Log.d("REQ_PARAM",reqParam); dStream.flush(); dStream.close();
BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream())); String line = ""; StringBuilder responseOutput = new StringBuilder();
while ((line=br.readLine())!=null){ Log.d("LINE",line); responseOutput.append(line); } br.close();
return responseOutput.toString(); } catch (MalformedURLException e) { e.printStackTrace(); return null; } catch (IOException e) { e.printStackTrace(); return null; } }
А вот так я его вызываю и передаю ему параметры, которые надо отправить на сервер:
return serverRequester2("act=CREATECOMMENT&connectid="+connectid+"&token="+token+"&clientcode=123123123&postid="+postID+"&commenttext=test%20test2");
Что я делаю не так? Почему отправляется настоящий пробел, вместо %20? Кстати знак + он тоже заменяет на пробел. А мне нужно, чтобы серверу пришло именно test%20test2 или test+test2, а не test test2.
P.S. сначала была мысль, что всё дело в сервере, но нет, с другого приложения написанного другим человеком на Phonegap запрос приходит именно с URL кодировкой, а не с настоящим пробелом.


Ответ

Для отправки текста test%20test2 нужно передать test%2520test2, а для test+test2 нужно test%2btest2
Детальнее:
https://en.wikipedia.org/wiki/Percent-encoding http://urlencode.org/ https://docs.oracle.com/javase/7/docs/api/java/net/URLEncoder.html

php переключение версий

После обновления до Ubuntu 16.04 из коробки установлен php7. Для моих проектов использую php5.6. Подскажите, как управлять версиями, и использовать php5.6 по умолчанию?
$ php -v PHP 7.0.6-1+donate.sury.org~xenial+1 (cli) ( NTS ) Copyright (c) 1997-2016 The PHP Group Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2016, by Zend Technologies
$ whereis php php: /usr/bin/php /usr/bin/php7.0 /usr/bin/php5.6 /usr/lib/php /etc/php /usr/share/php7.0-opcache /usr/share/php7.0-gd /usr/share/php /usr/share/php5.6-opcache /usr/share/php7.0-mcrypt /usr/share/php7.0-json /usr/share/php7.0-common /usr/share/php7.0-readline /usr/share/php5.6-json /usr/share/php7.0-xml /usr/share/php7.0-mysql /usr/share/php5.6-common /usr/share/php5.6-readline /usr/share/man/man1/php.1.gz


Ответ

если эти пакеты установлены из официального репозитория, то используется механизм альтернатив (alternatives) и /usr/bin/php является символической ссылкой (symlink) на /etc/alternatives/php, которая, в свою очередь, тоже является символической ссылкой на реальный исполняемый файл. в вашем случае — /usr/bin/php7.0
«перенаправить» на другую альтернативу можно, например, так:
$ sudo update-alternatives --config php
если есть альтернативы, то будет предложен пронумерованный список альтернатив (в частности, с указанием пути к реальным файлам) с предложением ввести номер (из списка) для изменения текущего выбора альтернативы.

Преобразование BigDecimal в String только с точкой

Я хочу выводить число BigDecimal как String, причём так, чтобы в выводе число было только с точкой и двумя знаками после точки. Метод toString класса BigDecimal может выводить число как с точкой, так и в экспоненциальной форме, например:
BigDecimal bigDecimal = new BigDecimal("13e-2"); System.out.println("Значение: " + bigDecimal.toString());
выведет
Значение: 0.13
а
BigDecimal bigDecimal = new BigDecimal("13e-10"); System.out.println("Значение: " + bigDecimal.toString());
выведет
Значение: 1.3E-9
Как сделать так, чтобы значение числа типа BigDecimal выводилось в строку только с точкой?


Ответ

BigDecimal bigDecimal = new BigDecimal("13e-50"); System.out.println("Значение: " + bigDecimal.toPlainString());
Результат:
Значение: 0.00000000000000000000000000000000000000000000000013

Зачем нужен API Key

Те сервисы, у которых есть открытое API, обязывают регистрироваться, чтобы получить специальный ключ... то есть API Key.. и этот ключ нужно передавать при каждом запросе: site.ru/{api_key}/{method}/...
Не понятно, почему они так делают, если я могу, к примеру, взять у кого-нибудь этот ключ, не регистрируясь...
так для чего того нужен этот API Key? в чем смысл?


Ответ

API Key используется как CSRF Token - дабы посылать далеко сразу и без разговоров тех, у кого его нет. Если получил и творишь фигню - можно было бы отозвать. Т. е. средство быстрой модерации. Так же ключи могут выполнять функции Access Token - таким образом, кто-то (сервис, пользователь) может предоставить доступ до тех ресурсов, к которым доступ запрещён (личные сообщения, приватная информация и т. д.), не делая последние публичными.

Брать ключ у кого-то, конечно, можно, вот только ответственность за действия будет нести именно владелец ключа (в некоторых сервисах подобное прямо оговаривают). Если действия не владельца ключа будут деструктивными, администрация удалит владельца (а так же, возможно, отзовёт какие-то оплаченные платные услуги, собранная аудитория под старым ключём). Скомпрометированный ключ иногда дают пересоздать (SE API), иногда - только с помощью тех. поддержки.

Как проверить, что строка состоит из букв латинского алфавита?

Должно работать условие при регистрации юзера, что когда он вводит свой nickName то он должен состоять из букв латинского алфавита и без пробелов. Как проверить на пробелы я знаю, а как проверить на то, что строка состоит из букв латинского алфавита?


Ответ

Проверить строку на наличие только латинских символов:
boolean onlyLatinAlphabet = string.matches("^[a-zA-Z0-9]+$");
Запретить вводить в EditText не латинские символы:


abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
Или
editText.setFilters(new InputFilter[]{new InputFilter() { @Override public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { Pattern pattern = Pattern.compile("^[a-zA-Z0-9]+$"); Matcher matcher = pattern.matcher(source); if (!matcher.matches()) { return ""; } return null; } }});

Макрос, который зависит от аргументов

Хочется макрос, который расширяется в разное в зависимости от наличия или отсутствия у него аргументов. Пример:
_return(); /* расширяется в return(0xDEAFBEEF); */ _return(a+b); /* расширяется в return(a+b); */
Как?
В принципе набрёл на такую ветку, но дальше что? Ну узнали мы сколько аргументов, и...


Ответ

Немного поправил исходный комплект макросов по ссылке. Вот что получилось:
#define __VA_NARG__(...) \ __VA_NARG_(_0, ## __VA_ARGS__, __RSEQ_N()) #define __VA_NARG_(...) \ __VA_ARG_N(__VA_ARGS__) #define __VA_ARG_N( \ _1, _2, _3, _4, _5, _6, _7, _8, _9,_10, \ _11,_12,_13,_14,_15,_16,_17,_18,_19,_20, \ _21,_22,_23,_24,_25,_26,_27,_28,_29,_30, \ _31,_32,_33,_34,_35,_36,_37,_38,_39,_40, \ _41,_42,_43,_44,_45,_46,_47,_48,_49,_50, \ _51,_52,_53,_54,_55,_56,_57,_58,_59,_60, \ _61,_62,_63,N,...) N #define __RSEQ_N() \ 62, 61, 60, \ 59, 58, 57, 56, 55, 54, 53, 52, 51, 50, \ 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, \ 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, \ 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, \ 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, \ 9, 8, 7, 6, 5, 4, 3, 2, 1, 0
#define JOIN(x,y) _JOIN(x,y) #define _JOIN(x,y) x##y
#define r(...) JOIN(r,__VA_NARG__(__VA_ARGS__))(__VA_ARGS__) #define r0() nullargs() #define r1(x) oneargs(x)
r(x); r();
Тестирую на cpp из gcc. Получил в результате всех подстановок:
oneargs(x); nullargs();
Двойная передача JOIN->_JOIN->## - иначе не разворачиваются макроаргументы.
Операция препроцессора ## склеивает без пробелов и получается новый идентификатор. В макросах с переменным числом аргументов ## после запятой и перед __VA_ARGS__ убирает запятую, если аргументов нет - это расширение gcc, поэтому в других компиляторах может не работать.

Тонкая настройка LiveReload под sublime Text3

Нужно, чтобы LiveReload отслеживал определенные типы файлов, а не все. Сейчас в настройках пользователя такой код:
{ "enabled_plugins": [ "SimpleReloadPlugin", "SimpleRefresh" ] }


Ответ

Одним из решений может быть выкинуть сервер LiveReload, который поддерживает пакет для Sublime Text. Это не единственная реализация LiveReload-сервера.
Есть также guard-livereload: плагин для системы Guard для выполнения действий при изменении файлов. Он написан на Ruby и потому для работы требует установленного Ruby. Порядок установки минимально отличается от других плагинов для Guard, вроде guard-haml, об установке и запуске которого я уже писал ранее
В Guardfile можно задать шаблоны путей, изменение файлов по которым даст сигнал клиенту LiveReload для обновления. В README есть пример:
guard 'livereload' do watch(%r{app/views/.+\.(erb|haml|slim)}) watch(%r{app/helpers/.+\.rb}) watch(%r{public/.+\.(css|js|html)}) watch(%r{config/locales/.+\.yml}) end
Код выше, разумеется, на Ruby. Каждая строчка watch добавляет на отслеживание пути, подходящие под регулярное выражение, относительно корня проекта (рабочей директории, где запущен guard). Регулярка записывается /так/, %r{так}, или другими способами. Само выражение можно проверить на Rubular или просто в Interactive Ruby (IRB).
Guard можно загрузить и другими задачами, связанными с реакцией на изменение файлов. См. список плагинов Guard

Как сделать круглый Image?

Как сделать круглый Image, чтобы картинка которую в него ложишь, обрезала все края которые за кругом? Если картинка большого размера, хочется чтобы она отрисовывала только центр картинки, и не отображала края. Пытаюсь сделать вот так, но такой эффект совсем не устраивает:


Ответ

Просто берите вместо картинки Ellipse, а картинку положите как Fill. Эллипс задаст форму, а картинка — заполнение.

Результат:

Как реализовать циклический вызов метода раз в 10 минут?

Вопрос относительно Service: пытаюсь реализовать процесс, который должен запускаться раз в 10 минут. Создал для этого отдельный метод. Прописал Cлужбу в AndroidManifest.xml, создал отдельный класс для Service. На данный момент Cлужба выполняется при запуске приложения и продолжает работать после завершения работы приложения. Но сейчас этот процесс запускается единожды. Метод выполняется в отдельном Thread'e в onStartCommand(). То есть сама Cлужба работает как надо, но вот выполнение метода нужно поставить в бесконечный цикл (с периодичностью 10 минут) до тех пор, пока в приложении пользователь не остановит Cлужбу
Было бы здорово, если бы кто-то привел пример реализации запуска метода с периодичностью в 10 минут.


Ответ

Вам не нужен в данном случае сервис. Вам нужен AlarmManager
public static void setAlarm(Context ctx) { AlarmManager am = (AlarmManager) ctx.getApplicationContext().getSystemService(Context.ALARM_SERVICE); Intent intentToTimerReceiver = new Intent(ctx.getApplicationContext(), ReceiverTimer.class); intentToTimerReceiver.setAction("someAction");
PendingIntent pendingIntent = PendingIntent.getBroadcast( ctx.getApplicationContext(), 0, intentToTimerReceiver, PendingIntent.FLAG_CANCEL_CURRENT);
int period10Minutes = 10; long periodInMiliseconds = periodInMinutes * 60 * 1000; if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { am.setInexactRepeating(AlarmManager.RTC_WAKEUP, periodInMiliseconds, periodInMiliseconds, pendingIntent); } else { am.setRepeating(AlarmManager.RTC_WAKEUP, periodInMiliseconds, periodInMiliseconds, pendingIntent); } }
private static void cancelAlarm(Context ctx) { Log.i(TAG, "cancelAlarm"); AlarmManager am = (AlarmManager) ctx.getApplicationContext().getSystemService(Context.ALARM_SERVICE); Intent intentToTimerReceiver = new Intent(ctx.getApplicationContext(), ReceiverTimer.class); intentToTimerReceiver.setAction("someAction"); PendingIntent pendingIntent = PendingIntent.getBroadcast(ctx.getApplicationContext(), 0, intentToTimerReceiver, PendingIntent.FLAG_CANCEL_CURRENT);
am.cancel(pendingIntent); pendingIntent.cancel(); }
После его установки будет вызван описанный в ресивере и в отдельном классе ReceiverTimer, в коем вам и надо выполнять ваш периодический код
Ресивер:
public class ReceiverTimer extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Log.d(LOG, "onReceive " + intent.getAction()); } }
Манифест:



В чем отличие двух функций?

def foo1(x=[]): x.append(1) print(x)
def foo2(): x = [] x.append(1) print(x)
Почему при неоднократном вызове функции foo1() (без аргументов) получается вывод:
[1] [1, 1] [1, 1, 1] ...


Ответ

Разница в том, что первая функция может принимать 1 агрумент, вторая не принимает аргументов. Советую прочитать краткую информацию о функциях в Python.
Поведение, о котором Вы спрашиваете, происходит по такой причине, что значение по-умолчанию (пустой список) вычисляется единожды, когда функция была скомпилирована, затем оно используется при каждом вызове функции. Чтобы избежать такого поведения и получать пустой список при каждом вызове, измените код следующим образом:
def foo1(x=None): if x is None: x = [] x.append(1) print(x)

Вычисление (Pow(a,b) mod c) при больших a,b,c

Как вычислить данное выражение не словив переполнение при Pow ?
ulong Pow(ulong a, ulong b) { ulong p = 1; for (ulong i = 0; i < b; ++i) p *= a; return p; }
ulong m = Pow(a, b) % c;


Ответ

Если a * c не вылезает за ulong, то так:
ulong Pow(ulong a, ulong b) { a = a % c; ulong p = 1; for (ulong i = 0; i < b; ++i) p = (p * a) % c; return p; }
Инвариант: p < c. При умножении p * a < c * a, и по условию переполнения не происходит.

Обновление: для больших значений степени имеет смысл умножать путём последовательного возведения в квадрат.
ulong Pow(ulong a, ulong b) { a = a % c; ulong p = 1; ulong r = 1; while (b > 0) { if (b % 2 != 0) r = (r * p) % c; b = b / 2; p = (p * a) % c; } return r; }

java. Почему метод, создающий пустой .txt не работает без обработчика исключений?

Почему метод, создающий файл (пустой .txt) не работает без обработчика исключений?
package filecreator;
import java.io.File; import java.io.IOException;
public class FileCreator {
public static void main(String[] args) {
String fileName = "My File.txt"; String filePath = "/Users/Donrumata/Desktop/";
File myFile = new File(filePath + "/" + fileName);
try { myFile.createNewFile(); } catch (IOException e) { e.printStackTrace(); }
}
В этом случае компиляция проходит без ошибок (если я не ошибаюсь), но без обработчика - именно в строке с методом, создающим файл, происходит IOExeption. Почему?


Ответ

Дело в том, что сигнатура метода содержит ключевое слово throws, кое означает, что вызов метода может выкинуть ошибку типа IOException.
Методы, так обозначенные не могут быть вызваны вне обработчика исключений (try/catch) или метода, с подобной же сигнатурой.

Кривая граница элемента

Подскажите, пожалуйста, как сверстать границу как на этом скриншоте? Граница, которая после изображения.


Ответ

Вариант на основе статьи "Геометрические фигуры на CSS". С помощью псевдоэлементов :before и :after делаем два треугольника, которыми закрываем нижние углы фотографии.
Псевдоэлементы добавляются до и после содержимого контейнера, поэтому контейнер является родительским блоком по отношению к своим псевдоэлементам. Позиционируем контейнер относительно, а его псевдоэлементы - абсолютно, чтобы вести отсчёт координат от краёв контейнера
bottom: 0; прижимает нижние края треугольников к нижнему краю контейнера. Аналогично left: 0; и right: 0; задают положение для левого и правого края.
1vw равен 1 проценту от ширины области просмотра.
И назначаем картинке свойство display: block;, чтобы между нею и контейнером не возникало лишних просветов.
.container { position: relative; width: 100%; } img { display: block; width: 100%; } .container:after, .container:before { border-bottom: 3vw solid white; bottom: 0; content: ""; position: absolute; } .container:before { border-right: 50vw solid transparent; left: 0; } .container:after { border-left: 50vw solid transparent; right: 0; }


Как изменить элемент UI запущеный в отдельном потоке в консольном приложении

Консольное приложение выводит текстовую информацию на экран. Требуется дуплицировать текст в окне WPF. Окно создается в отдельном потоке (в том же самом не получается):
var loggerThread = new Thread(() => { var logWindow = new Window { Title = "Logger", Width = 100, Height = 100 };
var stackPanel = new StackPanel { Name = "stackPanel" };
stackPanel.Children.Add(new TextBlock { Name = "textBlock", Text = "new text
" });
logWindow.Content = stackPanel; logWindow.ShowDialog(); });
loggerThread.SetApartmentState(ApartmentState.STA); loggerThread.IsBackground = true; loggerThread.Start();
Как можно добавлять строки в textBlock из разных классов приложение? Или в общем, как получить доступ к UI элементам внутри отдельного потока loggerThread?


Ответ

Очень просто.
Из вашего UI-потока, сохраните значение Dispatcher.CurrentDispatcher в глобальное место. (Вы можете ещё воспользоваться Dispatcher.FromThread из главного потока, но вы должны быть уверены, что диспетчер в UI-потоке уже создан.) Пусть это «глобальное место» называется dispatcher
Теперь вы можете отправлять код в UI-поток, используя dispatcher.BeginInvoke или dispatcher.InvokeAsync
await dispatcher.InvokeAsync(() => textBlock.Text = "Всем привет!");

Кстати, вам скорее всего бы не понадобился дополнительный поток, если бы вы отмаркировали функцию Main атрибутом [STAThread]. Но при этом для длительных синхронных операций (а такие обычно часто встречаются в консольных программах) вам всё равно понадобился бы фоновый поток.

Вот более современная версия DispatcherThread
public class DispatcherThread : IDisposable { readonly Dispatcher dispatcher; readonly Thread thread;
static public async Task CreateAsync() { var waitCompletionSource = new TaskCompletionSource(); var thread = new Thread(() => { waitCompletionSource.SetResult(new DispatcherThread()); Dispatcher.Run(); });
thread.SetApartmentState(ApartmentState.STA); thread.Start();
return await waitCompletionSource.Task; }
private DispatcherThread() { dispatcher = Dispatcher.CurrentDispatcher; thread = Thread.CurrentThread; }
public DispatcherOperation Execute(Action a) => dispatcher.InvokeAsync(a); public DispatcherOperation Get(Func getter) => dispatcher.InvokeAsync(getter);
public async Task CloseAsync() { var waitCompletionSource = new TaskCompletionSource(); EventHandler shutdownWatch = (sender, args) => waitCompletionSource.SetResult(0); dispatcher.ShutdownFinished += shutdownWatch; try { if (dispatcher.HasShutdownFinished) return; dispatcher.BeginInvokeShutdown(DispatcherPriority.Normal); await waitCompletionSource.Task; } finally { dispatcher.ShutdownFinished -= shutdownWatch; } }
public void Dispose() { dispatcher.InvokeShutdown(); if (thread != Thread.CurrentThread) thread.Join(); } }
Пользоваться просто:
DispatcherThread dt = await DispatcherThread.CreateAsync(); Window w = await dt.Get(() => { var w = new Window() { Height = 100, Width = 100, Content = "hello world" }; w.Show(); return w; });
// ... await dt.Execute(() => w.Content = "goodbye world");
// ... await dt.Execute(() => w.Close()); await dt.CloseAsync(); dt.Dispose();

Audacity, вместо звука воспроизводится шипение и треск

В программе для редактирования звука во время проигрывания вместо звука идёт громкое шипение и треск и время идёт намного быстрее, как на перемотке. OS Linux 32x


Ответ

Аналогичная проблема воспроизводится не только в Audacity, но и в FTL Faster Than Light под Linux при использовании Pulseaudio. Причём не всегда, но часто.
Эксперименты показали, что если запустить требуемую программу, предварительно задав переменную среды PULSE_LATENCY_MSEC на 60, то симптомы исчезают.
— Источник

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

C++. Программа пропускает строчку кода(считывание переменной)

Доброго времени суток. Возникла проблема с С++. Если кратко - в одной строчке не происходит считывание с помощью потока ввода cin. Код ниже. Место где происходит ошибка - обозначено комментарием. Пробовал очищать поток перед считыванием user_num_to_sum с помощью cin.clear() - don't help.
#include //cin, cout #include //_getch() #include //vector
using std::cout; using std::cin; using std::vector;
int main () { vector numbers; // вектор из целых чисел int num = 0; // число которое заносим в конец вектора int user_num_to_sum = 0; // число элементов вектора для суммирования(пример: если число 3, то суммируем первые 3 элемента)
cout << "Write a few numbers:
"; while(cin >> num) { numbers.push_back(num);// заносим числа в вектор } cout << "How much elements of vector do you want to sum?
"; cin >> user_num_to_sum; // ERROR: программа пропускает данную строчку и выполняет следующую подставляя в user_num_to_sum значение 0, которое было задано при инициализации. cout << "The sum of first " << user_num_to_sum << " numbers -> ";
//код еще не готов полностью, программа смысла не имеет
_getch();
return 0; }
Я и останавливаю цикл while(cin >> num) вводом ошибочного символа '|'. Данный приём использует в своей книге Страуструп. Вот только потом почему-то после остановки цикла не срабатывает считывание целого числа user_num_to_sum.
P.S. Сработал вариант с использованием cin.clear(), но только в случае завершения ввода данных в вектор путём нажатия Ctrl+Z. Если же завершить его путём ввода неверных данных(к примеру '|' при считывании данных типа int), то cin.clear() не срабатывает. Вопрос: почему?


Ответ

while(cin >> num) { // Пока мы можем прочитать int, читаем его ... // и что-то делаем }
// Вышли из цикла, т. к. int прочитать нельзя ... // Тут мы ничего не читали cin >> user_num_to_sum; // Опа! Чиатем ещё int
Но ведь состояние потока не изменилось - int как нельзя было прочитать, так и сейчас нельзя.
Если ввод последовательности чисел заканчивается неким нечисловым вводом, следует прочитать это нечто как строку и только потом считывать следующее число. Если же ввод завершался нажатием ctrl+z, то там вроде вообще eof выставляется.
Также для сброса маркера ошибки надо перед чтением вызвать cin.clear()

WebSocket с серверной частью на php

Доброго времени суток, пытаюсь разобраться с вебсокетами, а именно с серверной его частью на php. С клиентской все просто:

А вот с серверной... Перечитал кучу постов на хабре, тут, да и не только. Но никак не могу понять, для чего нужен phpDeamon или Ratchet, и в каких случаях они нужны? И в тени для меня осталось как их устанавливать на реальный хостинг, везде разговор ведется о установке на локальные серверы типа denwer или openserver. Просветите пожалайста


Ответ

Обычное построение веба основано на архитектуре "клиент-сервер". Т.е. есть клиентские машины, а есть сервера, которые ожидают запросы от клиентов, обрабатывают эти запросы и отправляют обратно клиенту. В Вашем случае клиентом выступает браузер. Он может общаться с каким-либо вебсервером (в большинстве случаем эту роль выполняет apache в связке с php) по одному из протоколов (языков обмена по сети). Как правило, это HTTP. Т.е. Вы отправляете из браузера HTTP-запрос, вебсервер его обрабатывает и отправляет обратно. Но можно обращаться и по другому протоколу (языку обмена) - websocket. Это отдельный протокол обмена, не имеющий ничего общего с HTTP. Опять же, клиентом в Вашем случае выступает браузер. Но вот незадача... нужен еще и сервер, который примет запрос, обработает его и вернет обратно по тому же протоколу. А обычный вебсервер не понимает этого "языка". Обычный вебсервер понимает только HTTP. Поэтому необходимо установить и запустить любой другой сервер (не обязательно должен быть phpDeamon), который будет принимать и обрабатывать запросы именно по протоколу websocket.
Что касается хостинга, то хостинг хостингу рознь. Но если Вы возьмете VPS да еще и с Win, то, по сути, получите в свои руки компьютер, на котором можете делать все, что душе угодно (можете при желании даже и denwer и openserver поставить). Ну а как пользоваться компьютером, думается, объяснять не нужно.

PHP фреймвок, который научит как архитектурно правильно нужно писать веб-приложения [закрыт]

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


Ответ

Симфони однозначный лидер.
В ней есть миллион ограничений, которые просто не дают сделать неправильно. Это сильно бесит поначалу, но со временем понимаешь, что уставы пишутся кровью, и каждое ограничение - это не прихоть разработчиков, а забота о тебе же самом.
К примеру, в консольной команде нельзя получить доступ к методу контроллера. И это правильно, потому что если какой-то функционал требуется больше, чем в одном месте - ему не место в контроллере, и он должен быть помещен в библиотеку-хелпер, а контроллер уже должен обращаться к этому хелперу.
Ларавель, в свою очередь, очень хороший фреймворк, но он ориентирован на простоту и скорость разработки, за счет обхода некоторых важных принципов. Чтобы не быть голословным, вот хорошая статья про недостатки Laravel

Как в выборке задать значение колонке 1 или 0 в зависимости от существования в ней значения?

Есть запрос на выборку:
SELECT t.id, t.alias, t.name, at.tag_id as status FROM tbl_tag t LEFT JOIN tbl_article_tags at ON t.id = at.tag_id
Нужно, чтобы он вернул результат, в котором колонка status будет заполняться 1 (если в ячейке есть значение) или 0 (если в ячейке NULL). Как такое реализовать?


Ответ

SELECT t.id, t.alias, t.name, at.tag_id as status, case when at.tag_id is null then 0 else 1 end FROM tbl_tag t LEFT JOIN tbl_article_tags at ON t.id = at.tag_id

Запрос на поиск по ключевому слову из двух таблиц

Всем привет. Есть рабочий запрос:
SELECT * FROM `realty_kvartiru` WHERE (dopolnitelnaya_infa LIKE 'Ленина' OR ulitsa LIKE 'Ленина' OR orientir LIKE 'Ленина')
который ищет по ключевому слову в одной таблице realty_kvartiru по трем столбцам, как можно его модернизировать, чтоб он искал еще по четвертому полю agenstvo_title из второй таблицы phones?
таблицы имеют следующую структуру :
realty_kvartiru: id, user_id, tip, tsena, rayon_id, ulitsa, orientir, etaj, e‌​tajnost, kolichestvo‌​_komnat, nomer_doma‌​, nomer_kvartiru, sos‌​toyanie_tip, shema_t‌​ip, balcon_tip, sanu‌​zel_tip, istochnik_i‌​d, material_tip, jul‌​aya_plowad, obwaya_p‌​lowad, kuhnya_plowad‌​, dopolnitelnaya_inf‌​a, fio, nuzno_prodat‌​, is_deleted, create‌​d_at, updated_at, is‌​_imported, in_blackl‌​ist, in_deleted_list‌​, deleted_at, secret‌​ary_id, call_status‌, ​commentary, own_typ‌​e, is_exclusive, lin‌​k, deleted_by, must_‌​called, wanted_to_re‌​move, notebook_comme‌​nt, agents_realty
phones: id, phone, is_posrednik, agenstvo_title


Ответ

Если эти 2 таблицы можно связать по id, то можно:
SELECT * FROM realty_kvartiru r LEFT JOIN phones p ON r.id = p.id WHERE dopolnitelnaya_infa LIKE 'Ленина' OR ulitsa LIKE 'Ленина' OR orientir LIKE 'Ленина' OR agenstvo_title LIKE 'Ленина'

Как найти незанятые области через запрос MySql

Приложил картинку: в базе хранятся закрашенные области (серый цвет), как координаты левого верхнего угла и правого нижнего, т.е. ЧЕТЫРЕ числа (х1,у1,х2,у2). Как запросом в базу MySql получить координаты свободной области, если условия такие:
начиная сверху слева найти свободную область размером 1х1 начиная сверху слева найти свободную область размером 2х2
То есть для п.1 ответ должен быть 0,0,1,1 (голубой квадратик) для п.2 = 6,0,8,2 (оранжевый квадратик)
Все, на что хватило знаний)) -это функцией MIN нахожу свободную координату по оси X, но в совокупности с осью Y это неправильно. И для поиска областей 2х2 поиск через MIN вообще не применим. Как вариант, думал создать еще одну таблицу с перечислением всех возможных точек (т.е. для данного квадрата это 10х10=100 строк) и ставить пометку - такие-то точки заняты, а такие-то нет и искать среди незанятых, но если размер поля надо будет увеличить (с 10х10 до например 100х100), то скорее всего начнутся задержки??? База:
DROP TABLE IF EXISTS `m_items`; CREATE TABLE `m_items` ( `id` int(11) NOT NULL, `x1` smallint(4) NOT NULL, `y1` smallint(4) NOT NULL, `x2` smallint(4) NOT NULL, `y2` smallint(4) NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO `m_items` (`id`, `x1`, `y1`, `x2`, `y2`) VALUES (1, 3, 0, 6, 4), (2, 8, 0, 9, 2), (3, 0, 1, 2, 2), (4, 0, 3, 2, 5), (5, 7, 3, 9, 7), (6, 1, 6, 6, 7), (7, 1, 8, 2, 10);


Ответ

Попробуйте так:
select x,y from c -- см. ответ @mnv left join m_items on x <= X2-1 and x+2 >= X1 and y <= Y2-1 and y+2 >= Y1 where x+2<10 and y+2<10 and id is null order by y, x;
+2 - это квадраты 3x3.
SQLFiddle

Отображение старших разрядов нулями перед цифрой

Как можно вывести число от 0 до 9 в таком виде 00, 01, 02, то есть, чтобы ноль был перед цифрой?


Ответ

По комментарию @pavel, конечно же, самый простой вариант, который приходит на ум:
cout << 0 << value;
Пример: ideone

Можно через Си-шную функцию printf
int dd = 1, mm = 9, yy = 1; printf("%02d - %02d - %04d", mm, dd, yy);
Пример: ideone

Можно через sprintf
int dd = 1, mm = 9, yy = 1; char s[25]; sprintf(s, "%02d - %02d - %04d", mm, dd, yy); cout << s;
Пример: ideone

Используя
cout << setfill('0') << setw(2) << 5;
Пример: ideone

Как округляются числа double до int

По каком принципу происходит округление?
double y = 1.5; int x = (int) y;


Ответ

Остается целая часть, все остальное отбрасывается(округляется к меньшему). Даже если y = 1.999999, то x все равно будет 1

Использование const и constexpr

В каком классе задач предпочтительнее использовать constexpr? У меня создалось впечатление, что практически всегда я могу использовать const. Когда требуется задавать значение на этапе компиляции?


Ответ

У методов const подразумевает compile-time проверку на отсутствие модифицации (и таких возможностей, например, возвращение неконстантного указателя) состояния типа, исключая mutable-поля. Само выражение может вычисляться и в run-time.
constexpr же позволяет помечать выражения, которые обязательно вычисляются на этапе компиляции и могут использоваться, скажем, в качестве параметров шаблонов, или в инициализаторах констант.

Шаблон для валидации кириллических символов в JAVA

Необходимо составить регулярное выражение для проверки наличия кириллических символов в строке. Как такое можно реализовать?


Ответ

Не совсем ясен вопрос проверка вхождения,только ли из символов кириллицы (к слову кириллица понятие растяжимое) состоит строка или нечто другое.Но по сути вопроса выражение типа [а-яА-Я]+ вернет Вам true при наличии в строке хотя бы одного включения перечисленных символов.
Ну и от себя дополню ответ методом проверки наличия символов кириллицы в строке:
public boolean isCyrillic(String s) { boolean result = false; for (char a : s.toCharArray()) { if (Character.UnicodeBlock.of(a) == Character.UnicodeBlock.CYRILLIC) { result = !result; break; } } return result; }
UPD: к ответу @Aleksei Chibisov Да не вернет. Собственно к этому и ремарка "кириллица понятие растяжимое" - самих символов которые относятся к данной группе масса. К кириллическим алфавитам относятся: Белорусский,Болгарский,Сербский,Македонский,Русский,Украинский ...и такие символы как є i w ... и куча других...Как по мне стоит в данном случае использовать именно UnicodeBlock - там присутствуют расширения A и B c версии 1.7 И реакция метода представленного выше на символ 'ё' или 'є' - будет true

Не удаётся подключить Dll

К проекту на C# подключаю библиотеку C++, библиотека полностью рабочая. Руководство по подключению взял тут
[DllImport("C:\\Users\\Zaki\\Desktop\\SetsGen.dll", CallingConvention = CallingConvention.Cdecl)] public static extern string GetSets(string ids, int power);
public void DllSub(string param) { try { string myAns = GetSets(param, 3); string[] tokens = myAns.Split('/'); foreach (var token in tokens) { Console.WriteLine(token); } } catch (Exception ex) { Console.WriteLine(ex.Message); } }
Нативная сигнатура функции GetSets в Dll выглядит следующим образом:
std::string GetSets(std::string ids, int power)
Получаю исключение при обращении к портированной функции GetSets:
An unhandled exception of type 'System.AccessViolationException' occurred in Test.exe Additional information: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
Какие могут быть причины и как исправить?


Ответ

Причины могут быть разные:
Ошибка в реализации нативной функции. Чтобы её исключить, попробуйте сделать пустую GetSets и пересобрать DLL. Проблемы совместимости DLL и С# кода. Был случай, когда DLL, собранная в C++Builder приводила к ошибкам на стадии выполнения. Пересборка компилятором MS решила проблему на корню. Неправильно передаются аргументы в функцию. См. маршалинг строк.
Если сигнатура нативной функции содержит сложные типы из стандартной библиотеки C++ (в том числе и std::string), использовать такую функцию в P/Invoke будет проблематично (читай как невозможно). Разные компиляторы по-разному реализуют стандартные классы, поэтому передавать между модулями такие типы довольно опасно.
В данном случае наиболее правильное решение будет заключаться в том, чтобы экспортировать функцию, принимающую const char* (си-строку), а дальше в потрохах DLL уже можно использовать и std::string для удобства.

Инициализация переменной в PHP

Писал код писал...потом подумал я же все время перед тем как использовать переменную всегда делаю присвоение значением того типа который мне нужен. Почитал мануал для уверенности, проведя несколько тестов возникли вопросы:
Если мы используем неинициализированную переменную мы словим Notice, хотя в мануале написано что использовать неинициализированные переменные это очень хорошая практика, где?(Возможно это криво написано в мануале, возможно имелось ввиду наоборот) Если мы попытаемся к неициализированной переменной сделать допустим конкатенацию, мы словим Notice, хотя если мы напишем переменной изначально NULL, то Notice мы не словим, хотя опять же если мы выведем неинициализированную переменную через var_dump мы получим NULL...выходит в одном случае есть Notice, а в другом нет, почему? Если мы присвоим переменной значение NULL будет ли считаться что переменная инициализированна? А если мы просто напишем переменную и в конце поставим точку с запятой будет ли это являться тем что переменная неинициализированна?(В мануале ни разу не видел чтобы просто писали переменную без присвоения)
P.S Если я вспомню еще какие-то вопросы по этой теме отпишу...я не знаю возможно мои вопросы связаны с тем что я не понимаю тип NULL?


Ответ

Для начала - тип null
NULL - это единственно возможное значение типа null.
Переменная считается null, если:
ей была присвоена константа NULL. ей еще не было присвоено никакого значения. она была удалена с помощью unset().
Почему вообще это работает
Интерпретатор PHP использует позднее связывание(динамическая типизация - переменные связываются с типом в момент присвоения значения), потому возможно выполнение кода с переменными, которые никогда не были объявлены.
Но тем не менее между явно объявленной null-переменной и не объявленной разница есть!
Неинициализированная, NULL, пустая и заданная переменная
$null = NULL; // заданная null $empty = ""; // заданная и пустая $true = true; // заданная и не пустая unset($undefined); // не инициализированная/не заданная (unset() тоже, что ее и не было)
Вот как это выглядит в интерпетаторе php:
Т.е. мы видим, что если переменная не задана, то она ВООБЩЕ ПУСТАЯ!
Результат функций isset, empty, is_null

Тогда в чем разница и где ее увидеть???
При попытке обращения к неинициализированной переменной PHP отдаст значение NULL и сгенерирует E_NOTICE ошибку!
Чтобы проверить существовала ли переменная или ей было задано значение NULL - нужно воспользоваться функцией array_key_exists:
array_key_exists('name_of_variable', $GLOBALS); для проверки в глобальной области видимости array_key_exists('name_of_variable', get_defined_vars()); для проверки в текущей области видимости
В текущем примере она сработает так:
array_key_exists('null', get_defined_vars()); // будет true array_key_exists('undefined', get_defined_vars()); // будет false
Теперь ответы на вопросы
Если мы используем неинициализированную переменную мы словим Notice, хотя в мануале написано что использовать неинициализированные переменные это очень хорошая практика, где?(Возможно это криво написано в мануале, возможно имелось ввиду наоборот)
В мануале написано, что хотя инициализировать и не обязательно, но считается хорошей практикой!
Если мы попытаемся к неициализированной переменной сделать допустим конкатенацию, мы словим Notice, хотя если мы напишем переменной изначально NULL, то Notice мы не словим, хотя опять же если мы выведем неинициализированную переменную через var_dump мы получим NULL...выходит в одном случае есть Notice, а в другом нет, почему?
Про разницу null и неициализированной написал выше.
Если мы присвоим переменной значение NULL будет ли считаться что переменная инициализированна? А если мы просто напишем переменную и в конце поставим точку с запятой будет ли это являться тем что переменная неинициализированна?(В мануале ни разу не видел чтобы просто писали переменную без присвоения)
Если присвоить NULL - да, она будет инициализированной. Если просто напишем и в конце точка с запятой - нет, она так и будет неинициализированной.

“Проходной балл” Как ускорить работу кода и устранить недоработку?

Помогите разобраться где может быть недоработка и каким образом можно ускорить работу кода?

#include #include #include using namespace std;
struct Student { char fam[20]; char name[20];
int howMOc = 0; //как много оценок(размер для массива *ocenki ) int* ocenki; //помещаем double srBal = 0; };
int main() { freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); setlocale(0, "rus"); int howMStud = -1; int howMSubj; int pasScore = -1; //прох балл cin >> howMStud;
if ((howMStud > 10000) || (howMStud < 1)) exit(0);
Student* postup = new Student[howMStud];
for (int i = 0; i < howMStud; i++) { cin >> postup[i].fam; cin >> postup[i].name; cin >> howMSubj;
if ((howMSubj > 50) || (howMSubj < 1)) exit(0);
postup[i].howMOc = howMSubj; postup[i].ocenki = new int[howMSubj];
for (int j = 0; j < howMSubj; j++) { cin >> postup[i].ocenki[j]; postup[i].srBal += postup[i].ocenki[j]; }//for j
postup[i].srBal = postup[i].srBal / howMSubj; }//for i
cin >> pasScore;
//Вывод for (int i = 0; i < howMStud; i++) { if (postup[i].srBal >= pasScore) { cout << postup[i].fam << " " << postup[i].name; cout << endl; }//end if }//end i
//system("pause"); return 0; }


Ответ

Из того что я вижу в этом коде:
(WA) при вычислении среднего от 50: 10^9 10^9 ... 10^9 вы получите целочисленное переполнение, рекомендую использовать тип long long (у вас может и 64 бита но не факт что там так же). (TL) работа с cin/cout оочень медленная. Есть разные способы исправить это, можете читать через scanf/printf, можно использовать магические строки
cout.tie(0); iostream::sync_with_stdio(0);
рекомендую статью http://codeforces.com/blog/entry/5217?locale=ru (адаптация под олимпиады).
(WA/UB) размер строки 20 символов, но не 21 (а нуль символ?) Отвыкайте использовать динамическую память на олимпиадах без реальной необходимости, лучше задать массив сразу размера 10.000 и всё. Больше не меньше. (ML) не храните массив с оценками только само среднее значение, массив используйте общий для всех студентов.
Так код с виду рабочий.

Завершить процесс в определенное время bash

Здравствуйте!
Помогите, пожалуйста, сделать скрипт для "убийства" процесса каждый день в 04:30.
P.S.: ОС CentOS. Знаю про cron, bash не изучал. Процесс называется /root/samp03/samp03svr


Ответ

Используйте для этого крон в сочетании с командой pkill samp03svr
Соответственно строка для /etc/crontab
30 4 * * * pkill samp03svr