Страницы

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

пятница, 1 февраля 2019 г.

API по сокращению ссылок Vk.cc

Кто то подскажет, есть ли API для сокращения ссылок в ВК? Обыскал весь интернет не могу найти Заранее спасибо


Ответ

API вроде бы, нет, но, как пишут в оф. группе Live, есть расширение под Chrome, разобрав которое, вероятно, можно понять, как сделать что-то своё.
Upd. похоже, всё просто. Посмотрите, как работает сама страница vk.cc – из формы идёт POST-запрос, и получается короткая ссылка в ответ! В упомянутом расширении под Chrome это так реализовано:
function loadShort(q,done){ q=trim(q); var cache_url=q.replace(/http:\/\//gi,"").replace(/\//gi,""); if(s.get("res_"+cache_url)!=null){ if(done)done("9654profile.css,page.css,profile.js,page.js333260"+s.get("res_"+cache_url)); return; } xhr.onreadystatechange = function() { if (xhr.readyState == 4) { if (xhr.status >= 200 && xhr.status < 300) { if(done)done(xhr.responseText); } } }; xhr.open("POST", "http://vk.com/cc", true); xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest"); xhr.send("act=shorten&al=1&link="+enc(q)); }
Реализовать это в рамках обычной веб-страницы на JS не получится из-за того, что они на другом домене расположены, чем ваша страница. Зато через сервер, сделать вполне просто.

Сравнение данных разных типов в python2

Никак не могу найти информацию по каким правилам сравниваются (>, <) разные типы данных?
Почему сравнении при списка b = [10, 0], числа a = 5 и строки s = 'sad' получается
a > b # False s > b # True
Т.е.
5 > [10, 0] # False 'sad' > [10, 0] # True
Как сравниваются такие типы данных?


Ответ

https://stackoverflow.com/questions/3270680/how-does-python-compare-string-and-int
CPython implementation detail: Objects of different types except numbers are ordered by their type names; objects of the same types that don’t support proper comparison are ordered by their address.
Перевод: "Деталь реализации CPython: объекты разных типов, за исключением чисел, упорядочиваются согласно их именам типов, объекты одного типа, не поддерживающего операцию сравнения, упорядочиваются по адресу."
Ссылка на официальное руководство: https://docs.python.org/2/library/stdtypes.html#comparisons Цитата оттуда (перевод мой):
Объекты различных типов, кроме различных числовых типов и различных типов строк, никогда не равны; такие объекты упорядочиваются последовательно, но произвольно (так что сортировка неоднородного массива дает последовательный результат). Кроме того, некоторые типы (например, файловые объекты) поддерживают только вырожденное понятие сравнения, где любые два объекта этого типа не равны. Опять же, такие объекты упорядочены произвольно, но последовательно.Операторы <, <=,> И> = вызовут исключение TypeError, когда любой операнд является комплексным числом
В данной цитате слово "последовательно" - буквальный перевод слова "consistently", ИМХО, имеется в виду, что sort([1, "", []]) всегда даст один и тот же результат.

Например:
5 < [] # -> True, т.к. 'int' < 'list' [] < "" # -> True, т.к. 'list' < 'str

Как вернуть строку по умолчанию, если запрос вернул нольстрок?

Запрос может вернуть строку или ноль строк, но при этом необходимо всегда выводить строку по умолчанию. Подскажите как это сделать?
select col1 as col1, col2 as col2 from table1 t1 where col1 like 'col' group by t1.col1


Ответ

Если оригинальный запрос возвращает или одну, или ноль строк, то можно сделать примерно так:
select top 1 col1, col2 from ( select 0 as SortOrder, col1 as col1, col2 as col2 from table1 t1 where col1 like 'col' group by t1.col1 union all select 1 as SortOrder, 'col1default', 'col2default' ) as src order by SortOrder

Заполнение массивов случайными числами

Есть отдельный класс матрица, в конструкторе по умолчанию инициализируется и заполняется случайными числами двумерный массив:
mas = new int[3, 3]; Random rand = new Random(); for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) mas[i, j] = rand.Next(-1, +9);
Проблема в том, что когда в основной программе создаю 2 объекта класса моей матрицы, оба массива получаются с одинаковыми числами.
Как сделать, что бы числа были разными?


Ответ

Можно ещё инициализировать Random чем-то быстро меняющимся или заведомо различным. Например:
var rand = new Random((int)Stopwatch.GetTimestamp());
GetTimestamp() меняется с частотой порядка нескольких МГц на современных компах, ваш же цикл выполняется несколько микросекунд. У меня за это время GetTimestamp() вырастает примерно на 15 тактов, т.е. seed будет разный. В общем, вряд ли найдётся такой комп, у которого GetTimestamp() не изменится за время заполнения массива. Разве что совсем-совсем старый какой-нибудь, у которого Stopwatch.IsHighResolution == false
var rand = new Random(Guid.NewGuid().GetHashCode());
Guid.NewGuid() всегда возвращает разные значения:
To a very high degree of certainty, this function returns a unique value – no other invocation, on the same or any other system (networked or not), should return the same value.
(из MSDN по функции CoCreateGuid).

Как заменить фрагмент в ViewPager?

Есть ViewPager, ViewPagerAdapter,TabLayout и три фрагмента Fagment1, Fragment2, Fragment3. ViewPager отображает 2 фрагмента.
ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager); ViewPagerAdapter mVPAdapter = new ViewPagerAdapter(getSupportFragmentManager()); mVPAdapter.addFrag(new Fragment_1(), ""); mVPAdapter.addFrag(new Fragment_2(), ""); viewPager.setAdapter(mVPAdapter); tabLayout = (TabLayout) findViewById(R.id.tabs); tabLayout.setupWithViewPager(viewPager);
Как заменить Fragment 1 на 3 динамически?


Ответ

Создайте метод замены фрагмента в адаптере. Сделайте адаптер расширяющим FragmentStatePagerAdapter Сразу после замены фрагмента вызовите mVPAdapter.notifyDataSetChanged() Добавьте в адаптер вот этот метод:
@Override public int getItemPosition(Object object) { return POSITION_NONE; }

Как проверить, что класс В наследуется от А? (java)

Когда у нас есть объект типа В и класс А - всё просто:
B b; if (b instanceof A) ...
А если у нас нет экземпляра В, а есть только сам класс?
Раньше точно делал, но сейчас найти не могу. Бегу по рефлексии, и мне нужно определить, является ли field.getType() наследником некоторого класса.


Ответ

Судя по этому ответу Нужна функция isAssignableFrom
Super.class.isAssignableFrom(Sub.class)

