Show Likes

This section allows you to view all posts where this member received or gave a like to.

1
The Pub / Not So Mixed Signals
Arantor « on September 2nd, 2013, 03:50 PM »
Well, Nao wanted a topic, so here we go.
Quote
I've never had any problems with writing code that you didn't like, and reverting it...
I don't ever remember this actually happening? On the other hand I can think of several examples where you changed things, I made it very clear I didn't like it, explained why and was completely ignored. Like the sidebar changes in recent times - so much so that the *need* to move PMs out of the menu was apparent because it was the only way to know that I'd have messages (since the PM popup doesn't really count, especially if the PM count gets out of sync, which it does occasionally)
Quote
I see your leaving as an attempt to kill the project. Because you know I'm not comfortable with being the only one to manage it. There are so many areas that I entirely trusted to you, and now I have to learn about them thoroughly-- or just give up about them.
It'll be good for you to develop your skills, actually. Having at least an awareness of security, of optimisation of DB stuff (which, by comparison, is far more of a killer than byte optimisations tend to be), will make you a more rounded developer.

There are so many areas I trusted to you too, but when I had concerns, very often they weren't listened to. And when I did so much as breathe in the direction of those areas, I felt like I was always doing it wrong because every time you'd rewrite the code (how often, seriously, did I rewrite your code?)
Quote
It's not a good feeling, I'll tell you. Also, you were always the one who said Wedge wasn't in a releasable state. Sure it is.
Then release it and let the users be the judge.
Quote
Perhaps you were just looking for a way out, I don't know... But I have to deal with that now.
I have more respect for you than that. If I wanted out, I'd just say so. You even told me that I owed Wedge nothing and could walk away at any time. But it wasn't about 'wanting out' as such. The problem wasn't the fact that Wedge is a black hole where thousands of hours of work go into and for seemingly no reward, the problem is that I began to actively hate the experience of developing for it and I resented putting my time into something that made me feel like that.

