Страницы

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

суббота, 4 апреля 2020 г.

Как распечатать символ стрелки?

#linux #c

                    
Выяснил, что символы стрелок имеют следующие ASCII коды:

72 - вверх
75 - влево
77 - вправо
80 - вниз


Но эти же коды имеют некоторые буквы в верхнем регистре.

Возможно, эта информация ошибочна, но при проверке мне никак не удалось напечатать
символы стрелок.
Подскажите пожалуйста как это сделать через обычный printf?
Поддерживается только ASCII.
    


Ответы

Ответ 1



эти коды хоть и соответствуют стрелочкам, но не все так просто - они там составные. То есть, код стрелки - это два байта, а не один. И первый байт Вы забили указать. Этот байт - 224. То есть, код стрелки вверх - 224 72. Вот только распечатать их нельзя. Это управляющие символы клавиатуры. Более того, их нет в стандартной аски таблице. Когда то давно, когда был дос и нужны были стрелочки, делали кодогенераторы. То есть, готовиться своя таблица, в которой прописано отображение каждого символа. И можно взять часть символов, записать туда правильные картинки и использовать. Я даже не знаю, возможно ли это сейчас, но думаю, что все возможно. В любом случае, можно перевести видеорежим в графический и рисовать красиво.

Ответ 2



Используйте эти коды: ASCII value of character ↑: 24 ASCII value of character ↓: 25 ASCII value of character →: 26 ASCII value of character ←: 27

ImageView и ProgressTab в ListView

#java #android #listview #android_asynctask

                    
Есть ListView в которое по нажатию кнопки должен добавлять новый элемент с ProgressTab
и невидимое ImageView. 

ImageView сразу начинает конвертироваться в нужное нам изображение через AsyncTask
и прогресс конвертирования отображается в ProgressTab. Когда конвертирование закончилось,
ProgressTab удаляется, а вImageView сеттится картинка и она становится видимой.



Но после 3 или 4 повторения операции это перестает работать и в ImageView сразу сеттится
рандомная из картинок, которые были обработаны до этого. (как я понял, такое происходит,
когда элементы из listView перестают быть видными на экране).  Как это можно решить?
И вообще правилен ли у меня подход?

Код адаптера:

public class ListAdapter extends BaseAdapter {

Context context;
List dataList;

public ListAdapter(Context context, List dataList) {
    this.context = context;
    this.dataList = dataList;
}

@Override
public int getCount() {
    return dataList.size();
}

@Override
public Object getItem(int i) {
    return null;
}

@Override
public long getItemId(int i) {
    return 0;
}

static class ViewHolder{
    ImageView image;
    ProgressBar progressBar;
}

@Override
public View getView(int position, View convertView, ViewGroup viewGroup) {
    View v = convertView;
    ViewHolder holder;

    if (convertView == null) {
        LayoutInflater inf = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = inf.inflate(R.layout.item_progress, null);

        holder = new ViewHolder();
        holder.image = (ImageView) v.findViewById(R.id.itemProgress_previewImage);
        holder.progressBar = (ProgressBar) v.findViewById(R.id.itemProgress_progressBar);
        v.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    if (holder.progressBar.getProgress() == 0 && holder.progressBar.getVisibility()
== View.VISIBLE) {
        ConvertImageTask convertImageTask = new ConvertImageTask(holder.progressBar,
holder.image, dataList.get(position).getType());
        convertImageTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, dataList.get(position).getBitmap());
    }

    return v;
}


}

Код Таска для конвертирования:

public class ConvertImageTask extends AsyncTask {

private static final String TAG = "WHALETAG";
Random random = new Random();
int timeout = random.nextInt(5)+2; // для искусственного замедления конвертации

private static final int TYPE_ROTATE = 0;
private static final int TYPE_INVERT = 1;
private static final int TYPE_MIRROR = 2;

private int type = -1;

ProgressBar bar;
ImageView image;
public ConvertImageTask(ProgressBar bar, ImageView imageView, int type) {
    this.bar = bar;
    this.image = imageView;
    this.type = type;
}

@Override
protected void onPreExecute() {
    super.onPreExecute();
    bar.setMax(timeout);
}

@Override
protected void onProgressUpdate(Integer... values) {
    super.onProgressUpdate(values);
    int i = values[0];
    bar.setProgress(i);
}

@Override
protected Bitmap doInBackground(Bitmap... bitmaps) {

    Bitmap bitmap = bitmaps[0];

    switch(type){
        case TYPE_ROTATE:
            bitmap = rotateBitmap(bitmap);
            break;
        case TYPE_INVERT:
            bitmap = invertBitmap(bitmap);
            break;
        case TYPE_MIRROR:
            bitmap = mirrorBitmap(bitmap);
            break;
    }

    // Искусственно замедляем конвертацию
    for (int i=1; i<=timeout; i++) {
        Log.d(TAG, "doInBackground: осталось " + (timeout-i));
        try {
            Thread.sleep(1000); // спим 1 секунду
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        publishProgress(i);
    }

    return bitmap;
}

@Override
protected void onPostExecute(Bitmap bitmap) {
    super.onPostExecute(bitmap);
    Log.d(TAG, "onPostExecute: закончилась конвертация типа " + type);
    bar.setVisibility(View.GONE);
    image.setImageBitmap(bitmap);
    image.setVisibility(View.VISIBLE);
}




скажите, может правильнее будет поступить так:


Запускать асинкТаск, передавая в него (битмап для обработки, адаптер)


Внутри асинкТаска получать конвертированный bitmap и отправлять его в список битмапов.
По завершении таска вызывать adapter.notifyDataSetChanged();

В адаптере устанавливать готовый полученный bitmap в его holder.imageView?
Вопрос только, как тогда обновлять progressBar по мере конвертирования?

    


Ответы

Ответ 1



Обнулите картинку в ImageView перед началом загрузки: if (holder.progressBar.getProgress() == 0 && holder.progressBar.getVisibility() == View.VISIBLE) { holder.image.setImageDrawable(null); //теперь запускайте скачивание }

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

#javascript

                    
Требуется сохранить куку для всех под доменов, но не получается. 

Что не так? Код:

function cetcooke(status) {
                var date = new Date;
                var SERVER_NAME = ".site.ru";
                date.setDate(date.getDate() + 15); // время жизни куки
                document.cookie = "sound="+ status +"; expires="+date.toUTCString()+";
path='"+SERVER_NAME+"'"; // ставим куку 
}


нажимаю на кнопочку сохраняет как для определенной страницы, но не для домена. 

Помогите решить проблему.
    


Ответы

Ответ 1



Не верно в path данные записываете. Нужно так: path="/" А то что у Вас в переменной var SERVER_NAME = ".site.ru"; нужно записывать в domain Вот у меня всегда есть функция для создание cookie: function set_cookie ( name, value, exp_y, exp_m, exp_d, path, domain, secure ) { var cookie_string = name + "=" + escape ( value ); if ( exp_y ) { var expires = new Date ( exp_y, exp_m, exp_d ); cookie_string += "; expires=" + expires.toGMTString(); } if ( path ) cookie_string += "; path=" + escape ( path ); if (domain) cookie_string += "; domain=" + escape (domain); if ( secure ) cookie_string += "; secure"; document.cookie = cookie_string; } Вот так использую: set_cookie('nameCookie', "valueInCookie", 0, 0, 0, "/");

Возврат из функции

#cpp

                    
Можно ли возвращать ссылку на локальную переменную? Будет ли это быстрее, чем возврат
по значению?

int const& func(...)
{
    int x;
    ...
    return x;
}

    


Ответы

Ответ 1



Нет, возвращать ссылку на локальную переменную нельзя (т.е. компилятор допускает, но категорически не стоит так делать), так как в результате таких действий вы получите ссылку на область памяти, выделенную под локальную перемменную из функции, которая вышла из области видимости за её пределами. Вследствие чего, эта область памяти будет помечена, как свободная (заметьте, что она будет лишь помечена свободной, а не перезаписана 0-ми или чем-нибудь еще, что в общем случае зависит от конкретного компилятора), а в дальнейшем может в любой момент быть перезаписана кем-угодно (например, при выделении памяти под какую-нибудь другую переменную). Контрольный пример: #include int const& func() { int x = 1; return x; } int main() { const int& x = func(); std::cout << x << std::endl; // немаловероятно, что уже здесь область памяти будет перезаписана и результат будет "неожиданным" std::cout << x << std::endl; // нет уверенности даже в том, что в данной строчке будет выведно тоже значение, что и в предыдущей } Можете посмотреть здесь на примере компилятора gcc. В тоже время, если воспользоваться локальной static переменной из функции (синглтон Майерса), то такое действие будет валидно, так как такая переменная будет "жить" все время "жизни" приложения. Вследствие чего, область памяти, выделенная под нее (на которую мы будем ссылаться), не будет помечена свободной все время "жизни" приложения (не следует так делать - это чисто для примера): #include int const& func() { static int x = 1; return x; } int main() { const int& x = func(); std::cout << x << std::endl; // 1 }

Вставка текста в текст combobox , который не является его элементом

#c_sharp #winforms

                    
У меня есть combobox с элементами. Дело в том что при выборе элемента я хочу в текст
combobox-a вставить некий другой текст. ну например combobox.Text="zzz". Почему-то
не получается. В чем причина, не смогли бы объяснить. 

Самое интересное в breakpoint-e в свойстве Text="zzz", но вот в форме ничего не отображается.
    


Ответы

Ответ 1



private void cboxScet_SelectionChangeCommitted(object sender, EventArgs e) { this.BeginInvoke((MethodInvoker)delegate { cboxScet.Text = "Нужный текст"; }); }

Настройка меню в android

#android #android_toolbar #android_menu

                    
Использую ToolBar и на нем эсть кнопка меню  в виде  трех точек! 
Мне нужно заменить ее на свое изображение ... Но я не знаю как !

Прошу подсказки:  как это можно сделать ??? 

Или можно настроить так чтоб точки были другим цветом ???


    


Ответы

Ответ 1



Чтобы заменить на свое изображение: Если хотите изменить цвет:

Заменить все <![CDATA[ и ]]> методом replaceAll без использования регулярных выражений

#java #android #регулярные_выражения

                    
Дано:

Есть строка типа 

  


Задача:

Надо убрать все встреченные  максимально просто. Например, методом
replaceAll(). 

Пробовал:

По аналогии с методом replace пробовал просто подставить ненужное первым аргументом,
но оно не принимается, т.к. ожидает регулярное выражение, а ?
Решение регулярками не предлагать)
    


Ответы

Ответ 1



Так пробовали? System.out.print(" ".replaceAll("(<\\!\\[CDATA\\[)|(\\]\\]>)","")); Результат: ТУТ_ТЕКСТ И_ТУТ_ТОЖЕ И_ЕЩЁ ЗЫ Для студии есть плагин RegexpTester. ЗЗЫ Экранирование сделает студия сама, если вставлять регулярку внутрь строки.

Выбор случайного значения в базе данных

#php #mysql #sql

                    
В общем есть база вида id | group | user

Надо выбрать 1 случайную строку из 100 которая содержит group = "vip" , а user =
"". И записать в user этой строки например 'что-то'. Как это сделать?

UPD: Запрос в ответе не работает, выдает ошибку 1064, вот таблица, может что-то там
поправить (ошибка у key).



    


Ответы

Ответ 1



Самый простой вариант, это извлечь случайный идентификатор из этих таблиц SELECT id FROM tbl WHERE group = "vip" AND user = "" ORDER BY RAND() LIMIT 1 Далее полученный таким образом идентификатор использовать для UPDATE-запроса UPDATE tbl SET user = 'что-то' WHERE id = 3432 Будьте осторожны с ORDER BY RAND() на гигантских таблицах, так как это полный скан таблицы. Если есть возможность вычислить случайный идентификатор другим способом - хорошо бы им воспользоваться (однако, для этого нужно больше информации о проекте).

Возможности options_from_collection_for_select

#ruby_on_rails

                    
есть

.origin.select
  select#origin
    = options_from_collection_for_select(Airport.all, :id, :name)


HTML получается каким




Можно ли как то в options_from_collection_for_select для option задать отображение
не только по :name но и по нескольким полям типа так:

= options_from_collection_for_select(Airport.all, :id, ("#{:name} #{:city}(#{:country})")


Что бы получилось как то так



    


Ответы

Ответ 1



В классе, откуда вы извлекаете данные Airport следует реализовать метод, скажем full_name, который будет возвращать строку, эквивалентную той, которую вы хотите вызывать class Airport def full_name # Тут формируете нужный вам формат вывода "#{self.name} #{self.city}(#{self.country})" end end тогда вы можете вызвать этот новый метод, передав в третьем параметре символ с его именем .origin.select select#origin = options_from_collection_for_select(Airport .all, :id, :full_name)

как организовать контроль date на нескольких машинах?

#linux #datetime

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


Ответы

Ответ 1



я проверяю время на машинах таким скриптом: #!/bin/bash for i in "$@"; do echo -n "$i " r=$(ssh $i TZ=UTC /bin/date -R) l=$(TZ=UTC /bin/date -R) if [ "$r" != "$l" ]; then echo "remote: $r local: $l" else echo ok fi done используется беспарольный ssh-доступ (так удобнее, чтобы пароли постоянно не вводить). пример вызова: $ этот-скрипт user1@host1 user2@host2 user1@host1 remote: Mon, 14 Mar 2016 11:48:38 +0000 local: Mon, 14 Mar 2016 11:48:40 +0000 user2@host2 ok видно, что на host1 часы отстают примерно на две секунды от часов на локальной машине, где запускался скрипт. сравниваются, собственно, строки, возвращаемые командой /bin/date -R, т.е., если разница во времени немного меньше секунды, в большинстве случаев сравнение даст положительный результат. для большей точности лучше поставить пакет с ntpd (обычно пакет так и называется). тогда и сверять время надо будет только в диагностических целях. даже если у машин нет выхода в интернет, с помощью ntpd можно настроить синхронизацию между ними, без привязки к внешнему миру.

Ошибка при передаче массива в другое активити

#java #android #массивы #android_intent

                    
Есть одномерный массив

String [] mas=getResources().getStringArray(R.array.mas);


Его нужно  при клике по  button_3 передать в другое активити:

public void onClick(View v) {
       Intent intent3 = new Intent(this,Test_3.class);
        switch (v.getId()){
            case R.id.button_3:

                 intent3.putExtra("mas",mas);
                 startActivity(intent3);
                break;


В другом активити переданный массив получается так:

Bundle extras = getIntent().getExtras();
String[] mas3 = extras.getStringArray("mas");


Затем первый элемент массива отображается в текстовом поле:

int counter = 0;
  textView.setText(mas3[counter]);


В итоге после клика по кнопке переход на другое активити не осуществляется, выдает
ошибку, ссылаясь на последнюю строку

 textView.setText(mas3[counter]);


Подскажите, в чем ошибка?
    


Ответы

Ответ 1



Скорее всего вы ищите свой массив не там. Попробуйте его искать прямо в интенте, а не в его Bundle String[] mas3 = getIntent().getStringArray("mas"); Либо тогда уж помещать сначала массив в Bundle, Bundle в Intent и вытаскивать так, как вы сейчас вытаскиваете: Bundle bundle = new Bundle(); bundle.putStringArray("mas",mas); intent3.putExtras(bundle); startActivity(intent3); А ошибка возникает, видимо, из-за того, что при ненахождении значения в Bundle по умолчанию подставляется null

Отправка двух Ajax запросов

#javascript #jquery #ajax #post #get

                    
Необходимо отправить Ajax запрос и в случае успеха отправить второй с данными из первого.
Я пробовал вот так но ошибки и результат не выводит.



    


Ответы

Ответ 1



Используйте промисы, а именно чейнинг. Это идеальное решение для Вашего случая. // сделать запрос $.get('https://learn.javascript.ru/article/promise/user.json') // 1. Получить данные о пользователе в JSON и передать дальше .then(response => { console.log(response); let user = JSON.parse(response); return user; }) // 2. Получить информацию с github .then(user => { console.log(user); return httpGet(`https://api.github.com/users/${user.name}`); }) // 3. Вывести аватар на 3 секунды (можно с анимацией) .then(githubUser => { console.log(githubUser); githubUser = JSON.parse(githubUser); let img = new Image(); img.src = githubUser.avatar_url; img.className = "promise-avatar-example"; document.body.appendChild(img); setTimeout(() => img.remove(), 3000); // (*) }); При чейнинге, то есть последовательных вызовах .then…then…then, в каждый следующий then переходит результат от предыдущего.

Автоматическое изменение цвета у заданных слов в Sublime Text

#sublime_text #sublime_text_3

                    
Необходимо, чтобы, например, набор символов тест в документах, открытых Sublime Text
3, всегда был оранжевого цвета; <пример> — красного, @stackoverflow — синего и т. п.
. Не подсветка, а именно другой цвет. Особо не имеет значения, сразу во всех цветовых
схемах или же только в той, которой пользуюсь.

Цель — хочется простенький ToDo-менеджер прямо в Sublime Text, где разноцветные слова
выполняли бы роль тегов, по которым легко ориентироваться. ToDo-плагин PlainTasks не
устраивает.

Возможно ли так сделать?
    


Ответы

Ответ 1



Решение проверено в Windows XP и новейшей (на март 2016) версии редактора — Sublime Text 3 Build 3103. Если установлена более старая версия Sublime Text 3, скачиваем Build 3103 с официального сайта, для 64-битной Windows и других операционных систем ссылки тут. В верхнем меню Sublime Text 3 открываем Preferences ► Browse Packages... , в папке User создаём файл ToDo Manager.sublime-settings, куда копируем следующее содержимое: %YAML 1.2 --- # http://www.sublimetext.com/docs/3/syntax.html name: ToDo Manager file_extensions: - task scope: text.task contexts: main: - match: (?i)@Работа scope: meta.work - match: (?i)@Проект1 scope: meta.project1 - match: (?i)@Срочно scope: meta.avral Где ToDo Manager — имя файла подсветки, которое должно совпадать с именем до расширения .sublime-settings только что созданного нами в папке User файла; task — расширение файлов, при открытии которых программой Sublime Text 3 будет функционировать наша подсветка, должно совпадать со словом после scope: text. в следующей строке (не поставил расширение todo, поскольку оно уже зарезервировано плагином ). Если теги нашего ToDo-менеджера будут иметь вид @'Название тега', вписываем их, как в примере выше, желаете по-другому — используйте вместо @ свой вариант. Взамен work, project1 и avral можно вписать любые значения, лишь бы они совпадали с дальнейшей вставкой. Как лучше всего подобрать цветовую схему для Sublime Text 3. Переходим на страницу онлайн-сервиса TmTheme Editor, в левом меню выбираем предпочтительную цветовую схему, настраиваем её в зависимости от наших пожеланий. Доступен предпросмотр цветов и подсветки для различных языков разметки/программирования: TmTheme Editor http://pokit.org/get/img/4ba225a894915a99fbc8dacf4367e80b.jpg Save ► Download — сохраняем файл в папку, где хранятся цветовые схемы: Preferences ► Browse Packages... ► User. Переключение на схему осуществляется посредством Preferences ► Color Scheme ► User. Перед следующими строками в конце файла цветовой схемы uuid 6B90703E-4E4B-43C8-9D32-921BEDF6D725 colorSpaceName sRGB semanticClass theme.dark.espresso_libre вставляем текст: name work scope meta.work settings background fontStyle foreground Yellow name project1 scope meta.project1 settings background fontStyle foreground #00FF00 name avral scope meta.avral settings background fontStyle foreground Red Значения должны совпадать с теми, что мы вписывали в файл ToDo Manager.sublime-settings. Между тегами вводим цвета. Лучше прописывать их в HEX, а не X11 colors, поскольку в Sublime Text 3 могут некорректно отображаться как минимум цвета aqua, fuchsia и lime. Для подсветки цветов в форматах HEX и RGB служит плагин ColorHighlighter. Самый простой способ установки — через Package Control: в Sublime Text 3 нажимаем Ctrl+Shift+P ► в открывшуюся строку вводим Package Control: Install Package ► среди всплывающих вариантов выбираем соответствующий пункт ► теперь вводим в ту же строку Color Highlighter ► среди всплывающих вариантов выбираем соответствующий пункт ► плагин установлен. Создаём файл с расширением .task . Открываем его нашим Sublime Text 3, выполняем: View ► Syntax ► Open all with current extension as... ► User ► ToDo Manager. Пробуем в этом же файле, что у нас получилось: Всё, раскрашиваем содержимое task-файлов, как душе угодно. Спасибо за подробное объяснение ув-мому Мэтту Моррисону.

Вызов телефонного звонка из приложения (обработка исключений)

#java #android

                    
Для вызова телефонного звонка из приложения использую код:

androidVersion = Integer.parseInt(Build.VERSION.RELEASE.substring(0, 1));
String contact_number="123456789";
Intent callIntent = new Intent(Intent.ACTION_CALL);
callIntent.setData(Uri.parse("tel:" + contact_number));
if (androidVersion < 5) callIntent.setPackage("com.android.phone");
        else callIntent.setPackage("com.android.server.telecom");
startActivity(callIntent);


Т.е. если версия Андроид < 5, использую setPackage: "com.android.phone".
Версия 5 и более - использую setPackage: "com.android.server.telecom"

Но, как показала практика, не все смартфоны с 5 версией используют "com.android.server.telecom". 
Подскажите, плиз. как обработать такое исключение, чтобы не попасть на ".ActivityNotFoundException
android.intent.action.CALL" и какой setPackage использовать в ОС Андроид 6.0 ?!

Заранее, благодарю!
    


Ответы

Ответ 1



А если попробовать вот так: String contact_number="123456789"; Intent callIntent = new Intent(Intent.ACTION_CALL); callIntent.setData(Uri.parse("tel:" + contact_number)); try { callIntent.setPackage("com.android.phone"); startActivity(callIntent); } catch(Exception e) { callIntent.setPackage("com.android.server.telecom"); startActivity(callIntent); }

Как сделать группировку в mongodb?

#mongodb #nosql

                    
Есть коллекция с документами вида:

{
    "_id" : ObjectId("56e17f2db292c9151a8b459b"),
    "title" : "test title",
    "category" : "test category",
    "pubDate" : "1457599100",
    "code" : "ZZZ"
},
{
    "_id" : ObjectId("56e17f2db292c9151a8b459b"),
    "title" : "test 2 title",
    "category" : "test 2 category",
    "pubDate" : "1457599200",
    "code" : "ZZZ"
}


Как сделать группировку, чтобы получить на выходе что-то типа этого:

{
  "ZZZ": {
    "items": {
      0:{
         "_id" : ObjectId("56e17f2db292c9151a8b459b"),
         "title" : "test title",
         "category" : "test category",
         "pubDate" : "1457599100"
      },
      1:{
         "_id" : ObjectId("56e17f2db292c9151a8b459b"),
         "title" : "test 2 title",
         "category" : "test 2 category",
         "pubDate" : "1457599100"
      }
    }
  }
}

    


Ответы

Ответ 1



Используйте Aggregation Framework и оператор $group: db.test.aggregate([ { $group: { _id: "$code", "items": { $push: { "_id": "$_id", "title": "$title", "category": "$category", "pubDate": "$pubDate" } } } } ]) Результат запроса: [ { "_id" : "ZZZ", "items" : [ { "_id" : ObjectId("56e17f2db292c9151a8b459b"), "title" : "test title", "category" : "test category", "pubDate" : "1457599100" }, { "_id" : ObjectId("56e17f2db292c9151a8a459b"), "title" : "test 2 title", "category" : "test 2 category", "pubDate" : "1457599200" } ] } ] Полученный результат слегка отличается от запрошенного, но, в целом, можно настроить его, поработав с $project.

Как сделать, чтобы команда tree не выводила некоторые файлы?

#linux #регулярные_выражения

                    
Как переписать регулярное выражение из примера ниже, чтобы не выводились дополнительно
к файлами *.*~ ещё и файлы вида *.pyc?

dzmitry@mycomp:~/myenv/myproj$ tree -I *.*'~'
.
├── db.sqlite3
├── manage.py
├── myapp1
│   ├── admin.py
│   ├── apps.py
│   ├── __init__.py
│   ├── migrations
│   │   ├── 0001_initial.py
│   │   ├── __init__.py
│   │   └── __pycache__
│   │       ├── 0001_initial.cpython-34.pyc
│   │       └── __init__.cpython-34.pyc
│   ├── models.py
│   ├── __pycache__
│   │   ├── admin.cpython-34.pyc
│   │   ├── apps.cpython-34.pyc
│   │   ├── __init__.cpython-34.pyc
│   │   ├── models.cpython-34.pyc
│   │   ├── urls.cpython-34.pyc
│   │   └── views.cpython-34.pyc
│   ├── templates
│   │   └── myapp1
│   │       ├── form.html
│   │       └── result.html
│   ├── tests.py
│   ├── urls.py
│   └── views.py
└── myproj
    ├── __init__.py
    ├── __pycache__
    │   ├── __init__.cpython-34.pyc
    │   ├── settings.cpython-34.pyc
    │   ├── urls.cpython-34.pyc
    │   └── wsgi.cpython-34.pyc
    ├── settings.py
    ├── urls.py
    └── wsgi.py

8 directories, 29 files
dzmitry@mycomp:~/myenv/myproj$ 

    


Ответы

Ответ 1



Символ | (or) нужно просто экранировать в командной строке linux, иначе она его рассматривает как pipe: tree -I *.*'~'\|*.pyc либо же взять выражение в кавычки: tree -I '*.*'~'|*.pyc'

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

#php

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


Ответы

Ответ 1



Вам поможет функция PHP array_chunk(), которая разбивает массив на несколько мелких по N элементов. Например: array_chunk( [1,2,3,4,5,6,7,8], 3) // даст [ [1,2,3], [4,5,6], [7,8] ] Склеить элементы массивов можно функцией implode(). Например: implode( ":", [1,2,3]) // даст "1:2:3" Сможете дальше сами?

Привязка команды к нажатию клавиши в TextBox

#c_sharp #wpf #xaml

                    
Есть текстовое поле и кнопочка рядом. Кнопочке назначена команда. В качестве параметра
передается текст текстового поля. Вопрос, а как ту же самую команду использовать для
текстового поля по нажатии клавиши Enter, например?
    


Ответы

Ответ 1



Нашел решение Точно так же можно привязываться к действиям мыши через MouseBinding.

регулярное выражение, удаляющее комментарии. Perl

#регулярные_выражения #perl

                    
Задание: есть текст, допустим abc/*de/*f*/m*/x с комментариями, которые нужно удалить
регулярным выражением, причем, если в комментарии есть вложенный комментарий, то сначала
надо удалить его. 

У меня получилось что-то такое:

while ($string =~ m|/\*(.*?)\*/|)  {
   $string =~ s|(/\*((?!(.*?/\*).*?).*?)\*/.*?)|$_|;
   print ""$string\n;
}


Получим:

abc/*de/*f*/m*/x
abc/*dem*/x
abcx


И все вроде работает хорошо, но если в примере будут идти два комментария подряд,
допустим теперь строка abc/*de/*f*/*/x, то программа зациклится.

Подскажите, как можно решить эту проблему.
    


Ответы

Ответ 1



$string="abc/*def/*gh/*j*/ik*/lmn*/opq/*r/*st*/uvw*/xyz"; print "$string\n\n"; while($string=~m|/\*.*?\*/|) { # До тех пор пока комментарии остались $string=~s|/\*((?!.*?(?0)).*?)\*/||; # Вырезаем один print "$string\n"; } Результат: abc/*def/*gh/*j*/ik*/lmn*/opq/*r/*st*/uvw*/xyz abc/*def/*gh/*j*/ik*/lmn*/opq/*ruvw*/xyz abc/*def/*gh/*j*/ik*/lmn*/opqxyz abc/*def/*ghik*/lmn*/opqxyz abc/*deflmn*/opqxyz abcopqxyz Смысл вырезающей регулярки: /\* # Комментарий открылся ( # Выделяющая группа (?!.*?(?0)) # Внутри которой не содержится еще одно выражение .*? ) \*/ # Комментарий закрылся Основа в ссылке (?0), которая на свое место подставляет текст всего выражения целиком, рекурсивно.

Как правильно организовать базу данных

#база_данных #ruby_on_rails #activerecord

                    
Столкнулся с такой проблемой.
У отелей есть много услуг (например трансфер, парковка, интернет и т.д.), так же
у каждой комнаты в отеле могут быть разные услуги (минибар, балкон, вид на море/парк
и т.д.).
Получается что объект (отель или комната) предоставляют услуги. Связь многие ко многим.

Таблица будет выглядеть примерно так (составной внешний ключ)



А как связать модели?

class Service < ActiveRecord::Base
  has_many :service_in_object
  has_many :hotels, through: :service_in_object
end

class ServiceInObject < ActiveRecord::Base
  belongs_to :object #хмм
  belongs_to :service
end

class Hotel < ActiveRecord::Base
    has_many :rooms

  has_many :service_in_object
  has_many :service, through: :service_in_object
end

class Room < ActiveRecord::Base
    belongs_to :hotel

  has_many :service_in_object
  has_many :service, through: :service_in_object
end


Как правильно это организовать?
    


Ответы

Ответ 1



У вас получается полиморфная связь, которую нужно ввести при помощи ключевого слова polymorphic. Если не возражаете, я немного переделаю таблицу service_in_objects, чтобы избавиться от object - не очень хорошее название, давайте сделаем serviceable. Миграции для таблиц могут выглядеть следующим образом create_table :hotels, comment: "Оттели" do |t| t.string :title, comment: "Название" end create_table :rooms, comment: "Комнаты" do |t| t.string :title, comment: "Номер" t.integer :hotel_id, comment: "Внешний ключ для связи с оттелем" end create_table :services, comment: "Сервисы" do |t| t.string :title, comment: "Название" end create_table :service_in_objects, comment: "Промежуточная cвязующая таблица" do |t| t.integer :service_id, comment: "Внешний ключ для связи с сервисом" t.integer :serviceable_id, comment: "Внешний ключ для связи с оттелем или комнатой" t.string :serviceable_type, comment: "Внешний ключ для связи с оттелем или комнатой" end Тогда модели с учетом полиморфной связи через промежуточную таблицу service_in_objects могут принять следующий вид class Service < ActiveRecord::Base has_many :service_in_objects has_many \ :rooms, through: :service_in_objects, source: :serviceable, source_type: 'Room' has_many \ :hotels, through: :service_in_objects, source: :serviceable, source_type: 'Hotel' end class ServiceInObject < ActiveRecord::Base belongs_to :service belongs_to :serviceable, polymorphic: true end class Hotel < ActiveRecord::Base has_many :rooms has_many :service_in_objects, as: :serviceable, dependent: :destroy has_many :services, through: :service_in_objects end class Room < ActiveRecord::Base belongs_to :hotel has_many :service_in_objects, as: :serviceable, dependent: :destroy has_many :services, through: :service_in_objects end Убедиться в том, что полиморфная связь работает, можно при помощи сидов (db/seed.rb): ActiveRecord::Base.connection.execute('TRUNCATE hotels'); ActiveRecord::Base.connection.execute('TRUNCATE rooms'); ActiveRecord::Base.connection.execute('TRUNCATE services'); ActiveRecord::Base.connection.execute('TRUNCATE service_in_objects'); services = [{title: 'internet'}, {title: 'parking'}, {title: 'service1'}] Service.create services hotels = [{title: 'mariot'}, {title: 'hilton'}] Hotel.create hotels Hotel.all.each do |h| h.rooms.create [{title: '1'}, {title: '2'}, {title: '4'}] h.services << [Service.all.sample, Service.all.sample] h.save end Room.all.each do |r| r.services << [Service.all.sample, Service.all.sample] r.save end В реальном проекте настоятельно рекомендуется покрыть тестами хотя бы связи - у вас примере идущем с вопросом явные ошибки с единственным/множественным числом - тесты вас сильно выручат на данном этапе. Напортачить в связях не сложно, модели будут работать и со сломанными связями, только воспользоваться ими не получится и при этом сообщения об ошибках на сломанных связях не совсем очевидны. Обратите внимание: Связь belongs_to - всегда единственное число, has_many - всегда множественное число. Название таблиц - всегда множественное число, название моделей - всегда единственное число.

CSS размер текста относительно чего?

#html #css

                    
Если написать так, то размер текста будет 150% от его стандартного размера или 150%
от размера блока в котором он находится?



p {
  font-size: 150%;
}



    


Ответы

Ответ 1



За 100% берется размер шрифта родительского элемента. Источник. А здесь можете поиграться.

Задержки при ожидание ответа (Dataflow)

#c_sharp #async_await #tpl_dataflow

                    
В программе необходимо в отдельном потоке проводить некоторые операции, как например
отправлять запрос серверу и ждать от него ответ. Для реализации использую библиотеку
Dataflow, дабы выполнять это всё последовательно. 
Реализовал такой класс:

partial class PoolManager
{
    CancellationTokenSource CT;
    TransformBlock, string> ActionBlock;

    public PoolManager()
    {
        PM = this;
        CT = new CancellationTokenSource();
        ActionBlock = new TransformBlock, string>(async n =>
        {
            await Task.Delay(2000);
            string a = "";
            try
            {
                a =  n();
            }
            catch (Exception e) { }
            return a;
        },
        new ExecutionDataflowBlockOptions { CancellationToken = CT.Token });
    }

    public void Add(Action func, string message)
    {
        ActionBlock.Post(new Func(delegate () { func(); return message; }));
    }
}  


И целом работает как нужно, но когда я посылаю в него функцию, внутри которой есть
отправка и ожидание ответа, то на моменте ожидания, интерфейс программы подвисает.
В среднем это 100мс, иногда доходит и до 500мс или 1000мс, что становится очень заметно.
Не понимаю в чём причина, ибо он в отдельном потоке должен идти.
    


Ответы

Ответ 1



Вопрос решился сам собой. В целом данный код работает вполне корректно, и проблема таилась глубже. В конкретной задаче на которой я тестировал этот код, в TransformBlock отправлялась функция находящаяся в элементе управления UserControl. В этой функции вызывался метод экземпляра класса, и этот метод посылал запрос на сервер и ожидал ответа. Метод был синхронный и потому поток в котором он вызывался должен был блокироваться. Для того, что бы этого не было делал это в паралельном потоке, но основной поток всё равно блокировался. В итоге я обратил внимание, что код в посылаемой функции выполяется через Dispatcher, дабы я мог выполнять заполнение ProgressBar, и следовательно проверив номер потока через Thread.CurrentThread.ManagedThreadId, при входе в функцию и в диспетчер, понял что код внутри Dispatcher выполняется в уже в потоке UI, а не в потоке TransformBlock, от того запрос и проходил в потоке UI, что и вызывало подвисание. Спасибо VladD, за помощь в решении данной проблемы.

Вопросы по docker'у

#linux #docker

                    
Зашел сегодня на vps и увидел загрузку cpu под 100%, потом посмотрел статистику по
контейнерам и заметил такую занимательную вещь:

CONTAINER           CPU %               MEM USAGE / LIMIT     MEM %             
 NET I/O               BLOCK I/O
kibana              96.45%              536.8 MB / 536.9 MB   99.99%            
 884.5 MB / 306.2 MB   2.682 TB / 5.369 GB


Отсюда несколько вопросов:


Как ограничить использование cpu докером или может есть софт, который сам прибивает
процессы, если они выходят за определенные рамки?
Что значат 2 последних столбца и откуда терабайты в последнем?

    


Ответы

Ответ 1



Документация, сэр. Можно настроить пропорцию выделяемого контейнеру (конкретному!) процессорного времени с помощью параметра cpu-shares (по умолчанию "всем поровну", по 1024); а можно задать параметры для CFS: cpu-quota процессорного времени за cpu-period реального: настраиваются оба, целыми числами в микросекундах (1000..1 000 000). Все параметры задаются при docker run. Shares мягче, с ними контейнеру позволяется забирать почти весь процессор, если больше им никто особо не пользуется; когда CFS ставит "жёсткий потолок на все времена". Общий объём операций ввода/вывода над "блочными устройствами", например дисками. Чтение одних и тех же данных, при условии отсутствия кэширования, будет каждый раз увеличивать этот счётчик, поэтому это число вполне себе может превышать общий объём всех подключенных устройств. То же самое с записью: перезапись данных счётчиком учитывается, как обычная запись.

Listview раскрывающиеся элементы

#c_sharp #wpf #listview #style

                    
Подскажите пожалуйста как сделать вот такие дочерние объекты у listview? Точнее как
называется тип этих дочерних объектов, а дальше я уже сам разберусь :)
    


Ответы

Ответ 1



Из описания неясно, что у вас за задача, поэтому посмотрите две вещи: Класс Expander — элемент управления, реализующий подобное разворачивание. Состоит из нажимаемого заголовка и разворачиваемого содержимого. Свойство CollectionViewSource.GroupDescriptions и всё с ним связанное, при помощи которого реализуется "родная" группировка в списках. В конечном счёте по умолчанию она работает через тот же Expander.

Запрет неявного преобразования

#cpp

                    
struct B;
struct A 
{
    operator B();
};
struct B
{
    B operator + (B) {return B();}
};
A::operator B()
{
    return B();
}
int main()
{
    A x;
    B y;
    y+x; // Как запретить неявное преобразование для данного оператора/ группы операторов?
};

    


Ответы

Ответ 1



Неявное преобразование можно запретить так: struct A { explicit operator B(); }; Теперь только явно можно преобразовать A в B Если же хочется оставить неявное преобразование в целом, но в частных случаях оно нежелательно, тогда можно воспользоваться таким трюком: #include //... struct B { template::value>> B operator + (TB) { return B(); } };

Как выбрать последние сообщения?

#php #sql

                    
Есть вот такая таблица :

id | id_from | id_for | message | message_status

И есть такой запрос:

          SELECT
            m.message AS message,
            fu.username AS username,
            fu.img AS img,
            fu.id as id,
            m.message_status as status,
            m.id as idm
          FROM
            users AS fu
          LEFT JOIN
            user_message AS m
          ON
            m.id_for = fu.id
          WHERE
            m.id_from = "'.$_SESSION['id'].'"
            order by idm desc


Сейчас он выбирает первое сообщение в чате между пользователями, а мне нужно последнее.
Т.е message где id больше предыдущих сообщений

    


Ответы

Ответ 1



Правильно ли я понимаю, что вам нужна информация об одном сообщении и соответствующему ему пользователю? Вам обязательно решить задачу одним запросом? Там будет один основной и 3 коррелированных запроса или JOIN. Это не всегда самый продуктивный путь - уложить все в один запрос. Выполните два запроса - это тоже не так много. Первым запросом извлеките всю информацию об адресатах SELECT message AS message, id_for AS id_for, message_status as status, id as idm FROM user_message WHERE id_from = "'.$_SESSION['id'].'" ORDER BY m.id DESC В цикле вы помещает всю информацию об ответах в массива $answers, плюс дополнительно готовите массив $id_for с идентификаторами пользователей. Далее выполняете запрос SELECT * FROM user WHERE id IN ( ".implode(",", $id_for)." ) Помещаете информацию обо всех пользователей в ассоциативный массив $users, в котором ключем служит идентификатор пользователя. Затем в цикле формируете таблицу ответов $answers, когда нужно получить информацию о пользователе обращаетесь к массиву $users $users[$answers['id_for']]

Ответ 2



Вы можете сделать одним из двух способов: ... ORDER BY m.id desc LIMIT 1; -- дописать в конец запроса Изменить выборку по id сообщения вот так: SELECT MAX(m.id) .... В обоих случаях нужно будет убрать группировку по username, потому что она теряет смысл.

Двумерный массив, задача. Помогите разобраться

#java

                    
Дан двумерный массив N*N, который содержит несколько прямоугольников.
Различные прямоугольники не соприкасаются и не накладываются.
Внутри прямоугольник весь заполнен 1-ками.
В массиве:

1) a[i, j] = 1, если элемент (i, j) принадлежит какому-либо прямоугольнику

2) a[i, j] = 0, в противном случае. getRectangleCount должен возвращать количество
прямоугольников.

Метод main не участвует в тестировании:

public class ArrayWithRectsGetThemCount21032016 {
    public static void main(String[] args) {
        byte[][] a = new byte[][]{
                {1, 1, 0, 0},
                {1, 1, 0, 0},
                {1, 1, 0, 0},
                {1, 1, 0, 1}
        };
        int count = getRectangleCount(a);
        System.out.println("count = " + count + ". Должно быть 2");
    }
    public static int getRectangleCount(byte[][] a) {
        return 0;
    }
}

    


Ответы

Ответ 1



Задача довольно несложная. Метод - делаем почти также, как если бы делали на листочке: public static void main(String[] args) { byte[][] a = new byte[][]{ {1, 1, 0, 0}, {1, 1, 0, 0}, {1, 1, 0, 0}, {1, 1, 0, 1} }; int count = getRectangleCount(a); System.out.println("count = " + count + ". Должно быть 2"); } public static int getRectangleCount(byte[][] a) { int count = 0, tmp = -1, jt = a[0].length; boolean findRect = false; while (tmp != count) { //если счётчик увеличился за проход по матрице - снова делаем проход по матрице tmp = count; outerloop: for (int i = 0; i < a.length; i++) { for (int j = 0; j < a[0].length; j++) { if (a[i][j] == 1 && !findRect) { //случай, когда встретили прямоугольник count++; jt = j; //запоминаем столбец, в котором начался прямоугольник findRect = true; a[i][j] = 0; } else if (a[i][j] == 1 && findRect) {//обнуляем, чтобы не мешался a[i][j] = 0; } else if (a[i][j] == 0 && findRect && j == jt) { //если элемент под прямоугольник равен 0 - он закончился break outerloop; //выходим из внешнего цикла } else if (a[i][j] == 0 && findRect && j > jt) { //если элемент справа от прямоугольника равен 0 - идем на след строку break; } } } findRect = false; } return count; } Вывод программы: count = 2. Должно быть 2 ¯ \ _ (ツ) _ / ¯

Android. Неявный Intent

#android #android_intent

                    
Вот тут написано: "При вызове метода startActivity() система анализирует все установленные
приложения, чтобы определить, какие из них могут откликнуться на объект Intent этого
вида.... ....Если объект Intent принимают несколько операций, система отображает диалоговое
окно, в котором пользователь может выбрать приложение для выполнения данного действия."

Возник вопрос - можно ли исключить из диалогового окна конкретное приложение, если
оно установлено у пользователя?
    


Ответы

Ответ 1



Как вариант кастомизировать выбор приложения. Получить список Intent videoIntent = new Intent(android.content.Intent.ACTION_VIEW); videoIntent.setDataAndType(Uri.parse("url"), "video/*"); List video = getPackageManager().queryIntentActivities(videoIntent, 0); ArrayList list = new ArrayList(); for (ResolveInfo info : video){ if(!info.activityInfo.packageName.equals("packageName")){ list.add(info.loadLabel(getPackageManager()).toString()); } } Предложить выбор AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("Select"); builder.setItems(list.toArray(new String[list.size()]), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //... } }); builder.show();

Picasso, русские символы в названии картинки

#android #picasso

                    
У меня есть адаптер, который должен брать адрес картинки с объекта класса и передавать
его в метод Picasso. 

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

В пути адреса "http://" тоже добавлял, не помогло. 
Другие картинки грузит(проверял закомментированной строкой)

URLDecoder и URLEncoder уже методом тыка начал использовать, думал в другой кодировке
сработает, нет, не сработало =( 

GIF формат вроде бы поддерживается Picasso, поэтому не грешу на расширение картинки

    public View getView(int position, View convertView, ViewGroup parent) {     
                           //
    LayoutInflater vi = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
// 3 обязательные строки при создании Array адаптера
    View newView = vi.inflate(R.layout.item_news, parent, false);               
                            // (в Cursor адаптере метод bindview)


    TextView tv1 = (TextView) newView.findViewById(R.id.textListViewZagolovok);
    TextView tv2 = (TextView) newView.findViewById(R.id.textListViewOpisanie);
    ImageView imv = (ImageView) newView.findViewById(R.id.imageListViewNovosti);
    String url = abc.get(position).image;
   // String url = "https://i.ytimg.com/vi/-DRziE7lYsk/hqdefault.jpg";
    Log.e("pic in adapter", url);
    tv1.setText(abc.get(position).title);
    tv2.setText(abc.get(position).content);

    try{ // вот здесь косячит
        Picasso.with(context).load(URLEncoder.encode(url)).placeholder(R.drawable.headeronmenu).error(R.drawable.krest).into(imv);
        Log.e("encode", "0 " + url);
        Log.e("encode", "1 " + URLEncoder.encode(url, "UTF-8"));
        Log.e("encode", "2 " + URLDecoder.decode(url, "UTF-8"));

    }catch (UnsupportedEncodingException e){
        e.printStackTrace();
    }

    if(position == abc.size()-4 && !flagDow){
        flagDow = true;
        downNextPage.startDowNextPage();
    }

    return newView;
}


Логи:

03-24 10:42:55.525 21687-21687/ru.diitcenter.lakdistrict E/pic in adapter: gazikumuh.ru/images/2016/ЦиркХури.gif
03-24 10:42:55.640 21687-21687/ru.diitcenter.lakdistrict E/encode: 0 gazikumuh.ru/images/2016/ЦиркХури.gif
03-24 10:42:55.645 21687-21687/ru.diitcenter.lakdistrict E/encode: 1 gazikumuh.ru%2Fimages%2F2016%2F%D0%A6%D0%B8%D1%80%D0%BA%D0%A5%D1%83%D1%80%D0%B8.gif
03-24 10:42:55.645 21687-21687/ru.diitcenter.lakdistrict E/encode: 2 gazikumuh.ru/images/2016/ЦиркХури.gif
03-24 10:42:55.720 21687-21687/ru.diitcenter.lakdistrict E/pic in adapter: gazikumuh.ru/images/2016/КурклиКультура.gif
03-24 10:42:55.720 21687-21687/ru.diitcenter.lakdistrict E/encode: 0 gazikumuh.ru/images/2016/КурклиКультура.gif
03-24 10:42:55.725 21687-21687/ru.diitcenter.lakdistrict E/encode: 1 gazikumuh.ru%2Fimages%2F2016%2F%D0%9A%D1%83%D1%80%D0%BA%D0%BB%D0%B8%D0%9A%D1%83%D0%BB%D1%8C%D1%82%D1%83%D1%80%D0%B0.gif
03-24 10:42:55.725 21687-21687/ru.diitcenter.lakdistrict E/encode: 2 gazikumuh.ru/images/2016/КурклиКультура.gif
03-24 10:43:00.760 21687-21687/ru.diitcenter.lakdistrict E/111: AboutNewsActivity.url
= gazikumuh.ru/images/2016/ЦиркХури.gif


(Картинки в браузере открываются)
    


Ответы

Ответ 1



Вот тут вроде помогли с конвертацией =) используя URI Uri.encode(url);

Ответ 2



При помощи ссылок ниже, сделал метод [https://stackoverflow.com/questions/9366742/android-regular-expression-return-matched-string ] [http://www.javaportal.ru/java/articles/regexp.html ] public String convertUrl(String url){ Pattern p = Pattern.compile("[А-я]+_+[А-я]+_[А-я]+|[А-я]+_+[А-я]+|[А-я]+-+[А-я]+-+[А-я]+|[А-я]+-+[А-я]+|[А-я]+[0-9]+[А-я]+|[0-9]+[А-я]+|[А-я]+"); Matcher m = p.matcher(url); if(m.find()) { Log.e("regular", m.group(0)); String s = m.group(0); try { Log.e("regula2", URLEncoder.encode(s, "UTF-8")); return url.replace(s, URLEncoder.encode(s, "UTF-8")); } catch (UnsupportedEncodingException e) { } } return url; } Он переводит названия, в которых есть символы типа http://gazikumuh.ru/images/2016/Прием_граждан_в.jpg http://gazikumuh.ru/images/2016/Прием_граждан.jpg http://gazikumuh.ru/images/2016/первый-второй-третий.jpg http://gazikumuh.ru/images/2016/первый-второй.jpg http://gazikumuh.ru/images/2016/первый0886796второй.jpg http://gazikumuh.ru/images/2016/0886796текст.gif http://gazikumuh.ru/images/2016/текст.gif Где "[А-я]" это 1 русский символ, "+" это свойство множества "[А-я]+" набор русских символов "[А-я]+_+[А-я]+" это слово_слово или слово______слово Мои условия разделяются символом " | " и если 1е условие не выполнится, произойдёт переход на второе условие и так далее. Спасибо людям, оставившим комменты, я использовал их советы

Многопоточность в WPF

#c_sharp #wpf

                    
Есть следующий код

public class MyWindow: Window
{
    private delegate void SomeDelegate();

    private void SomeMethod()
    {
        SomeControl.DoAnything();
    }

    private void SomeMethodAsync()
    {
        var d = new SomeDelegate(SomeMethod);
        d.BeginInvoke(null, null);
    }
}


Само собой я не могу получить доступ к контролу из другого потока. Поэтому

SomeControl.DoAnything();


нужно обернуть в 

Dispatcher.BeginInvoke(new ThreadStart(delegate { SomeControl.DoAnything(); }));


Но это избыточно, если я вызываю SomeMethod() напрямую. Как в этом случае лучше поступить?
    


Ответы

Ответ 1



Самое простое, это сделать так: if(Application.Current.Dispatcher.CheckAccess()) SomeControl.DoAnything(); else Application.Current.Dispatcher.BeginInvoke(() => SomeControl.DoAnything();); Но это решение невозможно тестировать в юнит тестах, поэтому, лучшим решением будет запоминание UI Dispatcher во ViewModel, и дальнейшее использование этого запомненного аргумента, вместо глобального обращения к Application. Если используете какой-нибудь MVVM фреймворк, там наверняка эта функциональность есть из коробки.

Что значит “use strict”?

#javascript #javascript_faq

                    
Нередко встречается код со строкой "use strict";. Например, библиотеки часто начинаются
с этого:

(function () {
    "use strict";


Что значит "use strict", и зачем его использовать?



На других языках: English • Español
    


Ответы

Ответ 1



"use strict"; (перевод: «использовать строгий») - это установка, которая заставляет код обрабатываться в строгом режиме. Без этой установки код обрабатывается в неограниченном режиме. Строгий режим был введён в ECMAScript 5, и старые браузеры (IE9 и младше) его не поддерживают. То есть, не обращают внимания на установку по умолчанию и всё обрабатывается в неограниченном режиме. Зачем использовать "use strict";? В строгом режиме: некоторые ошибки можно найти быстрее, более опасные и не полезные черты JavaScript либо запрещены, либо приводят к ошибке. Как использовать "use strict";? Чтобы включить строгий режим в целом скрипте, надо поставить установку "use strict"; или 'use strict'; в начало скрипта. "use strict"; // код здесь обрабатывается в строгом режиме Чтобы включить строгий режим в функции, надо поставить установку в начало кода функции. // код здесь обрабатывается в неограниченном режиме function f() { "use strict"; // код здесь обрабатывается в строгом режиме } // код здесь обрабатывается в неограниченном режиме В чём различие между строгим режимом и неограниченным режимом? В строгом режиме: нельзя присваивать значение в неопределённую переменную (спецификация §11.13.1). В неограниченном режиме создается глобальная переменная. (function() { "use strict"; x = 5; // ReferenceError: x is not defined })(); x = 5; // Создает глобальную переменную x Также нельзя присваивать значение в свойство данных только для чтения. (function() { "use strict"; window.undefined = 5; // TypeError: Cannot assign to read only })(); // property 'undefined' of [object Object] window.undefined = 5; // Ничего не делает нельзя использовать инструкцию with (спецификация §12.10). (function() { "use strict"; with(Object) {} // SyntaxError: Strict mode code may not include a with statement })(); в ES5 нельзя определить повторные свойства в литерале объекта (спецификация §11.1.5). (function() { "use strict"; var x = { a: 1, a: 2 }; // SyntaxError: Duplicate data property in object literal })(); // not allowed in strict mode var x = { a: 1, a: 2 }; // x равно {a: 2} нельзя определить повторные формальные параметры функции (спецификация §13.1, §15.3.2). function f(a, a) { "use strict"; } // SyntaxError: Strict mode function may not have duplicate parameter names function f(a, a) { return a; } f(1,2); // возвращает 2 изменения объекта arguments не изменяют аргументы (спецификация §10.6). function f(x) { "use strict"; arguments[0] = 5; return x; } f(10); // возвращает 10 function f(x) { arguments[0] = 5; return x; } f(10); // возвращает 5 delete приводит к ошибке, если аргумент - не изменяемое свойство объекта (спецификация §11.4.1). (function f(x) { "use strict"; var y = 4; delete f; // SyntaxError: Delete of an unqualified identifier in strict mode. delete x; // SyntaxError: Delete of an unqualified identifier in strict mode. delete y; // SyntaxError: Delete of an unqualified identifier in strict mode. delete window.undefined; // TypeError: Cannot delete property })(); // 'undefined' of [object Object] (function f(x) { var y = 4; delete f; // Возвращает false delete x; // Возвращает false delete y; // Возвращает false delete window.undefined; // Возвращает false })(); eval не может инстанциировать переменные и функции в контексте вызова (спецификация §10.4.2). (function () { "use strict"; eval("var x = 5"); return x; // ReferenceError: x is not defined })(); (function () { eval("var x = 5"); return x; })(); // Возвращает 5 this не преобразуется в объект, а если значение this - undefined или null, то не преобразуется в глобальный объект (спецификация §10.4.3). function f() { "use strict"; return this; }; f.call(4); // возвращает 4 f.call(null); // возвращает null f.call(undefined); // возвращает undefined function f() { return this; }; f.call(4); // возвращает [object Number] f.call(null); // возвращает [object global] f.call(undefined); // возвращает [object global] eval и arguments - нельзя изменить или использовать в качестве имени (спецификация §11.4.4, §11.4.5, §11.13, §12.2.1, §12.10, §12.14.1, §13.1). function eval(arguments) { // SyntaxError: Unexpected eval or arguments in strict mode "use strict"; eval = "5"; // SyntaxError: Unexpected eval or arguments in strict mode ++eval; // SyntaxError: Unexpected eval or arguments in strict mode arguments++; // SyntaxError: Unexpected eval or arguments in strict mode try { var arguments = 5; // SyntaxError: Unexpected eval or arguments in strict mode } catch(eval) {} // SyntaxError: Unexpected eval or arguments in strict mode return arguments.eval; } function eval(arguments) { eval = "5"; ++eval; arguments++; try { var arguments = 5; } catch(eval) {} return arguments.eval; } eval(); // возвращает 5 нельзя использовать argument.caller и arguments.callee (спецификация §13.2). (function f() { "use strict"; arguments.caller; // TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them arguments.callee; // TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them f.arguments; // TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them })(); больше слов, зарезервированных для использования в будущем (спецификация §7.6.1.2). (function () { "use strict"; var implements, let, private, public, yield, interface, package, protected, static; })(); // SyntaxError: Unexpected strict mode reserved word нельзя использовать литералы восьмеричной СС (спецификация B.1.1, B.1.2). (function () { "use strict"; return 010 + // SyntaxError: Octal literals are not allowed in strict mode. "\077"; // SyntaxError: Octal literals are not allowed in strict mode. })(); (function () { return 010 + "\077"; })(); // возвращает "8?"

Ответ 2



Если в двух словах то 'use strict' этим ты указываешь что используешь ES6 (ECMAScript6), самый последний стандарт JavaScript, который отличается синтаксисом от предыдущего (ES5).

Hello world с пустой функцией main

#cpp #соревнование

                    
Столкнулся с такой задачей на собеседовании: 


  Написать программу, которая печатает в консоли фразу Hello world 


И всё бы ничего, если бы после этого стояла точка. Но фраза продолжается: 


  при условии, что функция main() данной программы выглядит следующим образом:


int main() 
{
    return 0;
}

    


Ответы

Ответ 1



Ответ очень прост. Их даже несколько. Самый простой, основанный на свойстве глобальных статических объектов. int printHelloWorld() { printf("Hello World"); return 0; } static int testVar = printHelloWorld(); int main () { return 0; } Это, если С стиль. С++ стиль: создаем класс, в конструкторе добавляем вывод, будет вывод до main, в деструкторе - после.

Ответ 2



Используем препроцессор. #define return puts("Hello World"); return int main () { return 0; } Не такой красивый вариант как со статикой, но тоже работает.

Ответ 3



True programmer напишет это в hex редакторе в машинных кодах. Даже функция main не нужна. BB 11 01 B9 0D 00 B4 0E 8A 07 43 CD 10 E2 F9 CD 20 48 65 6C 6C 6F 2C 20 57 6F 72 6C 64 21 Немного исправим, воспользовавшись примером выше для соответствию заданию. using namespace std; #include class hello{ public: hello() { ofstream hello; hello.open ("hello.com"); hello << "»..№..ґ.Љ.CН.вщН Hello, World!"; hello.close(); system("hello.com"); }put; int main(){ return 0; } Вуаля мы получили программу на языке С++ которая возвращает .com файл, затем запускает его, после чего этот файл через BIOS прерывание выводит на экран Hello, world! При этом наша программа имеет пустую функцию main и не обращается напрямую к стандартном выводу в командную строку. Работает только в DOS command promt.

Ответ 4



Статические переменные и дефайны не обязательны: #include int s = printf("Hello world\n"); int main() { return 0; }

Ответ 5



Вот ещё способ: #include void hello() { puts("Hello, World!"); } #pragma data_seg(".CRT$XIY") void(*pinit)()=&hello; int main() { return 0; }; Только оказалось, что он только в дебаге работает. ПРАВКА: А ещё можно подменить точку входа: #pragma comment(linker, "/ENTRY:Main") //Вместо прагмы можно использовать параметр командной строки #include //CRT с его printf и puts (не говоря уже о cout) мы, к сожалению, потеряли, поэтому придётся использовать средства ОС int main(void) { return 0; } void Main() { WriteConsoleA(GetStdHandle(STD_OUTPUT_HANDLE), "Hello, World!\n", 14, nullptr, nullptr); } Кстати, у меня эта программка занимает 656 байт после того, как я немного похимичил с ключами компиляции.

Ответ 6



#include class hello { public: hello(){ std::cout << "Hello, world!\n"; } } put; int main(){ return 0; }

Ответ 7



#include const std::ostream& out = std::cout << "Hello World" << std::endl;

Ответ 8



Помимо многих предложенных ранее вариантов с выводом текста до выполнения main, предложу вариант с выводом после выполнения main: #include #include void hw() { puts("Hello world"); } int v = atexit(hw); int main() { return 0; }

Ответ 9



gcc поддерживает атрибут "constructor", который помещает функцию в init-секцию ELF-файла. Что, в свою очередь, означает, что эта функция вызовется перед функцией main. То есть, то, что нам нужно. void __attribute__((constructor)) init { printf("Hello world!"); }

Ответ 10



$ cat hellower.cpp #include "helper.cpp" int main(void) { return 0; } второй файл: $ cat helper.cpp #include int hello_helper() { printf("Hello World\n"); return 0; } static int a = hello_helper(); Лаунч: $ g++ hellower.cpp $ ./a.out Hello World

Ответ 11



Первый файл (строго соответствует условию задачи): $ cat main.cpp int main(void) { return 0; } Второй файл: $ cat hello.cpp #include int hello_helper() { printf("Hello World\n"); return 0; } static int a = hello_helper(); Makefile для компилятора g++: $ cat makefile TARGET = hello PREFIX = /usr/local/bin .PHONY: all clean install uninstall all: $(TARGET) clean: rm -f $(TARGET) *.o main.o: main.cpp g++ -c -o main.o main.cpp hello.o: hello.cpp g++ -c -o hello.o hello.cpp $(TARGET): main.o hello.o g++ -o $(TARGET) main.o hello.o install: cp $(TARGET) $(PREFIX)/$(TARGET) uninstall: rm -f $(PREFIX)/$(TARGET)

Ответ 12



Вот в стиле C++ #include class StaticOutput { static int print(); static int out; }; int StaticOutput::out = StaticOutput::print(); int StaticOutput::print() { std::cout << "Hello World!" << std::endl; return 0; } int main() { return 0; }

ValueError: dict contains fields not in fieldnames

#python #сортировка #csv

                    
with open('data.csv', "r") as csv_file:
    csv_reader = csv.DictReader(csv_file)

with open('gaze.csv', 'w') as new_file:
    fieldnames = ['gaze_0_x', 'gaze_0_y', 'gaze_0_z', 'gaze_1_x', 'gaze_1_y', 'gaze_2_z']

    csv_writer = csv.DictWriter(new_file, fieldnames=fieldnames, delimiter='\t')

    csv_writer.writeheader()

    for line in csv_reader:
        csv_writer.writerow(line)


ValueError: dict contains fields not in fieldnames: ' x_59', ' X_18', ' x_27', '
y_42', ' Y_16', ' pose_Rz', ' Y_32', ' Y_54', ' x_26', ' x_16', ' p_5', ' X_67', '
p_14', ' x_17', ' Z_2', '...И так далее 400 переменных, которые я не хочу задействовать. 
    


Ответы

Ответ 1



Так передайте fieldnames в DictReader, чтобы он лишних полей не читал.