http://wiki.dreamwidth.net/wiki/api.php?action=feedcontributions&user=Shadowspar&feedformat=atomDreamwidth Notes - User contributions [en]2024-03-28T18:59:49ZUser contributionsMediaWiki 1.23.0//wiki.dreamwidth.net/wiki/index.php/Subdomain_setupSubdomain setup2014-08-25T14:50:07Z<p>Shadowspar: grrrr, having avahi installed will screw with anything ending in .local</p>
<hr />
<div>== DNS Management ==<br />
<br />
First, you will have to set up a wildcard subdomain record for your host. Different hosting providers have different interfaces, but here are some examples.<br />
<br />
=== On Linode ===<br />
<br />
Go to the DNS Manager section of your account and click on the domain zone your DW install is hosted on. Go to the "A/AAAA Records" section and note the IP address of the hosts:<br />
<br />
[[Image:Linode a records.png]]<br />
<br />
(Note: the above picture already has the wildcard listed in it. Yours won't have that yet, but will when you finish this.) You will want to click on "Add a new A/AAAA Record":<br />
<br />
[[Image:Linode subdomain wildcard.png]]<br />
<br />
Here, you will want to add <code>*.yourdomain.com</code> and the IP address you noted on the last page. Save this form and a wildcard subdomain should be added to your A/AAAA Records section.<br />
<br />
<br />
=== Local development via dnsmasq ===<br />
<br />
If you've set up a Dreamwidth development server on your local machine, you can use <tt>dnsmasq</tt> to give you a local DNS server with wildcard matching. Install it with<br />
apt-get install dnsmasq<br />
The install should create the config directory <tt>/etc/dnsmasq.d/</tt> -- text files in there will be picked up and added to <tt>dnsmasq</tt>'s configuration.<br />
<br />
Say you have a local webserver that you want to set up as <tt>avengers.mylocal</tt>. Create a file in <tt>dnsmasq</tt>'s config directory (eg <tt>/etc/dnsmasq.d/avengers</tt>) with the following contents: <br />
address=/avengers.mylocal/127.0.0.1<br />
Now restart dnsmasq:<br />
/etc/init.d/dnsmasq restart<br />
...and now anything ending in <tt>avengers.mylocal</tt> should resolve to <tt>127.0.0.1</tt>: <tt>avengers.mylocal</tt>, <tt>www.avengers.mylocal</tt>, <tt>thor.avengers.mylocal</tt>, <tt>www.loki.avengers.mylocal</tt>, ...<br />
<br />
== Configuration ==<br />
<br />
{{Note|text=The current default scheme has links to places that are not subdomains.}}<br />
<br />
To configure your installation for user subdomains, uncomment the bolded lines in <code>$LJHOME/etc/config.pl</code>:<br />
<br />
<source lang="perl"># Support URLs of the form http://username.yoursite.com/ ?<br />
# If so, what's the part after "username." ?<br />
$USER_VHOSTS = 1;<br />
$USER_DOMAIN = $DOMAIN;<br />
<br />
# If you ONLY want USER_VHOSTS to work and not the typical /users/USER and /community/USER<br />
# then set this option:<br />
$ONLY_USER_VHOSTS = 1;</source><br />
<br />
If you only want certain user classes to have user subdomains, <b>do not</b> set <code>$ONLY_USER_VHOSTS</code> to 1, or journals who do not have this user capability won't work!<br />
<br />
You will also have to set a user capability in <code>etc/config.pl</code> called <code>userdomain</code>. If you want all users to have this capability, add it to <code>%CAP_DEF</code>:<br />
<br />
<source lang="perl">%CAP_DEF = ( <br />
'maxfriends' => 500,<br />
'userpics' => 1,<br />
'checkfriends_interval' => 60, <br />
'checkfriends' => 1,<br />
'styles' => 0,<br />
'todomax' => 25, <br />
'todosec' => 0,<br />
'friendsviewupdate' => 30, <br />
'findsim' => 1,<br />
'getselfemail' => 0,<br />
'userdomain' => 1<br />
);</source><br />
<br />
Otherwise, you will have to add <code>'userdomain' => 1</code> to one or more of the user classes listed in <code>%CAP</code>.<br />
<br />
You also need to add an entry to <code>%SUBDOMAIN_FUNCTIONS</code> (and create this hash if it does not already exist):<br />
<br />
<source lang="perl">%SUBDOMAIN_FUNCTION = ( <br />
'community' => 'journal',<br />
);</source><br />
<br />
[[Category: Dreamwidth Installation]]</div>Shadowspar//wiki.dreamwidth.net/wiki/index.php/Subdomain_setupSubdomain setup2014-08-25T14:08:41Z<p>Shadowspar: /* DNS Management */ +local wildcard domains using dnsmasq</p>
<hr />
<div>== DNS Management ==<br />
<br />
First, you will have to set up a wildcard subdomain record for your host. Different hosting providers have different interfaces, but here are some examples.<br />
<br />
=== On Linode ===<br />
<br />
Go to the DNS Manager section of your account and click on the domain zone your DW install is hosted on. Go to the "A/AAAA Records" section and note the IP address of the hosts:<br />
<br />
[[Image:Linode a records.png]]<br />
<br />
(Note: the above picture already has the wildcard listed in it. Yours won't have that yet, but will when you finish this.) You will want to click on "Add a new A/AAAA Record":<br />
<br />
[[Image:Linode subdomain wildcard.png]]<br />
<br />
Here, you will want to add <code>*.yourdomain.com</code> and the IP address you noted on the last page. Save this form and a wildcard subdomain should be added to your A/AAAA Records section.<br />
<br />
<br />
=== Local development via dnsmasq ===<br />
<br />
If you've set up a Dreamwidth development server on your local machine, you can use <tt>dnsmasq</tt> to give you a local DNS server with wildcard matching. Install it with<br />
apt-get install dnsmasq<br />
The install should create the config directory <tt>/etc/dnsmasq.d/</tt> -- text files in there will be picked up and added to <tt>dnsmasq</tt>'s configuration.<br />
<br />
Say you have a local webserver that you want to set up as <tt>avengers.local</tt>. Create a file in <tt>dnsmasq</tt>'s config directory (eg <tt>/etc/dnsmasq.d/avengers</tt>) with the following contents: <br />
address=/avengers.local/127.0.0.1<br />
Now restart dnsmasq:<br />
/etc/init.d/dnsmasq restart<br />
...and now anything ending in <tt>avengers.local</tt> should resolve to <tt>127.0.0.1</tt>: <tt>avengers.local</tt>, <tt>www.avengers.local</tt>, <tt>thor.avengers.local</tt>, <tt>www.loki.avengers.local</tt>, ...<br />
<br />
== Configuration ==<br />
<br />
{{Note|text=The current default scheme has links to places that are not subdomains.}}<br />
<br />
To configure your installation for user subdomains, uncomment the bolded lines in <code>$LJHOME/etc/config.pl</code>:<br />
<br />
<source lang="perl"># Support URLs of the form http://username.yoursite.com/ ?<br />
# If so, what's the part after "username." ?<br />
$USER_VHOSTS = 1;<br />
$USER_DOMAIN = $DOMAIN;<br />
<br />
# If you ONLY want USER_VHOSTS to work and not the typical /users/USER and /community/USER<br />
# then set this option:<br />
$ONLY_USER_VHOSTS = 1;</source><br />
<br />
If you only want certain user classes to have user subdomains, <b>do not</b> set <code>$ONLY_USER_VHOSTS</code> to 1, or journals who do not have this user capability won't work!<br />
<br />
You will also have to set a user capability in <code>etc/config.pl</code> called <code>userdomain</code>. If you want all users to have this capability, add it to <code>%CAP_DEF</code>:<br />
<br />
<source lang="perl">%CAP_DEF = ( <br />
'maxfriends' => 500,<br />
'userpics' => 1,<br />
'checkfriends_interval' => 60, <br />
'checkfriends' => 1,<br />
'styles' => 0,<br />
'todomax' => 25, <br />
'todosec' => 0,<br />
'friendsviewupdate' => 30, <br />
'findsim' => 1,<br />
'getselfemail' => 0,<br />
'userdomain' => 1<br />
);</source><br />
<br />
Otherwise, you will have to add <code>'userdomain' => 1</code> to one or more of the user classes listed in <code>%CAP</code>.<br />
<br />
You also need to add an entry to <code>%SUBDOMAIN_FUNCTIONS</code> (and create this hash if it does not already exist):<br />
<br />
<source lang="perl">%SUBDOMAIN_FUNCTION = ( <br />
'community' => 'journal',<br />
);</source><br />
<br />
[[Category: Dreamwidth Installation]]</div>Shadowspar//wiki.dreamwidth.net/wiki/index.php/Production_PuppetProduction Puppet2014-08-25T05:13:06Z<p>Shadowspar: mercurial: no longer a thing</p>
<hr />
<div>This page describes the steps that the Puppet configuration management system should be responsible for.<br />
<br />
== Setup ==<br />
<br />
Setup DW user account and add it to sudo.<br />
<br />
adduser dw<br />
echo "dw ALL=NOPASSWD: ALL" >> /etc/sudoers<br />
<br />
Configure /etc/apt/sources.list to use our cache:<br />
<br />
deb http://dw-lb01:9999/ubuntu/ hardy main restricted universe<br />
deb-src http://dw-lb01:9999/ubuntu/ hardy main restricted universe<br />
<br />
deb http://dw-lb01:9999/ubuntu/ hardy-updates main restricted universe<br />
deb-src http://dw-lb01:9999/ubuntu/ hardy-updates main restricted universe<br />
<br />
deb http://dw-lb01:9999/ubuntu hardy-security main restricted universe<br />
deb-src http://dw-lb01:9999/ubuntu hardy-security main restricted universe<br />
<br />
Let's do a system update and upgrade. This may not be something we can easily do in puppet? Or is it? I only want to do this from time to time - i.e., only on initial install, and only manually. (I don't want to automatically update packages every night, e.g.)<br />
<br />
apt-get update<br />
apt-get dist-upgrade<br />
<br />
Now install packages:<br />
<br />
vim-perl screen mercurial subversion dh-make-perl apache2-mpm-prefork<br />
libgtop2-dev libapache2-mod-perl2 libapache2-request-perl<br />
libcaptcha-recaptcha-perl libclass-accessor-perl libclass-autouse-perl<br />
libclass-data-inheritable-perl libclass-trigger-perl libcompress-zlib-perl<br />
libcrypt-dh-perl libdbd-mysql-perl libdbi-perl libdatetime-perl<br />
libdigest-hmac-perl libmd5-perl libdigest-sha1-perl libgd-gd2-perl<br />
libgd-graph-perl libgnupg-interface-perl libhtml-parser-perl<br />
libhtml-tagset-perl libhtml-template-perl libio-stringy-perl<br />
perlmagick libimage-size-perl libwww-perl libwww-perl libmime-lite-perl<br />
libmime-perl libmailtools-perl libmail-gnupg-perl libmath-bigint-gmp-perl<br />
libnet-dns-perl libproc-process-perl librpc-xml-perl libsoap-lite-perl<br />
libstring-crc32-perl libtext-vcard-perl liburi-fetch-perl liburi-perl<br />
libunicode-maputf8-perl libxml-atom-perl libxml-rss-perl libxml-simple-perl<br />
mysql-client<br />
<br />
Next up, we need to configure Apache. This only needs to be done on webservers. On non-webservers, we need to DISABLE "apache2" from starting at boot time.<br />
<br />
$ cat /etc/apache2/conf.d/dw.conf<br />
User dw<br />
Group dw<br />
UseCanonicalName off<br />
<br />
StartServers 3<br />
MaxSpareServers 5<br />
MinSpareServers 1<br />
MaxClients 2<br />
MaxRequestsPerChild 200<br />
<br />
DocumentRoot /home/dw/current/htdocs<br />
PerlSetEnv LJHOME /home/dw/current<br />
PerlPassEnv LJHOME<br />
PerlRequire /home/dw/current/cgi-bin/modperl.pl<br />
<br />
There's some more Apache setup that is required to get rid of the default site and enable the request library:<br />
<br />
sudo a2dissite default<br />
sudo a2enmod apreq<br />
<br />
Last thing is to configure the network. We need to add the following lines in /etc/network/interfaces:<br />
<br />
# ensure we load our rules <br />
pre-up iptables-restore < /etc/iptables.up.rules<br />
<br />
Then we need this file created in /etc/iptables.up.rules:<br />
<br />
*filter<br />
<br />
# Allows all loopback (lo0) traffic and drop all <br />
# traffic to 127/8 that doesn't use lo0<br />
-A INPUT -i lo -j ACCEPT<br />
-A INPUT -i ! lo -d 127.0.0.0/8 -j REJECT<br />
<br />
# Accept inbound private traffic from one of our servers<br />
-A INPUT -s 172.19.1.5 -j ACCEPT<br />
-A INPUT -s 172.19.1.84 -j ACCEPT<br />
-A INPUT -s 172.19.1.85 -j ACCEPT<br />
-A INPUT -s 172.19.1.86 -j ACCEPT<br />
-A INPUT -s 172.19.1.87 -j ACCEPT<br />
-A INPUT -s 172.19.1.88 -j ACCEPT<br />
-A INPUT -s 172.19.1.89 -j ACCEPT<br />
-A INPUT -s 172.19.1.90 -j ACCEPT<br />
-A INPUT -s 172.19.1.91 -j ACCEPT<br />
<br />
# Accepts all established inbound connections<br />
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT<br />
<br />
# Allows all outbound traffic<br />
-A OUTPUT -j ACCEPT<br />
<br />
# Reject all other inbound - default deny unless explicitly allowed policy<br />
-A INPUT -j REJECT<br />
-A FORWARD -j REJECT<br />
<br />
COMMIT<br />
<br />
One thing to note is that this file will get changed each time I add a new server. Also, every time it's pushed out, you have to run the iptables-restore command mentioned above. Puppet should handle that.<br />
<br />
The source code for the site needs to be copied, but that's something I can do with rsync. Assuming the dw user is setup from the first step, then all I have to do is rsync the code and start Apache. Assuming the rest of this is all good.<br />
<br />
== Setup Round Two ==<br />
<br />
This section contains things I didn't include in the first section, because I forgot about them! But now that I'm setting up the new production cluster, I have to remember them.<br />
<br />
=== other packages ===<br />
<br />
System: sysstat dnsutils netcat telnet strace libio-aio-perl bc rsync<br />
<br />
libnet-openid-consumer-perl libnet-openid-server-perl subversion<br />
<br />
Also, there are packages that I had to build for the system. They're in our private repository, but I'll move them to dw-ops so puppet has access to them.<br />
<br />
Memcache: memcached<br />
<br />
Mail: postfix mysql-server<br />
<br />
Database: mysql-server<br />
<br />
Perlbal: lighttpd<br />
<br />
=== snmpd ===<br />
<br />
There's a simple /etc/snmpd/snmpd.conf that needs to be sent out. This configuration includes a snmp v2 community writable password, so we may have to figure out some way of having a private config.<br />
<br />
Also, /etc/default/snmpd needs to be updated to change 127.0.0.1 to the IP address of the internal interface. (Otherwise snmpd won't ever listen to our requests for help...)<br />
<br />
Then make sure snmpd is restarted.<br />
<br />
=== Perlbal server ===<br />
<br />
The perlbal machines (dfw-lb01, dfw-lb02) need to have heartbeat setup... /etc/heartbeat/{ha.cf,haresources,authkeys} and also be up and running. (Don't worry about this one yet. I'm still debating the best way to setup the frontend. LVS? Heartbeat?)<br />
<br />
=== iptables exceptions ===<br />
<br />
Some machines need to have exceptions on various ports. Uh, lbs need port 80 and 443, the mailserver needs port 25...<br />
<br />
=== Downtime Server ===<br />
<br />
We run a very simple webserver (lighttpd) that just shows a downtime page when we have that enabled. Downtime servers run on the perlbals, but in the future I hope to have perlbal do the downtime stuff itself.<br />
<br />
=== Admin Server ===<br />
<br />
We also run an Apache2 instance that gives us access to cacti, nagios, and other monitoring tools. This runs on the admin server.<br />
<br />
=== Memcache Server ===<br />
<br />
Need to edit /etc/memcached.conf to use 450MB of RAM (although this might change depending on the server) plus have it listen on an internal IP only.<br />
<br />
=== Database Server ===<br />
<br />
Configuration file /etc/mysql/conf.d/dfw-db01.cnf (and dfw-db02.cnf). The differences are mostly around filenames and such... easy to write a template.<br />
<br />
== Helpful Links == <br />
Dreamwidth's current Puppet configs: https://github.com/dreamwidth/dw-ops<br />
<br />
Puppet homepage: http://www.puppetlabs.com/<br />
<br />
[[Category: Dreamwidth Installation]]</div>Shadowspar//wiki.dreamwidth.net/wiki/index.php/Dreamwidth_Scratch_InstallationDreamwidth Scratch Installation2014-08-25T04:43:43Z<p>Shadowspar: /* Configure Apache */ htdocs is under /home/dw/dw, so we need another dw in your dw so you can dw while you dw</p>
<hr />
<div><br />
Firstly, you'll need to set up a Linux system -- here are the [[Suggested Server Requirements]]. These instructions assume Ubuntu 12.04 or up. Please let us know if you run into difficulties--we want to update this if people are having problems! We recommend coming into the #dreamwidth-dev channel on [[IRC]].<br />
<br />
After you set up, you can keep updated with the instructions on [[Dev Maintenance]].<br />
<br />
If you have difficulties or problems or suggestions for installation procedures, please report them to [http://bugs.dwscoalition.org/show_bug.cgi?id=61 Bug 61]. Also look at [[Production Setup: Webserver]]. <br />
<br />
== Bringing the system up to date ==<br />
<br />
Before you start installing anything else, you might want to make sure your system is up to date. You should update the packages on your system (either in a root shell (sudo bash) or preceding these commands with 'sudo'):<br />
<br />
apt-get update<br />
apt-get upgrade<br />
<br />
If you want man pages on your system: <br />
<br />
apt-get install man<br />
<br />
== Installing necessary packages ==<br />
<br />
This will install necessary packages you'll need to run Dreamwidth (and some optional ones). You'll want to be root when running these commands.<br />
<br />
apt-get install git-core subversion apache2-mpm-prefork \<br />
libapache2-mod-perl2 libapache2-mod-apreq2 libapache2-request-perl \<br />
mysql-server wget unzip links vim libclass-autouse-perl \<br />
libdatetime-perl libcache-memcached-perl libhash-multivalue-perl \<br />
libgd-gd2-perl libhtml-template-perl libwww-perl libmime-lite-perl \<br />
libnet-dns-perl liburi-perl libxml-simple-perl libclass-accessor-perl \<br />
libclass-data-inheritable-perl libclass-trigger-perl libcrypt-dh-perl \<br />
libmath-bigint-gmp-perl liburi-fetch-perl libgd-graph-perl \<br />
libgnupg-interface-perl libmail-gnupg-perl perlmagick \<br />
libproc-processtable-perl libsoap-lite-perl librpc-xml-perl \<br />
libstring-crc32-perl libtext-vcard-perl libxml-atom-perl libxml-rss-perl \<br />
libimage-size-perl libunicode-maputf8-perl libgtop2-dev build-essential \<br />
libnet-openid-consumer-perl libnet-openid-server-perl libyaml-perl \<br />
libcaptcha-recaptcha-perl libdbd-sqlite3-perl libtest-simple-perl \<br />
libtest-simpleunit-perl libtemplate-perl libterm-readkey-perl \<br />
gcc libtest-most-perl libgearman-client-perl \<br />
libbusiness-creditcard-perl liblwpx-paranoidagent-perl \<br />
libtheschwartz-perl libfile-type-perl libjson-perl<br />
<br />
This will download about 113MB of files and use around 355MB of disk space.<br />
<br />
Check whether these packages have actually installed. Later on in the process, if you find you are having inexplicable problems, try installing these again.<br />
<br />
<br />
=== Then ===<br />
<br />
[http://perl.apache.org/docs/2.0/user/install/install.html#Prerequisites Check] whether your system is using threaded MPMs or pre-fork. You will need the latter. (Note: if you ran the above command to install Apache, then you have the pre-fork version installed.)<br />
<br />
If you have weird errors saying things like "Package mercurial is not available, but is referred to by another package.", try editing <tt>/etc/apt/sources.list</tt> and uncommenting the other repositories and then doing an <tt>apt-get</tt> update. Ran into this problem on a fresh install of <tt>jaunty</tt> on Linode.<br />
<br />
You will also want to install some perl libraries with CPAN. Defaults during CPAN's setup should be okay.<br />
<br />
Before installing, check if your CPAN shell has 'make' at the correct location. Run <tt>which make</tt>, then compare the results with running <tt>o conf make</tt> at the CPAN shell (to run the CPAN shell, type <tt>cpan</tt>.)<br />
<br />
The perl libraries are:<br />
<br />
cpan Bundle::CPAN # this will guide you through setting up CPAN<br />
cpan GTop <br />
cpan Digest::SHA1<br />
cpan Unicode::CheckUTF8<br />
cpan MogileFS::Client # this is necessary even if you don't use MogileFS<br />
cpan TheSchwartz::Worker::SendEmail<br />
cpan TheSchwartz::Worker::PubSubHubbubPublish<br />
cpan Digest::SHA256<br />
cpan Text::Markdown<br />
cpan Image::ExifTool<br />
cpan Net::OAuth<br />
<br />
See [http://wiki.dwscoalition.org/notes/Bundle::CPAN Bundle::CPAN] if you are having trouble installing Bundle::CPAN<br />
<br />
You will also want to install and configure Postfix so your DW can send out email:<br />
<br />
apt-get install postfix<br />
<br />
If you choose not to configure on the install, you can do so later with:<br />
<br />
dpkg-reconfigure postfix<br />
<br />
== Set Timezone to UTC ==<br />
<br />
Dreamwidth will complain if you aren't running in UTC. If you're not configured for UTC already, you can reset it (on Ubuntu/Debian) using<br />
<br />
dpkg-reconfigure tzdata<br />
<br />
and choose Etc/UTC.<br />
<br />
== Setting up the DW user account ==<br />
<br />
{{Note|text=If you still find yourself unable to make sudo commands even after <code>usermod</code>, please see [[Making your DW user a sudo account]] for alternatives.}} Create a user account that will be used for the code. This can be your own personal account if you wish, but it is recommended that you setup a new user that is only going to be used for running the code. That way if you have any insecure code running (i.e., a bad page, or a patch you're working on doesn't have security implemented yet) you don't have to worry about someone getting access to your personal files.<br />
<br />
To set up the user account:<br />
<br />
adduser <i>username</i><br />
<br />
Fill out the user's info and put them in the sudo group:<br />
<br />
usermod -a -G sudo <i>username</i><br />
<br />
So, to use <code>dw</code> as a username:<br />
<br />
adduser dw<br />
usermod -a -G sudo dw<br />
<br />
Now, we will get the $LJHOME variable set. Log into your user:<br />
<br />
su - dw<br />
<br />
We will assume that you use the bash shell. If you do not, then this section does not apply. You will have to find the shell specific way of setting environment variables.<br />
<br />
For bash, you should look in the home directory of the user account you just created for a file .profile. You will want to add one more line to this file:<br />
<br />
export LJHOME=/home/dw/dw<br />
<br />
Or wherever it is that you want the root of your source code install to be. Yes, the variable is named LJHOME. We'll live with it for now. ;-)<br />
<br />
Test this. Log out of the dw user account and log back in, then type:<br />
<br />
echo $LJHOME<br />
<br />
You should see <tt>/home/dw/dw</tt> or whatever you set it to. If you don't, then something has gone awry -- maybe the export line isn't in the right place..?<br />
<br />
== Get the Dreamwidth code ==<br />
<br />
=== Set up GitHub ===<br />
<br />
First, create an account on Github. Then, you will need to fork these two repositories:<br />
<br />
* https://github.com/dreamwidth/dw-free<br />
* https://github.com/dreamwidth/dw-nonfree<br />
<br />
Go to each of their pages, and click the "Fork" button. This sets up your own copy of Dreamwidth's code which use to make and submit your changes.<br />
<br />
Here's a quick overview of how the repositories will work together:<br />
<br />
* dw-free is the main repository and goes into $LJHOME<br />
* other repositories will go into $LJHOME/ext<br />
* personal config files go into $LJHOME/ext/local<br />
* All code from dw-free ($LJHOME) and the additional repos under $LJHOME/ext are automatically live when you start your server. There's no need to run any additional syncing steps anymore.<br />
<br />
=== Set up dw-free ===<br />
<br />
Replace the USERNAME sections of the URL with your Github username. This will make your repository an authenticated version that can push changes back to Github, as opposed to only being able to pull them.<br />
<br />
# clone a copy of the repository onto your machine<br />
cd ~/<br />
git clone https://USERNAME@github.com/USERNAME/dw-free.git $LJHOME<br />
cd $LJHOME<br />
<br />
# and let's make it aware of the dreamwidth repository so we can grab updates later<br />
git remote add dreamwidth https://github.com/dreamwidth/dw-free<br />
git fetch dreamwidth<br />
# we also want to sync up with the main branches<br />
git branch --set-upstream develop dreamwidth/develop <br />
<br />
=== Set up dw-nonfree ===<br />
<br />
{{ Warn|text=For dev servers only. Clone sites should not use dw-nonfree because it contains Dreamwidth-specific branding and files}}<br />
<br />
cd $LJHOME/ext<br />
git clone https://USERNAME@github.com/USERNAME/dw-nonfree.git<br />
cd dw-nonfree<br />
git remote add dreamwidth https://github.com/dreamwidth/dw-nonfree<br />
git fetch dreamwidth<br />
git branch --set-upstream develop dreamwidth/develop <br />
cd ..<br />
<br />
== Database setup ==<br />
<br />
You should have a local MySQL installation and know the root login to the database. To sign into MySQL as root:<br />
<br />
mysql -u root -p <br />
<br />
These MySQL commands wil create your development database:<br />
<br />
create database dw;<br />
grant all on dw.* to 'dw'@'localhost' identified by 'somePassword';<br />
<br />
You might want to pick a more appropriate database username/database name/password.<br />
<br />
While you're here, you probably want to go ahead and create a database for TheSchwartz, too, unless you really know that you won't need it:<br />
<br />
create database dw_schwartz;<br />
grant all on dw_schwartz.* to 'dw'@'localhost' identified by 'somePassword';<br />
<br />
When you're done, exit out of mysql:<br />
<br />
quit;<br />
<br />
== Editing the config files ==<br />
<br />
Next you need to configure the site configuration scripts. This is probably the most tricky part of the whole process, since there are so many things you can tweak. However, you can get by with just tweaking etc/config-local.pl and etc/config-private.pl for now:<br />
<br />
## copy over your config files, and tell them to take priority<br />
## over config files in any of the repos<br />
cd $LJHOME<br />
mkdir -p ext/local/etc<br />
echo "highest" > ext/local/.dir_scope<br />
cp doc/config-local.pl.txt ext/local/etc/config-local.pl<br />
vim ext/local/etc/config-local.pl<br />
<br />
Or use your editor of choice, of course. Do a search for the phrase 'CHANGE THIS' which occurs once, before the block of human readable text you should use to describe your development installation.<br />
<br />
Note that the <var>$IS_DEV_SERVER</var> flag is set to 1 in the template given. Be sure to set this to 0 for a production site, as there are big security issues involved with leaving the flag set to 1. <br />
<br />
Next, you need to change your local variables in the <tt>config-private.pl</tt> file. This is where your passwords are configured, as well as many of the variables which define your domain. Do a search for the phrase 'CHANGETHIS'(note the slightly different spacing). You will want to change at least your <var>$DOMAIN</var> and the <var>%DBINFO</var> structure.<br />
<br />
cd $LJHOME<br />
cp doc/config-private.pl.txt ext/local/etc/config-private.pl<br />
chmod go-rwx ext/local/etc/config-private.pl<br />
vim ext/local/etc/config-private.pl<br />
<br />
In this file, uncomment the lines in the <var>%DBINFO</var> blocks (if they are commented out), and place your database password in quotes on the "pass => ," line, before the comma. For example:<br />
<br />
%DBINFO = (<br />
master => {<br />
pass => 'mypassword',<br />
},<br />
);<br />
<br />
Note that there are two DBINFO blocks; get them both.<br />
<br />
If you created the database for TheSchwartz earlier, you'll also want to configure it:<br />
<br />
# Schwartz DB configuration<br />
@THESCHWARTZ_DBS = (<br />
{<br />
dsn => 'dbi:mysql:dw_schwartz;host=localhost',<br />
user => 'dw',<br />
pass => '', # CHANGETHIS<br />
},<br />
);<br />
<br />
The base configuration file is under source control, and is already in <tt>etc/config.pl</tt>. You should not need to change anything very much in this, but you might have to change some stuff. If you find you do have to touch this, copy it over first, then you can edit it:<br />
<br />
cd $LJHOME<br />
cp etc/config.pl ext/local/etc/config.pl<br />
vim ext/local/etc/config.pl<br />
<br />
<br />
Note that from here on, when any documentation says to edit etc/config*, you'll likely want to edit ext/local/etc/config-* instead.<br />
<br />
== Make sure things are working with checkconfig.pl ==<br />
<br />
Now, you need to see if everything is working. <br />
<br />
If you've setup the files as indicated above, run this command:<br />
<br />
cd $LJHOME<br />
bin/checkconfig.pl --no=ljconfig<br />
<br />
If you installed everything given at the top of this page, you should find you have no missing modules. Congratulations! If you don't have all the modules, this is where you need some systems specific knowledge for your system. You will need to install whatever modules are missing. If you get well and truly stuck, find someone on IRC, the mailing list, or make a post to <dwcomm>dw_dev</dwcomm>.<br />
<br />
== Populate database with initial data ==<br />
<br />
There are a few commands you can now run to install the database. Just run these and watch for errors.<br />
<br />
<b>Note:</b> If make_system.pl says it can't give the system user admin [[privileges]], something has gone wrong with your database population, even if there were no errors.<br />
<br />
$LJHOME/bin/upgrading/update-db.pl -r --innodb<br />
$LJHOME/bin/upgrading/update-db.pl -r --innodb # at least for now we have to run this twice<br />
$LJHOME/bin/upgrading/update-db.pl -r --cluster=all --innodb<br />
$LJHOME/bin/upgrading/update-db.pl -p<br />
<br />
If you created your database for TheSchwartz earlier, you'll also want to populate it with its default tables:<br />
<br />
mysql -u dw -p dw_schwartz < /usr/share/doc/libtheschwartz-perl/schema.sql<br />
<br />
<br />
Create a system account:<br />
<br />
$LJHOME/bin/upgrading/make_system.pl<br />
<br />
(That step will ask you for a password for the [[System account]]. You can change it later by logging in as system, so just give it something for now.)<br />
<br />
And load in the translation strings:<br />
<br />
$LJHOME/bin/upgrading/texttool.pl load<br />
<br />
== Configure Apache ==<br />
<br />
This step will need to be done as the root user. Below is the Apache 2 configuration running on the Dreamwidth staging site. Put this in a file named "stage" in /etc/apache2/conf.d:<br />
<br />
User dw<br />
Group dw<br />
UseCanonicalName off<br />
<br />
StartServers 1<br />
MaxSpareServers 2<br />
MinSpareServers 1<br />
<br />
DocumentRoot /home/dw/dw/htdocs<br />
<br />
PerlSetEnv LJHOME /home/dw/dw<br />
PerlPassEnv LJHOME<br />
<br />
PerlRequire /home/dw/dw/cgi-bin/modperl.pl<br />
<br />
Then disable the default site:<br />
<br />
a2dissite default<br />
<br />
You might also have to enable the Perl Apache Request module:<br />
<br />
a2enmod apreq<br />
<br />
If you don't want this warning:<br />
<br />
[Thu Jan 15 01:46:54 2009] [warn] NameVirtualHost *:80 has no VirtualHosts<br />
... waiting [Thu Jan 15 01:46:55 2009] [warn] NameVirtualHost *:80 has no VirtualHosts<br />
...done.<br />
<br />
Then use <code>vim /etc/apache2/ports.conf</code> and put a # in front of the NameVirtualHost line:<br />
<br />
# NameVirtualHost *:80<br />
<br />
Restart the server:<br />
<br />
/etc/init.d/apache2 restart<br />
<br />
== Now what? ==<br />
<br />
=== Have a look at your new DW instance ===<br />
<br />
Congratulations! You now have a working (though minimal) Dreamwidth install. If you point your web browser at your server, you should see a bare-looking welcome page.<br />
<br />
=== Further setup ===<br />
<br />
There are lots of other articles on setting up and customizing your DW install in the [[:Category: Dreamwidth Installation|DW Installation]] category, including:<br />
<br />
* [[TheSchwartz Setup]] - TheSchwartz is needed for a handful of features - notably comment posting<br />
* [[Subdomain setup]]<br />
* [[Statistics setup]]<br />
* [[Generating documentation]]<br />
* [[Allow users to register]]<br />
* Setting up [[Search]]<br />
<br />
There is a list of wanted how-tos at [[Installation Wanted How-To]], in case you need to add something to the list.<br />
<br />
=== Starting development ===<br />
<br />
If you haven't already, see [[Dev Getting Started]].<br />
<br />
[[Category: Dreamwidth Installation]]</div>Shadowspar//wiki.dreamwidth.net/wiki/index.php/Search/SphinxSearch/Sphinx2013-06-28T11:49:49Z<p>Shadowspar: +cat</p>
<hr />
<div><br />
Sphinx indexes entries and comments. It's available from the [http://dreamwidth.org/search search page]. <br />
<br />
There are two modes of search: site search, and per-journal search.<br />
<br />
Site search only shows public content. Journal search may contain locked content, following the regular behavior for whether you can see the locked content or not. That is, if you can see it on the journal, then you can find it with search. If you can't see it on the journal, then you won't see it in the search results. There's also an option to search by comments. Only comments made on paid users' journals are indexed for technical reasons (site load).<br />
<br />
<br />
== Setup ==<br />
<br />
This page documents the process you will need to go through to setup the Sphinx search system that Dreamwidth uses. This is not an easy process, and the documentation is probably going to need some iterations to get to a very useful state.<br />
<br />
I only suggest setting up the search system if you have a good amount of time to mess around with things. If you need some help, feel free to grab me (<dw-user>mark</dw-user>) anytime and I'll help out.<br />
<br />
== Software Installation ==<br />
<br />
First, you will need to setup the Sphinx software. Very first, you should make sure you have some packages (Ubuntu Intrepid):<br />
<br />
apt-get install libpath-class-perl libmysqlclient15-dev g++<br />
<br />
The instructions are different depending on your version of Ubuntu, so choose the appropriate version:<br />
<br />
=== Jaunty/9.04 and older ===<br />
<br />
==== Installing File::SearchPath and Sphinx::Search ====<br />
<br />
There are two Perl packages that you will have to download:<br />
<br />
http://search.cpan.org/CPAN/authors/id/T/TJ/TJENNESS/File-SearchPath-0.05.tar.gz<br />
http://search.cpan.org/CPAN/authors/id/J/JJ/JJSCHUTZ/Sphinx-Search-0.12.tar.gz<br />
<br />
Now, you need to build these. They are standard Perl packages which you can build with dh-make-perl. Do File::SearchPath first (and then install it) and then you can build Sphinx::Search (and install it).<br />
<br />
==== Installing the Sphinx package ====<br />
<br />
You will need to download the Sphinx package:<br />
<br />
http://sphinxsearch.com/downloads/sphinx-0.9.8.1.tar.gz<br />
<br />
The Sphinx package itself is a standard project style. Setup and installation looks something like this:<br />
<br />
tar -zxvf sphinx-0.9.8.1.tar.gz<br />
cd sphinx-0.9.8.1/<br />
./configure<br />
make<br />
make install<br />
<br />
=== Karmic/9.10 and newer ===<br />
<br />
==== Installing File::SearchPath and Sphinx::Search ====<br />
<br />
From Ubuntu 9.10 and up, these Perl packages are available in the packaging system. You can install them in one step:<br />
<br />
apt-get install libfile-searchpath-perl libsphinx-search-perl<br />
<br />
==== Installing the Sphinx package ====<br />
<br />
You will need to download the Sphinx package:<br />
<br />
http://sphinxsearch.com/downloads/sphinx-0.9.9.tar.gz<br />
<br />
The Sphinx package itself is a standard project style. Setup and installation looks something like this:<br />
<br />
tar -zxvf sphinx-0.9.9.tar.gz<br />
cd sphinx-0.9.9/<br />
./configure<br />
make<br />
make install<br />
<br />
<br />
It is important that you [http://search.cpan.org/~jjschutz/Sphinx-Search-0.22/lib/Sphinx/Search.pm#VERSION match up the versions] of the Perl packages and the Sphinx package; otherwise, your searches will silently fail due to incompatibilities in the API. (For instance, assuming the proper workers are running, if <tt>"search -q terms"</tt> returns results, while a site search always fails, this is one possible reason.)<br />
<br />
Assuming that all works, you should have everything installed that you need to get the search system setup. Moving on!<br />
<br />
== Configuration ==<br />
<br />
There are several points to configure. Let's start with the configuration of your database.<br />
<br />
=== Database ===<br />
<br />
You will need to create a new database. Something like this process will work:<br />
<br />
CREATE DATABASE dw_sphinx;<br />
GRANT ALL ON dw_sphinx.* TO dw@'localhost' IDENTIFIED BY 'dw';<br />
USE dw_sphinx;<br />
<br />
Now, you have to make a table. Use these CREATE TABLE statements:<br />
<br />
<gist>bbf5bc7a8a814ae1f893</gist><br />
<br />
The table is a pretty straightforward table. It just stores the posts, who they're by, where they're at, and some basic security information. Note that this table has the full uncompressed subject and text of the entries, so it can get rather large.<br />
<br />
=== Site ===<br />
<br />
Configuring your site is next. This involves adding a new section to your %DBINFO hash, like this:<br />
<br />
sphinx => {<br />
host => '127.0.0.1',<br />
port => 3306,<br />
user => 'dw',<br />
pass => 'dw',<br />
dbname => 'dw_sphinx',<br />
role => {<br />
sphinx_search => 1,<br />
},<br />
},<br />
<br />
You also need to add a configuration elsewhere in the file that tells your system where the search daemon will be. Port 3312 is the default:<br />
<br />
# sphinx search daemon<br />
@SPHINX_SEARCHD = ( '127.0.0.1', 3312 );<br />
<br />
That's it for site configuration. Once you have the above two options in, then your site will do all the right things to make the search active. Of course, we still have to configure Sphinx itself...<br />
<br />
=== Sphinx ===<br />
<br />
Left this to last as it's probably the trickiest. The first step is, assuming you're going to be running Sphinx as root (I do), to make the directory it needs:<br />
<br />
mkdir /var/data<br />
<br />
Now, we need to set up the configuration file. By default, sphinx looks for the file <tt>/usr/local/etc/sphinx.conf</tt>. If that's not present on your system, try running "indexer --quiet"; it will fail if it didn't find a config file, but will helpfully tell you where it tried to look.<br />
<br />
<br />
<gist>b6023cb38818879c5a42</gist><br />
<br />
That's right. It's long. But it's actually almost identical to the configuration file that comes with Sphinx. I had to do a lot of tweaking to figure out the right combination of values for UTF-8 support and the like, but the rest is pretty straightforward.<br />
<br />
Make sure to customize `sql_user` and `sql_pass` in the configuration files to match what you used earlier.<br />
<br />
<br />
== Testing ==<br />
<br />
To make sure that your test setup is working, once you have all of the configuration done, try to run the indexer (as root).<br />
<br />
indexer --all<br />
<br />
You should see it spit out some stuff saying it's collecting documents, and if all goes well, you should see files in /var/data. You won't be able to search yet because you haven't placed any data in your search database, but you'll at least have confirmed that you have Sphinx configured properly.<br />
<br />
<br />
== Search Architecture ==<br />
<br />
Making content searchable requires two things:<br />
<br />
* a '''search database'''. The search database contains the text of entries and comments that we want to be searchable. It's separate from the main database. Every time an entry or comment is posted or edited, it needs to be copied from the main database into the search database. The worker that does this is <tt>'''sphinx-copier'''</tt>, which is run by TheSchwartz.<br />
* a '''search index'''. Doing a search on raw text is painfully slow, so Sphinx processes the contents of the search database further -- it creates an index of words, then runs searches against that index instead of the raw text itself. Processing the text this way also makes it possible for a search for "test" to turn up "tests", "testing", etc. The index is created by running a program named, surprisingly enough, <tt>'''indexer'''</tt>. <br />
<br />
Running searches and getting results requires two more:<br />
<br />
* the Sphinx '''search daemon''' -- the program that actually runs searches. This is <tt>'''searchd'''</tt>.<br />
* a '''search worker''', which connects to the Sphinx daemon, feeds it queries, and retrieves the results. This is <tt>'''sphinx-search-gm'''</tt>, a Gearman job.<br />
<br />
<br />
<br />
== Assembling the pieces (test env) ==<br />
<br />
Now, here's how we put all of those pieces together in a test environment.<br />
<br />
* First, we need to have both [[TheSchwartz Setup | TheSchwartz]] and [[Setting up Gearman | Gearman]] set up and working -- <tt>sphinx-copier</tt> depends on the former, and <tt>sphinx-search-gm</tt> on the latter.<br />
* Now, we want to run both of those workers in the foreground so that we can keep an eye on them. In separate terminal sessions, run<br />
bin/worker/sphinx-copier -v<br />
bin/worker/sphinx-search-gm -v<br />
* Next, we need to have the search daemon running -- also in the foreground:<br />
searchd --console<br />
* To get data into the search db, you have two options: <br />
** You can post to some of your paid accounts. Now that <tt>sphinx-copier</tt> is running, it will pick up anything new that you post and schedule it for addition to the search db. <br />
** Alternatively, you can run the manual copier, which will tell <tt>sphinx-copier</tt> about any posts or comments that area already on your site:<br />
bin/schedule-copier-jobs<br />
* ...running that will get your sphinx-copier busy copying data into the dw_sphinx database you made earlier. You can see if it works by watching the output of the sphinx-copier -- it should say something about inserting posts. You can then go to the dw_sphinx database and select from posts_raw to see the data is actually in the system.<br />
* Now that we have data in the search database, we have to index it. On a production site, you'd want to run the indexer every 15 minutes or so; in test, you can just run it before you do a search, if you've added new content since the last run.<br />
indexer --all --rotate<br />
<br />
* Finally, restart searchd. <br />
<br />
You should now be able to search for things from the command line or from your site! To search from the command line, use:<br />
<br />
search -q some words<br />
<br />
<br />
Sphinx is resource-intensive. It's intentionally been made a separate system from the main Dreamwidth site, so that it can be run on a different machine from the webservers in production.<br />
<br />
You don't have to worry too much about load on a development server where you have little data to index and it's only you on the machine. Still, it may make sense to only turn on the search workers when you're testing something search-related.<br />
<br />
<br />
[[Category: Development]][[Category: Dreamwidth Installation]][[Category: Reference]][[Category:Search]]</div>Shadowspar//wiki.dreamwidth.net/wiki/index.php/Search/SphinxSearch/Sphinx2013-06-28T03:39:09Z<p>Shadowspar: update sphinx.conf w/ most recent gist</p>
<hr />
<div><br />
Sphinx indexes entries and comments. It's available from the [http://dreamwidth.org/search search page]. <br />
<br />
There are two modes of search: site search, and per-journal search.<br />
<br />
Site search only shows public content. Journal search may contain locked content, following the regular behavior for whether you can see the locked content or not. That is, if you can see it on the journal, then you can find it with search. If you can't see it on the journal, then you won't see it in the search results. There's also an option to search by comments. Only comments made on paid users' journals are indexed for technical reasons (site load).<br />
<br />
<br />
== Setup ==<br />
<br />
This page documents the process you will need to go through to setup the Sphinx search system that Dreamwidth uses. This is not an easy process, and the documentation is probably going to need some iterations to get to a very useful state.<br />
<br />
I only suggest setting up the search system if you have a good amount of time to mess around with things. If you need some help, feel free to grab me (<dw-user>mark</dw-user>) anytime and I'll help out.<br />
<br />
== Software Installation ==<br />
<br />
First, you will need to setup the Sphinx software. Very first, you should make sure you have some packages (Ubuntu Intrepid):<br />
<br />
apt-get install libpath-class-perl libmysqlclient15-dev g++<br />
<br />
The instructions are different depending on your version of Ubuntu, so choose the appropriate version:<br />
<br />
=== Jaunty/9.04 and older ===<br />
<br />
==== Installing File::SearchPath and Sphinx::Search ====<br />
<br />
There are two Perl packages that you will have to download:<br />
<br />
http://search.cpan.org/CPAN/authors/id/T/TJ/TJENNESS/File-SearchPath-0.05.tar.gz<br />
http://search.cpan.org/CPAN/authors/id/J/JJ/JJSCHUTZ/Sphinx-Search-0.12.tar.gz<br />
<br />
Now, you need to build these. They are standard Perl packages which you can build with dh-make-perl. Do File::SearchPath first (and then install it) and then you can build Sphinx::Search (and install it).<br />
<br />
==== Installing the Sphinx package ====<br />
<br />
You will need to download the Sphinx package:<br />
<br />
http://sphinxsearch.com/downloads/sphinx-0.9.8.1.tar.gz<br />
<br />
The Sphinx package itself is a standard project style. Setup and installation looks something like this:<br />
<br />
tar -zxvf sphinx-0.9.8.1.tar.gz<br />
cd sphinx-0.9.8.1/<br />
./configure<br />
make<br />
make install<br />
<br />
=== Karmic/9.10 and newer ===<br />
<br />
==== Installing File::SearchPath and Sphinx::Search ====<br />
<br />
From Ubuntu 9.10 and up, these Perl packages are available in the packaging system. You can install them in one step:<br />
<br />
apt-get install libfile-searchpath-perl libsphinx-search-perl<br />
<br />
==== Installing the Sphinx package ====<br />
<br />
You will need to download the Sphinx package:<br />
<br />
http://sphinxsearch.com/downloads/sphinx-0.9.9.tar.gz<br />
<br />
The Sphinx package itself is a standard project style. Setup and installation looks something like this:<br />
<br />
tar -zxvf sphinx-0.9.9.tar.gz<br />
cd sphinx-0.9.9/<br />
./configure<br />
make<br />
make install<br />
<br />
<br />
It is important that you [http://search.cpan.org/~jjschutz/Sphinx-Search-0.22/lib/Sphinx/Search.pm#VERSION match up the versions] of the Perl packages and the Sphinx package; otherwise, your searches will silently fail due to incompatibilities in the API. (For instance, assuming the proper workers are running, if <tt>"search -q terms"</tt> returns results, while a site search always fails, this is one possible reason.)<br />
<br />
Assuming that all works, you should have everything installed that you need to get the search system setup. Moving on!<br />
<br />
== Configuration ==<br />
<br />
There are several points to configure. Let's start with the configuration of your database.<br />
<br />
=== Database ===<br />
<br />
You will need to create a new database. Something like this process will work:<br />
<br />
CREATE DATABASE dw_sphinx;<br />
GRANT ALL ON dw_sphinx.* TO dw@'localhost' IDENTIFIED BY 'dw';<br />
USE dw_sphinx;<br />
<br />
Now, you have to make a table. Use these CREATE TABLE statements:<br />
<br />
<gist>bbf5bc7a8a814ae1f893</gist><br />
<br />
The table is a pretty straightforward table. It just stores the posts, who they're by, where they're at, and some basic security information. Note that this table has the full uncompressed subject and text of the entries, so it can get rather large.<br />
<br />
=== Site ===<br />
<br />
Configuring your site is next. This involves adding a new section to your %DBINFO hash, like this:<br />
<br />
sphinx => {<br />
host => '127.0.0.1',<br />
port => 3306,<br />
user => 'dw',<br />
pass => 'dw',<br />
dbname => 'dw_sphinx',<br />
role => {<br />
sphinx_search => 1,<br />
},<br />
},<br />
<br />
You also need to add a configuration elsewhere in the file that tells your system where the search daemon will be. Port 3312 is the default:<br />
<br />
# sphinx search daemon<br />
@SPHINX_SEARCHD = ( '127.0.0.1', 3312 );<br />
<br />
That's it for site configuration. Once you have the above two options in, then your site will do all the right things to make the search active. Of course, we still have to configure Sphinx itself...<br />
<br />
=== Sphinx ===<br />
<br />
Left this to last as it's probably the trickiest. The first step is, assuming you're going to be running Sphinx as root (I do), to make the directory it needs:<br />
<br />
mkdir /var/data<br />
<br />
Now, we need to set up the configuration file. By default, sphinx looks for the file <tt>/usr/local/etc/sphinx.conf</tt>. If that's not present on your system, try running "indexer --quiet"; it will fail if it didn't find a config file, but will helpfully tell you where it tried to look.<br />
<br />
<br />
<gist>b6023cb38818879c5a42</gist><br />
<br />
That's right. It's long. But it's actually almost identical to the configuration file that comes with Sphinx. I had to do a lot of tweaking to figure out the right combination of values for UTF-8 support and the like, but the rest is pretty straightforward.<br />
<br />
Make sure to customize `sql_user` and `sql_pass` in the configuration files to match what you used earlier.<br />
<br />
<br />
== Testing ==<br />
<br />
To make sure that your test setup is working, once you have all of the configuration done, try to run the indexer (as root).<br />
<br />
indexer --all<br />
<br />
You should see it spit out some stuff saying it's collecting documents, and if all goes well, you should see files in /var/data. You won't be able to search yet because you haven't placed any data in your search database, but you'll at least have confirmed that you have Sphinx configured properly.<br />
<br />
<br />
== Search Architecture ==<br />
<br />
Making content searchable requires two things:<br />
<br />
* a '''search database'''. The search database contains the text of entries and comments that we want to be searchable. It's separate from the main database. Every time an entry or comment is posted or edited, it needs to be copied from the main database into the search database. The worker that does this is <tt>'''sphinx-copier'''</tt>, which is run by TheSchwartz.<br />
* a '''search index'''. Doing a search on raw text is painfully slow, so Sphinx processes the contents of the search database further -- it creates an index of words, then runs searches against that index instead of the raw text itself. Processing the text this way also makes it possible for a search for "test" to turn up "tests", "testing", etc. The index is created by running a program named, surprisingly enough, <tt>'''indexer'''</tt>. <br />
<br />
Running searches and getting results requires two more:<br />
<br />
* the Sphinx '''search daemon''' -- the program that actually runs searches. This is <tt>'''searchd'''</tt>.<br />
* a '''search worker''', which connects to the Sphinx daemon, feeds it queries, and retrieves the results. This is <tt>'''sphinx-search-gm'''</tt>, a Gearman job.<br />
<br />
<br />
<br />
== Assembling the pieces (test env) ==<br />
<br />
Now, here's how we put all of those pieces together in a test environment.<br />
<br />
* First, we need to have both [[TheSchwartz Setup | TheSchwartz]] and [[Setting up Gearman | Gearman]] set up and working -- <tt>sphinx-copier</tt> depends on the former, and <tt>sphinx-search-gm</tt> on the latter.<br />
* Now, we want to run both of those workers in the foreground so that we can keep an eye on them. In separate terminal sessions, run<br />
bin/worker/sphinx-copier -v<br />
bin/worker/sphinx-search-gm -v<br />
* Next, we need to have the search daemon running -- also in the foreground:<br />
searchd --console<br />
* To get data into the search db, you have two options: <br />
** You can post to some of your paid accounts. Now that <tt>sphinx-copier</tt> is running, it will pick up anything new that you post and schedule it for addition to the search db. <br />
** Alternatively, you can run the manual copier, which will tell <tt>sphinx-copier</tt> about any posts or comments that area already on your site:<br />
bin/schedule-copier-jobs<br />
* ...running that will get your sphinx-copier busy copying data into the dw_sphinx database you made earlier. You can see if it works by watching the output of the sphinx-copier -- it should say something about inserting posts. You can then go to the dw_sphinx database and select from posts_raw to see the data is actually in the system.<br />
* Now that we have data in the search database, we have to index it. On a production site, you'd want to run the indexer every 15 minutes or so; in test, you can just run it before you do a search, if you've added new content since the last run.<br />
indexer --all --rotate<br />
<br />
* Finally, restart searchd. <br />
<br />
You should now be able to search for things from the command line or from your site! To search from the command line, use:<br />
<br />
search -q some words<br />
<br />
<br />
Sphinx is resource-intensive. It's intentionally been made a separate system from the main Dreamwidth site, so that it can be run on a different machine from the webservers in production.<br />
<br />
You don't have to worry too much about load on a development server where you have little data to index and it's only you on the machine. Still, it may make sense to only turn on the search workers when you're testing something search-related.<br />
<br />
<br />
[[Category: Development]][[Category: Dreamwidth Installation]][[Category: Reference]]</div>Shadowspar//wiki.dreamwidth.net/wiki/index.php/Search/SphinxSearch/Sphinx2013-06-28T03:35:50Z<p>Shadowspar: </p>
<hr />
<div><br />
Sphinx indexes entries and comments. It's available from the [http://dreamwidth.org/search search page]. <br />
<br />
There are two modes of search: site search, and per-journal search.<br />
<br />
Site search only shows public content. Journal search may contain locked content, following the regular behavior for whether you can see the locked content or not. That is, if you can see it on the journal, then you can find it with search. If you can't see it on the journal, then you won't see it in the search results. There's also an option to search by comments. Only comments made on paid users' journals are indexed for technical reasons (site load).<br />
<br />
<br />
== Setup ==<br />
<br />
This page documents the process you will need to go through to setup the Sphinx search system that Dreamwidth uses. This is not an easy process, and the documentation is probably going to need some iterations to get to a very useful state.<br />
<br />
I only suggest setting up the search system if you have a good amount of time to mess around with things. If you need some help, feel free to grab me (<dw-user>mark</dw-user>) anytime and I'll help out.<br />
<br />
== Software Installation ==<br />
<br />
First, you will need to setup the Sphinx software. Very first, you should make sure you have some packages (Ubuntu Intrepid):<br />
<br />
apt-get install libpath-class-perl libmysqlclient15-dev g++<br />
<br />
The instructions are different depending on your version of Ubuntu, so choose the appropriate version:<br />
<br />
=== Jaunty/9.04 and older ===<br />
<br />
==== Installing File::SearchPath and Sphinx::Search ====<br />
<br />
There are two Perl packages that you will have to download:<br />
<br />
http://search.cpan.org/CPAN/authors/id/T/TJ/TJENNESS/File-SearchPath-0.05.tar.gz<br />
http://search.cpan.org/CPAN/authors/id/J/JJ/JJSCHUTZ/Sphinx-Search-0.12.tar.gz<br />
<br />
Now, you need to build these. They are standard Perl packages which you can build with dh-make-perl. Do File::SearchPath first (and then install it) and then you can build Sphinx::Search (and install it).<br />
<br />
==== Installing the Sphinx package ====<br />
<br />
You will need to download the Sphinx package:<br />
<br />
http://sphinxsearch.com/downloads/sphinx-0.9.8.1.tar.gz<br />
<br />
The Sphinx package itself is a standard project style. Setup and installation looks something like this:<br />
<br />
tar -zxvf sphinx-0.9.8.1.tar.gz<br />
cd sphinx-0.9.8.1/<br />
./configure<br />
make<br />
make install<br />
<br />
=== Karmic/9.10 and newer ===<br />
<br />
==== Installing File::SearchPath and Sphinx::Search ====<br />
<br />
From Ubuntu 9.10 and up, these Perl packages are available in the packaging system. You can install them in one step:<br />
<br />
apt-get install libfile-searchpath-perl libsphinx-search-perl<br />
<br />
==== Installing the Sphinx package ====<br />
<br />
You will need to download the Sphinx package:<br />
<br />
http://sphinxsearch.com/downloads/sphinx-0.9.9.tar.gz<br />
<br />
The Sphinx package itself is a standard project style. Setup and installation looks something like this:<br />
<br />
tar -zxvf sphinx-0.9.9.tar.gz<br />
cd sphinx-0.9.9/<br />
./configure<br />
make<br />
make install<br />
<br />
<br />
It is important that you [http://search.cpan.org/~jjschutz/Sphinx-Search-0.22/lib/Sphinx/Search.pm#VERSION match up the versions] of the Perl packages and the Sphinx package; otherwise, your searches will silently fail due to incompatibilities in the API. (For instance, assuming the proper workers are running, if <tt>"search -q terms"</tt> returns results, while a site search always fails, this is one possible reason.)<br />
<br />
Assuming that all works, you should have everything installed that you need to get the search system setup. Moving on!<br />
<br />
== Configuration ==<br />
<br />
There are several points to configure. Let's start with the configuration of your database.<br />
<br />
=== Database ===<br />
<br />
You will need to create a new database. Something like this process will work:<br />
<br />
CREATE DATABASE dw_sphinx;<br />
GRANT ALL ON dw_sphinx.* TO dw@'localhost' IDENTIFIED BY 'dw';<br />
USE dw_sphinx;<br />
<br />
Now, you have to make a table. Use these CREATE TABLE statements:<br />
<br />
<gist>bbf5bc7a8a814ae1f893</gist><br />
<br />
The table is a pretty straightforward table. It just stores the posts, who they're by, where they're at, and some basic security information. Note that this table has the full uncompressed subject and text of the entries, so it can get rather large.<br />
<br />
=== Site ===<br />
<br />
Configuring your site is next. This involves adding a new section to your %DBINFO hash, like this:<br />
<br />
sphinx => {<br />
host => '127.0.0.1',<br />
port => 3306,<br />
user => 'dw',<br />
pass => 'dw',<br />
dbname => 'dw_sphinx',<br />
role => {<br />
sphinx_search => 1,<br />
},<br />
},<br />
<br />
You also need to add a configuration elsewhere in the file that tells your system where the search daemon will be. Port 3312 is the default:<br />
<br />
# sphinx search daemon<br />
@SPHINX_SEARCHD = ( '127.0.0.1', 3312 );<br />
<br />
That's it for site configuration. Once you have the above two options in, then your site will do all the right things to make the search active. Of course, we still have to configure Sphinx itself...<br />
<br />
=== Sphinx ===<br />
<br />
Left this to last as it's probably the trickiest. The first step is, assuming you're going to be running Sphinx as root (I do), to make the directory it needs:<br />
<br />
mkdir /var/data<br />
<br />
Now, we need to set up the configuration file. By default, sphinx looks for the file <tt>/usr/local/etc/sphinx.conf</tt>. If that's not present on your system, try running "indexer --quiet"; it will fail if it didn't find a config file, but will helpfully tell you where it tried to look.<br />
<br />
<br />
<gist>f50f0604a064db0464ad</gist><br />
<br />
That's right. It's long. But it's actually almost identical to the configuration file that comes with Sphinx. I had to do a lot of tweaking to figure out the right combination of values for UTF-8 support and the like, but the rest is pretty straightforward.<br />
<br />
Make sure to customize `sql_user` and `sql_pass` in the configuration files to match what you used earlier.<br />
<br />
<br />
== Testing ==<br />
<br />
To make sure that your test setup is working, once you have all of the configuration done, try to run the indexer (as root).<br />
<br />
indexer --all<br />
<br />
You should see it spit out some stuff saying it's collecting documents, and if all goes well, you should see files in /var/data. You won't be able to search yet because you haven't placed any data in your search database, but you'll at least have confirmed that you have Sphinx configured properly.<br />
<br />
<br />
== Search Architecture ==<br />
<br />
Making content searchable requires two things:<br />
<br />
* a '''search database'''. The search database contains the text of entries and comments that we want to be searchable. It's separate from the main database. Every time an entry or comment is posted or edited, it needs to be copied from the main database into the search database. The worker that does this is <tt>'''sphinx-copier'''</tt>, which is run by TheSchwartz.<br />
* a '''search index'''. Doing a search on raw text is painfully slow, so Sphinx processes the contents of the search database further -- it creates an index of words, then runs searches against that index instead of the raw text itself. Processing the text this way also makes it possible for a search for "test" to turn up "tests", "testing", etc. The index is created by running a program named, surprisingly enough, <tt>'''indexer'''</tt>. <br />
<br />
Running searches and getting results requires two more:<br />
<br />
* the Sphinx '''search daemon''' -- the program that actually runs searches. This is <tt>'''searchd'''</tt>.<br />
* a '''search worker''', which connects to the Sphinx daemon, feeds it queries, and retrieves the results. This is <tt>'''sphinx-search-gm'''</tt>, a Gearman job.<br />
<br />
<br />
<br />
== Assembling the pieces (test env) ==<br />
<br />
Now, here's how we put all of those pieces together in a test environment.<br />
<br />
* First, we need to have both [[TheSchwartz Setup | TheSchwartz]] and [[Setting up Gearman | Gearman]] set up and working -- <tt>sphinx-copier</tt> depends on the former, and <tt>sphinx-search-gm</tt> on the latter.<br />
* Now, we want to run both of those workers in the foreground so that we can keep an eye on them. In separate terminal sessions, run<br />
bin/worker/sphinx-copier -v<br />
bin/worker/sphinx-search-gm -v<br />
* Next, we need to have the search daemon running -- also in the foreground:<br />
searchd --console<br />
* To get data into the search db, you have two options: <br />
** You can post to some of your paid accounts. Now that <tt>sphinx-copier</tt> is running, it will pick up anything new that you post and schedule it for addition to the search db. <br />
** Alternatively, you can run the manual copier, which will tell <tt>sphinx-copier</tt> about any posts or comments that area already on your site:<br />
bin/schedule-copier-jobs<br />
* ...running that will get your sphinx-copier busy copying data into the dw_sphinx database you made earlier. You can see if it works by watching the output of the sphinx-copier -- it should say something about inserting posts. You can then go to the dw_sphinx database and select from posts_raw to see the data is actually in the system.<br />
* Now that we have data in the search database, we have to index it. On a production site, you'd want to run the indexer every 15 minutes or so; in test, you can just run it before you do a search, if you've added new content since the last run.<br />
indexer --all --rotate<br />
<br />
* Finally, restart searchd. <br />
<br />
You should now be able to search for things from the command line or from your site! To search from the command line, use:<br />
<br />
search -q some words<br />
<br />
<br />
Sphinx is resource-intensive. It's intentionally been made a separate system from the main Dreamwidth site, so that it can be run on a different machine from the webservers in production.<br />
<br />
You don't have to worry too much about load on a development server where you have little data to index and it's only you on the machine. Still, it may make sense to only turn on the search workers when you're testing something search-related.<br />
<br />
<br />
[[Category: Development]][[Category: Dreamwidth Installation]][[Category: Reference]]</div>Shadowspar//wiki.dreamwidth.net/wiki/index.php/SearchSearch2013-06-28T03:32:43Z<p>Shadowspar: +details</p>
<hr />
<div>There are two different kinds of search on Dreamwidth installations. When it comes to test or development environments, they are optional. All of them require further setup in addition to a basic Dreamwidth install. <br />
<br />
All of the search types are referred to from the tools/search page: http://www.dreamwidth.org/tools/search<br />
<br />
== UserSearch ==<br />
<br />
UserSearch searches for users matching certain characteristics. It's also known as Directory Search, as well as Community Search (which does the same thing, but limits the results found to communities instead of individual users).<br />
<br />
UserSearch is exposed at: <br />
* http://www.dreamwidth.org/directorysearch<br />
* http://www.dreamwidth.org/community/search<br />
* ...as well as the search widget on the right-hand side of the nav strip.<br />
<br />
Instructions for setup can be found in [[Search/UserSearch]].<br />
<br />
<br />
== Sphinx ==<br />
<br />
Sphinx searches through entries, as well as comments (on journals of paid users only). Sphinx is also behind support search, though this is kept in a separate search index from that of the main site. <br />
<br />
Sphinx is exposed at <br />
* http://www.dreamwidth.org/search<br />
* http://www.dreamwidth.org/support/history <br />
<br />
More details and setup instructions can be found in [[Search/Sphinx]].<br />
<br />
<br />
== Other search-related pages ==<br />
<br />
* [[Search Wishlist]]<br />
<br />
[[Category: Search]]</div>Shadowspar//wiki.dreamwidth.net/wiki/index.php/Dreamwidth_Scratch_InstallationDreamwidth Scratch Installation2013-06-28T03:17:18Z<p>Shadowspar: /* Further setup */ +ln: search</p>
<hr />
<div><br />
Firstly, you'll need to set up a Linux system -- here are the [[Suggested Server Requirements]]. These instructions assume Ubuntu 12.04 or up. Please let us know if you run into difficulties--we want to update this if people are having problems! We recommend coming into the #dreamwidth-dev channel on [[IRC]].<br />
<br />
After you set up, you can keep updated with the instructions on [[Dev Maintenance]].<br />
<br />
If you have difficulties or problems or suggestions for installation procedures, please report them to [http://bugs.dwscoalition.org/show_bug.cgi?id=61 Bug 61]. Also look at [[Production Setup: Webserver]]. <br />
<br />
== Bringing the system up to date ==<br />
<br />
Before you start installing anything else, you might want to make sure your system is up to date. You should update the packages on your system (either in a root shell (sudo bash) or preceding these commands with 'sudo'):<br />
<br />
apt-get update<br />
apt-get upgrade<br />
<br />
If you want man pages on your system: <br />
<br />
apt-get install man<br />
<br />
== Installing necessary packages ==<br />
<br />
This will install necessary packages you'll need to run Dreamwidth (and some optional ones). You'll want to be root when running these commands.<br />
<br />
apt-get install git-core subversion apache2-mpm-prefork \<br />
libapache2-mod-perl2 libapache2-mod-apreq2 libapache2-request-perl \<br />
mysql-server wget unzip links vim libclass-autouse-perl \<br />
libdatetime-perl libcache-memcached-perl libhash-multivalue-perl \<br />
libgd-gd2-perl libhtml-template-perl libwww-perl libmime-lite-perl \<br />
libnet-dns-perl liburi-perl libxml-simple-perl libclass-accessor-perl \<br />
libclass-data-inheritable-perl libclass-trigger-perl libcrypt-dh-perl \<br />
libmath-bigint-gmp-perl liburi-fetch-perl libgd-graph-perl \<br />
libgnupg-interface-perl libmail-gnupg-perl perlmagick \<br />
libproc-processtable-perl libsoap-lite-perl librpc-xml-perl \<br />
libstring-crc32-perl libtext-vcard-perl libxml-atom-perl libxml-rss-perl \<br />
libimage-size-perl libunicode-maputf8-perl libgtop2-dev build-essential \<br />
libnet-openid-consumer-perl libnet-openid-server-perl libyaml-perl \<br />
libcaptcha-recaptcha-perl libdbd-sqlite3-perl libtest-simple-perl \<br />
libtest-simpleunit-perl libtemplate-perl libterm-readkey-perl \<br />
gcc libtest-most-perl libgearman-client-perl \<br />
libbusiness-creditcard-perl liblwpx-paranoidagent-perl \<br />
libtheschwartz-perl libfile-type-perl libjson-perl<br />
<br />
This will download about 113MB of files and use around 355MB of disk space.<br />
<br />
Check whether these packages have actually installed. Later on in the process, if you find you are having inexplicable problems, try installing these again.<br />
<br />
<br />
=== Then ===<br />
<br />
[http://perl.apache.org/docs/2.0/user/install/install.html#Prerequisites Check] whether your system is using threaded MPMs or pre-fork. You will need the latter. (Note: if you ran the above command to install Apache, then you have the pre-fork version installed.)<br />
<br />
If you have weird errors saying things like "Package mercurial is not available, but is referred to by another package.", try editing <tt>/etc/apt/sources.list</tt> and uncommenting the other repositories and then doing an <tt>apt-get</tt> update. Ran into this problem on a fresh install of <tt>jaunty</tt> on Linode.<br />
<br />
You will also want to install some perl libraries with CPAN. Defaults during CPAN's setup should be okay.<br />
<br />
Before installing, check if your CPAN shell has 'make' at the correct location. Run <tt>which make</tt>, then compare the results with running <tt>o conf make</tt> at the CPAN shell (to run the CPAN shell, type <tt>cpan</tt>.)<br />
<br />
The perl libraries are:<br />
<br />
cpan Bundle::CPAN # this will guide you through setting up CPAN<br />
cpan GTop <br />
cpan Digest::SHA1<br />
cpan Unicode::CheckUTF8<br />
cpan MogileFS::Client # this is necessary even if you don't use MogileFS<br />
cpan TheSchwartz::Worker::SendEmail<br />
cpan TheSchwartz::Worker::PubSubHubbubPublish<br />
cpan Digest::SHA256<br />
cpan Text::Markdown<br />
<br />
See [http://wiki.dwscoalition.org/notes/Bundle::CPAN Bundle::CPAN] if you are having trouble installing Bundle::CPAN<br />
<br />
You will also want to install and configure Postfix so your DW can send out email:<br />
<br />
apt-get install postfix<br />
<br />
If you choose not to configure on the install, you can do so later with:<br />
<br />
dpkg-reconfigure postfix<br />
<br />
== Set Timezone to UTC ==<br />
<br />
Dreamwidth will complain if you aren't running in UTC. If you're not configured for UTC already, you can reset it (on Ubuntu/Debian) using<br />
<br />
dpkg-reconfigure tzdata<br />
<br />
and choose Etc/UTC.<br />
<br />
== Setting up the DW user account ==<br />
<br />
{{Note|text=If you still find yourself unable to make sudo commands even after <code>usermod</code>, please see [[Making your DW user a sudo account]] for alternatives.}} Create a user account that will be used for the code. This can be your own personal account if you wish, but it is recommended that you setup a new user that is only going to be used for running the code. That way if you have any insecure code running (i.e., a bad page, or a patch you're working on doesn't have security implemented yet) you don't have to worry about someone getting access to your personal files.<br />
<br />
To set up the user account:<br />
<br />
adduser <i>username</i><br />
<br />
Fill out the user's info and put them in the sudo group:<br />
<br />
usermod -a -G sudo <i>username</i><br />
<br />
So, to use <code>dw</code> as a username:<br />
<br />
adduser dw<br />
usermod -a -G sudo dw<br />
<br />
Now, we will get the $LJHOME variable set. Log into your user:<br />
<br />
su - dw<br />
<br />
We will assume that you use the bash shell. If you do not, then this section does not apply. You will have to find the shell specific way of setting environment variables.<br />
<br />
For bash, you should look in the home directory of the user account you just created for a file .profile. You will want to add one more line to this file:<br />
<br />
export LJHOME=/home/dw/dw<br />
<br />
Or wherever it is that you want the root of your source code install to be. Yes, the variable is named LJHOME. We'll live with it for now. ;-)<br />
<br />
Test this. Log out of the dw user account and log back in, then type:<br />
<br />
echo $LJHOME<br />
<br />
You should see <tt>/home/dw/dw</tt> or whatever you set it to. If you don't, then something has gone awry -- maybe the export line isn't in the right place..?<br />
<br />
== Get the Dreamwidth code ==<br />
<br />
=== Set up GitHub ===<br />
<br />
First, create an account on Github. Then, you will need to fork these two repositories:<br />
<br />
* https://github.com/dreamwidth/dw-free<br />
* https://github.com/dreamwidth/dw-nonfree<br />
<br />
Go to each of their pages, and click the "Fork" button. This sets up your own copy of Dreamwidth's code which use to make and submit your changes.<br />
<br />
Here's a quick overview of how the repositories will work together:<br />
<br />
* dw-free is the main repository and goes into $LJHOME<br />
* other repositories will go into $LJHOME/ext<br />
* personal config files go into $LJHOME/ext/local<br />
* All code from dw-free ($LJHOME) and the additional repos under $LJHOME/ext are automatically live when you start your server. There's no need to run any additional syncing steps anymore.<br />
<br />
=== Set up dw-free ===<br />
<br />
Replace the USERNAME sections of the URL with your Github username. This will make your repository an authenticated version that can push changes back to Github, as opposed to only being able to pull them.<br />
<br />
# clone a copy of the repository onto your machine<br />
cd ~/<br />
git clone https://USERNAME@github.com/USERNAME/dw-free.git $LJHOME<br />
cd $LJHOME<br />
<br />
# and let's make it aware of the dreamwidth repository so we can grab updates later<br />
git remote add dreamwidth https://github.com/dreamwidth/dw-free<br />
git fetch dreamwidth<br />
# we also want to sync up with the main branches<br />
git branch --set-upstream develop dreamwidth/develop <br />
git branch --set-upstream master dreamwidth/master<br />
<br />
=== Set up dw-nonfree ===<br />
<br />
{{ Warn|text=For dev servers only. Clone sites should not use dw-nonfree because it contains Dreamwidth-specific branding and files}}<br />
<br />
cd $LJHOME/ext<br />
git clone https://USERNAME@github.com/USERNAME/dw-nonfree.git<br />
cd dw-nonfree<br />
git remote add dreamwidth https://github.com/dreamwidth/dw-nonfree<br />
git fetch dreamwidth<br />
git branch --set-upstream develop dreamwidth/develop <br />
git branch --set-upstream master dreamwidth/master<br />
cd ..<br />
<br />
== Database setup ==<br />
<br />
You should have a local MySQL installation and know the root login to the database. To sign into MySQL as root:<br />
<br />
mysql -u root -p <br />
<br />
These MySQL commands wil create your development database:<br />
<br />
create database dw;<br />
grant all on dw.* to 'dw'@'localhost' identified by 'somePassword';<br />
<br />
You might want to pick a more appropriate database username/database name/password.<br />
<br />
While you're here, you probably want to go ahead and create a database for TheSchwartz, too, unless you really know that you won't need it:<br />
<br />
create database dw_schwartz;<br />
grant all on dw_schwartz.* to 'dw'@'localhost' identified by 'somePassword';<br />
<br />
When you're done, exit out of mysql:<br />
<br />
quit;<br />
<br />
== Editing the config files ==<br />
<br />
Next you need to configure the site configuration scripts. This is probably the most tricky part of the whole process, since there are so many things you can tweak. However, you can get by with just tweaking etc/config-local.pl and etc/config-private.pl for now:<br />
<br />
## copy over your config files, and tell them to take priority<br />
## over config files in any of the repos<br />
cd $LJHOME<br />
mkdir -p ext/local/etc<br />
echo "highest" > ext/local/.dir_scope<br />
cp doc/config-local.pl.txt ext/local/etc/config-local.pl<br />
vim ext/local/etc/config-local.pl<br />
<br />
Or use your editor of choice, of course. Do a search for the phrase 'CHANGE THIS' which occurs once, before the block of human readable text you should use to describe your development installation.<br />
<br />
Note that the <var>$IS_DEV_SERVER</var> flag is set to 1 in the template given. Be sure to set this to 0 for a production site, as there are big security issues involved with leaving the flag set to 1. <br />
<br />
Next, you need to change your local variables in the <tt>config-private.pl</tt> file. This is where your passwords are configured, as well as many of the variables which define your domain. Do a search for the phrase 'CHANGETHIS'(note the slightly different spacing). You will want to change at least your <var>$DOMAIN</var> and the <var>%DBINFO</var> structure.<br />
<br />
cd $LJHOME<br />
cp doc/config-private.pl.txt ext/local/etc/config-private.pl<br />
chmod go-rwx ext/local/etc/config-private.pl<br />
vim ext/local/etc/config-private.pl<br />
<br />
In this file, uncomment the lines in the <var>%DBINFO</var> blocks (if they are commented out), and place your database password in quotes on the "pass => ," line, before the comma. For example:<br />
<br />
%DBINFO = (<br />
master => {<br />
pass => 'mypassword',<br />
},<br />
);<br />
<br />
Note that there are two DBINFO blocks; get them both.<br />
<br />
If you created the database for TheSchwartz earlier, you'll also want to configure it:<br />
<br />
# Schwartz DB configuration<br />
@THESCHWARTZ_DBS = (<br />
{<br />
dsn => 'dbi:mysql:dw_schwartz;host=localhost',<br />
user => 'dw',<br />
pass => '', # CHANGETHIS<br />
},<br />
);<br />
<br />
The base configuration file is under source control, and is already in <tt>etc/config.pl</tt>. You should not need to change anything very much in this, but you might have to change some stuff. If you find you do have to touch this, copy it over first, then you can edit it:<br />
<br />
cd $LJHOME<br />
cp etc/config.pl ext/local/etc/config.pl<br />
vim ext/local/etc/config.pl<br />
<br />
<br />
Note that from here on, when any documentation says to edit etc/config*, you'll likely want to edit ext/local/etc/config-* instead.<br />
<br />
== Make sure things are working with checkconfig.pl ==<br />
<br />
Now, you need to see if everything is working. <br />
<br />
If you've setup the files as indicated above, run this command:<br />
<br />
cd $LJHOME<br />
bin/checkconfig.pl --no=ljconfig<br />
<br />
If you installed everything given at the top of this page, you should find you have no missing modules. Congratulations! If you don't have all the modules, this is where you need some systems specific knowledge for your system. You will need to install whatever modules are missing. If you get well and truly stuck, find someone on IRC, the mailing list, or make a post to <dwcomm>dw_dev</dwcomm>.<br />
<br />
== Populate database with initial data ==<br />
<br />
There are a few commands you can now run to install the database. Just run these and watch for errors.<br />
<br />
<b>Note:</b> If make_system.pl says it can't give the system user admin [[privileges]], something has gone wrong with your database population, even if there were no errors.<br />
<br />
$LJHOME/bin/upgrading/update-db.pl -r --innodb<br />
$LJHOME/bin/upgrading/update-db.pl -r --innodb # at least for now we have to run this twice<br />
$LJHOME/bin/upgrading/update-db.pl -r --cluster=all --innodb<br />
$LJHOME/bin/upgrading/update-db.pl -p<br />
<br />
If you created your database for TheSchwartz earlier, you'll also want to populate it with its default tables:<br />
<br />
mysql -u dw -p dw_schwartz < /usr/share/doc/libtheschwartz-perl/schema.sql<br />
<br />
<br />
Create a system account:<br />
<br />
$LJHOME/bin/upgrading/make_system.pl<br />
<br />
(That step will ask you for a password for the [[System account]]. You can change it later by logging in as system, so just give it something for now.)<br />
<br />
And load in the translation strings:<br />
<br />
$LJHOME/bin/upgrading/texttool.pl load<br />
<br />
== Configure Apache ==<br />
<br />
This step will need to be done as the root user. Below is the Apache 2 configuration running on the Dreamwidth staging site. Put this in a file named "stage" in /etc/apache2/conf.d:<br />
<br />
User dw<br />
Group dw<br />
UseCanonicalName off<br />
<br />
StartServers 1<br />
MaxSpareServers 2<br />
MinSpareServers 1<br />
<br />
DocumentRoot /home/dw/htdocs<br />
<br />
PerlSetEnv LJHOME /home/dw/dw<br />
PerlPassEnv LJHOME<br />
<br />
PerlRequire /home/dw/dw/cgi-bin/modperl.pl<br />
<br />
Then disable the default site:<br />
<br />
a2dissite default<br />
<br />
You might also have to enable the Perl Apache Request module:<br />
<br />
a2enmod apreq<br />
<br />
If you don't want this warning:<br />
<br />
[Thu Jan 15 01:46:54 2009] [warn] NameVirtualHost *:80 has no VirtualHosts<br />
... waiting [Thu Jan 15 01:46:55 2009] [warn] NameVirtualHost *:80 has no VirtualHosts<br />
...done.<br />
<br />
Then use <code>vim /etc/apache2/ports.conf</code> and put a # in front of the NameVirtualHost line:<br />
<br />
# NameVirtualHost *:80<br />
<br />
Restart the server:<br />
<br />
/etc/init.d/apache2 restart<br />
<br />
== Now what? ==<br />
<br />
=== Have a look at your new DW instance ===<br />
<br />
Congratulations! You now have a working (though minimal) Dreamwidth install. If you point your web browser at your server, you should see a bare-looking welcome page.<br />
<br />
=== Further setup ===<br />
<br />
There are lots of other articles on setting up and customizing your DW install in the [[:Category: Dreamwidth Installation|DW Installation]] category, including:<br />
<br />
* [[TheSchwartz Setup]] - TheSchwartz is needed for a handful of features - notably comment posting<br />
* [[Subdomain setup]]<br />
* [[Statistics setup]]<br />
* [[Generating documentation]]<br />
* [[Allow users to register]]<br />
* Setting up [[Search]]<br />
<br />
There is a list of wanted how-tos at [[Installation Wanted How-To]], in case you need to add something to the list.<br />
<br />
=== Starting development ===<br />
<br />
If you haven't already, see [[Dev Getting Started]].<br />
<br />
[[Category: Dreamwidth Installation]]</div>Shadowspar//wiki.dreamwidth.net/wiki/index.php/SearchSearch2013-06-28T03:15:59Z<p>Shadowspar: +ln other search pages</p>
<hr />
<div>There are several different kinds of search on Dreamwidth installations. When it comes to test or development environments, they are optional. All of them require further setup in addition to a basic Dreamwidth install. <br />
<br />
== UserSearch ==<br />
<br />
UserSearch searches for users matching certain characteristics. <br />
<br />
Instructions for setup can be found in [[Search/UserSearch]].<br />
<br />
<br />
== Sphinx ==<br />
<br />
Sphinx searches through entries, comments, and more recently, support requests. <br />
<br />
More details and setup instructions can be found in [[Search/Sphinx]].<br />
<br />
<br />
== Other search-related pages ==<br />
<br />
* [[Search Wishlist]]<br />
<br />
[[Category: Search]]</div>Shadowspar//wiki.dreamwidth.net/wiki/index.php/Search_WishlistSearch Wishlist2013-06-28T03:15:08Z<p>Shadowspar: +cat</p>
<hr />
<div>* http://community.livejournal.com/suggestions/883468.html - Improving the Directory search by having it produce a bulleted list of usernames/communities like the Interests search, rather than the current table of userpics with names.<br />
<br />
* http://community.livejournal.com/suggestions/419057.html - Search for users with PGP keys<br />
<br />
* http://community.livejournal.com/suggestions/853529.html - Although there are a number of ways to search, items like the directory search are quite limited and the directory search currently seems to be broken. New ideas: by location, by language, by updated (24h, 3d, 7d, 1mo), by multiple tickyboxed interests (as in "find people who are into [x]bisexuality [x]fanfiction [x]doctor who."<br />
<br />
** More support for 'by location': http://community.livejournal.com/suggestions/785729.html<br />
<br />
* A decent search of journals, such as 'Search for this text in the posts visible to me in these journals in the past n days'. Doubtless hideously resource expensive (so limit to paid members and, possibly, how many searches can be made) but the alternative is downloading large chunks of data and then searching locally.<br />
<br />
* Have interest search display newest or most recently active journals instead of oldest.<br />
<br />
* A search option or some other page than can be used to find all entries and comments you've posted anywhere on DW.<br />
<br />
* On site scheme pages, replace the current search interface of a text box and drop down menu with a single text box, and provide search results for all areas. http://community.livejournal.com/suggestions/781823.html<br />
<br />
* Bring back 'find similar' http://community.livejournal.com/suggestions/788449.html<br />
<br />
[[Category: Wishlists]]<br />
[[Category: Search]]</div>Shadowspar//wiki.dreamwidth.net/wiki/index.php/Search/UserSearchSearch/UserSearch2013-06-28T03:13:02Z<p>Shadowspar: +cat</p>
<hr />
<div> cd $LJHOME/cvs/LJ-UserSearch/<br />
./install-into-ljhome<br />
mkdir $LJHOME/var<br />
$LJHOME/bin/build-usersearch<br />
<br />
Make sure these workers are running:<br />
<br />
* search-constraints<br />
* search-lookup<br />
* search-updater<br />
<br />
Test by going to /directorysearch and searching by interest or circle.<br />
<br />
[[Category: Dreamwidth Installation]]<br />
[[Category: Search]]</div>Shadowspar//wiki.dreamwidth.net/wiki/index.php/SearchSearch2013-06-28T03:12:25Z<p>Shadowspar: new general search page, to index the various searches we have</p>
<hr />
<div>There are several different kinds of search on Dreamwidth installations. When it comes to test or development environments, they are optional. All of them require further setup in addition to a basic Dreamwidth install. <br />
<br />
== UserSearch ==<br />
<br />
UserSearch searches for users matching certain characteristics. <br />
<br />
Instructions for setup can be found in [[Search/UserSearch]].<br />
<br />
<br />
== Sphinx ==<br />
<br />
Sphinx searches through entries, comments, and more recently, support requests. <br />
<br />
More details and setup instructions can be found in [[Search/Sphinx]].<br />
<br />
<br />
[[Category: Search]]</div>Shadowspar//wiki.dreamwidth.net/wiki/index.php/Search/SphinxSearch/Sphinx2013-06-28T03:08:54Z<p>Shadowspar: split out general search info to new Search page</p>
<hr />
<div><br />
Search is available on the [http://dreamwidth.org/search search page]. There are two modes of search: site search, and per-journal search.<br />
<br />
Site search only shows public content. Journal search may contain locked content, following the regular behavior for whether you can see the locked content or not. That is, if you can see it on the journal, then you can find it with search. If you can't see it on the journal, then you won't see it in the search results. There's also an option to search by comments. Only comments made on paid users' journals are indexed for technical reasons (site load).<br />
<br />
<br />
== Setup ==<br />
<br />
This page documents the process you will need to go through to setup the Sphinx search system that Dreamwidth uses. This is not an easy process, and the documentation is probably going to need some iterations to get to a very useful state.<br />
<br />
I only suggest setting up the search system if you have a good amount of time to mess around with things. If you need some help, feel free to grab me (<dw-user>mark</dw-user>) anytime and I'll help out.<br />
<br />
== Software Installation ==<br />
<br />
First, you will need to setup the Sphinx software. Very first, you should make sure you have some packages (Ubuntu Intrepid):<br />
<br />
apt-get install libpath-class-perl libmysqlclient15-dev g++<br />
<br />
The instructions are different depending on your version of Ubuntu, so choose the appropriate version:<br />
<br />
=== Jaunty/9.04 and older ===<br />
<br />
==== Installing File::SearchPath and Sphinx::Search ====<br />
<br />
There are two Perl packages that you will have to download:<br />
<br />
http://search.cpan.org/CPAN/authors/id/T/TJ/TJENNESS/File-SearchPath-0.05.tar.gz<br />
http://search.cpan.org/CPAN/authors/id/J/JJ/JJSCHUTZ/Sphinx-Search-0.12.tar.gz<br />
<br />
Now, you need to build these. They are standard Perl packages which you can build with dh-make-perl. Do File::SearchPath first (and then install it) and then you can build Sphinx::Search (and install it).<br />
<br />
==== Installing the Sphinx package ====<br />
<br />
You will need to download the Sphinx package:<br />
<br />
http://sphinxsearch.com/downloads/sphinx-0.9.8.1.tar.gz<br />
<br />
The Sphinx package itself is a standard project style. Setup and installation looks something like this:<br />
<br />
tar -zxvf sphinx-0.9.8.1.tar.gz<br />
cd sphinx-0.9.8.1/<br />
./configure<br />
make<br />
make install<br />
<br />
=== Karmic/9.10 and newer ===<br />
<br />
==== Installing File::SearchPath and Sphinx::Search ====<br />
<br />
From Ubuntu 9.10 and up, these Perl packages are available in the packaging system. You can install them in one step:<br />
<br />
apt-get install libfile-searchpath-perl libsphinx-search-perl<br />
<br />
==== Installing the Sphinx package ====<br />
<br />
You will need to download the Sphinx package:<br />
<br />
http://sphinxsearch.com/downloads/sphinx-0.9.9.tar.gz<br />
<br />
The Sphinx package itself is a standard project style. Setup and installation looks something like this:<br />
<br />
tar -zxvf sphinx-0.9.9.tar.gz<br />
cd sphinx-0.9.9/<br />
./configure<br />
make<br />
make install<br />
<br />
<br />
It is important that you [http://search.cpan.org/~jjschutz/Sphinx-Search-0.22/lib/Sphinx/Search.pm#VERSION match up the versions] of the Perl packages and the Sphinx package; otherwise, your searches will silently fail due to incompatibilities in the API. (For instance, assuming the proper workers are running, if <tt>"search -q terms"</tt> returns results, while a site search always fails, this is one possible reason.)<br />
<br />
Assuming that all works, you should have everything installed that you need to get the search system setup. Moving on!<br />
<br />
== Configuration ==<br />
<br />
There are several points to configure. Let's start with the configuration of your database.<br />
<br />
=== Database ===<br />
<br />
You will need to create a new database. Something like this process will work:<br />
<br />
CREATE DATABASE dw_sphinx;<br />
GRANT ALL ON dw_sphinx.* TO dw@'localhost' IDENTIFIED BY 'dw';<br />
USE dw_sphinx;<br />
<br />
Now, you have to make a table. Use these CREATE TABLE statements:<br />
<br />
<gist>bbf5bc7a8a814ae1f893</gist><br />
<br />
The table is a pretty straightforward table. It just stores the posts, who they're by, where they're at, and some basic security information. Note that this table has the full uncompressed subject and text of the entries, so it can get rather large.<br />
<br />
=== Site ===<br />
<br />
Configuring your site is next. This involves adding a new section to your %DBINFO hash, like this:<br />
<br />
sphinx => {<br />
host => '127.0.0.1',<br />
port => 3306,<br />
user => 'dw',<br />
pass => 'dw',<br />
dbname => 'dw_sphinx',<br />
role => {<br />
sphinx_search => 1,<br />
},<br />
},<br />
<br />
You also need to add a configuration elsewhere in the file that tells your system where the search daemon will be. Port 3312 is the default:<br />
<br />
# sphinx search daemon<br />
@SPHINX_SEARCHD = ( '127.0.0.1', 3312 );<br />
<br />
That's it for site configuration. Once you have the above two options in, then your site will do all the right things to make the search active. Of course, we still have to configure Sphinx itself...<br />
<br />
=== Sphinx ===<br />
<br />
Left this to last as it's probably the trickiest. The first step is, assuming you're going to be running Sphinx as root (I do), to make the directory it needs:<br />
<br />
mkdir /var/data<br />
<br />
Now, we need to set up the configuration file. By default, sphinx looks for the file <tt>/usr/local/etc/sphinx.conf</tt>. If that's not present on your system, try running "indexer --quiet"; it will fail if it didn't find a config file, but will helpfully tell you where it tried to look.<br />
<br />
<br />
<gist>f50f0604a064db0464ad</gist><br />
<br />
That's right. It's long. But it's actually almost identical to the configuration file that comes with Sphinx. I had to do a lot of tweaking to figure out the right combination of values for UTF-8 support and the like, but the rest is pretty straightforward.<br />
<br />
Make sure to customize `sql_user` and `sql_pass` in the configuration files to match what you used earlier.<br />
<br />
<br />
== Testing ==<br />
<br />
To make sure that your test setup is working, once you have all of the configuration done, try to run the indexer (as root).<br />
<br />
indexer --all<br />
<br />
You should see it spit out some stuff saying it's collecting documents, and if all goes well, you should see files in /var/data. You won't be able to search yet because you haven't placed any data in your search database, but you'll at least have confirmed that you have Sphinx configured properly.<br />
<br />
<br />
== Search Architecture ==<br />
<br />
Making content searchable requires two things:<br />
<br />
* a '''search database'''. The search database contains the text of entries and comments that we want to be searchable. It's separate from the main database. Every time an entry or comment is posted or edited, it needs to be copied from the main database into the search database. The worker that does this is <tt>'''sphinx-copier'''</tt>, which is run by TheSchwartz.<br />
* a '''search index'''. Doing a search on raw text is painfully slow, so Sphinx processes the contents of the search database further -- it creates an index of words, then runs searches against that index instead of the raw text itself. Processing the text this way also makes it possible for a search for "test" to turn up "tests", "testing", etc. The index is created by running a program named, surprisingly enough, <tt>'''indexer'''</tt>. <br />
<br />
Running searches and getting results requires two more:<br />
<br />
* the Sphinx '''search daemon''' -- the program that actually runs searches. This is <tt>'''searchd'''</tt>.<br />
* a '''search worker''', which connects to the Sphinx daemon, feeds it queries, and retrieves the results. This is <tt>'''sphinx-search-gm'''</tt>, a Gearman job.<br />
<br />
<br />
<br />
== Assembling the pieces (test env) ==<br />
<br />
Now, here's how we put all of those pieces together in a test environment.<br />
<br />
* First, we need to have both [[TheSchwartz Setup | TheSchwartz]] and [[Setting up Gearman | Gearman]] set up and working -- <tt>sphinx-copier</tt> depends on the former, and <tt>sphinx-search-gm</tt> on the latter.<br />
* Now, we want to run both of those workers in the foreground so that we can keep an eye on them. In separate terminal sessions, run<br />
bin/worker/sphinx-copier -v<br />
bin/worker/sphinx-search-gm -v<br />
* Next, we need to have the search daemon running -- also in the foreground:<br />
searchd --console<br />
* To get data into the search db, you have two options: <br />
** You can post to some of your paid accounts. Now that <tt>sphinx-copier</tt> is running, it will pick up anything new that you post and schedule it for addition to the search db. <br />
** Alternatively, you can run the manual copier, which will tell <tt>sphinx-copier</tt> about any posts or comments that area already on your site:<br />
bin/schedule-copier-jobs<br />
* ...running that will get your sphinx-copier busy copying data into the dw_sphinx database you made earlier. You can see if it works by watching the output of the sphinx-copier -- it should say something about inserting posts. You can then go to the dw_sphinx database and select from posts_raw to see the data is actually in the system.<br />
* Now that we have data in the search database, we have to index it. On a production site, you'd want to run the indexer every 15 minutes or so; in test, you can just run it before you do a search, if you've added new content since the last run.<br />
indexer --all --rotate<br />
<br />
* Finally, restart searchd. <br />
<br />
You should now be able to search for things from the command line or from your site! To search from the command line, use:<br />
<br />
search -q some words<br />
<br />
<br />
Sphinx is resource-intensive. It's intentionally been made a separate system from the main Dreamwidth site, so that it can be run on a different machine from the webservers in production.<br />
<br />
You don't have to worry too much about load on a development server where you have little data to index and it's only you on the machine. Still, it may make sense to only turn on the search workers when you're testing something search-related.<br />
<br />
<br />
[[Category: Development]][[Category: Dreamwidth Installation]][[Category: Reference]]</div>Shadowspar//wiki.dreamwidth.net/wiki/index.php/Set_up_UserSearchSet up UserSearch2013-06-28T03:08:03Z<p>Shadowspar: Shadowspar moved page Set up UserSearch to Search/UserSearch: consistency re search pages</p>
<hr />
<div>#REDIRECT [[Search/UserSearch]]</div>Shadowspar//wiki.dreamwidth.net/wiki/index.php/Search/UserSearchSearch/UserSearch2013-06-28T03:08:02Z<p>Shadowspar: Shadowspar moved page Set up UserSearch to Search/UserSearch: consistency re search pages</p>
<hr />
<div> cd $LJHOME/cvs/LJ-UserSearch/<br />
./install-into-ljhome<br />
mkdir $LJHOME/var<br />
$LJHOME/bin/build-usersearch<br />
<br />
Make sure these workers are running:<br />
<br />
* search-constraints<br />
* search-lookup<br />
* search-updater<br />
<br />
Test by going to /directorysearch and searching by interest or circle.<br />
<br />
[[Category: Dreamwidth Installation]]</div>Shadowspar//wiki.dreamwidth.net/wiki/index.php/Reference/SearchReference/Search2013-06-28T03:05:45Z<p>Shadowspar: merged into Sphinx/Search, but makes more sense to redir to base Search page</p>
<hr />
<div>#REDIRECT [[Search]]</div>Shadowspar//wiki.dreamwidth.net/wiki/index.php/Setting_Up_SearchSetting Up Search2013-06-28T03:04:37Z<p>Shadowspar: Shadowspar moved page Setting Up Search to Search/Sphinx: This page is almost all about Sphinx...it makes sense to give it its own page, & have Search refer to it amongst other search types.</p>
<hr />
<div>#REDIRECT [[Search/Sphinx]]</div>Shadowspar//wiki.dreamwidth.net/wiki/index.php/Search/SphinxSearch/Sphinx2013-06-28T03:04:36Z<p>Shadowspar: Shadowspar moved page Setting Up Search to Search/Sphinx: This page is almost all about Sphinx...it makes sense to give it its own page, & have Search refer to it amongst other search types.</p>
<hr />
<div><br />
There are two forms of search on Dreamwidth installations: both are optional and require further setup. <br />
<br />
User search searches for users matching certain characteristics. Sphinx searches through entries, comments, and more recently, support requests. <br />
<br />
= User Search =<br />
Not heavily documented, instructions for setup can be found in [[Set_up_UserSearch]]. <br />
<br />
= Sphinx = <br />
<br />
Search is available on the [http://dreamwidth.org/search search page]. There are two modes of search: site search, and per-journal search.<br />
<br />
Site search only shows public content. Journal search may contain locked content, following the regular behavior for whether you can see the locked content or not. That is, if you can see it on the journal, then you can find it with search. If you can't see it on the journal, then you won't see it in the search results. There's also an option to search by comments. Only comments made on paid users' journals are indexed for technical reasons (site load).<br />
<br />
<br />
== Setup ==<br />
<br />
This page documents the process you will need to go through to setup the Sphinx search system that Dreamwidth uses. This is not an easy process, and the documentation is probably going to need some iterations to get to a very useful state.<br />
<br />
I only suggest setting up the search system if you have a good amount of time to mess around with things. If you need some help, feel free to grab me (<dw-user>mark</dw-user>) anytime and I'll help out.<br />
<br />
== Software Installation ==<br />
<br />
First, you will need to setup the Sphinx software. Very first, you should make sure you have some packages (Ubuntu Intrepid):<br />
<br />
apt-get install libpath-class-perl libmysqlclient15-dev g++<br />
<br />
The instructions are different depending on your version of Ubuntu, so choose the appropriate version:<br />
<br />
=== Jaunty/9.04 and older ===<br />
<br />
==== Installing File::SearchPath and Sphinx::Search ====<br />
<br />
There are two Perl packages that you will have to download:<br />
<br />
http://search.cpan.org/CPAN/authors/id/T/TJ/TJENNESS/File-SearchPath-0.05.tar.gz<br />
http://search.cpan.org/CPAN/authors/id/J/JJ/JJSCHUTZ/Sphinx-Search-0.12.tar.gz<br />
<br />
Now, you need to build these. They are standard Perl packages which you can build with dh-make-perl. Do File::SearchPath first (and then install it) and then you can build Sphinx::Search (and install it).<br />
<br />
==== Installing the Sphinx package ====<br />
<br />
You will need to download the Sphinx package:<br />
<br />
http://sphinxsearch.com/downloads/sphinx-0.9.8.1.tar.gz<br />
<br />
The Sphinx package itself is a standard project style. Setup and installation looks something like this:<br />
<br />
tar -zxvf sphinx-0.9.8.1.tar.gz<br />
cd sphinx-0.9.8.1/<br />
./configure<br />
make<br />
make install<br />
<br />
=== Karmic/9.10 and newer ===<br />
<br />
==== Installing File::SearchPath and Sphinx::Search ====<br />
<br />
From Ubuntu 9.10 and up, these Perl packages are available in the packaging system. You can install them in one step:<br />
<br />
apt-get install libfile-searchpath-perl libsphinx-search-perl<br />
<br />
==== Installing the Sphinx package ====<br />
<br />
You will need to download the Sphinx package:<br />
<br />
http://sphinxsearch.com/downloads/sphinx-0.9.9.tar.gz<br />
<br />
The Sphinx package itself is a standard project style. Setup and installation looks something like this:<br />
<br />
tar -zxvf sphinx-0.9.9.tar.gz<br />
cd sphinx-0.9.9/<br />
./configure<br />
make<br />
make install<br />
<br />
<br />
It is important that you [http://search.cpan.org/~jjschutz/Sphinx-Search-0.22/lib/Sphinx/Search.pm#VERSION match up the versions] of the Perl packages and the Sphinx package; otherwise, your searches will silently fail due to incompatibilities in the API. (For instance, assuming the proper workers are running, if <tt>"search -q terms"</tt> returns results, while a site search always fails, this is one possible reason.)<br />
<br />
Assuming that all works, you should have everything installed that you need to get the search system setup. Moving on!<br />
<br />
== Configuration ==<br />
<br />
There are several points to configure. Let's start with the configuration of your database.<br />
<br />
=== Database ===<br />
<br />
You will need to create a new database. Something like this process will work:<br />
<br />
CREATE DATABASE dw_sphinx;<br />
GRANT ALL ON dw_sphinx.* TO dw@'localhost' IDENTIFIED BY 'dw';<br />
USE dw_sphinx;<br />
<br />
Now, you have to make a table. Use these CREATE TABLE statements:<br />
<br />
<gist>bbf5bc7a8a814ae1f893</gist><br />
<br />
The table is a pretty straightforward table. It just stores the posts, who they're by, where they're at, and some basic security information. Note that this table has the full uncompressed subject and text of the entries, so it can get rather large.<br />
<br />
=== Site ===<br />
<br />
Configuring your site is next. This involves adding a new section to your %DBINFO hash, like this:<br />
<br />
sphinx => {<br />
host => '127.0.0.1',<br />
port => 3306,<br />
user => 'dw',<br />
pass => 'dw',<br />
dbname => 'dw_sphinx',<br />
role => {<br />
sphinx_search => 1,<br />
},<br />
},<br />
<br />
You also need to add a configuration elsewhere in the file that tells your system where the search daemon will be. Port 3312 is the default:<br />
<br />
# sphinx search daemon<br />
@SPHINX_SEARCHD = ( '127.0.0.1', 3312 );<br />
<br />
That's it for site configuration. Once you have the above two options in, then your site will do all the right things to make the search active. Of course, we still have to configure Sphinx itself...<br />
<br />
=== Sphinx ===<br />
<br />
Left this to last as it's probably the trickiest. The first step is, assuming you're going to be running Sphinx as root (I do), to make the directory it needs:<br />
<br />
mkdir /var/data<br />
<br />
Now, we need to set up the configuration file. By default, sphinx looks for the file <tt>/usr/local/etc/sphinx.conf</tt>. If that's not present on your system, try running "indexer --quiet"; it will fail if it didn't find a config file, but will helpfully tell you where it tried to look.<br />
<br />
<br />
<gist>f50f0604a064db0464ad</gist><br />
<br />
That's right. It's long. But it's actually almost identical to the configuration file that comes with Sphinx. I had to do a lot of tweaking to figure out the right combination of values for UTF-8 support and the like, but the rest is pretty straightforward.<br />
<br />
Make sure to customize `sql_user` and `sql_pass` in the configuration files to match what you used earlier.<br />
<br />
<br />
== Testing ==<br />
<br />
To make sure that your test setup is working, once you have all of the configuration done, try to run the indexer (as root).<br />
<br />
indexer --all<br />
<br />
You should see it spit out some stuff saying it's collecting documents, and if all goes well, you should see files in /var/data. You won't be able to search yet because you haven't placed any data in your search database, but you'll at least have confirmed that you have Sphinx configured properly.<br />
<br />
<br />
== Search Architecture ==<br />
<br />
Making content searchable requires two things:<br />
<br />
* a '''search database'''. The search database contains the text of entries and comments that we want to be searchable. It's separate from the main database. Every time an entry or comment is posted or edited, it needs to be copied from the main database into the search database. The worker that does this is <tt>'''sphinx-copier'''</tt>, which is run by TheSchwartz.<br />
* a '''search index'''. Doing a search on raw text is painfully slow, so Sphinx processes the contents of the search database further -- it creates an index of words, then runs searches against that index instead of the raw text itself. Processing the text this way also makes it possible for a search for "test" to turn up "tests", "testing", etc. The index is created by running a program named, surprisingly enough, <tt>'''indexer'''</tt>. <br />
<br />
Running searches and getting results requires two more:<br />
<br />
* the Sphinx '''search daemon''' -- the program that actually runs searches. This is <tt>'''searchd'''</tt>.<br />
* a '''search worker''', which connects to the Sphinx daemon, feeds it queries, and retrieves the results. This is <tt>'''sphinx-search-gm'''</tt>, a Gearman job.<br />
<br />
<br />
<br />
== Assembling the pieces (test env) ==<br />
<br />
Now, here's how we put all of those pieces together in a test environment.<br />
<br />
* First, we need to have both [[TheSchwartz Setup | TheSchwartz]] and [[Setting up Gearman | Gearman]] set up and working -- <tt>sphinx-copier</tt> depends on the former, and <tt>sphinx-search-gm</tt> on the latter.<br />
* Now, we want to run both of those workers in the foreground so that we can keep an eye on them. In separate terminal sessions, run<br />
bin/worker/sphinx-copier -v<br />
bin/worker/sphinx-search-gm -v<br />
* Next, we need to have the search daemon running -- also in the foreground:<br />
searchd --console<br />
* To get data into the search db, you have two options: <br />
** You can post to some of your paid accounts. Now that <tt>sphinx-copier</tt> is running, it will pick up anything new that you post and schedule it for addition to the search db. <br />
** Alternatively, you can run the manual copier, which will tell <tt>sphinx-copier</tt> about any posts or comments that area already on your site:<br />
bin/schedule-copier-jobs<br />
* ...running that will get your sphinx-copier busy copying data into the dw_sphinx database you made earlier. You can see if it works by watching the output of the sphinx-copier -- it should say something about inserting posts. You can then go to the dw_sphinx database and select from posts_raw to see the data is actually in the system.<br />
* Now that we have data in the search database, we have to index it. On a production site, you'd want to run the indexer every 15 minutes or so; in test, you can just run it before you do a search, if you've added new content since the last run.<br />
indexer --all --rotate<br />
<br />
* Finally, restart searchd. <br />
<br />
You should now be able to search for things from the command line or from your site! To search from the command line, use:<br />
<br />
search -q some words<br />
<br />
<br />
Sphinx is resource-intensive. It's intentionally been made a separate system from the main Dreamwidth site, so that it can be run on a different machine from the webservers in production.<br />
<br />
You don't have to worry too much about load on a development server where you have little data to index and it's only you on the machine. Still, it may make sense to only turn on the search workers when you're testing something search-related.<br />
<br />
<br />
[[Category: Development]][[Category: Dreamwidth Installation]][[Category: Reference]]</div>Shadowspar//wiki.dreamwidth.net/wiki/index.php/Sphinx_notesSphinx notes2013-06-28T03:02:14Z<p>Shadowspar: redir Search/Sphinx: reorganizing search-related pages</p>
<hr />
<div>#REDIRECT [[Search/Sphinx]]</div>Shadowspar//wiki.dreamwidth.net/wiki/index.php/Search/SphinxSearch/Sphinx2013-06-28T03:00:03Z<p>Shadowspar: overhaul: manually merge Reference/Search, a copy of this page that's diverged from it</p>
<hr />
<div><br />
There are two forms of search on Dreamwidth installations: both are optional and require further setup. <br />
<br />
User search searches for users matching certain characteristics. Sphinx searches through entries, comments, and more recently, support requests. <br />
<br />
= User Search =<br />
Not heavily documented, instructions for setup can be found in [[Set_up_UserSearch]]. <br />
<br />
= Sphinx = <br />
<br />
Search is available on the [http://dreamwidth.org/search search page]. There are two modes of search: site search, and per-journal search.<br />
<br />
Site search only shows public content. Journal search may contain locked content, following the regular behavior for whether you can see the locked content or not. That is, if you can see it on the journal, then you can find it with search. If you can't see it on the journal, then you won't see it in the search results. There's also an option to search by comments. Only comments made on paid users' journals are indexed for technical reasons (site load).<br />
<br />
<br />
== Setup ==<br />
<br />
This page documents the process you will need to go through to setup the Sphinx search system that Dreamwidth uses. This is not an easy process, and the documentation is probably going to need some iterations to get to a very useful state.<br />
<br />
I only suggest setting up the search system if you have a good amount of time to mess around with things. If you need some help, feel free to grab me (<dw-user>mark</dw-user>) anytime and I'll help out.<br />
<br />
== Software Installation ==<br />
<br />
First, you will need to setup the Sphinx software. Very first, you should make sure you have some packages (Ubuntu Intrepid):<br />
<br />
apt-get install libpath-class-perl libmysqlclient15-dev g++<br />
<br />
The instructions are different depending on your version of Ubuntu, so choose the appropriate version:<br />
<br />
=== Jaunty/9.04 and older ===<br />
<br />
==== Installing File::SearchPath and Sphinx::Search ====<br />
<br />
There are two Perl packages that you will have to download:<br />
<br />
http://search.cpan.org/CPAN/authors/id/T/TJ/TJENNESS/File-SearchPath-0.05.tar.gz<br />
http://search.cpan.org/CPAN/authors/id/J/JJ/JJSCHUTZ/Sphinx-Search-0.12.tar.gz<br />
<br />
Now, you need to build these. They are standard Perl packages which you can build with dh-make-perl. Do File::SearchPath first (and then install it) and then you can build Sphinx::Search (and install it).<br />
<br />
==== Installing the Sphinx package ====<br />
<br />
You will need to download the Sphinx package:<br />
<br />
http://sphinxsearch.com/downloads/sphinx-0.9.8.1.tar.gz<br />
<br />
The Sphinx package itself is a standard project style. Setup and installation looks something like this:<br />
<br />
tar -zxvf sphinx-0.9.8.1.tar.gz<br />
cd sphinx-0.9.8.1/<br />
./configure<br />
make<br />
make install<br />
<br />
=== Karmic/9.10 and newer ===<br />
<br />
==== Installing File::SearchPath and Sphinx::Search ====<br />
<br />
From Ubuntu 9.10 and up, these Perl packages are available in the packaging system. You can install them in one step:<br />
<br />
apt-get install libfile-searchpath-perl libsphinx-search-perl<br />
<br />
==== Installing the Sphinx package ====<br />
<br />
You will need to download the Sphinx package:<br />
<br />
http://sphinxsearch.com/downloads/sphinx-0.9.9.tar.gz<br />
<br />
The Sphinx package itself is a standard project style. Setup and installation looks something like this:<br />
<br />
tar -zxvf sphinx-0.9.9.tar.gz<br />
cd sphinx-0.9.9/<br />
./configure<br />
make<br />
make install<br />
<br />
<br />
It is important that you [http://search.cpan.org/~jjschutz/Sphinx-Search-0.22/lib/Sphinx/Search.pm#VERSION match up the versions] of the Perl packages and the Sphinx package; otherwise, your searches will silently fail due to incompatibilities in the API. (For instance, assuming the proper workers are running, if <tt>"search -q terms"</tt> returns results, while a site search always fails, this is one possible reason.)<br />
<br />
Assuming that all works, you should have everything installed that you need to get the search system setup. Moving on!<br />
<br />
== Configuration ==<br />
<br />
There are several points to configure. Let's start with the configuration of your database.<br />
<br />
=== Database ===<br />
<br />
You will need to create a new database. Something like this process will work:<br />
<br />
CREATE DATABASE dw_sphinx;<br />
GRANT ALL ON dw_sphinx.* TO dw@'localhost' IDENTIFIED BY 'dw';<br />
USE dw_sphinx;<br />
<br />
Now, you have to make a table. Use these CREATE TABLE statements:<br />
<br />
<gist>bbf5bc7a8a814ae1f893</gist><br />
<br />
The table is a pretty straightforward table. It just stores the posts, who they're by, where they're at, and some basic security information. Note that this table has the full uncompressed subject and text of the entries, so it can get rather large.<br />
<br />
=== Site ===<br />
<br />
Configuring your site is next. This involves adding a new section to your %DBINFO hash, like this:<br />
<br />
sphinx => {<br />
host => '127.0.0.1',<br />
port => 3306,<br />
user => 'dw',<br />
pass => 'dw',<br />
dbname => 'dw_sphinx',<br />
role => {<br />
sphinx_search => 1,<br />
},<br />
},<br />
<br />
You also need to add a configuration elsewhere in the file that tells your system where the search daemon will be. Port 3312 is the default:<br />
<br />
# sphinx search daemon<br />
@SPHINX_SEARCHD = ( '127.0.0.1', 3312 );<br />
<br />
That's it for site configuration. Once you have the above two options in, then your site will do all the right things to make the search active. Of course, we still have to configure Sphinx itself...<br />
<br />
=== Sphinx ===<br />
<br />
Left this to last as it's probably the trickiest. The first step is, assuming you're going to be running Sphinx as root (I do), to make the directory it needs:<br />
<br />
mkdir /var/data<br />
<br />
Now, we need to set up the configuration file. By default, sphinx looks for the file <tt>/usr/local/etc/sphinx.conf</tt>. If that's not present on your system, try running "indexer --quiet"; it will fail if it didn't find a config file, but will helpfully tell you where it tried to look.<br />
<br />
<br />
<gist>f50f0604a064db0464ad</gist><br />
<br />
That's right. It's long. But it's actually almost identical to the configuration file that comes with Sphinx. I had to do a lot of tweaking to figure out the right combination of values for UTF-8 support and the like, but the rest is pretty straightforward.<br />
<br />
Make sure to customize `sql_user` and `sql_pass` in the configuration files to match what you used earlier.<br />
<br />
<br />
== Testing ==<br />
<br />
To make sure that your test setup is working, once you have all of the configuration done, try to run the indexer (as root).<br />
<br />
indexer --all<br />
<br />
You should see it spit out some stuff saying it's collecting documents, and if all goes well, you should see files in /var/data. You won't be able to search yet because you haven't placed any data in your search database, but you'll at least have confirmed that you have Sphinx configured properly.<br />
<br />
<br />
== Search Architecture ==<br />
<br />
Making content searchable requires two things:<br />
<br />
* a '''search database'''. The search database contains the text of entries and comments that we want to be searchable. It's separate from the main database. Every time an entry or comment is posted or edited, it needs to be copied from the main database into the search database. The worker that does this is <tt>'''sphinx-copier'''</tt>, which is run by TheSchwartz.<br />
* a '''search index'''. Doing a search on raw text is painfully slow, so Sphinx processes the contents of the search database further -- it creates an index of words, then runs searches against that index instead of the raw text itself. Processing the text this way also makes it possible for a search for "test" to turn up "tests", "testing", etc. The index is created by running a program named, surprisingly enough, <tt>'''indexer'''</tt>. <br />
<br />
Running searches and getting results requires two more:<br />
<br />
* the Sphinx '''search daemon''' -- the program that actually runs searches. This is <tt>'''searchd'''</tt>.<br />
* a '''search worker''', which connects to the Sphinx daemon, feeds it queries, and retrieves the results. This is <tt>'''sphinx-search-gm'''</tt>, a Gearman job.<br />
<br />
<br />
<br />
== Assembling the pieces (test env) ==<br />
<br />
Now, here's how we put all of those pieces together in a test environment.<br />
<br />
* First, we need to have both [[TheSchwartz Setup | TheSchwartz]] and [[Setting up Gearman | Gearman]] set up and working -- <tt>sphinx-copier</tt> depends on the former, and <tt>sphinx-search-gm</tt> on the latter.<br />
* Now, we want to run both of those workers in the foreground so that we can keep an eye on them. In separate terminal sessions, run<br />
bin/worker/sphinx-copier -v<br />
bin/worker/sphinx-search-gm -v<br />
* Next, we need to have the search daemon running -- also in the foreground:<br />
searchd --console<br />
* To get data into the search db, you have two options: <br />
** You can post to some of your paid accounts. Now that <tt>sphinx-copier</tt> is running, it will pick up anything new that you post and schedule it for addition to the search db. <br />
** Alternatively, you can run the manual copier, which will tell <tt>sphinx-copier</tt> about any posts or comments that area already on your site:<br />
bin/schedule-copier-jobs<br />
* ...running that will get your sphinx-copier busy copying data into the dw_sphinx database you made earlier. You can see if it works by watching the output of the sphinx-copier -- it should say something about inserting posts. You can then go to the dw_sphinx database and select from posts_raw to see the data is actually in the system.<br />
* Now that we have data in the search database, we have to index it. On a production site, you'd want to run the indexer every 15 minutes or so; in test, you can just run it before you do a search, if you've added new content since the last run.<br />
indexer --all --rotate<br />
<br />
* Finally, restart searchd. <br />
<br />
You should now be able to search for things from the command line or from your site! To search from the command line, use:<br />
<br />
search -q some words<br />
<br />
<br />
Sphinx is resource-intensive. It's intentionally been made a separate system from the main Dreamwidth site, so that it can be run on a different machine from the webservers in production.<br />
<br />
You don't have to worry too much about load on a development server where you have little data to index and it's only you on the machine. Still, it may make sense to only turn on the search workers when you're testing something search-related.<br />
<br />
<br />
[[Category: Development]][[Category: Dreamwidth Installation]][[Category: Reference]]</div>Shadowspar//wiki.dreamwidth.net/wiki/index.php/Common_JargonCommon Jargon2013-06-27T02:19:31Z<p>Shadowspar: /* Technical */ +i18n => internationalization</p>
<hr />
<div>The Dreamwidth project has some jargon in common use that may not be familiar to the general public. While these are not official terms that you should know, or necessarily Dreamwidth-specific, general explanations or definitions may be helpful. <br />
<br />
=[[Dreamwidth-Specific Jargon]]=<br />
{{:Dreamwidth-Specific Jargon}}<br />
<br />
=Words and Phrases= <br />
; accessible, accessibility, a11y: Making things (websites, buildings, et cetera) able to be not only accessed but usefully and fully used by anyone, including but not limited to people in wheelchairs, people with other mobility impairments, people with visual impairments, people with hearing impairments, people with cognitive impairments, text-only browser users, screenreader-only users, keyboard-only users, custom keyboard users, pointing-device-only users, and more. The goal here is to make Dreamwidth as accessible as possible. Developers are encouraged to check out <dwcomm>dw_accessibility</dwcomm> and the [[Accessibility Wishlist]]. <dwcomm>accessibility_fail</dwcomm> is when people do accessibility wrong (or don't do it at all). <br />
: a11y is a Twitter-friendly abbreviation for 'accessibility': a + 11 letters (ccessibilit) + y. History of this mode of abbreviation: http://www.i18nguy.com/origini18n.html<br />
<br />
; anon-fail: Someone who intended to comment anonymously accidentally leaving the comment while fully identified, in a way that revealed their identity to anyone who happened to be watching (or subscribed to email notifications) before the comment was deleted. Usually said in relation to an ongoing anonymous discussion, especially in anonymemes. <br />
<br />
; anonmeme, anonymeme, anonymous meme: a discussion or game where all participants are meant to be anonymous. These are often associated with an uncensored, anything-goes attitude, and can be very high-volume. <br />
<br />
; backscroll, scrollback, scrool: Things that happened in IRC while someone was connected but not actively watching, often in the context of "What are you guys on about? BRB, reading backscroll." (Common to many IRC/chat forums, not just DW's.) <br />
<br />
; "bake you cookies and write you porn": The helpful response of a tight-knit (usually fannish) internet community when one of their number is going through a rough patch. <br />
<br />
; baleet, bahleet: emphatic/silly form of 'delete'. <br />
: delete + ban<br />
<br />
; bandom: fandom (usually fic-writing/reading fandom) of various bands. http://zen.transformativeworks.org/wiki/Bandom_%28Music_Source_Text%29<br />
<br />
; banninate: verb. Emphatic/silly form of 'ban'. <br />
<br />
; bingo: [http://en.wikipedia.org/wiki/Bingo_(U.S.) the game]. <br />
: A way of organizing the perennial invalid arguments/distraction tactics that come up against a divisive topic (particularly an anti-oppression topic), by collecting all the usual arguments and tactics and arranging them on a bingo card. See: [http://infotrope.net/blog/2009/06/16/the-porny-presentation-bingo-card/ porny presentation bingo], [http://bootshatesthat.blogspot.com/2009/01/racism-bingo.html racism bingo], [http://viv.id.au/blog/20070414.431/anti-feminist-bingo-a-master-class-in-sexual-entitlement/ anti-feminist bingo]. <br />
: "We have bingo": said when any given anti-oppression discussion or commenter to a particular anti-oppression discussion has trotted out a sufficient number of the listed problematic statements. <br />
<br />
; brainweasels: Nefarious little critters made of fear, doubt, and self-hatred that dwell in your head. The anthropomorphised (mustelidamorphised?) representation of inwardly-directed negative thoughts. Not to be confused with the common domestic ferret, who are cute little house-weasels and a comfort rather than a source of dread. <br />
<br />
; B.S. Johnson: The [http://wiki.lspace.org/wiki/Bergholt_Stuttley_Johnson Discworld Character], infamous inventor. Known to include steam power in some of his "works". <br />
<br />
; cake: Gratuitous references to cake are often references to the "cake" motif in Portal, including the Jonathan Coulton song, [http://en.wikipedia.org/wiki/Still_Alive "Still Alive"] ([http://www.youtube.com/watch?v=RthZgszykLs video]), that plays during the credits, although they may also refer to the meme "It is delicious cake. You must eat it." (from [http://en.wikipedia.org/wiki/4chan#.2Fb.2F /b/]), or even [http://en.wikipedia.org/wiki/MacArthur_Park_(song) "MacArthur Park"]. However, gratuitous references to cake are sometimes merely referring to actual cake; one must not discount cake's innate tastiness.<br />
<br />
; cat macros: Images of cats with funny captions. Sometimes used as a form of protest and/or mockery. Also referred to as LOLcats. (From the internet.) See [http://icanhascheezburger.com/ I Can Has Cheezburger]. <br />
<br />
; "clean all the things"/"clean ALL the things?": Most often a reference to [http://hyperboleandahalf.blogspot.com/2010/06/this-is-why-ill-never-be-adult.html Hyperbole and a Half: This is Why I'll Never be an Adult]. Snowcloned as "X 'all' the Y?" <br />
: Things using the "X 'all' the Y?" snowclone could also be a reference to the older [http://iownthepeas.ytmnd.com/ "I have ALL teh peas!!!" (has audio)]<br />
<br />
; Danga Interactive: The original company founded by <ljuser>bradfitz</ljuser> to manage LiveJournal. <br />
<br />
; darkroom: a game where people "enter the darkroom" and allow others to interact with them. Often sexually explicit and/or kinky. Anonymity is often allowed or encouraged. Not to be confused with a kinkmeme. <br />
<br />
; derailing: The conscious or unconscious process of destroying and confusing a conversation about productive but uncomfortable topics. [http://www.derailingfordummies.com/ Derailing for Dummies]<br />
<br />
; Dunning-Kruger effect: People who are sufficiently unskilled in a particular area lack knowledge of the benchmarks of that skill area, and perhaps the cognitive tools, to tell how bad they are, and will falsely estimate themselves at a far higher level of skill than they actually possess. (People at a high level of skill who assess their skills too low will often recalibrate their self-assessment upon seeing the actual performance of others.) [http://en.wikipedia.org/wiki/Dunning%E2%80%93Kruger_effect Dunning-Kruger Effect on Wikipedia], [http://www.roughtheory.org/content/wearing-the-juice-a-case-study-in-research-implosion/ Rough Theory: "Wearing the Juice: a case study in research implosion" (#surveyfail)]<br />
<br />
; earworm: [http://en.wikipedia.org/wiki/Earworm a song that gets stuck in your head]. See <dwcomm>earworm</dwcomm> and <dwcomm>earwormhole</dwcomm>. <br />
<br />
; Ehlers-Danlos Syndrome, EDS: A group of inherited connective tissue disorders. Also, why people in IRC tend not to freak out too badly when Rahaeli announces she's got another dislocated joint again. [http://www.mayoclinic.com/health/ehlers-danlos-syndrome/DS00706 Mayo Clinic.] [http://en.wikipedia.org/wiki/Ehlers-Danlos_syndrome Wikipedia.] <br />
<br />
; ENOPARSE: Modeled after [http://en.wikipedia.org/wiki/Errno.h the standard C error library] but [http://mailman.nginx.org/pipermail/nginx/2011-August/028358.html not actually present in it], this error code expands to "Error: Not Parsed" (or "Sorry, I didn't understand that.") <br />
<br />
; fandom: A general term for a community of people who are fans of things, such as "sports fandom", or "Star Trek fandom". When used without qualification, it often (but not always) refers to Western science fiction and fantasy book and media fandom, or a certain subset of same. <br />
<br />
; fandom_wank, f_w: fandom_wank is an internet community, currently hosted on JournalFen.net, that collects and discusses reports of "wank" in the greater fandom community. "Wank" includes social trainwrecks and more, and the discussion allows anonymous commenting. Caveat lector: this community discusses social catastrophes anonymously, with a viewpoint valuing maximum humor/popcorn factor. <br />
<br />
; fisting: A sexual practice that gets mentioned a lot in IRC. [http://public.diversity.org.uk/deviant/fsfist.htm Probably more information on it than you wanted.] (Inherited habit from LJ Support IRC. <ljuser>burr86</ljuser> may be to blame.) <br />
<br />
; frog: the "rip-it, rip-it" fashion of un-knitting, or un-crocheting too for that matter. <br />
<br />
; game, the: [http://www.losethegame.com/main.htm The only winning move is not to play.] If you click the link, you may start playing. [http://xkcd.com/391/ But not to worry!]<br />
<br />
; gender binary: the concept that all humans neatly fit into biological male or female, or into social masculine and feminine. This is untrue first because of genetic or developmental conditions that do not fit neatly into male or female, second because not everyone identifies with social masculine or feminine (or the standard that a person picks one and only one), and third because some people's sex as assigned at birth does not match the societal gender presentation they identify most with. (From LGBTQ~ activism. See [http://en.wikipedia.org/wiki/Gender Gender on Wikipedia].) <br />
<br />
; Glitch: This game existed until 2012. From the website: "Glitch is a massively multi-player game built in the spirit of the web." http://www.glitch.com/ Has a lot of Kingdom of Loathing references. People talking cooking with ... really unusual recipes ... in IRC are sometimes playing Glitch. <br />
<br />
; headologist: Discworld slang for their equivalent of a mental health professional. <br />
<br />
; hit points: A means of measuring someone's ability to withstand damage/attack or perform tasks. Notional "hit points" can be regained readily/predictably by a generally-able-bodied/mentally healthy person. Contrast 'spoons'. (By analogy from [http://en.wikipedia.org/wiki/Health_(gaming) hit points in gaming].) <br />
<br />
; hivemind: Sharing the same brain or thoughts, usually expressed by saying the same thing at the same time. Commonly caused by spending too much time in IRC. ([http://en.wikipedia.org/wiki/Hive_mind General term], popularized in IRC. See also: bees.) <br />
<br />
; "I love everyone in this bar", references to "this bar" & everybody in it: [http://tvtropes.org/pmwiki/pmwiki.php/YMMV/HowImetyourmother TVtropes seems to indicate that this originated from How I Met Your Mother], in [http://www.imdb.com/title/tt0606115/ 2005's "The Pineapple Incident]. It has since come unmoored from its origins and spread all across tumblr and half the internet, and is used to declare (often platonic, sometimes not) adoration for everyone in the general vicinity, regardless of whether it's a bar, a comment thread, or the entire IRC channel. <br />
: MissKat may have been responsible for bringing the phrase off Tumblr and into IRC via YAPC:NA '13. <br />
<br />
; Ia! Ia!: The thing you say when summoning one of the [http://en.wikipedia.org/wiki/Cthulhu_Mythos Great Old Ones]. (In his house at Ry'leh Great Cthulhu lies dreaming, unless it's been summoned on irc again.) Also sometimes seen as "Ia! Ia! Cthulhu fth'agn!"<br />
<br />
; Impostor Syndrome: A spurious sense of incompetence in one's chosen field. [http://xkcd.com/616/ Or even at adulthood, perhaps.] [http://en.wikipedia.org/wiki/Impostor_syndrome Impostor Syndrome on Wikipedia, mostly useful for the references]. (Based on the Dunning-Kruger effect, looking at the actual performance of others may be helpful, though the publicly available information about others in that field may not include all of their missteps and self-doubt.) <br />
<br />
; intersectionality: The concept that a person in a disadvantaged situation is likely to have more than one factor contributing, and the factors involved are likely to compound the bad situation. For example, a person who cannot afford the power chair that would allow them to take a job outside of the home; a woman of color who is hesitant to report a sexist co-worker to a racist boss; a jobless gay man with no savings who cannot get assistance from government, family, or church. [http://en.wikipedia.org/wiki/Intersectionality Intersectionality on Wikipedia]<br />
<br />
; Kaycee-Nicole: a [http://en.wikipedia.org/wiki/Kaycee_Nicole notable internet hoax] involving illness and death. <br />
<br />
; (the) keys are right next to each other, keys are right etc.: A joke made about typos, generally under one of the following conditions:<br />
:1) The keys are, in fact, literally right next to each other on that keyboard layout. (Uncommon.)<br />
: 2) Browser/phone/other interface autocomplete/autocorrect, or finger/other input autocomplete; so used to typing something that it comes out in situations where it's not entirely appropriate. <br />
: 3) Something completely weird and out of context with absolutely no reason for it to happen, such as <ljuser>bubba</ljuser> typing "emily" instead of "wireless" (and knowing no-one named Emily at the time): "My emily isn't working." <br />
: (Inherited from [http://qdb.unmutuals.com/view.cgi/support/320 LJ Support IRC]; may originate from [http://bash.org/?5300 bash.org].) <br />
<br />
; kinkmeme: an often-anonymous, often sexually explicit, fanfiction prompting game. Usually the game defines the fandom that the game is set in and ground rules. People leave prompts naming character(s) and themes or plot points (originally, specific kinks), and other people post "fills", usually in the form of short fiction that contains the specified character(s) and prompt(s). Not to be confused with a darkroom. <br />
<br />
; lumberjack; gone off to be a lumberjack: quit working or disappeared, often in a flagrantly notable way. Errant servers are often said to have gone off to become a lumberjack. References the [http://en.wikipedia.org/wiki/The_Lumberjack_Song Monty Python Lumberjack song]. (An ordinary man with a boring job declares his ambition to be a lumberjack in the middle of a broadcast, with backup singers; the sketch ends with confusion from the singers when the would-be lumberjack's number makes reference to his ambition to cross-dress.) <br />
<br />
; memetic prophylactic recommended, mpr: A warning that the content at the other end of the link, while entirely possibly free from any of the sexual, strong language, scatological, and/or violent properties that might warrant a standard NSFW warning, may in fact contain the sort of "PEOPLE ARE WRONG ON THE INTERNET" reaction that may cause various rage, disgust, and the need to place one's brain in a wrongheadedness-proof condom to keep all the <em>ew</em> out. Coined by collaboration between <ljuser>james_nicoll</ljuser> and his commenters: [http://james-nicoll.livejournal.com/1678912.html James Needs a New Tag], [http://james-nicoll.livejournal.com/1684116.html 'the new warning label will be "memetic condom recommended"'], [http://james-nicoll.livejournal.com/1684116.html?thread=27922068#t27922068 metahacker suggests the final form]. [http://james-nicoll.livejournal.com/1689567.html First use.]<br />
<br />
; Minecraft: "Minecraft is a game about placing blocks to build anything you can imagine. At night monsters come out, make sure to build a shelter before that happens." [http://minecraft.net Description from Minecraft's official website.] (Sort of like multiplayer Lego with optional exploding zombies.) If people in IRC are talking about grand construction and/or landscaping projects, it might be this. <br />
: The community for the DW IRC Minecraft server (moderated) is <dwcomm>minecraft_irc</dwcomm>. <br />
<br />
; mouse, mice: An anonymous user or users. (A-nonny-mouse.) <br />
<br />
; nipplegate: A controversial LiveJournal event involving exposed nipples in default userpics. (From LiveJournal.) This is not the Open Source Boob Project. <br />
<br />
; Open Source Boob Project: Charitably put, a convention social experiment that rather notably did not scale well when proposed to be taken outside of the environment at that particular convention with those particular people. This is not nipplegate. [http://geekfeminism.wikia.com/wiki/Open_Source_Boob_Project On the Geek Feminism wiki]<br />
<br />
; pantsless website: when a website appears without its stylesheets, due to high load or other technical errors. This often appears as a white page showing only the main content text and images, missing all of the expected backgrounds and navigation links. Originated from nanowrimo.org load problems. <br />
<br />
; pastede on yey: very obviously an image manipulation, or some feature that has been very obviously added after the fact and in a particularly horrible way. (From a [http://www.journalfen.net/community/fwgreatesthits/4064.html fandom_wank] disaster wherein someone tried to claim an actor was her boyfriend with a "my hed iz pastede on yey" photo.) <br />
<br />
; ping: To briefly contact someone, generally on their preferred form of short-form contact. This is usually to get their attention prior to longer discussion, or to bring a matter that needs their attention to their attention. [http://www.catb.org/~esr/jargon/html/P/ping.html In general use in technical circles; this is definition 3 from the Jargon File.] <br />
:<dwuser>mark</dwuser> has a highlight set up for 'xb95' in IRC. <dwuser>denise</dwuser> prefers AIM, and tends to run silent (invisible status). [http://dw-lounge.dreamwidth.org/tag/contact+information Department head contact information viewable to other department heads.]<br />
:It can be helpful to quickly describe the reason for contact, for example, "Hi, one of your developers might be on fire; is this a good time to converse about fire safety measures and flame-retardant jackets?" has more detail than "Hi, can I ask you something?" The answers to "Do you have time for a social chat right now?" and "Do you have time for a technical chat on this subject?" may also be different, especially depending on whether someone is off-duty or on-duty at that time. <br />
<br />
; privilege: 1) An advantage or suite of advantages that most members of a non-minority class have as compared to most members of a minority class, often taken for granted by people who have this advantage. Sometimes the advantage takes the simple form of "lack of $DISADVANTAGE". (A term of art from minority rights activism. [http://blog.shrub.com/archives/tekanji/2006-03-08_146 More])<br />
:2) Special access to administrative functions of the Dreamwidth site. See [[Common_Jargon#Technical|Technical]]. (Inherited from LiveJournal's terminology for the same special access.) <br />
<br />
; pumpkin time: The time after which one will turn into a pumpkin. Generally a departure time or a bedtime. (Used in IRC, a reference to the Cinderella story.) <br />
<br />
; rabbit hole: a reference to Alice in Wonderland. Often used to describe discussions that may very quickly result in headaches for all involved. (could probably use some more expansion.)<br />
<br />
; Razz: [http://en.wikipedia.org/wiki/Razz_(poker) A variant of poker.] According to Rah, "Razz is the reason why poker players drink." <s>Rah plays Razz too often.</s> rah no longer plays Razz too often because the DOJ shut down her online poker site :(<br />
<br />
; red cape: 1) [http://xkcd.com/239/ Cory Doctorow is said to wear a red cape and goggles and blog from a high-altitude balloon.] [http://en.wikipedia.org/wiki/Cory_Doctorow#In_popular_culture Really.]<br />
: 2) The Dreamwidth official staff account user-head icon is a version of the regular user-head icon, with a red swirl, as of the swirl in the Dreamwidth stylized 'd', wrapped around it. This swirl has been referred to as the "red cape". <br />
<br />
; September, Eternal September: The (constant) influx of people unfamiliar with Usenet/internet basic netiquette, or unfamiliar with the local community's standards for conduct that differ from the internet at large. ([http://catb.org/jargon/html/S/September-that-never-ended.html The Jargon File], [http://en.wikipedia.org/wiki/Eternal_September Wikipedia])<br />
<br />
; scary devil monastery: alt.sysadmin.recovery, the Usenet group<br />
<br />
; slash: Fanfiction involving same-sex attraction, sex, or romance. The most restrictive definition would apply this only to sex/romance between two men who are straight or unspecificed in the source text. N00bs sometimes use it to refer to any sexually explicit fanfiction. (From the fanfictiony parts of fandom.) [http://fanlore.org/wiki/Slash Slash on Fanlore]<br />
<br />
; snowflake, special snowflake: Someone who demands special treatment based on their unique circumstances, particularly when their circumstances are not unique, or when they believe themselves to be in an extreme circumstance and are unaware that others have surpassed their record. [http://www.urbandictionary.com/define.php?term=special%20snowflake Urban Dictionary definition]<br />
<br />
; Spectacular Love (in pill form): from some spam in Peterstein (the private support category). Kat was tired.<br />
<br />
; spice: "I think so, Brain, but if the plural of mouse is mice, wouldn't the plural of spouse be spice?" From a [http://en.wikipedia.org/wiki/Pinky_and_the_Brain Pinky and the Brain] segment. (In common use in the polyamory community.) <br />
<br />
; spoons: Finite physical/mental/emotional resources, at a level significantly below average ability levels, to handle daily tasks. More: [http://echan.dreamwidth.org/1086.html WTF Spoons]. (From disability advocacy; term originated from an article on [http://www.butyoudontlooksick.com/articles/written-by-christine/the-spoon-theory-written-by-christine-miserandino/ But You Don't Look Sick?].) Compare 'hit points'. <br />
<br />
; strikethrough: A controversial LiveJournal event, involving the mass-suspension of a number of accounts, and the later unsuspension of most of them. (From LiveJournal.) <br />
<br />
; Tango Maureen and RENT, references to: The musical [http://en.wikipedia.org/wiki/Rent_(musical) RENT] contains a character named Mark. The song [http://www.stlyrics.com/lyrics/rent/rent.htm RENT] has the lines "The digital delay --- Didn't blow up (exactly); There may have been one teeny tiny spark-- YOU'RE NOT CALLING MARK!" and [http://www.stlyrics.com/lyrics/rent/tangomaureen.htm Tango Maureen] is the saga of Mark patching Maureen's broken equipment with Joanne. <br />
: Because <dwuser>mark</dwuser> is the person who usually gets paged when Dreamwidth blows up, this can sometimes result in IRC musical adventures. <br />
: Note: Twitter user [http://twitter.com/maureenjohnson @maureenjohnson] exists, but belongs to the YA author Maureen Johnson, not any incarnation of the RENT character Maureen Johnson (nor the Heinlein character Maureen Johnson). <br />
<br />
; trigger, trigger warning, tw: A [http://en.wikipedia.org/wiki/Trauma_trigger trauma trigger] is an environmental stimulus that awakens the involuntary playback of memories of a traumatic event. This process is highly unpleasant. <br />
: A [http://en.wikipedia.org/wiki/Seizure_trigger seizure trigger] can cause seizures; of particular concern on the internet is [http://en.wikipedia.org/wiki/Photosensitive_epilepsy photosensitive epilepsy]. <br />
: A [http://en.wikipedia.org/wiki/Migraine migraine] trigger. <br />
: Some subcultures, particularly ones with a high percentage of people who have experienced trauma, have seizure disorders or migraines, habitually label content that contains common trauma, seizure, or migraine triggers. These labels are known as "trigger warnings"; this is sometimes abbreviated "tw". Sometimes this sort of content, and other content (that may include individual triggers possessed by members of the expected audience), is descriptively labeled with the intent to aid people who appreciate trigger warnings, although the phrasing "trigger warning" is not present. <br />
: Some common triggers include: graphic description of abuse, violence, or rape; detailed descriptions of medical or dental procedures; detailed descriptions of self-harm behaviors, depressive thinking patterns, or disordered eating; sudden loud noises; and rapid blinking (including rapid changing in light levels or rapid changing of colors). Some of these triggers are unpleasant even for people who do not have traumatic memories that result in flashbacks. <br />
<br />
; wank: Aside from the obvious slang term, this also means any number of social upsets, generally of the sort that generate gossip and upsetness perhaps out of proportion with the actual problem. ("Did you hear about what Bit did to Figment?" "Yeah, talk about wank!") <br />
<br />
; wheelchair user: This is one of the preferred (by people who use wheelchairs) ways for their use to be described. "Confined to a wheelchair" is vastly inappropriate in many if not most cases, even if the person in question must exclusively use the wheelchair for even minor mobility; it would probably only be appropriate if the person in question felt their use of the wheelchair to be confining. See among other things [http://ysobel.dreamwidth.org/301593.html a general rant] from <dwuser>ysobel</dwuser>. In general when a long-term wheelchair user is confronted with stairs and other inaccessible architecture, the architect/designer gets the blame for not making the location adequately accessible, rather than the wheelchair taking the blame for not being able to traverse the stairs. <br />
<br />
; "wrong on the internet": A reference to [http://xkcd.com/386/ XKCD: Duty Calls]. <br />
<br />
; zilch: An addictive dice-rolling game, with a computer that cheats. Can be found in [[IRC]], in #dreamwidth-games. (If you want to start a game, try recruiting players in #dreamwidth.) For all mentions of Zilch, developers take 6d6 hit to productivity.<br />
<br />
=Abbreviations=<br />
== Common Abbreviations ==<br />
Abbreviations, acronyms, initialisms, and other fun shorthand. Some is internet-wide, some is specific to certain communities, and some is Danga-descended and Dreamwidth-specific. <br />
<br />
; afaik: As Far As I Know<br />
<br />
; afk: Away From Keyboard<br />
<br />
; AO3, AOOO: [http://archiveofourown.org/ Archive of Our Own], a project of the [http://transformativeworks.org/ Organization for Transformative Works], the other known majority-female Free Open Source Software project besides Dreamwidth. <br />
<br />
; BBB: Support shorthand for the Big Blue Box, also known as the Known Issues box. It can be found on the left-hand side of the [http://www.dreamwidth.org/support/ main DW Support page]. Inherited from LiveJournal Support. Anyone calling it the BYB (Big Yellow Box) is stuck in the early 2000s. <br />
<br />
; bk: back. Returned from whatever AFK state. <br />
<br />
; BML: See [[#Technical]]. <br />
<br />
; BNF: Big Name Fan. All the conflicting definitions seem to boil down to "a fan who is (very) famous within fandom". (From Western science fiction/fantasy book & media fandom.) More on [http://fanlore.org/wiki/BNF BNF on Fanlore]. <br />
<br />
; BPA: Blinkie Ponie Armie, a gaming guild composed mostly of former and current LiveJournal volunteers. (Crosses over with some current Dreamwidth volunteers.) <br />
<br />
; DMCA: [http://en.wikipedia.org/wiki/Digital_Millennium_Copyright_Act Digital Millennium Copyright Act], which is less fun than [http://en.wikipedia.org/wiki/Y.M.C.A._%28song%29 YMCA, which at least has a fun song]. (It's harder to make a D with your arms and then get them back over your head for the M.) <br />
<br />
; FFF: In the context of IRC, usually Fey (<dwuser>foxfirefey</dwuser>), rather than the [http://www.urbandictionary.com/define.php?term=FFFFFFFFFFFFFFFFF similar emphatic minced oath], which can repeat the letter any number of times, usually from three on up. <br />
<br />
; ffs: For Fuck's Sake<br />
<br />
; GSoC: Google Summer of Code. [http://code.google.com/soc/ Official GSoC site]; Dreamwidth wiki orientation page: [[Summer of Code]]; Dreamwidth participated in 2010. <br />
<br />
; iawtc: I Agree With This Comment<br />
<br />
; idk: I Don't Know. Sometimes followed by [http://www.youtube.com/watch?v=4nIUcRJX9-o "my bff jill?" in reference to a TV commercial] that aired in the US at one point.<br />
<br />
; iirc: If I Recall Correctly<br />
<br />
; ikr, inorite: I know, right? Often said by members of the Support Triumvirate when expressing agreement.<br />
<br />
; imo, imho, imao: In My Opinion, In My Humble Opinion, In My Arrogant (or other suitable A-word) Opinion<br />
<br />
; iydmma: If You Don't Mind My Asking<br />
<br />
; LYS: Local Yarn Store/Shop. Fiber arts geekery. Usually not a national/international chain, and with more Very Nice Yarn than mega-chains are apt to have. That place where you go and come out reeling with a surprisingly large set of bags and a corresponding chunk taken out of the entertainment budget. (Or, come out with nothing at all, lest the budget be blown entirely.) <br />
<br />
; NSFW/NWS: Not Safe For Work / Not Work-Safe. Content that the average boss/mother-in-law might not appreciate. NSFW is a moving target that varies by the person and/or organization defining it, but some common likely categories are: <br />
* Sex/smut/porn<br />
* Nudity<br />
* Strong language/profanity<br />
* Scatological/gross humor<br />
:You can mark an entry as NSFW by setting the Age Restriction to Viewer Discretion Advised, and get warned about NSFW entries [http://www.dreamwidth.org/manage/settings/?cat=display by setting your Viewing Adult Content setting to Content Should Be Viewed with Discretion]. [http://www.dreamwidth.org/support/faqbrowse?faqid=147 FAQ] (From the internet.) <br />
<br />
; ofc: of course <br />
<br />
; OP: Original Poster. Usually the author of the entry or the originator of a comment thread; used in long comment threads. From message board slang. <br />
<br />
; OTW: Rather than Off The Wall or On The Way, this is likely to mean the [http://transformativeworks.org/ Organization for Transformative Works] when used in the context of Dreamwidth. They make the [http://archiveofourown.org/ Archive of Our Own]. <br />
:While the OTW's logo, a red arrow bent into a capital O, pointing counter-clockwise, enclosed in a red circle, can at a casual glance and small resolutions be confused with the simplified version of Dreamwidth's logo (a red line spiraling counterclockwise inward), the organizations are separate, with separate operations and leadership. There is some incidental overlap between OTW and Dreamwidth developers and technical support. <br />
<br />
; PC: In the context of comment threads, this is usually Parent Commenter rather than Personal Computer or Politically Correct. From message board slang. <br />
<br />
; ph: Phone. Away from keyboard on account of phone call. <br />
<br />
; PWD: Rather than an abbreviation for "password", People with Disabilities. From disability advocacy. <br />
<br />
; PWP: A type of fanfiction. Originally, this stood for "Plot? What Plot?", used of short mood pieces, smut without any attempt at a framing plot, or short action sequences without lead-in or resolution. As it is largely used for context-free smut, some readers have back-formed the initialism to stand for "Porn Without Plot". <br />
<br />
; RFC: Request For Comment. See Technical for more information. <br />
<br />
; RTE: Rich Text Editor. See Technical for more information. <br />
<br />
; SPN: the TV show [http://www.supernaturalwiki.com/index.php?title=Main_Page Supernatural]. <br />
<br />
; TAB: Temporarily Able-Bodied: someone who is currently without physical disablity. From disability advocacy. <br />
<br />
; til: Today I Learned<br />
<br />
; tl;dr, tl,dr: Too Long, Didn't Read. Usually said as either a joke or an insult. Sometimes "written out" or pronounced as Teal Deer.<br />
<br />
; TT: Template Toolkit. See Technical for more information. <br />
<br />
; ttants: Things That Are Not The Same. Two or more things that were generally recently mistaken for each other by the person who just said that, usually of similar spelling but wildly dissimilar meaning, often hilarious and/or wrong if one is substituted for the other. <br />
<br />
; UGT: Universal Greeting Time. http://www.total-knowledge.com/~ilya/mips/ugt.html Why "Good morning!" upon entering an IRC channel, regardless of anyone's local time, is a thing. <br />
<br />
; UTC: Co-ordinated Universal Time. The world standard baseline time, and generally server time as well. http://wwp.greenwichmeantime.com/info/utc.htm<br />
<br />
; WIP: Work-In-Progress. Often said of a piece of fanfiction that is still being written (especially a piece of fanfiction that is being posted serially as it is being written), but also applies to other projects. <br />
<br />
; wtf: Often "What the Fuck"; on Dreamwidth, also "Watch-Trust-Friend"; see Technical <br />
<br />
; WYSIWYG: What You See Is What You Get. <br />
<br />
; WYSINWYG, WYSI...: What You See Is Not What You Get, and other joke initialisms at the expense of the Rich Text Editor. What You See Has No Relation To What You Get. What You See Is Only Sometimes What You Get. What You See Just Ate What You Got. And so forth. <br />
<br />
; ymmv: Your Mileage May Vary; this is my experience or general experience, but yours may be different. ("your mileage may vary" is a disclaimer from auto commercials)<br />
<br />
== Other Resources ==<br />
very large [http://www.webopedia.com/quick_ref/textmessageabbreviations.asp Webopedia list of abbreviations]<br />
<br />
also very large [http://www.netlingo.com/acronyms.php Netlingo list of abbreviations]<br />
<br />
[http://www.abbreviations.com/acronyms/CHAT Abbreviations.com list of abbreviations]<br />
<br />
[http://www.gaarde.org/acronyms/ gaarde.org list of internet acronyms and initialisms]<br />
<br />
=Technical= <br />
<br />
; Beta: Contrary to the precedent set by things like Gmail, "beta" actually means "we expect that stuff is going to be broken, that's why it's not out of beta yet". (From geek jargon.) (OMG, Gmail is out of beta now!! WHAT IS THE WORLD COMING TO!?) ....Annnd Dreamwidth is out of beta as of [[Dreamwidth Timeline#April 2011 |2011 April 30]]! <br />
<br />
; Bikeshed(ding): Descending into increasingly-fine hair-splitting and world-ending pro/con over an issue that's rather small in the grander scheme of the project, particularly in a "push" environment such as e-mail. See [[Bikeshed]]. (From the Open Source technical community.) <br />
<br />
; bless, blessed, unblessed: [http://perldoc.perl.org/functions/bless.html Perl jargon involving objects]. <br />
<br />
; Blocking Launch: An obsolete priority classification status for Dreamwidth bugs. Items that <strong>must</strong> be fixed before Dreamwidth can be [[Roadmap#Milestone:_Site_Launch|launched]]/considered out of beta. Features that are listed as blocking launch will not be artificially delayed until the time of launch, but launch cannot happen until all of these are fixed/in place.<br />
<br />
; BML: A kind of scary language that Brad created to write parts of the site in. Stands for (Brad/Better/Block) Markup Language. See the [[BML]] article on this very wiki. [http://bradfitz.com/misc/bct/#bml Brad's History of BML] Dreamwidth is being migrated from BML to Template Toolkit, as BML makes it harder than it might be to separate code from design. <br />
<br />
; bug, b00g: Something that is broken (not working as intended), or broken-as-designed (working as intended, but "as intended" is not workable). <br />
: Any ticket filed in [http://bugs.dwscoalition.org Bugzilla], whether it is an actual bug, an enhancement, a new feature, a documentation request, or some other request-for-work. <br />
<br />
; Cacti: A [http://www.cacti.net/ network graphing tool] that Mark uses a lot. <br />
<br />
; CARL: Cross-site Authenticated Reading List, the planned mechanism by which one will eventually be able to read locked entries from friends on other sites. It was originally intended for reading LiveJournal entries, but [http://dw-news.dreamwidth.org/27853.html that had to be abandoned, and when implemented, it will likely be limited to sites running the Dreamwidth code]. <br />
<br />
; CARP: Cross-site Authenticated Reading Page, a previous term for CARL. [[Cross-site_authenticated_RSS | Discussion.]]<br />
<br />
; Chef: [http://wiki.opscode.com/display/chef/About+Opscode+Chef An open-source tool to automatically set up servers just right according to a pre-set recipe.] <br />
: On LiveJournal, Chef was a cluster named during the [http://en.wikipedia.org/wiki/South_Park South Park] character cluster naming era. It was infamous for dodgy performance. <br />
<br />
; Clone: An exact copy, or a copy that is identical in most major respects. In the context of the Dreamwidth project, this is generally used to refer to other journaling sites based on the LiveJournal code that have not made significant functional alterations to the code. Dreamwidth is not, strictly speaking, a clone of LiveJournal. See: Fork, [[LJ-based_Services]]. Dreamwidth itself now has a few daughter sites that could be termed clones. <br />
<br />
; Debian: [http://www.debian.org/ Debian] is a free operating system that uses the Linux kernel and some GNU operating system tools. <br />
:While Debian's logo, a spattered red line spiraling clockwise inward, reminiscent of the Fibonacci spiral, can at a casual glance and small resolutions be confused with the simplified version of Dreamwidth's logo (a smooth red line spiraling counterclockwise inward in a roughly circular shape, derived from Dreamwidth's stylized lower-case D), the organizations are separate. It is unknown how many Dreamwidth-affiliated developers and users prefer or use Debian. <br />
<br />
; Dragon: Dragon Naturally Speaking is dictation and accessibility software that can be used to give voice control of the computer. It can cause results similar to [http://damnyouautocorrect.com/ DamnYouAutoCorrect] (gallery of images of hilariously awful autocorrections, mostly iPhone, mostly not adequately alt-texted). <br />
<br />
; Edges: Data that makes <dwuser>foxfirefey</dwuser> very happy. See [[Data_Sources]]. <br />
<br />
; Enhancement: A change that improves or enhances an existing feature. Not quite a true bug, because the feature would have been working OK before that, and not a whole new feature, just something that makes an existing feature better. <br />
<br />
; ESN: Event-Subscription-Notification, the original development name for what eventually became the inbox/[http://www.dreamwidth.org/support/faq.bml#notify notification] system. (From LiveJournal developers.) <br />
<br />
; FCKEditor, FCKEd, CKEditor: [http://ckeditor.com/what-is-ckeditor FCKEditor] is the open-source WYSIWYG editor used by Dreamwidth and LiveJournal, more familiarly known as the Rich Text Editor, or RTE. The FCKEditor is named for its creator, Frederico Caldeira Knabben. With version 3.0, it was renamed the CKEditor. <br />
<br />
; Fork, code fork: Like a fork in a road, [http://en.wikipedia.org/wiki/Fork_(software_development) code that has been taken in a different developmental direction from the main project]. In the context of Dreamwidth development, this generally is used to refer to Dreamwidth's relationship to LiveJournal, as Dreamwidth has active development in other directions. [http://rosemaryedghill.livejournal.com/8481.html?thread=89377#t89377 Colorful explanation.]<br />
<br />
; Gearman: An asynchronous job scheduling engine, of the type "do this somewhere else". Benefits: somewhere else, fast. Flaws: currently if it dies jobs are lost (apparently the team that manages it is working on that). Name is an anagram of "manager"; from LiveJournal days. [http://azurelunatic.dreamwidth.org/6323528.html IRC log with history/discussion] <br />
* [[Production_Notes#Gearman|Gearman on Dreamwidth]] <br />
* [[Setting up Gearman]] for the Dreamhack<br />
* [http://gearman.org/ gearman.org]<br />
<br />
; Git: the new-to-us [http://en.wikipedia.org/wiki/Revision_control code version control system], to help make tracking/sorting out the contributions of infinitely many developers sweating over infinitely many keyboards be less like attempting to keep a torrential rainstorm away from the delicate electronics with a rake, and more like a well-ordered hackspace. [[Git Getting Started]]<br />
<br />
; Guru meditation: an [http://en.wikipedia.org/wiki/Guru_Meditation error code thrown by the Varnish cache server (and others, elsewhere, but DW uses Varnish)]. This is generally a temporary error, indicating that the server wants to be a lumberjack and has to take a moment to adjust its suspenders and/or bra. <br />
<br />
; i18n: [http://en.wikipedia.org/wiki/Numeronym abbreviation] for "internationalization", the ability of a software program to work with different languages, alphabets, cultural conventions, and so forth. <br />
<br />
; JAWS: a screenreader (assistive software for the visually impaired). [http://www.freedomscientific.com/products/fs/jaws-product-page.asp JAWS homepage]<br />
<br />
; Leaning Toothpick Syndrome: the \/ and \\\\ stuff that tends to happen a lot in regexes<br />
<br />
; MogileFS: Mogile FileSystem, the system that runs behind the userpics, is an anagram of OMG FILES. From LiveJournal development. <br />
<br />
; Nagios: A [http://www.nagios.org/ monitoring system] used to advise Mark (and IRC) about whether Dreamwidth is functioning properly. See [[#Volunteer/IRC-Specific|the Volunteer/IRC section]] for further info. <br />
<br />
; OpenID: A way for a website to know that you totally are who you claim to be from that other website over there. [http://azurelunatic.livejournal.com/6054113.html An informal explanation.] [http://www.dreamwidth.org/support/faqbrowse.bml?faqid=62 Dreamwidth OpenID FAQ] (From LiveJournal; Brad developed it!) <br />
<br />
; Peterstein, Disco King: The private support category that receives mail sent to the support@ email address. Blame Mark. ;) <br />
<br />
; Priv, privilege: Access to various special administrative site functions, such as viewing sensitive support requests, viewing screened proposed answers to support requests that other users have left, viewing spam reports, and taking various administrative actions. Privs are granted in a chain of trust that culminates with the site owners; one may be granted the priv to hand out more privs to others. Privs may be restricted by arguments or granted globally (unarged). "What privs do I have?" "Not enough to do your job. I'm granting you some more privs." (Inherited from LiveJournal.) See [[Privileges]]. <br />
<br />
; PubSubHubbub, PuSH: A way to make syndicated stuff update like greased lightning. From Google (and Brad!); the implementation is courtesy of our good friends in the LJ dev department. Sometimes also called Fred for short. <br />
<br />
; Puppet: an open source data center automation and configuration management framework. That is to say, a way for the system administrators to set up computers quickly. See [[Production Puppet]]<br />
<br />
; replicate, cannot replicate, replication: Dreamwidth has two master databases that are supposed to be identical copies of each other. Nagios freaks out when one copy is lagging behind the other. Nagios also cheerfully informs everyone when things are back to normal. <br />
<br />
; RFC: Request For Comment. An invitation for constructive and thorough criticism of the proposed concept. In general use in certain technical communities. Also, one of the founding documents describing standards that the internet attempts to abide by. Examples: [http://www.faqs.org/rfcs/rfc3330.html RFC 3330] [http://www.ietf.org/rfc/rfc2324.txt RFC 2324] <br />
<br />
; RTE: Rich Text Editor, something that lets you add formatting to text as well as just do plain text. Contrast with HTML editor (plain text, although you can type in HTML formatting manually). LJ's RTE gathered a lot of dislike from LJ volunteers. It is built based on the open source FCKEditor. The LiveJournal and Dreamwidth implementations have a reputation for being (pick your favorite) delicate, buggy, or broken. (From internet in general & LiveJournal.) <br />
<br />
; screenreader: an item of assistive technology used primarily by visually impaired users. Screenreaders read text on web pages aloud, allowing users to use websites without seeing them. <br />
<br />
; Test Driven Design: Uncanny_Kate explains: "One thing that a lot of people, including me, dig is something called Test Driven Design. Which means, to fix a bug or write a new feature, first you write a test for how it should work. It'll fail, until you write the code, but then you can be super confident your test works. And if you do that long enough, you can run the test suite and be super confident you didn't break anything else." <br />
<br />
; TheSchwartz: An asynchronous job scheduling engine of the "Do this and tell me later" type. Has persistent queue support. It was named after Brad's manager, Mike Schwartz, the VP of Engineering at Six Apart, and may also have been a reference to Spaceballs (with Brad you never know). Solid, has a lot of overhead and a lot of setup. [http://azurelunatic.dreamwidth.org/6323528.html IRC log with history/discussion] [[Production_Notes#TheSchwartz|TheSchwartz on Dreamwidth]] [http://search.cpan.org/~bradfitz/TheSchwartz-1.07/lib/TheSchwartz.pm TheSchwartz on cpan.org]<br />
<br />
; Template Toolkit, TT: The templating system that's replacing BML when building site pages; all existing BML pages are planned to eventually be migrated to using TT. Free Open Source Software, 99% less Eldritch Horror. See [[Routing and Template Toolkit]] and http://template-toolkit.org/<br />
<br />
; Upstream: A flag in Dreamwidth's implementation of Bugzilla that is a courtesy to LiveJournal developers, to alert them that a bug inherited from the LiveJournal codebase has been patched. LiveJournal is actively encouraged to pick up patches that have been flagged for upstreaming. Yay Open Source! <br />
<br />
; WTF/Project WTF: Rather than "What The Fuck", this is Watch-Trust-Friend(s), the project of splitting LiveJournal's original Friends into Watch/Trust (this eventually became Read/Access). (From LiveJournal development and then Dreamwidth development.)<br />
<br />
; WTF-8: When UTF-8 encoding, or lack thereof, causes problems.<br />
<br />
=People= <br />
==Staff==<br />
;<dwuser>Mark</dwuser>: Mark Smith is one half of the founding team of Dreamwidth. He is also known as <dwuser>xb95</dwuser>.<br />
;<dwuser>Denise</dwuser>: Denise Paolucci is one half of the founding team of the site. She is known as Rahaeli or rah on IRC. She is also known as D and <dwuser>synecdochic</dwuser>.<br />
;<dwuser>Fu</dwuser>: Afuna is the first full-time Dreamwidth employee. She answers to <dwuser>Afuna</dwuser> or Fu. <br />
;<dwuser>MissKat</dwuser>: Kat joined the team on January 1, 2013. She is also <dwuser>zarhooie</dwuser>. <br />
<br />
; [http://www.dreamwidth.org/site/staff Staff Page]: All staff, and most department heads.<br />
<br />
; <dwuser>Sarah</dwuser>: Married to <dwuser>denise</dwuser>, helps with technical support. <br />
; <dwuser>janinedog</dwuser>/Janine/J9: Was married to <dwuser>mark</dwuser>. A developer. <br />
; Ari: Mark's partner and co-parent. <br />
<br />
; MrsJ: Collectively, the people who can handle staff issues are sometimes known as "MrsJ", which was short for the owners and their wives at the time of site launch: Mark, Rah, Sarah, and Janine. This personnel lineup has since changed, and now includes Mark (co-owner), Rah (co-owner), Fu (employee), Sarah (Rah's wife), and sometimes Robby (backup sysadmin).<br />
<br />
==Other People==<br />
;<ljuser>Brad</ljuser>: [http://en.wikipedia.org/wiki/Brad_Fitzpatrick Brad Fitzpatrick] is the original creator of LiveJournal. While he is not affiliated with the Dreamwidth project, if someone name-drops "Brad", it's probably him. (However, <dwuser>brad</dwuser> is not him.)<br />
<br />
;People the owners have worked with/near in the past, partial list: Brad (<ljuser>bradfitz</ljuser>), Brad's Mom (<ljuser>sandy</ljuser>), Hachi (<ljuser>hachi</ljuser>), Abe (<ljuser>burr86</ljuser>), Mart (<ljuser>mart</ljuser>), MK, BB, Carrie (<ljuser>coffeechica</ljuser>), Dave "worst username evar" Recordon (<ljuser>daveman692</ljuser>), Tupshin (<ljuser>tupshin</ljuser>), Stacey (<dwuser>nova</dwuser>), Whitaker (<ljuser>whitaker</ljuser>) (but not [http://azurelunatic.dreamwidth.org/6353528.html Whitaker's Mom]).<br />
<br />
; Dave "Worst Username Evar" Recordon (<ljuser>daveman692</ljuser>): a legacy LiveJournal employee, involved with the creation of OpenID. <br />
: [05:20] <V_PauAmma_V> [...] I'm not sure how the "worst username ever" joke got started, but when LJ started listing the "purged, available to rename to" usernames list, that joke was enshrined on the LJ homepage blurb for that page.<br />
: [05:23] <rahaeli> it started because NONE OF US COULD EVER TYPE HIS USERNAME<br />
: [05:23] <rahaeli> it took us like two years to learn the numbers<br />
: [05:23] <rahaeli> so brad dubbed him "worst username evar"<br />
: [05:23] <rahaeli> (plz to note that it's 'evar' and not 'ever')<br />
<br />
MissHat: <dwuser>zarhooie</dwuser>|MissKat speaks fluent typo. <br />
<br />
; Momijizukamori: "... the kanji combo is 'guardian of the maple tree burial mound'. More or less. It's a really dorky reference to an old CLAMP [manga] series."<br />
<br />
; PauAmma: Pau's nickname is a reference to [http://www.online-literature.com/poe/164/ The Crab that Played with the Sea]. The 'V's are pincers. <br />
<br />
<br />
<br />
<br />
;<strong>Confusingly similar nicks</strong>: Some people in IRC/mentioned in IRC look similar but aren't the same person. <br />
<br />
;~aeli: rahaeli is not niqaeli, although they are certainly friends. <br />
<br />
; Alex: there are now at least three regulars who answer to Alex. <br />
<br />
;az*: There are at least four IRC-folks over time starting with 'az': <br />
: <dwuser>azurelunatic</dwuser>|Azz (two zs)<br />
: azureye<br />
: azetidine|aze, <br />
: the former azalais|az (one z) <br />
<br />
;fitz: <ljuser>bradfitz</ljuser> is not [http://foxfirefey.dreamwidth.org/tag/cats:+fitzwilliam Fitzwilliam], <dwuser>foxfirefey</dwuser>'s younger flame point cat. <br />
<br />
;j*c: jc|jc` and JDC|<dwuser>jd</dwuser> are not the same person, even though they've both been around since beginning days. <br />
<br />
;jl*: jlb and jld are different people, though they know each other. <br />
<br />
;pineapple: pineapple and pineapplechild are not the same person, nor is pineapple the mother of pineapplechild. Nor the other way around.<br />
<br />
; RH|: Nicks starting with RH are either <dwuser>RebelsHeart</dwuser> in some afk mode, or a specific member of the Rhymers' House (<dwuser>not_a_sniglet</dwuser>). Check the whois in your IRC client if uncertain. <br />
<br />
; Ricky: both jeshyr and Amianym answer to Ricky offline. <br />
<br />
;simon: _Simon_ and _NotSimon_ are both Simon, just the latter is afk. <br />
<br />
<br />
;<strong>Nicknames from DW-Drew</strong>: <dwuser>dreamatdrew</dwuser>|DW-Drew|Algol (the Ogre star) has many nicknames for many people, many of which are not self-explanatory unless you happened to be there at the time. Sometimes other people also use these nicknames, but sometimes not. <br />
<br />
; Assface: A typo that DW-Drew assiduously attempts to avoid but sometimes runs into anyway, for Azzface (<dwuser>azurelunatic</dwuser>|Azz). <br />
<br />
; bible-stud: vlion, based on the time when his attempted nick-change to vlion|biblestudy got truncated by one letter. <br />
<br />
; Dracca: DW-Drew's mother. <br />
<br />
; fish, fishen: <dwuser>ghoti</dwuser>, ghoti14 on IRC. While theoretically [http://en.wikipedia.org/wiki/Ghoti this is universal], in practice it is a mostly-from-Drew spelling. <br />
: "fish" may also refer to some of the "chatfish", members of a YA readers group of Azz's. <br />
: See also: [http://www.imdb.com/title/tt0266543/quotes?qt0396991 "Fish are friends, not food."] (ghoti is a friend-grade fish, not sushi-grade.) <br />
<br />
; frog: <dwuser>woggy</dwuser>, whose default userpic is a frog and whose username comes from "polliwog". <br />
<br />
; Herbie: jeshyr|<dwuser>rb</dwuser>, referencing an Asimov story in which a robot with the letters RB became Herbie. <br />
<br />
; Iggy: <dwuser>ivorygates</dwuser>, formed from the initials I.G.<br />
<br />
; Mr. Zog: Azz's Motorola [http://en.wikipedia.org/wiki/Mr._Zog's_Sex_Wax SURFboard] router. <br />
<br />
; Slaver: xb95; this references the game EVE Online, where xb95 has an [http://wiki.eveonline.com/en/wiki/Amarr Amarr] pilot.<br />
<br />
; throwrug: Allen. You sort of had to be there, for values of "there" that are YAPC:NA '13<br />
<br />
==Artificial, Fictional or Otherwise Questionable Reality==<br />
These individuals, while present or mentioned in IRC from time to time, are not always inhabiting the same reality as most of the rest of us. Sometimes it's not wise to follow them to their home dimension. <br />
<br />
; Alertsy: a Nagios IRC bot. <br />
<br />
; Anna: a Support-bot originally programmed by Sophie (with features from past bots), for #lj_support. Named for the Basshunter song "Boten Anna". Decommissioned with the decommissioning of LiveJournal's private server. <br />
<br />
; Bit: Originally a standalone bot in #lj_support. See: Fig|Bit. <br />
<br />
; Charlotte: a legacy LJ bot. <br />
<br />
; <dwuser>fairlight</dwuser>: Sometimes present in IRC. See [http://tiferet.dreamwidth.org/profile/ Tiferet's profile] for details. <br />
<br />
; Fig|Bit: An IRC bot, run by <dwuser>sophie</dwuser>. The bot gives different responses when addressed as "Fig" than when addressed as "Bit". Fig is a Support-bot, an infobot, and has some other features. Bit is a decision bot. Most of the time, the bot's answers are pre-programmed. Very occasionally, not. See [[IRC]]. <br />
<br />
; Frank: Frank the Goat, LiveJournal's mascot. <br />
<br />
; Goat: a legacy #lj_support Support-bot. Notably rude. <br />
<br />
;INGVA: [http://qdb.dreamwidth.net/dw/7 QUEEN] OF THE [http://azurelunatic.dreamwidth.org/6281178.html?thread=11191002#ljcmt11191002 WILD PLACES]<br />
<br />
; jdn: <dwuser>twopointoh</dwuser> & <dwuser>jdn</dwuser>. [http://qdb.dreamwidth.net/dw/248 Fictional character], written by a number of people but usually Rah, sometimes shows up in IRC (as jdn). See [http://www.kekkai.org/synecdochic/sg1/bw.html Broken Wings] and [http://www.kekkai.org/synecdochic/sg1/mezzanine/index.html Mezzanine]. (Warning: if you commence a scarily literary-crossed-with-lowbrow rant and find yourself losing your capital letters, you may have been channeling jdn. The standard cure is to finish writing the rant.) Not to be confused with <dwuser>jd</dwuser>, who is in IRC as JD or JDC.<br />
<br />
; RWHell: an IRC bot. See [[IRC]].<br />
<br />
=Volunteer/IRC-Specific=<br />
<br />
; #dw: (Previously) The Official Dreamwidth IRC Channel. Either refers to when the channel was on Mark's server (prior to [http://wiki.dwscoalition.org/notes/Dreamwidth_Timeline#March_2010 March 2010]) and was named #dw, or is shorthand for the current channel name. <br />
<br />
; #dreamwidth: The Official Dreamwidth IRC Channel, on irc.freenode.net, from [http://wiki.dwscoalition.org/notes/Dreamwidth_Timeline#March_2010 March 2010] onward. See [[IRC]]. Sometimes referred to as #dw for short. All official Dreamwidth IRC channels on Freenode actually start with #dreamwidth- although people may say #dw- instead, as it is both the usual shorthand and was the channel name on Mark's old server. Sometimes sub-channels are abbreviated further, such as # -bitch for #dreamwidth-bitch, # -dev for #dreamwidth-dev, and so on. Sometimes unofficial channels, like #dw-tmi, are actually #dw-. <br />
<br />
; <nowiki>$lj::will_not_work_without_steam_radiator</nowiki>: A [http://www.dreamwidth.org/interests?int=%24lj::will_not_work_without_steam_radiator popular interest], originating at a time that involved a lot of code refactoring that converted $lj methods over to generic methods, and when Rah needed an interest that started with a non-alphanumeric character to test something. A reference to http://qdb.dreamwidth.net/dw/73, which is itself a reference to http://wiki.lspace.org/mediawiki/index.php/Bergholt_Stuttley_Johnson<br />
<br />
; Alton Brown anal nachos: Alton Brown's perhaps unnecessarily fussy [http://www.foodnetwork.com/recipes/alton-brown/ultimate-nachos-recipe2/index.html recipe for nachos]. (From IRC. You really had to be there. [http://azurelunatic.dreamwidth.org/6222720.html For those who weren't there, a log: it was a bit too saucy for the QDB. Also long.]) <br />
<br />
; Anna: Usually a reference to the [http://www.basshunter.se/ Basshunter] song [http://basshunter.tgl0be.org/video,BotenAnna,English "Boten Anna"] ([http://www.youtube.com/watch?gl=GB&hl=en-GB&v=RYQUsp-jxDQ YouTube], [http://www.lyrics007.com/Basshunter%20Lyrics/Boten%20Anna%20%5BEnglish%20Ver.%5D%20Lyrics.html English lyrics]), about an IRC bot named Anna. LJ Support IRC had a support-bot named Anna, from whom the #dreamwidth bot [[IRC#Fig-Bit | Fig]] is descended/cloned. <br />
<br />
; axolotl: [http://rho.dreamwidth.org/12709.html Payments silliness.]<br />
<br />
; babydev: Affectionate term for a [[Dev_Getting_Started|beginning developer]]. Generally used of developers who are new at development in general, not just new to the project. Gender-neutral. Some neophytes may wish to not be referred to as "baby-" anything; do respect their wishes. <br />
<br />
; babydev-bait: An effort-minor bug that would be an excellent introductory bug for a beginning developer. See [[Newbie Guide: Getting Started on Windows]].<br />
<br />
; bananas: [http://dw-support-training.dreamwidth.org/1697.html Make like a banana in the presence of ice cream and split!] (Kat got bored)<br />
<br />
; bees, full of bees: A certain kind of metaphorical stingy badness. Brought to IRC mainly by <dwuser>jld</dwuser>. References include [http://www.youtube.com/watch?v=Xs-tl6GBOBo Eddie Izzard: "Covered in beeeees"], [http://en.wikipedia.org/wiki/Swarm_%28comics%29 the supervillain Swarm], [http://www.youtube.com/watch?v=_XcT49ms4yg Conan: Oprah bee giveaway sketch], [http://www.flickr.com/photos/keinsignal/468795874/ Urethra bees] and [http://community.livejournal.com/metaquotes/5989568.html "That'll get you bees."] See also: hivemind. <br />
<br />
; <dwcomm>beginningcocks</dwcomm>: In the early days of #dw, there was call for a 101-level cooking community. One person returned having created <dwcomm>boilingwater</dwcomm>. Another returned having created <dwcomm>beginningcooks</dwcomm>. Naturally, someone -- several someones -- mis-read the latter, in the same predictable way. And thus <dwcomm>beginningcocks</dwcomm> was created. <br />
<br />
; [[Book of Wholesome Hobbies]] (that Denise has forbidden her volunteers from taking part in): A list of ha-ha-only-serious rules for [[IRC]] denizens and volunteers. <br />
<br />
; Borg: Any of a generous number of possible monolithic large-corporate entities that certain members of channel may or may not work for. References the Star Trek villains. <br />
<br />
; botsmack: [http://qdb.dreamwidth.net/dw/533 Sometimes Bit likes a good spanking.] See also: botsnack. <br />
<br />
; botsnack: a treat given to any of the channel's bots. See also: botsmack. <br />
<br />
; Brad, in his dorm room, with BML: Reminiscent of the solution to a game of Clue, this occasionally is said of inherited code that has generally not been modified since its creation on LiveJournal. An Azz-ism. <br />
<br />
; bunneh: (verb) to do something (answer a question, approve an entry in a moderation queue, etc.) faster than someone else. Common uses are "Bunnehed!" or "You bunnehed me!" Compare to "Jinx!" when someone has done something at the same time. <br />
: (noun) one who is fast and likely to bunneh others often. From "quick like bunneh", through a "Wow, that was fast!" user comment on a LiveJournal support request that got an answer very fast. (Note: the division of LiveJournal volunteers into bunnehs and sharks based on which requests they prefer to answer or act on appears far less common among Dreamwidth volunteers.) ([http://wiki.livejournal.org/index.php/Bunneh Inherited from LiveJournal Support].) <br />
<br />
; butterfinger: A candy bar or a finger that is buttered. Mark branched out into [http://qdb.dreamwidth.net/dw/46 fanfiction]. (From IRC.) <br />
<br />
; bus (non-essential and/or metaphorical, often seen being sent to hEll): A reference to [http://www.slate.com/id/2223749/ "hit by a bus" as "unexpected tragedy"], and discussions about what would happen if both Mark and Denise were to be hit by a bus at the same time. [[Operating_Agreement]]<br />
<br />
; Camp Permabanned: Where particularly enthusiastic/persistent spammers are sent. (An Azz-ism, and also a joke based on Camp Permafrost from Bujold's Vorkosigan series.) <br />
<br />
; Cat: Short for Support Category. (From LiveJournal support.) <br />
: Public cat: support category where the requests are publicly viewable. <br />
: Private cat: support category where only a few people (staff, and possibly senior volunteers) have the privs to view and/or answer. <br />
<br />
; catgoat: freerangefatty's cat Mau nibbles on <em>everything</em>. [http://caturday.dreamwidth.org/tag/mau Pictures of Mau]<br />
<br />
; channelstaples: notional staples that are said to keep someone who keeps disconnecting from the server stapled there. (Popular in LJ IRC, and perhaps other places.) <br />
<br />
; chemla, the: [http://dw-support-training.dreamwidth.org/4161.html a dance]. Not to be confused with Chemla, who is <dwuser>ChemicalLace</dwuser> the volunteer. <br />
<br />
; chugga chugga: The sound made by a steam train chugging along. Also, the sound made by <dwuser>MissKat</dwuser> plowing through a bunch of requests. STEAM POWERED. <br />
; clocktower: If someone in IRC has 'clocktower' after their name, it means they're pretty mad about something. (From LJ Support IRC, an irreverent reference to crazed campus shooters.) <br />
<br />
; coed(s), invite coed(s): A deliberate misspelling of 'code', as in 'invite code(s)'. (From LiveJournal.) <br />
<br />
; Commit-and-Ditch pony: When someone does something that breaks stuff, and leaves everybody else with the mess, they are awarded the Commit-and-Ditch Pony. This can take the form of an actual toy pony, a pony virtual gift, or merely informing the offender that they now hold the pony. (From [http://desh.livejournal.com/269183.html OpenMoko development], via LiveJournal volunteers.)<br />
<br />
; (gone to) Costa Rica (with the Peace Corps): The default example for someone who has gone away from the internet for an extended length of time, but has not abandoned their journal despite lack of activity. From LiveJournal volunteers: long-time LJ volunteer <ljuser>christine</ljuser> did just this. <br />
<br />
; Disco: Support's private category is powered by this. (Mark started it; Kat continued it.) See Technical, Peterstein. <br />
<br />
; Drewspeak, DW-Drew (obscure things said by): <dwuser>dreamatdrew</dwuser> has a set of jargon all his own, including some unique nicknames given to assorted channel regulars. "Drew, 'splain!" is a relatively common refrain. (Feel free to ask if you don't understand something that was said.) <br />
<br />
; ELF: Enthusiastic Little Fucker. Said of particularly prolific spammers before they are sent to Camp Permabanned. <br />
<br />
; finfers: typo for "fingers" (easy on qwerty keyboard). Subject to fish jokes. <br />
<br />
; fish and whistles: A more derisive variant of [http://www.catb.org/jargon/html/B/bells-and-whistles.html "bells and whistles"], although it is probably useful to note that the power user is probably talking about [http://www.catb.org/jargon/html/C/chrome.html "chrome"]. Specifically refers to features requested by users that would play out badly if implemented. (Originates from a [http://news.livejournal.com/98192.html?thread=44350352#t44350352 mock flamewar in LiveJournal news], and references the classic IRC concept of trouting.) <br />
<br />
; football field: Azz is probably looking for/putting on/turning on/dropping her cellphone headset. ([http://azurelunatic.dreamwidth.org/7058342.html Azz lives in a Faraday cage. Azz talks on her cellphone to MissKat a lot.]) <br />
<br />
; Frank: LiveJournal's goat mascot. <br />
<br />
; Fred: a more friendly name for PubSubHubbub (see Technical). <br />
<br />
; fruit loops: Appropriate-answer silliness. <br />
:<code>[17:31] * ysobel dies giggling. you know, one of these days I really AM going to have to answer a request with gibberish</code><br />
:<code>[17:31] <MissKat> Even if she's like "and then the pink sparkley ponies will come and delete all your entries and replace them with froot loops!" I figure it's isa and she must know what she's talking about.</code><br />
:<code>[17:31] <domtheknight> OMG PINK SPARKLY PONIES</code><br />
:<code>[17:31] <domtheknight> FRUIT LOOPS</code><br />
:(from IRC) <br />
<br />
; gecko: Since Drew can't teleport very well, he sends a gecko to take care of his people. <br />
<br />
; Glitterhoof the Magic Fix Pony: <dwuser>mark</dwuser>, [http://dw-dev.dreamwidth.org/105483.html by way of] <dwuser>john</dwuser>. <br />
<br />
; Goat: Usually a reference to a legacy LiveJournal Support bot of that name. Goat reported on the current open support requests in a way similar to Anna, but with a different format. The command "Fig, be Goat" makes Fig give the report using Goat formatting. Goat made insulting comments to people who did not remember the syntax for his commands. Goat was probably named after LiveJournal's mascot, Frank the Goat. <br />
<br />
; going to the wiki: If you visit [http://wiki.dwscoalition.org http://wiki.dwscoalition.org] you see this message before it redirects to [http://wiki.dwscoalition.org/notes/Main_Page http://wiki.dwscoalition.org/notes/Main_Page]. It has therefore become customary to announce "Going to the wiki!" in varying stages of capslock upon going to the wiki (to look up something or edit). (Popularized on IRC.) <br />
<br />
; Green: a technical support question without an answer (or without an answer that has been reviewed and approved by senior support). Green is usually referred to numerically ("How much green?" "10."), which refers to the number of green requests. It can also be referred to in relative terms ("Lots.") or figurative ("Enough to fill a swimming pool!"). The support category "General/Unknown", commonly referred to as "G/Unk", spawned the phrase "green gunk", or "lime slime". (From LiveJournal support, based on the color coding of the Support system's user interface, which shows requests that are awaiting an approved response with a green background in the list of support requests.) <br />
<br />
; hEll, RWHell, Random Word hEll: An [[IRC]] bot in #dreamwidth. <br />
: One sends an item to hEll. hEll sneaks out a scaly hand and grabs the item. hEll's depths emit a sudden roar as it expels a previously entered item. Sometimes, hEll's depths continue to roar as it expels a second previously entered item. (Occasionally, hEll will burp and not expel any other items.) <br />
: hEll is neither endothermic nor exothermic, but maintains a fairly constant balance of items entered to items ejected. The rumor that hEll is sentient is just that, a rumor. (We hope.) <br />
: Read the origin story of [[Random Word Hell]]! And then one day Rah mentioned the bot in #dw, and Sophie got coding, and suddenly there was hEll. And then at the time of the server move, hEll became RWHell.<br />
<br />
; hooker: Crocheter: a person who works with a crochet hook. A Drew-ism. <br />
<br />
; HTH HAND: Hope This Helps, Have A Nice Day. Inherited from LiveJournal Support. A phrase that was used as a bad example: support answers were generally unsigned, and the specific phrase "hope this helps" implied some doubt that it might help at all. Picked up for sarcastic use to friends by some LJ volunteers. <br />
<br />
; kill you in the morning: A [http://www.imdb.com/title/tt0093779/quotes Princess Bride reference]. What else do you expect from the Dread Pirate Rah-berts? <br />
<br />
; kiwi: [http://qdb.dreamwidth.net/dw/321 Sometimes it's really hard to type 'wiki' correctly on the first try.]<br />
<br />
; Kitten: a support category that has very few requests in it. Wordplay. Support Category = Category = Cat; cat that is very small = kitten. (From LiveJournal support.) <br />
<br />
; mango, odd references to: at one point Azz said "what the mango-shitting fuck" as a random intensifier to "what the fuck". This caught on with a few people. <br />
<br />
; Mart bug death: Someone proposes something tiny and specialized, then Mart (a notable [http://www.joelonsoftware.com/articles/fog0000000018.html architecture astronaut]) generalized it to the abstract case and said "we should do it this way so it can be used for this other stuff", turning it from a five-minute fix to a five-month fix. Then (the death part) whoever came along who could do the five-minute fix, but not the five-month fix, would look at it and go "screw this" and <strong>never do it</strong>. There were approximately four people who could do the five-month version, so it would never get done, because they had a gazillion five-month projects. (From [http://community.livejournal.com/lj_dev/658149.html LiveJournal development], seen in the wild mentioned by <ljuser>mart</ljuser> in '04.) <br />
<br />
; mean hat: When a delegate ops up and tells everyone to stop talking by muting #dreamwidth. This is usually done to give people time to cool down after a particularly argumentative time. Usually, MissKat wears the mean hat on top of her tact hat.<br />
<br />
; minion: Assistant or direct report. (I think Rah started saying she had minions, asking for minions to do various tasks, calling people minions, and/or people started calling themselves Rah's minions?) <br />
<br />
; MrsJ: People who can handle staff issues (see [http://wiki.dwscoalition.org/notes/Common_Jargon#Staff Staff]. (DW Support shorthand.) Also, the regular communication sent from Support to staff listing issues that only members of MrsJ can handle. <br />
<br />
; Muppet: If people start calling Mark "Muppet", it's [http://dw-dev.dreamwidth.org/29363.html?thread=249523#cmt249523 MissKat's fault]. <br />
<br />
; nagios: In IRC, nick '''nagios''' (now '''Alertsy''' after the Freenode server move) is the monitoring bot. Various people will change their nicks to '''_nagios_''' or similar variations to make jokes about the bot. [http://qdb.dreamwidth.net/dw/137 History of the HEY MARK HEY MARK HEY MARK jokes] See Technical for more information. <br />
<br />
; nethic: Internet hiccup. Often accompanied by a pingout. Someone who had an internet hiccup probably missed the last several lines of chat. <br />
<br />
; notwork, nyetwork: The network in geekosaur's motel-of-residence sort of doesn't. Work, that is. It is built on fail hardware that is not watertight enough to stand up to local rain, and additionally has absurdly bad topology and hilariously bad oversaturation on certain access points. <br />
<br />
; !pleh: 'Help!' spelled backwards. (From LiveJournal Support.) <br />
<br />
; pillowfort: refers to the secret hiding place of the Triumvirate + pony<br />
<br />
; plumbing not compatible: a reference to a [http://qdb.unmutuals.com/view.cgi/support/125 somewhat inappropriate conversation about orientation between Rah and Abe]. Often accompanied by little hand gestures. <br />
<br />
; qdb: [http://qdb.dreamwidth.net/ Quotes Database], a collection of particularly funny and/or memorable quotes uttered in various Dreamwidth IRC channels. This is maintained by <dwuser>sophie</dwuser>. (The Dreamwidth QDB was previously hosted on the same server as the LiveJournal volunteer IRC QDB (the original has gone down, but there is a [http://qdb.unmutuals.com/ mirror]), which also contains quotes from some staff and volunteers' shared history.) <br />
<br />
; Rahversation: refers to a conversation involving Rah (<dwuser>denise</dwuser>). Coined by <dwuser>ysobel</dwuser><br />
<br />
; SKULLBUTT THE TORMENTOR: Once upon a time, an underwear designer put a flaming skull on the front and back of a pair of briefs. (Ed Hardy. 2 Sword Skull.) Assorted #dw and #dw_nsfw people in and around <dwcomm>amusing_underwear</dwcomm> pointed and laughed. <ljuser>mayerman</ljuser> coined the name, and <dwuser>remark</dwuser> elevated it into a catchphrase. [http://wiki.dwscoalition.org/notes/File:Skullbutt.jpg Of course there's an icon.]<br />
<br />
; SNH, Still Needs Help: A support request that has already received at least one answer, but the user has "regreened" (indicated that they still need help, moving it from "answered, awaiting close", to "green"), and has replied with a follow-up question or more information. <br />
<br />
; Speaking of <x>, hello <y>: You may be greeted this way upon entering IRC. Likely as not, <x> has nothing to do with you; it was just the topic the moment before you entered. (This greeting habit was more prevalent in LJ volunteer IRC but still persists.) <br />
<br />
; spider: Since Drew can't teleport very well, the spider is his enforcer, like when people *cough*Inoru*cough* need to go to bed but aren't. <br />
<br />
; stekpanna: Swedish: skillet, frying pan. In Drewspeak, this is usually short for the Swedish "domedagengjutjärnstekpanna", which translates to "cast-iron skillet of doom". It is more of a weapon than a cooking implement. <br />
<br />
; teapatty, *|teapatty: Someone making reference to "teapatty" or changing their IRC nick to incorporate "teapatty" is either drunk or pretending not to be. At one point Wyn attempted to say "Not drunk, repeat, not drunk." Unfortunately for them, they were drunk enough that it came out "Not drunk, teapatty, not drunk." (From LiveJournal Support IRC.) <br />
<br />
; Tits Against the RTE: References a campaign to get the Rich Text Editor removed (or vastly improved) at LiveJournal during <ljuser>tupshin</ljuser>'s time there. <br />
<br />
; Triumvirate, The: refers to the current [[Support_process|support]] wranglers: <dwuser>Domtheknight</dwuser> (The Bug-Squashing Boots), <dwuser>zarhooie</dwuser> (The Tact Hat) and <dwuser>chemicallace</dwuser> (The All-Purpose Boa). The Triumvirate + Pony is the Triumvirate with the addition of the Froot Loop Pony, also known as <dwuser>ysobel</dwuser>.<br />
<br />
; twix: A candy bar, or a play on words involving "twixt". Mark branched out into [http://qdb.dreamwidth.net/dw/46 fanfiction]. (From IRC.)<br />
<br />
; voluntold: A portmanteau of "volunteer" and "told". The natural result of not having enough to do when around Rah, resulting in "... and when I came to, I realized that I'd just completed three bugs and was in charge of a project" type situations. <br />
<br />
; wgw, what goes where: A document detailing how (what department and process) handles a support request of any given type. (From LiveJournal support.) [[What Goes Where]]<br />
<br />
; worst username evar: David Recordon <ljuser>daveman692</ljuser>. Refers to a LiveJournal ad for rename tokens that featured his username. (From LJ.)<br />
<br />
= Emoticons =<br />
Dreamwidth IRC does not have very many non-standard emoticons in frequent use. There are occasional discussions where different non-standard emoticons are created, proposed, or used, but these are infrequent, and the same weird emoticon is rarely used twice. <br />
For example, '''[||||||| 8] \o/''' might represent a bus and an alarmed pedestrian, but this is rarely seen in actual chat. <br />
<br />
; User or community: '''()''', '''@''', and '''<^>''' are variously used to denote a user or community in text-only environments like IRC. <br />
: '''()xb95''' - user ; '''()omnomnom''' - community (regular)<br />
: '''@mark''' - user (official Dreamwidth user, or Twitter-style direct address for any DW user or IRC nick - Bugsy objects to '@' starting lines, however); '''@dw_news''' - community (official); sometimes used for regular communities <br />
: '''<^>lj_support''' - (usually) LiveJournal community; sometimes used for Dreamwidth community<br />
<br />
; '''*''': Surrounding a phrase, can indicate action or emotion, or emphasis: *grin*, *hugs*, "I *really* like it". <br />
<br />
; '''. o O (something)''': Thought bubble, thinking but not saying. <br />
<br />
; '''<_<''', '''>_>''': Eyes looking to the left or right and mouth. Sometimes used to indicate untrustworthiness of a statement ("I have no idea who ate the last piece of cake >_>"). <br />
<br />
; '''>_<''': Eyes tightly closed and frown. Disgust, self-deprecation, annoyance. <br />
<br />
; ''':|a''': Eyes, a flat mouth, and chin-scratching. Deep thought of some description. <br />
<br />
; '''o/''', '''\o''': Head with single (right or left) arm raised (waving, in greeting, or farewell). <br />
<br />
; '''\o/''': Head with two upraised arms: arms in the air cheering (genuine or sarcastic: "I just got a promotion \o/", "my toaster is on fire \o/"); enthusiastic greeting; arms in the air in confusion or panic, arms up over your head in water (drowning). <br />
<br />
; '''\o?''': common typographical error for '''\o/'''; (rare) scratching head in confusion. <br />
<br />
; '''o7''': a salute<br />
<br />
; '''/o\''': Arms protecting head, hands clutching head, or bucket on head. <br />
<br />
; '''~~\o/~~''': Waving (head with arms raised and motion squiggles) or drowning (head with arms raised and waves of water). <br />
: Strong armpit odor (rarely). <br />
<br />
; '''*\o/*''': Head with two upraised arms and pompoms: cheering. <br />
<br />
; '''*****\*o/''': Head with two upraised arms and a line of asterisks: running around, either with head on fire, or waving a feather boa. (Inherited from LiveJournal volunteer IRC.) <br />
<br />
; ''':U''', '''8U''', ''':V''': 3/4 profile face with mouth open<br />
<br />
== Other Emoticon Resources ==<br />
[http://en.wikipedia.org/wiki/List_of_emoticons Wikipedia list of emoticons]<br />
<br />
=Other Resources=<br />
== Cultures ==<br />
;[http://fanlore.org/wiki/Wiki Fanlore fandom wiki]: Information on selected public forms of fannish expression, in convenient wiki format. From the Organization for Transformative Works folks. <br />
; [http://geekfeminism.wikia.com/wiki/Geek_Feminism_Wiki Geek Feminism wiki]: A resource for and about women and people who are perceived as women in geek communities.<br />
<br />
== Jargon == <br />
;[http://catb.org/jargon/ Jargon File]: Many words from a gentler, more precise era of technology, although some are still in use today. <br />
;[http://wiki.livejournal.org/index.php/Category:Support_Jargon LiveJournal Support jargon]: there is some overlap of vocabulary due to the number of volunteers and IRC inhabitants who are former or current LiveJournal volunteers. <br />
; [http://knowyourmeme.com/ Know Your Meme]: Various bits of internet culture, sometimes the sort you'd find in a petri dish. <br />
;[http://www.urbandictionary.com/ Urban Dictionary]: Let the reader beware. (Often not safe for work -- or for other things, for that matter.)<br />
;[http://www.sassydoesit.com/glossary/knitting-definitions/ Sassy Does It's Knitting Definitions] <br />
;[http://www.ravelry.com/wiki/pages/KnittingLingo Glossary: Ravelry and Knit and Crochet Lingo and Acronyms] (more extensive, however login is required, although accounts are free)<br />
<br />
== QDBs == <br />
<br />
QDB stands for "Quotes Database". <br />
<br />
;[http://qdb.dreamwidth.net/ Dreamwidth IRC QDB]: A collection of quotes from Dreamwidth's [[IRC]] channels<br />
; <dwcomm>metaquotes</dwcomm>: Hilarity from around Dreamwidth, after the example of <ljcomm>metaquotes</ljcomm><br />
;[http://qdb.unmutuals.com/ LiveJournal Support QDB]: Contains many quotes from the shared past of volunteers who originated in LiveJournal volunteer culture. (<strong>Note</strong>: This is a mirror hosted by <dwuser>idonotlikepeas</dwuser>, as the original is gone, likely forever.)<br />
;[http://www.bash.org/ bash.org]: A much larger, multi-network IRC quotes database. Contains notably uncensored language and potentially offensive content.<br />
; http://qdb.us/: Another QDB, a fork of the same source file as bash.org<br />
<br />
== Miscellaneous ==<br />
; [http://www.imdb.com IMDb]: the Internet Movie Database, with more information than you knew you needed to know about movies, TV shows, actors, directors, plots, and more. <br />
; [http://en.wikipedia.org Wikipedia]: A user-updated encyclopedia of everything notable in the world. Not generally accepted for academic research, nor updated frequently enough for current events, but good for background reading, general overviews, and a list of preliminary sources for proper research. <br />
; [http://www.freebase.com Freebase]: an open database of variously useful information. Now owned by Google. <br />
<br />
[[Category: Getting Started]]</div>Shadowspar//wiki.dreamwidth.net/wiki/index.php/Things_Real_Dreamwidth_Programmers_DoThings Real Dreamwidth Programmers Do2013-06-15T19:59:22Z<p>Shadowspar: /* Forget How Things Work (and just forget things) */ +support notification usually requires a support-notify worker ^_^;</p>
<hr />
<div><br />
Wading into an open source project for the first time can be intimidating. There's a tendency to put established open source programmers up on a pedestal, especially when evaluating one's own abilities in comparison. (Hello, [http://geekfeminism.wikia.com/wiki/Impostor_syndrome impostor syndrome]!) <br />
<br />
Real Open Source Programmers are the ''crème de la crème'', the best of the best, the veritable titans of the programming world, right? They never make mistakes; they write flawless SQL queries in their sleep; they instantaneously comprehend any and all code they survey. Surely no mere mortal could ever hope to enter their exalted domain.<br />
<br />
Reality, of course, is far, far removed from this caricature. Real Open Source Programmers are humans like the rest of us, with the same foibles, insecurities, and quirks common to all. Very few contributors have supernatural abilities, decades of programming experience, or an encyclopedic knowledge of computing arcana, and we are all far, far from perfect. =)<br />
<br />
Thus, when <dwuser>azurelunatic</dwuser> shared the IRC logs of a marvellous [http://azurelunatic.dreamwidth.org/6731755.html Dreamwidth Dev Pep Talk], <dwuser>jeshyr</dwuser> [http://azurelunatic.dreamwidth.org/6731755.html?thread=12381163#cmt12381163 came up with the idea] of collecting an Epic List of Things Real Dreamwidth Programmers do. If you're a new or new-to-DW contributor, hopefully the list below will help disabuse you of any notion that you're somehow "not good enough" to contribute code -- '''you are more than good enough, and your contributions are heartily welcomed'''. And if you program, design, sysadmin, or interact with computers in any way, feel free to add any anecdotes you might have -- either signing your name or not. <br />
<br />
With that, we present the '''Epic List of Things Real Dreamwidth Programmers Do'''.<br />
<br />
<br />
== Ask for Help ==<br />
* I cannot count the number of times I asked someone who knew more about the documentation system how to do something, or to double-check to make sure I got it right. - <dwuser>azurelunatic</dwuser><br />
* It's the rare code tour that I can complete without at least once asking what some bug was about. That's some deep, deep magic. - <dwuser>azurelunatic</dwuser><br />
* I'd like to patch this bug! Or try to! Really, I would! But... ''where do I find the existing code for it''??? ;_; - <dwuser>kaberett</dwuser><br />
<br />
== Make Mistakes ==<br />
* Forgot that you can't treat a null as a zero enough times that I printed out "Null To Zero" in a fancy font with an ornate border, and stapled it to my wall as a reminder. - <dwuser>azurelunatic</dwuser><br />
* Started the arguments of a mailto: link in a wiki with an ampersand instead of a question mark, got garbage results after the address when testing it, blamed the (touchy, obscure, belligerent) mail application to its developers, and was schooled on my mailto: syntax in front of an audience of about 1,300. - <dwuser>azurelunatic</dwuser><br />
* For bug [http://bugs.dwscoalition.org/show_bug.cgi?id=4282 4282], I misunderstood what the request in bugzilla was asking and what the current behaviour was, and so my patch didn't fix what it was meant to fix AND it didn't even actually fix what I thought it was meant to fix! So it was doubly broken ... and then I got sick and had to unassign the bug, so I never got it fixed. - <dwuser>jeshyr</dwuser><br />
* Stare at a typo for over an hour before noticing it - <dwuser>deborah</dwuser> ([http://qdb.dreamwidth.net/dw/363 from qdb])<br />
* ... because you took a huge dose of meds and decided this was the best state to code in. - <dwuser>kaberett</dwuser><br />
<br />
== Forget How Things Work (and just forget things) == <br />
<br />
* I feel like I end up looking up most Perl functions with <tt>perldoc -f ''function_name''</tt> every time I use them. Especially <tt>open</tt> and <tt>split</tt>, for some reason. O_o - <dwuser>shadowspar</dwuser><br />
* Have to look at the Template Toolkit documentation every time I have to do anything -<dwuser>exor674</dwuser> ( I should note that I am in charge of the BML to TT conversion )<br />
* About half the time, the morning after I write something I have to figure out what I did and how the hell it works ... it never stays in my brain! - <dwuser>jeshyr</dwuser><br />
* I try to keep track of what features have actually been implemented, and what ones are still waiting, but I forget all the time. Then these get mixed in with things that LiveJournal has developed since the code fork, and again mixed with things that the shared codebase used to do, but doesn't anymore since it was ripped out by the bytes by whichever dev had the code-machete that week. - <dwuser>azurelunatic</dwuser><br />
* The best thing is when I think "Oh, we should totally do this thing," and then one of several things happen. One, there's already a suggestion for it. Two, the suggestion's already been migrated to Bugzilla. Three, <em>I was the one who suggested it</em>. Four, when it's actually already been implemented. Five, when all of the above is true -- and <dwuser>denise</dwuser> lets the post to <dwcomm>dw_suggestions</dwcomm> through anyway, because she forgot too. I have lost count of how many times that's happened. - <dwuser>azurelunatic</dwuser><br />
* I work with R scripts in my "day job", and I keep trying to write Perl in R, and R in Perl. Neither works too well. - <dwuser>swaldman</dwuser><br />
* I filed a bug at work today. This is how that went: First, I noticed a little glitch with the Move Message dialog, which had been bugging me subconsciously for weeks, and just then floated to the top. I thought maybe I should file a help ticket, but thought that I'd filed enough help tickets for a while and this was minor, so I might as well save them the trouble and look for duplicates first. So I went to that product's bug tracker and searched for the most obvious keyword, which had 400 results. So I added the next most obvious keyword, which narrowed it down to about 90. Then I went down the list and started opening things in tabs, including two that by their titles looked like they might be duplicates of each other, but were entirely unrelated to what I was complaining about. After that, I read through the tabs I'd just opened, and found nothing that looked like the bug I was encountering. Then I looked at the two that might have been duplicates of each other, and found that they were in fact nothing at all alike except in the title. Then I looked at some of the other bugs that could have been duplicates of those, but those weren't very interesting. Reading through all those bugs had given me another couple useful keywords to try, so I tried that and got only about 10. Those were really quick to read through, so I did. And I closed the last tab from the bug tracker. Then I closed the help page, because I couldn't remember why I'd opened it, and obviously it was not for any good reason if I couldn't remember. Then I went back to my email and noticed that for some reason I'd stopped in the middle of moving a message. "Huh, that's weird," I thought. I looked briefly at the message to figure out where I wanted to move it. I looked at the dialog, which had been recently changed to retain the last folder that I'd moved something to, in case I was doing it a lot. I noticed that I couldn't see the highlight, and couldn't remember what it was. "That's obnoxious, I should file a bug," I said; "I can never remember anything like that longer than 30 seconds." I opened up a tab for a helpdesk ticket, and then realized what I'd just done. Yesterday I'd described my workflows to a dev as "Imagine severe ADHD, and people banging pots and pans in the background", and I stand by that description. - <dwuser>azurelunatic</dwuser><br />
* I know what I'm doing unless it means that forgetting the obvious will cause me to waste a few hours in which case I am guaranteed to forget the obvious >:| - <dwuser>mark</dwuser> (from http://qdb.dreamwidth.net/dw/602)<br />
* "my only weakness while adminning and drinking is bind. I can do anything else, and I can edit zonefiles without messing them up, but i can NEVER remember to increment the serial number." - <dwuser>dive</dwuser>(from http://qdb.dreamwidth.net/dw/430)<br />
* Note to self: support notification messages arrive a lot faster if there is a <tt>support-notify</tt> worker running. ^_^; <dwuser>shadowspar</dwuser><br />
<br />
== Forget Their Password ==<br />
* And their usernames. And other essential details.<br />
* I not only forgot my Github password, I forgot the email address I'd registered with them! I had to email support (thankfully they were lovely about it). I also regularly forget to put the dh- in front of my Dreamhack username! -<dwuser>randomling</dwuser><br />
* This evening, I had to search email for how to log into my dreamhack, I had to try three passwords before I got the right one. Then I stared blankly at the Github password prompt and took some time to remember whether I even had a Github account. -<dwuser>kaberett</dwuser><br />
<br />
== Break Production (the Live Website) == <br />
<br />
* Kicked over production Apache at work the other day when I thought I was merely recycling the dev website. oops... - <dwuser>shadowspar</dwuser><br />
* Break the site (momentarily) during open beta launch: http://qdb.dreamwidth.net/dw/123<br />
* I was trying to update some software on one of our production databases and wasn't paying very close attention. I typed 'yes' when prompted "Really uninstall mysql-server?" I quickly failed over to the other database and reinstalled it, but... oy. <dwuser>mark</dwuser><br />
* Honestly, the ways in which I've abused production due to fat-fingering a command or thinking "I'll just test this live real fast"... <dwuser>mark</dwuser><br />
*Forget to restart memcached after a database crash, buy new servers because the site was slow (hey! we got new servers!)<br />
<br />
== Break Sundry Other Things ==<br />
<br />
* My first act at one of my early contracting gigs: creating a mail routing loop that made our own servers bury themselves under a deluge of junk email - <dwuser>shadowspar</dwuser><br />
* Break things in their development environments. <br />
* Break the development environments (and associated infrastructure) themselves. <br />
* Back in the days (!!) of Mercurial Queues, I managed to mess up deleting patches that had been committed from my Dreamhack so badly that it took a lot of WTFing and a goodly amount of new documentation to sort it out without losing all my part-finished patches - <dwuser>kaberett</dwuser><br />
<br />
== Shoot Themselves in the Foot == <br />
<br />
* Starting to rewrite a helper script. Think "What version of Perl does the DW codebase require?" Ah! Find it [http://dw-dev.dreamwidth.org/120658.html requires 5.10]. Great, I can use the features that are new in 5.10! Write up a [http://wiki.dwscoalition.org/wiki/index.php/Suggested_Server_Requirements#Perl_5.10 note in the wiki] saying that Perl 5.10 is required, but it's unlikely to be a problem because any machine running 5.8 or earlier is likely to be quite decrepit indeed. Return to script, finish it, give it a try. Script refuses to run. Error message: <tt>'''Perl v5.10.0 required--this is only v5.8.9.'''</tt> <dwuser>shadowspar</dwuser><br />
* I just didn't have time to figure out a real, proper way to solve the problem, so I did something nasty and clunky that happened to work - dive-o ([http://qdb.dreamwidth.net/dw/432 from qdb])<br />
<br />
== Overcommit Themselves ==<br />
<br />
* Time elapsed between me showing up on DW and saying I wanted to contribute code, and actually submitting my first patch: about three years. ^_^; - <dwuser>shadowspar</dwuser><br />
* Assigning bugs to oneself in a fit of hopefulness, realise you can't manage them and sadly unassigning. Rinse, repeat :) - <dwuser>jeshyr</dwuser><br />
* Pick up an effort-minor bug, stare at it for a while, start hashing out a spec in bugzilla comments, and before you know it end up with an entire <dwuser>dw_dev</dwuser> discussion post about what you're ''actually'' trying to achieve, with reference to several ISO standards... and then bury your head in the sand and pretend none of it ever happened. - <dwuser>kaberett</dwuser><br />
<br />
== Get Fed Up ==<br />
<br />
* Today in IRC, <dwuser>denise</dwuser> was letting <dwuser>fu</dwuser> know about her recent pull request submitting a patch for [http://bugs.dwscoalition.org/show_bug.cgi?id=1386 bug 1386] with these words: "i gave you a PR for the revert-the-color-changes but my dw-nonfree branch is f***ed somehow so i probably screwed it up. can you take pity on me and just redo the changes on your end to commit them? [...] i'm probably going to have to do something awful to the damn thing to make it work again". I find it very reassuring that even our admins want to throw their computers out the window sometimes! - <dwuser>jeshyr</dwuser><br />
* I inherited a series of Excel spreadsheets trying to do a database's work, and by the end of my first time soloing, I threw a kicking, screaming tantrum & swore I'd never touch it again. My reward for this was to then build a database (with a grand total of 3 intro to db classes under my belt, plus the Microsoft help system) in Access, which meant untangling my predecessor's formulae, discovering her possibly civilly liable shoddy math, teaching myself more than I ever wanted to know about databases -- and ultimately never fully finishing it, as the company shut down my location. It was still better than dealing with that goddamn thing. - <dwuser>azurelunatic</dwuser><br />
<br />
== Get Scared ==<br />
<br />
* I ask for reassurance ALL the time, usually via the IRC channel. Hell, I even asked for reassurance before creating this category in this document ... how silly is that?? - <dwuser>jeshyr</dwuser><br />
* I spend a good week asking people to hold my hands and cheerlead me before every time I get going with a patch. Hell, I'm so terrified of git that I've not submitted a single patch since we started the migration - it took me months to work up the courage to migrate my [[Dreamhack]], never mind actually ''use'' git! - <dwuser>kaberett</dwuser><br />
<br />
== Complain ==<br />
<br />
* A ''lot''<br />
* In IRC<br />
* Out loud when the code is not making sense (as some sections of it frequently fail to do)<br />
* Including wondering what elder god infested Brad's head when he wrote ''THAT'' omg<br />
* At code they wrote themselves just six months ago but never got around to properly commenting<br />
* The good part to swearing in Chicken at work is that nobody's going to understand the words, just the tone of voice. The bad part is, now I am the lunatic making chicken noises at work. - <dwuser>azurelunatic</dwuser><br />
<br />
== Help Others == <br />
<br />
* I'm kind of thrilled when someone asks for help with the code tour and I can actually sort-of explain what some of the fixes do. ^_^; - <dwuser>shadowspar</dwuser><br />
* Spend two straight days rummaging around with ''something'' or other, and in a fit of FOR CRYING OUT LOUD write up some documentation for the wiki so at least the next person doesn't have to reinvent the wheel - <dwuser>kaberett</dwuser><br />
* Spent seriously like a week trying to look up over and over all the commands in the wiki for upgrading code, updating the database, using the version control, etc. and finally decide it was easier to just write a huge enormous [http://dw-dev.dreamwidth.org/94822.html omnibus script] to remember them for me. The fact it helps other people is fun, too! - <dwuser>jeshyr</dwuser><br />
* Realise that someone really ''hates'' a particular task that you'd find at worst pleasantly soothing, and take it off their hands. - <dwuser>kaberett</dwuser><br />
<br />
== Learn == <br />
<br />
* Better than half of our contributors have never programmed in Perl before, never contributed to an Open Source project before, or never programmed before, at all, period. I think that's amazing. ([http://denise.dreamwidth.org/23600.html ref]) - <dwuser>shadowspar</dwuser><br />
* I constantly learn things from people. Frontend stuff is a mystery to me, so I am always learning when I read patches submitted by our styles people. "Oh, CSS can do that? Woah." I still don't understand most of it. - <dwuser>mark</dwuser></div>Shadowspar//wiki.dreamwidth.net/wiki/index.php/English-strippingEnglish-stripping2013-06-15T03:12:11Z<p>Shadowspar: +Category:Translation</p>
<hr />
<div>[[Category:Development]]<br />
English-stripping a page refers to the process of taking out hardcoded English text from the BML pages, giving them an ID you can use to refer to the string, and then putting the original English text in a lookup file. In this way, you're stripping the BML files of any English text, hence the name. This is useful because by doing this, it's easy to support multiple languages; the text for different languages is held in the database and can be looked up by the aforementioned ID.<br />
<br />
Although Dreamwidth Studios itself won't be supporting any language other than English, it's still important to learn how to English-strip pages as it means our Site Copy team can change text as necessary on the site without having to go through the code, and also because we want other users of the code to be able to implement other languages if they want to with the minimum of hassle. (for both of these reasons, we're also going to be replacing the current translation system with something better - although to be perfectly honest, that's not going to be ''too'' hard.)<br />
<br />
== Glossary ==<br />
<br />
First, a bit of explanation about some of the terms we're going to use:<br />
<br />
* '''String''': this refers to a piece of text. For example, this sentence can be considered a string. We'll normally use this when referring to the text that a multi-language ID refers to (defined below).<br />
<br />
== The Anatomy of a Multi-Language ID ==<br />
<br />
The IDs that replace English text in a BML page are referred to as Multi-Language IDs. There are two types of ID - global IDs (which can be used by any BML page) and page-specific IDs (which are only valid on one page). When you English-strip a file, you will almost always be using page-specific IDs, but it's helpful to know about global IDs anyway.<br />
<br />
=== Global IDs ===<br />
<br />
Global IDs are, for the most part, defined in <code>bin/upgrading/en.dat</code>. However, for features specific to Dreamwidth Studios (and unusable by any other site using our code), any corresponding global IDs will be defined in <code>bin/upgrading/en_DW.dat</code> instead. For example, the Tropospherical sitescheme strings are stored in <code>en_DW.dat</code> since Tropospherical is specific to DWS, and because the strings appear in every page, page-specific IDs can't be used.<br />
<br />
A global ID looks something like this:<br />
<br />
date.month.december.short<br />
<br />
You'll notice this ID is split into several parts with dots. This helps to know precisely how the string is being used; ideally, each separate part should be a subset of the part before it in some way. In this example, <code>month</code> is part of <code>date</code>; <code>december</code> is a <code>month</code>, and <code>short</code> means the short version of how to say this month. (in this example, it's "Dec" in the English text; there's a corresponding <code>long</code> version too, which is simply "December").<br />
<br />
Each section name should be lower-case and use only letters, digits, and the underscore and hyphen characters. (There aren't actually any set rules for the characters you can use in IDs in the code, but this is how it's been done so far.) The number of sections in an ID is arbitrary, as are the section names themselves. However, you should always have at least two sections in an ID for ease of use.<br />
<br />
=== Page-specific IDs ===<br />
<br />
Page-specific IDs are defined in a file of the same name as the page it applies to with the additional extension <code>.text</code>. For example, for a page '''htdocs/login.bml''', the corresponding page-specific ID file will be '''htdocs/login.bml.text'''.<br />
<br />
Page-specific IDs begin with a dot, and thereafter follow the same rules as global IDs. For example, one of the strings in the <code>htdocs/login.bml.text</code> file in '''dw-free''' has this ID:<br />
<br />
.createaccount.header<br />
<br />
Generally, in page-specific IDs, the names you'll use for your sections will correspond to the sections of the page in question. So this ID, for example, refers to the header of the section that invites the user to create an account if they don't already have one.<br />
<br />
Again, the actual names and number of sections is arbitrary, but you should always have your IDs follow the structural flow of the content of the page for ease of use.<br />
<br />
== The Anatomy of a .text File ==<br />
<br />
There isn't too much to learn about how a '''.text''' file works - it's pretty straightforward. For each ID referenced in the page, you put the name of the ID, an equals sign (=), then the English text stripped from the file. (We'll talk about how precisely to do that in the next few sections.) Ideally, you should have one string correspond to one unbroken line of English. (This doesn't mean just one ''sentence'' - it's perfectly valid to have whole paragraphs under one ID. Just make sure you don't have any HTML in a string, unless it's part of a sentence. (ie, don't include wrapping <code>&lt;p&gt;</code> tags, etc.)<br />
<br />
For example, the <code>.createaccount.header</code> page-specific ID referred to in the last section is defined in the '''.text''' file like so:<br />
<br />
<nowiki>.createaccount.header=Not a <?sitename?> member?</nowiki><br />
<br />
(the <code>&lt;?sitename?&gt;</code> part of this is a [[BML]] tag; for more information on these, see the linked page.)<br />
<br />
It's possible to have a multi-line string in a '''.text''' file. You should never need to do this in a page-specific ID, but if you do, you simply replace the equals sign with two less-than signs (&lt;&lt;), and end the string with a dot on its own line. For example, here's the definition for the global ID <code>email.invitecoderequest.accept.body</code>:<br />
<br />
<nowiki>email.invitecoderequest.accept.body<<</nowiki><br />
Your request for invites has been granted. You can view all your invite codes here:<br />
<br />
<nowiki> [[invitesurl]]</nowiki><br />
.<br />
<br />
All IDs should be listed in alphabetical order, if possible.<br />
<br />
== English-stripping ==<br />
<br />
You might think, after learning the above, that English-stripping a page is fairly easy - and in theory, it is. In practice, however, you need to know at least something about how both Perl and HTML work.<br />
<br />
=== How to English-strip: The Theory ===<br />
<br />
In theory, English-stripping a page in BML is easy. BML has specific tags for English-stripping, which means that in a ''normal'' BML page you would normally be able to follow a simple set of steps:<br />
<br />
* Identify the text to be stripped. For example, you may have a line in your BML page that says:<br />
<nowiki><p>Enter your invite code below:</p></nowiki><br />
: In this part, the English text to be stripped is "Enter your invite code below:".<br />
<br />
* Cut and paste this out, and replace it with an <code>&lt;?_ml ... _ml?&gt;</code> tag, where "..." represents a multi-language ID, as described above. Remember, page-specific IDs always begin with a dot.<br />
<br />
: For example, this one might be <code>.createaccount.enter_invite_code</code>, in which case your replaced line will be:<br />
<nowiki><p><?_ml .createaccount.enter_invite_code _ml?></p></nowiki><br />
<br />
* Put the line into the corresponding '''.text''' file, as described above:<br />
<br />
.createaccount.enter_invite_code=Enter your invite code below:<br />
<br />
* You're done. Rinse and repeat.<br />
<br />
=== How to English-strip: The Reality ===<br />
<br />
Unfortunately, English-stripping is rarely as easy as the theory goes, for several reasons:<br />
<br />
* Most of the Dreamwidth BML files are actually glorified Perl scripts and have virtually nothing in them that isn't Perl code of some description, and the above may not work.<br />
* Even when this isn't the case, sometimes you'll want to be able to specify parts in the text that you don't know what the value will be when you're doing the stripping - for example, the username of the currently logged-in user. This isn't possible using the <code>&lt;?_ml ... _ml?&gt;</code> tag, and needs to be done with Perl.<br />
* Some things that look like English text that should be stripped are actually signals to the code to take a certain action. For example, you can safely assume that any value within a hidden INPUT tag is probably not one that should be stripped, regardless of how English it looks. (You can always ask one of our resident code gurus in [[IRC]] if you're not sure, though.)<br />
<br />
So it's pretty much assured that in order to be able to English-strip, you need to know a little about how Perl works. (Not too much!) I'll go over these basics here.<br />
<br />
==== A basic example ====<br />
<br />
In Perl, literal text strings (that is, text which is mostly left unchanged) are represented by surrounding quote marks. For example:<br />
<br />
<source lang="perl"><br />
"Enter your invite code below:\n"<br />
</source><br />
<br />
The "\n" in this example is called a 'newline', and signals to Perl that it should start a new line when it encounters it. (This won't appear as a new line in a browser unless a tag like '''&lt;p&gt;''' or '''&lt;br&gt;''' is used, but can be helpful to keep the source tidy.)<br />
<br />
The string itself may be surrounded on the same line by other Perl code, such as:<br />
<br />
<source lang="perl"><br />
$ret .= "Enter your invite code below:\n";<br />
</source><br />
<br />
In these examples, the string is highlighted in red. Your aim here is to get this string English-stripped.<br />
<br />
Now, in cases like this, where the entire string is English text and is an unbroken line, you can normally actually do this according to the theory:<br />
<br />
<source lang="perl"><br />
$ret .= "<?_ml .createaccount.enter_invite_code _ml?>\n";<br />
</source><br />
<br />
<!-- FIXME: Add information about $ML{ ... } here, I completely forgot about it on the first draft of this. --><br />
<br />
Be sure to keep the quote marks and newline around it; these are important, and you shouldn't add any of these to your string in the '''.text''' file. Then, you can add the line to the '''.text''' file as described in the theory example, and you're done.<br />
<br />
(note that while this is generally okay, there are some cases where it may not work. In those cases, you should use the Perl function described in the next section instead.)<br />
<br />
==== The BML::ml Perl function ====<br />
<br />
If you try the above on a piece of code and it doesn't work, you may need to use the <code>BML::ml</code> Perl function instead. This performs much the same task as the <code>&lt;?_ml ... _ml?&gt;</code> tag, but in Perl.<br />
<br />
The way you'd use the function for the above string is as follows:<br />
<source lang="perl"><br />
BML::ml( ".createaccount.enter_invite_code" )<br />
</source><br />
<br />
The function itself isn't used in a literal Perl string, so it doesn't need quotes around it. However, the newline "\n" character *does* need to be in a literal string with quotes around it, which means you need to combine the two. This is done using a dot - <code>.</code> - which is how you tell Perl to combine a literal string and something else. This is how it would end up:<br />
<br />
<source lang="perl"><br />
$ret .= BML::ml( ".createaccount.enter_invite_code" ) . "\n";<br />
</source><br />
<br />
==== Unknown data ====<br />
<br />
Sometimes, there will be parts of a string which contain information that you can't specifically know when you're English-stripping, such as the username of the logged-in user. For example, the code might say something like:<br />
<br />
<source lang="perl"><br />
$ret .= "$u->{user}, enter your $LJ::SITENAMESHORT invite code:\n";<br />
</source><br />
<br />
In the actual HTML output, this might look something like:<br />
<br />
sophie, enter your Dreamwidth invite code:<br />
<br />
Even though the "$u->{user}" and "$LJ::SITENAMESHORT" parts in this example are highlighted in red, you can tell they're pieces of data by the dollar sign; anything in a string that starts with a dollar sign is data that needs to be kept somehow. You don't ''need'' to understand what the names mean in order to English-strip them, just the way they're used. (Of course, if you do understand them, it'll be easier to give them meaningful labels.)<br />
<br />
(yes, the above example is rather contrived, since if you're logged in you wouldn't be entering an invite code anyway. Just bear with me on this one, it's only an example.)<br />
<br />
In order to use a piece of data in a multi-language string, you need to assign it a label. For example, for the first piece, let's call it "username". Then, you take the data part exactly as written (including the dollar sign), and combine the two with <code>=&gt;</code>:<br />
<br />
<source lang="perl"><br />
username => $u->{user}<br />
</source><br />
<br />
The above means that the label 'username' should have the value of whatever $u->{user} comes out to be.<br />
<br />
If you have multiple pieces of data, as above, you can use commas to separate them; simply copy the above format and separate them with a comma. For example, let's assign the site name a label of "sitename":<br />
<br />
<source lang="perl"><br />
username => $u->{user}, sitename => $LJ::SITENAMESHORT<br />
</source><br />
<br />
You then surround the whole thing with braces:<br />
<br />
<source lang="perl"><br />
{ username => $u->{user}, sitename => $LJ::SITENAMESHORT }<br />
</source><br />
<br />
You then need to use the <code>BML::ml</code> function, described above, and in addition to giving it the multi-language ID, you need to also give it the data itself:<br />
<br />
<source lang="perl"><br />
$ret .= BML::ml( ".createaccount.enter_invite_code",<br />
{ username => $u->{user}, sitename => $LJ::SITENAMESHORT }<br />
) . "\n";<br />
</source><br />
<br />
Note that in this example, I've split the line into three lines in the middle of the line. Perl is perfectly happy with this as long as you do it in the right place - for example, not in the middle of a literal string. You could write the above as a single line if you wanted:<br />
<br />
<source lang="perl"><br />
$ret .= BML::ml( ".createaccount.enter_invite_code", { username => $u->{user}, sitename => $LJ::SITENAMESHORT } ) . "\n";<br />
</source><br />
<br />
...but it's not really very easy to read, so for this example I've split it.<br />
<br />
The key thing to note here is that after the multi-language ID, I've put a comma, then pasted the notation we constructed above after it, while still inside the parentheses of the BML::ml() function. After that, we continue on as normal - the closing parenthesis, and the newline character.<br />
<br />
We're now done for the Perl part of it, and we now need to add the text to the '''.text''' file. Fortunately, this is a lot easier; when you need to put data in a string, simply refer to its label surrounded by two square brackets. The above string would be represented in the '''.text''' file as follows:<br />
<br />
<nowiki>.createaccount.enter_invite_code=[[username]], enter your [[sitename]] invite code:</nowiki><br />
<br />
We're done. Yay!<br />
<br />
===== Plurals and numbers =====<br />
<br />
These are described in excruciating detail in [[Embedding plural forms into translations]], but here's a quick example:<br />
<br />
<source lang="perl"><br />
$ret .= "You have $num message" . ( ( $num != 1 ) ? 's' : '' ) . " in your inbox.";<br />
</source><br />
<br />
You could use a variable for the plural, like this:<br />
<br />
<source lang="perl"><br />
$ret .= BML::ml( ".inbox.num_msgs",<br />
{ num => $num, plural => ( $num != 1 ) ? 's' : '' }<br />
);<br />
</source><br />
<br />
<nowiki>.inbox.num_msgs=You have [[num]] message[[plural]] in your inbox.</nowiki><br />
<br />
However, this would still be baking English into the source code - not actual English text in this case, but English grammar in the form of singular and plural inflections. Instead, you can use:<br />
<br />
<source lang="perl"><br />
$ret .= BML::ml( ".inbox.num_msgs", { num => $num );<br />
</source><br />
<br />
<nowiki>.inbox.num_msgs=You have [[num]] [[?num|message[messages]] in your inbox.</nowiki><br />
<br />
This takes care of applying the rules for English plurals for you, and lets translators (with help from some magic in LiveJournal and Dreamwidth source code) handle it appropriately by just specifying a text string for their language, without having to muck around in the Dreamwidth source code - which is, after all, the goal of the translation system.<br />
<br />
==== Split strings ====<br />
<br />
If you've been paying attention, you might notice that the original string above:<br />
<br />
<source lang="perl"><br />
$ret .= "$u->{user}, enter your $LJ::SITENAMESHORT invite code:\n";<br />
</source><br />
<br />
...could just have easily have been written like this:<br />
<br />
<source lang="perl"><br />
$ret .= $u->{user} . ", enter your " . $LJ::SITENAMESHORT . " invite code:\n";<br />
</source><br />
<br />
...that is, the actual data is no longer part of the literal text string, but joined. Perl will accept either way of doing it (with a few exceptions that aren't important here), and as such it's important to note that sometimes you'll come across examples of the latter sort. These are still all parts of the same string, and should be handled in exactly the same way as above. In particular, you should try to avoid having parts of sentences in a multi-language string. For example, you '''should not''' do this in your '''.text''' file:<br />
<br />
.createaccount.enter_invite_code.part1=, enter your <br />
<br />
.createaccount.enter_invite_code.part2= invite code:<br />
<br />
This is not only because it looks ugly, but also because some (human) languages don't work that way; for example, in some languages the name of the person you're addressing may need to come at the end, after the site name. By doing it this way, that becomes impossible. We should be as flexible as possible when it comes to where different terms may come in a sentence.<br />
<br />
==== Heredocs ====<br />
<br />
Sometimes, you'll come across Perl constructs that look something like this:<br />
<br />
<source lang="perl"><br />
$ret .= <<HTML;<br />
</source><br />
<br />
...followed by a block of text that isn't Perl code, followed by an "HTML" on its own line (or whatever was after the &lt;&lt; in the original line). This format of text is known in Perl parlance as a "heredoc". If you can replace any text in there with <code>&lt;?_ml ... _ml?&gt;</code> tags, and it works, you should do so. However, if any need the use of the <code>BML::ml</code> function, it's probably best to have someone look at it who codes Perl, since these require care in order to get right. (Of course, if you know Perl and know how to fix it, go ahead; otherwise, just make a note of it and move on.)<br />
<br />
==== HTML forms ====<br />
<br />
Sometimes, you'll come across text that needs to be stripped in HTML forms. For example, in the following example the contents of the <code>&lt;p&gt;</code> tag and the value of the submit button need to be English-stripped:<br />
<br />
<source lang="html4strict"><br />
<form method="post" action="create.bml"><br />
<input type="hidden" name="mode" value="codesubmit"><br />
<p>Enter your invite code:</p><br />
<input type="text" name="invite" size="20" maxlength="20"><br />
<input type="submit" value="Create Account"><br />
</form><br />
</source><br />
<br />
Notice that we do *not* want to English-strip:<br />
<br />
* '''name="invite"''': The word "invite", although English, is being used here as a field name, and is not shown to the user. The code will be looking out for a field called "invite" no matter what language the user is using, so this must not be changed.<br />
* '''value="codesubmit"''': Same as above - this value is used by the code.<br />
<br />
However, the value of a submit button (in this case, "Create Account") *is* shown to the user (as this is what's shown on the button itself), and thus needs to be English-stripped, despite being in a <code>value</code> attribute.<br />
<br />
There is one exception to this. If you find a submit button with a "name" attribute, check to see if there are any more. If any two submit buttons have the same 'name' attribute, such as:<br />
<br />
<source lang="html4strict"><br />
<input type="submit" name="action" value="Rename"><br />
<input type="submit" name="action" value="Delete"><br />
</source><br />
<br />
...then '''do not''' English-strip it, and make a note for whoever reviews your patch that this will need to be fixed. (This is because the code will be checking for the value of whatever button is clicked on, and that prohibits English-stripping from taking place; if you were to English-strip the value here, it would no longer work for non-English users.)<br />
<br />
If you do not find two submit buttons with the same 'name' attribute, but there is nonetheless still a 'name' attribute on at least one, make a note for the reviewer that this is the case, but go ahead and English-strip it as normal. (The reviewer will check to see whether the code is actually checking for this value.)<br />
<br />
== Fin ==<br />
<br />
That's basically the guide for how to English-strip a page. Don't be too afraid of messing things up; a reviewer will tell you if you have anything wrong.<br />
<br />
[[Category:Translation]]</div>Shadowspar//wiki.dreamwidth.net/wiki/index.php/Cheat_SheetCheat Sheet2013-06-09T02:13:36Z<p>Shadowspar: /* On an entry */ +style=foo</p>
<hr />
<div><br />
== On a journal page ==<br />
<br />
Journal page listing access/security filters to use:<br />
<br />
http://USERNAME.dreamwidth.org/security/<br />
<br />
== On an entry ==<br />
<br />
To use flat comments instead of threaded:<br />
<br />
?view=flat<br />
<br />
<br />
To manually select the style to view the page in:<br />
<br />
?style=mine<br />
?style=site<br />
?style=lynx <br />
...<br />
<br />
== On a community ==<br />
<br />
To filter down entries on a community to those from a certain person:<br />
<br />
?poster=USERNAME<br />
<br />
== On site scheme pages ==<br />
<br />
To see the ML label instead of the translation text:<br />
<br />
?uselang=debug<br />
<br />
[[Category: Index]]</div>Shadowspar//wiki.dreamwidth.net/wiki/index.php/ScreenScreen2013-06-08T17:13:42Z<p>Shadowspar: +multiuser screen docs</p>
<hr />
<div><br />
== Intro == <br />
<br />
<tt>screen</tt> is a tool that's best explained as a kind of session manager for the command line. It lets you do things like:<br />
<br />
* disconnect from a command-line session, but still leave it (and any commands in it) running<br />
* reconnect to a session, even after logging out and logging in again<br />
* share a session with multiple people (multiuser mode), so that everybody can see what you is doing -- for instance, for teaching folks how to do something<br />
<br />
== Starting screen ==<br />
<br />
You can simply run the command <tt>screen</tt> to start a new screen session. However, if you have several sessions on the go, or if you're going to have other people connecting to a session, it makes things easier if you give your screen session a name, eg<br />
<br />
screen -S styles-hacking<br />
<br />
<br />
== Command cribnotes == <br />
<br />
To give screen a command, first type the screen "command key". By default, it's <tt>ctrl-a</tt>.<br />
<br />
c create new window <br />
0-9 change to window 0-9<br />
ctrl-a toggle back to last seen window <br />
n next window<br />
p previous window<br />
" show a list of all windows<br />
<br />
A give the current window a name<br />
K kill the current window<br />
ctrl-\ (or :quit) kill all windows & quit<br />
<br />
d ''detach'' -- drop out to the shell, but leave your screen session running<br />
? help<br />
<br />
== Config ==<br />
<br />
The config file for screen is called <tt>.screenrc</tt> -- find or create it in your home directory.<br />
<br />
One of the nice things you can do is to set up screen to have a status bar on the bottom line. This shows you some useful info, but more importantly, shows that you're inside a screen session (as opposed to the usual plain command line). Example:<br />
<br />
hardstatus alwayslastline "%c:%s %M %d %H%? %l%? %1`"<br />
<br />
(Yes, this is totally a bunch of gibberish. Its meaning is in the screen docs, which I will one day read through so I can explain them here.)<br />
<br />
<br />
== Multiuser Mode ==<br />
<br />
Multiuser mode is great for teaching/learning how to do a complex task on the command line, or for pairing on code with someone over the internet.<br />
<br />
To enable multiuser mode so that other people can connect to your screen sessions, add these lines to your <tt>.screenrc</tt> : <br />
<br />
multiuser on <br />
acladd ''<list of users who should be able to connect>''<br />
<br />
So, for instance, on your dreamhack, you might have <br />
<br />
multiuser on <br />
acladd dh-sophie,dh-rahaeli,dh-afuna<br />
<br />
Then, other users can connect with: <tt>screen -x ''yourusername/sessionname''</tt>, eg<br />
<br />
screen -x dh-afuna/styles-hacking</div>Shadowspar//wiki.dreamwidth.net/wiki/index.php/ScreenScreen2013-06-08T16:52:44Z<p>Shadowspar: +start of a screen ref</p>
<hr />
<div><br />
== Intro == <br />
<br />
<tt>screen</tt> is a tool that's best explained as a kind of session manager for the command line. It lets you do things like:<br />
<br />
* disconnect from a command-line session, but still leave it (and any commands in it) running<br />
* reconnect to a session, even after logging out and logging in again<br />
* share a session with multiple people (multiuser mode), so that everybody can see what you is doing -- for instance, for teaching folks how to do something<br />
<br />
<br />
== Command cribnotes == <br />
<br />
To give screen a command, first type the screen "command key". By default, it's <tt>ctrl-a</tt>.<br />
<br />
c create new window <br />
0-9 change to window 0-9<br />
ctrl-a toggle back to last seen window <br />
n next window<br />
p previous window<br />
" show a list of all windows<br />
<br />
A give the current window a name<br />
K kill the current window<br />
ctrl-\ (or :quit) kill all windows & quit<br />
<br />
d ''detach'' -- drop out to the shell, but leave your screen session running<br />
? help<br />
<br />
<br />
== Multiuser Mode ==</div>Shadowspar//wiki.dreamwidth.net/wiki/index.php/Support_processSupport process2013-06-08T03:56:22Z<p>Shadowspar: +tagging section; link to relevant dw-support-training post</p>
<hr />
<div>This page reviews how the support board works, how to respond to requests (focusing on the technical side), what certain privileges allow one to do, and so forth.<br />
<br />
For policies on how to handle specific types of support requests, see [[Support guide]]. <br />
<br />
==The support board==<br />
<br />
The support board on Dreamwidth can be found at [http://www.dreamwidth.org/support/help Support Requests]. It's also known as "the board" or "the support board". You'll usually hear "the board", for the most part.<br />
<br />
This is a braindump of the basics of the support board, and is slowly getting updated to reflect how objects have settled during flight. Please bear with us! Things will be chaos and confusion, but we're ''very'' grateful for anyone who wants to spend time volunteering in support.<br />
<br />
==Types of user contacts==<br />
<br />
The support board tends to get a few distinct types of user contacts:<br />
<br />
* Someone needs to know how to do something on Dreamwidth, or has a question about whether or not something's possible. These requests are often handled with a reference to a FAQ; sometimes, they require more in-depth tutorials or instructions.<br />
<br />
* Someone is having a technical problem that they need help diagnosing and resolving. Sometimes this is a bug with the system itself; sometimes it's just that the user doesn't know how to use the functionality as provided; sometimes it's a glitch in their browser; sometimes it doesn't actually do what they think it does; sometimes it's a combination of all of the above. These requests tend to need multiple contacts to properly diagnose it, and it's likely that you'll need to start at the basics to rule out user error or confusion. (See the [[Support guide]] for some style tips on how to do that most effectively.)<br />
<br />
* Someone needs to get in touch with the site administrators (<dwstaff>mark</dwstaff> and <dwstaff>denise</dwstaff>) for whatever reason -- partnership opportunity, press inquiry, questions about Dreamwidth Studios the business, or questions or feedback on a Dreamwidth Studios action or policy. These should be transfered to the Feedback category.<br />
<br />
* Someone needs to report violations of the Terms of Service, or has questions about how the Terms of Service are enforced. These should be transfered to the Terms of Service category.<br />
<br />
Unfortunately, there's no way to separate out these types of requests, since the categories are divided by area of the site and not by type of request. (Also, many requests will span types.) Keep in mind as you view the support board, though, that something that looks simple may turn out to be complex, and something that looks complex may turn out to be simple.<br />
<br />
==Explaining the board==<br />
<br />
When you first load the board, you'll see a table that has five columns.<br />
<br />
[[File:Support_table.png|800x60px]]<br />
<br />
# ID#: This is the internal number for the request. (Clicking the number is the only way to access the actual request.)<br />
# Summary: This is the summary provided by the user at the time the user opened the request.<br />
#* Earlier summaries started with <code>[xx]</code>, due to code that hadn't yet been removed from what was inherited from LJ.<br />
#* Sometimes someone with the appropriate [[Privileges|privileges]] ("privs") will change the summary, if they think that the summary is insufficiently descriptive.<br />
# Problem Area: This is the request's category. There are public and private categories, and support privileges can be handed out by category, so it's possible to have privs in one category but not another. The current ''public'' categories are: <br />
** General/Unknown<br />
** Communities<br />
** Entries<br />
** Styles<br />
** Site Interface<br />
** Feeds<br />
** Importer<br />
** Crossposting<br />
** OpenID<br />
<br />
The current ''private'' categories are Account Payments, Feedback, Anti-Spam, and Terms of Service. (Peterstein and Webmaster also exist.) <br />
<br />
Request categories can be changed by someone with the '''supportmovetouch''' or '''supporthelp''' privs. See [[What Goes Where]] for more on the sorting of support requests. <br />
# Posted: The time that the request was submitted. This is in relative time.<br />
# Status: Requests can be in one of four statuses. See below for more information.<br />
<br />
This table can be sorted by ID#, Summary, or Problem Area, by clicking on the column headers.<br />
<br />
==Statuses==<br />
<br />
Requests can have one of four statuses.<br />
<br />
# Open ("green", with a green background in the table row): An answer has not yet been sent to the user. Requests that are opened may or may not have screened answers (see below) waiting on them. If you don't have the '''supportviewscreened''' priv, you won't be able to tell.<br />
# Answered, Awaiting Close ("yellow" or "AAC", with a yellow/beige background in the table row): An answer has been sent to the user, but the user hasn't confirmed that, or whether, it helped. Requests will stay in the "answered, awaiting close" status until either the user or the administrator closes it; they are never auto-closed.<br />
# Answered, Still Needs Help ("regreen" or "SNH", with a green background to the table row): An answer has been sent to the user, but the user has indicated that the provided answer doesn't fully answer their question.<br />
# Closed (with a pink background in the table row): The user or an administrator has closed the request. Both users and administrators can reopen a closed request if further contact is needed.<br />
<br />
==Tagging Requests==<br />
<br />
In order to better track issues that we've had multiple support requests for, we can now [http://dw-support-training.dreamwidth.org/26777.html tag entries] to make it easier to see how many requests of a common type are on the board. <br />
<br />
==Filtering the board==<br />
<br />
[[File:Support_filter_opts.png]]<br />
<br />
You can filter the board in three ways: by category, by status, or by category ''and'' status.<br />
<br />
The filters are:<br />
<br />
* "Open": This shows all requests that are "Open", "Answered, Still Needs Help", or "Answered, Awaiting Close", as described above.<br />
<br />
* "Closed": This shows all requests that have been closed (by the user or by an administrator) in the past 24 hours. After 24 hours, the request drops off this filter, and you'll need to know the request ID number (or have access to one of the administrative tools to look it up), so if you want to save a request for later study, bookmark it.<br />
<br />
* "Green": This shows all requests that are "Open" and "Answered, Still Needs Help".<br />
<br />
* "You Replied": This option is only available if you're logged in. This filter will show you every request you've touched -- answer, screened response, internal comment or action, anything -- from the union of all three above filters. (In other words: any request that's open, answered, still needs help, or was closed in the past 24 hours.) Requests will appear in this filter even if your screened response wasn't the approved one.<br />
<br />
==Inside a request==<br />
<br />
There are several components to a support request.<br />
<br />
===Account information===<br />
<br />
When you open up a request, the top of the request contains information about the user's account. This includes information about their settings, such as what database cluster their account is stored on (which can be useful in diagnosing technical problems -- if everyone who's having a problem that you can't reproduce on your account is on a single cluster, that's a sign you should poke <dwstaff>mark</dwstaff>) and what site scheme they've chosen (which can help you diagnose display problems). (We'll be providing guides to diagnosis and investigation as soon as we can.)<br />
<br />
===Support description===<br />
<br />
Next in the request is the user-provided description of the request. Sometimes users will ask questions; sometimes they'll report problems. Read the request carefully! Sometimes users don't know what they're asking to do, or are confused about what they're trying to do. If you spot something that makes you think that the user might be confused, be sure to straighten out the confusion in your answer.<br />
<br />
(For advice on how to reply to users, see the [[Support guide]].)<br />
<br />
===Support instructions===<br />
<br />
Underneath the user-provided summary is a box containing instructions for new volunteers. Once some of your answers have been approved and contact has been made with a senior volunteer, this box will no longer be displayed to you.<br />
Here's what the box says:<br />
<br />
: Important Notes:<br />
<br />
: Dreamwidth Support is an open-source project run by a community of volunteers. If you think you know the answer to this question, you're welcome to submit an answer in the box below. Your answer will be screened and evaluated by senior support volunteers for content. If your answer is first and correct, it will be sent to the person who submitted the question.<br />
<br />
: If you have questions about Support, please read the [http://wiki.dwscoalition.org/notes/Category:Support Support Wiki] category for more information.<br />
<br />
: Thank you!<br />
<br />
===Response box(es)===<br />
<br />
At the very bottom is a place where you can submit your response to the user and/or notes to other people helping.<br />
<br />
The first thing you see is a drop-down containing all of the FAQs. If there's a FAQ that's appropriate for the user's question, you can select in the drop-down; the email sent to the user notifying them of your response will include the FAQ reference, and if they view the request on the web, it'll be included there, too. If you select a FAQ in the drop-down box, be sure to mention that you have, in the body of your answer -- sometimes people can overlook it. Something as simple as "I've included a reference to a FAQ that may have more information about your problem", or however you want to phrase it, is good enough.<br />
<br />
Next is the reply type, which is explained in detail in the next section.<br />
<br />
Finally, type your answer itself into the box marked "Message". Be sure that your answer conforms to the style as described in the [[Support guide]]. In particular, you should address the user ("Dear so-and-so", or "Hi, so-and-so", or some form of greeting, whatever you prefer) and sign your name (any name you'd like to give -- your username, your actual name, your nickname, it doesn't matter, just be consistent). <br />
<br />
If you have the privs to leave an Internal Comment, there is a second box for this below the Message box. (If the Internal Comment box does not appear for you, it is okay to leave a message intended for other people doing Support in the Message box, just make it clear that it's not intended as an approvable answer.) <br />
<br />
Once you've written a response, hit "Post Comment/Solution", and your answer will be submitted to the request. ''It will not be visible to the user at first.'' (See below.) You'll be able to see it, but the user won't be able to see it yet. This is to make sure that the user gets the best, most accurate answer possible.<br />
<br />
If you can't answer the user's whole request, or don't know the answer to all of their questions, leave the request alone and move on. We won't approve partial answers -- it's better for the user to get one email, rather than four or five.<br />
<br />
==Four types of responses==<br />
<br />
There are four types of responses that can be added to a request:<br />
<br />
* Screened Response. This is the default. If you don't have any privs at all, all you can do is leave a screened response. These are visible only to the person who posted to them, and to anyone who has the '''supportviewscreened''' or '''supporthelp''' privs. This response type has a large-dashed yellow border on the request, and will be labeled "Screened Response". Always assume, if you're leaving a screened response, that it may be approved as an answer or comment, and sent to the user. If you need to leave some sort of internal note, use an Internal Comment if you can. If you cannot, make sure you indicate at the top of your response, in capital letters and with some sort of standout, that it's an internal note: something like "***** INTERNAL NOTE *****". (This shouldn't be too much of an issue, since anyone who wants to volunteer in Support for Dreamwidth can have the '''supportmakeinternal''' privs on request, which will allow them to make actual internal comments instead of leaving notes as screened responses. But if you don't have those privs for some reason, make sure you clearly mark any internal notes.)<br />
<br />
* Answer. This happens once a screened response has been approved by someone with the '''supporthelp''' priv. When a response is approved as an answer, an email is sent to the user, the request status goes from "Open" to "Answered, Awaiting Close", the response type changes from "Screened Response" to "Answer", the response is made visible to anyone who views the request, and the border of the response changes from large-dashed yellow to solid green. People with the '''supporthelp''' priv can approve other people's screened responses or their own. (They also have the ability to answer directly without going through the screened response first; however, this isn't a good idea. If you have supporthelp, always answer screened and then approve yourself. The typos never show until you read over the response the second time.)<br />
<br />
* Comment. This happens once a screened response has been approved as a comment by someone with the '''supporthelp''' priv. When a response is approved as a comment, an email is sent to the user, the response type changes from "Screened Response" to "Comment", the response is made visible to anyone who views the request, and the border of the response changes from large-dashed yellow to solid black. The request status does ''not'' change. It's used to prompt the user for more information, or ask some diagnostic questions. Further information from the user who filed the request also appears as a comment. (If you have filed the request, this is the only type of answer you can make to your own request, even if you have privs that say otherwise.) <br />
<br />
* Internal comment ("IC"). This is a response that cannot accidentally be sent to the user: it will always remain internal-only. It appears labeled as Internal Comment, with a small-dashed red border. An internal comment can only be made by someone who holds the '''supportmakeinternal''' or '''supporthelp''' privs, and will not be visible to anyone but someone who holds the '''supportviewinternal''' or '''supporthelp''' privs. They're generally used to swap hypotheses about complicated requests or include troubleshooting notes or information. If you do not have the privs to leave an Internal Comment, leave a clearly marked Screened Response as described above.<br />
<br />
Responses cannot be edited or deleted. Double-check your response before submitting. If you find that something must be changed, make a second response. Screened Responses that are intended to become Answers should not mention the first draft, as the user will likely not be able to see the first Screened Response.<br />
<br />
==Life cycle of a request==<br />
<br />
1. User opens a request at the [http://www.dreamwidth.org/support/submit.bml Submit page].<br />
<br />
2. If the request is in the wrong category, someone with the '''supportmovetouch''' or '''supporthelp''' privs will send it to the right category. (If you have these privs, this should be the first thing you check.)<br />
<br />
3. If the summary is bad or misleading, someone with the '''supportchangesummary''' or '''supporthelp''' privs will change the summary to something more accurate. (If you have these privs, this should be the second thing you check.)<br />
<br />
4. If you know the answer to the request, you can leave a Screened Response. '''You may not be approved.''' (See below.)<br />
<br />
5. Someone with '''supporthelp''' will evaluate all of the Screened Responses on the request, and select the one, in their opinion, that best answers the user's question. They'll approve that Screened Response as an answer. If (in their opinion) none of the responses available answer the user's question entirely, they have the option to write their own answer and approve it.<br />
<br />
6. The user will get the response email, and have a chance to return to the request and ask further questions ''or'' indicate that their question was answered and they don't need to ask any more questions. Sometimes they do neither, and the request will just sit there.<br />
<br />
7. If the user doesn't close the request, sooner or later an administrator with the [http://www.dreamwidth.org/admin/priv/?priv=supportclose supportclose priv] will come along and close it. This also serves as an additional qualitycheck. Closing runs happen periodically in accordance with the administrators' schedules. <br />
<br />
8. If the user ''does'' indicate that they need more help, anyone can submit a followup answer. It doesn't have to be by the person who originally answered the request -- if you have the answer, feel free to leave it. This will bring us back to step 5, and the process continues.<br />
<br />
==Why your screened response might not have been approved==<br />
<br />
If you don't have the '''supportviewscreened''' and '''supportviewinternal''' privs, it's hard to tell why your response wasn't approved. We're going to be granting those privs to anyone who wants them, but if you don't know about them, you can still wind up getting confused. Until we can put a better training system into place, we'll be using <dwcomm>dw_support_training</dwcomm> to coordinate people who are just starting out in support, and <dwcomm>dw_support</dwcomm> for people who have the higher-level support privs ('''supporthelp''' and support administrative privs). There is also an [[IRC]] channel for real-time chat. <br />
<br />
There are a number of reasons why your screened response might not have been approved. This includes:<br />
<br />
1. Someone with the '''supporthelp''' priv might not have gotten the chance to evaluate the request yet. This is the case if there isn't an approved answer on the request -- if nothing has been approved on the answer yet, it could mean that there's something wrong with all the answers, but it's also possible that nobody's looked at it yet.<br />
<br />
2. Someone may have submitted an approvable answer earlier than you did. If the approved answer appears before your screened response, it means that it was submitted earlier than yours, and the '''supporthelp''' who approved the answer felt that the earlier answer contained everything the user needed.<br />
<br />
3. You may have had an error in form. Failure to greet the user or sign your request, any major spelling/typo/grammar issues, or other matters of style (see the [[Support guide]]) may cause someone to decide against approving you.<br />
<br />
4. You may have had incomplete information. Compare your answer against the approved answer and see what it has that your answer doesn't. <br />
<br />
5. You may have gotten your answer completely right, but the approved answer comes after yours -- in this case, it's possible that the person whose answer was approved had an earlier answer, then you submitted yours, then they re-submitted theirs to correct a typo or expand on some finer points. Because there's no way to edit a support response, edits show up as a newer screened response, posted later. (If you do have '''supportviewscreened''', you can verify this.)<br />
<br />
If you absolutely can't figure out why your screened response wasn't accepted, you can post to <dwcomm>dw_support_training</dwcomm> with a link to the request, asking why you weren't approved. ''Please don't critique the actual approved answer''. If you think a response was approved incorrectly, privately contact <dwstaff>denise</dwstaff>.<br />
<br />
==Privs on Dreamwidth==<br />
<br />
Anyone who's interested in volunteering for Dreamwidth support will be granted the '''supportviewscreened''' and '''supportmakeinternal''' privs. Right now, the way to get these privs is to comment to [http://dw-support-training.dreamwidth.org/910.html this entry] in <dwcomm>dw_support_training</dwcomm>. After you do, <dwstaff>denise</dwstaff> will grant you the appropriate privs (as soon as she gets a spare second!)<br />
<br />
For information on who has the '''supporthelp''' priv, you can see the [http://www.dreamwidth.org/admin/priv/?priv=supporthelp Dreamwidth supporthelp list]. <br />
<br />
For a full rundown on what privs do what, how they work, and what bits of the support board they affect, see [[Privileges]]. <br />
<br />
Right now, we're not yet certain what our criteria will be for handing out support privs other than '''supportviewscreened''' and '''supportmakeinternal'''. For the first few weeks of Dreamwidth's operation, it'll likely be a very freeform sort of system where people who are answering regularly and correctly will get more privs as they demonstrate their commitment.<br />
<br />
We've decided against offering any form of reciprocal privs -- even if you have support privs on another LJ-based site, you won't automatically get those privs on Dreamwidth. This is partially because our support style is drastically different from other sites, and partially so that everyone starts from an equal playing field.<br />
<br />
== Support Points ==<br />
Support Points were built into the support system early in its lifespan at LiveJournal for gamification of the crowdsourced support experience. As used at Dreamwidth, they are for fun only, and collecting them does not confer anything other than mild bragging rights and a rough idea of how support-busy the journal has been. (Some people have support points across multiple journals, and not all support-related activity results in points.) <br />
<br />
As a support request goes unanswered longer, it accumulates more possible points. The number of points depends on the answer time: an answer left immediately after the request was filed gets the fewest points, an answer left a long time after the request was filed gets the most points. (The number displayed next to an open request on the support board is the number of points that an answer left now would get, if selected when closing.) Typically, more complex support requests go longer un-answered. Points are conferred when the request is closed. The request can be closed by the user or a support administrator doing a closing run.<br />
<br />
==Spam on the board==<br />
<br />
Sometimes, spam makes its way through to the support board. The board is monitored fairly regularly, so if you see spam on the board, just let it slide; it will likely be removed soon.<br />
<br />
The people who can deal with spam on the board are those who have the privs to move a request out of its current category, rather than the antispam team (who deal with comment, private message, and community entry spam reports).<br />
<br />
==Feedback on the support process==<br />
<br />
If you have feedback on the support process, you can post to <dwcomm>dw_support_training</dwcomm>, contact a support admin privately, email all support leads at support(at)dreamwidth(dot)org, or open a request in the Feedback category (goes to site owners only). Constructive feedback is appreciated. <br />
<br />
<!-- We do absolutely want to hear your ideas and thoughts about how things should run. One thing to keep in mind, however, is that when you're providing feedback about the support process, support policies, support training, and the support system, or expressing your thoughts on how Dreamwidth support should run, it is ''absolutely critical'' that you keep your suggestions positive: what we ''can'' do, rather than comparing Dreamwidth support to any other service's or site's support team, support offerings, or support procedures. <br />
<br />
It's okay to talk about general lessons you've learned elsewhere or on other sites, but please avoid talking about bad experiences you had elsewhere (whether as a customer or as a member of a site support team), avoid making comparisons between Dreamwidth's support and any other site or service's support, and avoid any language that could be taken as attacking or criticizing another site or service's support team. <br />
<br />
Everyone is welcome to volunteer for Dreamwidth support! While it might look complex, in practice the system does function fairly effectively. Things ''are'' going to be chaotic for the first few weeks as we work out the best practices -- how we can use the technical tools available to us in the most efficient fashion -- to provide kickass customer service.<br />
<br />
Over the next few weeks, expect tutorials on how to investigate and diagnose a problem, how to best deal with users who have problems that could be one of many different things, how to keep track of known issues (and how to report issues as they come up), and how to communicate effectively with users. --><br />
<br />
[[Category: Support]]</div>Shadowspar//wiki.dreamwidth.net/wiki/index.php/Support_FAQSupport FAQ2013-06-08T03:40:30Z<p>Shadowspar: /* Things needing special powers */ +link: What Goes Where</p>
<hr />
<div>This page contains frequently identified issues, questions, and so forth with regards to support, relevant to you, the support volunteer.<br />
<br />
== What is Support? ==<br />
<br />
Technical support for users of the Dreamwidth.org site is partially crowdsourced. This includes general questions, and some technical support and customer service. (Some technical support and customer service is done by Dreamwidth staff.) Any registered Dreamwidth user can contribute answers on the Support board. All answers are subject to the approval of a trained senior volunteer before they are sent to the user. You can read more about the full [[Support process]].<br />
<br />
== Who can do Support? ==<br />
<br />
Anyone who feels like it can volunteer their time and expertise to Support. See the [[Support guide]] and [[Support process]].<br />
<br />
== Things needing special powers==<br />
A lot of requests are informational, and anyone who knows the answer can give an answer, but some support requests need special powers to actually carry out. (See also: [[What Goes Where]]).<br />
<br />
=== Feed rename requests ===<br />
<br />
Example: "Could you rename the sample_feed feed to samples_feed?"<br />
<br />
Typically, you can just ignore these requests. Someone with the appropriate [[Privileges|privileges]] will handle it.<br />
<br />
If the user is complaining about the feed not working, take a look and see if the feed URL is still valid. If it is not valid, please look up the new one and leave is as an IC to the request.<br />
<br />
As an aside, please do not create a new feed.<br />
<br />
-- [http://dw-support-training.dreamwidth.org/13100.html Source].<br />
<br />
=== Feed source changes ===<br />
<br />
Example: "The source feed's URL has changed. Could you change the DW feed's URL, too?"<br />
<br />
You should treat these the same as rename requests.<br />
<br />
If the user is complaining about the feed not working, take a look and see if the feed URL is still valid. If it is not valid, please look up the new one and leave is as an IC to the request.<br />
<br />
=== Closing a support request ===<br />
<br />
Requests are typically closed when someone with request-closing privs has the time to close them. (Currently, this is <dwstaff>denise</dwstaff>, Kat, Dom, and Chemla.)<br />
<br />
Answered requests may remain open for a brief period of time for two reasons:<br />
<br />
# D, Kat, Dom or Chemla hasn't had the time to go 'round and close them.<br />
# We want to give the user ample time to respond, in case they're still having an issue.<br />
<br />
-- [http://dw-support-training.dreamwidth.org/17216.html Source].<br />
<br />
=== Spaaaaam! In the dungeon! ===<br />
<br />
Thought you should know!<br />
<br />
If you see spam on the board, just leave it. It will be handled by someone with the appropriate privs.<br />
<br />
If you have the '''movetouch''' priv, you must move the "request" to Peterstein. If you're unsure as to whether the request is actually spam, just move it to Peterstein. Someone will suss it out.<br />
<br />
-- [http://dw-support-training.dreamwidth.org/12489.html Source].<br />
<br />
=== Changing the Birthdate Entered at Registration ===<br />
<br />
Whether or not an account has access to posts and communities flagged as "adult content" is determined by ''the initial birthdate entered at registration time'', and not any value the user's birthdate is subsequently changed to. <br />
<br />
Requests to change the initial birthdate require special privs. If you have the movetouch priv, dump the request into Accounts.<br />
<br />
== Answers that refer to a Bugzilla bug ==<br />
<br />
If your answer refers to a [[Bugzilla|bug]], please add an internal comment that links to the bug in Bugzilla.<br />
<br />
-- [http://dw-support-training.dreamwidth.org/12885.html Source].<br />
<br />
<br />
<br />
== Mass-deletion of entries ==<br />
<br />
This is covered in the Dreamwidth FAQ, actually.<br />
<br />
Dreamwidth does not support mass-entry deletion within itself. There are [[Compatible clients|third-party tools]] that might be able to do this, but it's not recommended.<br />
<br />
DW doesn't have or want the functionality for two main reasons:<br />
<br />
# It is way too easy to slip and delete more than one intended to.<br />
# Not having that is one more obstacle, in case one's journal is hijacked.<br />
<br />
If you recommend that they seek out a third-party client, you must make sure to note that DW takes no responsibility for third-party clients.<br />
<br />
-- [http://www.dreamwidth.org/support/faqbrowse?faqid=210 Source].<br />
<br />
== Deleted Users == <br />
<br />
Support requests from deleted accounts should still be answered as any other request. The user can still undelete their account; in fact, they may be waiting on the outcome of the request to decide whether or not they'd like to do so. <br />
<br />
[[Category: Support]]</div>Shadowspar//wiki.dreamwidth.net/wiki/index.php/Support_FAQSupport FAQ2013-06-06T23:27:49Z<p>Shadowspar: +req to change initial birthdate</p>
<hr />
<div>This page contains frequently identified issues, questions, and so forth with regards to support, relevant to you, the support volunteer.<br />
<br />
== What is Support? ==<br />
<br />
Technical support for users of the Dreamwidth.org site is partially crowdsourced. This includes general questions, and some technical support and customer service. (Some technical support and customer service is done by Dreamwidth staff.) Any registered Dreamwidth user can contribute answers on the Support board. All answers are subject to the approval of a trained senior volunteer before they are sent to the user. You can read more about the full [[Support process]].<br />
<br />
== Who can do Support? ==<br />
<br />
Anyone who feels like it can volunteer their time and expertise to Support. See the [[Support guide]] and [[Support process]].<br />
<br />
== Things needing special powers==<br />
A lot of requests are informational, and anyone who knows the answer can give an answer, but some support requests need special powers to actually carry out. <br />
<br />
=== Feed rename requests ===<br />
<br />
Example: "Could you rename the sample_feed feed to samples_feed?"<br />
<br />
Typically, you can just ignore these requests. Someone with the appropriate [[Privileges|privileges]] will handle it.<br />
<br />
If the user is complaining about the feed not working, take a look and see if the feed URL is still valid. If it is not valid, please look up the new one and leave is as an IC to the request.<br />
<br />
As an aside, please do not create a new feed.<br />
<br />
-- [http://dw-support-training.dreamwidth.org/13100.html Source].<br />
<br />
=== Feed source changes ===<br />
<br />
Example: "The source feed's URL has changed. Could you change the DW feed's URL, too?"<br />
<br />
You should treat these the same as rename requests.<br />
<br />
If the user is complaining about the feed not working, take a look and see if the feed URL is still valid. If it is not valid, please look up the new one and leave is as an IC to the request.<br />
<br />
=== Closing a support request ===<br />
<br />
Requests are typically closed when someone with request-closing privs has the time to close them. (Currently, this is <dwstaff>denise</dwstaff>, Kat, Dom, and Chemla.)<br />
<br />
Answered requests may remain open for a brief period of time for two reasons:<br />
<br />
# D, Kat, Dom or Chemla hasn't had the time to go 'round and close them.<br />
# We want to give the user ample time to respond, in case they're still having an issue.<br />
<br />
-- [http://dw-support-training.dreamwidth.org/17216.html Source].<br />
<br />
=== Spaaaaam! In the dungeon! ===<br />
<br />
Thought you should know!<br />
<br />
If you see spam on the board, just leave it. It will be handled by someone with the appropriate privs.<br />
<br />
If you have the '''movetouch''' priv, you must move the "request" to Peterstein. If you're unsure as to whether the request is actually spam, just move it to Peterstein. Someone will suss it out.<br />
<br />
-- [http://dw-support-training.dreamwidth.org/12489.html Source].<br />
<br />
=== Changing the Birthdate Entered at Registration ===<br />
<br />
Whether or not an account has access to posts and communities flagged as "adult content" is determined by ''the initial birthdate entered at registration time'', and not any value the user's birthdate is subsequently changed to. <br />
<br />
Requests to change the initial birthdate require special privs. If you have the movetouch priv, dump the request into Accounts. <br />
<br />
<br />
== Answers that refer to a Bugzilla bug ==<br />
<br />
If your answer refers to a [[Bugzilla|bug]], please add an internal comment that links to the bug in Bugzilla.<br />
<br />
-- [http://dw-support-training.dreamwidth.org/12885.html Source].<br />
<br />
<br />
<br />
== Mass-deletion of entries ==<br />
<br />
This is covered in the Dreamwidth FAQ, actually.<br />
<br />
Dreamwidth does not support mass-entry deletion within itself. There are [[Compatible clients|third-party tools]] that might be able to do this, but it's not recommended.<br />
<br />
DW doesn't have or want the functionality for two main reasons:<br />
<br />
# It is way too easy to slip and delete more than one intended to.<br />
# Not having that is one more obstacle, in case one's journal is hijacked.<br />
<br />
If you recommend that they seek out a third-party client, you must make sure to note that DW takes no responsibility for third-party clients.<br />
<br />
-- [http://www.dreamwidth.org/support/faqbrowse?faqid=210 Source].<br />
<br />
== Deleted Users == <br />
<br />
Support requests from deleted accounts should still be answered as any other request. The user can still undelete their account; in fact, they may be waiting on the outcome of the request to decide whether or not they'd like to do so. <br />
<br />
[[Category: Support]]</div>Shadowspar//wiki.dreamwidth.net/wiki/index.php/Support_FAQSupport FAQ2013-06-06T22:46:24Z<p>Shadowspar: +FAQ: yes, answer reqs from deleted users</p>
<hr />
<div>This page contains frequently identified issues, questions, and so forth with regards to support, relevant to you, the support volunteer.<br />
<br />
== What is Support? ==<br />
<br />
Technical support for users of the Dreamwidth.org site is partially crowdsourced. This includes general questions, and some technical support and customer service. (Some technical support and customer service is done by Dreamwidth staff.) Any registered Dreamwidth user can contribute answers on the Support board. All answers are subject to the approval of a trained senior volunteer before they are sent to the user. You can read more about the full [[Support process]].<br />
<br />
== Who can do Support? ==<br />
<br />
Anyone who feels like it can volunteer their time and expertise to Support. See the [[Support guide]] and [[Support process]].<br />
<br />
== Things needing special powers==<br />
A lot of requests are informational, and anyone who knows the answer can give an answer, but some support requests need special powers to actually carry out. <br />
<br />
=== Feed rename requests ===<br />
<br />
Example: "Could you rename the sample_feed feed to samples_feed?"<br />
<br />
Typically, you can just ignore these requests. Someone with the appropriate [[Privileges|privileges]] will handle it.<br />
<br />
If the user is complaining about the feed not working, take a look and see if the feed URL is still valid. If it is not valid, please look up the new one and leave is as an IC to the request.<br />
<br />
As an aside, please do not create a new feed.<br />
<br />
-- [http://dw-support-training.dreamwidth.org/13100.html Source].<br />
<br />
=== Feed source changes ===<br />
<br />
Example: "The source feed's URL has changed. Could you change the DW feed's URL, too?"<br />
<br />
You should treat these the same as rename requests.<br />
<br />
If the user is complaining about the feed not working, take a look and see if the feed URL is still valid. If it is not valid, please look up the new one and leave is as an IC to the request.<br />
<br />
=== Closing a support request ===<br />
<br />
Requests are typically closed when someone with request-closing privs has the time to close them. (Currently, this is <dwstaff>denise</dwstaff>, Kat, Dom, and Chemla.)<br />
<br />
Answered requests may remain open for a brief period of time for two reasons:<br />
<br />
# D, Kat, Dom or Chemla hasn't had the time to go 'round and close them.<br />
# We want to give the user ample time to respond, in case they're still having an issue.<br />
<br />
-- [http://dw-support-training.dreamwidth.org/17216.html Source].<br />
<br />
=== Spaaaaam! In the dungeon! ===<br />
<br />
Thought you should know!<br />
<br />
If you see spam on the board, just leave it. It will be handled by someone with the appropriate privs.<br />
<br />
If you have the '''movetouch''' priv, you must move the "request" to Peterstein. If you're unsure as to whether the request is actually spam, just move it to Peterstein. Someone will suss it out.<br />
<br />
-- [http://dw-support-training.dreamwidth.org/12489.html Source].<br />
<br />
== Answers that refer to a Bugzilla bug ==<br />
<br />
If your answer refers to a [[Bugzilla|bug]], please add an internal comment that links to the bug in Bugzilla.<br />
<br />
-- [http://dw-support-training.dreamwidth.org/12885.html Source].<br />
<br />
<br />
<br />
== Mass-deletion of entries ==<br />
<br />
This is covered in the Dreamwidth FAQ, actually.<br />
<br />
Dreamwidth does not support mass-entry deletion within itself. There are [[Compatible clients|third-party tools]] that might be able to do this, but it's not recommended.<br />
<br />
DW doesn't have or want the functionality for two main reasons:<br />
<br />
# It is way too easy to slip and delete more than one intended to.<br />
# Not having that is one more obstacle, in case one's journal is hijacked.<br />
<br />
If you recommend that they seek out a third-party client, you must make sure to note that DW takes no responsibility for third-party clients.<br />
<br />
-- [http://www.dreamwidth.org/support/faqbrowse?faqid=210 Source].<br />
<br />
== Deleted Users == <br />
<br />
Support requests from deleted accounts should still be answered as any other request. The user can still undelete their account; in fact, they may be waiting on the outcome of the request to decide whether or not they'd like to do so. <br />
<br />
[[Category: Support]]</div>Shadowspar//wiki.dreamwidth.net/wiki/index.php/Adding_Embed_Whitelist_ItemsAdding Embed Whitelist Items2013-06-04T14:48:13Z<p>Shadowspar: +example code: plurk whitelist add by foxfirefey++</p>
<hr />
<div>Files you'll want to poke include: <br />
<br />
cgi-bin/DW/Hooks/EmbedWhitelist.pm<br />
t/embed-whitelist.t<br />
<br />
<br />
== Examples ==<br />
<br />
* [https://github.com/foxfirefey/dw-free/commit/8934dbb67c85087714e2650591cba1634a57c6e4 Add plurk whitelist] by <dwuser>foxfirefey</dwuser> ([http://bugs.dwscoalition.org/show_bug.cgi?id=4970 bug 4970])<br />
<br />
<br />
<br />
[[Category: Development]]</div>Shadowspar//wiki.dreamwidth.net/wiki/index.php/Wiki_Style_GuideWiki Style Guide2013-06-04T14:34:54Z<p>Shadowspar: /* Templates */ +ln: Category:Templates</p>
<hr />
<div>== General tone/style ==<br />
<br />
The primary audience of the wiki is the volunteers and staff of Dreamwidth, as well as others who are using the Dreamwidth code. End users probably won't find much of use, but keep in mind everything here is public.<br />
<br />
Some users of the wiki are extremely geeky and very involved with the code and server backend, and we need to respect the very technical level of the wiki pages they use. Other users are very involved in testing and the front end, and their pages can be written in a much less technical style.<br />
<br />
Articles should be written as accessibly as possible, keeping in mind the technical level of the subject matter.<br />
<br />
Plain language can be used, with a light, friendly style. Please try to avoid colloquialisms as much as possible, as not everyone has English as a primary language.<br />
<br />
== Wiki formatting versus HTML ==<br />
<br />
==== HTML formatting preferred ====<br />
<br />
Please use HTML formatting for these tasks, and not traditional wiki formatting:<br />
<br />
* Bold and italics (&lt;strong&gt; and &lt;em&gt; respectively)<br />
* Monospace (&lt;tt&gt;)<br />
* Long sections of preformatted content (use &lt;pre&gt;)<br />
<br />
[[User:Foxfirefey|Foxfirefey]] feels it's better to use HTML over wiki formatting for these things because it's more accessible to people who don't know as much wiki editing, or because it's cleaner or easier to manage/change.<br />
<br />
==== Wiki formatting preferred ====<br />
<br />
Things it's better to use wiki formatting for:<br />
<br />
* Making lists<br />
* Tables<br />
* Section headings<br />
<br />
Variables and paths should have &lt;tt&gt; around them, such as <tt>$LJHOME</tt>.<br />
<br />
== Page sections ==<br />
<br />
Pages should be sectioned if they are long enough to warrant it, or if that would help lay out the information better. Sections are delimited like this:<br />
<br />
= Section 1 =<br />
== Section 1.1 ==<br />
=== Section 1.1.1 ===<br />
==== Section 1.1.1.1 ===<br />
===== Section 1.1.1.1.1 =====<br />
<br />
It's good to start out at the level of <nowiki>==</nowiki>, just in case you want to reorganize things into more sections later. We prefer spaces in between your <nowiki>==</nowiki>s and the section title itself, and a line of space before and after each title (unless you have a section at the very top of the page, in which case you can skip the line before).<br />
<br />
== Lists ==<br />
<br />
Lists should be formatted into unordered, ordered, and definition lists.<br />
<br />
== Categories ==<br />
<br />
Pages should be categorized, and category tags should go at the bottom of the page, one to a line. A category should look like:<br />
<br />
<nowiki>[[Category: Category name]]</nowiki><br />
<br />
That is, the initial category is capitalized, and there's a space between it and the category name.<br />
<br />
== Templates ==<br />
<br />
Templates are there to help you! Here is a list of templates you can use. They all have instructions for their use if you go to their page.<br />
<br />
* There are templates to classify articles needing different kinds of attention: [[Template:Cleanup]] (for articles that need reworking of existing content), [[Template:Expand]] (for articles that need more content), [[Template:Update]] (for articles with outdated or inaccurate content)<br />
* There are templates to offset notable pieces of information: [[Template:Warn]] (for important information that can have adverse affects) and [[Template:Note]] (for information that should be highlighted in a box to the side)<br />
* When referring to [[:Category:Database Tables|database tables]], you can use [[Template:DBTable]] to refer to a table and [[Template:DBField]] to refer to a field in a table. They'll do all of the tricky formatting to link it up nicely.<br />
* The [[:Category:Templates]] page lists all templates that currently exist.<br />
<br />
== Source code ==<br />
<br />
Source code should [[Help:Contents#Source_highlighting|be highlighted]].<br />
<br />
[[Category: Wiki Management]]</div>Shadowspar//wiki.dreamwidth.net/wiki/index.php/Version_ControlVersion Control2013-05-20T19:32:46Z<p>Shadowspar: /* Committing changes */ +dw convention: summary starts w/ "(bug 1234)"</p>
<hr />
<div>The Dreamwidth code uses a Git repository and is publicly available [http://github.com/dreamwidth/ on Github].<br />
<br />
You can orient yourself with the basics via [[Git Getting Started]]. Instructions for specific actions are below:<br />
<br />
== Starting a new branch ==<br />
<br />
First, if you're currently in the midst of making changes to another branch, wrap up your changes either by stashing them or committing them. (See later sections for details.) <br />
<br />
New branches should be started from an up-to-date copy of develop. To bring your copy of develop up to date, first use checkout to switch to the develop branch:<br />
<br />
git checkout develop <br />
<br />
Then bring your develop branch up to date by pulling in changes from dreamwidth's copy of develop on github:<br />
<br />
git fetch dreamwidth <br />
git pull --ff-only dreamwidth <br />
<br />
To create a new branch and switch your working copy over to it immediately, use <tt>git checkout -b ''branchname''</tt>; eg<br />
<br />
git checkout -b bug4335-admin-tt<br />
<br />
Choose a descriptive branch name you can keep track of--in this example, it's the bug number being worked on, plus a couple of keywords so you're not relying solely on memorising bug numbers!<br />
<br />
== Managing changes ==<br />
<br />
Before making changes to a branch, make sure you have that branch checked out. You can check which branch you're currently working on with:<br />
<br />
git branch<br />
<br />
It will list the branches and put an asterisk next to the one you currently have checked out, eg:<br />
<br />
bug4650-update-bootstrap.pl<br />
bug4772-stats-old-urls<br />
bug4772-stats-old-urls-dw-style<br />
bug5003-remove-hg-links<br />
* develop<br />
master<br />
<br />
If the current branch isn't the one you want to work on, change to the right branch with the command:<br />
<br />
git checkout BRANCHNAME<br />
<br />
=== Viewing changes ===<br />
<br />
To get an overview of which files have changed, which files are included in your next commit, and what new files exist, use:<br />
<br />
git status<br />
<br />
To get a line by line description of all of the changes, use:<br />
<br />
git diff<br />
<br />
When you want the changes you've made to a file you have to be included in your next commit, use <code>git add</code>:<br />
<br />
git add FILE<br />
<br />
If you make more changes to that file, you will have to add it again to have the new changes included.<br />
<br />
=== Stashing and unstashing ===<br />
<br />
Sometimes you may have changes you are not ready to commit yet, but need to stow away while doing tasks like merging. <code>git stash</code> can be useful for this.<br />
<br />
To save a bunch of changes:<br />
<br />
git stash<br />
<br />
To put the changes back:<br />
<br />
git stash pop<br />
<br />
=== Undoing changes ===<br />
<br />
If you have a file with changes and want to revert it to what's currently committed to the branch of the repository you are on, use:<br />
<br />
git checkout -- FILENAME<br />
<br />
If you accidentally added a file to the staging area you are going to be committing, you can unadd it using:<br />
<br />
git reset HEAD FILENAME<br />
<br />
If you want to reset ALL files to what's currently committed to the branch of the repository you are on and discard all changes (DO NOT USE IF YOU WANT TO SAVE ANYTHING), use:<br />
<br />
git reset --hard<br />
<br />
=== Committing changes ===<br />
<br />
Use <code>git add</code> to add the changes you want to commit. Before committing, you may want to briefly review your changes with <code>git status</code> and <code>git diff</code>. <br />
<br />
Once you are satisfied that these changes are the ones you want to make, give the command:<br />
<br />
git commit<br />
<br />
This will open up the command line editor specified in your config. (You can change this with instructions in [[Git settings]].) Write up a good description of the changes included in this commit.<br />
<br />
Git commit messages have a format that's rather peculiar to Git, and we have a further convention of starting the summary with (eg) "(bug 1234)". So, ideally your commit messages will look something like this: <br />
<br />
'''(bug 4321) short summary; total 50 chars or less'''<br />
<br />
After a blank line, give a long-form description of the changes.<br />
You can write a few sentences, several paragraphs, or an essay<br />
complete with theorems, premises, and supporting references --<br />
whatever is needed to clearly document the change.<br />
<br />
The first line is used as a summary by tools like <code>git log --oneline</code>; if it is too long, the output of these tools will display oddly. <br />
<br />
[http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html Additional suggestions on writing commit messages].<br />
<br />
{{Expand|text=Writing commit messages: best practices.}}<br />
<br />
If you are making a commit that only needs a short explanation, you can use the -m option:<br />
<br />
git commit -m "(Bug 3492) This describes the change that I just made."<br />
<br />
=== Pushing your changes to your repository on Github ===<br />
<br />
After committing your changes, you need to push them to your repository on Github. You can do this with:<br />
<br />
git push origin BRANCHNAME<br />
<br />
== Making a pull request ==<br />
<br />
=== Bring your branch up to date with develop ===<br />
<br />
Before making a pull request, it's good etiquette to bring your branch up to date with any changes that have happened in <tt>develop</tt> since you initially forked your branch. Once you've made the last of your commits, double-check that you're in the branch you want to submit: <br />
<br />
git branch <br />
<br />
Then fetch changes from Dreamwidth's develop branch and bring your branch up to date with them:<br />
<br />
git fetch dreamwidth<br />
git pull --rebase --ff-only dreamwidth develop<br />
<br />
<tt>pull --rebase</tt> incorporates any new changes from develop into your branch, and it also reorganizes your changes so that changes in your branch appear to start from ''current'' develop, instead of where develop was when you initially started your branch. (Neat!) This can make it much easier to merge your branch into Dreamwidth's main develop branch.<br />
<br />
=== Submit! ===<br />
Then, once everything is all up to date, go to your version of the repository (dw-free or dw-nonfree) that you want to send upstream. By default they should be at:<br />
<br />
* https://github.com/USERNAME/dw-free<br />
* https://github.com/USERNAME/dw-nonfree<br />
<br />
These repositories are separate, so if you have made changes to both of them, you will have to submit pull requests for both of them.<br />
<br />
Find the "Pull Request" button (by "Unwatch") under the top toolbar. Click it and you will be brought to the pull request page.<br />
<br />
Ideally, the initial page should say something like "Oops! dreamwidth:develop is already up-to-date with USERNAME:develop Try a different branch?" That's good--that means that your <code>develop</code> branch is up to date with Dreamwidth's!<br />
<br />
Find the "head branch" drop down and select the branch you want to submit a pull request for (e.g. "bug4335-admin-tt" as per the example given in [[#Starting a new branch]]).<br />
<br />
{{Expand|text=What do we want people to include in the pull request description? Bugzilla URL?}}<br />
<br />
When this is done, press the "Send pull request" button.<br />
<br />
{{Expand|text=Describe making a pull request to another repository other than the DW one!}}<br />
<br />
Finally (and optionally!), go back to the Bugzilla page for your bug, and leave a comment linking to the pull request you've just submitted.<br />
<br />
== Deleting branches ==<br />
<br />
{{Warn|text=Be careful when deleting branches -- while it's often possible to get things back, it can be tricky to do so.}}<br />
<br />
You might create a branch by mistake, or have your changes pulled into the main develop branch on Dreamwidth. To delete the branch locally, use the command:<br />
<br />
git branch -d BRANCHNAME<br />
<br />
If it's a branch that hasn't been merged yet, the above command will give you an error. If you are SURE you still want to delete that branch, use:<br />
<br />
git branch -D BRANCHNAME<br />
<br />
If the branch is also on your Github, you can delete it like this:<br />
<br />
git push origin --delete <branchName><br />
<br />
[[Category: Development]]<br />
[[Category: Git]]</div>Shadowspar//wiki.dreamwidth.net/wiki/index.php/Version_ControlVersion Control2013-05-09T02:56:40Z<p>Shadowspar: /* Deleting branches */ make warning less scary. deleting branches doesn't actually discard any commits -- it can just make them very hard to find</p>
<hr />
<div>The Dreamwidth code uses a Git repository and is publicly available [http://github.com/dreamwidth/ on Github].<br />
<br />
You can orient yourself with the basics via [[Git Getting Started]]. Instructions for specific actions are below:<br />
<br />
== Starting a new branch ==<br />
<br />
First, if you're currently in the midst of making changes to another branch, wrap up your changes either by stashing them or committing them. (See later sections for details.) <br />
<br />
New branches should be started from an up-to-date copy of develop. To bring your copy of develop up to date, first use checkout to switch to the develop branch:<br />
<br />
git checkout develop <br />
<br />
Then bring your develop branch up to date by pulling in changes from dreamwidth's copy of develop on github:<br />
<br />
git fetch dreamwidth <br />
git pull --ff-only dreamwidth <br />
<br />
To create a new branch and switch your working copy over to it immediately, use <tt>git checkout -b ''branchname''</tt>; eg<br />
<br />
git checkout -b bug4335-admin-tt<br />
<br />
Choose a descriptive branch name you can keep track of--in this example, it's the bug number being worked on, plus a couple of keywords so you're not relying solely on memorising bug numbers!<br />
<br />
== Managing changes ==<br />
<br />
Before making changes to a branch, make sure you have that branch checked out. You can check which branch you're currently working on with:<br />
<br />
git branch<br />
<br />
It will list the branches and put an asterisk next to the one you currently have checked out, eg:<br />
<br />
bug4650-update-bootstrap.pl<br />
bug4772-stats-old-urls<br />
bug4772-stats-old-urls-dw-style<br />
bug5003-remove-hg-links<br />
* develop<br />
master<br />
<br />
If the current branch isn't the one you want to work on, change to the right branch with the command:<br />
<br />
git checkout BRANCHNAME<br />
<br />
=== Viewing changes ===<br />
<br />
To get an overview of which files have changed, which files are included in your next commit, and what new files exist, use:<br />
<br />
git status<br />
<br />
To get a line by line description of all of the changes, use:<br />
<br />
git diff<br />
<br />
When you want the changes you've made to a file you have to be included in your next commit, use <code>git add</code>:<br />
<br />
git add FILE<br />
<br />
If you make more changes to that file, you will have to add it again to have the new changes included.<br />
<br />
=== Stashing and unstashing ===<br />
<br />
Sometimes you may have changes you are not ready to commit yet, but need to stow away while doing tasks like merging. <code>git stash</code> can be useful for this.<br />
<br />
To save a bunch of changes:<br />
<br />
git stash<br />
<br />
To put the changes back:<br />
<br />
git stash pop<br />
<br />
=== Undoing changes ===<br />
<br />
If you have a file with changes and want to revert it to what's currently committed to the branch of the repository you are on, use:<br />
<br />
git checkout -- FILENAME<br />
<br />
If you accidentally added a file to the staging area you are going to be committing, you can unadd it using:<br />
<br />
git reset HEAD FILENAME<br />
<br />
If you want to reset ALL files to what's currently committed to the branch of the repository you are on and discard all changes (DO NOT USE IF YOU WANT TO SAVE ANYTHING), use:<br />
<br />
git reset --hard<br />
<br />
=== Committing changes ===<br />
<br />
Use <code>git add</code> to add the changes you want to commit. Before committing, you may want to briefly review your changes with <code>git status</code> and <code>git diff</code>. <br />
<br />
Once you are satisfied that these changes are the ones you want to make, give the command:<br />
<br />
git commit<br />
<br />
This will open up the command line editor specified in your config. (You can change this with instructions in [[Git settings]].) Write up a good description of the changes included in this commit.<br />
<br />
Git commit messages have a format that's rather peculiar to Git: <br />
<br />
'''First line is a v.short summary: 50 chars or less'''<br />
<br />
After a blank line, give a long-form description of the changes.<br />
You can write a few sentences, several paragraphs, or an essay<br />
complete with theorems, premises, and supporting references --<br />
whatever is needed to clearly document the change.<br />
<br />
The first line is used as a summary by tools like <code>git log --oneline</code>; if it is too long, the output of these tools will display oddly. <br />
<br />
http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html<br />
<br />
{{Expand|text=Writing commit messages: best practices.}}<br />
<br />
If you are making a commit that only needs a short explanation, you can use the -m option:<br />
<br />
git commit -m "(Bug 3492) This describes the change that I just made."<br />
<br />
=== Pushing your changes to your repository on Github ===<br />
<br />
After committing your changes, you need to push them to your repository on Github. You can do this with:<br />
<br />
git push origin BRANCHNAME<br />
<br />
== Making a pull request ==<br />
<br />
=== Bring your branch up to date with develop ===<br />
<br />
Before making a pull request, it's good etiquette to bring your branch up to date with any changes that have happened in <tt>develop</tt> since you initially forked your branch. Once you've made the last of your commits, double-check that you're in the branch you want to submit: <br />
<br />
git branch <br />
<br />
Then fetch changes from Dreamwidth's develop branch and bring your branch up to date with them:<br />
<br />
git fetch dreamwidth<br />
git pull --rebase --ff-only dreamwidth develop<br />
<br />
<tt>pull --rebase</tt> incorporates any new changes from develop into your branch, and it also reorganizes your changes so that changes in your branch appear to start from ''current'' develop, instead of where develop was when you initially started your branch. (Neat!) This can make it much easier to merge your branch into Dreamwidth's main develop branch.<br />
<br />
=== Submit! ===<br />
Then, once everything is all up to date, go to your version of the repository (dw-free or dw-nonfree) that you want to send upstream. By default they should be at:<br />
<br />
* https://github.com/USERNAME/dw-free<br />
* https://github.com/USERNAME/dw-nonfree<br />
<br />
These repositories are separate, so if you have made changes to both of them, you will have to submit pull requests for both of them.<br />
<br />
Find the "Pull Request" button (by "Unwatch") under the top toolbar. Click it and you will be brought to the pull request page.<br />
<br />
Ideally, the initial page should say something like "Oops! dreamwidth:develop is already up-to-date with USERNAME:develop Try a different branch?" That's good--that means that your <code>develop</code> branch is up to date with Dreamwidth's!<br />
<br />
Find the "head branch" drop down and select the branch you want to submit a pull request for (e.g. "bug4335-admin-tt" as per the example given in [[#Starting a new branch]]).<br />
<br />
{{Expand|text=What do we want people to include in the pull request description? Bugzilla URL?}}<br />
<br />
When this is done, press the "Send pull request" button.<br />
<br />
{{Expand|text=Describe making a pull request to another repository other than the DW one!}}<br />
<br />
Finally (and optionally!), go back to the Bugzilla page for your bug, and leave a comment linking to the pull request you've just submitted.<br />
<br />
== Deleting branches ==<br />
<br />
{{Warn|text=Be careful when deleting branches -- while it's often possible to get things back, it can be tricky to do so.}}<br />
<br />
You might create a branch by mistake, or have your changes pulled into the main develop branch on Dreamwidth. To delete the branch locally, use the command:<br />
<br />
git branch -d BRANCHNAME<br />
<br />
If it's a branch that hasn't been merged yet, the above command will give you an error. If you are SURE you still want to delete that branch, use:<br />
<br />
git branch -D BRANCHNAME<br />
<br />
If the branch is also on your Github, you can delete it like this:<br />
<br />
git push origin --delete <branchName><br />
<br />
[[Category: Development]]<br />
[[Category: Git]]</div>Shadowspar//wiki.dreamwidth.net/wiki/index.php/Dreamwidth_Scratch_InstallationDreamwidth Scratch Installation2013-04-28T05:04:20Z<p>Shadowspar: /* Setting up the DW user account */ this seems unnecessarily condescending to me.</p>
<hr />
<div><br />
Firstly, you'll need to set up a Linux system -- here are the [[Suggested Server Requirements]]. These instructions assume Ubuntu 12.04 or up. Please let us know if you run into difficulties--we want to update this if people are having problems! We recommend coming into the #dreamwidth-dev channel on [[IRC]].<br />
<br />
After you set up, you can keep updated with the instructions on [[Dev Maintenance]].<br />
<br />
If you have difficulties or problems or suggestions for installation procedures, please report them to [http://bugs.dwscoalition.org/show_bug.cgi?id=61 Bug 61]. Also look at [[Production Setup: Webserver]]. <br />
<br />
== Bringing the system up to date ==<br />
<br />
Before you start installing anything else, you might want to make sure your system is up to date. You should update the packages on your system (either in a root shell (sudo bash) or preceding these commands with 'sudo'):<br />
<br />
apt-get update<br />
apt-get upgrade<br />
<br />
If you want man pages on your system: <br />
<br />
apt-get install man<br />
<br />
== Installing necessary packages ==<br />
<br />
This will install necessary packages you'll need to run Dreamwidth (and some optional ones). You'll want to be root when running these commands.<br />
<br />
apt-get install git-core subversion apache2-mpm-prefork \<br />
libapache2-mod-perl2 libapache2-mod-apreq2 libapache2-request-perl \<br />
mysql-server wget unzip links vim libclass-autouse-perl \<br />
libdatetime-perl libcache-memcached-perl libhash-multivalue-perl \<br />
libgd-gd2-perl libhtml-template-perl libwww-perl libmime-lite-perl \<br />
libnet-dns-perl liburi-perl libxml-simple-perl libclass-accessor-perl \<br />
libclass-data-inheritable-perl libclass-trigger-perl libcrypt-dh-perl \<br />
libmath-bigint-gmp-perl liburi-fetch-perl libgd-graph-perl \<br />
libgnupg-interface-perl libmail-gnupg-perl perlmagick \<br />
libproc-processtable-perl libsoap-lite-perl librpc-xml-perl \<br />
libstring-crc32-perl libtext-vcard-perl libxml-atom-perl libxml-rss-perl \<br />
libimage-size-perl libunicode-maputf8-perl libgtop2-dev build-essential \<br />
libnet-openid-consumer-perl libnet-openid-server-perl libyaml-perl \<br />
libcaptcha-recaptcha-perl libdbd-sqlite3-perl libtest-simple-perl \<br />
libtest-simpleunit-perl libtemplate-perl libterm-readkey-perl \<br />
gcc libtest-most-perl libgearman-client-perl \<br />
libbusiness-creditcard-perl liblwpx-paranoidagent-perl \<br />
libtheschwartz-perl libfile-type-perl libjson-perl<br />
<br />
This will download about 113MB of files and use around 355MB of disk space.<br />
<br />
Check whether these packages have actually installed. Later on in the process, if you find you are having inexplicable problems, try installing these again.<br />
<br />
<br />
=== Then ===<br />
<br />
[http://perl.apache.org/docs/2.0/user/install/install.html#Prerequisites Check] whether your system is using threaded MPMs or pre-fork. You will need the latter. (Note: if you ran the above command to install Apache, then you have the pre-fork version installed.)<br />
<br />
If you have weird errors saying things like "Package mercurial is not available, but is referred to by another package.", try editing <tt>/etc/apt/sources.list</tt> and uncommenting the other repositories and then doing an <tt>apt-get</tt> update. Ran into this problem on a fresh install of <tt>jaunty</tt> on Linode.<br />
<br />
You will also want to install some perl libraries with CPAN. Defaults during CPAN's setup should be okay.<br />
<br />
Before installing, check if your CPAN shell has 'make' at the correct location. Run <tt>which make</tt>, then compare the results with running <tt>o conf make</tt> at the CPAN shell (to run the CPAN shell, type <tt>cpan</tt>.)<br />
<br />
The perl libraries are:<br />
<br />
cpan Bundle::CPAN # this will guide you through setting up CPAN<br />
cpan GTop <br />
cpan Digest::SHA1<br />
cpan Unicode::CheckUTF8<br />
cpan MogileFS::Client # this is necessary even if you don't use MogileFS<br />
cpan TheSchwartz::Worker::SendEmail<br />
cpan TheSchwartz::Worker::PubSubHubbubPublish<br />
<br />
See [http://wiki.dwscoalition.org/notes/Bundle::CPAN Bundle::CPAN] if you are having trouble installing Bundle::CPAN<br />
<br />
You will also want to install and configure Postfix so your DW can send out email:<br />
<br />
apt-get install postfix<br />
<br />
If you choose not to configure on the install, you can do so later with:<br />
<br />
dpkg-reconfigure postfix<br />
<br />
== Set Timezone to UTC ==<br />
<br />
Dreamwidth will complain if you aren't running in UTC. If you're not configured for UTC already, you can reset it (on Ubuntu/Debian) using<br />
<br />
dpkg-reconfigure tzdata<br />
<br />
and choose Etc/UTC.<br />
<br />
== Setting up the DW user account ==<br />
<br />
{{Note|text=If you still find yourself unable to make sudo commands even after <code>usermod</code>, please see [[Making your DW user a sudo account]] for alternatives.}} Create a user account that will be used for the code. This can be your own personal account if you wish, but it is recommended that you setup a new user that is only going to be used for running the code. That way if you have any insecure code running (i.e., a bad page, or a patch you're working on doesn't have security implemented yet) you don't have to worry about someone getting access to your personal files.<br />
<br />
To set up the user account:<br />
<br />
adduser <i>username</i><br />
<br />
Fill out the user's info and put them in the sudo group:<br />
<br />
usermod -a -G sudo <i>username</i><br />
<br />
So, to use <code>dw</code> as a username:<br />
<br />
adduser dw<br />
usermod -a -G sudo dw<br />
<br />
Now, we will get the $LJHOME variable set. Log into your user:<br />
<br />
su - dw<br />
<br />
We will assume that you use the bash shell. If you do not, then this section does not apply. You will have to find the shell specific way of setting environment variables.<br />
<br />
For bash, you should look in the home directory of the user account you just created for a file .profile. You will want to add one more line to this file:<br />
<br />
export LJHOME=/home/dw/dw<br />
<br />
Or wherever it is that you want the root of your source code install to be. Yes, the variable is named LJHOME. We'll live with it for now. ;-)<br />
<br />
Test this. Log out of the dw user account and log back in, then type:<br />
<br />
echo $LJHOME<br />
<br />
You should see <tt>/home/dw/dw</tt> or whatever you set it to. If you don't, then something has gone awry -- maybe the export line isn't in the right place..?<br />
<br />
== Get the Dreamwidth code ==<br />
<br />
=== Set up GitHub ===<br />
<br />
First, create an account on Github. Then, you will need to fork these two repositories:<br />
<br />
* https://github.com/dreamwidth/dw-free<br />
* https://github.com/dreamwidth/dw-nonfree<br />
<br />
Go to each of their pages, and click the "Fork" button. This sets up your own copy of Dreamwidth's code which use to make and submit your changes.<br />
<br />
Here's a quick overview of how the repositories will work together:<br />
<br />
* dw-free is the main repository and goes into $LJHOME<br />
* other repositories will go into $LJHOME/ext<br />
* personal config files go into $LJHOME/ext/local<br />
* All code from dw-free ($LJHOME) and the additional repos under $LJHOME/ext are automatically live when you start your server. There's no need to run any additional syncing steps anymore.<br />
<br />
=== Set up dw-free ===<br />
<br />
Replace the USERNAME sections of the URL with your Github username. This will make your repository an authenticated version that can push changes back to Github, as opposed to only being able to pull them.<br />
<br />
# clone a copy of the repository onto your machine<br />
cd ~/<br />
git clone https://USERNAME@github.com/USERNAME/dw-free.git $LJHOME<br />
cd $LJHOME<br />
<br />
# and let's make it aware of the dreamwidth repository so we can grab updates later<br />
git remote add dreamwidth https://github.com/dreamwidth/dw-free<br />
git fetch dreamwidth<br />
# we also want to sync up with the main branches<br />
git branch --set-upstream develop dreamwidth/develop <br />
git branch --set-upstream master dreamwidth/master<br />
<br />
=== Set up dw-nonfree ===<br />
<br />
{{ Warn|text=For dev servers only. Clone sites should not use dw-nonfree because it contains Dreamwidth-specific branding and files}}<br />
<br />
cd $LJHOME/ext<br />
git clone https://USERNAME@github.com/USERNAME/dw-nonfree.git<br />
cd dw-nonfree<br />
git remote add dreamwidth https://github.com/dreamwidth/dw-nonfree<br />
git fetch dreamwidth<br />
git branch --set-upstream develop dreamwidth/develop <br />
git branch --set-upstream master dreamwidth/master<br />
cd ..<br />
<br />
== Database setup ==<br />
<br />
You should have a local MySQL installation and know the root login to the database. To sign into MySQL as root:<br />
<br />
mysql -u root -p <br />
<br />
These MySQL commands wil create your development database:<br />
<br />
create database dw;<br />
grant all on dw.* to 'dw'@'localhost' identified by 'somePassword';<br />
<br />
You might want to pick a more appropriate database username/database name/password.<br />
<br />
While you're here, you probably want to go ahead and create a database for TheSchwartz, too, unless you really know that you won't need it:<br />
<br />
create database dw_schwartz;<br />
grant all on dw_schwartz.* to 'dw'@'localhost' identified by 'somePassword';<br />
<br />
When you're done, exit out of mysql:<br />
<br />
quit;<br />
<br />
== Editing the config files ==<br />
<br />
Next you need to configure the site configuration scripts. This is probably the most tricky part of the whole process, since there are so many things you can tweak. However, you can get by with just tweaking etc/config-local.pl and etc/config-private.pl for now:<br />
<br />
## copy over your config files, and tell them to take priority<br />
## over config files in any of the repos<br />
cd $LJHOME<br />
mkdir -p ext/local/etc<br />
echo "highest" > ext/local/.dir_scope<br />
cp doc/config-local.pl.txt ext/local/etc/config-local.pl<br />
vim ext/local/etc/config-local.pl<br />
<br />
Or use your editor of choice, of course. Do a search for the phrase 'CHANGE THIS' which occurs once, before the block of human readable text you should use to describe your development installation.<br />
<br />
Note that the <var>$IS_DEV_SERVER</var> flag is set to 1 in the template given. Be sure to set this to 0 for a production site, as there are big security issues involved with leaving the flag set to 1. <br />
<br />
Next, you need to change your local variables in the <tt>config-private.pl</tt> file. This is where your passwords are configured, as well as many of the variables which define your domain. Do a search for the phrase 'CHANGETHIS'(note the slightly different spacing). You will want to change at least your <var>$DOMAIN</var> and the <var>%DBINFO</var> structure.<br />
<br />
cd $LJHOME<br />
cp doc/config-private.pl.txt ext/local/etc/config-private.pl<br />
chmod go-rwx ext/local/etc/config-private.pl<br />
vim ext/local/etc/config-private.pl<br />
<br />
In this file, uncomment the lines in the <var>%DBINFO</var> blocks (if they are commented out), and place your database password in quotes on the "pass => ," line, before the comma. For example:<br />
<br />
%DBINFO = (<br />
master => {<br />
pass => 'mypassword',<br />
},<br />
);<br />
<br />
Note that there are two DBINFO blocks; get them both.<br />
<br />
If you created the database for TheSchwartz earlier, you'll also want to configure it:<br />
<br />
# Schwartz DB configuration<br />
@THESCHWARTZ_DBS = (<br />
{<br />
dsn => 'dbi:mysql:dw_schwartz;host=localhost',<br />
user => 'dw',<br />
pass => '', # CHANGETHIS<br />
},<br />
);<br />
<br />
The base configuration file is under source control, and is already in <tt>etc/config.pl</tt>. You should not need to change anything very much in this, but you might have to change some stuff. If you find you do have to touch this, copy it over first, then you can edit it:<br />
<br />
cd $LJHOME<br />
cp etc/config.pl ext/local/etc/config.pl<br />
vim ext/local/etc/config.pl<br />
<br />
<br />
Note that from here on, when any documentation says to edit etc/config*, you'll likely want to edit ext/local/etc/config-* instead.<br />
<br />
== Make sure things are working with checkconfig.pl ==<br />
<br />
Now, you need to see if everything is working. <br />
<br />
If you've setup the files as indicated above, run this command:<br />
<br />
cd $LJHOME<br />
bin/checkconfig.pl --no=ljconfig<br />
<br />
If you installed everything given at the top of this page, you should find you have no missing modules. Congratulations! If you don't have all the modules, this is where you need some systems specific knowledge for your system. You will need to install whatever modules are missing. If you get well and truly stuck, find someone on IRC or the mailing list.<br />
<br />
== Populate database with initial data ==<br />
<br />
There are a few commands you can now run to install the database. Just run these and watch for errors.<br />
<br />
<b>Note:</b> If make_system.pl says it can't give the system user admin [[privileges]], something has gone wrong with your database population, even if there were no errors.<br />
<br />
$LJHOME/bin/upgrading/update-db.pl -r --innodb<br />
$LJHOME/bin/upgrading/update-db.pl -r --innodb # at least for now we have to run this twice<br />
$LJHOME/bin/upgrading/update-db.pl -r --cluster=all --innodb<br />
$LJHOME/bin/upgrading/update-db.pl -p<br />
<br />
If you created your database for TheSchwartz earlier, you'll also want to populate it with its default tables:<br />
<br />
mysql -u dw -p dw_schwartz < /usr/share/doc/libtheschwartz-perl/schema.sql<br />
<br />
<br />
Create a system account:<br />
<br />
$LJHOME/bin/upgrading/make_system.pl<br />
<br />
(That step will ask you for a password for the [[System account]]. You can change it later by logging in as system, so just give it something for now.)<br />
<br />
And load in the translation strings:<br />
<br />
$LJHOME/bin/upgrading/texttool.pl load<br />
<br />
== Configure Apache ==<br />
<br />
This step will need to be done as the root user. Below is the Apache 2 configuration running on the Dreamwidth staging site. Put this in a file named "stage" in /etc/apache2/conf.d:<br />
<br />
User dw<br />
Group dw<br />
UseCanonicalName off<br />
<br />
StartServers 1<br />
MaxSpareServers 2<br />
MinSpareServers 1<br />
<br />
DocumentRoot /home/dw/htdocs<br />
<br />
PerlSetEnv LJHOME /home/dw/dw<br />
PerlPassEnv LJHOME<br />
<br />
PerlRequire /home/dw/dw/cgi-bin/modperl.pl<br />
<br />
Then disable the default site:<br />
<br />
a2dissite default<br />
<br />
You might also have to enable the Perl Apache Request module:<br />
<br />
a2enmod apreq<br />
<br />
If you don't want this warning:<br />
<br />
[Thu Jan 15 01:46:54 2009] [warn] NameVirtualHost *:80 has no VirtualHosts<br />
... waiting [Thu Jan 15 01:46:55 2009] [warn] NameVirtualHost *:80 has no VirtualHosts<br />
...done.<br />
<br />
Then use <code>vim /etc/apache2/ports.conf</code> and put a # in front of the NameVirtualHost line:<br />
<br />
# NameVirtualHost *:80<br />
<br />
Restart the server:<br />
<br />
/etc/init.d/apache2 restart<br />
<br />
== Now what? ==<br />
<br />
=== Have a look at your new DW instance ===<br />
<br />
Congratulations! You now have a working (though minimal) Dreamwidth install. If you point your web browser at your server, you should see a bare-looking welcome page.<br />
<br />
=== Further setup ===<br />
<br />
There are lots of other articles on setting up and customizing your DW install in the [[:Category: Dreamwidth Installation|DW Installation]] category, including:<br />
<br />
* [[TheSchwartz Setup]] - TheSchwartz is needed for a handful of features - notably comment posting<br />
* [[Subdomain setup]]<br />
* [[Statistics setup]]<br />
* [[Generating documentation]]<br />
* [[Allow users to register]]<br />
<br />
There is a list of wanted how-tos at [[Installation Wanted How-To]], in case you need to add something to the list.<br />
<br />
=== Starting development ===<br />
<br />
If you haven't already, see [[Dev Getting Started]].<br />
<br />
[[Category: Dreamwidth Installation]]</div>Shadowspar//wiki.dreamwidth.net/wiki/index.php/Dreamwidth_Scratch_InstallationDreamwidth Scratch Installation2013-04-28T04:59:09Z<p>Shadowspar: installing code directly under $HOME ($LJHOME=/home/dw) isn't recommended according to discussion here: https://github.com/dreamwidth/dw-free/pull/355</p>
<hr />
<div><br />
Firstly, you'll need to set up a Linux system -- here are the [[Suggested Server Requirements]]. These instructions assume Ubuntu 12.04 or up. Please let us know if you run into difficulties--we want to update this if people are having problems! We recommend coming into the #dreamwidth-dev channel on [[IRC]].<br />
<br />
After you set up, you can keep updated with the instructions on [[Dev Maintenance]].<br />
<br />
If you have difficulties or problems or suggestions for installation procedures, please report them to [http://bugs.dwscoalition.org/show_bug.cgi?id=61 Bug 61]. Also look at [[Production Setup: Webserver]]. <br />
<br />
== Bringing the system up to date ==<br />
<br />
Before you start installing anything else, you might want to make sure your system is up to date. You should update the packages on your system (either in a root shell (sudo bash) or preceding these commands with 'sudo'):<br />
<br />
apt-get update<br />
apt-get upgrade<br />
<br />
If you want man pages on your system: <br />
<br />
apt-get install man<br />
<br />
== Installing necessary packages ==<br />
<br />
This will install necessary packages you'll need to run Dreamwidth (and some optional ones). You'll want to be root when running these commands.<br />
<br />
apt-get install git-core subversion apache2-mpm-prefork \<br />
libapache2-mod-perl2 libapache2-mod-apreq2 libapache2-request-perl \<br />
mysql-server wget unzip links vim libclass-autouse-perl \<br />
libdatetime-perl libcache-memcached-perl libhash-multivalue-perl \<br />
libgd-gd2-perl libhtml-template-perl libwww-perl libmime-lite-perl \<br />
libnet-dns-perl liburi-perl libxml-simple-perl libclass-accessor-perl \<br />
libclass-data-inheritable-perl libclass-trigger-perl libcrypt-dh-perl \<br />
libmath-bigint-gmp-perl liburi-fetch-perl libgd-graph-perl \<br />
libgnupg-interface-perl libmail-gnupg-perl perlmagick \<br />
libproc-processtable-perl libsoap-lite-perl librpc-xml-perl \<br />
libstring-crc32-perl libtext-vcard-perl libxml-atom-perl libxml-rss-perl \<br />
libimage-size-perl libunicode-maputf8-perl libgtop2-dev build-essential \<br />
libnet-openid-consumer-perl libnet-openid-server-perl libyaml-perl \<br />
libcaptcha-recaptcha-perl libdbd-sqlite3-perl libtest-simple-perl \<br />
libtest-simpleunit-perl libtemplate-perl libterm-readkey-perl \<br />
gcc libtest-most-perl libgearman-client-perl \<br />
libbusiness-creditcard-perl liblwpx-paranoidagent-perl \<br />
libtheschwartz-perl libfile-type-perl libjson-perl<br />
<br />
This will download about 113MB of files and use around 355MB of disk space.<br />
<br />
Check whether these packages have actually installed. Later on in the process, if you find you are having inexplicable problems, try installing these again.<br />
<br />
<br />
=== Then ===<br />
<br />
[http://perl.apache.org/docs/2.0/user/install/install.html#Prerequisites Check] whether your system is using threaded MPMs or pre-fork. You will need the latter. (Note: if you ran the above command to install Apache, then you have the pre-fork version installed.)<br />
<br />
If you have weird errors saying things like "Package mercurial is not available, but is referred to by another package.", try editing <tt>/etc/apt/sources.list</tt> and uncommenting the other repositories and then doing an <tt>apt-get</tt> update. Ran into this problem on a fresh install of <tt>jaunty</tt> on Linode.<br />
<br />
You will also want to install some perl libraries with CPAN. Defaults during CPAN's setup should be okay.<br />
<br />
Before installing, check if your CPAN shell has 'make' at the correct location. Run <tt>which make</tt>, then compare the results with running <tt>o conf make</tt> at the CPAN shell (to run the CPAN shell, type <tt>cpan</tt>.)<br />
<br />
The perl libraries are:<br />
<br />
cpan Bundle::CPAN # this will guide you through setting up CPAN<br />
cpan GTop <br />
cpan Digest::SHA1<br />
cpan Unicode::CheckUTF8<br />
cpan MogileFS::Client # this is necessary even if you don't use MogileFS<br />
cpan TheSchwartz::Worker::SendEmail<br />
cpan TheSchwartz::Worker::PubSubHubbubPublish<br />
<br />
See [http://wiki.dwscoalition.org/notes/Bundle::CPAN Bundle::CPAN] if you are having trouble installing Bundle::CPAN<br />
<br />
You will also want to install and configure Postfix so your DW can send out email:<br />
<br />
apt-get install postfix<br />
<br />
If you choose not to configure on the install, you can do so later with:<br />
<br />
dpkg-reconfigure postfix<br />
<br />
== Set Timezone to UTC ==<br />
<br />
Dreamwidth will complain if you aren't running in UTC. If you're not configured for UTC already, you can reset it (on Ubuntu/Debian) using<br />
<br />
dpkg-reconfigure tzdata<br />
<br />
and choose Etc/UTC.<br />
<br />
== Setting up the DW user account ==<br />
<br />
{{Note|text=If you still find yourself unable to make sudo commands even after <code>usermod</code>, please see [[Making your DW user a sudo account]] for alternatives.}} Create a user account that will be used for the code. This can be your own personal account if you wish, but it is recommended that you setup a new user that is only going to be used for running the code. That way if you have any insecure code running (i.e., a bad page, or a patch you're working on doesn't have security implemented yet) you don't have to worry about someone getting access to your personal files.<br />
<br />
To set up the user account:<br />
<br />
adduser <i>username</i><br />
<br />
Fill out the user's info and put them in the sudo group:<br />
<br />
usermod -a -G sudo <i>username</i><br />
<br />
So, to use <code>dw</code> as a username:<br />
<br />
adduser dw<br />
usermod -a -G sudo dw<br />
<br />
Now, we will get the $LJHOME variable set. Log into your user:<br />
<br />
su - dw<br />
<br />
We will assume that you use the bash shell. If you do not, then this section does not apply. You will have to find the shell specific way of setting environment variables.<br />
<br />
For bash, you should look in the home directory of the user account you just created for a file .profile. You will want to add one more line to this file:<br />
<br />
export LJHOME=/home/dw/dw<br />
<br />
Or wherever it is that you want the root of your source code install to be. Yes, the variable is named LJHOME. We'll live with it for now. ;-)<br />
<br />
Test this. Log out of your user account and log back in, then type:<br />
<br />
echo $LJHOME<br />
<br />
You should see <tt>/home/dw/dw</tt> or whatever you set it to. If you don't, then you didn't get the export line in the right place. (Hey, I'm not here to teach basic sysadmin stuff. You should know how to set environment variables.)<br />
<br />
== Get the Dreamwidth code ==<br />
<br />
=== Set up GitHub ===<br />
<br />
First, create an account on Github. Then, you will need to fork these two repositories:<br />
<br />
* https://github.com/dreamwidth/dw-free<br />
* https://github.com/dreamwidth/dw-nonfree<br />
<br />
Go to each of their pages, and click the "Fork" button. This sets up your own copy of Dreamwidth's code which use to make and submit your changes.<br />
<br />
Here's a quick overview of how the repositories will work together:<br />
<br />
* dw-free is the main repository and goes into $LJHOME<br />
* other repositories will go into $LJHOME/ext<br />
* personal config files go into $LJHOME/ext/local<br />
* All code from dw-free ($LJHOME) and the additional repos under $LJHOME/ext are automatically live when you start your server. There's no need to run any additional syncing steps anymore.<br />
<br />
=== Set up dw-free ===<br />
<br />
Replace the USERNAME sections of the URL with your Github username. This will make your repository an authenticated version that can push changes back to Github, as opposed to only being able to pull them.<br />
<br />
# clone a copy of the repository onto your machine<br />
cd ~/<br />
git clone https://USERNAME@github.com/USERNAME/dw-free.git $LJHOME<br />
cd $LJHOME<br />
<br />
# and let's make it aware of the dreamwidth repository so we can grab updates later<br />
git remote add dreamwidth https://github.com/dreamwidth/dw-free<br />
git fetch dreamwidth<br />
# we also want to sync up with the main branches<br />
git branch --set-upstream develop dreamwidth/develop <br />
git branch --set-upstream master dreamwidth/master<br />
<br />
=== Set up dw-nonfree ===<br />
<br />
{{ Warn|text=For dev servers only. Clone sites should not use dw-nonfree because it contains Dreamwidth-specific branding and files}}<br />
<br />
cd $LJHOME/ext<br />
git clone https://USERNAME@github.com/USERNAME/dw-nonfree.git<br />
cd dw-nonfree<br />
git remote add dreamwidth https://github.com/dreamwidth/dw-nonfree<br />
git fetch dreamwidth<br />
git branch --set-upstream develop dreamwidth/develop <br />
git branch --set-upstream master dreamwidth/master<br />
cd ..<br />
<br />
== Database setup ==<br />
<br />
You should have a local MySQL installation and know the root login to the database. To sign into MySQL as root:<br />
<br />
mysql -u root -p <br />
<br />
These MySQL commands wil create your development database:<br />
<br />
create database dw;<br />
grant all on dw.* to 'dw'@'localhost' identified by 'somePassword';<br />
<br />
You might want to pick a more appropriate database username/database name/password.<br />
<br />
While you're here, you probably want to go ahead and create a database for TheSchwartz, too, unless you really know that you won't need it:<br />
<br />
create database dw_schwartz;<br />
grant all on dw_schwartz.* to 'dw'@'localhost' identified by 'somePassword';<br />
<br />
When you're done, exit out of mysql:<br />
<br />
quit;<br />
<br />
== Editing the config files ==<br />
<br />
Next you need to configure the site configuration scripts. This is probably the most tricky part of the whole process, since there are so many things you can tweak. However, you can get by with just tweaking etc/config-local.pl and etc/config-private.pl for now:<br />
<br />
## copy over your config files, and tell them to take priority<br />
## over config files in any of the repos<br />
cd $LJHOME<br />
mkdir -p ext/local/etc<br />
echo "highest" > ext/local/.dir_scope<br />
cp doc/config-local.pl.txt ext/local/etc/config-local.pl<br />
vim ext/local/etc/config-local.pl<br />
<br />
Or use your editor of choice, of course. Do a search for the phrase 'CHANGE THIS' which occurs once, before the block of human readable text you should use to describe your development installation.<br />
<br />
Note that the <var>$IS_DEV_SERVER</var> flag is set to 1 in the template given. Be sure to set this to 0 for a production site, as there are big security issues involved with leaving the flag set to 1. <br />
<br />
Next, you need to change your local variables in the <tt>config-private.pl</tt> file. This is where your passwords are configured, as well as many of the variables which define your domain. Do a search for the phrase 'CHANGETHIS'(note the slightly different spacing). You will want to change at least your <var>$DOMAIN</var> and the <var>%DBINFO</var> structure.<br />
<br />
cd $LJHOME<br />
cp doc/config-private.pl.txt ext/local/etc/config-private.pl<br />
chmod go-rwx ext/local/etc/config-private.pl<br />
vim ext/local/etc/config-private.pl<br />
<br />
In this file, uncomment the lines in the <var>%DBINFO</var> blocks (if they are commented out), and place your database password in quotes on the "pass => ," line, before the comma. For example:<br />
<br />
%DBINFO = (<br />
master => {<br />
pass => 'mypassword',<br />
},<br />
);<br />
<br />
Note that there are two DBINFO blocks; get them both.<br />
<br />
If you created the database for TheSchwartz earlier, you'll also want to configure it:<br />
<br />
# Schwartz DB configuration<br />
@THESCHWARTZ_DBS = (<br />
{<br />
dsn => 'dbi:mysql:dw_schwartz;host=localhost',<br />
user => 'dw',<br />
pass => '', # CHANGETHIS<br />
},<br />
);<br />
<br />
The base configuration file is under source control, and is already in <tt>etc/config.pl</tt>. You should not need to change anything very much in this, but you might have to change some stuff. If you find you do have to touch this, copy it over first, then you can edit it:<br />
<br />
cd $LJHOME<br />
cp etc/config.pl ext/local/etc/config.pl<br />
vim ext/local/etc/config.pl<br />
<br />
<br />
Note that from here on, when any documentation says to edit etc/config*, you'll likely want to edit ext/local/etc/config-* instead.<br />
<br />
== Make sure things are working with checkconfig.pl ==<br />
<br />
Now, you need to see if everything is working. <br />
<br />
If you've setup the files as indicated above, run this command:<br />
<br />
cd $LJHOME<br />
bin/checkconfig.pl --no=ljconfig<br />
<br />
If you installed everything given at the top of this page, you should find you have no missing modules. Congratulations! If you don't have all the modules, this is where you need some systems specific knowledge for your system. You will need to install whatever modules are missing. If you get well and truly stuck, find someone on IRC or the mailing list.<br />
<br />
== Populate database with initial data ==<br />
<br />
There are a few commands you can now run to install the database. Just run these and watch for errors.<br />
<br />
<b>Note:</b> If make_system.pl says it can't give the system user admin [[privileges]], something has gone wrong with your database population, even if there were no errors.<br />
<br />
$LJHOME/bin/upgrading/update-db.pl -r --innodb<br />
$LJHOME/bin/upgrading/update-db.pl -r --innodb # at least for now we have to run this twice<br />
$LJHOME/bin/upgrading/update-db.pl -r --cluster=all --innodb<br />
$LJHOME/bin/upgrading/update-db.pl -p<br />
<br />
If you created your database for TheSchwartz earlier, you'll also want to populate it with its default tables:<br />
<br />
mysql -u dw -p dw_schwartz < /usr/share/doc/libtheschwartz-perl/schema.sql<br />
<br />
<br />
Create a system account:<br />
<br />
$LJHOME/bin/upgrading/make_system.pl<br />
<br />
(That step will ask you for a password for the [[System account]]. You can change it later by logging in as system, so just give it something for now.)<br />
<br />
And load in the translation strings:<br />
<br />
$LJHOME/bin/upgrading/texttool.pl load<br />
<br />
== Configure Apache ==<br />
<br />
This step will need to be done as the root user. Below is the Apache 2 configuration running on the Dreamwidth staging site. Put this in a file named "stage" in /etc/apache2/conf.d:<br />
<br />
User dw<br />
Group dw<br />
UseCanonicalName off<br />
<br />
StartServers 1<br />
MaxSpareServers 2<br />
MinSpareServers 1<br />
<br />
DocumentRoot /home/dw/htdocs<br />
<br />
PerlSetEnv LJHOME /home/dw/dw<br />
PerlPassEnv LJHOME<br />
<br />
PerlRequire /home/dw/dw/cgi-bin/modperl.pl<br />
<br />
Then disable the default site:<br />
<br />
a2dissite default<br />
<br />
You might also have to enable the Perl Apache Request module:<br />
<br />
a2enmod apreq<br />
<br />
If you don't want this warning:<br />
<br />
[Thu Jan 15 01:46:54 2009] [warn] NameVirtualHost *:80 has no VirtualHosts<br />
... waiting [Thu Jan 15 01:46:55 2009] [warn] NameVirtualHost *:80 has no VirtualHosts<br />
...done.<br />
<br />
Then use <code>vim /etc/apache2/ports.conf</code> and put a # in front of the NameVirtualHost line:<br />
<br />
# NameVirtualHost *:80<br />
<br />
Restart the server:<br />
<br />
/etc/init.d/apache2 restart<br />
<br />
== Now what? ==<br />
<br />
=== Have a look at your new DW instance ===<br />
<br />
Congratulations! You now have a working (though minimal) Dreamwidth install. If you point your web browser at your server, you should see a bare-looking welcome page.<br />
<br />
=== Further setup ===<br />
<br />
There are lots of other articles on setting up and customizing your DW install in the [[:Category: Dreamwidth Installation|DW Installation]] category, including:<br />
<br />
* [[TheSchwartz Setup]] - TheSchwartz is needed for a handful of features - notably comment posting<br />
* [[Subdomain setup]]<br />
* [[Statistics setup]]<br />
* [[Generating documentation]]<br />
* [[Allow users to register]]<br />
<br />
There is a list of wanted how-tos at [[Installation Wanted How-To]], in case you need to add something to the list.<br />
<br />
=== Starting development ===<br />
<br />
If you haven't already, see [[Dev Getting Started]].<br />
<br />
[[Category: Dreamwidth Installation]]</div>Shadowspar//wiki.dreamwidth.net/wiki/index.php/Git_Getting_StartedGit Getting Started2013-04-27T03:57:50Z<p>Shadowspar: </p>
<hr />
<div>Dreamwidth uses Git for source code control, with the code being hosted on GitHub. <br />
<br />
== Learning Git: Resources ==<br />
* ''Git for Ages 4 and Up'': aka "The Tinker Toy Demonstration". Probably one of the best ways to learn how Git works "under the hood". Many of the things Git does make much more sense once you know a little about what's happening behind the scenes. <br />
** LCA 2013: [https://lca2013.linux.org.au/wiki/Tutorials/Git_For_Ages_4_And_Up Talk page with resources] [http://www.youtube.com/watch?v=1ffBJ4sVUb4 youtube video] [http://mirror.internode.on.net/pub/linux.conf.au/2013/mp4/Git_For_Ages_4_And_Up.mp4 mp4 video download]<br />
** OSDC.au 2010: [http://2010.osdc.com.au/proposal/196/git-ages-4-and talk page] [http://blip.tv/open-source-developers-conference/git-for-ages-4-and-up-4460524 blip.tv video]<br />
* [http://vimeo.com/35778382 Introduction to Git - video]<br />
* [http://www.slideshare.net/RandalSchwartz/introduction-to-git-11451326 Introduction to Git - slides]<br />
* [http://git-scm.com/book Pro Git] by Scott Chacon, available free of charge in many formats<br />
* [http://openhatch.org/missions/git OpenHatch's Intro to Git training mission]<br />
* [http://beust.com/weblog/2010/04/06/git-for-the-nervous-developer/ Git for the nervous developer]<br />
* [http://thkoch2001.github.com/whygitisbetter/ Why Git is better]<br />
* [https://help.github.com/ Github help documentation]<br />
<br />
If you'd like some ''serious'' extra-credit reading, have a look at [http://git.wiki.kernel.org/index.php/GitDocumentation the Git documentation!]<br />
<br />
== Installing Git ==<br />
<br />
First of all, if you have a [[Dreamhacks|Dreamhack]], you skip this step -- Git is already installed for you. =)<br />
<br />
If you want to develop on your own computer, there are a number of different ways to get hold of Git. <br />
<br />
; Linux/BSD/Other Unixen <br />
: The preferred way to install Git is through your distribution's package manager. For Debian, Ubuntu, and other Debian-based dists: <code>apt-get install git</code>.<br />
; Mac OS X <br />
: You can install Git with one of the OS X add-on package managers, like [http://mxcl.github.io/homebrew/ homebrew]. <br />
: You can grab an installer package from [http://git-scm.com/downloads the main Git site].<br />
: Github [https://help.github.com/articles/set-up-git has a customized client of their own], which includes Git. <br />
; Windows<br />
: You can grab an installer package from [http://git-scm.com/downloads the main Git site].<br />
: Github [https://help.github.com/articles/set-up-git has a customized client of their own], which includes Git. <br />
; Building Git from Source<br />
: Finally, if you have a system where none of the above options will work for you -- for instance, a Mac running OS X Tiger (10.4.11) or earlier -- you can download the Git source code and build it yourself! Compiling Git is actually fairly straightforward, at least compared to some open source packages. Feel free to ask for help in the <tt>#dreamwidth-dev</tt> [[IRC]] channel if you need to go down this road -- <dwuser>shadowspar</dwuser> has been there before. <br />
<br />
<br />
== Using Git for Dreamwidth Development ==<br />
* [[Moving your Dreamwidth installation to use Github]] -- If you're ready to start transitioning your dev environment<br />
* [[Git commit messages]]<br />
<br />
<br />
[[Category: Getting Started]]<br />
[[Category: Development]]<br />
[[Category: Git]]</div>Shadowspar//wiki.dreamwidth.net/wiki/index.php/Git_Getting_StartedGit Getting Started2013-04-27T03:56:45Z<p>Shadowspar: </p>
<hr />
<div>Dreamwidth uses Git for source code control, with the code being hosted on GitHub. <br />
<br />
== Learning Git: Resources ==<br />
* ''Git for Ages 4 and Up'': aka "The Tinker Toy Demonstration". Probably one of the best ways to learn how Git works "under the hood". Many of the things Git does make much more sense once you know a little about what's happening behind the scenes. <br />
** LCA 2013: [https://lca2013.linux.org.au/wiki/Tutorials/Git_For_Ages_4_And_Up Talk page with resources] [http://www.youtube.com/watch?v=1ffBJ4sVUb4 youtube video] [http://mirror.internode.on.net/pub/linux.conf.au/2013/mp4/Git_For_Ages_4_And_Up.mp4 mp4 video download]<br />
** OSDC.au 2010: [http://2010.osdc.com.au/proposal/196/git-ages-4-and talk page] [http://blip.tv/open-source-developers-conference/git-for-ages-4-and-up-4460524 blip.tv video]<br />
* [http://vimeo.com/35778382 Introduction to Git - video]<br />
* [http://www.slideshare.net/RandalSchwartz/introduction-to-git-11451326 Introduction to Git - slides]<br />
* [http://git-scm.com/book Pro Git] by Scott Chacon, available free of charge in many formats<br />
* [http://openhatch.org/missions/git OpenHatch's Intro to Git training mission]<br />
* [http://beust.com/weblog/2010/04/06/git-for-the-nervous-developer/ Git for the nervous developer]<br />
* [http://thkoch2001.github.com/whygitisbetter/ Why Git is better]<br />
* [https://help.github.com/ Github help documentation]<br />
<br />
If you'd like some ''serious'' extra-credit reading, have a look at [http://git.wiki.kernel.org/index.php/GitDocumentation the Git documentation!]<br />
<br />
== Installing Git ==<br />
<br />
First of all, if you have a [[Dreamhacks|Dreamhack]], you skip this step -- Git is already installed for you. =)<br />
<br />
If you want to develop on your own computer, there are a number of different ways to get hold of Git. <br />
<br />
; Linux/BSD/Other Unixen <br />
: The preferred way to install Git is through your distribution's package manager. For Debian, Ubuntu, and other Debian-based dists: <code>apt-get install git</code>.<br />
; Mac OS X <br />
: You can install Git with one of the OS X add-on package managers, like [http://mxcl.github.io/homebrew/ homebrew]. <br />
: You can grab an installer package from [http://git-scm.com/downloads the main Git site].<br />
: Github [https://help.github.com/articles/set-up-git has a customized client of their own], which includes Git. <br />
; Windows<br />
: You can grab an installer package from [http://git-scm.com/downloads the main Git site].<br />
: Github [https://help.github.com/articles/set-up-git has a customized client of their own], which includes Git. <br />
<br />
Finally, if you have a system where none of the above options will work for you -- for instance, a Mac running OS X Tiger (10.4.11) or earlier -- you can download the Git source code and build it yourself! Compiling Git is actually fairly straightforward, at least compared to some open source packages. Feel free to ask for help in the <tt>#dreamwidth-dev</tt> [[IRC]] channel if you need to go down this road -- <dwuser>shadowspar</dwuser> has been there before. <br />
<br />
<br />
== Using Git for Dreamwidth Development ==<br />
* [[Moving your Dreamwidth installation to use Github]] -- If you're ready to start transitioning your dev environment<br />
* [[Git commit messages]]<br />
<br />
<br />
[[Category: Getting Started]]<br />
[[Category: Development]]<br />
[[Category: Git]]</div>Shadowspar//wiki.dreamwidth.net/wiki/index.php/Git_Getting_StartedGit Getting Started2013-04-27T03:56:17Z<p>Shadowspar: +sections; +installing git section</p>
<hr />
<div>Dreamwidth uses Git for source code control, with the code being hosted on GitHub. <br />
<br />
== Learning Git: Resources ==<br />
* ''Git for Ages 4 and Up'': aka "The Tinker Toy Demonstration". Probably one of the best ways to learn how Git works "under the hood". Many of the things Git does make much more sense once you know a little about what's happening behind the scenes. <br />
** LCA 2013: [https://lca2013.linux.org.au/wiki/Tutorials/Git_For_Ages_4_And_Up Talk page with resources] [http://www.youtube.com/watch?v=1ffBJ4sVUb4 youtube video] [http://mirror.internode.on.net/pub/linux.conf.au/2013/mp4/Git_For_Ages_4_And_Up.mp4 mp4 video download]<br />
** OSDC.au 2010: [http://2010.osdc.com.au/proposal/196/git-ages-4-and talk page] [http://blip.tv/open-source-developers-conference/git-for-ages-4-and-up-4460524 blip.tv video]<br />
* [http://vimeo.com/35778382 Introduction to Git - video]<br />
* [http://www.slideshare.net/RandalSchwartz/introduction-to-git-11451326 Introduction to Git - slides]<br />
* [http://git-scm.com/book Pro Git] by Scott Chacon, available free of charge in many formats<br />
* [http://openhatch.org/missions/git OpenHatch's Intro to Git training mission]<br />
* [http://beust.com/weblog/2010/04/06/git-for-the-nervous-developer/ Git for the nervous developer]<br />
* [http://thkoch2001.github.com/whygitisbetter/ Why Git is better]<br />
* [https://help.github.com/ Github help documentation]<br />
<br />
If you'd like some ''serious'' extra-credit reading, have a look at [http://git.wiki.kernel.org/index.php/GitDocumentation the Git documentation!]<br />
<br />
== Installing Git ==<br />
<br />
First of all, if you have a [[Dreamhacks|Dreamhack]], you skip this step -- Git is already installed for you. =)<br />
<br />
If you want to develop on your own computer, there are a number of different ways to get hold of Git. <br />
<br />
; Linux/BSD/Other Unixen <br />
: The preferred way to install Git is through your distribution's package manager. For Debian, Ubuntu, and other Debian-based dists: <code>apt-get install git</code>.<br />
; Mac OS X <br />
: You can install Git with one of the OS X add-on package managers, like [http://mxcl.github.io/homebrew/ homebrew]. <br />
: You can grab an installer package from [http://git-scm.com/downloads the main Git site].<br />
: Github [https://help.github.com/articles/set-up-git has a customized client of their own], which includes Git. <br />
; Windows<br />
: You can grab an installer package from [http://git-scm.com/downloads the main Git site].<br />
: Github [https://help.github.com/articles/set-up-git has a customized client of their own], which includes Git. <br />
<br />
Finally, if you have a system where none of the above options will work for you -- for instance, a Mac running OS X Tiger (10.4.11) or earlier -- you can download the Git source code and build it yourself! Compiling Git is actually fairly straightforward, at least compared to some open source packages. Feel free to ask for help in the <tt>#dreamwidth-dev</tt> [[IRC]] channel if you need to go down this road -- <dwuser>shadowspar<dwuser> has been there before. <br />
<br />
<br />
== Using Git for Dreamwidth Development ==<br />
* [[Moving your Dreamwidth installation to use Github]] -- If you're ready to start transitioning your dev environment<br />
* [[Git commit messages]]<br />
<br />
<br />
[[Category: Getting Started]]<br />
[[Category: Development]]<br />
[[Category: Git]]</div>Shadowspar//wiki.dreamwidth.net/wiki/index.php/Git_Getting_StartedGit Getting Started2013-04-27T03:24:58Z<p>Shadowspar: </p>
<hr />
<div>Dreamwidth uses Git for source code control, with the code being hosted on GitHub. <br />
<br />
* ''Git for Ages 4 and Up'': aka "The Tinker Toy Demonstration". Probably one of the best ways to learn how Git works "under the hood". Many of the things Git does make much more sense once you know a little about what's happening behind the scenes. <br />
** LCA 2013: [https://lca2013.linux.org.au/wiki/Tutorials/Git_For_Ages_4_And_Up Talk page with resources] [http://www.youtube.com/watch?v=1ffBJ4sVUb4 youtube video] [http://mirror.internode.on.net/pub/linux.conf.au/2013/mp4/Git_For_Ages_4_And_Up.mp4 mp4 video download]<br />
** OSDC.au 2010: [http://2010.osdc.com.au/proposal/196/git-ages-4-and talk page] [http://blip.tv/open-source-developers-conference/git-for-ages-4-and-up-4460524 blip.tv video]<br />
* [http://vimeo.com/35778382 Introduction to Git - video]<br />
* [http://www.slideshare.net/RandalSchwartz/introduction-to-git-11451326 Introduction to Git - slides]<br />
* [http://git-scm.com/book Pro Git] by Scott Chacon, available free of charge in many formats<br />
* [http://openhatch.org/missions/git OpenHatch's Intro to Git training mission]<br />
* [http://beust.com/weblog/2010/04/06/git-for-the-nervous-developer/ Git for the nervous developer]<br />
* [http://thkoch2001.github.com/whygitisbetter/ Why Git is better]<br />
<br />
* [https://help.github.com/ Github help documentation]<br />
<br />
* [[Moving your Dreamwidth installation to use Github]] -- If you're ready to start transitioning your dev environment<br />
* [[Git commit messages]]<br />
<br />
If you'd like some ''serious'' extra-credit reading, have a look at [http://git.wiki.kernel.org/index.php/GitDocumentation the Git documentation!]<br />
<br />
[[Category: Getting Started]]<br />
[[Category: Development]]<br />
[[Category: Git]]</div>Shadowspar//wiki.dreamwidth.net/wiki/index.php/Git_Getting_StartedGit Getting Started2013-04-27T03:24:42Z<p>Shadowspar: </p>
<hr />
<div>Dreamwidth uses Git for source code control, with the code being hosted on GitHub. <br />
<br />
* ''Git for Ages 4 and Up'': aka "The Tinker Toy Demonstration". Probably one of the best ways to learn how Git works "under the hood". Many of the things Git does make much more sense once you know a little about what's happening behind the scenes. <br />
** LCA 2013: [https://lca2013.linux.org.au/wiki/Tutorials/Git_For_Ages_4_And_Up Talk page with resources] [http://www.youtube.com/watch?v=1ffBJ4sVUb4 youtube video] [http://mirror.internode.on.net/pub/linux.conf.au/2013/mp4/Git_For_Ages_4_And_Up.mp4 mp4 video download]<br />
** OSDC.au 2010: [http://2010.osdc.com.au/proposal/196/git-ages-4-and talk page] [ [http://blip.tv/open-source-developers-conference/git-for-ages-4-and-up-4460524 blip.tv video]<br />
* [http://vimeo.com/35778382 Introduction to Git - video]<br />
* [http://www.slideshare.net/RandalSchwartz/introduction-to-git-11451326 Introduction to Git - slides]<br />
* [http://git-scm.com/book Pro Git] by Scott Chacon, available free of charge in many formats<br />
* [http://openhatch.org/missions/git OpenHatch's Intro to Git training mission]<br />
* [http://beust.com/weblog/2010/04/06/git-for-the-nervous-developer/ Git for the nervous developer]<br />
* [http://thkoch2001.github.com/whygitisbetter/ Why Git is better]<br />
<br />
* [https://help.github.com/ Github help documentation]<br />
<br />
* [[Moving your Dreamwidth installation to use Github]] -- If you're ready to start transitioning your dev environment<br />
* [[Git commit messages]]<br />
<br />
If you'd like some ''serious'' extra-credit reading, have a look at [http://git.wiki.kernel.org/index.php/GitDocumentation the Git documentation!]<br />
<br />
[[Category: Getting Started]]<br />
[[Category: Development]]<br />
[[Category: Git]]</div>Shadowspar//wiki.dreamwidth.net/wiki/index.php/Git_Getting_StartedGit Getting Started2013-04-27T03:23:21Z<p>Shadowspar: +new version of schwern's talk</p>
<hr />
<div>Dreamwidth uses Git for source code control, with the code being hosted on GitHub. <br />
<br />
* ''Git for Ages 4 and Up'': aka "The Tinker Toy Demonstration". Probably one of the best ways to understand how Git works "under the hood" -- much of how Git operates makes much more sense once you know a little about what's happening behind the scenes. <br />
** LCA 2013: [https://lca2013.linux.org.au/wiki/Tutorials/Git_For_Ages_4_And_Up Talk page with resources] [http://www.youtube.com/watch?v=1ffBJ4sVUb4 youtube video] [http://mirror.internode.on.net/pub/linux.conf.au/2013/mp4/Git_For_Ages_4_And_Up.mp4 mp4 video download]<br />
** OSDC.au 2010: [http://2010.osdc.com.au/proposal/196/git-ages-4-and talk page] [ [http://blip.tv/open-source-developers-conference/git-for-ages-4-and-up-4460524 blip.tv video]<br />
* [http://vimeo.com/35778382 Introduction to Git - video]<br />
* [http://www.slideshare.net/RandalSchwartz/introduction-to-git-11451326 Introduction to Git - slides]<br />
* [http://git-scm.com/book Pro Git] by Scott Chacon, available free of charge in many formats<br />
* [http://openhatch.org/missions/git OpenHatch's Intro to Git training mission]<br />
* [http://beust.com/weblog/2010/04/06/git-for-the-nervous-developer/ Git for the nervous developer]<br />
* [http://thkoch2001.github.com/whygitisbetter/ Why Git is better]<br />
<br />
* [https://help.github.com/ Github help documentation]<br />
<br />
* [[Moving your Dreamwidth installation to use Github]] -- If you're ready to start transitioning your dev environment<br />
* [[Git commit messages]]<br />
<br />
If you'd like some ''serious'' extra-credit reading, have a look at [http://git.wiki.kernel.org/index.php/GitDocumentation the Git documentation!]<br />
<br />
[[Category: Getting Started]]<br />
[[Category: Development]]<br />
[[Category: Git]]</div>Shadowspar//wiki.dreamwidth.net/wiki/index.php/Git_Getting_StartedGit Getting Started2013-04-27T03:10:34Z<p>Shadowspar: git transition: seems safe to say it's done =)</p>
<hr />
<div>Dreamwidth uses Git for source code control, with the code being hosted on GitHub. <br />
<br />
* [http://vimeo.com/35778382 Introduction to Git - video]<br />
* [http://www.slideshare.net/RandalSchwartz/introduction-to-git-11451326 Introduction to Git - slides]<br />
* [http://git-scm.com/book Pro Git] by Scott Chacon, available free of charge in many formats<br />
* [http://openhatch.org/missions/git OpenHatch's Intro to Git training mission]<br />
* [http://beust.com/weblog/2010/04/06/git-for-the-nervous-developer/ Git for the nervous developer]<br />
* [http://thkoch2001.github.com/whygitisbetter/ Why Git is better]<br />
* [http://blip.tv/open-source-developers-conference/git-for-ages-4-and-up-4460524 Git for Ages 4 and Up (the tinker toy demonstration) - video]<br />
<br />
* [https://help.github.com/ Github help documentation]<br />
<br />
* [[Moving your Dreamwidth installation to use Github]] -- If you're ready to start transitioning your dev environment<br />
* [[Git commit messages]]<br />
<br />
If you'd like some ''serious'' extra-credit reading, have a look at [http://git.wiki.kernel.org/index.php/GitDocumentation the Git documentation!]<br />
<br />
[[Category: Getting Started]]<br />
[[Category: Development]]<br />
[[Category: Git]]</div>Shadowspar//wiki.dreamwidth.net/wiki/index.php/Dreamwidth_TimelineDreamwidth Timeline2013-04-27T03:06:27Z<p>Shadowspar: /* 2012 */ +May 2012: transition to git decision made</p>
<hr />
<div>{{Expand|text=This should be a timeline of DW's conception. Should probably also include LJ actions as well that drove DW's formation.}}<br />
<br />
A more complete history of LJ can be found on [[Wikipedia:Timeline of LiveJournal]].<br />
<br />
= LJ History =<br />
<br />
== 1999 ==<br />
<br />
* 1999-03 -- <ljuser>brad</ljuser> starts LJ<br />
<br />
== 2001 ==<br />
<br />
* 2001-05 -- LJ clone [http://www.deadjournal.com/ DeadJournal] is started<br />
* 2001-11 -- LJ clone [http://www.insanejournal.com/ InsaneJournal] is started<br />
<br />
== 2003 ==<br />
<br />
* 2003-03 -- LJ clone [http://www.journalfen.net/ JournalFen] is started<br />
* This is also the year that fandom_wank is TOSed from LiveJournal, TOSed from Blurty, and ends up at JournalFen.<br />
<br />
== 2004 ==<br />
<br />
* 2004-01 -- Mark Smith hired by LiveJournal as a developer: http://news.livejournal.com/75899.html<br />
<br />
== 2005 ==<br />
<br />
* 2005-01-05 -- [http://news.livejournal.com/82926.html Big news... Six Apart and LiveJournal!] -- Six Apart purchases LiveJournal<br />
<br />
== 2006 ==<br />
<br />
* 2006-04-18 -- [http://news.livejournal.com/91919.html Introducing a new account level] -- The introduction of Sponsored+, later to become Plus.<br />
* May/June -- Breastfeeding strike<br />
* 2006-09-26 -- [http://community.livejournal.com/lj_biz/237534.html Sponsored Content] -- Sponsored accounts and features come into being<br />
* 2006-10-18 -- [http://news.livejournal.com/94469.html LJ and SUP] -- Six Apart turns over the Russian side of LJ to SUP<br />
<br />
== 2007 ==<br />
<br />
* 2007-05-29 -- Strikethrough, Phase I<br />
* 2007-06-21 -- <ljlink href="http://synecdochic.livejournal.com/139024.html">Hypothetically, let's say that you had a chance to sit down with the person who's going to be the future buck-stops-here decision-maker for LJ.</ljlink> <br />
* 2007-07-15 -- <ljlink href="http://synecdochic.livejournal.com/145026.html">the internet is serious business</ljlink> -- <ljuser>synecdochic</ljuser> announces she is quitting employment at LJ and her last day is July 27th.<br />
* 2007-08-02 -- Strikethrough, Phase II<br />
* 2007-08 -- LJ Clone Scribblet is born<br />
* 2007-12-12 -- [http://www.sixapart.com/blog/2007/12/six_apart_annou.html Six Apart Announces New Home for LiveJournal] -- Sale to SUP<br />
* 2007-12-07ish -- GreatestJournal diaspora starts. GJ users are told to start migrating to another site.<br />
* 2007-12-19 -- Jason Shellen joins LiveJournal as VP of Product Development: http://blog.shellen.com/2007/12/im-joining-livejournal-as-vp-of-product.asp<br />
<br />
== Early 2008 ==<br />
<br />
* 2008-01 -- Mark goes to work for Mozilla http://blog.mozilla.com/mark/2008/01/<br />
<br />
= Pre-Dreamwidth -- ie, Hypothetical Journal =<br />
<br />
== March 2008 ==<br />
<br />
* 2008-03-12 -- [http://news.livejournal.com/106731.html?thread=68451051#t68451051 The 100th Day] -- Removal of Basic option for new accounts created. See also <ljlink href="http://synecdochic.livejournal.com/203464.html">I feel very, very, very fucking sorry for certain people today.</ljlink>.<br />
* 2008-03, 15-17 -- Interest blocking from the Top 100 list discovered and then removed.<br />
* 2008-03-21 -- [http://synecdochic.livejournal.com/205203.html totally hypothetical no really i swear] -- Poll gauging people's interest in a hypothetical journalling service.<br />
* 2008-03-26 -- Jason Shellen leaves LiveJournal http://twitter.com/shellen/statuses/777452202<br />
<br />
== April 2008 ==<br />
<br />
* 2008-04-02 -- <ljuser>tupshin</ljuser>'s journal created. <br />
* 2008-04-06 -- First 4 Dreamwidth accounts created. http://www.dreamwidth.org/stats/stats.txt<br />
* 2008-04-07 -- <ljuser>twocorpses</ljuser> [http://community.livejournal.com/scribblit/16789.html hands the Scribblit journal service over to Kit, keeping rights to the Scribblit name herself.]<br />
* 2008-04-08 -- <ljuser>popefelix</ljuser> [http://community.livejournal.com/scribblit/17046.html takes over administration of the site formerly known as Scribblit]. <br />
* 2008-04-19 -- [http://www.inksome.com/users/staff_kit/5795.html The Site Formerly Known as Scribblit changes] to [http://www.inksome.com/ Inksome]<br />
<br />
== May 2008 ==<br />
<br />
* 2008-05 -- Inksome opens to public paid accounts<br />
* 2008-05-02 -- New LiveJournal dev manager <ljuser>tupshin</ljuser> introduces himself in his journal: http://tupshin.livejournal.com/1298.html<br />
<br />
= Dreamwidth Development =<br />
<br />
== June 2008 ==<br />
<br />
* 2008-06-11 -- [http://synecdochic.livejournal.com/226141.html Announcing Dreamwidth Studios. Coming Summer 2008.] -- The announcement of DW's conception. <br />
* 2008-06-16 -- [http://synecdochic.livejournal.com/228004.html Poll: Mood Themes] -- Poll about mood themes.<br />
* 2008-06-13 -- [http://synecdochic.livejournal.com/227127.html S2 Styles Poll.] -- Poll about S2 layouts.<br />
* 2008-06-24 -- [http://synecdochic.livejournal.com/230481.html straw poll #19384] -- Poll about top-level menu items in the LJ scheme.<br />
<br />
== July 2008 ==<br />
<br />
* 2008-07-02 -- [http://synecdochic.livejournal.com/233088.html Dreamwidth needs mood themes!] -- a public call for people to design mood themes.<br />
* 2008-07-30 -- [http://synecdochic.livejournal.com/243180.html I keep forgetting!] and [http://synecdochic.livejournal.com/243536.html this] -- DW is open for volunteer development.<br />
<br />
== August 2008 == <br />
<br />
* 2008-08-08 -- [http://qdb.dreamwidth.net/dw/1 First quote in #dw IRC QDB] -- A quotes database for Dreamwidth's IRC channels is opened on qdb.zhzh.org, and the first quote appears. (QDB is later moved.)<br />
<br />
== December 2008 ==<br />
* 2008-12-01 -- Mark starts at Google: http://xb95.dreamwidth.org/624464.html<br />
<br />
== January 2009 ==<br />
<br />
* 2009-01-06 -- [http://community.livejournal.com/no_lj_ads/83519.html The Grim Purge] -- LJ lays off half of the San Francisco office employees, including the entire design team. Dreamwidth kicks into high gear: <br />
** [http://xb95.dreamwidth.org/627418.html Rest In Peace] (<dwuser>xb95</dwuser>)<br />
** <ljlink href="http://synecdochic.livejournal.com/302379.html">FYI</ljlink>.<br />
* 2009-01-07 -- GreatestJournal dies completely, after having limped along in zombie form for the past six months.<br />
<br />
= Dreamwidth Begins =<br />
==2009==<br />
=== February 2009 ===<br />
<br />
* 2009-02-14 -- [http://lists.dwscoalition.org/pipermail/dw-progress/2009-February/000011.html Closed beta launch]. Accounts are given to the beta testers and testing begins.<br />
* 2009-02-16 -- [http://dw-news.dreamwidth.org/506.html dw-progress: 16 February 2009] <dwcomm>dw-news</dwcomm> comes into use.<br />
* 2009-02-28 -- scans_daily TOSed from LiveJournal<br />
<br />
=== March 2009 ===<br />
<br />
* 2009-03-09 -- [http://dw-news.dreamwidth.org/1449.html Progress Report: 9 March 2009] -- First code tour (list of resolved bugs)<br />
* 2009-03-16 -- [http://dw-news.dreamwidth.org/1711.html Progress Report: March 16, 2009] -- Mention of "code bootcamp" (#dw_kindergarten) <br />
* 2009-03-23 -- [http://dw-news.dreamwidth.org/1811.html Progress Report: 23 March 2009] -- core2 style system backend released. <br />
* 2009-03-26 -- [http://dw-news.dreamwidth.org/2173.html Open Beta Launch Date Set] -- Date of 2009-04-30 (evening, EST) set for open beta; two-phase seed account sale announced. <br />
* 2009-03-30 -- [http://dw-news.dreamwidth.org/2421.html Progress Report: 30 March 2009]<br />
<br />
=== April 2009 === <br />
<br />
* 2009-04-07 -- http://dw-news.dreamwidth.org/2666.html<br />
* 2009-04-08 -- http://dw-news.dreamwidth.org/2826.html<br />
* 2009-04-14 -- LJ Support IRC moves to its own server: http://community.livejournal.com/irctownhall/8069.html<br />
(lots of missing stuff goes here)<br />
* 2009-04-30 -- Open beta launch.<br />
<br />
(lots of missing stuff goes here)<br />
<br />
=== May 2009 ===<br />
* 2009-05-01 - peak of 54663 new accounts created in one day (includes OpenID from journal imports). http://www.dreamwidth.org/stats/stats.txt <br />
* 2009-05-07 - A total of 175,846 accounts were created in the first week of open beta. <br />
* Mark and Janine married; ceremony performed by Denise<br />
* 2009-05-31 - A total of 258,616 accounts were created in the first month of open beta, including the accounts from the first week (includes OpenID from journal imports). <br />
(lots of missing stuff goes here)<br />
<br />
=== June 2009 ===<br />
<br />
=== July 2009 ===<br />
<br />
=== August 2009 ===<br />
<br />
=== September 2009 === <br />
* 2009-09-28 - dw-news (regular update): http://dw-news.dreamwidth.org/11791.html<br />
<br />
=== October 2009 === <br />
* 2009-10-05 -- dw-news: denise and sarah engaged; mark working full-time for Dreamwidth; : http://dw-news.dreamwidth.org/12240.html<br />
* 2009-10-12 -- dw-news: from last code push: autocrosspost not just from site & sticky entries; search feedback: http://dw-news.dreamwidth.org/12509.html<br />
* 2009-10-14 -- dw-news: positive feedback loop between crossposter and importer (now fixed): http://dw-news.dreamwidth.org/12724.html<br />
* 2009-10-19 -- dw-news: site search released in last code push: http://dw-news.dreamwidth.org/12895.html<br />
* 2009-10-22 -- <ljuser>tupshin</ljuser>'s departure from LiveJournal staff announced to LiveJournal Support: http://community.livejournal.com/lj_support/795054.html<br />
* 2009-10-23 -- scans_daily [http://asylums.insanejournal.com/scans_daily/1126436.html broaches the possibility of moving to Dreamwidth to their members].<br />
* 2009-10-26 -- dw_news: From Sunday's code push: new-member welcome entry for comms & all-activity subscriptions for community admins; paid account discount to end Nov 1; feedback solicited about invite codes; farewell to Tupshin: http://dw-news.dreamwidth.org/13069.html<br />
<br />
=== November 2009 ===<br />
* 2009-11-02 -- dw-news update: 1500 resolved bugs; icon limits increased; post-by-email to all users; latest page created; Mark tries NaNoWriMo; posting in dw_codesharing opened to non-members: http://dw-news.dreamwidth.org/13432.html <br />
:New icon limits<br />
:Free accounts: 15 icons<br />
:Paid acounts: 100 icons<br />
:Premium paid/Seed accounts: 250 icons<br />
* 2009-11-09 -- dw_news update: http://dw-news.dreamwidth.org/13683.html<br />
* 2009-11-14 -- IJ scans_daily [http://asylums.insanejournal.com/scans_daily/1231927.html closed and moved to Dreamwidth]. <br />
* 2009-11-16 -- dw_news update: AO3.org in open beta; new accounts to use Skittlish Dreams blue: http://dw-news.dreamwidth.org/13864.html<br />
* 2009-11-23 -- dw_news update: update time button for entry posting for next code push; 40 suggestions implemented (25% of suggestions taken into bugzilla); http://dw-news.dreamwidth.org/14312.html<br />
* 2009-11-30 -- dw_news update: denise's first appearance in a published anthology; admin-only security & icon tag renames for next code push; high not-spam reports; actually 49 suggestions implemented (30%): http://dw-news.dreamwidth.org/14528.html<br />
<br />
=== December 2009 ===<br />
* 2009-12-07 -- <dwcomm>dw_news</dwcomm> update: holiday 6+2 month sale pre-announced; live in last code push: icon keyword renaming, admin-only community entries, active entries module: http://dw-news.dreamwidth.org/14833.html<br />
* 2009-12-15 -- dw_news update: Holiday promotion live; NZ and AU visits announced; deleted account purges planned; live in last code push: edit reason for comments: http://dw-news.dreamwidth.org/14987.html<br />
* 2009-12-21 -- dw_news update: live in last code push: [http://www.dreamwidth.org/?usescheme=gradation-vertical-local Gradation Vertical sitescheme]: http://dw-news.dreamwidth.org/15300.html<br />
* 2009-12-29 -- dw_news update: http://dw-news.dreamwidth.org/15610.html<br />
<br />
==2010==<br />
=== January 2010 ===<br />
http://www.linuxplanet.com/linuxplanet/reports/6939/1/<br />
* 2010-01-05 -- dw_news update: purging deleted accounts to begin soon, reminder on icon poll, end of 6+2 paid time promo, <dwuser>denise</dwuser>'s birthday and call for Harry/Draco fic recommendations: http://dw-news.dreamwidth.org/15633.html<br />
* 2010-01-12 -- dw_news update: code push: comment screening updated, popular subscriptions page http://www.dreamwidth.org/tools/popsubscriptions, more inbox filters, every-time password entry for crosspost: http://dw-news.dreamwidth.org/16019.html<br />
* 2010-01-14 -- dw_news update: Account security and important notes: troll attack: http://dw-news.dreamwidth.org/16338.html<br />
* 2010-01-15 -- dw_news update: update on current events: switch from PayPal: http://dw-news.dreamwidth.org/16590.html<br />
* 2010-01-19 -- dw_news update: Attending http://www.lca2010.org.nz/ http://dw-news.dreamwidth.org/16775.html<br />
* 2010-01-26 -- dw_news update: Denise back from NZ; code: community admins can close polls; no alternative to PayPal yet: http://dw-news.dreamwidth.org/17121.html<br />
<br />
=== February 2010 ===<br />
* 2010-02-05 -- dw_news update: holiday promotion *actually* turned off; Google Checkout in place; email forwarding spam filter tweak: http://dw-news.dreamwidth.org/17231.html<br />
* 2010-02-16 -- dw_news update: cross-site reading discussion, community importing, suggestions process, update page update wireframe complete, mockup to happen: http://dw-news.dreamwidth.org/17591.html<br />
* 2010-02-22 -- dw_news update: Google Checkout no longer active; metadata saved in emergency draft recovery; fu to work for DW full-time: http://dw-news.dreamwidth.org/17858.html<br />
<br />
=== March 2010 ===<br />
* 2010-03-02 -- dw_news update: suggestions hackathon, payments update: http://dw-news.dreamwidth.org/17942.html<br />
* 2010-03-05 -- Spike in account creations, 1714 new accounts in one day. <br />
* 2010-03-07 -- "Six Weeks for Dreamwidth" festival proposed: http://erda.dreamwidth.org/44698.html (later became <dwcomm>three_weeks_for_dw</dwcomm>)<br />
* 2010-03-08 -- dw_news update: renames coming soon, EasyRead style, payment provider application approved: http://dw-news.dreamwidth.org/18191.html<br />
* 2010-03-16 -- dw_news update: Bug 11 resolved, [[Google Summer of Code]] discussion, code push coming, Three Weeks for Dreamwidth anniversary festival, a caution against obnoxious evangelism, meetups: http://dw-news.dreamwidth.org/18504.html<br />
* 2010-03-23 -- [[IRC]] move to Freenode finalized; [http://qdb.dreamwidth.net/dw/276 old IRC server decomissioned].<br />
* 2010-03-23 -- dw_news update: [[Google Summer of Code]], Ada Lovelace Day, credits in new payment system announced, fundraiser brainstorming, http://dw-news.dreamwidth.org/18764.html<br />
* 2010-03-30 -- dw_news update: code push http://dw-news.dreamwidth.org/19003.html<br />
<br />
=== April 2010 ===<br />
* 2010-04-05 -- <dwuser>fu</dwuser> joining full time.<br />
* 2010-04-07 -- <dwuser>fu</dwuser>'s first [http://dw-news.dreamwidth.org/19375.html news post]. New payments system with points online. <br />
* 2010-04-09 -- Google Summer of Code applications close. <br />
* 2010-04-10 - 2010-04-15 (Sophie, got a more exact date?) -- http://qdb.dreamwidth.net/ split from old LiveJournal QDB, in separate hosting<br />
* 2010-04-14 -- <dwuser>denise</dwuser> on hand rest: http://denise.dreamwidth.org/38803.html<br />
* 2010-04-16 -- <dwcomm>dw_news</dwcomm> update: http://dw-news.dreamwidth.org/19567.html - [http://www.zazzle.com/dreamwidth* Dreamwidth swag store], zero green, 6 slots for GSoC, <dwuser>mark</dwuser> will be wearing the developer hat. <br />
* Late April -- the outboundlink LiveJournal fiasco; <dwuser>afuna</dwuser> [http://afuna.dreamwidth.org/924883.html explains the technical reasons for her discomfort]. Drives a number of users to (at least temporarily) stop crossposting; some are driven to fully switch.<br />
<br />
* 2010-04-26 -- <dwcomm>three-weeks-for-dw</dwcomm> festival begins. <br />
* 2010-04-28 -- Freenode approves Dreamwidth's group application & information on cloaks added to [[IRC]] page.<br />
* 2010-04-20 -- <dwcomm>dw_news</dwcomm> update: http://dw-news.dreamwidth.org/19959.html<br />
* 2010-04-26 -- <dwcomm>dw_news</dwcomm> update: http://dw-news.dreamwidth.org/20211.html - summer of code<br />
<br />
=== May 2010 ===<br />
* 2010-05-03 - 2010-05-06 -- <dwuser>mark</dwuser> and <dwuser>denise</dwuser> attend [http://www.web2expo.com/webexsf2010 Web 2.0 Expo].<br />
* 2010-05-04 -- <dwcomm>dw_news</dwcomm> update: http://dw-news.dreamwidth.org/20337.html - tag merge, anniversary sale ongoing<br />
* 2010-05-04 -- <dwcomm>dw_biz</dwcomm>: The state of the coffers<br />
* 2010-05-06 -- <ljuser>vulva</ljuser> makes a [http://news.livejournal.com/125326.html?thread=83019150#t83019150 public comment complaining about an inappropriate comment from a LiveJournal staff member on material that was supposed to have been locked], which sparks a round of general as well as specific discussion about staff access to secured material on social media. <br />
* 2010-05-09 -- <dwuser>mark</dwuser> speaks about [http://mark.dreamwidth.org/20893.html staff access to secured content on Dreamwidth], discussion of a FAQ entry about this. <br />
* 2010-05-10 -- <dwuser>denise</dwuser> makes a <dwcomm>dw_news</dwcomm> entry involving [http://dw-news.dreamwidth.org/20516.html staff access to secured content on Dreamwidth]; also update redesign, call for vgift artists<br />
* 2010-05-19 -- <dwcomm>dw_news</dwcomm> update: http://dw-news.dreamwidth.org/20933.html - GSoC starting & a review of projects<br />
* 2010-05-26 -- Denise and Sarah married: http://dw-news.dreamwidth.org/21237.html<br />
* 2010-05-26 -- <dwcomm>dw_news</dwcomm> update: http://dw-news.dreamwidth.org/21237.html - update page redesign mockup <br />
<br />
(Some time around here-ish Mark takes a day job working for StumbleUpon.)<br />
<br />
=== June 2010 === <br />
* 2010-06-01 -- <dwcomm>dw_news</dwcomm> update: http://dw-news.dreamwidth.org/21330.html - r&r, entry page update feedback being accepted<br />
* 2010-06-06 -- "Account Contents" section added to the [http://www.dreamwidth.org/legal/privacy.bml Privacy Policy] ([http://dw-news.dreamwidth.org/21507.html announced] in <dwcomm>dw_news</dwcomm> June 08).<br />
* 2010-06-08 -- <dwcomm>dw_news</dwcomm> update: Tag merge and cut expansion, 2nd month in the black financially, author tagging in comms (code merge from LJ), community all-comments subscription (paid comms), reading page security filter (paid). http://dw-news.dreamwidth.org/21507.html<br />
* 2010-06-15 -- <dwcomm>dw_news</dwcomm> update: [http://dw-news.dreamwidth.org/21872.html inline cut tag expansion a big hit], also over 2,000 bugs resolved <br />
* 2010-06-16 -- brief downtime in which Mark has to pull over to the side of the road to fix it - http://dw-maintenance.dreamwidth.org/23889.html<br />
* 2010-06-17 -- Milestone: [http://angelikitten.dreamwidth.org/274543.html Poll 3500]<br />
* 2010-06-23 -- <dwcomm>dw_news</dwcomm> update: http://dw-news.dreamwidth.org/22135.html - <br />
* 2010-06-25 -- Bare-bones S2 style for syndicated accounts: http://changelog.dreamwidth.org/649976.html<br />
* 2010-06-30 -- ToS team roundup #3: http://dw-biz.dreamwidth.org/5624.html<br />
* 2010-06-30 -- <dwcomm>dw_news</dwcomm> update: http://dw-news.dreamwidth.org/22439.html<br />
<br />
=== July 2010 ===<br />
* http://www.oscon.com/oscon2010<br />
<br />
=== August 2010 ===<br />
* 2010-08-21 -- Inksome announces a net loss from 1 May 2010 to 31 July 2010: "... we're losing money again. ... a difference of $178.50 ... cannot afford that kind of loss every month. Unless account revenue improves soon, I will be forced to shut down the site." http://www.inksome.com/users/news/13110.html<br />
* 2010-08-31 LiveJournal rolls out r69, with Twitter and Facebook integration, most notoriously including ability to easily send links with quotes of locked content to Twitter and Facebook, and a re-implementation of pingbacks that sometimes shared large excerpts of locked content with people not authorized to see it. <br />
** news http://news.livejournal.com/129190.html<br />
** r69 http://community.livejournal.com/lj_releases/61333.html<br />
<br />
=== September 2010 ===<br />
* 2010-09-01 - Spike in Dreamwidth new accounts created: 9350 new accounts (includes OpenID from journal imports). http://www.dreamwidth.org/stats/stats.txt<br />
* 2010-09-02 <br />
** <dwcomm>lj_refugees</dwcomm> created. <br />
** Six Apart announces the closing of Vox. http://team.vox.com/library/post/vox-is-closing-september-30-2010.html<br />
** 12619 new accounts created (includes OpenID from journal imports). Largest spike since 2009 05 01. http://www.dreamwidth.org/stats/stats.txt<br />
* 2010-09-07 - <dwuser>mark</dwuser> announces he has stepped back from day-to-day management of Dreamwidth. Mark remains involved with the project and a co-owner. http://mark.dreamwidth.org/21501.html<br />
* 2010-09-10 - LiveJournal announces that the most unpopular parts of r69 (easy linking of locked or screened content) will be undone with the next code release. http://news.livejournal.com/129284.html<br />
* 2010-09-18 - New account creations drop below 1,000 in a day for the first day since 2010-09-01. 88,268 new accounts (including imported OpenID) were created from Sept 1st to 17th.<br />
<br />
=== October 2010 ===<br />
* 2010-10 -- Mark and Janine announce their separation. <br />
* 2010-10-21 -- Denise & Sarah begin the process of purchasing a house.<br />
<br />
=== November 2010 === <br />
* 2010-11-19 - List of writers, photographers, etc. on Dreamwidth started curation: http://denise.dreamwidth.org/54683.html<br />
* 2010-11-22 - Denise & Sarah purchased house.<br />
<br />
=== December 2010 === <br />
* Denise & Sarah moving house, spotty internet access<br />
* 2010-12-10 -- Inksome's financial troubles continue: "... we are very likely still going to be going dark come April, because we have not made any progress where it comes to turning a profit." http://www.inksome.com/users/news/13421.html<br />
* 2010-12-24 - "Sad Project News" Cross-site reading tabled until factors making it impossible change. http://dw-news.dreamwidth.org/27853.html<br />
<br />
==2011==<br />
=== January 2011 ===<br />
* Denise & Sarah's spotty internet access continues. <br />
* 2011-01-12 -- Inksome users offered a group invite code: http://www.inksome.com/users/news/13591.html<br />
<br />
=== February 2011===<br />
* 2011-02-10 -- Reliable internet access for Denise & Sarah returns: http://dw-news.dreamwidth.org/28412.html<br />
* 2011-02-21 -- Open account creation week: [http://dw-news.dreamwidth.org/28412.html from 2011-02-21 to 2011-02-28, it was possible to create a Dreamwidth account for free without the use of an invite code], as an experiment to see if growth would be sustainable and to see if spam and abuse would rise after the open account creation period. 5497 accounts (including OpenID) were created in this window. Only ~10 were then discovered to be spammers. <br />
* 2011-02-28 -- Denise & Sarah adopt "Noah", a toe-chewing kitten.<br />
<br />
===March 2011===<br />
* 2011-03-2 -- LiveJournal is added to a Spamhaus blacklist for hosting a large number of spammer journals. <br />
* 2011-03-13 -- [http://www.inksome.com/users/news/14079.html Inksome announces "...we have not had any significant turnaround in income, which means yes, we're still going dark in a few weeks."] <br />
* -- LJ changes the IP address from which it is sending email. [citation needed]<br />
* -- LJ suspends some quarter of a million spammer accounts, with an estimated error rate of 1%.<br />
* 2011-03-28 -- Code push: http://dw-maintenance.dreamwidth.org/30344.html which included the change stripping some HTML/CSS used by spammers from comments: http://dw-news.dreamwidth.org/28412.html<br />
* 2011-03 -- Last week of March, LJ downtime due to DDoS. http://www.time.com/time/world/article/0,8599,2063952,00.html<br />
<br />
=== April 2011 ===<br />
<br />
* 2011-04-01 to 2011-04-06 -- LJ downtime, DDoS-related. http://www.time.com/time/world/article/0,8599,2063952,00.html<br />
* 2011-04-06 -- Spike in new account creations: 16,226<br />
* 2011-04-08 -- Inksome's hosting expired. <br />
* 2011-04-30 -- Second anniversary of Open Beta. Seed accounts on sale; 'beta' removed from site logo. http://dw-news.dreamwidth.org/29530.html http://changelog.dreamwidth.org/936983.html<br />
<br />
=== May 2011 ===<br />
<br />
=== June 2011 ===<br />
<br />
=== July 2011 ===<br />
<br />
=== August 2011 ===<br />
<br />
=== September 2011 ===<br />
<br />
=== October 2011 ===<br />
* 2011-10-12 - "Expand All" collapsed comments for paid users to be in next code push http://dw-dev.dreamwidth.org/100133.html<br />
* 2011-10-30 - [http://bugs.dwscoalition.org/show_bug.cgi?id=2524 New Update Page] goes into beta testing http://dw-beta.dreamwidth.org/12259.html<br />
<br />
=== November 2011 ===<br />
* 2011-11-01 -- Migration to new Dreamhack server finalized; inactive Dreamhacks archived. http://bugs.dwscoalition.org/show_bug.cgi?id=4001#c2<br />
<br />
* 2011-11-24 -- Oliver Graham Smith born: http://xb95.dreamwidth.org/744397.html (Also pictures: http://xb95.dreamwidth.org/744623.html )<br />
<br />
* Late November -- LiveJournal under heavy DDoS attacks with phishing, suffers downtime<br />
<br />
=== December 2011 ===<br />
* Early December -- LiveJournal under heavy DDoS attacks, suffers downtime, crossposting affected<br />
* -- Elections in Russia<br />
* Open account creation period starts<br />
* LJ's R88<br />
* Spike in traffic/new users<br />
* 2011-12-25 -- community import bug committed<br />
<br />
==2012==<br />
<br />
=== January 2012 === <br />
* Community imports <br />
* SOPA/PIPA protests: splash screen (minimal interference with site as it is a communications platform)<br />
* 2012-01-19 -- #dw-tmi unofficially revived<br />
<br />
=== March 2012 ===<br />
* The [http://www.dreamwidth.org/support/highscores Support High Scores Board] spills onto a second page, meaning that more than 100 different volunteers have answered support requests since Dreamwidth's creation.<br />
<br />
=== May 2012 ===<br />
* Dreamwidth [http://dw-dev.dreamwidth.org/116811.html decides to move from Mercurial to Git] for source code management.<br />
<br />
== 2013 ==<br />
<br />
=== January 2013 ===<br />
<br />
* 2013-01-01 -- <dwuser>misskat</dwuser> [http://misskat.dreamwidth.org/3446368.html comes on board] as Dreamwidth's second employee.<br />
<br />
<br />
= The Future =<br />
<br />
<br />
* <strike>Cross-site Authenticated Reading List</strike> Tabled until factors making it impossible regarding LJ change, as of 2010-12-24: http://dw-news.dreamwidth.org/27853.html<br />
* Entry creation out of beta/edit redesign<br />
* Photo/image hosting <br />
* Continued open account creation, unless spam, performance, or some other reasons force it to be turned off!<br />
<br />
<br />
[[Category: Dreamwidth.org]]</div>Shadowspar//wiki.dreamwidth.net/wiki/index.php/Version_ControlVersion Control2013-04-26T03:31:25Z<p>Shadowspar: /* Committing changes */ don't need to update your branch before each commit; +explain git commit msg format</p>
<hr />
<div>The Dreamwidth code uses a Git repository and is publicly available [http://github.com/dreamwidth/ on Github].<br />
<br />
You can orient yourself with the basics via [[Git Getting Started]]. Instructions for specific actions are below:<br />
<br />
== Starting a new branch ==<br />
<br />
First, if you're currently in the midst of making changes to another branch, wrap up your changes either by stashing them or committing them. (See later sections for details.) <br />
<br />
New branches should be started from an up-to-date copy of develop. To bring your copy of develop up to date, first use checkout to switch to the develop branch:<br />
<br />
git checkout develop <br />
<br />
Then bring your develop branch up to date by pulling in changes from dreamwidth's copy of develop on github:<br />
<br />
git fetch dreamwidth <br />
git pull --ff-only dreamwidth <br />
<br />
To create a new branch and switch your working copy over to it immediately, use <tt>git checkout -b ''branchname''</tt>; eg<br />
<br />
git checkout -b bug4335-admin-tt<br />
<br />
Choose a descriptive branch name you can keep track of--for instance, the bug number you are working on.<br />
<br />
== Managing changes ==<br />
<br />
Before making changes to a branch, make sure you have that branch checked out. You can check which branch you're currently working on with:<br />
<br />
git branch<br />
<br />
It will list the branches and put an asterisk next to the one you currently have checked out, eg:<br />
<br />
bug4650-update-bootstrap.pl<br />
bug4772-stats-old-urls<br />
bug4772-stats-old-urls-dw-style<br />
bug5003-remove-hg-links<br />
* develop<br />
master<br />
<br />
If the current branch isn't the one you want to work on, change to the right branch with the command:<br />
<br />
git checkout BRANCHNAME<br />
<br />
=== Viewing changes ===<br />
<br />
To get an overview of which files have changed, which files are included in your next commit, and what new files exist, use:<br />
<br />
git status<br />
<br />
To get a line by line description of all of the changes, use:<br />
<br />
git diff<br />
<br />
When you want the changes you've made to a file you have to be included in your next commit, use <code>git add</code>:<br />
<br />
git add FILE<br />
<br />
If you make more changes to that file, you will have to add it again to have the new changes included.<br />
<br />
=== Stashing and unstashing ===<br />
<br />
Sometimes you may have changes you are not ready to commit yet, but need to stow away while doing tasks like merging. <code>git stash</code> can be useful for this.<br />
<br />
To save a bunch of changes:<br />
<br />
git stash<br />
<br />
To put the changes back:<br />
<br />
git stash pop<br />
<br />
=== Undoing changes ===<br />
<br />
If you have a file with changes and want to revert it to what's currently committed to the branch of the repository you are on, use:<br />
<br />
git checkout -- FILENAME<br />
<br />
If you accidentally added a file to the staging area you are going to be committing, you can unadd it using:<br />
<br />
git reset HEAD FILENAME<br />
<br />
If you want to reset ALL files to what's currently committed to the branch of the repository you are on and discard all changes (DO NOT USE IF YOU WANT TO SAVE ANYTHING), use:<br />
<br />
git reset --hard<br />
<br />
=== Committing changes ===<br />
<br />
Use <code>git add</code> to add the changes you want to commit. Before committing, you may want to briefly review your changes with <code>git status</code> and <code>git diff</code>. <br />
<br />
Once you are satisfied that these changes are the ones you want to make, give the command:<br />
<br />
git commit<br />
<br />
This will open up the command line editor specified in your config. (You can change this with instructions in [[Git settings]].) Write up a good description of the changes included in this commit.<br />
<br />
Git commit messages have a format that's rather peculiar to Git: <br />
<br />
'''First line is a v.short summary: 50 chars or less'''<br />
<br />
After a blank line, give a long-form description of the changes.<br />
You can write a few sentences, several paragraphs, or an essay<br />
complete with theorems, premises, and supporting references --<br />
whatever is needed to clearly document the change.<br />
<br />
The first line is used as a summary by tools like <code>git log --oneline</code>; if it is too long, the output of these tools will display oddly. <br />
<br />
http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html<br />
<br />
{{Expand|text=Writing commit messages: best practices.}}<br />
<br />
If you are making a commit that only needs a short explanation, you can use the -m option:<br />
<br />
git commit -m "(Bug 3492) This describes the change that I just made."<br />
<br />
=== Pushing your changes to your repository on Github ===<br />
<br />
After committing your changes, you need to push them to your repository on Github. You can do this with:<br />
<br />
git push origin BRANCHNAME<br />
<br />
== Making a pull request ==<br />
<br />
=== Bring your branch up to date with develop ===<br />
<br />
Before making a pull request, it's good etiquette to bring your branch up to date with any changes that have happened in <tt>develop</tt> since you initially forked your branch. Once you've made the last of your commits, double-check that you're in the branch you want to submit: <br />
<br />
git branch <br />
<br />
Then fetch changes from Dreamwidth's develop branch and bring your branch up to date with them:<br />
<br />
git fetch dreamwidth<br />
git pull --rebase --ff-only dreamwidth develop<br />
<br />
<tt>pull --rebase</tt> incorporates any new changes from develop into your branch, and it also reorganizes your changes so that changes in your branch appear to start from ''current'' develop, instead of where develop was when you initially started your branch. (Neat!) This can make it much easier to merge your branch into Dreamwidth's main develop branch.<br />
<br />
=== Submit! ===<br />
Then, once everything is all up to date, go to your version of the repository (dw-free or dw-nonfree) that you want to send upstream. By default they should be at:<br />
<br />
* https://github.com/USERNAME/dw-free<br />
* https://github.com/USERNAME/dw-nonfree<br />
<br />
These repositories are separate, so if you have made changes to both of them, you will have to submit pull requests for both of them.<br />
<br />
Find the "Pull Request" button (by "Unwatch") under the top toolbar. Click it and you will be brought to the pull request page.<br />
<br />
Ideally, the initial page should say something like "Oops! dreamwidth:develop is already up-to-date with USERNAME:develop Try a different branch?" That's good--that means that your <code>develop</code> branch is up to date with Dreamwidth's!<br />
<br />
Find the "head branch" drop down and select the branch you want to submit a pull request for.<br />
<br />
{{Expand|text=What do we want people to include in the pull request description? Bugzilla URL?}}<br />
<br />
When this is done, press the "Send pull request" button.<br />
<br />
{{Expand|text=Describe making a pull request to another repository other than the DW one!}}<br />
<br />
== Deleting branches ==<br />
<br />
{{Warn|text=This command WILL destroy data, be careful when using it. Only delete things you are sure you want deleted.}}<br />
<br />
You might create a branch by mistake, or have your changes pulled into the main develop branch on Dreamwidth. To delete the branch locally, use the command:<br />
<br />
git branch -d BRANCHNAME<br />
<br />
If it's a branch that hasn't been merged yet, the above command will give you an error. If you are SURE you still want to delete that branch, use:<br />
<br />
git branch -D BRANCHNAME<br />
<br />
If the branch is also on your Github, you can delete it like this:<br />
<br />
git push origin --delete <branchName><br />
<br />
[[Category: Development]]<br />
[[Category: Git]]</div>Shadowspar//wiki.dreamwidth.net/wiki/index.php/Things_Real_Dreamwidth_Programmers_DoThings Real Dreamwidth Programmers Do2013-04-23T20:13:22Z<p>Shadowspar: /* Get Fed Up */ adjust link =)</p>
<hr />
<div><br />
Wading into an open source project for the first time can be intimidating. There's a tendency to put established open source programmers up on a pedestal, especially when evaluating one's own abilities in comparison. (Hello, [http://geekfeminism.wikia.com/wiki/Impostor_syndrome impostor syndrome]!) <br />
<br />
Real Open Source Programmers are the ''crème de la crème'', the best of the best, the veritable titans of the programming world, right? They never make mistakes; they write flawless SQL queries in their sleep; they instantaneously comprehend any and all code they survey. Surely no mere mortal could ever hope to enter their exalted domain.<br />
<br />
Reality, of course, is far, far removed from this caricature. Real Open Source Programmers are humans like the rest of us, with the same foibles, insecurities, and quirks common to all. Very few contributors have supernatural abilities, decades of programming experience, or an encyclopedic knowledge of computing arcana, and we are all far, far from perfect. =)<br />
<br />
Thus, when <dwuser>azurelunatic</dwuser> shared the IRC logs of a marvellous [http://azurelunatic.dreamwidth.org/6731755.html Dreamwidth Dev Pep Talk], <dwuser>jeshyr</dwuser> [http://azurelunatic.dreamwidth.org/6731755.html?thread=12381163#cmt12381163 came up with the idea] of collecting an Epic List of Things Real Dreamwidth Programmers do. If you're a new or new-to-DW contributor, hopefully the list below will help disabuse you of any notion that you're somehow "not good enough" to contribute code -- '''you are more than good enough, and your contributions are heartily welcomed'''. And if you program, design, sysadmin, or interact with computers in any way, feel free to add any anecdotes you might have -- either signing your name or not. <br />
<br />
With that, we present the '''Epic List of Things Real Dreamwidth Programmers Do'''.<br />
<br />
<br />
== Ask for Help ==<br />
* I cannot count the number of times I asked someone who knew more about the documentation system how to do something, or to double-check to make sure I got it right. - <dwuser>azurelunatic</dwuser><br />
* It's the rare code tour that I can complete without at least once asking what some bug was about. That's some deep, deep magic. - <dwuser>azurelunatic</dwuser><br />
* I'd like to patch this bug! Or try to! Really, I would! But... ''where do I find the existing code for it''??? ;_; - <dwuser>kaberett</dwuser><br />
<br />
== Make Mistakes ==<br />
* Forgot that you can't treat a null as a zero enough times that I printed out "Null To Zero" in a fancy font with an ornate border, and stapled it to my wall as a reminder. - <dwuser>azurelunatic</dwuser><br />
* Started the arguments of a mailto: link in a wiki with an ampersand instead of a question mark, got garbage results after the address when testing it, blamed the (touchy, obscure, belligerent) mail application to its developers, and was schooled on my mailto: syntax in front of an audience of about 1,300. - <dwuser>azurelunatic</dwuser><br />
* For bug [http://bugs.dwscoalition.org/show_bug.cgi?id=4282 4282], I misunderstood what the request in bugzilla was asking and what the current behaviour was, and so my patch didn't fix what it was meant to fix AND it didn't even actually fix what I thought it was meant to fix! So it was doubly broken ... and then I got sick and had to unassign the bug, so I never got it fixed. - <dwuser>jeshyr</dwuser><br />
<br />
== Forget How Things Work == <br />
<br />
* I feel like I end up looking up most Perl functions with <tt>perldoc -f ''function_name''</tt> every time I use them. Especially <tt>open</tt> and <tt>split</tt>, for some reason. O_o - <dwuser>shadowspar</dwuser><br />
* Have to look at the Template Toolkit documentation every time I have to do anything -<dwuser>exor674</dwuser> ( I should note that I am in charge of the BML to TT conversion )<br />
* About half the time, the morning after I write something I have to figure out what I did and how the hell it works ... it never stays in my brain! - <dwuser>jeshyr</dwuser><br />
* I try to keep track of what features have actually been implemented, and what ones are still waiting, but I forget all the time. Then these get mixed in with things that LiveJournal has developed since the code fork, and again mixed with things that the shared codebase used to do, but doesn't anymore since it was ripped out by the bytes by whichever dev had the code-machete that week. - <dwuser>azurelunatic</dwuser><br />
* The best thing is when I think "Oh, we should totally do this thing," and then one of several things happen. One, there's already a suggestion for it. Two, the suggestion's already been migrated to Bugzilla. Three, <em>I was the one who suggested it</em>. Four, when it's actually already been implemented. Five, when all of the above is true -- and <dwuser>denise</dwuser> lets the post to <dwcomm>dw_suggestions</dwcomm> through anyway, because she forgot too. I have lost count of how many times that's happened. - <dwuser>azurelunatic</dwuser><br />
* I work with R scripts in my "day job", and I keep trying to write Perl in R, and R in Perl. Neither works too well. - <dwuser>swaldman</dwuser><br />
<br />
== Break Production (the Live Website) == <br />
<br />
* Kicked over production Apache at work the other day when I thought I was merely recycling the dev website. oops... - <dwuser>shadowspar</dwuser><br />
* Break the site (momentarily) during open beta launch: http://qdb.dreamwidth.net/dw/123<br />
<br />
== Break Sundry Other Things ==<br />
<br />
* My first act at one of my early contracting gigs: creating a mail routing loop that made our own servers bury themselves under a deluge of junk email - <dwuser>shadowspar</dwuser><br />
* Back in the days (!!) of Mercurial Queues, I managed to mess up deleting patches that had been committed from my Dreamhack so badly that it took a lot of WTFing and a goodly amount of new documentation to sort it out without losing all my part-finished patches - <dwuser>kaberett</dwuser><br />
<br />
== Shoot Themselves in the Foot == <br />
<br />
* Starting to rewrite a helper script. Think "What version of Perl does the DW codebase require?" Ah! Find it [http://dw-dev.dreamwidth.org/120658.html requires 5.10]. Great, I can use the features that are new in 5.10! Write up a [http://wiki.dwscoalition.org/wiki/index.php/Suggested_Server_Requirements#Perl_5.10 note in the wiki] saying that Perl 5.10 is required, but it's unlikely to be a problem because any machine running 5.8 or earlier is likely to be quite decrepit indeed. Return to script, finish it, give it a try. Script refuses to run. Error message: <tt>'''Perl v5.10.0 required--this is only v5.8.9.'''</tt> <dwuser>shadowspar</dwuser><br />
<br />
== Overcommit Themselves ==<br />
<br />
* Time elapsed between me showing up on DW and saying I wanted to contribute code, and actually submitting my first patch: about three years. ^_^; - <dwuser>shadowspar</dwuser><br />
* Assigning bugs to oneself in a fit of hopefulness, realise you can't manage them and sadly unassigning. Rinse, repeat :) - <dwuser>jeshyr</dwuser><br />
* Pick up an effort-minor bug, stare at it for a while, start hashing out a spec in bugzilla comments, and before you know it end up with an entire <dwuser>dw_dev</dwuser> discussion post about what you're ''actually'' trying to achieve, with reference to several ISO standards... and then bury your head in the sand and pretend none of it ever happened. - <dwuser>kaberett</dwuser><br />
<br />
== Get Fed Up ==<br />
<br />
* Today in IRC, <dwuser>denise</dwuser> was letting <dwuser>fu</dwuser> know about her recent pull request submitting a patch for [http://bugs.dwscoalition.org/show_bug.cgi?id=1386 bug 1386] with these words: "i gave you a PR for the revert-the-color-changes but my dw-nonfree branch is f***ed somehow so i probably screwed it up. can you take pity on me and just redo the changes on your end to commit them? [...] i'm probably going to have to do something awful to the damn thing to make it work again". I find it very reassuring that even our admins want to throw their computers out the window sometimes! - <dwuser>jeshyr</dwuser><br />
<br />
== Get Scared ==<br />
<br />
* I ask for reassurance ALL the time, usually via the IRC channel. Hell, I even asked for reassurance before creating this category in this document ... how silly is that?? - <dwuser>jeshyr</dwuser><br />
* I spend a good week asking people to hold my hands and cheerlead me before every time I get going with a patch. Hell, I'm so terrified of git that I've not submitted a single patch since we started the migration - it took me months to work up the courage to migrate my [[Dreamhack]], never mind actually ''use'' git! - <dwuser>kaberett</dwuser><br />
<br />
== Complain ==<br />
<br />
* A ''lot''<br />
* In IRC<br />
* Out loud when the code is not making sense (as some sections of it frequently fail to do)<br />
* Including wondering what elder god infested Brad's head when he wrote ''THAT'' omg<br />
* At code they wrote themselves just six months ago but never got around to properly commenting<br />
<br />
== Help Others == <br />
<br />
* I'm kind of thrilled when someone asks for help with the code tour and I can actually sort-of explain what some of the fixes do. ^_^; - <dwuser>shadowspar</dwuser><br />
* Spend two straight days rummaging around with ''something'' or other, and in a fit of FOR CRYING OUT LOUD write up some documentation for the wiki so at least the next person doesn't have to reinvent the wheel - <dwuser>kaberett</dwuser><br />
* Spent seriously like a week trying to look up over and over all the commands in the wiki for upgrading code, updating the database, using the version control, etc. and finally decide it was easier to just write a huge enormous [http://dw-dev.dreamwidth.org/94822.html omnibus script] to remember them for me. The fact it helps other people is fun, too!<br />
* Interpret knitting patterns<br />
* Realise that someone really ''hates'' a particular task that you'd find at worst pleasantly soothing, and take it off their hands. - <dwuser>kaberett</dwuser><br />
<br />
== Learn == <br />
<br />
* Better than half of our contributors have never programmed in Perl before, never contributed to an Open Source project before, or never programmed before, at all, period. I think that's amazing. ([http://denise.dreamwidth.org/23600.html ref]) - <dwuser>shadowspar</dwuser></div>Shadowspar//wiki.dreamwidth.net/wiki/index.php/PerlPerl2013-04-23T04:08:16Z<p>Shadowspar: /* Perl Documentation */ +perldoc; +commonly referenced doc pages</p>
<hr />
<div>== Beginning programming in Perl ==<br />
<br />
* [http://perldoc.perl.org/perlintro.html Introduction to Perl]<br />
* [http://www.perl.org/books/beginning-perl/ Beginning Perl] -- PDFs of chapters of Beginning Perl.<br />
* [http://perldoc.perl.org/index-tutorials.html Perl.org Tutorials]<br />
<br />
== Perl Documentation ==<br />
* [http://perldoc.perl.org/perl.html Manual Pages]<br />
* [http://search.cpan.org/ Module documentation]<br />
* [http://faq.perl.org/ FAQ]<br />
* Too, a linux or Mac OS X machine with Perl installed will almost always have the <tt>perldoc</tt> tool installed...so if you like, you can also access all of the above information from the command line: <br />
** <tt>perldoc perl</tt> will give you a list of all the main perldoc pages <br />
** <tt>perldoc ''Module::Name''</tt> gives you documentation for that module<br />
** <tt>perldoc -f ''function''</tt> shows the documentation for that function <br />
** <tt>perldoc -q ''search-term''</tt> searches the Perl FAQ for the term given <br />
** and of course <tt>perldoc perldoc</tt> tells you more about how to use <tt>perldoc</tt> =)<br />
<br />
=== Commonly referenced perldoc pages ===<br />
<br />
* [http://perldoc.perl.org/perlsyn.html perlsyn] - Perl syntax <br />
* [http://perldoc.perl.org/perlop.html perlop] - Perl operators <br />
* [http://perldoc.perl.org/perlfunc.html perlfunc] - Perl functions<br />
* [http://perldoc.perl.org/perlvar.html perlvar] - Perl special variables<br />
* [http://perldoc.perl.org/perlreref.html perlreref] - Perl-style regular expression reference<br />
* [http://perldoc.perl.org/perlmodlib.html perlmodlib] - The Perl Standard Module Library<br />
<br />
== Regular Expressions ==<br />
<br />
Perl programmers tend to make extensive use of regular expressions, but they are also used in many other tools (eg vim, less, grep).<br />
<br />
* Jeremy Friedl's book [http://www.amazon.com/Mastering-Regular-Expressions-Jeffrey-Friedl/dp/0596528124/ Mastering Regular Expressions] is an excellent primer.<br />
<br />
== Perl Tips ==<br />
<br />
=== Strings ===<br />
<br />
==== Interpolating variables inside text ====<br />
<br />
Most of the time, you can simply place a variable inside a double-quoted string, and Perl will expand it for you in the way you want:<br />
<br />
<source lang="perl"><br />
my $foo = "Kim";<br />
print "Hi, $foo!"; # prints «Hi, Kim!»<br />
</source><br />
<br />
But if the variable name is ambiguous, you can use {} characters to set it apart like so: <br />
<br />
<source lang="perl">$string = "${foo}worthy"</source><br />
<br />
And this way it won't get confused with another variable like <tt>$foow</tt>, or <tt>$fooworth</tt>, or what have you.<br />
<br />
==== Clarifying complicated string constructions using <tt>printf()</tt> or <tt>sprintf()</tt> ====<br />
<br />
When you're trying to build up a complex string by assembling many different variables and bits of text, things can quickly get unreadable: <br />
<br />
<source lang="perl"><br />
my $msg = "At " . DateTime->now() . ", " . $user->name . " did $action" . <br />
", which made " . $action->object . " become " . $action->result . ".";<br />
</source><br />
<br />
The Perl function <tt>[http://perldoc.perl.org/functions/sprintf.html sprintf()]</tt> lets you build up strings using a kind of mini-templating language. You specify the literal text you want first, with markers that indicate where you want to insert a variable. For instance, <tt>%s</tt> means "insert a string here". Then list the variables you want inserted. <br />
<br />
So, the above example could be reformatted like this: <br />
<br />
<source lang="perl"><br />
my $msg = sprintf("At %s, %s did %s, which made %s become %s.", <br />
DateTime->now(), $user->name, $action, $action->object, $action->result);<br />
</source><br />
<br />
<tt>[http://perldoc.perl.org/functions/printf.html printf()]</tt> works the same as <tt>sprintf()</tt>, except it immediately prints the string you built -- so, <tt>printf(''blah'')</tt> is pretty much the same as <tt>print sprintf(''blah'')</tt>. <br />
<br />
[[Category: Development]]</div>Shadowspar//wiki.dreamwidth.net/wiki/index.php/Things_Real_Dreamwidth_Programmers_DoThings Real Dreamwidth Programmers Do2013-04-21T02:42:36Z<p>Shadowspar: +perl versioning silly; +'learn' section</p>
<hr />
<div><br />
Wading into an open source project for the first time can be intimidating. There's a tendency to put established open source programmers up on a pedestal, especially when evaluating one's own abilities in comparison. (Hello, [http://geekfeminism.wikia.com/wiki/Impostor_syndrome impostor syndrome]!) <br />
<br />
Real Open Source Programmers are the ''crème de la crème'', the best of the best, the veritable titans of the programming world, right? They never make mistakes; they write flawless SQL queries in their sleep; they instantaneously comprehend any and all code they survey. Surely no mere mortal could ever hope to enter their exalted domain.<br />
<br />
Reality, of course, is far, far removed from this caricature. Real Open Source Programmers are humans like the rest of us, with the same foibles, insecurities, and quirks common to all. Very few contributors have supernatural abilities, decades of programming experience, or an encyclopedic knowledge of computing arcana, and we are all far, far from perfect. =)<br />
<br />
Thus, when <dwuser>azurelunatic</dwuser> shared the IRC logs of a marvellous [http://azurelunatic.dreamwidth.org/6731755.html Dreamwidth Dev Pep Talk], <dwuser>jeshyr</dwuser> [http://azurelunatic.dreamwidth.org/6731755.html?thread=12381163#cmt12381163 came up with the idea] of collecting an Epic List of Things Real Dreamwidth Programmers do. If you're a new or new-to-DW contributor, hopefully the list below will help disabuse you of any notion that you're somehow "not good enough" to contribute code -- '''you are more than good enough, and your contributions are heartily welcomed'''. And if you program, design, sysadmin, or interact with computers in any way, feel free to add any anecdotes you might have -- either signing your name or not. <br />
<br />
With that, we present the '''Epic List of Things Real Dreamwidth Programmers Do'''.<br />
<br />
<br />
== Ask for Help ==<br />
* I cannot count the number of times I asked someone who knew more about the documentation system how to do something, or to double-check to make sure I got it right. - <dwuser>azurelunatic</dwuser><br />
* It's the rare code tour that I can complete without at least once asking what some bug was about. That's some deep, deep magic. - <dwuser>azurelunatic</dwuser><br />
* I'd like to patch this bug! Or try to! Really, I would! But... ''where do I find the existing code for it''??? ;_; - <dwuser>kaberett</dwuser><br />
<br />
== Make Mistakes ==<br />
* Forgot that you can't treat a null as a zero enough times that I printed out "Null To Zero" in a fancy font with an ornate border, and stapled it to my wall as a reminder. - <dwuser>azurelunatic</dwuser><br />
* Started the arguments of a mailto: link in a wiki with an ampersand instead of a question mark, got garbage results after the address when testing it, blamed the (touchy, obscure, belligerent) mail application to its developers, and was schooled on my mailto: syntax in front of an audience of about 1,300. - <dwuser>azurelunatic</dwuser><br />
* For bug [http://bugs.dwscoalition.org/show_bug.cgi?id=4282 4282], I misunderstood what the request in bugzilla was asking and what the current behaviour was, and so my patch didn't fix what it was meant to fix AND it didn't even actually fix what I thought it was meant to fix! So it was doubly broken ... and then I got sick and had to unassign the bug, so I never got it fixed. - <dwuser>jeshyr</dwuser><br />
<br />
== Forget How Things Work == <br />
<br />
* I feel like I end up looking up most Perl functions with <tt>perldoc -f ''function_name''</tt> every time I use them. Especially <tt>open</tt> and <tt>split</tt>, for some reason. O_o - <dwuser>shadowspar</dwuser><br />
* Have to look at the Template Toolkit documentation every time I have to do anything -<dwuser>exor674</dwuser> ( I should note that I am in charge of the BML to TT conversion )<br />
* About half the time, the morning after I write something I have to figure out what I did and how the hell it works ... it never stays in my brain! - <dwuser>jeshyr</dwuser><br />
* I try to keep track of what features have actually been implemented, and what ones are still waiting, but I forget all the time. Then these get mixed in with things that LiveJournal has developed since the code fork, and again mixed with things that the shared codebase used to do, but doesn't anymore since it was ripped out by the bytes by whichever dev had the code-machete that week. - <dwuser>azurelunatic</dwuser><br />
* The best thing is when I think "Oh, we should totally do this thing," and then one of several things happen. One, there's already a suggestion for it. Two, the suggestion's already been migrated to Bugzilla. Three, <em>I was the one who suggested it</em>. Four, when it's actually already been implemented. Five, when all of the above is true -- and <dwuser>denise</dwuser> lets the post to <dwcomm>dw_suggestions</dwcomm> through anyway, because she forgot too. I have lost count of how many times that's happened. - <dwuser>azurelunatic</dwuser><br />
* I work with R scripts in my "day job", and I keep trying to write Perl in R, and R in Perl. Neither works too well. - <dwuser>swaldman</dwuser><br />
<br />
== Break Production (the Live Website) == <br />
<br />
* kicked over production Apache at work the other day when I thought I was merely recycling the dev website. oops... - <dwuser>shadowspar</dwuser><br />
* Break the site (momentarily) during open beta launch: http://qdb.dreamwidth.net/dw/123<br />
<br />
== Break Sundry Other Things ==<br />
<br />
* my first act at one of my early contracting gigs: creating a mail routing loop that made our own servers bury themselves under a deluge of junk email - <dwuser>shadowspar</dwuser><br />
* back in the days (!!) of Mercurial Queues, I managed to mess up deleting patches that had been committed from my Dreamhack so badly that it took a lot of WTFing and a goodly amount of new documentation to sort it out without losing all my part-finished patches - <dwuser>kaberett</dwuser><br />
<br />
== Shoot Themselves in the Foot == <br />
<br />
* Starting to rewrite a helper script. Think "What version of Perl does the DW codebase require?" Ah! Find it [http://dw-dev.dreamwidth.org/120658.html requires 5.10]. Great, I can use the features that are new in 5.10! Write up a [http://wiki.dwscoalition.org/wiki/index.php/Suggested_Server_Requirements#Perl_5.10 note in the wiki] saying that Perl 5.10 is required, but it's unlikely to be a problem because any machine running 5.8 or earlier is likely to be quite decrepit indeed. Return to script, finish it, give it a try. Script refuses to run. Error message: <tt>'''Perl v5.10.0 required--this is only v5.8.9.'''</tt> <dwuser>shadowspar</dwuser><br />
<br />
== Overcommit Themselves ==<br />
<br />
* time elapsed between me showing up on DW and saying I wanted to contribute code, and actually submitting my first patch: about three years. ^_^; - <dwuser>shadowspar</dwuser><br />
* assigning bugs to oneself in a fit of hopefulness, realise you can't manage them and sadly unassigning. Rinse, repeat :) - <dwuser>jeshyr</dwuser><br />
* pick up an effort-minor bug, stare at it for a while, start hashing out a spec in bugzilla comments, and before you know it end up with an entire <dwuser>dw_dev</dwuser> discussion post about what you're ''actually'' trying to achieve, with reference to several ISO standards... and then bury your head in the sand and pretend none of it ever happened. - <dwuser>kaberett</dwuser><br />
<br />
== Get Scared ==<br />
<br />
* I ask for reassurance ALL the time, usually via the IRC channel. Hell, I even asked for reassurance before creating this category in this document ... how silly is that?? - <dwuser>jeshyr</dwuser><br />
<br />
== Complain ==<br />
<br />
* a ''lot''<br />
* in IRC<br />
* out loud when the code is not making sense (as some sections of it frequently fail to do)<br />
* including wondering what elder god infested Brad's head when he wrote ''THAT'' omg<br />
* at code they wrote themselves just six months ago but never got around to properly commenting<br />
<br />
== Help Others == <br />
<br />
* I'm kind of thrilled when someone asks for help with the code tour and I can actually sort-of explain what some of the fixes do. ^_^; - <dwuser>shadowspar</dwuser><br />
* spend two straight days rummaging around with ''something'' or other, and in a fit of FOR CRYING OUT LOUD write up some documentation for the wiki so at least the next person doesn't have to reinvent the wheel - <dwuser>kaberett</dwuser><br />
* Spent seriously like a week trying to look up over and over all the commands in the wiki for upgrading code, updating the database, using the version control, etc. and finally decide it was easier to just write a huge enormous [http://dw-dev.dreamwidth.org/94822.html omnibus script] to remember them for me. The fact it helps other people is fun, too!<br />
<br />
== Learn == <br />
<br />
* Better than half of our contributors have never programmed in Perl before, never contributed to an Open Source project before, or never programmed before, at all, period. I think that's amazing. ([http://denise.dreamwidth.org/23600.html ref]) <dwuser>shadowspar</dwuser></div>Shadowspar//wiki.dreamwidth.net/wiki/index.php/Dev_MaintenanceDev Maintenance2013-04-18T14:38:21Z<p>Shadowspar: /* Pulling changes from Dreamwidth's develop branch your branch(es) */ oops! grab fast-forwards only ^_^;</p>
<hr />
<div>{{Note|text="We're in the middle of moving over to a git workflow. If you haven't yet moved over to git, see the [http://wiki.dwscoalition.org/wiki/index.php?title=Dev_Maintenance&oldid=10581 old instructions]. If you're looking to move over, first make sure you've finished [[Moving your Dreamwidth installation to use Github]]"}}<br />
<br />
== Updating the Dreamwidth code on your Dreamhack ==<br />
<br />
=== Shutting down apache ===<br />
<br />
It is best to shut your Apache instance down before doing the update process, to make sure that everything, especially scripts in cgi-bin/ are reloaded properly:<br />
<br />
stop-apache<br />
<br />
=== Updating dw-free ===<br />
<br />
Okay. Let's say you've been running your Dreamwidth install and you want to pull down the latest and greatest in fixes. This is pretty easy. First, if you are not somewhere in dw-free, get into that directory:<br />
<br />
cd $LJHOME<br />
<br />
If you have any uncommitted changes in your current branch (use <tt>git status</tt> to see), you can stash them to do this:<br />
<br />
git stash<br />
<br />
Then grab updates from the development and master branches of Dreamwidth's repository:<br />
<br />
git fetch dreamwidth<br />
git checkout develop && git pull --ff-only dreamwidth develop:develop<br />
git checkout master && git pull --ff-only dreamwidth master:master<br />
<br />
You will also want to push the Dreamwidth repository changes to your fork on Github:<br />
<br />
git push origin develop<br />
git push origin master<br />
<br />
Note: if you are working on uncommitted changes in a branch, any automerge will be canceled. Example:<br />
<br />
mw@memewidth:~/dw/src/jbackup$ git pull dreamwidth develop:develop<br />
remote: Counting objects: 180, done.<br />
remote: Compressing objects: 100% (54/54), done.<br />
remote: Total 116 (delta 90), reused 88 (delta 62)<br />
Receiving objects: 100% (116/116), 36.23 KiB, done.<br />
Resolving deltas: 100% (90/90), completed with 41 local objects.<br />
From https://github.com/dreamwidth/dw-free<br />
53294c1..19b8e73 develop -> develop<br />
error: Your local changes to 'src/jbackup/jbackup.pl' would be overwritten by merge. Aborting.<br />
Please, commit your changes or stash them before you can merge.<br />
<br />
After this, you can checkout the branch you were on previously and pop any work you stashed:<br />
<br />
git checkout YOURBRANCH<br />
git stash pop<br />
<br />
We will get into merging in changes in the following section.<br />
<br />
=== Pulling changes from Dreamwidth's develop branch your branch(es) ===<br />
<br />
{{Warn|text=Pay special attention to stashing unsaved changes! You can lose work if you are not careful about this!}}<br />
<br />
You should be doing your development in branches separate from the main Dreamwidth branches. You can check what branches you currently have in your repository with the command:<br />
<br />
git branch<br />
<br />
The current branch will have an asterisk next to it. Here is an example:<br />
<br />
yourhack@dreamhack.net:~/dw$ git branch<br />
develop<br />
* feature/Mobile<br />
master<br />
<br />
You can check to see if you have unsaved changes on your currently checked out branch with:<br />
<br />
git status<br />
<br />
To temporarily save these changes while you make your updates, use:<br />
<br />
git stash<br />
<br />
To have your branch pick up the changes made on Dreamwidth's development branch:<br />
<br />
git pull --rebase --ff-only dreamwidth develop<br />
<br />
And if you have saved changes using stash, you can recover them with:<br />
<br />
git stash pop<br />
<br />
You can change branches with <tt>git checkout BRANCH</tt>, example:<br />
<br />
git checkout feature/Mobile<br />
<br />
=== For those using DW non-free ===<br />
<br />
Repeat for dw-nonfree:<br />
<br />
cd $LJHOME/ext/dw-nonfree<br />
<br />
git checkout develop && git pull --ff-only dreamwidth develop:develop<br />
git checkout master && git pull --ff-only dreamwidth master:master<br />
git push origin develop<br />
git push origin master<br />
<br />
If you have any branches on dw-nonfree, they will also need to be merged with the development branch of dw-nonfree as described in the above section:<br />
<br />
git merge develop<br />
<br />
=== Update your database ===<br />
<br />
Now that your code has been updated, update the database:<br />
<br />
# order of commands is important<br />
$LJHOME/bin/upgrading/update-db.pl -r -p --innodb<br />
$LJHOME/bin/upgrading/update-db.pl -r --cluster=all --innodb<br />
$LJHOME/bin/upgrading/texttool.pl load<br />
<br />
Remember that different branches might have different text strings you have added, and that you might need to update your database for different branches when you are working on them for those text strings to work. The same applies for any database changes made by different branches you are working on.<br />
<br />
=== Restart the server ===<br />
<br />
Now you can restart Apache:<br />
<br />
start-apache<br />
<br />
Of course, in a production environment, this whole process is not too recommended as you never know what kind of code you're going to get. But for the most part, it's fairly straightforward. (And if you're doing development, this is generally safe.)<br />
<br />
== Additional Information for Non-Dreamhack Users ==<br />
<br />
This section is only for you if you're running your own installation.<br />
<br />
Instead of using start-apache/stop-apache, which are Dreamhack-specific scripts, use these commands:<br />
<br />
sudo /etc/init.d/apache2 start<br />
sudo /etc/init.d/apache2 stop <br />
<br />
You'll also want to update packages on your system at some point. On Ubuntu, this would be done using:<br />
<br />
apt-get update<br />
apt-get upgrade<br />
<br />
Or, if you want an easy command to run on your dw account in one swoop:<br />
<br />
sudo apt-get update && sudo apt-get upgrade<br />
<br />
== Scripting ==<br />
<br />
{{Warn|text="These scripts have not been throughly tested yet with the new system; they might not be updated entirely or right."}}<br />
<br />
You can, of course, use scripts to make it easier for you to do some of this. <br />
<br />
There is an "omnibus" script available at http://dw-dev.dreamwidth.org/94822.html which incorporates all the individual scripts listed here and some other functions, and includes help information.<br />
<br />
Some simpler example scripts are given below.<br />
<br />
=== dwu - Updating the repos ===<br />
<br />
Put this code in a file called '''~/bin/dwu''' and make it executable with '''chmod ugo+x ~/bin/dwu''':<br />
<br />
<source lang="bash">#!/bin/bash<br />
<br />
# make sure we are in the right directory;<br />
cd $LJHOME<br />
<br />
git fetch dreamwidth<br />
<br />
# pull changes from dreamwidth<br />
git checkout develop<br />
git pull --ff-only dreamwidth develop<br />
git checkout master<br />
git pull --ff-only dreamwidth master<br />
<br />
# push them to Github forks<br />
git push origin develop<br />
git push origin master<br />
</source><br />
<br />
Now, when you type 'dwu', this script will update dw-free. If you need to update dw-nonfree as well, then use this code:<br />
<br />
<source lang="bash">#!/bin/bash<br />
<br />
# make sure we are in the right directory;<br />
cd $LJHOME<br />
<br />
git fetch dreamwidth<br />
<br />
# pull changes from dreamwidth<br />
git checkout develop<br />
git pull --ff dreamwidth develop<br />
git checkout master<br />
git pull --ff dreamwidth master<br />
<br />
# push them to Github forks<br />
git push origin develop<br />
git push origin master<br />
<br />
# change to dw-nonfree<br />
cd $LJHOME/ext/dw-nonfree<br />
<br />
git fetch dreamwidth<br />
<br />
# pull changes from dw-nonfree<br />
git checkout develop<br />
git pull --ff dreamwidth develop<br />
git checkout master<br />
git pull --ff dreamwidth master<br />
<br />
# push them to Github forks<br />
git push origin develop<br />
git push origin master<br />
</source><br />
<br />
=== dwdb - Updating the database ===<br />
<br />
Put this code in a file called '''~/bin/dwdb''' and make it executable with '''chmod ugo+x ~/bin/dwdb''':<br />
<br />
<source lang="bash">#!/bin/bash<br />
$LJHOME/bin/upgrading/update-db.pl -r -p --innodb && \<br />
$LJHOME/bin/upgrading/update-db.pl -r --cluster=all --innodb && \<br />
$LJHOME/bin/upgrading/texttool.pl load</source><br />
<br />
This will update the database when you type 'dwdb'.<br />
<br />
==Cleaning up your directories==<br />
<br />
If you do any amount of work, you'll find that your directories get cluttered with .orig and .rej files everywhere. This script will clean those up:<br />
<br />
<source lang="bash">git clean -f "*.rej" "*.orig"</source><br />
<br />
You can run it from the command line, or put it in a file called ~/bin/tidy and make it executable with "chmod +x ~/bin/tidy". If you do that, you'll be able to just type "tidy" to clean house.<br />
<br />
[[Category: Development]]</div>Shadowspar