I don't know if you've had comments from community members about my attitude and expressing sympathy or not, I daresay you probably have. On the other hand, I've had some comments (from people that, in a shock and surprise move, I'm choosing not to name) that they're surprised we ever hooked up in the first place, because they knew it wouldn't work out (and they're surprised it lasted as long as it did)
Quote
Anyway, I will release it alone, but you didn't make things easier for me.
Yes, because it's all about you, isn't it? On the contrary, I made things easier in several ways - firstly, I cleaned up the licensing situation as best I could. Secondly, I made sure that my own pet project which may or may not go anywhere doesn't have Aeva in it, so it's not like Wedge is losing uniqueness, and thirdly, I said it indirectly but might as well make it more formal: you're absolutely free to use any of my contributions in any fashion you like. I'm hereby granting an irrevocable licence to Wedge (or whatever the project becomes called) for any contributions I made, code, documentation, anything, under the BSD licence. If you want to relicence it, fine. But it's there.

If I wanted to kill the project, there are ways I could have done that, and far more effectively. I could have totally stitched you up, because I could have made the threat that nearly killed SMF in 2010 and I would have had just as much legal right to do, because I could have demanded all my contributions be removed because I still hold my copyright to them, which would have left you in a very strange and awkward position, as wesql would have had to be removed or at least reverted back to $smcFunc, along with removing the warning system, the ban system, the plugin system, the language editor, the rewrites of the bbc parser to use the database... the list goes on.


The bottom line is that I finally had enough of dealing with your attitude and I can't do it any more. Even now I feel like I'm forced to justify my decisions to you or explain them - I don't owe you explanations. I certainly don't owe you justifications. But here we are.

As for why I didn't make a topic, it's because it was a couple of lines of throwaway comment that didn't need to be a topic, more a simple observation that got sidetracked and blown entirely out of proportion yet again.

My pet project is experimental, it may not go anywhere but while I'm concentrating on C#, I'd like to feel that the last 10 years honing PHP and 3 years on Wedge wasn't a total waste.[1]

Will my pet project be competition? Not really. It's more really poor man's competition for WordPress than Wedge, but you believe what you want to believe, you usually do.
 1. Rule 5: Don't waste good.
2
Plugins / Re: Hooks
Arantor « on January 7th, 2013, 04:36 AM »
OK, so I've looked properly at the patch now, and I'm not entirely convinced it actually would work properly in SMF, let alone Wedge.

The return value of a called hook, particularly one where multiple functions might be hooked, is not what you think is. I might expect to see an array returned, sure...

Code: [Select]
array(
  'my_func_name' => array('error_key' => error details)
)

In every case of calling a hook, it's done through building up an array where the return value delineates what hooked function returned what by referencing the name of the function that was called.[1] Aside from keeping things separated from accidental collision, it does mean you can't rely on $hook_errors being empty, because it should return an array of functions that have been called, even if those individual items are empty.
 1. Yup, it's not really any different in Wedge, the exact syntax is a shade different in our call_hook vs SMF's call_integration_function, but the principle is the same, having a variable accepting the result of call_user_func_array() and putting it into an array.
3
Features / Improving search
Arantor « on August 9th, 2013, 07:40 AM »
So I've been thinking about searching and the way searching works and I've concluded a number of things.

1. I want Sphinx and ElasticSearch in the core
Both Sphinx and ElasticSearch are pretty mature. Both have live update features now, so there's no reason we can't support them both with a sort of push mechanism (rather than Sphinx's pull mentality, like the old API was geared for)... the API needs rewriting to support either anyway and I might as well do it all together.

2. I want to natively support other types of data than posts.
The current setup doesn't support anything other than posts and I want to natively offer support for other stuff - calendar, helpdesk etc. The backend can support these extra things with some work, and pushing these also allows nice support in both ES and Sphinx.

3. It adds some nice feature parity with other systems without adding a ton of headaches for support.
XenForo offers ES with a $60 plugin, though I'm not entirely sure why. IPB has Sphinx in the core. Neither appears to have a huge support overhead because of them. And for the most part once they're done, they're done from our point of view.

4. The most controversial aspect of this is what I want to propose last: ditching unindexed searching.
Right now, the default searching method in Wedge is as it is in SMF: no index. It's slow, and doesn't scale beyond a few tens of thousands at peak. In fact, where we are right now on wedge.org is probably about the limit of what we can do with an unindexed DB before performance starts to go nuts. (40k is really the upper limit)

Now, partly this is because we've never configured it to be anything else, and most people just wouldn't know to do so because they wouldn't know any better. Now that's fine, because we know that people don't generally touch the settings unless they're directed - but using the search index would deliver better search performance from about 1k posts and up (and largely a push in performance terms for where things are right now for fresh installs)

I see no reason why 'no index' ever needs to be a valid search type. I'd suggest dropping that entirely and using the 'no index' option to mean 'no searching'. And then leaving the other index types to be actual index types, which would simplify the search code as well (and properly allow for it all to be segregated back to the APIs, some of which has already occurred but plenty more still to do)

This would leave us with three working search types (standard - formally known as custom, ES, Sphinx), of which 'custom' would be set as default on installation and would be populating posts as they are created (rather than having to deal with a huge index creation at once)

ES and Sphinx are both VPS level options, but there's no reason we can't have people pushing content to these indexes while using the custom index - plus of course there are always options for rebuilding indexes.


Does any of this make sense? Any questions?
4
I saw that 2.1's upgrade actually fixes this.

But in our case, yeah essentially that's what it would be, call DisablePlugin for all plugins before the upgrade was carried out, then perform the upgrade.
5
Plugins / Documentation for plugin authors
Arantor « on September 20th, 2011, 03:01 AM »
This is mostly a descriptive post, of the mechanics of the add-on manager. If you're not a programmer, it won't interest you at all, but if you are, particularly if you ever plan on writing an plugin for Wedge, it will be of use to you.

NOTE: Some of the mechanics are not yet implemented, but this should serve as the reference for its mechanics.

Also note: plugin authors are not required to understand the inner workings of ManagePlugins.php, in order to write add-ons.


So, what is a plugin? How do they work?

At its simplest, a plugin is a folder within the /plugins/ folder. Inside that folder is a file named plugin-info.xml, and one or more files that relate to that plugin. Some of them will be code, some of them perhaps images or other resources, but at least one should be code to be loaded and executed at appropriate points in the runtime of Wedge.

This forms the underpinning of Wedge's plugin system: hooks. There are points in the code, given named references, which routines in your plugins can hook onto, and state that they want to be executed when that code is.

For example, there is a hook in the board index code, where the list of boards is prepared. Any function that wants to be called at that point will be called, and the list of boards that the user should see will be made available to those functions, and can be modified there. There are many more hooks, scattered throughout the source of Wedge, and likely more will emerge over time.

At its simplest, a plugin need only contain a single file containing a single function, and the appropriate hook to call. (The hook will not only run the function, but make sure to load the file first)


An example
Here's about the simplest possible plugin that can be written. It contains two files, the plugin-info.xml and a PHP file, demo_plugin.php.

plugin-info.xml looks like this:
Code: [Select]
<?xml version="1.0" standalone="yes" ?>
<plugin id="Arantor:DemoPlugin">
<name>Demo Plugin</name>
<author>Arantor</author>
<description>Changes the "Home" button on the menu to read "My Home Page"</description>
<version>1.0</version>
<hooks>
<function point="menu_items" function="demo_function" filename="$plugindir/demo_plugin" />
</hooks>
</plugin>

And demo_plugin.php looks like this:
Code: [Select]
<?php

function demo_function(&$items)
{
$items['home']['title'] = 'My Home Page';
}

?>

When unpacked, both files live in /plugins/demo_plugin/.

Now, the Plugin Manager will show this as an add-on to be enabled; it'll provide the name and description to the user, with an enable button, to allow them to enable it.

When enabled, the code is made aware that when handling the main menu (wherein there is a hook called menu_items), it should load $plugindir/demo_plugin.php (note the .php is added automatically), and run demo_function().

Exactly what a given hook will make available to a plugin will be hook specific, but more on this once the list of hooks is completed.

That's really the foundation of how to build an add-on for Wedge: the plugin-info.xml states what should be done when, and one or more extra files contains the rest of the functions to run.

Vastly more powerful plugins can be constructed out of this basic framework, and even just with this toolset, a lot is possible, but if I were to leave it just at that stage, I would be remiss in my developer duties.


More advanced hook setup

Firstly, an extract of the <hooks> block from WedgeDesk's installer:

Code: [Select]
<hooks>
<function point="display_buttons" function="shd_display_btn_mvtopic" />

<language point="lang_who" filename="$plugindir/lang/SimpleDeskWho" />

<provides>
<hook type="function">shd_hook_init</hook>
</provides>
</hooks>

I haven't quite finished renaming all the files (though I have done most of them). In this case, when we display a topic, there's a hook called display_buttons, which is for modifying the list of buttons that apply to a given topic (e.g. reply, print page, and SD/WD add one for moving topics to the helpdesk), which is what's happening there. There's no file to load, because I know that Subs-WedgeDesk.php will have already been loaded, and that it contains that function.

Then, we have this odd type of hook: a language hook. Normally, you'll define functions to be called, but in certain cases, you might simply just need to load a language file, which is exactly what the language hooks do. Most importantly, they're in the help pop-up and Who's Online pages, where add-ons very typically need to add their contents.

Note: There is no more Modifications.english.php file to modify. Things you'd normally add to Who's Online there, or to Who.language.php directly, just dump into a new file and call through the language hook.

Then there's this really odd thing: provides. This is for when plugins actually declare their *own* hooks. You may have noticed there isn't a version check, and that's because the design generally doesn't need one.

The vast majority of plugins are expected to use the hooks provided, and in which case, they don't generally have to care what version of Wedge they're running with. All they need to know is if the hook is available or not. If it's not, generally you won't be able to install it (because it checks the list of hooks you want to use, against the list it knows it has)

The point of provided hooks like shd_hook_init is that plugins might want to extend other add-ons. I fully envisage writing WedgeDesk plugins and making use of those hooks to do so.

There is one other thing I haven't mentioned: optional hooks. Simply add optional="yes" to the <function> item, and if the hook isn't available, it won't prevent installation, but it will still set it up as if it were. The point of this is if you create a plugin that can work with another, but doesn't *need* it to be installed.


Settings

A fair number of mods don't need much but they do depend on settings existing and having default values. Well behaved mods will check on use with empty(), and some others[1] will go away and create the settings in the database if they don't already exist.

Well, in the setup you can declare the settings your plugin uses. It also means that when we get on to clean-up and uninstallation, the settings are cleaned up to the user's request automatically.

Code: [Select]
<settings>
<setting name="shd_new_search_index" default="0" />
</settings>

Very simple structure: you just create a <settings> block that contains all the settings you want to use, and then a <setting> per actual setting. Note that it won't create the setting if it already exists in the system, but if it does already exist it will use the stated default. (You do need to state a default value.)


Readmes

Everyone likes readme files. The setup in the Plugin Manager allows you to provide readmes, and do so in a fashion that allows for multiple languages.

Simply add a block like so:
Code: [Select]
<readmes>
<readme lang="english">$plugindir/readme/readme.english.txt</readme>
</readmes>

As long as you put $plugindir at the front, and the file actually exists, it'll be provided to the user when they click on it.

More specifically, it looks through the <readme> items for languages installed by the user, so if English and French are installed and an plugin supports more, only English and French will be shown, and there will be a little flag icon for them to click on. Remember: this is all pretty much automatically handled on your behalf: you just need to provide the readme files in the add-on and link to them in the plugin-info.xml file.


More hokey magic: scheduled tasks

I don't think this is something that's going to come up that often, but it's convoluted enough to do manually that I wanted to make it easier.

Creating a scheduled task in the system is as simple as adding this block:
Code: [Select]
<scheduledtasks>
<task runevery="1" runfreq="day" name="shd_scheduled" file="$plugindir/src/WedgeDesk-Scheduled" />
</scheduledtasks>

One task per <task> block, and it should be fairly obvious that again, you're indicating how often the task should run, what function to call and a file to load that contains that function.

(NB: Right now the task won't receive a name in the admin panel properly, I haven't yet quite decided how I want to fix that, but rest assured, I'll provide examples once I figure it out.)


Lastly, database changes

This is the big kahuna. If you've used SMF's $smcFunc['db_create_table'] structure, you'll recognise this because it's mostly the same.

Before those who tell me they hate XML or whatever come in: there's a very good reason it's done this way. It means that when it comes around to removing the plugin, the manager can cleanly deal with it properly, something that didn't always happen where installer scripts were left to their own devices to manage tables.

Another example from WedgeDesk showing what goes on:
Code: [Select]
<database>
<tables>
<table if-exists="update" name="{db_prefix}helpdesk_tickets">
<columns>
<column name="id_ticket" type="mediumint" autoincrement="yes" unsigned="yes" />
<column name="id_dept" type="smallint" unsigned="yes" />
</columns>
<index type="primary">
<field>id_ticket</field>
</index>
</table>
</tables>
<scripts>
<enable>$plugindir/enable.php</enable>
<disable>$plugindir/disable.php</disable>
<remove>$plugindir/remove.php</remove>
<remove-clean>$plugindir/removeclean.php</remove-clean>
</scripts>
</database>

It's a very shortened example but it gives you pretty much everything you need to know.

So it looks to create {db_prefix}helpdesk_tickets (wedge_helpdesk_tickets, then), and this sample has two columns. It should be fairly clear what's going on here, but notice the lack of 'size' being stated. You can, if you want, state the size, but for numeric types, the size will be calculated for you if you don't state it (for example, mediumint always ends up being mediumint(8) if not stated because that's the range mediumint covers[2])

The range of types is increased too, you can have the named int types (tinyint, smallint, mediumint, int, bigint), plus float types (float, real, double), string types (char, varchar)[3], block string types (text, mediumtext)[4] and bitwise types (set, enum)[5]

The other notable thing here is that you just specify the tables. If the structure is different to what's in the current table (e.g. you're adding new features to a mod), the existing table will get the new/changed columns updated. It will NOT remove any existing columns, however.

It will also add any new indexes that you state, but it will not alter or remove primary or unique indexes. This is to protect the integrity of your data; if you need to do this, you can manage it during the enable script, which I'll get into in a moment.[6]

You'll notice the <scripts> block. None of them are required, but you might find it useful to add them if necessary.

These are scripts which run at the appointed time to make any changes that can't be readily automated, especially if they don't occur on a decent number of plugins, or aren't particularly standardised.

WedgeDesk, for example, uses this functionality to make sure that a department exists after installation, when the table may or may not exist, and the table may or may not have a department created even if the table did already exist.

<enable> runs during the time of an add-on being enabled, <disable> when it is being disabled[7], <remove> for when an add-on is being removed, but that data should be kept, and <remove-clean> for when data should be removed as well.

There are also plans to add functionality for adding individual columns and indexes to tables. For the most part the XML looks the same, just it's contained in the <database> tag rather than in a specific <table> tag (there's a <columns> container at <database> level), and each <column> also states the name it should be in, but otherwise it's the same. Ditto for <indexes>.


Phew, so what actually happens when a plugin is enabled?

(Yes, we're almost done!) Enabling an add-on is reasonably straightforward.

The list of operations that is carried out is as follows:
* Verify that the plugin-info.xml file exists and makes some kind of sense.
* Check that any requirements stated in the file are met, in particular hooks. More on this at the end, because some of it is so rarely going to be needed, I haven't bothered to cover it just yet.
* Look at the contents of the <database> tag, whether there are any changes to make. If any are specified, the order of operations is: new/updating tables first, then new columns, then new indexes.
* Run an enable script if specified.
* Check if any settings are stated, whether they already exist and if not, add them to $modSettings.
* Check if any scheduled tasks are stated, whether they already exist, if not add them, otherwise update them.

Lastly, we handle hooks. The process is fairly complex at this point, so if you're really interested, this is the part to pay attention to.

A plugin will have a $folder and an $id. The folder is the physical folder name it has within the /plugins/ folder, and its id is stated in the plugin-info.xml file, right up there in the <plugin> tag right at the top. The distinction is quite important: the id is under the control of the plugin itself, but the folder might not be.

I've seen all kinds of weird cases where folders get mashed by users, sometimes intentionally, sometimes not. So the folder name is made available to the add-on to make use of, and it's always reference-able from its id, assuming it's enabled.

The exact process that happens inside the manager is as follows:
* an array is built, it contains firstly a key 'id' that contains the plugin's id.
* the remainder of the array is simply the list of hooks it refers to, one item per hook, in the format of function-name|file-to-load|plugin (this last is a literal, and helps the hook code identify that it is an plugin that has to be dealt with rather than a hook used otherwise for integration)

This array is stored, serialized, as $modSettings['plugin_' . $folder], and the $folder will be added to $modSettings['enabled_plugins']. (This is simply a string variable containing the folder names of all enabled add-ons, separated by commas)

Note, very importantly, that hooks are not saved to the master hook references (i.e. $modSettings['registered_hooks']) and that except under very specific circumstances, they should not be, either.

This is because during run-time, specifically after $modSettings is loaded, this is when hooks are initialised, and the contents the plugin_* entries are transferred into the hook references. In case a user does something like directly delete an add-on folder, the intention is that it should safely disable the plugin, instead of breaking everything.

During init, $modSettings['enabled_plugins'] is exploded, and each named folder is examined to check it exists, and that there is an plugin-info.xml file in that folder. If so (and only if so), the hooks are engaged, and from that point on, the plugin is enabled and will be called by the system as and when it has indicated it would need to do so.

Three variables are also made available to the system at this point:

$context['enabled_plugins'] - this is an array of all enabled plugins. Unlike its $modSettings counterpart, the key of the array is the plugin's id, and its value is the folder inside /plugins/, so you can always identify where a given plugin should be from that. (And, by proxy, you can also identify which plugins are available.)

$context['plugins_dir'] - another key/value array, this time the key is the plugin's id, and its value is the physical resolved path to that plugin's folder, e.g. /home/myuser/wedge/plugis/myplugin. This is needed so that source files, templates and language files can be loaded.

$context['plugins_url'] - another key/value array, much like plugins_dir, but the URL counterpart. This will allow you to reference your plugin for images in HTML.


Now I have my add-on, what happens when I want to do big stuff with it?

While, yes, small plugins might only be a single small, self contained file, it's highly likely that you're going to want to do bigger plugins sometime, and that means you're going to need to integrate other files, like loading other source files from the plugin directory, or templates, or language files.

It just so happens, hah, that there are functions designed just for this purpose, to make it easier to handle loading things and to abstract away a lot of the underlying mechanics.

I have mentioned these before, but no matter, let's cover them again.

loadPluginSource($plugin_name, $source_name)
 - takes the plugin's id and the file within to load, relative to the base of the plugin itself. If you have an add-on that doesn't have subfolders, just use the file's base name, e.g. MyPluginFile (the .php will be added, as will the rest of the path), as this is analogous to how loadSource works in the rest of Wedge.[8]

loadPluginTemplate($plugin_name, $template_name, $fatal = true)
 - much like loadTemplate generally, you specify the plugin's id, the template name (without .template.php) and whether it should fatal-error if the file couldn't be found. Much like loadPluginSource, specify a path relative to the plugin's folder if you need it, or not if you don't. If you keep templates in a subfolder, like tpl/, then just use tpl/PluginTemplate, or whatever you're using.

loadPluginLanguage($plugin_name, $template_name, $lang = '', $fatal = true, $force_reload = false)
 - used for loading language files. You probably get the idea how to call this by now, and in all respects other than the fact it uses the plugin's directory, it works much as loadLanguage does: you specify the language you want to use and if that's not English, it'll attempt to load that language, falling back on English if necessary.


What about CSS and JavaScript?

While I mentioned $context['plugins_url'] for images, it's generally recommended to *not* use that to load CSS and JavaScript for add-ons. Remember: Wedge has minifiers and similar tools built in that help save bandwidth for both CSS and JavaScript, and really these should be used in preference to adding it manually.

There is a pair of functions for just this purpose, which you can call from your own code.

Code: [Select]
add_plugin_css_file('Arantor:WedgeDesk', 'css/helpdesk', true);
add_plugin_js_file('Arantor:WedgeDesk', 'js/helpdesk.js');

The structure should be fairly obvious - like everything else, it requires the plugin's id, and the file relative to the plugin's own folder. (WedgeDesk has a css/ and js/ folder)

Notice also that the JS is the only one that actually uses a .js extension, everything else does not. In case you're wondering, the 'true' is a reference to add_css_file, and it means whether or not to include the cached CSS file into the header or not, if true, add it to the header and deal with it automatically (recommended for add-ons), false means to simply return the URL to it.


Anything else of interest?

There is also one last item of general interest in the specification: <acp-url>. In there, you simply put in the part of the URL after index.php? that your add-on's settings live in, e.g. <acp-url>action=admin;area=wedgedesk_info</acp-url>. That way, if your add-on has settings, you can direct users to it, and if not (and not all will), you can leave it omitted.

I think that's pretty much everything about how it behaves.


Hang on, you said about file edits.

I did originally think about adding them, but in the end, I came to the conclusion that it's just too unreliable to allow and that while it might hinder pushing for that very peak of performance, and it does cut out some functionality possibilities, it makes life safer for everyone else, and that is more important to me.


Right now, at least, that really is everything!
Posted: September 20th, 2011, 02:45 AM

I forgot to mention a couple of things. There are a few refinements in the error log system and in the language editor.

Error logging

Since we have a list of all the folders that plugins live in, and we know the file an error occurs in, we can check to see if that file is in one of the plugin folders we know we have - so if an add-on causes an error, it's normally possible to trace it back to that plugin.

Language editor

All the language files (at least, anything matching *.english.php when using English, and similarly for other languages) in a given plugin are shown in the language editor underneath the normal list of strings in themes, so you can edit the language strings for any plugin you have installed.
 1. Depending on your perspective, this may be less or more well behaved.
 2. 0 to 16777215 (8 digits for unsigned) vs -8388608 (8 digits for signed) to 8388607, if you're wondering. The others are all worked out for you, for tinyint, smallint, mediumint, int and bigint.
 3. If size isn't given, it defaults to 50 characters.
 4. Naturally, no size is applicable for these, and it won't let you set a default for them either.
 5. You need to add a values attribute, e.g. values="'1','2','3'", with the values as single quoted with commas. It's not a big ask, seeing how it's the same that phpMyAdmin asks of you, and it's not like you're going to do it all that often.
 6. This is a functional improvement over SMF; 2.0 RC3 featured the ability to add new columns to existing tables, just off the create_table call, but didn't touch indexes, by the time final shipped, this was removed, so mod authors were expected to manage any changes themselves as opposed to SMF doing it for them. I not only reinstated the ability to make such changes, I added index changes, and made it possible for the schema changes to be carried out in a single ALTER TABLE statement for each table, rather than one ALTER TABLE per operation that needed to be done. Thus the total number of file operations that involve creating one or more duplicates of the table is limited to one per table.
 7. Think of 'uninstall' in relation to SMF mods, and you have the right idea, but it is typically a disable here rather than undoing code edits.
 8. You shouldn't, generally, need to reference $sourcedir or $pluginsdir manually, which is why loadSource and loadPluginSource even exist.
6
Other software / Re: Arantor back on SMF Team!
Arantor « on October 10th, 2013, 10:03 PM »
Here's an idea. Read my posts.
Better idea: ask me rather than pointlessly speculating about this crap.

I don't owe any of you an explanation but I'd rather the record be set straight if only to stop the pointless speculation.

I left Wedge because I was unhappy at the relationship Nao and I had. The fact that I'm now the bad guy and on the wrong end of some of his attitude in various places is a side matter. I am still unhappy about it but nothing's going to change anyway.

I warned him even before I left that I'd probably end up contributing to SMF rather than going it alone because I don't have all the skills to successfully launch, support and maintain such a project by myself.

I then did attempt to contribute some small things to SMF and ran into the brick wall that was Github. And didn't want to because of the hassle I was experiencing. I subsequently found a better Git tool than the skanky Github for Windows tool and have not had any problems since.

Meanwhile other events were going on (such as the project manager leaving, certain comments were also made in public that made me believe there were some distinct amounts of backstabbing going on) that made me say I weren't interested in collaborating with the SMF team.

So while all this was going on, I was working on Pyrapage, exploring some of my ideas, before realising I was so far out of my depth I was likely to drown.

The issues with the SMF team then got resolved in a way I was happy with. I spoke to the team about rejoining but the vote was put before I formally said 'I want to join', and the vote was firmly in my favour, and while it was going on I formally said sign me up.

And here we are. I don't see that I'm being unpredictable, it just appears that way because you don't have the full story. And the bits you do have, you choose to ignore for whatever reason.


Here's a thought. Nao, maybe if you didn't have your head so far up your own ass all the time, that you can't hear anything for shit, none of this would have happened.

I'm mostly disappointed about how little some of you actually think of me. Keep your pity. Give it to someone who might actually find some use for it.
7
Other software / Re: Arantor back on SMF Team!
Arantor « on October 21st, 2013, 04:28 AM »
So if you're going to talk shit about me, at least have the courtesy to do it in public, because this topic isn't public.

Firstly, you want to bitch about my including 'Wedge' code in SMF 2.1... except you didn't bother to notice it wasn't actually my commit. If you look at TE's link, you will see it was Live that introduced it, I merged it because I wasn't paying attention and then I fixed it.

Secondly, I don't deny I pulled a dick move. But frankly it was better than the alternative. I was honest with myself, and honest with you. More than I'd been in months. I've given you my reasons for doing what I did. I don't ask you, or anyone, to understand. It's quite clear you don't want to even if you are capable of doing so.

Thirdly, I'm perfectly within my rights to use my ideas and my code in SMF if I so choose. I don't see what it is you're actually bitching about because you never liked the changes I made to the admin panel as you're so fond of telling everyone who'll listen.

Here's the thing, I pulled a dick move but I held up my end of the bargain in the aftermath. I gave you a licence in writing to ensure you'd never have any problems with my code from a legal perspective, as I told you I would. I could have been an insufferable ass about it, but I wasn't. I did the least dickish thing I could do about it.

In fact, if you were to ask the team, they'd probably turn around and tell you that I was surprisingly considerate, there are things coming that I asked them if I should tell you about, because I thought you should know, things that affect Wedge as well as SMF, but since all you can do is stab me in the back every chance you get, no special treatment there.

Next time there's a security issue, you'll have to wait for the patch like everyone else. Then again since it'll be me working on it, the odds are you won't trust it anyway because you don't think I'm particularly competent - that much is evident. But I'll leave you to figure it out from the patch like everyone else gets.


Here's the kicker: I don't want to fork Wedge. The more I look at it, the more incompatible it is with what I have in mind for future SMF versions. SMF may not be as fully featured as Wedge, but there's absolutely no way the code is better in Wedge. The amount of stuff rammed through the buffer at the end of page processing is shocking.

Still, let's see how things progress over the next year, eh?


EDIT: I can't believe I got sucked back in to this drama again. Some people were considerate enough to tell me what you'd been saying about me. And for the longest time I tried not to care (as people you won't believe will happily attest). But it got to me, it got to me that I still care what other people think.
8
The Pub / Re: Not So Mixed Signals
Arantor « on September 5th, 2013, 06:37 PM »
Phew, lots of stuff here. So, let's try and make sense of it all. I'll break it down into the key points that seem to be coming up.

Perfect vs Good
I'm only too aware that perfect can be the enemy of good. My concerns over releasing/not releasing were never about perfect vs good, but good vs unfinished. Let's make this absolutely clear: look back through the logs and tell me how often I tweaked something I'd made. Tell me how often I went and changed things that I wasn't entirely happy with.

Most of my commits were removing things I didn't like or adding new things. Very few were just changing things I wasn't entirely happy with. That's why I made half the number of commits Nao did: I don't tend to commit and iterate, I iterate then commit when I'm happy with it.

I think it's fair to say that I'm not laden with the perfect vs good problem.

The problem I do have is that while my code isn't sacred to me, people just aren't listening to the problem I DO have. If my code is bad enough that it needs more than tiny modifications, it's obviously sub par, so I obviously did a bad job. It's nothing to do with leaving the nuts and bolts to someone else, it's the fact that I constantly have the feeling of turning in B-grade work, even when it's A-grade work, just because it doesn't fit with someone else's sense of coding aesthetics.

Innovators vs Iterators
I wouldn't consider either of us 'better than the other' in terms of innovation.

We've both done things that we have the right to be proud of, and Nao has outlined some of the things he's proud of within Wedge. I'm very proud of the plugin system, and the warning system. I'm proud of the fact that I was able to do some things that I'd never have been able to do in the SMF ecosystem even if I'd been given the keys to the kingdom, like going UTF-8 only.

But to me, none of that is actually innovation. It's all iteration on what was there already.

The plugin system is simply a case of addressing the numerous issues I saw in the current SMF package ecosystem (ensuring hooks have more power, checking hook existence, using it as feature detection, etc.)

The warning system, again, it's a case of addressing issues I saw in the SMF one; the notion of being able to revoke a warning (rather than warning with a negative %), the notion of being able to tie punishments to specific warnings, to be able to have much more gradual punishments, and to tie that lot together to be able to grant punishments that fit the crime better (Bad avatar? Remove the avatar.)

I cannot name a single thing I added to Wedge that I can justifiably call innovative. In some ways that made it harder because I was already working on the premise that I wasn't doing what I wanted, but what needed to be done.

On the other hand, some of the stuff Nao added does seem innovative to me, at least in the forum world: footnotes, infinite scroll (it may not be in itself unique but Wedge is the only forum software that has it as a core feature), thoughts etc. so already there's a feeling of inadequacy on my part. And yes, that does suck.

I find it interesting that we seem to feel the same way about each other for this project, that neither of us seems to feel like an innovator and that feels the other is. Your perspective on this will likely be different to mine.

On not being bold with communication
This is always going to be a tough one. Despite my general exterior and persona I give out of being strong voiced, I'm really quite introverted. Anyone who's seen the Crossing Overland videos will know how little I tend to say in person.

Then there's the general attitude of the English that's thoroughly part of me, i.e. the stiff upper lip, the keep calm and carry on attitude.

And to be fair, a lot of the issues that annoyed me didn't annoy me enough individually to do something about them at the time, so I let them go.[1]

Stuff like the autoloader really annoyed me because for the sake of a little extra typing (or, even coming into the 20th Century and using auto complete in various tools), we could have simplified the structure of a bunch of things and made performance gains from not having enormous files whose content was not used perhaps as often as one might expect.

Especially, for example, considering my thoughts around going down the CMS route. In a pure CMS, things like the stats updating that SMF does just aren't as necessary (because they're never called so often), censoring is not needed so often, and things like that. These are things loaded every page that just do not need to be in those situations. So you'd hive them off because that makes sense to do.

Anyway, I'm digressing. My psychological nature is predisposed to avoiding conflict if possible, and every time something came up that I didn't like, I was forced to choose whether it annoyed me enough that I wanted to say something or just say nothing and accept it. The problem was that in the cases where I did speak up, I don't feel I was listened to - even when I went into long and thorough arguments about why I didn't like something.

Short of getting into shouting matches over everything I just accepted that I was wrong most of the time and left it at that, until I just couldn't do that any more.

To the people who said I should have been more forthright in my views, could you honestly go back over my posts and say I wasn't forthright in my views? Could you honestly say that I didn't try hard to be heard?

I understand Nao's reluctance to read every post. But I did it. I read every post on the forum, even the ones I never replied to, and tried to take that on board. It wasn't always successful but I tried it. On the other hand, I suspect that if he had tried to read more posts - not even all of them, but just a general selection of them, he would have a different view of both me and of the userbase.

One of the things I have been unhappy about for some time - and this affects Wedge rather than my interpersonal relationship with Nao - is that Wedge has two different directions in the code. It has a bunch of stuff that users will use either directly or indirectly, and it has a bunch of cool stuff. The problem with the cool stuff is that it directly affects what goes on in the ecosystem.

I sincerely dread the day when Wedge is let loose and designers take one look at it and try to figure out how to make it all work. Templates being piecemeal unlike SMF's monoliths, they'll have to deal with that. The CSS preparser... they'll have to deal with that too but I like to believe they will ultimately find it useful to have that rather than not. But trying to make interesting layouts that aren't just colour changes, while trying to make wireless, infinite scroll, userbox moving all still work... that's a challenge I simply don't envy them having.

What I think that means is that most themes will be simple colour variations.

Superior vs equal vs inferior
I have in the past talked about my office life. Over the 5 years I was in that career path, I had a number of team leaders through various reorganisations, 6 if my recollection is correct, and that's not including the more senior managers that were above my team leaders with whom I tried to ensure I had a good working relationship as well.

Of those team leaders, only two of them were somewhat less than successful. The first of those two was because my team leader and I had different views on the way things should be done. As will probably be clear from conversations here, I have a very strong sense of ethics and about things being done properly, but that I'm willing to compromise over correctness when it is appropriate. My team leader on the other hand, was of the view that compromise was the way forward wherever possible, that closing the deal was most important.

The best example I have is a mortgage deal we were working on.
(click to show/hide)
I should clarify the situation; our department dealt with new mortgages being issued, I worked within the latter part of the process, dealing with solicitors/conveyancers, in making sure all the paperwork was provided and correct and that the company's legal coverage on the mortgaged property would be all solid.

You can imagine that this is the ideal sort of situation for me, really, and in many ways it ways. There were rules, there were places the rules could be bent. And for someone of my tendencies - strong on knowledge retention and doing it properly - this worked out.

Then we had this deal come in that the new sales rep was so keen to push because it was a demonstration of our flexibility. It all centred around two houses that had been knocked through into one but were legally still two properties on the title deeds and how this would get resolved.

I took the case to the lead and told him why it wasn't going to work out because of the way it was currently registered and that it couldn't physically be fixed. He took the view that it wasn't our problem provided that the lawyers dealing with it signed a declaration that they would get it fixed - apparently that was enough for our protection, since lawyers acting for the lender are required by law to protect the lender's interest.

Unfortunately that's what happened. The leader spoke to the lawyer, got a letter from them, and whatnot. And I said I wouldn't sign it off. There was no way I was putting my name on that case and interestingly enough no-one else would either. In the end it had to be signed off by the director of operations (who is a people manager, essentially, and had no real idea of what it all meant)

And sure enough, this came up during my end of year review as not being flexible and obstructive etc. Fortunately for me, I'd kept note of the case number and knew he would pull it out at the meeting, so about a week before then, I sent an email to the customer services team, who dealt with cases after they'd been funded, to find out what happened to it. Imagine my surprise when I discovered the case had been handed to the litigation team because the security was impaired. I even got them to email me the notes about it and brought it to the meeting. As you can imagine this did not go down well.

The problem was ultimately a clash of ideologies and to a lesser degree a lack of respect. I took his position under consideration but my job description carried the line that my responsibility was to protect the interest of the company to the best of my ability - and that's exactly what I did. The fact I was overruled was not my problem as I'd done everything in my power to protect them.

The second manager was a real piece of work.
(click to show/hide)
By this time I was an auditor with the company. You can imagine how well that worked out for my general anal-retentive attitude.

And at this point my partner worked at the company in the same team, but as a 'probationary' or 'trainee' or something. Anyway, she worked in the same team doing the same job, but for several thousand pounds less a year.

The team leader wasn't impressed that Liz would defer to me more than the others, but the reason for this was never entirely understood: because I was *competent*.

We were given the cases to review prior to funding - so the job I used to do (see the first spoiler) was about getting the paperwork in and reviewing it and passing it to the funding team, then the funding team would review it and press the magic buttons.

And having been a mortgage processor, I knew exactly the sorts of crap that used to go up to the funding team and what the funding team used to kick back to me, haha.

Anyway, there was a list of things that had to be checked that the team had to do for each case. 118 items if memory serves, all yes/no/not applicable questions. So, just check that the system has the right details in it, answer the questions.

Problem 1: what if you notice something wrong that's not in the questions? Answer: You're not supposed to be checking anything other than the list because the list is sacred.

Problem 2: what if you're more conscientious and just check it anyway? Answer: You get blasted for spending more than 10 minutes on it. Yes, we were timed, and managed on that crap.

I frequently used to turn in what clocked up as '4 and a half hours work' because I did it thoroughly, and not just what the team leader's best mates did, which was the minimum possible to get the job done, and that's how the 10 minutes time was arrived at.

It should be of no surprise that come the quarterly review from the lending quality team that cases I approved for funding had the fewest errors in percentage terms. Quarter after quarter this happened. Funny that.

But I messed up the figures for the team leader by looking like I wasn't working hard enough, though the more senior managers all understood what was going on. Trouble is, she was of the understanding that I was trying to undermine her at every opportunity; I wasn't. I just didn't agree with her managing-by-the-numbers and not really caring about little things like quality.

It should be of no surprise that a few months after I was made redundant from the company, that they collapsed entirely, when you have people like that at the management helm.

The problem as you can probably imagine is not that I can't work with managers. The problem is that I can't work with managers who can't understand where I'm coming from.

As I have said on multiple occasions - though I think this is another thing no-one listened to - I have no problem with being disagreed with or even overruled, provided that I have the feeling that what I had to say was taken into account. I don't just say things for the sake of saying them, I say them because I believe they're important to say.

The two managers I reference above rarely listened to what I had to say unless it agreed with what they already thought in the first place. This isn't a respectful setup and I have no time for it. Funny how all the other team leaders understood my points when they were made - even when they didn't agree with me and even when they overruled me, they at least listened and took it on board.

Control versus contribution
There is an interesting problem related to this, but it relates also to the whole lead vs follow debate. I can lead when it's appropriate, I can follow when it's appropriate. Whichever would best get the job done, I suppose.

The problem is when I'm told that I'm a leader but have to act like a follower, like we've had here. In fact, I find this quote from Nao most telling of all:
Quote
But if he ever were to rejoin the project, despite all of the qualities I just listed, he would have to settle on being an advisor and a co-lead developer, but not a decision maker (which wouldn't even be a problem more than a couple of times a year.)
This would merely continue how it's actually been for most of the last year to 18 months, if not longer. It would simply formalise it and make it clear that this is how things would be.

Ironically, had Nao outlined to me on day one that this is how he wanted to work, I could probably have made that work. It was always stated that we were equals and yet we never really acted as equals.

Two people may be a crowd when it comes to a decision, but saying that one has to take the lead is not right. One took the lead in the absence of decision and just carried on with what he wanted to do despite the opposition.

I find it interesting that it's cited as being in the region 'a couple of times a year'. There are at least a couple of examples from just the last month or two where this was an issue.

On where we came from, and maybe where we're going
I do like being told how what I think is bullshit especially from people who weren't there, who weren't part of the discussions that were held at the time.

One of the really big problems is that I don't think we ever really expressed much of a unified vision. It was all about preserving the SMF legacy and iterating on it to make it better. Right now Wedge is where SMF should be, what SMF should have become in the intervening time. SMF and Wedge have had 3 years to work on things, and in that three years we've made great strides in improving what SMF was. Right now, Wedge kicks SMF 2.1 to the kerb in a lot of places.

Nao always made it clear that he wanted to push towards what Noisen is, essentially a form of localised social network. I was largely fine with that to start with because a forum is, essentially, a specific subset of the social network thing anyway, but increasingly I've been feeling that Wedge won't realise its true potential if it continues to think of itself as a forum software first and foremost.

SMF's problem is that it's 'just a forum', Wedge's is that it's 'primarily a forum', and that pure forums are finding it very hard to compete these days because most people use Facebook and Google+ for what used to be pure forums. That in order for the software to grow and thrive, the forum must essentially be deprecated from the main feature to a core feature of something bigger. And that did not sit well, as per the various posts on the subject, especially when I outlined the notion of Wedge being able to run with the forum disabled.

The problem is that we're at a crossroads. I don't see how we can meaningfully take the software in both directions, and as has become clear I'm #2 on the totem pole, so unless Nao wants to back off from going towards the Noisen type route and dive in head first with the CMS approach, there's no way the unified vision can work.

I would almost go as far as to say that we're not on common ground so much any more. We're no longer refugees from a battleground, nor strangers in a strange land. The only common ground really is the idea of a forum and I want to make that second fiddle to something else anyway.

On forking and name changes
Just in case it wasn't entirely clear what was going on, Nao suggested that we might get to a point where we would fork, I'd take 'Wedge' and he'd take the other, under the new banner but that we'd still share code back and forth. The trouble is, as I said at the time, that just wouldn't work - there would be changes very quickly that would make that sort of thing just not work out very well. I've been there, I've seen it happen - heck, I doubt there's anything much that SMF 2.1, ElkArte and Wedge can all share in these days even though they are all descendants of the same 2.0 codebase.

On hashing this out in public or private
It just sort of happened that it came out in public. Though in all honesty I'm not sure doing it privately would have made much of a difference to the end result, though the road would have been different.

Nao and I would have talked, I'd probably have been suckered in to staying longer, getting more resentful and eventually just disappearing, only no-one but Nao would have known what was going on. I don't like cloak and dagger politics and I think the comment about this being a community is right.

In a normal community if one of the leaders leaves abruptly without any communication, it's a major failure especially if it's not even clear why they left. If one of the leaders leaves abruptly with some communication, maybe something can be salvaged. Mind you, I'm still concerned at the number of people participating in this thread who appear to be misinterpreting what I'm saying as the reasons I'm fed up.

Cause and effect
Some people have opined that my general state of depression may be caused by this situation, or it caused this situation. I'm not sure which it is, but most likely I was already depressed under the surface and this brought it to a head.

The bottom line
I see people that are essentially asking me to step up and just accept it. I doubt any of those people really understand what my problem is, because I feel that if they did, they would actually understand why that isn't going to happen.

What I do note is that there has been a lot more honesty since I stepped down than there was before I did so. Both Nao and I have, in this thread and elswhere, made it clear that we have the ways we work, and that we're not entirely happy about changing how we work to suit others because it works for us.

The problem I have is that I can't keep adapting my work style to the way this project is run. I can't deal with submitting work only to have it dissected. That has implications beyond me and Wedge and I'll have to deal with those.[2] To the comments about me just learning to deal with it, I'm sorry but those are very naive and perhaps ill-informed. This is not just something you 'deal with'.

I consider what I do to be art, with all the pretentiousness that goes with it. I'm not paid to make Wedge, so I don't owe anything to anyone. More importantly, that means as far as I'm concerned no-one has the right to demand I make anything in certain ways.

Would Van Gogh have painted the Sunflowers paintings if he knew Gauguin would come along and touch up the paintings afterwards? Would he, perhaps, have painted them differently? Would he, instead, perhaps have considered trying to paint and repaint them if he knew they would be scrutinised and tried to paint them perfectly before handing them over?

This is what we're talking about. The people that talk about perfection in code don't understand that this is an artform. It is not something that can be turned on and off, I am not a trained monkey at a keyboard. It happens when it happens because it happens, just like any other art. Novels are literary art, paintings are visual art, code is its own art. I may not necessarily be good at it in some respects but that doesn't change that I consider it art and I don't like it being tampered with. There are times I've specifically pointed out flaws where I didn't know how to do it any better and times I've specifically outlined that things should be looked at. I doubt many people here understood what it takes to put that into writing.

See, what people don't always remember is that the commit log is to all practical purposes, permanent. I'm going on record, in public, and for all purposes that matter, permanently saying "This isn't very good but it's the best I can do, I'm sorry". I'm flat out admitting I'm putting in sub-par code because I'm not good enough to do it any better.

The thing is I've been doing bits of this stuff for years - I was writing JavaScript in 2000. I'm still not any better at it now, and here we are 13 years on. Make of that what you will.


Anyway, now we're getting to the heart of the matter. In the preceding posts it's very clear that I have never entirely been a project leader for this project, that I've been a 'co leader' but without the power to back it up, and note that it isn't me saying that. I don't feel I've been lied to, but I feel like what I've felt has been backed up by the posts above, like I had suspicions waiting to be confirmed.

Yes, I still have a place in my heart for forums. It's why I haven't just disappeared entirely. The problem is that it's now perfectly clear that a reunion of the two of us for Wedge just won't be possible. As much fun as we had, the reality is that I cannot be part of this situation any more. You can't give me the title of leader and not the power that goes with it, and there's no chance in hell that I'd be a "contributor" knowing what will happen - that will just be a continuation of what brought us to this point, and I can't be a part of that.

I must admit I didn't appreciate the comment about how you feel you deserve to be told about what I'm going on to do. By the same logic, if I'd gone to contribute to *any* other software that's even remotely a competitor to Wedge, that logic suggests I should tell you. If I'd gone to write XenForo plugins, or IPB plugins or even to phpBB, I get the feeling that you'd expect me to tell you about it. Here's the thing, that's what equals might do, but I'm not your equal and I've never been your equal. Just as when I left one job for another, I didn't bother to tell my employer where I went, because it was none of their business any longer. I left, and in any normal respect that would have left me free to work on whatever I wanted to work on. The fact I mentioned it at all is a courtesy, certainly not an expectation. The fact I'm working on it in private is because after everything that's happened, I CAN'T TRUST ANYONE AS A CONTRIBUTOR.

I actually can't trust anyone to work with any more at the code level. The only people I trust are those who provide me assets (e.g. textures, models) and I make them work in my code, because they don't write any code and I don't have to worry about it overlapping. And yes, I'm well aware that this is my problem to 'deal' with.

The saddest part is that even when I disentangle myself, baring myself in a way I just do NOT do normally, being more honest with myself than I have been for a very long time, too many people still don't get it.
 1. Accepting good vs perfect, anyone?
 2. Ultimately it means I need to consider whether I work in open source software at all because the same problem is prevalent there in general.
9
The Pub / Re: Not So Mixed Signals
Arantor « on September 5th, 2013, 06:37 PM »
Phew, lots of stuff here. So, let's try and make sense of it all. I'll break it down into the key points that seem to be coming up.

Perfect vs Good
I'm only too aware that perfect can be the enemy of good. My concerns over releasing/not releasing were never about perfect vs good, but good vs unfinished. Let's make this absolutely clear: look back through the logs and tell me how often I tweaked something I'd made. Tell me how often I went and changed things that I wasn't entirely happy with.

Most of my commits were removing things I didn't like or adding new things. Very few were just changing things I wasn't entirely happy with. That's why I made half the number of commits Nao did: I don't tend to commit and iterate, I iterate then commit when I'm happy with it.

I think it's fair to say that I'm not laden with the perfect vs good problem.

The problem I do have is that while my code isn't sacred to me, people just aren't listening to the problem I DO have. If my code is bad enough that it needs more than tiny modifications, it's obviously sub par, so I obviously did a bad job. It's nothing to do with leaving the nuts and bolts to someone else, it's the fact that I constantly have the feeling of turning in B-grade work, even when it's A-grade work, just because it doesn't fit with someone else's sense of coding aesthetics.

Innovators vs Iterators
I wouldn't consider either of us 'better than the other' in terms of innovation.

We've both done things that we have the right to be proud of, and Nao has outlined some of the things he's proud of within Wedge. I'm very proud of the plugin system, and the warning system. I'm proud of the fact that I was able to do some things that I'd never have been able to do in the SMF ecosystem even if I'd been given the keys to the kingdom, like going UTF-8 only.

But to me, none of that is actually innovation. It's all iteration on what was there already.

The plugin system is simply a case of addressing the numerous issues I saw in the current SMF package ecosystem (ensuring hooks have more power, checking hook existence, using it as feature detection, etc.)

The warning system, again, it's a case of addressing issues I saw in the SMF one; the notion of being able to revoke a warning (rather than warning with a negative %), the notion of being able to tie punishments to specific warnings, to be able to have much more gradual punishments, and to tie that lot together to be able to grant punishments that fit the crime better (Bad avatar? Remove the avatar.)

I cannot name a single thing I added to Wedge that I can justifiably call innovative. In some ways that made it harder because I was already working on the premise that I wasn't doing what I wanted, but what needed to be done.

On the other hand, some of the stuff Nao added does seem innovative to me, at least in the forum world: footnotes, infinite scroll (it may not be in itself unique but Wedge is the only forum software that has it as a core feature), thoughts etc. so already there's a feeling of inadequacy on my part. And yes, that does suck.

I find it interesting that we seem to feel the same way about each other for this project, that neither of us seems to feel like an innovator and that feels the other is. Your perspective on this will likely be different to mine.

On not being bold with communication
This is always going to be a tough one. Despite my general exterior and persona I give out of being strong voiced, I'm really quite introverted. Anyone who's seen the Crossing Overland videos will know how little I tend to say in person.

Then there's the general attitude of the English that's thoroughly part of me, i.e. the stiff upper lip, the keep calm and carry on attitude.

And to be fair, a lot of the issues that annoyed me didn't annoy me enough individually to do something about them at the time, so I let them go.[1]

Stuff like the autoloader really annoyed me because for the sake of a little extra typing (or, even coming into the 20th Century and using auto complete in various tools), we could have simplified the structure of a bunch of things and made performance gains from not having enormous files whose content was not used perhaps as often as one might expect.

Especially, for example, considering my thoughts around going down the CMS route. In a pure CMS, things like the stats updating that SMF does just aren't as necessary (because they're never called so often), censoring is not needed so often, and things like that. These are things loaded every page that just do not need to be in those situations. So you'd hive them off because that makes sense to do.

Anyway, I'm digressing. My psychological nature is predisposed to avoiding conflict if possible, and every time something came up that I didn't like, I was forced to choose whether it annoyed me enough that I wanted to say something or just say nothing and accept it. The problem was that in the cases where I did speak up, I don't feel I was listened to - even when I went into long and thorough arguments about why I didn't like something.

Short of getting into shouting matches over everything I just accepted that I was wrong most of the time and left it at that, until I just couldn't do that any more.

To the people who said I should have been more forthright in my views, could you honestly go back over my posts and say I wasn't forthright in my views? Could you honestly say that I didn't try hard to be heard?

I understand Nao's reluctance to read every post. But I did it. I read every post on the forum, even the ones I never replied to, and tried to take that on board. It wasn't always successful but I tried it. On the other hand, I suspect that if he had tried to read more posts - not even all of them, but just a general selection of them, he would have a different view of both me and of the userbase.

One of the things I have been unhappy about for some time - and this affects Wedge rather than my interpersonal relationship with Nao - is that Wedge has two different directions in the code. It has a bunch of stuff that users will use either directly or indirectly, and it has a bunch of cool stuff. The problem with the cool stuff is that it directly affects what goes on in the ecosystem.

I sincerely dread the day when Wedge is let loose and designers take one look at it and try to figure out how to make it all work. Templates being piecemeal unlike SMF's monoliths, they'll have to deal with that. The CSS preparser... they'll have to deal with that too but I like to believe they will ultimately find it useful to have that rather than not. But trying to make interesting layouts that aren't just colour changes, while trying to make wireless, infinite scroll, userbox moving all still work... that's a challenge I simply don't envy them having.

What I think that means is that most themes will be simple colour variations.

Superior vs equal vs inferior
I have in the past talked about my office life. Over the 5 years I was in that career path, I had a number of team leaders through various reorganisations, 6 if my recollection is correct, and that's not including the more senior managers that were above my team leaders with whom I tried to ensure I had a good working relationship as well.

Of those team leaders, only two of them were somewhat less than successful. The first of those two was because my team leader and I had different views on the way things should be done. As will probably be clear from conversations here, I have a very strong sense of ethics and about things being done properly, but that I'm willing to compromise over correctness when it is appropriate. My team leader on the other hand, was of the view that compromise was the way forward wherever possible, that closing the deal was most important.

The best example I have is a mortgage deal we were working on.
(click to show/hide)
I should clarify the situation; our department dealt with new mortgages being issued, I worked within the latter part of the process, dealing with solicitors/conveyancers, in making sure all the paperwork was provided and correct and that the company's legal coverage on the mortgaged property would be all solid.

You can imagine that this is the ideal sort of situation for me, really, and in many ways it ways. There were rules, there were places the rules could be bent. And for someone of my tendencies - strong on knowledge retention and doing it properly - this worked out.

Then we had this deal come in that the new sales rep was so keen to push because it was a demonstration of our flexibility. It all centred around two houses that had been knocked through into one but were legally still two properties on the title deeds and how this would get resolved.

I took the case to the lead and told him why it wasn't going to work out because of the way it was currently registered and that it couldn't physically be fixed. He took the view that it wasn't our problem provided that the lawyers dealing with it signed a declaration that they would get it fixed - apparently that was enough for our protection, since lawyers acting for the lender are required by law to protect the lender's interest.

Unfortunately that's what happened. The leader spoke to the lawyer, got a letter from them, and whatnot. And I said I wouldn't sign it off. There was no way I was putting my name on that case and interestingly enough no-one else would either. In the end it had to be signed off by the director of operations (who is a people manager, essentially, and had no real idea of what it all meant)

And sure enough, this came up during my end of year review as not being flexible and obstructive etc. Fortunately for me, I'd kept note of the case number and knew he would pull it out at the meeting, so about a week before then, I sent an email to the customer services team, who dealt with cases after they'd been funded, to find out what happened to it. Imagine my surprise when I discovered the case had been handed to the litigation team because the security was impaired. I even got them to email me the notes about it and brought it to the meeting. As you can imagine this did not go down well.

The problem was ultimately a clash of ideologies and to a lesser degree a lack of respect. I took his position under consideration but my job description carried the line that my responsibility was to protect the interest of the company to the best of my ability - and that's exactly what I did. The fact I was overruled was not my problem as I'd done everything in my power to protect them.

The second manager was a real piece of work.
(click to show/hide)
By this time I was an auditor with the company. You can imagine how well that worked out for my general anal-retentive attitude.

And at this point my partner worked at the company in the same team, but as a 'probationary' or 'trainee' or something. Anyway, she worked in the same team doing the same job, but for several thousand pounds less a year.

The team leader wasn't impressed that Liz would defer to me more than the others, but the reason for this was never entirely understood: because I was *competent*.

We were given the cases to review prior to funding - so the job I used to do (see the first spoiler) was about getting the paperwork in and reviewing it and passing it to the funding team, then the funding team would review it and press the magic buttons.

And having been a mortgage processor, I knew exactly the sorts of crap that used to go up to the funding team and what the funding team used to kick back to me, haha.

Anyway, there was a list of things that had to be checked that the team had to do for each case. 118 items if memory serves, all yes/no/not applicable questions. So, just check that the system has the right details in it, answer the questions.

Problem 1: what if you notice something wrong that's not in the questions? Answer: You're not supposed to be checking anything other than the list because the list is sacred.

Problem 2: what if you're more conscientious and just check it anyway? Answer: You get blasted for spending more than 10 minutes on it. Yes, we were timed, and managed on that crap.

I frequently used to turn in what clocked up as '4 and a half hours work' because I did it thoroughly, and not just what the team leader's best mates did, which was the minimum possible to get the job done, and that's how the 10 minutes time was arrived at.

It should be of no surprise that come the quarterly review from the lending quality team that cases I approved for funding had the fewest errors in percentage terms. Quarter after quarter this happened. Funny that.

But I messed up the figures for the team leader by looking like I wasn't working hard enough, though the more senior managers all understood what was going on. Trouble is, she was of the understanding that I was trying to undermine her at every opportunity; I wasn't. I just didn't agree with her managing-by-the-numbers and not really caring about little things like quality.

It should be of no surprise that a few months after I was made redundant from the company, that they collapsed entirely, when you have people like that at the management helm.

The problem as you can probably imagine is not that I can't work with managers. The problem is that I can't work with managers who can't understand where I'm coming from.

As I have said on multiple occasions - though I think this is another thing no-one listened to - I have no problem with being disagreed with or even overruled, provided that I have the feeling that what I had to say was taken into account. I don't just say things for the sake of saying them, I say them because I believe they're important to say.

The two managers I reference above rarely listened to what I had to say unless it agreed with what they already thought in the first place. This isn't a respectful setup and I have no time for it. Funny how all the other team leaders understood my points when they were made - even when they didn't agree with me and even when they overruled me, they at least listened and took it on board.

Control versus contribution
There is an interesting problem related to this, but it relates also to the whole lead vs follow debate. I can lead when it's appropriate, I can follow when it's appropriate. Whichever would best get the job done, I suppose.

The problem is when I'm told that I'm a leader but have to act like a follower, like we've had here. In fact, I find this quote from Nao most telling of all:
Quote
But if he ever were to rejoin the project, despite all of the qualities I just listed, he would have to settle on being an advisor and a co-lead developer, but not a decision maker (which wouldn't even be a problem more than a couple of times a year.)
This would merely continue how it's actually been for most of the last year to 18 months, if not longer. It would simply formalise it and make it clear that this is how things would be.

Ironically, had Nao outlined to me on day one that this is how he wanted to work, I could probably have made that work. It was always stated that we were equals and yet we never really acted as equals.

Two people may be a crowd when it comes to a decision, but saying that one has to take the lead is not right. One took the lead in the absence of decision and just carried on with what he wanted to do despite the opposition.

I find it interesting that it's cited as being in the region 'a couple of times a year'. There are at least a couple of examples from just the last month or two where this was an issue.

On where we came from, and maybe where we're going
I do like being told how what I think is bullshit especially from people who weren't there, who weren't part of the discussions that were held at the time.

One of the really big problems is that I don't think we ever really expressed much of a unified vision. It was all about preserving the SMF legacy and iterating on it to make it better. Right now Wedge is where SMF should be, what SMF should have become in the intervening time. SMF and Wedge have had 3 years to work on things, and in that three years we've made great strides in improving what SMF was. Right now, Wedge kicks SMF 2.1 to the kerb in a lot of places.

Nao always made it clear that he wanted to push towards what Noisen is, essentially a form of localised social network. I was largely fine with that to start with because a forum is, essentially, a specific subset of the social network thing anyway, but increasingly I've been feeling that Wedge won't realise its true potential if it continues to think of itself as a forum software first and foremost.

SMF's problem is that it's 'just a forum', Wedge's is that it's 'primarily a forum', and that pure forums are finding it very hard to compete these days because most people use Facebook and Google+ for what used to be pure forums. That in order for the software to grow and thrive, the forum must essentially be deprecated from the main feature to a core feature of something bigger. And that did not sit well, as per the various posts on the subject, especially when I outlined the notion of Wedge being able to run with the forum disabled.

The problem is that we're at a crossroads. I don't see how we can meaningfully take the software in both directions, and as has become clear I'm #2 on the totem pole, so unless Nao wants to back off from going towards the Noisen type route and dive in head first with the CMS approach, there's no way the unified vision can work.

I would almost go as far as to say that we're not on common ground so much any more. We're no longer refugees from a battleground, nor strangers in a strange land. The only common ground really is the idea of a forum and I want to make that second fiddle to something else anyway.

On forking and name changes
Just in case it wasn't entirely clear what was going on, Nao suggested that we might get to a point where we would fork, I'd take 'Wedge' and he'd take the other, under the new banner but that we'd still share code back and forth. The trouble is, as I said at the time, that just wouldn't work - there would be changes very quickly that would make that sort of thing just not work out very well. I've been there, I've seen it happen - heck, I doubt there's anything much that SMF 2.1, ElkArte and Wedge can all share in these days even though they are all descendants of the same 2.0 codebase.

On hashing this out in public or private
It just sort of happened that it came out in public. Though in all honesty I'm not sure doing it privately would have made much of a difference to the end result, though the road would have been different.

Nao and I would have talked, I'd probably have been suckered in to staying longer, getting more resentful and eventually just disappearing, only no-one but Nao would have known what was going on. I don't like cloak and dagger politics and I think the comment about this being a community is right.

In a normal community if one of the leaders leaves abruptly without any communication, it's a major failure especially if it's not even clear why they left. If one of the leaders leaves abruptly with some communication, maybe something can be salvaged. Mind you, I'm still concerned at the number of people participating in this thread who appear to be misinterpreting what I'm saying as the reasons I'm fed up.

Cause and effect
Some people have opined that my general state of depression may be caused by this situation, or it caused this situation. I'm not sure which it is, but most likely I was already depressed under the surface and this brought it to a head.

The bottom line
I see people that are essentially asking me to step up and just accept it. I doubt any of those people really understand what my problem is, because I feel that if they did, they would actually understand why that isn't going to happen.

What I do note is that there has been a lot more honesty since I stepped down than there was before I did so. Both Nao and I have, in this thread and elswhere, made it clear that we have the ways we work, and that we're not entirely happy about changing how we work to suit others because it works for us.

The problem I have is that I can't keep adapting my work style to the way this project is run. I can't deal with submitting work only to have it dissected. That has implications beyond me and Wedge and I'll have to deal with those.[2] To the comments about me just learning to deal with it, I'm sorry but those are very naive and perhaps ill-informed. This is not just something you 'deal with'.

I consider what I do to be art, with all the pretentiousness that goes with it. I'm not paid to make Wedge, so I don't owe anything to anyone. More importantly, that means as far as I'm concerned no-one has the right to demand I make anything in certain ways.

Would Van Gogh have painted the Sunflowers paintings if he knew Gauguin would come along and touch up the paintings afterwards? Would he, perhaps, have painted them differently? Would he, instead, perhaps have considered trying to paint and repaint them if he knew they would be scrutinised and tried to paint them perfectly before handing them over?

This is what we're talking about. The people that talk about perfection in code don't understand that this is an artform. It is not something that can be turned on and off, I am not a trained monkey at a keyboard. It happens when it happens because it happens, just like any other art. Novels are literary art, paintings are visual art, code is its own art. I may not necessarily be good at it in some respects but that doesn't change that I consider it art and I don't like it being tampered with. There are times I've specifically pointed out flaws where I didn't know how to do it any better and times I've specifically outlined that things should be looked at. I doubt many people here understood what it takes to put that into writing.

See, what people don't always remember is that the commit log is to all practical purposes, permanent. I'm going on record, in public, and for all purposes that matter, permanently saying "This isn't very good but it's the best I can do, I'm sorry". I'm flat out admitting I'm putting in sub-par code because I'm not good enough to do it any better.

The thing is I've been doing bits of this stuff for years - I was writing JavaScript in 2000. I'm still not any better at it now, and here we are 13 years on. Make of that what you will.


Anyway, now we're getting to the heart of the matter. In the preceding posts it's very clear that I have never entirely been a project leader for this project, that I've been a 'co leader' but without the power to back it up, and note that it isn't me saying that. I don't feel I've been lied to, but I feel like what I've felt has been backed up by the posts above, like I had suspicions waiting to be confirmed.

Yes, I still have a place in my heart for forums. It's why I haven't just disappeared entirely. The problem is that it's now perfectly clear that a reunion of the two of us for Wedge just won't be possible. As much fun as we had, the reality is that I cannot be part of this situation any more. You can't give me the title of leader and not the power that goes with it, and there's no chance in hell that I'd be a "contributor" knowing what will happen - that will just be a continuation of what brought us to this point, and I can't be a part of that.

I must admit I didn't appreciate the comment about how you feel you deserve to be told about what I'm going on to do. By the same logic, if I'd gone to contribute to *any* other software that's even remotely a competitor to Wedge, that logic suggests I should tell you. If I'd gone to write XenForo plugins, or IPB plugins or even to phpBB, I get the feeling that you'd expect me to tell you about it. Here's the thing, that's what equals might do, but I'm not your equal and I've never been your equal. Just as when I left one job for another, I didn't bother to tell my employer where I went, because it was none of their business any longer. I left, and in any normal respect that would have left me free to work on whatever I wanted to work on. The fact I mentioned it at all is a courtesy, certainly not an expectation. The fact I'm working on it in private is because after everything that's happened, I CAN'T TRUST ANYONE AS A CONTRIBUTOR.

I actually can't trust anyone to work with any more at the code level. The only people I trust are those who provide me assets (e.g. textures, models) and I make them work in my code, because they don't write any code and I don't have to worry about it overlapping. And yes, I'm well aware that this is my problem to 'deal' with.

The saddest part is that even when I disentangle myself, baring myself in a way I just do NOT do normally, being more honest with myself than I have been for a very long time, too many people still don't get it.
 1. Accepting good vs perfect, anyone?
 2. Ultimately it means I need to consider whether I work in open source software at all because the same problem is prevalent there in general.
10
Off-topic / Re: Is Wordpress actually Most SEO CMS?
Arantor « on August 23rd, 2013, 01:44 AM »
Here's the thing... Google changes its algorithm regularly. Far too regularly, including reranking, for anyone to be able to understand what's actually going on. What worked 6 months ago won't work so well today, and probably might work again better in 6 months time.

Google uses a lot of things for ranking. One of the key things is to do with link 'reputation'. Inbound links to a page, outbound links from that page, and so on - a lot of inbound links to a page that aren't site-wide navigation are important, and are a sign that a page is probably more authoritative about its content. (Not the only sign but a sign, sure)

If a page is new, it doesn't have that - but if a page is old and doesn't have many inbound links, odds are it's not that authoritative either. In absence of any other relevant criteria, Google seems to be taking the newer page as slightly more authoritative for simple virtue of the fact that it's newer and presumably therefore not outdated contextually.