<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.mediagoblin.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Elrond</id>
	<title>GNU MediaGoblin Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.mediagoblin.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Elrond"/>
	<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/Special:Contributions/Elrond"/>
	<updated>2026-04-10T15:00:43Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.17</generator>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=CommunityGovernance&amp;diff=1718</id>
		<title>CommunityGovernance</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=CommunityGovernance&amp;diff=1718"/>
		<updated>2015-06-24T08:45:38Z</updated>

		<summary type="html">&lt;p&gt;Elrond: Add myself in case it&amp;#039;s needed /* MediaGoblin wiki */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
MediaGoblin is a community project and we everybody try to help each other. Chris Webber is our lead developer, but the project should be able to self govern so he can take a break if he needs it or when he or other contributors take deserved holidays :) &lt;br /&gt;
&lt;br /&gt;
In general, you can ask anything in the mailing list or the IRC channel and hopefully somebody will answer soon. Topics are discussed in the mailing list, IRC channel or monthly meetings (in the IRC channel).&lt;br /&gt;
&lt;br /&gt;
In this page we list several tasks or areas along with the names or nicks of MediaGoblin community members that may help on them (for example, because they have permissions to perform certain operations). Please be kind when asking for help, most of us are volunteering for MediaGoblin in our free time, so answers or problems resolution can take a while.&lt;br /&gt;
&lt;br /&gt;
Feel free to edit this page to list more tasks or sign the ones you self-assign.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
More information about this in this mailing list thread: http://lists.mediagoblin.org/pipermail/devel/XXXXX&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== MediaGoblin codebase ==&lt;br /&gt;
&lt;br /&gt;
* People with permissions to commit/merge and handle the main codebase&lt;br /&gt;
&lt;br /&gt;
* General stuff: breton, Elrond (via PM on IRC)&lt;br /&gt;
* Python 3 support: berkerpeksag (berker on IRC), breton&lt;br /&gt;
* Audio/Video: breton&lt;br /&gt;
* Documentation: jcampbell / j1mc&lt;br /&gt;
&lt;br /&gt;
== MediaGoblin website ==&lt;br /&gt;
&lt;br /&gt;
* People with permissions to handle website outages&lt;br /&gt;
&lt;br /&gt;
* Publish pages (for example new releases)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== MediaGoblin wiki ==&lt;br /&gt;
&lt;br /&gt;
* Some Wiki administration: Elrond (via PM on IRC)&lt;br /&gt;
&lt;br /&gt;
== MediaGoblin issue tracker ==&lt;br /&gt;
&lt;br /&gt;
* Help triaging bugs: R13ose&lt;br /&gt;
* People with permissions to create accounts in trac: Elrond&lt;br /&gt;
* People with permissions to delete users/issues/comments in trac: Elrond&lt;br /&gt;
* Volunteers for spam cleaning: LArjona&lt;br /&gt;
* Talk to trac people about spam: R13ose&lt;br /&gt;
* Would like more access to be able to help/fix things:&lt;br /&gt;
&lt;br /&gt;
== MediaGoblin translation platform ==&lt;br /&gt;
&lt;br /&gt;
* If there is need of manual import/export files between Pootle and the MediaGoblin codebase, who can help on that&lt;br /&gt;
* LArjona (Spanish translator) can guide new translators, reproduce problems in the translation platform, test changes, and help with Pootle quality checks. Available in the mailing list and IRC channel.&lt;br /&gt;
* breton knows how and why translations are downloaded/compiled&lt;br /&gt;
&lt;br /&gt;
== MediaGoblin IRC channel and mailing list ==&lt;br /&gt;
&lt;br /&gt;
* Change IRC topic, channel operators&lt;/div&gt;</summary>
		<author><name>Elrond</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=Main_Page&amp;diff=1717</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=Main_Page&amp;diff=1717"/>
		<updated>2015-06-24T08:36:36Z</updated>

		<summary type="html">&lt;p&gt;Elrond: Reverted edits by BradLloyd05 (talk) to last revision by Signix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Want to Join the MediaGoblin Community? =&lt;br /&gt;
&lt;br /&gt;
We’re really glad that you want to join the MediaGoblin community!&lt;br /&gt;
&lt;br /&gt;
There are a variety of ways to help and support MediaGoblin and to join the team.  If you want to code, great, if not, even better!  MediaGoblin interested contributors in many different roles: users, system administrators, technical writers, testers, evangelists, UI/UX and graphics designers, cheerleaders, and dreamers.&lt;br /&gt;
&lt;br /&gt;
We observe the [https://www.djangoproject.com/conduct/ Django code of conduct].  Be welcoming, friendly, and patient!&lt;br /&gt;
&lt;br /&gt;
This wiki covers a variety of ways that you can get involved with MediaGoblin as well as instructions on how to get started.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hang out with the MediaGoblin folk ==&lt;br /&gt;
&lt;br /&gt;
MediaGoblin has a mailing list and an IRC channel where we hang out.  See [http://mediagoblin.org/pages/join.html our join page] for links.&lt;br /&gt;
&lt;br /&gt;
Please drop by and say “Hi!”  And, if you’re looking for something to do, just ask---there’s always work to be done.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Take Part in the Monthly Meetings ==&lt;br /&gt;
&lt;br /&gt;
Each month is a [[:Meeting|Meeting]]. You can take part and help decide on the future of MediaGoblin. Or just be around and see what&#039;s happening live!&lt;br /&gt;
&lt;br /&gt;
=How Can you help ?=&lt;br /&gt;
&lt;br /&gt;
First and foremost, for many (but not all) types of contributions you may want to set up a local instance.  To learn how to do this, see the [[HackingHowto]] page.  (If you&#039;re not familiar with command line level things, there are still ways you can help below!)&lt;br /&gt;
&lt;br /&gt;
== File Bugs / Triage Bugs ==&lt;br /&gt;
&lt;br /&gt;
Issue reports are critical for all projects.  Identified bugs give developers a basis for beginning work, and providing an idea of what features and issues are most important to users and the overall usability of the software.  If you identify errors, flaws, unexpected behaviors, or deficits that impede use, file a bug.&lt;br /&gt;
&lt;br /&gt;
* [[File Bugs]] -- notes on filing new bugs/issues/feature requests&lt;br /&gt;
* [[Feature Ideas]] -- notes on possible features&lt;br /&gt;
* [[Triage Bugs]] -- notes on triaging&lt;br /&gt;
* [[BugTriageDay]] -- every other Thursday is bug triage day where anyone can help out triaging bugs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Send Encouragement / Spread the Word ==&lt;br /&gt;
&lt;br /&gt;
Sometimes, a nice word, simple encouragement, and interest in the work we’re doing is enough to inspire a tizzy of productive work.  Just a bit more interest and encouragement can even make the difference between a complete feature and limited functionality; between a completed milestone and lost momentum.&lt;br /&gt;
&lt;br /&gt;
Similarly, MediaGoblin, and the movement for free network services, is always in need of encouragement.  Use free network services, understand the principals behind the movement, be able to articulate the benefits of free network services and the problems with psudo-free applications that don’t respect the users’ freedom.&lt;br /&gt;
&lt;br /&gt;
Write a blog post, post a status update, drop by the listserv or join #mediagoblin on freenode.net and let us know.  See [http://mediagoblin.org/join/ our join page] for links.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Write Documentation / Edit Documentation ==&lt;br /&gt;
&lt;br /&gt;
* [[Documentation quick start]] - How to contribute to the documentation effort.&lt;br /&gt;
* [[ManualStandards]] - covers the standards for writing the user manual (forthcoming.) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Test MediaGoblin ==&lt;br /&gt;
&lt;br /&gt;
Do you have access to the web? Do you like sharing your opinions? If so, we need your help to test MediaGoblin! Testers play around with the current test instance, note what operating system and browser they use (notes on multiple set-ups are also helpful) and take some notes. That&#039;s it! It&#039;s a very important task that doesn&#039;t require any special knowledge and you&#039;re done in under an hour. Ready to help?  &lt;br /&gt;
&lt;br /&gt;
* [[User Experience]] - user experience testing.  Includes link to an instance you can try!&lt;br /&gt;
* [[UnitTests|Unit Tests]] - all about the unit tests&lt;br /&gt;
* [[Manual_Functional_Testing|Manual Functional Testing]] - a great way to get to know MediaGoblin.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Translate MediaGoblin ==&lt;br /&gt;
&lt;br /&gt;
If you know English and another language and feel comfortable translating elements of the interface or even the documentation, we’d love to have help translating the software and resources.&lt;br /&gt;
Translating MediaGoblin is very easy with a web interface, so there is no programming knowledge required at all.&lt;br /&gt;
&lt;br /&gt;
* [[Translations]] - How to translate stuff or update the translations&lt;br /&gt;
&lt;br /&gt;
== Become a User ==&lt;br /&gt;
&lt;br /&gt;
Coming soon!&lt;br /&gt;
&lt;br /&gt;
We’re building MediaGoblin for us and for you but really you’re one of us and I am you and we are we and MediaGoblin is the walrus.&lt;br /&gt;
&lt;br /&gt;
We&#039;re planning to launch our own public instance of MediaGoblin in the near future--probably in the September/October 2011 time frame.  When we do, sign up for an account, use the service and relish in the thought that this service comes with a heaping side of Freedom and you can salt and pepper it to your liking.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Help Others ==&lt;br /&gt;
&lt;br /&gt;
Have you spent time with MediaGoblin?  If so, your experience and wisdom are invaluable and you’re the best person we can think of to help other users with their questions.&lt;br /&gt;
&lt;br /&gt;
Hang out on the IRC channel and help answer new peoples&#039; questions.  See [http://mediagoblin.org/join/ our join page] for links.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Run your own MediaGoblin Instance ==&lt;br /&gt;
&lt;br /&gt;
Are there things about our instance you want to change?  Are there things about other instances you wish were different?  Want to test upcoming changes?  Want to create patches to implement things you need?  That’s great—you can run your own instance!&lt;br /&gt;
&lt;br /&gt;
The primary documentation for this is at [http://docs.mediagoblin.org http://docs.mediagoblin.org] but here are some additional tips:&lt;br /&gt;
&lt;br /&gt;
* [[Configure_MediaGoblin|Configuration]] - Learn about MediaGoblin configuration files and file options.&lt;br /&gt;
* [[Deployment]] - General deployment advice&lt;br /&gt;
* [[Scaling Down]] - Minimizing MediaGoblin&#039;s resource requirements&lt;br /&gt;
* [[Virtual Machine Hosting]] - Deploy your own publicly available MediaGoblin server using [http://aws.amazon.com/free/?utm_source=adwords&amp;amp;utm_medium=cpc&amp;amp;utm_campaign=CPC_Google_AWS_ec2&amp;amp;utm_content=TextV01_PP_V01_EC2&amp;amp;trk=CPC_Google_AWS_ec2 Amazon&#039;s free EC2 tier].&lt;br /&gt;
&lt;br /&gt;
= Technical project documentation =&lt;br /&gt;
&lt;br /&gt;
The technical docs, that are more finished and the ones that are better maintained near the code (so they stay up to date) are in the more technical chapters of the [http://docs.mediagoblin.org/ main documentation].&lt;br /&gt;
* [[Storage]] - How MediaGoblin&#039;s internal storage system works.&lt;br /&gt;
* [[Processing]] - What happens after you submit your image/video/etc?  Processing!  More about that.&lt;br /&gt;
* [https://gitorious.org/mediagoblin/mediagoblin/blobs/master/extlib/README External Library Policy] - covers use of external libraries&lt;br /&gt;
* [[User:Cwebber/braindumps]] - Chris Webber&#039;s braindumps (you can help refactoring these into real sections of the site!)&lt;br /&gt;
* [[Multiple media support]] - Design plan for multiple media support&lt;br /&gt;
&lt;br /&gt;
== Write Code / Fix Code ==&lt;br /&gt;
&lt;br /&gt;
MediaGoblin development is premised on the idea that the entire interface for the platform be completely theme-able.  If you have a design or theming background, consider developing themes for MediaGoblin.  New themes help test the theming system, provide attractive and appealing interfaces for prospective users.  If you want to start a new theme but don’t know where to start, touch base with the development community on the list or in the IRC channel for more information.&lt;br /&gt;
&lt;br /&gt;
If you are a coder and you would like to write code, the repository is hosted on gitorious. Clone or fork the repository and start poking around. Become familiar with this manual for an overview of how the software works and is used. Consider the contributor wiki for more information about the project, our preferred methods, and guides for developing MediaGoblin. We even have tips on becoming a coder and we’re willing to help!&lt;br /&gt;
&lt;br /&gt;
* [[HackingHowto|Hacking]] - notes on making and sending in code contributions&lt;br /&gt;
** [[BeginnersCorner|Beginner&#039;s Corner]] - resources for those who are new to Python or Git.&lt;br /&gt;
** &#039;&#039;Started from an older version of the Hacking Howto?  We switched from buildout-&amp;gt;virtualenv, so look at [[Moving from buildout to virtualenv]] for information on how to move over.&#039;&#039;&lt;br /&gt;
* [[Git workflow]] - How to go about submitting patches via git.&lt;br /&gt;
* [[Code review tips]] - Tips on how to go about doing local code review&lt;br /&gt;
* [[Templating]] - How our templating structure is set up&lt;br /&gt;
* [[Code overview]] - Overview of the structure of the codebase&lt;br /&gt;
&lt;br /&gt;
== Create a Theme ==&lt;br /&gt;
&lt;br /&gt;
See [http://docs.mediagoblin.org/siteadmin/theming.html the theming docs]&lt;br /&gt;
&lt;br /&gt;
== Write a plugin ==&lt;br /&gt;
&lt;br /&gt;
If you start, you&#039;ll find some basic documentation [http://docs.mediagoblin.org/#part-4-developer-s-zone| in the docs site]&lt;br /&gt;
&lt;br /&gt;
You&#039;ve made a plugin ? List it here : &lt;br /&gt;
&lt;br /&gt;
[[Available_Plugins|Available plugins]]&lt;br /&gt;
&lt;br /&gt;
You&#039;ve written a plugin ? You got some tips to share ? A tutorial idea ? Please do :&lt;br /&gt;
 &lt;br /&gt;
[[PluginsTips|Plugins Tips]]&lt;br /&gt;
&lt;br /&gt;
= Misc =&lt;br /&gt;
&lt;br /&gt;
== Android client ==&lt;br /&gt;
&lt;br /&gt;
See [[Android Client]]&lt;br /&gt;
&lt;br /&gt;
= Inner workings of the secret sanctum =&lt;br /&gt;
&lt;br /&gt;
* [[IRCBot]] - covers our irc bot&lt;br /&gt;
* [[ReleaseProcess|Release Process]] - covers the release process&lt;br /&gt;
* [[Update the website]] - Learn how to update mediagoblin.org!&lt;br /&gt;
&lt;br /&gt;
=FAQ=&lt;br /&gt;
&lt;br /&gt;
[[GMG FAQ]]&lt;/div&gt;</summary>
		<author><name>Elrond</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=CommunityGovernance&amp;diff=1715</id>
		<title>CommunityGovernance</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=CommunityGovernance&amp;diff=1715"/>
		<updated>2015-06-22T21:43:57Z</updated>

		<summary type="html">&lt;p&gt;Elrond: Add myself to trac&amp;#039;s list of people with permissions /* MediaGoblin issue tracker */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
MediaGoblin is a community project and we everybody try to help each other. Chris Webber is our lead developer, but the project should be able to self govern so he can take a break if he needs it or when he or other contributors take deserved holidays :) &lt;br /&gt;
&lt;br /&gt;
In general, you can ask anything in the mailing list or the IRC channel and hopefully somebody will answer soon. Topics are discussed in the mailing list, IRC channel or monthly meetings (in the IRC channel).&lt;br /&gt;
&lt;br /&gt;
In this page we list several tasks or areas along with the names or nicks of MediaGoblin community members that may help on them (for example, because they have permissions to perform certain operations). Please be kind when asking for help, most of us are volunteering for MediaGoblin in our free time, so answers or problems resolution can take a while.&lt;br /&gt;
&lt;br /&gt;
Feel free to edit this page to list more tasks or sign the ones you self-assign.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
More information about this in this mailing list thread: http://lists.mediagoblin.org/pipermail/devel/XXXXX&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== MediaGoblin codebase ==&lt;br /&gt;
&lt;br /&gt;
* People with permissions to commit/merge and handle the main codebase&lt;br /&gt;
&lt;br /&gt;
* General stuff: breton, Elrond (via PM on IRC)&lt;br /&gt;
* Python 3 support: berkerpeksag (berker on IRC), breton&lt;br /&gt;
* Audio/Video: breton&lt;br /&gt;
* Documentation: jcampbell / j1mc&lt;br /&gt;
&lt;br /&gt;
== MediaGoblin website ==&lt;br /&gt;
&lt;br /&gt;
* People with permissions to handle website outages&lt;br /&gt;
&lt;br /&gt;
* Publish pages (for example new releases)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== MediaGoblin wiki ==&lt;br /&gt;
&lt;br /&gt;
* Wiki administration&lt;br /&gt;
&lt;br /&gt;
== MediaGoblin issue tracker ==&lt;br /&gt;
&lt;br /&gt;
* Help triaging bugs: R13ose&lt;br /&gt;
* People with permissions to create accounts in trac: Elrond&lt;br /&gt;
* People with permissions to delete users/issues/comments in trac: Elrond&lt;br /&gt;
* Volunteers for spam cleaning: LArjona&lt;br /&gt;
* Talk to trac people about spam: R13ose&lt;br /&gt;
* Would like more access to be able to help/fix things:&lt;br /&gt;
&lt;br /&gt;
== MediaGoblin translation platform ==&lt;br /&gt;
&lt;br /&gt;
* If there is need of manual import/export files between Pootle and the MediaGoblin codebase, who can help on that&lt;br /&gt;
* LArjona (Spanish translator) can guide new translators, reproduce problems in the translation platform, test changes, and help with Pootle quality checks. Available in the mailing list and IRC channel.&lt;br /&gt;
* breton knows how and why translations are downloaded/compiled&lt;br /&gt;
&lt;br /&gt;
== MediaGoblin IRC channel and mailing list ==&lt;br /&gt;
&lt;br /&gt;
* Change IRC topic, channel operators&lt;/div&gt;</summary>
		<author><name>Elrond</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=CommunityGovernance&amp;diff=1714</id>
		<title>CommunityGovernance</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=CommunityGovernance&amp;diff=1714"/>
		<updated>2015-06-21T11:43:42Z</updated>

		<summary type="html">&lt;p&gt;Elrond: /* MediaGoblin issue tracker */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
MediaGoblin is a community project and we everybody try to help each other. Chris Webber is our lead developer, but the project should be able to self govern so he can take a break if he needs it or when he or other contributors take deserved holidays :) &lt;br /&gt;
&lt;br /&gt;
In general, you can ask anything in the mailing list or the IRC channel and hopefully somebody will answer soon. Topics are discussed in the mailing list, IRC channel or monthly meetings (in the IRC channel).&lt;br /&gt;
&lt;br /&gt;
In this page we list several tasks or areas along with the names or nicks of MediaGoblin community members that may help on them (for example, because they have permissions to perform certain operations). Please be kind when asking for help, most of us are volunteering for MediaGoblin in our free time, so answers or problems resolution can take a while.&lt;br /&gt;
&lt;br /&gt;
Feel free to edit this page to list more tasks or sign the ones you self-assign.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
More information about this in this mailing list thread: http://lists.mediagoblin.org/pipermail/devel/XXXXX&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== MediaGoblin codebase ==&lt;br /&gt;
&lt;br /&gt;
* People with permissions to commit/merge and handle the main codebase&lt;br /&gt;
&lt;br /&gt;
* General stuff: breton, Elrond (via PM on IRC)&lt;br /&gt;
* Python 3 support: berkerpeksag (berker on IRC), breton&lt;br /&gt;
* Audio/Video: breton&lt;br /&gt;
* Documentation: jcampbell / j1mc&lt;br /&gt;
&lt;br /&gt;
== MediaGoblin website ==&lt;br /&gt;
&lt;br /&gt;
* People with permissions to handle website outages&lt;br /&gt;
&lt;br /&gt;
* Publish pages (for example new releases)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== MediaGoblin wiki ==&lt;br /&gt;
&lt;br /&gt;
* Wiki administration&lt;br /&gt;
&lt;br /&gt;
== MediaGoblin issue tracker ==&lt;br /&gt;
&lt;br /&gt;
* Help triaging bugs: R13ose&lt;br /&gt;
&lt;br /&gt;
* People with permissions to create accounts in trac&lt;br /&gt;
&lt;br /&gt;
* People with permissions to delete users/issues/comments in trac&lt;br /&gt;
&lt;br /&gt;
* Volunteers for spam cleaning: LArjona&lt;br /&gt;
&lt;br /&gt;
* Talk to trac people about spam: R13ose&lt;br /&gt;
&lt;br /&gt;
* Would like more access to be able to help/fix things: Elrond&lt;br /&gt;
&lt;br /&gt;
== MediaGoblin translation platform ==&lt;br /&gt;
&lt;br /&gt;
* If there is need of manual import/export files between Pootle and the MediaGoblin codebase, who can help on that&lt;br /&gt;
* LArjona (Spanish translator) can guide new translators, reproduce problems in the translation platform, test changes, and help with Pootle quality checks. Available in the mailing list and IRC channel.&lt;br /&gt;
* breton knows how and why translations are downloaded/compiled&lt;br /&gt;
&lt;br /&gt;
== MediaGoblin IRC channel and mailing list ==&lt;br /&gt;
&lt;br /&gt;
* Change IRC topic, channel operators&lt;/div&gt;</summary>
		<author><name>Elrond</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=HackingHowto&amp;diff=1335</id>
		<title>HackingHowto</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=HackingHowto&amp;diff=1335"/>
		<updated>2013-07-06T21:35:21Z</updated>

		<summary type="html">&lt;p&gt;Elrond: Add note to consider to run the testsuite.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Hacking HOWTO =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== So you want to hack on GNU MediaGoblin? ==&lt;br /&gt;
&lt;br /&gt;
First thing to do is check out the [http://mediagoblin.org/join/ web site] where we list all the project&lt;br /&gt;
infrastructure including:&lt;br /&gt;
&lt;br /&gt;
* the IRC channel&lt;br /&gt;
* the mailing list&lt;br /&gt;
* the issue tracker&lt;br /&gt;
&lt;br /&gt;
Additionally, we have information on how to get involved, who to talk&lt;br /&gt;
to, what needs to be worked on, and other things besides!&lt;br /&gt;
&lt;br /&gt;
Second thing to do is take a look at [http://docs.mediagoblin.org/devel/codebase.html codebase chapter] where&lt;br /&gt;
we&#039;ve started documenting how GNU MediaGoblin is built and how to add&lt;br /&gt;
new things.  If you&#039;re planning on contributing in python, you should be aware&lt;br /&gt;
of [http://www.python.org/dev/peps/pep-0008/ PEP-8], the official Python style guide,&lt;br /&gt;
which we follow.&lt;br /&gt;
&lt;br /&gt;
Third you&#039;ll need to get the requirements.&lt;br /&gt;
&lt;br /&gt;
Fourth, you&#039;ll need to build a development environment.  We use an&lt;br /&gt;
in-package checkout of virtualenv.  This isn&#039;t the convenional way to&lt;br /&gt;
install virtualenv (normally you don&#039;t install virtualenv inside the&lt;br /&gt;
package itself) but we&#039;ve found that it&#039;s significantly easier for&lt;br /&gt;
newcomers who aren&#039;t already familiar with virtualenv.  If you *are*&lt;br /&gt;
already familiar with virtualenv, feel free to just install&lt;br /&gt;
mediagoblin in your own virtualenv setup... the necessary adjustments&lt;br /&gt;
should be obvious.&lt;br /&gt;
&lt;br /&gt;
== Getting requirements ==&lt;br /&gt;
&lt;br /&gt;
First, you need to have the following installed before you can build&lt;br /&gt;
an environment for hacking on GNU MediaGoblin:&lt;br /&gt;
&lt;br /&gt;
* Python 2.6 or 2.7  - http://www.python.org/ (You&#039;ll need Python as well as the dev files for building modules.)&lt;br /&gt;
* python-lxml        - http://lxml.de/&lt;br /&gt;
* git                - http://git-scm.com/&lt;br /&gt;
* SQLAlchemy 0.7.0 or higher   - http://www.sqlalchemy.org/&lt;br /&gt;
* Python Imaging Library (PIL) - http://www.pythonware.com/products/pil/&lt;br /&gt;
* virtualenv         - http://www.virtualenv.org/&lt;br /&gt;
* Python GStreamer Bindings - http://gstreamer.freedesktop.org/modules/gst-python.html&lt;br /&gt;
&lt;br /&gt;
=== GNU/Linux ===&lt;br /&gt;
&lt;br /&gt;
==== Debian and derivatives ====&lt;br /&gt;
&lt;br /&gt;
If you&#039;re running Debian GNU/Linux or a Debian-derived distribution&lt;br /&gt;
such as Debian, Mint, or [http://bugs.foocorp.net/issues/478 Ubuntu 10.10+], running the following should install these&lt;br /&gt;
requirements:&lt;br /&gt;
&lt;br /&gt;
{{Cmd|sudo apt-get install git-core python python-dev python-lxml python-imaging python-virtualenv python-gst0.10 libjpeg8-dev}}&lt;br /&gt;
&lt;br /&gt;
==== Fedora / RedHat(?) ====&lt;br /&gt;
&lt;br /&gt;
On Fedora:&lt;br /&gt;
&lt;br /&gt;
{{Cmd|yum install python-paste-deploy python-paste-script git-core python python-devel python-lxml python-imaging python-virtualenv gstreamer-python}}&lt;br /&gt;
&lt;br /&gt;
=== Mac OS X ===&lt;br /&gt;
&lt;br /&gt;
==== Mac OS X Lion ====&lt;br /&gt;
&lt;br /&gt;
Download the Newest Python.&lt;br /&gt;
&lt;br /&gt;
Git is already installed.&lt;br /&gt;
&lt;br /&gt;
* Note for PIL and lxml, you can: pip install pil lxml&lt;br /&gt;
&lt;br /&gt;
Python-lxml: http://muffinresearch.co.uk/archives/2009/03/05/install-lxml-on-osx/ with sudo&lt;br /&gt;
&lt;br /&gt;
Python Imaging Library (PIL): http://code.google.com/appengine/docs/python/images/installingPIL.html#mac&lt;br /&gt;
&lt;br /&gt;
Libjpeg &amp;amp; Libpng: http://ethan.tira-thompson.com/Mac_OS_X_Ports.html Combo Installer&lt;br /&gt;
&lt;br /&gt;
==== Mac OS X Snow Leopard ====&lt;br /&gt;
&lt;br /&gt;
# You will probably want to install MacPorts this will give you access to many free software packages in the same manner to apt-get and yum: https://www.macports.org/install.php&lt;br /&gt;
# Ensure you install Git and the command line tools: https://help.github.com/articles/set-up-git#platform-mac&lt;br /&gt;
# Once both of those are installed type this in your terminal and enter your password when prompted for it {{Cmd|sudo port install python27 py27-lxml py27-sqlalchemy py27-pil py27-virtualenv py27-gst-python py27-pastescript}}&lt;br /&gt;
&lt;br /&gt;
=== Microsoft Windows ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Thanks wctype!&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== Getting requirements ====&lt;br /&gt;
&lt;br /&gt;
* Python 2.7  -  [http://www.python.org/download/ Download] &amp;lt;!-- http://www.python.org/ftp/python/2.7.3/python-2.7.3.msi --&amp;gt;&lt;br /&gt;
* git - [https://github.com/msysgit/git/downloads Download] &amp;lt;!-- https://github.com/downloads/msysgit/git/Git-1.7.11-preview20120620.exe --&amp;gt;&lt;br /&gt;
* python-lxml - [http://pypi.python.org/pypi/lxml/2.3.5#downloads Tarball] [http://www.lfd.uci.edu/~gohlke/pythonlibs/#pil Binaries] &amp;lt;!-- http://pypi.python.org/packages/source/l/lxml/lxml-2.3.5.tar.gz, http://www.lfd.uci.edu/~gohlke/pythonlibs/z8sp4uqu/lxml-2.3.5.win32-py2.7.exe --&amp;gt;&lt;br /&gt;
* Python Imaging Library (PIL) - [http://www.pythonware.com/products/pil/ Download] &amp;lt;!-- http://effbot.org/downloads/PIL-1.1.7.win32-py2.7.exe] --&amp;gt;&lt;br /&gt;
* virtualenv - [http://pypi.python.org/pypi/virtualenvwrapper-win/1.0.8#downloads Download] &amp;lt;!-- http://pypi.python.org/packages/source/v/virtualenvwrapper-win/virtualenvwrapper-win-1.0.8.zip --&amp;gt;&lt;br /&gt;
* OSSBuild project provides reasonably up-to-date binaries of GStreamer - [https://code.google.com/p/ossbuild/downloads/list Download] &amp;lt;!-- http://ossbuild.googlecode.com/files/GStreamer-WinBuilds-GPL-x86.msi --&amp;gt;&lt;br /&gt;
* py-bcrypt - [https://bitbucket.org/alexandrul/py-bcrypt/downloads/ Download] &amp;lt;!-- https://bitbucket.org/alexandrul/py-bcrypt/downloads/py-bcrypt-0.2.post1.win32-py2.7.exe --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;You can help:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
If you have instructions for other GNU/Linux distributions, Windows, or Mac OS X to set&lt;br /&gt;
up requirements, [http://mediagoblin.org/join/ let us know]!&lt;br /&gt;
&lt;br /&gt;
== How to set up and maintain an environment for hacking with virtualenv ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Requirements&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
No additional requirements.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Create a development environment&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
After installing the requirements, follow these steps:&lt;br /&gt;
&lt;br /&gt;
* Clone the repository: {{Cmd|git clone &amp;lt;nowiki&amp;gt;git://gitorious.org/mediagoblin/mediagoblin.git&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
* Change directories to your new checkout: {{Cmd|cd mediagoblin}}&lt;br /&gt;
* Checkout git submodules: {{Cmd|git submodule init}} {{Cmd|git submodule update}}&lt;br /&gt;
* Set up the in-package virtualenv:&lt;br /&gt;
  (virtualenv --system-site-packages . || virtualenv .) &lt;br /&gt;
* Run setup.py:&lt;br /&gt;
  {{Cmd|./bin/python setup.py develop}}&lt;br /&gt;
* Consider running the testsuite:&lt;br /&gt;
  {{Cmd|./runtests.sh}}&lt;br /&gt;
* Init the database:&lt;br /&gt;
  {{Cmd|./bin/gmg dbupdate}}&lt;br /&gt;
&lt;br /&gt;
That&#039;s it!&lt;br /&gt;
&lt;br /&gt;
(If you have troubles in the remaining steps, consider try installing&lt;br /&gt;
virtualenv with one of the flags --setuptools, --distribute or possibly --no-site-packages.  Additionally, if your system has python3.X as the default, you might need to do virtualenv --python=python2.7 or --python=python2.6)&lt;br /&gt;
&lt;br /&gt;
If you have problems, please [http://mediagoblin.org/join/ let us know]!&lt;br /&gt;
&lt;br /&gt;
== Updating an existing environment ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Updating for dependency changes&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
While hacking on GNU MediaGoblin over time, you&#039;ll eventually have to&lt;br /&gt;
update your development environment because the dependencies have&lt;br /&gt;
changed.&lt;br /&gt;
&lt;br /&gt;
To do that, run:&lt;br /&gt;
&lt;br /&gt;
{{Cmd|./bin/python setup.py develop --upgrade &amp;amp;&amp;amp; ./bin/gmg dbupdate}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Updating for code changes&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{Cmd|git pull -u}}&lt;br /&gt;
{{Cmd|git submodule update}}&lt;br /&gt;
&lt;br /&gt;
== Running the server ==&lt;br /&gt;
&lt;br /&gt;
If you want to get things running quickly and without hassle, just&lt;br /&gt;
run:&lt;br /&gt;
&lt;br /&gt;
{{Cmd|./lazyserver.sh}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This will start up a python server where you can begin playing with&lt;br /&gt;
mediagoblin, listening on 127.0.0.1:6543.  It will also run celery in &amp;quot;always eager&amp;quot; mode so you&lt;br /&gt;
don&#039;t have to start a separate process for it.&lt;br /&gt;
&lt;br /&gt;
By default, the instance is not sending out confirmation mails. Instead they are redirected to the standard output (the console) of lazyserver.sh.&lt;br /&gt;
&lt;br /&gt;
You can change this behavior setting &amp;lt;code&amp;gt;email_debug_mode&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt; in mediagoblin.ini&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This is fine in development, but if you want to actually run celery&lt;br /&gt;
separately for testing (or deployment purposes), you&#039;ll want to run&lt;br /&gt;
the server independently:&lt;br /&gt;
&lt;br /&gt;
{{Cmd|./bin/paster serve paste.ini --reload}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Running celeryd ==&lt;br /&gt;
&lt;br /&gt;
If you aren&#039;t using &amp;lt;tt&amp;gt;./lazyserver.sh&amp;lt;/tt&amp;gt; or otherwise aren&#039;t running celery&lt;br /&gt;
in always eager mode, you&#039;ll need to do this if you want your media to&lt;br /&gt;
process and actually show up.  It&#039;s probably a good idea in&lt;br /&gt;
development to have the web server (above) running in one terminal and&lt;br /&gt;
celeryd in another window.&lt;br /&gt;
&lt;br /&gt;
Run:&lt;br /&gt;
&lt;br /&gt;
{{Cmd|&amp;lt;nowiki&amp;gt;CELERY_CONFIG_MODULE=mediagoblin.init.celery.from_celery ./bin/celeryd&amp;lt;/nowiki&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Running the test suite ==&lt;br /&gt;
&lt;br /&gt;
Run:&lt;br /&gt;
&lt;br /&gt;
{{Cmd|./runtests.sh}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Running a shell ==&lt;br /&gt;
&lt;br /&gt;
If you want a shell with your database pre-setup and an instantiated&lt;br /&gt;
application ready and at your fingertips....&lt;br /&gt;
&lt;br /&gt;
Run:&lt;br /&gt;
&lt;br /&gt;
{{Cmd|./bin/gmg shell}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
== Wiping your user data ==&lt;br /&gt;
&lt;br /&gt;
You can completely wipe all data from the instance by doing:&lt;br /&gt;
&lt;br /&gt;
{{Cmd|rm -rf mediagoblin.db kombu.db celery.db user_dev; ./bin/gmg dbupdate}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Unless you&#039;re doing development and working on and testing creating&lt;br /&gt;
a new instance, you will probably never have to do this.&lt;br /&gt;
&lt;br /&gt;
== Quickstart for Django programmers ==&lt;br /&gt;
&lt;br /&gt;
We&#039;re not using Django, but the codebase is very Django-like in its&lt;br /&gt;
structure.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;routing.py&amp;lt;/tt&amp;gt; is like &amp;lt;tt&amp;gt;urls.py&amp;lt;/tt&amp;gt; in Django&lt;br /&gt;
* &amp;lt;tt&amp;gt;models.py&amp;lt;/tt&amp;gt; has SQLAlchemy ORM definitions&lt;br /&gt;
* &amp;lt;tt&amp;gt;views.py&amp;lt;/tt&amp;gt; is where the views go&lt;br /&gt;
&lt;br /&gt;
We&#039;re using SQLAlchemy, which is semi-similar to the Django ORM, but&lt;br /&gt;
not really because you can get a lot more fine-grained.  The&lt;br /&gt;
[http://docs.sqlalchemy.org/en/latest/orm/tutorial.html SQLAlchemy ORM tutorial] is a great place to start.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;YouCanHelp&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
If there are other things that you think would help orient someone&lt;br /&gt;
new to GNU MediaGoblin but coming from Django, let us know!&lt;br /&gt;
&lt;br /&gt;
== Showing off your work with PageKite ==&lt;br /&gt;
&lt;br /&gt;
If you&#039;re doing development with MediaGoblin, it&#039;s sometimes helpful to show off your work to gather feedback from other contributors.  A number of the MediaGoblin developers use something called [http://pagekite.net PageKite], which is a fellow free software web service which makes temporarily showing off work on your machine easy.  There&#039;s a [http://pagekite.net/wiki/Howto/UsePageKiteWithMediaGoblin/ tutorial on how to use PageKite and MediaGoblin together] available on the PageKite wiki.&lt;br /&gt;
&lt;br /&gt;
If you are doing a lot of MediaGoblin development, the PageKite people have graciously offered us a good amount of bandwidth at no cost in an effort to help out fellow free software projects.  If you&#039;ve been making significant contributions, PM Chris Webber on freenode (who is paroneayea there) and ask if you can be added to our group plan.&lt;br /&gt;
&lt;br /&gt;
== Bite-sized bugs to start with ==&lt;br /&gt;
&lt;br /&gt;
Now you should visit our latest list of [http://issues.mediagoblin.org/query?status=!closed&amp;amp;keywords=~bitesized bite-sized issues] because squishing bugs is messy fun. If you&#039;re interested in other things to work on, or need help getting started on a bug, let us know on [http://mediagoblin.org/join/ the mailing list] or on the [http://mediagoblin.org/join/ IRC channel].&lt;/div&gt;</summary>
		<author><name>Elrond</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=Triage_Bugs&amp;diff=1314</id>
		<title>Triage Bugs</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=Triage_Bugs&amp;diff=1314"/>
		<updated>2013-06-14T17:06:32Z</updated>

		<summary type="html">&lt;p&gt;Elrond: Update bug tags&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The triage process involves reviewing bugs, removing duplicates, validating that the issues described are reproducible, ensuring that the exact behavior is properly documented, diagnosing the cause of each issue, and working with developers to ensure that critical bugs get addressed. In many cases, developers do this kind of work as a matter of course, but one need not be able to code in order to help working with bugs.&lt;br /&gt;
&lt;br /&gt;
To triage bugs, go to the bug tracker and begin reviewing the open issues. If you are able, attempt to:&lt;br /&gt;
&lt;br /&gt;
* ensure that one or two people in addition to the initial reporter have been able to reproduce the issue.&lt;br /&gt;
* document the issue more clearly. If you had any trouble reproducing the issue, provide any elucidating information that you can to help others solve the problem more effectively.&lt;br /&gt;
* find a way to resolve the problem or provide a workaround.&lt;br /&gt;
&lt;br /&gt;
For help, instructions, and suggestions be in touch with the development community on the list or in the IRC channel for more information. With many eyes, all bugs are shallow.&lt;br /&gt;
&lt;br /&gt;
=== Bug keywords/tags ===&lt;br /&gt;
* &amp;quot;bitesized&amp;quot; for bugs that should be easy to fix, even for beginners.&lt;br /&gt;
* (Probably outdated with new bug status system) &amp;quot;review&amp;quot; for bugs, that have a patch (branch!) associated and someone should look at that branch and likely merge it into master&lt;br /&gt;
* &amp;quot;longterm&amp;quot; for bugs, that are planned to happen at some point. There is no immediate need to take action. If the bug has been without traffic for more than a year, we might reconsider the thing.&lt;br /&gt;
* &amp;quot;sql&amp;quot; for things relating to our sql data model.&lt;br /&gt;
* &amp;quot;video&amp;quot; for things relating to the video media type&lt;br /&gt;
* &amp;quot;audio&amp;quot; for things relating to the audio media type&lt;br /&gt;
&lt;br /&gt;
=== See also ===&lt;br /&gt;
* [[BugTriageDay]] — every other Thursday&lt;br /&gt;
* [[TriageWorkflow]] — for discussion&lt;/div&gt;</summary>
		<author><name>Elrond</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=Authentication&amp;diff=1278</id>
		<title>Authentication</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=Authentication&amp;diff=1278"/>
		<updated>2013-05-02T20:04:31Z</updated>

		<summary type="html">&lt;p&gt;Elrond: /* Auth Plugin Design Pros/Cons */ More Pros/Cons; sone code fixups&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Designing Authentication API ==&lt;br /&gt;
&lt;br /&gt;
To make our auth(entication) system more modular, we&#039;re likely going to have some sort of interface style API for it. This page is to design it.&lt;br /&gt;
&lt;br /&gt;
== Auth Plugin Design Pros/Cons ==&lt;br /&gt;
&lt;br /&gt;
===Interfacey Design w/o hooks:===&lt;br /&gt;
&lt;br /&gt;
Using an interface design similar to the Base Class design below. Calls would be added to _auth_providers list in the dummy class when setup_plugin is run. Each function in the dummy class would run through the _auth_providers list and return the response from the corresponding function from the last plugin in _auth_providers list.&lt;br /&gt;
&lt;br /&gt;
Ex:&lt;br /&gt;
    auth/__init__.py:&amp;lt;nowiki&amp;gt;&lt;br /&gt;
        _auth_providers = []&lt;br /&gt;
        def add_auth_provider(provider):&lt;br /&gt;
            _auth_providers.append(provider)&lt;br /&gt;
&lt;br /&gt;
        def get_response(function, *args):&lt;br /&gt;
            for p in _auth_providers:&lt;br /&gt;
                response = p.function(*args)&lt;br /&gt;
                if response:&lt;br /&gt;
                    return response&lt;br /&gt;
            raise NotImplemented(&amp;quot;No provider for %s&amp;quot; % functions)&lt;br /&gt;
&lt;br /&gt;
        def check_login(self, user, password):&lt;br /&gt;
            return get_response(&amp;quot;check_login&amp;quot;, user, password)&lt;br /&gt;
&lt;br /&gt;
    auth_plugin/__init__.py:&amp;lt;nowiki&amp;gt;&lt;br /&gt;
        def setup_plugin():&lt;br /&gt;
            add_auth_provider(SomeAuthPlugin(config1))&lt;br /&gt;
            add_auth_provider(SomeAuthPlugin(config2))&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Pros====&lt;br /&gt;
* Plugins could inherit from another plugin and override.&lt;br /&gt;
* Plugins can configure the individual instance (ldap server name)&lt;br /&gt;
* Plugins can instantiate multiple providers for different backends, like two different ldap servers&lt;br /&gt;
&lt;br /&gt;
====Cons====&lt;br /&gt;
&lt;br /&gt;
*basically be duplicating the code for hook_handle&lt;br /&gt;
&lt;br /&gt;
===Interfacey Design w/ hooks:===&lt;br /&gt;
&lt;br /&gt;
Using an interface design similar to the Base Class design below and using hooks to register the auth_plugin interface. Basicly a variation on the previous idea, just a bit more &amp;quot;hooky&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Ex:&lt;br /&gt;
    auth/__init__.py:&amp;lt;nowiki&amp;gt;&lt;br /&gt;
        ...&lt;br /&gt;
        def setup_auth():&lt;br /&gt;
            global _auth_providers&lt;br /&gt;
            _auth_providers += hook_runall(&amp;quot;auth_provider&amp;quot;)&lt;br /&gt;
        ...&lt;br /&gt;
&lt;br /&gt;
    auth_plugin/__init__.py:&amp;lt;nowiki&amp;gt;&lt;br /&gt;
        hooks = {&amp;quot;auth_provider&amp;quot;: get_auth_provider}&lt;br /&gt;
        def get_auth_provider(): return AuthUserInterface()&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Pros====&lt;br /&gt;
* Plugins could inherit from another plugin and override.&lt;br /&gt;
* Still allows configuration on the individual instance&lt;br /&gt;
&lt;br /&gt;
====Cons====&lt;br /&gt;
* would basically be duplicating the code for hook_handle&lt;br /&gt;
* No easy way to add multiple instances of one Provider&lt;br /&gt;
&lt;br /&gt;
===Non-Interfacey Design w/ hooks for every call:===&lt;br /&gt;
&lt;br /&gt;
This design would have a plugin &amp;quot;template&amp;quot; in auth/__init__.py similar to the Interfacey designs, except that it would use hook_handle() for each function.&lt;br /&gt;
&lt;br /&gt;
 Ex.&lt;br /&gt;
    auth/__init__.py:&amp;lt;nowiki&amp;gt;&lt;br /&gt;
        def check_login(user, Password):&lt;br /&gt;
            return hook_handle(&amp;quot;auth_check_login&amp;quot;, user, password)&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    auth_plugin/__init__.py:&amp;lt;nowiki&amp;gt;&lt;br /&gt;
        hooks = {&amp;quot;auth_check_login&amp;quot;: check_login}&lt;br /&gt;
        def check_login(user, password):&lt;br /&gt;
            if a: return True   # Yes, let them in&lt;br /&gt;
            if b: return False  # No and don&#039;t try other providers&lt;br /&gt;
            return None  # Don&#039;t know, try next provider.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====Pros====&lt;br /&gt;
&lt;br /&gt;
* Simpler to implement&lt;br /&gt;
&lt;br /&gt;
====Cons====&lt;br /&gt;
&lt;br /&gt;
All the Pros from the interface design are not here:&lt;br /&gt;
* config data has to be global on the plugin, not local to the instantiated provider&lt;br /&gt;
* No straight way of doing multiple instances.&lt;br /&gt;
*: Yes, the individual hook could do it by itself&lt;br /&gt;
&lt;br /&gt;
== __init__.py Base Class ==&lt;br /&gt;
&lt;br /&gt;
***This is a brainstorm of some of the functions and variables that the base class should include.***&lt;br /&gt;
&lt;br /&gt;
basic_auth = False # Will be used to render to correct forms if using both basic_auth and openid/persona&lt;br /&gt;
&lt;br /&gt;
login_form = # Plugin LoginForm class&lt;br /&gt;
&lt;br /&gt;
registration_form = # Plugin RegistrationForm class&lt;br /&gt;
&lt;br /&gt;
    class UserAuthInterface(object):&lt;br /&gt;
        &amp;lt;nowiki&amp;gt;&lt;br /&gt;
        deg _raise_not_implemented(self):&lt;br /&gt;
            # Will raise a warning if some component of this interface isn&#039;t implemented by an Auth plugin&lt;br /&gt;
&lt;br /&gt;
        def check_login(self, user, password):&lt;br /&gt;
            return False&lt;br /&gt;
        &lt;br /&gt;
        def get_user(self, *args):&lt;br /&gt;
            # Will query database and will return a User() object&lt;br /&gt;
&lt;br /&gt;
        def create_user(self, *args):&lt;br /&gt;
            # Will create a new user and save to the db.&lt;br /&gt;
            # Will return User() object&lt;br /&gt;
&lt;br /&gt;
        def extra_validation(self, register_form, *args):&lt;br /&gt;
            # Will query the db and add error messages to register_form if any.&lt;br /&gt;
            # return true if able to create new user &lt;br /&gt;
&lt;br /&gt;
        def get_user_metadata(self, user):&lt;br /&gt;
            # Return a nice object with metadata from auth provider. Used to pre-fill registration forms&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Elrond</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=Authentication&amp;diff=1265</id>
		<title>Authentication</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=Authentication&amp;diff=1265"/>
		<updated>2013-04-26T15:48:33Z</updated>

		<summary type="html">&lt;p&gt;Elrond: Initial page for modular authentication&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Designing Authentication API ==&lt;br /&gt;
&lt;br /&gt;
To make our auth(entication) system more modular, we&#039;re likely going to have some sort of interface style API for it. This page is to design it.&lt;/div&gt;</summary>
		<author><name>Elrond</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=GSOC_2013&amp;diff=1250</id>
		<title>GSOC 2013</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=GSOC_2013&amp;diff=1250"/>
		<updated>2013-04-16T20:05:00Z</updated>

		<summary type="html">&lt;p&gt;Elrond: /* Blogging system */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We are participating in [http://www.google-melange.com/gsoc/homepage/google/gsoc2013 GSOC 2013] via the [http://www.gnu.org/software/soc-projects/ideas-2013.html#mediagoblin GNU umbrella]!&lt;br /&gt;
&lt;br /&gt;
We are also participating in [[Outreach Program for Women 2013]]... see that page for specific information about that program, but the projects suggested on this page are the same as those for OPW 2013 :)&lt;br /&gt;
&lt;br /&gt;
To both students and mentors, please read up on the [http://www.google-melange.com/document/show/gsoc_program/google/gsoc2013/help_page GSOC 2013 help page]!&lt;br /&gt;
&lt;br /&gt;
= How do I apply as a student? =&lt;br /&gt;
&lt;br /&gt;
Well, we need to be accepted as a mentoring org first :)&lt;br /&gt;
&lt;br /&gt;
But then:&lt;br /&gt;
* Submit your application (details coming soon)&lt;br /&gt;
* [http://mediagoblin.org/pages/join.html Join us] on IRC and on our mailing lists.&lt;br /&gt;
* Set up a development environment via our [[HackingHowto]]&lt;br /&gt;
* If you have never done web development in python before, MediaGoblin is a pretty good place to start!  However, we highly recommend going through the [https://docs.djangoproject.com/en/1.5/intro/tutorial01/ Django tutorial]... this isn&#039;t a requirement, but it will help you be better prepared.&lt;br /&gt;
&lt;br /&gt;
It&#039;s important that you communicate... most MediaGoblin communication happens on IRC, so you should [http://webchat.freenode.net/?channels=mediagoblin join us there] and discuss (#mediagoblin on irc.freenode.net)!  Please, please join our channel and introduce yourself.  We&#039;d love to hear from you!&lt;br /&gt;
&lt;br /&gt;
= Possible projects =&lt;br /&gt;
&lt;br /&gt;
Here are a list of projects that students may wish to apply for for GSOC 2013:&lt;br /&gt;
&lt;br /&gt;
== Blogging system ==&lt;br /&gt;
&lt;br /&gt;
We&#039;ve had an increasing number of people ask if MediaGoblin would be a useful blogging system.  The answer is that at present, it isn&#039;t: even though we support an ascii art media type, media types aren&#039;t really the right way to handle blogging since they don&#039;t really fit with the &amp;quot;gallery&amp;quot; style of editing things in MediaGoblin.&lt;br /&gt;
&lt;br /&gt;
But people are interested in something that&#039;s more along the lines of Tumblr: a blogging platform with good media embedding integration.  In many ways, MediaGoblin is perfect for this!&lt;br /&gt;
&lt;br /&gt;
Some thoughts:&lt;br /&gt;
&lt;br /&gt;
* Blogs might go at /u/foo-user/b/ and individual blogposts at /u/foo-user/b/blogpost-slug/&lt;br /&gt;
* Also take a look at Chris&#039; post about this, it has some important design notes: http://lists.mediagoblin.org/pipermail/devel/2013-April/000491.html&lt;br /&gt;
* Blogging should be a plugin&lt;br /&gt;
* To make blogging more useful (either to the blogging plugin or to external blogging engines) it would be good to have much better embedding support in MediaGoblin. So improving embedding support should be mentioned in the proposal.&lt;br /&gt;
* HTML with something like TinyMCE integration would be good.  HTML would need to be cleaned on the backend.&lt;br /&gt;
* Maybe other types would be allowed (markdown, restructured text) though I&#039;m not sure how much more complex that makes cleaning HTML output.&lt;br /&gt;
* What about commenting?  Would we need a seaparate comments table?&lt;br /&gt;
&lt;br /&gt;
Possible Mentor: spaetz&lt;br /&gt;
&lt;br /&gt;
== Pluggable user authentication &amp;amp; implementations ==&lt;br /&gt;
&lt;br /&gt;
We&#039;d like a pluggable user authentication module.  Some people want to use things like LDAP.  Some people would also like BrowserID integration.&lt;br /&gt;
&lt;br /&gt;
With our new work toward pluginification it would be good to see the structure for user authentication to be interface&#039;ified.  It would also be good to have implementation for several types of logins such as BrowserID, LDAP, and central authentication system stuff.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible mentors:&#039;&#039;&#039; Nathan Yergler, Joar Wandborg, [[User:Cwebber|Chris Webber]]&lt;br /&gt;
&lt;br /&gt;
== Administrative interface / moderation tools ==&lt;br /&gt;
&lt;br /&gt;
At present there isn&#039;t much as in terms of tooling to deal with things as an administrator.  Several things would be greatly of help to admins at present:&lt;br /&gt;
&lt;br /&gt;
* Views to search for users and take actions upon them&lt;br /&gt;
* Tools to deal with handling problematic content/users&lt;br /&gt;
* More generalized panel for looking at things being processed&lt;br /&gt;
* ???&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible mentors:&#039;&#039;&#039; --[[User:Copiesofcopies|Copiesofcopies]] ([[User talk:Copiesofcopies|talk]]) 15:02, 1 April 2013 (EDT), Joar Wandborg, [[User:Cwebber|Chris Webber]]&lt;br /&gt;
&lt;br /&gt;
== Processing panel improvements ==&lt;br /&gt;
&lt;br /&gt;
While media is being uploaded, there&#039;s not very good and clear indications of this, though we have some basics.&lt;br /&gt;
&lt;br /&gt;
* Show the number of entries that are currently in processing in the dropdown user panel at the top of mediagoblin instances&lt;br /&gt;
* In media entries that are currently in progress, give clearer information about amount of work left?  (Note, showing percentages might be hard)&lt;br /&gt;
* Nicer looking demonstrations of what failed.&lt;br /&gt;
&lt;br /&gt;
Note: this one might require a lot of graphic design and discussion; anyone interested in it would have to work closely with people on IRC before submitting a real proposal.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible mentors:&#039;&#039;&#039; --[[User:Copiesofcopies|Copiesofcopies]] ([[User talk:Copiesofcopies|talk]]) 15:03, 1 April 2013 (EDT), Joar Wandborg, [[User:Cwebber|Chris Webber]]&lt;br /&gt;
&lt;br /&gt;
== Pluginifying media types ==&lt;br /&gt;
&lt;br /&gt;
Media types currently have their own way of being configured separately.  It would be good to be able to make them into bona-fide plugins (if anything with some special case metadata).  This will also allow media types to define things like special-case views, etc.&lt;br /&gt;
&lt;br /&gt;
Possible mentors: --[[User:Copiesofcopies|Copiesofcopies]] ([[User talk:Copiesofcopies|talk]]) 15:02, 1 April 2013 (EDT), Joar Wandborg&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible mentors:&#039;&#039;&#039; Joar Wandborg, [[User:Cwebber|Chris Webber]]&lt;br /&gt;
&lt;br /&gt;
== User upload account limits ==&lt;br /&gt;
&lt;br /&gt;
It would be great to have the ability to set limits on the amount of stuff people can upload.  This would involve both hooks to track the space of media as it&#039;s saved (maybe this should be fairly core?) as well as the ability to refuse an upload because a limit has been already hit.  Tools to change limits would also be good, especially via an administrative interface and ./bin/gmg&lt;br /&gt;
&lt;br /&gt;
--[[User:Joar|Joar]] ([[User talk:Joar|talk]]) 07:41, 30 March 2013 (EDT) &amp;lt;code&amp;gt;mediagoblin.storage.StorageInterface&amp;lt;/code&amp;gt; should probably implement a &amp;lt;code&amp;gt;get_size&amp;lt;/code&amp;gt; method or similar.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible mentors:&#039;&#039;&#039; Joar Wandborg, [[User:Cwebber|Chris Webber]]&lt;br /&gt;
&lt;br /&gt;
== Search interface ==&lt;br /&gt;
&lt;br /&gt;
We don&#039;t have any sort of search for media whatsoever at present.  Obviously people want this!&lt;br /&gt;
&lt;br /&gt;
There&#039;s been some discussion of a search interface that would be federated, but for the scope of this, we don&#039;t need to worry about that.  It would be enough to investigate a search engine that would allow for searching across the subjects/titles/descriptions of media.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible mentors:&#039;&#039;&#039; Nathan Yergler, Aeva NTSC, [[User:Cwebber|Chris Webber]]&lt;br /&gt;
&lt;br /&gt;
== Media type reprocessing framework ==&lt;br /&gt;
&lt;br /&gt;
This one is tricky!  Basically, allowing media to go back into processing... ie, resizing an image to a new size, re-transcoding video, etc.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible mentors:&#039;&#039;&#039; Joar Wandborg, [[User:Cwebber|Chris Webber]]&lt;/div&gt;</summary>
		<author><name>Elrond</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=GSOC_2013&amp;diff=1249</id>
		<title>GSOC 2013</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=GSOC_2013&amp;diff=1249"/>
		<updated>2013-04-16T18:59:24Z</updated>

		<summary type="html">&lt;p&gt;Elrond: /* Blogging system */ Note about embedding support&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We are participating in [http://www.google-melange.com/gsoc/homepage/google/gsoc2013 GSOC 2013] via the [http://www.gnu.org/software/soc-projects/ideas-2013.html#mediagoblin GNU umbrella]!&lt;br /&gt;
&lt;br /&gt;
We are also participating in [[Outreach Program for Women 2013]]... see that page for specific information about that program, but the projects suggested on this page are the same as those for OPW 2013 :)&lt;br /&gt;
&lt;br /&gt;
To both students and mentors, please read up on the [http://www.google-melange.com/document/show/gsoc_program/google/gsoc2013/help_page GSOC 2013 help page]!&lt;br /&gt;
&lt;br /&gt;
= How do I apply as a student? =&lt;br /&gt;
&lt;br /&gt;
Well, we need to be accepted as a mentoring org first :)&lt;br /&gt;
&lt;br /&gt;
But then:&lt;br /&gt;
* Submit your application (details coming soon)&lt;br /&gt;
* [http://mediagoblin.org/pages/join.html Join us] on IRC and on our mailing lists.&lt;br /&gt;
* Set up a development environment via our [[HackingHowto]]&lt;br /&gt;
* If you have never done web development in python before, MediaGoblin is a pretty good place to start!  However, we highly recommend going through the [https://docs.djangoproject.com/en/1.5/intro/tutorial01/ Django tutorial]... this isn&#039;t a requirement, but it will help you be better prepared.&lt;br /&gt;
&lt;br /&gt;
It&#039;s important that you communicate... most MediaGoblin communication happens on IRC, so you should [http://webchat.freenode.net/?channels=mediagoblin join us there] and discuss (#mediagoblin on irc.freenode.net)!  Please, please join our channel and introduce yourself.  We&#039;d love to hear from you!&lt;br /&gt;
&lt;br /&gt;
= Possible projects =&lt;br /&gt;
&lt;br /&gt;
Here are a list of projects that students may wish to apply for for GSOC 2013:&lt;br /&gt;
&lt;br /&gt;
== Blogging system ==&lt;br /&gt;
&lt;br /&gt;
We&#039;ve had an increasing number of people ask if MediaGoblin would be a useful blogging system.  The answer is that at present, it isn&#039;t: even though we support an ascii art media type, media types aren&#039;t really the right way to handle blogging since they don&#039;t really fit with the &amp;quot;gallery&amp;quot; style of editing things in MediaGoblin.&lt;br /&gt;
&lt;br /&gt;
But people are interested in something that&#039;s more along the lines of Tumblr: a blogging platform with good media embedding integration.  In many ways, MediaGoblin is perfect for this!&lt;br /&gt;
&lt;br /&gt;
Some thoughts:&lt;br /&gt;
&lt;br /&gt;
* Blogs might go at /u/foo-user/b/ and individual blogposts at /u/foo-user/b/blogpost-slug/&lt;br /&gt;
* Blogging should be a plugin&lt;br /&gt;
* To make blogging more useful (either to the blogging plugin or to external blogging engines) it would be good to have much better embedding support in MediaGoblin. So improving embedding support should be mentioned in the proposal.&lt;br /&gt;
* HTML with something like TinyMCE integration would be good.  HTML would need to be cleaned on the backend.&lt;br /&gt;
* Maybe other types would be allowed (markdown, restructured text) though I&#039;m not sure how much more complex that makes cleaning HTML output.&lt;br /&gt;
* What about commenting?  Would we need a seaparate comments table?&lt;br /&gt;
&lt;br /&gt;
Possible Mentor: spaetz&lt;br /&gt;
&lt;br /&gt;
== Pluggable user authentication &amp;amp; implementations ==&lt;br /&gt;
&lt;br /&gt;
We&#039;d like a pluggable user authentication module.  Some people want to use things like LDAP.  Some people would also like BrowserID integration.&lt;br /&gt;
&lt;br /&gt;
With our new work toward pluginification it would be good to see the structure for user authentication to be interface&#039;ified.  It would also be good to have implementation for several types of logins such as BrowserID, LDAP, and central authentication system stuff.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible mentors:&#039;&#039;&#039; Nathan Yergler, Joar Wandborg, [[User:Cwebber|Chris Webber]]&lt;br /&gt;
&lt;br /&gt;
== Administrative interface / moderation tools ==&lt;br /&gt;
&lt;br /&gt;
At present there isn&#039;t much as in terms of tooling to deal with things as an administrator.  Several things would be greatly of help to admins at present:&lt;br /&gt;
&lt;br /&gt;
* Views to search for users and take actions upon them&lt;br /&gt;
* Tools to deal with handling problematic content/users&lt;br /&gt;
* More generalized panel for looking at things being processed&lt;br /&gt;
* ???&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible mentors:&#039;&#039;&#039; --[[User:Copiesofcopies|Copiesofcopies]] ([[User talk:Copiesofcopies|talk]]) 15:02, 1 April 2013 (EDT), Joar Wandborg, [[User:Cwebber|Chris Webber]]&lt;br /&gt;
&lt;br /&gt;
== Processing panel improvements ==&lt;br /&gt;
&lt;br /&gt;
While media is being uploaded, there&#039;s not very good and clear indications of this, though we have some basics.&lt;br /&gt;
&lt;br /&gt;
* Show the number of entries that are currently in processing in the dropdown user panel at the top of mediagoblin instances&lt;br /&gt;
* In media entries that are currently in progress, give clearer information about amount of work left?  (Note, showing percentages might be hard)&lt;br /&gt;
* Nicer looking demonstrations of what failed.&lt;br /&gt;
&lt;br /&gt;
Note: this one might require a lot of graphic design and discussion; anyone interested in it would have to work closely with people on IRC before submitting a real proposal.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible mentors:&#039;&#039;&#039; --[[User:Copiesofcopies|Copiesofcopies]] ([[User talk:Copiesofcopies|talk]]) 15:03, 1 April 2013 (EDT), Joar Wandborg, [[User:Cwebber|Chris Webber]]&lt;br /&gt;
&lt;br /&gt;
== Pluginifying media types ==&lt;br /&gt;
&lt;br /&gt;
Media types currently have their own way of being configured separately.  It would be good to be able to make them into bona-fide plugins (if anything with some special case metadata).  This will also allow media types to define things like special-case views, etc.&lt;br /&gt;
&lt;br /&gt;
Possible mentors: --[[User:Copiesofcopies|Copiesofcopies]] ([[User talk:Copiesofcopies|talk]]) 15:02, 1 April 2013 (EDT), Joar Wandborg&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible mentors:&#039;&#039;&#039; Joar Wandborg, [[User:Cwebber|Chris Webber]]&lt;br /&gt;
&lt;br /&gt;
== User upload account limits ==&lt;br /&gt;
&lt;br /&gt;
It would be great to have the ability to set limits on the amount of stuff people can upload.  This would involve both hooks to track the space of media as it&#039;s saved (maybe this should be fairly core?) as well as the ability to refuse an upload because a limit has been already hit.  Tools to change limits would also be good, especially via an administrative interface and ./bin/gmg&lt;br /&gt;
&lt;br /&gt;
--[[User:Joar|Joar]] ([[User talk:Joar|talk]]) 07:41, 30 March 2013 (EDT) &amp;lt;code&amp;gt;mediagoblin.storage.StorageInterface&amp;lt;/code&amp;gt; should probably implement a &amp;lt;code&amp;gt;get_size&amp;lt;/code&amp;gt; method or similar.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible mentors:&#039;&#039;&#039; Joar Wandborg, [[User:Cwebber|Chris Webber]]&lt;br /&gt;
&lt;br /&gt;
== Search interface ==&lt;br /&gt;
&lt;br /&gt;
We don&#039;t have any sort of search for media whatsoever at present.  Obviously people want this!&lt;br /&gt;
&lt;br /&gt;
There&#039;s been some discussion of a search interface that would be federated, but for the scope of this, we don&#039;t need to worry about that.  It would be enough to investigate a search engine that would allow for searching across the subjects/titles/descriptions of media.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible mentors:&#039;&#039;&#039; Nathan Yergler, Aeva NTSC, [[User:Cwebber|Chris Webber]]&lt;br /&gt;
&lt;br /&gt;
== Media type reprocessing framework ==&lt;br /&gt;
&lt;br /&gt;
This one is tricky!  Basically, allowing media to go back into processing... ie, resizing an image to a new size, re-transcoding video, etc.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Possible mentors:&#039;&#039;&#039; Joar Wandborg, [[User:Cwebber|Chris Webber]]&lt;/div&gt;</summary>
		<author><name>Elrond</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=BeginnersCorner&amp;diff=1237</id>
		<title>BeginnersCorner</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=BeginnersCorner&amp;diff=1237"/>
		<updated>2013-04-10T18:01:23Z</updated>

		<summary type="html">&lt;p&gt;Elrond: /* Learning git */ Link to Git_workflow&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The MediaGoblin project is welcoming of new contributors, even those who are new to programming. The following resources can help you learn enough to start hacking on MediaGoblin.&lt;br /&gt;
&lt;br /&gt;
== Tips for people new to coding ==&lt;br /&gt;
&lt;br /&gt;
=== Learning Python ===&lt;br /&gt;
&lt;br /&gt;
GNU MediaGoblin is written using a programming language called [http://python.org/ Python].&lt;br /&gt;
&lt;br /&gt;
There are two different incompatible iterations of Python which I&#039;ll&lt;br /&gt;
refer to as Python 2 and Python 3.  GNU MediaGoblin is written in&lt;br /&gt;
Python 2 and requires Python 2.6 or 2.7.  At some point, we might&lt;br /&gt;
switch to Python 3, but that&#039;s a future thing.&lt;br /&gt;
&lt;br /&gt;
You can learn how to code in Python 2 from several excellent books&lt;br /&gt;
that are freely available on the Internet:&lt;br /&gt;
&lt;br /&gt;
* [http://learnpythonthehardway.org/ Learn Python the Hard Way]&lt;br /&gt;
* [http://diveintopython.org/ Dive Into Python]&lt;br /&gt;
* [http://www.greenteapress.com/thinkpython/ Python for Software Design]&lt;br /&gt;
* [http://www.swaroopch.com/notes/Python A Byte of Python]&lt;br /&gt;
&lt;br /&gt;
These are all excellent texts.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;You Can Help&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
If you know of other good quality Python tutorials and Python&lt;br /&gt;
tutorial videos, let us know!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Learning Libraries GNU MediaGoblin uses ===&lt;br /&gt;
&lt;br /&gt;
GNU MediaGoblin uses a variety of libraries in order to do what it&lt;br /&gt;
does.  These libraries are listed in the [http://docs.mediagoblin.org/siteadmin/codebase.html :ref:`codebase-chapter`]&lt;br /&gt;
along with links to the project Web sites and documentation for the&lt;br /&gt;
libraries.&lt;br /&gt;
&lt;br /&gt;
There are a variety of Python-related conferences every year that have&lt;br /&gt;
sessions covering many aspects of these libraries.  You can find them&lt;br /&gt;
at [http://pyvideo.org/ pyvideo.org] -- This is a shameless plug; Will Kahn-Greene runs pyvideo.org&lt;br /&gt;
&lt;br /&gt;
If you have questions or need help, [http://mediagoblin.org/join/ let us know]!&lt;br /&gt;
&lt;br /&gt;
=== Learning git ===&lt;br /&gt;
&lt;br /&gt;
git is an interesting and very powerful tool.  Like all powerful&lt;br /&gt;
tools, it has a learning curve.&lt;br /&gt;
&lt;br /&gt;
If you&#039;re new to git, we highly recommend the following resources for&lt;br /&gt;
getting the hang of it:&lt;br /&gt;
&lt;br /&gt;
* [http://learn.github.com/p/intro.html Learn Git] --- the GitHub intro to git&lt;br /&gt;
* [http://progit.org/book/ Pro Git] --- fantastic book&lt;br /&gt;
* [http://gitcasts.com/ Git casts] --- screencast covering git usage&lt;br /&gt;
* [http://gitref.org/ Git Reference] --- Git reference that makes it easier to get the hang of git if you&#039;re coming from other version control systems&lt;br /&gt;
* [[Git workflow]] --- How to go about submitting patches via git.&lt;br /&gt;
&lt;br /&gt;
There&#039;s also a git mission at [http://openhatch.org/ OpenHatch].&lt;br /&gt;
&lt;br /&gt;
=== Learning other utilities ===&lt;br /&gt;
&lt;br /&gt;
The [http://openhatch.org/ OpenHatch] site has a series of&lt;br /&gt;
[http://openhatch.org/missions/ training missions] which are&lt;br /&gt;
designed to help you learn how to use these tools.&lt;br /&gt;
&lt;br /&gt;
If you&#039;re new to tar, diff, patch and git, we highly recommend you sign&lt;br /&gt;
up with OpenHatch and do the missions.&lt;/div&gt;</summary>
		<author><name>Elrond</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=Design&amp;diff=1186</id>
		<title>Design</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=Design&amp;diff=1186"/>
		<updated>2013-03-10T12:28:17Z</updated>

		<summary type="html">&lt;p&gt;Elrond: Link to Original Design Decisions on docs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Welcome to the Design Shack&amp;amp;trade;, where we collect all things design in and around MediaGoblin.&lt;br /&gt;
&lt;br /&gt;
* [http://docs.mediagoblin.org/devel/originaldesigndecisions.html Original Design Decisions]: general musings on the MediaGoblin name, software choices and licensing decisions&lt;br /&gt;
* Graphical design&lt;br /&gt;
** [[Design/Appearance]]: about MediaGoblin&#039;s appearance and style; good reading material if you&#039;d like to contribute&lt;br /&gt;
** Get and use the MediaGoblin logo at http://www.mediagoblin.org/pages/logo.html&lt;br /&gt;
* Interaction design&lt;br /&gt;
** [[Design/Specs]]: design specifications for features&lt;br /&gt;
** [[User_Experience]]: a collection of user test reports&lt;br /&gt;
** [[Feature_Ideas]]: feature suggestions and brainstorming space (for more specific features or bugs: use the [http://bugs.foocorp.net/projects/mediagoblin/issues bug tracker])&lt;br /&gt;
&lt;br /&gt;
== Join us ==&lt;br /&gt;
MediaGoblin&#039;s design is not a fixed thing. Rather, it&#039;s in a constant state of flux and we are always trying to improve it. If you&#039;d like to help, [http://www.mediagoblin.org/pages/join get involved]!&lt;/div&gt;</summary>
		<author><name>Elrond</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=Main_Page&amp;diff=1185</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=Main_Page&amp;diff=1185"/>
		<updated>2013-03-09T17:15:16Z</updated>

		<summary type="html">&lt;p&gt;Elrond: /* Technical project documentation */ DesignDecisions moved into main docs. So put a generic link here.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Want to Join the MediaGoblin Community? =&lt;br /&gt;
&lt;br /&gt;
We’re really glad that you want to join the MediaGoblin community!&lt;br /&gt;
&lt;br /&gt;
There are a variety of ways to help and support MediaGoblin and to join the team.  If you want to code, great, if not, even better!  MediaGoblin interested contributors in many different roles: users, system administrators, technical writers, testers, evangelists, UI/UX and graphics designers, cheerleaders, and dreamers.&lt;br /&gt;
&lt;br /&gt;
This wiki covers a variety of ways that you can get involved with MediaGoblin as well as instructions on how to get started.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hang out with the MediaGoblin folk ==&lt;br /&gt;
&lt;br /&gt;
MediaGoblin has a mailing list and an IRC channel where we hang out.  See [http://mediagoblin.org/pages/join.html our join page] for links.&lt;br /&gt;
&lt;br /&gt;
Please drop by and say “Hi!”  And, if you’re looking for something to do, just ask---there’s always work to be done.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Take Part in the Monthly Meetings ==&lt;br /&gt;
&lt;br /&gt;
Each month is a [[:Category:Meeting|Meeting]]. You can take part and help decide on the future of MediaGoblin. Or just be around and see what&#039;s happening live!&lt;br /&gt;
&lt;br /&gt;
=How Can you help ?=&lt;br /&gt;
&lt;br /&gt;
First and foremost, for many (but not all) types of contributions you may want to set up a local instance.  To learn how to do this, see the [[HackingHowto]] page.  (If you&#039;re not familiar with command line level things, there are still ways you can help below!)&lt;br /&gt;
&lt;br /&gt;
== File Bugs / Triage Bugs ==&lt;br /&gt;
&lt;br /&gt;
Issue reports are critical for all projects.  Identified bugs give developers a basis for beginning work, and providing an idea of what features and issues are most important to users and the overall usability of the software.  If you identify errors, flaws, unexpected behaviors, or deficits that impede use, file a bug.&lt;br /&gt;
&lt;br /&gt;
* [[File Bugs]] -- notes on filing new bugs/issues/feature requests&lt;br /&gt;
* [[Feature Ideas]] -- notes on possible features&lt;br /&gt;
* [[Triage Bugs]] -- notes on triaging&lt;br /&gt;
* [[BugTriageDay]] -- every other Thursday is bug triage day where anyone can help out triaging bugs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Send Encouragement / Spread the Word ==&lt;br /&gt;
&lt;br /&gt;
Sometimes, a nice word, simple encouragement, and interest in the work we’re doing is enough to inspire a tizzy of productive work.  Just a bit more interest and encouragement can even make the difference between a complete feature and limited functionality; between a completed milestone and lost momentum.&lt;br /&gt;
&lt;br /&gt;
Similarly, MediaGoblin, and the movement for free network services, is always in need of encouragement.  Use free network services, understand the principals behind the movement, be able to articulate the benefits of free network services and the problems with psudo-free applications that don’t respect the users’ freedom.&lt;br /&gt;
&lt;br /&gt;
Write a blog post, post a status update, drop by the listserv or join #mediagoblin on freenode.net and let us know.  See [http://mediagoblin.org/join/ our join page] for links.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Write Documentation / Edit Documentation ==&lt;br /&gt;
&lt;br /&gt;
* [[Documentation quick start]] - How to contribute to the documentation effort.&lt;br /&gt;
* [[ManualStandards]] - covers the standards for writing the user manual (forthcoming.) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Test MediaGoblin ==&lt;br /&gt;
&lt;br /&gt;
Do you have access to the web? Do you like sharing your opinions? If so, we need your help to test MediaGoblin! Testers play around with the current test instance, note what operating system and browser they use (notes on multiple set-ups are also helpful) and take some notes. That&#039;s it! It&#039;s a very important task that doesn&#039;t require any special knowledge and you&#039;re done in under an hour. Ready to help?  &lt;br /&gt;
&lt;br /&gt;
* [[User Experience]] - user experience testing.  Includes link to an instance you can try!&lt;br /&gt;
* [[UnitTests|Unit Tests]] - all about the unit tests&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Translate MediaGoblin ==&lt;br /&gt;
&lt;br /&gt;
If you know English and another language and feel comfortable translating elements of the interface or even the documentation, we’d love to have help translating the software and resources.&lt;br /&gt;
Translating MediaGoblin is very easy with a web interface, so there is no programming knowledge required at all.&lt;br /&gt;
&lt;br /&gt;
* [[Translations]] - How to translate stuff or update the translations&lt;br /&gt;
&lt;br /&gt;
== Become a User ==&lt;br /&gt;
&lt;br /&gt;
Coming soon!&lt;br /&gt;
&lt;br /&gt;
We’re building MediaGoblin for us and for you but really you’re one of us and I am you and we are we and MediaGoblin is the walrus.&lt;br /&gt;
&lt;br /&gt;
We&#039;re planning to launch our own public instance of MediaGoblin in the near future--probably in the September/October 2011 time frame.  When we do, sign up for an account, use the service and relish in the thought that this service comes with a heaping side of Freedom and you can salt and pepper it to your liking.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Help Others ==&lt;br /&gt;
&lt;br /&gt;
Have you spent time with MediaGoblin?  If so, your experience and wisdom are invaluable and you’re the best person we can think of to help other users with their questions.&lt;br /&gt;
&lt;br /&gt;
Hang out on the IRC channel and help answer new peoples&#039; questions.  See [http://mediagoblin.org/join/ our join page] for links.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Run your own MediaGoblin Instance ==&lt;br /&gt;
&lt;br /&gt;
Are there things about our instance you want to change?  Are there things about other instances you wish were different?  Want to test upcoming changes?  Want to create patches to implement things you need?  That’s great—you can run your own instance!&lt;br /&gt;
&lt;br /&gt;
The primary documentation for this is at [http://docs.mediagoblin.org http://docs.mediagoblin.org] but here are some additional tips:&lt;br /&gt;
&lt;br /&gt;
* [[Configure_MediaGoblin|Configuration]] - Learn about MediaGoblin configuration files and file options.&lt;br /&gt;
* [[Deployment]] - General deployment advice&lt;br /&gt;
* [[Scaling Down]] - Minimizing MediaGoblin&#039;s resource requirements&lt;br /&gt;
* [[Virtual Machine Hosting]] - Deploy your own publicly available MediaGoblin server using [http://aws.amazon.com/free/?utm_source=adwords&amp;amp;utm_medium=cpc&amp;amp;utm_campaign=CPC_Google_AWS_ec2&amp;amp;utm_content=TextV01_PP_V01_EC2&amp;amp;trk=CPC_Google_AWS_ec2 Amazon&#039;s free EC2 tier].&lt;br /&gt;
&lt;br /&gt;
= Technical project documentation =&lt;br /&gt;
&lt;br /&gt;
The technical docs, that are more finished and the ones that are better maintained near the code (so they stay up to date) are in the more technical chapters of the [http://docs.mediagoblin.org/ main documentation].&lt;br /&gt;
* [[Storage]] - How MediaGoblin&#039;s internal storage system works.&lt;br /&gt;
* [[Processing]] - What happens after you submit your image/video/etc?  Processing!  More about that.&lt;br /&gt;
* [https://gitorious.org/mediagoblin/mediagoblin/blobs/master/extlib/README External Library Policy] - covers use of external libraries&lt;br /&gt;
* [[User:Cwebber/braindumps]] - Chris Webber&#039;s braindumps (you can help refactoring these into real sections of the site!)&lt;br /&gt;
* [[Multiple media support]] - Design plan for multiple media support&lt;br /&gt;
&lt;br /&gt;
== Write Code / Fix Code ==&lt;br /&gt;
&lt;br /&gt;
== Create a Theme ==&lt;br /&gt;
&lt;br /&gt;
Coming soon!&lt;br /&gt;
&lt;br /&gt;
MedaGoblin development is premised on the idea that the entire interface for the platform be completely theme-able.  If you have a design or theming background, consider developing themes for MediaGoblin.  New themes help test the theming system, provide attractive and appealing interfaces for prospective users.  If you want to start a new theme but don’t know where to start, touch base with the development community on the list or in the IRC channel for more information.&lt;br /&gt;
&lt;br /&gt;
If you are a coder and you would like to write code, the repository is hosted on gitorious. Clone or fork the repository and start poking around. Become familiar with this manual for an overview of how the software works and is used. Consider the contributor wiki for more information about the project, our preferred methods, and guides for developing MediaGoblin. We even have tips on becoming a coder and we’re willing to help!&lt;br /&gt;
&lt;br /&gt;
* [[HackingHowto|Hacking]] - notes on making and sending in code contributions&lt;br /&gt;
** [[BeginnersCorner|Beginner&#039;s Corner]] - resources for those who are new to Python or Git.&lt;br /&gt;
** &#039;&#039;Started from an older version of the Hacking Howto?  We switched from buildout-&amp;gt;virtualenv, so look at [[Moving from buildout to virtualenv]] for information on how to move over.&#039;&#039;&lt;br /&gt;
* [[Git workflow]] - How to go about submitting patches via git.&lt;br /&gt;
* [[Templating]] - How our templating structure is set up&lt;br /&gt;
* [[Code overview]] - Overview of the structure of the codebase&lt;br /&gt;
&lt;br /&gt;
== Write a plugin ==&lt;br /&gt;
&lt;br /&gt;
If you start, you&#039;ll find some basic documentation [http://docs.mediagoblin.org/#part-4-developer-s-zone| in the docs site]&lt;br /&gt;
&lt;br /&gt;
You&#039;ve made a plugin ? List it here : &lt;br /&gt;
&lt;br /&gt;
[[Available_Plugins|Available plugins]]&lt;br /&gt;
&lt;br /&gt;
You&#039;ve written a pluggin ? You got some tips to share ? A tutorial idea ? Please do :&lt;br /&gt;
 &lt;br /&gt;
[[PluginsTips|Plugins Tips]]&lt;br /&gt;
&lt;br /&gt;
= Misc =&lt;br /&gt;
&lt;br /&gt;
== Android client ==&lt;br /&gt;
&lt;br /&gt;
See [[Android Client]]&lt;br /&gt;
&lt;br /&gt;
= Inner workings of the secret sanctum =&lt;br /&gt;
&lt;br /&gt;
* [[IRCBot]] - covers our irc bot&lt;br /&gt;
* [[ReleaseProcess|Release Process]] - covers the release process&lt;br /&gt;
* [[Update the website]] - Learn how to update mediagoblin.org!&lt;/div&gt;</summary>
		<author><name>Elrond</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=Android_Client&amp;diff=1178</id>
		<title>Android Client</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=Android_Client&amp;diff=1178"/>
		<updated>2013-03-08T11:21:05Z</updated>

		<summary type="html">&lt;p&gt;Elrond: dummy, so xpd259 can fill it with content&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== The Android Client ==&lt;/div&gt;</summary>
		<author><name>Elrond</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=Triage_Bugs&amp;diff=1130</id>
		<title>Triage Bugs</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=Triage_Bugs&amp;diff=1130"/>
		<updated>2013-02-19T12:03:53Z</updated>

		<summary type="html">&lt;p&gt;Elrond: Add small summary of most used keywords in the tracker.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The triage process involves reviewing bugs, removing duplicates, validating that the issues described are reproducible, ensuring that the exact behavior is properly documented, diagnosing the cause of each issue, and working with developers to ensure that critical bugs get addressed. In many cases, developers do this kind of work as a matter of course, but one need not be able to code in order to help working with bugs.&lt;br /&gt;
&lt;br /&gt;
To triage bugs, go to the bug tracker and begin reviewing the open issues. If you are able, attempt to:&lt;br /&gt;
&lt;br /&gt;
* ensure that one or two people in addition to the initial reporter have been able to reproduce the issue.&lt;br /&gt;
* document the issue more clearly. If you had any trouble reproducing the issue, provide any elucidating information that you can to help others solve the problem more effectively.&lt;br /&gt;
* find a way to resolve the problem or provide a workaround.&lt;br /&gt;
&lt;br /&gt;
For help, instructions, and suggestions be in touch with the development community on the list or in the IRC channel for more information. With many eyes, all bugs are shallow.&lt;br /&gt;
&lt;br /&gt;
=== Bug keywords ===&lt;br /&gt;
* &amp;quot;bitesized&amp;quot; for bugs that should be easy to fix, even for beginners.&lt;br /&gt;
* &amp;quot;review&amp;quot; for bugs, that have a patch (branch!) associated and someone should look at that branch and likely merge it into master&lt;br /&gt;
* &amp;quot;sql&amp;quot; for things relating to our sql data model.&lt;/div&gt;</summary>
		<author><name>Elrond</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=Main_Page&amp;diff=1129</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=Main_Page&amp;diff=1129"/>
		<updated>2013-02-18T14:56:23Z</updated>

		<summary type="html">&lt;p&gt;Elrond: Reverted edits by Instagramfollwersrandom-10-100 (talk) to last revision by Techiedavid&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Want to Join the MediaGoblin Community? =&lt;br /&gt;
&lt;br /&gt;
We’re really glad that you want to join the MediaGoblin community!&lt;br /&gt;
&lt;br /&gt;
There are a variety of ways to help and support MediaGoblin and to join the team.  If you want to code, great, if not, even better!  MediaGoblin interested contributors in many different roles: users, system administrators, technical writers, testers, evangelists, UI/UX and graphics designers, cheerleaders, and dreamers.&lt;br /&gt;
&lt;br /&gt;
This wiki covers a variety of ways that you can get involved with MediaGoblin as well as instructions on how to get started.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hang out with the MediaGoblin folk ==&lt;br /&gt;
&lt;br /&gt;
MediaGoblin has a mailing list and an IRC channel where we hang out.  See [http://mediagoblin.org/pages/join.html our join page] for links.&lt;br /&gt;
&lt;br /&gt;
Please drop by and say “Hi!”  And, if you’re looking for something to do, just ask---there’s always work to be done.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Take Part in the Monthly Meetings ==&lt;br /&gt;
&lt;br /&gt;
Each month is a [[Meeting]]. You can take part and help decide on the future of MediaGoblin. Or just be around and see what&#039;s happening live!&lt;br /&gt;
&lt;br /&gt;
=How Can you help ?=&lt;br /&gt;
&lt;br /&gt;
== File Bugs / Triage Bugs ==&lt;br /&gt;
&lt;br /&gt;
Issue reports are critical for all projects.  Identified bugs give developers a basis for beginning work, and providing an idea of what features and issues are most important to users and the overall usability of the software.  If you identify errors, flaws, unexpected behaviors, or deficits that impede use, file a bug.&lt;br /&gt;
&lt;br /&gt;
* [[File Bugs]] -- notes on filing new bugs/issues/feature requests&lt;br /&gt;
* [[Feature Ideas]] -- notes on possible features&lt;br /&gt;
* [[Triage Bugs]] -- notes on triaging&lt;br /&gt;
* [[BugTriageDay]] -- every other Thursday is bug triage day where anyone can help out triaging bugs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Send Encouragement / Spread the Word ==&lt;br /&gt;
&lt;br /&gt;
Sometimes, a nice word, simple encouragement, and interest in the work we’re doing is enough to inspire a tizzy of productive work.  Just a bit more interest and encouragement can even make the difference between a complete feature and limited functionality; between a completed milestone and lost momentum.&lt;br /&gt;
&lt;br /&gt;
Similarly, MediaGoblin, and the movement for free network services, is always in need of encouragement.  Use free network services, understand the principals behind the movement, be able to articulate the benefits of free network services and the problems with psudo-free applications that don’t respect the users’ freedom.&lt;br /&gt;
&lt;br /&gt;
Write a blog post, post a status update, drop by the listserv or join #mediagoblin on freenode.net and let us know.  See [http://mediagoblin.org/join/ our join page] for links.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Write Documentation / Edit Documentation ==&lt;br /&gt;
&lt;br /&gt;
* [[Documentation quick start]] - How to contribute to the documentation effort.&lt;br /&gt;
* [[ManualStandards]] - covers the standards for writing the user manual (forthcoming.) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Test MediaGoblin ==&lt;br /&gt;
&lt;br /&gt;
Do you have access to the web? Do you like sharing your opinions? If so, we need your help to test MediaGoblin! Testers play around with the current test instance, note what operating system and browser they use (notes on multiple set-ups are also helpful) and take some notes. That&#039;s it! It&#039;s a very important task that doesn&#039;t require any special knowledge and you&#039;re done in under an hour. Ready to help?  &lt;br /&gt;
&lt;br /&gt;
* [[User Experience]] - user experience testing.  Includes link to an instance you can try!&lt;br /&gt;
* [[UnitTests|Unit Tests]] - all about the unit tests&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Translate MediaGoblin ==&lt;br /&gt;
&lt;br /&gt;
If you know English and another language and feel comfortable translating elements of the interface or even the documentation, we’d love to have help translating the software and resources.&lt;br /&gt;
Translating MediaGoblin is very easy with a web interface, so there is no programming knowledge required at all.&lt;br /&gt;
&lt;br /&gt;
* [[Translations]] - How to translate stuff or update the translations&lt;br /&gt;
&lt;br /&gt;
== Become a User ==&lt;br /&gt;
&lt;br /&gt;
Coming soon!&lt;br /&gt;
&lt;br /&gt;
We’re building MediaGoblin for us and for you but really you’re one of us and I am you and we are we and MediaGoblin is the walrus.&lt;br /&gt;
&lt;br /&gt;
We&#039;re planning to launch our own public instance of MediaGoblin in the near future--probably in the September/October 2011 time frame.  When we do, sign up for an account, use the service and relish in the thought that this service comes with a heaping side of Freedom and you can salt and pepper it to your liking.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Help Others ==&lt;br /&gt;
&lt;br /&gt;
Have you spent time with MediaGoblin?  If so, your experience and wisdom are invaluable and you’re the best person we can think of to help other users with their questions.&lt;br /&gt;
&lt;br /&gt;
Hang out on the IRC channel and help answer new peoples&#039; questions.  See [http://mediagoblin.org/join/ our join page] for links.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Run your own MediaGoblin Instance ==&lt;br /&gt;
&lt;br /&gt;
Are there things about our instance you want to change?  Are there things about other instances you wish were different?  Want to test upcoming changes?  Want to create patches to implement things you need?  That’s great—you can run your own instance!&lt;br /&gt;
&lt;br /&gt;
* [[Configure_MediaGoblin|Configuration]] - Learn about MediaGoblin configuration files and file options.&lt;br /&gt;
* [[Deployment]] - General deployment advice&lt;br /&gt;
* [[Scaling Down]] - Minimizing MediaGoblin&#039;s resource requirements&lt;br /&gt;
* [[Virtual Machine Hosting]] - Deploy your own publicly available MediaGoblin server using [http://aws.amazon.com/free/?utm_source=adwords&amp;amp;utm_medium=cpc&amp;amp;utm_campaign=CPC_Google_AWS_ec2&amp;amp;utm_content=TextV01_PP_V01_EC2&amp;amp;trk=CPC_Google_AWS_ec2 Amazon&#039;s free EC2 tier].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Technical project documentation =&lt;br /&gt;
&lt;br /&gt;
* [[DesignDecisions]] - covers design decisions (FIXME - this needs to be split up)&lt;br /&gt;
* [[Storage]] - How MediaGoblin&#039;s internal storage system works.&lt;br /&gt;
* [[Processing]] - What happens after you submit your image/video/etc?  Processing!  More about that.&lt;br /&gt;
* [https://gitorious.org/mediagoblin/mediagoblin/blobs/master/extlib/README External Library Policy] - covers use of external libraries&lt;br /&gt;
* [[User:Cwebber/braindumps]] - Chris Webber&#039;s braindumps (you can help refactoring these into real sections of the site!)&lt;br /&gt;
* [[Multiple media support]] - Design plan for multiple media support&lt;br /&gt;
&lt;br /&gt;
== Write Code / Fix Code ==&lt;br /&gt;
&lt;br /&gt;
== Create a Theme ==&lt;br /&gt;
&lt;br /&gt;
Coming soon!&lt;br /&gt;
&lt;br /&gt;
MedaGoblin development is premised on the idea that the entire interface for the platform be completely theme-able.  If you have a design or theming background, consider developing themes for MediaGoblin.  New themes help test the theming system, provide attractive and appealing interfaces for prospective users.  If you want to start a new theme but don’t know where to start, touch base with the development community on the list or in the IRC channel for more information.&lt;br /&gt;
&lt;br /&gt;
If you are a coder and you would like to write code, the repository is hosted on gitorious. Clone or fork the repository and start poking around. Become familiar with this manual for an overview of how the software works and is used. Consider the contributor wiki for more information about the project, our preferred methods, and guides for developing MediaGoblin. We even have tips on becoming a coder and we’re willing to help!&lt;br /&gt;
&lt;br /&gt;
* [[HackingHowto|Hacking]] - notes on making and sending in code contributions&lt;br /&gt;
** [[BeginnersCorner|Beginner&#039;s Corner]] - resources for those who are new to Python or Git.&lt;br /&gt;
** &#039;&#039;Started from an older version of the Hacking Howto?  We switched from buildout-&amp;gt;virtualenv, so look at [[Moving from buildout to virtualenv]] for information on how to move over.&#039;&#039;&lt;br /&gt;
* [[Git workflow]] - How to go about submitting patches via git.&lt;br /&gt;
* [[Templating]] - How our templating structure is set up&lt;br /&gt;
* [[Code overview]] - Overview of the structure of the codebase&lt;br /&gt;
&lt;br /&gt;
== Write a plugin ==&lt;br /&gt;
&lt;br /&gt;
If you start, you&#039;ll find some basic documentation [http://docs.mediagoblin.org/#part-4-developer-s-zone| in the docs site]&lt;br /&gt;
&lt;br /&gt;
You&#039;ve made a plugin ? List it here : &lt;br /&gt;
&lt;br /&gt;
[[Available_Plugins|Available plugins]]&lt;br /&gt;
&lt;br /&gt;
You&#039;ve written a pluggin ? You got some tips to share ? A tutorial idea ? Please do :&lt;br /&gt;
 &lt;br /&gt;
[[PluginsTips|Plugins Tips]]&lt;br /&gt;
&lt;br /&gt;
= Inner workings of the secret sanctum =&lt;br /&gt;
&lt;br /&gt;
* [[IRCBot]] - covers our irc bot&lt;br /&gt;
* [[ReleaseProcess|Release Process]] - covers the release process&lt;br /&gt;
* [[Update the website]] - Learn how to update mediagoblin.org!&lt;/div&gt;</summary>
		<author><name>Elrond</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=Meeting&amp;diff=1095</id>
		<title>Meeting</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=Meeting&amp;diff=1095"/>
		<updated>2013-01-29T15:43:19Z</updated>

		<summary type="html">&lt;p&gt;Elrond: /* Next Meeting */ Place for Developer Docs? wiki spam?&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== MediaGoblin Monthly Meeting ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;When:&#039;&#039;&#039; 9:00 am Pacific Time first Saturday of the month. [http://www.timeanddate.com/worldclock/converter.html Convert time to your timezone].  Print current UTC time: &amp;lt;code&amp;gt;date -u +&amp;quot;It&#039;s %F %T UTC&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Where:&#039;&#039;&#039; IRC #mediagoblin on irc.freenode.net&lt;br /&gt;
&lt;br /&gt;
Always announced several days in advance on the [http://lists.mediagoblin.org/pipermail/devel/ mailing list] as is date adjustments, agenda discussion and other meeting preparation.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Purpose:&#039;&#039;&#039; The idea is to discuss the past month, what happened, what was good, what should be done better. And to create roadmap for the upcoming month and assign tasks to people willing to handle them.&lt;br /&gt;
&lt;br /&gt;
Typical Agenda topics:&lt;br /&gt;
&lt;br /&gt;
* What happened in the last month, what was good, what could be better next time?&lt;br /&gt;
* What should be done next month?&lt;br /&gt;
&lt;br /&gt;
Meetings are logged. [http://mediagoblin.org/irclogs/ Logs for past meetings.]&lt;br /&gt;
&lt;br /&gt;
== Next Meeting ==&lt;br /&gt;
&lt;br /&gt;
* Where to put Developer docs?&lt;br /&gt;
*: Our Documentation for developers is currently a bit split. Some are on the wiki, some in the main docs. There are pros and cons for both. We should consider where to put things. One place? Which? Or decide on an individual basis?&lt;br /&gt;
*: Good about main docs: Easy to integrate source code doc strings. That way internal api docs can be kept mostly up to date.&lt;br /&gt;
*: Good about wiki: Doesn&#039;t feel so &amp;quot;set in stone&amp;quot;.&lt;br /&gt;
* wiki spam: Do we want to change something?&lt;br /&gt;
* [http://lists.mediagoblin.org/pipermail/devel/2012-November/000307.html Designing features!]&lt;br /&gt;
&lt;br /&gt;
== Past Meetings ==&lt;br /&gt;
&lt;br /&gt;
=== October 13th, 2012, 9:00 am Pacific Time (2012-10-13 16:00 UTC) ===&lt;br /&gt;
&lt;br /&gt;
* 0.3.2 release&lt;br /&gt;
** What existing features need to be wrapped up?&lt;br /&gt;
*** Werkzeug switch&lt;br /&gt;
** What time might we do the release?&lt;br /&gt;
* Fundraising campaign&lt;br /&gt;
** Keeping things going mid-campaign&lt;br /&gt;
** You have questions?  I have answers, kinda :)&lt;br /&gt;
* Getting new contributors involved&lt;br /&gt;
* Plugins?  New features?&lt;br /&gt;
&lt;br /&gt;
==== Etherpad ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
AGENDA&lt;br /&gt;
&lt;br /&gt;
     0.3.2 release &lt;br /&gt;
&lt;br /&gt;
     What existing features need to be wrapped up? &lt;br /&gt;
&lt;br /&gt;
     Werkzeug switch &lt;br /&gt;
&lt;br /&gt;
     What time might we do the release? &lt;br /&gt;
&lt;br /&gt;
    Congrats to Deb from the mediagoblin team! Congrats de Deb!&lt;br /&gt;
&lt;br /&gt;
     Fundraising campaign &lt;br /&gt;
&lt;br /&gt;
     Keeping things going mid-campaign &lt;br /&gt;
&lt;br /&gt;
     You have questions?  I have answers, kinda :) &lt;br /&gt;
&lt;br /&gt;
     Getting new contributors involved &lt;br /&gt;
&lt;br /&gt;
     Plugins?  New features? &lt;br /&gt;
&lt;br /&gt;
-- http://wiki.mediagoblin.org/Meeting#Next_Meeting&lt;br /&gt;
Fundraising stuff&lt;br /&gt;
Things are going great mostly when people check it out!&lt;br /&gt;
But how to spread the word?&lt;br /&gt;
&lt;br /&gt;
    should contact more podcasts, etc&lt;br /&gt;
&lt;br /&gt;
    currently working with FSF on this&lt;br /&gt;
&lt;br /&gt;
    need community to spread the word!&lt;br /&gt;
&lt;br /&gt;
    List of places already spreaded list and contacted&lt;br /&gt;
&lt;br /&gt;
VideoThumbnailerMarkII&lt;br /&gt;
New video thumbnailer, rewritten to try to eliminate a bug in the old one where processing would stall.&lt;br /&gt;
New bugs introduce (of course ;)&lt;br /&gt;
Collections&lt;br /&gt;
Merged - Thanks aaronw!&lt;br /&gt;
WebOb =&amp;gt; Werkzeug switch&lt;br /&gt;
Made some things break. Need help with testing + bugfixes&lt;br /&gt;
borked stuffs:&lt;br /&gt;
&lt;br /&gt;
    Accessing paths without trailing slashes, e.g. /submit (instead of /submit/)&lt;br /&gt;
&lt;br /&gt;
    Still a lot of legacy WebOb responses (such as webob.exc.HTTPFound() HTTPForbidden() left)&lt;br /&gt;
&lt;br /&gt;
API&lt;br /&gt;
Delivered to mrn.is, tryggvib will test it and get back with feedback.&lt;br /&gt;
Working, still a lot of room for improvements.&lt;br /&gt;
Mostly done, usable, still room for improvements. Example applications:&lt;br /&gt;
&lt;br /&gt;
    https://github.com/jwandborg/automgtic&lt;br /&gt;
&lt;br /&gt;
    https://github.com/jwandborg/omgmg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== September 1st, 2012, 9:00 am Pacific Time (2012-09-01 16:00 UTC) ===&lt;br /&gt;
&lt;br /&gt;
[http://mediagoblin.org/irclogs/irc_meeting_2012-09-01.txt IRC log]&lt;br /&gt;
&lt;br /&gt;
* FIXME - can someone type in summary here?&lt;br /&gt;
&lt;br /&gt;
=== August 4th, 2012, 9:00 am Pacific Time (2012-08-04 16:00 UTC) ===&lt;br /&gt;
&lt;br /&gt;
[http://mediagoblin.org/irclogs/irc_meeting_2012-08-04.txt IRC log]&lt;br /&gt;
&lt;br /&gt;
* Release schedule&lt;br /&gt;
* Plugins and themes! Who&#039;s working on one? What problems are you having? -- Please write up issues for problems so they can get fixed!&lt;br /&gt;
* Should we namespace plugins? If so, how should we namespace plugins?&lt;br /&gt;
** Python 3.3 will have support for namespace plugins. [http://www.python.org/dev/peps/pep-0420/#namespace-packages-today]&lt;br /&gt;
** In Python &amp;gt;=2.3, &amp;lt;3.3 it&#039;s a hack [http://www.python.org/dev/peps/pep-0402/#the-problem][http://www.python.org/dev/peps/pep-0420/#namespace-packages-today]&lt;br /&gt;
** Flask has a workaround[https://github.com/mitsuhiko/flask/blob/master/flask/ext/__init__.py]&lt;br /&gt;
&lt;br /&gt;
=== July 7th, 2012, 9:00 am Pacific Time (2012-07-07 16:00 UTC) ===&lt;br /&gt;
&lt;br /&gt;
[http://mediagoblin.org/irclogs/irc_meeting_2012-07-07.txt IRC log]&lt;br /&gt;
&lt;br /&gt;
Announcements:&lt;br /&gt;
&lt;br /&gt;
* Anyone who wants to edit the wiki needs to be in the goblin army group. Ask Will or Chris to get added.&lt;br /&gt;
* Plugin infrastructure landed. If you&#039;re interested in writing plugins, talk to Will. Some documentation at http://docs.mediagoblin.org/#part-2-plugin-writer-s-guide&lt;br /&gt;
&lt;br /&gt;
Agenda:&lt;br /&gt;
&lt;br /&gt;
* Keyboard shortcuts ([http://issues.mediagoblin.org/ticket/346 #346])&lt;br /&gt;
* Ticket triaging?&lt;br /&gt;
* Base plugin stuff!&lt;br /&gt;
* Theming&lt;br /&gt;
* Conference: OSCON&lt;br /&gt;
* Chris Webber&#039;s new &amp;quot;office hours&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== June 2nd, 2012, 9:00 am Pacific Time ===&lt;br /&gt;
&lt;br /&gt;
[http://mediagoblin.org/irclogs/irc_meeting_2012-06-02.txt IRC log]&lt;br /&gt;
&lt;br /&gt;
* docs changes&lt;br /&gt;
** Will split the docs/ guide into a Site Administrator&#039;s Guide and a Plugin Writer&#039;s Guide&lt;br /&gt;
** Has anyone looked at the Plugin Writer&#039;s Guide, yet?&lt;br /&gt;
** Will wants to add a &amp;quot;Contributor&#039;s Guide&amp;quot; to docs/ which he&#039;d update from the wiki before every release&lt;br /&gt;
* Is there a way to improve our unit tests and motivation to write them?&lt;br /&gt;
** Simulating a browser by the way of [http://phantomjs.org/ PhantomJS], [http://seleniumhq.org/ Selenium] instead of having code simulating other code against itself might be more natural to write and even more testing the actual application. I have a good feeling about this, please prove me wrong if I&#039;d be. --[[User:Joar|Joar]] 08:53, 28 May 2012 (EDT)&lt;br /&gt;
* Administrative panel/tools and user uploads panel&lt;br /&gt;
* Git and tickets &lt;br /&gt;
* Plugins&lt;br /&gt;
** What&#039;s the state of things?&lt;br /&gt;
** Documentation&lt;br /&gt;
** What plugins might we want to build for this upcoming release?&lt;br /&gt;
** What things do we currently have that we might want to pluginify?&lt;br /&gt;
* State of kuneco/federation mini-update (Chris)&lt;br /&gt;
&lt;br /&gt;
=== May 5th, 2012, 9:00 am Pacific Time ===&lt;br /&gt;
&lt;br /&gt;
[http://mediagoblin.org/irclogs/irc_meeting_2012-05-05.txt IRC log]&lt;br /&gt;
&lt;br /&gt;
* Post-release reflections&lt;br /&gt;
** Woohoo, release!&lt;br /&gt;
** How did this release process go?&lt;br /&gt;
*** We should talk about that conference.&lt;br /&gt;
** What&#039;s left to clean up?&lt;br /&gt;
*** Mongokit-&amp;gt;SQL &amp;quot;style&amp;quot; query conversion?&lt;br /&gt;
*** Other cruft code?&lt;br /&gt;
* What are our next goals?&lt;br /&gt;
** Plugins&lt;br /&gt;
** Federation&lt;br /&gt;
** Favoriting&lt;br /&gt;
*** Take that, Pinterest! ;)&lt;br /&gt;
** Galleries&lt;br /&gt;
** Theming&lt;br /&gt;
*** Using sass would be neat&lt;br /&gt;
** Access restrictions&lt;br /&gt;
*** User management, or having a &amp;quot;secret url&amp;quot; that is not in the photo index that you can share with friends and generate as needed for any media type&lt;br /&gt;
** What about traffic? Some of us will host GMG on limited plans.&lt;br /&gt;
** Some kind of coding guidelines? Do we have a philosophy like &amp;quot;Keep it Simple, Stupid&amp;quot;&lt;br /&gt;
*** This concerns things like: Should plugins land in core eventually, do we want to support ALL THE MEDIA TYPES, ...&lt;br /&gt;
** Podcasting support?&lt;br /&gt;
** Things that have been hanging???&lt;br /&gt;
** Bugtrackers and milestone?&lt;br /&gt;
** More??? We should organize things!&lt;br /&gt;
* jancborchardt and his team of UX wizard-students&lt;br /&gt;
* Website redesign&lt;br /&gt;
* OpenShift?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== April 7th, 2012, 4:00 pm UTC ===&lt;br /&gt;
&lt;br /&gt;
[http://mediagoblin.org/irclogs/irc_meeting_2012-04-07.txt IRC log]&lt;br /&gt;
&lt;br /&gt;
* Post-SQL stuff&lt;br /&gt;
* Pending 0.0.3 release!&lt;br /&gt;
* Are there stray patches/branches to be merged?&lt;br /&gt;
* Our glorious upcoming plugin future! (Update from Will)&lt;br /&gt;
&lt;br /&gt;
=== March 3rd, 2012, 9:00 am Pacific Time ===&lt;br /&gt;
&lt;br /&gt;
[http://mediagoblin.org/irclogs/irc_meeting_2012-03-03.txt IRC log]&lt;br /&gt;
&lt;br /&gt;
* [[GSOC 2012]]&lt;br /&gt;
* State of the SQL transition (preview: it&#039;s super close, but we need help!)&lt;br /&gt;
* Plugin discussion (Will can&#039;t make this, but we should talk about use cases)&lt;br /&gt;
* MediaGoblin at upcoming conferences&lt;br /&gt;
* PageKite accounts&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 2012-02 (held on 2012-02-04) ===&lt;br /&gt;
&lt;br /&gt;
[http://mediagoblin.org/irclogs/irc_meeting_2012-02-04.txt IRC log]&lt;br /&gt;
&lt;br /&gt;
* Code style guide?  See also: http://issues.mediagoblin.org/ticket/197&lt;br /&gt;
* Kuneco/federation&lt;br /&gt;
* API&lt;br /&gt;
* More testing discussion?&lt;br /&gt;
* Theming?&lt;br /&gt;
* Preliminary plugin discussion&lt;br /&gt;
* Status update from the &amp;quot;SQL Team&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Some of the decisions:&lt;br /&gt;
&lt;br /&gt;
* file an issue about proper &amp;amp;lt;audio&amp;amp;gt; support.&lt;br /&gt;
* some TODOs recorded&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 2011-12 (held on 2011-12-03) ===&lt;br /&gt;
&lt;br /&gt;
[http://mediagoblin.org/irclogs/irc_meeting_2011-12-03.txt IRC log]&lt;br /&gt;
&lt;br /&gt;
* We plan to create a plugin system.  Do we want to create that soon or push it off until things settle a bit more?  ([[User:Willkg|Willkg]] 08:54, 10 November 2011 (EST))&lt;br /&gt;
* [[Feature Ideas]]: What should we do about the wiki page? Keep it and have it as a monthly topic for &amp;quot;what next&amp;quot;? Convert everything to long waiting bugs?&lt;br /&gt;
* Possibility of an [[SQL Database Backend]]?&lt;br /&gt;
*: &#039;executive summary&#039; (well, you should read the long docs): &amp;quot;We could move to sql. It&#039;s probably replacing one type of pain by another type of pain, but those are somewhat comparable. Leaving the main question: Do we want to occupy our main devs for some long time with this task and loose momentum?&amp;quot;&lt;br /&gt;
* Schendje&#039;s [http://wiki.mediagoblin.org/Feature_Ideas/Activities activities proposal]&lt;br /&gt;
* &amp;quot;Coming up next&amp;quot; blogpost draft by Deb Nicholson&lt;br /&gt;
* Jef&#039;s requests:&lt;br /&gt;
** Ticket #466 &amp;quot;Use of &amp;quot;Submit&amp;quot; in site copy is sterile and not as friendly and welcoming as it could be&amp;quot;. I&#039;d really like to change this soon to something more suitable. How can we improve the wording here? Some alternatives have been mentioned in the bug report, but which one should we pick? Link: http://bugs.foocorp.net/issues/466&lt;br /&gt;
** The concept and naming of &amp;quot;favourites&amp;quot;. We&#039;ll (hopefully) be able to &amp;quot;favourite&amp;quot; media soon, which I *think* means that 1) it&#039;ll work like a &amp;quot;I like this&amp;quot; comment, a quick token of appreciation, 2) it&#039;ll be added to your list of favourites so you can save and promote it, and 3) we could maybe use the number of favourites as a ranking. What I&#039;d like to know is: is that the intended purpose? If so, should we name them favo(u)rites or something else? &amp;quot;Like&amp;quot;, &amp;quot;love&amp;quot;, &amp;quot;save&amp;quot;, &amp;quot;appreciate&amp;quot;, &amp;quot;heart&amp;quot;, &amp;quot;high five&amp;quot; and many more could all be contenders. And the name should be consistent with the action and purpose, of course. So I&#039;d like to clear up how and why we will use favourites and what we should call them.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 2011-11 (held on 2011-11-05) ===&lt;br /&gt;
&lt;br /&gt;
[http://mediagoblin.org/irclogs/irc_meeting_2011-11-05.txt IRC log]&lt;br /&gt;
&lt;br /&gt;
* What happened in the last month, what was good, what could be better next time?&lt;br /&gt;
** Release:&lt;br /&gt;
*** Good: 0.1.0 released!&lt;br /&gt;
*** Bad: postponing vs not postponing&lt;br /&gt;
** Sites and deployment documentation:&lt;br /&gt;
*** Good: new mediagoblin.org&lt;br /&gt;
*** Good: deployment documentation&lt;br /&gt;
*** Bad: py-bcrypt’s site was down just after the release, so the virtualenv deployment didn’t work, and it wasn’t clear how to fix it.&lt;br /&gt;
** Live instances:&lt;br /&gt;
*** Joar has a live instance!&lt;br /&gt;
*** But what does it mean? Should ordinary users start using it?&lt;br /&gt;
**** Details at [[User:Joar/mg.wandborg.se]] -- [[User:Joar|Joar]] 17:01, 6 November 2011 (EST)&lt;br /&gt;
*** nyergler added a note about &amp;quot;heartbeat&amp;quot;/status to API notes&lt;br /&gt;
* What should be done next month?&lt;br /&gt;
* Starting real work on federation (via OStatus)... and do we split any of this work out into its own library?&lt;br /&gt;
* An API&lt;br /&gt;
* Creative Commons licensing tools&lt;br /&gt;
* Merging in the multimedia/video branch&lt;br /&gt;
*: (this is *very close* already actually thanks to the hard work of Joar Wandborg!  But we need some help on the gstreamer front to fix a few issues... if you or someone you know is an expert in this area we could really use their help to make the videos that come out smoother!)&lt;br /&gt;
* Rollover items from 0.1.0&lt;br /&gt;
* Multiple file upload interface&lt;br /&gt;
* Drag and drop uploads interface (probably related!)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 2011-10 (held on 2011-10-01) ===&lt;br /&gt;
&lt;br /&gt;
[http://mediagoblin.org/irclogs/irc_meeting_2011-10-01.txt IRC log]&lt;br /&gt;
&lt;br /&gt;
This month&#039;s meeting was a quickly announced short meeting. The project is getting back on track and next month&#039;s meeting will be scheduled more properly. A bunch of people were around.&lt;br /&gt;
&lt;br /&gt;
The most important decisions:&lt;br /&gt;
* The project will keep monthly releases. They&#039;re the heartbeat of the project.&lt;br /&gt;
* Release 0.1.0 this sunday/monday.&lt;br /&gt;
* New website will hopefully be deployed in the next few days.&lt;br /&gt;
* And the following things are planned to happen during this month: Most importantly federation. The developers have decided to make up their minds on what federation aactually should mean for MediaGoblin. Concerning code, probably &amp;quot;activity streams&amp;quot; are the first goal. If there is no (good) python library for this, a new stand alone library may be created. If so, a name for it has to be found. It should have something about communication in it. And the other thing to happen during this month is an ongoing discussion about &amp;quot;bus factor&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 2011-09 (held on 2011-09-03) ===&lt;br /&gt;
&lt;br /&gt;
[http://mediagoblin.org/irclogs/irc_meeting_2011-09-03.txt IRC log]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 2011-08 (held on 2011-08-06) ===&lt;br /&gt;
&lt;br /&gt;
[http://mediagoblin.org/irclogs/irc_meeting_2011-08-06.txt IRC log]&lt;/div&gt;</summary>
		<author><name>Elrond</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=SQL_Database_Backend&amp;diff=604</id>
		<title>SQL Database Backend</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=SQL_Database_Backend&amp;diff=604"/>
		<updated>2012-03-18T21:01:48Z</updated>

		<summary type="html">&lt;p&gt;Elrond: Move switching section more up&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
MediaGoblin currently uses MongoDB as its database backend. There have been various reasons for this decision (see: [[Why MongoDB]], yes really, look at it. It has a lot of insight what are the problems with sql). Still, the idea of an SQL backend is coming up from time to time.&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
The existence of this wiki page does not give any evidence of the SQL backend getting developed soon!&lt;br /&gt;
&lt;br /&gt;
== People ==&lt;br /&gt;
Even an experimental implementation of an SQL backend, that will only support basic features will need a good amount of time/energy from some (core) developers. That time/energy will not be available to other projects.&lt;br /&gt;
* Some knowing sqlalchemy is needed.&lt;br /&gt;
* Someone having a good idea on the thin db layer is needed (Elrond will most likely be available for helping)&lt;br /&gt;
* Someone having an idea on the current queries used in the code is needed too.&lt;br /&gt;
&lt;br /&gt;
== Development models ==&lt;br /&gt;
* The biggest question is: Do we want to try an experimental sql backend? This is a tricky question. If it fails, it will be a lot of wasted time/energy. And contributors wouldn&#039;t be happy to have wasted their time/energy.&lt;br /&gt;
* The wasted time/energy could be limited by limiting the first target. For example one could dedide, that the sql backend is not intended to support the full feature set.&lt;br /&gt;
* Then there is the question on how to develop this:&lt;br /&gt;
*# Long term branch: Develop an SQL replacement in a long term branch. The good: Anything can be changed as needed. Not so good: Some people dislike long term branches for various reasons.&lt;br /&gt;
*# Trying to develop this alongside the current backend, in tree.&lt;br /&gt;
&lt;br /&gt;
== Major Issues ==&lt;br /&gt;
The current db model uses dicts to allow flexible storage for extensions and different media types. Representing these data in SQL is not simple. The dicts are normally keyed by a string and have arbitrary values. There are basically two ways:&lt;br /&gt;
&lt;br /&gt;
# Have a table with a key column (string) and a value column (string, json encoded). This will allow easy reconstruction of the dict for an object fetch and will allow queries on the key of the dict.&lt;br /&gt;
#: &#039;&#039;However&#039;&#039;, it will not allow queries on the values. For example the imaginary geolocation extension will store the lat/lon there and might want to search for other media &amp;quot;nearby&amp;quot;.&lt;br /&gt;
#: If the value column is split into three columns (i.e. &amp;lt;code&amp;gt;value_int value_string value_json&amp;lt;/code&amp;gt;), some queries, such as those on numbers, would be possible. .&lt;br /&gt;
#: &#039;&#039;&#039;Note:&#039;&#039;&#039; The table would actually look something like this: &amp;lt;code&amp;gt;create table super_data_table(media_id references media(id), plugin_id int, key, value_int, value_string);&amp;lt;/code&amp;gt; ... note that this design was predicted, determined by Chris Webber to be gross, and was aimed to be avoided, hence the choice of MongoDB.  See [[Why MongoDB]] for details.&lt;br /&gt;
# Actually structure the things into distinct tables. The above mentioned imaginary geolocation extension would have its own table with lat/lon fields and be able to perform efficient queries on it.&lt;br /&gt;
&lt;br /&gt;
== Pros and Cons ==&lt;br /&gt;
&lt;br /&gt;
=== MongoDB ===&lt;br /&gt;
&lt;br /&gt;
==== Pros ====&lt;br /&gt;
* Allows you to lazily flexibly store stuff like multiple media type information, plugin data, etc&lt;br /&gt;
* Supposedly scales up really well!&lt;br /&gt;
* Programming interface feels clean and pythonic.&lt;br /&gt;
* Migrations + flexible stuff might be a bit easier&lt;br /&gt;
* Shows a lot of promise&lt;br /&gt;
* Seems to be pretty fast if you have the right resources and carefully tuned your database&lt;br /&gt;
* We&#039;ve already built our tooling around it!&lt;br /&gt;
&lt;br /&gt;
==== Cons ====&lt;br /&gt;
&lt;br /&gt;
* Much, much more resource dependent on low and middle scale deployments than SQL would be&lt;br /&gt;
* Seems like you have to really tune your server around the database&lt;br /&gt;
* Have to think super carefully about indexes and (mostly) construct one index per common query.  (That&#039;s a bit misleading, but pretty close to the truth.)  Furthermore, one feels wary of creating more indexes because memory mapping means each index (and so each query) sucks up even more RAM. (At scale you also have to think about indexes for relational databases.) &lt;br /&gt;
* &amp;quot;On the fly&amp;quot; queries not so easy, could be much more expensive than &lt;br /&gt;
* No joins (normalized data on insertion to obviate the need for joins)&lt;br /&gt;
* How much do we really care about scaling up on the database layer anyway? (What&#039;s the expected write-load of media-goblin.) &lt;br /&gt;
** DeviantArt at Libre Graphics Meeting 2011 expressed that SQL + memcached works just fine for them and didn&#039;t think more complex things were necessary.  That&#039;s a huge install base, and it seems hard to believe that MediaGoblin sites will hit that scale level. (How big is/are their SQL box/en? With automatic-sharding, MognoDB might be able to give better write performance per-dollar than SQL solutions of the same size.)&lt;br /&gt;
** We&#039;re much more likely to run into media scaling issues before database scaling issues&lt;br /&gt;
** In an ideal federated world, scaling down might be more important than scaling up because everyone will be running their own servers&lt;br /&gt;
* In the end, flexibility doesn&#039;t seem to be worth much because you can&#039;t really do arbitrary queries on stuff you dump in if you want it to have any sort of speed whatsoever because of indexing considerations. (Good SQL schema design, and performance limitations of joins presents similar limitations.)&lt;br /&gt;
* Though promising looking and solutions to issues keep coming up fast and hitting the core software it&#039;s also very new and not as well established.&lt;br /&gt;
* It&#039;s not like migrations entirely disappeared, but they&#039;re probably easier with certain flexible things&lt;br /&gt;
* Every few weeks someone brings up an SQL backend ;)&lt;br /&gt;
&lt;br /&gt;
=== SQL(alchemy) ===&lt;br /&gt;
&lt;br /&gt;
==== Pros ====&lt;br /&gt;
&lt;br /&gt;
* Scales down and up pretty well (possibly not as high up as MongoDB but again if it&#039;s high enough for DeviantArt...) and scaling down really does matter in our case&lt;br /&gt;
* Developers are generally pretty used to it&lt;br /&gt;
* SQLAlchemy has a really strong and established codebase&lt;br /&gt;
* Arbitrary, unplanned queries!&lt;br /&gt;
* Flexible schemas still possible but in some different ways (but not as nicely directly and certainly in no way as loosely flexible)&lt;br /&gt;
* Extremely well established.&lt;br /&gt;
&lt;br /&gt;
==== Cons ====&lt;br /&gt;
&lt;br /&gt;
* Would mean a *lot* of rewriting!&lt;br /&gt;
* Would mean having to write a careful migration path from mongodb-&amp;gt;SQL!&lt;br /&gt;
* Not as directly flexible as MongoDB (though we can design cleverly for a certain type of flexibility)&lt;br /&gt;
* Migrations with certain types of database flexibility could break in really irritating for users (and people helping the users) ways&lt;br /&gt;
* Working on this move could slow down other work or be hard to coordinate in parallell with other development&lt;br /&gt;
* Probably does not scale up quite as high (again, it&#039;d have to be &amp;quot;much higher than deviantart&amp;quot;, which sounds like an unlikely problem we&#039;d like to have)&lt;br /&gt;
* Rewriting could possibly hurt our momentum in a serious way, especially if there&#039;s a feature freeze during the transition (and if there isn&#039;t, merging in master could become a real irritation)... even if we agree to do a rewrite, would we want to wait a while to do so? (Alternately, waiting to rewrite means the rewrite just gets harder.)&lt;br /&gt;
&lt;br /&gt;
== Statements by some developers ==&lt;br /&gt;
=== Chris Webber&#039;s weigh-in ===&lt;br /&gt;
&lt;br /&gt;
So I think several things about the whole possible move to SQL.&lt;br /&gt;
&lt;br /&gt;
First of all, after having written out the Pros &amp;amp; Cons of each, it&lt;br /&gt;
seems like maybe MongoDB is a lot of extra complexity and not gains in&lt;br /&gt;
the areas I expected it to be.  The supposed win wasn&#039;t scaling (and&lt;br /&gt;
as predicted, scaling down has been something we&#039;ve had to work around&lt;br /&gt;
carefully), it was flexibility.  Does MongoDB allow for extra&lt;br /&gt;
flexibility?  (And we *do* need flexibility for MediaGoblin&#039;s design.)&lt;br /&gt;
Yes in the sense that you can dump in whatever, but if you intend to&lt;br /&gt;
query on any of those attributes, it&#039;s mostly no.  Indexes are&lt;br /&gt;
expensive, and we have to spend a lot of time carefully pussyfooting&lt;br /&gt;
around them.&lt;br /&gt;
&lt;br /&gt;
While planning MediaGoblin, I knew that there were two patterns for&lt;br /&gt;
making things flexible in SQL... one of them is the table with &amp;quot;key,&lt;br /&gt;
value, type&amp;quot;.  I thought that was unacceptably gross, and still do&lt;br /&gt;
think so.&lt;br /&gt;
&lt;br /&gt;
The other option is that you have a &amp;quot;main&amp;quot; table (like MediaEntry), it&lt;br /&gt;
references what &amp;quot;type&amp;quot; it is (such as &amp;quot;video&amp;quot;, &amp;quot;image&amp;quot;, whatever), and&lt;br /&gt;
external tables for the extra information for that type point to the&lt;br /&gt;
MediaEntry via a foreignkey and provide whatever media type specific&lt;br /&gt;
data.  Similarly, use external tables for plugins.  The main reason I&lt;br /&gt;
didn&#039;t want to deal with this is because I imagined migrations&lt;br /&gt;
becoming a convoluted mess.  It wasn&#039;t that we *wouldn&#039;t need*&lt;br /&gt;
migrations in MongoDB, it&#039;s that maybe migrations would be less&lt;br /&gt;
nightmarish with extensible stuff involved.  In retrospect this was&lt;br /&gt;
pretty reactive to a number of frustrating times I&#039;ve had to try and&lt;br /&gt;
walk people through broken migrations.  But I&#039;m getting the sense that&lt;br /&gt;
I&#039;ll have to walk people through database complexity or breakage as&lt;br /&gt;
much or more in MongoDB, and the complexity of managing indexes for&lt;br /&gt;
any sort of extensibility is as bad or worse than dealing with&lt;br /&gt;
migrations with an extensible SQL setup.&lt;br /&gt;
&lt;br /&gt;
So, okay.  I think I just made a pretty compelling case for moving&lt;br /&gt;
back to SQL.  So what then?&lt;br /&gt;
&lt;br /&gt;
Two options have been proposed: try and support both SQL and MongoDB&lt;br /&gt;
at the same time, or create a branch that switches from MongoDB to&lt;br /&gt;
SQL.  I&#039;m afraid that the former just doesn&#039;t sound like a good idea&lt;br /&gt;
to me at all... it seems like it&#039;ll result in a system with a&lt;br /&gt;
massively bloated codebase, hard for new contributors to work with,&lt;br /&gt;
hard to maintain, and &amp;quot;worst of both worlds&amp;quot; types compromises.  Think&lt;br /&gt;
about this for a second: how do you map things like migrations,&lt;br /&gt;
indexing, etc over?  Do we really want to completely rewrite the&lt;br /&gt;
MongoDB query tools over to SQL?  Some people have said that &amp;quot;it looks&lt;br /&gt;
like we have a pretty simple use of MongoDB so this layer won&#039;t be so&lt;br /&gt;
complex.&amp;quot;  To me that sounds like classic hacker &amp;quot;well that can&#039;t be&lt;br /&gt;
so hard&amp;quot; underestimation of the complexity of the problem.  Anyway, I&lt;br /&gt;
already see a ton of complexities, and I&#039;m sure there are more I&lt;br /&gt;
haven&#039;t even been able to see.&lt;br /&gt;
&lt;br /&gt;
So the remaining option is to do a branch to switch from MongoDB -&amp;gt;&lt;br /&gt;
SQL.  There&#039;s some risk of this also... it&#039;s hard to maintain a big&lt;br /&gt;
overhaul branch while the mainline is constantly changing.  There&#039;s&lt;br /&gt;
also a risk of fracturing, and if we change our mind and stay with&lt;br /&gt;
MongoDB, there&#039;s even a risk of forking!  Not to mention that working&lt;br /&gt;
on a branch that&#039;s so huge that doesn&#039;t get pulled in is incredibly&lt;br /&gt;
demoralizing.&lt;br /&gt;
&lt;br /&gt;
But we can reduce all those risks if we can come to a *consensus* that&lt;br /&gt;
this is what we want to do.  So I propose at the next meeting we&lt;br /&gt;
discuss this and try to make sure we&#039;re at community consensus before&lt;br /&gt;
agreeing to move to SQL (if that&#039;s indeed what we intend to do) and if&lt;br /&gt;
we do so, move to SQL *entirely*.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s what I envision the path to that future will look like:&lt;br /&gt;
&lt;br /&gt;
* Create a branch that prototypes all the models being switched over to SQLAlchemy, included &amp;quot;multiple media types&amp;quot; implemented with a friendly API.&lt;br /&gt;
* Assuming that works nice, continue work in that branch to switch all code over to using SQL.&lt;br /&gt;
* Figure out how to do migrations nicely in SQL, including with multiple media types (I have some thoughts on how to do this &amp;quot;nicely&amp;quot;)&lt;br /&gt;
* Create a MongoDB-&amp;gt;SQL migration tool&lt;br /&gt;
&lt;br /&gt;
Anyway, let&#039;s discuss this at next meeting!&lt;br /&gt;
&lt;br /&gt;
=== Elrond&#039;s comments ===&lt;br /&gt;
I&#039;m quite with Chris Webber here.&lt;br /&gt;
&lt;br /&gt;
One thing, I have to add/where I&#039;m thinking a bit different: We should try to identify tasks in the sql-migration that can be done just &amp;quot;now&amp;quot;. What does that mean? Moving to sql(alchemy) means a lot of changes. And some of these changes can be done with the mongodb backend as well. For example we&#039;re currently changing the document attribute access over from &amp;lt;code&amp;gt;doc[&amp;quot;field&amp;quot;]&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;doc.field&amp;lt;/code&amp;gt;. This does not hurt the current code (mostly) and makes the remaining &amp;quot;move to sql(alchemy)&amp;quot; easier. This reduces the amount of work happening in a long term branch. And that&#039;s the critical work (can be dropped, is demotivating, ...). So moving as much work as possible before actually starting the sql branch will increase motivation and decrease chances of failure. This sounds like more work, because the same code possibly needs to be touched twice. This might be true. It might also mean more work, as we might need to create some extra support code to assist in moving to a new idea. I still think, this is better, because it&#039;s outside of this long lived branch.&lt;br /&gt;
&lt;br /&gt;
== Planing the Migration to SQL ==&lt;br /&gt;
This chapter contains some ideas, sketches, schedules, whatever developers feel they need to create a big plan.&lt;br /&gt;
&lt;br /&gt;
=== Some sketchup in SQL ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
create table users(&lt;br /&gt;
   id integer primary key not null,&lt;br /&gt;
   username varchar(30) unique not null,&lt;br /&gt;
   email text unique,&lt;br /&gt;
   created timestamp default CURRENT_TIMESTAMP,&lt;br /&gt;
   pw_hash text,&lt;br /&gt;
   email_verified boolean default FALSE,&lt;br /&gt;
   status varchar(30) default &#039;needs_email_verification&#039;,&lt;br /&gt;
   verification_key uuid,&lt;br /&gt;
   is_admin boolean default FALSE,&lt;br /&gt;
   url text,&lt;br /&gt;
   bio text,&lt;br /&gt;
   fp_verification_key uuid,&lt;br /&gt;
   fp_token_expire timestamp&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
create table file_records(&lt;br /&gt;
   id integer primary key not null,&lt;br /&gt;
   filename text array -- or json?&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
create table media_entries(&lt;br /&gt;
   id integer primary key not null,&lt;br /&gt;
   uploader integer references users(id) not null,&lt;br /&gt;
   title text,&lt;br /&gt;
   slug text,&lt;br /&gt;
   created timestamp default CURRENT_TIMESTAMP,&lt;br /&gt;
   description text,&lt;br /&gt;
   state text default &#039;unprocessed&#039;,&lt;br /&gt;
   queued_media_file integer references file_records(id),&lt;br /&gt;
   queued_task_id text,&lt;br /&gt;
   fail_error text,&lt;br /&gt;
   fail_metadata text -- json&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
create table media_files(&lt;br /&gt;
   id integer primary key not null,&lt;br /&gt;
   media_id integer references media_entries(id) not null,&lt;br /&gt;
   name varchar(30) not null,&lt;br /&gt;
      -- &amp;quot;original&amp;quot;, &amp;quot;thumbnail&amp;quot;, ...&lt;br /&gt;
      -- maybe also &amp;quot;attachment&amp;quot;-something?&lt;br /&gt;
   file integer references file_records(id) not null&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
create table media_comments(&lt;br /&gt;
   id integer primary key not null,&lt;br /&gt;
   media_entry integer references media_entries(id) not null,&lt;br /&gt;
   author integer references users(id) not null,&lt;br /&gt;
   created timestamp default CURRENT_TIMESTAMP,&lt;br /&gt;
   content text&lt;br /&gt;
   );&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Migration needs ===&lt;br /&gt;
&lt;br /&gt;
If we switch to SQL(Alchemy), we&#039;ll need to handle migrations.  This seems to have three requirements:&lt;br /&gt;
&lt;br /&gt;
# It has to be easy for users (as easy or easier than ./bin/gmg migrate)&lt;br /&gt;
# It has to be easy for developers&lt;br /&gt;
# It has to be able to handle our &amp;quot;extensible&amp;quot; infrastructure.  There will have to be separately handled migrations for MediaGoblin core, as well as for each media type and plugin.  All while remaining pretty simple!&lt;br /&gt;
&lt;br /&gt;
As far as I can tell, this should be pretty possible.  We have three options:&lt;br /&gt;
&lt;br /&gt;
# Completely roll our own system based off of SQLAlchemy&lt;br /&gt;
# Use [http://readthedocs.org/docs/sqlalchemy-migrate/en/latest/ SQLAlchemy-migrate]&lt;br /&gt;
# Roll our own system that uses components of SQLAlchemy-migrate.&lt;br /&gt;
&lt;br /&gt;
One way or another I suspect we are going with option 2 or 3.  SQLAlchemy-migrate provides some useful extensions to SQLAlchemy that are database related but can be used outside of SQLAlchemy-migrate&#039;s &amp;quot;complete tooling&amp;quot;, namely the [http://readthedocs.org/docs/sqlalchemy-migrate/en/v0.7.2/changeset.html#changeset-system changeset system].  Using the whole tooling system provides some cool stuff like some experimental auto-migration-detection, but might fall short in handling our extensible infrastructure... it&#039;s not clear yet.&lt;br /&gt;
&lt;br /&gt;
Whatever we do, it looks like we can probably fit our 3 needs using option #2 or option #3.  That&#039;s good!&lt;br /&gt;
&lt;br /&gt;
=== SQL switch tentative action plan ===&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a tentative plan of what an action plan for switching to SQL(alchemy).&lt;br /&gt;
&lt;br /&gt;
Items marked with (*) might or should be done before the actual sql branch is created. Meaning, they can likely be done &amp;quot;in master&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
# Port all models to SQLAlchemy models. (*)&lt;br /&gt;
# Make sure that port includes a nice way to handle media types in an extensible way! (*)&lt;br /&gt;
# Add filepath conversion tools (basically write 2 simple functions to switch filepaths -&amp;gt; slash-joined-strings and back.), use them everywhere (*)&lt;br /&gt;
# Add easy-database-init ./bin/gmg function (*)&lt;br /&gt;
# Port all code over to using sqlalchemy&lt;br /&gt;
# Add db-migrations tools (*)&lt;br /&gt;
# Add a mongodb-&amp;gt;SQL converter script (*)&lt;br /&gt;
# ???&lt;br /&gt;
# Profit!!! (Sorry, obligatory)&lt;br /&gt;
&lt;br /&gt;
== Testing SQL ==&lt;br /&gt;
As the SQL stuff in master starts to get somewhat useable, we would like to invite adventurous/experienced users/developers to try it out and give us feedback.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;WARNING&#039;&#039;&#039;: &#039;&#039;The SQL code is still in flux, so don&#039;t put any valuable data in your SQL based setup. For example the schema might still change in an incompatible way. When the switch to SQL has happened, there will of course be migrations to keep all data across schema changes.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Communication and Issues ===&lt;br /&gt;
If you&#039;re going to test SQL support, please join IRC and talk to the developers first (or at least after testing). The whole thing is alpha quality and there are things not working. We know about most (we think!), but we surely want to learn about new problems!&lt;br /&gt;
&lt;br /&gt;
Some issues are documented in the [http://issues.mediagoblin.org/query?status=!closed&amp;amp;keywords=~sql issue tracker]&lt;br /&gt;
&lt;br /&gt;
=== Setting the SQL database ===&lt;br /&gt;
The default is an sqlite database &amp;lt;code&amp;gt;mediagoblin.db&amp;lt;/code&amp;gt; next to your config file. If you want to change that, put a variable &amp;lt;code&amp;gt;sql_engine&amp;lt;/code&amp;gt; into the &amp;lt;code&amp;gt;[mediagoblin]&amp;lt;/code&amp;gt; section. It is an sqlalchemy engine URI.&lt;br /&gt;
&lt;br /&gt;
=== Switching mediagoblin to SQL ===&lt;br /&gt;
First: Set the database URI as above, if you need to.&amp;lt;BR&amp;gt;Then after switching mediagoblin to SQL, read on the next sections and find the one relevant to you.&lt;br /&gt;
&lt;br /&gt;
So switching the complete mediagoblin code to use sql is not super simple, but it&#039;s quite doable.&amp;lt;BR&amp;gt;&lt;br /&gt;
To enable:&lt;br /&gt;
* You need to create a file named &amp;lt;code&amp;gt;mediagoblin/db/sql_switch.py&amp;lt;/code&amp;gt; and put one this in it: &amp;lt;code&amp;gt;use_sql = True&amp;lt;/code&amp;gt;&lt;br /&gt;
To disable:&lt;br /&gt;
* Either delete &amp;lt;code&amp;gt;mediagoblin/db/sql_switch.py&amp;lt;/code&amp;gt; AND &amp;lt;code&amp;gt;mediagoblin/db/sql_switch.pyc&amp;lt;/code&amp;gt;&lt;br /&gt;
* Or: Change the contents to: &amp;lt;code&amp;gt;use_sql = False&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Testing the conversion tool ===&lt;br /&gt;
So you want to convert your existing mongo data into the sql database. Maybe just to look at the resulting database layout and the data in there? It&#039;s easy:&lt;br /&gt;
# Configure your database uri (see above)&lt;br /&gt;
# Clean your database, drop all previous tables.&lt;br /&gt;
# Run this command:&lt;br /&gt;
 bin/gmg [-cf your_mediagoblin.ini] convert_mongo_to_sql&lt;br /&gt;
&lt;br /&gt;
=== Creating a new empty database (and later: keeping it current) ===&lt;br /&gt;
Very simple:&lt;br /&gt;
# Configure your database uri (see above)&lt;br /&gt;
# Run this:&lt;br /&gt;
 bin/gmg [-cf your_mediagoblin.ini] dbupdate&lt;/div&gt;</summary>
		<author><name>Elrond</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=SQL_Database_Backend&amp;diff=600</id>
		<title>SQL Database Backend</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=SQL_Database_Backend&amp;diff=600"/>
		<updated>2012-03-12T14:05:58Z</updated>

		<summary type="html">&lt;p&gt;Elrond: Communication and issue tracker&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
MediaGoblin currently uses MongoDB as its database backend. There have been various reasons for this decision (see: [[Why MongoDB]], yes really, look at it. It has a lot of insight what are the problems with sql). Still, the idea of an SQL backend is coming up from time to time.&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
The existence of this wiki page does not give any evidence of the SQL backend getting developed soon!&lt;br /&gt;
&lt;br /&gt;
== People ==&lt;br /&gt;
Even an experimental implementation of an SQL backend, that will only support basic features will need a good amount of time/energy from some (core) developers. That time/energy will not be available to other projects.&lt;br /&gt;
* Some knowing sqlalchemy is needed.&lt;br /&gt;
* Someone having a good idea on the thin db layer is needed (Elrond will most likely be available for helping)&lt;br /&gt;
* Someone having an idea on the current queries used in the code is needed too.&lt;br /&gt;
&lt;br /&gt;
== Development models ==&lt;br /&gt;
* The biggest question is: Do we want to try an experimental sql backend? This is a tricky question. If it fails, it will be a lot of wasted time/energy. And contributors wouldn&#039;t be happy to have wasted their time/energy.&lt;br /&gt;
* The wasted time/energy could be limited by limiting the first target. For example one could dedide, that the sql backend is not intended to support the full feature set.&lt;br /&gt;
* Then there is the question on how to develop this:&lt;br /&gt;
*# Long term branch: Develop an SQL replacement in a long term branch. The good: Anything can be changed as needed. Not so good: Some people dislike long term branches for various reasons.&lt;br /&gt;
*# Trying to develop this alongside the current backend, in tree.&lt;br /&gt;
&lt;br /&gt;
== Major Issues ==&lt;br /&gt;
The current db model uses dicts to allow flexible storage for extensions and different media types. Representing these data in SQL is not simple. The dicts are normally keyed by a string and have arbitrary values. There are basically two ways:&lt;br /&gt;
&lt;br /&gt;
# Have a table with a key column (string) and a value column (string, json encoded). This will allow easy reconstruction of the dict for an object fetch and will allow queries on the key of the dict.&lt;br /&gt;
#: &#039;&#039;However&#039;&#039;, it will not allow queries on the values. For example the imaginary geolocation extension will store the lat/lon there and might want to search for other media &amp;quot;nearby&amp;quot;.&lt;br /&gt;
#: If the value column is split into three columns (i.e. &amp;lt;code&amp;gt;value_int value_string value_json&amp;lt;/code&amp;gt;), some queries, such as those on numbers, would be possible. .&lt;br /&gt;
#: &#039;&#039;&#039;Note:&#039;&#039;&#039; The table would actually look something like this: &amp;lt;code&amp;gt;create table super_data_table(media_id references media(id), plugin_id int, key, value_int, value_string);&amp;lt;/code&amp;gt; ... note that this design was predicted, determined by Chris Webber to be gross, and was aimed to be avoided, hence the choice of MongoDB.  See [[Why MongoDB]] for details.&lt;br /&gt;
# Actually structure the things into distinct tables. The above mentioned imaginary geolocation extension would have its own table with lat/lon fields and be able to perform efficient queries on it.&lt;br /&gt;
&lt;br /&gt;
== Pros and Cons ==&lt;br /&gt;
&lt;br /&gt;
=== MongoDB ===&lt;br /&gt;
&lt;br /&gt;
==== Pros ====&lt;br /&gt;
* Allows you to lazily flexibly store stuff like multiple media type information, plugin data, etc&lt;br /&gt;
* Supposedly scales up really well!&lt;br /&gt;
* Programming interface feels clean and pythonic.&lt;br /&gt;
* Migrations + flexible stuff might be a bit easier&lt;br /&gt;
* Shows a lot of promise&lt;br /&gt;
* Seems to be pretty fast if you have the right resources and carefully tuned your database&lt;br /&gt;
* We&#039;ve already built our tooling around it!&lt;br /&gt;
&lt;br /&gt;
==== Cons ====&lt;br /&gt;
&lt;br /&gt;
* Much, much more resource dependent on low and middle scale deployments than SQL would be&lt;br /&gt;
* Seems like you have to really tune your server around the database&lt;br /&gt;
* Have to think super carefully about indexes and (mostly) construct one index per common query.  (That&#039;s a bit misleading, but pretty close to the truth.)  Furthermore, one feels wary of creating more indexes because memory mapping means each index (and so each query) sucks up even more RAM. (At scale you also have to think about indexes for relational databases.) &lt;br /&gt;
* &amp;quot;On the fly&amp;quot; queries not so easy, could be much more expensive than &lt;br /&gt;
* No joins (normalized data on insertion to obviate the need for joins)&lt;br /&gt;
* How much do we really care about scaling up on the database layer anyway? (What&#039;s the expected write-load of media-goblin.) &lt;br /&gt;
** DeviantArt at Libre Graphics Meeting 2011 expressed that SQL + memcached works just fine for them and didn&#039;t think more complex things were necessary.  That&#039;s a huge install base, and it seems hard to believe that MediaGoblin sites will hit that scale level. (How big is/are their SQL box/en? With automatic-sharding, MognoDB might be able to give better write performance per-dollar than SQL solutions of the same size.)&lt;br /&gt;
** We&#039;re much more likely to run into media scaling issues before database scaling issues&lt;br /&gt;
** In an ideal federated world, scaling down might be more important than scaling up because everyone will be running their own servers&lt;br /&gt;
* In the end, flexibility doesn&#039;t seem to be worth much because you can&#039;t really do arbitrary queries on stuff you dump in if you want it to have any sort of speed whatsoever because of indexing considerations. (Good SQL schema design, and performance limitations of joins presents similar limitations.)&lt;br /&gt;
* Though promising looking and solutions to issues keep coming up fast and hitting the core software it&#039;s also very new and not as well established.&lt;br /&gt;
* It&#039;s not like migrations entirely disappeared, but they&#039;re probably easier with certain flexible things&lt;br /&gt;
* Every few weeks someone brings up an SQL backend ;)&lt;br /&gt;
&lt;br /&gt;
=== SQL(alchemy) ===&lt;br /&gt;
&lt;br /&gt;
==== Pros ====&lt;br /&gt;
&lt;br /&gt;
* Scales down and up pretty well (possibly not as high up as MongoDB but again if it&#039;s high enough for DeviantArt...) and scaling down really does matter in our case&lt;br /&gt;
* Developers are generally pretty used to it&lt;br /&gt;
* SQLAlchemy has a really strong and established codebase&lt;br /&gt;
* Arbitrary, unplanned queries!&lt;br /&gt;
* Flexible schemas still possible but in some different ways (but not as nicely directly and certainly in no way as loosely flexible)&lt;br /&gt;
* Extremely well established.&lt;br /&gt;
&lt;br /&gt;
==== Cons ====&lt;br /&gt;
&lt;br /&gt;
* Would mean a *lot* of rewriting!&lt;br /&gt;
* Would mean having to write a careful migration path from mongodb-&amp;gt;SQL!&lt;br /&gt;
* Not as directly flexible as MongoDB (though we can design cleverly for a certain type of flexibility)&lt;br /&gt;
* Migrations with certain types of database flexibility could break in really irritating for users (and people helping the users) ways&lt;br /&gt;
* Working on this move could slow down other work or be hard to coordinate in parallell with other development&lt;br /&gt;
* Probably does not scale up quite as high (again, it&#039;d have to be &amp;quot;much higher than deviantart&amp;quot;, which sounds like an unlikely problem we&#039;d like to have)&lt;br /&gt;
* Rewriting could possibly hurt our momentum in a serious way, especially if there&#039;s a feature freeze during the transition (and if there isn&#039;t, merging in master could become a real irritation)... even if we agree to do a rewrite, would we want to wait a while to do so? (Alternately, waiting to rewrite means the rewrite just gets harder.)&lt;br /&gt;
&lt;br /&gt;
== Statements by some developers ==&lt;br /&gt;
=== Chris Webber&#039;s weigh-in ===&lt;br /&gt;
&lt;br /&gt;
So I think several things about the whole possible move to SQL.&lt;br /&gt;
&lt;br /&gt;
First of all, after having written out the Pros &amp;amp; Cons of each, it&lt;br /&gt;
seems like maybe MongoDB is a lot of extra complexity and not gains in&lt;br /&gt;
the areas I expected it to be.  The supposed win wasn&#039;t scaling (and&lt;br /&gt;
as predicted, scaling down has been something we&#039;ve had to work around&lt;br /&gt;
carefully), it was flexibility.  Does MongoDB allow for extra&lt;br /&gt;
flexibility?  (And we *do* need flexibility for MediaGoblin&#039;s design.)&lt;br /&gt;
Yes in the sense that you can dump in whatever, but if you intend to&lt;br /&gt;
query on any of those attributes, it&#039;s mostly no.  Indexes are&lt;br /&gt;
expensive, and we have to spend a lot of time carefully pussyfooting&lt;br /&gt;
around them.&lt;br /&gt;
&lt;br /&gt;
While planning MediaGoblin, I knew that there were two patterns for&lt;br /&gt;
making things flexible in SQL... one of them is the table with &amp;quot;key,&lt;br /&gt;
value, type&amp;quot;.  I thought that was unacceptably gross, and still do&lt;br /&gt;
think so.&lt;br /&gt;
&lt;br /&gt;
The other option is that you have a &amp;quot;main&amp;quot; table (like MediaEntry), it&lt;br /&gt;
references what &amp;quot;type&amp;quot; it is (such as &amp;quot;video&amp;quot;, &amp;quot;image&amp;quot;, whatever), and&lt;br /&gt;
external tables for the extra information for that type point to the&lt;br /&gt;
MediaEntry via a foreignkey and provide whatever media type specific&lt;br /&gt;
data.  Similarly, use external tables for plugins.  The main reason I&lt;br /&gt;
didn&#039;t want to deal with this is because I imagined migrations&lt;br /&gt;
becoming a convoluted mess.  It wasn&#039;t that we *wouldn&#039;t need*&lt;br /&gt;
migrations in MongoDB, it&#039;s that maybe migrations would be less&lt;br /&gt;
nightmarish with extensible stuff involved.  In retrospect this was&lt;br /&gt;
pretty reactive to a number of frustrating times I&#039;ve had to try and&lt;br /&gt;
walk people through broken migrations.  But I&#039;m getting the sense that&lt;br /&gt;
I&#039;ll have to walk people through database complexity or breakage as&lt;br /&gt;
much or more in MongoDB, and the complexity of managing indexes for&lt;br /&gt;
any sort of extensibility is as bad or worse than dealing with&lt;br /&gt;
migrations with an extensible SQL setup.&lt;br /&gt;
&lt;br /&gt;
So, okay.  I think I just made a pretty compelling case for moving&lt;br /&gt;
back to SQL.  So what then?&lt;br /&gt;
&lt;br /&gt;
Two options have been proposed: try and support both SQL and MongoDB&lt;br /&gt;
at the same time, or create a branch that switches from MongoDB to&lt;br /&gt;
SQL.  I&#039;m afraid that the former just doesn&#039;t sound like a good idea&lt;br /&gt;
to me at all... it seems like it&#039;ll result in a system with a&lt;br /&gt;
massively bloated codebase, hard for new contributors to work with,&lt;br /&gt;
hard to maintain, and &amp;quot;worst of both worlds&amp;quot; types compromises.  Think&lt;br /&gt;
about this for a second: how do you map things like migrations,&lt;br /&gt;
indexing, etc over?  Do we really want to completely rewrite the&lt;br /&gt;
MongoDB query tools over to SQL?  Some people have said that &amp;quot;it looks&lt;br /&gt;
like we have a pretty simple use of MongoDB so this layer won&#039;t be so&lt;br /&gt;
complex.&amp;quot;  To me that sounds like classic hacker &amp;quot;well that can&#039;t be&lt;br /&gt;
so hard&amp;quot; underestimation of the complexity of the problem.  Anyway, I&lt;br /&gt;
already see a ton of complexities, and I&#039;m sure there are more I&lt;br /&gt;
haven&#039;t even been able to see.&lt;br /&gt;
&lt;br /&gt;
So the remaining option is to do a branch to switch from MongoDB -&amp;gt;&lt;br /&gt;
SQL.  There&#039;s some risk of this also... it&#039;s hard to maintain a big&lt;br /&gt;
overhaul branch while the mainline is constantly changing.  There&#039;s&lt;br /&gt;
also a risk of fracturing, and if we change our mind and stay with&lt;br /&gt;
MongoDB, there&#039;s even a risk of forking!  Not to mention that working&lt;br /&gt;
on a branch that&#039;s so huge that doesn&#039;t get pulled in is incredibly&lt;br /&gt;
demoralizing.&lt;br /&gt;
&lt;br /&gt;
But we can reduce all those risks if we can come to a *consensus* that&lt;br /&gt;
this is what we want to do.  So I propose at the next meeting we&lt;br /&gt;
discuss this and try to make sure we&#039;re at community consensus before&lt;br /&gt;
agreeing to move to SQL (if that&#039;s indeed what we intend to do) and if&lt;br /&gt;
we do so, move to SQL *entirely*.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s what I envision the path to that future will look like:&lt;br /&gt;
&lt;br /&gt;
* Create a branch that prototypes all the models being switched over to SQLAlchemy, included &amp;quot;multiple media types&amp;quot; implemented with a friendly API.&lt;br /&gt;
* Assuming that works nice, continue work in that branch to switch all code over to using SQL.&lt;br /&gt;
* Figure out how to do migrations nicely in SQL, including with multiple media types (I have some thoughts on how to do this &amp;quot;nicely&amp;quot;)&lt;br /&gt;
* Create a MongoDB-&amp;gt;SQL migration tool&lt;br /&gt;
&lt;br /&gt;
Anyway, let&#039;s discuss this at next meeting!&lt;br /&gt;
&lt;br /&gt;
=== Elrond&#039;s comments ===&lt;br /&gt;
I&#039;m quite with Chris Webber here.&lt;br /&gt;
&lt;br /&gt;
One thing, I have to add/where I&#039;m thinking a bit different: We should try to identify tasks in the sql-migration that can be done just &amp;quot;now&amp;quot;. What does that mean? Moving to sql(alchemy) means a lot of changes. And some of these changes can be done with the mongodb backend as well. For example we&#039;re currently changing the document attribute access over from &amp;lt;code&amp;gt;doc[&amp;quot;field&amp;quot;]&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;doc.field&amp;lt;/code&amp;gt;. This does not hurt the current code (mostly) and makes the remaining &amp;quot;move to sql(alchemy)&amp;quot; easier. This reduces the amount of work happening in a long term branch. And that&#039;s the critical work (can be dropped, is demotivating, ...). So moving as much work as possible before actually starting the sql branch will increase motivation and decrease chances of failure. This sounds like more work, because the same code possibly needs to be touched twice. This might be true. It might also mean more work, as we might need to create some extra support code to assist in moving to a new idea. I still think, this is better, because it&#039;s outside of this long lived branch.&lt;br /&gt;
&lt;br /&gt;
== Planing the Migration to SQL ==&lt;br /&gt;
This chapter contains some ideas, sketches, schedules, whatever developers feel they need to create a big plan.&lt;br /&gt;
&lt;br /&gt;
=== Some sketchup in SQL ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
create table users(&lt;br /&gt;
   id integer primary key not null,&lt;br /&gt;
   username varchar(30) unique not null,&lt;br /&gt;
   email text unique,&lt;br /&gt;
   created timestamp default CURRENT_TIMESTAMP,&lt;br /&gt;
   pw_hash text,&lt;br /&gt;
   email_verified boolean default FALSE,&lt;br /&gt;
   status varchar(30) default &#039;needs_email_verification&#039;,&lt;br /&gt;
   verification_key uuid,&lt;br /&gt;
   is_admin boolean default FALSE,&lt;br /&gt;
   url text,&lt;br /&gt;
   bio text,&lt;br /&gt;
   fp_verification_key uuid,&lt;br /&gt;
   fp_token_expire timestamp&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
create table file_records(&lt;br /&gt;
   id integer primary key not null,&lt;br /&gt;
   filename text array -- or json?&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
create table media_entries(&lt;br /&gt;
   id integer primary key not null,&lt;br /&gt;
   uploader integer references users(id) not null,&lt;br /&gt;
   title text,&lt;br /&gt;
   slug text,&lt;br /&gt;
   created timestamp default CURRENT_TIMESTAMP,&lt;br /&gt;
   description text,&lt;br /&gt;
   state text default &#039;unprocessed&#039;,&lt;br /&gt;
   queued_media_file integer references file_records(id),&lt;br /&gt;
   queued_task_id text,&lt;br /&gt;
   fail_error text,&lt;br /&gt;
   fail_metadata text -- json&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
create table media_files(&lt;br /&gt;
   id integer primary key not null,&lt;br /&gt;
   media_id integer references media_entries(id) not null,&lt;br /&gt;
   name varchar(30) not null,&lt;br /&gt;
      -- &amp;quot;original&amp;quot;, &amp;quot;thumbnail&amp;quot;, ...&lt;br /&gt;
      -- maybe also &amp;quot;attachment&amp;quot;-something?&lt;br /&gt;
   file integer references file_records(id) not null&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
create table media_comments(&lt;br /&gt;
   id integer primary key not null,&lt;br /&gt;
   media_entry integer references media_entries(id) not null,&lt;br /&gt;
   author integer references users(id) not null,&lt;br /&gt;
   created timestamp default CURRENT_TIMESTAMP,&lt;br /&gt;
   content text&lt;br /&gt;
   );&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Migration needs ===&lt;br /&gt;
&lt;br /&gt;
If we switch to SQL(Alchemy), we&#039;ll need to handle migrations.  This seems to have three requirements:&lt;br /&gt;
&lt;br /&gt;
# It has to be easy for users (as easy or easier than ./bin/gmg migrate)&lt;br /&gt;
# It has to be easy for developers&lt;br /&gt;
# It has to be able to handle our &amp;quot;extensible&amp;quot; infrastructure.  There will have to be separately handled migrations for MediaGoblin core, as well as for each media type and plugin.  All while remaining pretty simple!&lt;br /&gt;
&lt;br /&gt;
As far as I can tell, this should be pretty possible.  We have three options:&lt;br /&gt;
&lt;br /&gt;
# Completely roll our own system based off of SQLAlchemy&lt;br /&gt;
# Use [http://readthedocs.org/docs/sqlalchemy-migrate/en/latest/ SQLAlchemy-migrate]&lt;br /&gt;
# Roll our own system that uses components of SQLAlchemy-migrate.&lt;br /&gt;
&lt;br /&gt;
One way or another I suspect we are going with option 2 or 3.  SQLAlchemy-migrate provides some useful extensions to SQLAlchemy that are database related but can be used outside of SQLAlchemy-migrate&#039;s &amp;quot;complete tooling&amp;quot;, namely the [http://readthedocs.org/docs/sqlalchemy-migrate/en/v0.7.2/changeset.html#changeset-system changeset system].  Using the whole tooling system provides some cool stuff like some experimental auto-migration-detection, but might fall short in handling our extensible infrastructure... it&#039;s not clear yet.&lt;br /&gt;
&lt;br /&gt;
Whatever we do, it looks like we can probably fit our 3 needs using option #2 or option #3.  That&#039;s good!&lt;br /&gt;
&lt;br /&gt;
=== SQL switch tentative action plan ===&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a tentative plan of what an action plan for switching to SQL(alchemy).&lt;br /&gt;
&lt;br /&gt;
Items marked with (*) might or should be done before the actual sql branch is created. Meaning, they can likely be done &amp;quot;in master&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
# Port all models to SQLAlchemy models. (*)&lt;br /&gt;
# Make sure that port includes a nice way to handle media types in an extensible way! (*)&lt;br /&gt;
# Add filepath conversion tools (basically write 2 simple functions to switch filepaths -&amp;gt; slash-joined-strings and back.), use them everywhere (*)&lt;br /&gt;
# Add easy-database-init ./bin/gmg function (*)&lt;br /&gt;
# Port all code over to using sqlalchemy&lt;br /&gt;
# Add db-migrations tools (*)&lt;br /&gt;
# Add a mongodb-&amp;gt;SQL converter script (*)&lt;br /&gt;
# ???&lt;br /&gt;
# Profit!!! (Sorry, obligatory)&lt;br /&gt;
&lt;br /&gt;
== Testing SQL ==&lt;br /&gt;
As the SQL stuff in master starts to get somewhat useable, we would like to invite adventurous/experienced users/developers to try it out and give us feedback.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;WARNING&#039;&#039;&#039;: &#039;&#039;The SQL code is still in flux, so don&#039;t put any valuable data in your SQL based setup. For example the schema might still change in an incompatible way. When the switch to SQL has happened, there will of course be migrations to keep all data across schema changes.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Communication and Issues ===&lt;br /&gt;
If you&#039;re going to test SQL support, please join IRC and talk to the developers first (or at least after testing). The whole thing is alpha quality and there are things not working. We know about most (we think!), but we surely want to learn about new problems!&lt;br /&gt;
&lt;br /&gt;
Some issues are documented in the [http://issues.mediagoblin.org/query?status=!closed&amp;amp;keywords=~sql issue tracker]&lt;br /&gt;
&lt;br /&gt;
=== Setting the SQL database ===&lt;br /&gt;
The default is an sqlite database &amp;lt;code&amp;gt;mediagoblin.db&amp;lt;/code&amp;gt; next to your config file. If you want to change that, put a variable &amp;lt;code&amp;gt;sql_engine&amp;lt;/code&amp;gt; into the &amp;lt;code&amp;gt;[mediagoblin]&amp;lt;/code&amp;gt; section. It is an sqlalchemy engine URI.&lt;br /&gt;
&lt;br /&gt;
=== Testing the conversion tool ===&lt;br /&gt;
So you want to convert your existing mongo data into the sql database. Maybe just to look at the resulting database layout and the data in there? It&#039;s easy:&lt;br /&gt;
# Configure your database uri (see above)&lt;br /&gt;
# Clean your database, drop all previous tables.&lt;br /&gt;
# Run this command:&lt;br /&gt;
 bin/gmg [-cf your_mediagoblin.ini] convert_mongo_to_sql&lt;br /&gt;
&lt;br /&gt;
=== Creating a new empty database (and later: keeping it current) ===&lt;br /&gt;
Very simple:&lt;br /&gt;
# Configure your database uri (see above)&lt;br /&gt;
# Run this:&lt;br /&gt;
 bin/gmg [-cf your_mediagoblin.ini] dbupdate&lt;br /&gt;
&lt;br /&gt;
=== Switching mediagoblin to SQL ===&lt;br /&gt;
Not as simple.&lt;br /&gt;
To enable:&lt;br /&gt;
* You need to create a file named &amp;lt;code&amp;gt;mediagoblin/db/sql_switch.py&amp;lt;/code&amp;gt; and put one this in it: &amp;lt;code&amp;gt;use_sql = True&amp;lt;/code&amp;gt;&lt;br /&gt;
To disable:&lt;br /&gt;
* Either delete &amp;lt;code&amp;gt;mediagoblin/db/sql_switch.py&amp;lt;/code&amp;gt; AND &amp;lt;code&amp;gt;mediagoblin/db/sql_switch.pyc&amp;lt;/code&amp;gt;&lt;br /&gt;
* Or: Change the contents to: &amp;lt;code&amp;gt;use_sql = False&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will switch the whole code base to use the SQL backend instead of the mongo backend.&lt;/div&gt;</summary>
		<author><name>Elrond</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=API_Roadmap&amp;diff=592</id>
		<title>API Roadmap</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=API_Roadmap&amp;diff=592"/>
		<updated>2012-03-07T11:13:27Z</updated>

		<summary type="html">&lt;p&gt;Elrond: Evaluating old wheels&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Sessions ==&lt;br /&gt;
=== 2012-02-18: Hacking session ===&lt;br /&gt;
&lt;br /&gt;
Try to determine what kind of authentication we could provide for the descibed scenario.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;del&amp;gt;According to http://webreflection.blogspot.com/2008/06/ajax-or-javascript-subdomain-requestes.html it is possible to access a subdomain from another parent domain/subdomain sharing the same parent domain.&amp;lt;/del&amp;gt; not feasible.&lt;br /&gt;
&lt;br /&gt;
==== Results ====&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Cross-origin_resource_sharing CORS] to enable cross-domain AJAX requests.&lt;br /&gt;
* OAuth for authentication&lt;br /&gt;
&lt;br /&gt;
== Network layout ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;OS&#039;&#039; is a web application that has the intention to store mediafiles in the &#039;&#039;MGS&#039;&#039; (MediaGoblin server).&lt;br /&gt;
&#039;&#039;OC&#039;&#039; is a client visiting the &#039;&#039;OS&#039;&#039; web application.&lt;br /&gt;
&lt;br /&gt;
== Submission - proposal ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
OC visits OS with the intention to submit an image&lt;br /&gt;
                    |&lt;br /&gt;
                    V&lt;br /&gt;
OC authenticates to MGS via JavaScript OAuth&lt;br /&gt;
    (This is where I have no idea what &lt;br /&gt;
           I&#039;m doing as of now)&lt;br /&gt;
                    |&lt;br /&gt;
                    V&lt;br /&gt;
OC submits a POST to MGS, not breaking the same origin&lt;br /&gt;
    policy by placing MGS on a subdomain to OS.&lt;br /&gt;
The POST contains a CALLBACK URL, which MGS will issue&lt;br /&gt;
 when doen processing the media submitted in the POST&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Resources ==&lt;br /&gt;
&lt;br /&gt;
=== Links ===&lt;br /&gt;
&lt;br /&gt;
* OAuth code examples - http://oauth.net/code/&lt;br /&gt;
* [[REST API]]&lt;br /&gt;
&lt;br /&gt;
== Tasks ==&lt;br /&gt;
# Specify details of the REST API&lt;br /&gt;
# Implement the REST API&lt;br /&gt;
#* Views&lt;br /&gt;
#** &amp;lt;code&amp;gt;/submit/&amp;lt;/code&amp;gt;&lt;br /&gt;
#*** Accept webhook argument&lt;br /&gt;
#*** Offer alternative output format&lt;br /&gt;
#** &amp;lt;code&amp;gt;/u/{user}/m/{media}&amp;lt;/code&amp;gt;&lt;br /&gt;
#*** Offer alternative output format&lt;br /&gt;
#** &amp;lt;code&amp;gt;/u/{user}/gallery/&amp;lt;/code&amp;gt;&lt;br /&gt;
#*** Offer alternative output format&lt;br /&gt;
# Add webhook callback to Processing&lt;br /&gt;
# CORS&lt;br /&gt;
#* CORS-enable views&lt;br /&gt;
#** &amp;lt;code&amp;gt;CORSEnabled&amp;lt;/code&amp;gt; wrapper for views&lt;br /&gt;
# OAuth&lt;br /&gt;
#* OAuth research&lt;br /&gt;
#* OAuth views[https://github.com/simplegeo/python-oauth2/blob/master/example/server.py]&lt;br /&gt;
#** Request&lt;br /&gt;
#** Access&lt;br /&gt;
#** Authorization&lt;br /&gt;
#** Callback&lt;br /&gt;
#** Resource&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== IRC source ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
13/12:03.55 &amp;lt; tryggvib&amp;gt; joar: I&#039;ve been thinking about what work you could do &lt;br /&gt;
                        and after looking at the current version of nyergler&#039;s &lt;br /&gt;
                        API on the wiki I have a good idea&lt;br /&gt;
13/12:05.09 &amp;lt; tryggvib&amp;gt; 1. Design the backbone structure (structure gmg around &lt;br /&gt;
                        the json accepts (I&#039;d guess you want to keep the api &lt;br /&gt;
                        views seperate from the &#039;normal&#039; http views&lt;br /&gt;
13/12:07.11 &amp;lt; tryggvib&amp;gt; 2. Implement the authorization code (OAuth 2.0, even &lt;br /&gt;
                        though that means we&#039;d show the key on our side (with &lt;br /&gt;
                        the js oauth implementation)&lt;br /&gt;
13/12:07.47 &amp;lt; tryggvib&amp;gt; (with 2. I mean the OAuth gmg part and this could be &lt;br /&gt;
                        split into two parts - 2a. read and familiarize &lt;br /&gt;
                        yourself with OAuth, 2b. implement OAuth)&lt;br /&gt;
13/12:08.13 &amp;lt; tryggvib&amp;gt; 3. implement the /u/&amp;lt;username&amp;gt;/gallery/ endpoint&lt;br /&gt;
13/12:08.26 &amp;lt; tryggvib&amp;gt; 4. implement the /u/&amp;lt;username&amp;gt;/m/&amp;lt;slug&amp;gt; endpoint&lt;br /&gt;
13/12:09.40 &amp;lt; tryggvib&amp;gt; so the big uncertainty would be the OAuth &lt;br /&gt;
                        implementation I think&lt;br /&gt;
13/12:10.54 &amp;lt; tryggvib&amp;gt; first of all I don&#039;t know if we&#039;ve reached any &lt;br /&gt;
                        agreement about using it and secondly since we have to &lt;br /&gt;
                        familiarize ourselves with it the implementation time &lt;br /&gt;
                        estimate is hard&lt;br /&gt;
13/12:13.05 &amp;lt; tryggvib&amp;gt; Depending on the gmg code I also don&#039;t know how big 1. &lt;br /&gt;
                        will be, but I guess it should not be all to difficult&lt;br /&gt;
13/12:18.25 &amp;lt; tryggvib&amp;gt; Even though this is directed to joar, everybody else &lt;br /&gt;
                        can chip in some thoughts (that&#039;s why I&#039;m posting this &lt;br /&gt;
                        here)&lt;br /&gt;
13/12:20.45 &amp;lt; joar&amp;gt; tryggvib: perhaps it would be a good idea to make a &lt;br /&gt;
                    proof-of-concept for the authorization.&lt;br /&gt;
13/12:21.10 &amp;lt; tryggvib&amp;gt; yes&lt;br /&gt;
13/12:22.21 &amp;lt; tryggvib&amp;gt; there are a few things I&#039;d like to add to items 3. and &lt;br /&gt;
                        4. though&lt;br /&gt;
13/12:23.04 &amp;lt; tryggvib&amp;gt; for the POST in item 3. we need the optional callback &lt;br /&gt;
                        URL which get called when the processing of the media &lt;br /&gt;
                        file is done&lt;br /&gt;
13/12:23.54 &amp;lt; joar&amp;gt; the POST action is actually on a different view set, you&#039;re &lt;br /&gt;
                    thinking of submit.views, I believe.&lt;br /&gt;
13/12:24.11 &amp;lt; tryggvib&amp;gt; and for the GET in item 4. I would also want to get a &lt;br /&gt;
                        thumbnail and the cc info&lt;br /&gt;
13/12:24.59 &amp;lt; joar&amp;gt; tryggvib: Can I write this down in the wiki?&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Investigating already existing protocols ==&lt;br /&gt;
Before reinventing the wheel, we should analyze existing wheels. That means, existing protocols should be evaluated, whether they fit the needs. Of course only a certain subset of &amp;quot;old wheels&amp;quot; can be looked at, but the most important ones shouldn&#039;t be left out.&lt;br /&gt;
Using an existing protocol could also save work. At least on the client side, because the clients usualy already exist. Existing clients could also greatly help in developing the server side (easy testing!).&lt;br /&gt;
The results of this evaluation should be documented so that there is an easy place to point people at who ask &amp;quot;Why didn&#039;t you use Y for your main protocol, it&#039;s great!&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Protocols that come to mind, and should possibly be evaluated:&lt;br /&gt;
* [http://www.flickr.com/services/api/ flickr api]&lt;br /&gt;
* gallery2 api&lt;br /&gt;
* &amp;amp;hellip;&lt;br /&gt;
&lt;br /&gt;
Of course any of those &amp;quot;old wheels&amp;quot; can later be implemented as a plugin and be enabled by users.&lt;/div&gt;</summary>
		<author><name>Elrond</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=SQL_Database_Backend&amp;diff=586</id>
		<title>SQL Database Backend</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=SQL_Database_Backend&amp;diff=586"/>
		<updated>2012-03-03T18:24:22Z</updated>

		<summary type="html">&lt;p&gt;Elrond: More SQL testing docs, including the magic switch&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
MediaGoblin currently uses MongoDB as its database backend. There have been various reasons for this decision (see: [[Why MongoDB]], yes really, look at it. It has a lot of insight what are the problems with sql). Still, the idea of an SQL backend is coming up from time to time.&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
The existence of this wiki page does not give any evidence of the SQL backend getting developed soon!&lt;br /&gt;
&lt;br /&gt;
== People ==&lt;br /&gt;
Even an experimental implementation of an SQL backend, that will only support basic features will need a good amount of time/energy from some (core) developers. That time/energy will not be available to other projects.&lt;br /&gt;
* Some knowing sqlalchemy is needed.&lt;br /&gt;
* Someone having a good idea on the thin db layer is needed (Elrond will most likely be available for helping)&lt;br /&gt;
* Someone having an idea on the current queries used in the code is needed too.&lt;br /&gt;
&lt;br /&gt;
== Development models ==&lt;br /&gt;
* The biggest question is: Do we want to try an experimental sql backend? This is a tricky question. If it fails, it will be a lot of wasted time/energy. And contributors wouldn&#039;t be happy to have wasted their time/energy.&lt;br /&gt;
* The wasted time/energy could be limited by limiting the first target. For example one could dedide, that the sql backend is not intended to support the full feature set.&lt;br /&gt;
* Then there is the question on how to develop this:&lt;br /&gt;
*# Long term branch: Develop an SQL replacement in a long term branch. The good: Anything can be changed as needed. Not so good: Some people dislike long term branches for various reasons.&lt;br /&gt;
*# Trying to develop this alongside the current backend, in tree.&lt;br /&gt;
&lt;br /&gt;
== Major Issues ==&lt;br /&gt;
The current db model uses dicts to allow flexible storage for extensions and different media types. Representing these data in SQL is not simple. The dicts are normally keyed by a string and have arbitrary values. There are basically two ways:&lt;br /&gt;
&lt;br /&gt;
# Have a table with a key column (string) and a value column (string, json encoded). This will allow easy reconstruction of the dict for an object fetch and will allow queries on the key of the dict.&lt;br /&gt;
#: &#039;&#039;However&#039;&#039;, it will not allow queries on the values. For example the imaginary geolocation extension will store the lat/lon there and might want to search for other media &amp;quot;nearby&amp;quot;.&lt;br /&gt;
#: If the value column is split into three columns (i.e. &amp;lt;code&amp;gt;value_int value_string value_json&amp;lt;/code&amp;gt;), some queries, such as those on numbers, would be possible. .&lt;br /&gt;
#: &#039;&#039;&#039;Note:&#039;&#039;&#039; The table would actually look something like this: &amp;lt;code&amp;gt;create table super_data_table(media_id references media(id), plugin_id int, key, value_int, value_string);&amp;lt;/code&amp;gt; ... note that this design was predicted, determined by Chris Webber to be gross, and was aimed to be avoided, hence the choice of MongoDB.  See [[Why MongoDB]] for details.&lt;br /&gt;
# Actually structure the things into distinct tables. The above mentioned imaginary geolocation extension would have its own table with lat/lon fields and be able to perform efficient queries on it.&lt;br /&gt;
&lt;br /&gt;
== Pros and Cons ==&lt;br /&gt;
&lt;br /&gt;
=== MongoDB ===&lt;br /&gt;
&lt;br /&gt;
==== Pros ====&lt;br /&gt;
* Allows you to lazily flexibly store stuff like multiple media type information, plugin data, etc&lt;br /&gt;
* Supposedly scales up really well!&lt;br /&gt;
* Programming interface feels clean and pythonic.&lt;br /&gt;
* Migrations + flexible stuff might be a bit easier&lt;br /&gt;
* Shows a lot of promise&lt;br /&gt;
* Seems to be pretty fast if you have the right resources and carefully tuned your database&lt;br /&gt;
* We&#039;ve already built our tooling around it!&lt;br /&gt;
&lt;br /&gt;
==== Cons ====&lt;br /&gt;
&lt;br /&gt;
* Much, much more resource dependent on low and middle scale deployments than SQL would be&lt;br /&gt;
* Seems like you have to really tune your server around the database&lt;br /&gt;
* Have to think super carefully about indexes and (mostly) construct one index per common query.  (That&#039;s a bit misleading, but pretty close to the truth.)  Furthermore, one feels wary of creating more indexes because memory mapping means each index (and so each query) sucks up even more RAM. (At scale you also have to think about indexes for relational databases.) &lt;br /&gt;
* &amp;quot;On the fly&amp;quot; queries not so easy, could be much more expensive than &lt;br /&gt;
* No joins (normalized data on insertion to obviate the need for joins)&lt;br /&gt;
* How much do we really care about scaling up on the database layer anyway? (What&#039;s the expected write-load of media-goblin.) &lt;br /&gt;
** DeviantArt at Libre Graphics Meeting 2011 expressed that SQL + memcached works just fine for them and didn&#039;t think more complex things were necessary.  That&#039;s a huge install base, and it seems hard to believe that MediaGoblin sites will hit that scale level. (How big is/are their SQL box/en? With automatic-sharding, MognoDB might be able to give better write performance per-dollar than SQL solutions of the same size.)&lt;br /&gt;
** We&#039;re much more likely to run into media scaling issues before database scaling issues&lt;br /&gt;
** In an ideal federated world, scaling down might be more important than scaling up because everyone will be running their own servers&lt;br /&gt;
* In the end, flexibility doesn&#039;t seem to be worth much because you can&#039;t really do arbitrary queries on stuff you dump in if you want it to have any sort of speed whatsoever because of indexing considerations. (Good SQL schema design, and performance limitations of joins presents similar limitations.)&lt;br /&gt;
* Though promising looking and solutions to issues keep coming up fast and hitting the core software it&#039;s also very new and not as well established.&lt;br /&gt;
* It&#039;s not like migrations entirely disappeared, but they&#039;re probably easier with certain flexible things&lt;br /&gt;
* Every few weeks someone brings up an SQL backend ;)&lt;br /&gt;
&lt;br /&gt;
=== SQL(alchemy) ===&lt;br /&gt;
&lt;br /&gt;
==== Pros ====&lt;br /&gt;
&lt;br /&gt;
* Scales down and up pretty well (possibly not as high up as MongoDB but again if it&#039;s high enough for DeviantArt...) and scaling down really does matter in our case&lt;br /&gt;
* Developers are generally pretty used to it&lt;br /&gt;
* SQLAlchemy has a really strong and established codebase&lt;br /&gt;
* Arbitrary, unplanned queries!&lt;br /&gt;
* Flexible schemas still possible but in some different ways (but not as nicely directly and certainly in no way as loosely flexible)&lt;br /&gt;
* Extremely well established.&lt;br /&gt;
&lt;br /&gt;
==== Cons ====&lt;br /&gt;
&lt;br /&gt;
* Would mean a *lot* of rewriting!&lt;br /&gt;
* Would mean having to write a careful migration path from mongodb-&amp;gt;SQL!&lt;br /&gt;
* Not as directly flexible as MongoDB (though we can design cleverly for a certain type of flexibility)&lt;br /&gt;
* Migrations with certain types of database flexibility could break in really irritating for users (and people helping the users) ways&lt;br /&gt;
* Working on this move could slow down other work or be hard to coordinate in parallell with other development&lt;br /&gt;
* Probably does not scale up quite as high (again, it&#039;d have to be &amp;quot;much higher than deviantart&amp;quot;, which sounds like an unlikely problem we&#039;d like to have)&lt;br /&gt;
* Rewriting could possibly hurt our momentum in a serious way, especially if there&#039;s a feature freeze during the transition (and if there isn&#039;t, merging in master could become a real irritation)... even if we agree to do a rewrite, would we want to wait a while to do so? (Alternately, waiting to rewrite means the rewrite just gets harder.)&lt;br /&gt;
&lt;br /&gt;
== Statements by some developers ==&lt;br /&gt;
=== Chris Webber&#039;s weigh-in ===&lt;br /&gt;
&lt;br /&gt;
So I think several things about the whole possible move to SQL.&lt;br /&gt;
&lt;br /&gt;
First of all, after having written out the Pros &amp;amp; Cons of each, it&lt;br /&gt;
seems like maybe MongoDB is a lot of extra complexity and not gains in&lt;br /&gt;
the areas I expected it to be.  The supposed win wasn&#039;t scaling (and&lt;br /&gt;
as predicted, scaling down has been something we&#039;ve had to work around&lt;br /&gt;
carefully), it was flexibility.  Does MongoDB allow for extra&lt;br /&gt;
flexibility?  (And we *do* need flexibility for MediaGoblin&#039;s design.)&lt;br /&gt;
Yes in the sense that you can dump in whatever, but if you intend to&lt;br /&gt;
query on any of those attributes, it&#039;s mostly no.  Indexes are&lt;br /&gt;
expensive, and we have to spend a lot of time carefully pussyfooting&lt;br /&gt;
around them.&lt;br /&gt;
&lt;br /&gt;
While planning MediaGoblin, I knew that there were two patterns for&lt;br /&gt;
making things flexible in SQL... one of them is the table with &amp;quot;key,&lt;br /&gt;
value, type&amp;quot;.  I thought that was unacceptably gross, and still do&lt;br /&gt;
think so.&lt;br /&gt;
&lt;br /&gt;
The other option is that you have a &amp;quot;main&amp;quot; table (like MediaEntry), it&lt;br /&gt;
references what &amp;quot;type&amp;quot; it is (such as &amp;quot;video&amp;quot;, &amp;quot;image&amp;quot;, whatever), and&lt;br /&gt;
external tables for the extra information for that type point to the&lt;br /&gt;
MediaEntry via a foreignkey and provide whatever media type specific&lt;br /&gt;
data.  Similarly, use external tables for plugins.  The main reason I&lt;br /&gt;
didn&#039;t want to deal with this is because I imagined migrations&lt;br /&gt;
becoming a convoluted mess.  It wasn&#039;t that we *wouldn&#039;t need*&lt;br /&gt;
migrations in MongoDB, it&#039;s that maybe migrations would be less&lt;br /&gt;
nightmarish with extensible stuff involved.  In retrospect this was&lt;br /&gt;
pretty reactive to a number of frustrating times I&#039;ve had to try and&lt;br /&gt;
walk people through broken migrations.  But I&#039;m getting the sense that&lt;br /&gt;
I&#039;ll have to walk people through database complexity or breakage as&lt;br /&gt;
much or more in MongoDB, and the complexity of managing indexes for&lt;br /&gt;
any sort of extensibility is as bad or worse than dealing with&lt;br /&gt;
migrations with an extensible SQL setup.&lt;br /&gt;
&lt;br /&gt;
So, okay.  I think I just made a pretty compelling case for moving&lt;br /&gt;
back to SQL.  So what then?&lt;br /&gt;
&lt;br /&gt;
Two options have been proposed: try and support both SQL and MongoDB&lt;br /&gt;
at the same time, or create a branch that switches from MongoDB to&lt;br /&gt;
SQL.  I&#039;m afraid that the former just doesn&#039;t sound like a good idea&lt;br /&gt;
to me at all... it seems like it&#039;ll result in a system with a&lt;br /&gt;
massively bloated codebase, hard for new contributors to work with,&lt;br /&gt;
hard to maintain, and &amp;quot;worst of both worlds&amp;quot; types compromises.  Think&lt;br /&gt;
about this for a second: how do you map things like migrations,&lt;br /&gt;
indexing, etc over?  Do we really want to completely rewrite the&lt;br /&gt;
MongoDB query tools over to SQL?  Some people have said that &amp;quot;it looks&lt;br /&gt;
like we have a pretty simple use of MongoDB so this layer won&#039;t be so&lt;br /&gt;
complex.&amp;quot;  To me that sounds like classic hacker &amp;quot;well that can&#039;t be&lt;br /&gt;
so hard&amp;quot; underestimation of the complexity of the problem.  Anyway, I&lt;br /&gt;
already see a ton of complexities, and I&#039;m sure there are more I&lt;br /&gt;
haven&#039;t even been able to see.&lt;br /&gt;
&lt;br /&gt;
So the remaining option is to do a branch to switch from MongoDB -&amp;gt;&lt;br /&gt;
SQL.  There&#039;s some risk of this also... it&#039;s hard to maintain a big&lt;br /&gt;
overhaul branch while the mainline is constantly changing.  There&#039;s&lt;br /&gt;
also a risk of fracturing, and if we change our mind and stay with&lt;br /&gt;
MongoDB, there&#039;s even a risk of forking!  Not to mention that working&lt;br /&gt;
on a branch that&#039;s so huge that doesn&#039;t get pulled in is incredibly&lt;br /&gt;
demoralizing.&lt;br /&gt;
&lt;br /&gt;
But we can reduce all those risks if we can come to a *consensus* that&lt;br /&gt;
this is what we want to do.  So I propose at the next meeting we&lt;br /&gt;
discuss this and try to make sure we&#039;re at community consensus before&lt;br /&gt;
agreeing to move to SQL (if that&#039;s indeed what we intend to do) and if&lt;br /&gt;
we do so, move to SQL *entirely*.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s what I envision the path to that future will look like:&lt;br /&gt;
&lt;br /&gt;
* Create a branch that prototypes all the models being switched over to SQLAlchemy, included &amp;quot;multiple media types&amp;quot; implemented with a friendly API.&lt;br /&gt;
* Assuming that works nice, continue work in that branch to switch all code over to using SQL.&lt;br /&gt;
* Figure out how to do migrations nicely in SQL, including with multiple media types (I have some thoughts on how to do this &amp;quot;nicely&amp;quot;)&lt;br /&gt;
* Create a MongoDB-&amp;gt;SQL migration tool&lt;br /&gt;
&lt;br /&gt;
Anyway, let&#039;s discuss this at next meeting!&lt;br /&gt;
&lt;br /&gt;
=== Elrond&#039;s comments ===&lt;br /&gt;
I&#039;m quite with Chris Webber here.&lt;br /&gt;
&lt;br /&gt;
One thing, I have to add/where I&#039;m thinking a bit different: We should try to identify tasks in the sql-migration that can be done just &amp;quot;now&amp;quot;. What does that mean? Moving to sql(alchemy) means a lot of changes. And some of these changes can be done with the mongodb backend as well. For example we&#039;re currently changing the document attribute access over from &amp;lt;code&amp;gt;doc[&amp;quot;field&amp;quot;]&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;doc.field&amp;lt;/code&amp;gt;. This does not hurt the current code (mostly) and makes the remaining &amp;quot;move to sql(alchemy)&amp;quot; easier. This reduces the amount of work happening in a long term branch. And that&#039;s the critical work (can be dropped, is demotivating, ...). So moving as much work as possible before actually starting the sql branch will increase motivation and decrease chances of failure. This sounds like more work, because the same code possibly needs to be touched twice. This might be true. It might also mean more work, as we might need to create some extra support code to assist in moving to a new idea. I still think, this is better, because it&#039;s outside of this long lived branch.&lt;br /&gt;
&lt;br /&gt;
== Planing the Migration to SQL ==&lt;br /&gt;
This chapter contains some ideas, sketches, schedules, whatever developers feel they need to create a big plan.&lt;br /&gt;
&lt;br /&gt;
=== Some sketchup in SQL ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
create table users(&lt;br /&gt;
   id integer primary key not null,&lt;br /&gt;
   username varchar(30) unique not null,&lt;br /&gt;
   email text unique,&lt;br /&gt;
   created timestamp default CURRENT_TIMESTAMP,&lt;br /&gt;
   pw_hash text,&lt;br /&gt;
   email_verified boolean default FALSE,&lt;br /&gt;
   status varchar(30) default &#039;needs_email_verification&#039;,&lt;br /&gt;
   verification_key uuid,&lt;br /&gt;
   is_admin boolean default FALSE,&lt;br /&gt;
   url text,&lt;br /&gt;
   bio text,&lt;br /&gt;
   fp_verification_key uuid,&lt;br /&gt;
   fp_token_expire timestamp&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
create table file_records(&lt;br /&gt;
   id integer primary key not null,&lt;br /&gt;
   filename text array -- or json?&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
create table media_entries(&lt;br /&gt;
   id integer primary key not null,&lt;br /&gt;
   uploader integer references users(id) not null,&lt;br /&gt;
   title text,&lt;br /&gt;
   slug text,&lt;br /&gt;
   created timestamp default CURRENT_TIMESTAMP,&lt;br /&gt;
   description text,&lt;br /&gt;
   state text default &#039;unprocessed&#039;,&lt;br /&gt;
   queued_media_file integer references file_records(id),&lt;br /&gt;
   queued_task_id text,&lt;br /&gt;
   fail_error text,&lt;br /&gt;
   fail_metadata text -- json&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
create table media_files(&lt;br /&gt;
   id integer primary key not null,&lt;br /&gt;
   media_id integer references media_entries(id) not null,&lt;br /&gt;
   name varchar(30) not null,&lt;br /&gt;
      -- &amp;quot;original&amp;quot;, &amp;quot;thumbnail&amp;quot;, ...&lt;br /&gt;
      -- maybe also &amp;quot;attachment&amp;quot;-something?&lt;br /&gt;
   file integer references file_records(id) not null&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
create table media_comments(&lt;br /&gt;
   id integer primary key not null,&lt;br /&gt;
   media_entry integer references media_entries(id) not null,&lt;br /&gt;
   author integer references users(id) not null,&lt;br /&gt;
   created timestamp default CURRENT_TIMESTAMP,&lt;br /&gt;
   content text&lt;br /&gt;
   );&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Migration needs ===&lt;br /&gt;
&lt;br /&gt;
If we switch to SQL(Alchemy), we&#039;ll need to handle migrations.  This seems to have three requirements:&lt;br /&gt;
&lt;br /&gt;
# It has to be easy for users (as easy or easier than ./bin/gmg migrate)&lt;br /&gt;
# It has to be easy for developers&lt;br /&gt;
# It has to be able to handle our &amp;quot;extensible&amp;quot; infrastructure.  There will have to be separately handled migrations for MediaGoblin core, as well as for each media type and plugin.  All while remaining pretty simple!&lt;br /&gt;
&lt;br /&gt;
As far as I can tell, this should be pretty possible.  We have three options:&lt;br /&gt;
&lt;br /&gt;
# Completely roll our own system based off of SQLAlchemy&lt;br /&gt;
# Use [http://readthedocs.org/docs/sqlalchemy-migrate/en/latest/ SQLAlchemy-migrate]&lt;br /&gt;
# Roll our own system that uses components of SQLAlchemy-migrate.&lt;br /&gt;
&lt;br /&gt;
One way or another I suspect we are going with option 2 or 3.  SQLAlchemy-migrate provides some useful extensions to SQLAlchemy that are database related but can be used outside of SQLAlchemy-migrate&#039;s &amp;quot;complete tooling&amp;quot;, namely the [http://readthedocs.org/docs/sqlalchemy-migrate/en/v0.7.2/changeset.html#changeset-system changeset system].  Using the whole tooling system provides some cool stuff like some experimental auto-migration-detection, but might fall short in handling our extensible infrastructure... it&#039;s not clear yet.&lt;br /&gt;
&lt;br /&gt;
Whatever we do, it looks like we can probably fit our 3 needs using option #2 or option #3.  That&#039;s good!&lt;br /&gt;
&lt;br /&gt;
=== SQL switch tentative action plan ===&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a tentative plan of what an action plan for switching to SQL(alchemy).&lt;br /&gt;
&lt;br /&gt;
Items marked with (*) might or should be done before the actual sql branch is created. Meaning, they can likely be done &amp;quot;in master&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
# Port all models to SQLAlchemy models. (*)&lt;br /&gt;
# Make sure that port includes a nice way to handle media types in an extensible way! (*)&lt;br /&gt;
# Add filepath conversion tools (basically write 2 simple functions to switch filepaths -&amp;gt; slash-joined-strings and back.), use them everywhere (*)&lt;br /&gt;
# Add easy-database-init ./bin/gmg function (*)&lt;br /&gt;
# Port all code over to using sqlalchemy&lt;br /&gt;
# Add db-migrations tools (*)&lt;br /&gt;
# Add a mongodb-&amp;gt;SQL converter script (*)&lt;br /&gt;
# ???&lt;br /&gt;
# Profit!!! (Sorry, obligatory)&lt;br /&gt;
&lt;br /&gt;
== Testing SQL ==&lt;br /&gt;
As the SQL stuff in master starts to get somewhat useable, we would like to invite adventurous/experienced users/developers to try it out and give us feedback.&lt;br /&gt;
&lt;br /&gt;
WARNING: The SQL code is still in flux, so don&#039;t put any valuable data in your SQL based setup. For example the schema might still change in an incompatible way. When the switch to SQL has happened, there will of course be migrations to keep all data across schema changes.&lt;br /&gt;
&lt;br /&gt;
=== Setting the SQL database ===&lt;br /&gt;
The default is an sqlite database &amp;lt;code&amp;gt;mediagoblin.db&amp;lt;/code&amp;gt; next to your config file. If you want to change that, put a variable &amp;lt;code&amp;gt;sql_engine&amp;lt;/code&amp;gt; into the &amp;lt;code&amp;gt;[mediagoblin]&amp;lt;/code&amp;gt; section. It is an sqlalchemy engine URI.&lt;br /&gt;
&lt;br /&gt;
=== Testing the conversion tool ===&lt;br /&gt;
So you want to convert your existing mongo data into the sql database. Maybe just to look at the resulting database layout and the data in there? It&#039;s easy:&lt;br /&gt;
# Configure your database uri (see above)&lt;br /&gt;
# Clean your database, drop all previous tables.&lt;br /&gt;
# Run this command:&lt;br /&gt;
 bin/gmg [-cf your_mediagoblin.ini] convert_mongo_to_sql&lt;br /&gt;
&lt;br /&gt;
=== Creating a new empty database (and later: keeping it current) ===&lt;br /&gt;
Very simple:&lt;br /&gt;
# Configure your database uri (see above)&lt;br /&gt;
# Run this:&lt;br /&gt;
 bin/gmg [-cf your_mediagoblin.ini] dbupdate&lt;br /&gt;
&lt;br /&gt;
=== Switching mediagoblin to SQL ===&lt;br /&gt;
Not as simple.&lt;br /&gt;
To enable:&lt;br /&gt;
* You need to create a file named &amp;lt;code&amp;gt;mediagoblin/db/sql_switch.py&amp;lt;/code&amp;gt; and put one this in it: &amp;lt;code&amp;gt;use_sql = True&amp;lt;/code&amp;gt;&lt;br /&gt;
To disable:&lt;br /&gt;
* Either delete &amp;lt;code&amp;gt;mediagoblin/db/sql_switch.py&amp;lt;/code&amp;gt; AND &amp;lt;code&amp;gt;mediagoblin/db/sql_switch.pyc&amp;lt;/code&amp;gt;&lt;br /&gt;
* Or: Change the contents to: &amp;lt;code&amp;gt;use_sql = False&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will switch the whole code base to use the SQL backend instead of the mongo backend.&lt;/div&gt;</summary>
		<author><name>Elrond</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=GSOC_2012&amp;diff=585</id>
		<title>GSOC 2012</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=GSOC_2012&amp;diff=585"/>
		<updated>2012-03-03T18:16:02Z</updated>

		<summary type="html">&lt;p&gt;Elrond: ideas: ACLs and timeline&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;We are applying to be a mentoring organization for Google Summer of Code 2012 this year.&lt;br /&gt;
&lt;br /&gt;
At the time of writing we haven&#039;t been accepted yet, but here are some ideas the team had collected:&lt;br /&gt;
&lt;br /&gt;
== How do I apply as a student? ==&lt;br /&gt;
&lt;br /&gt;
Well, we need to be accepted as a mentoring org first :)&lt;br /&gt;
&lt;br /&gt;
But then:&lt;br /&gt;
* Submit your application (details coming soon)&lt;br /&gt;
* [http://mediagoblin.org/pages/join.html Join us] on IRC and on our mailing lists&lt;br /&gt;
* Set up a development environment via our [[HackingHowto]]&lt;br /&gt;
&lt;br /&gt;
It&#039;s important that you communicate... most MediaGoblin communication happens on IRC, so you should join there and discuss!&lt;br /&gt;
&lt;br /&gt;
== Ideas ==&lt;br /&gt;
&lt;br /&gt;
* More thorough tests; add test coverage script&lt;br /&gt;
* Multi-file submission tool&lt;br /&gt;
* Drag and drop file submission&lt;br /&gt;
* LDAP or other central authentication system plugin&lt;br /&gt;
* &amp;quot;podcast feed&amp;quot; support&lt;br /&gt;
* [http://lists.mediagoblin.org/pipermail/devel/2011-December/000107.html Kuneco] development (OStatus federatoin library)&lt;br /&gt;
** Next generation lxml-based feed support&lt;br /&gt;
** PubSubHubbub hub WSGI application&lt;br /&gt;
* Improved commenting&lt;br /&gt;
** Comment feeds&lt;br /&gt;
** Notification about new comments&lt;br /&gt;
*** By e-mail&lt;br /&gt;
*** &amp;quot;you have a new comment&amp;quot;?&lt;br /&gt;
&lt;br /&gt;
=== &amp;quot;ACL&amp;quot; &amp;amp;mdash; Access Control Lists ===&lt;br /&gt;
Short description:&lt;br /&gt;
The idea basicly is: Some people only want to show some media to certain people. And possibly allow comments only from them.&lt;br /&gt;
&lt;br /&gt;
Some details:&lt;br /&gt;
* As OStatus isn&#039;t there yet, this all will be local only, for now.&lt;br /&gt;
* Sketching up details of this will be part of the project.&lt;br /&gt;
* Details might be things like:&lt;br /&gt;
** Adding people to a group (say &amp;quot;family&amp;quot;) first and only adding groups to a media&#039;s &amp;quot;viewing list&amp;quot;.&lt;br /&gt;
** Multiple permissions, like &amp;quot;view&amp;quot;, &amp;quot;may comment&amp;quot;, &amp;quot;may add tags&amp;quot;, ...&lt;br /&gt;
* The starting system should probably be simple, so that it can later be exteneded in any needed way. Or made easily compatible with anything OStatus might come up for distributed access.&lt;br /&gt;
&lt;br /&gt;
=== timeline ===&lt;br /&gt;
Very short description:&lt;br /&gt;
&amp;quot;See what&#039;s new around you&amp;quot;. Have page showing news about your media, your friends, your subscribed feeds, etc. schendje had some ideas on this...&lt;/div&gt;</summary>
		<author><name>Elrond</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=SQL_Database_Backend&amp;diff=582</id>
		<title>SQL Database Backend</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=SQL_Database_Backend&amp;diff=582"/>
		<updated>2012-03-02T23:37:53Z</updated>

		<summary type="html">&lt;p&gt;Elrond: Start some basic testing docs&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
MediaGoblin currently uses MongoDB as its database backend. There have been various reasons for this decision (see: [[Why MongoDB]], yes really, look at it. It has a lot of insight what are the problems with sql). Still, the idea of an SQL backend is coming up from time to time.&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
The existence of this wiki page does not give any evidence of the SQL backend getting developed soon!&lt;br /&gt;
&lt;br /&gt;
== People ==&lt;br /&gt;
Even an experimental implementation of an SQL backend, that will only support basic features will need a good amount of time/energy from some (core) developers. That time/energy will not be available to other projects.&lt;br /&gt;
* Some knowing sqlalchemy is needed.&lt;br /&gt;
* Someone having a good idea on the thin db layer is needed (Elrond will most likely be available for helping)&lt;br /&gt;
* Someone having an idea on the current queries used in the code is needed too.&lt;br /&gt;
&lt;br /&gt;
== Development models ==&lt;br /&gt;
* The biggest question is: Do we want to try an experimental sql backend? This is a tricky question. If it fails, it will be a lot of wasted time/energy. And contributors wouldn&#039;t be happy to have wasted their time/energy.&lt;br /&gt;
* The wasted time/energy could be limited by limiting the first target. For example one could dedide, that the sql backend is not intended to support the full feature set.&lt;br /&gt;
* Then there is the question on how to develop this:&lt;br /&gt;
*# Long term branch: Develop an SQL replacement in a long term branch. The good: Anything can be changed as needed. Not so good: Some people dislike long term branches for various reasons.&lt;br /&gt;
*# Trying to develop this alongside the current backend, in tree.&lt;br /&gt;
&lt;br /&gt;
== Major Issues ==&lt;br /&gt;
The current db model uses dicts to allow flexible storage for extensions and different media types. Representing these data in SQL is not simple. The dicts are normally keyed by a string and have arbitrary values. There are basically two ways:&lt;br /&gt;
&lt;br /&gt;
# Have a table with a key column (string) and a value column (string, json encoded). This will allow easy reconstruction of the dict for an object fetch and will allow queries on the key of the dict.&lt;br /&gt;
#: &#039;&#039;However&#039;&#039;, it will not allow queries on the values. For example the imaginary geolocation extension will store the lat/lon there and might want to search for other media &amp;quot;nearby&amp;quot;.&lt;br /&gt;
#: If the value column is split into three columns (i.e. &amp;lt;code&amp;gt;value_int value_string value_json&amp;lt;/code&amp;gt;), some queries, such as those on numbers, would be possible. .&lt;br /&gt;
#: &#039;&#039;&#039;Note:&#039;&#039;&#039; The table would actually look something like this: &amp;lt;code&amp;gt;create table super_data_table(media_id references media(id), plugin_id int, key, value_int, value_string);&amp;lt;/code&amp;gt; ... note that this design was predicted, determined by Chris Webber to be gross, and was aimed to be avoided, hence the choice of MongoDB.  See [[Why MongoDB]] for details.&lt;br /&gt;
# Actually structure the things into distinct tables. The above mentioned imaginary geolocation extension would have its own table with lat/lon fields and be able to perform efficient queries on it.&lt;br /&gt;
&lt;br /&gt;
== Pros and Cons ==&lt;br /&gt;
&lt;br /&gt;
=== MongoDB ===&lt;br /&gt;
&lt;br /&gt;
==== Pros ====&lt;br /&gt;
* Allows you to lazily flexibly store stuff like multiple media type information, plugin data, etc&lt;br /&gt;
* Supposedly scales up really well!&lt;br /&gt;
* Programming interface feels clean and pythonic.&lt;br /&gt;
* Migrations + flexible stuff might be a bit easier&lt;br /&gt;
* Shows a lot of promise&lt;br /&gt;
* Seems to be pretty fast if you have the right resources and carefully tuned your database&lt;br /&gt;
* We&#039;ve already built our tooling around it!&lt;br /&gt;
&lt;br /&gt;
==== Cons ====&lt;br /&gt;
&lt;br /&gt;
* Much, much more resource dependent on low and middle scale deployments than SQL would be&lt;br /&gt;
* Seems like you have to really tune your server around the database&lt;br /&gt;
* Have to think super carefully about indexes and (mostly) construct one index per common query.  (That&#039;s a bit misleading, but pretty close to the truth.)  Furthermore, one feels wary of creating more indexes because memory mapping means each index (and so each query) sucks up even more RAM. (At scale you also have to think about indexes for relational databases.) &lt;br /&gt;
* &amp;quot;On the fly&amp;quot; queries not so easy, could be much more expensive than &lt;br /&gt;
* No joins (normalized data on insertion to obviate the need for joins)&lt;br /&gt;
* How much do we really care about scaling up on the database layer anyway? (What&#039;s the expected write-load of media-goblin.) &lt;br /&gt;
** DeviantArt at Libre Graphics Meeting 2011 expressed that SQL + memcached works just fine for them and didn&#039;t think more complex things were necessary.  That&#039;s a huge install base, and it seems hard to believe that MediaGoblin sites will hit that scale level. (How big is/are their SQL box/en? With automatic-sharding, MognoDB might be able to give better write performance per-dollar than SQL solutions of the same size.)&lt;br /&gt;
** We&#039;re much more likely to run into media scaling issues before database scaling issues&lt;br /&gt;
** In an ideal federated world, scaling down might be more important than scaling up because everyone will be running their own servers&lt;br /&gt;
* In the end, flexibility doesn&#039;t seem to be worth much because you can&#039;t really do arbitrary queries on stuff you dump in if you want it to have any sort of speed whatsoever because of indexing considerations. (Good SQL schema design, and performance limitations of joins presents similar limitations.)&lt;br /&gt;
* Though promising looking and solutions to issues keep coming up fast and hitting the core software it&#039;s also very new and not as well established.&lt;br /&gt;
* It&#039;s not like migrations entirely disappeared, but they&#039;re probably easier with certain flexible things&lt;br /&gt;
* Every few weeks someone brings up an SQL backend ;)&lt;br /&gt;
&lt;br /&gt;
=== SQL(alchemy) ===&lt;br /&gt;
&lt;br /&gt;
==== Pros ====&lt;br /&gt;
&lt;br /&gt;
* Scales down and up pretty well (possibly not as high up as MongoDB but again if it&#039;s high enough for DeviantArt...) and scaling down really does matter in our case&lt;br /&gt;
* Developers are generally pretty used to it&lt;br /&gt;
* SQLAlchemy has a really strong and established codebase&lt;br /&gt;
* Arbitrary, unplanned queries!&lt;br /&gt;
* Flexible schemas still possible but in some different ways (but not as nicely directly and certainly in no way as loosely flexible)&lt;br /&gt;
* Extremely well established.&lt;br /&gt;
&lt;br /&gt;
==== Cons ====&lt;br /&gt;
&lt;br /&gt;
* Would mean a *lot* of rewriting!&lt;br /&gt;
* Would mean having to write a careful migration path from mongodb-&amp;gt;SQL!&lt;br /&gt;
* Not as directly flexible as MongoDB (though we can design cleverly for a certain type of flexibility)&lt;br /&gt;
* Migrations with certain types of database flexibility could break in really irritating for users (and people helping the users) ways&lt;br /&gt;
* Working on this move could slow down other work or be hard to coordinate in parallell with other development&lt;br /&gt;
* Probably does not scale up quite as high (again, it&#039;d have to be &amp;quot;much higher than deviantart&amp;quot;, which sounds like an unlikely problem we&#039;d like to have)&lt;br /&gt;
* Rewriting could possibly hurt our momentum in a serious way, especially if there&#039;s a feature freeze during the transition (and if there isn&#039;t, merging in master could become a real irritation)... even if we agree to do a rewrite, would we want to wait a while to do so? (Alternately, waiting to rewrite means the rewrite just gets harder.)&lt;br /&gt;
&lt;br /&gt;
== Statements by some developers ==&lt;br /&gt;
=== Chris Webber&#039;s weigh-in ===&lt;br /&gt;
&lt;br /&gt;
So I think several things about the whole possible move to SQL.&lt;br /&gt;
&lt;br /&gt;
First of all, after having written out the Pros &amp;amp; Cons of each, it&lt;br /&gt;
seems like maybe MongoDB is a lot of extra complexity and not gains in&lt;br /&gt;
the areas I expected it to be.  The supposed win wasn&#039;t scaling (and&lt;br /&gt;
as predicted, scaling down has been something we&#039;ve had to work around&lt;br /&gt;
carefully), it was flexibility.  Does MongoDB allow for extra&lt;br /&gt;
flexibility?  (And we *do* need flexibility for MediaGoblin&#039;s design.)&lt;br /&gt;
Yes in the sense that you can dump in whatever, but if you intend to&lt;br /&gt;
query on any of those attributes, it&#039;s mostly no.  Indexes are&lt;br /&gt;
expensive, and we have to spend a lot of time carefully pussyfooting&lt;br /&gt;
around them.&lt;br /&gt;
&lt;br /&gt;
While planning MediaGoblin, I knew that there were two patterns for&lt;br /&gt;
making things flexible in SQL... one of them is the table with &amp;quot;key,&lt;br /&gt;
value, type&amp;quot;.  I thought that was unacceptably gross, and still do&lt;br /&gt;
think so.&lt;br /&gt;
&lt;br /&gt;
The other option is that you have a &amp;quot;main&amp;quot; table (like MediaEntry), it&lt;br /&gt;
references what &amp;quot;type&amp;quot; it is (such as &amp;quot;video&amp;quot;, &amp;quot;image&amp;quot;, whatever), and&lt;br /&gt;
external tables for the extra information for that type point to the&lt;br /&gt;
MediaEntry via a foreignkey and provide whatever media type specific&lt;br /&gt;
data.  Similarly, use external tables for plugins.  The main reason I&lt;br /&gt;
didn&#039;t want to deal with this is because I imagined migrations&lt;br /&gt;
becoming a convoluted mess.  It wasn&#039;t that we *wouldn&#039;t need*&lt;br /&gt;
migrations in MongoDB, it&#039;s that maybe migrations would be less&lt;br /&gt;
nightmarish with extensible stuff involved.  In retrospect this was&lt;br /&gt;
pretty reactive to a number of frustrating times I&#039;ve had to try and&lt;br /&gt;
walk people through broken migrations.  But I&#039;m getting the sense that&lt;br /&gt;
I&#039;ll have to walk people through database complexity or breakage as&lt;br /&gt;
much or more in MongoDB, and the complexity of managing indexes for&lt;br /&gt;
any sort of extensibility is as bad or worse than dealing with&lt;br /&gt;
migrations with an extensible SQL setup.&lt;br /&gt;
&lt;br /&gt;
So, okay.  I think I just made a pretty compelling case for moving&lt;br /&gt;
back to SQL.  So what then?&lt;br /&gt;
&lt;br /&gt;
Two options have been proposed: try and support both SQL and MongoDB&lt;br /&gt;
at the same time, or create a branch that switches from MongoDB to&lt;br /&gt;
SQL.  I&#039;m afraid that the former just doesn&#039;t sound like a good idea&lt;br /&gt;
to me at all... it seems like it&#039;ll result in a system with a&lt;br /&gt;
massively bloated codebase, hard for new contributors to work with,&lt;br /&gt;
hard to maintain, and &amp;quot;worst of both worlds&amp;quot; types compromises.  Think&lt;br /&gt;
about this for a second: how do you map things like migrations,&lt;br /&gt;
indexing, etc over?  Do we really want to completely rewrite the&lt;br /&gt;
MongoDB query tools over to SQL?  Some people have said that &amp;quot;it looks&lt;br /&gt;
like we have a pretty simple use of MongoDB so this layer won&#039;t be so&lt;br /&gt;
complex.&amp;quot;  To me that sounds like classic hacker &amp;quot;well that can&#039;t be&lt;br /&gt;
so hard&amp;quot; underestimation of the complexity of the problem.  Anyway, I&lt;br /&gt;
already see a ton of complexities, and I&#039;m sure there are more I&lt;br /&gt;
haven&#039;t even been able to see.&lt;br /&gt;
&lt;br /&gt;
So the remaining option is to do a branch to switch from MongoDB -&amp;gt;&lt;br /&gt;
SQL.  There&#039;s some risk of this also... it&#039;s hard to maintain a big&lt;br /&gt;
overhaul branch while the mainline is constantly changing.  There&#039;s&lt;br /&gt;
also a risk of fracturing, and if we change our mind and stay with&lt;br /&gt;
MongoDB, there&#039;s even a risk of forking!  Not to mention that working&lt;br /&gt;
on a branch that&#039;s so huge that doesn&#039;t get pulled in is incredibly&lt;br /&gt;
demoralizing.&lt;br /&gt;
&lt;br /&gt;
But we can reduce all those risks if we can come to a *consensus* that&lt;br /&gt;
this is what we want to do.  So I propose at the next meeting we&lt;br /&gt;
discuss this and try to make sure we&#039;re at community consensus before&lt;br /&gt;
agreeing to move to SQL (if that&#039;s indeed what we intend to do) and if&lt;br /&gt;
we do so, move to SQL *entirely*.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s what I envision the path to that future will look like:&lt;br /&gt;
&lt;br /&gt;
* Create a branch that prototypes all the models being switched over to SQLAlchemy, included &amp;quot;multiple media types&amp;quot; implemented with a friendly API.&lt;br /&gt;
* Assuming that works nice, continue work in that branch to switch all code over to using SQL.&lt;br /&gt;
* Figure out how to do migrations nicely in SQL, including with multiple media types (I have some thoughts on how to do this &amp;quot;nicely&amp;quot;)&lt;br /&gt;
* Create a MongoDB-&amp;gt;SQL migration tool&lt;br /&gt;
&lt;br /&gt;
Anyway, let&#039;s discuss this at next meeting!&lt;br /&gt;
&lt;br /&gt;
=== Elrond&#039;s comments ===&lt;br /&gt;
I&#039;m quite with Chris Webber here.&lt;br /&gt;
&lt;br /&gt;
One thing, I have to add/where I&#039;m thinking a bit different: We should try to identify tasks in the sql-migration that can be done just &amp;quot;now&amp;quot;. What does that mean? Moving to sql(alchemy) means a lot of changes. And some of these changes can be done with the mongodb backend as well. For example we&#039;re currently changing the document attribute access over from &amp;lt;code&amp;gt;doc[&amp;quot;field&amp;quot;]&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;doc.field&amp;lt;/code&amp;gt;. This does not hurt the current code (mostly) and makes the remaining &amp;quot;move to sql(alchemy)&amp;quot; easier. This reduces the amount of work happening in a long term branch. And that&#039;s the critical work (can be dropped, is demotivating, ...). So moving as much work as possible before actually starting the sql branch will increase motivation and decrease chances of failure. This sounds like more work, because the same code possibly needs to be touched twice. This might be true. It might also mean more work, as we might need to create some extra support code to assist in moving to a new idea. I still think, this is better, because it&#039;s outside of this long lived branch.&lt;br /&gt;
&lt;br /&gt;
== Planing the Migration to SQL ==&lt;br /&gt;
This chapter contains some ideas, sketches, schedules, whatever developers feel they need to create a big plan.&lt;br /&gt;
&lt;br /&gt;
=== Some sketchup in SQL ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
create table users(&lt;br /&gt;
   id integer primary key not null,&lt;br /&gt;
   username varchar(30) unique not null,&lt;br /&gt;
   email text unique,&lt;br /&gt;
   created timestamp default CURRENT_TIMESTAMP,&lt;br /&gt;
   pw_hash text,&lt;br /&gt;
   email_verified boolean default FALSE,&lt;br /&gt;
   status varchar(30) default &#039;needs_email_verification&#039;,&lt;br /&gt;
   verification_key uuid,&lt;br /&gt;
   is_admin boolean default FALSE,&lt;br /&gt;
   url text,&lt;br /&gt;
   bio text,&lt;br /&gt;
   fp_verification_key uuid,&lt;br /&gt;
   fp_token_expire timestamp&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
create table file_records(&lt;br /&gt;
   id integer primary key not null,&lt;br /&gt;
   filename text array -- or json?&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
create table media_entries(&lt;br /&gt;
   id integer primary key not null,&lt;br /&gt;
   uploader integer references users(id) not null,&lt;br /&gt;
   title text,&lt;br /&gt;
   slug text,&lt;br /&gt;
   created timestamp default CURRENT_TIMESTAMP,&lt;br /&gt;
   description text,&lt;br /&gt;
   state text default &#039;unprocessed&#039;,&lt;br /&gt;
   queued_media_file integer references file_records(id),&lt;br /&gt;
   queued_task_id text,&lt;br /&gt;
   fail_error text,&lt;br /&gt;
   fail_metadata text -- json&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
create table media_files(&lt;br /&gt;
   id integer primary key not null,&lt;br /&gt;
   media_id integer references media_entries(id) not null,&lt;br /&gt;
   name varchar(30) not null,&lt;br /&gt;
      -- &amp;quot;original&amp;quot;, &amp;quot;thumbnail&amp;quot;, ...&lt;br /&gt;
      -- maybe also &amp;quot;attachment&amp;quot;-something?&lt;br /&gt;
   file integer references file_records(id) not null&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
create table media_comments(&lt;br /&gt;
   id integer primary key not null,&lt;br /&gt;
   media_entry integer references media_entries(id) not null,&lt;br /&gt;
   author integer references users(id) not null,&lt;br /&gt;
   created timestamp default CURRENT_TIMESTAMP,&lt;br /&gt;
   content text&lt;br /&gt;
   );&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Migration needs ===&lt;br /&gt;
&lt;br /&gt;
If we switch to SQL(Alchemy), we&#039;ll need to handle migrations.  This seems to have three requirements:&lt;br /&gt;
&lt;br /&gt;
# It has to be easy for users (as easy or easier than ./bin/gmg migrate)&lt;br /&gt;
# It has to be easy for developers&lt;br /&gt;
# It has to be able to handle our &amp;quot;extensible&amp;quot; infrastructure.  There will have to be separately handled migrations for MediaGoblin core, as well as for each media type and plugin.  All while remaining pretty simple!&lt;br /&gt;
&lt;br /&gt;
As far as I can tell, this should be pretty possible.  We have three options:&lt;br /&gt;
&lt;br /&gt;
# Completely roll our own system based off of SQLAlchemy&lt;br /&gt;
# Use [http://readthedocs.org/docs/sqlalchemy-migrate/en/latest/ SQLAlchemy-migrate]&lt;br /&gt;
# Roll our own system that uses components of SQLAlchemy-migrate.&lt;br /&gt;
&lt;br /&gt;
One way or another I suspect we are going with option 2 or 3.  SQLAlchemy-migrate provides some useful extensions to SQLAlchemy that are database related but can be used outside of SQLAlchemy-migrate&#039;s &amp;quot;complete tooling&amp;quot;, namely the [http://readthedocs.org/docs/sqlalchemy-migrate/en/v0.7.2/changeset.html#changeset-system changeset system].  Using the whole tooling system provides some cool stuff like some experimental auto-migration-detection, but might fall short in handling our extensible infrastructure... it&#039;s not clear yet.&lt;br /&gt;
&lt;br /&gt;
Whatever we do, it looks like we can probably fit our 3 needs using option #2 or option #3.  That&#039;s good!&lt;br /&gt;
&lt;br /&gt;
=== SQL switch tentative action plan ===&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a tentative plan of what an action plan for switching to SQL(alchemy).&lt;br /&gt;
&lt;br /&gt;
Items marked with (*) might or should be done before the actual sql branch is created. Meaning, they can likely be done &amp;quot;in master&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
# Port all models to SQLAlchemy models. (*)&lt;br /&gt;
# Make sure that port includes a nice way to handle media types in an extensible way! (*)&lt;br /&gt;
# Add filepath conversion tools (basically write 2 simple functions to switch filepaths -&amp;gt; slash-joined-strings and back.), use them everywhere (*)&lt;br /&gt;
# Add easy-database-init ./bin/gmg function (*)&lt;br /&gt;
# Port all code over to using sqlalchemy&lt;br /&gt;
# Add db-migrations tools (*)&lt;br /&gt;
# Add a mongodb-&amp;gt;SQL converter script (*)&lt;br /&gt;
# ???&lt;br /&gt;
# Profit!!! (Sorry, obligatory)&lt;br /&gt;
&lt;br /&gt;
== Testing SQL ==&lt;br /&gt;
As the SQL stuff in master starts to get somewhat useable, we would like to invite adventurous/experienced users/developers to try it out and give us feedback.&lt;br /&gt;
&lt;br /&gt;
WARNING: The SQL code is still in flux, so don&#039;t put any valuable data in your SQL based setup. For example the schema might still change in an incompatible way. When the switch to SQL has happened, there will of course be migrations to keep all data across schema changes.&lt;br /&gt;
&lt;br /&gt;
=== Setting the SQL database ===&lt;br /&gt;
The default is an sqlite database &amp;lt;code&amp;gt;mediagoblin.db&amp;lt;/code&amp;gt; next to your config file. If you want to change that, put a variable &amp;lt;code&amp;gt;sql_engine&amp;lt;/code&amp;gt; into the &amp;lt;code&amp;gt;[mediagoblin]&amp;lt;/code&amp;gt; section. It is an sqlalchemy engine URI.&lt;br /&gt;
&lt;br /&gt;
=== Testing the conversion tool ===&lt;br /&gt;
So you want to convert your existing mongo data into the sql database. Maybe just to look at the resulting database layout and the data in there? It&#039;s easy:&lt;br /&gt;
# Clean your database, drop all previous tables.&lt;br /&gt;
# Run this command:&lt;br /&gt;
 bin/gmg [-cf your_mediagoblin.ini] convert_mongo_to_sql&lt;/div&gt;</summary>
		<author><name>Elrond</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=Meeting&amp;diff=528</id>
		<title>Meeting</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=Meeting&amp;diff=528"/>
		<updated>2012-02-03T15:55:12Z</updated>

		<summary type="html">&lt;p&gt;Elrond: Agenda: Status update from the &amp;quot;SQL Team&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== MediaGoblin Monthly Meeting ==&lt;br /&gt;
&lt;br /&gt;
At 16:00 UTC the first saturday of each month, unless otherwise announced on the [http://lists.mediagoblin.org/pipermail/devel/ mailing list], there is an IRC meeting. The idea is to discuss the past month, what happened, what was good, what should be done better. And to create roadmap for the upcoming month and assign tasks to people willing to handle them.&lt;br /&gt;
&lt;br /&gt;
* [http://mediagoblin.org/irclogs/ IRC meeting logs]&lt;br /&gt;
&lt;br /&gt;
Typical Agenda topics:&lt;br /&gt;
* What happened in the last month, what was good, what could be better next time?&lt;br /&gt;
* What should be done next month?&lt;br /&gt;
&lt;br /&gt;
== Upcoming and Recent Meetings ==&lt;br /&gt;
&lt;br /&gt;
=== 2012-02 (planned for 2012-02-04) ===&lt;br /&gt;
&lt;br /&gt;
* Where: IRC #mediagoblin on irc.freenode.net&lt;br /&gt;
* When: Sat Feb  4 09:00:00 2012 Pacific Time (2012-02-04T17:00 UTC).&lt;br /&gt;
&lt;br /&gt;
Preliminary Agenda:&lt;br /&gt;
&lt;br /&gt;
* Code style guide?  See also: http://issues.mediagoblin.org/ticket/197&lt;br /&gt;
* Status update from the &amp;quot;SQL Team&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Past Meetings ==&lt;br /&gt;
&lt;br /&gt;
=== 2011-12 (held 2011-12-03) ===&lt;br /&gt;
&lt;br /&gt;
Preliminary Agenda (in progress):&lt;br /&gt;
&lt;br /&gt;
* We plan to create a plugin system.  Do we want to create that soon or push it off until things settle a bit more?  ([[User:Willkg|Willkg]] 08:54, 10 November 2011 (EST))&lt;br /&gt;
* [[Feature Ideas]]: What should we do about the wiki page? Keep it and have it as a monthly topic for &amp;quot;what next&amp;quot;? Convert everything to long waiting bugs?&lt;br /&gt;
* Possibility of an [[SQL Database Backend]]?&lt;br /&gt;
*: &#039;executive summary&#039; (well, you should read the long docs): &amp;quot;We could move to sql. It&#039;s probably replacing one type of pain by another type of pain, but those are somewhat comparable. Leaving the main question: Do we want to occupy our main devs for some long time with this task and loose momentum?&amp;quot;&lt;br /&gt;
* Schendje&#039;s [http://wiki.mediagoblin.org/Feature_Ideas/Activities activities proposal]&lt;br /&gt;
* &amp;quot;Coming up next&amp;quot; blogpost draft by Deb Nicholson&lt;br /&gt;
* Jef&#039;s requests:&lt;br /&gt;
** Ticket #466 &amp;quot;Use of &amp;quot;Submit&amp;quot; in site copy is sterile and not as friendly and welcoming as it could be&amp;quot;. I&#039;d really like to change this soon to something more suitable. How can we improve the wording here? Some alternatives have been mentioned in the bug report, but which one should we pick? Link: http://bugs.foocorp.net/issues/466&lt;br /&gt;
** The concept and naming of &amp;quot;favourites&amp;quot;. We&#039;ll (hopefully) be able to &amp;quot;favourite&amp;quot; media soon, which I *think* means that 1) it&#039;ll work like a &amp;quot;I like this&amp;quot; comment, a quick token of appreciation, 2) it&#039;ll be added to your list of favourites so you can save and promote it, and 3) we could maybe use the number of favourites as a ranking. What I&#039;d like to know is: is that the intended purpose? If so, should we name them favo(u)rites or something else? &amp;quot;Like&amp;quot;, &amp;quot;love&amp;quot;, &amp;quot;save&amp;quot;, &amp;quot;appreciate&amp;quot;, &amp;quot;heart&amp;quot;, &amp;quot;high five&amp;quot; and many more could all be contenders. And the name should be consistent with the action and purpose, of course. So I&#039;d like to clear up how and why we will use favourites and what we should call them.&lt;br /&gt;
&lt;br /&gt;
=== 2011-11 (held on 2011-11-05) ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Preliminary Agenda and preliminary results (in progress):&lt;br /&gt;
* What happened in the last month, what was good, what could be better next time?&lt;br /&gt;
** Release:&lt;br /&gt;
*** Good: 0.1.0 released!&lt;br /&gt;
*** Bad: postponing vs not postponing&lt;br /&gt;
** Sites and deployment documentation:&lt;br /&gt;
*** Good: new mediagoblin.org&lt;br /&gt;
*** Good: deployment documentation&lt;br /&gt;
*** Bad: py-bcrypt’s site was down just after the release, so the virtualenv deployment didn’t work, and it wasn’t clear how to fix it.&lt;br /&gt;
** Live instances:&lt;br /&gt;
*** Joar has a live instance!&lt;br /&gt;
*** But what does it mean? Should ordinary users start using it?&lt;br /&gt;
**** Details at [[User:Joar/mg.wandborg.se]] -- [[User:Joar|Joar]] 17:01, 6 November 2011 (EST)&lt;br /&gt;
*** nyergler added a note about &amp;quot;heartbeat&amp;quot;/status to API notes&lt;br /&gt;
* What should be done next month?&lt;br /&gt;
* Starting real work on federation (via OStatus)... and do we split any of this work out into its own library?&lt;br /&gt;
* An API&lt;br /&gt;
* Creative Commons licensing tools&lt;br /&gt;
* Merging in the multimedia/video branch&lt;br /&gt;
*: (this is *very close* already actually thanks to the hard work of Joar Wandborg!  But we need some help on the gstreamer front to fix a few issues... if you or someone you know is an expert in this area we could really use their help to make the videos that come out smoother!)&lt;br /&gt;
* Rollover items from 0.1.0&lt;br /&gt;
* Multiple file upload interface&lt;br /&gt;
* Drag and drop uploads interface (probably related!)&lt;br /&gt;
&lt;br /&gt;
[http://mediagoblin.org/irclogs/irc_meeting_2011-11-05.txt IRC log]&lt;br /&gt;
&lt;br /&gt;
=== 2011-10 (held on 2011-10-01) ===&lt;br /&gt;
This month&#039;s meeting was a quickly announced short meeting. The project is getting back on track and next month&#039;s meeting will be scheduled more properly. A bunch of people were around.&lt;br /&gt;
&lt;br /&gt;
The most important decisions:&lt;br /&gt;
* The project will keep monthly releases. They&#039;re the heartbeat of the project.&lt;br /&gt;
* Release 0.1.0 this sunday/monday.&lt;br /&gt;
* New website will hopefully be deployed in the next few days.&lt;br /&gt;
* And the following things are planned to happen during this month: Most importantly federation. The developers have decided to make up their minds on what federation aactually should mean for MediaGoblin. Concerning code, probably &amp;quot;activity streams&amp;quot; are the first goal. If there is no (good) python library for this, a new stand alone library may be created. If so, a name for it has to be found. It should have something about communication in it. And the other thing to happen during this month is an ongoing discussion about &amp;quot;bus factor&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* [http://mediagoblin.org/irclogs/irc_meeting_2011-10-01.txt IRC log]&lt;br /&gt;
&lt;br /&gt;
=== 2011-09 (held on 2011-09-03) ===&lt;br /&gt;
&lt;br /&gt;
* [http://mediagoblin.org/irclogs/irc_meeting_2011-09-03.txt IRC log]&lt;br /&gt;
&lt;br /&gt;
=== 2011-08 (held on 2011-08-06) ===&lt;br /&gt;
&lt;br /&gt;
* [http://mediagoblin.org/irclogs/irc_meeting_2011-08-06.txt IRC log]&lt;/div&gt;</summary>
		<author><name>Elrond</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=SQL_Database_Backend&amp;diff=423</id>
		<title>SQL Database Backend</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=SQL_Database_Backend&amp;diff=423"/>
		<updated>2011-11-21T11:36:51Z</updated>

		<summary type="html">&lt;p&gt;Elrond: Mark items, that can be done before branching&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
MediaGoblin currently uses MongoDB as its database backend. There have been various reasons for this decision (see: [[Why MongoDB]], yes really, look at it. It has a lot of insight what are the problems with sql). Still, the idea of an SQL backend is coming up from time to time.&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
The existence of this wiki page does not give any evidence of the SQL backend getting developed soon!&lt;br /&gt;
&lt;br /&gt;
== People ==&lt;br /&gt;
Even an experimental implementation of an SQL backend, that will only support basic features will need a good amount of time/energy from some (core) developers. That time/energy will not be available to other projects.&lt;br /&gt;
* Some knowing sqlalchemy is needed.&lt;br /&gt;
* Someone having a good idea on the thin db layer is needed (Elrond will most likely be available for helping)&lt;br /&gt;
* Someone having an idea on the current queries used in the code is needed too.&lt;br /&gt;
&lt;br /&gt;
== Development models ==&lt;br /&gt;
* The biggest question is: Do we want to try an experimental sql backend? This is a tricky question. If it fails, it will be a lot of wasted time/energy. And contributors wouldn&#039;t be happy to have wasted their time/energy.&lt;br /&gt;
* The wasted time/energy could be limited by limiting the first target. For example one could dedide, that the sql backend is not intended to support the full feature set.&lt;br /&gt;
* Then there is the question on how to develop this:&lt;br /&gt;
*# Long term branch: Develop an SQL replacement in a long term branch. The good: Anything can be changed as needed. Not so good: Some people dislike long term branches for various reasons.&lt;br /&gt;
*# Trying to develop this alongside the current backend, in tree.&lt;br /&gt;
&lt;br /&gt;
== Major Issues ==&lt;br /&gt;
The current db model uses dicts to allow flexible storage for extensions and different media types. Representing these data in SQL is not simple. The dicts are normally keyed by a string and have arbitrary values. There are basically two ways:&lt;br /&gt;
&lt;br /&gt;
# Have a table with a key column (string) and a value column (string, json encoded). This will allow easy reconstruction of the dict for an object fetch and will allow queries on the key of the dict.&lt;br /&gt;
#: &#039;&#039;However&#039;&#039;, it will not allow queries on the values. For example the imaginary geolocation extension will store the lat/lon there and might want to search for other media &amp;quot;nearby&amp;quot;.&lt;br /&gt;
#: If the value column is split into three columns (i.e. &amp;lt;code&amp;gt;value_int value_string value_json&amp;lt;/code&amp;gt;), some queries, such as those on numbers, would be possible. .&lt;br /&gt;
#: &#039;&#039;&#039;Note:&#039;&#039;&#039; The table would actually look something like this: &amp;lt;code&amp;gt;create table super_data_table(media_id references media(id), plugin_id int, key, value_int, value_string);&amp;lt;/code&amp;gt; ... note that this design was predicted, determined by Chris Webber to be gross, and was aimed to be avoided, hence the choice of MongoDB.  See [[Why MongoDB]] for details.&lt;br /&gt;
# Actually structure the things into distinct tables. The above mentioned imaginary geolocation extension would have its own table with lat/lon fields and be able to perform efficient queries on it.&lt;br /&gt;
&lt;br /&gt;
== Pros and Cons ==&lt;br /&gt;
&lt;br /&gt;
=== MongoDB ===&lt;br /&gt;
&lt;br /&gt;
==== Pros ====&lt;br /&gt;
* Allows you to lazily flexibly store stuff like multiple media type information, plugin data, etc&lt;br /&gt;
* Supposedly scales up really well!&lt;br /&gt;
* Programming interface feels clean and pythonic.&lt;br /&gt;
* Migrations + flexible stuff might be a bit easier&lt;br /&gt;
* Shows a lot of promise&lt;br /&gt;
* Seems to be pretty fast if you have the right resources and carefully tuned your database&lt;br /&gt;
* We&#039;ve already built our tooling around it!&lt;br /&gt;
&lt;br /&gt;
==== Cons ====&lt;br /&gt;
&lt;br /&gt;
* Much, much more resource dependent on low and middle scale deployments than SQL would be&lt;br /&gt;
* Seems like you have to really tune your server around the database&lt;br /&gt;
* Have to think super carefully about indexes and (mostly) construct one index per common query.  (That&#039;s a bit misleading, but pretty close to the truth.)  Furthermore, one feels wary of creating more indexes because memory mapping means each index (and so each query) sucks up even more RAM. (At scale you also have to think about indexes for relational databases.) &lt;br /&gt;
* &amp;quot;On the fly&amp;quot; queries not so easy, could be much more expensive than &lt;br /&gt;
* No joins (normalized data on insertion to obviate the need for joins)&lt;br /&gt;
* How much do we really care about scaling up on the database layer anyway? (What&#039;s the expected write-load of media-goblin.) &lt;br /&gt;
** DeviantArt at Libre Graphics Meeting 2011 expressed that SQL + memcached works just fine for them and didn&#039;t think more complex things were necessary.  That&#039;s a huge install base, and it seems hard to believe that MediaGoblin sites will hit that scale level. (How big is/are their SQL box/en? With automatic-sharding, MognoDB might be able to give better write performance per-dollar than SQL solutions of the same size.)&lt;br /&gt;
** We&#039;re much more likely to run into media scaling issues before database scaling issues&lt;br /&gt;
** In an ideal federated world, scaling down might be more important than scaling up because everyone will be running their own servers&lt;br /&gt;
* In the end, flexibility doesn&#039;t seem to be worth much because you can&#039;t really do arbitrary queries on stuff you dump in if you want it to have any sort of speed whatsoever because of indexing considerations. (Good SQL schema design, and performance limitations of joins presents similar limitations.)&lt;br /&gt;
* Though promising looking and solutions to issues keep coming up fast and hitting the core software it&#039;s also very new and not as well established.&lt;br /&gt;
* It&#039;s not like migrations entirely disappeared, but they&#039;re probably easier with certain flexible things&lt;br /&gt;
* Every few weeks someone brings up an SQL backend ;)&lt;br /&gt;
&lt;br /&gt;
=== SQL(alchemy) ===&lt;br /&gt;
&lt;br /&gt;
==== Pros ====&lt;br /&gt;
&lt;br /&gt;
* Scales down and up pretty well (possibly not as high up as MongoDB but again if it&#039;s high enough for DeviantArt...) and scaling down really does matter in our case&lt;br /&gt;
* Developers are generally pretty used to it&lt;br /&gt;
* SQLAlchemy has a really strong and established codebase&lt;br /&gt;
* Arbitrary, unplanned queries!&lt;br /&gt;
* Flexible schemas still possible but in some different ways (but not as nicely directly and certainly in no way as loosely flexible)&lt;br /&gt;
* Extremely well established.&lt;br /&gt;
&lt;br /&gt;
==== Cons ====&lt;br /&gt;
&lt;br /&gt;
* Would mean a *lot* of rewriting!&lt;br /&gt;
* Would mean having to write a careful migration path from mongodb-&amp;gt;SQL!&lt;br /&gt;
* Not as directly flexible as MongoDB (though we can design cleverly for a certain type of flexibility)&lt;br /&gt;
* Migrations with certain types of database flexibility could break in really irritating for users (and people helping the users) ways&lt;br /&gt;
* Working on this move could slow down other work or be hard to coordinate in parallell with other development&lt;br /&gt;
* Probably does not scale up quite as high (again, it&#039;d have to be &amp;quot;much higher than deviantart&amp;quot;, which sounds like an unlikely problem we&#039;d like to have)&lt;br /&gt;
* Rewriting could possibly hurt our momentum in a serious way, especially if there&#039;s a feature freeze during the transition (and if there isn&#039;t, merging in master could become a real irritation)... even if we agree to do a rewrite, would we want to wait a while to do so? (Alternately, waiting to rewrite means the rewrite just gets harder.)&lt;br /&gt;
&lt;br /&gt;
== Statements by some developers ==&lt;br /&gt;
=== Chris Webber&#039;s weigh-in ===&lt;br /&gt;
&lt;br /&gt;
So I think several things about the whole possible move to SQL.&lt;br /&gt;
&lt;br /&gt;
First of all, after having written out the Pros &amp;amp; Cons of each, it&lt;br /&gt;
seems like maybe MongoDB is a lot of extra complexity and not gains in&lt;br /&gt;
the areas I expected it to be.  The supposed win wasn&#039;t scaling (and&lt;br /&gt;
as predicted, scaling down has been something we&#039;ve had to work around&lt;br /&gt;
carefully), it was flexibility.  Does MongoDB allow for extra&lt;br /&gt;
flexibility?  (And we *do* need flexibility for MediaGoblin&#039;s design.)&lt;br /&gt;
Yes in the sense that you can dump in whatever, but if you intend to&lt;br /&gt;
query on any of those attributes, it&#039;s mostly no.  Indexes are&lt;br /&gt;
expensive, and we have to spend a lot of time carefully pussyfooting&lt;br /&gt;
around them.&lt;br /&gt;
&lt;br /&gt;
While planning MediaGoblin, I knew that there were two patterns for&lt;br /&gt;
making things flexible in SQL... one of them is the table with &amp;quot;key,&lt;br /&gt;
value, type&amp;quot;.  I thought that was unacceptably gross, and still do&lt;br /&gt;
think so.&lt;br /&gt;
&lt;br /&gt;
The other option is that you have a &amp;quot;main&amp;quot; table (like MediaEntry), it&lt;br /&gt;
references what &amp;quot;type&amp;quot; it is (such as &amp;quot;video&amp;quot;, &amp;quot;image&amp;quot;, whatever), and&lt;br /&gt;
external tables for the extra information for that type point to the&lt;br /&gt;
MediaEntry via a foreignkey and provide whatever media type specific&lt;br /&gt;
data.  Similarly, use external tables for plugins.  The main reason I&lt;br /&gt;
didn&#039;t want to deal with this is because I imagined migrations&lt;br /&gt;
becoming a convoluted mess.  It wasn&#039;t that we *wouldn&#039;t need*&lt;br /&gt;
migrations in MongoDB, it&#039;s that maybe migrations would be less&lt;br /&gt;
nightmarish with extensible stuff involved.  In retrospect this was&lt;br /&gt;
pretty reactive to a number of frustrating times I&#039;ve had to try and&lt;br /&gt;
walk people through broken migrations.  But I&#039;m getting the sense that&lt;br /&gt;
I&#039;ll have to walk people through database complexity or breakage as&lt;br /&gt;
much or more in MongoDB, and the complexity of managing indexes for&lt;br /&gt;
any sort of extensibility is as bad or worse than dealing with&lt;br /&gt;
migrations with an extensible SQL setup.&lt;br /&gt;
&lt;br /&gt;
So, okay.  I think I just made a pretty compelling case for moving&lt;br /&gt;
back to SQL.  So what then?&lt;br /&gt;
&lt;br /&gt;
Two options have been proposed: try and support both SQL and MongoDB&lt;br /&gt;
at the same time, or create a branch that switches from MongoDB to&lt;br /&gt;
SQL.  I&#039;m afraid that the former just doesn&#039;t sound like a good idea&lt;br /&gt;
to me at all... it seems like it&#039;ll result in a system with a&lt;br /&gt;
massively bloated codebase, hard for new contributors to work with,&lt;br /&gt;
hard to maintain, and &amp;quot;worst of both worlds&amp;quot; types compromises.  Think&lt;br /&gt;
about this for a second: how do you map things like migrations,&lt;br /&gt;
indexing, etc over?  Do we really want to completely rewrite the&lt;br /&gt;
MongoDB query tools over to SQL?  Some people have said that &amp;quot;it looks&lt;br /&gt;
like we have a pretty simple use of MongoDB so this layer won&#039;t be so&lt;br /&gt;
complex.&amp;quot;  To me that sounds like classic hacker &amp;quot;well that can&#039;t be&lt;br /&gt;
so hard&amp;quot; underestimation of the complexity of the problem.  Anyway, I&lt;br /&gt;
already see a ton of complexities, and I&#039;m sure there are more I&lt;br /&gt;
haven&#039;t even been able to see.&lt;br /&gt;
&lt;br /&gt;
So the remaining option is to do a branch to switch from MongoDB -&amp;gt;&lt;br /&gt;
SQL.  There&#039;s some risk of this also... it&#039;s hard to maintain a big&lt;br /&gt;
overhaul branch while the mainline is constantly changing.  There&#039;s&lt;br /&gt;
also a risk of fracturing, and if we change our mind and stay with&lt;br /&gt;
MongoDB, there&#039;s even a risk of forking!  Not to mention that working&lt;br /&gt;
on a branch that&#039;s so huge that doesn&#039;t get pulled in is incredibly&lt;br /&gt;
demoralizing.&lt;br /&gt;
&lt;br /&gt;
But we can reduce all those risks if we can come to a *consensus* that&lt;br /&gt;
this is what we want to do.  So I propose at the next meeting we&lt;br /&gt;
discuss this and try to make sure we&#039;re at community consensus before&lt;br /&gt;
agreeing to move to SQL (if that&#039;s indeed what we intend to do) and if&lt;br /&gt;
we do so, move to SQL *entirely*.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s what I envision the path to that future will look like:&lt;br /&gt;
&lt;br /&gt;
* Create a branch that prototypes all the models being switched over to SQLAlchemy, included &amp;quot;multiple media types&amp;quot; implemented with a friendly API.&lt;br /&gt;
* Assuming that works nice, continue work in that branch to switch all code over to using SQL.&lt;br /&gt;
* Figure out how to do migrations nicely in SQL, including with multiple media types (I have some thoughts on how to do this &amp;quot;nicely&amp;quot;)&lt;br /&gt;
* Create a MongoDB-&amp;gt;SQL migration tool&lt;br /&gt;
&lt;br /&gt;
Anyway, let&#039;s discuss this at next meeting!&lt;br /&gt;
&lt;br /&gt;
=== Elrond&#039;s comments ===&lt;br /&gt;
I&#039;m quite with Chris Webber here.&lt;br /&gt;
&lt;br /&gt;
One thing, I have to add/where I&#039;m thinking a bit different: We should try to identify tasks in the sql-migration that can be done just &amp;quot;now&amp;quot;. What does that mean? Moving to sql(alchemy) means a lot of changes. And some of these changes can be done with the mongodb backend as well. For example we&#039;re currently changing the document attribute access over from &amp;lt;code&amp;gt;doc[&amp;quot;field&amp;quot;]&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;doc.field&amp;lt;/code&amp;gt;. This does not hurt the current code (mostly) and makes the remaining &amp;quot;move to sql(alchemy)&amp;quot; easier. This reduces the amount of work happening in a long term branch. And that&#039;s the critical work (can be dropped, is demotivating, ...). So moving as much work as possible before actually starting the sql branch will increase motivation and decrease chances of failure. This sounds like more work, because the same code possibly needs to be touched twice. This might be true. It might also mean more work, as we might need to create some extra support code to assist in moving to a new idea. I still think, this is better, because it&#039;s outside of this long lived branch.&lt;br /&gt;
&lt;br /&gt;
== Planing the Migration to SQL ==&lt;br /&gt;
This chapter contains some ideas, sketches, schedules, whatever developers feel they need to create a big plan.&lt;br /&gt;
&lt;br /&gt;
=== Some sketchup in SQL ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
create table users(&lt;br /&gt;
   id integer primary key not null,&lt;br /&gt;
   username varchar(30) unique not null,&lt;br /&gt;
   email text unique,&lt;br /&gt;
   created timestamp default CURRENT_TIMESTAMP,&lt;br /&gt;
   pw_hash text,&lt;br /&gt;
   email_verified boolean default FALSE,&lt;br /&gt;
   status varchar(30) default &#039;needs_email_verification&#039;,&lt;br /&gt;
   verification_key uuid,&lt;br /&gt;
   is_admin boolean default FALSE,&lt;br /&gt;
   url text,&lt;br /&gt;
   bio text,&lt;br /&gt;
   fp_verification_key uuid,&lt;br /&gt;
   fp_token_expire timestamp&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
create table file_records(&lt;br /&gt;
   id integer primary key not null,&lt;br /&gt;
   filename text array -- or json?&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
create table media_entries(&lt;br /&gt;
   id integer primary key not null,&lt;br /&gt;
   uploader integer references users(id) not null,&lt;br /&gt;
   title text,&lt;br /&gt;
   slug text,&lt;br /&gt;
   created timestamp default CURRENT_TIMESTAMP,&lt;br /&gt;
   description text,&lt;br /&gt;
   state text default &#039;unprocessed&#039;,&lt;br /&gt;
   queued_media_file integer references file_records(id),&lt;br /&gt;
   queued_task_id text,&lt;br /&gt;
   fail_error text,&lt;br /&gt;
   fail_metadata text -- json&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
create table media_files(&lt;br /&gt;
   id integer primary key not null,&lt;br /&gt;
   media_id integer references media_entries(id) not null,&lt;br /&gt;
   name varchar(30) not null,&lt;br /&gt;
      -- &amp;quot;original&amp;quot;, &amp;quot;thumbnail&amp;quot;, ...&lt;br /&gt;
      -- maybe also &amp;quot;attachment&amp;quot;-something?&lt;br /&gt;
   file integer references file_records(id) not null&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
create table media_comments(&lt;br /&gt;
   id integer primary key not null,&lt;br /&gt;
   media_entry integer references media_entries(id) not null,&lt;br /&gt;
   author integer references users(id) not null,&lt;br /&gt;
   created timestamp default CURRENT_TIMESTAMP,&lt;br /&gt;
   content text&lt;br /&gt;
   );&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Migration needs ===&lt;br /&gt;
&lt;br /&gt;
If we switch to SQL(Alchemy), we&#039;ll need to handle migrations.  This seems to have three requirements:&lt;br /&gt;
&lt;br /&gt;
# It has to be easy for users (as easy or easier than ./bin/gmg migrate)&lt;br /&gt;
# It has to be easy for developers&lt;br /&gt;
# It has to be able to handle our &amp;quot;extensible&amp;quot; infrastructure.  There will have to be separately handled migrations for MediaGoblin core, as well as for each media type and plugin.  All while remaining pretty simple!&lt;br /&gt;
&lt;br /&gt;
As far as I can tell, this should be pretty possible.  We have three options:&lt;br /&gt;
&lt;br /&gt;
# Completely roll our own system based off of SQLAlchemy&lt;br /&gt;
# Use [http://readthedocs.org/docs/sqlalchemy-migrate/en/latest/ SQLAlchemy-migrate]&lt;br /&gt;
# Roll our own system that uses components of SQLAlchemy-migrate.&lt;br /&gt;
&lt;br /&gt;
One way or another I suspect we are going with option 2 or 3.  SQLAlchemy-migrate provides some useful extensions to SQLAlchemy that are database related but can be used outside of SQLAlchemy-migrate&#039;s &amp;quot;complete tooling&amp;quot;, namely the [http://readthedocs.org/docs/sqlalchemy-migrate/en/v0.7.2/changeset.html#changeset-system changeset system].  Using the whole tooling system provides some cool stuff like some experimental auto-migration-detection, but might fall short in handling our extensible infrastructure... it&#039;s not clear yet.&lt;br /&gt;
&lt;br /&gt;
Whatever we do, it looks like we can probably fit our 3 needs using option #2 or option #3.  That&#039;s good!&lt;br /&gt;
&lt;br /&gt;
=== SQL switch tentative action plan ===&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a tentative plan of what an action plan for switching to SQL(alchemy).&lt;br /&gt;
&lt;br /&gt;
Items marked with (*) might or should be done before the actual sql branch is created. Meaning, they can likely be done &amp;quot;in master&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
# Port all models to SQLAlchemy models. (*)&lt;br /&gt;
# Make sure that port includes a nice way to handle media types in an extensible way! (*)&lt;br /&gt;
# Add filepath conversion tools (basically write 2 simple functions to switch filepaths -&amp;gt; slash-joined-strings and back.), use them everywhere (*)&lt;br /&gt;
# Add easy-database-init ./bin/gmg function (*)&lt;br /&gt;
# Port all code over to using sqlalchemy&lt;br /&gt;
# Add db-migrations tools (*)&lt;br /&gt;
# Add a mongodb-&amp;gt;SQL converter script (*)&lt;br /&gt;
# ???&lt;br /&gt;
# Profit!!! (Sorry, obligatory)&lt;/div&gt;</summary>
		<author><name>Elrond</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=SQL_Database_Backend&amp;diff=421</id>
		<title>SQL Database Backend</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=SQL_Database_Backend&amp;diff=421"/>
		<updated>2011-11-20T22:51:39Z</updated>

		<summary type="html">&lt;p&gt;Elrond: Little restructure&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
MediaGoblin currently uses MongoDB as its database backend. There have been various reasons for this decision (see: [[Why MongoDB]], yes really, look at it. It has a lot of insight what are the problems with sql). Still, the idea of an SQL backend is coming up from time to time.&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
The existence of this wiki page does not give any evidence of the SQL backend getting developed soon!&lt;br /&gt;
&lt;br /&gt;
== People ==&lt;br /&gt;
Even an experimental implementation of an SQL backend, that will only support basic features will need a good amount of time/energy from some (core) developers. That time/energy will not be available to other projects.&lt;br /&gt;
* Some knowing sqlalchemy is needed.&lt;br /&gt;
* Someone having a good idea on the thin db layer is needed (Elrond will most likely be available for helping)&lt;br /&gt;
* Someone having an idea on the current queries used in the code is needed too.&lt;br /&gt;
&lt;br /&gt;
== Development models ==&lt;br /&gt;
* The biggest question is: Do we want to try an experimental sql backend? This is a tricky question. If it fails, it will be a lot of wasted time/energy. And contributors wouldn&#039;t be happy to have wasted their time/energy.&lt;br /&gt;
* The wasted time/energy could be limited by limiting the first target. For example one could dedide, that the sql backend is not intended to support the full feature set.&lt;br /&gt;
* Then there is the question on how to develop this:&lt;br /&gt;
*# Long term branch: Develop an SQL replacement in a long term branch. The good: Anything can be changed as needed. Not so good: Some people dislike long term branches for various reasons.&lt;br /&gt;
*# Trying to develop this alongside the current backend, in tree.&lt;br /&gt;
&lt;br /&gt;
== Major Issues ==&lt;br /&gt;
The current db model uses dicts to allow flexible storage for extensions and different media types. Representing these data in SQL is not simple. The dicts are normally keyed by a string and have arbitrary values. There are basically two ways:&lt;br /&gt;
&lt;br /&gt;
# Have a table with a key column (string) and a value column (string, json encoded). This will allow easy reconstruction of the dict for an object fetch and will allow queries on the key of the dict.&lt;br /&gt;
#: &#039;&#039;However&#039;&#039;, it will not allow queries on the values. For example the imaginary geolocation extension will store the lat/lon there and might want to search for other media &amp;quot;nearby&amp;quot;.&lt;br /&gt;
#: If the value column is split into three columns (i.e. &amp;lt;code&amp;gt;value_int value_string value_json&amp;lt;/code&amp;gt;), some queries, such as those on numbers, would be possible. .&lt;br /&gt;
#: &#039;&#039;&#039;Note:&#039;&#039;&#039; The table would actually look something like this: &amp;lt;code&amp;gt;create table super_data_table(media_id references media(id), plugin_id int, key, value_int, value_string);&amp;lt;/code&amp;gt; ... note that this design was predicted, determined by Chris Webber to be gross, and was aimed to be avoided, hence the choice of MongoDB.  See [[Why MongoDB]] for details.&lt;br /&gt;
# Actually structure the things into distinct tables. The above mentioned imaginary geolocation extension would have its own table with lat/lon fields and be able to perform efficient queries on it.&lt;br /&gt;
&lt;br /&gt;
== Pros and Cons ==&lt;br /&gt;
&lt;br /&gt;
=== MongoDB ===&lt;br /&gt;
&lt;br /&gt;
==== Pros ====&lt;br /&gt;
* Allows you to lazily flexibly store stuff like multiple media type information, plugin data, etc&lt;br /&gt;
* Supposedly scales up really well!&lt;br /&gt;
* Programming interface feels clean and pythonic.&lt;br /&gt;
* Migrations + flexible stuff might be a bit easier&lt;br /&gt;
* Shows a lot of promise&lt;br /&gt;
* Seems to be pretty fast if you have the right resources and carefully tuned your database&lt;br /&gt;
* We&#039;ve already built our tooling around it!&lt;br /&gt;
&lt;br /&gt;
==== Cons ====&lt;br /&gt;
&lt;br /&gt;
* Much, much more resource dependent on low and middle scale deployments than SQL would be&lt;br /&gt;
* Seems like you have to really tune your server around the database&lt;br /&gt;
* Have to think super carefully about indexes and (mostly) construct one index per common query.  (That&#039;s a bit misleading, but pretty close to the truth.)  Furthermore, one feels wary of creating more indexes because memory mapping means each index (and so each query) sucks up even more RAM. (At scale you also have to think about indexes for relational databases.) &lt;br /&gt;
* &amp;quot;On the fly&amp;quot; queries not so easy, could be much more expensive than &lt;br /&gt;
* No joins (normalized data on insertion to obviate the need for joins)&lt;br /&gt;
* How much do we really care about scaling up on the database layer anyway? (What&#039;s the expected write-load of media-goblin.) &lt;br /&gt;
** DeviantArt at Libre Graphics Meeting 2011 expressed that SQL + memcached works just fine for them and didn&#039;t think more complex things were necessary.  That&#039;s a huge install base, and it seems hard to believe that MediaGoblin sites will hit that scale level. (How big is/are their SQL box/en? With automatic-sharding, MognoDB might be able to give better write performance per-dollar than SQL solutions of the same size.)&lt;br /&gt;
** We&#039;re much more likely to run into media scaling issues before database scaling issues&lt;br /&gt;
** In an ideal federated world, scaling down might be more important than scaling up because everyone will be running their own servers&lt;br /&gt;
* In the end, flexibility doesn&#039;t seem to be worth much because you can&#039;t really do arbitrary queries on stuff you dump in if you want it to have any sort of speed whatsoever because of indexing considerations. (Good SQL schema design, and performance limitations of joins presents similar limitations.)&lt;br /&gt;
* Though promising looking and solutions to issues keep coming up fast and hitting the core software it&#039;s also very new and not as well established.&lt;br /&gt;
* It&#039;s not like migrations entirely disappeared, but they&#039;re probably easier with certain flexible things&lt;br /&gt;
* Every few weeks someone brings up an SQL backend ;)&lt;br /&gt;
&lt;br /&gt;
=== SQL(alchemy) ===&lt;br /&gt;
&lt;br /&gt;
==== Pros ====&lt;br /&gt;
&lt;br /&gt;
* Scales down and up pretty well (possibly not as high up as MongoDB but again if it&#039;s high enough for DeviantArt...) and scaling down really does matter in our case&lt;br /&gt;
* Developers are generally pretty used to it&lt;br /&gt;
* SQLAlchemy has a really strong and established codebase&lt;br /&gt;
* Arbitrary, unplanned queries!&lt;br /&gt;
* Flexible schemas still possible but in some different ways (but not as nicely directly and certainly in no way as loosely flexible)&lt;br /&gt;
* Extremely well established.&lt;br /&gt;
&lt;br /&gt;
==== Cons ====&lt;br /&gt;
&lt;br /&gt;
* Would mean a *lot* of rewriting!&lt;br /&gt;
* Would mean having to write a careful migration path from mongodb-&amp;gt;SQL!&lt;br /&gt;
* Not as directly flexible as MongoDB (though we can design cleverly for a certain type of flexibility)&lt;br /&gt;
* Migrations with certain types of database flexibility could break in really irritating for users (and people helping the users) ways&lt;br /&gt;
* Working on this move could slow down other work or be hard to coordinate in parallell with other development&lt;br /&gt;
* Probably does not scale up quite as high (again, it&#039;d have to be &amp;quot;much higher than deviantart&amp;quot;, which sounds like an unlikely problem we&#039;d like to have)&lt;br /&gt;
* Rewriting could possibly hurt our momentum in a serious way, especially if there&#039;s a feature freeze during the transition (and if there isn&#039;t, merging in master could become a real irritation)... even if we agree to do a rewrite, would we want to wait a while to do so? (Alternately, waiting to rewrite means the rewrite just gets harder.)&lt;br /&gt;
&lt;br /&gt;
== Statements by some developers ==&lt;br /&gt;
=== Chris Webber&#039;s weigh-in ===&lt;br /&gt;
&lt;br /&gt;
So I think several things about the whole possible move to SQL.&lt;br /&gt;
&lt;br /&gt;
First of all, after having written out the Pros &amp;amp; Cons of each, it&lt;br /&gt;
seems like maybe MongoDB is a lot of extra complexity and not gains in&lt;br /&gt;
the areas I expected it to be.  The supposed win wasn&#039;t scaling (and&lt;br /&gt;
as predicted, scaling down has been something we&#039;ve had to work around&lt;br /&gt;
carefully), it was flexibility.  Does MongoDB allow for extra&lt;br /&gt;
flexibility?  (And we *do* need flexibility for MediaGoblin&#039;s design.)&lt;br /&gt;
Yes in the sense that you can dump in whatever, but if you intend to&lt;br /&gt;
query on any of those attributes, it&#039;s mostly no.  Indexes are&lt;br /&gt;
expensive, and we have to spend a lot of time carefully pussyfooting&lt;br /&gt;
around them.&lt;br /&gt;
&lt;br /&gt;
While planning MediaGoblin, I knew that there were two patterns for&lt;br /&gt;
making things flexible in SQL... one of them is the table with &amp;quot;key,&lt;br /&gt;
value, type&amp;quot;.  I thought that was unacceptably gross, and still do&lt;br /&gt;
think so.&lt;br /&gt;
&lt;br /&gt;
The other option is that you have a &amp;quot;main&amp;quot; table (like MediaEntry), it&lt;br /&gt;
references what &amp;quot;type&amp;quot; it is (such as &amp;quot;video&amp;quot;, &amp;quot;image&amp;quot;, whatever), and&lt;br /&gt;
external tables for the extra information for that type point to the&lt;br /&gt;
MediaEntry via a foreignkey and provide whatever media type specific&lt;br /&gt;
data.  Similarly, use external tables for plugins.  The main reason I&lt;br /&gt;
didn&#039;t want to deal with this is because I imagined migrations&lt;br /&gt;
becoming a convoluted mess.  It wasn&#039;t that we *wouldn&#039;t need*&lt;br /&gt;
migrations in MongoDB, it&#039;s that maybe migrations would be less&lt;br /&gt;
nightmarish with extensible stuff involved.  In retrospect this was&lt;br /&gt;
pretty reactive to a number of frustrating times I&#039;ve had to try and&lt;br /&gt;
walk people through broken migrations.  But I&#039;m getting the sense that&lt;br /&gt;
I&#039;ll have to walk people through database complexity or breakage as&lt;br /&gt;
much or more in MongoDB, and the complexity of managing indexes for&lt;br /&gt;
any sort of extensibility is as bad or worse than dealing with&lt;br /&gt;
migrations with an extensible SQL setup.&lt;br /&gt;
&lt;br /&gt;
So, okay.  I think I just made a pretty compelling case for moving&lt;br /&gt;
back to SQL.  So what then?&lt;br /&gt;
&lt;br /&gt;
Two options have been proposed: try and support both SQL and MongoDB&lt;br /&gt;
at the same time, or create a branch that switches from MongoDB to&lt;br /&gt;
SQL.  I&#039;m afraid that the former just doesn&#039;t sound like a good idea&lt;br /&gt;
to me at all... it seems like it&#039;ll result in a system with a&lt;br /&gt;
massively bloated codebase, hard for new contributors to work with,&lt;br /&gt;
hard to maintain, and &amp;quot;worst of both worlds&amp;quot; types compromises.  Think&lt;br /&gt;
about this for a second: how do you map things like migrations,&lt;br /&gt;
indexing, etc over?  Do we really want to completely rewrite the&lt;br /&gt;
MongoDB query tools over to SQL?  Some people have said that &amp;quot;it looks&lt;br /&gt;
like we have a pretty simple use of MongoDB so this layer won&#039;t be so&lt;br /&gt;
complex.&amp;quot;  To me that sounds like classic hacker &amp;quot;well that can&#039;t be&lt;br /&gt;
so hard&amp;quot; underestimation of the complexity of the problem.  Anyway, I&lt;br /&gt;
already see a ton of complexities, and I&#039;m sure there are more I&lt;br /&gt;
haven&#039;t even been able to see.&lt;br /&gt;
&lt;br /&gt;
So the remaining option is to do a branch to switch from MongoDB -&amp;gt;&lt;br /&gt;
SQL.  There&#039;s some risk of this also... it&#039;s hard to maintain a big&lt;br /&gt;
overhaul branch while the mainline is constantly changing.  There&#039;s&lt;br /&gt;
also a risk of fracturing, and if we change our mind and stay with&lt;br /&gt;
MongoDB, there&#039;s even a risk of forking!  Not to mention that working&lt;br /&gt;
on a branch that&#039;s so huge that doesn&#039;t get pulled in is incredibly&lt;br /&gt;
demoralizing.&lt;br /&gt;
&lt;br /&gt;
But we can reduce all those risks if we can come to a *consensus* that&lt;br /&gt;
this is what we want to do.  So I propose at the next meeting we&lt;br /&gt;
discuss this and try to make sure we&#039;re at community consensus before&lt;br /&gt;
agreeing to move to SQL (if that&#039;s indeed what we intend to do) and if&lt;br /&gt;
we do so, move to SQL *entirely*.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s what I envision the path to that future will look like:&lt;br /&gt;
&lt;br /&gt;
* Create a branch that prototypes all the models being switched over to SQLAlchemy, included &amp;quot;multiple media types&amp;quot; implemented with a friendly API.&lt;br /&gt;
* Assuming that works nice, continue work in that branch to switch all code over to using SQL.&lt;br /&gt;
* Figure out how to do migrations nicely in SQL, including with multiple media types (I have some thoughts on how to do this &amp;quot;nicely&amp;quot;)&lt;br /&gt;
* Create a MongoDB-&amp;gt;SQL migration tool&lt;br /&gt;
&lt;br /&gt;
Anyway, let&#039;s discuss this at next meeting!&lt;br /&gt;
&lt;br /&gt;
=== Elrond&#039;s comments ===&lt;br /&gt;
I&#039;m quite with Chris Webber here.&lt;br /&gt;
&lt;br /&gt;
One thing, I have to add/where I&#039;m thinking a bit different: We should try to identify tasks in the sql-migration that can be done just &amp;quot;now&amp;quot;. What does that mean? Moving to sql(alchemy) means a lot of changes. And some of these changes can be done with the mongodb backend as well. For example we&#039;re currently changing the document attribute access over from &amp;lt;code&amp;gt;doc[&amp;quot;field&amp;quot;]&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;doc.field&amp;lt;/code&amp;gt;. This does not hurt the current code (mostly) and makes the remaining &amp;quot;move to sql(alchemy)&amp;quot; easier. This reduces the amount of work happening in a long term branch. And that&#039;s the critical work (can be dropped, is demotivating, ...). So moving as much work as possible before actually starting the sql branch will increase motivation and decrease chances of failure. This sounds like more work, because the same code possibly needs to be touched twice. This might be true. It might also mean more work, as we might need to create some extra support code to assist in moving to a new idea. I still think, this is better, because it&#039;s outside of this long lived branch.&lt;br /&gt;
&lt;br /&gt;
== Planing the Migration to SQL ==&lt;br /&gt;
This chapter contains some ideas, sketches, schedules, whatever developers feel they need to create a big plan.&lt;br /&gt;
&lt;br /&gt;
=== Some sketchup in SQL ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
create table users(&lt;br /&gt;
   id integer primary key not null,&lt;br /&gt;
   username varchar(30) unique not null,&lt;br /&gt;
   email text unique,&lt;br /&gt;
   created timestamp default CURRENT_TIMESTAMP,&lt;br /&gt;
   pw_hash text,&lt;br /&gt;
   email_verified boolean default FALSE,&lt;br /&gt;
   status varchar(30) default &#039;needs_email_verification&#039;,&lt;br /&gt;
   verification_key uuid,&lt;br /&gt;
   is_admin boolean default FALSE,&lt;br /&gt;
   url text,&lt;br /&gt;
   bio text,&lt;br /&gt;
   fp_verification_key uuid,&lt;br /&gt;
   fp_token_expire timestamp&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
create table file_records(&lt;br /&gt;
   id integer primary key not null,&lt;br /&gt;
   filename text array -- or json?&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
create table media_entries(&lt;br /&gt;
   id integer primary key not null,&lt;br /&gt;
   uploader integer references users(id) not null,&lt;br /&gt;
   title text,&lt;br /&gt;
   slug text,&lt;br /&gt;
   created timestamp default CURRENT_TIMESTAMP,&lt;br /&gt;
   description text,&lt;br /&gt;
   state text default &#039;unprocessed&#039;,&lt;br /&gt;
   queued_media_file integer references file_records(id),&lt;br /&gt;
   queued_task_id text,&lt;br /&gt;
   fail_error text,&lt;br /&gt;
   fail_metadata text -- json&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
create table media_files(&lt;br /&gt;
   id integer primary key not null,&lt;br /&gt;
   media_id integer references media_entries(id) not null,&lt;br /&gt;
   name varchar(30) not null,&lt;br /&gt;
      -- &amp;quot;original&amp;quot;, &amp;quot;thumbnail&amp;quot;, ...&lt;br /&gt;
      -- maybe also &amp;quot;attachment&amp;quot;-something?&lt;br /&gt;
   file integer references file_records(id) not null&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
create table media_comments(&lt;br /&gt;
   id integer primary key not null,&lt;br /&gt;
   media_entry integer references media_entries(id) not null,&lt;br /&gt;
   author integer references users(id) not null,&lt;br /&gt;
   created timestamp default CURRENT_TIMESTAMP,&lt;br /&gt;
   content text&lt;br /&gt;
   );&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Migration needs ===&lt;br /&gt;
&lt;br /&gt;
If we switch to SQL(Alchemy), we&#039;ll need to handle migrations.  This seems to have three requirements:&lt;br /&gt;
&lt;br /&gt;
# It has to be easy for users (as easy or easier than ./bin/gmg migrate)&lt;br /&gt;
# It has to be easy for developers&lt;br /&gt;
# It has to be able to handle our &amp;quot;extensible&amp;quot; infrastructure.  There will have to be separately handled migrations for MediaGoblin core, as well as for each media type and plugin.  All while remaining pretty simple!&lt;br /&gt;
&lt;br /&gt;
As far as I can tell, this should be pretty possible.  We have three options:&lt;br /&gt;
&lt;br /&gt;
# Completely roll our own system based off of SQLAlchemy&lt;br /&gt;
# Use [http://readthedocs.org/docs/sqlalchemy-migrate/en/latest/ SQLAlchemy-migrate]&lt;br /&gt;
# Roll our own system that uses components of SQLAlchemy-migrate.&lt;br /&gt;
&lt;br /&gt;
One way or another I suspect we are going with option 2 or 3.  SQLAlchemy-migrate provides some useful extensions to SQLAlchemy that are database related but can be used outside of SQLAlchemy-migrate&#039;s &amp;quot;complete tooling&amp;quot;, namely the [http://readthedocs.org/docs/sqlalchemy-migrate/en/v0.7.2/changeset.html#changeset-system changeset system].  Using the whole tooling system provides some cool stuff like some experimental auto-migration-detection, but might fall short in handling our extensible infrastructure... it&#039;s not clear yet.&lt;br /&gt;
&lt;br /&gt;
Whatever we do, it looks like we can probably fit our 3 needs using option #2 or option #3.  That&#039;s good!&lt;br /&gt;
&lt;br /&gt;
=== SQL switch tentative action plan ===&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a tentative plan of what an action plan for switching to SQL(alchemy).&lt;br /&gt;
&lt;br /&gt;
# Port all models to SQLAlchemy models.&lt;br /&gt;
# Make sure that port includes a nice way to handle media types in an extensible way!&lt;br /&gt;
# Add filepath conversion tools (basically write 2 simple functions to switch filepaths -&amp;gt; slash-joined-strings and back.), use them everywhere&lt;br /&gt;
# Add easy-database-init ./bin/gmg function&lt;br /&gt;
# Port all code over to using sqlalchemy&lt;br /&gt;
# Add db-migrations tools&lt;br /&gt;
# Add a mongodb-&amp;gt;SQL converter script&lt;br /&gt;
# ???&lt;br /&gt;
# Profit!!! (Sorry, obligatory)&lt;/div&gt;</summary>
		<author><name>Elrond</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=Meeting&amp;diff=409</id>
		<title>Meeting</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=Meeting&amp;diff=409"/>
		<updated>2011-11-16T22:31:04Z</updated>

		<summary type="html">&lt;p&gt;Elrond: current executive summary on sql idea&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= MediaGoblin Monthly Meeting =&lt;br /&gt;
&lt;br /&gt;
At 16:00 UTC the first saturday of each month, unless otherwise announced on the [http://lists.mediagoblin.org/pipermail/devel/ mailing list], there is an IRC meeting. The idea is to discuss the past month, what happened, what was good, what should be done better. And to create roadmap for the upcoming month and assign tasks to people willing to handle them.&lt;br /&gt;
&lt;br /&gt;
* [http://mediagoblin.org/irclogs/ IRC meeting logs]&lt;br /&gt;
&lt;br /&gt;
Typical Agenda topics:&lt;br /&gt;
* What happened in the last month, what was good, what could be better next time?&lt;br /&gt;
* What should be done next month?&lt;br /&gt;
&lt;br /&gt;
= Upcoming and Recent Meetings =&lt;br /&gt;
&lt;br /&gt;
== 2011-12 (upcoming 2011-12-03) ==&lt;br /&gt;
&lt;br /&gt;
Preliminary Agenda (in progress):&lt;br /&gt;
&lt;br /&gt;
* We plan to create a plugin system.  Do we want to create that soon or push it off until things settle a bit more?  ([[User:Willkg|Willkg]] 08:54, 10 November 2011 (EST))&lt;br /&gt;
* [[Feature Ideas]]: What should we do about the wiki page? Keep it and have it as a monthly topic for &amp;quot;what next&amp;quot;? Convert everything to long waiting bugs?&lt;br /&gt;
* Possibility of an [[SQL Database Backend]]?&lt;br /&gt;
*: &#039;executive summary&#039; (well, you should read the long docs): &amp;quot;We could move to sql. It&#039;s probably replacing one type of pain by another type of pain, but those are somewhat comparable. Leaving the main question: Do we want to occupy our main devs for some long time with this task and loose momentum?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== 2011-11 (held on 2011-11-05) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Preliminary Agenda and preliminary results (in progress):&lt;br /&gt;
* What happened in the last month, what was good, what could be better next time?&lt;br /&gt;
** Release:&lt;br /&gt;
*** Good: 0.1.0 released!&lt;br /&gt;
*** Bad: postponing vs not postponing&lt;br /&gt;
** Sites and deployment documentation:&lt;br /&gt;
*** Good: new mediagoblin.org&lt;br /&gt;
*** Good: deployment documentation&lt;br /&gt;
*** Bad: py-bcrypt’s site was down just after the release, so the virtualenv deployment didn’t work, and it wasn’t clear how to fix it.&lt;br /&gt;
** Live instances:&lt;br /&gt;
*** Joar has a live instance!&lt;br /&gt;
*** But what does it mean? Should ordinary users start using it?&lt;br /&gt;
**** Details at [[User:Joar/mg.wandborg.se]] -- [[User:Joar|Joar]] 17:01, 6 November 2011 (EST)&lt;br /&gt;
*** nyergler added a note about &amp;quot;heartbeat&amp;quot;/status to API notes&lt;br /&gt;
* What should be done next month?&lt;br /&gt;
* Starting real work on federation (via OStatus)... and do we split any of this work out into its own library?&lt;br /&gt;
* An API&lt;br /&gt;
* Creative Commons licensing tools&lt;br /&gt;
* Merging in the multimedia/video branch&lt;br /&gt;
*: (this is *very close* already actually thanks to the hard work of Joar Wandborg!  But we need some help on the gstreamer front to fix a few issues... if you or someone you know is an expert in this area we could really use their help to make the videos that come out smoother!)&lt;br /&gt;
* Rollover items from 0.1.0&lt;br /&gt;
* Multiple file upload interface&lt;br /&gt;
* Drag and drop uploads interface (probably related!)&lt;br /&gt;
&lt;br /&gt;
[http://mediagoblin.org/irclogs/irc_meeting_2011-11-05.txt IRC log]&lt;br /&gt;
&lt;br /&gt;
== 2011-10 (held on 2011-10-01) ==&lt;br /&gt;
This month&#039;s meeting was a quickly announced short meeting. The project is getting back on track and next month&#039;s meeting will be scheduled more properly. A bunch of people were around.&lt;br /&gt;
&lt;br /&gt;
The most important decisions:&lt;br /&gt;
* The project will keep monthly releases. They&#039;re the heartbeat of the project.&lt;br /&gt;
* Release 0.1.0 this sunday/monday.&lt;br /&gt;
* New website will hopefully be deployed in the next few days.&lt;br /&gt;
* And the following things are planned to happen during this month: Most importantly federation. The developers have decided to make up their minds on what federation aactually should mean for MediaGoblin. Concerning code, probably &amp;quot;activity streams&amp;quot; are the first goal. If there is no (good) python library for this, a new stand alone library may be created. If so, a name for it has to be found. It should have something about communication in it. And the other thing to happen during this month is an ongoing discussion about &amp;quot;bus factor&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* [http://mediagoblin.org/irclogs/irc_meeting_2011-10-01.txt IRC log]&lt;br /&gt;
&lt;br /&gt;
== 2011-09 (held on 2011-09-03) ==&lt;br /&gt;
&lt;br /&gt;
* [http://mediagoblin.org/irclogs/irc_meeting_2011-09-03.txt IRC log]&lt;br /&gt;
&lt;br /&gt;
== 2011-08 (held on 2011-08-06) ==&lt;br /&gt;
&lt;br /&gt;
* [http://mediagoblin.org/irclogs/irc_meeting_2011-08-06.txt IRC log]&lt;/div&gt;</summary>
		<author><name>Elrond</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=SQL_Database_Backend&amp;diff=408</id>
		<title>SQL Database Backend</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=SQL_Database_Backend&amp;diff=408"/>
		<updated>2011-11-16T13:43:26Z</updated>

		<summary type="html">&lt;p&gt;Elrond: Elrond&amp;#039;s comments&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
MediaGoblin currently uses MongoDB as its database backend. There have been various reasons for this decision (see: [[Why MongoDB]], yes really, look at it. It has a lot of insight what are the problems with sql). Still, the idea of an SQL backend is coming up from time to time.&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
The existence of this wiki page does not give any evidence of the SQL backend getting developed soon!&lt;br /&gt;
&lt;br /&gt;
== People ==&lt;br /&gt;
Even an experimental implementation of an SQL backend, that will only support basic features will need a good amount of time/energy from some (core) developers. That time/energy will not be available to other projects.&lt;br /&gt;
* Some knowing sqlalchemy is needed.&lt;br /&gt;
* Someone having a good idea on the thin db layer is needed (Elrond will most likely be available for helping)&lt;br /&gt;
* Someone having an idea on the current queries used in the code is needed too.&lt;br /&gt;
&lt;br /&gt;
== Development models ==&lt;br /&gt;
* The biggest question is: Do we want to try an experimental sql backend? This is a tricky question. If it fails, it will be a lot of wasted time/energy. And contributors wouldn&#039;t be happy to have wasted their time/energy.&lt;br /&gt;
* The wasted time/energy could be limited by limiting the first target. For example one could dedide, that the sql backend is not intended to support the full feature set.&lt;br /&gt;
* Then there is the question on how to develop this:&lt;br /&gt;
*# Long term branch: Develop an SQL replacement in a long term branch. The good: Anything can be changed as needed. Not so good: Some people dislike long term branches for various reasons.&lt;br /&gt;
*# Trying to develop this alongside the current backend, in tree.&lt;br /&gt;
&lt;br /&gt;
== Major Issues ==&lt;br /&gt;
The current db model uses dicts to allow flexible storage for extensions and different media types. Representing these data in SQL is not simple. The dicts are normally keyed by a string and have arbitrary values. There are basically two ways:&lt;br /&gt;
&lt;br /&gt;
# Have a table with a key column (string) and a value column (string, json encoded). This will allow easy reconstruction of the dict for an object fetch and will allow queries on the key of the dict.&lt;br /&gt;
#: &#039;&#039;However&#039;&#039;, it will not allow queries on the values. For example the imaginary geolocation extension will store the lat/lon there and might want to search for other media &amp;quot;nearby&amp;quot;.&lt;br /&gt;
#: If the value column is split into three columns (i.e. &amp;lt;code&amp;gt;value_int value_string value_json&amp;lt;/code&amp;gt;), some queries, such as those on numbers, would be possible. .&lt;br /&gt;
#: &#039;&#039;&#039;Note:&#039;&#039;&#039; The table would actually look something like this: &amp;lt;code&amp;gt;create table super_data_table(media_id references media(id), plugin_id int, key, value_int, value_string);&amp;lt;/code&amp;gt; ... note that this design was predicted, determined by Chris Webber to be gross, and was aimed to be avoided, hence the choice of MongoDB.  See [[Why MongoDB]] for details.&lt;br /&gt;
# Actually structure the things into distinct tables. The above mentioned imaginary geolocation extension would have its own table with lat/lon fields and be able to perform efficient queries on it.&lt;br /&gt;
&lt;br /&gt;
== Pros and Cons ==&lt;br /&gt;
&lt;br /&gt;
=== MongoDB ===&lt;br /&gt;
&lt;br /&gt;
==== Pros ====&lt;br /&gt;
* Allows you to lazily flexibly store stuff like multiple media type information, plugin data, etc&lt;br /&gt;
* Supposedly scales up really well!&lt;br /&gt;
* Programming interface feels clean and pythonic.&lt;br /&gt;
* Migrations + flexible stuff might be a bit easier&lt;br /&gt;
* Shows a lot of promise&lt;br /&gt;
* Seems to be pretty fast if you have the right resources and carefully tuned your database&lt;br /&gt;
* We&#039;ve already built our tooling around it!&lt;br /&gt;
&lt;br /&gt;
==== Cons ====&lt;br /&gt;
&lt;br /&gt;
* Much, much more resource dependent on low and middle scale deployments than SQL would be&lt;br /&gt;
* Seems like you have to really tune your server around the database&lt;br /&gt;
* Have to think super carefully about indexes and (mostly) construct one index per common query.  (That&#039;s a bit misleading, but pretty close to the truth.)  Furthermore, one feels wary of creating more indexes because memory mapping means each index (and so each query) sucks up even more RAM. (At scale you also have to think about indexes for relational databases.) &lt;br /&gt;
* &amp;quot;On the fly&amp;quot; queries not so easy, could be much more expensive than &lt;br /&gt;
* No joins (normalized data on insertion to obviate the need for joins)&lt;br /&gt;
* How much do we really care about scaling up on the database layer anyway? (What&#039;s the expected write-load of media-goblin.) &lt;br /&gt;
** DeviantArt at Libre Graphics Meeting 2011 expressed that SQL + memcached works just fine for them and didn&#039;t think more complex things were necessary.  That&#039;s a huge install base, and it seems hard to believe that MediaGoblin sites will hit that scale level. (How big is/are their SQL box/en? With automatic-sharding, MognoDB might be able to give better write performance per-dollar than SQL solutions of the same size.)&lt;br /&gt;
** We&#039;re much more likely to run into media scaling issues before database scaling issues&lt;br /&gt;
** In an ideal federated world, scaling down might be more important than scaling up because everyone will be running their own servers&lt;br /&gt;
* In the end, flexibility doesn&#039;t seem to be worth much because you can&#039;t really do arbitrary queries on stuff you dump in if you want it to have any sort of speed whatsoever because of indexing considerations. (Good SQL schema design, and performance limitations of joins presents similar limitations.)&lt;br /&gt;
* Though promising looking and solutions to issues keep coming up fast and hitting the core software it&#039;s also very new and not as well established.&lt;br /&gt;
* It&#039;s not like migrations entirely disappeared, but they&#039;re probably easier with certain flexible things&lt;br /&gt;
* Every few weeks someone brings up an SQL backend ;)&lt;br /&gt;
&lt;br /&gt;
=== SQL(alchemy) ===&lt;br /&gt;
&lt;br /&gt;
==== Pros ====&lt;br /&gt;
&lt;br /&gt;
* Scales down and up pretty well (possibly not as high up as MongoDB but again if it&#039;s high enough for DeviantArt...) and scaling down really does matter in our case&lt;br /&gt;
* Developers are generally pretty used to it&lt;br /&gt;
* SQLAlchemy has a really strong and established codebase&lt;br /&gt;
* Arbitrary, unplanned queries!&lt;br /&gt;
* Flexible schemas still possible but in some different ways (but not as nicely directly and certainly in no way as loosely flexible)&lt;br /&gt;
* Extremely well established.&lt;br /&gt;
&lt;br /&gt;
==== Cons ====&lt;br /&gt;
&lt;br /&gt;
* Would mean a *lot* of rewriting!&lt;br /&gt;
* Would mean having to write a careful migration path from mongodb-&amp;gt;SQL!&lt;br /&gt;
* Not as directly flexible as MongoDB (though we can design cleverly for a certain type of flexibility)&lt;br /&gt;
* Migrations with certain types of database flexibility could break in really irritating for users (and people helping the users) ways&lt;br /&gt;
* Working on this move could slow down other work or be hard to coordinate in parallell with other development&lt;br /&gt;
* Probably does not scale up quite as high (again, it&#039;d have to be &amp;quot;much higher than deviantart&amp;quot;, which sounds like an unlikely problem we&#039;d like to have)&lt;br /&gt;
&lt;br /&gt;
== Statements by some developers ==&lt;br /&gt;
=== Chris Webber&#039;s weigh-in ===&lt;br /&gt;
&lt;br /&gt;
So I think several things about the whole possible move to SQL.&lt;br /&gt;
&lt;br /&gt;
First of all, after having written out the Pros &amp;amp; Cons of each, it&lt;br /&gt;
seems like maybe MongoDB is a lot of extra complexity and not gains in&lt;br /&gt;
the areas I expected it to be.  The supposed win wasn&#039;t scaling (and&lt;br /&gt;
as predicted, scaling down has been something we&#039;ve had to work around&lt;br /&gt;
carefully), it was flexibility.  Does MongoDB allow for extra&lt;br /&gt;
flexibility?  (And we *do* need flexibility for MediaGoblin&#039;s design.)&lt;br /&gt;
Yes in the sense that you can dump in whatever, but if you intend to&lt;br /&gt;
query on any of those attributes, it&#039;s mostly no.  Indexes are&lt;br /&gt;
expensive, and we have to spend a lot of time carefully pussyfooting&lt;br /&gt;
around them.&lt;br /&gt;
&lt;br /&gt;
While planning MediaGoblin, I knew that there were two patterns for&lt;br /&gt;
making things flexible in SQL... one of them is the table with &amp;quot;key,&lt;br /&gt;
value, type&amp;quot;.  I thought that was unacceptably gross, and still do&lt;br /&gt;
think so.&lt;br /&gt;
&lt;br /&gt;
The other option is that you have a &amp;quot;main&amp;quot; table (like MediaEntry), it&lt;br /&gt;
references what &amp;quot;type&amp;quot; it is (such as &amp;quot;video&amp;quot;, &amp;quot;image&amp;quot;, whatever), and&lt;br /&gt;
external tables for the extra information for that type point to the&lt;br /&gt;
MediaEntry via a foreignkey and provide whatever media type specific&lt;br /&gt;
data.  Similarly, use external tables for plugins.  The main reason I&lt;br /&gt;
didn&#039;t want to deal with this is because I imagined migrations&lt;br /&gt;
becoming a convoluted mess.  It wasn&#039;t that we *wouldn&#039;t need*&lt;br /&gt;
migrations in MongoDB, it&#039;s that maybe migrations would be less&lt;br /&gt;
nightmarish with extensible stuff involved.  In retrospect this was&lt;br /&gt;
pretty reactive to a number of frustrating times I&#039;ve had to try and&lt;br /&gt;
walk people through broken migrations.  But I&#039;m getting the sense that&lt;br /&gt;
I&#039;ll have to walk people through database complexity or breakage as&lt;br /&gt;
much or more in MongoDB, and the complexity of managing indexes for&lt;br /&gt;
any sort of extensibility is as bad or worse than dealing with&lt;br /&gt;
migrations with an extensible SQL setup.&lt;br /&gt;
&lt;br /&gt;
So, okay.  I think I just made a pretty compelling case for moving&lt;br /&gt;
back to SQL.  So what then?&lt;br /&gt;
&lt;br /&gt;
Two options have been proposed: try and support both SQL and MongoDB&lt;br /&gt;
at the same time, or create a branch that switches from MongoDB to&lt;br /&gt;
SQL.  I&#039;m afraid that the former just doesn&#039;t sound like a good idea&lt;br /&gt;
to me at all... it seems like it&#039;ll result in a system with a&lt;br /&gt;
massively bloated codebase, hard for new contributors to work with,&lt;br /&gt;
hard to maintain, and &amp;quot;worst of both worlds&amp;quot; types compromises.  Think&lt;br /&gt;
about this for a second: how do you map things like migrations,&lt;br /&gt;
indexing, etc over?  Do we really want to completely rewrite the&lt;br /&gt;
MongoDB query tools over to SQL?  Some people have said that &amp;quot;it looks&lt;br /&gt;
like we have a pretty simple use of MongoDB so this layer won&#039;t be so&lt;br /&gt;
complex.&amp;quot;  To me that sounds like classic hacker &amp;quot;well that can&#039;t be&lt;br /&gt;
so hard&amp;quot; underestimation of the complexity of the problem.  Anyway, I&lt;br /&gt;
already see a ton of complexities, and I&#039;m sure there are more I&lt;br /&gt;
haven&#039;t even been able to see.&lt;br /&gt;
&lt;br /&gt;
So the remaining option is to do a branch to switch from MongoDB -&amp;gt;&lt;br /&gt;
SQL.  There&#039;s some risk of this also... it&#039;s hard to maintain a big&lt;br /&gt;
overhaul branch while the mainline is constantly changing.  There&#039;s&lt;br /&gt;
also a risk of fracturing, and if we change our mind and stay with&lt;br /&gt;
MongoDB, there&#039;s even a risk of forking!  Not to mention that working&lt;br /&gt;
on a branch that&#039;s so huge that doesn&#039;t get pulled in is incredibly&lt;br /&gt;
demoralizing.&lt;br /&gt;
&lt;br /&gt;
But we can reduce all those risks if we can come to a *consensus* that&lt;br /&gt;
this is what we want to do.  So I propose at the next meeting we&lt;br /&gt;
discuss this and try to make sure we&#039;re at community consensus before&lt;br /&gt;
agreeing to move to SQL (if that&#039;s indeed what we intend to do) and if&lt;br /&gt;
we do so, move to SQL *entirely*.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s what I envision the path to that future will look like:&lt;br /&gt;
&lt;br /&gt;
* Create a branch that prototypes all the models being switched over to SQLAlchemy, included &amp;quot;multiple media types&amp;quot; implemented with a friendly API.&lt;br /&gt;
* Assuming that works nice, continue work in that branch to switch all code over to using SQL.&lt;br /&gt;
* Figure out how to do migrations nicely in SQL, including with multiple media types (I have some thoughts on how to do this &amp;quot;nicely&amp;quot;)&lt;br /&gt;
* Create a MongoDB-&amp;gt;SQL migration tool&lt;br /&gt;
&lt;br /&gt;
Anyway, let&#039;s discuss this at next meeting!&lt;br /&gt;
&lt;br /&gt;
=== Elrond&#039;s comments ===&lt;br /&gt;
I&#039;m quite with Chris Webber here.&lt;br /&gt;
&lt;br /&gt;
One thing, I have to add/where I&#039;m thinking a bit different: We should try to identify tasks in the sql-migration that can be done just &amp;quot;now&amp;quot;. What does that mean? Moving to sql(alchemy) means a lot of changes. And some of these changes can be done with the mongodb backend as well. For example we&#039;re currently changing the document attribute access over from &amp;lt;code&amp;gt;doc[&amp;quot;field&amp;quot;]&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;doc.field&amp;lt;/code&amp;gt;. This does not hurt the current code (mostly) and makes the remaining &amp;quot;move to sql(alchemy)&amp;quot; easier. This reduces the amount of work happening in a long term branch. And that&#039;s the critical work (can be dropped, is demotivating, ...). So moving as much work as possible before actually starting the sql branch will increase motivation and decrease chances of failure. This sounds like more work, because the same code possibly needs to be touched twice. This might be true. It might also mean more work, as we might need to create some extra support code to assist in moving to a new idea. I still think, this is better, because it&#039;s outside of this long lived branch.&lt;br /&gt;
&lt;br /&gt;
== Some sketchup in SQL ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
create table users(&lt;br /&gt;
   id integer primary key not null,&lt;br /&gt;
   username varchar(30) unique not null,&lt;br /&gt;
   email text unique,&lt;br /&gt;
   created timestamp default CURRENT_TIMESTAMP,&lt;br /&gt;
   pw_hash text,&lt;br /&gt;
   email_verified boolean default FALSE,&lt;br /&gt;
   status varchar(30) default &#039;needs_email_verification&#039;,&lt;br /&gt;
   verification_key uuid,&lt;br /&gt;
   is_admin boolean default FALSE,&lt;br /&gt;
   url text,&lt;br /&gt;
   bio text,&lt;br /&gt;
   fp_verification_key uuid,&lt;br /&gt;
   fp_token_expire timestamp&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
create table file_records(&lt;br /&gt;
   id integer primary key not null,&lt;br /&gt;
   filename text array -- or json?&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
create table media_entries(&lt;br /&gt;
   id integer primary key not null,&lt;br /&gt;
   uploader integer references users(id) not null,&lt;br /&gt;
   title text,&lt;br /&gt;
   slug text,&lt;br /&gt;
   created timestamp default CURRENT_TIMESTAMP,&lt;br /&gt;
   description text,&lt;br /&gt;
   state text default &#039;unprocessed&#039;,&lt;br /&gt;
   queued_media_file integer references file_records(id),&lt;br /&gt;
   queued_task_id text,&lt;br /&gt;
   fail_error text,&lt;br /&gt;
   fail_metadata text -- json&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
create table media_files(&lt;br /&gt;
   id integer primary key not null,&lt;br /&gt;
   media_id integer references media_entries(id) not null,&lt;br /&gt;
   name varchar(30) not null,&lt;br /&gt;
      -- &amp;quot;original&amp;quot;, &amp;quot;thumbnail&amp;quot;, ...&lt;br /&gt;
      -- maybe also &amp;quot;attachment&amp;quot;-something?&lt;br /&gt;
   file integer references file_records(id) not null&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
create table media_comments(&lt;br /&gt;
   id integer primary key not null,&lt;br /&gt;
   media_entry integer references media_entries(id) not null,&lt;br /&gt;
   author integer references users(id) not null,&lt;br /&gt;
   created timestamp default CURRENT_TIMESTAMP,&lt;br /&gt;
   content text&lt;br /&gt;
   );&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Elrond</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=Meeting&amp;diff=392</id>
		<title>Meeting</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=Meeting&amp;diff=392"/>
		<updated>2011-11-13T15:15:41Z</updated>

		<summary type="html">&lt;p&gt;Elrond: More Agenda for next month&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= MediaGoblin Monthly Meeting =&lt;br /&gt;
&lt;br /&gt;
At 16:00 UTC the first saturday of each month, unless otherwise announced on the [http://lists.mediagoblin.org/pipermail/devel/ mailing list], there is an IRC meeting. The idea is to discuss the past month, what happened, what was good, what should be done better. And to create roadmap for the upcoming month and assign tasks to people willing to handle them.&lt;br /&gt;
&lt;br /&gt;
* [http://mediagoblin.org/irclogs/ IRC meeting logs]&lt;br /&gt;
&lt;br /&gt;
Typical Agenda topics:&lt;br /&gt;
* What happened in the last month, what was good, what could be better next time?&lt;br /&gt;
* What should be done next month?&lt;br /&gt;
&lt;br /&gt;
= Upcoming and Recent Meetings =&lt;br /&gt;
&lt;br /&gt;
== 2011-12 (upcoming 2011-12-03) ==&lt;br /&gt;
&lt;br /&gt;
Preliminary Agenda (in progress):&lt;br /&gt;
&lt;br /&gt;
* We plan to create a plugin system.  Do we want to create that soon or push it off until things settle a bit more?  ([[User:Willkg|Willkg]] 08:54, 10 November 2011 (EST))&lt;br /&gt;
* [[Feature Ideas]]: What should we do about the wiki page? Keep it and have it as a monthly topic for &amp;quot;what next&amp;quot;? Convert everything to long waiting bugs?&lt;br /&gt;
* Possibility of an [[SQL Database Backend]]?&lt;br /&gt;
&lt;br /&gt;
== 2011-11 (held on 2011-11-05) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Preliminary Agenda and preliminary results (in progress):&lt;br /&gt;
* What happened in the last month, what was good, what could be better next time?&lt;br /&gt;
** Release:&lt;br /&gt;
*** Good: 0.1.0 released!&lt;br /&gt;
*** Bad: postponing vs not postponing&lt;br /&gt;
** Sites and deployment documentation:&lt;br /&gt;
*** Good: new mediagoblin.org&lt;br /&gt;
*** Good: deployment documentation&lt;br /&gt;
*** Bad: py-bcrypt’s site was down just after the release, so the virtualenv deployment didn’t work, and it wasn’t clear how to fix it.&lt;br /&gt;
** Live instances:&lt;br /&gt;
*** Joar has a live instance!&lt;br /&gt;
*** But what does it mean? Should ordinary users start using it?&lt;br /&gt;
**** Details at [[User:Joar/mg.wandborg.se]] -- [[User:Joar|Joar]] 17:01, 6 November 2011 (EST)&lt;br /&gt;
*** nyergler added a note about &amp;quot;heartbeat&amp;quot;/status to API notes&lt;br /&gt;
* What should be done next month?&lt;br /&gt;
* Starting real work on federation (via OStatus)... and do we split any of this work out into its own library?&lt;br /&gt;
* An API&lt;br /&gt;
* Creative Commons licensing tools&lt;br /&gt;
* Merging in the multimedia/video branch&lt;br /&gt;
*: (this is *very close* already actually thanks to the hard work of Joar Wandborg!  But we need some help on the gstreamer front to fix a few issues... if you or someone you know is an expert in this area we could really use their help to make the videos that come out smoother!)&lt;br /&gt;
* Rollover items from 0.1.0&lt;br /&gt;
* Multiple file upload interface&lt;br /&gt;
* Drag and drop uploads interface (probably related!)&lt;br /&gt;
&lt;br /&gt;
[http://mediagoblin.org/irclogs/irc_meeting_2011-11-05.txt IRC log]&lt;br /&gt;
&lt;br /&gt;
== 2011-10 (held on 2011-10-01) ==&lt;br /&gt;
This month&#039;s meeting was a quickly announced short meeting. The project is getting back on track and next month&#039;s meeting will be scheduled more properly. A bunch of people were around.&lt;br /&gt;
&lt;br /&gt;
The most important decisions:&lt;br /&gt;
* The project will keep monthly releases. They&#039;re the heartbeat of the project.&lt;br /&gt;
* Release 0.1.0 this sunday/monday.&lt;br /&gt;
* New website will hopefully be deployed in the next few days.&lt;br /&gt;
* And the following things are planned to happen during this month: Most importantly federation. The developers have decided to make up their minds on what federation aactually should mean for MediaGoblin. Concerning code, probably &amp;quot;activity streams&amp;quot; are the first goal. If there is no (good) python library for this, a new stand alone library may be created. If so, a name for it has to be found. It should have something about communication in it. And the other thing to happen during this month is an ongoing discussion about &amp;quot;bus factor&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* [http://mediagoblin.org/irclogs/irc_meeting_2011-10-01.txt IRC log]&lt;br /&gt;
&lt;br /&gt;
== 2011-09 (held on 2011-09-03) ==&lt;br /&gt;
&lt;br /&gt;
* [http://mediagoblin.org/irclogs/irc_meeting_2011-09-03.txt IRC log]&lt;br /&gt;
&lt;br /&gt;
== 2011-08 (held on 2011-08-06) ==&lt;br /&gt;
&lt;br /&gt;
* [http://mediagoblin.org/irclogs/irc_meeting_2011-08-06.txt IRC log]&lt;/div&gt;</summary>
		<author><name>Elrond</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=SQL_Database_Backend&amp;diff=384</id>
		<title>SQL Database Backend</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=SQL_Database_Backend&amp;diff=384"/>
		<updated>2011-11-12T18:31:39Z</updated>

		<summary type="html">&lt;p&gt;Elrond: /* Introduction */ More &amp;quot;Why MongoDB&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
MediaGoblin currently uses MongoDB as its database backend. There have been various reasons for this decision (see: [[Why MongoDB]], yes really, look at it. It has a lot of insight what are the problems with sql). Still, the idea of an SQL backend is coming up from time to time.&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
The existence of this wiki page does not give any evidence of the SQL backend getting developed soon!&lt;br /&gt;
&lt;br /&gt;
== People ==&lt;br /&gt;
Even an experimental implementation of an SQL backend, that will only support basic features will need a good amount of time/energy from some (core) developers. That time/energy will not be available to other projects.&lt;br /&gt;
* Some knowing sqlalchemy is needed.&lt;br /&gt;
* Someone having a good idea on the thin db layer is needed (Elrond will most likely be available for helping)&lt;br /&gt;
* Someone having an idea on the current queries used in the code is needed too.&lt;br /&gt;
&lt;br /&gt;
== Development models ==&lt;br /&gt;
* The biggest question is: Do we want to try an experimental sql backend? This is a tricky question. If it fails, it will be a lot of wasted time/energy. And contributors wouldn&#039;t be happy to have wasted their time/energy.&lt;br /&gt;
* The wasted time/energy could be limited by limiting the first target. For example one could dedide, that the sql backend is not intended to support the full feature set.&lt;br /&gt;
* Then there is the question on how to develop this:&lt;br /&gt;
*# Long term branch: Develop an SQL replacement in a long term branch. The good: Anything can be changed as needed. Not so good: Some people dislike long term branches for various reasons.&lt;br /&gt;
*# Trying to develop this alongside the current backend, in tree.&lt;br /&gt;
&lt;br /&gt;
== Major Issues ==&lt;br /&gt;
The current db model uses dicts to allow flexible storage for extensions and different media types. Representing these data in SQL is not simple. The dicts are normally keyed by a string and have arbitrary values. There are basically two ways:&lt;br /&gt;
&lt;br /&gt;
# Have a table with a key column (string) and a value column (string, json encoded). This will allow easy reconstruction of the dict for an object fetch and will allow queries on the key of the dict.&lt;br /&gt;
#: &#039;&#039;However&#039;&#039;, it will not allow queries on the values. For example the imaginary geolocation extension will store the lat/lon there and might want to search for other media &amp;quot;nearby&amp;quot;.&lt;br /&gt;
#: If the value column is split into three columns (i.e. &amp;lt;code&amp;gt;value_int value_string value_json&amp;lt;/code&amp;gt;), some queries, such as those on numbers, would be possible. .&lt;br /&gt;
#: &#039;&#039;&#039;Note:&#039;&#039;&#039; The table would actually look something like this: &amp;lt;code&amp;gt;create table super_data_table(media_id references media(id), plugin_id int, key, value_int, value_string);&amp;lt;/code&amp;gt;&lt;br /&gt;
# Actually structure the things into distinct tables. The above mentioned imaginary geolocation extension would have its own table with lat/lon fields and be able to perform efficient queries on it.&lt;br /&gt;
&lt;br /&gt;
== Some sketchup in SQL ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
create table users(&lt;br /&gt;
   id integer primary key not null,&lt;br /&gt;
   username varchar(30) unique not null,&lt;br /&gt;
   email text unique,&lt;br /&gt;
   created timestamp default CURRENT_TIMESTAMP,&lt;br /&gt;
   pw_hash text,&lt;br /&gt;
   email_verified boolean default FALSE,&lt;br /&gt;
   status varchar(30) default &#039;needs_email_verification&#039;,&lt;br /&gt;
   verification_key uuid,&lt;br /&gt;
   is_admin boolean default FALSE,&lt;br /&gt;
   url text,&lt;br /&gt;
   bio text,&lt;br /&gt;
   fp_verification_key uuid,&lt;br /&gt;
   fp_token_expire timestamp&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
create table file_records(&lt;br /&gt;
   id integer primary key not null,&lt;br /&gt;
   filename text array -- or json?&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
create table media_entries(&lt;br /&gt;
   id integer primary key not null,&lt;br /&gt;
   uploader integer references users(id) not null,&lt;br /&gt;
   title text,&lt;br /&gt;
   slug text,&lt;br /&gt;
   created timestamp default CURRENT_TIMESTAMP,&lt;br /&gt;
   description text,&lt;br /&gt;
   state text default &#039;unprocessed&#039;,&lt;br /&gt;
   queued_media_file integer references file_records(id),&lt;br /&gt;
   queued_task_id text,&lt;br /&gt;
   fail_error text,&lt;br /&gt;
   fail_metadata text -- json&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
create table media_files(&lt;br /&gt;
   id integer primary key not null,&lt;br /&gt;
   media_id integer references media_entries(id) not null,&lt;br /&gt;
   name varchar(30) not null,&lt;br /&gt;
      -- &amp;quot;original&amp;quot;, &amp;quot;thumbnail&amp;quot;, ...&lt;br /&gt;
      -- maybe also &amp;quot;attachment&amp;quot;-something?&lt;br /&gt;
   file integer references file_records(id) not null&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
create table media_comments(&lt;br /&gt;
   id integer primary key not null,&lt;br /&gt;
   media_entry integer references media_entries(id) not null,&lt;br /&gt;
   author integer references users(id) not null,&lt;br /&gt;
   created timestamp default CURRENT_TIMESTAMP,&lt;br /&gt;
   content text&lt;br /&gt;
   );&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Elrond</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=SQL_Database_Backend&amp;diff=382</id>
		<title>SQL Database Backend</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=SQL_Database_Backend&amp;diff=382"/>
		<updated>2011-11-12T18:05:40Z</updated>

		<summary type="html">&lt;p&gt;Elrond: Some more notes on hacky ways to store dicts.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
MediaGoblin currently uses MongoDB as its database backend. There have been various reasons for this decision (see: [[Why MongoDB]]). Still, the idea of an SQL backend is coming up from time to time.&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
The existence of this wiki page does not give any evidence of the SQL backend getting developed soon!&lt;br /&gt;
&lt;br /&gt;
== People ==&lt;br /&gt;
Even an experimental implementation of an SQL backend, that will only support basic features will need a good amount of time/energy from some (core) developers. That time/energy will not be available to other projects.&lt;br /&gt;
* Some knowing sqlalchemy is needed.&lt;br /&gt;
* Someone having a good idea on the thin db layer is needed (Elrond will most likely be available for helping)&lt;br /&gt;
* Someone having an idea on the current queries used in the code is needed too.&lt;br /&gt;
&lt;br /&gt;
== Development models ==&lt;br /&gt;
* The biggest question is: Do we want to try an experimental sql backend? This is a tricky question. If it fails, it will be a lot of wasted time/energy. And contributors wouldn&#039;t be happy to have wasted their time/energy.&lt;br /&gt;
* The wasted time/energy could be limited by limiting the first target. For example one could dedide, that the sql backend is not intended to support the full feature set.&lt;br /&gt;
* Then there is the question on how to develop this:&lt;br /&gt;
*# Long term branch: Develop an SQL replacement in a long term branch. The good: Anything can be changed as needed. Not so good: Some people dislike long term branches for various reasons.&lt;br /&gt;
*# Trying to develop this alongside the current backend, in tree.&lt;br /&gt;
&lt;br /&gt;
== Major Issues ==&lt;br /&gt;
The current db model uses dicts to allow flexible storage for extensions and different media types. Representing those in sql is not simple. The dicts are normally keyed by a string and have arbitrary values. There are basicly two ways:&lt;br /&gt;
# Have a table with a key column (string) and a value column (string, json encoded). This will allow easy reconstruction of the dict for an object fetch and will allow queries on the key of the dict.&lt;br /&gt;
#: BUT: It will not allow queries on the values. For example the imaginary geolocation extension will store the lat/lon there and might want to search for other media &amp;quot;nearby&amp;quot;.&lt;br /&gt;
#: If the value column is split into value_int, value_string, value_json, some queries would work. Like on numbers.&lt;br /&gt;
#: Note: The table would actually look something like this: create table super_data_table(media_id references media(id), plugin_id int, key, value_int, value_string);&lt;br /&gt;
# Actually structure the things into distinct tables. The above mentioned imaginary geolocation extension would have its own table with lat/lon fields and be able to perform efficient queries on it.&lt;br /&gt;
&lt;br /&gt;
== Some sketchup in SQL ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
create table users(&lt;br /&gt;
   id integer primary key not null,&lt;br /&gt;
   username varchar(30) unique not null,&lt;br /&gt;
   email text unique,&lt;br /&gt;
   created timestamp default CURRENT_TIMESTAMP,&lt;br /&gt;
   pw_hash text,&lt;br /&gt;
   email_verified boolean default FALSE,&lt;br /&gt;
   status varchar(30) default &#039;needs_email_verification&#039;,&lt;br /&gt;
   verification_key uuid,&lt;br /&gt;
   is_admin boolean default FALSE,&lt;br /&gt;
   url text,&lt;br /&gt;
   bio text,&lt;br /&gt;
   fp_verification_key uuid,&lt;br /&gt;
   fp_token_expire timestamp&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
create table file_records(&lt;br /&gt;
   id integer primary key not null,&lt;br /&gt;
   filename text array -- or json?&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
create table media_entries(&lt;br /&gt;
   id integer primary key not null,&lt;br /&gt;
   uploader integer references users(id) not null,&lt;br /&gt;
   title text,&lt;br /&gt;
   slug text,&lt;br /&gt;
   created timestamp default CURRENT_TIMESTAMP,&lt;br /&gt;
   description text,&lt;br /&gt;
   state text default &#039;unprocessed&#039;,&lt;br /&gt;
   queued_media_file integer references file_records(id),&lt;br /&gt;
   queued_task_id text,&lt;br /&gt;
   fail_error text,&lt;br /&gt;
   fail_metadata text -- json&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
create table media_files(&lt;br /&gt;
   id integer primary key not null,&lt;br /&gt;
   media_id integer references media_entries(id) not null,&lt;br /&gt;
   name varchar(30) not null,&lt;br /&gt;
      -- &amp;quot;original&amp;quot;, &amp;quot;thumbnail&amp;quot;, ...&lt;br /&gt;
      -- maybe also &amp;quot;attachment&amp;quot;-something?&lt;br /&gt;
   file integer references file_records(id) not null&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
create table media_comments(&lt;br /&gt;
   id integer primary key not null,&lt;br /&gt;
   media_entry integer references media_entries(id) not null,&lt;br /&gt;
   author integer references users(id) not null,&lt;br /&gt;
   created timestamp default CURRENT_TIMESTAMP,&lt;br /&gt;
   content text&lt;br /&gt;
   );&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Elrond</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=SQL_Database_Backend&amp;diff=381</id>
		<title>SQL Database Backend</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=SQL_Database_Backend&amp;diff=381"/>
		<updated>2011-11-12T17:22:21Z</updated>

		<summary type="html">&lt;p&gt;Elrond: Fix for sql&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
MediaGoblin currently uses MongoDB as its database backend. There have been various reasons for this decision (see: [[Why MongoDB]]). Still, the idea of an SQL backend is coming up from time to time.&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
The existence of this wiki page does not give any evidence of the SQL backend getting developed soon!&lt;br /&gt;
&lt;br /&gt;
== People ==&lt;br /&gt;
Even an experimental implementation of an SQL backend, that will only support basic features will need a good amount of time/energy from some (core) developers. That time/energy will not be available to other projects.&lt;br /&gt;
* Some knowing sqlalchemy is needed.&lt;br /&gt;
* Someone having a good idea on the thin db layer is needed (Elrond will most likely be available for helping)&lt;br /&gt;
* Someone having an idea on the current queries used in the code is needed too.&lt;br /&gt;
&lt;br /&gt;
== Development models ==&lt;br /&gt;
* The biggest question is: Do we want to try an experimental sql backend? This is a tricky question. If it fails, it will be a lot of wasted time/energy. And contributors wouldn&#039;t be happy to have wasted their time/energy.&lt;br /&gt;
* The wasted time/energy could be limited by limiting the first target. For example one could dedide, that the sql backend is not intended to support the full feature set.&lt;br /&gt;
* Then there is the question on how to develop this:&lt;br /&gt;
*# Long term branch: Develop an SQL replacement in a long term branch. The good: Anything can be changed as needed. Not so good: Some people dislike long term branches for various reasons.&lt;br /&gt;
*# Trying to develop this alongside the current backend, in tree.&lt;br /&gt;
&lt;br /&gt;
== Major Issues ==&lt;br /&gt;
The current db model uses dicts to allow flexible storage for extensions and different media types. Representing those in sql is not simple. The dicts are normally keyed by a string and have arbitrary values. There are basicly two ways:&lt;br /&gt;
# Have a table with a key column (string) and a value column (string, json encoded). This will allow easy reconstruction of the dict for an object fetch and will allow queries on the key of the dict.&lt;br /&gt;
#: BUT: It will not allow queries on the values. For example the imaginary geolocation extension will store the lat/lon there and might want to search for other media &amp;quot;nearby&amp;quot;.&lt;br /&gt;
# Actually structure the things into distinct tables. The above mentioned imaginary geolocation extension would have its own table with lat/lon fields and be able to perform efficient queries on it.&lt;br /&gt;
&lt;br /&gt;
== Some sketchup in SQL ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
create table users(&lt;br /&gt;
   id integer primary key not null,&lt;br /&gt;
   username varchar(30) unique not null,&lt;br /&gt;
   email text unique,&lt;br /&gt;
   created timestamp default CURRENT_TIMESTAMP,&lt;br /&gt;
   pw_hash text,&lt;br /&gt;
   email_verified boolean default FALSE,&lt;br /&gt;
   status varchar(30) default &#039;needs_email_verification&#039;,&lt;br /&gt;
   verification_key uuid,&lt;br /&gt;
   is_admin boolean default FALSE,&lt;br /&gt;
   url text,&lt;br /&gt;
   bio text,&lt;br /&gt;
   fp_verification_key uuid,&lt;br /&gt;
   fp_token_expire timestamp&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
create table file_records(&lt;br /&gt;
   id integer primary key not null,&lt;br /&gt;
   filename text array -- or json?&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
create table media_entries(&lt;br /&gt;
   id integer primary key not null,&lt;br /&gt;
   uploader integer references users(id) not null,&lt;br /&gt;
   title text,&lt;br /&gt;
   slug text,&lt;br /&gt;
   created timestamp default CURRENT_TIMESTAMP,&lt;br /&gt;
   description text,&lt;br /&gt;
   state text default &#039;unprocessed&#039;,&lt;br /&gt;
   queued_media_file integer references file_records(id),&lt;br /&gt;
   queued_task_id text,&lt;br /&gt;
   fail_error text,&lt;br /&gt;
   fail_metadata text -- json&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
create table media_files(&lt;br /&gt;
   id integer primary key not null,&lt;br /&gt;
   media_id integer references media_entries(id) not null,&lt;br /&gt;
   name varchar(30) not null,&lt;br /&gt;
      -- &amp;quot;original&amp;quot;, &amp;quot;thumbnail&amp;quot;, ...&lt;br /&gt;
      -- maybe also &amp;quot;attachment&amp;quot;-something?&lt;br /&gt;
   file integer references file_records(id) not null&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
create table media_comments(&lt;br /&gt;
   id integer primary key not null,&lt;br /&gt;
   media_entry integer references media_entries(id) not null,&lt;br /&gt;
   author integer references users(id) not null,&lt;br /&gt;
   created timestamp default CURRENT_TIMESTAMP,&lt;br /&gt;
   content text&lt;br /&gt;
   );&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Elrond</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=SQL_Database_Backend&amp;diff=380</id>
		<title>SQL Database Backend</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=SQL_Database_Backend&amp;diff=380"/>
		<updated>2011-11-12T17:14:48Z</updated>

		<summary type="html">&lt;p&gt;Elrond: Some ideas on the sql schema&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
MediaGoblin currently uses MongoDB as its database backend. There have been various reasons for this decision (see: [[Why MongoDB]]). Still, the idea of an SQL backend is coming up from time to time.&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
The existence of this wiki page does not give any evidence of the SQL backend getting developed soon!&lt;br /&gt;
&lt;br /&gt;
== People ==&lt;br /&gt;
Even an experimental implementation of an SQL backend, that will only support basic features will need a good amount of time/energy from some (core) developers. That time/energy will not be available to other projects.&lt;br /&gt;
* Some knowing sqlalchemy is needed.&lt;br /&gt;
* Someone having a good idea on the thin db layer is needed (Elrond will most likely be available for helping)&lt;br /&gt;
* Someone having an idea on the current queries used in the code is needed too.&lt;br /&gt;
&lt;br /&gt;
== Development models ==&lt;br /&gt;
* The biggest question is: Do we want to try an experimental sql backend? This is a tricky question. If it fails, it will be a lot of wasted time/energy. And contributors wouldn&#039;t be happy to have wasted their time/energy.&lt;br /&gt;
* The wasted time/energy could be limited by limiting the first target. For example one could dedide, that the sql backend is not intended to support the full feature set.&lt;br /&gt;
* Then there is the question on how to develop this:&lt;br /&gt;
*# Long term branch: Develop an SQL replacement in a long term branch. The good: Anything can be changed as needed. Not so good: Some people dislike long term branches for various reasons.&lt;br /&gt;
*# Trying to develop this alongside the current backend, in tree.&lt;br /&gt;
&lt;br /&gt;
== Major Issues ==&lt;br /&gt;
The current db model uses dicts to allow flexible storage for extensions and different media types. Representing those in sql is not simple. The dicts are normally keyed by a string and have arbitrary values. There are basicly two ways:&lt;br /&gt;
# Have a table with a key column (string) and a value column (string, json encoded). This will allow easy reconstruction of the dict for an object fetch and will allow queries on the key of the dict.&lt;br /&gt;
#: BUT: It will not allow queries on the values. For example the imaginary geolocation extension will store the lat/lon there and might want to search for other media &amp;quot;nearby&amp;quot;.&lt;br /&gt;
# Actually structure the things into distinct tables. The above mentioned imaginary geolocation extension would have its own table with lat/lon fields and be able to perform efficient queries on it.&lt;br /&gt;
&lt;br /&gt;
== Some sketchup in SQL ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
create table users(&lt;br /&gt;
   id integer primary key not null,&lt;br /&gt;
   username varchar(30) unique not null,&lt;br /&gt;
   email text unique,&lt;br /&gt;
   created timestamp default CURRENT_TIMESTAMP,&lt;br /&gt;
   pw_hash text,&lt;br /&gt;
   email_verified boolean default FALSE,&lt;br /&gt;
   status varchar(20) default &#039;needs_email_verification&#039;,&lt;br /&gt;
   verification_key uuid,&lt;br /&gt;
   is_admin boolean default FALSE,&lt;br /&gt;
   url text,&lt;br /&gt;
   bio text,&lt;br /&gt;
   fp_verification_key uuid,&lt;br /&gt;
   fp_token_expire timestamp&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
create table file_records(&lt;br /&gt;
   id integer primary key not null,&lt;br /&gt;
   filename text array -- or json?&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
create table media_entries(&lt;br /&gt;
   id integer primary key not null,&lt;br /&gt;
   uploader integer references users(id) not null,&lt;br /&gt;
   title text,&lt;br /&gt;
   slug text,&lt;br /&gt;
   created timestamp default CURRENT_TIMESTAMP,&lt;br /&gt;
   description text,&lt;br /&gt;
   state text default &#039;unprocessed&#039;,&lt;br /&gt;
   queued_media_file integer references file_records(id),&lt;br /&gt;
   queued_task_id text,&lt;br /&gt;
   fail_error text,&lt;br /&gt;
   fail_metadata text -- json&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
create table media_files(&lt;br /&gt;
   id integer primary key not null,&lt;br /&gt;
   media_id integer references media_entries(id) not null,&lt;br /&gt;
   name varchar(30) not null,&lt;br /&gt;
      -- &amp;quot;original&amp;quot;, &amp;quot;thumbnail&amp;quot;, ...&lt;br /&gt;
      -- maybe also &amp;quot;attachment&amp;quot;-something?&lt;br /&gt;
   file integer references file_records(id) not null&lt;br /&gt;
   );&lt;br /&gt;
&lt;br /&gt;
create table media_comments(&lt;br /&gt;
   id integer primary key not null,&lt;br /&gt;
   media_entry integer references media_entries(id) not null,&lt;br /&gt;
   author integer references users(id) not null,&lt;br /&gt;
   created timestamp default CURRENT_TIMESTAMP,&lt;br /&gt;
   content text&lt;br /&gt;
   );&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Elrond</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=Meeting&amp;diff=355</id>
		<title>Meeting</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=Meeting&amp;diff=355"/>
		<updated>2011-11-04T19:26:34Z</updated>

		<summary type="html">&lt;p&gt;Elrond: Update agenda for 2011-11 meeting&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= MediaGoblin Monthly Meeting =&lt;br /&gt;
&lt;br /&gt;
At 16:00 UTC the first saturday of each month, unless otherwise announced on the [http://lists.mediagoblin.org/pipermail/devel/ mailing list], there is an IRC meeting. The idea is to discuss the past month, what happened, what was good, what should be done better. And to create roadmap for the upcoming month and assign tasks to people willing to handle them.&lt;br /&gt;
&lt;br /&gt;
* [http://mediagoblin.org/irclogs/ IRC meeting logs]&lt;br /&gt;
&lt;br /&gt;
= Upcoming and Recent Meetings =&lt;br /&gt;
&lt;br /&gt;
== 2011-11 (upcoming: 2011-11-05) ==&lt;br /&gt;
Scheduled for 2011-11-05 16:00:00 UTC.&lt;br /&gt;
&lt;br /&gt;
Preliminary Agenda:&lt;br /&gt;
* What happened in the last month, what was good, what could be better next time?&lt;br /&gt;
* What should be done next month?&lt;br /&gt;
* Starting real work on federation (via OStatus)... and do we split any of this work out into its own library?&lt;br /&gt;
* An API&lt;br /&gt;
* Creative Commons licensing tools&lt;br /&gt;
* Merging in the multimedia/video branch&lt;br /&gt;
*: (this is *very close* already actually thanks to the hard work of Joar Wandborg!  But we need some help on the gstreamer front to fix a few issues... if you or someone you know is an expert in this area we could really use their help to make the videos that come out smoother!)&lt;br /&gt;
* Rollover items from 0.1.0&lt;br /&gt;
* Possibility of an [[SQL Database Backend]]?&lt;br /&gt;
&lt;br /&gt;
== 2011-10 (held on 2011-10-01) ==&lt;br /&gt;
This month&#039;s meeting was a quickly announced short meeting. The project is getting back on track and next month&#039;s meeting will be scheduled more properly. A bunch of people were around.&lt;br /&gt;
&lt;br /&gt;
The most important decisions:&lt;br /&gt;
* The project will keep monthly releases. They&#039;re the heartbeat of the project.&lt;br /&gt;
* Release 0.1.0 this sunday/monday.&lt;br /&gt;
* New website will hopefully be deployed in the next few days.&lt;br /&gt;
* And the following things are planned to happen during this month: Most importantly federation. The developers have decided to make up their minds on what federation aactually should mean for MediaGoblin. Concerning code, probably &amp;quot;activity streams&amp;quot; are the first goal. If there is no (good) python library for this, a new stand alone library may be created. If so, a name for it has to be found. It should have something about communication in it. And the other thing to happen during this month is an ongoing discussion about &amp;quot;bus factor&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== 2011-09 (held on 2011-09-03) ==&lt;br /&gt;
&lt;br /&gt;
* [http://mediagoblin.org/irclogs/irc_meeting_2011-09-03.txt IRC log]&lt;br /&gt;
&lt;br /&gt;
== 2011-08 (held on 2011-08-06) ==&lt;br /&gt;
&lt;br /&gt;
* [http://mediagoblin.org/irclogs/irc_meeting_2011-08-06.txt IRC log]&lt;/div&gt;</summary>
		<author><name>Elrond</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=Meeting&amp;diff=343</id>
		<title>Meeting</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=Meeting&amp;diff=343"/>
		<updated>2011-10-30T22:16:41Z</updated>

		<summary type="html">&lt;p&gt;Elrond: Possible topic: SQL Database Backend possibility?&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= MediaGoblin Monthly Meeting =&lt;br /&gt;
&lt;br /&gt;
At the beginning of each month there is an IRC meeting. The idea is to discuss the past month, what happened, what was good, what should be done better. And to create roadmap for the upcoming month and assign tasks to people willing to handle them.&lt;br /&gt;
&lt;br /&gt;
* [http://mediagoblin.org/irclogs/ IRC meeting logs]&lt;br /&gt;
&lt;br /&gt;
= Upcoming and Recent Meetings =&lt;br /&gt;
&lt;br /&gt;
== 2011-11 (upcoming: 2011-11-05) ==&lt;br /&gt;
Scheduled for 2011-11-05 16:00:00 UTC.&lt;br /&gt;
&lt;br /&gt;
Preliminary Agenda:&lt;br /&gt;
* What happened in the last month, what was good, what could be better next time?&lt;br /&gt;
* What should be done next month?&lt;br /&gt;
* Possibility of an [[SQL Database Backend]]?&lt;br /&gt;
&lt;br /&gt;
== 2011-10 (held on 2011-10-01) ==&lt;br /&gt;
This month&#039;s meeting was a quickly announced short meeting. The project is getting back on track and next month&#039;s meeting will be scheduled more properly. A bunch of people were around.&lt;br /&gt;
&lt;br /&gt;
The most important decisions:&lt;br /&gt;
* The project will keep monthly releases. They&#039;re the heartbeat of the project.&lt;br /&gt;
* Release 0.1.0 this sunday/monday.&lt;br /&gt;
* New website will hopefully be deployed in the next few days.&lt;br /&gt;
* And the following things are planned to happen during this month: Most importantly federation. The developers have decided to make up their minds on what federation aactually should mean for MediaGoblin. Concerning code, probably &amp;quot;activity streams&amp;quot; are the first goal. If there is no (good) python library for this, a new stand alone library may be created. If so, a name for it has to be found. It should have something about communication in it. And the other thing to happen during this month is an ongoing discussion about &amp;quot;bus factor&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== 2011-09 (held on 2011-09-03) ==&lt;br /&gt;
&lt;br /&gt;
* [http://mediagoblin.org/irclogs/irc_meeting_2011-09-03.txt IRC log]&lt;br /&gt;
&lt;br /&gt;
== 2011-08 (held on 2011-08-06) ==&lt;br /&gt;
&lt;br /&gt;
* [http://mediagoblin.org/irclogs/irc_meeting_2011-08-06.txt IRC log]&lt;/div&gt;</summary>
		<author><name>Elrond</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=Meeting&amp;diff=342</id>
		<title>Meeting</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=Meeting&amp;diff=342"/>
		<updated>2011-10-30T22:01:58Z</updated>

		<summary type="html">&lt;p&gt;Elrond: Schedule 2011-11 meeting&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= MediaGoblin Monthly Meeting =&lt;br /&gt;
&lt;br /&gt;
At the beginning of each month there is an IRC meeting. The idea is to discuss the past month, what happened, what was good, what should be done better. And to create roadmap for the upcoming month and assign tasks to people willing to handle them.&lt;br /&gt;
&lt;br /&gt;
* [http://mediagoblin.org/irclogs/ IRC meeting logs]&lt;br /&gt;
&lt;br /&gt;
= Upcoming and Recent Meetings =&lt;br /&gt;
&lt;br /&gt;
== 2011-11 (upcoming: 2011-11-05) ==&lt;br /&gt;
Scheduled for 2011-11-05 16:00:00 UTC.&lt;br /&gt;
&lt;br /&gt;
Preliminary Agenda:&lt;br /&gt;
* What happened in the last month, what was good, what could be better next time?&lt;br /&gt;
* What should be done next month?&lt;br /&gt;
&lt;br /&gt;
== 2011-10 (held on 2011-10-01) ==&lt;br /&gt;
This month&#039;s meeting was a quickly announced short meeting. The project is getting back on track and next month&#039;s meeting will be scheduled more properly. A bunch of people were around.&lt;br /&gt;
&lt;br /&gt;
The most important decisions:&lt;br /&gt;
* The project will keep monthly releases. They&#039;re the heartbeat of the project.&lt;br /&gt;
* Release 0.1.0 this sunday/monday.&lt;br /&gt;
* New website will hopefully be deployed in the next few days.&lt;br /&gt;
* And the following things are planned to happen during this month: Most importantly federation. The developers have decided to make up their minds on what federation aactually should mean for MediaGoblin. Concerning code, probably &amp;quot;activity streams&amp;quot; are the first goal. If there is no (good) python library for this, a new stand alone library may be created. If so, a name for it has to be found. It should have something about communication in it. And the other thing to happen during this month is an ongoing discussion about &amp;quot;bus factor&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== 2011-09 (held on 2011-09-03) ==&lt;br /&gt;
&lt;br /&gt;
* [http://mediagoblin.org/irclogs/irc_meeting_2011-09-03.txt IRC log]&lt;br /&gt;
&lt;br /&gt;
== 2011-08 (held on 2011-08-06) ==&lt;br /&gt;
&lt;br /&gt;
* [http://mediagoblin.org/irclogs/irc_meeting_2011-08-06.txt IRC log]&lt;/div&gt;</summary>
		<author><name>Elrond</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=Why_(non-mandatory)_copyright_assignment&amp;diff=330</id>
		<title>Why (non-mandatory) copyright assignment</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=Why_(non-mandatory)_copyright_assignment&amp;diff=330"/>
		<updated>2011-10-18T10:37:41Z</updated>

		<summary type="html">&lt;p&gt;Elrond: Better sorting in the Category&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Chris Webber on &amp;quot;Why copyright assignment?&amp;quot;:==&lt;br /&gt;
&lt;br /&gt;
GNU MediaGoblin is a GNU project with non-mandatory but heavily&lt;br /&gt;
encouraged copyright assignment to the FSF.  Most, if not all, of&lt;br /&gt;
the core contributors to GNU MediaGoblin will have done a&lt;br /&gt;
copyright assignment, but unlike some other GNU projects, it isn&#039;t&lt;br /&gt;
required here.  We think this is the best choice for GNU&lt;br /&gt;
MediaGoblin: it ensures that the Free Software Foundation may&lt;br /&gt;
protect the software by enforcing the AGPL if the FSF sees fit,&lt;br /&gt;
but it also means that we can immediately merge in changes from a&lt;br /&gt;
new contributor.  It also means that some significant non-FSF&lt;br /&gt;
contributors might also be able to enforce the AGPL if seen fit.&lt;br /&gt;
&lt;br /&gt;
Again, assignment is not mandatory, but it is heavily encouraged,&lt;br /&gt;
even incentivized: Significant contributors who do a copyright&lt;br /&gt;
assignment to the FSF are eligible to have a unique goblin drawing&lt;br /&gt;
produced for them by the project&#039;s main founder, Christopher Allan&lt;br /&gt;
Webber.&amp;lt;ref&amp;gt; [[contributing-howto]]&amp;lt;/ref&amp;gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Left this here &#039;cause not sure if how you want it done... See :ref:`contributing-howto-chapter` for details.--&amp;gt;&lt;br /&gt;
{{references | 1}}&lt;br /&gt;
[[Category:DesignDecisions|Copyright Assignment]]&lt;/div&gt;</summary>
		<author><name>Elrond</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=Why_GNU_MediaGoblin&amp;diff=328</id>
		<title>Why GNU MediaGoblin</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=Why_GNU_MediaGoblin&amp;diff=328"/>
		<updated>2011-10-18T10:35:50Z</updated>

		<summary type="html">&lt;p&gt;Elrond: Better sorting in the Category&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==[[Chris Webber]] and [[Will Kahn-Greene]] on &amp;quot;Why GNU MediaGoblin&amp;quot;:==&lt;br /&gt;
&lt;br /&gt;
Chris came up with the name MediaGoblin.  The name is pretty fun.&lt;br /&gt;
It merges the idea that this is a Media hosting project with&lt;br /&gt;
Goblin which sort of sounds like gobbling.  Here&#039;s a piece of&lt;br /&gt;
software that gobbles up your media for all to see.&lt;br /&gt;
&lt;br /&gt;
[http://en.wikipedia.org/wiki/Goblin According to Wikipedia], a&lt;br /&gt;
goblin is:&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&amp;quot;A legendary evil or mischievous illiterate creature, described&lt;br /&gt;
:as grotesquely evil or evil-like phantom&amp;quot;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
So are we evil?  No.  Are we mischievous or illiterate?  Not&lt;br /&gt;
really.  So what kind of goblin are we thinking about?  We&#039;re&lt;br /&gt;
thinking about these goblins:&lt;br /&gt;
{|&lt;br /&gt;
|[[File:goblin.png | thumb |upright| alt=Cute goblin with a beret|Cute goblin with a beret. Illustrated by Chris Webber]]&lt;br /&gt;
|[[File:snugglygoblin.png | thumb |upright| alt=Snuggly goblin with a beret.|Snuggly goblin. Illustrated by Karen Rustad]]&lt;br /&gt;
|}   .&lt;br /&gt;
Those are pretty cute goblins.  Those are the kinds of goblins&lt;br /&gt;
we&#039;re thinking about.&lt;br /&gt;
&lt;br /&gt;
==Why GNU?==&lt;br /&gt;
Chris started doing work on the project after thinking about it&lt;br /&gt;
for a year.  Then, after talking with Matt and Rob, it became an&lt;br /&gt;
official [[GNU]] project.  Thus we now call it GNU MediaGoblin.&lt;br /&gt;
&lt;br /&gt;
==Request==&lt;br /&gt;
That&#039;s a lot of letters, though, so in the interest of brevity and&lt;br /&gt;
facilitating easier casual conversation and balancing that with&lt;br /&gt;
what&#039;s important to us, we have the following rules:&lt;br /&gt;
&lt;br /&gt;
#&amp;quot;GNU MediaGoblin&amp;quot; is the name we&#039;re going to use in all official capacities: web site, documentation, press releases.&lt;br /&gt;
#In casual conversation, it&#039;s ok to use more casual names.&lt;br /&gt;
#If you&#039;re writing about the project, we ask that you call it GNU MediaGoblin.&lt;br /&gt;
#If you don&#039;t like the name, we kindly ask you to take a deep breath, think a happy thought about cute little goblins playing on a playground and taking cute pictures of themselves, and let it go (Will added this one.)&lt;br /&gt;
&lt;br /&gt;
[[Category:DesignDecisions| ]]&lt;/div&gt;</summary>
		<author><name>Elrond</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=Why_Python&amp;diff=327</id>
		<title>Why Python</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=Why_Python&amp;diff=327"/>
		<updated>2011-10-18T10:28:32Z</updated>

		<summary type="html">&lt;p&gt;Elrond: Better sorting in the Category&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Chris Webber on &amp;quot;Why Python&amp;quot;:==&lt;br /&gt;
&lt;br /&gt;
Because I know Python, love Python, am capable of actually making&lt;br /&gt;
this thing happen in Python (I&#039;ve worked on a lot of large free&lt;br /&gt;
software web applications before in Python, including [http://mirocommunity.org/ Miro Community] the [http://miroguide.org/ Miro Guide] a large portion of [http://creativecommons.org/ Creative Commons] and a whole bunch of things while working at [http://www.imagescape.com/ Imaginary Landscape]). Me starting a project like this makes sense if it&#039;s&lt;br /&gt;
done in Python.&lt;br /&gt;
==Why not...==&lt;br /&gt;
You might say that PHP is way more deployable, that Rails has way&lt;br /&gt;
more cool developers riding around on fixie bikes---and all of&lt;br /&gt;
those things are true.  But I know Python, like Python, and think&lt;br /&gt;
that Python is pretty great.  I do think that deployment in Python&lt;br /&gt;
is not as good as with PHP, but I think the days of shared hosting&lt;br /&gt;
are (thankfully) coming to an end, and will probably be replaced&lt;br /&gt;
by cheap virtual machines spun up on the fly for people who want&lt;br /&gt;
that sort of stuff, and Python will be a huge part of that future,&lt;br /&gt;
maybe even more than PHP will.  The deployment tools are getting&lt;br /&gt;
better.  Maybe we can use something like Silver Lining.  Maybe we&lt;br /&gt;
can just distribute as .debs or .rpms.  We&#039;ll figure it&lt;br /&gt;
out when we get there.&lt;br /&gt;
&lt;br /&gt;
Regardless, if I&#039;m starting this project, which I am, it&#039;s gonna&lt;br /&gt;
be in Python.&lt;br /&gt;
&lt;br /&gt;
[[Category:DesignDecisions|Python]]&lt;/div&gt;</summary>
		<author><name>Elrond</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=Why_MongoDB&amp;diff=326</id>
		<title>Why MongoDB</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=Why_MongoDB&amp;diff=326"/>
		<updated>2011-10-18T10:27:21Z</updated>

		<summary type="html">&lt;p&gt;Elrond: Better sorting in the Category&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Chris Webber on &amp;quot;Why MongoDB&amp;quot;:==&lt;br /&gt;
In case you were wondering, I am not a NOSQL fanboy, I do not go&lt;br /&gt;
around telling people that MongoDB is web scale.  Actually my&lt;br /&gt;
choice for MongoDB isn&#039;t scalability, though scaling up really&lt;br /&gt;
nicely is a pretty good feature and sets us up well in case large&lt;br /&gt;
volume sites eventually do use MediaGoblin.  But there&#039;s another&lt;br /&gt;
side of scalability, and that&#039;s scaling down, which is important&lt;br /&gt;
for federation, maybe even more important than scaling up in an&lt;br /&gt;
ideal universe where everyone ran servers out of their own&lt;br /&gt;
housing.  As a memory-mapped database, MongoDB is pretty hungry,&lt;br /&gt;
so actually I spent a lot of time debating whether the inability&lt;br /&gt;
to scale down as nicely as something like SQL has with sqlite&lt;br /&gt;
meant that it was out. But I decided in the end that I really want MongoDB, not for scalability, but for flexibility.  Schema evolution pains in SQL&lt;br /&gt;
are almost enough reason for me to want MongoDB, but not quite.&lt;br /&gt;
&lt;br /&gt;
==Most Importantly==&lt;br /&gt;
The real reason is because I want the ability to eventually handle&lt;br /&gt;
multiple media types through MediaGoblin, and also allow for&lt;br /&gt;
plugins, without the rigidity of tables making that difficult.  In&lt;br /&gt;
other words, something like::&lt;br /&gt;
&lt;br /&gt;
        {&amp;quot;title&amp;quot;: &amp;quot;Me talking until you are bored&amp;quot;,&lt;br /&gt;
         &amp;quot;description&amp;quot;: &amp;quot;blah blah blah&amp;quot;,&lt;br /&gt;
         &amp;quot;media_type&amp;quot;: &amp;quot;audio&amp;quot;,&lt;br /&gt;
         &amp;quot;media_data&amp;quot;: {&lt;br /&gt;
             &amp;quot;length&amp;quot;: &amp;quot;2:30&amp;quot;,&lt;br /&gt;
             &amp;quot;codec&amp;quot;: &amp;quot;OGG Vorbis&amp;quot;},&lt;br /&gt;
         &amp;quot;plugin_data&amp;quot;: {&lt;br /&gt;
             &amp;quot;licensing&amp;quot;: {&lt;br /&gt;
                 &amp;quot;license&amp;quot;: &amp;quot;http://creativecommons.org/licenses/by-sa/3.0/&amp;quot;}}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Being able to just dump media-specific information in a media_data&lt;br /&gt;
hashtable is pretty great, and even better is having a plugin&lt;br /&gt;
system where you can just let plugins have their own entire&lt;br /&gt;
key-value space cleanly inside the document that doesn&#039;t interfere&lt;br /&gt;
with anyone else&#039;s stuff. If we were to let plugins to deposit&lt;br /&gt;
their own information inside the database, either we&#039;d let plugins&lt;br /&gt;
create their own tables which makes SQL migrations even harder&lt;br /&gt;
than they already are, or we&#039;d probably end up creating a table&lt;br /&gt;
with a column for key, a column for value, and a column for type&lt;br /&gt;
in one huge table called &amp;quot;plugin_data&amp;quot; or something similar.  (Yo&lt;br /&gt;
dawg, I heard you liked plugins, so I put a database in your&lt;br /&gt;
database so you can query while you query.)  Gross.&lt;br /&gt;
&lt;br /&gt;
==Keeping It Clean==&lt;br /&gt;
I also don&#039;t want things to be too loose so that we forget or lose&lt;br /&gt;
the structure of things, and that&#039;s one reason why I want to use&lt;br /&gt;
MongoKit, because we can cleanly define a much structure as we&lt;br /&gt;
want and verify that documents match that structure generally&lt;br /&gt;
without adding too much bloat or overhead (MongoKit is a pretty&lt;br /&gt;
lightweight wrapper and doesn&#039;t inject extra MongoKit-specific&lt;br /&gt;
stuff into the database, which is nice and nicer than many other&lt;br /&gt;
ORMs in that way).&lt;br /&gt;
&lt;br /&gt;
[[Category:DesignDecisions|MongoDB]]&lt;/div&gt;</summary>
		<author><name>Elrond</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=SQL_Database_Backend&amp;diff=325</id>
		<title>SQL Database Backend</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=SQL_Database_Backend&amp;diff=325"/>
		<updated>2011-10-18T10:15:41Z</updated>

		<summary type="html">&lt;p&gt;Elrond: /* Introduction */ Link to &amp;quot;Why MongoDB&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
MediaGoblin currently uses MongoDB as its database backend. There have been various reasons for this decision (see: [[Why MongoDB]]). Still, the idea of an SQL backend is coming up from time to time.&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
The existence of this wiki page does not give any evidence of the SQL backend getting developed soon!&lt;br /&gt;
&lt;br /&gt;
== People ==&lt;br /&gt;
Even an experimental implementation of an SQL backend, that will only support basic features will need a good amount of time/energy from some (core) developers. That time/energy will not be available to other projects.&lt;br /&gt;
* Some knowing sqlalchemy is needed.&lt;br /&gt;
* Someone having a good idea on the thin db layer is needed (Elrond will most likely be available for helping)&lt;br /&gt;
* Someone having an idea on the current queries used in the code is needed too.&lt;br /&gt;
&lt;br /&gt;
== Development models ==&lt;br /&gt;
* The biggest question is: Do we want to try an experimental sql backend? This is a tricky question. If it fails, it will be a lot of wasted time/energy. And contributors wouldn&#039;t be happy to have wasted their time/energy.&lt;br /&gt;
* The wasted time/energy could be limited by limiting the first target. For example one could dedide, that the sql backend is not intended to support the full feature set.&lt;br /&gt;
* Then there is the question on how to develop this:&lt;br /&gt;
*# Long term branch: Develop an SQL replacement in a long term branch. The good: Anything can be changed as needed. Not so good: Some people dislike long term branches for various reasons.&lt;br /&gt;
*# Trying to develop this alongside the current backend, in tree.&lt;br /&gt;
&lt;br /&gt;
== Major Issues ==&lt;br /&gt;
The current db model uses dicts to allow flexible storage for extensions and different media types. Representing those in sql is not simple. The dicts are normally keyed by a string and have arbitrary values. There are basicly two ways:&lt;br /&gt;
# Have a table with a key column (string) and a value column (string, json encoded). This will allow easy reconstruction of the dict for an object fetch and will allow queries on the key of the dict.&lt;br /&gt;
#: BUT: It will not allow queries on the values. For example the imaginary geolocation extension will store the lat/lon there and might want to search for other media &amp;quot;nearby&amp;quot;.&lt;br /&gt;
# Actually structure the things into distinct tables. The above mentioned imaginary geolocation extension would have its own table with lat/lon fields and be able to perform efficient queries on it.&lt;/div&gt;</summary>
		<author><name>Elrond</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=SQL_Database_Backend&amp;diff=323</id>
		<title>SQL Database Backend</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=SQL_Database_Backend&amp;diff=323"/>
		<updated>2011-10-18T09:59:21Z</updated>

		<summary type="html">&lt;p&gt;Elrond: moved User:Elrond/SQL Database Backend to SQL Database Backend: Somewhat ready for public consumption/editing&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
MediaGoblin currently uses MongoDB as its database backend. There have been various reasons for this decision (link). Still, the idea of an SQL backend is coming up from time to time.&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
The existence of this wiki page does not give any evidence of the SQL backend getting developed soon!&lt;br /&gt;
&lt;br /&gt;
== People ==&lt;br /&gt;
Even an experimental implementation of an SQL backend, that will only support basic features will need a good amount of time/energy from some (core) developers. That time/energy will not be available to other projects.&lt;br /&gt;
* Some knowing sqlalchemy is needed.&lt;br /&gt;
* Someone having a good idea on the thin db layer is needed (Elrond will most likely be available for helping)&lt;br /&gt;
* Someone having an idea on the current queries used in the code is needed too.&lt;br /&gt;
&lt;br /&gt;
== Development models ==&lt;br /&gt;
* The biggest question is: Do we want to try an experimental sql backend? This is a tricky question. If it fails, it will be a lot of wasted time/energy. And contributors wouldn&#039;t be happy to have wasted their time/energy.&lt;br /&gt;
* The wasted time/energy could be limited by limiting the first target. For example one could dedide, that the sql backend is not intended to support the full feature set.&lt;br /&gt;
* Then there is the question on how to develop this:&lt;br /&gt;
*# Long term branch: Develop an SQL replacement in a long term branch. The good: Anything can be changed as needed. Not so good: Some people dislike long term branches for various reasons.&lt;br /&gt;
*# Trying to develop this alongside the current backend, in tree.&lt;br /&gt;
&lt;br /&gt;
== Major Issues ==&lt;br /&gt;
The current db model uses dicts to allow flexible storage for extensions and different media types. Representing those in sql is not simple. The dicts are normally keyed by a string and have arbitrary values. There are basicly two ways:&lt;br /&gt;
# Have a table with a key column (string) and a value column (string, json encoded). This will allow easy reconstruction of the dict for an object fetch and will allow queries on the key of the dict.&lt;br /&gt;
#: BUT: It will not allow queries on the values. For example the imaginary geolocation extension will store the lat/lon there and might want to search for other media &amp;quot;nearby&amp;quot;.&lt;br /&gt;
# Actually structure the things into distinct tables. The above mentioned imaginary geolocation extension would have its own table with lat/lon fields and be able to perform efficient queries on it.&lt;/div&gt;</summary>
		<author><name>Elrond</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=SQL_Database_Backend&amp;diff=322</id>
		<title>SQL Database Backend</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=SQL_Database_Backend&amp;diff=322"/>
		<updated>2011-10-18T09:57:58Z</updated>

		<summary type="html">&lt;p&gt;Elrond: development model and major issues&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
MediaGoblin currently uses MongoDB as its database backend. There have been various reasons for this decision (link). Still, the idea of an SQL backend is coming up from time to time.&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
The existence of this wiki page does not give any evidence of the SQL backend getting developed soon!&lt;br /&gt;
&lt;br /&gt;
== People ==&lt;br /&gt;
Even an experimental implementation of an SQL backend, that will only support basic features will need a good amount of time/energy from some (core) developers. That time/energy will not be available to other projects.&lt;br /&gt;
* Some knowing sqlalchemy is needed.&lt;br /&gt;
* Someone having a good idea on the thin db layer is needed (Elrond will most likely be available for helping)&lt;br /&gt;
* Someone having an idea on the current queries used in the code is needed too.&lt;br /&gt;
&lt;br /&gt;
== Development models ==&lt;br /&gt;
* The biggest question is: Do we want to try an experimental sql backend? This is a tricky question. If it fails, it will be a lot of wasted time/energy. And contributors wouldn&#039;t be happy to have wasted their time/energy.&lt;br /&gt;
* The wasted time/energy could be limited by limiting the first target. For example one could dedide, that the sql backend is not intended to support the full feature set.&lt;br /&gt;
* Then there is the question on how to develop this:&lt;br /&gt;
*# Long term branch: Develop an SQL replacement in a long term branch. The good: Anything can be changed as needed. Not so good: Some people dislike long term branches for various reasons.&lt;br /&gt;
*# Trying to develop this alongside the current backend, in tree.&lt;br /&gt;
&lt;br /&gt;
== Major Issues ==&lt;br /&gt;
The current db model uses dicts to allow flexible storage for extensions and different media types. Representing those in sql is not simple. The dicts are normally keyed by a string and have arbitrary values. There are basicly two ways:&lt;br /&gt;
# Have a table with a key column (string) and a value column (string, json encoded). This will allow easy reconstruction of the dict for an object fetch and will allow queries on the key of the dict.&lt;br /&gt;
#: BUT: It will not allow queries on the values. For example the imaginary geolocation extension will store the lat/lon there and might want to search for other media &amp;quot;nearby&amp;quot;.&lt;br /&gt;
# Actually structure the things into distinct tables. The above mentioned imaginary geolocation extension would have its own table with lat/lon fields and be able to perform efficient queries on it.&lt;/div&gt;</summary>
		<author><name>Elrond</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=SQL_Database_Backend&amp;diff=321</id>
		<title>SQL Database Backend</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=SQL_Database_Backend&amp;diff=321"/>
		<updated>2011-10-18T08:53:59Z</updated>

		<summary type="html">&lt;p&gt;Elrond: sql backend: Some more thoughts&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
MediaGoblin currently uses MongoDB as its database backend. There have been various reasons for this decision (link). Still, the idea of an SQL backend is coming up from time to time.&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
The existence of this wiki page does not give any evidence of the SQL backend getting developed soon!&lt;br /&gt;
&lt;br /&gt;
== People ==&lt;br /&gt;
Even an experimental implementation of an SQL backend, that will only support basic features will need a good amount of time/energy from some (core) developers. That time/energy will not be available to other projects.&lt;br /&gt;
* Some knowing sqlalchemy is needed.&lt;br /&gt;
* Someone having a good idea on the thin db layer is needed (Elrond will most likely be available for helping)&lt;br /&gt;
* Someone having an idea on the current queries used in the code is needed too.&lt;br /&gt;
&lt;br /&gt;
== Development models ==&lt;br /&gt;
# Long term branch: Develop an SQL replacement in a long term branch. The good: Anything can be changed as needed. Not so good: Some people dislike long term branches for various reasons.&lt;br /&gt;
# Trying to develop this alongside the current backend, in tree.&lt;/div&gt;</summary>
		<author><name>Elrond</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=SQL_Database_Backend&amp;diff=320</id>
		<title>SQL Database Backend</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=SQL_Database_Backend&amp;diff=320"/>
		<updated>2011-10-18T08:43:16Z</updated>

		<summary type="html">&lt;p&gt;Elrond: Starting docs on our recent discussion&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
MediaGoblin currently uses MongoDB as its database backend. There have been various reasons for this decision (link). Still, the idea of an SQL backend is coming up from time to time.&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
The existence of this wiki page does not give any evidence of the SQL backend getting developed soon!&lt;br /&gt;
&lt;br /&gt;
== People ==&lt;/div&gt;</summary>
		<author><name>Elrond</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=Feature_Ideas&amp;diff=301</id>
		<title>Feature Ideas</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=Feature_Ideas&amp;diff=301"/>
		<updated>2011-10-04T19:27:54Z</updated>

		<summary type="html">&lt;p&gt;Elrond: Extract all the old security related ideas from #361(csrf)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
There are many features that one can think of for MediaGoblin. Some should be implemented really soon, because they are needed right now. Other features would be nice to have, but are currently really hard to implement. And finally there are the Feature Ideas that can be classified as &amp;quot;brain storming&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
This wiki page is mostly for long term feature ideas. This specifically means there are no promises that anything listed here will ever happen. It means nobody is currently working on this feature.&lt;br /&gt;
&lt;br /&gt;
If you have an idea for a new feature, that is not listed here or in the Bug Tracker, please talk to some developers, or add it below in the &amp;quot;Yet Unsorted Ideas&amp;quot; section. If you really think, that your idea is extremely important and needs to be acted upon soon, you could file a bug.&lt;br /&gt;
&lt;br /&gt;
== The List ==&lt;br /&gt;
If there is a bug (closed or open), please link to it.&lt;br /&gt;
&lt;br /&gt;
=== Yet Unsorted Ideas ===&lt;br /&gt;
Put your new ideas here:&lt;br /&gt;
* [[User:Aleksejrs/ideas|Two federation ideas]]&lt;br /&gt;
* Copy (some) metadata from the full‐size image into the smaller versions. If possible (according to metadata formats), add a note to them that they are not exactly the original.&lt;br /&gt;
** [http://bugs.foocorp.net/issues/381 #381]: exif data handling for users (about privacy)&lt;br /&gt;
&lt;br /&gt;
=== Security related ideas / Features ===&lt;br /&gt;
* DONE: CSRF ([http://bugs.foocorp.net/issues/361 #361])&lt;br /&gt;
* &amp;lt;code&amp;gt;X-Content-Type-Options: nosniff&amp;lt;/code&amp;gt;&lt;br /&gt;
*: Served pages have the content-type set. And the browser should not be allowed to guess a different type. See: [https://bugzilla.mozilla.org/show_bug.cgi?id=471020 Firefox bug #471020]&lt;br /&gt;
* &amp;quot;Content Security Policy&amp;quot; (CSP) might really be a good add on to have. Noone should rely solely on this, but it might make things a lot safer if other security guards fail.&lt;br /&gt;
*: A simple allow &#039;self&#039; might already get a lot of things better.&lt;br /&gt;
*: [https://developer.mozilla.org/en/Security/CSP/Introducing_Content_Security_Policy Link1] [https://developer.mozilla.org/en/Security/CSP/CSP_policy_directives#options Link2]&lt;br /&gt;
* Possibly disallowing pages to be shown in frames.&lt;br /&gt;
&lt;br /&gt;
=== Long term things that &#039;&#039;might&#039;&#039; happen ===&lt;br /&gt;
* &amp;quot;trans-tagging&amp;quot;: Adding tags to other peoples media [http://bugs.foocorp.net/issues/584 #584]&lt;br /&gt;
** [[Many images usecase#Crowd tagging/captioning/commenting]]&lt;br /&gt;
* Branding: There should be some simple settable options to &amp;quot;personalize&amp;quot; the instance without fiddling with templates&lt;br /&gt;
** [http://bugs.foocorp.net/issues/613 #613]: Make the base of page titles customizable.&lt;/div&gt;</summary>
		<author><name>Elrond</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=Meeting&amp;diff=297</id>
		<title>Meeting</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=Meeting&amp;diff=297"/>
		<updated>2011-10-01T20:11:27Z</updated>

		<summary type="html">&lt;p&gt;Elrond: Summary of this month&amp;#039;s meeting&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= MediaGoblin Monthly Meeting =&lt;br /&gt;
&lt;br /&gt;
At the beginning of each month there is an IRC meeting. The idea is to discuss the past month, what happened, what was good, what should be done better. And to create roadmap for the upcoming month and assign tasks to people willing to handle them.&lt;br /&gt;
&lt;br /&gt;
* [http://mediagoblin.org/irclogs/ IRC meeting logs]&lt;br /&gt;
&lt;br /&gt;
= Upcoming and Recent Meetings =&lt;br /&gt;
&lt;br /&gt;
== 2011-11 (upcoming) ==&lt;br /&gt;
Did not yet happen, to be scheduled!&lt;br /&gt;
&lt;br /&gt;
Preliminary Agenda:&lt;br /&gt;
* What happened in the last month, what was good, what could be better next time?&lt;br /&gt;
* What should be done next month?&lt;br /&gt;
&lt;br /&gt;
== 2011-10 (held on 2011-10-01) ==&lt;br /&gt;
This month&#039;s meeting was a quickly announced short meeting. The project is getting back on track and next month&#039;s meeting will be scheduled more properly. A bunch of people were around.&lt;br /&gt;
&lt;br /&gt;
The most important decisions:&lt;br /&gt;
* The project will keep monthly releases. They&#039;re the heartbeat of the project.&lt;br /&gt;
* Release 0.1.0 this sunday/monday.&lt;br /&gt;
* New website will hopefully be deployed in the next few days.&lt;br /&gt;
* And the following things are planned to happen during this month: Most importantly federation. The developers have decided to make up their minds on what federation aactually should mean for MediaGoblin. Concerning code, probably &amp;quot;activity streams&amp;quot; are the first goal. If there is no (good) python library for this, a new stand alone library may be created. If so, a name for it has to be found. It should have something about communication in it. And the other thing to happen during this month is an ongoing discussion about &amp;quot;bus factor&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== 2011-09 (held on 2011-09-03) ==&lt;br /&gt;
&lt;br /&gt;
* [http://mediagoblin.org/irclogs/irc_meeting_2011-09-03.txt IRC log]&lt;br /&gt;
&lt;br /&gt;
== 2011-08 (held on 2011-08-06) ==&lt;br /&gt;
&lt;br /&gt;
* [http://mediagoblin.org/irclogs/irc_meeting_2011-08-06.txt IRC log]&lt;/div&gt;</summary>
		<author><name>Elrond</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=Feature_Ideas&amp;diff=293</id>
		<title>Feature Ideas</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=Feature_Ideas&amp;diff=293"/>
		<updated>2011-09-29T22:39:51Z</updated>

		<summary type="html">&lt;p&gt;Elrond: Branding&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
There are many features that one can think of for MediaGoblin. Some should be implemented really soon, because they are needed right now. Other features would be nice to have, but are currently really hard to implement. And finally there are the Feature Ideas that can be classified as &amp;quot;brain storming&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
This wiki page is mostly for long term feature ideas. This specifically means there are no promises that anything listed here will ever happen. It means nobody is currently working on this feature.&lt;br /&gt;
&lt;br /&gt;
If you have an idea for a new feature, that is not listed here or in the Bug Tracker, please talk to some developers, or add it below in the &amp;quot;Yet Unsorted Ideas&amp;quot; section. If you really think, that your idea is extremely important and needs to be acted upon soon, you could file a bug.&lt;br /&gt;
&lt;br /&gt;
== The List ==&lt;br /&gt;
If there is a bug (closed or open), please link to it.&lt;br /&gt;
&lt;br /&gt;
=== Yet Unsorted Ideas ===&lt;br /&gt;
Put your new ideas here:&lt;br /&gt;
* [[User:Aleksejrs/ideas|Two federation ideas]]&lt;br /&gt;
&lt;br /&gt;
=== Long term things that &#039;&#039;might&#039;&#039; happen ===&lt;br /&gt;
* &amp;quot;trans-tagging&amp;quot;: Adding tags to other peoples media [http://bugs.foocorp.net/issues/584 #584]&lt;br /&gt;
* Branding: There should be some simple settable options to &amp;quot;personalize&amp;quot; the instance without fiddling with templates&lt;/div&gt;</summary>
		<author><name>Elrond</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=File_Bugs&amp;diff=284</id>
		<title>File Bugs</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=File_Bugs&amp;diff=284"/>
		<updated>2011-09-26T20:46:54Z</updated>

		<summary type="html">&lt;p&gt;Elrond: Link to Feature Ideas&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;MediaGoblin uses a bug tracker called Redmine.&lt;br /&gt;
&lt;br /&gt;
Our instance is located at http://bugs.foocorp.net/projects/mediagoblin&lt;br /&gt;
&lt;br /&gt;
The most useful bug reports have the following components:&lt;br /&gt;
&lt;br /&gt;
* A short summary that’s 60 characters or less.&lt;br /&gt;
* A description that describes the issue (bug, feature request, ...) as well as the context. Consider:&lt;br /&gt;
** If you think you’ve found a bug, can you reproduce it in a controlled environment? Is the issue specific to a browser, computer, image, media type, or other dimension? All data helps.&lt;br /&gt;
** If you’re intending to submit a feature request, please take a look at [[Feature Ideas]] first. After that: Are there related links on the Internet for more information? Would you be willing to help implement or test the feature?&lt;br /&gt;
&lt;br /&gt;
That’s it!&lt;br /&gt;
&lt;br /&gt;
The better the issue report, the easier it is to address the bug, and the more likely that the developers will be able to resolve the issue. If someone has questions about the bug report, they may reach out to the reporter directly.&lt;br /&gt;
&lt;br /&gt;
If you get a response after a couple of weeks, find someone on IRC.&lt;/div&gt;</summary>
		<author><name>Elrond</name></author>
	</entry>
	<entry>
		<id>https://wiki.mediagoblin.org/index.php?title=Main_Page&amp;diff=283</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.mediagoblin.org/index.php?title=Main_Page&amp;diff=283"/>
		<updated>2011-09-26T20:43:25Z</updated>

		<summary type="html">&lt;p&gt;Elrond: Link to Feature Ideas&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Want to Join the MediaGoblin Community? =&lt;br /&gt;
&lt;br /&gt;
We’re really glad that you want to join the MediaGoblin community!&lt;br /&gt;
&lt;br /&gt;
There are a variety of ways to help and support MediaGoblin and to join the team.  If you want to code, great, if not, even better!  MediaGoblin interested contributors in many different roles: users, system administrators, technical writers, testers, evangelists, UI/UX and graphics designers, cheerleaders, and dreamers.&lt;br /&gt;
&lt;br /&gt;
This wiki covers a variety of ways that you can get involved with MediaGoblin as well as instructions on how to get started.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Hang out with the MediaGoblin folk ==&lt;br /&gt;
&lt;br /&gt;
MediaGoblin has a mailing list and an IRC channel where we hang out.  See [http://mediagoblin.org/join/ our join page] for links.&lt;br /&gt;
&lt;br /&gt;
Please drop by and say “Hi!”  And, if you’re looking for something to do, just ask---there’s always work to be done.&lt;br /&gt;
&lt;br /&gt;
== Take Part in the Monthly Meetings ==&lt;br /&gt;
&lt;br /&gt;
Each month is a [[Meeting]]. You can take part and help decide on the future of MediaGoblin. Or just be around and see what&#039;s happening live!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== File Bugs / Triage Bugs ==&lt;br /&gt;
&lt;br /&gt;
Issue reports are critical for all projects.  Identified bugs give developers a basis for beginning work, and providing an idea of what features and issues are most important to users and the overall usability of the software.  If you identify errors, flaws, unexpected behaviors, or deficits that impede use, file a bug.&lt;br /&gt;
&lt;br /&gt;
* [[File Bugs]] -- notes on filing new bugs/issues/feature requests&lt;br /&gt;
* [[Feature Ideas]] -- notes on possible features&lt;br /&gt;
* [[Triage Bugs]] -- notes on triaging&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Write Code / Fix Code ==&lt;br /&gt;
&lt;br /&gt;
If you are a coder and you would like to write code, the repository is hosted on gitorious. Clone or fork the repository and start poking around. Become familiar with this manual for an overview of how the software works and is used. Consider the contributor wiki for more information about the project, our preferred methods, and guides for developing MediaGoblin. We even have tips on becoming a coder and we’re willing to help!&lt;br /&gt;
&lt;br /&gt;
* [[Development quick start]] - get MediaGoblin running on your own machine so you can hack on it&lt;br /&gt;
* [[HackingHowto|Hacking]] - notes on making and sending in code contributions&lt;br /&gt;
** [[BeginnersCorner|Beginner&#039;s Corner]] - resources for those who are new to Python, MongoDB, or Git.&lt;br /&gt;
** We&#039;ll be adding some distribution/OS specific hacking guides as separate pages soon.&lt;br /&gt;
* [[Git workflow]] - How to go about submitting patches via git.&lt;br /&gt;
* [[Templating]] - How our templating structure is set up&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Send Encouragement / Spread the Word ==&lt;br /&gt;
&lt;br /&gt;
Sometimes, a nice word, simple encouragement, and interest in the work we’re doing is enough to inspire a tizzy of productive work.  Just a bit more interest and encouragement can even make the difference between a complete feature and limited functionality; between a completed milestone and lost momentum.&lt;br /&gt;
&lt;br /&gt;
Similarly, MediaGoblin, and the movement for free network services, is always in need of encouragement.  Use free network services, understand the principals behind the movement, be able to articulate the benefits of free network services and the problems with psudo-free applications that don’t respect the users’ freedom.&lt;br /&gt;
&lt;br /&gt;
Write a blog post, post a status update, drop by the listserv or join #mediagoblin on freenode.net and let us know.  See [http://mediagoblin.org/join/ our join page] for links.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Write Documentation / Edit Documentation ==&lt;br /&gt;
&lt;br /&gt;
* [[Documentation quick start]] - How to contribute to the documentation effort.&lt;br /&gt;
* [[ManualStandards]] - covers the standards for writing the user manual (forthcoming.) &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Test MediaGoblin ==&lt;br /&gt;
&lt;br /&gt;
Do you have access to the web? Do you like sharing your opinions? If so, we need your help to test MediaGoblin! Testers play around with the current test instance, note what operating system and browser they use (notes on multiple set-ups are also helpful) and take some notes. That&#039;s it! It&#039;s a very important task that doesn&#039;t require any special knowledge and you&#039;re done in under an hour. Ready to help?  &lt;br /&gt;
&lt;br /&gt;
* [[User Experience]] - user experience testing.  Includes link to an instance you can try!&lt;br /&gt;
* [[UnitTests|Unit Tests]] - all about the unit tests&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Translate MediaGoblin ==&lt;br /&gt;
&lt;br /&gt;
If you know English and another language and feel comfortable translating elements of the interface or even the documentation, we’d love to have help translating the software and resources.&lt;br /&gt;
&lt;br /&gt;
* [[Translations]] - How to translate stuff or update the translations&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Become a User ==&lt;br /&gt;
&lt;br /&gt;
Coming soon!&lt;br /&gt;
&lt;br /&gt;
We’re building MediaGoblin for us and for you but really you’re one of us and I am you and we are we and MediaGoblin is the walrus.&lt;br /&gt;
&lt;br /&gt;
We&#039;re planning to launch our own public instance of MediaGoblin in the near future--probably in the September/October 2011 time frame.  When we do, sign up for an account, use the service and relish in the thought that this service comes with a heaping side of Freedom and you can salt and pepper it to your liking.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Help Others ==&lt;br /&gt;
&lt;br /&gt;
Have you spent time with MediaGoblin?  If so, your experience and wisdom are invaluable and you’re the best person we can think of to help other users with their questions.&lt;br /&gt;
&lt;br /&gt;
Hang out on the IRC channel and help answer new peoples&#039; questions.  See [http://mediagoblin.org/join/ our join page] for links.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Run your own MediaGoblin Instance ==&lt;br /&gt;
&lt;br /&gt;
Are there things about our instance you want to change?  Are there things about other instances you wish were different?  Want to test upcoming changes?  Want to create patches to implement things you need?  That’s great—you can run your own instance!&lt;br /&gt;
&lt;br /&gt;
* [[Configure_MediaGoblin|Configuration]] - Learn about MediaGoblin configuration files and file options.&lt;br /&gt;
* [[Deployment]] - General deployment advice&lt;br /&gt;
* [[Scaling Down]] - Minimizing MediaGoblin&#039;s resource requirements&lt;br /&gt;
* [[Virtual Machine Hosting]] - Deploy your own publicly available MediaGoblin server using [http://aws.amazon.com/free/?utm_source=adwords&amp;amp;utm_medium=cpc&amp;amp;utm_campaign=CPC_Google_AWS_ec2&amp;amp;utm_content=TextV01_PP_V01_EC2&amp;amp;trk=CPC_Google_AWS_ec2 Amazon&#039;s free EC2 tier].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Create a Theme ==&lt;br /&gt;
&lt;br /&gt;
Coming soon!&lt;br /&gt;
&lt;br /&gt;
MedaGoblin development is premised on the idea that the entire interface for the platform be completely theme-able.  If you have a design or theming background, consider developing themes for MediaGoblin.  New themes help test the theming system, provide attractive and appealing interfaces for prospective users.  If you want to start a new theme but don’t know where to start, touch base with the development community on the list or in the IRC channel for more information.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Technical project documentation =&lt;br /&gt;
&lt;br /&gt;
* [[DesignDecisions]] - covers design decisions (FIXME - this needs to be split up)&lt;br /&gt;
* [[Storage]] - How MediaGoblin&#039;s internal storage system works.&lt;br /&gt;
* [[Processing]] - What happens after you submit your image/video/etc?  Processing!  More about that.&lt;br /&gt;
* [https://gitorious.org/mediagoblin/mediagoblin/blobs/master/extlib/README External Library Policy] - covers use of external libraries&lt;br /&gt;
* [[User:Cwebber/braindumps]] - Chris Webber&#039;s braindumps (you can help refactoring these into real sections of the site!)&lt;br /&gt;
* [[Multiple media support]] - Design plan for multiple media support&lt;br /&gt;
&lt;br /&gt;
= Inner workings of the secret sanctum =&lt;br /&gt;
&lt;br /&gt;
* [[IRCBot]] - covers our irc bot&lt;br /&gt;
* [[ReleaseProcess|Release Process]] - covers the release process&lt;br /&gt;
* [[Update the website]] - Learn how to update mediagoblin.org!&lt;/div&gt;</summary>
		<author><name>Elrond</name></author>
	</entry>
</feed>