Тень без использования фотошопа

Возможно ли реализовать такую тень без фотошопа?


Ответ

* + * { margin-top: 1em; } div { height: .5em; overflow: hidden; } div:before { content: ""; display: block; height: 1em; margin: -1em auto 0; border-radius: 50%; box-shadow: 0 0 .5em 0px black; } .b-50:before { width: 50%; } .b-75:before { width: 75%; }


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

Здравствуйте. Помогите, пожалуйста, составить регулярное выражение. Например:
test = '12asiudas8787hajshd986q756tgs87ta7d6-12js01' test.scan(регулярное_выражение)
В результате должно получиться
["8787", "986", "756", "87", "7", "6", "12"]
Иными словами регулярное выражение как /\d+/, только чтобы числа по краям строки игнорировались.


Ответ

Можно поступить следующим образом
test = '12asiudas8787hajshd986q756tgs87ta7d6-12js01' arr = [] test.scan(/(?<=[^\d])(\d+)(?=[^\d])/) do |match| arr << match[0] end p arr

Взаимодействие C# и C++

Есть dll-ка написанная на C# и есть программа написанная на Borland С++ которая жаждет использовать методы реализованные в dll-ке.
Вопрос: Как это взаимодействие лучше организовать если:
dll-ка при необходимости (если такое изменение понадобится для организации взаимодействия с С++) может превратиться в exe или даже службу некоторые методы реализованные в dll в силу особенностей .Net ощутимо долго отрабатывают при первом вызове. Да и dll-ке желательно проводить некоторую подготовительную работу (обновлять используемые файлы и тп.) и лучше если она будет делать это один раз за весь цикл работы вызывающей программы. dllка полностью в моей власти могу изменять её код как мне угодно. программа на C++ вне моей власти. Максимум что мне доступно-объяснить разработчикам как использовать мою dllку. Желательна схема не требующая дополнительных действий (перерегистрация/перезапись реестра/переустановка компонентов и т.п.) при обновлении dllки. производительность критична.
PS: Отдельное спасибо за пример реализации такого взаимодействия на Builder C++


Ответ

На мой взгляд самый простой способ - это написание промежуточной dll на C++\CLI, который позволяет с одной стороны нормально экспортировать методы через __declspec(dllexport), а с другой нормально вызывать методы из библиотек, которые написаны на C#.
Когда сам интересовался этим вопросом, то плагины для VS не работали корректно, по-моему, из-за кирилицы (может за пару лет стало лучше), а вручную декомпилировать библиотеку и вносить изменения в MSIL быстро надоело.

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

Проведя пальцем по экрану сверху вниз, мы попадаем вверху в меню с кнопками. Например: звук (изменить звук), поворот экрана (разрешаем или запрещаем поворот экрана) и т.д.

А можно ли программно нажать на кнопку "Поворот экрана", а именно: запретить поворот экрана?
Иными словами: как программно запретить поворот, а по завершении программы вернуть в положение перед запуском. Т.е. если перед запуском был ландшафт, то он и останется им до конца работы приложения, а если был портрет, то он тоже останется до конца работы приложения?
Вариант с android:screenOrientation="portrait" в Манифесте не предлагать. Он не решает данную проблему!
Благодарю, заранее...


Ответ

