Страницы

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

пятница, 6 марта 2020 г.

WPF, DataGrid. Растягивание колонок при появлении свободного места

#c_sharp #wpf #xaml #datagrid


В окне есть DataGrid, при нехватке места для отображения данных появляется скрол,
но если места становится больше чем необходимо появляется пустой столбец. Необходимо
сделать так, чтобы при нехватке места появлялся скрол, но при появлении свободного
места столбцы равномерно растягивались на всю доступную таблице ширину.
Текущий код таблицы:




Вид при нехватке места:


Вид при избытке места:

    


Ответы

Ответ 1



Установите свойство ColumnWidth в *. Это приведет к равномерному растягиванию всех столбцов таблицы. Также в сочетании с этим свойством можете установить каким-то столбцам свою ширину. столбцы 2 и 3 поделят между собой всю свободную ширину, тем самым не будет видно "пустого столбца". UDP: Если таблица имеет фиксированную ширину то, для появления горизонтального скрола, можно сделать так:

cannot access class IDEA

#intellij_idea #access #java


Здравствуйте все, такая есть проблема:

IntelliJ IDEA подсвечивает красным (cannot access) this поле в конструкторе, в то
время, как при компиляции все работает нормально.

Переустанавливал IDEA, JDK, OS, все бестолку. Уже руки опускаются.
Ссылка на скриншот.

Настройки стандартные, IDE тоже. Раньше такого не было.
    


Ответы

Ответ 1



Попробуйте сделать "Invalidate caches" в IDEA.

Как правильно задать тег meta og:image?

#html #css #html5


Подскажите как правильно прописать свойства на тег:
У меня лого 1200*1200, а в facebook 1200x630


      style="max-width:auto;
             height:50% ;">


Правильно ли я прописал? мне нужно чтоб картинка 1200 на 1200 разместилась на 1200x630
    


Ответы

Ответ 1



Любые css для meta неприменимы в принципе, как и для других элементов внутри head. Подготовьте превью для соц.сетей программно.

Проблемы с кодировкой на ideone

#cpp #кодировка #ideone


Как известно, ideone компилирует исходники на Си++ в utf8. Однако, мне нужна строка
в utf16 (wstring). Попытался сконвертировать, но получилось что-то не то (причём конвертация
из wstring в utf8 работает верно):

wstring_convert < codecvt_utf8_utf16 , wchar_t> convert;

const char *s = "еёЁжикЕст";
wstring str = convert.from_bytes(s);

for (int q=0; s[q]; ++q) cout << (int)s[q] << ' ';
cout << endl;
for (int q=0; q "%" + (x & 255).toString(16)).join("")
)

console.log(s)
console.log(s.split("").map(ch => ch.charCodeAt(0)).join(" "))




К тому же, если сделать 

wchar_t bin[] = {1077, 1105, 1025, 1078, 1080, 1082, 1045, 1089, 1090, 0};
str = bin;
cout << convert.to_bytes(str.c_str()) << endl;


то вывод верный.

Код полностью: http://ideone.com/ut7Nsg
    


Ответы

Ответ 1



Однако, мне нужна строка в utf16 (wstring). Это неверно, кодировка std::wstring в стандарте не указана, на Windwows/MSVC sizeof(wchar_t) 2, и там кодировка utf-16, на Linux/gcc sizeof(wchar_t) 4 и кодировка utf-32, ideone использует gcc, отсюда очевидные проблемы, переносимый способ получить код в utf-16 (c++11): #include #include #include #include int main() { std::wstring_convert < std::codecvt_utf8_utf16, char16_t> convert; const char *s = "еёЁжикЕст"; std::cout << "Input: " << s << "\n"; std::u16string str = convert.from_bytes(s); for (int q=0; s[q]; ++q) std::cout << (int)s[q] << ' '; std::cout << '\n'; for (int q=0; q

Как получить иконку папки?

#c_sharp


Как получить иконку папки?

Например

Control Panel

Shell:::{5399E694-6CE5-4D6C-8FCE-1D8870FDCBA0}

    


Ответы

Ответ 1



