Quantcast
Channel: Planet Object Pascal
Viewing all 1725 articles
Browse latest View live

Žarko Gajić: Full Text TXT Search In Delphi (+FireDac +SQLite). Sample Working Project.

$
0
0

delphi-sqlite-firedac-fts
Finally, the sample project for my full text search implementation in Delphi is ready. The idea involves providing a user of my application the ability to do full text (Google like) searches on a set of documents by searching inside document content. For the task, I’ve selected SQLite for the database and FireDac for the database connectivity and operations.

For the sake of simplicity and the proof-of-concept approach this sample program is really simple: it will index all TXT files under some directory (including sub directories) and allow to do simple “match” type full text search queries. Certainly, in my real world application, the task is more complex and involves non-TXT files, some Windows service application and alike … but for the start, if you are up to implementing full text search, this sample project should give you a kick-start.

Download Sample Project Source Code. Download Executable Only.

The database selected is SQLite. SQLite is a self-contained, serverless, zero-configuration, transactional SQL database engine, and has the FTS engine built inside.
To connect to and operate on the database I’ve picked FireDac. FireDac knows how to talk to SQlite (any many other databases) and has proven to be robust enough when working with SQLite.

Here’s how this sample program works:

  1. The user selects a folder containing TXT files (in any subfolders)
  2. If the full text index database has not been created (i.e. the .SDB file does not exist)
    • the database is created
    • TXT files and their content are imported into database
  3. Display the files in a tree (Virtual Tree View)
  4. Each file / folder node has a check box to allow selection
  5. FTS queries can be done against the range of selected files

The Database: Multi User Read-Write SQLite Connection

SQLite is primarily used in single connection access to the database scenarios. In my scenario I have to allow multiple access (from various application and application instances) to open, read and write to the database. The TADConnection (+TADPhysSQLiteDriverLink) component is used to connect and talk to the database. By default, SQLite driver settings are set for single connection, to allow multiple connections one has to alter some parameters. Here’s how my connection parameters look:

DriverID=SQLite
Database= …
OpenMode=CreateUTF16
Password=aes-256:12345
LockingMode=Normal
JournalMode=WAL
Synchronous=Full
SQLiteAdvanced=temp_store=MEMORY
SQLiteAdvanced=page_size=4096
SQLiteAdvanced=auto_vacuum=FULL

SQLite database will be created at a connection establishment if it does not exist. I would suggest to read above the above parameters used in FireDac help.

After the connection has been established and the database has been created with tables to support FTS queries (+ referential integrity), we fill in the database:

The Data: TXT files and Their Content

A simple TDirectory.GetFiles is used to get all the TXT files in a selected directory.

var
  subFiles : TStringDynArray;
  subFile : string;
begin
  subFiles := TDirectory.GetFiles(
                main.MainForm.RootDirectory,
                TSearchOption.soAllDirectories,
                function(const Path: string; const SearchRec: TSearchRec): Boolean
                begin
                  result := SameText(ExtractFileExt(SearchRec.Name), '.txt');
                end);

  for subFile in subFiles do
    UpdateFileInDB(subFile);
end;

Files are imported into the database one by one:

function TDM.UpdateFileInDB(const fileName: string; const removeOld : boolean = false): boolean;
var
  sStream: TStringStream;
  documentRowID : integer;
begin
  result := true;

  if removeOld then
    sqliteConnection.ExecSQL('DELETE FROM Document WHERE FileName = ' + QuotedStr(fileName));

  sStream := TStringStream.Create;
  try
    sStream.LoadFromFile(fileName);

    try
      MainForm.LogInMemo(' +' + fileName);

      sqliteConnection.ExecSQL('INSERT INTO Document VALUES (NULL, :fileName)', [fileName]);

      documentRowID := sqliteConnection.ExecSQLScalar('SELECT LAST_INSERT_ROWID() AS rowid');

      //1 page per document for the sake of simplicity
      sqliteConnection.ExecSQL('INSERT INTO FTSData VALUES (NULL, :id, :page, :txt)', [documentRowID, 1, sStream.DataString]);
    except on E: Exception do
      begin
        result := false;
        MessageDlg('Error writing to database:' + E.Message, mtError, [mbOk], -1);
      end;
    end;
  finally
    sStream.Free;
  end;
end;

Now, all the files have been “indexed” and they are presented in the tree view control. I’ve used Virtual TreeView.

The FTS Search

Finally, specify what files to include in the FTS search, specify your token (word) you are looking for and hit “Search”:

procedure TDM.RetrieveSearchResults(const searchToken: string; const inFiles : TStringList = nil);
var
  fn : string;
  st : integer;
begin
  //get search results
  sqlQuery.SQL.Clear;

  //temp table for selected files
  sqlQuery.SQL.Add('CREATE TEMPORARY TABLE IF NOT EXISTS PartOfDocument (FileName STRING);');
  sqlQuery.SQL.Add('DELETE FROM PartOfDocument;');

  if Assigned(inFiles) then
    for fn in inFiles do
      sqlQuery.SQL.Add('INSERT INTO PartOfDocument VALUES (' + QuotedStr(fn) + ');');


  //main fts query
  sqlQuery.SQL.Add('SELECT Document.Id, Document.FileName FROM PageContent');
  sqlQuery.SQL.Add('INNER JOIN FilePages ON FilePages.rowid = PageContent.rowid');
  sqlQuery.SQL.Add('INNER JOIN Document ON Document.rowid = FilePages.DocumentID');
  if Assigned(inFiles) AND (inFiles.Count > 0) then
    sqlQuery.SQL.Add('INNER JOIN PartOfDocument ON PartOfDocument.FileName = Document.FileName');
  sqlQuery.SQL.Add('WHERE PageContent MATCH ' + QuotedStr(searchToken));
  sqlQuery.SQL.Add(';');

  sqlQuery.OpenOrExecute;

  MainForm.SearchResults.Clear;
  while NOT sqlQuery.Eof do
  begin
    MainForm.SearchResults.Add(
      TSearchResult.Create(
        sqlQuery.Fields[0].AsInteger, //doc.id
        sqlQuery.Fields[1].AsString  //file name
        ));
    sqlQuery.Next;
  end;

  sqlQuery.Close;
end;

A temporary table is created (if it does not exist), filled in with selected file names. The actual search query is a JOIN between different tables but the most important part is the MATCH on the FTS table. Results are displayed in a list view.

That’s it. Questions? Comments? More than welcome!


Te Waka o Pascal: An App With View

$
0
0
Not a Merchant Ivory production, but Part 3 in the Oxygene for Java camera app for Android series. So far we have seen that we can work directly with the Android platform manifest and layout files and how the Oxygene language is a first class citizen in the Java platform and just one way in […]

The Podcast at Delphi.org: MonkeyMixer updated for Delphi XE5

$
0
0

Delphi MVP and my friend Simon Stuart just updated his MonkeyMixer utility for XE5 (in addition to XE2, XE3 and XE4).

Once installed (and you’ll need to close the IDE before installing, by the way) you’ll be able to right-click on any VCL or FMX project in the Project Manager to toggle the project between VCL and FMX.
You do this by clicking Switch Project to FireMonkey or Switch Project to VCL(depending on what the project type is at that time).

Download the latest version.

Keep in mind mixing FireMonkey and VCL forms in the same application isn’t officially supported, but this is a good option for migrating a VCL application to FireMonkey, or just including exactly the features you need.

Te Waka o Pascal: David I Plumbs New Shallows

$
0
0
I catch a lot of flak for being “negative” from certain quarters, but whether you agree with me or disagree with me, one thing I am not is sneaky. Unfortunately the same cannot be said of a certain David Intersimone. VP Developer Relations and Chief Evangelist at Embarcadero. A list of job titles to which […]

The Podcast at Delphi.org: Debugging Against a Remote Android Emulator

$
0
0

The Android emulator is impossibly slow when running inside a virtual machine. It is possible to debug against a remote emulator via SSH. Here are the steps to connect from a Windows guest OS to an OS X host OS (they can be easily adapted for a Windows host). It does require installing the Android SDK on the host OS and creating and running an emulator there. It seems to work even if you have a device connected too. I’ve gotten them both to show up in the IDE and am able to pick between them and deploy and run on the emulator.  The Emulator is still slower than hardware, but this makes it usable.

This could be adapted to debug against a remote Android Emulator running on a remote machine located anywhere on the internet. Just requires port 22 to be open between the two machines.

