marți, 24 iulie 2012

Android + ffmpeg - notes

In order to compile an NDK library, one must target a certain CPU architecture. When NDK rev. 8b was released the following were available:
  • ARMv5TE, including Thumb-1 instructions
  • ARMv7-A, including Thumb-2 and VFPv3-D16 instructions, with optional support for NEON/VFPv3-D32 instructions
  • x86 instructions
  • MIPS instructions
ARMv5TE (the default) machine code will run on all ARM-based Android devices. ARMv7-A will run only on devices such as the Verizon Droid or Google Nexus One that have a compatible CPU. The main difference between the two instruction sets is that ARMv7-A supports hardware FPU, Thumb-2, and NEON instructions.

CPU Architecture Used    Compatible Android Platforms
ARM, ARM-NEON           Android 1.5 (API Level 3) and higher
x86           Android 2.3 (API Level 9) and higher
MIPS           Android 2.3 (API Level 9) and higher

NEON technology is a 128-bit SIMD (Single Instruction, Multiple Data) architecture extension for the ARM Cortex™-A series processors, designed to provide flexible and powerful acceleration for consumer multimedia applications, delivering a significantly enhanced user experience.

Apparently most Android devices on the market in mid-2012 are ARM design, either ARMv6 (older devices & low-ends) or ARMv7 (Android 3 devices & high-ends)