Проще всего использовать Windows API Code Pack, чтобы не возиться с interop'ом и COM-объектами. Если у вас Visual Studio версии до 2017, вам нужно будет вручную подключить nuget-пакет Windows API Code Pack - Shell. (2017-ая студия найдёт и предложит подключить пакет сама, увидев незнакомый тип.) Подключив пакет, мы сможем работать с типами ShellObject или ShellFolder. Для того, чтобы получить сам каталог, нам нужно написать, например, (ShellFolder)ShellObject.FromParsingName("shell:::{4234d49b-0245-4df3-b780-3893943456e1}"); ShellFolder является списком своих подобъектов, поэтому перечислить подобъекты можно просто так: var sf = (ShellFolder)ShellObject.FromParsingName( "shell:::{4234d49b-0245-4df3-b780-3893943456e1}"); Console.WriteLine(sf.Name); foreach (var item in sf) { Console.WriteLine(item.Name); ShellThumbnail t = item.Thumbnail; } Иконка подкаталога содержится в объекте ShellThumbnail. Сам объект содержит иконки в различных форматах (icon, WPF System.Windows.Media.Imaging.BitmapSource и WinForms System.Drawing.Bitmap) и различных размерах. Для отображения нам понадобится графическое приложение. Я воспользуюсь более простым WPF. public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); DataContext = ShellObject.FromParsingName( "shell:::{4234d49b-0245-4df3-b780-3893943456e1}"); } } Результат:

Исключение по адресу в программе на ассемблере

#ассемблер #исключения


Мне нужно написать программу на ассемблере х64 в VS 2017, Windows 10.
Нужно ввести в окошко строку, а программа должна заменить * на пробелы и вывести
в строку результат.

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

Не знаете, в чем проблема? Сама она тоже не знает. Код ниже. 
Заранее спасибо.

ExitProcess PROTO 
DlgProc PROTO :QWORD,:QWORD, :QWORD, :QWORD
PostQuitMessage PROTO
GetModuleHandleA PROTO
DialogBoxParamA PROTO
GetDlgItemTextA PROTO
SendDlgItemMessageA PROTO

include windows.inc

.data
DName db "dial",0
hinst dq ?
result_buffer db 20 dup ("0")

hwnd dq 0
uMsg dq 0
wParam dq 0
lParam dq 0

.code
main proc
 sub rsp, 56

 mov rcx,0
 call GetModuleHandleA 
 mov hinst,rax

 mov rcx,hinst
 lea rdx, DName
 mov r8,0
 lea r9,DlgProc
 mov     dword ptr [rsp+32], 0
 call DialogBoxParamA
 mov rcx,0
 call ExitProcess 
 main endp

DlgProc proc q:QWORD,w:QWORD, e:QWORD, r:QWORD
  cmp edx, WM_CLOSE ;10h   
  je Exit_Button

  cmp edx, WM_COMMAND   ;111h   
  je go_button
  jne End_it 

 go_button:
 cmp r8,4
 je Exit_Button
 cmp r8,3
 je next
 jne End_it

 next:
    mov hwnd,rcx
    mov uMsg,rdx
    mov wParam,r8
    mov lParam,r9

    mov rdx,1
    lea r8,result_buffer
    mov r9,20
    call GetDlgItemTextA

    mov rcx,  hwnd
    mov rdx,  uMsg
    mov r8,   wParam
    mov r9,   lParam

        mov hwnd,rcx

    mov rcx,rax
    lea rsi,result_buffer
    m1:
     cmp byte ptr [rsi],'*'
     je m2
     jne m3
     m2:
      mov byte ptr [rsi],' '
     m3:
      inc rsi
     loop m1    

        mov rcx,hwnd

    mov rdx,2
    mov r8,LB_DELETESTRING  ;  182h - LB_DELETESTRING
    mov r9,0
    lea rsi,result_buffer
    mov qword ptr [rsp+32],rsi 
    call SendDlgItemMessageA

        mov rcx,  hwnd
        mov rdx,  uMsg
        mov r8,   wParam
        mov r9,   lParam

    mov rdx,2
    mov r8,LB_ADDSTRING  ;  182h - LB_DELETESTRING
    mov r9,0
    lea rsi,result_buffer
    mov qword ptr [rsp+32],rsi 
    call SendDlgItemMessageA
    jmp End_it

Exit_Button:
    mov rcx,0
    call PostQuitMessage

End_it:    
    mov rax,0
    ret
DlgProc endp 
end


Файл RSRC.RC

dial DIALOG 0, 0, 309, 95
CAPTION "mY dialog"
BEGIN
    EDITTEXT 1, 48,7,222,14
    ListBox 2,48,24,222,14
    PUSHBUTTON "Run", 3, 167,41,50,14  
    PUSHBUTTON "Exit",4, 220,41,50,12
    LTEXT "Input string:", -1, 7,10,40,8    