Thanks to hheimbuerger for the the Stack Overflow answer that got me pointed in the right direction. This information has been adapted to the DocWiki too with additional links to more information.

  1. Install the Android SDK (not the ADT bundle) on your Mac OS X host & start an ARM based emulator (With use Host GPU enabled)
  2. Enable SSH on the host
    • On a Mac OS X Host go to System Preferences -> Sharing -> Remote Login
    • On a Windows host, you need to install a 3rd party SSH host. FreeSSHd has been found to work.
  3. Install the PuTTY SSH (putty.exe) client on the Windows Guest OS
  4. Ensure port 22 is open between the Windows guest OS and the Mac OS X host.
  5. Create a connection in PuTTY to the Host OS
    1. You will most likely use the 192.168.x.x IP address of the host
    2. Go to Connection -> SSH -> Tunnels and add a local/auto port forwarding for 5555 to locahost:5555 and 5554 to localhost:5554.
  6. Save and Open the connection in PuTTY
  7. Provide the login credentials for the Mac OS X host – anything typed in this window is executed on the remote machine
  8. You can check or change the tunnel settings via the icon in the upper left of the PuTTY window
  9. Minimize PuTTY (keep it open to maintain the SSH connection)
  10. Open a new command window in the Windows guest OS and type “adb kill-server & adb devices” and you should see the emulator-5554 as a listed device.
  11. Refresh target devices in Delphi and it should appear

PuTTY Tunnels

This should work for any emulators or devices connected to the remote machine. Unlike emulators that are local, you need to start the emulators before Delphi will see them. You may need to adjust the tunnel port numbers if you are connecting multiple devices.

Good luck, and happy debugging!

Lazarus Team Anouncements: Lazarus 1.1.99 pre release available for download

Australian Delphi User Group Members: Dont be a bloody idiot

$
0
0
Here in Australia we like our public health campaigns graphic and blunt. This is what our cigarette packaging looks like and we have a long running TV campaign based around the slogan of “if you drink then drive you’re a … Continue reading

The Podcast at Delphi.org: Delphi XE5 Mobile REST Client Demo Source

$
0
0

With the release of Delphi XE5 I’ve made the source of the Mobile REST Client Demo available. This is a really super simple demo of the Mobile REST Client in XE5. It is designed to show up how you can consume a JSON REST Service and adapt it into a DataSet and then bind that to the UI. If you change the data source you will probably need to change the live binding.

I’ve changed the demo from the one I used in the video to consume an OData data source. OData is a new standard backed by Microsoft for sharing data over the web. You can think of it as SQL for the web. It is a combination of other technologies, including REST, AtomPub, and JSON. Sybase supports OData on all of their databases now, as does Microsoft and others.

The change was simply a matter of pointing it to the Northwind OData endpoint provided on Odata.org. The binding is setup to show the company name in the listview. I added the ability to specify a Root Element, but that isn’t necessary for the demo.

This new technology works in both desktop and mobile, FireMonkey and VCL. It should also work in C++ Builder.

[Download the demo] (MobileRestXE5.7z 8 KB – Requires Delphi XE5– Builds for iOS, Android or Win32)


TPersistent: AnyDAC Acquisition Concerns Apparently Justified

$
0
0

I just stumbled upon this on DelphiFeeds. Apparently when I posted my concerns about the AnyDAC acquisition back in February I wasn’t too far off the mark.

It appears that one “product” or “add on” is being used to coerce customers to buy additional upgrades. This kind of vendor lock in strategy IMO is despicable, and is going to cause a long term loss of Delphi developers. If recent blog posts are any indication, even the most positive bloggers are joining the ‘nay sayers’ to let EMBT know they are not a fan of their recent marketing decisions.

At today’s pricing, it’s far from a Fire sale (get it? FireMonkey, FireDAC…:) )

Te Waka o Pascal: Fair Comparisons

$
0
0
There is an old saying about comparing “apples and apples” or more accurately in this case, “Androids and Androids”. A commenter has already pointed out that an Embarcadero blog post referencing the “effort” described by my series of posts demonstrating how to build a camera app for Android using Oxygene was not a fair comparison. […]

Te Waka o Pascal: First Impressions Of XE5 for Android

$
0
0
I thought I should at least take a look at the amazing Android support in XE5 so I decided to work through the tutorial that was brought to my attention recently. The first order of business of course, is getting installed. After making a cup of tea, reading a book, doing some housework and making […]

Te Waka o Pascal: Crash Bang Wallop, What a Picture!

$
0
0
The fourth and final part in the not-as-short-as-I-thought-it-would be series on building a camera app for Android using Oxygene. In this penultimate instalment we will add the capability to actually take a picture. But that won’t take very long, so then we will spend a bit of time tidying up the application UI. Taking A […]

Australian Delphi User Group Members: How to call Java code from an XE5 Android application

