• Как восстановить удаленную папку?

    @Shannon
    Загрузитесь с live-cd или флешки или другого диска с установленным r-studio (чтобы не устанавливать на тот же диск и не попортить данные для восстановления)
    Нажмите анализировать нужный диск и восстанавливайте нужную информацию
    Если она еще не перезаписывалась на этом диске, то r-studio восстановит, если запись на диске была, то частично что-то восстановит
    Ответ написан
    Комментировать
  • Как создать рекурсию в pug с созданием списка из объекта?

    @Shannon
    Например, вот так, как вариант

    -
     var obj = {
      "label": "蟆",
      "children": [
        {
          "label": "虫"
        },
        {
          "label": "莫",
          "children": [
            {
              "label": "艹"
            },
            {
              "label": "旲",
              "children": [
                {
                  "label": "日"
                },
                {
                  "label": "大"
                }
              ]
            }
          ]
        }
      ]
     }
    
    mixin unpackKanji(obj)
      if(Array.isArray(obj))
        each item in obj
          +unpackKanji(item)
      else
        ul
          if(obj.children)
            li=obj.label
                +unpackKanji(obj.children)
          else
              li=obj.label
    
    +unpackKanji(obj)
    Ответ написан
    Комментировать
  • Как реализовать отправку файлов через Ajax?

    @Shannon
    На input(type='file') вешается функцию обработчик на событие 'change', например "uploadFiles"
    При вызове функции в this.files (даже без multiple, если только 1 файл, всё равно будет this.files) будут все добавленные файлы, их можно либо добавить в единую форму и отправить все вместе. Либо отправить по одному, каждый раз создавая новую форму

    function uploadFiles(e) {
        const formData = new FormData()
        for (let file of this.files) {
            formData.append('files', file)
        }
    
        const xhr = new XMLHttpRequest()
        xhr.upload.onloadstart = function () {
            console.log('Начали загружать')
        }
        xhr.upload.onprogress = function (event) {
            console.log(`Загрузили ${event.loaded} из ${event.total}`)
        }
        xhr.upload.onload = function () {
            console.log(`Всё отправлено`)
        }
        xhr.upload.onerror = function () {
            console.log('Произошла ошибка при отправке');
        }
    
        xhr.open("POST", '/upload')
        xhr.send(formData)
    
        xhr.onreadystatechange = function () {
            if (xhr.readyState === XMLHttpRequest.DONE) {
                if (xhr.status === 200) {
                    console.log('ok')
                }
                else {
                    console.log('error')
                }
            }
        }
    }
    Ответ написан
    Комментировать
  • На чем разрабатывать кроссплатформенное приложение?

    @Shannon
    Низкий порог вхождения Framework7 (при этом довольно хороший результат), проще, наверное, уже не куда.
    Не требуется знания, например, angular, достаточно html+js, за пол часа можно разобраться и сделать первый протопит
    framework7.io

    Есть нативный интерфейс под ios7-9 и под material design. Шаблоны всех стандартных элементов есть (списки, кнопки, меню итд), вам только остается вручную их расставить (для каждого элемента есть пример на сайте) (полос прокрутки на мобильном устройстве не будет)
    7df783332db749a9bcfb453493ca1c7b.png

    Тут подробнее (немного устарело, сейчас уже больше возможностей и стилей):
    https://habrahabr.ru/post/257889/
    Ответ написан
    Комментировать
  • Cocoa на OS X в Xcode: почему, если в окно добавить WebView, то при запуске оно станет пустым, вообще без контролов?

    @Shannon
    Вообще совет правильный, правда есть проблема, легко нарваться на туториалы, которые учат сходу отключать Auto Layout и вручную выставлять все отступы, что делать совершенно не нужно, так как Interface Builder сам справляется с этой задачей

    В двух словах:
    После того как расставлены все нужные формы, кнопки и т.д. нужно нажать:
    Resolve_Auto_Layout_Popup_2x.pngAll Views in View Controller -> Add Missing Constraints и/или расставить/подправить их вручную, если автоматический способ чем-то не устроил

    Подробнее:
    https://developer.apple.com/library/ios/documentat...

    Запускать (чтобы посмотреть результат расстановки элементов), кстати, тоже не обязательно, предпросмотр делается так:
    Screen-Shot-2015-09-05-at-1.39.09-PM.png
    Подробнее:
    https://developer.apple.com/library/ios/recipes/xc...

    Вообще в этом официальном разделе Interface Builder потыкайтесь, много картинок, сразу разъясняющие что и как работает, самые ходовые вопросы там разобраны
    Ответ написан
  • Почему в CollectionView изображения скачут из ячейки в ячейку?

    @Shannon
    Нужен placeholderImage
    Например, у https://github.com/rs/SDWebImage будет так
    cell.image.sd_setImageWithURL(NSURL(string: imgUrl)
         , placeholderImage: UIImage(named:"void-img"))

    У AlamofireImage что-то аналогичное тоже есть
    Ответ написан
  • В чем хранить данные для поиска в swift?

    @Shannon
    Как распарсили json в dictionary, так его и храните - это и есть самый оптимальный способ
    2000 это очень мало, можно даже и не беспокоится
    Ответ написан
    Комментировать
  • Каков алгоритм создания мобильного приложения на html, css и js?

    @Shannon
    habrahabr.ru/post/257889 - по сути Framework7 самый простой, и один из самых быстрых фреймворков для html5 приложений
    Вначале набрасываете дизайн в html, потом к дизайне привязываете нужный код в js-файле. Ничего дополнительно изучать не требуется, чистый html + js

    Есть набор компонентов (кнопки, списки, диалоговые окна, выпадающие меню и т.д.) которые просто размещаете в html-файле, для каждого компонента есть инструкция как его вставить в html файл и как их привязать к js-коду. Всё это делается 1-2 строчками и выглядит как нативные элементы

    В статье немного устарела информация, в последней версии фреймворка много улучшений, а так же появилась полноценная поддержка android material design и ios 9 style, включая инструкцию как их переключать офф сайт framework7
    Ответ написан
    Комментировать
  • Как сайт превратить в приложение android?

    @Shannon
    Самый простой и быстрой способ, не требуется разбираться что такое android, как под него писать, куда что добавлять, где взять эмуляторы, что такое webview, папки assets и т.д.:

    1. Ставите Intel XDK и создаете новый проект
    2. Тут же просто перетягиваете нужные файлы в папку www
    3. В эмуляторе (который кстати тут быстрый и ничего дополнительно ставить не требуется) тут же смотрим на результат

    Если всё устраивает то нажимаете build и выбираете android (лучше всего crosswalk, работает намного быстрее, но весит больше). В итоге получаете apk файл

    072a750601254d1d93a22b7c6445ccb9.jpg

    Так же, можете глянуть - habrahabr.ru/post/257889 если вдруг захотите попробовать реализовать сайт как HTML5-приложение
    Ответ написан
    3 комментария
  • Гибридные мобильные приложения. За ними будущее?

    @Shannon
    Это не серебряная пуля, но в принципе решает часть задач, иногда можно полностью отказаться от нативной разработки. Хоть тема и не нова, но обсуждать имеет смысл только решения, которые появились относительно недавно (crosswalk, intel xdk, framework7). До этого всё было тормознуто и html5-приложения в итоге заработали дурную славу.

    Краткий ответ: Да, html5 приложение на данный момент уже может заменить нативное в ряде случаев, так как при использовании правильных технологий оно получится достаточно близким к нативному.

    Есть тонкости. Многие думают, что Cordova/PhoneGap это и есть тот самый фрейморк в котором и кроется секрет производительности или тормозов итогового приложения. На самом деле есть 2 разные по сути вещи:
    Cordova/PhoneGap - это фрейворк, который соберет html5 приложение в apk и т.д. По сути это просто конструктор, никак не влияющий на производительность итогового приложения. Он позволяет взять html5 приложение, добавить плагины, для работы с камерой/gps/рекламой, и в итоге получить аналог нативного. Но так сложилось, что почти все публичные примеры из коллекции phonegap тормознутые, и поэтому многие так и думают, что html5 тормознутые.

    Дело в том, что есть фреймворки вроде cordova, а есть html5 фреймворки и это разные вещи, и их нельзя ставить в один ряд. Сама по себе cordova не тормозная и не быстрая, она работает так и только так, как работает html5-приложение (которое запросто можно запустить просто в браузере, и нажав в браузере "добавить на рабочий стол", оно будет работать как автономное приложение). Соотвественно, если html5 фреймворк быстр и отзывчив, то разница с нативным приложением будет незначительна.

    Второй момент. Так как html5 приложение, это лишь html+js, и запускается он внутри webview, то скорость приложения так же зависит от скорости движка webview. Допустим, на ios с этим все хорошо, а вот на андроид с этим хорошо только начиная с 5.х версий. На старых версиях андроида очень тормозной webview.
    Эту проблему с тормозным webview вполне успешно решила Intel представив проект crosswalk. При использовании crosswalk стандартный webview заменяется на последнюю версию chromium, что означает поддержку новым фич, больше плавности, скорости и т.д.
    Само собой, чем свежее crosswalk, тем быстрее и стабильнее работает итоговое html5 приложение.

    Таким образом, решив проблему с производительностью движка html5, всё еще можно наткнулся на проблему тормознутой реализации самого фреймворка html5.
    По сути, проблема в том, что большую часть html5 приложений на phonegap делают на jquery mobile, очень тормознутом фрейморке, но очень распространенном, из-за этого все видят в представленных html5 приложениях очень тормознутых монстров.

    Есть 2 очень быстрых html5 фреймворка (по субъективным тестам, framework7 выигрывает в скорости и плавности), это framework7 и ionic - они решают многие проблемы тормозов, задержек, залипаний присущих стандартному использованию js.
    Соотвественно, например, используя framework7, время отклика нажатий, реакции на свайпы и т.д. будет аналогично тому, что и в нативном приложении. Оба вреймворка содержут набор фич, реакций на типичные для приложений событий, а так же набор всех стандартных и расширенных компонентов, которые потребуются при разработке, и которые подключаются парой строчек в html файле в нужном месте. Они уже имеют встроенные стили, в итоге все компоненты и приложение в целом выглядит как нативное (один в один) ios8 или material design, никакой инородности. При этом их легко настроить через css.

    Чуть подробнее можно посмотреть в статье "Быстрое кроссплатформенное HTML5 приложение на Framework7" - habrahabr.ru/post/257889 или аналогичных (про ionic например) там же
    В итоге, на момент написания статьи, на гаджетах 5 летней давности всё работает примерно на 10-15% хуже чем аналогичное нативное решение. Если сейчас перекомпилировать со свежим crosswalk (в intel xdk, кстати, это делает даже совсем просто, достаточно нажать build и выбрать crosswalk), то разница будет еще менее заметна.

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

    @Shannon
    Вам нужно смотреть в сторону framework7 или ionic, для андроида обязательно использовать crosswalk, чтобы не тупило приложение на старых девайсах. Вот тут подробнее - habrahabr.ru/post/257889 (пример из статьи может немного глючить, потому что там старая версия crosswalk, нужно его пересобрать или еще лучше, сразу протестировать реальный пример от создателя framework7, в котором все собрано вместе - framework7.io/kitchen-sink-ios или framework7.io/kitchen-sink-material - просто зайдите на андроиде через браузер chrome (именно через chrome, не через стандартный, не через firefox итд), это будет аналогично использованию crosswalk в реальном приложении)

    1. В framework7 есть современный интерфейс под ios7-9 и под material design. Шаблоны всех стандартных элементов есть (списки, кнопки, меню итд), но вам придется вручную их скомбинировать, просто добавляя нужный компонент в html файле (для каждого элемента есть пример на сайте www.idangero.us/framework7 )
    2. Чтобы тексты автоматически добавлялись, нужно реализовать API на сервере хоть на чем, а js код приложения должен, обращаясь к этому API, формировать актуальную ленту (примерные примеры на сайте framework7 в общем-то тоже есть)
    3. Поставьте intel XDK, для начинающих там проще всего разрабатывать и компилировать html5 приложения. К тому же там по умолчанию можно сразу собирать с crosswalk, без подключения вручную
    4. Почти никто не добавляет свою рекламу, например intelXDK или phonegap ничего точно не добавляют лишнего
    5. Разрешение потребуется только одно - доступ к интернету, остальные разрешение только те, которые вы сами включите
    6. Чтобы не тупило на старых андроид девайсах и работало почти как нативное (чем свежее crosswalk, тем плавнее и отзывчивее результат), нужно использовать crosswalk
    7. По сути фреймворки framework7 или ionic всё сделают за вас, под все экраны автосмаштабируется интерфейс и все элементы, включая картинки

    Дальше вам нужно просто изучать выбранный фреймворк, для начала сделать статичное приложение, накидав нужные элементы в нужные места и посмотреть как всё это будет выглядеть, пока без доступа в интернет, а уже потом приделать работу с API и все остальные фичи
    Ответ написан
    Комментировать
  • Как реализовать AccordionMenu в UITableViewCell?

    @Shannon
    Как вариант, создать изначально все 3 ячейки в IB, настроив там всё как надо, а потом при запуске скрывать среднюю, используя tableView(_:heightForRowAtIndexPath:) указав hidden = true и height = 0 для нужной ячейки. Когда нужно снова показывать ее, задавать нужный height и hidden через через animateWithDuration (чтобы анимация была)
    Ответ написан
    Комментировать
  • Как изменить параметр Row Height в Static Table View Cell?

    @Shannon
    Нужно добавить делегата к вашему контроллеру, и использовать tableView(_:heightForRowAtIndexPath:), возвращая разный размер ячейки в зависимости от условий
    Ответ написан
    Комментировать