END 


Ошибка в отладчике:


    


Ответы

Ответ 1



В коде две проблемы, приводящих к вылетам: Не проверяется что введена пустая строка (значение, возвращенное из GetDlgItemTextA, равно нулю), из-за чего при первом попадании на инструкцию loop 0 в регистре rcx превращается в -1, получаем "бесконечный" цикл и попытку записи за пределы секции данных. В начале процедуры DlgProc нужно выделить на стеке место под параметры процедуры SendDlgItemMessageA, при выходе из DlgProc стек восстановить. Из-за того что это не выполнено, скорее всего при выполнении SendDlgItemMessageA (которое происходит только при нажатии кнопки "Run") происходит затирание каких-то данных вызывающего кода, при выходе из процедуры происходит вылет. Вот рабочий код, адаптированный под fasm, с моими замечаниями: include 'win64a.inc' format MS64 COFF public main extrn PostQuitMessage extrn SendDlgItemMessageA extrn GetModuleHandleA extrn GetDlgItemTextA extrn DialogBoxParamA extrn ExitProcess section '.data' readable writeable DName db "dial",0 result_buffer db 20 dup ("0") section '.code' code readable executable main: sub rsp, 5*8 ; место под 5 параметров для вызова DialogBoxParamA mov rcx,0 call GetModuleHandleA mov rcx, rax ; [hinst] mov rdx, DName mov r8, 0 mov r9, DlgProc mov dword [rsp+32], 0 call DialogBoxParamA mov rcx,0 call ExitProcess proc DlgProc hwnd, uMsg, wParam, lParam ; место под параметры на стеке выделено как раз для того, ; чтобы можно было сохранить там значения тех же параметров из регистров mov [hwnd], rcx mov [uMsg], rdx mov [wParam], r8 mov [lParam], r9 sub rsp, 5*8 ; резервируем на стеке место под 5 параметров для вызова SendDlgItemMessageA cmp edx, WM_CLOSE ; 10h je Exit_Button cmp edx, WM_COMMAND ; 111h je go_button jne End_it go_button: cmp r8,4 je Exit_Button cmp r8,3 ; je next ; лишняя проверка jne End_it ; next: mov rdx,1 mov r8, result_buffer mov r9,20 call GetDlgItemTextA ; Не нужно постоянно гонять параметры между памятью и регистрами ; mov rcx, hwnd ; mov rdx, uMsg ; mov r8, wParam ; mov r9, lParam ; mov hwnd,rcx test rax, rax ; не забываем проверить, что введена не пустая строка jz End_it mov rcx, rax mov rsi, result_buffer m1: cmp byte [rsi], '*' ; je m2 ; лишняя проверка jne m3 ; m2: mov byte [rsi], '+' ; заменяю на +, чтобы была заметнее разница m3: inc rsi loop m1 mov rcx, [hwnd] mov rdx, 2 ; ListBox mov r8, LB_DELETESTRING ; 182h - LB_DELETESTRING mov r9, 0 mov qword [rsp+32], result_buffer ; mov qword ptr [rsp+32], offset result_buffer для masm call SendDlgItemMessageA ; mov rcx, hwnd ; mov rdx, uMsg ; mov r8, wParam ; mov r9, lParam mov rcx, [hwnd] mov rdx,2 mov r8, LB_ADDSTRING mov r9,0 mov qword [rsp+32], result_buffer call SendDlgItemMessageA jmp End_it Exit_Button: mov rcx,0 call PostQuitMessage End_it: mov rax,0 add rsp, 5*8 ; восстанавливаем стек ret endp Для компиляции нужен fasm, а также GoRC и GoLink (см. The Go tools for Windows + Assembler, к языку Go не имеют никакого отношения). Для отладки использовал x64dbg. Собственно, компиляция: fasm dialog.asm gorc /machine X64 rsrc.rc golink dialog.obj rsrc.res user32.dll kernel32.dll /entry main Ну и наконец скриншот (состояние после ввода текста и нажатия на кнопку Run): P.S. "криво расставленные котлы" авторские, rsrc.rc я в неизмененном виде взял из вопроса.

Атрибут __next__ не переопределяется

#python #python_3x #генераторы #динамическая_типизация


У меня есть класс в котором я переопределяю метод __next __ после его первого вызова,
но проблема в том что работать продолжает старый __next __.