$
0
0
Hidden away on Google+ is this excellent walkthrough by Paul Foster on how to call Java methods from an XE5 Android application. There’s also a teaser from Brian Long in the comments of that Google+ post that he has a … Continue reading

It's a blong, blong, blong road...: Delphi supports iOS 7

$
0
0

Good to see prompt Delphi support for iOS 7, as reported by Embo’s Sarina DuPont. It’s out and available for download from the registered users site a mere 1 day after iOS 7 was released.

Documentation for the new support is on the docwiki.

I can’t help noticing, though, that it appears to be an XE5-only update. This is not good news for those still beavering away with iOS code in XE4.

I’m sure I remember hearing talk of support for iOS 7 shortly after iOS 7’s release for XE4 iOS programmers.

Let’s hope there’s an XE4 update to follow real soon, otherwise this will throw another bone of contention into the mix, and the blogosphere will once again be alight…..

It's a blong, blong, blong road...: Where has all the colour gone?

$
0
0

Once upon a time there was colour and interest a-plenty in development tool splash screens. Well, this was certainly the case with Delphi and C++Builder anyway.

And then corporate America took over and things dulled down with an unmistakable business-like tone.

Take a look through the progression of splash screen I have here and see if nostalgia strikes.

1997: Delphi 3

Delphi 3

1998: C++Builder 3

BCB3Splash

1998: Delphi 4

Delphi4Splash

1999: C++Builder 4

BCB4Splash

1999: Delphi 5

Delphi5Splash

2000: C++Builder 5

BCB5Splash

2000: JBuilder 4

JBuilder4

2001: Delphi 6

Delphi6Splash

2002: Delphi 7

Delphi7Splash

2004: Delphi 2005

Delphi2005

2005: Delphi 2006

Delphi2006

2007: Delphi 2007

Delphi2007

2007: C++Builder 2007

CBuilder2007

2008: Delphi 2009

Delphi2009

2008: C++Builder 2009

BCB2009

2009: Delphi 2010

Delphi2010

2010: Delphi XE

DelphiXE

2011: Delphi/RAD Studio XE2

DelphiXE2

2012: Delphi/RAD Studio XE3

DelphiXE3

2013 – Delphi XE4

DelphiXE4

2013 – Delphi XE5

DelphiXE5


Te Waka o Pascal: How to Call Java Code from an Oxygene Android Application

$
0
0
Lachlan just posted a link to a post on Google+ (also available as a PDF) demonstrating how to call Java from Delphi XE5. I was shocked at both the amount and the nature of the code involved. It is long, convoluted and ugly stuff (nb. that isn’t a criticism of Paul’s code; such techniques rarely […]

The Podcast at Delphi.org: Delphi XE5 Android Device Compatibility

$
0
0

Unlike iOS, there are are a huge variety of Android devices. Delphi XE5 supports the large majority of those devices. The official page for Android Devices Supported for Application Development spells out the requirements of Gingerbread, Ice Cream Sandwich or Jelly Bean on an ARMv7 processor (with NEON instructions). The NEON instruction requirement excludes the TEGRA 2 processor which was apparently popular in some tablets (mostly) a few years back. Also excluded is the Intel Atom processor, which I hear is showing up in Android devices in Japan.

If you look at the Android Dashboard we see those versions of Android make up 87.5% of the Android devices accessing the Android store. What that doesn’t tell us is how many of those devices have ARMv7 with NEON instructions. The DocWiki page also includes a number of devices that were tested for various functions, but really in the grand scope of possible Android devices it is a rather small sample.

Android versions pie chart

So I had the idea of using Apkudo. They provide an online service where you upload your Android app APK and they run it on a wide variety of devices and tell you how it did. Currently I’ve only done a “hello world” type app test, but it gives a good guide for devices that support XE5 at a minimum level.

They have 118 devices that run Android 2.3.3 (Gingerbread) or better (no Honeycomb). Our of those devices, my APK failed to install on 10 devices. Looking at the log it either timed out, or was out of storage space, so that may be more related to the state of the device before the test than any issues with the actual app.  Out of the 108 devices that loaded and ran the app, it only failed (ANR = Application Not Responding) on 3.

  • Devices tested: 118
  • Failed to install: 10
  • Locked up: 3
  • Successfully ran: 105
  • Success rate: 89%

From what I hear it isn’t uncommon for an app to fail for no reason on some of these devices, due to other influences (like no storage space). So that rate may actually be higherI’ve shared the full spreadsheet report here for you to look for your favorite devices. (They don’t provided a download of the report, so I had to transcribe it to the spreadsheet. There may be typos.)

I plan to modify some of our existing test apps and upload them. Since the test system just uses monkey it isn’t guaranteed to actually perform the specific actions of the test apps, so I need to automate that part of the app. When I do I will update that spreadsheet and provide an updated post.

I’m sure some people will point out that you could use Java and reached more devices. Instead of focusing on the small percentage of Android devices you are missing with Delphi XE5, I’d instead invite you to consider the millions of iOS devices you can target from the same code base. Including iOS 7!

You can get started now by downloading the Delphi XE5 trial.

Žarko Gajić: Full Text Search Functionality in Delphi Applications Implementation Idea

$
0
0

delphi-sqlite-firedac-fts
Ah … real world problems require some proof-of-concept almost-finished implementation solutions.
This time I’m into figuring out what would be the best way to introduce full text search in one of my Delphi applications.

“Setup”

There’s a Delphi application operating on files. Files are located in various sub-folders and, with 99% certainty, files will not change – i.e. a provided folder and file structure is “ready only”. Folders and files are referred to using some XML as the backbone – just imagine an XML file where tags map to folders and subfolders (in a tree like fashion), files carry some attributes (name, title, version, owner, etc.) mapped to XML file-tag attributes.

The application, beside other stuff, offers search functionality for a user to locate / filter out those files “assigned to an owner” or “having a title” and alike – therefore something you could call a “metadata search”.

We are now looking into an option to provide something like full text search to the user – to have the ability to locate a file where the file content matches some token (word or partial word).

Due to the nature of the application and the nature of the target user audience, there are some requirements for any possible implementation: light implementation – must be easy to use, no complex third party engines, should work the same way on all Windows versions, no fat (paid) databases – therefore an implementation existing users will not be aware of. Also: preferably free (so the final price of the application for the end user does not go up) :)

