Страницы

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

пятница, 14 февраля 2020 г.

Шаблон массива не работает с float/double

#cpp #массивы #шаблоны_с++


Здравствуйте. Вот задание:




То есть выполнить задание 2 варианта используя шаблоны.

Я написал такой код. Но он работает только с integer'ом. С флоатом и даблом выдает
какую то хрень. Я делал отладку пошагово и понял что ошибка где то в функции void create(T
*arr, T n); Но в чем именно вообще не понимаю

Если подскажете буду очень благодарен.

#include 
#include 

using namespace std;

template  int func(T n);
template  void create(T *arr, T n);
template  T positiv(T *arr, int n);
template  T proizv(T *arr, int n);
template  void sort(T *arr, int n);
template  void print(T *arr, int n);


int main()
{
    int n;
    cin >> n;
    func(n);
    return 0;
}

template 
int func(T n)
{
    T *arr1 = new T[n];
    create(arr1, n);


    /*T *arr2 = new T[n];
    create(arr2, n);


    T *arr3 = new T[n];
    create(arr3, n);*/

    //T s1 = positiv(arr1, n);
    //T p1 = proizv(arr1, n);
    //sort(arr1, n);

    //T s2 = positiv(arr2, n);
    //T p2 = proizv(arr2, n);
    //sort(arr2, n);

    //T s3 = positiv(arr3, n);
    //T p3 = proizv(arr3, n);
    //sort(arr3, n);

    //cout << s1 << " ";
    //if (p1 == -100)
    //  cout << "No elements between max and min." << endl;
    //else
    //  cout << p1 << endl;

    print(arr1, n);

    /*cout << s2 << " ";
    if (p2 == -100)
        cout << "No elements between max and min." << endl;
    else
        cout << p2 << endl;

    print(arr2, n);

    cout << s3 << " ";
    if (p3 == -100)
        cout << "No elements between max and min." << endl;
    else
        cout << p3 << endl;

    print(arr3, n);*/

    system("pause");
    return 0;

}

template 
void create( T *arr, T n)
{
    for (int i = 0; i < n; i++)
    {
        arr[i] = 0;
    }


    for (int i = 0; i < n; i++)
    {
        cin >> arr[i];
    }
}

template 
T positiv(T *arr, int n)
{
    T  i, summ;
    for (i = summ = 0; i < n; i++)
    {
        if (arr[i] > 0) summ += arr[i];
    }
    return summ;
}

template 
T proizv(T *arr, int n)
{
    int i, maxelem, minelem;
    maxelem = minelem = 0;

    for (maxelem = minelem = i = 0; i < n; i++)
    {
        if (fabs(arr[i]) > fabs(arr[maxelem])) maxelem = i;
        if (fabs(arr[i]) < fabs(arr[minelem])) minelem = i;
    }

    T temp;

    if (abs(maxelem - minelem) > 1)
    {
        int stelem = (maxelem < minelem ? maxelem : minelem);
        int endelem = (maxelem < minelem ? minelem : maxelem);
        for (i = stelem + 1, temp = 1; i < endelem; i++)
            temp *= arr[i];
    }
    else
        temp = -100;
    return temp;

}

template 
void sort(T *arr, int n)
{
    T temp;
    for (int i = 0; i < n - 1; i++)
        for (int j = i + 1; j <= n - 1; j++)
            if (arr[i] < arr[j]) {
                temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
}

template 
void print(T *arr, int n)
{
    for (int i = 0; i < n; i++)
        cout << arr[i] << " ";
    delete[] arr;
}

    


Ответы

Ответ 1



Итак, ваш шаблон: template int func(T n) { T *arr1 = new T[n]; Подставим для double: int func(double n) { double *arr1 = new double[n]; И как вы себе представляете массив из, скажем, 2.5 элементов? n же у вас - double! В create та же некорректность - вы используете n с плавающей точкой... P.S. А вообще, очень странно смотрится чисто C-шный подход с применением шаблонов :)

в массиве содержатся разные элементы

#c #массивы #указатели


Вот код:

int *p;

// так как в функцию указатель в таком виде передать нельзя: компилятор заругается, то:

p = (int*)malloc(sizeof(int)); // в функции я переопределю его размер через realloc

func(p);

for (i = 0; i < count; i++)
    printf("%d ", p[i]); // возвращает мусор
/* если из функции делать вывод, то в консоль выводятся корректные значения */ 


Помогите понять, в чём тут дело ?

Прототип функции func:

void func(int *arr);


Делать int * не хочу пока что: хочу понять, что тут не так...
    


Ответы

Ответ 1



Итак, у вас есть указатель int* p; и вы хотите инициализировать его через вызов функции. Можно сделать так: void func(int** inPtr){ int* tmp = (int*)malloc(0x100); *inPtr = tmp; //(*inPtr)[2] = 0x02;//пишем 3-й элемент } void main(void){ int* p; func(&p); //printf("0x%X\n", p[2]);//читаем 3-й элемент } func принимает указатель на указатель на int, то есть адрес указателя на int. В main мы через ссылку получили адрес нашего указателя и передали его в функцию. В функции мы через разыменование из адреса получили сам указатель и записали в него выделенный буфер. Пляски с tmp нужны, чтобы в отладчике можно было посмотреть реальный адрес выделенного буфера и сравнить его с тем, что будет в p после выполнения funс()

Ответ 2



Я не очень понял, почему нельзя передать указатель в функцию и что за мусор получается, по этому попробую просто ответить примером: #include #include #define COUNT 15 void func(int *arg) { if((arg = (int*)malloc(sizeof(int) * COUNT)) == NULL) printf("allocation error\n"); } int main() { int *p, i; // почему в таком виде нельзя передать? func(p); // если в func() произошел allocation error, будет ошибка, // т.к. мы ничего не узнаем об этом // меняем мусор на что-то осмысленное for (i = 0; i < COUNT; i++) *(p + i) = i; // выводим массив for (i = 0; i < COUNT; i++) printf("%d ", p[i]); printf("\n"); return 0; }

Добавить разделитель элементов в RecyclerView

#android #recyclerview


Есть такая разметка для элемента (т.е. пункта списка для RecyclerView)




    

        

        

            

            
        

    




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


    


Ответы

Ответ 1



Для этого можно прописать View- ку

Ответ 2



Я это делаю с помощью класса DividerItemDecoration унаследованного от RecyclerView.ItemDecoration: public class DividerItemDecoration extends RecyclerView.ItemDecoration { private Drawable mDivider; private int mOrientation; public DividerItemDecoration(Drawable divider) { mDivider = divider; } @Override public void onDraw(Canvas canvas, RecyclerView parent, RecyclerView.State state) { if (mOrientation == LinearLayoutManager.HORIZONTAL) { drawHorizontalDividers(canvas, parent); } else if (mOrientation == LinearLayoutManager.VERTICAL) { drawVerticalDividers(canvas, parent); } } @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { super.getItemOffsets(outRect, view, parent, state); if (parent.getChildAdapterPosition(view) == 0) { return; } mOrientation = ((LinearLayoutManager) parent.getLayoutManager()).getOrientation(); if (mOrientation == LinearLayoutManager.HORIZONTAL) { outRect.left = mDivider.getIntrinsicWidth(); } else if (mOrientation == LinearLayoutManager.VERTICAL) { outRect.top = mDivider.getIntrinsicHeight(); } } private void drawHorizontalDividers(Canvas canvas, RecyclerView parent) { int parentTop = parent.getPaddingTop(); int parentBottom = parent.getHeight() - parent.getPaddingBottom(); int childCount = parent.getChildCount(); for (int i = 0; i < childCount - 1; i++) { View child = parent.getChildAt(i); RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); int parentLeft = child.getRight() + params.rightMargin; int parentRight = parentLeft + mDivider.getIntrinsicWidth(); mDivider.setBounds(parentLeft, parentTop, parentRight, parentBottom); mDivider.draw(canvas); } } private void drawVerticalDividers(Canvas canvas, RecyclerView parent) { int parentLeft = parent.getPaddingTop() * 9; int parentRight = parent.getWidth() - parent.getPaddingRight(); int childCount = parent.getChildCount(); for (int i = 0; i < childCount - 1; i++) { View child = parent.getChildAt(i); RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams(); int parentTop = child.getBottom() + params.bottomMargin; int parentBottom = parentTop + mDivider.getIntrinsicHeight(); mDivider.setBounds(parentLeft, parentTop, parentRight, parentBottom); mDivider.draw(canvas); } } } Где parent.getPaddingTop() * 9: parent.getPaddingTop - верхний Padding RecyclerView, в моем случае он равен 10dp А умножаю на 9, так как от левого края округленного ImageView до текста отступ 90dp И в Activity или где вы инициализируете ваш RecyclerView: private void initRecyclerView() { mChatsRV.setLayoutManager(new LinearLayoutManager(getApplicationContext())); mChatsRV.addItemDecoration(new DividerItemDecoration(ContextCompat.getDrawable(this, R.drawable.items_divider))); } И сама линия(разметка) items_divider.xml:

Как правильно добавить в php файл код обрезки строки по количеству символов и многоточие в конце?

#php


На stackoverflow в одном из ответов (https://ru.stackoverflow.com/a/190992/232533)
нашел код для вставки в php с помощью которого можно обрезать строку по определенному
количеству символов и добавить троеточие в конце. Вот найденный код :

{$text1 = "Допустим здесь ваш текст из 1000 символов";
 $text = mb_substr($text1,0,140, 'UTF-8'); //140 это кол. знаков 
 $str_count = substr_count($text," "); // возвращает количество пробелов
 $text = explode(" ", $text1); //количество слов 
 for($i=0;$i<$str_count; $i++){ echo $text[$i].' '; } echo "...";}


Со слов автора данного кода, этот код не будет обрезать слова (по среди слова), а
количество символов не будет превышать указанное количество и будет добавлено троеточие
после обрезного текста.

В моем php файле (весь код файла ниже) есть строка:  'item_intro'=>mb_strimwidth(strip_tags($row->introtext,''.$allow_tags.''),0,$chars,
"..."), с помощью которой удалось обрезать строку по количеству символов (значение
берется из настроек модуля и  указано в переменной $chars)и после обрезки добавить
троеточие после текста.

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

Мой исходный php файл: 


get('id');
			global $aid;
			$aid				= $user->get('aid', 0);
			$contentConfig 		= JComponentHelper::getParams( 'com_content' );
			$access2			= !$contentConfig->get('shownoauth');
			$nullDate			= $db->getNullDate();
			$date 				= JFactory::getDate();
			if(intval(JVERSION) >= 3 ){	
				$now =         $date->toSql() ; 
			}else{
				$now =         $date->toMySQL(); 
			}
			/* prepare default module params */
			$yj_mod_name		= basename(dirname(__FILE__));// 10-8-2011
			$item_source		= $params->get   ('item_source',1);// 10-8-2011
			switch ($item_source) {
				case 1 :   
					require('modules/'.$yj_mod_name.'/yjme/get_joomla.php');
					require_once('modules/'.$yj_mod_name.'/yjme/jomfunctions.php');
					break; 
				case 2:  
					require('modules/'.$yj_mod_name.'/yjme/get_k2.php');
					require_once('modules/'.$yj_mod_name.'/yjme/k2functions.php');
					break;
			}

			//  this is the main array for k2/joomla news items. both use same vars for ouptut
			$main_yj_arr = array();
			foreach ( $load_items as $row ) {

				switch ($item_source) {
					case 1 :
						$item_url 		= yjme_get_url($row);
						$img_url  		= yjme_art_image($row);
						$cat_url 		= yjme_get_cat_url($row);
						$author_url		= yjme_get_author_url($row);
						$advert_url		= yjme_advert($row);
						$advert_img		= yjme_advert_img($row);
						$item_media		= yjme_media($row);
						$item_hook		= yjme_hookon($row);
						$item_playlist	= yjme_playlist($row);
						if(JPluginHelper::getPlugin('system', 'jcomments')){
								$config = JCommentsFactory::getConfig();
								$categories = $config->get('enable_categories');
								$ids = explode(',', $categories);
								if(in_array($row->catid,$ids)){
									//print_r($ids);
									$comments_on = 1;
									$comments_count =  $row->ccount;
								}else{
									$comments_on = 0;
									$comments_count =  0;
								}
						}else{
							$comments_on 	= 0;
							$comments_count = 0;
						}
					break;
						case 2:
						$img_url 		= k2_yjme_art_image($row);
						$item_url		= k2_yjme_get_url($row);
						$cat_url 		= k2_yjme_get_cat_url($row);
						$author_url		= k2_yjme_get_author_url($row);
						$advert_url		= k2_yjme_advert($row);
						$advert_img		= k2_yjme_advert_img($row);
						$item_media		= k2_yjme_media($row);
						$item_hook		= k2_yjme_hookon($row);
						$item_playlist	= k2_yjme_playlist($row);
						$comments 		= json_decode($row->categoryparams);
						if(isset($comments->itemComments)){
							$comments_on 	=  $comments->itemComments;
							$comments_count =  $row->ccount;
						}else{
							$comments_on = 0;
							$comments_count =  0;
						}
					break;
				}

				$yj_get_items = array(
						'item_title' 		=> htmlspecialchars($row->title, ENT_QUOTES, 'UTF-8'),
						'item_url' 			=> $item_url,
						'item_intro' 		=> mb_strimwidth(strip_tags($row->introtext,''.$allow_tags.''),0,$chars,
"..."),
						'img_url' 			=> $img_url,
						'cat_title' 		=> htmlspecialchars($row->cattitle, ENT_QUOTES, 'UTF-8') ,
						'cat_url' 			=> $cat_url,
						'item_author' 		=> $row->username,
						'item_author_rn' 	=> $row->realname,
						'author_url' 		=> $author_url,
						'item_date' => JHTML::_('date', $row->created,JText::_('YJ_DATE_FORMAT')),
						'item_id'	 		=> $row->id,
						'advert_url'	 	=> $advert_url,
						'advert_img'	 	=> $advert_img,
						'item_hits'	 		=> $row->hits,
						'item_likes' 		=> $row->likes,
						'item_comments' 	=> $comments_on,
						'comments_count' 	=> $comments_count,
						'item_media' 	 	=> $item_media,
						'item_hook' 	 	=> $item_hook,
						'item_playlist'	 	=> $item_playlist,
					);
					$main_yj_arr[] = $yj_get_items;
			}
			
					return $main_yj_arr;

		}
		
		
	}
}