class I:
    def __init__(self, head):
        self.head = iter(head)

    def __iter__(self):
        return self

    def __next__(self):
        self.__next__ = self.head.__next__
        return 'a'


i = I((1, 2, 3))
i_it = iter(i)
print(next(i_it)) #выводит 'a'. Все ок
print(next(i_it)) #снова 'a'. Почему не 1?
print(i_it.__next__) #
вроде __next__ переопределен 


P.S Если переопределять что-то другое то все работает:

    def __next__(self):
        self.__next__ = self.head.__next__
        self.x = 1
        return 'a'


После вызова next(self) x будет 1.
Ссылка на онлайн компилятор: https://repl.it/HVOC/17

P.P.S: В коментариях говорят что если вызывать i_it.__next __() то все будет работать
так как надо, я это знаю, но штука в том что в любом итераторе(цикл for например) работает
next(self), а не self.__next __().
    


Ответы

Ответ 1



На сколько я понимаю, в cpython встроенная функция next() определяется тут: builtin_next(). Можно увидеть, что при вызове имеется следующая конструкция: res = (*it->ob_type->tp_iternext)(it); Полагаю, что она равносильна примерно такой конструкции на Python: next(i) --> i.__class__.__next__(i) что сходится с тем, что видно на практике. Как дела происходят в других интерпретаторах мне не известно.

Ответ 2



Сначала i_it.__next__ = i.__next__. Затем i.__next__ = self.head.__next__ Но i_it.__next__ остался прежним, тк его не меняли. Те __next__ был изменен только для объекта класса i, но не для итератора i_it

Несколько вопросов по ASP.MVC и AJAX

#ajax #aspnet_mvc


Я только разбираюсь в ASP.MVC и может быть задаю глупые вопросы.
В данном случае вопросы будут не "как сделать", а "почему так происходит".
Делаю проект, суть которого заключается в том, что он обходит сайт, собирает ссылки
на его страницы и  измеряет время отклика. Потом, собранную информацию выводит в табличном
виде (пока).
Проект состоит из двух страниц. На первой - в соответствующем инпуте водится поле
и по нажатию кнопки идет переход на другой контроллер (ToolController), который  производит
замеры и выводит результаты.

Код метода первого контроллера (HomeController):

public ActionResult Submit(string Url)
{
    if (CheckUrl(Url))
    {
        ViewBag.Error = "";
        return RedirectToAction("Index", "Tool", new { Url });
    }
    else
    {
        ViewBag.Error = "Некорректный адрес!"; 
        return RedirectToAction("Index");
    }

}


Валидацию пока можно не смотреть, это буду отдельно разбираться.

