Table of Contents:
[Ref: OpenBSD 4.0 release, postfix-2.3.2]
OpenBSD ships preconfigured with Sendmail http://www.Sendmail.org as the mail server (MTA.)
We wanted to use virtual user accounts for email for a number of reasons, and chose Postfix. This collection of notes will hopefully assist the new mail administrator into installing and verifying a virtual user accounts mail service.
We've installed a few virtual user mail servers, through trial and error, even with the better guides out there, and hopefully these notes adds useful tests, log reviews during the install process to confidently reach a successful install every-time.
These guides will therefore install and test a
This installation exercise we are going to install three virtual domains on a single host, with three virtual accounts for each virtual domain:
| Host | myhost.example.org |
| Virtual Mail Base Directory | /var/spool/postfix/vmail |
| Virtual Domain | alpha.example.org ~ users: alfred, bob, charlie |
| Virtual Domain | beta.example.org ~ users: auntie, bill, chou |
| Virtual Domain | gamma.example.org ~ users: alistair, ben, cinder |
Using OpenBSD's Postfix configuration, we will store the virtual mailboxes in: /var/spool/postfix/vmail
An operational mail server requires a number of applications/services working together to provide the final 'product' that users take for granted as 'e-mail.' MOst of these tools are documented together with this documentation on installing, testing Postfix. The tools we are putting together for a smooth mail operation are:
One infrastructure that is very key to ensuring that your email server really works, is the Global DNS. We do not show you how to configure your DNS so email can go to your box, or email is accepted from your box, but there are good tips on the Internet on what to do.
The rest of this documentation is dedicated to the installation, and configuration of Postfix as a Virtual User Account Mail Server.
postfix is found in the ports collection for OpenBSD, and you can get further information from the developer site http://www.postfix.org
The installation of a POP3, IMAP server to work with this virtual user account configuration of Postfix follows the link dovecot.htm.
We purposely provide that documentation separately to ensure we can :
Although virtual user accounts can be managed and created using text/hash database files, a large install can be managed better using a database server backend because other tools can interact with the database server, be used for managing users.
This documentation will describe how to configure the MySQL database server for virtual user accounts. Our documentation for installing and testing MySQL for OpenBSD follows the link mysql.htm.
postfixadmin is a wonderful Web GUI tool for managing your postfix installation.
This sample installation should work tested without the need for postfixadmin. I would advise installing postfixadmin for a simplified mechanism for managing virtual user accounts.
Our documentation for installing and configuring postfixadmin follows the link postfixadmin.htm
The dovecot, mysql flavor of Postfix is not normally available as a pre-built package, so the best way to get it is to install the ports tree and build the package manually.
To build the package from ports, we go into the postfix/stable port and make a flavor.
# cd /usr/ports/mail/postfix/stable
# make show=FLAVORS
sasl2 ldap mysql pgsql dovecot
# env FLAVOR="mysql dovecot" make package
# env FLAVOR="mysql dovecot" make install
|
--- postfix-2.3.2-mysql-dovecot ------------------- -> Creating /etc/mailer.conf.postfix -> Creating Postfix spool directory and chroot area under /var/spool/postfix Warning: you still need to edit myorigin/mydestination/mynetworks parameter settings in /etc/postfix/main.cf. See also http://www.postfix.org/faq.html for information about dialup sites or about sites inside a firewalled network. BTW: Check your /etc/mail/aliases file and be sure to set up aliases that send mail for root and postmaster to a real person, then run /usr/local/sbin/newaliases. +--------------- | Configuration files has been installed in /etc/postfix. | Please update these files to meet your needs. +--------------- +--------------- | Postfix can be set up to replace Sendmail entirely. Please read the | documentation at file:/usr/local/share/doc/postfix/html/index.html or | http://www.postfix.org/ carefully before you decide to do this! | | To replace Sendmail with postfix you have to install a new mailer.conf | using the following command: | | /usr/local/sbin/postfix-enable | | If you want to restore Sendmail, this is done using the following command: | | /usr/local/sbin/postfix-disable |
The package build gives us a number of tasks to perform before we can assume that postfix is minimally installed.
The documentation is made available in html format so let's put it into our webspace for future reading.
|
# mkdir -p /var/www/htdocs/manual # cp -R /usr/local/share/doc/postfix/html /var/www/htdocs/manual/postfix |
If you've previously enabled the standard OpenBSD apache distribution then you should now be able to browse the Postfix documentation locally at http://www.example.org/manual/postfix/. If you have enabled the Apache server and have no intentions of doing so, then you can read the official documentation at http://www.postfix.org/docs.html.
The OpenBSD port provides a script 'postfix-enable' that will back-up the standard Sendmail installation, and install postfix.
| # /usr/local/sbin/postfix-enable |
|
old /etc/mailer.conf saved as /etc/mailer.conf.pre-postfix postfix /etc/mailer.conf enabled NOTE: do not forget to add Sendmail_flags="-bd" to /etc/rc.conf.local to startup postfix correctly. NOTE: do not forget to add "-a /var/spool/postfix/dev/log" to syslogd_flags in /etc/rc.conf.local and restart syslogd. NOTE: do not forget to remove the "Sendmail clientmqueue runner" from root's crontab. |
[ref: http://www.postfix.org/INSTALL.html#mandatory ]
To customise Postfix for our local install, we need to modify Postfix's main configuration file: /etc/postfix/main.cf
| File Fragment: /etc/postfix/main.cf |
|
myhostname = myhost.example.org |
Notes:
You can use mynetworks to set your network. If you don't know how to make this setting, you can leave it and postfix will automatically set the known ip addresses on your servers configuration.
[ref: http://www.postfix.org/postconf.5.html#parent_domain_matches_subdomains ]
parent_domain_matches_subdomains
(default: see "postconf -d" output)
What Postfix features match subdomains of "domain.tld" automatically, instead of
requiring an explicit ".domain.tld" pattern. This is planned backwards
compatibility: eventually, all Postfix features are expected to require explicit
".domain.tld" style patterns when you really want to match subdomains.
After making the above changes, we need to rebuild the 'hash' files with the following commands.
# /usr/local/sbin/postalias /etc/aliases
# /usr/local/sbin/newaliases
Likewise, we need to run the above commands after changes to related files (for example: /etc/aliases or /etc/postfix/aliases)
After postfix has been started, you can then use "postconf | grep mynetworks" as a basis for fine-tuning your configuration.
To enable Postfix to start with each system start, we make the following edits to the startup configuration file: /etc/rc.conf.local
You should have something like the following in your /etc/rc.conf.local
| File: /etc/rc.conf.local |
|
syslogd_flags="-a /var/spool/postfix/dev/log" |
Explaining the "-a /var/spool/postfix/dev/log" (from the man pages)
syslogd(8)
syslogd reads and logs messages to the system console,
log files, other machines and/or users as specified by its configuration file.
-a path
Specify a location where syslogd should place an additional log socket. Up to
about 20 additional logging sockets can be speci-
fied. The primary use for this is to place additional log sockets in /dev/log of
various chroot filespaces.
Explaining Sendmail -bd (from the man pages)
Sendmail(8)
-bd Run as a daemon. Sendmail will fork and run in the background listening on socket 25 for incoming SMTP connections. By default, Sendmail will also listen on socket 587 for RFC 2476 message submission. This is normally run from /etc/rc.
To complete the installation of Postfix, and disabling of Sendmail, we need to edit root's crontab and disable supplied Sendmail behaviour
To be safe, you should just comment out the relevant line, (just in case you need or want to go back to Sendmail.) We use "crontab -e" and add "#" hashes to 'comment' out the execution of the Sendmail line shown below.
| # crontab -e |
|
#minute hour mday month wday command |
Take a look at your /etc/postfix/aliases file which will contain some default aliases that you should manage.
alias_database = hash:/etc/postfix/aliases
For a basic, test install then there shouldn't be any real need to change this file. You should remember when you're ready for a full install then you should review this file for aliases such as root, postmaster, webmaster and ensure they are routed to the correct 'person.'
From the file: The program "newaliases" must be run after this file is updated for any changes to show through to Postfix.
# /usr/local/sbin/newaliases
[ref: postfix(1)]
Now, we are ready to make some fundamental tests, so let's start Postfix which at this stage is a nice 5 step process.
|
# pkill -HUP syslogd # pkill Sendmail # /usr/local/sbin/newaliases # /usr/local/sbin/postfix check # /usr/local/sbin/Sendmail -bd -q30m |
| postfix/postfix-script: starting the Postfix mail system |
We are sending the SIGHUP (hangup) to syslogd, from the man page.
syslogd(8)
syslogd reads its configuration file when it starts up and whenever it receives a hangup signal.
We want to force the Sendmail program to die, from the man page
pkill(1)
The pkill command searches the process table on the running system and signals all processes that match the criteria given on the command line.
The default signal TERM is sent when no other signal is specified, so we're just telling Sendmail to die.
Be careful to specify the full path with these commands. Remember that we have not deleted the old files from the original Sendmail installation, so it is very important that we use the full path of the programs /usr/local/sbin where postfix commands have been installed. If you do not use the full path, then we do not know, but you will most likely be running the OpenBSD Sendmail installation, which is not what we want here.
/usr/local/sbin/newaliases
[Ref: postconf(1), postfix(1)]
Postfix comes with rudimentary testing of file (using postfix check) and configuration settings(using postconf), so its a good habit to give it a test run before doing anything else.
The first quick test can be performed using the postfix command
postfix(1)
The following commands are implemented:
check Warn about bad directory/file ownership or
permissions, and create missing directories.
Essentially, just run the program and if it doesn't give you error messages, then we are one step closer with 'fewer' errors in our setup.
# postfix check
The second test can be performed using the postconf "Postfix configuration utility" , from the man pages
postconf(1)
-n Print parameter settings that are not left at their built-in default value, because they are explicitly specified in main.cf.
This essentially lets us quickly find out any blatant errors. For example, an output could look like this.
| # postconf | grep ^my |
| mydestination = $myhostname, localhost.$mydomain, localhost mydomain = example.org myhostname = myhost.example.org mynetworks = <IP_ADDRESS>/8 public_ip/23 <IP_ADDRESS>/24 <IP_ADDRESS>/24 [::1]/128 ...IPV6_Addresses mynetworks_style = subnet myorigin = $mydomain |
A quick perusal of the postconf output should give us an idea if we forgot or incorrectly put some information in.
Using "postconf -n" is a good way to check for typing mistakes that can lead to many lost hours due the system being misconfigured and we're still trying to solve a problem with the wrong expections because the settings we placed in the configuration have not been set because of a typing mistake.
At this point in our install, there has been no serious changes to the configuration files.
After the above testing, validation, we should be able to start postfix with the postfix command, or in our example we will use the 'new' Sendmail command.
# /usr/local/sbin/Sendmail -bd -q30m
[ref: The Network People, Inc. Mail Server Testing ]
We should now be able to test whether the server's 'face' to the world (smtp) is working.
To simplify testing, we will perform the tests on server itself. Where possible/practical, you should also run the tests from an external client to verify expected behaviour with an active firewall or other systems between your Postfix/SMTP Server and your clients.
This test procedure will only test a few basic commands, writing myself a message, my system user account is samt (and you can use any valid user account on the system)
Screen Session
| $ telnet localhost smtp |
|
Trying ::1... Connected to localhost. Escape character is '^]'. 220 myhost.example.org ESMTP Postfix |
| EHLO example.org |
| 250-myhost.example.org 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN |
| MAIL FROM<EMAIL_ADDRESS>|
| 250 2.1.0 Ok |
| RCPT TO<EMAIL_ADDRESS>|
| 250 2.1.5 Ok |
| DATA |
| 354 Enter mail, end with "." on a line by itself |
| Subject: This is my subject line I continue writing until I'm out of interesting things to say which is not that far away . |
| 250 2.0.0 Ok: queued as 699ACBA2D7 |
| QUIT |
| 221 2.0.0 Bye Connection closed by foreign host. |
I've just used capital letters for the SMTP commands, but obviously they work fine with lowercase.
If your server is not yet online with a valid DNS record, then you can test using RCPT TO: samt@localhost.
The corresponding log messages will look something like the below.
Screen Session
| # tail -f /var/log/maillog |
|
starting the Postfix mail system |
'tail' is a unix program to look at the recent additions to a file, and in our case we're looking at the log file for 'mail' related programs. Using the "-f" parameter tells 'tail' to continue looking at the recent additions to the file (such that updates to the file are displayed on the screen for us.) Use Ctrl+C (i.e. hold the Ctrl key while pressing C) to break out of the log review session shown above
[Ref: mail(1) ]
While we're testing with real system user accounts, we can use the unix 'mail' program to check our mail message.
Screen Session
| # /usr/bin/mail -u samt |
|
Mail version 8.1.2 01/15/2001. Type ? for help. |
| & more 1 |
|
Message 1: I continue writing until I'm out of interesting things to say |
| & q |
| Saved 1 message in mbox |
In the above example, we enter mail for the user samt ("-u samt") and the 'mail' client shows a list of current email for user 'samt' and then gives us the "&" ampersand prompt.
We can read the email message by typing the message number, and 'mail' supports the use of a screen 'pager' such as 'more' so that we can scroll through longer messages.
Quit. We quit out of 'mail' using the 'q' command.
The above reference to the log files and mail client is to provide you with more tools for validating your installation.
We now have a fully functional email server that can receive email messages, and store those messages for users.
[ref: Postfix Virtual Domain Hosting Howto http://www.example.org/manual/postfix/VIRTUAL_README.html ]
I've always had difficulty in getting the full featured database driven virtual email working, so we will go through a slow installation process of installing the non-database driven version first to make sure all other configuration items are correct within Postfix.
We'll put in some basic configuration information for virtual hosting into Postfix's main.cf
| File Fragment: /etc/postfix/main.cf |
|
###### Virtual Mailbox Services - Local mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain,
|
Notes:
We need to layout our files mentioned in the configuration file above and I have chosen the following which is hopefully scaleable if you want to use this as the basis (ignoring the simpler database solution reviewed later.)
Screen Session
# mv /etc/postfix/virtual /etc/postfix/virtual_aliases
# mkdir -p /etc/postfix/virtual/mailbox
# mkdir -p /etc/postfix/virtual/aliases
# mv /etc/postfix/virtual_aliases /etc/postfix/virtual/aliases/common
# touch /etc/postfix/virtual/mailbox/domains
# touch /etc/postfix/virtual/mailbox/alpha.example.org
# touch /etc/postfix/virtual/mailbox/beta.example.org
# touch /etc/postfix/virtual/mailbox/gamma.example.org
We move the current virtual alias file from /etc/postfix/virtual to /etc/postfix/virtual/aliases.
We specify for postfix which virtual domains we want it to receive email with the following configuration option:
File Fragment: /etc/postfix/main.cf
virtual_mailbox_domains = hash:/etc/postfix/virtual/domains
File:/etc/postfix/virtual/mailbox/domains
alpha.example.org IGNORED_PARAMETER
beta.example.org IGNORED_PARAMETER
gamma.example.org IGNORED_PARAMETER
After creating or making any changes to the above domains file, recreate the hash database using postmap
# /usr/local/sbin/postmap /etc/postfix/virtual/mailbox/domains
For OpenBSD, the default chroot'd postfix installation stores its files in /var/spool/postfix so we'll specify the location for virtual email accounts within that structure.
File Fragment: /etc/postfix/main.cf
virtual_mailbox_base = /var/spool/postfix/vmail
When setting up virtual mailboxes (in this manner), it makes sense to structure the directories for scalability and to prevent clashing namespaces. Prior to setting up accounts we'll consider that our mailbox accounts will be structured by domain. For example:
We can now create some sample user accounts into our virtual mailbox
File Fragment: /etc/postfix/main.cf
virtual_mailbox_maps =
hash:/etc/postfix/virtual/mailbox/alpha.example.org,
hash:/etc/postfix/virtual/mailbox/beta.example.org,
hash:/etc/postfix/virtual/mailbox/gamma.example.org
Obviously, each valid user needs a corresponding mailbox storage space. The mailbox file is specified relative to the virtual_mailbox_base shown above and since we already have our directory design structure above, we can go ahead and create some accounts.
| File: /etc/postfix/virtual/mailbox/alpha.example.org |
|
#account --> Storage location |
|
<EMAIL_ADDRESS>alpha.example.org/alfred/ |
After creating or making any changes to the above alpha.example.org file, recreate the hash database using postmap
# /usr/local/sbin/postmap /etc/postfix/virtual/mailbox/alpha.example.org
| File: /etc/postfix/virtual/mailbox/beta.example.org |
|
#account --> Storage location |
|
<EMAIL_ADDRESS>beta.example.org/auntie/ |
After creating or making any changes to the above beta.example.org file, recreate the hash database using postmap
# /usr/local/sbin/postmap /etc/postfix/virtual/mailbox/beta.example.org
| File: /etc/postfix/virtual/mailbox/gamma.example.org |
|
#account --> Storage location |
|
<EMAIL_ADDRESS>gamma.example.org/alistair/ |
After creating or making any changes to the above gamma.example.org file, recreate the hash database using postmap
# /usr/local/sbin/postmap /etc/postfix/virtual/mailbox/gamma.example.org
We must now tell postfix to re-read its configuration files, by using postfix reload.
# /usr/local/sbin/postfix reload
Mailbox files (above) can use either mbox or maildir format. To use maildir format, include a slash at the end of the filename. For a discussion of the relative differences you can follow the link to: Benchmarking mbox versus maildir, in short if your have a modern Unix OS (post 2004?) you should not have any problems using maildirs as an efficient scalable system. But read the benchmark and search the web for your own edification.
I have chosen for this example to use separate files per domain, merely for illustration of the flexibility of the system (and if you are insane enough to manage it manually you can at least let the file structure assist you in some manner.)
NOT WORKING YET.
NOT WORKING YET.
Do not use yet.
I am not yet sure how virtual aliasing work, or its restrictions but below documents some thinking of how to install it. Unfortunately I haven't found any workable samples on the Internet and likewise tools such as webmin do not use virtual_alias_maps (as far as I can read.) While, the same below configuration (hash) works fine when used in combinaton with mysql for all other virtual_alias_*
Note: With this exercise, virtual_alias_maps works fine using mysql (and thus postfixadmin)
We can also create some aliases for virtual accounts
File Fragment: /etc/postfix/main.cf
virtual_alias_maps = hash:/etc/postfix/virtual/alias/alpha.example.org,
hash:/etc/postfix/virtual/alias/beta.example.org,
hash:/etc/postfix/virtual/alias/gamma.example.org
| File: /etc/postfix/virtual/alias/alpha.example.org |
|
|
|
alpha.example.org IGNORED_PARAMETER
<EMAIL_ADDRESS><EMAIL_ADDRESS>|
After creating or making any changes to the above alias/alpha.example.org file, recreate the hash database using postmap
# /usr/local/sbin/postmap /etc/postfix/virtual/alias/alpha.example.org
# /usr/local/sbin/postfix reload
| File: /etc/postfix/virtual/alias/beta.example.org |
|
|
|
beta.example.org IGNORED_PARAMETER
<EMAIL_ADDRESS><EMAIL_ADDRESS>|
After creating or making any changes to the above alias/beta.example.org file, recreate the hash database using postmap
# /usr/local/sbin/postmap /etc/postfix/virtual/alias/beta.example.org
# /usr/local/sbin/postfix reload
| File: /etc/postfix/virtual/alias/gamma.example.org |
|
|
|
gamma.example.org IGNORED_PARAMETER
<EMAIL_ADDRESS><EMAIL_ADDRESS>|
After creating or making any changes to the above alias/gamma.example.org file, recreate the hash database using postmap
# /usr/local/sbin/postmap /etc/postfix/virtual/alias/gamma.example.org
We must now tell postfix to re-read its configuration files, by using postfix reload.
# /usr/local/sbin/postfix reload
[ref: http://www.postfix.org/postconf.5.html#virtual_uid_maps, http://www.postfix.org/postconf.5.html#virtual_gid_maps]
Mail delivery happens with the recipient's UID/GID privileges specified with virtual_uid_maps and virtual_gid_maps, therefore the virtual mailbox files must be owned by a system user account and associated with a group on your system. Fortunately Postfix is flexible to allow each mailbox to be owned by a unique system user account or by a single system user account for all domains, and even one system user account per domain. This is set by using the virtual_uid_maps and virtual_gid_maps setting.
virtual_uid_maps = static:901
virtual_gid_maps = static:901
The 'static' map type tells Postfix that you want the uid/gid to be for all accounts.
We can now create the system user account to manage virtual email mailboxes.
Screen Session
# useradd -d /var/spool/postfix/vmail -g=uid -u 901 -s /sbin/nologin -m -c "Virtual Mailbox Owner" _vmail
# chmod -R 770 /var/spool/postfix/vmail
A by-product of the user/group creation is that the "base" directory will also be created with the correct permissions.
If we wanted to use different users, groups for managing mailboxes, then we could have used a lookup file instead.
virtual_uid_maps = hash:/etc/postfix/virtual_uids
virtual_gid_maps = hash:/etc/postfix/virtual_gids
Ensure the standard (non-virtual) alias file is built by using Postfix's newaliases.
# /usr/local/sbin/newaliases
Restart Postfix
# /usr/local/sbin/postfix stop
# /usr/local/sbin/postfix start
Use postconf -n to compare whether what we expect in virtual_* parameter settings is what is running on the system.
Screen Session
# postconf | grep ^virtual
virtual_alias_domains = $virtual_alias_maps
virtual_alias_expansion_limit = 1000
virtual_alias_maps = $virtual_maps
virtual_alias_recursion_limit = 1000
virtual_destination_concurrency_limit = $default_destination_concurrency_limit
virtual_destination_recipient_limit = $default_destination_recipient_limit
virtual_gid_maps = static:901
virtual_mailbox_base = /var/spool/postfix/vmail
virtual_mailbox_domains = hash:/etc/postfix/virtual/domains
virtual_mailbox_limit = 51200000
virtual_mailbox_lock = fcntl
virtual_mailbox_maps = hash:/etc/postfix/virtual/mailbox/alpha.tbu.to,
hash:/etc/postfix/virtual/mailbox/beta.tbu.to,
hash:/etc/postfix/virtual/mailbox/gamma.tbu.to
virtual_minimum_uid = 900
virtual_transport = virtual
virtual_uid_maps = static:901
Remember to use the /var/log/maillog file to validate postfix has started without errors. You can also repeat the above 'telnet localhost smtp' to review nothing has drastically broken.
Screen Session
$ telnet localhost smtp
Trying ::1...
Connected to localhost.
Escape character is '^]'.
220 myhost.example.org ESMTP Postfix (2.3.2)
ehlo example.org
250-myhost.example.org
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
mail from<EMAIL_ADDRESS>250 2.1.0 Ok
rcpt to<EMAIL_ADDRESS>250 2.1.5 Ok
rcpt to<EMAIL_ADDRESS>250 2.1.5 Ok
rcpt to<EMAIL_ADDRESS>250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
Subject: Welcome Virtual Users
Hopefully you are all virtually OK.
Welcome to email
.
250 2.0.0 Ok: queued as BA1FC5A950
quit
221 2.0.0 Bye
Connection closed by foreign host.
The corresponding /var/log/maillog entry should look something like the following
File: /var/log/maillog
connect from unknown[::1]
client=unknown[::1]
<EMAIL_ADDRESS><EMAIL_ADDRESS>size=393, nrcpt=3 (queue active)
<EMAIL_ADDRESS>relay=virtual, delay=69,
delays=67/0.05/0/1.8, dsn=2.0.0, status=sent (delivered to maildir)
<EMAIL_ADDRESS>relay=virtual, delay=69,
delays=67/0.05/0/1.9, dsn=2.0.0, status=sent (delivered to maildir)
<EMAIL_ADDRESS>relay=virtual, delay=69,
delays=67/0.14/0/1.9, dsn=2.0.0, status=sent (delivered to maildir)
removed
disconnect from unknown[::1]
We should also be able to see evidence of the virtual account mails in the file system such as has occurred on this installation.

Welcome to email
We can likewise confirm the same message was received for<EMAIL_ADDRESS>and<EMAIL_ADDRESS>Mischa Peters at high5.net has created a great tool for managing virtual user email accounts based on Postfix. We will look at installing and testing the foundation database configuration here.
To minimise tools being reviewed for debugging, we're going to attempt installing MySQL support, using the postfixadmin data tables, but without installing or using postfixadmin.
The following notes differs from a standard postfixadmin install in how it uses usernames, largely because it simplifies things for my understanding. The whole process has helped me to better understand the interactions between these different applications, finding methods for debugging installation problems. I hope it also simplifies for our understanding.
Please refer to our MySQL notes for how to install MySQL for OpenBSD.
Following Mischa's instructions at Postfix Wiki, Virtual Users and Domains we'll take a look at:
Much of these database settings are straight out of the postfixadmin/DATABASE_MYSQL.TXT file with slight/inane modifications where it helps me find things more legible.
The key differentiators between these database instructions than the default install are as follows:
Minor quibbles but makes the install instructions slightly more legible?
We will first log into the mysql server with an account that has root/administrator privileges and insert (copy/paste) sql commands below.
Screen Session
$ mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 41 to server version: 5.0.24a-log
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>
The rest of the 'greyed' instructions can be copy/pasted into your MySQL monitor above. Be sure to change your usernames and passwords as appropriate.
The first thing we want is to tell mysql that we want to modify the records relating to user accounts for the database server.
mysql client session
USE mysql;
Next, we want to create some new settings for a new user 'postfixserver' that we want to designate for use by the postfix server.
mysql client session
INSERT INTO user (Host, User, Password) VALUES ('localhost','postfixserver',password('postfixserver'));
INSERT INTO db (Host, Db, User, Select_priv) VALUES ('localhost','mail','postfixserver','Y');
Next, we want to create a new user 'postfixadmin' that we want to designate for use by the postfixadmin application.
mysql client session
INSERT INTO user (Host, User, Password) VALUES ('localhost','postfixadmin',password('postfixadmin'));
INSERT INTO db (Host, Db, User, Select_priv, Insert_priv, Update_priv,
Delete_priv) VALUES ('localhost', 'mail', 'postfixadmin', 'Y', 'Y', 'Y', 'Y');
To ensure that these new user settings have been loaded into use, we flush the settings.
mysql client session
FLUSH PRIVILEGES;
Now, we want to set privileges for the database that we will be using.
mysql client session
GRANT USAGE ON mail.* TO postfixserver@localhost;
GRANT SELECT, INSERT, DELETE, UPDATE ON mail.* TO
postfixserver@localhost;
GRANT USAGE ON mail.* TO postfixadmin@localhost;
GRANT SELECT, INSERT, DELETE, UPDATE ON mail.* TO
postfixadmin@localhost;
Next, we create the database itself.
mysql client session
CREATE DATABASE mail;
The next stage is to create the relevant tables and some dummy/sample data.
The alias table will store/retrieve our virtual aliases (which I have not yet
mysql client session
USE mail;
CREATE TABLE `alias` (
`address` varchar(255) NOT NULL default '',
`goto` text NOT NULL,
`domain` varchar(255) NOT NULL default '',
`created` datetime NOT NULL default '0000-00-00 00:00:00',
`modified` datetime NOT NULL default '0000-00-00 00:00:00',
`active` tinyint(1) NOT NULL default '1',
PRIMARY KEY (address),
KEY address (`address`)
) TYPE=MyISAM COMMENT='Postfix Admin - Virtual Aliases';
The domain table will store/retrieve our virtual domains
mysql client session
CREATE TABLE `domain` (
`domain` varchar(255) NOT NULL default '',
`description` varchar(255) NOT NULL default '',
`aliases` int(10) NOT NULL default '0',
`mailboxes` int(10) NOT NULL default '0',
`maxquota` int(10) NOT NULL default '0',
`quota` int(10) NOT NULL default '0',
`transport` varchar(255) default NULL,
`backupmx` tinyint(1) NOT NULL default '0',
`created` datetime NOT NULL default '0000-00-00 00:00:00',
`modified` datetime NOT NULL default '0000-00-00 00:00:00',
`active` tinyint(1) NOT NULL default '1',
PRIMARY KEY (`domain`),
KEY domain (`domain`)
) TYPE=MyISAM COMMENT='Postfix Admin - Virtual Domains';
The mailbox table will store/retrieve the usernames, passwords, and file directories
mysql client session
USE mail;
CREATE TABLE `mailbox` (
`username` varchar(255) NOT NULL default '',
`password` varchar(255) NOT NULL default '',
`name` varchar(255) NOT NULL default '',
`maildir` varchar(255) NOT NULL default '',
`quota` int(10) NOT NULL default '0',
`domain` varchar(255) NOT NULL default '',
`created` datetime NOT NULL default '0000-00-00 00:00:00',
`modified` datetime NOT NULL default '0000-00-00 00:00:00',
`active` tinyint(1) NOT NULL default '1',
PRIMARY KEY (`username`),
KEY username (`username`)
) TYPE=MyISAM COMMENT='Postfix Admin - Virtual Mailboxes';
The database is now created, and we might as well configure the other tables used by postfixadmin
mysql client session
USE mail;
CREATE TABLE `admin` (
`username` varchar(255) NOT NULL default '',
`password` varchar(255) NOT NULL default '',
`created` datetime NOT NULL default '0000-00-00 00:00:00',
`modified` datetime NOT NULL default '0000-00-00 00:00:00',
`active` tinyint(1) NOT NULL default '1',
PRIMARY KEY (`username`),
KEY username (`username`)
) TYPE=MyISAM COMMENT='Postfix Admin - Virtual Admins';
mysql client session
USE mail;
CREATE TABLE `domain_admins` (
`username` varchar(255) NOT NULL default '',
`domain` varchar(255) NOT NULL default '',
`created` datetime NOT NULL default '0000-00-00 00:00:00',
`active` tinyint(1) NOT NULL default '1',
KEY username (`username`)
) TYPE=MyISAM COMMENT='Postfix Admin - Domain Admins';
USE mail;
CREATE TABLE `log` (
`timestamp` datetime NOT NULL default '0000-00-00 00:00:00',
`username` varchar(255) NOT NULL default '',
`domain` varchar(255) NOT NULL default '',
`action` varchar(255) NOT NULL default '',
`data` varchar(255) NOT NULL default '',
KEY timestamp (`timestamp`)
) TYPE=MyISAM COMMENT='Postfix Admin - Log';
mysql client session
USE mail;
#
# Table structure for table vacation
#
CREATE TABLE `vacation` (
`email` varchar(255) NOT NULL default '',
`subject` varchar(255) NOT NULL default '',
`body` text NOT NULL default '',
`cache` text NOT NULL default '',
`domain` varchar(255) NOT NULL default '',
`created` datetime NOT NULL default '0000-00-00 00:00:00',
`active` tinyint(1) NOT NULL default '1',
PRIMARY KEY (`email`),
KEY email (`email`)
) TYPE=MyISAM COMMENT='Postfix Admin - Virtual Vacation';
We will populate our database with some test data that you can easily remove later using postfixadmin. By using our sample data below we avoid having to configure postfixadmin to have a working test server.
We will replicate our virtual user system used with the above hash files into our MySQL database.
This is largely relevant only if you will be installing postfixadmin, and can be skipped.
Now, here's one part where the standard documentation always got me lost. The standard instructions provides the below image which will work for logging into the system, but will cause other problems. Instead of the following instructions
# superadmin user & password (login<EMAIL_ADDRESS>password: admin)
INSERT INTO domain_admins (username, domain, active) VALUES ('admin@domain.tld','ALL','1');
INSERT INTO admin (username, password, active) VALUES
('admin@domain.tld','$1$0fec9189$bgI6ncWrldPOsXnkUBIjl1','1');
We will be using the following instructions which uses CRYPT instead of postfixadmin's md5crypt for encrypting the password to:
mysql client session
USE mail;
INSERT INTO admin (username, password, active) VALUES ('admin','6dwLx9NTxhTjU','1');
INSERT INTO domain_admins (username, domain, active) VALUES ('admin','ALL','1');
When installing postfixadmin, from the above settings, we set:
File: /var/www/htdocs/postfixadmin/config.inc.php
$CONF['encrypt'] = 'system';
We will be creating virtual domains for our three sample domains:
Creating our virtual domains
mysql client session
USE mail;
INSERT INTO domain (domain,description,aliases,mailboxes,maxquota,quota,transport,backupmx,active) VALUES ('alpha.example.org', 'Alpha Tester','10','10', '0','0','virtual', '0','1');
INSERT INTO domain (domain,description,aliases,mailboxes,maxquota,quota,transport,backupmx,active) VALUES ('beta.example.org', 'Beta Site','10','10', '0','0','virtual', '0','1');
INSERT INTO domain (domain,description,aliases,mailboxes,maxquota,quota,transport,backupmx,active) VALUES ('gamma.example.org', 'Gamma Born','10','10', '0','0','virtual', '0','1');
We can verify that the data has been entered correctly with the following simple test. From the command prompt, start mysql.
Screen Session
# mysql -u root -p
Welcome to the MySQL monitor. Commands end with ; or
\g.
Your MySQL connection id is 94 to server version: 5.0.24a-log
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> use mail;
Database changed
mysql> select domain, transport from domain;
+--------------+-----------+
| domain | transport |
+--------------+-----------+
| alpha.example.org | virtual |
| beta.example.org | virtual |
| gamma.example.org | virtual |
+--------------+-----------+
3 rows in set (0.00 sec)
As from our example above, we will be creating virtual mailboxes (virtual user accounts) for our above three sample domains:
Creating our virtual users for alpha.example.org : password is username
mysql client session
USE mail;
INSERT INTO mailbox (username,password,name,maildir,quota,domain,active) VALUES ('alfred@alpha.example.org','82fU0EHEzA6wo'<EMAIL_ADDRESS>'0','alpha.example.org','1');
INSERT INTO mailbox (username,password,name,maildir,quota,domain,active) VALUES ('bob@alpha.example.org','1bdyGcAE/JC0I'<EMAIL_ADDRESS>'0','alpha.example.org','1');
INSERT INTO mailbox (username,password,name,maildir,quota,domain,active) VALUES ('charlie@alpha.example.org','048qvFjqS3zBc'<EMAIL_ADDRESS>'0','alpha.example.org','1');
Creating our virtual users for beta.example.org : password is username
mysql client session
USE mail;
INSERT INTO mailbox (username,password,name,maildir,quota,domain,active) VALUES<EMAIL_ADDRESS>'3336RmmvRQ0NU'<EMAIL_ADDRESS>'0','beta.example.org','1');
INSERT INTO mailbox (username,password,name,maildir,quota,domain,active) VALUES<EMAIL_ADDRESS>'fbVsBHcPJVVjU'<EMAIL_ADDRESS>'0','beta.example.org','1');
INSERT INTO mailbox (username,password,name,maildir,quota,domain,active) VALUES<EMAIL_ADDRESS>'359nFQg1J.8nc'<EMAIL_ADDRESS>'0','beta.example.org','1');
Creating our virtual users for gamma.example.org : password is username
mysql client session
USE mail;
INSERT INTO mailbox (username,password,name,maildir,quota,domain,active) VALUES<EMAIL_ADDRESS>'12XeQqcTNk3YU'<EMAIL_ADDRESS>'0','gamma.example.org','1');
INSERT INTO mailbox (username,password,name,maildir,quota,domain,active) VALUES<EMAIL_ADDRESS>'1bKpSqtESjdck'<EMAIL_ADDRESS>'0','gamma.example.org','1');
INSERT INTO mailbox (username,password,name,maildir,quota,domain,active) VALUES<EMAIL_ADDRESS>'19rP1zls.evZQ'<EMAIL_ADDRESS>'0','gamma.example.org','1');
Remember to change the user domains in the above to your specific virtual domain(s). You can use an sql query such as the below to help verify that you are not using the *.example. domains from this document.
mysql client session
use mail;
select username from mailbox;
select domain from domain;
[ref: http://www.postfix.org/postconf.5.html#virtual_uid_maps, http://www.postfix.org/postconf.5.html#virtual_gid_maps]
If you've skipped the hash virtual user instructions, then you will need to create the System user Account for Postfix to use for delivering 'virtual' mail.
Mail delivery happens with the recipient's UID/GID privileges specified with virtual_uid_maps and virtual_gid_maps, therefore the virtual mailbox files must be owned by a system user account and associated with a group on your system. Fortunately Postfix is flexible to allow each mailbox to be owned by a unique system user account or by a single system user account for all domains, and even one system user account per domain. This is set by using the virtual_uid_maps and virtual_gid_maps setting.
virtual_uid_maps = static:901
virtual_gid_maps = static:901
The 'static' map type tells Postfix that you want the uid/gid to be for all accounts.
We can now create the system user account to manage virtual email mailboxes.
# useradd -d /var/spool/postfix/vmail -g=uid -u 901 -s /sbin/nologin -m -c "Virtual Mailbox Owner" _vmail
# chmod -R 770 /var/spool/postfix/vmail
A by-product of the user/group creation is that the "base" directory will also be created with the correct permissions.
If we wanted to use different users, groups for managing mailboxes, then we could have used a lookup file instead.
virtual_uid_maps = hash:/etc/postfix/virtual_uids
virtual_gid_maps = hash:/etc/postfix/virtual_gids
Ensure the standard (non-virtual) alias file is built by using Postfix's newaliases.
# /usr/local/sbin/newaliases
Restart Postfix
# /usr/local/sbin/postfix stop
# /usr/local/sbin/postfix start
Postfix can read it's configuration data from hash files, text files, and from databases. To tell Postfix that data will be obtained from a MySQL database, we use the "mysql:" prefix to a text file that contains the relevant information for postfix to extract that data.
For our example, modify the above /etc/postfix/main.cf. We can work by just removing the additions made above and replacing them with the following.
File Fragment: /etc/postfix/main.cf
virtual_alias_maps = mysql:/etc/postfix/mysql/alias_maps.cf
virtual_gid_maps = static:901
virtual_mailbox_base = /var/spool/postfix/vmail
virtual_mailbox_domains = mysql:/etc/postfix/mysql/domains_maps.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql/mailbox_maps.cf
virtual_minimum_uid = 900
virtual_transport = virtual
virtual_uid_maps = static:901
parent_domain_matches_subdomains =
The /etc/postfix/mysql/*.cf files contain the login information for postfix to access and retrieve the MySQL database/table.
Verify that what we've set above is actually what postfix will recognise.
Screen Session
/usr/local/sbin/postfix reload
/usr/local/sbin/postconf -n | grep ^virtual
virtual_alias_maps = mysql:/etc/postfix/mysql/alias_maps.cf
virtual_gid_maps = static:901
virtual_mailbox_base = /var/spool/postfix/vmail
virtual_mailbox_domains = mysql:/etc/postfix/mysql/domains_maps.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql/mailbox_maps.cf
virtual_minimum_uid = 900
virtual_transport = virtual
virtual_uid_maps = static:901
Key things to watch out for is that we are using the file type: "mysql" and that the file locations specified above will be correct to what we are creating below.
Before we create our text *.cf files, we'll need to make the directory.
# mkdir -p /etc/postfix/mysql
Create the current mysql instruction/configuration files for postfix.
virtual_mailbox_domains = mysql:/etc/postfix/mysql/domains_maps.cf
domains_maps.cf will be used for virtual_mailbox_domains
File:/etc/postfix/mysql/domains_maps.cf
user = postfixserver
password = postfixserver
hosts = <IP_ADDRESS>
dbname = mail
table = domain
select_field = domain
where_field = domain
additional_conditions = and backupmx = '0' and active = '1'
virtual_mailbox_maps = mysql:/etc/postfix/mysql/mailbox_maps.cf
mailbox_maps.cf will be used for virtual_mailbox_maps
File:/etc/postfix/mysql/mailbox_maps.cf
user = postfixserver
password = postfixserver
hosts = <IP_ADDRESS>
dbname = mail
table = mailbox
select_field = maildir
where_field = username
additional_conditions = and active = '1'
virtual_alias_maps = mysql:/etc/postfix/mysql/alias_maps.cf
alias_maps.cf will be used for virtual_alias_maps
File: /etc/postfix/mysql/alias_maps.cf
user = postfixserver
password = postfixserver
hosts = <IP_ADDRESS>
dbname = mail
table = alias
select_field = goto
where_field = address
Once you've created all these mysql files, we can stop and restart postfix and should be working together with postfixadmin for managing virtual user accounts.
# /usr/local/sbin/postfix stop
# /usr/local/sbin/postfix start
We can now provide some sample testing of mail routing through to our virtual accounts, using MySQL as the database.
Screen Session
$ telnet localhost smtp
Trying ::1...
Connected to localhost.
Escape character is '^]'.
220 myhost.example.org ESMTP Postfix (2.3.2)
ehlo example.org
250-myhost.example.org
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
mail from<EMAIL_ADDRESS>250 2.1.0 Ok
rcpt to<EMAIL_ADDRESS>250 2.1.5 Ok
rcpt to<EMAIL_ADDRESS>250 2.1.5 Ok
rcpt to<EMAIL_ADDRESS>250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
Subject: Welcome MySQL based virtual users
Hopefully you've received this email message without fault ?
.
250 2.0.0 Ok: queued as 357E65A950
quit
221 2.0.0 Bye
Connection closed by foreign host.
With the following results showing in our log file: /var/log/maillog
File: /var/log/maillog
connect from unknown[::1]
: client=unknown[::1]
<EMAIL_ADDRESS><EMAIL_ADDRESS>size=402, nrcpt=3 (queue active)
: disconnect from unknown[::1]
<EMAIL_ADDRESS>relay=virtual, delay=54, delays=52/0.01/0/1.6,
dsn=2.0.0, status=sent (delivered to maildir)
<EMAIL_ADDRESS>relay=virtual, delay=54, delays=52/0.03/0/1.7, dsn=2.0.0,
status=sent (delivered to maildir)
<EMAIL_ADDRESS>relay=virtual, delay=54, delays=52/0.04/0/1.8,
dsn=2.0.0, status=sent (delivered to maildir)
: removed
We should now have email in the user directories<EMAIL_ADDRESS>as well as<EMAIL_ADDRESS>and<EMAIL_ADDRESS>with the same content as below:
File<EMAIL_ADDRESS>59984.myhost.example.org <
Return-Path<EMAIL_ADDRESS>X-Original-To<EMAIL_ADDRESS>Delivered-To<EMAIL_ADDRESS>Received: from example.org (unknown [IPv6:::1])
by myhost.example.org (Postfix) with ESMTP id 45BCC5A956;
Fri, 9 Feb 2007 14:02:08 +1300 (TOT)
Subject: Welcome MySQL based virtual users
Message-Id<EMAIL_ADDRESS>Date: Fri, 9 Feb 2007 14:02:08 +1300 (TOT)
From<EMAIL_ADDRESS>To: undisclosed-recipients:;
Hopefully you've received this email message without
fault ?

Remember that postconf returns what Postfix actually understands from your changes to the ./postfix/main.cf file so it is always a good point to start here to ensure that what you thought you typed in, is actually what postfix is reading.
The next logical step in configuring your email server with Postfix, is to set up an imap/pop3 server. For this exercise, we've reviewed instructions to use dovecot.
Below are just collections from other people's notes, since I haven't got a 'high load' server for testing as yet (otherwise known as machines and ram are dealing well currently.)
You can improve performance in high load environments by sharing database/mysql connections among Postfix smtpd connections.
virtual_alias_maps = proxy:mysql:/etc/postfix/mysql/alias_maps.cf virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql/domains_maps.cf virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql/mailbox_maps.cf
There is a plethora of documentation out there using Postfix with Virtual Accounts, likewise there is also quite a few with OpenBSD as the server operating system.
Postfix Documentation
http://www.postfix.org/documentation.html,
http://www.postfix.org/docs.html
Postfix - Hosting Multiple Domains with Virtual Accounts -
http://www.akadia.com/services/postfix_separate_mailboxes.html
OpenBSD Postfix Admin Guide -
http://postfix.wiki.xs4all.nl/index.php?title=OpenBSD_PostfixAdmin_Guide
Virtual Users and Domains with Courier IMAP and MySQL -
http://postfix.wiki.xs4all.nl/index.php?title=Virtual_Users_and_Domains_with_Courier-IMAP_and_MySQL
SASL README
http://www.postfix.org/SASL_README.html
Server with virtual multi-domain support How-To setup a server to use Apache2,
Postfix, Pure-FTPd, Dovecot, Roundcube and all of them controlled easy over web
by CCC http://postfix.pentachron.net/
The Book of Postfix - Chapter 25 Troubleshooting Tips.
http://www.postfix-book.com/debugging.html
ISP-style Email Service with Debian-Sarge and Postfix 2.1
http://workaround.org/articles/ispmail-sarge/
Virtual Users and Domains with Postfix, Courier and MySQL (+SMTP_AUTH, Quota,
SpamAssassin, ClamAV)
http://www.howtoforge.com/virtual_postfix_mysql_quota_courier
Copyright (c) 2006 Samiuela LV Taufa. All Rights Reserved.
I reserve the right to be totally incorrect even at the best advice of betters.
You are permitted and encouraged to use this guide for fun or for profit as you see fit. If you republish this work in what-ever form, it would be nice (though not enforceable) to be credited.
|
Serving Up Virtual User Account Mail - OpenBSD |
Copyright © 2000/1/2 NoMoa.COM All rights reserved.


Suppose we want to transform one string into another. How might we describe the distance between the two words mathematically? The most common form of distance metric for strings is the Levenshtein distance between the first characters of and the first characters of , given by
where is the indicator function equal to when and equal to otherwise. The Levenshtein distance corresponds to three possible operations on a string to transform it into another:
We can compute the Levenshtein distance as follows
def levenshtein(s1,s2):
if len(s1) > len(s2):
s1, s2 = s2, s1
distances = range(len(s1) + 1)
for index2, char2 in enumerate(s2):
newDistances = [index2+1]
for index1, char1 in enumerate(s1):
if char1 == char2:
newDistances.append(distances[index1])
else:
newDistances.append(1 + min((distances[index1],
distances[index1+1],
newDistances[-1])))
distances = newDistances
return distances[-1]
and use it like so
In [2]: levenshtein('philosophy', 'mathematics')
Out[2]: 11
In [3]: %timeit levenshtein('philosophy', 'mathematics')
27 µs ± 725 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
Note that this does not require that the intermediate words in the transformation be valid, this merely calculates the length of the shortest path between two words under the insertion, deletion, and substitution operations.
The Levenshtein distance forms a metric space . A metric space is a set and a distance operator , i.e. a function . If a set and a distance operator satisfy the following criteria for all then the set and the metric form a metric space.
In terms of the Levenshtein distance between two strings, the last item means that the path from to cannot be longer than a path that goes through a point in between and . ( )
There are other string metrics but the Levenshtein distance is the canonical one.
Another technique is to convert each word to a vector in a continuous vector space, and then take the distance between the vectors. This requires a fairly large data set to convert the words to vectors in ways that preserve their meanings. However, this technique doesn't calculate the edit distance between the words, but rather their semantic distance.


Description: Insert content, specified by the parameter, after each element in the set of matched elements.
content: String, Element, jQuery HTML string, DOM element, or jQuery object to insert after each element in the set of matched elements.
content: String, Element, Array, jQuery One or more additional DOM elements, arrays of elements, HTML strings, or jQuery objects to insert after each element in the set of matched elements.
function(index): Function()
A function that returns an HTML string, DOM element(s), or jQuery object to insert after each element in the set of matched elements. Receives the index position of the element in the set as an argument. Within the function, this
refers to the current element in the set.
The .after()
and .insertAfter()
methods perform the same task. The major difference is in the syntax—specifically, in the placement of the content and target. With .after()
, the selector expression preceding the method is the container after which the content is inserted. With .insertAfter()
, on the other hand, the content precedes the method, either as a selector expression or as markup created on the fly, and it is inserted after the target container.
Using the following HTML:

Greetings

Hello

Goodbye

Content can be created and then inserted after several elements at once:
$('.inner').after('
Test
');
Each inner

element gets this new content:

Greetings

Hello

Test

Goodbye

Test

An element in the DOM can also be selected and inserted after another element:
$('.container').after($('h2'));
If an element selected this way is inserted elsewhere, it will be moved rather than cloned:

Hello

Goodbye

Greetings

If there is more than one target element, however, cloned copies of the inserted element will be created for each target after the first.
As of jQuery 1.4, .before()
and .after()
will also work on disconnected DOM nodes. For example, given the following code:
$('
').after('

');
The result is a jQuery set containing a div and a paragraph, in that order. That set can be further manipulated, even before it is inserted in the document.
$('
').after('

').addClass('foo')
.filter('p').attr('id', 'bar').html('hello')
.end()
.appendTo('body');
This results in the following elements inserted just before the closing
tag:

hello

As of jQuery 1.4, .after()
supports passing a function that returns the elements to insert.
$('p').after(function() {
return '
' + this.className + '
';
});
This example inserts a

after each paragraph, with each new

containing the class name(s) of its preceding paragraph.
Similar to other content-adding methods such as .prepend()
and .before()
, .after()
also supports passing in multiple arguments as input. Supported input includes DOM elements, jQuery objects, HTML strings, and arrays of DOM elements.
For example, the following will insert two new

s and an existing

after the first paragraph:
var $newdiv1 = $('
'),
newdiv2 = document.createElement('div'),
existingdiv1 = document.getElementById('foo');
$('p').first().after($newdiv1, [newdiv2, existingdiv1]);
Since .after()
can accept any number of additional arguments, the same result can be achieved by passing in the three

s as three separate arguments, like so: $('p').first().after($newdiv1, newdiv2, existingdiv1)
. The type and number of arguments will largely depend on the elements that are collected in the code.
<!DOCTYPE html>

I would like to say:

<!DOCTYPE html>

I would like to say:

<!DOCTYPE html>

Hello
I would like to say:


ExPcap (expcap v0.1.2) View Source
This module represents a pcap file that has been parsed.
Link to this section Summary
Functions
Reads a file, parses the pcap contents and returns a list of the parsed packets.
Parses the content of the packet according to the parser for this packet type. Then it recurses until the packet has been parsed completely. It may return something like an ethernet packet that contains an IPv4 packet that contains a UDP packet that contains a DNS packet.
Parses the content of the packet according to the parser for this packet type. Then it recurses until the packet has been parsed completely. It may return something like an ethernet packet that contains an IPv4 packet that contains a UDP packet that contains a DNS packet.
Reads a packet from the file and returns it or returns end of file if there is no data left to be read.
Reads a packet from a file. This packet is then parsed and the result is returned.
Reads all the packets from a file, parses them and returns a list of the parsed packets.
Reads a pcap file and returns the parsed results.
Link to this section Types
Specs
t() :: %ExPcap{ global_header: ExPcap.GlobalHeader.t(), packets: [ExPcap.Packet.t()] }
Link to this section Functions
Specs
Reads a file, parses the pcap contents and returns a list of the parsed packets.
Specs
parse_packet(ExPcap.PacketData.t(), ExPcap.GlobalHeader.t()) :: [ ExPcap.Packet.t() ]
Parses the content of the packet according to the parser for this packet type. Then it recurses until the packet has been parsed completely. It may return something like an ethernet packet that contains an IPv4 packet that contains a UDP packet that contains a DNS packet.
Specs
parse_packet(nil, binary(), [ExPcap.Packet.t()]) :: [ExPcap.Packet.t()]
parse_packet(ExPcap.Parser.t(), binary(), [ExPcap.Packet.t()]) :: [ ExPcap.Packet.t() ]
Parses the content of the packet according to the parser for this packet type. Then it recurses until the packet has been parsed completely. It may return something like an ethernet packet that contains an IPv4 packet that contains a UDP packet that contains a DNS packet.
Specs
read_packet(String.t(), ExPcap.GlobalHeader.t()) :: :eof | ExPcap.Packet.t()
Reads a packet from the file and returns it or returns end of file if there is no data left to be read.
Specs
read_packet(String.t(), ExPcap.GlobalHeader.t(), ExPcap.PacketHeader.t()) :: ExPcap.Packet.t()
Reads a packet from a file. This packet is then parsed and the result is returned.
Specs
read_packets(String.t(), ExPcap.GlobalHeader.t(), list()) :: [ExPcap.Packet.t()]
Reads all the packets from a file, parses them and returns a list of the parsed packets.
Specs
Reads a pcap file and returns the parsed results.


Class BO.io.LED
Creates an interface to an LED. This object provides helpful
methods for blinking and fading LEDs. To use the fading methods, the
LED must be connected to a PWM pin on the I/O board.
Defined in: LED.js.
| Constructor Attributes | Constructor Name and Description |
|---|---|
|
BO.io.LED(board, ledPin, driveMode)
PLEASE NOTE: To use the fade methods, or to use an waveform other than Oscillator.SQUARE the LED must be connected to a PWM pin. |
| Field Attributes | Field Name and Description |
|---|---|
|
Get or set the current value (intensity) of the LED.
|
| Method Attributes | Method Name and Description |
|---|---|
|
blink(interval, times, wave)
|
|
|
fadeIn(time)
The LED must be connected to a PWM pin to use this method.
|
|
|
fadeOut(time)
The LED must be connected to a PWM pin to use this method.
|
|
|
fadeTo(to, time)
The LED must be connected to a PWM pin to use this method.
|
|
|
isOn()
Check if the LED is on.
|
|
|
off()
Turn the LED off.
|
|
|
on()
Turn the LED on.
|
|
|
Stop the LED blink cycle.
|
|
|
toggle()
Toggle the LED on or off
|
Class Detail
BO.io.LED(board, ledPin, driveMode)
PLEASE NOTE: To use the fade methods, or to use an waveform other than Oscillator.SQUARE the LED must be connected to a PWM pin.
SOURCE_DRIVE vs SYNC_DRIVE. If the Anode (longer LED pin) is connected to the microcontroller pin, then it is SOURCE_DRIVE. If the Cathode is connected to the microcontroller pin, then it is SYNC_DRIVE.
- Parameters:
- {IOBoard} board
- A reference to the IOBoard the LED is attached to.
- {Pin} ledPin
- A reference to the Pin the LED is connected to.
- {Number} driveMode
- The drive mode of the LED. Must be set to LED.SOURCE_MODE or LED.SYNC_MODE. SOURCE_MODE is default.
Field Detail
{Number}
intensity
Get or set the current value (intensity) of the LED.
Method Detail
blink(interval, times, wave)
- Parameters:
- {Number} interval
- The time interval to blink the LED.
- {Number} times
- The number of times the LED should blink. A value of 0 will blink forever.
- {Function} wave
- The waveform to apply (default is Oscillator.SQUARE)
- See:
- BO.generator.Oscillator
fadeIn(time)
The LED must be connected to a PWM pin to use this method.
- Parameters:
- {Number} time
- The fade-in time (in milliseconds).
fadeOut(time)
The LED must be connected to a PWM pin to use this method.
- Parameters:
- {Number} time
- The fade-out time (in milliseconds).
fadeTo(to, time)
The LED must be connected to a PWM pin to use this method.
- Parameters:
- {Number} to
- The new intensity value to fade to.
- {Number} time
- The fade time (in milliseconds).
{Boolean}
isOn()
Check if the LED is on.


| Release date | 2016 March |
| OS | Andriod OS,v6.0 (Marshmallow) |
| Weight | 113 g (3.99 oz) |
| Chip Set | Qualcomm MSM8996 Snapdragon 820 |
| CPU | Dual-core 2.15 GHz Kryo Dual-core 1.6 GHz Kryo |
| Storage | 32/64GB storage, microSD card slot |
| Screen size | 5.5"1440x2560 pixels (~534 ppi pixel density) |
| Camera | 12 MP, f/1.7, 26mm 5 MP, f/1.7, 22mm |
| Ram | 4GB |
| Battery | 4100mAh Li-Ion
Stand-by -> Up to 240 h (2G) / Up to 240 h (3G) Talk time -> Up to 14 h (3G) Music play -> Up to 50 h |


The API Superstore provides a catalog of third party APIs that you can use to enhance your business. From ecommerce to maps, API Superstore lists all of the services that customers expect and saves you the headache of sorting it out yourself! The longer you wait, the longer you’re not making more money and happier users!
“This is the best website ever!”  For a low monthly fee, I’m able to more easily keep up with the churn of information that makes application development so difficult, and API Superstore makes my world so much happier! Please don’t stop the rocking!” Amy Zon, Massive Anonymous Customer
“Once again, I’m blown away by the amazing offerings of the API Superstore. You really are SUPER!” Clara Cache
Contact Us Here!
Phone:<PHONE_NUMBER>
Email<EMAIL_ADDRESS>Location: Seattle, Washington, USA
Social Media Links Here


xxReloading the Openbravo ERP application. This can take up to 1 minute.
Do not close your browser. You will be taken to the login window afterwards.


You can access the following constituencies and any wards within these constituencies
You can access the following constituencies and any wards within these constituencies
| # | Code | Name |
|---|---|---|
| {{$index + 1}} | {{c.code}} | {{c.name}} |
You can access the following wards in addition to any wards associated by the above constituencies
| # | Code | Name |
|---|---|---|
| {{$index + 1}} | {{w.code}} | {{w.name}} |


--- layout: post title: 'Opera Extension : LinkMoi reaches 102 downloads. Sweet, eh?' date: 2012-08-28 00:26:27.000000000 +05:30 type: post published: true status: publish categories: [] tags: - Developer - Experience - Extensions - LinkMoi - Opera meta: _wpas_done_facebook: '1' author: Eklavya Mirani ---
In two of my previous articles I described my experience developing my first Opera Extension LinkMoi, and I am now proud to say, LinkMoi has reached its first landmark, 100+downloads.
I do admit there were a few bugs in the initial result, but it was all Javascript's fault, I swear I had nothing to do with it. ;)
The first released version, broke the javascript on a few pages such as http://play.google.com (You know you need my extension if you are too lazy to copy paste this link ;) ).
So after trying to fix the bug after 6 hours of hit and trial debugging, I finally released a stable version which has been accepted by Opera and is now listed on http://addons.opera.com.
You can download my extension here:
https://addons.opera.com/en-gb/extensions/details/linkmoi/?display=en
This is just a stable initial release, and there is a lot more to come, such as support for other protocols, link preferences, link preview, etc.
So hold your breath (not literally ofc), because the next version will be a major upgrade.


Hello username
Home
Sign Out
Exit
File Sharing System
Encrypt a File
Encrypt!
Decrypt a File
Decrypt!


Hello! Welcome to the website for Rob Whitehead.
Rob writes words and also code. He lives in Seattle.
If you want to hire Rob or contact him for other reasons, please contact him via the contact page.
Frequently Asked Question: Why is this site the way it is?
A: Rob's taste in website design tends toward the barebones. To browse the deluxe version of the site, please click on this checkbox.


Project Template
This project template helps you to easily create a dedicated website for projects in the OntoUML organization.
How to Start
How about turning your markdown files into beautiful webpages to better document and advertise your project. Just follow these steps and you’ll be ready in no time.
First Step - Create a New Repository
Start by creating a new repository based on this template by clicking on Use this template
at the top of the repository’s page. This creating a new repository keeping all files and folder contained in this one.
These folders and files have the following roles:
.
├── _layouts # folder containing the custom layout used in the OntoUML organization
├── .github # folder containing the necessary actions to build your website
├── assets # folder containing assets for the the website's style
├── docs # folder containing the generated website
├── _config.yml # file containing all Jekyll configurations
├── 404.md # file used to generate "Not Found" pages
├── Gemfile # Ruby configuration file used for Jekyll
├── Gemfile.lock # Ruby configuration file used for Jekyll
If you are not familiar with Jekyll there is not need to modify any of these files, but once they are part of repository you are free to use them to best fit your needs.
Second Step - Setting Up The Repository
Go to your repository settings under Settings > Pages
and change the Source
branch to main
and the folder next to it to /docs
.
Third/Final Step - Write That Markdown!
Jekyll now will generate webpages based on every markdown file in your project. By default, the README.md
in your project’s root become the “homepage” of your project and it’ll be made available in the following URL: https://ontouml.github.io/YOUR-PROJECTS-NAME/.
Every other page’s URL will be a combination of this base URL, the markdown file’s name, and the name of the folders it is within.
about.md > https://ontouml.github.io/YOUR-PROJECTS-NAME/about
instructions.md > https://ontouml.github.io/YOUR-PROJECTS-NAME/instructions
tests/README.md > https://ontouml.github.io/YOUR-PROJECTS-NAME/tests/
tests/test-setup.md > https://ontouml.github.io/YOUR-PROJECTS-NAME/tests/test-setup
Now everything is ready. Your project’s website will be updated shortly after you push your commits to the main
branch. Enjoy!
Hints and Tricks
Updating Configurations
Even though unnecessary, you may want to update a couple of variables in Jekyll’s configurations. If you want to learn more about them, have a look at Jekyll’s instructions.
title: <Your Project's Title>
description: <Your Project's Description>
exclude:
- "<folder or file that you don't want to be part of your website>"
Testing Locally
If you have Ruby installed in your machine, you can check your project’s website before it goes live. Just go to the project’s folder in your terminal and run the following command:
bundler install # run only the first time
bundler exec jekyll serve -o # the '-o' flag asks Jekyll to automatically open the website in your default browser
Using HTML
Jekyll will build your site using not only markdown files in your repository, but HTML files as well. More interesting even, you can add snippets of HTML to your markdown files to boost them. For example, how about adding a video with auto-resizing?
<div>
<iframe style="width: 100%; height: 400px;"
src="https://www.youtube.com/embed/rKFOEt8ogLw"
title="YouTube video player"
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
allowfullscreen/>
</div>


SPECIAL COMBO PACK
Burger Pizz
Fries & Drinks
There is something profoundly satisfying about sharing a meal. Eating together,breaking bread together is one of the oldest and mostfundamentally unifying of human experiences
When I was a small boy,my father told me never to recommend a church or a woman to anyone. And i have found it wise never to recommend a restaurant either. Something always goes wrong with the cheese scuffle
There is something profoundly satisfying about sharing a meal.
There is something profoundly satisfying about sharing a meal.
There is something profoundly satisfying about sharing a meal.
There is something profoundly satisfying about sharing a meal.
There is something profoundly satisfying about sharing a meal.
There is something profoundly satisfying about sharing a meal.
There is something profoundly satisfying about sharing a meal. Eating together,breaking bread together is one of the oldest and mostfundamentally unifying of human experiences


R interface to 'MLflow', open source platform for the complete machine learning life cycle, see <https://mlflow.org/>. This package supports installing 'MLflow', tracking experiments, creating and running projects, and saving and serving models.
| Version: | 0.8.0 |
| Depends: | R (≥ 3.1.2) |
| Imports: | aws.s3, forge, fs, git2r, httpuv, httr, jsonlite, openssl, processx, reticulate, packrat, purrr, swagger, withr, xml2, yaml, pryr, rlang (≥ 0.2.0) |
| Suggests: | covr, keras, lintr, testthat |
| Published: | 2018-11-12 |
| Author: | Matei Zaharia [aut, cre], Javier Luraschi [aut], Kevin Kuo [aut], RStudio [cph] |
| Maintainer: | Matei Zaharia <matei at databricks.com> |
| BugReports: | https://github.com/mlflow/mlflow/issues |
| License: | Apache License 2.0 |
| URL: | https://github.com/mlflow/mlflow |
| NeedsCompilation: | no |
| SystemRequirements: | MLflow (https://www.mlflow.org/) |
| Materials: | README |
| CRAN checks: | mlflow results |
| Reference manual: | mlflow.pdf |
| Package source: | mlflow_0.8.0.tar.gz |
| Windows binaries: | r-devel: mlflow_0.8.0.zip, r-release: mlflow_0.8.0.zip, r-oldrel: mlflow_0.8.0.zip |
| OS X binaries: | r-release: mlflow_0.8.0.tgz, r-oldrel: mlflow_0.8.0.tgz |
| Old sources: | mlflow archive |
Please use the canonical form https://CRAN.R-project.org/package=mlflow to link to this page.


This book is authored by Mayur Ramgir
target _blank will open this link in a new tab
target _self will open this link in the same tab


A little bit about myself:
Hello! My name is Brandon Fenty, I am a Seattle Native, Marine Corps Veteran,
and web developer. I like to live life to the fullest & that shows through
in every aspect of what I do. During the week, I'm a dedicated coding professional
who strives to create amazing websites and user experiences. During the weekends,
I'm out in the mountains pushing the limits of where my body will carry me.
My Bucket List:
- 1. Climb at least 3 8,000 meter peaks in the Himalaya
- 2. Visit every continent
- 3. Road trip to every state in the US
- 4. Complete the "seven summits"
- 5. Free climb the route Freerider on Yosemite's El Cap
- 6. Sky dive
- 7. Visit Mars (looking more and more likely every year!)
- 8. Learn to speak Japanese
- 9. Ski down Mt. Denali in Alaska
- 10. Take my dad golfing in Scotland
Guessing Game!
- Question 1: Do you think I have any siblings?
- Question 2: Do you think I grew up in Washington?
- Question 3: Do you think I like snowboarding?
- Question 4: Do you think I have any tattoos?
- Question 5: Do you think I like country music?


PDX Pizza
Build your pizza
Step 1: Select your pizza size.
Small
Medium
Large
Extra Large
Step 2: Select your toppings.
Cheese
Pepperoni
Bacon
Green Peppers
Mushrooms
Step 3: Choose how many pizzas you want with these selections.
1
2
3
4
5
6
Add to cart
Order Details


Look: Saweetie Flexes Pure Queen Vibes In Steamy Make-Up Room Pics – “Dangerously In LV”
by Team SOHHWest Coast rapper Saweetie is out here slaying. The hip-hop entertainer has shared a slideshow of pics flexing pure beauty to the masses. Look and comment below!


{% extends "base.mail.html" %} {% load i18n %} {% block content %}
{% blocktrans with donor_name=donation.user.first_name first_name=receiver.first_name slug=donation.project.slug%} Hello {{ first_name }}, you received a donation from {{ donor_name }}. Quickly thank your supporter by posting a personal message on your fundraiser page. {% endblocktrans %}


public interface IItemValidator
Validation requests will return an IStatus
. When the status is not
ok, it (or its children if its an MultiStatus
) can be casted to
IPropertyConstraintErrorStatus
, which also contains status codes and
other values that can be tested to determine why an item property is not
valid.
IPropertyConstraintErrorStatus
,
IStringSizeConstraintErrorStatus
| Modifier and Type | Field and Description |
|---|---|
static IItemValidator |
INSTANCE
The single instance to be used by clients
|
| Modifier and Type | Method and Description |
|---|---|
org.eclipse.core.runtime.IStatus |
validateAttribute(IType type,
java.lang.String propertyName,
java.lang.Object value)
Validates the given property to determine if it conforms to the modeled
and db storage constraints.
|
org.eclipse.core.runtime.IStatus |
validateConstraints(IItem item)
Validates an item and all its helpers to determine if all property
settings conform to the modeled and db storage constraints.
|
static final IItemValidator INSTANCE
org.eclipse.core.runtime.IStatus validateAttribute(IType type, java.lang.String propertyName, java.lang.Object value)
type
- the IItemType
or IHelperType
that owns the
property; must not be nullpropertyName
- the property; must not be null
; must be an
attribute propertyvalue
- the property value that should be validatedStatus.OK_STATUS
if the value is valid
for the specified property; otherwise will be an instance of
IPropertyConstraintErrorStatus
- base class for all validation
errors
,
- error status used if the UTF-8
encoded size of a string property is too large for the field.
org.eclipse.core.runtime.IStatus validateConstraints(IItem item)
item
- the item to be validated; must not be nullStatus.OK_STATUS
; otherwise will be
a MultiStatus
wherein all children are instances of
IPropertyConstraintErrorStatus
- base interface for all validation
errors
,
- error status used if the UTF-8
encoded size of a string property is too large for the field.


Toggle navigation
COMPANY
Personal Info Management
Dashboard
Actions
Create New Job
Compare Candidates
Process Request
Settings
Reload
Init DB
Delete DB
New Job Post
Select Position
Add New Position
×
Add New Position
Enter Position:
Company Description
Responsibilities
Requirements
Preferred Requirements
Department
Add New Department
×
Add New Department
Enter Department Name:
Employment
Full-time
Part-time
Application Deadline
Create


Oven alarm glove!
For the final project, we need to combine 4 processes we learned this year and design something of our own! I made an oven alarm glove. This glove will warn people when the oven is too hot so that they won't hurt themselves because of extreme heat!! The target market is in China because traditional Chinese cuisine does not require an oven. Ovens are relatively new and people are getting used to it.
Arduino
The most challenging part of this project is the arduino part. It took a lot of time to wire and hardware and code the software. The temp sensor initially was broken and I thought I was a problem with wiring. Electronics took a long time because it was hard to figure out which part went wrong. I planned to use a buzzer as the warning mechanism, but it's hard to demo in class using a buzzer because there's no oven down here. As a prototype, I decided to use a lcd screen to display the temperature instead. This part took 8 hours. I used 2 afternoons, one Sunday, and one class period.
Sewing
We don't have gloves in the Wang Innovation Center, so I cut a hat and sewed it into a glove! Engineers love problem-solving! The sewing part is realtively easy. The glove (made from a hat) fits my hand perfectly! This part took half an hour.
Embroidery
I embroidered "careful!" on the glove. For the embroidery machine, I used the standard font. This part took around 10 minutes.
3D printing
I 3d printed a case that perfectly fits the arduino board and the battery. I used Autodesk fusion, Makerbot to design the case. For the 3D ptiner, I did not add suppot because it wasn't necessary. The 3D printing part took 20 minutes. I extended the wire that connects the temperature sensor and the board. People can install the case on the oven and reach into the oven with the temperature-sensing glove!
Click to download arduino file Click to download to stl file bof the box


Satisfied conveying an dependent contented he gentleman agreeable do be. Warrant private blushes removed an in equally totally if. Delivered dejection necessary objection do mr prevailed. Mr feeling do chiefly cordial in do. Water timed folly right aware if oh truth. Imprudence attachment him his for sympathize. Large above be to means. Dashwood do provided stronger is. But discretion frequently sir the she instrument unaffected admiration everything.
coding dojo link| column 1 | column 2 | column 3 | column 4 |
|---|---|---|---|
| table data 1 | table data 2 | table data 3 | table data 4 |
| table data 1 | table data 2 | table data 3 | table data 4 |
| table data 1 | table data 2 | table data 3 | table data 4 |


Project DTC
Home
News and Events
New!
Projects
Videos
New!
My Buds
About Me
Project DTC Updates
Update
Author
Date Completed
#3
Project DTC 2.0 design is up
Caamflyer64
8/25/13
#2
Small graphical glitches and bug fixes
Caamflyer64
7/4/13
#1
First Launch of Project DTC Website
Caamflyer64 / DTC
6/10/13


Preparation time
less than 30 mins
Cooking time
over 2 hours
Serves
Serves 4
Dietary
These decadent, creamy éclairs mix rich toffee with aromatic coffee for an elegant sugar hit.
Equipment and preparation: for this recipe you will need a piping bag fitted with a 1cm/½in plain nozzle.
Preheat the oven to 220C/200C Fan/Gas 7 and line a large baking tray with baking parchment.
For the choux pastry, bring 110ml/4fl oz water to the boil in a saucepan with the butter.
Add the flour all at once and, using a wooden spoon, immediately beat it into the water until smooth. Remove the pan from the heat and continue to beat the mixture until it has cooled slightly.
Add the eggs one at a time, beating each one into the mixture, until the eggs are fully incorporated and the mixture is glossy. Set aside to cool slightly.
Spoon the choux pastry into a piping bag. Pipe balls or short lines of the choux pastry onto the prepared baking tray, leaving a generous gap between each.
Bake the choux buns in the oven for 10-15 minutes until risen, then reduce the oven temperature to 180C/160C Fan/Gas 4 and bake for a further 30-35 minutes, or until golden-brown (keep checking towards the end of the cooking time. If your oven has hot spots you may need to move the buns around to ensure they all cook evenly). Prop the oven door open a little (wedge the handle of a wooden spoon into it) and turn off the heat. Leave the choux buns in the oven to ‘dry’ out.
For the filling, bring the milk just to the boil in a saucepan.
In a bowl, whisk together the egg yolks, caster sugar and coffee granules until pale and fluffy. Add the flour to the egg mixture and whisk again until well combined.
Pour the warm milk over the egg mixture and whisk well to combine, then return the filling mixture to the saucepan and simmer over a medium heat for 5-8 minutes, or until the mixture has thickened.
Strain the filling mixture through a fine sieve into a clean bowl. Cover the bowl with cling film and set aside to cool, then chill the mixture in the fridge until completely cold.
Whisk the caramel condensed milk into the cold filling mixture until well combined. Chill in the fridge until needed.
For the coffee whipped cream, whisk together the double cream, icing sugar and coffee liqueur until stiff peaks form when the whisk is removed. Spoon the mixture into a piping bag and chill in the fridge until needed.
For the glaze, melt the sugar, milk, butter and flour together in a saucepan, stir well, then bring the mixture to the boil. Remove from the heat and set aside for 5 minutes to cool, then stir well; it should have the consistency of honey.
Spread a little of the glaze on the top of each choux bun, then sprinkle some of the chopped coffee beans over each. Leave to set.
For the sugared pecans, heat the sugar in a frying pan over a low to medium heat until it melts and turns light golden-brown (do not stir the sugar at all). Add the pecans and stir to completely coat them in the syrup.
Scrape the sugared pecans onto a baking tray lined with baking paper, then set aside to cool and harden. Once hardened, roughly chop the sugared nuts.
To assemble the choux buns, cut the choux buns in half horizontally and spread some of the caramel filling mixture and then the coffee whipped cream over the bases. Sprinkle over a few of the sugared pecans, then top with the glazed part of the choux buns. Serve immediately.


Name is required.
Last Name is required.
Email is required.
Needs to be a valid email
Phone is required.
Phone is to short!
Phone is to long!
Password is required.
Token is required.
{{admin.first}} {{admin.last}} access is revoked


BILLING QUESTIONS?<PHONE_NUMBER>
My Carriers
Settings
Sign Out
Toggle navigation
Carrier Company "A" Name
Dashboard
Load Management
Invoicing
My Company
Back To Portal User List
Portal User
First Name
Last Name
Contact Information
Email Address
This email address is currently in use
Phone Number
Remove User
Save Changes
Batmobile Usage
Invited May 18 2016
Resend Invite
Change Password
Current Password
New Password
Confirm New Password
Set


"DINAH "judged; vindicated, daughter of Jacob by Leah, and sister of Simeon and Levi (Genesis 30:21). She was seduced by Shechem, the son of Hamor, the Hivite chief, when Jacob’s camp was in the neighbourhood of Shechem. This led to the terrible revenge of Simeon and Levi in putting the Shechemites to death (Genesis 34). Jacob makes frequent reference to this deed of blood with abhorrence and regret (Genesis 34:30; 49:5-7). She is mentioned among the rest of Jacob’s family that went down into Egypt(Genesis 46:8, 15).
"DINAH "judged; vindicated, daughter of Jacob by Leah, and sister of Simeon and Levi (Genesis 30:21). She was seduced by Shechem, the son of Hamor, the Hivite chief, when Jacob’s camp was in the neighbourhood of Shechem. This led to the terrible revenge of Simeon and Levi in putting the Shechemites to death (Genesis 34). Jacob makes frequent reference to this deed of blood with abhorrence and regret (Genesis 34:30; 49:5-7). She is mentioned among the rest of Jacob’s family that went down into Egypt(Genesis 46:8, 15).


|
ensembl-hive
2.4
|
eHive is a system for running computation pipelines on distributed computing resources - clusters, farms or grids.
The name comes from the way pipelines are processed by a swarm of autonomous agents.
In the centre of each running pipeline is a database that acts as a blackboard with individual tasks to be run. These tasks (we call them Jobs) are claimed and processed by "Worker bees" or just Workers - autonomous processes that are continuously running on the compute farm and connect to the pipeline database to report about the progress of Jobs or claim some more. When a Worker discovers that its predefined time is up or that there are no more Jobs to do, it claims no more Jobs and exits the compute farm freeing the resources.
A separate Beekeeper process makes sure there are always enough Workers on the farm. It regularly checks the states of both the blackboard and the farm and submits more Workers when needed. There is no direct communication between Beekeeper and Workers, which makes the system rather fault-tolerant, as crashing of any of the agents for whatever reason doesn't stop the rest of the system from running.
Jobs that share same code, common parameters and resource requirements are typically grouped into Analyses, and generally an Analysis can be viewed as a "base class" for the Jobs that belong to it. However in some sense an Analysis also acts as a "container" for them.
eHive pipeline databases are molded according to PipeConfig files which are Perl modules conforming to a special interface. A PipeConfig file defines the stucture of the pipeline, which is a graph whose nodes are Analyses (with their code, parameters and resource requirements) and edges are various dependency rules:
There are also other parameters of Analyses that control, for example:
eHive has a generic interface named Meadow that describes how to interact with an underlying grid scheduler (submit jobs, query job's status, etc). eHive ships two meadow implementations:
system()
(i.e. fork()
). It is inherently limited by the specification of the machine beekeeper is running on.Both are extensively used by the Ensembl project and are regularly updated. The LSF meadow supports workloads reaching thousands of parallel jobs.
External users have contributed other meadows:
The table below lists the capabilities of each meadow, and whether they are available and implemented:
| Capability | LOCAL | LSF | SGE |
|---|---|---|---|
| Submit jobs | Yes | Yes | Yes |
| Query job status | Yes | Yes | Yes |
| Kill job | Yes | Yes | Yes |
| Job limiter and resource management | Not available | Yes | Yes |
| Post-mortem inspection of resource usage | Not available | Yes | Not implemented |
The main entry point is in docs/index.html and can also be browsed offline.
There is preliminary support for Python3, see the Doxygen documentation and an example PipeConfig file.
eHive was originally conceived and used within EnsEMBL Compara group for running Comparative Genomics pipelines, but since then it has been separated into a separate software tool and is used in many projects both in Genome Campus, Cambridge and outside. There is eHive users' mailing list for questions, suggestions, discussions and announcements.
To subscribe to it please visit (http://listserver.ebi.ac.uk/mailman/listinfo/ehive-users)


While we are closed, rather than filling a commercial vacancy, we’re hoping to fill some of the vacancies in your schedule where community gatherings used to be. We’ll be live-streaming events, supporting local organizations, and providing opportunities for people to connect. CultureCloud is a living prototype – check back regularly for more content and updates.
While we can’t serve you coffee and tea, we want to help you ensure that what you do consume supports local businesses.
While you can’t hang out at CultureHouse, we want to help you fill your time with activities that maintain social connections.
Our events may be postponed, but we still want to make sure you can learn new things and connect with others.
How you can help community members in need.


Kelowna craft brewery set to expand
by Rob MunroWild Ambition Brewing has been open for less than a year but wants to expand its operation in Kelowna.
The brewery opened in the Mill Creek Industrial Park, off Sexsmith Road near Highway 97, last December with limited hours four days a week and limited serving options.
An application was filed with the City of Kelowna yesterday, Nov. 19, to operate a lounge with room for 30 people indoors and 48 on an outdoor patio, and to operate seven days a week from 9 a.m. to midnight and to sell sandwiches and pastries.
“We are not expecting the transition from our existing retail shop and tasting area to retail shop and lounge to be particularly dramatic,” states a letter accompanying the application by co-owner Theresa Cashen.
“The existing serving limit of three 125 ml tasting pours disappoints our customers who would like the opportunity to sample more than three beers from our extensive beer list or have a larger serving of a single beer.”


Luke Hobbs (Dwayne Johnson) has Dominic Toretto (Vin Diesel) and Brian O'Conner (Paul Walker) reassemble their crew to take down a team of mercenaries and clear their criminal records.
| Year | Award | Category | Recipient | Result |
|---|---|---|---|---|
| 2013 | ||||
| Golden Trailer Awards[85] | Best Action TV Spot | Breathe (Super Bowl Trailer) | Won | |
| Best Summer Blockbuster 2013 TV Spot | Breathe (Super Bowl Trailer) | |||
| Summer 2013 Blockbuster Trailer | Nominated | |||
| Best Sound Editing | ||||
| Best Teaser Poster | ||||
| Teen Choice Awards | Choice Summer Movie: Action/Adventure | Won | ||
| Choice Summer Movie Star: Male | Dwayne Johnson | Nominated | ||
| Choice Summer Movie Star: Female | Michelle Rodriguez | |||
| Choice Movie: Chemistry | Vin Diesel, Dwayne Johnson, & Paul Walker | |||
| Hollywood Film Festival | Best Film | |||
| Phoenix Film Critics Society Award | Best Stunts | Won | ||
| 2014 | ||||
| People's Choice Awards | Favorite Movie | Nominated | ||
| Favorite Action Movie | ||||
| Favorite Action Movie Star | Vin Diesel | |||
| IGN's Best of 2013 Movie Awards[86] | Best Action Movie | Won | ||
| Screen Actors Guild Awards | Outstanding Performance by a Stunt Ensemble in a Motion Picture | Nominated | ||
| Motion Picture Sound Editors Golden Reel Awards[87][88] | Best Sound Editing: Sound Effects & Foley in a Feature Film | Peter Brown | Nominated | |
| MTV Movie Awards[89] | Best On-Screen Duo | Vin Diesel & Paul Walker | Won | |
| Saturn Award | Best Action or Adventure Film | Won | ||
| Best Editing | Christian Wagner, Kelly Matsumoto and Dylan Highsmith | Nominated | ||
| Premios Juventud | Best Picture | Won |
Allegedly, more than 100 cars were crashed, wrecked, or otherwise destroyed in the process of filming.
Originally conceived as two movies, the first ending with the conclusion of the tank scene, and the second ending with the plane.
At the end, when Dom says "1327", it is the address to his house from the first movie.
The chase scene in central London was filmed briefly near Wembley Stadium, then edited to look like the whole chase was based in central London.


{notempty name='list'} {volist name="list" id="info"} {include file="manager_manage/shop_employee_info_tpl" /} {/volist} {else /} {if $page == 1}


WITNESS LIST Business & Industry Committee March 9, 2005-8:00A HB 255 On: James, Randall S. (Texas Banking Commissioner and the Texas Department of Banking) HB 1154 For: Lebowitz, J. Leon (Texas Business Law Foundation) On: Sumners, Robert M. (Secretary of State) HB 1507 For: Lebowitz, J. Leon (Texas Business Law Foundation) On: Sumners, Robert M. (Secretary of State)


--- layout: post title: Plain Old Dart Objects date: 2013-09-22 21:14:38.000000000 +00:00 categories: - Dart tags: [] status: publish type: post published: true meta: _publicize_pending: '1' _knews_automated: '0' author: login: maxhorstmann email<EMAIL_ADDRESS>display_name: Max first_name: '' last_name: '' ---
As a C# developer, I use auto-implemented properties all the time, typically to create POCOs:
{% highlight C# %} {% raw %} class Customer { public string FirstName { get; set; } public string LastName { get; set; } public string City { get; set; } public DateTime Created { get; set; } } {% endraw %} {% endhighlight %}The compiler will generate an invisible (well, sort of) private member field for each property, which can only be accessed through the getters and setters. Why is it a good practice not just make the member field public, by the way? Because we might wanna add some validation logic later, and changing it from a member field to a property will require recompilation on the caller side. Which is in particular inconvenient if the binaries have been shipped. Also, subclasses can override properties and add logic to them - in C#, it's not possible to override a member field with a property.
Now, let's write the POCO in Dart (which I guess makes it a PODO):
{% highlight dart %} {% raw %} class Customer { String FirstName; String LastName; String City; DateTime Created; } {% endraw %} {% endhighlight %}As simple as it gets. One thing you'll notice is that there is no public access modifier. That's because in Dart, there are no access modifiers: if a member attribute starts with an underscore, it's private (to its library). Otherwise, it's public. I think that's great! Typically, programmers use the underscore notation (or a similar prefix such as m_) by convention anyways. So, having an access modified and the prefix is kind of redundant.
Also, unlike in the C# version, nothing appears to tell the compiler to wrap those attributes in auto-generated getters and setters. That's because the Dart compiler always implicitly generates them (except for setters on final attributes)! Well, as an optimization, it might not really do that although the Dart documentation does make that claim. But the important part is that you can pretend that it does, and if you should choose to make the getters/setters explicit later (or override them in a subclass), you have a guarantee that nothing will break. For instance, here's how we might add some validation logic later and/or in a subclass:
{% highlight dart %} {% raw %} String _firstName; String get FirstName { return _firstName; } set FirstName(String value) { if (value == "Dirk") throw new Exception("No Dirks allowed here."); _firstName = value; } {% endraw %} {% endhighlight %}There's one more thing: frequently, you're going to instantiate all the member fields of a POxO at instantiation. Here's how Dart allows you to define a constructor for just that:
{% highlight dart %} {% raw %} Customer(this.FirstName, this.LastName, this.City, this.Created); {% endraw %} {% endhighlight %}Hmm... syntactic sugar, sweet!


Flexible time tracking.
Timespent Add-on is easy and flexible time tracking means with four Reports:
- Time Entry provides convenient way to record worked hours in real time, i.e. start, stop, resume timer, log worked done or edit previous records.
- Timesheet provides the most extensive means to analyze users' workload. It has classical sheet view by day. Also with numerous report Options it is possible to get few variants of the report.
- Pivot by User displays a summary of worked hours for project for certain period, where columns are project users (resources) and rows are project issues (tasks).
- Pie Chart displays a summary of worked hours for project for certain period in Pie Chart.
Install
Just visit https://timespent.primetimesheet.net/ and confirm authorization.
Usage
When installed it adds Timespent repository page, accessible from sidebar. It provides different time tracking views.
It allows to log work done and build reports of Timespent across all repositories and users over certain period of time.
Support
Please report problems by creating issues in tempo-io/timespent repository.


Recitation Summaries, Notes, Exercises and their Solutions for CIS 2166
Recitation summaries will be collected on this page as we progress through the semester.
All problems and exercises mentioned below, unless otherwise indicated, are from Kenneth Rosen's textbook, Discrete Mathematics and its Applications, 7th edition, McGraw Hill Inc.
I will sometimes demonstrate ideas using Matlab. You are not required to use Matlab (or any other scientific computing software) in this class. However, if you are already familiar with Matlab, you may find it helpful to take a look at the code I will provide during the semester. This may clarify the material covered in class. Scientific computing software comes in especially handy when we cover topics from linear algebra later in the semester.
Welcome to your first recitation!
Today's Discussion:


Self Snoop
The processor supports the management of conflicting memory types by performing a snoop of its own cache structure for transactions issued to the bus.


--- layout: page title: Contact Me site-url: "http://localhost:4000" --- {% assign response = '/thank-you' | prepend: page.site-url %}


Introducing the Adversary Resilience Methodology — Part One - specterops
Introducing the Adversary Resilience Methodology — Part Two


Welcome to ${page_title} web pages
${page_description}
Login
${username_label}:
${password_label}:
Login


Build your Digital Resilience with Shiekh & Chaudhary.
The Ultimate best options you can avail!
Along with The Junaid Iqbal ⭐
If you don’t have a speaker or can’t be able to hire on the
first page of KonnectCon21
then you are missing out on potential audience.
There are many variations of passages of Lorem Ipsum available, but the majority have suffered alteration in of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy
Everything we do is thoughtfully tied with creativity. We design and develop modern user friendly websites which incorporate your logo and branding according to your choice.
Business advisory service advises current and future
businesses prospects of a client, with the aim of
advancing their business or company.
Don’t miss out the potential visitors and sales for the
absence of your digital presence.