Ответы с en-SO раз и два
Получаем два варианта: ландшафт и портрет
int orientation=this.getResources().getConfiguration().orientation; if(orientation==Configuration.ORIENTATION_PORTRAIT){ //портрет } else{ //ландшафт } Получаем 4 варианта с углами поворота относительно дефолтного значения
int rotation = getWindowManager().getDefaultDisplay().getRotation(); int angle = 0; switch (rotation) { case Surface.ROTATION_90: angle = -90; break; case Surface.ROTATION_180: angle = 180; break; case Surface.ROTATION_270: angle = 90; break; default: angle = 0; break; }
Теперь устанавливайте полученную ориентацию:
setRequestedOrientation(/* сюда поместите одно из значений констант класса ActivityInfo */);

Как сделать рамку вокруг ImageView?

Вот у меня есть ImageView с установленной в нем картинкой... Мне нужно сделать черную окантовку вокруг этой картинки... Вот один скриншот как у меня сейчас и один как мне нужно... Кто делал такое подскажите плиз уже час сижу не могу найти как это прицепить...
вот так сейчас

вот так нужно

вот код



Ответ

Создайте xml файл.

Этот бордер вставьте как android:background="@drawable/black_border" в ваш imageView

UNIX права: что значит исполнение?

Есть чтение (4), запись (2) и исполнение (1) Что значит исполнение? Объясните простыми словами и примером.


Ответ

для файла это означает, что его можно выполнить, обратившись к нему:
либо по имени, поместив его в один из каталогов, перечисленных в переменной окружения PATH (или дополнив значение этой переменной путём к текущему местоположению этого файла) либо указав полный путь к файлу
понятно, что выполнить файл можно, только если он:
либо является скриптом и в первой строке у него указан корректный «shebang» либо является программой (скомпилированной под набор инструкций вашего процессора) и операционной системе «известно», как его загрузить в память и в какую точку передать управление

для каталога это означает, что можно прочитать не только имена файлов/каталогов, находящихся внутри данного каталога, но и их атрибуты (принадлежность, права доступа, время создания/модификации). пример:
создаём тестовый каталог, в нём создаём файл и ещё один каталог:
$ mkdir test $ touch test/file $ mkdir test/dir
сейчас мы видим атрибуты содержимого каталога test
$ ls -l test total 4 drwxr-xr-x 2 user user 4096 Apr 1 23:39 dir -rw-r--r-- 1 user user 0 Apr 1 23:38 file
а если уберём бит исполнимости с каталога test
$ chmod -x test
то увидим только имена содержащихся в нём файлов/каталогов:
$ ls -l test ls: cannot access test/dir: Permission denied ls: cannot access test/file: Permission denied total 0 d????????? ? ? ? ? ? dir -????????? ? ? ? ? ? file
и не сможем «заглянуть глубже», например, посмотреть содержимое каталога test/dir
$ ls -l test/dir ls: cannot access test/dir: Permission denied

Какой элемент разметки использовать лучше?

Подскажите, пожалуйста, какой элемент XML удобнее использовать, чтобы при добавлении в него новых View, их размеры автоматически уменьшались, чтобы втиснуться в родительский View?
Сначала думал использовать GridView, но потом понял, что размеры вложенных в него View нединамичны (разве что руками править).
Нужно вот так чтобы получилось (слева - до добавления новых View, справа - после (размер контейнера остался тем же, а элементы уменьшились)):


Ответ

Используйте GridLayout для версий API 21+ (или support.v7.widget.GridLayout для более ранних версий) и используйте вес. Например, вот так:


...

Адрес функции на этапе компиляции

Задача: получить и преобразовать адрес функции. Смысл подразумевается следующий:
Имеем функцию
void func() {}; // имеем адрес 0x500000, к примеру constexpr size_t inc_pointer = to_size_t(&func) + 5; // (*)
Где to_size_t - это макрос/constexpr функция, которая преобразует адрес функции в число на этапе компиляции. Реализация может быть следующая:
#define to_size_t(x) (size_t)(x) // C-style каст #define to_size_t(x) reinterpret_cast(x) // C++-style каст
Почему я не написал cast сразу будет понятно ниже.
Проблема в том, что конструкция (*) превращается в следующий код
mov eax, 0x500000 // 0x500000 == адрес функции func add eax, 5 ...
Я же хочу добиться того, чтобы код был
mov eax, 0x500005 ...

Попытка 1
Сast'ы ни к чему хорошему не привели, результат выше

Попытка 2
template union converter { T _func; size_t _pointer;
constexpr converter(T func) : _func(func) {}; };
#define to_size_t(x) converter{x}._pointer #define identity(x) converter{x}._value
Для проверки constexpr'a я пользуюсь следующей функций:
template void print_it() { std::cout << N << std::endl; }
Загвоздка в том, что constexpr union не хочет работать так, как мне нужно
print_it(); // ок, компилируется (обращение к полю _value) print_it(); // error C2975: 'N': invalid template argument for 'print_it', expected compile-time constant expression
Выслушаю ваши идеи.

P.S. А следующий код вообще крашит студию (2015-ю)
template constexpr T identity_constexpr(T value) { return value; }
print>(); // fatal error C1001: An internal error has occurred in the compiler.

UPDATE
Ответ получен, видимо проблему придётся решать, заменяя конструкции соответствующим образом уже после компиляции в готовом исполняемом файле.


Ответ

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

Как прочитать txt-файл из ресурсов?

Подскажите пожалуйста, как воспользоваться файлом (.txt) в коде, который находится в Resources проекта.


Ответ

Если верить аналогичному ответу на английском, то
Вы можете использовать Assembly.GetManifestResourceStream метод:
Добавьте следующий using
using System.Reflection; Установите следующее свойство у нужного файла:
Параметр Build Action, значение Embedded Resource Использовать следующий код
var assembly = Assembly.GetExecutingAssembly(); var resourceName = "MyCompany.MyProduct.MyFile.txt";
using (Stream stream = assembly.GetManifestResourceStream(resourceName)) using (StreamReader reader = new StreamReader(stream)) { string result = reader.ReadToEnd(); }
resourceName имя ресурса встроенного в сборку. Например, если добавляется файл "MyFile.txt", который лежит в корне проекта с неймспейсом по умолчанию "MyCompany.MyProduct", тогда resourceName будет "MyCompany.MyProduct.MyFile.txt" Если нужно получить список всех ресурсов в сборке можно воспользоваться методом Assembly.GetManifestResourceNames

Дублирование методов в модулях в Ruby

Нужно добавить модуль, который добавляет объекту массив. Данный код почему-то не работает, доступа в методах к массиву @comments нет
module Library module Commentable attr_accessor :comments def initialize author, title @comments = [] super author, title end end end
class Library::Book include Library::Commentable attr_accessor :author, :title def initialize author, title @author = author @title = title end end


Ответ

Потому что выходит, что сначала вызывается initialize у Library::Book, который унаследованный метод (из Commentable) не вызывает (super там нет).
Library::Book.ancestors #=> [ # Library::Book, <-- он первый по списку # Library::Commentable, # Object, # Kernel, # BasicObject # ]
Если забыть о том факте, что "комментируемое" у вас почему-то принимает аргументы, характерные книге (потому что это деталь задачи, о которой вы ничего не рассказали), возможных выходов два:
(в Ruby 2.0 и новее) Заменить include на prepend, чтобы модуль оказался впереди всей цепочки поиска методов (разве что после метакласса, но это уже дебри). Перенести вызов super в Library::Book (и вспомнить, что вызов super без аргументов и скобок прокидывает аргументы текущего вызова).

Как оптимизировать запрос? Написать запрос без or

Есть, например, следующий запрос:
declare @IINBIN nvarchar(12)='531008300343' ,@address nvarchar(200)='г.Алматы' select cl.* From dbo.Deals d left join clients c on c.clients_id = d.clientsId where (c.IINBIN = @IINBIN or @IINBIN='') and (c.[address] =@address or @address='')
Этот запрос выполняется дольше, чем запрос со следующими условиями:
c.IINBIN = @IINBIN and c.[address] = @address
Мне надо чтобы без указания параметров выборка делалась полная. т.е. оставляю поля пустыми и делается выборка без заполнения полей параметров Как написать запрос без or и как его оптимизировать?


Ответ

Вероятнее всего для запросов с условиями
where (c.IINBIN = @IINBIN or @IINBIN = '') and (c.[address] = @address or @address = '')
и
where c.IINBIN = @IINBIN and c.[address] = @address
строятся разные планы.
Во-первых стоит конечно же посмотреть на семантику запроса и, быть может, постараться переписать его как-то более оптимально. Если в этом направлении дальше двигаться некуда, то можно попробовать следующее.
Попробовать перестроить индексы и обновить статистики (сделать это нужно для каждой из таблиц, участвующих в запросе):
alter index all on [TableName] rebuild GO update statistics [TableName] with fullscan GO
Более актуальные статистики могут помочь построению более оптимального плана, а свежепостроенные нефрагментированные индексы - более быстрому его исполнению.
Также можно попробовать добавить опцию recompile
select c.* from dbo.Deals d left join clients c on c.clients_id = d.clientsId where (c.IINBIN = @IINBIN or @IINBIN='') and (c.[address] = @address or @address = '') option (recompile)
Это заставит query processor каждый раз компилировать запрос заново, учитывая актуальные значения переменных @address и @IINBIN. Перекомпиляция занимает время, поэтому не всегда таким способом можно получить выигрыш.
Наконец можно разбить запрос на два независимых с помощью if ... else
if @IINBIN != '' and @address != '' select c.* from dbo.Deals d left join clients c on c.clients_id = d.clientsId where c.IINBIN = @IINBIN and c.[address] = @address else select c.* from dbo.Deals d left join clients c on c.clients_id = d.clientsId where (c.IINBIN = @IINBIN or @IINBIN = '') and (c.[address] = @address or @address = '')
это своеобразный компромисс между запросом с опцией recompile и без неё.
Ну и, конечно же, у вас должны быть полезные для запроса индексы на таблицах. Если IINBIN уникален, то я бы добавил индекс
create unique index IX_Clients_IINBIN on Clients (IINBIN) include (address)
если не уникален, то
create index IX_Clients_1 on Clients (IINBIN, address)
(более селективный столбец ставим вперёд).
Для случая, когда поиск идёт только по address, тоже можно добавить свой индекс:
create index IX_Clients_2 on Clients (address)
Вообще запросы такого вида (когда столбцы могут фильтроваться в самых разных сочетаниях.) не самые лёгкие для оптимизации, в особенности, если столбцов не 2, а намного больше.

Как сделать авторизацию на сайте в android приложении с помощью Jsoup

Большая просьба не кидать камнями а написать по делу либо скинуть ссылку на уже готовые гайды по созданию авторизации на сайте. Перерыл весь гугл - ничего рабочего так и не нашел(Руки не из заднего места) сам по себе начинающий кодер на java, но структуру кода понимаю(Что, где и от чего зависит). Нужен готовый пример с рабочим пост запросом, единственное из того что нашел хоть как то давало признаки жизни.
try { Connection.Response res1 = Jsoup.connect("http://site.ru") .data("login","admin") .data("passwd","admin") .data("send","Войти") .method(Connection.Method.POST) .execute(); Map loginCoockies = res1.cookies(); System.out.println(loginCoockies); Document doc = Jsoup.connect("http://site.ru") .cookies(loginCoockies) .get(); System.out.println(doc); } catch (IOException e) { System.out.println(e); } return null;
После запуска выдает:
{PHPSESSID=t7idbm5jkr40ial25brvju72n2}
и html код страницы.
Точнее после каждого нажатия на кнопку выдает PHPSESSID=(Всегда разный). Страница html кода показывает что я так и не был авторизован.


Ответ

Разобрался сам, авторизация проходит успешно, проверка тоже. Скачал HTTP Analyzer и посмотрел какие данные отправляются POST запросом и куда. Добавил в запрос недостающих данных, и все заработало )