?>




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


Ответы

Ответ 1



А у меня получилось так: $length) { $repl = mb_substr($repl, 0, $length) . '...'; } else if ($lr < $lt) { $repl .= '...'; } return $repl; } ?>

Длина исходной строки: .

= 0; $i--) { echo ""; } ?>
До скольки символов обрезать Результат
$i".reduction($text, $i)."
Результат: Длина исходной строки: 41. До скольки символов обрезать Результат 46 'Laravel стремится!!! Это относится и к!!!' 45 'Laravel стремится!!! Это относится и к!!!' 44 'Laravel стремится!!! Это относится и к!!!' 43 'Laravel стремится!!! Это относится и к!!!' 42 'Laravel стремится!!! Это относится и к!!!' 41 'Laravel стремится!!! Это относится и к!!!' 40 'Laravel стремится!!! Это относится и к...' 39 'Laravel стремится!!! Это относится и к...' 38 'Laravel стремится!!! Это относится и к...' 37 'Laravel стремится!!! Это относится и...' 36 'Laravel стремится!!! Это относится и...' 35 'Laravel стремится!!! Это относится...' 34 'Laravel стремится!!! Это относится...' 33 'Laravel стремится!!! Это...' 32 'Laravel стремится!!! Это...' 31 'Laravel стремится!!! Это...' 30 'Laravel стремится!!! Это...' 29 'Laravel стремится!!! Это...' 28 'Laravel стремится!!! Это...' 27 'Laravel стремится!!! Это...' 26 'Laravel стремится!!! Это...' 25 'Laravel стремится!!! Это...' 24 'Laravel стремится!!! Это...' 23 'Laravel стремится...' 22 'Laravel стремится...' 21 'Laravel стремится...' 20 'Laravel стремится...' 19 'Laravel стремится...' 18 'Laravel стремится...' 17 'Laravel стремится...' 16 'Laravel...' 15 'Laravel...' 14 'Laravel...' 13 'Laravel...' 12 'Laravel...' 11 'Laravel...' 10 'Laravel...' 9 'Laravel...' 8 'Laravel...' 7 'Laravel...' 6 'Larave...' 5 'Larav...' 4 'Lara...' 3 'Lar...' 2 'La...' 1 'L...' 0 '...' А если заменить мою функцию reduction() на вариант из ответа @Эдуард, то получается так: Длина исходной строки: 41. До скольки символов обрезать Результат 46 'Laravel стремится!!! Это относится и к!!!' 45 'Laravel стремится!!! Это относится и к!!!' 44 'Laravel стремится!!! Это относится и к!!!' 43 'Laravel стремится!!! Это относится и к!!!' 42 'Laravel стремится!!! Это относится и к!!!' 41 'Laravel стремится!!! Это относится и к!!!' 40 'Laravel стремится!!! Это относится и ... ' 39 'Laravel стремится!!! Это относится и ... ' 38 'Laravel стремится!!! Это относится и ... ' 37 'Laravel стремится!!! Это относится и ... ' 36 'Laravel стремится!!! Это относится ... ' 35 'Laravel стремится!!! Это относится ... ' 34 'Laravel стремится!!! Это ... ' 33 'Laravel стремится!!! Это ... ' 32 'Laravel стремится!!! Это ... ' 31 'Laravel стремится!!! Это ... ' 30 'Laravel стремится!!! Это ... ' 29 'Laravel стремится!!! Это ... ' 28 'Laravel стремится!!! Это ... ' 27 'Laravel стремится!!! Это ... ' 26 'Laravel стремится!!! Это ... ' 25 'Laravel стремится!!! Это ... ' 24 'Laravel стремится!!! ... ' 23 'Laravel стремится!!! ... ' 22 'Laravel стремится!!! ... ' 21 'Laravel стремится!!! ... ' 20 'Laravel ... ' 19 'Laravel ... ' 18 'Laravel ... ' 17 'Laravel ... ' 16 'Laravel ... ' 15 'Laravel ... ' 14 'Laravel ... ' 13 'Laravel ... ' 12 'Laravel ... ' 11 'Laravel ... ' 10 'Laravel ... ' 9 'Laravel ... ' 8 'Laravel ... ' 7 'Laravel ... ' 6 'Laravel ... ' 5 'Laravel ... ' 4 'Laravel ... ' 3 'Laravel ... ' 2 'Laravel ... ' 1 'Laravel ... ' 0 'Laravel ... ' Как это прикрутить к вашему коду: $text1 = "Допустим здесь ваш текст из 1000 символов"; /* здесь вставляете функцию `reduction()` - Эдуарда или мою... */ echo reduction($text1, 140);

Ответ 2



Буквально сегодня писал такую же задачу для другого форума - посмотрите на результат этого кода: $text = 'Laravel стремится преобразить процесс разработки PHP, это относится и к локальной среде разработки. Vagrant обеспечивает простой, элегантный способ настройки управления виртуальными машинами.'; echo reduction($text); function reduction($text, $length = 70) { if (mb_strlen($text, 'UTF-8') > $length) { $substr = mb_substr($text, 0, $length, 'UTF-8'); $text = strpos($substr, ' ') !== false ? preg_replace('~(\s)?(?(1)\S+$|\s$)~', '', $substr) : strstr($text, ' ', true); $text .= ' ... '; } return $text; } UPD: Посмотреть результат

Скрыть компонент из toolbar

#java #android #android_toolbar #actionbar


Как программно можно скрыть один из MenuItem на toolbar?
    


Ответы

Ответ 1



main_menu.xml ... Activity.java public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.main_menu, menu); MenuItem shareItem = menu.findItem(R.id.menu_action_share); if (что-то) shareItem.setVisible(false); //скрыть программно return true; } Если Вы хотите контролировать меню из фрагмента, то нужно вызвать setHasOptionsMenu в onCreate() фрагмента. @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); } Затем переопределить onCreateOptionsMenu @Override public boolean onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.main_menu, menu); menu.clear();//например убрать все элементы меню. return true; }

Ошибка при создании пакета - ORA-00955: name is already used by an existing object

#oracle #plsql #sqldeveloper


Вот мой скрипт для создания пакета:

CREATE OR REPLACE PACKAGE PP AS
  TYPE REFCURSOR IS REF CURSOR;
  FUNCTION getData(id IN VARCHAR2) RETURN REFCURSOR;
END PP;


При первом запуске создался пакет. Я добавил процедуру и пытаюсь скомпилировать,
выдает ошибку: 


  ORA-00955: name is already used by an existing object


Как мне пересоздать пакет?
    


Ответы

Ответ 1