Представление (фрагмент):

 @using (Html.BeginForm("Submit", "Home", FormMethod.Post))
{
    
@Html.Label("Введите адрес сайта в поле ввода и нажмите кнопку")
@Html.TextBox("Url") @ViewBag.Error
} Во ToolController есть поле private поле класса VMManager, методы которого реализуют бизнес-логику. В классе VMManager есть поле вью-модели (VM), потому что все дальнейшие действия будут крутиться вокруг один раз построенной VM (сохранение в БД - пока не реализовано). Представление выводит таблицу, состоящую из ссылок на страницы сайта (Ajax.ActionLink), по нажатию на которые должно подгружаться partialView с графическим представлением информации. До графического представления мне пока далеко, пока разобраться бы что в табличном происходит. Фрагмент контроллера (ToolController): private static VMManager manager = new VMManager(); public ToolController() { // manager = new VMManager(); } // GET: Tool public ActionResult Index(string url) { // manager = new VMManager(); manager.VM = (SiteVM)manager.GetVM(url); return View(manager.VM); } public ActionResult ShowPageResultInChart(string pattern) { if (pattern == "test") return null; Thread.Sleep(1000); return PartialView("ShowPageResultInChart"); } Фрагмент представления: @Html.Action("ShowPageResultInChart", new { pattern ="test" }) @foreach (var item in Model.PageResults) { @Ajax.ActionLink(item.PageAddress, "ShowPageResultInChart", new {pattern= item.PageAddress }, new AjaxOptions { UpdateTargetId = "ChartData", LoadingElementId = "LoadingIndicator" } ) @item.MinTime @item.AverageTime @item.MaxTime } В частичном представлении пока смотреть нечего: строчка "Сработал Ajax" Теперь вопросы: Если верить отладчику, то при первичной загрузке основной страницы запускается метод ShowPageResultInChart. Хотя он предполагался к запуску только при нажатии на Ajax.ActionLink. Почему, что я сделал не так? От этой беды я избавился условием в методе ShowPageResultInChart, но почему он срабатывает? Я правильно понимаю, что это противоречит смыслу Ajax? Разместить его ниже таблицы я не могу по условиям задания. Причем у меня сложилось впечатление, что запускается он как минимум 2 раза, но может я ошибаюсь. Судя по всему, у меня запускается несколько экземпляров второго контроллера. Это я понял по тому, что VM в процессе обнуляется и при нажатии на Ajax.ActionLink на входе метода ShowPageResultInChart VM = null. Такое впечатление, что первый экземпляр создается при выводе таблицы, второй - при нажатии на Ajax.ActionLink. От этой беды я избавился сделав поле менеджера статическим, но почему так происходит?


Ответы

Ответ 1



1) ShowPageResultInChart вы вызываете не только с помощью @Ajax.ActionLink, а также с помощью @Html.Action, отсюда он и выполняется при загрузке страницы. @Html.Action("ShowPageResultInChart", new { pattern ="test" }) 2) При каждом запросе создается отдельный экземпляр класса Controller через ControllerFactory. Обратите внимание, что Html.Action Html Helper создаст другой экземпляр контроллера. В общем, ControllerActivator.Create вызывается (для каждого запроса), чтобы создать контроллер (который создает новый контроллера или через DependencyResolver или через Activator, если не Resolver не был установлен): public IController Create(RequestContext requestContext, Type controllerType) { try { return (IController) (_resolverThunk().GetService(controllerType) ? ? Activator.CreateInstance(controllerType)); }

Как сделать не закрывающуюся программу на Java SE?

#java


Нужно сделать что бы программа после запуска ожидала команд и после того как команда
отработала она продолжала их ждать.
    


Ответы

Ответ 1



Сделай обработку в цикле while(true) или напиши прогу с UI. Можешь запускать задачу в новом потоке и ждать от пользователя ввода символа.

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

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


//hashtable.h
#pragma once
#include 
#include 
#include 
using namespace std;

template
class hashtable
{
private:
    map *table;
public:
    hashtable(kType k, vType v);
    ~hashtable();
};




//hashtable.cpp
#include "hashtable.h"

template
hashtable::hashtable() 
{
    // ??? Compiler Error C2955 ('hashtable': use of class template requires template
argument list)
}


Could you tell me what is wrong there?

Возможно ли вообще и если да, то как записать map в качестве поля класса?
Так чтобы можно было написать hashtable  и получался ассоциативный массив
с ключем в виде char* и параметром int, но чтобы была возможность задать и другие типы? 

по ТЗ, использовать map надо обязательно
    


Ответы

Ответ 1



Ваша функция должна быть определена как template hashtable::hashtable(kType k, vType v) ^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^ чтобы соответствовало объявлению в классе

json.net Как сериализовать такой объект?

#c_sharp #jsonnet


json.net обычно сериализует словарь в коллекцию:

{"a":{"b":{"c":"d"}}}


Вот так:

class A
{
    public Dictionary a{get; set;}
}

class C
{
    public string c{get; set;}
}

class Program
{
    public static void Main(string[] args)
    {
        A a = new A();
        a.a = new Dictionary();
        C c = new C();
        c.c = "d";
        a.a.Add("b", c);

        string json = JsonConvert.SerializeObject(a);
        Console.WriteLine(json);

        Console.Write("Press any key to continue . . . ");
        Console.ReadKey(true);
    }
}


Но я хочу сериализовать словарь в массив:

{"a":["b":{"c":"d"}]}


Есть ли простой способ сделать это?
    


Ответы

Ответ 1



Ответ на ваш вопрос "Есть ли простой способ сделать это?" - нет. Нет никаких легальных способов сделать это. Все потому что требуемый вами формат невалиден. Вы можете только это сделать вручную, но вопрос уже будет в другом - надо ли вам это? Ведь никакой JSON парсер не сможет распарсить невалидную JSON-строку... P.S проверить валидность JSON-строки можно на https://jsonlint.com/.

Использование вначале переменных при вызове программы

#python #bash


Не знаю переменные ли это или нет, но что это такое и как прочитать их в программе?

$ FOO=1 BAR=2 python3 ./make.py


Что за FOO и BAR?

P.S. Python
    


Ответы

Ответ 1