Чистый код: Непонятный закон Деметры

Сейчас читаю книгу ЧИстый код на небольшой главе про закон Деметры. До этого с ним сталкивалась в паттернах от O'reilly (HeadFirst) и там было немного и понятно. После чистого кода - в голове кавардак. Есть пара вопросов:
1) Мартин делит объекты на объекты и структуры данных. Что тут подразумевается под структурой? Struct (в c# к примеру) или в целом объект класса в котором кроме открытых полей (или свойств) нету больше ничего (методов, например)?
2) Из первого вопроса вытекает непонимание того, что подразумевается под гибридом (наполовину объект, наполовина структура данных), который лучше не писать. Считается ли гибридом, например, объект класса "Машина", где можно и цвет ее посмотреть, и колеса даже поменять, и поведение у нее тоже есть?
3) Этот вопрос поднимала на устное обсуждение в другими разрабами (мы не джуны, но и не "крутыши") и также возникло непонимание самой сути этого закона, зачем его соблюдать, что является главной причиной: или база для дальнейших легковносимых изменений, или сокрытие внутренней структуры объекта, или даже легкое предотвращение и обработка NullReferenceException? Все понимают по разному.
4) Нарушается ли закон при разделении методов "плохих" на много маленьких?
Было
public class Class1 { public String DoSmth() { //Вроде как закон нарушен, потому что вызываем метод у вернувшегося значения return MethodClass1().DoSmth(); }
public Class2 MethodClass1() { return new Class2(); } }
public class Class2 { public String DoSmth() { String res2 = this.MethodClass2(); return res2; }
public String MethodClass2() { return "test"; } }
Стало
public class Class1 { public String DoSmth() { //теперь тут вызываются только методы того же класса Class2 res1 = MethodClass1(); return this.MethodClass1_2(res1); }
public Class2 MethodClass1() { return new Class2(); }
public String MethodClass1_2(Class2 val) { return val.DoSmth(); } }
Еще один маленький апдейт: лично у меня сложилось пока такое отношение: это какое-то правило, необходимость явного нарушения которого является индикатором того, что что-то не так спроектировано и можно найти решение, которое будет лучше и по бизнес-логике и по дальнейшему сопровождению.


Ответ

В книге "Программист-прагматик" (Хант, Томас) закон Деметера (такой кривой перевод) сведён к короткому высказыванию:
Минимизируйте связывание между модулями
Пример из книги на C++
class Demeter { private: A* a; int func(); public: void example(B& b); }
void Demeter::example(B& b) { int f = func(); // 1
b.invert(); // 2
a = new A(); a->setActive(); // 3
C c; c.print(); // 4 }
Закон Деметры для функций гласит, что любой метод некоторого объекта может обращаться только к методам принадлежащим:
самим себе любым параметрам, переданным в метод любым создаваемым им объектам любым непосредственно содержащимся объектам компонентов
Исходя из этого можно дать ответ на ваш вопрос №3: уменьшение связанности облегчает модификацию и сопровождение кода, облегчает написание тестов.
На практике это означает, что придётся создавать большое количество методов-оболочек, которые просто направляют запрос далее к делегату. Эти методы-оболочки влекут за собой расходы, ухудшая производительность и занимая память.
Обращая закон Деметры и плотно связывая несколько модулей, можно получить выигрыш в производительности.

В каком случае используется System.Int32 вместо int [дубликат]

На данный вопрос уже ответили: Псевдонимы(алиасы) в перечисления - правила использования (c#) 2 ответа Какая разница между string и String? 4 ответа Куратор сегодня задал вопрос: «В каком случае используется System.Int32 вместо int, System.String вместо string, и так далее при объявлении типа?»
Ведь это одно и тоже, так? Но он сказал, что есть ситуации, когда нужно указывать System.*


Ответ

int является ключевым словом, которое, в свою очередь, является псевдонимом System.Int32. Это высечено в спецификации, поэтому трактовке и изменениям не подлежит. Следовательно, таких ситуаций в языке C# нет.
Всё это относится и к другим «встроенным» типам(string, float, object и т.д).

Хотя это и не относится непосредственно к вопросу, тем не менее, int не получится использовать в выражении nameof — придётся использовать System.Int32. Хотя подобное использование, на мой взгляд, интересно лишь в познавательном ключе и никакого практического применения не имеет.

Не очищается корзина в Ubuntu

При нажатии на кнопку «Очистить корзину» она не очищается. Как починить корзину? ОС — Linux Ubuntu.


Ответ

Для очистки корзины текущего пользователя выполните команду в терминале
sudo rm -rf ~/.local/share/Trash/info/* ~/.local/share/Trash/files/*

Программа “Не видит” dll

Приложение, написанное на C# и dll на C++/CLI. dll-ка подключена к проекту на C# через references. В коде вызываются методы классов объявленных в dll'ке. На моём компе всё работает. На компе коллег так же (у всех примерно одинаковый конфиг: x64 Core i3-i5 Win8.1-10) А на удалённой машине (Atom 1.5 Win7 sp1 x86) пишет
Не удалось загрузить файл или сборку "WinPrint.dll" либо одну из их зависимостей. Не найден указанный модуль
Файл dll лежит в папке с exeшником. В свойствах проекта для данной dll стоит "копировать локально". Все проекты компилируются под x86. VisualStudio 2015
Причём что, запускаю на своём компе regsvr32 и регаю dll-видит, но говорит что неверный формат (что корректно) а на удалённой машине пишет
Не найден указанный модуль
Почему это происходит и как это исправить?


Ответ

Возможные причины:
1) Разная разрядность ОС и конфигурация билда.
2) Зависимости .dll, у меня было нечто подобное, отсутствовала зависимость, но p\invoke .NET-а долбал сообщение об ошибке что не видит подключаемую .dll, а не ее зависимость. Советую на удаленном ПК проверить зависимости нативной .dll утилитой Dependency Walker

Хранение файлов в базе vs хранение в файловой системе

Хотелось бы увидеть + и - различных видов хранения, и когда какой лучше использовать.
С файловыми таблицами, я не работал, но я предполагаю, что там меньше головной боли с файловыми операциями, например файл не может быть блокироваться процессом, наверное есть транзакции(Т.е нельзя убить файл, если вдруг при добавлении его в таблицу, клиент отвалится). Поправьте если я не прав.
UPD: Enttity Framework дружит с файловыми таблицами?


Ответ

В SqlServer вы можете использовать следующие варианты (некоторые из них применимы и к другим СУБД).
Вариант 1
В БД хранится "заголовок" файла (например, путь к файлу плюс, возможно, какой-то набор атрибутов):
create table [TableName] ( ... FilePath nvarchar(4000) not NULL, ... )
а данные хранятся отдельно в файловой системе. Размер БД меньше, чем если хранить в БД также и данные. Но нужно следить за ситуациями "файл есть, заголовка нет" или "заголовок есть, файла нет". На мой взгляд, если файлы являются логически важной частью данных БД (не кэш, не какие-то временные данные), то лучше посмотреть на другие варианты.
Вариант 2
В БД хранится также и содержимое файла (в столбце типа varbinary(max)).
create table [TableName] ( ... FileData varbinary(max) FILESTREAM not NULL, --либо --FileData varbinary(max) not NULL, ... )
Здесь две опции - с FILESTREAM и без.
Без FILESTREAM
данные хранятся в БД (в т.н. LOB pages) размер данных одного элемента ограничен 2Gb
С FILESTREAM
данные хранятся в файловой системе (именно как файлы) нет ограничения в 2Gb на элемент данные FILESTREAM не участвуют при подсчёте лимита на макс. размер БД (к чему чувствительны Express Edition) к данным можно получить доступ через соотв. API со стороны файловой системы (SqlServer 2014 и далее) запрашиваемые данные не отъедают из buffer pool, оставляя больше памяти для обработки запросов
И с FILESTREAM и без поддерживаются транзакции. С FILESTREAM при доступе через Transact-SQL поддержка полная, при доступе через файловую систему есть ограничения (смотреть здесь).
Вариант 3
Использование таблиц специального типа FileTable
create table [FileTableName] as filetable
Их функционал основан на использовании FILESTREAM. Таблица представляет иерархию хранящихся файлов/директорий, их данные и атрибуты. В варианте 2, чтобы создать/удалить файл, нужно создать/удалить соотв. запись в таблице. В данном варианте это можно делать напрямую через файловую систему. Например зайти в соответствующую директорию (SqlServer создаёт для этого соответствующую UNC share), создать какой-то файл/директорию, удалить/изменить, потом сделать запрос select * from FileTableName и увидеть соответствующие изменения. И наоборот - при вставке записи в таблицу через SQL в директории появится соответствующий файл или директория.
Какой вариант когда лучше использовать - думаю, зависит от конкретной задачи. В документации более детальное описание и сравнение вариантов 2 и 3.

Зачем использовать серверный рендеринг React.JS компонентов?

Это для быстроты просто, чтобы пользователь сразу увидел HTML код? Я так понимаю для сервера можно использовать не только NODE.JS но и Java.
Как это будет выглядеть если проект большой? Не будет каши с java, js кода? Кто-то видел большие проекты в такой связке?


Ответ

Это для быстроты просто, чтобы пользователь сразу увидел HTML код?
Да, в основном, это делается для того чтобы сократить время отрисовки начальной старницы. Дело в том, что страницы приложений построенных с использованием React содержат мало HTML и грузят много javascript кода. После загрузки javascript страница, как привило, загружает данные с сервера и после этого, собственно, отрисовывает страницу (Отрисовка, кстати, не самая быстрая операция). Пока javascript не загружен и данные не получены, пользователь будет видеть пустую страницу. С другой стороны, если сервер отдает готовую страницу, то во первых, создается впечатление что страница грузится быстрее, а во вторых, можно сэкономить на одном или нескольких запросах к серверу, так как все необходимые данные уже загружены. Стоить иметь ввиду, что броузер все равно будет грузить javascript, и после загрузки React создаст виртуальный DOM страницы, но поскольку он совпадет с кодом сгенерированной страницы то никаких изменений React делать не будет (не надо перерисовывать страницу). В худшем случае часть страницы может изменится после загрузки обновленных данных, но обычно, это не заметно для польователя.
Есть мнение, что сервер может генерировать страницы быстрее чем браузер но я думаю это зависит от того какой сервер и какой компьютер у пользователя. В любом случае преумуществом генерации страницы на сервере будет возможность кеширования страницы сервером, что позволит отдавать ее практически моментально.
Не будет каши с java, js кода
Нет не будет, хотя добавит немного сложностей. Но тут уж ничего не поделаешь, или быстро или сложно.

Установить дату методом, принимающем день, месяц и год

Перерыл кучи документации и понял, что для работы с датой лучше всего использовать Calendar. Но возник такой вопрос: возможно ли в JAVA задать нужную дату напрямую без лишних преобразований, что-то по типу myDate.set("28.12.2016"); ну или через запятую?
Подскажите, в какую сторону копать либо киньте примеры (именно на установку даты и ее извлечение).
P.S. Пишу консольное приложение, ввод даты осуществляется пользователем вручную.


Ответ

Как я понимаю, нужный тебе метод тут
Calendar calendar = Calendar.getInstance(); calendar.set(2016, 6, 10);
Для отображения даты используйте SimpleDateFormat
Например:
SimpleDateFormat dayFormat = new SimpleDateFormat("EEE, d MMMM", Locale.getDefault()); String myString = dayFormat.format(calendar.getTime());
Задавайте нужный паттерн для вывода даты, в примере выше результат будет "Вс, 12 июня"
А при вводе от пользователя ничто Вам не мешает минусить на единицу введеный месяц.
Комментарий от @zRrr:
SimpleDateFormat умеет разбирать строки с датами, примерно так:
Date date = new SimpleDateFormat( "dd.MM.yyyy" ).parse( "28.12.2016" ); и так лучше разбирать пользовательский ввод, если формат даты в строке известен.

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

Необходимо с помощью Python решить задачу: Есть набор финансовых инструментов (пусть 10 штук). Есть сумма инвестиционного портфеля.
Необходимо найти ВСЕ возможные варианты распределения долей от общей суммы инвестиционного портфеля, приходящихся на каждый инструмент(включая 0%). Общая сумма должна быть = 100%. Шаг задан (пусть 2%). Т.е. значения процентов 0,2,4,6..100%. Пример: [14, 6, 10, 6, 10, 0, 16, 24, 2, 12].
Вариант влоб:
step = 2.0 num_of_tickers = 10 steps = math.floor(100.0 / step) + 1 share_lst = [idx * step for idx in range(0, steps)] comb_all = itertools.product(share_lst, repeat=num_of_tickers) comb_res = list(filter(lambda x: sum(x) == 100.0, comb_all))
Считает ОЧЕНЬ долго.
Пробовал ухищрения, сокращающие набор по условию <=100%:
comb_all = itertools.product(share_lst, repeat=5) comb_all_lst = list(filter(lambda x: sum(x) <= 100.0, comb_all)) for lst in comb_all_lst: for lst_1 in comb_all_lst: if (sum(lst) + sum(lst_1)) == 100.0: comb_res.append(lst + lst_1)
Уже реальнее, но все равно долго.
Как добиться более быстрой скорости работы?
Пример для step = 25.0 и числа инструментов num_of_tickers = 4:
Возможные значения процентной доли:
[0.0, 25.0, 50.0, 75.0, 100.0]
На выходе должна быть таблица распределений вида:
0, 0, 0, 100 0, 0, 25, 75 0, 25, 0, 75 25, 0, 0, 75 25, 0, 25, 50 ... 100, 0, 0, 0


Ответ

Задача сводится к перебору композиций/разложений натурального числа (weak сompositions) для 100 / step целого числа:
#!/usr/bin/env python3 import math
step = 2 n = 100 // step k = 10 # количество инструментов
def binom(n, k): f = math.factorial return f(n) // (f(k) * f(n - k))
print("Количество распределений:", binom(n+k-1, n)) for comp in weak_compositions(k, n): assert len(comp) == k and sum(n*step for n in comp) == 100 print(*[n*step for n in comp])
где weak_composition(k, n) это читаемая реализация из ответа @user3736966 на схожий вопрос на Stack Overflow
def weak_compositions(boxes, balls, parent=tuple()): if boxes > 1: for i in range(balls + 1): yield from weak_compositions(boxes - 1, i, parent + (balls - i,)) else: yield parent + (balls,)
Пример:
>>> print(*[' + '.join(map(str, c)) for c in weak_compositions(3, 5)], sep='
') 5 + 0 + 0 4 + 1 + 0 4 + 0 + 1 3 + 2 + 0 3 + 1 + 1 3 + 0 + 2 2 + 3 + 0 2 + 2 + 1 2 + 1 + 2 2 + 0 + 3 1 + 4 + 0 1 + 3 + 1 1 + 2 + 2 1 + 1 + 3 1 + 0 + 4 0 + 5 + 0 0 + 4 + 1 0 + 3 + 2 0 + 2 + 3 0 + 1 + 4 0 + 0 + 5
Результат для step == 25, number_of_tickets == 4
Количество распределений: 35 100 0 0 0 75 25 0 0 75 0 25 0 75 0 0 25 50 50 0 0 50 25 25 0 50 25 0 25 50 0 50 0 50 0 25 25 50 0 0 50 25 75 0 0 25 50 25 0 25 50 0 25 25 25 50 0 25 25 25 25 25 25 0 50 25 0 75 0 25 0 50 25 25 0 25 50 25 0 0 75 0 100 0 0 0 75 25 0 0 75 0 25 0 50 50 0 0 50 25 25 0 50 0 50 0 25 75 0 0 25 50 25 0 25 25 50 0 25 0 75 0 0 100 0 0 0 75 25 0 0 50 50 0 0 25 75 0 0 0 100
Результат для step == 2, number_of_tickets == 10
Количество распределений: 12565671261 100 0 0 0 0 0 0 0 0 0 98 2 0 0 0 0 0 0 0 0 98 0 2 0 0 0 0 0 0 0 ... 72 2 0 4 16 0 2 0 2 2 72 2 0 4 16 0 2 0 0 4 72 2 0 4 16 0 0 6 0 0 ...
Связанные вопросы:
Next Composition of n into k parts - does anyone have a working algorithm? Efficient lazy weak compositions

Разница использования библиотек поддержки?

При чтении статей сталкиваюсь с тем, что пишут нужно подключить такую или такую библиотеку поддержки. Я немного почитал, чтоб постараться от сего зависит какую библиотеку нужно подключать.
Я так понял, что в зависимости для какого апи пишешь то такую библиотеку и нужно использовать.
Я открыл один из своих проектов и в градле заметил, что у меня бывает даже есть 2 библиотеки разных версий. Допустим так
android.support.v4 android.support.v13
Я так понимаю, что
android.support.v4
Можно вовсе удалить так как
android.support.v13
должна включать в себя все из предыдущей библиотеки, верно я понял?


Ответ

К сожалению все неправильно.
Во первых, версией библиотеки считается трехзначный номер в конце (как 24.3.0), а не число, что идет после v. в названии библиотеки. Эти числа - это до какого минимального API эта библиотека поддержки собственно оказывает поддержку. Так, v.4 значит, что библиотека поддержки будет работать на устройствах с API4 и выше.
Использовать нужно версию библиотеки не менее чем minSDKversion проекта и равную или более, чем compileSDKversion (targetSDKversion) а крайне желательно - последнюю стабильную (сейчас это 24.3.0), так как с каждой новой версией вносятся фиксы в существующие классы и дополняются новые классы или методы. При этом смотреть соответствие API нужно по мажорному номеру библиотеки (здесь 24.3.0 - для compileSDKversion API24).
Ознакомиться с изменениями, вносимыми в библиотеки поддержки с каждой новой ревизией можно на официальном сайте разработчика Android - здесь указано, какие именно изменения и дополнения были внесены с каждой ревизией и в какие именно из библиотек поддержки (так в ревизии 24.3.0 были внесены изменения в библиотеки v4, v7 (в подбиблиотеки AppCompat, MediaRouter, Preferences, RecyclerView) , Design
библиотеки support.v4 , support.v7 и тд - это разные библиотеки, с различными классами поддержки и выполняемыми функциями и они не взаимозаменяют друг друга по принципу большей версии. С полным списком библиотек поддержки Google и их назначением и функциями вы можете ознакомиться на все том же официальном сайте разработчика Android.
Например, библиотека com.android.support:support-v4:24.3.0 - библиотека поддержки с минимальным API, на котором она работает API4 и версией самой библиотеки - 24.3.0. Список классов и функций этой библиотеки можно посмотреть здесь. Как видите, это совсем не то же, что библиотека com.android.support:support-v7, в которую входит вообще несколько отдельных библиотек, как ApppCompat, CardView и тд.
PS: никакой библиотеки support.v21 у Google не наблюдается ..

Построить график c#

Добрый день, подскажите пожалуйста, как построить график многочлена : сам многочлен p(x)=An*X^n + An-1*X^n-1+...+A1X+A0
int[] array= new int[10]; int i, num, power; float x;
num=4; x=1;
array[0] = 3; array[1] = -5; array[2] = 6; array[3] = 8; array[4] = -9;
power = num;
double k = 0;
for (i = 0; i <= num; i++) { k += Math.Pow(x, power--) * array[i]; // richTextBox1.AppendText(Convert.ToString(k) +"
");
}
как щас построить график ?


Ответ

Для начала вам будет достаточно стандартного класса Chart, хотя есть и сторонние компоненты для построения красивых графиков, но мне кажется, что сначала лучше разобраться со стандартным контролом. В документации на MSDN есть довольно подробный Tutorial. Основные моменты покажу в коде, подробности в официальной документации.
class ChartForm : Form { public ChartForm() { //создаем элемент Chart Chart myChart = new Chart(); //кладем его на форму и растягиваем на все окно. myChart.Parent = this; myChart.Dock = DockStyle.Fill; //добавляем в Chart область для рисования графиков, их может быть //много, поэтому даем ей имя. myChart.ChartAreas.Add(new ChartArea("Math functions")); //Создаем и настраиваем набор точек для рисования графика, в том //не забыв указать имя области на которой хотим отобразить этот //набор точек. Series mySeriesOfPoint = new Series("Sinus"); mySeriesOfPoint.ChartType = SeriesChartType.Line; mySeriesOfPoint.ChartArea = "Math functions"; for (double x = -Math.PI; x <= Math.PI; x += Math.PI / 10.0) { mySeriesOfPoint.Points.AddXY(x, Math.Sin(x)); } //Добавляем созданный набор точек в Chart myChart.Series.Add(mySeriesOfPoint); } }
Вот собственно минимум кода для рисования графика на форме. Здесь не приведены ни настройки осей координат и сетки, ни другие графические рюшечки которые поддерживает данный контрол, т.к. примеры применения практически всех возможностей этого контрола есть в официальной документации, ссылка выше.
Дополнение:
Вам нужно вычисление многочлена вынести в отдельную функцию. Это можно сделать например так
double Polynom(double x, double[] coefficients) { double y = 0.0; double currentX = 1.0; for(int i = 0; iИ подставить ее вместо Math.Sin в моем примере.

Google Places API for Android

Всем добра! Ребята, нужна ваша помощь.
Как правильно сгенерировать BROWSER_API_KEY_FOR_PLACES для Google Places API for Android?
Что нужно выбрать? для https://maps.googleapis.com/maps/api/place/details/json?, https://maps.googleapis.com/maps/api/place/nearbysearch/json?
Update: Разобрался.


Ответ

Практически во всех туториалах пишут следующее:
We can create API key for Google Place API by clicking “Create new Browser key” available at the “API Access” pane of the Google console. Also ensure that, “Places API” is enabled in the “Services” pane of the Google console.
Коварная строка Create new Browser key, которая заставила меня помучиться.
Так вот "Что нужно выбрать? для https://maps.googleapis.com/maps/api/place/details/json?, https://maps.googleapis.com/maps/api/place/nearbysearch/json?"
Во-первых нам пригодится следующее из подключенных API:

Тут же мы можем увидеть запросы, которые прошли или не прошли (как доказательство тому, что ключ используется нужный):
И еще, чтобы проверить правильный ли ключ используется, пробейте запрос в браузере: https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=32.1145134,34.8269532&radius=5000&types=parknig&sensor=true&key=AIzaSyDqqAdbsJwVT8LbjY0sGFXeiJBwCiUFV70
Только ключ поменяйте на свой)
Во-вторых создавать нужно !Ключ для сервера!, а не для браузера:

Туториал, который я использовал староват, но рабочий (в плане кода - инфа 100), а из библиотек достаточно таки будет подключить compile 'com.google.android.gms:play-services-maps:...'
P.S. Надеюсь ответ кому-нить пригодится:)

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

Доброго времени суток. Есть массив:
Array ( [34612] => Array ( [ID] => 34612 [NAME] => Бело-зеленый [SORT] => 500 )
[34615] => Array ( [ID] => 34615 [NAME] => Бело-красно-серый [SORT] => 500 )
[155] => Array ( [ID] => 155 [NAME] => Бело-красно-синий [SORT] => 500 )
[161] => Array ( [ID] => 161 [NAME] => Бело-красно-черный [SORT] => 500 ) )
И есть ключи 155 161 они означают, что вот эти элементы массива должны остаться, все остальные удалить нужно. Как это правильно организовать?


Ответ

Пусть $array - ваш массив.
Для данного случая самое простое:
unset($array[34612]); unset($array[34615]);
Но лучше универсальный вариант, когда вы легко сможете поменять разрешенные ключи, а неразрешенные ключи заранее не известны (их, например, слишком много):
$allowed = [155, 161]; //разрешенные ключи $filtered = array_filter( $array, function ($key) use ($allowed) { return in_array($key, $allowed); }, ARRAY_FILTER_USE_KEY ); //теперь в массиве $filtered только элементы с разрешенными ключами
Но флаг ARRAY_FILTER_USE_KEY был добавлен в PHP версии 5.6. Если вы применяете более раннюю версию, то можете использовать менее гибкий, но даже более удобный вариант:
$filtered = array_intersect_key($array, array_flip($allowed));

SQL ORDER BY подскажите как отсортировать по нескольким условиям

Доброго времени суток
подскажите как отсортировать по нескольким условиям (SQL ORDER BY )
допустим таблица
A(row_num) B(аттрибут),C(name)
нужна, сортировка по алфавиту по столбцу 'С'(имени), но так чтобы чтобы первыми были записи те, где B = null(а может не только null, а какой либо еще параметр должен быть приоритетным)
база postgresql
условно должно выйти:
1 null Петя --идет раньше Андрея т.к. null 2 33 Андрей 3 20 Петр 4 454 Яна


Ответ

select * from table order by case when attr is null then 0 else 1 end, name

В Vim не отображается название текущего режима

При работе в Vim (на xubuntu 16.04 LTS) в левом нижнем углу не отображается в каком режиме происходит работа. Например, при нажатии "i" vim переходит в режим вставки, но внизу не написано: "--ВСТАВКА--".
Программа vim (по крайней мере запускаю её такой командой), установил с помощью apt-get install vim
$ vim --version VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Apr 08 2016 11:38:28) Заплатки: 1-1689 С изменениями, внесёнными pkg-vim-maintainers@lists.alioth.debian.org Скомпилирован pkg-vim-maintainers@lists.alioth.debian.org Огромная версия без графического интерфейса. Включённые (+) и отключённые (-) особенности: +acl +farsi +mouse_netterm +tag_binary +arabic +file_in_path +mouse_sgr +tag_old_static +autocmd +find_in_path -mouse_sysmouse -tag_any_white -balloon_eval +float +mouse_urxvt -tcl -browse +folding +mouse_xterm +terminfo ++builtin_terms -footer +multi_byte +termresponse +byte_offset +fork() +multi_lang +textobjects +channel +gettext -mzscheme +timers +cindent -hangul_input +netbeans_intg +title -clientserver +iconv +packages -toolbar -clipboard +insert_expand +path_extra +user_commands +cmdline_compl +job -perl +vertsplit +cmdline_hist +jumplist +persistent_undo +virtualedit +cmdline_info +keymap +postscript +visual +comments +langmap +printer +visualextra +conceal +libcall +profile +viminfo +cryptv +linebreak -python +vreplace +cscope +lispindent -python3 +wildignore +cursorbind +listcmds +quickfix +wildmenu +cursorshape +localmap +reltime +windows +dialog_con -lua +rightleft +writebackup +diff +menu -ruby -X11 +digraphs +mksession +scrollbind -xfontset -dnd +modify_fname +signs -xim -ebcdic +mouse +smartindent -xsmp +emacs_tags -mouseshape +startuptime -xterm_clipboard +eval +mouse_dec +statusline -xterm_save +ex_extra +mouse_gpm -sun_workshop -xpm +extra_search -mouse_jsbterm +syntax общесистемный файл vimrc: "$VIM/vimrc" пользовательский файл vimrc: "$HOME/.vimrc" второй пользовательский файл vimrc: "~/.vim/vimrc" пользовательский файл exrc: "$HOME/.exrc" значение $VIM по умолчанию: "/usr/share/vim" Параметры компиляции: gcc -c -I. -Iproto -DHAVE_CONFIG_H -Wdate-time -g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1 Сборка: gcc -Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -o vim -lm -ltinfo -lnsl -lselinux -lacl -lattr -lgpm -ldl


Ответ

Предыдущий ответ ot @Yaroslav правильный:
:set showmode
Если он не помог, значит с цветом строки состояния что-то не так - или белым-по-белому, или черным-по-черному. Попробуйте временно установить цветовую схему по-умолчанию:
:colorscheme default

Перегрузка методов в C# с помощью ref

Ни как не могу понять в книге написано, что перегрузка методов невозможно с помощь ref

Хотя у меня это получилось
Another an = new Another(); int a = 0;
an.SomeMethod(a); an.SomeMethod(ref a);
class Another { public void SomeMethod(int a) { a = 1; } public void SomeMethod(ref int a) { a = 1; } }
Может быть что то не так понял ?


Ответ

Возможно, это не самый хороший перевод. Запрещена на самом деле вот такая ситуация:
class Another { public void SomeMethod(out int a) { a = 1; }
public void SomeMethod(ref int a) { a = 1; } }
Это производит ошибку CS0063
Cannot define overloaded methods that differ only on ref and out.

Причина состоит в том, что на уровне CLR out не существует, и кодируется как ref. Поэтому если бы это было разрешено, с точки зрения CLR это были бы две одинаковые сигнатуры. Отличие out от ref (то есть, то, что out-параметр обязательно должен быть инициализирован внутри метода) — внутреннее правило C#, CLR это не проверяет.

getResources().getColor() is deprecated

Почему выводит ошибку getResources().getColor() is deprecated при попытке изменить цвет фона?


Ответ

Это не ошибка, но предупреждение об устаревании метода. Т.е. он будет работать, но, однажды, может перестать. Теперь надо пользоваться методом ContextCompat#getColor(Context context, int color) вот так
ContextCompat.getColor(context, R.color.your_color);
Если заглянуть в исходники сего метода, то можно увидеть как он работает:
public static final int getColor(Context context, int id) { final int version = Build.VERSION.SDK_INT; if (version >= 23) { return ContextCompatApi23.getColor(context, id); } else { return context.getResources().getColor(id); } }

Как обрезать текст до последнего пробела?

Подскажите, как модифицировать код, чтобы обрезать текст на 180 символов до последнего пробела
introtext, 0, 180).'...'; ?>


Ответ

Попробуйте моё решение:
if(mb_strlen($text, "UTF-8") > $max_lengh) { $text_cut = mb_substr($text, 0, $max_lengh, "UTF-8"); $text_explode = explode(" ", $text_cut);
unset($text_explode[count($text_explode) - 1]);
$text_implode = implode(" ", $text_explode);
echo $text_implode."..."; } else { echo $text; } ?>