Не хватает завершающего символа после объявления пакета. Надо так: ... END PP; / Отличия и общее для завершающих символов "/" и ";" в SQl Developer следующее: Оба символа не входят в стандарт SQL и никак в SQL запросе не интепритируются. ";" является составной частью языка PL/SQL, он завершает законченое выражение. Оба не посылаются на сервер, а служат только как служебные символы - "здесь конец". В одной вкладке редактора (SQL Worksheet) могут находится многочисленные запросы и анонимные блоки. Поэтому, для выполнения одного запроса или блока (по умолчанию с CTRL-ENTER), необходимо: SQL запросы не содержащих PL/SQL блока, в частности - все DML, некоторые DDL, DCL - необходимо завершить его либо с ";", либо с "/" на новой строке. Анонимные блоки и SQL запросы содержащие PL/SQL блок (create ... package/function/trigger/... ) или потенциально могущие его содержать (create ... type), необходимо завершить его с "/", т.к. ";" завершает последний END в блоке. Если SQl Developer не находит завершающих символов, он ищет их дальше по тексту, и когда их найдёт (если не найдёт, то до конца текста), посылает несколько запросов как один, что приводит к неопределённому результату. Обычно ошибку выполнения, которая не всегда совсем понятна. Например: create type idType as object (id number); show errors / Error(2,1): PLS-00103: Encountered the symbol "SHOW" На заметку: Если запрос или блок выделить визуально, тогда SQl Developer выполнит только выделенное, даже если завершающие символы отсутствуют.

как правильно писать код, с пробелом или без между скобкой и названием метода? [закрыт]

#code_style #style_guide


        
             
                
                    
                        
                            Закрыт. На этот вопрос невозможно дать объективный ответ.
Ответы на него в данный момент не принимаются.
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            Хотите улучшить этот вопрос? Переформулируйте вопрос,
чтобы на него можно было дать ответ, основанный на фактах и цитатах, отредактировав его.
                        
                        Закрыт 2 года назад.
                                                                                
           
                
        
someFunction(){
  //some code
}


или

someFunction () {
  //some code
}


справедливо ли верное написание (пока я не знаю которое предпочтительнее) для всех
языков?
    


Ответы

Ответ 1



Правильно писать код, придерживаясь фиксированного стиля. И тот, и другой вариант, и также вариант someFunction() { //some code } — все являются валидными стилями. Вы должны выбрать стиль, который вам нравится, и придерживаться его. Или если вы пишете в команде, вы должны придерживаться стиля команды. Исключение: некоторые языки предписывают определённый стиль. Например, Python предписывает лесенку, а Javascript — «египетские» скобки (из-за semicolon insertion приходится в некоторых случаях отказываться от открывающей скобки на новой строке, и для однородности стиля приходится так делать везде). Но это скорее исключение, чем правило. Дополнение. Почему общий, однородный стиль важен? Дело в том, что код пишется не только для компилятора (ему-то как раз стиль безразличен), а для других программистов в вашей команде, для тех, кто будет разбираться в проекте и поддерживать его после вас. Неоднородный стиль снижает (в запущенных случаях сильно снижает) эффективность чтения и понимания вашего текста. Хуже того, вам самому через некоторое время, возможно, придётся читать ваш же код! Пишите так, чтобы вам было приятно читать.

Ответ 2



В javascript'е сейчас принято писать без пробела перед круглой скобкой и с пробелом перед фигурной: var x = { method() { return 7; } } function soSmth(x, y, z) { return x + y + z; } Пробел перед скобкой ставится только с управляющими конструкциями: if (true) { } function () { // анонимная функция } do { } while (false) На вопрос "почему" ответа, конечно, нет, поскольку это чисто стилистика и на функциональность не влияет. PS: https://www.npmjs.com/package/eslint

Почему Word открывается в режиме только для чтения

#c_sharp #com #ms_word #office_interop


Не могу понять в чем дело. Вроде бы скопировал у себя же рабочий код, но почему-то
не работает. А не работает потому что word открывается в режиме для чтения.
Хотя перед этим всё работало.

private void button5_Click(object sender, EventArgs e)
    {   
        //показываем панель для введения значений в бланк 
        panel2.Visible = true;
        //скрываем изображение 
        pictureBox1.Visible = false;

        //Создаём новый Word.Application
        Microsoft.Office.Interop.Word.Application app = new Microsoft.Office.Interop.Word.Application();

        //Загружаем документ
        Microsoft.Office.Interop.Word.Document doc = null;


        //вариант открытия существующего файла
        object fileName = "E:\\R1.rtf";
        object falseValue = false;
        object trueValue = false;
        object missing = Type.Missing;

        doc = app.Documents.Open(ref fileName, ref missing, ref trueValue,
        ref missing, ref missing, ref missing, ref missing, ref missing,
        ref missing, ref missing, ref missing, ref missing, ref missing,
        ref missing, ref missing, ref missing);

        //Теперь у нас есть документ который мы будем менять.

        //Очищаем параметры поиска
        app.Selection.Find.ClearFormatting();
        app.Selection.Find.Replacement.ClearFormatting();

        //Задаём параметры замены и выполняем замену нп поле варианта 
        object findText = "";
        object replaceWith = VarApply;
        object replace = 2;

        app.Selection.Find.Execute(ref findText, ref missing, ref missing, ref missing,
        ref missing, ref missing, ref missing, ref missing, ref missing, ref replaceWith,
        ref replace, ref missing, ref missing, ref missing, ref missing);
        app.Visible = false;

        doc.Save();
        doc.Close(Microsoft.Office.Interop.Word.WdSaveOptions.wdSaveChanges);
        app.Quit(false);
        richTextBox1.LoadFile("E:\\R1.rtf");

    }


Не хочет сохранять изменённый файл в строке doc.Save();
    


Ответы

Ответ 1



doc = app.Documents.Open(ref fileName, ref missing, ref trueValue, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing); Третий параметр - ReadOnly, поставьте его missing. Да и вообще можно написать кратко app.Documents.Open(ref fileName)

Задание валидного двумерного массива

#python #python_3x


Есть работающий код задания двумерного массива:

field=[]
for i in range(8):
        block = []
        for j in range(8):
             block.append('X')
        field.append(block)


Выгялдит не очень, но он работает! Суть проблемы в том что при "не красивой" инициализации
все списки отдельные объекты и когда мы делаем изменение в ячейке меняется только она. 
Как сократить, чтобы код был более "питонистичным", но и сохранить правильную изменяемость
ячеек (функциональность)?

Что-то вроде

field = [['X']*8]*8


Но так при изменении поля, меняются все поля по координате из-за того что все ссылаеться
на один список.
Хочу чтобы при field[2][2] = 'O' изменялась только ячейка [2][2], а не весь столбец

field[2][2] = 'O'

['X', 'X', 'O', 'X', 'X', 'X', 'X', 'X']
['X', 'X', 'O', 'X', 'X', 'X', 'X', 'X']
['X', 'X', 'O', 'X', 'X', 'X', 'X', 'X']
['X', 'X', 'O', 'X', 'X', 'X', 'X', 'X']
['X', 'X', 'O', 'X', 'X', 'X', 'X', 'X']
['X', 'X', 'O', 'X', 'X', 'X', 'X', 'X']
['X', 'X', 'O', 'X', 'X', 'X', 'X', 'X']
['X', 'X', 'O', 'X', 'X', 'X', 'X', 'X']


Пытался использовать [:], list, но результата нет 
    


Ответы

Ответ 1



L = [['X' for n in range(8)] for n in range(8)]

Команда на DoubleClick по элементу ListView

#c_sharp #wpf #mvvm


Есть


    
        
            
                
                
                    
                
            
        
    



Где StudentList - коллекция студентов, SelectedStudent - конкретный выбранный студент.

Необходимо по двойному нажатию на ListView, вызвать команду EditStudent. Команды
умею привязывать только к Button.
Как поступить в этом случае?
    


Ответы

Ответ 1



Давайте воспользуемся такой штукой как InputBindings: ... Это уже работает, но у всех ItemsControl есть нюанс - по умолчанию они не растягивают свои элементы, это можно увидеть, если задать StackPanel любой цвет в Background, поэтому команда будет вызываться только при клике четко по тексту элемента. Исправить это можно, подкорректировав стиль ListViewItem: ... Ну и нужно еще что-то сделать с отступами, так как то что у вас сейчас StackPanel Margin="10" вам скорее всего не понравится, например можно обернуть всё в прозрачный Border (InputBindings теперь переезжают в него, в StackPanel они больше не нужны): ... Вот тогда между элементами будут визуальные отступы, но команда будет отрабатывать по клику в любом месте элемента

Ответ 2



private void ListView_MouseDoubleClick_1(object sender, MouseButtonEventArgs e) { EditStudent(); } Выделите listview в конструкторе; Перейдите во вкладку "свойства"; Кликните на кнопку с картинкой молнии в верхнем правом углу, ее название "Обработчики событий выбранного элемента", в разных студиях может называться по разному; Найдите событие с именем MouseDoubleClick, в пустое поле кликните 2 раза и студия все сделает за Вас;

Ответ 3





Спонтанное пробуждение компьютера

#windows


Сколько не сидел на windows всегда у меня была эта проблема: комп сам по себе пробуждается
из спящего режима и я ничего не могу с этим поделать. Перепробовал все что нашел в
гугле: отключение таймеров пробуждения, отключение возможности пробуждения отдельно
у каждого устройства в диспетчере устройств - ничего не помогает. Я не люблю полностью
выключать комп и почти никогда это не делаю, но когда он посреди ночи просыпается и
начинает гудеть - это не дает заснуть (он стоит рядом с моим диваном). Помогите! Как
сделать чтобы мой комп перестала мучить бессонница? :D

P.S. Сейчас windows 10, но эта же проблема была и на windows 7. А вот к примеру когда
я ставил линукс - ничего подобного не наблюдалось.
    


Ответы

Ответ 1



Ещё варианты: 1) WakeOnLan (или нечто подобное) в BIOS*; 2) Если клавиатура с кнопками управления питанием (выключение, спящий и т.п.), возможно поможет чистка клавиатуры (НЕ водой! Мембраны лучше сухой мягкой тряпочкой... Механических с такими кнопульками не видывал, да и чистка механики в таких случаях не поможет). .* - Внимание: если с BIOS-ом ранее не работали, то следует сперва как следует покурить тему :) И быть предельно осторожными, не нажимать "всё подряд", подходить с умом :)

Ответ 2



Для начала посмотрите планировщик заданий (Панель управления->Администрирование->Планировщик заданий), какие там задачи стоят и в какое время выполняются. Скорее всего у какой-то программы идет обновление, которое и выводит компьютер из спящего режима. Определите программу - дальше уже решайте что с ней делать (в некоторых достаточно просто снять пункт автоматического обновления). отключение таймеров пробуждения, отключение возможности пробуждения отдельно у каждого устройства в диспетчере устройств Это может не помочь, если идет обновление программы, которая имеет расширенный доступ к ядру операционной системы.