$ FOO=1 BAR=2 python3 ./make.py такой синтаксис используется в posix-совместимых оболочках для присвоения значений переменным окружения. обратиться к переменным окружения внутри скрипта, написанного на python, можно с помощью os.environ: import os print os.environ['FOO'] print os.environ['BAR']

Ответ 2



Команда python --help выводит usage: python [option] ... [-c cmd | -m mod | file | -] [arg] ... попробуйте аргументы добавить после файла python3 ./make.py FOO=1 BAR=2 Посмотрите сам скрипт, там есть парсинг аргументов? Выложите код make.py например сюда можно будет посмотреть есть ли там аргументы и как они названы

Помогите инициализировать TextView

#android #textview #android_textview


Итак, есть layout, содержащий 2 объекта — RecycledView и TextView. RecyclerView работает
через адаптер, который передаёт значение в TextView. Выглядит это так. Фрагмент, содержащий
TextView:

public class FragmentCharts extends Fragment {

//объявляем TextView
TextView chartDetailsHeader;

public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_charts, container, false);

    RecyclerView rationsChart = (RecyclerView) view.findViewById(R.id.rations_chart);
    rationsChart.setHasFixedSize(true);

    LinearLayoutManager rationsChartLayoutManager = new LinearLayoutManager(
            getContext(),
            LinearLayoutManager.HORIZONTAL,
            true);
    rationsChart.setLayoutManager(rationsChartLayoutManager);

    ChartAdapter chartAdapter = new ChartAdapter();
    rationsChart.setAdapter(chartAdapter);

    //инициализируем TextView
    chartDetailsHeader = (TextView) view.findViewById(R.id.chart_details_heading);
    chartDetailsHeader.setTypeface(CommonSettings.getRobotoCondLight());
    return view;
}

//метод для изменения значения TextView
public void setChartHeader(Date date) {
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM", Locale.US);
    String s = dateFormat.format(date);
    chartDetailsHeader.setText(s);
}
}


Изменение TextView происходит отправкой метода из адаптера:

new FragmentCharts().setChartHeader(archivesForCharts.get(0).get(0).getDate());


Как я понимаю, при создании new FragmentCharts() должна происходить инициализация
TextView, но в методе setChartHeader() значение TextView почему-то null.

Пытался инициализировать TextView повторно в setChartsHeader(), но где взять view
для инициализации?

В общем, как обычно, нужна помощь.
    


Ответы

Ответ 1



Ваш код new FragmentCharts().setChartHeader(archivesForCharts.get(0).get(0).getDate()); каждый раз создаёт новый фрагмент. Но так как он ни куда не аттачится и не отображается, соответственно у него не вызываются никакие методы жизненного цикла, в том числе и onCreateView, в котором вы инициализируете TextView. Поэтому он и null. Как решить? Не создавать новый объект фрагмента, а вызывать метод у существующего. То есть, например, добавить в конструктор адаптера параметр FragmentCharts fragment, и обращаться уже к нему. Во фрагменте у вас будет: ChartAdapter chartAdapter = new ChartAdapter(this); А в адапрере: private FragmentCharts fragment; public ChartAdapter(FragmentCharts fragment) { this.fragment = fragment; } ... fragment.setChartHeader(archivesForCharts.get(0).get(0).getDate()); ...

Где можно найти документацию по VK Streaming API?

#vkontakte_api #вконтакте


С лета этого года ВКонтакте ужесточает лимиты на вызов методов newsfeed.search, wall.search
и wall.get и предлагает использовать их новый Streaming API для интерактивного получения
данных по этим методам, но нигде нет информации по использованию этого API. Кто знает
где можно почитать документацию по Streaming API (в разделе для разработчиков у них
пока ничего нет)?

Также интересуют данные по новым лимитам. Пока есть информация по количественному
ограничению вызова метода newsfeed.search (до 100.000 запросов в сутки) с 07.06.2017.
Кто-нибудь знает про другие ограничения?

Судя по новостям, разработчики VK планируют выпустить несколько версий Streaming
API (основную и "расширенную"). Кто знает чем они будут отличаться (сейчас есть только
информация, что "расширенная" версия будет выдавать "100% данных")?

Сама новость в Roadmap:
https://vk.com/dev/data_limits
    


Ответы

Ответ 1