For the sake of simplicity let’s say we are talking about TXT files. In reality the files are not TXT files – but whatever the file type actually is –we already know how to grab the textual content from it.

For the idea, here’s a simplified XML structure – all “file” tags should have all 3 attributes (name, title, owner):

<items root="E:\ftsTXTTest\A\">
  <folder name="a1">
    <file title="t" owner="o" name="n">a1\d14.txt</file>
    <file title="t" owner="o" name="n">a1\d17.txt</file>
  </folder>
  <folder name="a2">
    <file title="t" owner="o" name="n">a2\c6.txt</file>
    <file title="t" owner="o" name="n">a2\c6per.txt</file>
    <folder name="a21">
        <file>a2\a21\announce.txt</file>
        <file>a2\a21\announce_fr.txt</file>
    </folder>
    <folder name="a22">
        <file>a2\a22\c6.txt</file>
        <file>a2\a22\d6.txt</file>
        <folder name"a221">
            <file>a2\a22\a221\d11.txt</file>
            <file>a2\a22\a221\d12.txt</file>
        </folder>
    </folder>
</items> 

“Light” Full Text Search in Delphi

My initial idea was to check out what Windows as OS has to offer through its indexed Windows Search, but since each version of Windows brings something new I’ve very quickly decided not to go along that path.

I’ve spent some time investigating available options and it seemed it all boils down to either using some fat FTS engine/framework like Rubicon, Lucene, Sphinks OR rely on some database having built-in support for full text search.

Following the requirements stated before, I would want to go for a database having support for FTS queries. The database should be free, “natively” supported by Delphi and embedded (with no restrictions).

An embedded database is a database that does not run in a separate process, but instead is directly linked (embedded or integrated) into the application requiring access to the stored data. An embedded database is hidden from the application’s end-user and requires little or no ongoing maintenance.

Out of those embedded databases that include support for FTS queries – SQLite seems like the best choice.

SQLite is a software library that implements a self-contained, serverless, zero-configuration, transactional SQL database engine. SQLite is in the public domain and does not require a license.

Having picked SQLite the natural selection for me is FireDac (formerly AnyDac from Da-Soft).

FireDAC enables native high-speed direct access from Delphi to InterBase, SQLite, MySQL, SQL Server, Oracle, PostgreSQL, DB2, SQL Anywhere, Advantage DB, Firebird, Access, Informix, DataSnap and more.