It would be nice filter out the incompatible terminals based on CPU type by running a check before calling the native library. I can get the CPU type info by reading /proc/cpuinfo (it doesn't require super user privilege). A short example by roman10.

If I want to filter-out the incompatible terminals using Google Play, I may use a database of Android terminals and their features that exists on Wikipedia .

To ensure compatibility, an application using a native library produced with the NDK must declare a <uses-sdk> element in its manifest file, with an android:minSdkVersion attribute value of "3" or higher.

The basic steps of working with NDK:
  1. Place your native sources under <project>/jni/...
  2. Create <project>/jni/Android.mk to describe your native sources to the NDK build system
  3. Optional: Create <project>/jni/Application.mk.
  4. Build your native code by running the 'ndk-build' script from your project's directory. It is located in the top-level NDK directory:
    cd <project>
    <ndk>/ndk-build
    
    The build tools copy the stripped, shared libraries needed by your application to the proper location in the application's project directory.
  5. Finally, compile your application using the SDK tools in the usual way. The SDK build tools will package the shared libraries in the application's deployable .apk file.
The stable native APIs that are guaranteed to be supported in all later releases of the platform:
  • libc (C library) headers
  • libm (math library) headers
  • JNI interface headers
  • libz (Zlib compression) headers
  • liblog (Android logging) header
  • OpenGL ES 1.1 and OpenGL ES 2.0 (3D graphics libraries) headers
  • libjnigraphics (Pixel buffer access) header (for Android 2.2 and above).
  • A Minimal set of headers for C++ support
  • OpenSL ES native audio libraries
  • Android native application APIS

Another approach is to compile ffmpeg as a standalone executable like this and then package it with the app. There are a few issues to be aware of:
  • In order to run a native linux command we use Runtime.getRuntime.exec("command") - example.
  • In order to run our ffmpeg on a non-rooted phone, the safest method (no internet downloads) is to copy the binary inside the assets folder. At runtime we copy it to a writable location and change its file permissions - see other choices. It seems the only folder we can write to and change the file permissions is /data/data/app-package-name (e.g. /data/data/org.vlc.android.run_ffmpeg)
  • When reading the binary file from the assets folder, an IOException is thrown if the file size exceeds 1MB. This is because the file is automatically compressed when packaged, and there is a limit set in one of the Android headers - see this thread for details. A quick fix is adding a .mp3 extension to the bundled file - Android will think it's an already compressed mp3 and will not compress it.

sâmbătă, 6 februarie 2010

Soluţii VPN gratuite

Am folosit Hamachi până acum, dar în ultimele zile funcţionează foarte lent. Ca urmare, caut o soluţie alternativă.

1. Tinc
  • Funcţionează pe Linux / Unix, pe Mac, şi pe Windows.
  • Suportă IPV6.
  • Poate realiza conexiunea între oricâte calculatoare, nu doar un tunel între două.
  • Pare să fie contruit cu gândul la fiabilitate.
  • Are installer pentru Windows.
  • Pare să fie un pic mai greu să conectez două calculatoare din spatele unor NAT-uri.
  • Trebuie să editez fişiere de configurare. 
  • Open Source.

2. Wippien
  • Funcţionează pe Windows.
  • Open Source, cu componente Closed Source.
  • Se suprapune peste Jabber, astfel localizează lista de parteneri.
  • Folosind serverul Jabber realizează conexiuni între calculatoare din spatele unor NAT-uri.
  • Poate realiza conexiuni între oricâte calculatoare.
  • Kitul de instalare este semnat digital.
  • Latenţe mici la ping.
  • Se păstrează IP-ul alocat şi după repornirea calculatorului.
  • Are şi versiune care se instalează ca serviciu, şi o altă versiune care doar realizează conexiunea VPN (fără messenger).
  • Din păcate problema de conexiune de la Hamachi între două calculatoare persistă şi aici, deşi între acele calculatoare şi un al treilea conexiunea funcţionează perfect.

    3. OpenVpn
    • Funcţionează pe Linux / Unix, pe Mac, şi pe Windows.
    • Open Source.
    • Pare mult mai comercial, cred că oferă servicii de consultanţă pentru acest soft.
    • Cred că trebuie să fac modificări în NAT pentru unul din calculatoare (server).
    • Poate că nu este P2P - aşa scrie aici
    • Kitul de instalare este semnat digital.
    • Am editat de mână fişierul de configurare, dar documentaţia e bună şi nu am avut probleme.
    • Pentru server trebuie port-forwarding in gateway.
    • Worked like a charm.

      4. Leaf
      • Funcţionează pe Windows.
      • Pare uşor de utilizat.
      • Trafic direct între calculatoare, fără niciun proxy.
      • Realizează conexiuni şi pe calculatoare din spatele unor NAT-uri.
      • Creez o reţea, apoi invit alţi utilizatori să facă parte din reţea.
      • Am alocat uşor un utilizator nou.
      • IP-ul alocat se păstrează şi după repornirea calculatorului.
      • Se conectează greu la server, după mai multe încercări. Se deconectează singur.
      • Latenţe destul de mari la ping (300 ms) între două calculatoare din aceeaşi reţea locală.
      • Kitul de instalare este semnat digital.

        5. Gbridge
        • Ştie VNC, file sharing, synchronizing folders, şi remote backup.
        • Realizează conexiuni şi pe calculatoare din spatele unor NAT-uri.
        • Trafic direct P2P între calculatoare.
        • Nu ştiu dacă permite şi altor aplicaţii acces la VPN-ul folosit.

        6. Social VPN
        • Open Source.
        • Trafic direct P2P între calculatoare.
        • Foloseşte contul de Google Talk sau de Jabber.
        • Realizează automat toate configurările.
        • Realizează conexiuni şi pe calculatoarele din spatele unor NAT-uri.

        7. Remobo
        • Funcţionează pe Linux, pe Mac, şi pe Windows.
        • Pare uşor de utilizat.
        • Trafic direct P2P între calculatoare.
        • Kitul de instalare nu este semnat digital.
        • IP-ul alocat se schimbă după repornirea calculatorului.
        • Latenţe foarte mici (sub 20ms) la ping între două calculatoare din aceeaşi reţea locală.
        • A crăpat constant la un minut de la pornire, pe un calculator cu Windows XP SP3.

          miercuri, 2 septembrie 2009

          Module Drupal - conspect

          Am de făcut un site de ştiri, cu multe fotografii şi filmuleţe. Fotografiile trebuie salvate într-o galerie şi marcate cu tag-uri, pentru ca apoi să poată fi incluse în oricare articol, şi automat să fac referinţe către alte fotografii marcate cu aceleaşi tag-uri.

          Mai jos conspectez ce module sa folosesc, dintre sutele (mia?) de module disponibile în Drupal.

          Module pe care să le testez:

          O instalare normală de Drupal:
          • Instalez modulul Administration Menu
          • Dezactivez modulele Color (core), Comment (core)
          • Activez modulele Path (core), PHP Filter (core), Search (core), Trigger (core), Upload (core)
          • Dezactivez blocurile Navigation, Powered by Drupal
          • Modific setările globale pentru teme - dezactivez Logo, Mission Statement, Search box, Shortcut icon, Primary links, Secondary Links, debifez tot de la "Display post information on".
          • Configurez File Uploads - pun dimensiunile maxime la 10 MB / fişier şi 1000 MB / utilizator.
          • Configurez Image Toolkit - pun calitatea JPEG la 95%.
          • La Input Formats, pun implicit Full HTML, şterg Filtered HTML, iar la Full HTML dezactivez toate filtrele.
          • La Content Types, şterg "Story".
          • Configurez Administration Menu - bifez "collapse fieldsets on modules page".
          • Instalez modulul Devel
          • Instalez modulele Token, Pathauto şi Transliteration 
          • Copiez fişierul i18n-ascii.txt în directorul Pathauto.
          • La URL Aliases > Automated alias settings:
            • Bifez Transliterate prior to creating alias
            • Bifez Reduce strings to letters and numbers from ASCII-96
            • La Node path settings las doar "[title-raw]" şi şterg Feed
            • La Taxonomy term path settings las doar "[vocab-raw]/[catpath-raw]"
          • Instalez modulul Content Construction Kit
          • Instalez modulul Content Templates (Contemplate) 
          • Instalez modulele getID3 şi File Field
          • Instalez modulul ImageField  
          • Instalez modulele ImageAPI şi ImageCache 
          • Instalez modulele Link şi External Links
          • Configurez ImageApi - pun calitatea imaginii la 95% pentru toate opţiunile.
          • Instalez modulul Thickbox
          • Instalez modulul Views
          • Instalez modulul Advanced help, folosit de Views
          • Configurez Views > Tools, bifez "do not show hover links over views".
          • Opţional - instalez modulul Webform
          • Opţionale - instalez modulul Internationalization, activez modulele Locale şi Content Translation (core), Internationalization şi String Translation (multilanguage)
          • SEO - instalez modulele Page Title, NodeWords, XML Sitemap, Google Analytics
          • Optimizări - instalez modulele CSS GZip şi Javascript Aggregator
          • Dacă e cazul, instalez Taxonomy Super Select

          joi, 27 august 2009

          Conspect configurare server web linux

          Am un client care vrea un server web / ftp cu mult spaţiu pe disc (sute de GB). Cum firmele de hosting din Romania nu ofera asa spaţiu generos pe disc, iar colocaţia costă prea mult, am decis să ţin pentru început serverul la mine.

          Nu sunt expert în gestionarea unui server linux, aşa că notez aici diverse idei şi referinţe găsite pe web:

          • Instalez o versiune server, fără sistem grafic X (Gnome / KDE). Gestionarea sistemului o fac sau în linie de comandă, sau printr-o interfaţă accesibilă prin web (stil Cpanel / Plesk).
          • Utilitarul htop este o variantă îmbunătăţită a lui top - arată încărcarea sistemului pe fiecare procesor / nucleu, şi nivelul de folosire a memoriei fizice şi a celei virtuale.
          • Utilitare gratuite de gestionare a serverului web:
          • Module Apache2:
            • mod-bw - pot limita lăţimea de bandă şi numărul de conexiuni simultane, per virtual-host şi per director
            • mod-fastcgi - execuţia de programe PHP în mod fastcgi e mai rapidă şi mai sigură decât încărcarea modulului PHP în Apache şi execuţia scriptului de acolo. Explicaţie FastCGI, performanţa cu FastCGI, FastCGI şi PHP.
            • a2enmod, a2dismod - apache 2 enable / disable module
            • mod_deflate - Apache comprimă fişierele înainte de a le trimite pe reţea, spre client. Trebuie să văd dacă avantajul transferului rapid al fişierelor text/html merită consumul crescut de procesor pentru compresia în timp real.
            • eAccelerator - accelerator de script-uri PHP
            • Pro-memoria - să verific dacă E-TAGs nu sunt implicit activate - şi dacă sunt, poate să le dezactivez.
          • HDSentinel - citeşte starea hard-disk-urilor, poate modifica nişte reglaje de performanţă
          • Module Drupal - nu toate au legătură cu performanţa
          • Îmbunătăţire performanţe Apache
          • Optimizare Drupal
          • Testare site
            • Firebug + Net Pannel + YSlow (inclusiv tools ca smush.it)
            • http://webpagetest.org
            • Fiddler - proxy pentru windows, permite analiza traficului în reţea
          • Optimizări generale
            • Este esenţială reducerea numărului de fişiere servite pentru afişarea paginii
            • Toate CSS-urile - la începutul paginii
            • Toate JS-urile - la sfârşitul paginii - înainte de </body>. Asta include şi script-urile onClick, onLoad etc.
            • Capabilităţile browserelor de a încărca fişiere javascript, fişiere CSS şi imagini în paralel - UA Profiler
            • Cuzillion - generare de combinaţii de JS, CSS, frames etc., ca apoi să testez pe mai multe browsere cum afectează timpul de încărcare al paginii.
            • Păstrez doar modulele Apache pe care le folosesc. Şi în general, instalez doar pachetele pe care le folosesc, nimic în plus.
            • MySQL - InnoDB e recomandat pentru tabelele cu acces concurent scriere / citire (de exemplu cel de sesiuni).
            • APC - alternativă la eAccelerator (cică e mai stabil)
            • Apache Bankmark - comanda ab
            • Siege - site tester
            • Webtest Tools
            • Zend Server Community Edition - ar fi mai bun ca APC, care-ar fi mai bun ca restul celor gratuite.
            • Apache cu mod_fcgid

          Referinţe:

          sâmbătă, 22 august 2009

          Drupal - problemă transmitere (upload) fişiere pe site

          M-am confruntat recent cu următoarea situaţie în Drupal 6
          • Am ataşat mai multe fişiere (pdf, excel, imagini etc.) în câteva pagini din site.
          • Deşi erau salvate corect în subdirectorul /sites/default/files, fişierele nu puteau fi citite din pagina web - Apache dădea eroare de acces.
          Analizând problema, am observat că
          • Fişierele sunt salvate cu permisiuni de acces 600 (rw- --- ---), adică nu pot fi citite decât de utilizatorul/procesul care le-a salvat. În mod normal, la alte firme de hosting, ele sunt salvate cu permisiuni 644 (rw- r-- r--), adică pot fi citite de orice utilizator/proces din sistem.
          • Procesele PHP (folosite de Drupal) folosesc un alt utilizator decât procesele Apache (care citesc fişierele transmise pe server).
          Concluzia a fost că, dacă nu modific manual drepturile de acces la fişierele respective (sau dacă nu modific cumva drepturile cu care sunt salvate fişierele pe disc), ele nu vor fi accesibile pentru serverul Apache.

          Soluţia mea este să folosesc un proces Drupal (deci PHP) ca să citească fişierele de pe disc. În pagina de administrare "/admin/settings/file-system" am setat opţiunea Download Method pe "Private - files are transferred by Drupal".

          Apoi am activat dreptul utilizatorilor neautentificaţi de a vedea fişierele transmise pe server.

          Asta a rezolvat problema pentru mine.

          vineri, 21 august 2009

          Memorarea parolelor serverelor de către administratorii de sistem

          Gestionez găzduirea web/e-mail pentru mai multe domenii, ţinute de diferite firme de hosting. În plus administrez şi câteva reţele locale, ceea ce implică să lucrez de la distanţă sau local pe servere şi pe staţii de lucru. Ca urmare folosesc zeci de conturi de utilizator şi de parole.

          Din comoditate, am început să folosesc aceleaşi parole pentru multe din conturile de utilizator gestionate. Şi m-am oprit şi m-am întrebat - "Ce soluţii SIGURE am pentru memorarea unui număr mare de parole ?"

          După ce am studiat un pic, am început să folosesc următoarea metodă de memorare a parolelor:
          • Tipăresc parolele pe hârtie, sub formă de "password grid" - vezi The Password Grid - A Password Strategy şi Remembering Passwords with Password Grids.
          • Sistemul acesta îmi garantează că dacă pierd foaia cu parole la unul din clienţi, sau dacă cineva se uită peste umărul meu la hârtie, parolele sunt în siguranţă. Cred că doar în mâinile unui hacker parolele pot fi revelate. Iar riscul de existenţă de angajaţi hackeri la organizaţiile pentru care lucrez este Zero (în opinia mea).
          • Folosesc următorul script pentru generarea aleatoare a gridului de parole - Password Script Generator.
          • Salvez parolele într-un document, pe care îl memorez DOAR pe un memory stick care stă undeva la păstrare. După ce tipăresc parolele, folosesc documentul de pe stick doar când vreau să-l editez şi/sau să-l tipăresc.
          • Pentru că nu ţin parolele pe calculator, chiar dacă acesta e hackerit de la distanţă, parolele sunt în siguranţă.
          • Nu memorez parolele în programe de ftp sau în browser, câtă vreme le folosesc rar. Chiar dacă un hacker reuşeşte să citească parolele salvate în calculator, minimizez daunele pe care le-ar putea produce.