Recent

Recent Posts

Pages: [1] 2 3 ... 10
1
Other / Re: Question for people who have built commercial apps
« Last post by marcov on Today at 12:04:56 pm »
Back around 20 years ago it was common for most major software running on the PC to be payware.  Nowadays it seems people increasingly expect programs to be free or low cost.  Is there some truth in this?

I don't think it is fundamentally just an audience thing. Of course, if there are free alternatives that are equivalent, why wouldn't they go for it? But if you can get something better suited for a reasonable price, why wouldn't you just pay it also?

So, yes, the free alternatives moved, but at the same time paid software got proportionality more expensive. In the last decade even more so due to subscription fees.

The reasons for that can only be guessed, but I think that 1995-2005 was an expansion time for software. Heaps of users entered the PC market for the first time, and market share among them mostly determined your next year's revenue.

After that, software directly marketed to end users became more a replacement market, and growing market share exponentially was less of an option and direct revenue (and thus company profitability) became more important. 

All this lead to price hikes and targeting the products at more advanced users that would pay those prices. That leads to a vicious circle where your audience becomes smaller and more price hikes are required.

As we are on a Lazarus/FPC forum, one of the ultimate examples of this kind of behaviour are the products of our direct competitor, Turbo Pascal and Delphi.  Their current commercial offerings start at Eur 1500/year. This was sub Eur 100  for an eternal license (or equivalent pre euro currency) for the cheapest, commercially usable edition a good 20 years ago.

Now there has been some inflation in that period, but not 1500%, and than I'm not even taking into account perpetual vs annual fee.


Even back then many software had free versions bundled with e.g. hardware. Scanner OCR etc, entry levels of photoshop with digital cameras etc.  route planning software with GPS equiped PDA's etc.

Quote
For those who have authored payware over the years I am wondering if you find some benefit in having a free community version instead of a trial version, and a premium paid version on top of that.  Have you gotten much benefit from this, or do you find you lose a lot of potential customers to the free version?  I am figuring increase uptake of the program would offset that.

I write software professionally for over 20 years now, but never sold boxed products to end users. Always B2B "solutions".

So we have established above that if you sell perpetual licenses, the number of users buying it will naturally decrease by year per definition in a not exponentially growing market like 1995-2005. And you still have to spend marketing to get even those.

That is where the free versions come in, these are architected so that the community version only covers one common, but occasional and basic use . People requiring the full product will have other uses/requirements that only the full product satisfied.

This essentially make the free users kind of a marketing instrument. People starting/testing the free version in companies and later upgrading, people using it are members of some club or forum related to what they are doing and tell what they are using etc.

Never make the mistake that a free user is a customer lost. Most would never have been a customer anyway. You will need to carefully craft your SKUs so that this relation between free and paid remains to not cannibalise your market.

It is a fine line that requires careful balancing. One tip that I think is smart is to make some way to end the free version. (e.g. some form of activation) Not so much to be able to take them off the market, but more to force your users always using the newest version with the conditions and limitations attached to that version. Makes the balancing easier, and allows you to correct a slip up int he balancing.

And also subscriptions. I share your dislike for them, and it is often not easy for non widely established products, but if there is something in your business model that requires annual updating of software (or its data), it might be at least an additional revenue source. Even if just at modest prices (so not pay for use, but pay for data updates), and at the same time that can be a vehicle to keep the upgrade train moving a bit, also improving revenue.
2
FPC development / Re: assembler name is longer than 16 chars
« Last post by Laksen on Today at 11:40:43 am »
You should not hardcode the assembler prefix. It should be determined automatically, or be configured by the user (The -XP<prefix> command). Just put the asmbin name as 'as'

If you need special cases try to look in "options.pas". Look for other places where utilsprefix is set
3
General / Re: Assign (textfile) not compiling - sometimes.
« Last post by Bart on Today at 11:35:37 am »
Those two do not belong there. They are simple aliases to system.assign() and system.close().
Should never have been introduced unless Delphi has them.
And of course Delphi has them, for the reason this thread makes ovious: if you use assign/close in a form's event, you'll get an error.

Bart
4
FPC development / Re: Warning: Source OS Redefined!
« Last post by Laksen on Today at 11:32:46 am »
Just do something like this. "ps1" would have to match the OS define that you create. But if you follow the same conventions otherwise it should be fine as below

Code: Pascal  [Select][+][-]
  1. initialization
  2. {$ifdef CPUMIPSEL}
  3.   {$ifdef ps1}
  4.     set_source_info(system_mipsel_ps1_info);
  5.   {$endif ps1}
  6. {$endif CPUMIPSEL}
  7.  
5
FPC development / Re: how to see what command string is passed to AS?
« Last post by Laksen on Today at 11:30:25 am »
"-sh" can be used to generate a ppas.sh file which contains the assembler command
6
General / Re: Slow copying of small structures
« Last post by alpine on Today at 11:25:10 am »
Thank you, that all makes sense.
@Alpine: It is about all operations on small structures where the compiler inserts a REP MOVSL, as in an operator or function, or when copying. Thanks for the hint with the hard types to cheat the compiler, that could be useful. In the matter at hand it won't help because the := operator is still an operator with infix notation, and the compiler will insert its REP MOVSL no matter what (inlining it does not change this).
By crafting the expression (see my last 4 lines) you can actually remove the REPs, but that's not the point. Generally, the infix operator notation will always require temporaries, hence operators are suboptimal. And fpc lacks copy constructors, static objects, etc. it's a pity.

