Страницы

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

пятница, 10 мая 2019 г.

Как не менять строку после выполнения команды bash

Делаю вывод любой команды bash в файл, после этого делаю вывод следующей команды в этот же файл. Хочу чтобы результат второго вывода записывался в ту же строку, что и первый.
Например: echo 123 > file date >> file
чтобы в итоге получилось 123 Вт. дек. 8 14:17:39 MSK 2015
Вывод будет вестись в большом массиве текста, поэтому решение не должно быть универсальным для любой строки в документе.


Ответ

man echo
echo -n "123 " > file echo -n `date` >> file

Набор номера мобильного телефона с Android приложения

Есть активити в котором в ListView отображаются заказы, в каждом заказе есть поле: номер телефона, как можно прямо в ListView сделать этот номер ссылкой, при нажатии на которую - набирался бы номер?


Ответ

1)Прописываем в манифесте:
2)Код для звонка
Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + yourArrayList.getPosition(position).getPhoneNumber())); startActivity(intent);
3) Выше пример для списка с объектами. Если же у вас каждый элемент это одно текстовое поле со всей инфой, то надо бы передеалть тогда. Ну или как максимум поиграться с subString

Как получить полный путь к папкам Temp и Application Data

Имеются ввиду системная папка Temp в WINDOWS\ и Application Data (%APPDATA%)


Ответ

%APPDATA% можно получить, например, функцией SHGetFolderPath или getenv из стандартной библиотеки, %TEMP% для текущего пользователя - GetTempPath или та же getenv, а вот для получения системной папки %TEMP% придётся использовать функцию ExpandEnvironmentStringsForUser
#include
#include #include #include
int main() { TCHAR szPath[MAX_PATH]; char* path;
if(SUCCEEDED(SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, 0, szPath))) { std::cout << "%APPDATA% (SHGetFolderPath) = " << szPath << std::endl; }
path = getenv("APPDATA"); if (path != NULL) { std::cout << "%APPDATA% (getenv) = " << path << std::endl; }
if (GetTempPath(MAX_PATH, szPath)) { std::cout << "User's %TEMP% (GetTempPath) = " << szPath << std::endl; }
path = getenv("TEMP"); if (path != NULL) { std::cout << "User's %TEMP% (getenv) = " << path << std::endl; }
if (ExpandEnvironmentStringsForUser(NULL, "%TEMP%", szPath, MAX_PATH)) { std::cout << "System's %TEMP% = " << szPath << std::endl; }
return 0; }
Для использования ExpandEnvironmentStringsForUser нужно дополнительно прилинковаться к Userenv.dll

Ревью Архитектуры приложения