To sum up the above:

  1. Task: provide full text search queries for a read-only folder-file structure (where file types are known and content can be programmatically extracted)
    • At one time, in most cases, only 1 user will “attack” the folder (and the FTS database)
    • Text extraction requires time – should be done out of users eyes
    • Once extraction is done and content is stored, provide FTS type queries
  2. Requisites: light implementation, free, no fat-bulky engines, easy to setup and use from inside the existing application.
  3. Possible solution: SQLite + FireDac (+Delphi)
  4. Possible “problems”: speed of initial extraction, size of the database, updates to the database (even if read-only things happen), …

Complex and Less Complex Tasks In Implementing FTS

The “complex” part is the text extraction as it can take some time to extract the content (text) from files and store it in the database for FTS retrieval.
Once a folder is processed, and since we are talking about read-only locations, the search functionality from within the application is not a complex task. Text extraction could run in threads, be implemented as a Windows service or something alike – that’s something I still have to decide (read: try out).

I’ve already done a proof of concept application using FireDac and SQLite and things seem to be nicely aligning to what the final goal is – of course on a small folder structure where text extraction takes a few seconds.

Next time I’ll share some code to how to create the FTS-enabled SQLite database supporting referential integrity and how to use FireDac.

As always is the case, I would not like to spend a few moths figuring out everything leads to a dead-end. :)

Any thoughts that you want to share, if you had some similar task to implement in your Delphi applications?

I would like to be as-sure-as-possible I’ve picked the right path.

Part 2: SQLite: Referential Integrity With Full Text Search Virtual Tables
Part 3: Full Text TXT Search In Delphi (+FireDac +SQLite). Sample Working Project.

It's a blong, blong, blong road...: Android resources

$
0
0

For those Pascal programmers looking at building Android applications, be it with Delphi XE5 or with Oxygene for Java (I work with both!), here are a few Android-related resources that may come in useful:

  • Google’s Android Device Manager– if you mislay your Android device this allows you to locate it on a map (if it’s got a data/WiFi connection) and also ring it (presumably if it’s a telephone – I haven’t checked whether this option does anything on a tablet). Clearly this is similar to Apple’s Find My iPhone functionality.
  • Using remote Android emulators – because Android emulators emulate the device CPU they can be hideously slow, and basically unusable in a VM. If your dev tool runs in a VM then it can be useful to communicate to an Android emulator (technically called an Android Virtual Device or AVD) either on the host machine or another machine on your network. This is a useful technique entirely independent of your chosen development tool as it revolves around how your local adb.exe communicates with the emulator. This post by Jim McKeeth runs through how to set this up using SSH. You can also find a write-up in the Delphi online documentation.
  • If you are using Oxygene for your Android development you may want to look at setting up your AVD to use an x86 CPU, potentially taking advantage of Intel Virtualization Technology via Intel HAXM (Hardware Accelerated Execution Manager) to provide VM acceleration. Delphi developers cannot take advantage of this because Delphi targets the ARMv7 CPU.
  • App testing across many devices. The Android emulator has long been held up as pretty much the only way of testing your app across the range of form factors that different devices can offer. Now it’s not the only option though, as Apkudo for Developers offers developers a free online app-testing platform where your app will be tested on over 260 different Android devices. Just upload your app to the queue and a report will be sent back when the tests have been run.
  • Since Android’s Ice Cream Sandwich release introduced the Roboto font as the default, you may want a copy to install on your machines. You can download it from the link in the blue box here (or this is the direct d/l link).
  • Google’s sample icons pack can be downloaded with this link.
  • For anyone who does presenting it can be very useful to have a means of showing on your computer screen what your device is doing. There are various VNC-based solutions for this out there, but Jim McKeeth has built a simple solution using repeated screen-captures called Android Screen View. You can download the source code for it here or pull down a build here.
  • The Android dashboards show you the percentage of devices sharing various characteristics as obtained from the Google Play store. All the devices in question will be running Android 2.2 (FroYo) and above.
    This device breakdown can be useful to decide what OS and form factor to ensure you support.
    On the dashboards you can see the breakdown of:
    • Android OS versions
    • Screen sizes and densities
    • OpenGL version
  • If you have a nose that needs to be poked inside everything, consider pulling down the Android source code. Information on how is available here.
  • Firebird News: GSOC LibreOffice Firebird Integration Weekly Update 14

    $
    0
    0
    New GSOC update for the previous week with current status of the firebird-sdbc driver : Progress this week: - Some dbexception cleanup. - Fixed ColumnLocate::findColumn implementations (for all db drivers) and api definition. - Fixed index rebuilding. - Tried to experiment with different ICU versions, but haven't managed to actually produce any errors when switching ICU version […]
    Viewing all 1725 articles
    Browse latest View live