Mailcap files, defined in RFC 1524, allow you to tell you mail clients, web browsers, and other programs how you want to view and edit various MIME types. Since interaction with your mailcap files often occurs deep within the bowels of your program, I've written up a very simple Python script to test your mailcap entries: mailcap-test.py. Enjoy!

Posted Thu Dec 1 20:43:14 2011 Tags:

I have accounts on a number of systems where the sysadmin doesn't maintain a comprehensive /etc/hosts file. In order to work around this, I wanted to have a per-user ~/.hosts to extend the system file with my own aliases. Then I could use my short nicknames for network activity without spelling out the whole domain name (the domain setting in /etc/resolv.conf is often not close enough for the nicknames to work using DNS).

A common technique for translating host names into IP addresses is to use either getaddrinfo(3) or the obsolete gethostbyname(3). As mentioned in hostname(7), you can set the HOSTALIASES environment variable to point to an alias file, and you've got per-user aliases!

Well, mostly…

HOSTALIASES will work if your program (ping, ssh, etc.) satisfies two conditions:

  1. It has to actually use one of the two functions listed above to resolve the host name. I haven't run across anything that doesn't, but you never know.
  2. It cannot be setuid to another user. If it is, libc sanitizes the environment, so your HOSTALIASES setting is lost. See sysdeps/generic/unsecvars.h for a list of all environment variables that glibc removes for setuid programs.

ping is setuid root (because it needs to listen for ICMP packets), so HOSTALIASES will not work with ping unless you're already root before you call ping.

Here's an example:

$ echo 'g www.google.com' >> ~/.hosts
$ export HOSTALIASES=~/.hosts
$ firefox g

Adjust your ~/.bashrc appropriately, and you can forget about /etc/hosts entirely :).

Posted Thu Dec 1 13:21:13 2011

I spent some time today configuring Postfix so I could send mail from home via SMTPS. Verizon, our ISP, blocks port 25 to external domains, forcing all outgoing mail through their outgoing.verizon.net exchange server. In order to accept mail, they also require you authenticate with your Verizon username and password, so I wanted to use an encrypted connection.

For the purpose of this example, our Verizon username is jdoe, our Verizon password is YOURPASS, you're running a local Postfix server on mail.example.com for your site at example.com, and 12345 is a free local port.

# cat /etc/postfix/main.cf
myhostname = mail.example.com
relayhost = [127.0.0.1]:12345
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/saslpass
sender_canonical_maps = hash:/etc/postfix/sender_canonical
# cat /etc/postfix/saslpass
[127.0.0.1]:12345 jdoe@verizon.net:YOURPASS
    # postmap /etc/postfix/saslpass
    # cat /etc/postfix/sender_canonical
    root@mail.example.com jdoe@example.com
root@example.com jdoe@example.com
root@localhost jdoe@example.com
jdoe@mail.example.com jdoe@example.com
jdoe@localhost jdoe@example.com
    # postmap /etc/postfix/sender_canonical
# cat /etc/stunnel/stunnel.conf
[smtp-tls-wrapper]
accept = 12345
client = yes
connect = outgoing.verizon.net:465
# /etc/init.d/stunnel restart
# postfix reload

Test with:

$ echo 'testing 1 2' | sendmail you@somewhere.com

Here's what's going on:

  • You hand an outgoing message to your local Postfix, which decides to send it via port 12345 on your localhost (127.0.0.1) (relayhost).
  • Stunnel picks up the connection from Postfix, encrypts everything, and forwards the connection to port 465 on outgoing.verizon.net (stunnel.conf).
  • Postfix identifies itself as mail.example.com (myhostname), and authenticates using your Verizon credentials (smtp_sasl_…).
  • Because Verizon is picky about the From addresses it will accept, we use sender_canonical to map addresses to something simple that we've tested.

And that's it :p. If you're curious, there's more detail about all the Postfix config options in the postconf man page, and there's good SASL information in the SASL_README.

There's also a blog post by Tim White which I found useful. Because Verizon lacks STARTTLS support, his approach didn't work for me out of the box.

Posted Tue Nov 15 19:48:33 2011 Tags:

Verizon blocks outgoing connections on port 25 (SMTP) unless you are connecting to their outgoing.verizon.net message exchange server. This server requires authentication with your Verzon username/password before it will accept your mail. For the purpose of this example, our Verizon username is jdoe, our Verizon password is YOURPASS, and were sending email from me@example.com to you@target.edu.

$ nc outgoing.verizon.net 25
220 vms173003pub.verizon.net -- Server ESMTP (...)
mail from: <jdoe@example.com>  
550 5.7.1 Authentication Required
quit
221 2.3.0 Bye received. Goodbye.

Because authenticating over an unencrypted connection is a Bad Idea™, I was looking for an encrypted way to send my outgoing email. Unfortunately, Verizon's exchange server does not support STARTTLS for encrypting connections to outgoing.verizon.net:25:

$ nc outgoing.verizon.net 25
220 vms173003pub.verizon.net -- Server ESMTP (...)
ehlo example.com
250-vms173003pub.verizon.net
250-8BITMIME
250-PIPELINING
250-CHUNKING
250-DSN
250-ENHANCEDSTATUSCODES
250-HELP
250-XLOOP E9B7EB199A9B52CF7D936A4DD3199D6F
250-AUTH DIGEST-MD5 PLAIN LOGIN CRAM-MD5
250-AUTH=LOGIN PLAIN
250-ETRN
250-NO-SOLICITING
250 SIZE 20971520
starttls
533 5.7.1 STARTTLS command is not enabled.
quit
221 2.3.0 Bye received. Goodbye.

Verizon recommends pre-STARTTLS approach of wrapping the whole SMTP connection in TLS (SMTPS), which it provides via outgoing.verizon.net:465:

$ python -c 'from base64 import *; print b64encode("\0jdoe@verizon.net\0YOURPASS")'
AGpkb2VAdmVyaXpvbi5uZXQAWU9VUlBBU1M=
$ openssl s_client -connect outgoing.verizon.net:465
...
220 vms173013pub.verizon.net -- Server ESMTP (...)
ehlo example.com
250-vms173013pub.verizon.net
250-8BITMIME
250-PIPELINING
250-CHUNKING
250-DSN
250-ENHANCEDSTATUSCODES
250-HELP
250-XLOOP 9380A5843FE933CF9BD037667F4C950D
250-AUTH DIGEST-MD5 PLAIN LOGIN CRAM-MD5
250-AUTH=LOGIN PLAIN
250-ETRN
250-NO-SOLICITING
250 SIZE 20971520
auth plain AGpkb2VAdmVyaXpvbi5uZXQAWU9VUlBBU1M
235 2.7.0 plain authentication successful.
mail from: <me@example.com>
250 2.5.0 Address Ok.
rcpt to: <you@target.edu>
250 2.1.5 you@target.edu OK.
data
354 Enter mail, end with a single ".".
From: Me <me@example.com>
To: You <you@target.edu>
Subject: testing

hello world 
.
250 2.5.0 Ok, envelope id 4BHMFEZ7PHSETMT6@vms173013.mailsrvcs.net
quit
221 2.3.0 Bye received. Goodbye.
closed

This works, but with the rise of STARTTLS, getting your local Postfix mail server to support SMTPS requires a bit of fancyness with stunnel. The stunnel workaround is not too complicated, but I also wanted to look into the submission protocol (port 587), which adapts SMTP (designed for message transfer) into a similar protocol for message submission. Unfortunately, Verizon does not support STARTTLS here either.

$ nc outgoing.verizon.net 587
220 vms173005.mailsrvcs.net -- Server ESMTP (...)
ehlo example.com
250-vms173005.mailsrvcs.net
250-8BITMIME
250-PIPELINING
250-CHUNKING
250-DSN
250-ENHANCEDSTATUSCODES
250-EXPN
250-HELP
250-XADR
250-XSTA
250-XCIR
250-XGEN
250-XLOOP DA941C5B31BE4B102BB69B809BC66C4A
250-AUTH DIGEST-MD5 PLAIN LOGIN CRAM-MD5
250-AUTH=LOGIN PLAIN
250-NO-SOLICITING
250 SIZE 20971520
starttls
533 5.7.1 STARTTLS command is not enabled.
quit
221 2.3.0 Bye received. Goodbye.