Появилась документация по Streaming API: https://vk.com/dev/streaming_api_docs Но там реально жесть, в базовой версии максимальное количество запросов (правил), по которым поступают данные = 10 штук, в ответе выдается 1% от всей доступной информации (говоря русским языком не выдается практически ничего)). Также сервер должен держать постоянное соединение через WebSockets, которое сервер может произвольно разорвать по прошествии определенного времени (в общем, это весьма неудобно). Из текущего, с 21.06.2017 начинают действовать следующие ограничения по методам newsfeed.search, wall.search и wall.get: метод newsfeed.search можно вызывать не более 25000 раз в сутки; метод wall.search можно вызывать не более 2500 раз в сутки; метод wall.get можно вызывать не более 500000 раз в сутки. Из личной переписки с разработчиками стало ясно, что в итоге сильно урежут суточное количество запросов, будет гораздо ниже вышеуказанных. Пока не ясно, будут ли вводить review (ручную модерацию) приложений по типу instagram, но в свете "борьбы со злоупотреблениями обхода ограничений" мне это видится единственным реальным шагом со стороны разработчиков VK, чтобы эти "злоупотребления" прекратить.

Не могу разобраться ObservableCollection с ListBox

#c_sharp #net #wpf #binding


Проблема скорее всего в привязке. В ListBox не прибавляются элементы.



    
    
        
            
                
                    
                    
                
                
                
                    
                    
                    
                
            
        
    


    
    


Ответы

Ответ 1



