Страницы

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

понедельник, 3 июня 2019 г.

Как убрать кавычки в JSON?

У меня есть БД из нее получаю JSON следующим способом
String DB_PATH = "/data/data/com.example.apps/databases/"; String myPath = DB_PATH + DBHelper.DATABASE_NAME;// Set path to your database String myTable = DBHelper.TABLE_CONTACT;//Set name of your table SQLiteDatabase myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
String searchQuery = "SELECT * FROM " + myTable; Cursor cursor = myDataBase.rawQuery(searchQuery, null );
JSONArray json = new JSONArray(); cursor.moveToFirst(); while (cursor.isAfterLast() == false) { int totalColumn = cursor.getColumnCount(); JSONObject rowObject = new JSONObject();
for(int i=0 ; i< totalColumn ; i++) { if(cursor.getColumnName(i) != null) { try { if(cursor.getString(i) != null) { Log.d("TAG_NAME", cursor.getString(i)); rowObject.put(cursor.getColumnName(i), cursor.getString(i)); } else { rowObject.put(cursor.getColumnName(i), ""); } } catch(Exception e) { Log.d("TAG_NAME", e.getMessage()); } } } json.put(rowObject); cursor.moveToNext(); } cursor.close(); Log.d("TAG_NAME_ALL", json.toString()); return json.toString();
JSON получается какой необходим, за исключением одного значения latlng
Я получаю - "latlng":"[54.601530521,55.918132215051]"
Нужно получить - "latlng":[54.601530521,55.918132215051]
Как избавиться от кавычек?


Ответ

из комментарий и оригинал из stackoverflow.com

Если вам нужно быстро перевести строку на double, хоть и с грязным кодом, тогда вы можете сделать так:
String s = "[12.3456789,98.7654321]"; String trimmed = s.substring(1, s.length()-1); String[] parts = trimmed.split(","); double lat = Double.parseDouble(parts[0]); double lng = Double.parseDouble(parts[1]); Log.d("latlng", "lat="+lat+" lng="+lng);
Это не красиво, но работает.

Predicate и Func в качестве T