Optimizing the copying of structures will be fantastic, but in the context of operators I doubt it will change the situation with regard to the procedures.
7
FPC development / assembler name is longer than 16 chars
« Last post by Key-Real on Today at 11:15:20 am »
cpugas.pas(261,40) Warning: (treated as error) String "mipsel-unknown-elf-as" is longer than "16"
cpugas.pas(293) Fatal: There were 1 errors compiling module, stopping
Fatal: Compilation aborted


but my AS is truely called  "mipsel-unknown-elf-as"


what to do?
8
Other / Re: Question for people who have built commercial apps
« Last post by BrassGear on Today at 11:12:50 am »
Personally I like to own something if I have to pay for it. I avoid anything with a subscription model for that reason, and another reason is the inflated cost compounded over years.
I think there are a lot of people that feel this way, but the software industry is trying very hard to move to subscriptions, for obvious financial reasons. In my opinion, it is better to support a model that favours reliability and longevity.
9
i need to see what command string is passed to AS.

is there a switch not to delete the script files

-a only does not delete the .s file
10
FPC development / Re: Warning: Source OS Redefined!
« Last post by Key-Real on Today at 11:07:49 am »
Code: Pascal  [Select][+][-]
  1. unit i_ps1;
  2.  
  3. {$i fpcdefs.inc}
  4.  
  5.   interface
  6.  
  7.     uses
  8.        systems;
  9.  
  10.     const
  11.  
  12.        system_mipsel_ps1_info : tsysteminfo =
  13.           (
  14.             system       : system_mipsel_ps1;
  15.             name         : 'PlayStation 1 for MIPSEL';
  16.             shortname    : 'ps1';
  17.             flags        : [tf_needs_symbol_size,tf_needs_symbol_type,tf_files_case_sensitive,
  18.                             tf_requires_proper_alignment,tf_library_needs_pic,
  19.                             tf_pic_uses_got,tf_safecall_exceptions,
  20.                             tf_smartlink_sections,tf_has_winlike_resources,tf_supports_hidden_symbols];
  21.             cpu          : cpu_mipsel;
  22.             unit_env     : 'LINUXUNITS';
  23.             extradefines : 'UNIX;HASUNIX';
  24.             exeext       : '';
  25.             defext       : '.def';
  26.             scriptext    : '.sh';
  27.             smartext     : '.sl';
  28.             unitext      : '.ppu';
  29.             unitlibext   : '.ppl';
  30.             asmext       : '.s';
  31.             objext       : '.o';
  32.             resext       : '.res';
  33.             resobjext    : '.or';
  34.             sharedlibext : '.so';
  35.             staticlibext : '.a';
  36.             staticlibprefix : 'libp';
  37.             sharedlibprefix : 'lib';
  38.             sharedClibext : '.so';
  39.             staticClibext : '.a';
  40.             staticClibprefix : 'lib';
  41.             sharedClibprefix : 'lib';
  42.             importlibprefix : 'libimp';
  43.             importlibext : '.a';
  44. //            p_ext_support : false;
  45.             Cprefix      : '';
  46.             newline      : #10;
  47.             dirsep       : '/';
  48.             assem        : as_none;
  49.             assemextern  : as_gas;
  50.             link         : ld_none;
  51.             linkextern   : ld_ps1;
  52.             ar           : ar_gnu_ar;
  53.             res          : res_elf;
  54.             dbg          : dbg_dwarf3;
  55.             script       : script_unix;
  56.             endian       : endian_little;
  57.             alignment    :
  58.               (
  59.                 procalign       : 4;
  60.                 loopalign       : 4;
  61.                 jumpalign       : 0;
  62.                 jumpalignskipmax    : 0;
  63.                 coalescealign   : 0;
  64.                 coalescealignskipmax: 0;
  65.                 constalignmin   : 0;
  66.                 constalignmax   : 8;
  67.                 varalignmin     : 0;
  68.                 varalignmax     : 8;
  69.                 localalignmin   : 4;
  70.                 localalignmax   : 8;
  71.                 recordalignmin  : 0;
  72.                 recordalignmax  : 8;
  73.                 maxCrecordalign : 8
  74.               );
  75.             first_parm_offset : 0;
  76.             stacksize    : 32*1024*1024;
  77.             stackalign   : 8;
  78.             abi : abi_default;
  79.             llvmdatalayout : 'e-p:32:32:32-i1:8:8-i8:8:32-i16:16:32-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-n32-S64';
  80.           );
  81.  
  82.   implementation
  83.  
  84. initialization
  85.  
  86.     set_source_info(system_mipsel_ps1_info);
  87.  
  88. end.
  89.  


it's not finished jet, but could You pls take a look?
Pages: [1] 2 3 ... 10

TinyPortal © 2005-2018