Где вы находите такие способы создания коллекций?) Ну, исправим то что есть: Объект создается в ресурсе окна, соответственно добавление элементов в коллекцию должно происходить в конструкторе этого объекта. То что вы добавляете элементы в *.cs файле, это не совсем то, так как это не тот объект к которому вы привязываетесь.(привязка идет к объекту созданному в ресурсе). Идем дальше. Раз уж вы решили создать коллекцию унаследовавшись от нее самой, то добавляйте элементы унаследованным методом: public class MyList : ObservableCollection { public MyList() : base() { Add(new Person("1", "2", "3", null)); Add(new Person("1", "2", "3", null)); } } В принципе все, должно работать. Пару замечаний по вашему коду: public ObservableCollection MyData; Если вы будете привязываться к MyData то привязка не пройдет. Привязка работает только со свойствами, т.е. должно выглядеть так: public ObservableCollection MyData { get; set; } Как это делается обычно: В проекте должен быть класс VM, реализующий интерфейс INotifyPropertyChanged. Этот класс будет являться DataContext-oм для вашего окна(как задать DataContext). В этом классе и объявить список: public class MainVM : INotifyPropertyChanged { public ObservableCollection MyList { get; set; } public MainVM() { MyList = new ObservableCollection(); MyList.Add(new Person("1", "2", "3", null)); MyList.Add(new Person("1", "2", "3", null)); } //--------------------- //реализация интерфейса } //--------------------- После таких манипуляций, использовать привязку одно удовольствие:

В чём состоит отличие между различными workflow? [дубликат]

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


        
             
                
                    
                        
                            На этот вопрос уже даны ответы здесь:
                            
                        
                    
                
                        
                            Правильное именование веток
                                
                                    (3 ответа)
                                
                        
                                Закрыт 2 года назад.
            
                    
Слышал о существовании большого количества workflow (процессов разработки) — git
flow, github flow, gitlab flow. 

В чём их сущность и чем они отличаются? Ведь ветвление происходит во всех трёх случаях.
    


Ответы

Ответ 1



Да, все workflow имеют много общего, поскольку предназначены для работы с одними и теми же инструментами (в данном случае с git-ом, распределённой системой контроля версий, обладающей возможностью лёгкого ветвления). Однако у них имеются весьма существенные различия в том, как с этими ветками обращаться. Git Flow Есть две фиксированные ветви, «стабильный» master и «развивающийся» develop. При появлении необходимости внесения изменений в код происходит одно из двух: от develop отпочковывается тематическая ветка, если это внесение функционала или подготовка к выпуску новой версии, либо ветка отпочковывается прямо от master, если это исправление ошибки. После окончания работ тематическая ветвь вливается в её родителя, а в ряде случаев — и в master. GitHub Flow То же, что и Git Flow, но фиксированная ветка всего одна — master; всё остальное принадлежит тематическим ветвям. Тематические ветви, в свою очередь, создаются в форках — клонированных копиях репозитория. То есть центральный репозиторий тематических веток не содержит. В том числе и после слияния, так как метки веток при этом снимаются и их головы становятся анонимными. GitLab Flow Как и в GitHub Flow, фиксированная ветка всего одна — master; всё остальное принадлежит тематическим ветвям. Однако, если в том случае релизы размещались в коммитах master-a, то здесь для каждого релиза создаётся своя, отдельная ветка. Причём никакого слияния этих веток с родителем не производится. Если ветка отпочковалась, значит она будет жить своей жизнью, получая исправления ошибок в виде отдельных коммитов (возможно, портированных из головы мастера с учётом накопившейся разницы в функционале между ветками). Иллюстрации были взяты из статьи «잘 밤에 쓸데없는 생각하기...». В корейском я не смыслю, но картинки красивые.

найти количество уникальных чисел в массиве java

#java


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

Пример:


  Входящие данные  {11, 12, 10, 5, 4, 44, 100, 44, 11, 10, 11}
  
  Ответ 7
  
  Объяснение
  Массив без повторений будет выглядеть 4, 5, 10, 11, 12,
  44, 100 - длина 7.


Помогите с решением задачи.

Мой вариант:

public static void main(String[] args) {
    int[] array = {11, 12, 10, 5, 4, 44, 100, 44, 11, 10, 11, 3};
    System.out.println(uniqueCount(array));
}

static int uniqueCount(int[] array) {
    int result = 0;
    int countUnique = 0;
    int count = 0;
    for (int i = 0; i < array.length; i++) {
        countUnique++;
        for (int j = i + 1; j < array.length; j++) {
            if (array[j] == array[i]) {
                count++;
            }
        }
    }
    return result = countUnique - count;
} 


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


Ответы

Ответ 1



Ваш алгоритм не учитывает, что числа могут повторяться больше, чем два раза - 11 в Вашем случае. for (int j = i+1; j < array.length; j++) { if (array[j] == array[i]) { count++; break; } }

Ответ 2



Можно решить через множество, которое исключает возможность иметь дубликаты: int[] array = {11, 12, 10, 5, 4, 44, 100, 44, 11, 10, 11, 3}; System.out.println(array.length); // 12 Set mySet = new HashSet<>(); for (int x : array) { mySet.add(x); } System.out.println(mySet.size()); // 8 Или аналогично через список и проверку наличия элемента: List myList = new ArrayList<>(); for (int x : array) { if (!myList.contains(x)) myList.add(x); } System.out.println(myList.size()); // 8 Ну если обернуть один из алгоритмов в функцию: static int uniqueCount(int[] array) { Set mySet = new HashSet<>(); for (int x : array) { mySet.add(x); } return mySet.size(); } ... int[] array = {11, 12, 10, 5, 4, 44, 100, 44, 11, 10, 11, 3}; System.out.println(array.length); // 12 System.out.println(uniqueCount(array)); // 8

Ответ 3



Как вариант без использования коллекций или библиотек: public class x { public static void main(String[] args) { int[]x = new int[]{1,1,1,2,2,2,1,3,1,2,5,4}; System.out.println(uniqueCount(x)); } public static int uniqueCount(int[]array){ int[] copy = new int[array.length]; int res = 0; int countNum = 0; int count = 0; for (int i = 0; i

Ответ 4



O(array.length + max_num) ~ O(n+const) int histo [] = new int [max_num]; int [] array = int[] array = {11, 12, 10, 5, 4, 44, 100, 44, 11, 10, 11, 3}; for(int i =0; i < array.length; i++)histo[array[i]]++; int summ = 0 for(int i =0; i < histo.length;i++){ num = histo[i]; if(num >0) summ++; } System.out.println(summ);

Ответ 5



import java.util.Scanner; import java.util.Random; class Z2{ public static void main(String[] args){ String mass[]=new String[5]; String mass2[]=new String[5]; int kol=0,kol_tmp=0; Random rnd=new Random(); //Заполнение массива mass случайными числами for(int i=0;i<=mass.length-1;i++){ mass[i]=String.valueOf(rnd.nextInt(1)); } //Подсчёт количества for(int i=0;i<=mass.length-1;i++){ kol_tmp=0; for(int j=0;j<=mass.length-1;j++){ if(mass[i].equals(mass2[j])) kol_tmp++; } if(kol_tmp==0){ mass2[kol]=mass[i]; kol++; } } //Вывод массива1 System.out.println("mass"); for(int i=0;i<=mass.length-1;i++){ System.out.print(mass[i]+" "); } System.out.println(""); //Вывод массива2 System.out.println("mass2"); for(int i=0;i<=mass.length-1;i++){ System.out.print(mass2[i]+" "); } System.out.println("\nКоличество различных элементов ="+kol); } }