In conclusion, Verizon supports a number of email submission standards, but the only secure approach is to use the outdated SMTPS. See my Postfix post for details on configuring Postfix to use Verizon's server for outgoing mail.

There are a number of good SMTP authentication tutorials out there. I used John Simpson and Erwin Hoffmann's tutorials. For cleaner examples of my testing tools (nc and openssl s_client), see my simple servers post.

Posted Tue Nov 15 19:45:35 2011 Tags:

In the course of my research, I've spend a good deal of time developing clean, Python interfaces to much of our lab equipment. I also tend to have strong opinions on the One True Way® to solve a problem. This means that I occasionaly end up writing script to run other people's experiment, especially when they don't take all that much time to write.

I wrote slow_bend for Liming Zhao, who was a postdoc in our lab from 2008 to 2010. Liming coated one side of an AFM cantilever with a film of cellulose and used slow bend.py (version 0.2) to monitor the cantilever deflection as he flushed in different buffers (paper). Unfortunately, the paper claims the data aquisition was carried out in LabView.

slow_bend is not a complicated program; it polls analog input channels using pycomedi (and optionally reads temperatures using backends from pypid). The polling continues until slow_bend recieves a KeyboardInterrupt.

$ slow_bend.py --version
0.4
$ slow_bend.py 0 3
#time (second)  chan 0 (bit)    chan 0 (volt)   chan 3 (bit)    chan 3 (volt)
1.81198e-05 34727   0.598001    39679   2.10925
4.00409 34956   0.667887    38033   1.60693
8.00408 35074   0.703899    36780   1.22454
12.0041 35041   0.693828    35814   0.929732
16.0041 34917   0.655985    35044   0.694743
^C
Posted Sat Nov 12 17:50:00 2011 Tags:

I was recently trying to add bookmarks to a PDF I'd generated with pdftk. It turns out to be fairly simple to add bookmarks to a PDF using Ghostscript, following maggoteer's post to the Ubunto forums. The syntax is:

$ gs -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sOutputFile=out.pdf in-*.pdf pdfmarks

Where out.pdf is the generated PDF, in-*.pdf are the input PDFs, and pdfmarks is a text file with contents like:

[/Title (Title Page) /Page 1 /OUT pdfmark
[/Title (Table of Contents) /Page 3 /OUT pdfmark
...

Nice and easy.

For nested levels, use the /Count attribute. For example:

[/Count 3 /Title (Chapter 1) /Page 1 /OUT pdfmark
[/Count -2 /Title (Section 1.1) /Page 2 /OUT pdfmark
[/Title (Section 1.1.1) /Page 3 /OUT pdfmark
[/Title (Section 1.1.2) /Page 4 /OUT pdfmark
[/Count -1 /Title (Section 1.2) /Page 5 /OUT pdfmark
[/Title (Section 1.2.1) /Page 6 /OUT pdfmark
[/Title (Section 1.3) /Page 7 /OUT pdfmark

The argument to /Count gives the number of immediately subordinate bookmarks. The sign of the argument sets the default display (negative for closed, positive for open).

You can also setup the document info dictionary with something like:

[ /Title (My Test Document)
  /Author (John Doe)
  /Subject (pdfmark 3.0)
  /Keywords (pdfmark, example, test)
  /DOCINFO pdfmark

If you want more detail, take a look at Adobe's pdfmark reference.

I've bundled the whole pdfmarks-generation bit into a script, pdf-merge.py, which generates the pdfmark file and runs Ghostscript automatically. Think of it as a bookmark-preserving version of pdftk's cat. The script uses pdftk internally to extract bookmark information from the source PDFs.

The script also adds a bit of PostScript to ignore any bookmarks in the source PDFs during the Ghostscript run. The only bookmarks in the output will be the ones you specify explicitly in the pdfmarks file. If for some reason the automatically generated pdfmarks are not quite what you want, the script can pause (via --ask) to allow you to tweak the pdfmarks manually before running Ghostscript.

Posted Mon Sep 26 13:57:47 2011 Tags:

I've been streamlining my procedure for burning audio CDs, and I like what I've come up with. Unfortunately, I'll never remember it on my own, so here's a note to myself (any whoever else cares) on what to do.

First, build your playlist in MPD, using my one-liner to calculate the playlist duration (my CD-Rs hold 80 minutes). When you've got your playlist arranged to your satisfaction, convert the files to WAVs using:

$ i=1; for x in $(mpc -f '%file%' playlist); do j=$(seq -f '%02g' $i $i); let "i += 1"; flac -d --apply-replaygain-which-is-not-lossless=t -o $j.$(basename ${x/.flac/.wav}) /var/lib/mpd/music/$x; done

This assumes that all the files in your playlist are FLAC files, which is a good idea (disk space is cheap, FLAC is lossless with good open source support). It also assumes you've already stored ReplayGain settings in your FLAC files. If you haven't, you'll get warnings like:

WARNING: can't get track (or even album) ReplayGain tags

If that happens, go back and read about replay gain, add the tags, and try again ;).

See my replay gain post for more details on the --apply-replaygain-which-is-not-lossless option. After the decoding step, you'll have a directory full of WAVs that have been normalized to a standard track-level loudness. The bit about i and j ensures that *.wav will list the tracks in the order in which they appear in your playlist. Then burn the tracks to a CD using cdrecord:

$ cdrecord -v speed=1 dev=/dev/cdrom -eject -dao -audio -pad *.wav

If you don't care about the order, use $(ls *.wav | shuf) instead of *.wav.

That's it! Audio CDs from MPD playlists in two lines.

Posted Fri Sep 23 01:37:18 2011 Tags:

Available in a git repository.
Repository: cookbook
Author: W. Trevor King

I've been running a home-rolled recipe webapp for a year now, and it worked fairly well in a bare-bones sort of way. However, I recently had to make some changes to my personal website (since EveryDNS and aparently most other free DNS providers were bought by Dyn), which prompted me to translate cookbook into a Django app. Thanks to the wonders of Django, Grappelli, and django-taggit, the code is now leaner, meaner, and prettier!

See the README for details.

Posted Fri Aug 5 13:59:01 2011 Tags:

Over the last few days I've been trying to teach myself enough genetics to reconstruct Carrion-Vazquez's poly-I27 synthesis procedure. I'm not quite there yet, but I feel like I've made enough progress that it's worth posting my notes somewhere public in case they are useful to others.

Overview

We buy our poly-I27 from AthenaES, who market it as I27O™. Perusing their technical brief, makes it clear that I2O7™ corresponds to Carrion-Vazquez's I27RS₈. In Carrion-Vazquez' original paper they describe the synthesis of both I27RS₈ and a variant I27GLG₁₂. Their I27RS₈ procedure is:

  • Human cardiac muscle used to generate a cDNA library (Rief 1997)
  • cDNA library amplified with PCR
    • 5' primer contained a BamHI restriction site that permitted in-frame cloning of the monomer into the expression vector pQE30.
    • The 3' primer contained a BglII restriction site, two Cys codons located 3' to the BglII site and in-frame with the I27 domain, and two in-frame stop codons.
  • The PCR product was cloned into pUC19 linearized with BamHI and SmaI.
  • The 8-domain synthetic gene was constructed by iterative cloning of monomer into monomer, dimer into dimer, and tetramer into tetramer.
  • The final construct contained eight direct repeats of the I27 domain, an amino-terminal His tag for purification, and two carboxyl-terminal Cys codons used for covalent attachment to the gold-covered coverslips.

They also give the full-length sequence of I27RS₈:

Met-Arg-Gly-Ser-(His)₆-Gly-Ser-(I27-Arg-Ser)₇-I27-...-Cys-Cys

They point out the Arg-Ser (RS) amino acid sequence is the BglII/BamHI hybrid site, which makes sense.

Back on the Athena site, they have a page describing their procedure (they reference the Carrion-Vazquez paper). They claim to use the restriction enzyme KpnI in addition to BamHI, BglII, and SmaI.

Carrion-Vazquez points to the following references:

Rief

In their note 11, Rief et al. explain their synthesis procedure:

  • λ cDNA library
  • Titin fragments of interest were amplified by PCR
  • cloned into pET 9d
  • NH₂-terminal domain boundaries were as in Politou 1996.
  • The clones were fused with an NH₂-terminal His₆ tag and a COOH-terminal Cys₂ tag for immobilization on solid surfaces.

which doesn't help me very much.

Kemp

The Kempe article is more informative, focusing entirely on the synthesis procedure (albiet for a different gene). Their figure 2 outlines the general approach, and used the following restriction enzymes: PstI, BamHI, PstI, and BglII. I'll walk through their procedure in detail below.

Genetic code

Wikipedia has a good page on the genetic code for converting between DNA/mRNA codons and amino acids. I've written up a little Python script, mRNAcode.py, to automate the conversion of various sequences, which helped me while I was writing this post. I'm sure there are tons of similar programs out there, so don't feel pressured to use mine ;).

Restriction enzymes

We'll use the following restriction enzymes:

BamHI

5' G|GATC C 3'
3' C CTAG|G 5'

BglI (N is any nucleotide)

5' GCCN NNN|NGGC 3'
3' CGGN|NNN NCCG 5'

BglII

5' A|GATC T 3'
3' T CTAG|A 5'

HindIII

5' A|AGCT T 3'
3' T TCGA|A 5'

KpnI

5' G GTAC|C 3'
3' C|CATG G 5'

PstI

5' C TGCA|G 3'
3' G|ACGT C 5'

SmaI

5' CCC|GGG 3'
3' GGG|CCC 5'

Details

Here's my attempt to reconstruct the details of the polymer-cloning reactions, where they splice several copies of I27 into the expression plasmid.

Kempe procedure

Inserted their poly-SP into pHK414 (I haven't been able to find any online sources for pHK414. Kempe cites R.J. Watson et al. Expression of Herpes simplex virus type 1 and type 2 glyco-protein D genes using the Escherichia coli lac promoter. Y. Becker (Ed.), Recombinant DNA Research and Viruses. Nijhoff, The Hague, 1985, pp. 327-352.)

Synthetic SP

     HindIII.                                                ,BamHI_.
     |      |  Met Arg Pro Lys Pro Gln Gln Phe Phe Gly Leu Met      |
 5’ GA AGC TTC ATG CGT CCG AAG CCG CAG CAG TTC TTC GGT CTC ATG GAT CCG
    CT TCG AAG TAC GCA GGC TTC GGC GTC GTC AAG AAG CCA GAG TAC CTA GGC 5’

pHK414

          _______Linker_sequence______
         /                            \
               HindIII    BamHI
,PstI.   BglII.|    |,SmaI.    |
CTGCAG...AGATCTAAGCTTCCCGGGGATCCAAGATCC
GACGTC...TCTAGATTCGAAGGGCCCCTAGGTTCTAGG
.                                     .
.......................................

Synthesizing pSP4-1

pHK414 + HindIII + BamHI

They cut a hole in the plasmid…

               HindIII    BamHI.
(PstI)   BglII,|               |
CTGCAG...AGATCTA           GATCCAAGATCC
GACGTC...TCTAGATTCGA           GTTCTAGG
.                                     .
.......................................

SP + HindIII + BamHI

… and cut matching snips off their SP gene.

HindIII.                                                ,BamHI_.
|      |  Met Arg Pro Lys Pro Gln Gln Phe Phe Gly Leu Met      |
  AGC TTC ATG CGT CCG AAG CCG CAG CAG TTC TTC GGT CTC ATG
       AG TAC GCA GGC TTC GGC GTC GTC AAG AAG CCA GAG TAC CTA G

pSP4-1

Mixing the snips together gives the plasmid with a single SP.

               HindIII                                   BamHI.
,PstI.   BglII.|    | MetArgProLysProGlnGlnPhePheGlyLeuMet    |
CTGCAG...AGATCTAAGCTTCATGCGTCCGAAGCCGCAGCAGTTCTTCGGTCTCATGGATCCAAGATCC
GACGTC...TCTAGATTCGAAGTACGCAGGCTTCGGCGTCGTCAAGAAGCCAGAGTACCTAGGTTCTAGG
.                                                                    .
......................................................................

Using -SP- to abbreviate the HindIII→Met→Met portion (less the terminal G, which is part of the BamHI match sequence).

,PstI.   BglII.    BamHI.
CTGCAG...AGATCT-SP-GGATCC
GACGTC...TCTAGA-SP-CCTAGG
.                       .
.........................

Synthesizing pSP4-2

The single-SP plasmid, pSP4-1, is split in two parallel reactions.

PstI + BamHI

    G...AGATCT-SP-G
ACGTC...TCTAGA-SP-CCTAG

PstI + BglII

CTGCA     GATCT-SP-GGATCC
G             A-SP-CCTAGG
.                       .
.........................

pSP4-2

Then the SP-containing fragments (shown above) are isolated and mixed together to form pSP4-2.

,PstI.   BglII.    other.    BamHI.
CTGCAG...AGATCT-SP-GGATCT-SP-GGATCC
GACGTC...TCTAGA-SP-CCTAGA-SP-CCTAGG
.                                 .
...................................

where the "other" sequence is the result of the BamHI/BglII splice. Expanding the -SP- abbreviation around the SP joint:

....SP,other_.HindIII.  SP.....
Leu Met Asp Leu Ser Phe Met Arg
CTC ATG GAT CTA AGC TTC ATG CGT
AGA CGT TCG AGC CTA GGA CGT ATG

So the resulting poly-SP will have Asp-Leu-Ser-Phe linking amino acids.

By repeating the PstI + BamHI / PstI + BglII split-and-join, you can synthesize plasmids with any number of SP repeats.

I27RS₈ procedure

Like Kempe, Carrion-Vazquez et al. flank the I27 gene with BglII and BamHI, but they reverse the order. Here's the output of their PCR:

BamHI-I27-BglII-Cys-Cys-STOP-STOP

From the PDB entry for I27 (1TIT), the amino acid sequence is:

,leader_.
MHHHHHHSSLIEVEKPLYGVEVFVGETAHFEIELSEPDVHGQWKLKGQPLTASPDCEIIEDGKKHILI
LHNCQLGMTGEVSFQAANAKSAANLKVKEL

To translate this into cDNA, I've scanned thorough the sequence of NM_003319.4, and found a close match from nucleotides 15991 through 16248.

15982 CTAATAAAAG TGGAAAAGCC TCTGTACGGA GTAGAGGTGT TTGTTGGTGA
16032 AACAGCCCAC TTTGAAATTG AACTTTCTGA ACCTGATGTT CACGGCCAGT
16082 GGAAGCTGAA AGGACAGCCT TTGACAGCTT CCCCTGACTG TGAAATCATT
16132 GAGGATGGAA AGAAGCATAT TCTGATCCTT CATAACTGTC AGCTGGGTAT
16182 GACAGGAGAG GTTTCCTTCC AGGCTGCTAA TGCCAAATCT GCAGCCAATC
16232 TGAAAGTGAA AGAATTG

This cDNA match generates an amino acid starting with LIKVEK instead of the expected LIEVEK, but the LIKVEK version matches amino acids 12677-12765 in Q8WZ42 (canonical titin), and there is a natural variant listed for 12679 K→E.

Interestingly, this sequence contains a PstI site at nucleotides 16220 through 16225. None of our other restriction enzymes have sites in the I27 sequence.

Carrion-Vazquez et al. list two vectors in their procedure, but I'm not sure about their respective roles.

pQE30

pQE30 (sequence) is listed as the "expression vector", but I'm not sure why they would need a non-expression vector, as they don't reference cross-vector subcloning after inserting their I27 monomer into the plasmid.

From the Qiagen site, the section around the linker nucleotides 115 through 203 is:

    ,RGS-His epitope__________________. ,BamHI.
Met Arg Gly Ser His His His His His His Gly Ser Ala Cys Glu Leu
ATG AGA GGA TCG CAT CAC CAT CAC CAT CAC GGA TCC GCA TGC GAG CTC
CGT CTC TTC GAT ACG ACA ACG ACA ACG ACA TTC GAA TAC GTA TCT AGA

      ,SmaI__.
,KpnI_.                         HindIII
Gly Thr Pro Gly Arg Pro Ala Ala Lys Leu Asn STOP
GGT ACC CCG GGT CGA CCT GCA GCC AAG CTT AAT TAG CTG AG
TTG CAA AAT TTG ATC AAG TAC TAA CCT AGG CCG GCT AGT CT

However, there is no BglII site in this linker. In fact, there is no BglII site in the entire pQE30 plasmid, so they'd need to use a third restiction enzyme to insert their I27 (which does contain a trailing BglII).

pUC19

From BCCM/LMBP and GenBank, the section around the linker nucleotides 233 through 289 is:

                                                 ,SmaI_.
HindIII.        ,PstI__.                ,BamHI_.    ,KpnI__.
           Met                     STOP
AA GCT TGC ATG CCT GCA GGT CGA CTC TAG AGG ATC CCC GGG TAC CGA

GCT CGA ATT C

However, there is no BglII the entire pUC19 plasmid either, so they'd need to use a third restiction enzyme to insert their I27.

Questions

  1. Why do Carrion-Vazquez et al. list two different plasmids?
  2. What is the 3'-side restiction enzyme that Carrion-Vazquez et al. use to insert their I27 into their plasmid?
  3. What is the remote restriction enzyme that Carrion-Vazquez et al. use to break their opened plasmids (Kempe PstI equivalent).
  4. The BamHI and SmaI sites in pUC19 overlap, so it is unclear how you could use both to "linearize" pUC19. It would seem that either one would open the plasmid on its own, although I'm not sure you could "heal" the blunt-ended SmaI cut.
  5. Since the Arg-Ser joint is formed by a BglII/BamHI overlap, why are there no BglII-coded amino acids after the last I27 in the I27RS₈ sequence? If there is, why do Carrion-Vazquez et al. not acknowledge it when they write [3]:

    The full-length construct, I27RS₈, results in the following amino acid additions: (i) the amino-terminal sequence is Met-Arg-Gly-Ser-(His)6-Gly-Ser-I27 codons; (ii) the junction between the domains (BamHI-BglII hybrid site) is Arg-Ser; and (iii) the protein terminates in Cys-Cys.

    Since they don't acknowledge an I27-Arg-Ser-Cys-Cys ending, might there be more amino acids in the C terminal addition?

Working backward

Since I'm stuck trying to get I27 into either plasmid, let's try and work backward from

Met-Arg-Gly-Ser-(His)₆-Gly-Ser-(I27-Arg-Ser)₇-I27-...-Cys-Cys

BglII/BamHI joint

The BglII/BamHI overlap would produce the expected Arg-Ser joint.

BglII   BamHI
A     + GATCC = AGATCC = Arg-Ser
TCTAG       G   TCTAGG

Final plasmid (pI27-8)

The beginning of this sequence looks like the start of pQE30's linker, so we'll assume the final plasmid was:

remote ...    ,RGS-His epitope__________________. ,BamHI. I27...
       ... Met Arg Gly Ser His His His His His His Gly Ser Leu Ile ...
???    ... ATG AGA GGA TCG CAT CAC CAT CAC CAT CAC GGA TCC CTA ATA ...
???    ... CGT CTC TTC GAT ACG ACA ACG ACA ACG ACA TTC GAA GAT TAT ...

........I27 joint_. I27 ... final I27 ,BglII.                 continuation of pQE30?
... Glu Leu         Leu ...       Leu Arg Ser Cys Cys STOPSTOP...
... GAA TTG AGA TCC CTA ...       TTG AGA TCT TGC TGC TAG TAG ...
... CTT AAC TCT AGG GAT ...       GAT CTC GAG GTA GTA GCT GCT ...

Penultimate plasmid (pI27-4)

remote ...    ,RGS-His epitope__________________. ,BamHI. I27...
           Met Arg Gly Ser His His His His His His Gly Ser Leu Ile ...
???    ... ATG AGA GGA TCG CAT CAC CAT CAC CAT CAC GGA TCC CTA ATA ...
???    ... CGT CTC TTC GAT ACG ACA ACG ACA ACG ACA TTC GAA GAT TAT ...

    ... I27 joint_. I27 ... fourth I27 ,BglII.                 continuation of pQE30?
... Glu Leu         Leu ...        Leu Arg Ser Cys Cys STOPSTOP...
... GAA TTG AGA TCC CTA ...        TTG AGA TCT TGC TGC TAG TAG ...
... CTT AAC TCT AGG GAT ...        GAT CTC GAG GTA GTA GCT GCT ...
pI27-4 + BamHI + remote
remote                                             ,BamHI. I27...
                                                           Leu Ile ...
?                                                   GA TCC CTA ATA ...
??                                                       A GAT TAT ...

....... I27 joint_. I27 ... fourth I27 ,BglII.                 continuation of pQE30?
... Glu Leu         Leu ...        Leu Arg Ser Cys Cys STOPSTOP...
... GAA TTG AGA TCC CTA ...        TTG AGA TCT TGC TGC TAG TAG ...
... CTT AAC TCT AGG GAT ...        GAT CTC GAG GTA GTA GCT GCT ...
pI27-4 + BglII + remote
remote ...    ,RGS-His epitope__________________. ,BamHI. I27...
           Met Arg Gly Ser His His His His His His Gly Ser Leu Ile ...
 ??    ... ATG AGA GGA TCG CAT CAC CAT CAC CAT CAC GGA TCC CTA ATA ...
  ?    ... CGT CTC TTC GAT ACG ACA ACG ACA ACG ACA TTC GAA GAT TAT ...

....... I27 joint_. I27 ... fourth I27 ,BglII.
... Glu Leu         Leu ...        Leu
... GAA TTG AGA TCC CTA ...        TTG A
... CTT AAC TCT AGG GAT ...        GAT CTC GA
pI27-8
remote ...    ,RGS-His epitope__________________. ,BamHI. I27...
           Met Arg Gly Ser His His His His His His Gly Ser Leu Ile ...
???    ... ATG AGA GGA TCG CAT CAC CAT CAC CAT CAC GGA TCC CTA ATA ...
???    ... CGT CTC TTC GAT ACG ACA ACG ACA ACG ACA TTC GAA GAT TAT ...

....... I27 joint_. I27 ... fourth I27 ,other. I27...
... Glu Leu         Leu ...        Leu Gly Ser Leu Ile ...
... GAA TTG AGA TCC CTA ...        TTG AGA TCC CTA ATA ...
... CTT AAC TCT AGG GAT ...        GAT CTC GAA GAT TAT ...

....... I27 joint_. I27 ... fourth I27 ,BglII.                 continuation of pQE30?
... Glu Leu         Leu ...        Leu Arg Ser Cys Cys STOPSTOP...
... GAA TTG AGA TCC CTA ...        TTG AGA TCT TGC TGC TAG TAG ...
... CTT AAC TCT AGG GAT ...        GAT CTC GAG GTA GTA GCT GCT ...

Continuing to the first plasmid, pI27-1 must have been

remote ...    ,RGS-His epitope__________________. ,BamHI. I27...
       ... Met Arg Gly Ser His His His His His His Gly Ser Leu Ile ...
???    ... ATG AGA GGA TCG CAT CAC CAT CAC CAT CAC GGA TCC CTA ATA ...
???    ... CGT CTC TTC GAT ACG ACA ACG ACA ACG ACA TTC GAA GAT TAT ...

........I27 ,BglII.                 continuation of pQE30?
... Glu Leu Arg Ser Cys Cys STOPSTOP...
... GAA TTG AGA TCT TGC TGC TAG TAG ...
... CTT AAC CTC GAG GTA GTA GCT GCT ...

Potential pQE30 insertion points

  • Kpn1 (present after BamHI in both plasmids)

Potential remote restriction enzymes

  • BglI (pQE30 nucleotides 2583-2593 (GCCGGAAGGGC), Amp-resistance 3256-2396; pUC19 has two BglI sites (bad idea))
Posted Tue Aug 2 19:40:51 2011 Tags:

Available in a git repository.
Repository: h5config
Author: W. Trevor King

Since the number of packages mooching off pypiezo's configuration scheme was growing, I've split it out into it's own package. Now there's a general package for all your HDF5-based configuration needs.

The README is posted on the PyPI page.

Posted Thu Jul 28 12:25:06 2011 Tags:

Powered by ikiwiki.