Есть List< Func< string>> нужно вызвать List.RemoveAll().Туда нужно передать Predicate< T>. нужно удалить только определнные функции. На MSDN Видел пример с Point, но попытка переделать аналогично под Func не получается. В чем проблема?
List> _list; public MainWindow() { _list = new List>(); _list.Add(this.test); _list.Add(this.test2); _list.Add(this.test); _list.Add(this.test2); _list.Add(this.test);
Predicate> pre = ValidateFunc(test2,nameof(test2));// тут функция и подчеркивается с ошибкой }
private static bool ValidateFunc(Func obj,string targetName) { return targetName == nameof(obj); }
string test() { textBox.Text += " 2"; return ""; } string test2() { textBox.Text += " 3"; return ""; }
Ошибка:Не удается неявно преобразовать тип "bool" в "System.Predicate< System.Func< string>>"
Если как на MSDN без параметров то ошибка такая: Нет перегруженного метода для "ValidateFunc", который соответствует делегату "Predicate< Func< string>>"


Ответ

Я предлагаю такой вариант:
Predicate> pre = item => item == this.test;
В частности, при использовании этого предиката в качестве аргумента метода _list.RemoveAll, из коллекции _list будут удалены все вхождения метода test
Либо так, если вместо ссылки на метод вы желаете использовать строку с именем метода:
Predicate> pre = item => item.Method.Name == "test";
А назначение вашего метода ValidateFunc мне понять не удалось. Вы в нем сравниваете строку targetName с nameof(obj) (то есть со строковой константой "obj").

git pull accept theirs/ours

Можно ли как-то заставить git во время pull-а использовать стратегию слияния theirs для конкретной директории? Но если конфликты возникнут в других местах - пусть предоставить мне возможность решать.
Сейчас в голову приходит только такое: делаем hook, который отрабатывает после pull-а, и запускает git checkout --theirs {моя директория}


Ответ

на основе ответа: Simple tool to 'accept theirs' or 'accept mine' on a whole file using git

для частичной автоматизации можно, например, использовать псевдонимы:
$ git config --global alias.accept-ours = "!f() { [ -z \"$@\" ] && set - '.'; git checkout --ours -- \"$@\"; git add -u -- \"$@\"; }; f" $ git config --global alias.accept-theirs = "!f() { [ -z \"$@\" ] && set - '.'; git checkout --theirs -- \"$@\"; git add -u -- \"$@\"; }; f"
и при возникновении конфликта после git pull для файлов/каталогов, которые должны быть ours, выполнить:
$ git accept-ours -- файлы/каталоги ...
а для тех, что должны быть theirs
$ git accept-theirs -- файлы/каталоги ...

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

Изолирую зависимости от реальной БД при написании модульных тестов в проекте. Интерфейс репозитория имеет следующий вид:
public interface IRepository { T Find(int id) where T: class; }
В реальном контексте метод реализован следующим образом:
public ConcreteDBContext : DBContext, IRepository { //some code public T Find(int id) where T : class { return this.Set.Find(id); } }
Вопрос: как правильно реализовать такой метод в FakeDBContext? И от чего наследовать сам контекст, кроме самого интерфейса IRepository?


Ответ

Если в местах, где вы используете db context, зависимость имеет тип IRepository, то вам достаточно наследовать заглушку от этого интерфейса (для этого зависимости и интерфейсы и нужны :)). Как правило, для каждого теста вам нужна будет своя реализация метода Find. Поэтому правильнее говорить о моках.
Самый правильный способ работать с моками -- использовать мок-фреймворки. Их великое множество: Moq, RhinoMock, NSubstitute и проч. Синтаксис их будет немного отличаться, однако суть работы с моками всегда одна:
Создаем мок-объект. Устанавливаем, что должен возвращать нужный нам метод мок-объекта при вызове с такими-то параметрами. Проверяем, что нужный нам метод был вызван (опционально).
Например, с использованием NSubstite это будет выглядеть так:
var personId = 1;
var repo = Substitute.For(); // для id = 1 возвращаем объект repo.Find(personId).Returns(new Person { Name = "John", LastName = "Doe" }); // для всех остальных id возвращаем null repo.Find(Arg.Is(a => a != 1)).Returns(null);
var someObjectThatUsesRepo = new SomeObjectThatUsesRepo(repo); someObjectThatUsesRepo.SomeMethod();
// проверяем, что метод вызвался ровно один раз repo.Received(1).Find(personId);

Обработчик проваленного теста

Производится юнит-тестирование usb-устройства (CDC). Тест открывает устройство, формирует запрос, отправляет его устройству, проверяет ответ, закрывает устройство. В случае, если тест провален, закрытие устройства не выполнится, и, следовательно, все последующие тесты также будут провалены, так как не смогут открыть устройство. В связи с этим вопрос: есть ли способ установить обработчик (handler, hook) проваленного теста, который бы выполнял освобождение ресурсов, запрошенных тестирующей функцией?
Тесты создаются в Visual Studio, тип проекта c++ unit test.


Ответ

Ваши ответы подсказали мне, в какой области искать верный ответ. В Visual Studio в Native Unit test методы до и после тестирования объявляются следующим образом:
TEST_METHOD_INITIALIZE(methodName) { // method initialization code }
TEST_METHOD_CLEANUP(methodName) { // test method cleanup code }
Внутри этих методов можно генерировать исключения и вызывать функции из статического класса Assert.
Больше информации здесь: MSDN

TSQL, “простой некластеризованный индекс”

Есть несколько индексов такого вида:
CREATE INDEX IX_ProductVendor_VendorID ON Purchasing.ProductVendor (VendorID);
На MSDN здесь (в разделе "примеры", первый пример) сказано, что это "простой некластеризованный индекс". Что это значит? Обычный первичный ключ? Может быть, глупый вопрос, но для меня не очевидно, хотелось бы быть уверенным.


Ответ

На Хабре есть аааааабалденная статья на тему индексов. Очень советую.
Если вкратце, то:
Индекс использует дерево для быстрого обращения к данным. У кластеризованного индекса в листьях дерева лежат сами строки данных. В силу природы дерева данные хранятся в уже отсортированном виде, поэтому кластеризованный индекс может быть только один. У некластеризованного индекса в листьях дерева лежат указатели на строки данных, т.е. для чтения данных необходима еще одна операция. Т.о. кластеризованных индексов у таблицы может быть несколько.
Что это значит? Обычный первичный ключ?
Понятие первичного ключа в общем-то не связано с индексом. В таблице может быть колонка, являющаяся первичным ключом, но без индекса. Однако на первичные ключи как правило создают кластеризованный индекс. В вашем вопросе VendorID это скорее просто foreign key -- на них обычно создают некластеризованные индексы.

Как правильно использовать реляции в Yii2?

Интересует как правильно использовать реляции, создавать индексы в таблицах, внешние ключи и как все это потом использовать через hasOne() и hasMany(). Буду предельно конкретен и распишу вопрос максимально широко (мало ли кому потом пригодится). Попрошу ответить как можно конкретнее используя вот такой типичный пример. Допустим у нас есть две таблицы:
Таблица users с полями id (pk int 11), name (varchar 255) Таблица posts с полями id (pk), title (varchar 255), user_id (int 11)
Мы хотим иметь возможность используя модель пользователей получить все записи пользователя, а используя модель постов получить автора поста. Соответственно делаем индекс для поля user_id, добавляем внешний ключ от этого поля к полю id таблицы users. Таким образом мы сможем получить автора поста через hasOne(), но можем ли мы не добавляя еще один внешний ключ получить через hasMany() все посты определенного автора?
Будет здорово, если кто-нибудь объяснит зачем нужно индексировать связующее поле перед добавлением к нему внешнего ключа.
Привожу пример кода как я все это пытаюсь делать.
$this->createIndex('user_id_index', 'posts', 'user_id');
тут я добавляю индекс для поля users_id и называю его user_id_index (кстати очень интересно зачем назвать индексы, как это делать правильно и где потом это имя использовать)
$this->addForeignKey('FK_posts_user_id', 'posts', 'user_id', 'users', 'id');
Тут я добавляю внешний ключ для таблицы posts для поля user_id, которое будет ссылаться на поле id таблицы users и называться FK_posts_user_id. Кстати буду очень признателен если меня поправят, если я что-то делается не так, как я описываю.
По итогу мы получаем внешний ключ и можем получить пользователя из модели с постами через вот такой геттер
public function getUsers() { $this->hasOne(Users::className(), ['id'=> 'user_id']); }
Соответственно чтобы получить все посты пользователя я модели пользователей делаю такого плана геттер:
public function getPosts() { $this->hasMany(Posts::className(), ['user_id', 'id']); }
Теперь подытожим вопросы:
Правильно ли я делаю? Правильный ли ход мысли? Нужно ли еще добавлять внешний ключ для таблицы пользователей (id,который ссылается на поле user_id в таблице posts)? Для чего нужно называть индексы и где потом эти названия используются? Где используются названия внешних ключей и для чего они нужны?
Буду очень благодарен за разъяснения и советы.


Ответ

Спустя некоторое время копания кода, доков и различных эксперементов с моделями и внешними ключами могу сделать заключение и ответить на свой собственный вопрос. Возможно это кому-нибудь пригодится.
В представленном мною коде есть ошибка. haseOne() и hasMany() должны возвращать результат выполнения их же. Так что проверяйте есть ли return в вашем методе. В базе данных однозначно достаточно только одного внешнего ключа (в моем примере таблица posts) и одного индекса (для связующего поля, в моем примере поле user_id таблицы posts). Все это можно реализовать через миграции, что вполне удобно. В коде модели, как я уже писал, достаточно написать метод haseOne() для модели с постами (в контроллере например можно будет юзать такую конструкцию чтобы получить данные об авторе поста $model->user; Соответственно ваш метод в модели должен назваться getUser() ) Для получения всех постов автора делаем тоже самое, но с моделью юзеров и описываем метод getPost() (назвать можете как хотите, только не забудьте про get в начале), внутри него возвращаем hasMany(). Точно так же можно получить все посты пользователя если заюзать $model->post;
p.s. Если у кого-то не выходит создать внешний ключ и валится ошибка вида Cannot add foreign key constraint - проверьте чтобы данные первичного ключа (id) и связующего поля (user_id) были идентичны. Если у юзера в поле id стоит NOTNULL - то и у связующего поля тоже он должен стоять, так же должен быть выбран одинаковый тип данный у полей (например и там и там INT(11).
Для моего примера приведу рабочий код для миграции, который вам создаст индекс и внешний ключ, необходимый для работы. Чуть поменяете под себя (измените названия полей и таблицы исходя из моего примера в вопросе и вуаля!)
$this->createIndex('user_id_index', 'posts', 'user_id'); $this->addForeignKey('FK_posts_user_id', 'posts', 'user_id', 'users', 'id', CASCADE', 'CASCADE');

C# полноэкранное приложение со своим разрешением

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


Ответ

По честному только через DirectX, но стоит учесть что он не любит внутри себя виндовые формочки.

Как сохранить веб-страницу в формат mht программно?

Решил заранее подготовить все ссылки страниц, а после сохранять их в формате .mht Например, в .txt файле находятся все ссылки (каждая с новой строчки). Программа должна читать оттуда ссылки и сохранять в формате .mht на жесткий диск.
Можно ли это реализовать программно и какую технологию лучше использовать?
Зачем мне это нужно?
Есть один интернет-магазин. С него мне нужно скачать все изображения товаров. Пытался использовать jQuery через расширения Google Chrome. Пытался писать приложение на C#. Но, почему-то, загружаются не все картинки каталога. Вот, например эта страница: www.onlinetrade.ru/catalogue/smartfoni-c13 Здесь показано 50 товаров. Ищу все конструкции "img". Скачиваю. В итоге, загружаются только первые 7 картинок товаров. В итоге, решил загрузить таким способом, описанным выше.


Ответ

Точно ли сохраняет первые 7, а не 10 фото? Там на странице фильтр 10, 20, 50. Возможно ваш парсер просто не умеет наверное нажимать на цифру 50, для фильтра. А если 7, то возможно просто получалось что берет первую картинку и идет на следующую страницу. Там берет тоже первую и т.д. Соответственно, возможно вы просто чего-то не учли.
Почему я так думаю? Потому, что урл спокойно себе парсится. Картинки (и не только) достаются без проблем.
Вот пример с использованием php и Simple HTML DOM Parser (для использования Simple HTML DOM Parser конечно же надо его скачать...ресурс)
// Добавлять сообщения обо всех ошибках, кроме E_WARNING error_reporting(E_ALL & ~E_WARNING); include './domParser/simple_html_dom.php';
class DomParser { public $url = ''; public $imgHost = ''; public $returnVal = 0;
public function __construct($urlParse, $imgHostUrl) { $this->url = $urlParse; $this->imgHost = $imgHostUrl; }
public function getImages($_data) { $i = 1; $data = $_data ? $_data : file_get_html($this->url);
if ($data->innertext != '') { foreach ($data->find('div.catalog__displayedItem') as $a) { foreach ($a->find('.catalog__displayedItem__columnFoto img') as $img) { echo '';
$imgExt = explode('.', $img->src);
// Это для добавления картинки себе в папку // Закоментировал в фиддле if ($image = file_get_contents($this->imgHost . $img->src)) { //file_put_contents('./images/' . $i . '.' . end($imgExt), $image); } }
$i++; }
echo '

';
$this->getNextPage($data, 'getImages'); $data->clear(); unset($data); } }
public function getNextPage($data, $repeatFunctionName) { // сделал пока чтобы много циклов не делал не нагружал if ($this->returnVal >= 2) return;
if ($data->innertext != '') { $this->returnVal++;
foreach ($data->find('.catalogItemList__paginator a') as $a) { $str = iconv("windows-1251", "UTF-8", $a->title);
if (mb_strpos(strtolower($str), 'ледующие', 0, 'UTF-8') !== false) { $page = explode('?', $a->href); $data_inner_link = file_get_html($this->url . '?' . end($page)); $this->$repeatFunctionName($data_inner_link); break; } } } } }
$url = 'http://www.onlinetrade.ru/catalogue/smartfoni-c13/'; $imgHost = 'http://www.onlinetrade.ru'; $parser = new DomParser($url, $imgHost); $parser->getImages(null);
/* $url = 'http://www.onlinetrade.ru/catalogue/smartfoni-c13/'; $imgHost = 'http://www.onlinetrade.ru'; $data = file_get_html($url); $i = 1;
function getImages($data) { global $imgHost; global $i;
if ($data->innertext!='') { foreach($data->find('div.catalog__displayedItem') as $a) { foreach ($a->find('.catalog__displayedItem__columnFoto img') as $img) { echo ''; $imgExt = explode('.', $img->src);
// Это для добавления картинки себе в папку // Закоментировал в фиддле if ($image = file_get_contents($imgHost . $img->src)) { file_put_contents('./images/' . $i . '.' . end($imgExt), $image); } }
$i++; }
echo '

';
getNextPage($data); $data->clear(); unset($data); } }
$return = 0; function getNextPage($data) { global $url; global $return;
// сделал пока чтобы много циклов не делал не нагружал if ($return >= 2) return;
if($data->innertext != ''){ $return++;
foreach($data->find('.catalogItemList__paginator a') as $a){ $str = iconv("windows-1251", "UTF-8", $a->title);
if (mb_strpos(strtolower($str), 'ледующие', 0, 'UTF-8') !== false) { $page = explode('?', $a->href); $data_inner_link = file_get_html($url . '?' . end($page)); getImages($data_inner_link); break; } } } }
//getImages($data);
*/
Вариант использования класса и вариант обычный через функции (закоментированы ниже)
Потрогать можно Здесь
На данный момент специально установлено ограничение на парсинг только первых 3-х страниц (по 10 товаров), чтобы не грузить фиддл и закоменчена строка с file_put_contents потому что фиддл не пропускает, что логично)))
вот пруф сохранения: И там еще много внизу...
Как вариант можно и наверное лучше использовать (касаемо php) cURL
cURL - свободная служебная программа командной строки, позволяющая взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.

Этот код просто скорее в целях показать, что всё работает, можно скачать и что у вас, скорее всего, где-то в коде ошибка.
Не является, скорее всего, мой ответ ответом, но, возможно, этот код будет чем-то полезен и захотите как-то переделать под нужды. Нежели сохранять mht. Хотя памяти он будет кушать много.

Как запретить использовать приложение без интернета?

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


Ответ

Можно по разному:
Проверять на входе в приложение наличие интернета, т.е. при запуске главного Activity. И не стартовать к-л задачи до успешной проверки. Сделать активити-проверщик интернета. Запускать на нынешнюю главную а эту. Если интернет есть, то запускать нынешнюю главную. Иначе - выходить из приложения. Обернуть все нынешние запросы в сеть в класс, проверяющий перед запуском задачи наличие инета. Если он есть - продолжаем, иначе - закрываем приложение.
Проверить же наличие соединения с сетью (не факт, что там есть сам интернет) можно, согласно en-SO, так
public boolean isOnline() { ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo netInfo = cm.getActiveNetworkInfo(); return netInfo != null && netInfo.isConnectedOrConnecting(); }
Также надо добавить спец. разрешение в AndroidManifest.xml

Ещё момент: если надо проверять именно факт подключённости с интернету (а не подключено-или-подключается) то использовать надо netInfo.isConnected() вместо netInfo.isConnectedOrConnecting()

Проверить же есть ли интернет как таковой можно вот так
public boolean isInternetAvailable() { try { InetAddress ipAddr = InetAddress.getByName("google.com"); //можно заменить на к-л другой сайт
if (ipAddr.equals("")) { return false; } else { return true; }
} catch (Exception e) { return false; }
}

И не забываем про все нужные разрешения в манифесте:

Несколько параллельных потоков

Есть класс для обработки пула задач.
public class PoolManager { List>> _listFunc { get; set; } List _listName { get; set; } public bool Active { get; set; } = false; public PoolManager() { _listFunc = new List>>(); _listName = new List(); }
public async Task StartPool() { if (!Active) { Active = true; while (Active) { if (_listFunc.Count != 0) { await Task.Run(async () => { var fun = _listFunc[0]; RemoveById(0); await fun();
}); } } } return ""; }
public void Add(Func> func,string name) { _listFunc.Add(new Func> (func)); _listName.Add(name); }
public void Stop() { Active = false; } }
Всё работает, но есть необходимость запускать несколько паралельных таких пулов. запускаю я его так:
if (!VP[0].Active) { await Task.Run(async () => { await VP[0].StartPool(); }); } else VP[0].Stop();
Но таким образом я могу запустить только 1 такой поток. Как можно реализовать одновременный запуск нескольких таких потоков с возможностью в последствии обращаться к ним? И соответственно без блокировки главного потока.


Ответ

Создавать список Task'ов не нужно. Просто надо указать AttachedToParent
Task.Factory.StartNew(() => { for(var i=0; i < 10; i++) Task.Factory.StartNew(() => { /*... */}, TaskCreationOptions.AttachedToParent); }).Wait();
Внешний Task дождется завершение всех Task'ов, запущенных в цикле. Если в основном потоке не надо ждать завершения внешнего Task, то Wait не надо указывать. Но при этом этот Task будет ждать завершение работы остальных, запущенных с AttachedToParent.
Если требуется передавать данные, то надо использовать классы, например, из System.Collections.Concurrent. Пример - тут

WP8.1 не работает кодировка windows-1251

Необходимо из массива байт перевести текст в кодировке windows-1251 в строку. Для этого я использую встроенное средство:
Encoding encoding = Encoding.GetEncoding("windows-1251");
Однако этот код выдаёт исключение:
'windows-1251' is not a supported encoding name. Parameter name: name
Никак не могу понять, что здесь не так, в интернете и даже на англоязычном stackoverflow именно так вопрос с кодировкой и решают.


Ответ

С помощью сторонней библиотеки https://github.com/jstedfast/Portable.Text.Encoding легко получилось декодировать из кодировки windows-1251. Пример кода:
var bytes = await response.Content.ReadAsByteArrayAsync(); Encoding encoding = Portable.Text.Encoding.GetEncoding(1251); var text = encoding.GetString(bytes, 0, bytes.Length);

Обращение к определенному в XAML словарю ресурсов из застраничного кода

У меня есть словарь ресурсов,определенный в XAML-разметке,например так:
some text text
Как обратиться к такому словарю из застраничного кода на C#(например,добавить несколько элементов)?


Ответ

Все, уже разобрался. Необходимо создать Uri, который будет указывать на нужный словарь и присвоить его свойству Sourse нового словаря ресурсов:
Uri uri = new Uri(@"sample.xaml"); ResourceDictionary dict = new ResourceDictionary(); dict.Source = uri;`

Как сохранить НЕ дефолтные данные в Settings.settings

Как сохранить не дефолтные данные в файле Settings.settings?.Пробовал так
private void SettingsSavingEventHandler(object sender, System.ComponentModel.CancelEventArgs e) { // Добавьте здесь код для обработки события SettingsSaving. marker = WpfApplication16.MainWindow.getMarker(); delay = WpfApplication16.MainWindow.getDelay(); senderEmail = WpfApplication16.MainWindow.getCredentials()[0]; recipientEmail = WpfApplication16.MainWindow.getCredentials()[1]; subject = WpfApplication16.MainWindow.getCredentials()[2]; text = WpfApplication16.MainWindow.getCredentials()[3]; password = WpfApplication16.MainWindow.getCredentials()[4]; }
,но при последующих запусках значения остаются дефолтными.При вызове Properties.Settings.Default.Save() значения все равно затираются при перезапуске приложения.


Ответ

Получите доступ к параметру и присвойте ему новое значение:
Properties.Settings.Default.myColor = Color.AliceBlue;
Если необходимо сохранять изменения параметров между сеансами приложения, вызовите метод Save, как показано ниже.
Properties.Settings.Default.Save();
Официальное руководство тут

Удаление определенного количества байт с конца файла shell скрипт

Добрый день. Собственно вопрос. Как средствами shell удалить с конца файла N - о количество символов. Есть зашифрованный gpg файл. В конец его дописываем контрольную сумму. А затем ее нужно считать и удалить. Как?
пробовал средствами sed но так и не дошел до рабочего варианта


Ответ

Пусть в переменных n - длина контрольной суммы, file - имя файла.
truncate -s $(( $(stat -c '%s' $file) - $n )) $file

Удаление n символов из начала файла зашифрованого gpg используя Shell

Стоит задача удаления n числа символов из начала файла используя shell. Файл зашифрован gpg. Файл нельзя перезаписывать в другой файл.


Ответ

dd if=$file of=$file skip=$n iflag=skip_bytes conv=notrunc
Далее см. Удаление определенного количества байт с конца файла shell скрипт

Как в Javascript узнать полную высоту страницы document.documentElement?

Не высоту окна браузера, не видимую часть экрана, а именно полную высоту страницы от самого верха до низа.


Ответ

https://stackoverflow.com/a/1147768/873481
var body = document.body, html = document.documentElement;
var height = Math.max( body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight );

Передача логов по сети

Есть ли готовая реализация для передачи логов из java веб приложения по сети на другой сервер? Или это делается как обычная передача файлов через сокет? В смысле, может быть есть уже какая-то готовая библиотека для этого?


Ответ

Зависит от того, чем вы пользуетесь для логирования.
Для Logback, например, существуют SocketAppender и SSLSocketAppender для отправки событий по сети, SyslogAppender для отправки на Syslog-сервер.
Сервер для логирования через SocketAppender настраивается обычными средствами (XML) и запускается просто из командной строки:
java ch.qos.logback.classic.net.SimpleSocketServer 6000 \ src/main/java/chapters/appenders/socket/server1.xml В Log4j 2 реализованы JMSAppender / KafkaAppender / ZeroMQ Appender для прокачки логов через очереди и аналогичные упомянутым выше SocketAppender и SyslogAppender.

Сохранение данных в CSV файл

после сохранения в файл при открытии с excel кодировка бывает не понятной(только если текст на русском), а через notepad++ все читабельно, в чем проблема подскажите пожалуйста
String filename = "mytest.csv"; String entry = "Задача" +";"+"первая"; try { FileOutputStream out = openFileOutput(filename, Context.MODE_APPEND); out.write(entry.getBytes()); out.close();
} catch (Exception e) { e.printStackTrace(); }
и если не сложно подскажите что почитать для создания csv файла в android


Ответ

Попробуйте или в файл сохранять в нужной кодировке:
// Строка Unicode String string = "..."; // Записываем строку в текстовый файл в кодировке Cp866 PrintWriter pw = new PrintWriter // класс с методами записи строк (new OutputStreamWriter // класс-преобразователь (new FileOutputStream // класс записи байтов в файл ("file.txt"), "Cp866"); pw.println(string); // записываем строку в файл pw.close();
или, например, строку сразу записывать в нужной кодировке
// Строка Unicode String string = "..."; // Записываем строку в текстовый файл в двух кодировках (Cp866 и Cp1251) OutputStream os = new FileOutputStream("file.txt"); // класс записи байтов в файл // Записываем строку в кодировке Cp866 os.write( string.getBytes("Cp866") ); // Записываем строку в кодировке Cp1251 os.write( string.getBytes("Cp1251") ); os.close();
Если файл у вас уже существует, можно сделать проверку в самом начале и удалить его:
File f = new File("1.txt"); if (f.exists()) f.delete();

Rails - yml файл для всех языков

Я переводил свое Rails-приложение и столкнулся со следуюшей проблемой. Не все элементы надо переводить. Например, в en.yml у меня хранятся не только фразы, но и ссылки. Переводить их не имеет смысла, но если их не включасть, например, в ru.yml, то будет ошибка translation_missing.
@MichaelRadionov посоветовал использовать наследование.
Соответственно, вопрос: Как использовать наследование в YML файлах


Ответ

Использовать наследование не нужно. Эта функция уже включена в гем rails-i18n. Для того что-бы все работало, нужно отредактировать файл application.rb
# Автозагрузка всех языковых файлов config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
# Дефолтовый язык config.i18n.default_locale = :ru
# Возврат к английскому при ошибках config.i18n.fallbacks = [:en]
# Так же можно указывать какой язык использовать при ошибках config.i18n.fallbacks = {'ru' => 'en'}

Как реализовать ограниченный лог?

Нужно сделать лог определенного размера в который можно бесконечно добавлять записи в виде строк но при этом когда некуда будет записывать новые записи старые будут затираться, мне тяжело сформулировать мысль, покажу на примере кода:
MyLog log = new Mylog(1024); // создание лога размером в 1024 записи log.add("запись в логе #1"); // добавляем запись log.add("запись в логе #2"); // ещё добавляем запись ... log.add("запись в логе #1025); // запись #1 затирается все строки сдвигаются и запись #1025 становится в конец String[] arr = log.toArray(); // Возвращает массив из 1024 строк
Как такое оптимальнее всего сделать?
Возможно есть какое-то название для этого "лога", разновидность стека какая нибудь там?
Сложность вставки в худшей случае будет O(n) или еще больше?
И да, возможно есть это в стандартной библиотеке?


Ответ

Думаю можно сделать таким образом:
MyLog log = new Mylog(1024); - создается массив из 1024 элемента Курсор при создании = 0
this.cursor = 0; this.perepolneniye = FASLE; функция Add() добавляет запись и передвигает курсор
public void add(String logData){ this.cursor ++; if (this.cursor > MAX_SIZE) { this.cursor = 0; this.perepolneniye = TRUE; } logArray[this.cursor] = logData; } Теперь когда нужно все это собрать и распечатать, нужно с начало собрать из cursor + 1 до конца и потом из начало до cursor'а. Но если не было переполнения, тогда только с начало до cursor'а.
public void outResult(){ String result = ""; if (this.perepolneniye) { // Собираем от this.cursor+1 до MAX_SIZE } // Собираем от 0 до this.cursor return result; }

Локализация php

Делал локализацию, получилось все очень громоздко.
Как это исправить?
if(isset($_GET['lang'])) {
if ($_GET['lang'] === "ru") $lang = "ru";
elseif ($_GET['lang'] === "ua") $lang = "ua";
else $lang = "en";
setcookie("lang", $lang, time()+30758400, "/");
} else { if (empty($_COOKIE['lang'])) {
$b_lang = substr($_SERVER["HTTP_ACCEPT_LANGUAGE"], 0, 2);
if ($b_lang == "ru") $lang = "ru";
elseif ($b_lang == "uk") $lang = "ua";
else $lang = "en";
}
else {
if ($_COOKIE['lang'] === "ru") $lang = "ru";
elseif ($_COOKIE['lang'] === "ua") $lang = "ua";
else $lang = "en";
} }
if ($lang === "ru") include("lang/ru.php");
elseif ($lang === "ua") include("lang/ua.php");
else include("lang/en.php");


Ответ

$allowedLang=array("ru","ua","en"); $needCookie=false; if(isset($_GET['lang'])) { $lang=$_GET['lang']; $needCookie=true; } elseif(empty($_COOKIE['lang'])) $lang=substr($_SERVER["HTTP_ACCEPT_LANGUAGE"], 0, 2); else $lang=$_COOKIE['lang'];
if(in_array($lang,$allowedLang)) $lang='en';
if($needCookie) setcookie("lang", $lang, time()+30758400, "/"); include("lang/$lang.php");
Ну и совсем хардкорный:

Yii2 CacheSession создает сессию в $_SESSION и в кеше одновременно

Случайно заметил такой нюанс при использования хранилища сессий в кеше ( в моем случае memcached ) Yii2 создает одновременно ее же и в массиве $_SESSION, хотя по логике не должен его использовать если в настройках указывается другое хранилище
Конфиг: ( пример - http://www.yiiframework.com/doc-2.0/yii-web-cachesession.html )
'cache' => [ 'class' => 'yii\caching\MemCache', 'useMemcached' => TRUE, 'servers' => [ [ 'host' => '******/.system/memcache/socket', 'port' => 11211, 'weight' => 64, ],
] ], 'session' => [ 'class' => 'yii\web\CacheSession', // 'cache' => 'cache', ],
Создание сессии:
$session = Yii::$app->session; $userDataStorage = [ 'id' => $this->id, 'name' => $this->name, 'settings' => json_decode($this->settings), ]; $session->set('user_data' , $userDataStorage);
Проверяем:
echo 'Yii session -> '; var_dump(Yii::$app->session->get('user_data') ); echo '-------------
'; echo 'Php session -> '; var_dump($_SESSION); echo '-------------
'; var_dump(ini_get('session.save_path'));
Видим:
Yii session -> array(4) { ["id"]=> int(1) ["name"]=> string(5) "admin" ["settings"]=> NULL } ------------- Php session -> array(3) { ["__flash"]=> array(0) { } ["__id"]=> int(1) ["user_data"]=> array(4) { ["id"]=> int(1) ["name"]=> string(5) "admin" ["settings"]=> NULL } }
------------- string(24) "****/.system/tmp"
Собственно это баг или... ? В чем тогда смысль настройки хранения сессий в кеше если он дублируется со стандартным ? Или я что-то делаю не так?
СОРРИ не доглядел. https://github.com/yiisoft/yii2/blob/master/framework/web/Session.php методом registerSessionHandler() устанавливает session_set_save_handler а класс "CacheSession" реализует методы которые будут хранить сессию в кеше определенном в настройках, т.о. $_SESSION хранится уже не в файле папки tmp (как по умолчанию) а в memcached. Вопрос закрыт.


Ответ

Возможно будет кому-то полезно, тогда начну сначала. Как настроить кеширование Yii2 для работы с memcache или memcached ( в чем отличия я думаю тут описывать нет смысла, в нете масса инфы по этому поводу ), постараюсь кратко изложить саму суть. Итак, для начала заходим в файл конфигурации проэкта и добавляем настройки кеширования и подключения к серверу
'components' => [
...
'cache' => [ 'class' => 'yii\caching\MemCache', 'useMemcached' => TRUE, 'servers' => [ [ 'host' => 'localhost', 'port' => 11211, 'weight' => 64, ],
] ],
... ]
Параметр 'useMemcached' ( класс MemCache расположен в директории yii2/caching/MemCache.php ( наследуется от компонента Cache /yii2/caching/Cache.php ) и по умолчанию FALSE, т.е. юзает memcache ) указывает на то что будет использоватся memcache или memcached, для использования memcached ставим в конфиге 'useMemcached' => TRUE Далее если все верно настроено прописано можем юзать кеш
\Yii::$app->cache->set('key', 'value'); \Yii::$app->cache->get('key');
//или можем кешировать запросы в БД
$db = Yii::$app->db; $result = $db->cache(function ($db) { return $db->createCommand('SELECT * FROM tablename LIMIT 0,1000')->queryAll(); }); // и т.д. ****
Подробнее в доке http://www.yiiframework.com/doc-2.0/guide-caching-data.html
Тут сразу нужно оговорится если вы захотите проверить работу Yii2 memcached напрямую, т.е.
в Yii2
\Yii::$app->cache->set('mykey', 'value');
в произвольном файле
$m = new Memcached(); $m->addServer('localhost', 11211); var_dump($m->get('mykey'));
У вас ничего не получится т.к. компонент Cache Yii ( /yii2/caching/Cache.php ) методом buildKey так сказать "нормализует" ключи ( описание метода есть в классе ), но можно для теста сделать так
в Yii2
$cache = Yii::$app->cache; $keyStr = 'cache_test'; $key = $cache->buildKey($keyStr); $cache->set($keyStr, 'This is mem test!'); $get = $cache->get($keyStr); var_dump($get , $key); // дампим результат из кеша и сгенерированный ключ ( копируем его )
в произвольном файле
$m = new Memcached(); $m->addServer('localhost', 11211); $result = $m->get('242c9254b0a4b5ea5c7f0e000f668408'); // Вставляем полученый ключ
var_dump(unserialize($result));
Далее собственно ближе к сути, мы хотим хранить сесии в нашем мемкеше, для этого идем обратно в конфиг и добавляем после настроек кеша следующее
'session' => [ 'class' => 'yii\web\CacheSession', //'cache' => 'cache', ],
Теперь для работы с сессией будет заюзан класс CacheSession ( /yii2/web/CacheSession.php наследуется от Session /yii2/web/Session.php ) и можно создать нашу сессию
\Yii::$app->session->set('Mysession', 'Mem session');
И собственно тут у меня возник некий конфуз, ибо
\Yii::$app->session->get('Mysession'); // Вернет нам значение сессии $_SESSION // К моему удивлению так же содержал в себе эту сессию
Но на самом деле ничего страшного здесь нет, $_SESSION уже не хранится на сервере в папке tmp как по умолчанию, теперь $_SESSION хранится в мемкешед.
Все дело в том что класс CacheSession переопределяет некоторые методы класса Session ( в подробности работы вдаватся не буду, можно впринципе пройтись по этим файлам и посмотреть ) в т.ч. getUseCustomStorage(), так же класс Session имеет метод registerSessionHandler() который вызывается при откритии сессии, метод open(), в Session и вызывает в этом случаи getUseCustomStorage() который был переопределен, собственно после этого и происходит магия переноса $_SESSION в мемкешед, функция session_set_save_handler() ( http://php.net/manual/ru/function.session-set-save-handler.php ) переопределит методы работы с сессией на пользовательские.
После этого если мы сделаем так $_SESSION['mysession'] = 'value' ( так же как и в методе Session set() ), после открытия сесиии медодом Session open(), сессия будет хранится в нашем кеше.
Надеюсь мои изысканя будут кому-то полезными

Что делать, если удалил файл, принадлежащий пакету?

Ненароком удалил файл /usr/bin/env, и теперь даже команда vagrant up выдает ошибку:
bash: /usr/bin/vagrant: /usr/bin/env: плохой интерпретатор: Нет такого файла или каталога
Как его вернуть?


Ответ

узнать, какому пакету принадлежит файл, можно так (приведён и типичный ответ):
$ dpkg -S /путь/к/файлу название-пакета: /путь/к/файлу
переустановить пакет можно так:
$ sudo apt-get install --reinstall название-пакета

Big data, оптимизация запросов

Есть следующая простая структура данных
Id; fk_Security_Id; DateTime; Price
Строка хранит данные по инструменту(активу), дату и время, цену(котировку). Строк в БД на данный момент ~ 1 млрд. 200 млн. (10 инструментов с историей за прошлые 10 лет)
Задача - выборка данных по указанному fk_Security_Id и промежутку DateTime(например, июль 2000г.) за адекватный промежуток времени (в идеале меньше минуты).
Сначала, я использовал знакомый мне MSSQL и навесил в лоб clustered index на эти 2 поля. В результате поиск по этим 2 полям занимает в районе 35 минут и сожранные 6.5Gb RAM. Не совсем то, что конечно хотелось бы. Какие варианты решения вижу пока я:
Не менять выбранную бд, а изменить саму структуру хранения данных. Например разнести в разные таблицы данные по разным инструментам. В этом случае конечно будут абсолютно идентичные таблицы с точки зрения структуры, но можно будет выиграть некоторое время на поиске и дальнейшее добавление новых инструментов не будет влиять на то самое время поиска. И тогда вместо композитного кластерного индекса, индекс будет состоять из одного поля - datetime. Также возможно здесь имеет смысл вместо поля datetime в качестве индекса брать некий timestamp или преобразованный Id. Но не уверен что это даст существенный прирост в поиске, хотя стоит попробовать думаю. Использовать какую-нибудь более легковесную бд, например postgres (дружит с необходимым мне EF, что очень хотелось бы) + есть нативная поддержка Sphinx-а например. Использовать какое-нибудь NoSql решение. С данными бд дел не имел, но допускаю,что в моем случае данные укладываются в простую структуру key-value. Правда, наверное те NoSql которые держат данные в RAM мне не подойдут потому что у меня просто столько памяти нету. Хотя, если я не ошибась есть и достаточно шустрые дисковые NoSql , Aerospike например. Но опять же поскольку я с ними не работал я не могу оценить насколько они дадут выигрыш по времени по сравнению с обыными реляционными бд.
База не распределенная, ресурсы машины - 8 потоков и 8Gb RAM. Буду рад любому совету.


Ответ

Пара мыслей (eсли вы всё же остановитесь на MSSQL).
На мой взгляд big-data подразумевает щепетильное отношение к структурам хранения данных и типам хранимых данных.
Сравните, к примеру, размеры различных типов данных для хранения дат и чисел:
declare @dt datetime = getdate(), @dt2 datetime2(0) = getdate(), @sdt smalldatetime = getdate(), @m money = 1.0, @f float = 1.0, @dec_15_5 decimal(15,5) = 1.0, @r real = 1.0
select [datetime] = datalength(@dt), [datetime2(0)] = datalength(@dt2), [smalldatetime] = datalength(@sdt), [money] = datalength(@m), [float] = datalength(@f), [decimal(15,5)] = datalength(@dec_15_5), [real] = datalength(@r)
datetime datetime2(0) smalldatetime money float decimal(15,5) real --------- ------------- -------------- ------ ------ -------------- ----- 8 6 4 8 8 5 4
Если тип столбца DateTime у вас datetime, рассмотрите возможность использования, например, типа smalldatetime (диапазон значений от 1900-01-01 до 2079-06-06 с точностью 1 минута). Если, тип стоблца Price, к примеру, float - рассмотрите возможность использования типов decimal (numeric) или real. Чем меньше размер строки данных, тем больше строк помещается в одну страницу памяти, соответственно легче оперировать ими в запросах. В таблицах с большим числом строк нелишним будет избегать NULL-able столбцов (это также сэкономит немного места). Правда следствием компактного хранения может быть некоторое неудобство в написании запросов, когда, например, при вычислении среднего для сохранения точности приходится делать кастинг в тип с большей точностью, а потом обратно. Да и сам кастинг несколько повысит стоимость запроса.
Ваша идея разнести инструменты по таблицам имеет рациональное зерно. Нужно ли их держать в одной таблице, и в самом ли деле нужен Id в таблице, если, к примеру, на неё нет ссылок - решать вам. Однако если разнести данные по таблицам вида
create table SomeInstrument ( DateTime smalldatetime not NULL primary key, Rate real not NULL )
то общий объём хранимых данных явно уменьшится, т.к. не будет столбцов Id и fk_Security_Id.
Если всё же оставите всё в одной таблице, то fk_Security_Id (вместе с primary key таблицы, на которую он ссылается) имеет смысл перевести на тип tinyint, раз уж инструментов всего около десятка.

Запуск и остановка служб в Linux Mint

Какими командами останавливаются/запускаются службы в Linux Mint?
P.S. Разобрался:
sudo /etc/init.d/name_service stop/start


Ответ

Бо́льшую часть служб можно запустить/перезапустить/остановить командой
service SERVICE_NAME start/restart/stop
Но некоторые такому управлению не поддаются и нужно использовать другие команды:
/etc/init.d/SERVICE_NAME start/restart/stop
Естественно, что это придётся выполнять с правами root

Запуск сервера Gunicorn в Django

В доках : $ gunicorn myproject.wsgi Не могу понять где в моем приложении объект *.wsgi и должен ли быть по дефолту?


Ответ

Да, он есть по дефолту.Он лежит в папке с названием проекта, где находится settings.py. Собственно в примере его и вызывают из этой папки, нужно заменить myproject на имя вашего проекта.
. └── test_for_stack ├── manage.py └── test_for_stack ├── __init__.py ├── settings.py ├── urls.py └── wsgi.py <-- Вот он

Как отключить отображение кнопки назад (DisplayHomeAsUpEnabled) в главном активити?

Есть активити и фрагмент в фрагменте стоит DisplayHomeAsUpEnabled. При переходе с активити в фрагмент кнопка назад появляется все хорошо, но при нажатии и перехода назад в активити стрелочка остается отображаеться? Как убрать?
Пробывал не помогло:
getSupportActionBar().setHomeButtonEnabled(false);
getSupportActionBar().setDisplayHomeAsUpEnabled(false);
getSupportActionBar().setHomeAsUpIndicator(null);
Код кнопки в фрагменте DisplayHomeAsUpEnabled
@Override public void onResume() { super.onResume(); ((ActionBarActivity)getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true); }
Код активити:
public class MainActivity extends ActionBarActivity implements ExpandableListView.OnChildClickListener, View.OnClickListener { private static FragmentManager mManager; Button button1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar);
button1 = (Button) findViewById(R.id.button1); mManager = getSupportFragmentManager();
getSupportActionBar().setIcon(R.drawable.ic_launcher);
getSupportActionBar().setDisplayHomeAsUpEnabled(false);
/* FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) .setAction("Action", null).show(); } });*/
// button1.setOnClickListener(this); button1.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View v) { Fragment fragment = null;
mManager.findFragmentById(R.id.fragmentContainer); if (fragment == null) { fragment = new sovety_Fragment(); mManager.beginTransaction() .add(R.id.fragmentContainer, fragment) .replace(R.id.fragmentContainer, fragment) .addToBackStack(null) .commit(); }
}
}); }

public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; }
@Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId();
//noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } if (id == android.R.id.home) { onBackPressed(); return true; }
return super.onOptionsItemSelected(item); }
@Override public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
return false; }
@Override public void onClick(View v) {
} }


Ответ

Вы вызываете код, убирающий стрелку до того, как её показываете.
Т.к. вы убираете фрагмент нажатием кнопки "назад" именно в слушателе её нажатия надо убирать стрелку.
Засим попробуйте добавить обработчик нажатия кнопки назад в активити и именно в нём убрать стрелку:
@Override onBackPressed() { getSupportActionBar().setDisplayHomeAsUpEnabled(false); super.onBackPressed(); }

Особенности возврата результата reverse из функции в Perl

Для предисловия делаем тестовый код, который переводит строку в верхний регистр, немного комбинируя способы вызова и возврата из функций:
#!/usr/bin/perl $str="Abc"; $s1=a($str); $s2=b(a($str)); $s3=c($str); $s4=b(c($str)); print "str=$str; a()=$s1; b(a())=$s2; c()=$s3; b(c())=$s4
";
sub b { return $_[0]; } sub a { my($tmp)=$_[0]; return uc($tmp); } sub c { my($tmp)=$_[0]; return $tmp=uc($tmp); }
Результат работы абсолютно предсказуемый:
str=abc; a()=ABC; b(a())=ABC; c()=ABC; b(c())=ABC
А теперь абсолютно то же самое сделаем, что бы развернуть строку задом наперед, используя функцию reverse вместо uc
#!/usr/bin/perl $str="Abc"; $s1=a($str); $s2=b(a($str)); $s3=c($str); $s4=b(c($str)); print "str=$str; a()=$s1; b(a())=$s2; c()=$s3; b(c())=$s4
";
sub b { return $_[0]; } sub a { my($tmp)=$_[0]; return reverse($tmp); } sub c { my($tmp)=$_[0]; return $tmp=reverse($tmp); }
И тут мы получаем абсолютно неожиданный результат:
str=Abc; a()=cbA; b(a())=Abc; c()=cbA; b(c())=cbA
При передаче результата работы функции a, как параметра, в функцию b (которая просто возвращает полученное значение) на выходе мы получаем не перевернутую строку. При этом, практически идентичная функция c ведет себя так, как и было задумано. Собственно вот это присваивание $tmp=reverse($tmp) при return я придумал, когда боролся с неожиданным поведением с возвратом после reverse. Когда первый раз увидел это, ставил печать в функцию b, у нее на входе именно такое значение как она и возвращает и которое собственно напечатано в результате.
UPD: Проверил print b(reverse($str)); возвращает Abc !!!
Добавлю, что такой результат на Perl v5.12.4, на других версиях не проверял.
Вопрос: почему при возврате значения которое вернула reverse в случае прямого его использования поведение ожидаемое, а при передаче этого значения как параметра в другую функцию результат такой, как будто никакого reverse не было выполнено ? Глюк это или фича ?


Ответ

Результат абсолютно ожидаемый и предсказуемый. Функция reverse работает по разному в скалярном и списочном контексте. В списочном контексте она разворачивает список, в скалярном - строку.
А теперь вопрос. Если у нас есть список с одной строки, то что вернет для него reverse? Естественно, саму строку.
При вызове b(a()) перл пытается понять контекст. Функция b возвращает просто свой первый аргумент, а получает на вход - список (она же функция, а аргументы у нее не были специфицированы). Поэтому, функция a должна возвращать список. Отсюда, return возвращает список. А это значит, что контест списочный. В списочном контексте аргумент считается списком и естественно строка стает списком с одним элементом.
В функции c подобного не происходит - там явно виден скалярный контекст.
P.S. код ужасен. Не пишите так. Как минимум используйте use strict; use warnings и my

Как отслеживать запуски GC и учитывать их при логировании из разных потоков?

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


Ответ

Для того чтобы отслеживать GC надо вызвать метод RegisterForFullGCNotification, а также WaitForFullGCApproach и WaitForFullGCComplete
using System.Diagnostics; using System.Collections.Concurrent; using System.Threading; using System.Runtime.CompilerServices;
class LogLine { public int Number; public int ThreadId; public long Ticks; public object Value; public long GCMemory; public int[] GCCollections; public LogLine(int num, object value, long ticks) { this.Number = num; this.Value = value; this.Ticks = ticks; this.ThreadId = Environment.CurrentManagedThreadId; this.GCMemory = GC.GetTotalMemory(false); int[] arr = new int[GC.MaxGeneration + 1]; for (var i = 0; i < arr.Length; i++) arr[i] = GC.CollectionCount(i); this.GCCollections = arr; } }

class Log : IDisposable { Stopwatch sw = Stopwatch.StartNew(); BlockingCollection lines = new BlockingCollection(); void Add(LogLine line) { if (!lines.IsAddingCompleted) lines.Add(line); } public Log() { GC.RegisterForFullGCNotification(1, 1); new Thread(() => { while (!lines.IsAddingCompleted) { Add(new LogLine(-1, GC.WaitForFullGCApproach(), sw.ElapsedTicks)); Add(new LogLine(-2, GC.WaitForFullGCComplete(), sw.ElapsedTicks)); } }).Start(); } public void WriteLine(object value = null, [CallerLineNumber] int cnumber = 0) { Add(new LogLine(cnumber, value, sw.ElapsedTicks)); } void IDisposable.Dispose() { GC.CancelFullGCNotification(); Add(new LogLine(-3, "Disposed", sw.ElapsedTicks)); lines.CompleteAdding(); } public IEnumerable ToCsv() { var s = ",\t "; yield return String.Concat( "Number", s, "Ticks", s, "ThreadId", s, "GCMemory", s, "GCCollections", s, "Value"); foreach (var l in lines) yield return String.Concat( l.Number, s, l.Ticks, s, l.ThreadId, s, l.GCMemory, s, String.Join(";", l.GCCollections), s, l.Value); } }

Для теста в двух потоках создаем и заполняем список массивов по 100 тыс. int
var log = new Log(); using (log) { Parallel.For(0, 2, i => { var lst = new List(); log.WriteLine("new List"); try { while (true) lst.Add(new int[100000]); } catch (OutOfMemoryException) { log.WriteLine("OutOfMemory; lst.Count=" + lst.Count); } }); }
Выводим собранные данные
foreach (var line in log.ToCsv()) Console.WriteLine(line);
Результат (получен в C# Interactive, Microsoft (R) Roslyn C# Compiler version 1.1.0.51204)
Number, Ticks, ThreadId, GCMemory, GCCollections, Value 55, 4030, 6, 6905852, 1;0;0, new List 55, 4426, 9, 6905852, 1;0;0, new List -1, 274370, 11, 1481676908, 6;5;5, Succeeded -2, 274430, 11, 1482877004, 6;5;5, Succeeded -1, 277392, 11, 1528080620, 6;5;5, Succeeded 58, 355462, 6, 1528087152, 8;7;7, OutOfMemory; lst.Count=1888 58, 355462, 9, 1528087152, 8;7;7, OutOfMemory; lst.Count=1920 -2, 317257, 11, 1528087152, 8;7;7, Succeeded -3, 356158, 6, 1528095344, 8;7;7, Disposed

Как в Android Studio подключить в один проект другой, независимый от текущего

В сети много информации об этом не хитром деле, но мне все же не понятен один момент.
Есть 2 android - приложения. Для этих двух приложений существует общая библиотека. Эта схема успешно работала в Eclipse.
Сейчас же, когда перешел на Android Studio, я пытаюсь повторить тот же фокус (разными способами), но у меня не получается.
Я хочу сделать ссылку на указанный библиотечный проект. Чтоб все изменения сразу отражались во всех приложениях, к которым эта библиотека подключена. А все что у меня получается это с сделать копию библиотечного проекта. В таком случае не о какой общности библиотеки речи не идет.
Как быть?


Ответ

Android Studio для сборки проекта использует систему сборки Gradle, поэтому решается данный вопрос через возможности именно данной системы сборки, а не непосредственно Android Studio
Для того, чтобы подключить в свой проект другой, независимый от текущего, проект (например, разрабатываемую вами же библиотеку) в Android Studio, необходимо в файле settings.gradle текущего проекта добавить ссылку на другой проект:
include ':myLibrary' project(':myLibrary').projectDir = new File('../MyProjects/myLibrary')
Здесь мы подключаем к текущему проекту проект myLibrary.
../MyProjects/myLibrary - путь до подключаемого проекта.
Ссылка на подключенный проект появится в дереве файлов Android Studio, при редактировании вы будете вносить изменения непосредственно в сам проект, а не его копию в текущем проекте.
Теперь при сборке вашего текущего проекта в него будет включен и подключенный проект, при этом данный проект не будет импортирован в текущий и вы можете вносить изменения в тот подключенный проект, тогда они будут учитываться при следующей сборке во всех проектах, в которых он подключен таким образом.
Пост на EnSO с картинками

Снятие фокуса с кнопки

Как снять фокус с кнопки при нажатии на пустую область формы(область формы, где нет ни одного виджета)?


Ответ

В обработчике нажатия на форму напишите setFocus();, или, если это QMainWindow наследник, тогда centralWidget()->setFocus();. Таким образом фокус перейдёт с кнопки на виджет. Например, это можно сделать так:
void MainWindow::mousePressEvent(QMouseEvent *) { centralWidget()->setFocus(); }
Т.е. Вы переопределяете виртуальную функцию mousePressEvent в Вашем QMainWindow

Как найти пересечение двух фигур?

В Grid есть несколько фигур (производные Shape). Как получить пересечение двух фигур?


Ответ

Пересечение фигур можно получить с помощью класса CombinedGeometry.
Ниже пример программы, в которой выводится пересечение разных фигур, включая линии. Пересечение вычисляется и выводится при движении мыши. Работает быстро. Для примера, между кадрами анимированного gif установлена задержка 500 миллисекунд.
// Microsoft (R) Roslyn C# Compiler version 1.1.0.51204 #r "PresentationFramework" #r "WindowsBase" using System.Windows.Shapes; using System.Windows; using System.Windows.Controls; using System.Windows.Media;

// находит пересечение двух фигур, включая линии/отрезки static CombinedGeometry RenderedIntersect(Visual ctx, Shape s1, Shape s2) { var p = new Pen(Brushes.Transparent, 0.01); var t1 = s1.TransformToAncestor(ctx) as Transform; var t2 = s2.TransformToAncestor(ctx) as Transform; var g1 = s1.RenderedGeometry; var g2 = s2.RenderedGeometry; if (s1 is Line) g1 = g1.GetWidenedPathGeometry(p); if (s2 is Line) g2 = g2.GetWidenedPathGeometry(p); g1.Transform = t1; g2.Transform = t2; return new CombinedGeometry(GeometryCombineMode.Intersect, g1, g2); }

// UI для демонстрации использования RenderedIntersect var grid = new Grid(); grid.Children.Add(new Line { X1=50, Y1=5, X2=140, Y2=140, Stroke=Brushes.Silver }); grid.Children.Add(new Line { X1=20, Y1=110, X2=270, Y2=50, Stroke=Brushes.Silver }); grid.Children.Add(new Ellipse { Stroke=Brushes.Silver, Width=120, Height=60 }); var g = Geometry.Parse("M200.86114,56.658088 L21.55462,90.649919 114.93742,121.69634 z"); grid.Children.Add(new Path { Stroke = Brushes.Silver, Data = g }); var wnd = new Window() { Width = 300, Height = 200, Content = grid };

// функция выбора двух фигур Shape p = null; var nextPair = new Func(() => { var shapes = grid.Children.OfType(); var arr = (from s1 in shapes from s2 in shapes where s1 != s2 select new[] { s1, s2 }).ToArray(); var rnd = new Random(); return arr[rnd.Next(0, arr.Length)]; });

// выводим пересечение фигур при движении мыши var m = 0; wnd.MouseMove += (s, e) => { if (p != null) grid.Children.Remove(p); var sa = nextPair(); var g = RenderedIntersect(grid, sa[0], sa[1]); p = new Path() { Stroke = Brushes.Red, StrokeThickness = 2, Data = g }; grid.Children.Add(p); }; wnd.ShowDialog();

Как сохранить html страницу при парсинге

Хочу сделать возможность сохранять нужную страницу с интернета в html, чтобы потом данные парсить офлайн именно с этой страницы, которую сохранил на устройстве. Пользуюсь библиотекой Jsoup. Помогите пожалуйста, как это можно осуществить.


Ответ

Всё просто.
Загружаете страницу. Получаете её в виде HTML кода методом getOutherHtml() класса Element, от коего наследуется, в т.ч. и класс Document. Т.е. вы можете сделать что-то типа
String html = Jsoup.connect("http://example.com/").get().getOutherHtml();
Теперь сохраняйте любым способом. В файл, БД, SharedPreferences, как угодно.

Как для TextView задать программно стиль?

Например:
TextView textView = new TextView(PhotoActivity.this); textView.setText("Photo not found.");
Тогда как задать стиль?
textView.set...???
Мне нужно было сделать цвет текста и позиционирование по центру программно, я решил задачку:
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(AbsListView.LayoutParams.WRAP_CONTENT, AbsListView.LayoutParams.FILL_PARENT); params.weight = 1.0f; params.gravity = Gravity.CENTER;
TextView textView = new TextView(PhotoActivity.this); textView.setText("Photo not found."); textView.setTextColor(Color.WHITE); textView.setLayoutParams(params);
Как вариант так:
textView.setGravity(Gravity.CENTER);


Ответ

Вам поможет
textView.setTextAppearance(int styleResId);

Можно ли сделать программу, которая при записку выберет .Net Framework и необходимые блоки кода для правильной работы?

Например в программе есть 2 блока кода: - один для старого .Net Framework, - а другой для нового .Net Framework (иными словами его фишки не совместимы со старой версией).
Подскажите, можно ли в зависимости от установленного .Net Framework на машине клиента на ходу выбирать, какой .Net Framework использовать в программе, а так переключать блоки кода?


Ответ

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

Как узнать что элемент страницы попал в поле зрения пользователя

В самом низу страницы имеется баннер. При открытии страницы его не видно, чтобы его увидеть требуется прокрутить страницу. Можно ли определить, что страница была прокручена до уровня видимости баннера и послать сигнал PHP-скрипту (т.е. засчитать просмотр баннера)?


Ответ

Возможно ли снять блокировку из другого потока?

При попытке снять блокировку монитора из другого потока выбрасывается исключение
An unhandled exception of type 'System.Threading.SynchronizationLockException' occurred in Test - Smth.exe Additional information: Для не синхронизированного блока кода вызван метод синхронизации объектов.
Пример кода:
Imports System.Threading
Module All Sub Main() Dim Obj As New Object
Monitor.Enter(Obj) Call (New Thread(Sub() Monitor.Exit(Obj))).Start()
Console.ReadKey() End Sub End Module
Возможно ли как-то снять блокировку из того потока, который её НЕ устанавливал?


Ответ

С монитором — нет, никак.
Насколько я понимаю, единственный синхронизационный примитив, который позволяет разблокировать себя из другого потока — это Semaphore (лучше брать рекомендованный вариант SemaphoreSlim).
Пример (на C#)
var sema = new SemaphoreSlim(0); // создаём заблокированный семафор new Thread(() => { sema.Release(); // разблокируем его // ... }).Start(); sema.Wait(); // ожидаем разблокировки
Если вы хотите просто дождаться реального старта другого потока, можно использовать ManualResetEventSlim
Код практически такой же:
var ev = new ManualResetEventSlim(initialState: false); new Thread(() => { ev.Set(); // ... }).Start(); ev.Wait();

Поправка: всё-таки исходную проблему можно решить с монитором, если заставить его работать как conditional variable. Код получается немного более сложным, и требует вспомогательной булевой переменной:
bool started = false; object mutex = new object(); new Thread(() => { lock (mutex) { started = true; Monitor.Pulse(mutex); } // ... }).Start();
lock (mutex) { while (!started) Monitor.Wait(mutex); // блокировка будет отпущена на период ожидания }
И наконец, если не только основному потоку нужно дождаться порождённый поток, но и наоборот, порождённый поток должен задержаться до тех пор, пока основной поток не узнает, что он стартовал, у нас возникает так называемая задача рандеву: синхронизация одной точки выполнения у нескольких потоков. Это проще всего делать при помощи Barrier:
var barrier = new Barrier(participantCount: 2); new Thread(() => { barrier.SignalAndWait(); // (*) // ... }).Start();
barrier.SignalAndWait(); // (*)
Строки, отмеченные звёздочкой, будут ждать друг друга: первый из пришедших в эту строку потоков затормозится до прихода второго.

Внедрение зависимостей в Owin

В базовом шаблоне при создании asp.net mvc проекта в качестве системы авторизации (по умолчанию) используется asp.net identity
public class ApplicationUser : IdentityUser { public async Task GenerateUserIdentityAsync( UserManager manager) {} }
public class ApplicationUserManager : UserManager { public ApplicationUserManager(IUserStore store) : base(store) {}
public static ApplicationUserManager Create( IdentityFactoryOptions options, IOwinContext context) {} }
public class ApplicationSignInManager : SignInManager { public ApplicationSignInManager( ApplicationUserManager userManager, IAuthenticationManager authenticationManager) : base(userManager, authenticationManager) { }
public override Task CreateUserIdentityAsync(ApplicationUser user) {}
public static ApplicationSignInManager Create( IdentityFactoryOptions options, IOwinContext context) {} }
public class ApplicationDbContext : IdentityDbContext { public ApplicationDbContext() : base("DefaultConnection", throwIfV1Schema: false) {}
static ApplicationDbContext() {}
public static ApplicationDbContext Create() {} }
Указанные выше классы используются при настройки авторизации в приложении
public partial class Startup { public void ConfigureAuth(IAppBuilder app) { // Configure the db context, user manager and role manager to use // a single instance per request app.CreatePerOwinContext(ApplicationDbContext.Create); app.CreatePerOwinContext(ApplicationUserManager.Create); app.CreatePerOwinContext(ApplicationRoleManager.Create); app.CreatePerOwinContext(ApplicationSignInManager.Create);
} }
Как в приведенном коде избавиться от сильной зависимости - app.CreatePerOwinContext()?


Ответ

Воспользуемся IoC контейнером Autofac для внедрения зависимостей.
При помощи менеджера пакетов Nuget установим необходимые пакеты:
Autofac Autofac ASP.NET MVC 5 Integration Autofac OWIN Integration
Внесем следующие изменения в класс Startup
private void ConfigureContainer(IAppBuilder app) { var builder = new ContainerBuilder();
// STANDARD MVC SETUP:
// Register your MVC controllers. builder.RegisterControllers(typeof(MvcApplication).Assembly);
// Run other optional steps, like registering model binders, // web abstractions, etc., then set the dependency resolver // to be Autofac.
builder.RegisterType().As().InstancePerRequest(); builder.RegisterType() .As>().InstancePerRequest(); builder.RegisterType>() .As>().InstancePerRequest();
builder.Register((c, p) => c.Resolve() .Authentication).InstancePerRequest();
var dataProtectionProvider = app.GetDataProtectionProvider(); builder.Register>((c, p) => BuildUserManager(c, p, dataProtectionProvider));
var container = builder.Build(); DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
// OWIN MVC SETUP:
// Register the Autofac middleware FIRST, then the Autofac MVC middleware. app.UseAutofacMiddleware(container); app.UseAutofacMvc(); }
private UserManager BuildUserManager( IComponentContext context, IEnumerable parameters, IDataProtectionProvider dataProtectionProvider) { var manager = new ApplicationUserManager(context.Resolve>()); // Configure validation logic for usernames manager.UserValidator = new UserValidator(manager) { AllowOnlyAlphanumericUserNames = false, RequireUniqueEmail = true };
// Configure validation logic for passwords manager.PasswordValidator = new PasswordValidator { RequiredLength = 6, RequireNonLetterOrDigit = true, RequireDigit = true, RequireLowercase = true, RequireUppercase = true, };
// Configure user lockout defaults manager.UserLockoutEnabledByDefault = true; manager.DefaultAccountLockoutTimeSpan = TimeSpan.FromMinutes(5); manager.MaxFailedAccessAttemptsBeforeLockout = 5;
// Register two factor authentication providers. // This application uses Phone and Emails as a step of receiving a code // for verifying the user // You can write your own provider and plug it in here. manager.RegisterTwoFactorProvider("Phone Code", new PhoneNumberTokenProvider { MessageFormat = "Your security code is {0}" }); manager.RegisterTwoFactorProvider("Email Code", new EmailTokenProvider { Subject = "Security Code", BodyFormat = "Your security code is {0}" });
//manager.EmailService = new EmailService(); //manager.SmsService = new SmsService(); if (dataProtectionProvider != null) { manager.UserTokenProvider = new DataProtectorTokenProvider( dataProtectionProvider.Create("ASP.NET Identity")); } return manager; } }
Добавим вызов метода ConfigureContainer(IAppBuilder app) в метод Configuration(IAppBuilder app)
public partial class Startup { public void Configuration(IAppBuilder app) { ConfigureAuth(app); ConfigureContainer(app); } }
После выше приведенных действий можно удалить методы app.CreatePerOwinContext() из метода ConfigureAuth()
так же необходимо модифицировать AccountControlle, ManageController
Убрать конструктор без параметров. Удалить следующие свойства: UserManager, SignInManager, AuthenticationManager
Вот так может выглядеть AccountController после внесения необходимых изменений:
public class AccountController : Controller { private readonly IAuthenticationManager _authenticationManager; private readonly SignInManager _signInManager; private readonly UserManager _userManager;
public AccountController( UserManager userManager, SignInManager signInManager, IAuthenticationManager authenticationManager) { _authenticationManager = authenticationManager; _userManager = userManager; _signInManager = signInManager; } //Прочие необходимые методы }
Использованные источники информации:
Autofac’s documentation Habrahabr

Как изменить цвет для svg?

Я не знаю как менять цвет с помощью css для изображения в формате svg.
Источник (изображения): http://www.flaticon.com/free-icon/home-web-page_12168#term=home&page=1&position=27
Пробовал так:
svg {fill: #008000;}
Не получилось почему-то.


Ответ

Все зависит от того как вы его вставляете на страницу, а вообще если по-простому через src=svg.svg, то можно так:

unit test как протестировать отдельные операции в методе

Метод проверяет является ли елемент массива не буквенным символом
public static char[] checkLetterInWord(char[] checkWord, int firsLetter, int lastLetter){ while(firsLetterКак протестировать отдельные куски кода, и возможно ли такое вообще.
if(!Character.isLetter(checkWord[firsLetter])){ firsLetter++; }
по аналогии
else if(!Character.isLetter(checkWord[lastLetter])){ lastLetter--; }
и
else { exchangeCharInWord(checkWord, firsLetter, lastLetter); firsLetter++; lastLetter--; }


Ответ

Перечитайте предыдущий ответ о том, какие должны быть тесты. Перечитав, хорошенько подумайте и составьте список тесткейсов для метода checkLetterInWord Составив правильный список тесткейсов, вы поймете, что все ветки вашего метода уже покрыты тестами.
Это работает именно так. Программист обычно не задается мыслью "протестировать вот этот кусок кода", особенно если код пишется в стиле TDD. Тестируется метод целиком, но под разными углами, так сказать.
Отталкивайтесь от тесткейсов, пишите тесты, потом выполняйте и смотрите на покрытие метода. И если вдруг увидите, что какая-то ветка не покрыта, значит вы упустили какой-то тесткейс.

Помогите исправить ошибку в примере из книги Лутца

Учусь по книге Лутца «программирование на python», но в одном из сценариев никак не могу решить проблему. Собственно код сценария:
import sys, os maxfileload = 1000000 blocksize = 1024 * 500
def copyfile(pathFrom, pathTo, maxfileload=maxfileload): """ Копирует один файл из pathFrom в pathTo, используя двоичный режим для подавления операций кодирования/декодирования символов """ if os.path.getsize(pathFrom) <= maxfileload: bytesFrom = open(pathFrom, 'rb').read() # маленькие файлы читать целиком open(pathTo, 'wb').write(bytesFrom) else: fileFrom = open(pathFrom, 'rb') # открыть файл для чтения в двоичном режиме fileTo = open(pathTo, 'wb') # открыть файл для записи в двоичном режиме while True: bytesFrom = fileFrom.read(blocksize) # читать по одному блоку if not bytesFrom: break # если последний блок пуст fileTo.write(bytesFrom) # записать один блок
def copytree(dirFrom, dirTo, verbose = 0): """ Копирует содержимое каталогов и подкаталогов из dirFrom в dirTo, и возвращает счетчик (files, dirs) """ fcount = dcount = 0 for filename in os.listdir(dirFrom): pathFrom = os.path.join(dirFrom, filename) pathTo = os.path.join(dirTo, filename) if not os.path.isdir(pathFrom): try: if verbose > 1: print('copying', pathFrom, 'to', pathTo) copyfile(pathFrom, pathTo) fcount += 1 except: print('Error copying', pathFrom, 'to', pathTo, '--akipped') print(sys.exc_info()[0], sys.exc_info()[1]) else: if verbose: print('copying dir', pathFrom, 'to', pathTo) try: os.mkdir(pathTo) below = copytree(pathFrom, pathTo) fcount += below[0] dcount += below[1] dcount += 1 except: print('Error creating', pathTo, '--skipped') print(sys.exc_info()[0], sys.exc_info()[1]) return(fcount, dcount)
def getargs(): """ Извлекает и проверяет аргументы с именами каталогов, по умолчанию возвращает None в случае ошибки """ try: dirFrom, dirTo = sys.argv[1:] except: print('Usage error: cpall.py dirFrom dirTo') else: if not os.path.isdir(dirFrom): print('Error: dirFrom is not a directory') elif not os.path.isdir(dirTo): os.mkdir(dirTo) print('Note: dirTo created') return(dirFrom, dirTo) else: print('Warning: dirTo already exists') if hasattr(os.path, 'samefile'): same = os.path.samefile(dirFrom, dirTo) else: same = os.path.abspath(dirFrom) == os.path.abspath(dirTo) if same: print('Error: dirFrom same as dirTo') else: return(dirFrom, dirTo)
if __name__ == '__main__': import time dirstuple = getargs() if dirstuple: print('Copying...') start = time.clock() fcount, dcount = copytree(*dirstuple) print('Copied', fcount, 'files', dcount, 'directories', end=' ') print('in', time.clock() - start, 'seconds')
При запуске сценария не копируются подкаталоги и файлы в них, а для файлов на верхнем уровне заданного каталога (pathFrom) выдает исключение FileExistsError. Несколько раз проверял сценарий, но никак не могу понять в чем проблема.
Вывод при исполнении скрипта:
C:\Python34\src\lutz_ex>cpall.py C:\Python34\src\lutz_ex C:\temp Warning: dirTo already exists Copying... Error creating C:\temp\bigext_tree.py --skipped [WinError 183] Невозможно создать файл, так как он уже существует: 'C:\\temp\\bigext_tree.py' Copied 11 files 0 directories in 0.02591993545451741 seconds


Ответ

У вас в функции copytree стоит проверка if not os.path.isdir(pathFrom) при переборе объектов для копирования. Соответственно, когда очередь доходит до подкаталогов, то они пропускаются, поскольку являются каталогами и не проходят проверку в if
По поводу FileExistsError. После успешного копирования файла в блоке
if not os.path.isdir(pathFrom): try: if verbose > 1: print('copying', pathFrom, 'to', pathTo) copyfile(pathFrom, pathTo) fcount += 1
у нас не вызывает except, соответственно мы переходим к блоку else
else: if verbose: print('copying dir', pathFrom, 'to', pathTo) try: os.mkdir(pathTo) below = copytree(pathFrom, pathTo) fcount += below[0] dcount += below[1] dcount += 1 except: print('Error creating', pathTo, '--skipped') print(sys.exc_info()[0], sys.exc_info()[1])
где мы в блоке try мы пытаемся вызвать os.mkdir(pathTo), что невозможно сделать, поскольку pathTo уже существует

Как сделать медленно плавающий фон?

Как сделать эффект для image, чтобы, например, широкая картинка медленно плыла слева направо, или сверху вниз?


Ответ

Создаете анимацию

для своей картинки

И в удобном месте запускаете свою анимацию
ImageMotionStoryboard.Begin();
UPDATE: пример работы

Как установить textSize в TextView как в actionBar

Как можно установить атрибут textSize в TextView ( в xml-файле) такой же как в actionBar ? Ну т.е. что бы размер шрифта в actionBar и TextView был одинаковый.




Ответ

Используйте для указания размера текста в вашем TextView атрибуты из системных стилей:
TextAppearance.Widget.ActionBar.Title - размер для заголовков в экшенбаре (он соответствует системному размеру TextAppearance.Medium)
TextAppearance.Widget.ActionBar.Subtitle - размер для подзаголовков в экшенбаре (он соответствует системному размеру TextAppearance.Small)
Узнать значения, установленные для системных виджетов, вы можете из исходников Android. Так, например, все значения системных атрибутов для телефонов находятся в файле res/values/styles.xml системного пакета framework-res.apk

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

История вопроса: Однажды мне пришлось сделать последовательности из 4 элементов. Таких последовательностей 4! т.е. 24 . Чтобы не писать 24 раза почти одинаковые последовательности, я заставил некоторые из них "вращаться"
Итого на 4 эл-та вращение приходилось 6 раз:
24 0 DO TURN-N
4 I = IF 6 L-VAR@ 5 L-VAR@ 7 L-VAR@ 8 L-VAR@ PRIEM-OB THEN 8 I = IF 6 L-VAR@ 8 L-VAR@ 5 L-VAR@ 7 L-VAR@ PRIEM-OB THEN 12 I = IF 7 L-VAR@ 5 L-VAR@ 8 L-VAR@ 6 L-VAR@ PRIEM-OB THEN 16 I = IF 7 L-VAR@ 6 L-VAR@ 5 L-VAR@ 8 L-VAR@ PRIEM-OB THEN 20 I = IF 8 L-VAR@ 7 L-VAR@ 5 L-VAR@ 6 L-VAR@ PRIEM-OB THEN
LOOP

Слово TURN-N занимается "вращением" ( 1234 -- 4123 ) L-VAR@ - РАЗЪИМЕНОВАТЬ ЛОК.ПЕРЕМЕННУЮ ПО АДРЕСУ
Как всё это дело автоматизировать? Чтобы не из 4-х элементов, а из 5-ти или 6-ти?


Ответ

\ Генератор перестановок символов в строке от Garbler'a : cswap ( a1 a2 -- ) 2DUP 2>R C@ SWAP C@ R> C! R> C! ; : cnotfind ( c s2 s1 -- t/f ) 1 -ROT ?DO OVER I C@ = IF 0 AND LEAVE THEN LOOP SWAP DROP ; : variants ( 0 s2 s1 str len --> count s2 s1' str len ) 2>R 2DUP - 1 < IF 2>R 1+ 2R> ." > " 2R> 2DUP TYPE CR EXIT THEN DUP >R BEGIN 2DUP > WHILE DUP C@ OVER R@ cnotfind IF DUP R@ cswap R> 1+ SWAP 2R> ROT >R RECURSE R> -ROT 2>R SWAP 1- >R DUP R@ cswap THEN 1+ REPEAT DROP R> 2R> ; : VARIANTS ( asc # --> n ) DUP 0 = IF 2DROP 0 EXIT THEN 2DUP 2>R OVER + SWAP 0 -ROT 2R> variants 2DROP 2DROP ;
\ Пример получения всех перестановок символов в строке S" 123456" 2DUP VARIANTS .( ] variants: ) . TYPE CR CR
\ для чисел количеством до 256 можно использовать массив указателей на \ массив чисел а массив указателей подавать как строку на вход слова VARIANTS \ как в приведенном выше примере