Какой порядок выполнения операций и почему?

#c_sharp #битовые_операции #операторы


static class Program
{
  static void Main()
  {
   var x=3;
   var y=(++x)*(x++)|4/2^2;
   Consoley.Write(y);
 }
} 

    


Ответы

Ответ 1



В соответствии с приоритетами слева направо: (++x) * (x++) | 4 / 2 ^ 2 ^ ^^^^^ +--------------------- x=4, returns 4 | ^^^^^--------------- x=5, returns 4 `--------------------- 4*4=16 ^ | ^ | ^-+--------- 4 | | ^------- 2 | `--------- 4/2=2 | ^----- 2^2=0 | | ^--- 2^2=0 | `----- 2^2=0 `------------- 16|0=16 PS: Надеюсь, не ошибся.

Стоит ли использовать шаблоны с большим количеством строгих типов

#cpp #function_overloading #шаблоны_с++


Есть функция, реализация которой не отличается при любых типах данных. Но тип данных
не может быть абсолютно любым ( всего возможных типов данных которые обработает функция
- 9 ).

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


Ответы

Ответ 1



Вообще, один из плюсов (не главный, конечно) шаблонов - уменьшение дублирования кода. А так придется писать 9 почти одинаковых (за исключением типов) функций. Дублирование кода! (Или Вы не ленивый программист?) Используйте std::enable_if_t и отсекайте ненужные типы, для этого этот механизм и был введен в стандарт. Учитывая комментарий про типы, которые преобразуются в std::string, можете попробовать использовать std::is_convertible. Хотя стоит учесть специфику Вашей задачи, возможно, это недостаточное условие. Вот пример использования std::is_convertible с сайта: #include #include struct A { }; struct B : A { }; int main() { std::cout << std::boolalpha; std::cout << "is_convertible:" << std::endl; std::cout << "int => float: " << std::is_convertible::value << std::endl; std::cout << "int = >const int: " << std::is_convertible::value << std::endl; std::cout << "A => B: " << std::is_convertible::value << std::endl; std::cout << "B => A: " << std::is_convertible::value << std::endl; return 0; } Про идиому SFINAE можно почитать тут. Варианты использования std::enable_if есть тут. Если проверка типа при помощи std::is_convertible не подходит для данной задачи, то можно сделать проверки типа на основе std::is_integral, std::is_floating_point и прочих подобных структур. Прочитать про них можно, например, здесь. Полагаю, в задаче может быть обработано более 9 типов, учитывая всякие квалификаторы, типы int с размером, разные типы char и т.д. В таком случае, использование std::is_integral и компании оптимально, поскольку они успешно обрабатывают все подобные ситуации.

Как картинку разместить позади параграфа?

#html #css


Такой эффект хочу получить    





.client p{
    font-size: 9pt;
    font-family: 'Italic';
    font-weight: bold;
}