Есть решение разбитое на следующие слои: DAO, DAL, Services Gui где,
DAO - здесь хранятся классы описывающие доменнные модели; DAL - Generic Repository и его реализация; Services - здесь у меня методы по типу следующего: IEnumerable GetEntities() Gui - клиентская часть
предвижу сразу вопрос чем Services отличается от Repository, в репозитории у меня базовые методы CRUD
void Create(Entity entity); void Update(Entity entity); void Delete(Entity entity); IQueryable Table {get;}
в Services же у меня строются более сложные запросы: соединения, группировка например:
var _orders = получаем данные; var _histories = получаем данные; var orders = _orders.Join(_histories, o=>o.Id, h=>h.OrderId,(o,h)=>new OrderView { //Формируем необходимое представление }) .ToList();
ну и т.п.
зависимости между проектами следующие:
DAO подключен в качестве reference в DAL, Services, Gui DAL подключен в качестве reference в Services, Gui Services подключен в качестве reference в Gui
Хочу проект сделать так что бы дальнейшая поддержка причиняла как можно меньше проблем.
Правильно ли я поступил разбив проект на более мелкие части, или я сделал так зря и необходимо слить все в один проект а разделение сделать на уровне директорий внутри решения и namespace
Буду премного благодарен за ссылки на литературу которую стоит почитать что бы прояснить для себя как правильно строить каркас приложения


Ответ

Есть самые разные способы проектирования приложения. Как я вижу вы пытаетесь использовать DDD. Этот паттрен достаточно универсален, но не является сильвербуллетом, а так же имеет очень много вариаций реализации, например CQRS+ES или DDD+Onion которые имеют свои назначения, а вместе с ним свои плюсы и минусы.
По мимо DDD и его вариаций, существуют такие архитектурные паттерны как EDA, SOA, NLayer и другие.
Что бы поддержка не причиняла больших проблем, нужно сначала выбрать правильную архитектуру, а это вопрос не только правильного выбора паттерна, но языка, стека технологий и многого другого. Сам же выбор зависит от решаемой задачи и различных условий.

PHP: Вставить пробел каждые N символов но начиная с конца

Как вставить пробел на РНР каждые N символов но начиная отсчет не с начала строки а с конца. Например чтобы с 1234567 получить 1 234 567 (если каждые три символа). chunk_split и wordwrap работают лишь со значениями больше 0
Можно в принципе вот так:
$reverse = strrev("1234567"); $withSpaces = chunk_split($reverse, 3, ' '); echo strrev($withSpaces);
Но может есть что то проще


Ответ

number_format
Если вкратце:
Вводимое число Сколько символов после "точки" Разделитель "точки" Разделитель тысячных (каждый третий с конца)
Пример:
echo number_format(1000000, 0, '.', ' '); // 1 000 000
echo number_format(1000000, 2, '.', ','); // 1,000,000.00

среда, 8 мая 2019 г.

Можно ли и как программировать AVR микроконтроллер (attiny13) силами самого микроконтроллера?

Т.е. задача такая, иметь возможность с помощью кнопок, подключенных к микроконтроллеру, запрограммировать его без перепрошивки и без написания интерпретатора (первое, что пришло в голову - fort). Т.е. сохранить и вызвать функцию в которой используется ограниченный набор команд, принимается один числовой параметр и возвращается один числовой параметр. Спасибо!
Пояснение
Необходимо:
Загрузиться Сгенерировать байткод прямо в программе Передать ему выполнение После окончания его работы вернуться в место вызова и получить результат.
Примером самой простой подпрограммы может быть: var + 1.


Ответ

Ответ ДА :) Сам не пробовал. Фрагмент статьи с хабра
Самым распространенным и удобным интерфейсом для прошивки AVR является SPI (Serial Peripheral Interface). Для подключения по SPI нужно всего четыре провода, не считая земли: SCK — тактовый сигнал, синхронизирует все операции обмена данными; MOSI (Master Out Slave In) — линия данных от ведущего устройства к ведомому; MISO (Master In Slave Out) — линия данных, наоборот, от ведомого устройства к ведущему; RESET — для разрешения прошивки по SPI нужно подать логический «0» на этот вывод.
Схема: кнопки от VCC на пины Reset, Mosi, Sck, после нажатия подтянуты к земле резисторами. Пин GND на землю, с пина Miso светодиод с резистором на землю.
Режим программирования включается подачей «0» на ногу RESET. Но есть некоторые тонкости. Atmel рекомендует сначала выставить на выводах RESET и SCK низкий уровень, а только потом подавать на контроллер питание. Если такой возможности нет, нужно после включения питания подать «0» на SCK, а затем положительный импульс на RESET
Далее нужно передать команду на собственно включение режима программирования: 10101100 01010011 xxxxxxxx xxxxxxxx Биты, обозначенные как x, могут быть любыми. Во время передачи третьего байта контроллер должен переслать обратно второй байт (01010011). Если это произошло, значит, все хорошо, команда принята, контроллер ждет дальнейших инструкций. Если ответ отличается, нужно перезагрузить МК и попробовать все сначала.
Сначала необходимо загрузить данные в буфер страницы, для этого используется команда «Load Program Memory Page» 01000000 000xxxxx xxxxbbbb iiiiiiii — для загрузки младшего байта слова, и 01001000 000xxxxx xxxxbbbb iiiiiiii — для загрузки старшего. 4 младших бита 3-го байта команды bbbb — адрес слова на странице, iiiiiiii — загружаемый байт. Сначала всегда должен загружаться младший байт слова, а затем — старший байт того же слова.
После того, как буфер страницы загружен, нужно выполнить команду «Write Program Memory Page» 01001100 0000000a bbbbxxxx xxxxxxxx для записи страницы непосредственно в память контроллера. Младший бит второго байта и старшие 4 бита третьего a:bbbb — пятибитный номер страницы для записи.
Лучше в подробностях смотреть по ссылке. На случай необитаемого острова распечатать даташит, заламинировать, хранить с собой.

Шутки браузеров: криво работает php валидация?

Я тестирую в основном сайт в Google Chrome (посл. версия), и только что заметил, что Opera (последняя версия) позволяет обойти ОБЯЗАТЕЛЬНОЕ ТРЕБОВАНИЕ заполнить возраст. Просто игнорирует это поле и даже успешно отправляется форма и тп.
Ссылка на форму
А также наверно какие-то старые браузеры умудряются еще регать людей с НЕВОЗМОЖНЫМ значением пола, например.
Т.е. Опера в данном случае игнорит и JS, и PHP валидацию. Это вообще законна такая работа PHP и браузеров?
Использую rules:
$rules[] = array( 'gender', 'required', 'message' => 'Укажите пол' ); $rules[] = array( 'birthYear', 'required', 'message' => 'Укажите год рождения' ); $rules[] = array('gender', 'in', 'range' => array("f", "m", "?"), 'message' => 'Укажите пол.');
Обновление
Добавил еще правило:
$rules[] = array( 'birthYear', 'length', 'min'=>$AGE_START, 'max'=>$AGE_END, 'tooShort' => 'Укажите год рождения', 'tooLong' => 'Укажите год рождения', );
Опера перестала глючить.


Ответ

К вам на сервер от клиента (в данном случае браузер) могут прийти какие угодно данные. Валидация данных всегда должна быть на сервере помимо JS. Если у вас регистрация проходит даже без обязательных полей, значит у вас некорректный PHP код с валидацией.
UPD
Лучше не обращаться к массиву $_POST напрямую. К тому же, в вашем выпадающем списке есть пустое значение. Один браузер его вам посылает, другой нет. Получается при обращении к $_POST['Form']['gender'] у вас в одном случае строка пустая, в другом случае null (не факт, это моё предположение).
Проверьте $_POST массив в контроллере в разных браузерах:
var_dump($_POST); die();
Вам может помочь либо метод saveAttributes(), либо как минимум проверка на пустое значение:
if(isset($_POST['Form']['gender']) && $_POST['Form']['gender'] != '') { $form->gender = $_POST['Form']['gender']; }