• Как в Yii2 вставлять базовые данные в базу?

    mitaichik
    @mitaichik
    Создаешь дамп базы изначальной. Ложишь в файл куда-нить, делаешь миграцию которая выполняет этот файл.
    Ответ написан
  • Yii2 и ORM: как правильно делать большие выборки из базы данных?

    mitaichik
    @mitaichik
    Думаю Yii здесь не причем. Точнее его ORM. Все эти ее преобразования\создания объектов которая делает его ORM (точнее - ActiveRecord) - это все мелочи, у вас тормозит что-то другое.

    Тут надо:

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

    2. Поиграть с with: посмотреть что лучше работает: with/joinWith(он вообще подгрузит все одним запросом), или вообще без with (то есть отложенная загрузка - в некоторых кейсах лучше так).

    3. Обратить внимание что происходит после выборки - возможно, тормозит пост-обработка.

    4. Посмотреть на сами модели: если у вас там на каждую модель навешивается куча бихейверов - тоже возможно тупить (правда у нас это начинало тупить когда выбирали десятки тысяч моделей)
    Ответ написан
    Комментировать
  • Не подключается AndroidHttpClient в андроид студии, кто сталкивался?

    mitaichik
    @mitaichik
    Так это ж вроде часть AndroidSDK, его ж не нужно подключать? Или вы про что-то другое?

    А так - юзайте okhttp / retrofit
    Ответ написан
    Комментировать
  • Первый проект на java. Как решить NetworkOnMainThreadException?

    mitaichik
    @mitaichik
    Ява многопоточная, у приложения есть главный поток (отрисовывает UI например) и чтоб его всякие запросы в инет не блокировали, андройд запрещает делать их в главном потоке. Соответсвенно, вам нужно запустить интернет-запрос в отдельном потоке.

    Мой совет - юзайте библиотеки которые делют запросы за вас: okhttp / retrofit
    Ответ написан
    Комментировать
  • Почему composer не подтягивает зависимости зависимостей?

    mitaichik
    @mitaichik
    А вы подключаете его как пакет? Или просто как сторонний репозиторий? Я не уверен, но, возможно, если вы полдключаете как просто сторонний репозиторий, возможно он не обрабатывает composer.json?

    А так да - должен.
    Ответ написан
    Комментировать
  • Как начать работать со своим репозиторием github для yii2?

    mitaichik
    @mitaichik
    Тут есть несколько подходов, все зависит от потребностей. Я не буду описывать простые решения, типа тупо require из общей папки, или дописать автолоадер, и т.п.

    Главное - в папке vendor мы ничего руками не меняем и ничего там не создаем - ей управляет композер и лездь туда не надо.

    Первый варик - для общего кода создаем git-репозиторий (неважно где, хот у себя на компе, хоть на том же github/bitbucket) и тупо подключаем репозиторий. Но это нищебродский вариант.

    Второй (если код не приватный) - делаем как все - создаем репозиторий на гитхабе и регим пакет в пакагисте - самый стандартный путь. Отсюда все вытикающие плюсы, например, менеджмент версйи.

    Третий - то же самое, но для приватного кода: настраиваем свой композер-сервер (например satis) - получаем тоже самое что composer + github, только приватный вариант.

    Следует отметить, что когда вы будете делить на пакеты, то ваш код будет разрабатываться в отрыве от проектов где он используется. То есть не так что вы в своей библиотеке что-то написали, обновили страницу основного проекта - и все применилось - нет. Вы должны будете закомитить, затегировать, запушить, в основном проекте обновить зависимости, и т.д. Поэтому советую писать общий код в абсолютном отрыве от того где он будет юзаться (как фреймворк - его разработчики ж не знают где он будет юзаться). Чтоб проверять изменения советую (если еще не в юзаете) освоить автоматическое тестирование. Нужно будет гораздо лучше продумывать интерфейс вашей либы. Но в целом - это все позитивное движение. Так что вперед и удачи )
    Ответ написан
    1 комментарий
  • Как безопасно сохранить пароль в Android-приложении при его сборке?

    mitaichik
    @mitaichik
    Один на всех - очень, очень плохая идея! Посмотрите лучше в стороноу Dropbox API (если они есть, я хз). Пусть каждый хранит свои файлы у себя в аккаунте, а при установке приложения логинится туда самостоятельно.

    Еще раз повторюсь: очень плохая идея! Даже если вы зашьете его незаметно в KeyStore, то есть риск что его все равно получат: https://habrahabr.ru/post/169717/
    Ответ написан
  • Как эффективнее всего изучать yii2?

    mitaichik
    @mitaichik
    Подумайте какой проект вы хотели бы сделать, и сделайте его на yii. Я так делал когда Java изучал. Теперь мне этот учебный проект еще и бабла приносит )
    Ответ написан
    4 комментария
  • Код ревью или что не так с моим тестовым заданием?

    mitaichik
    @mitaichik
    Сам в андройде не профессионал, скорее любитель, но свои 5 копеек вставлю:

    private static Context mContext;
    
        @Override
        public void onCreate() {
            super.onCreate();
            mContext = this;
        }


    Хз почему так, но это считается не камильфо. Сам так юзаю, и не одного краш-дампа не словил, но в android-сообществе это не приветствуется (надеюсь в комментах кто-то опишет почему). Принято передавать контекст.

    В MainActivity методы для работ с меню можно было удалить, ибо, судя по всему они нигде не юзаются (и видимо остались от типового шаблона).

    В RestClient идет присвоение в статическю переменную.

    private static RestClient instance;

    Я так понимаю ты делал синглтон. Хз приемлемо ли это в андройде, но я б сделал его как компонент приложения. В идеале вся эта фигня должна создаваться через DI (по карйней мере в бэкенд-разработке DI везде используется). Для андройда это библиотека Dagger 2 (сам еще не юзал, но выглядит многообещающе).

    Плюс там же:

    public static RestAPI get() {
            if(instance == null) instance = new RestClient();
            return instance.restAPI;
        }


    Этот метод по хорошему должен быть помечен как synchronized: если туда зайдут одновременно 2 потока, то может получиться что создадутся 2 RestClient'a. Тут конечно побоку - это вряд-ли что то сломает, но в крупных приложениях это ого-го какие проблемы создаст (я опять таки про бэкенд, ибо я больше по нему).

    Хранить во так параметры аутентификации - тоже не есть хорошо, но это тестовое задание, так что побоку.

    Теперь по фрагментам:

    list = (RecyclerView) v.findViewById(R.id.list);

    Ты присваиваешь свойствам фрагмента вьюхи, в onDestroyView не плохо бы их обнулить. А еще лучше, юзать butterknife.

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

    В обработке ответов ты проверяешь if (getActivity() == null) return;. Но этим ты проверяешь наличие активити, но не фрагмента, фрагмент может быть уничтожен, или его вьюха может быть уничтожена, или у активити может быть вообще другой фрагмент или еще что. Короче, это все приведет к крэшу.

    onTaskClick: По хорошему, менять фрагменты должна активити, фрагмент списка просто должен сказать "выбран такая-то задача", и вызвать каллбэк активити. А уже активити принять решение что делать дальше. В официальной документации описано как это сделать (механизм каллбэков).

    Реально смутил DetailsTaskFragment: для представления информации о одной задаче ты юзаешь RecyclerView. Имхо, это в корне не правильно. Я понимаю твою мотивацию, почему ты так сделал (экономия память на вьюхах и прочее). Но ты жестко задал структуру и тип отображения. Малейшее изменение требования отображения задачи, и весь этот код под удаление. Ну и инструмент неправильный: RecyclerView - это для списков, для больших списков, а задача - это не список, это сущьность. Если бы ты отказался от этой идеи, и заюзал обычный layout + DataBinding все было бы более удобно, изменяемо, и кода было бы раз в 10 меньше.

    В TaskListAdapter у тебя примешана бизнес-логика, а именно сортировка. По хорошему ты должен делать сортировку в другом месте, например, в службе которая тебе отдает данные, или где то еще, но точно не в UI, которым является адаптер.

    ItemViewHolder - там у тебя обработчик. Хз правильно это или нет, но в примерх гугла обработчик вешается в onBindViewHolder.

    Так же не совсем понимаю (возможно просто задание не читал) метод addAll: почему бы просто не обновить список? Плюс опять это по большой части бизнес-логика. И что странно - не вижу notifyDataSetChanged().

    В общем как-то так.
    Ответ написан
    2 комментария
  • Зачем нужен Dependency Injection в Android разработке?

    mitaichik
    @mitaichik
    Имхо, хорошо о IoC и DI написанно в книге Spring 4 Для профессонилов. Понятно что там все по другому, нежели в Dagger, но теория хорошо описанна.
    Ответ написан
    Комментировать
  • Возможно ли устроиться на работу девелоперу-иностранцу в России?

    mitaichik
    @mitaichik
    Жил раньше в Питере, работал в разных крупных конторах. У нас работали ребята из Казахстана, Узбекистана, Украины (все были не граждане РФ). Их брали нормально. Что касается документов - хз как они были офромленны (знаю тлоько что у некоторых были эти самые РВП). В любом случае, если вы реально хороший специалист - крупная компания посуетится ради вас.

    Другое дело что их не интересует 3 месяца. Ради сотрудника на 3 месяца суетиться никто не будет, будь он гражданин РФ или нет, неважно. Компании ищут человека как минимум на несколько лет, ибо первые несколько месяцев новый сотрудник только вникает в проект, отвлекает разрабов вопросами, делает из-за незнания проекта баги, и в целом, замедляет процесс разработки.
    Ответ написан
    4 комментария
  • Почему две параллельные транзакции не блокируют друг друга?

    mitaichik
    @mitaichik
    У вас все работает правильно и ожидаемо, и транзакции здесь вообще не при чем: фактическое изменение значения в БД у вас происходит спустя 10 секунд (save + commit). Запуская 2 процесса, они оба одновременно считают 0, изменят его на 1, и оба через 10 секунд сохранят эту единицу в БД - естественно, там будет 1.

    Вы можете сохранять (save) изменения сразу после изменения на 1, но проблему это не решит, так как фактически другой транзакции изменения буду доступны только после коммита (Советую почитать про уровни изоляции транзакций https://habrahabr.ru/post/135217/ чтоб понять почему так происходит)

    БД с контролем версий могла бы помочь - при попытке перезаписать устаревшие данные такая БД вернула бы ошибку. Но MySQL - не такая БД (впрочем, это можно сделать самому).

    То что тебе надо - это чтоб обновление шло последовательно, не параллельно. Это очередь. Можешь сделать ее подобие сам, можешь юзать кучу готовых инструментов, можешь юзать мьютексы (хотя, имхо, в контексте php это сомнительный совет).

    Если речь идет чисто о счетчиках - я бы порекомендовал тебе Redis с его incr (он однопоточный и подобных проблем там нет в принципе).

    Если же это просто пример и вопрос про то как не запароть важные данные при одновременном изменении - читай про уровни изоляции транзакций и делай версионность данных.
    Ответ написан
    Комментировать
  • Можно ли мои приложения иметь одно и то-же лого (и графический контент) в Google Play?

    mitaichik
    @mitaichik
    Если у вас все легально, то лучше написать в службу поддержки Google и объяснить ситуацию, спросить как лучше из нее выйти. По описанию - мне присылали письмо с уведомлением что если я не изменю его - удалят приложение в течении 3х дней (или недели - не помню)
    Ответ написан
    1 комментарий
  • Как и где лучше хранить данные пользователя?

    mitaichik
    @mitaichik
    Если мы про высокие нагрузги: Мемкеш теряет данные при перезапуске. Тут либо хранить в мемкеше и приперезапуске системы\мемкеша заполнять их снова, либо хранить в redis (Я бы сделал так).

    А вообще - где угодно можно, можно хоть в той же теблице юзера в MySQL - главное чтоб производительности хватало.
    Ответ написан
    Комментировать
  • Как в yii2 сделать для формы с переменным количестовм checkBox и валидацию?

    mitaichik
    @mitaichik
    Мало информации. Что вы хотите провалидировать?

    На вскидку: что есть хоть одна категория - required, что все значения integer - each, что есть такие категории - in или exist, b и т.п. Можно написать кастомный валидатор (метод\анонимная функция\класс).

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

    Что касается виджет - Angular :) Возможно можно сделать что то типа
    for($i =0; $i< 10; $i++){
        $form->field($model, 'checkboxList[]')->checkboxList($items); ?>
    }


    Но это догадки, надо проверять.
    Ответ написан
    Комментировать
  • Как настроить глобальны конфиг для CGridView?

    mitaichik
    @mitaichik
    Если вы про Yii2 - то там это настраевается через DI контейнер:

    https://github.com/yiisoft/yii2/blob/master/docs/g...

    widgetFactory - это в 1ом yii было, как там правильно - я уже не помню.
    Ответ написан
  • Как подружить gii и php storm?

    mitaichik
    @mitaichik
    Попробовал - у меня такой проблемы не возникает, но:

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

    Для избежания этого в конектсом меню phpStorm есть пункт Paste Simple - он вставляет просто текст без размтки и без форматирования.
    Ответ написан
  • Как поставить android 4 на планшет с android 5?

    mitaichik
    @mitaichik
    Если не секрет - чего нельзя на петрке нельзя сделато что можно на 4ке? Я не в курсе как сделать, но, возможно проще купить новый планшет?
    Ответ написан
    Комментировать
  • Почему долго компилируется приложение после перехода на AndroidStudo 2?

    mitaichik
    @mitaichik Автор вопроса
    Еще помогает запустить gradle как демон https://www.timroes.de/2013/09/12/speed-up-gradle/
    Ответ написан
    Комментировать
  • Куда складывать классы в Yii2?

    mitaichik
    @mitaichik
    Этот вопрос возывает холивары даже у профессионалов...
    Ответ написан