.coment{
    background: url(https://cdn1.savepice.ru/uploads/2017/11/1/03cf72290cca88cdbd8724270cb30430-full.png)
no-repeat;
}


/*End Client*/

Our Clients Say

Suspendisse sollicitudin velit sed leo. Ut
pharetra augue nec augue. Nam elit agna,
endrerit sit amet, tincidunt, viverra sed,
nulla. Donec porta diam eu massa.

Quisque diam lorem, interdum vitae, dapibus
ac, scelerisque vitae, pede. Donec eget tellus
non erat lacinia fermentum. Donec in velit
vel ipsum auctor pulvinar.

Bradley Grosh,
Company Name
Получается вот так


Ответы

Ответ 1



всего то надо было с padding-ОМ поиграть да height: 250px выставить как, благо подсказал – vp_arth.... .client p{ font-size: 9pt; font-family: 'Italic'; font-weight: bold; } .coment{ height: 250px; padding:30px; background: url(https://cdn1.savepice.ru/uploads/2017/11/1/03cf72290cca88cdbd8724270cb30430-full.png) no-repeat; } /*End Client*/

Our Clients Say

Suspendisse sollicitudin velit sed leo. Ut
pharetra augue nec augue. Nam elit agna,
endrerit sit amet, tincidunt, viverra sed,
nulla. Donec porta diam eu massa.

Quisque diam lorem, interdum vitae, dapibus
ac, scelerisque vitae, pede. Donec eget tellus
non erat lacinia fermentum. Donec in velit
vel ipsum auctor pulvinar.

Bradley Grosh,
Company Name


Ответ 2



уберите фиксированный height и добавьте background-size: contain;

visual studio и перегрузка операторов

#cpp #visual_cpp


#include 

using namespace std;

class pop {
    int x;

 public:
    int getX() {
        return x;
    }
    pop() : x{ 0 } {}

    pop operator + (pop& p) {
        return pop(this->x + p.x);
        // здесь ошибка E0289: отсутствуют экземпляры конструктора pop::pop,
        // соответствуюшие списку аргументов; и всегда у меня ошибки с
        // перегрузкой в vs
    }
};

    


Ответы

Ответ 1



Вам нужен конструктор для класса pop, который принимает один параметр типа int. Вы в вашем return пытаетесь использовать именно его, но создать его вы забыли. Этот конструктор может быть отдельным конструктором, но можно, если вам понравится, воспользовавшись аргументами по умолчанию, написать один общий конструктор: и для конструкции из int, и для конструкции по умолчанию pop(int x = 0) : x{ x } {} Также, если вы не объявите такой конструктор explicit, то он будет конструктором преобразования и в реализации вашего оператора вы сможете, при желании, просто написать return x + p.x; Но это дело вкуса. Бинарный оператор сложения лучше реализовывать самостоятельной (возможно дружественной) функцией, а не методом класса, как у вас. Однако даже при реализации методом класса не стоит забывать о константной корректности pop operator + (const pop& p) const и, конечно int getX() const Если вы предоставите конструктор конверсии из типа int, вы сразу же сможете также выполнять сложения вида pop a, b; a = b + 5; // Автоматически рассматривается компилятором как `b + pop(5)` Однако из-за того, что оператор сложения у вас реализован методом класса, вы не сможете выполнять сложения вида a = 5 + b; Реализация оператора сложения самостоятельной функцией была бы свободна от этого недостатка.

XML-сериализация по особым правилам

#c_sharp #xml #сериализация


Имеется электронный документооборот. Обмен данными выполняется с помощью XML следующей
структуры:


    
    
    
    
    
    
    
    
        
        
        
        
        
        
        
            
            
        
    
    
        
        
        
        
        
        
    



Проблема на лицо - требуется куча классов примерно такой структуры:

[XmlRoot(ElementName="tag1")]
public class Tag1
{
    [XmlAttribute(AttributeName="value")]
    public int Value { get; set; }
}


и потом:

[XmlRoot(ElementName="document")]
public class Document
{
    [XmlElement(ElementName="tag1")]
    public Tag1 Tag1 { get; set; }
    [XmlElement(ElementName="tag2")]
    public Tag2 Tag2 { get; set; }
    [XmlElement(ElementName="tag3")]
    public Tag3 Tag3 { get; set; }
    [XmlElement(ElementName="tag4")]
    public Tag4 Tag4 { get; set; }
    [XmlElement(ElementName="tag5")]
    public Tag5 Tag5 { get; set; }
    [XmlElement(ElementName="tag6")]
    public Tag6 Tag6 { get; set; }
    [XmlElement(ElementName="tag7")]
    public Tag7 Tag7 { get; set; }
    [XmlElement(ElementName="outerTag1")]
    public OuterTag1 OuterTag1 { get; set; }
    [XmlElement(ElementName="outerTag2")]
    public OuterTag2 OuterTag2 { get; set; }
}


Хотелось бы вместо этого написать класс со свойствами простых типов:

[XmlRoot(ElementName="document")]
public class Document
{
    [...(ElementName="tag1")]
    public int Tag1 { get; set; }
    [...(ElementName="tag2")]
    public string Tag2 { get; set; }
    [...(ElementName="tag3")]
    public DateTime Tag3 { get; set; }
    [...(ElementName="tag4")]
    public int Tag4 { get; set; }
    [...(ElementName="tag5")]
    public DateTime Tag5 { get; set; }
    [...(ElementName="tag6")]
    public string Tag6 { get; set; }
    [...(ElementName="tag7")]
    public decimal Tag7 { get; set; }
    [XmlElement(ElementName="outerTag1")]
    public OuterTag1 OuterTag1 { get; set; }
    [XmlElement(ElementName="outerTag2")]
    public OuterTag2 OuterTag2 { get; set; }
}


и не плодить кучу мелких классов типа Tag1, Tag2, ...

Можно ли как-то это сделать? В идеале хотелось бы сделать кастомный атрибут MyXmlElement
и использовать его вместо XmlElement, но как научить XmlSerializer понимать его и генерировать
соответствующую разметку? Или может есть какой-то другой способ?
    


Ответы

Ответ 1



А давайте сделаем кодогенерацию? Т4 прекрасно подходит. Мы создадим два класса: один со вложенными классами для сериализации, и другой плоский, с которым легко и удобно работать. И конвертирующие функции. Генерировать будем на основе вот такого XML-документа (я положил его в проект под названием DocumentProto.xml). Кладём в проект новый файл типа T4 через Add New Item → Text Template (не Runtime TextTemplate!). Я назвал его Document.tt. В первой строке меняем hostspecific="false" на true. Добавляем нужные сборки: <#@ assembly name="System.Xml" #> <#@ assembly name="System.Xml.Linq" #> и <#@ import namespace="System.Xml.Linq" #> меняем output extension на ".cs". Дальше дело техники: нам нужно распарсить XML. Открываем документ, читаем его в память: <# var xmlpath = Host.ResolvePath("DocumentProto.xml"); XDocument xd = XDocument.Load(xmlpath); #> Создаём шаблон файла: // Generated code! Do not edit! using System; using System.Xml.Serialization; namespace CodegenTest { // будем добавлять тут } Теперь, генерация набора классов для сериализации. Пишем (предварительно отладив это на тестовом приложении командной строки) в конце tt-файла: <#+ void GenerateNestedClasses(XElement element) { var childClasses = new Queue(); string className = element.Name.LocalName; string capitalizedClassName = char.ToUpper(className[0]) + className.Substring(1); WriteLine($"[XmlRoot(ElementName=\"{className}\")]"); WriteLine($"class {capitalizedClassName}"); WriteLine("{"); foreach (var sub in element.Elements()) { string type; string name = sub.Name.LocalName; string capitalizedName = char.ToUpper(name[0]) + name.Substring(1); if (!sub.HasAttributes) // nested class { type = capitalizedName; childClasses.Enqueue(sub); } else { type = (string)sub.Attribute("type"); } WriteLine($" [XmlElement(ElementName=\"{name}\")]"); WriteLine($" public {type} {capitalizedName} {{ get; set; }}"); } WriteLine("}"); WriteLine(""); foreach (var child in childClasses) GenerateNestedClasses(child); } #> (Внутри тегов <#+ #> располагаются дополнительные методы для генерации.) Пользуемся: namespace Serialization { <# PushIndent(" "); GenerateNestedClasses(xd.Root); ClearIndent(); #> } Получаем в Document.cs: namespace Serialization { [XmlRoot(ElementName="document")] class Document { [XmlElement(ElementName="tag1")] public int Tag1 { get; set; } [XmlElement(ElementName="tag2")] public string Tag2 { get; set; } [XmlElement(ElementName="tag3")] public DateTime Tag3 { get; set; } [XmlElement(ElementName="tag4")] public int Tag4 { get; set; } [XmlElement(ElementName="tag5")] public DateTime Tag5 { get; set; } [XmlElement(ElementName="tag6")] public string Tag6 { get; set; } [XmlElement(ElementName="tag7")] public double Tag7 { get; set; } [XmlElement(ElementName="outerTag1")] public OuterTag1 OuterTag1 { get; set; } [XmlElement(ElementName="outerTag2")] public OuterTag2 OuterTag2 { get; set; } } [XmlRoot(ElementName="outerTag1")] class OuterTag1 { [XmlElement(ElementName="innerTag11")] public int InnerTag11 { get; set; } [XmlElement(ElementName="innerTag12")] public string InnerTag12 { get; set; } [XmlElement(ElementName="innerTag13")] public string InnerTag13 { get; set; } [XmlElement(ElementName="innerTag14")] public int InnerTag14 { get; set; } [XmlElement(ElementName="innerTag15")] public int InnerTag15 { get; set; } [XmlElement(ElementName="innerTag16")] public int InnerTag16 { get; set; } [XmlElement(ElementName="innerOuterTag11")] public InnerOuterTag11 InnerOuterTag11 { get; set; } } [XmlRoot(ElementName="innerOuterTag11")] class InnerOuterTag11 { [XmlElement(ElementName="innerInnerTag111")] public string InnerInnerTag111 { get; set; } [XmlElement(ElementName="innerInnerTag112")] public DateTime InnerInnerTag112 { get; set; } } [XmlRoot(ElementName="outerTag2")] class OuterTag2 { [XmlElement(ElementName="innerTag21")] public string InnerTag21 { get; set; } [XmlElement(ElementName="innerTag22")] public string InnerTag22 { get; set; } [XmlElement(ElementName="innerTag23")] public string InnerTag23 { get; set; } [XmlElement(ElementName="innerTag24")] public string InnerTag24 { get; set; } [XmlElement(ElementName="innerTag25")] public string InnerTag25 { get; set; } [XmlElement(ElementName="innerTag26")] public string InnerTag26 { get; set; } } } Добавляем ещё в конец файла генерацию свойств «плоского класса»: void GenerateFlatClassProps(XElement element) { foreach (var sub in element.Elements()) { if (!sub.HasAttributes) // nested GenerateFlatClassProps(sub); else { var type = (string)sub.Attribute("type"); string name = sub.Name.LocalName; string capitalizedName = char.ToUpper(name[0]) + name.Substring(1); WriteLine($"public {type} {capitalizedName} {{ get; set; }}"); } } } и метода чтения свойств в плоский класс: void GenerateFlatteningBody(XElement element, string path) { string name = element.Name.LocalName; string capitalizedName = char.ToUpper(name[0]) + name.Substring(1); foreach (var sub in element.Elements()) { string subName = sub.Name.LocalName; string capitalizedSubName = char.ToUpper(subName[0]) + subName.Substring(1); if (!sub.HasAttributes) // nested GenerateFlatteningBody(sub, path + "." + capitalizedSubName); else WriteLine($"this.{capitalizedSubName} = that{path}.{capitalizedSubName};"); } } Пользуемся ими наверху: public class Document { <# PushIndent(" "); GenerateFlatClassProps(xd.Root); ClearIndent(); #> private void AssignFromSerialized(Serialization.Document that) { <# PushIndent(" "); GenerateFlatteningBody(xd.Root, ""); ClearIndent(); #> } internal static Document FromSerialized(Serialization.Document sdoc) { var doc = new Document(); doc.AssignFromSerialized(sdoc); return doc; } } Получаем готовый сгенерированный набор классов для использования: namespace CodegenTest { public class Document { public int Tag1 { get; set; } public string Tag2 { get; set; } public DateTime Tag3 { get; set; } public int Tag4 { get; set; } public DateTime Tag5 { get; set; } // ... private void AssignFromSerialized(Serialization.Document that) { this.Tag1 = that.Tag1; this.Tag2 = that.Tag2; // ... this.InnerTag11 = that.OuterTag1.InnerTag11; this.InnerTag12 = that.OuterTag1.InnerTag12; this.InnerTag13 = that.OuterTag1.InnerTag13; this.InnerTag14 = that.OuterTag1.InnerTag14; this.InnerTag15 = that.OuterTag1.InnerTag15; this.InnerTag16 = that.OuterTag1.InnerTag16; this.InnerInnerTag111 = that.OuterTag1.InnerOuterTag11.InnerInnerTag111; // ... } internal static Document FromSerialized(Serialization.Document sdoc) { var doc = new Document(); doc.AssignFromSerialized(sdoc); return doc; } } namespace Serialization { [XmlRoot(ElementName="document")] class Document { [XmlElement(ElementName="tag1")] public int Tag1 { get; set; } // ... [XmlElement(ElementName="outerTag1")] public OuterTag1 OuterTag1 { get; set; } [XmlElement(ElementName="outerTag2")] public OuterTag2 OuterTag2 { get; set; } } [XmlRoot(ElementName="outerTag1")] class OuterTag1 { [XmlElement(ElementName="innerTag11")] public int InnerTag11 { get; set; } [XmlElement(ElementName="innerTag12")] public string InnerTag12 { get; set; } // ... } // ... } } Обновление: исправил GenerateNestedClasses на такое: void GenerateNestedClasses(XElement element) { var childClasses = new Queue(); var leafClasses = new Queue(); string className = element.Name.LocalName; string capitalizedClassName = char.ToUpper(className[0]) + className.Substring(1); WriteLine($"[XmlRoot(ElementName=\"{className}\")]"); WriteLine($"class {capitalizedClassName}"); WriteLine("{"); foreach (var sub in element.Elements()) { string name = sub.Name.LocalName; string capitalizedName = char.ToUpper(name[0]) + name.Substring(1); if (!sub.HasAttributes) // nested class childClasses.Enqueue(sub); else leafClasses.Enqueue(sub); WriteLine($" [XmlElement(ElementName=\"{name}\")]"); WriteLine($" public {capitalizedName} {capitalizedName} {{ get; set; }}"); } WriteLine("}"); WriteLine(""); foreach (var leaf in leafClasses) GenerateLeafClass(leaf); foreach (var child in childClasses) GenerateNestedClasses(child); } void GenerateLeafClass(XElement element) { string className = element.Name.LocalName; string capitalizedClassName = char.ToUpper(className[0]) + className.Substring(1); string type = (string)element.Attribute("type"); WriteLine($"class {capitalizedClassName}"); WriteLine("{"); WriteLine($" [XmlAttribute]"); WriteLine($" public {type} Value {{ get; set; }}"); WriteLine("}"); WriteLine(""); } и в GenerateFlatteningBody последнюю строчку на WriteLine($"this.{capitalizedSubName} = that{path}.{capitalizedSubName}.Value;"); Получились промежуточные классы вида class Tag1 { [XmlAttribute] public int Value { get; set; } } На всякий случай, полный код tt-шаблона и сгенерированного результата: https://gist.github.com/vladd/7f25e0ceb625372bffdbf9b455452ae1

Ответ 2



Отказался от реализации интерфейса IXmlSerializable - решение получалось очень громоздким и не красивым, к тому же нужно учесть много всевозможных нюансов, которые учтены в штатной работе сериализатора. В итоге написал простой класс: public class Tag { [XmlAttribute(AttributeName = "value")] public T Value { get; set; } public override string ToString() => Value.ToString(); public static implicit operator Tag(T value) => new Tag { Value = value }; public static implicit operator T(Tag tag) => tag.Value; } Это позволило выбросить кучу мелких классов Tag1, Tag2 и т.д. Сам документ принял вид: [XmlRoot(ElementName="document")] public class Document { [XmlElement(ElementName="tag1")] public Tag Tag1 { get; set; } [XmlElement(ElementName="tag2")] public Tag Tag2 { get; set; } [XmlElement(ElementName="tag3")] public Tag Tag3 { get; set; } [XmlElement(ElementName="tag4")] public Tag Tag4 { get; set; } [XmlElement(ElementName="tag5")] public Tag Tag5 { get; set; } [XmlElement(ElementName="tag6")] public Tag Tag6 { get; set; } [XmlElement(ElementName="tag7")] public Tag Tag7 { get; set; } [XmlElement(ElementName="outerTag1")] public OuterTag1 OuterTag1 { get; set; } [XmlElement(ElementName="outerTag2")] public OuterTag2 OuterTag2 { get; set; } } Ну и благодаря операторам для неявного приведения типов документ создается так же просто: var doc = new Document { Tag1 = 1, Tag2 = "text", ... };

Путь к UNIX сокету не может быть более 16 символов

#cpp #linux #c #сокет


Есть две моих программы на C/C++. Код для работы с Unix сокетами я брал с одного
давно устаревшего сайта, других более понятных примеров я не нашел. В итоге я не могу
использовать сокет, длина которого более 14-16 символов. Код клиента:  

int sock;
sock = socket(AF_UNIX, SOCK_STREAM, 0);
struct sockaddr srvr_name;
if (sock < 0) {
    perror("socket failed");
    return EXIT_FAILURE;
}
srvr_name.sa_family = AF_UNIX;
strcpy(srvr_name.sa_data, SOCK_NAME);
if (connect(sock, &srvr_name, sizeof (srvr_name)) < 0) {
    perror("connect failed");
    exit(2);
}
send(sock, buf, strlen(buf), 0);


Код сервера:  

sock_ = socket(AF_UNIX, SOCK_STREAM, 0);
if (sock_ < 0) {
    throw socket_exception(socket_exception::SocketError);
}
srvr_name.sa_family = AF_UNIX;
filename_c = filepath.c_str();
strcpy(srvr_name.sa_data, filename_c);
if (bind(sock_, &srvr_name, strlen(srvr_name.sa_data) +
        sizeof (srvr_name.sa_family)) < 0) {
    throw socket_exception(socket_exception::BindError);
}
listen(sock_, max_connect-1);


В strace(При том что путь к сокету я указал как /run/defu123456789/34567)  

connect(3, {sa_family=AF_UNIX, sun_path="/run/defu12345"}, 16) = -1 ENOENT


Размер буфера sock_name ограничен 256 байтами. Использовать библиотеку boost нельзя.
Как изменить код так, что бы он работал корректно?
    


Ответы

Ответ 1



В итоге я не могу использовать сокет, длина которого более 14-16 символов. Потому, что структура sockaddr описана в файле /usr/include/bits/socket.h таким образом: /* Structure describing a generic socket address. */ struct sockaddr { __SOCKADDR_COMMON (sa_); /* Common data: address family and length. */ char sa_data[14]; /* Address data. */ }; Как видите, под поле адреса сокета отведено ровно 14 байт. Откуда взялось это ограничение - долгая история. Но оно есть.

Преинкремент и постинкремент

#c_sharp


Задали вопрос на учебе, что больше потребляет ресурсов ++i или i++. Самостоятельно
инфо не нашёл, прошу подсказать где искать.
    


Ответы

Ответ 1



Согласно спецификации языка, разница между пре- и постинкрементом состоит в том, что при вычислении выражения значением результат является в одном случае старое, а в другом — новое значение инкрементируемой переменной. В случае простого применения в форме x++; (например, такое часто встречается в циклах) возвращаемое значение не используется, и смысл обеих форм строго одинаков, так что они компилируются в одинаковый объектный код. Даже если оператор инкремента переопределён, разницы нет, т. к. (в отличие от C++) нет возможности иметь различные определения для пре- и постинкрементов. Откуда растут ноги у этого вопроса? А вот откуда. В древние времена были наивные компиляторы языка C (и, возможно, C++), которые не умели оптимизировать код. И если они компилировали прямолинейно, то код получался таким: // x++ int temp = x; x = x + 1; // результат = temp; но он не нужен, так что он отбрасывается и // ++x; x = x + 1; // результат = x; но он не нужен, так что он отбрасывается Ваш преподаватель, вероятно, слыхал об этом, и ждёт от вас ответа о том, что необходимо ручной оптимизацией убрать ненужную временную переменную. Он неправ, отстал от реальности на вечность и тянет вас в эпоху трилобитов. В реальности последние как минимум 10 лет компиляторы умеют делать оптимизации намного лучше людей, и в частности прекрасно умеют выбрасывать никому не нужные временные переменные. Так что разницы в сгенерированном коде просто не будет, что можно видеть даже для C++ здесь.* (Если вы, конечно, не отключите оптимизации.) Теперь с точки зрения промышленной практики. Если вам нужно ускорить выполнение вашей программы, нанооптимизации наподобие использования преинкремента вместо постинкремента — даже если бы они и давали выигрыш в один такт процессора — никогда не являются нужным средством. Оптимизируйте ваши алгоритмы и структуры данных, переходите от квадратичных алгоритмов к линейным и логарифмическим. Не экономьте копейки, это не окупается. *Например, из таких двух функций: volatile int x; // угадайте, что будет, если убрать volatile :-P int pre(int num) { for (int i = 0; i < num; ++i) x = i; } int post(int num) { for (int i = 0; i < num; i++) x = i; } gcc 7.2 с ключом -O3 производит pre(int): test edi, edi jle .L2 xor eax, eax .L3: mov DWORD PTR x[rip], eax add eax, 1 cmp edi, eax jne .L3 .L2: rep ret post(int): test edi, edi jle .L6 xor eax, eax .L8: mov DWORD PTR x[rip], eax add eax, 1 cmp edi, eax jne .L8 .L6: xor eax, eax ret А с ключом -Os вообще pre(int): xor eax, eax .L3: cmp eax, edi jge .L2 mov DWORD PTR x[rip], eax inc eax jmp .L3 .L2: ret post(int): jmp pre(int)

Ответ 2



В C# разницы между пост- и преинкрементом нет, в C++ (отвечая на Ваш комментарий с ?) ситуация следующая: как правило, постинкремент реализуется посредством преинкремента и возвращает первоначальное значение переменной. Каноническая форма постинкремента: T T::operator++(int) { T old(*this); ++*this; return old; } Как видите, создается временная переменная old. Каноническая форма преинкремента: T& T::operator++() { // increment your object here return *this; } Поэтому быстрее будет работать преинкремент.

Постоянный запуск билда на дженкинсе

#git #bitbucket #jenkins #непрерывная_интеграция


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


Ответы

Ответ 1



Заведите метку, обозначающую, что для данной задачи не нужен запуск CI, например [skip ci]. Когда Jenkins делает коммит, пускай добавляет эту метку в текст сообщения коммита. При запуске конвейера (pipeline) в первую очередь проверяйте наличие метки в сообщении последнего коммита текущей ветки. Есть расширение Jenkins CI Skip, но оно давно не обновлялось. Если оно не работает, можно сделать ту же проверку вручную. Сначала определите наличие метки в сообщении коммита и экспортируйте переменную в окружение. if [[ $(git show -s --format=%B) == *"skip ci"* ]]; then export SKIPCI=1 fi После добавьте условие: если метки нет, выполнять остальную часть конвейера.

Ответ 2



Проще создать юзера jenkins в bitbucket и сконфигурить git-config на jenkins'е. После чего исключить username jenkins из коммитеров которые триггерят hook.

Отображение изображение на экран PyQt5 доступных в bytes

#python #python_3x #pyqt5


как вывести изображение на экран PyQt5 если изображение храниться в бд в bytes 

import sys,sqlite3
from PyQt5.QtWidgets import QWidget, QApplication,QPushButton
from PyQt5.QtGui import QPainter, QColor, QFont,QIcon
from PyQt5.QtCore import Qt,QSize
class Example(QWidget):

    def __init__(self):
        super().__init__()
        self.initUI()


    def initUI(self):
        conn = sqlite3.connect("test.db")
        connect = conn.execute("SELECT Data from Images")
        for row in connect:

            self.label_im_qrcode = QLabel()
            import io, qrcode
            b = io.BytesIO(row[0])
            img.save(b, 'png')
            data = b.getvalue()

            pixmap = QPixmap()
            pixmap.loadFromData(data)


            self.label_im_qrcode.setPixmap(pixmap)
         self.setGeometry(300, 300, 280, 170)
         self.setWindowTitle('Draw text')
         self.show()
if __name__ == '__main__':
    con = sqlite3.connect('test.db')
    cur = con.cursor()
    fin = open('woman.jpg', "rb")
    img = fin.read()
    binary = sqlite3.Binary(img)
    cur.execute("INSERT INTO Images(Data) VALUES (?)", (binary,))
    con.commit()
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

    


Ответы

Ответ 1



Воспользоваться нужными методами: QImage.loadFromData или QImage::fromData. Для QPixmap есть метод QPixmap.loadFromData Пример из qrcode_gui: text = self.input_text.toPlainText() img = qrcode.make(text) import io b = io.BytesIO() img.save(b, 'png') data = b.getvalue() pixmap = QPixmap() pixmap.loadFromData(data) self.label_im_qrcode.setPixmap(pixmap) Больше моих примеров После обновления вопроса: Показываю пример добавления в базу данных SQLite картинки и отображения ее на виджете Qt: import sys import sqlite3 from PyQt5.QtWidgets import * from PyQt5.QtGui import * if __name__ == '__main__': con = sqlite3.connect('test.sqlite') cur = con.cursor() cur.execute(''' CREATE TABLE IF NOT EXISTS Images ( Data BLOB ) ''') con.commit() with open('capture.png', mode='rb') as f: binary = sqlite3.Binary(f.read()) cur.execute("INSERT INTO Images(Data) VALUES (?)", (binary,)) con.commit() app = QApplication([]) w = QWidget() layout = QVBoxLayout() w.setLayout(layout) for (img_data,) in con.execute("SELECT Data from Images"): pixmap = QPixmap() pixmap.loadFromData(img_data) label = QLabel() label.setPixmap(pixmap) layout.addWidget(label) w.show() sys.exit(app.exec_()) Скриншот:

Строгий алиасинг в MinGW-w64

#cpp #шаблоны_с++ #mingw #mingw_w64


При компиляции с MinGW-w64 этого простого кода:

#include 
#include 
#include 

template 
void readWithSep(){
    std::istringstream sLine;
    sLine.str("hello");
    std::string line;
    while(std::getline(sLine, line)){
        std::cout<();
}


выдаётся ошибка: 


  доступ по указателю с приведением типа нарушает правила перекрытия
  объектов в памяти [-Werror=strict-aliasing] 
  
  while(std::getline(sLine, line)){


Компилирую так:


  i686-w64-mingw32-g++ -std=c++17 -W -Wall -Wextra -pedantic -Werror -O3
  file.cpp


Почему возникает эта ошибка и как её исправить? Здесь же вроде никаких преобразований
типов не происходит. Странно, что g++ это компилирует без ошибок (с теми же флагами)

Полный вывод компилятора:


  file.cpp: В функции «void readWithSep()»:
  
  file.cpp:10:35: ошибка:
  доступ по указателю с приведением типа нарушает правила перекрытия
  объектов в памяти [-Werror=strict-aliasing]
  
  while(std::getline(sLine, line)){
  
  cc1plus: все предупреждения считаются ошибками

    


Ответы

Ответ 1



Похоже, это бага (точнее регресия) в gcc. https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80633 Воспроисводится только при включенном -O2/-O3, потому что на этом уровне включается -ftrict-aliasing. Если компилятор менять не получается или уровень оптимизации, то можно просто добавить -fno-strict-aliasing.

Нужно совместить эффект аккордеона и табов в одном скрипте

#javascript #html #jquery #css #вёрстка


Хочу немного модифицировать этот скрипт, чтобы из активного элемента switch tab разворачивался
его контент, сейчас это работает не верно (раскрываются сразу все).

Делал решение на css с привязкой раскрытия к активному элементу, но даже с transition
раскрытие/скрытие выглядит не плавно, поэтому решил попробовать со слайдами.



$(".content").not(":first").hide();
$(".switch:first div").show();
$(".switch").click(function() {

  var sld = $(".switch div");

  $(".switch").removeClass("active").eq($(this).index()).addClass("active");
  $(".content").hide().eq($(this).index()).fadeIn();

  if ($(".switch").eq($(this).index()).hasClass("active")) {
    sld.slideDown();
  } else {
    sld.slideUp();
  }
}).eq(0).addClass("active");
.switch span {
  display: inline-block;
  font-family: Arial;
  font-size: 14px;
  padding: 5px;
  margin-bottom: 10px;
  background-color: #eee;
  border-radius: 4px;
  border: 1px solid #ccc;
}

.switch div {
  display: none;
  font-family: Arial;
  font-size: 16px;
  padding: 5px 0;
}

.active span {
  color: red;
}

Switch_1
Some text switch tab 1
Switch_2
Some text switch tab 2
Switch_3
Some text switch tab 3
some content 1
some content 2
some content 3
Подскажите что я делаю не так?


Ответы

Ответ 1



Можете вот так сделать: $('.switch div').each(function( index ) { var sld = $(this); sld.slideUp(); }); if ($(this).hasClass('active')) { var sld = $(this).find('div'); sld.slideDown(); } Полный код Jquery: (function($) { $(".content").not(":first").hide(); $(".switch:first div").show(); $(".switch").click(function() { $(".switch").removeClass("active").eq($(this).index()).addClass("active"); $(".content").hide().eq($(this).index()).fadeIn(); $('.switch div').each(function( index ) { var sld = $(this); sld.slideUp(); }); if ($(this).hasClass('active')) { var sld = $(this).find('div'); sld.slideDown(); } }).eq(0).addClass("active"); })( jQuery ); Результат:

Возвращение массива функцией

#cpp #массивы #функции #динамические_массивы


Есть код. В функции double f(double x[], int n) делается вычисление нескольких функций
с несколькими переменными. Несколько переменных мы передадим в виде массива double
x[], int n - количество элементов массива; к примеру, пусть будут вычислятся две функции
- я их решил записать в массив double g[n], так как мне надо, что бы функция возвращала
оба вычисления функции: g[0] = x[0] + x[1]; g[1] = x[0] * x[1]. Как вернуть массив
g[n], и каким быть должно обращение к функции (в примере кода сразу в функции memcpy)?
Что не так, поправьте. 
Пример кода.

#include 

using namespace std;

double f(double x[], int n) 
{
    double g[n];
    g[0] = x[0] + x[1];
    g[1] = x[0] * x[1];
    return /* Что? */;
}

main() 
{
    int n = 2;
    double a[2], b[2];
    for (int i = 0; i < n; i++)
    {
        cout << " a[" << i << "] = ";
        cin >> a[i];
    }
    memcpy(b, f(a, n), sizeof(a));
    for (int i = 0; i < n; i++) cout << " b[" << i << "] = " << b[i];
    return 0;
}



    


Ответы

Ответ 1



Возвращать массив как таковой нельзя. Можно вернуть указатель на него - но тогда массив не должен быть локальной переменной! (Кстати, в C++ нельзя объявлять массив с размером, неизвестным во время компиляции.) Поэтому нужно иначе.. Выделить массив динамически, и вернуть (только потом не забыть освободить память!) int * g = new int[n]; ... return g; Использовать, скажем, вектор (наилучший вариант): std::vector g(n); ... return g; Можно обернуть массив в структуру, но опять же, нужно знать размер во время компиляции: struct Array { int g[10]; } ... Array f() { Array g; g.g[0] = 5; ... return g; } Но лучше всего - использовать готовый вектор, тем более что у вас количество элементов заранее не известно, так что std::array<> вам не подойдет. PS Ну и, конечно, вариант с передачей возвращаемого массива в функцию: int g[10]; ... f(..., int* g) { // работа с g[i] ... } ... f(...,g);

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

#html #css #css3 #html5 #flexbox




(1 картинка)

У контейнера может меняться ширина. У элементов фиксированная ширина 75px, margin-left
20px. Как можно сделать, что бы элементы равномерно распределились?

ссылка на мою разметку: 

https://jsfiddle.net/mefpu0k6/1/ 




Если делать через flex-wrap и space-between, то у последних элементов margin-left
не такой как у всех (2 картинка)



А нужно сделать как на 3 картинке. Т.е margin-left у всех одинаковый

Мне удалось это сделать, но только с помощью js 

`https://jsfiddle.net/u1yub2jq/2/`


Можно ли это сделать без помощи js? Или что делать с лишним пространством справа?

При этом, когда меняется ширина элементы переходят на новую строку.
    


Ответы

Ответ 1



Не флексбоком единым. Есть ещё грид. .container { display: grid; grid-template-columns: repeat(auto-fit, 75px); grid-gap: 20px; justify-content: space-between; width: 500px; border: 1px solid black; resize: horizontal; overflow: hidden; } .block { background-color: red; color: white; width: 75px; height: 75px; font: 20px sans-serif; line-height: 75px; text-align: center; }
1
2
3
4
5
6
7
8
Подробный разбор всех вариантов размещения ячеек с разнообразными выравниваниями можно найти в статье Красивое выравнивание блоков по резиновой сетке. По-новому .

Ответ 2



#wrapper { display: flex; width: 480px; height: 220px; background: rgba(205, 115, 12, 0.1); border: 0.1px solid rgba(205, 115, 12, 1); flex-direction: row; flex-wrap: wrap; justify-content: space-between; align-items: baseline; align-content: space-between; } .block { width: 100px; height: 100px; background: orange; }


Поиск максимальной суммы квадратов чисел

#python #алгоритм #поиск


Требуется найти максимальную сумму квадратов двух натуральных чисел, которая будет
близка(или равна) к заданному числу.  

Примеры: 


  20 -> 20  т.к. (42 + 22)
  50 -> 50  т.к. (52 + 52 или 72 + 12)
  30 -> 29  т.к. (52 + 22)


Не пойму, почему моя программа неверна.

res = int((N)**0.5)
res1 = int(((N-res**2)**0.5))
print(res**2+res1**2)

    


Ответы

Ответ 1



Ваше решение неверное так как int(N**.5)**2 не обязан быть одним из слагаемых в сумме. К примеру, 18 = 32 + 32, а ваше решение возвращает 17 = 42 + 12 для N=18 (17 < 18 поэтому это не является наибольшей суммой квадратов чисел близких к N). Помимо перебора, можно построить решение на основе теоремы о сумме двух квадратов, из которой следуют разрешённые варианты разложения числа на простые множители — целое число m > 1 является суммой квадратов тогда и только тогда когда у него нет простых множителей вида 4*n+3 в нечётной степени: def is_sum_of_two_squares(m): p = 2 while m > 1: multiplicity = 0 while m % p == 0: # found prime factor multiplicity += 1 m //= p if multiplicity & 1: # odd power if p % 4 == 3: # 4*n+3 form return False p += 1 return True Имея способ определить является ли натуральное число суммой квадратов, можно найти наибольшую сумму близкую к числу, перебирая рядом стоящие числа (от близких к далёким, от больших к маленьким числам): def max_sum_of_two_squares_nearest(m): for i in range(m + 1): if is_sum_of_two_squares(m + i): return m + i elif is_sum_of_two_squares(m - i): return m - i assert 0 Пример: for m in range(21): print(m, "->", max_sum_of_two_squares_nearest(m)) Результат 0 -> 0 1 -> 1 2 -> 2 3 -> 4 4 -> 4 5 -> 5 6 -> 5 7 -> 8 8 -> 8 9 -> 9 10 -> 10 11 -> 10 12 -> 13 13 -> 13 14 -> 13 15 -> 16 16 -> 16 17 -> 17 18 -> 18 19 -> 20 20 -> 20

Ответ 2



Ваша программа неверна потому что она рассматривает только один случай. Так, 89 = 64 + 25 но ваша программа найдет только 85 = 81 + 4. Вместо "жадного" выбора первого числа по формуле int((N)**0.5) правильнее будет перебрать все варианты от 0 до int((N)**0.5) и выбрать среди них наилучший. Формулу для второго числа можете оставить ту же самую.

Ответ 3



Вот моё решение на Питоне, перебирает меньшее из двух чисел в отрезке [1, sqrt(n)] а второе вычисляет по формуле, находит все ответы для максимальной из найденных сумм, для максимального числа 10^9 отрабатывает алгоритм мгновенно. Вот код на Питоне, можно запустить онлайн: n = 1000000000 sqrt_n = int(n ** 0.5) max_sum = 0 result = [] for i in range(1, sqrt_n + 1): j = int((n - i * i) ** 0.5) if j < i: break s = i * i + j * j if (s > max_sum): max_sum = s result = [] if (s == max_sum): result.append((i, j)) print(max_sum, result) Вот какой вывод для примера 10^9: 1000000000 [(1200, 31600), (7696, 30672), (10000, 30000), (18000, 26000), (19920, 24560)]

Ответ 4



Предполагая, что Вам таки не важно(могу ошибаться) в какие именно суммы разложимо число, предлагаю решение полным перебором до sqrt(N): from math import sqrt x = int(input()) def check(x): sn = int(sqrt(x))+1 for i in range(1, sn): j = int(sqrt(x - i*i)) if (i*i+j*j == x): # print("{0}^2 + {1}^2".format(i, j)) return True return False while x > 0: if check(x): print(x) break x = x - 1 if x == 0: print("Not found\n") 30 29 50 50 1000000000 1200^2 + 31600^2 1000000000 (4ms)

Python проверка наличия данных в sys.stdin

#python #input


Как проверить есть ли данные для чтения в sys.stdin, чтобы программа не останавливалась
в ожидании ввода, если их нет.
    


Ответы

Ответ 1



Можно посмотреть, что происходит, если timeout близкий к нулю передать в input_with_timeout(). На Unix, чтобы узнать есть ли данные для чтения: import select ready, _, _ = select.select([sys.stdin], [],[], 0) На Windows, при вводе с консоли: import msvcrt ready = msvcrt.kbhit() В качестве альтернативы, можно использовать асинхронный ввод/вывод (потоки, asyncio, O_NONBLOCK). Примеры для неблокирующего чтения вывода внешней команды.

Как разделить коммит на несколько?

#git #контроль_версий #git_rebase


Закоммитил всё, с помощью git commit -a -m Save, но потом забыл про это и сделал
несколько коммитов поверх него.  

Существует ли возможность разделить коммит в истории git на несколько более специфичных?  
    


Ответы

Ответ 1



В документации Git есть замечательная инструкция, как раз на этот случай: Разделение коммитов В интерактивном режиме, Вы можете пометить коммит действием "edit"(редактировать). Однако, это не означает, что git rebase ожидает результат редактирования в виде ровно одного коммита. На самом деле, Вы можете отменить этот коммит, и/или добавить другие наборы изменений. Это можно использовать, чтобы разделить коммит на несколько: git rebase -i <коммит>^ - Начните интерактивное изменение истории с помощью git rebase -i <коммит>^, где <коммит> - это то, что Вы хотите разделить. На самом деле, тут может быть любой диапазон изменений, если он включает нужный коммит edit - Пометьте тот коммит, который необходимо разделить действием "edit". git reset HEAD^ - Когда дело дойдёт до редактирования этого коммита, выполните git reset HEAD^. Это удалит зафиксированный набор изменений, оставив все изменения в рабочем каталоге. git add; git commit - Теперь фиксируйте изменения таким образом, которым Вы хотели. В процессе, Вы можете делать что угодно, редактировать файлы, убирать изменения в stash, и т.п. git rebase --continue - Когда все изменения зафиксированы в желаемом количестве коммитов(git status пуст), выполните git rebase --continue, чтобы применить все вышележащие изменения поверх новых. Любое изменение в истории контроля версий git, порождает новую историю, несовместимую со старой (все хеши будут обновлены). Поэтому, Вы должны ясно понимать, что Вы делаете. Лучше воздержаться от изменения истории, которая покинула локальный репозиторий и может (даже потенциально) быть у другого разработчика.

sql запрос на удаление

#sql #postgresql


База данных postgreSQL , есть две таблицы , "groups" (group_id (pk), name) - 6 строк и 
"students" (student_id(pk), group_id, first_name, last_name) - 43 строки.  

Как удалить строки из таблицы "students" по конкретному названию (groups.name) из
таблицы "groups"
На вот такой запрос 

DELETE
FROM 
  public."GROUPS", 
  public."STUDENTS"
WHERE 
  "GROUPS"."GROUP_ID" = "STUDENTS"."GROUP_ID" AND "GROUPS"."NAME" = "SR-01";


пишет 


  ошибка синтаксиса (примерное положение: ",")


на вот такой запрос

DELETE
FROM 
  public."STUDENTS"
WHERE 
  "GROUPS"."GROUP_ID" = "STUDENTS"."GROUP_ID" AND "GROUPS"."NAME" = "SR-01";


пишет 


  таблица "GROUPS" отсутствует в предложении FROM

    


Ответы

Ответ 1



У PostgreSQL довольно забавный синтаксис удаления с использованием ключевого слова USING: DELETE FROM public."STUDENTS" USING public."GROUPS" WHERE "GROUPS"."GROUP_ID" = "STUDENTS"."GROUP_ID" AND "GROUPS"."NAME" = 'SR-01' В крайнем случае всегда можно использовать старые, добрые подзапросы: DELETE FROM public."STUDENTS" WHERE "STUDENTS"."GROUP_ID" IN(SELECT "GROUP_ID" FROM public."GROUPS" WHERE "NAME" = 'SR-01')

Ответ 2



DELETE FROM public."STUDENTS" using public."groups" WHERE "GROUPS"."GROUP_ID" = "STUDENTS"."GROUP_ID" AND "GROUPS"."NAME" = "SR-01"; фиддл

Метод реализации графического интерфейса

#c_sharp #wpf #winforms #график




Необходимо будет сделать подобную вещь в своей программе на c# Windows Forms, возможно
и WPF. Из чего лучше всего сделать такой график? На нем нужно будет и многое другое
вырисовывать, но главное это основные свечи(красные, зеленые). Как мысль, самая банальная,
сделать координаты и рисовать по ним прямоугольники с линиями сверху и снизу. А при
масштабировании вырисовывать другие, более мелкие или большие. Но, может быть, есть
более лаконичное решение данной задачи? 
    


Ответы

Ответ 1



Ваш рисунок очень похож на Candlestick chart, название которого иногда переводят как японские свечи. Практически в каждой библиотеки для построения графиков такой тип тоже реализован, поэтому в первую очередь стоит рассмотреть готовые варианты прежде чем изобретать собственный велосипед. Пример того, как может выглядеть такой график нарисованный при помощи библиотеки OxyPlot Подчеркну, что кроме цвета фона использовались настройки по умолчанию, так как не ставил перед собой цели добиться соответствия с приведенным изображением. Данные получены случайным образом, по примеру из репозитория. Не буду копировать оттуда пример, но переведу его реализацию на F# для более наглядной демонстрации типов и методов библиотеки let candleStickSeries() = let model = PlotModel(Title = "", LegendSymbolLength = 24.0 ) let s1 = new CandleStickSeries(Title = "", Color = OxyColors.Black) let r = Random() Seq.initInfinite (fun _ -> r.NextDouble()) |> Seq.scan(fun price a -> price + a + 0.1) 100.0 |> Seq.indexed |> Seq.map (fun (i, price) -> let high = price + 10.0 + (r.NextDouble() * 10.0) let low = price - (10.0 + (r.NextDouble() * 10.0)) let open' = low + (r.NextDouble() * (high - low)) let close = low + (r.NextDouble() * (high - low)) new HighLowItem(float i, high, low, open', close)) |> Seq.take 30 |> Seq.iter s1.Items.Add model.Series.Add(s1) model.Axes.Add(new LinearAxis(Position = AxisPosition.Left, MaximumPadding = 0.3, MinimumPadding = 0.3 )) model.Axes.Add(new LinearAxis(Position = AxisPosition.Bottom, MaximumPadding = 0.03, MinimumPadding = 0.03 )) model Если хотите добиться полного (или почти полного совпадения), то советую разбить вопросы на несколько небольших и задать их по метке выбранной библиотеки.

Разбор условия if(?:) return;

#java


Подскажите пожалуйста, как можно озвучить данное условие if()

if (name == null ? !name.equals(human.name) : human.name != null) return false;


Мое предположение:
Если name пуст, то если name не равно human.name ...дальше мысль теряется. Иначе
если name не пустой, то если human.name не пустой ... та же ерунда мысль не улавливаю.
При каком из вышеперечисленных и совпадающих условий return false;?
    


Ответы

Ответ 1



То, что в скобках: Если name == null, вычисляется "!name.equals(human.name)" Если нет, вычисляется "human.name != null" Оба выражения возвращают тип boolean. Ну и выражение за скобками: если (найденный boolean == true) вернуть false.

Ответ 2



Вообще, в таким случаях надо по шагам преобразовывать код: if (name == null ? !name.equals(human.name) : human.name != null) return false; 1 шаг: выделяем boolean boolean flag = name == null ? !name.equals(human.name) : human.name != null; if (flag) { return false; } 2 шаг: превращаем оператор ?: в просто if boolean flag; if(name == null) { flag = !name.equals(human.name); // null.equals(human.name); - выкинет NullPointerException } else { flag = human.name != null; } if (flag) { return false; } 3 шаг: учитывая NullPointerException при !name.equals(human.name); код будет равным такому: if(name == null) { throw new NullPointerException(); } if (human.name != null) { return false; }

В C# необходимо отредактировать несколько элементов коллекции через LINQ запрос

#c_sharp #linq #коллекции


Язык C#, LINQ, Работа с несколькими элементами коллекции элементов.

Уважаемые коллеги прошу о помощи!
Есть коллекция элементов. Мне необходимо выбрать все элементы с "Company=Microsoft"
и изменить в этой же коллекции на "Company=12345" через LINQ запрос.

Код:

namespace GroupByLinq
{
    class Phone
    {
        public string Name { get; set; }
        public string Company { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            List phones = new List
            {
                new Phone {Name="Lumia 430", Company="Microsoft" },
                new Phone {Name="Mi 5", Company="Xiaomi" },
                new Phone {Name="LG G 3", Company="LG" },
                new Phone {Name="iPhone 5", Company="Apple" },
                new Phone {Name="Lumia 930", Company="Microsoft" },
                new Phone {Name="iPhone 6", Company="Apple" },
                new Phone {Name="Lumia 630", Company="Microsoft" },
                new Phone {Name="LG G 4", Company="LG" }
            };


            //Вот здесь что-то необходимо поправить или присвоения вовсе не должно быть
            phones = phones.SelectMany(x => x.Company == "Microsoft", p => new Phone
{ Name = p.Name, Company = "Citrus" }).ToList();


            foreach (Phone g in phones)
                Console.WriteLine(g.Company + " / " + g.Name);

            Console.Read();
        }
    }
}

    


Ответы

Ответ 1



Linq не предназначен для изменения данных, он используется для запросов, поэтому я рекомендую вам воспользоваться обычным циклом, но если очень захотеть, можно написать примерно так: phones = phones .Select(p => p.Company == "Microsoft" ? new Phone { Name = p.Name, Company = "12345" } : p) .ToList(); Этот подход плох тем, что он не изменяет старые объекты, а создает новые: а) вы должны учесть что где-то могут остаться ссылки на старые phone, которых теперь нет в новой коллекции; б) если вы добавите в класс новые свойства - вам придется найти каждый такой запрос и откорректировать его. Подумайте хорошенько и поймете, что такой вариант будет гораздо лучше (да и, кстати, не сильно многословнее): for (int i = 0; i < phones.Count; ++i) if (phones[i].Company == "Microsoft") phones[i].Company = "12345"; и да, с помощью Linq вы можете выбрать нужные телефоны и итерировать по ним, это тоже корректное решение (объекты остаются те же самые, с помощью Linq выбираем из них нужные): foreach (var phone in phones.Where(p => p.Company == "Microsoft")) phone.Company = "12345"; А в идеале вам вообще нужно завести отдельный класс для компаний, а в телефоне иметь ссылку на него, тогда смена наименования компании превратится во что-то такое: var company = companies.First(c => c.Name == "Microsoft"); company.Name = "12345";

Ответ 2



phones.Where(x => x.Company.Equals("Microsoft")).ToList().ForEach(y => y.Company = "12345");

Ответ 3



простой вариант такой: foreach (Phone g in phones.Where(x => x.Company == "Microsoft")) g.Company = "12345"; также можно воспользоваться методом расширения: public static IEnumerable Update(this IEnumerable source, Action act) { foreach (T element in source) { act(element); } return source; } тогда вызов будет похож на linq: phones.Where(p => p.Company == "Microsoft").Update(p => p.Company = "12345"); Стоит помнить, что в обоих вариантах, будут изменены сами значения переменных типа Phone в списке. Даже без присвоения результата переменной phones

Ответ 4



just my 5 cents: если можно MoreLinq использовать, то вот ещё способ phones = phones .Pipe(x => { if (x.Company.Equals("Microsoft")) x.Company = "13245"; }); или как то так: phones = phones .Pipe(x => x.Company = x.Company.Equals("Microsoft") ? "12345" : x.Company); Плюс такого подхода в том что над каждым элементом выполняется определённый Action, а не создается новый инстанс. Хотя тот же ForEach() делает тоже самое только на List<> - Pipe же можно вызвать на IEnumerable<> Минус подхода - сторонняя библиотека кода (можно без проблем написать свою реализацию Pipe-а). Хотя она за частую полезная.

Ответ 5



Можно каждый элемент списка вкинуть в анонимный метод: phones=phones.Select(x=> { x.Company=x.Company=="Microsoft"?"Citrus":x.Company; return x; }).ToList();