Since disk drives are cheap, backup should be cheap too. Of course it does not help to mirror your data by adding more disks to your own computer because a virus, fire, flood, power surge, robbery, etc. could still wipe out your local data center. Instead, you should give your files to peers (and in return store their files) so that if a catastrophe strikes your area, you can recover data from surviving peers. The Distributed Internet Backup System (DIBS) is designed to implement this vision.
Note that DIBS is a backup system not a file sharing system like Napster, Gnutella, Kazaa, etc. In fact, DIBS encrypts all data transmissions so that the peers you exchange files with can not access your data.
After initial configuration, DIBS is designed to run in the background and automatically backup desired data. Specifically, any files, directories, or links placed in the DIBS auto backup directory (usually ~/.dibs/autoBackup) are periodically examined by DIBS and sent to peers for backup. If the data changes, DIBS automatically unstores old versions and backs up changes.
DIBS performs incremental backup. Specifically, if DIBS is asked to backup a file (either automatically or by the user), and DIBS determines the file is already backed up and the file is unchanged, DIBS does not re-backup the file. This allows you to efficiently backup large numbers of files without wasting bandwidth by repeatedly backing up unchanged data.
DIBS uses Gnu Privacy Guard (GPG) to encrypt and digitally sign all transactions. Thus you can be confident that even though you are sending your files to others for backup, your data will remain private. Furthermore, by using digital signatures, DIBS prevents others from impersonating you to store files with your peers.
DIBS uses Reed-Solomon codes (a type of erasure correcting code similar to those used in RAID systems) to gain the maximum robustness for a given amount of redundancy. See the FAQ for a description of the benefits of Reed-Solomon codes.
DIBS includes a peer finder service to allow you to find peers to exchange backup space with.
Since peers can have varying levels of connectivity to the network, DIBS offers different communication methods to support a variety of users.
DIBS now has a graphical user interface (GUI) to make it easier to use. The current GUI is experimental so comments, suggestions, and code contributions are welcomed.
For DIBS to work, you need to have the following installed:
To install DIBS, download the binary distribution for you architecture or the entire source tarball from http://dibs.sourceforge.net or http://www.csua.berkeley.edu/~emin/source_code/dibs. If you download the source tarball, uncompress it, become root, and do python setup.py install to install. If you do not want to install as root, you can do python setup.py install --root=<alternate>/<root>/<path>.
The main file used to run DIBS is dibs.py which will usually be installed in an appropriate place for Python scripts. On a UNIX system, you should be able to run DIBS using dibs.py .... On a Windows system, you may need to do something like C:\<path>\<to>\python.exe dibs.py ....
Create a GPG key for DIBS using the command gpg --gen-key. You MUST use an empty passphrase for your key so that DIBS can sign/encrypt with it in batch mode. We recommend choosing the "email address" field of the key to be different from your true email address by appending .dibs (e.g. emin.dibs@alum.mit.edu). Make sure you give your gpg public key to any peers you want to trade files with. If your GPG key is not $USER@$HOST, you will need to put the commands dibsPublicKey = '<yourKeyName>' and dibsPrivateKey = '<yourKeyName>' in your dibsrc.py file. See the section in the manual on Options for more details.
DIBS currently refers to GPG keys via the email address as opposed to the GPG key fingerprint or other method. Thus when you set dibsPublicKey, dibsPrivateKey, etc., you should be doing something like
dibsPrivateKey =<EMAIL_ADDRESS>Also, you do not need to put a real email address in the name of the key, you can essentially put in whatever name you like. Thus if you have multiple machines running dibs you can have one machine with the key name<EMAIL_ADDRESS>and another with the key<EMAIL_ADDRESS>and so on.
There are a variety of commands for using and configuring DIBS. All commands can be issued either from the command line or from a graphical user interface (GUI). To be complete and precise, this manual describes the command line version, but if you wish to use the graphical user interface simply use the dibs.py command with no arguments to start the GUI.
Issue the command dibs.py show_database
Normally, this command would show you the database of peers you can exchange files with (which should be empty). Since this is the first time you are using DIBS, this command (actually any command) will first create the ~/.dibs directory to hold DIBS related files. On a windows system ~/ usually refers to C:\Documents and Settings\<user>.
If your email address is not $USER@$HOST and/or your GPG key is not $USER.dibs@HOST you will need to tell DIBS about this in the file ~/.dibs/dibsrc.py. In that file put the following:
dibsPublicKey = '<your-gpg-key-name>' dibsPrivateKey = '<your-gpg-key-name>' dibsAdmin = '<your-email-address>'
Remember to refer to GPG keys by the email address as described in GPG Keys Named via Email Address.
Also, if your gpg program is in a weird place, you may also want to put
gpgProg = '<path>/<to>/gpg'
If your python executable is in a strange place (e.g., if you run Windows) or if you have more than one version of python installed (e.g., on a Debian or OS X system where you installed a different version in addition to the default python installation), you may also need to specify the location of the python interpreter via
pythonExe = '<path>/<to>/python'
Finally, you will probably need to set your outgoing mail server via something like
smtpServer = 'smtp.<your-isp>.com'
See the manual for other customizations that can go in the dibsrc.py file.
Their are two basic ways to tell DIBS about people or computers with whom you want to exchange backup space. You can either find partners yourself and manually import their GPG key and manually enter their information using the add_peer command are you can use the DIBS peer finder service with the post_contract and propose_contract commands. Ideally, the peer finder service should be simpler and easier, but it is currently somewhat experimental. Both methods are discussed below.
First, you must import the GPG keys you from people you want to exchange files with. This can be done using gpg --import. See the GPG documentation for more details. As described in GPG Keys Named via Email Address, DIBS currently uses the email address for a GPG key as the peer name, so when you create a GPG key it is useful to keep this in mind. Please read the description below before creating/importing GPG keys for use with DIBS.
Once you agree to trade files with someone, each of you must add the other to the DIBS database using the following command:
dibs.py add_peer --email TRUE_EMAIL_ADDRESS --peer DIBS_KEY_FOR_PEER --local_quota L_QUOTA --remote_quota R_QUOTA --comment COMMENT --talk TALK_METHOD --listen LISTEN_METHOD --host HOST --port PORT
The arguments have the following meaning:
For example, if you wanted to trade files with me where I store 1 MB for you and you store 5 MB for me you would issue the command
dibs.py add_peer --email<EMAIL_ADDRESS>--peer<EMAIL_ADDRESS>--local_quota 5000 --remote_quota 1000 --comment "trade with emin" --talk active --listen active --host martinian.com
There should be no line breaks in the command above. Notice that my email address is<EMAIL_ADDRESS>but my dibs key is<EMAIL_ADDRESS>and the machine I plan to run dibs on is martinian.com.
This will create an entry for the peer in the database (you can verify this using the command dibs show_database).
An alternative to manually finding a peer and adding the required information is to use the new post_contract and propose_contract commands introduced in version 1.0 of DIBS. Essentially, the post_contract command allows you to post an advertisement on the Internet (or alternatively a private intranet) describing the trade parameters you want. Someone else can then use the propose_contract command to answer your advertisement. If the proposed parameters match your advertisement then your DIBS client and your partner's client will automatically exchange the proper information such as GPG keys, talk and listen modes, etc.
These functions are still experimental, however, and so they are described in Peer Finder instead of the install section for now. Users are encouraged to try them out, but those who just want to get DIBS working and do not want to fiddle with things may prefer the better tested but more tedious add_peer approach.
To have DIBS automatically back up files or directories, put the desired files or directories (or better yet, links to them in ~/.dibs/autoBackup). For example, if you have a UNIX system and want to have your .emacs file and your Mail directory automatically backed up you could do
cd ~/.dibs/autoBackup ln -s ~/Mail ln -s ~/.emacs
Once you start the DIBS daemon (described below), it will periodically check everything in ~/.dibs/autoBackup for changes and back them up.
For DIBS to work, you must start the daemon with the command
dibs.py start_daemon
I recommend starting the daemon inside a screen session if you have the screen program installed so that you can view the messages the daemon generates. If you are going to start DIBS in a terminal or console that you plan to close and you have a UNIX system, you should instead do
nohup dibs.py start_daemon > /dev/null &
so that DIBS does not die when trying to write to standard out.
If errors occur, you may need to restart the daemon. the DIBS daemon will periodically send them out to peers to be backed up.
Finally, in order to recover from complete data loss you need to protect two absolutely critical pieces of information: your GPG key and the list of peers you trade with. You can obtain the former by exporting it from GPG and the latter from your ~/.dibs/dibs_database.peerDatabase file. So put these two pieces of information onto a floppy, CD, or good old fashioned paper and store them in a safe place (see the section on Recovering Everything for more details).
If you do not store these pieces of information you will still be able to recover from isolated damage which does not affect this critical data.
The Peer Finder service is designed to allow people to find trading partners. The basic idea is that you can use the post_contract command to advertise a “trading contract” describing your terms for trading backup space. Others can then use the propose_contract command to propose a specific contract within the parameters you specified. If your DIBS client finds the proposed contract to be valid (i.e., within the paremters you specified with post_contrat), then public keys, email addresses, and other parameters will be exchanged between your DIBS client and the peer proposing the contract. In particular, manually issuing add_peer or edit_peer commands will no longer be required.
To summarize, the main benefits of the peer finder service are:
To post a contract, use the post_contract command as illustrated by the example below:
dibs.py post_contract --min_quota 10M --max_quota 30M --quota_mult 2.3 --lifetime 86400 --contract_name my_contract
This would post an advertisement for a trading agreement where the poster wants between 10 and 30 megabytes of storage space as specified by --min_quota and --max_quota. The --quota_mult of 2.3 indicates that the poster wants at least 2.3 times more space from than he provides. The --lifetime value indicates that this contract is valid for 86400 seconds (i.e., one day). After that time elapses, it will be automatically removed from the contract server. The optional --contract_name name argument specifies the name of the contract (my_contract in this example). Usually, you should not explicitly name a contract and let DIBS automatically generate a name. Providing a name can be useful in automated scripts, however.
The advertisement is posted to the server specified by the defaultContractServerURL in the dibsrc.py file (if no such variable is present then the current default is www.martinian.com:8000/~emin/cgi-bin/peer_finder. You can view posted contracts from yourself or others by pointing a web browser to www.martinian.com:8000/~emin/cgi-bin/peer_finder/show_contracts.cgi (or the value of the defaultContractServerURL followed by show_contracts.cgi if you are using a different contract server.)
The --quota_mult option may seem strange at first. Why would anyone be willing to give more space than they provide? One possibility is donating space to charities. A worthy organization might post a contract either asking for free space or highly discounted space. Another possibility is that some people might have very high bandwidth connections, high uptime, or other features which make them more desirable trading partners. By providing --quota_mult the peer finder service allows for a variety of trading relationships.
You can cancel a contract that you posted with the unpost_contract command as illustrated below:
dibs.py unpost_contract --contract_name NAME
where NAME is replaced with the name of the contract you are trying to cancel. The contract name will be shown on the contract server show_contracts.cgi page. Also, you can find your currently posted contracts by using the command
dibs.py show_database --only posted_contracts
Obviously you cannot unpost contracts posted by others and nobody can unpost your contract. This is accomplished by storing a revocation password on in your DIBS database which is told only to the server. Your client will automatically supply the required revocation password to the server when unposting.
Once you have browsed www.martinian.com:8000/~emin/cgi-bin/peer_finder/show_contracts.cgi or another contract server site and found a contract you would like to enter into, you use the propose_contract. The following example illustrates how you would respond to the contract posted in Posting a Contract.
dibs.py propose_contract --local_quota 10M --remote_quota 23M --talk active --listen active --contract_name my_contract
The --local_quota, --remote_quota, --talk, and --listen arguments are the parameters which the peer you are proposing the contract to would use if he were to use the add_peer command. This bears repeating: these arguments are from the point of view of the peer you are proposing the contract to not from your point of view. Thus the --local_quota argument specifies how much space the peer will give you, the --remote_quota argument specifies how much space the peer will get from you, the --talk argument specifies how the peer will contact your machine, and the --listen argument specifies how your DIBS client will contact the peer.
Once you issue the propose_contract command, your peer will try to contact the poster of the contract. Thus, the poster should have an active --listen method otherwise there will be no way for your DIBS client to contact the poster's DIBS client! Assuming that your client successfully contacts the poster, the poster will view the proposed contract and make a yes or no decision. The poster will then contact the proposer to return the decision and potentially exchange key information.
The simplest case is when both poster and proposer accept direct incoming connections and both --talk and --listen are active. Things can still work, however, if the proposer is behind a firewall, but in this case, the proposer must issue the poll_passives command followed by the process_message command to get the response from the poster.
In any case, once the proposed contract is accepted and the proper messages are exchanged, both the posting and proposing DIBS client will exchange GPG key information, and set up their quotas accordingly without the need for explicitly using the add_peer command.
As an aside, the above discussion illustrates another reason for the --quota_mult argument in posting a contract. If your machine is available to accept incoming connections then others who are behind firewalls can still peer with you. On the other hand, if your machine is behind a firewall and cannot accept incoming connections then you can only peer with machines that can accept incoming connections. This would suggest that machines which accept incoming connections should be able to “charge more” for peering than those which cannot accept incoming connections. The --quota_mult facilitates this.
If you are running a private DIBS network (e.g., to backup files within your company or organization), you might want to run your own peer finder service. To do so, look at the README file in the src/peer_finder/cgi-bin directory of the DIBS distribution.
Once the Peer Finder service becomes more stable, more documentation on running your own Peer Finder service will be added to the regular documentation.
The preferred way to use DIBS is by running the DIBS daemon in the background. The daemon listens for and automatically processes incoming messages from peers, and automatically backs up any files, directories, or links in the directory ~/.dibs/autoBackup (or whatever you have autoBackupDir set to). To start the daemon, use the command dibs start_daemon. For peers to contact your DIBS client, YOU MUST HAVE THE DIBS DAEMON RUNNING.
If you have the screen program available, the best way to start the DIBS daemon is inside a screen session. That way you can view what the daemon is doing inside your screen session. If you plan to run the daemon without a connection to a console (e.g., if you want to start the daemon and then close your terminal window) you should redirect the output to /dev/null.
The simplest way to use DIBS is to put links to any data you want backed up in the directory ~/.dibs/autoBackup (or whatever you have autoBackupDir set to). Periodically, the DIBS daemon will execute the auto_check command which will make DIBS incrementally backup your data. Alternatively, if you want the contents of this directory backed up immediately you can issue the auto_check command manually.
If you want to backup a particular file or directory, or write scripts to use DIBS for more sophisticated backup use the store command. For example, to backup everything in your mail directory you would do
dibs.py store --name mail
This will cause DIBS to recursively traverse mail and incrementally store any files it encounters. In this context, incrementally means that a file is only sent to peers if no previous backup exists or if the previous backup differs from the current version of the file.
If you want to backup the same data under different names you can use the --as option to the store command. For example, on a UNIX system you could set up a CRON job to execute the following command every day:
dibs.py store --name mail --as mail.`date +%a`
This would cause dibs to have seven versions of the directory mail backed up: mail.Mon, mail.Tue, etc. Each day of the week, DIBS would compare the mail directory to the backup it made one week ago and re-backup any new files or files which have changed.
You can recover a file with the command
dibs.py recover_file --file FILENAME
Note that FILENAME must correspond to the name which you stored the file as. The auto_check command stores data with the root obtained by concatenating the rootDir variable with the autoBackup variable. On UNIX, the rootDir variable defaults to /. So, on a UNIX system, if you want to recover the file foo stored in ~/.dibs/autoBackup (or whatever you have autoBackupDir set to), you would use the command
dibs.py recover_file --file /autoBackup/foo
This begins the recovery procedure. DIBS will email you when the file is fully recovered unless you have set the value of mailUserOnRecovery to 0.
If you suffer a major data loss you probably do not want to go through the tedious process of recovering every file individually. To recover everything all at once, you can use the command
dibs.py recover_all
This causes DIBS to send a RECOVER_ALL message to all peers asking them to send back everything.
A major feature of the recover_all command is that it only requires the list of peers you are trading data with and does not need the rest of the database. Thus if you have the dibs_database.peerDatabase (either stored in ~/.dibs or wherever the DIBS_DIR variable points to) and your GPG key, you can use the recover_all command to recover from complete data loss.
At first it may seem like the requirement of keeping your dibs_database.peerDatabase and your GPG key safe defeat the purpose of automated backup. After all if you had secure file storage in the first place, why would you need DIBS? The answer is that these two pieces of information take very little room and do not change often. Thus it is quite feasible to save your dibs_database.peerDatabase and GPG key to a floppy, CD, or even paper, and then put this information in a safe place (e.g., a friend's house, a safe deposit box, or in a fireproof safe in your basement).
If you want to clear out all the files other peers are storing for you, you can execute the command
dibs.py clear
This tells all peers to stop storing files for you. It is especially useful if DIBS gets into a weird state due to errors.
Note that issuing the clear command only tells peers to stop storing stuff for YOU, but doesn't make your DIBS client stop storing stuff for them. If you want to drop all the storage for a particular peer, you can use the forget command. See the documentation for clear, forget, edit_peer, and delete_peer for more information.
DIBS commands can all be issued in either of two ways: through the command line or through the graphical user interface (GUI), which can be started by issuing the dibs.py command with no arguments. To be complete and precise, this manual describes the command line version.
On the command line, DIBS commands are issued using the following syntax:
dibs
ARGNAME1 ARGVAL1 ARGNAME2 ARGVAL2 ...
where ARGNAME1 is an argument name starting with -- and ARGVAL1 is the corresponding argument value. For example, to store the file ~/foo/bar.txt the following syntax would be used
dibs.py store --name ~/foo/bar.txt
This rest of this section describes the commands available in DIBS. Optional arguments are enclosed in brackets.
dibs.py add_peer --peer
PEER --email
EMAIL
--remote_quota
REMOTE_QUOTA --local_quota
LOCAL_QUOTA
--comment
COMMENT --talk
TALK --host
HOST
[ --port
PORT ]
--peer
PEER--email
EMAIL--remote_quota
REMOTE_QUOTA--local_quota
LOCAL_QUOTA--talk
TALK--listen
LISTEN--host
HOST--comment
COMMENT--port
PORTThe add_peer command is used to create an entry in the database for trading files with a peer. For example, if you wanted to trade files with me where I store 1 MB for you and you store 5 MB for me you would issue the command:
dibs.py add_peer --email<EMAIL_ADDRESS>--peer<EMAIL_ADDRESS>--local_quota 5000 --remote_quota 1000 --comment "trade with emin" --talk active --listen active --host martinian.com
A k, m, g, or, t can be appended to a quota indicating that the number should interpreted as kilo-bytes (the default if no letter is appended), mega-bytes, giga-bytes, or tera-bytes. For example, the --local_quota 5000 in the example above could be replaced by --local_quota 5M NOT --local_quota 5K.
dibs.py delete_peer --peer
PEER
--peer
PEERThis command removes PEER from your database and sends an email to the email address associated with PEER to this effect. This command can only be executed if you are not storing anything for PEER and PEER is not storing anything for you (see forget, clear).
dibs.py edit_peer --peer
PEER
[ --email
EMAIL ]
[ --remote_quota
REMOTE_QUOTA ]
[ --local_quota
LOCAL_QUOTA ]
[ --comment
COMMENT ]
[ --talk
TALK ]
[ --host
HOST ]
[ --port
PORT ]
See add_peer for a description of the arguments. This command changes the value of one or more entries for PEER. It is an error to decrease REMOTE_QUOTA or LOCAL_QUOTA below the respective storage amount. The current storage amount can be seen via add_peer.
This command starts the DIBS daemon.
The daemon must be running for DIBS to automatically send and respond to messages from peers and to automatically backup the data you place in the directory named by the autoBackupDir option. For more information about the DIBS daemon, See The DIBS daemon.
--peer
PEERThis command forgets all the files stored for PEER on the local machine and sends a message to PEER about this. The forget command is useful if you want to decrease the amount of storage allocated to PEER, terminate your relationship with peer (see delete_peer), or if your DIBS database gets into a weird state.
Since this command informs PEER that files are being forgotten, the database of PEER will be properly synchronized (i.e., the database of PEER will indicate that you are not storing any files for PEER).
This command asks the daemon on the local machine (IP address <IP_ADDRESS>) listening at the port specified by the daemonPort variable to stop immediately.
This command checks files in the auto backup directory autoBackupDir and backs up any new files or files that have changed.
dibs.py clear
This command sends unstore requests to peers to unstore all the files
stored by your client.
dibs.py store --name
ITEM [ --as
SNAME ]
--name
ITEM--as
SNAMEThis command causes DIBS to (incrementally) store the file or directory with peers. If a directory is given, its contents are recursively stored. If a file which is already stored is encountered and it is unchanged, nothing happens. If an already stored file is encountered and the backed up version is different than the current version, the old version is unstored and the new version is backed up in its place.
dibs.py unstore_file --file
FILENAME
--file
FILENAMEThis command causes DIBS to ask peers to unstore the named file. Note that if an item was stored via
dibs.py store --file foo --as bar
it should be unstored via
dibs.py unstore_file --file bar.
dibs.py recover_file --file
FILENAME
--file
FILENAMEAsk peers to send us pieces of FILENAME which they are storing. Note that if an item was stored via
dibs.py store --file foo --as bar
it should be recovered via
dibs.py recover_file --file bar.
This command asks all peers to send back everything they are storing. This command can be used to recover from complete data loss. See Recovering Everything for more details.
dibs.py show_database [ --only
WHICH ]
This command prints a representation of the DIBS database. If the optional --only option is used with WHICH being one of peers, files, stats, or recovery, probe, storage, posted_contracts, proposed_contracts, then only the indicated portion of the database is printed. For example, the command
dibs.py show_database --only peers
would display only the peers in the database and not the files or recovery status.
dibs.py cleanup
Cleanup empty files and directories. Use this after you use this after
calling forget, after a peer issues the uses the clear
command, or every once in a while to keep things clean and efficient.
DIBS keeps the data your are storing for peers in a tree of directories. Since the file name for a piece of data is determined by the MD5 hash of the data, a file name might look like 380b90f17c9c908d0e59cf0fb1c8e461. This file would be stored in the path DIBS_DIR/<peer>/3/8/0/b/380b90f17c9c908d0e59cf0fb1c8e461. Once you stop storing this piece of data the directory DIBS_DIR/<peer>/3/8/0/b/ still remains. The cleanup command goes through your DIBS directory and removes such directories which no longer contain any files.
dibs.py poll_passives
Poll any peers who are passive (i.e., can not connect to us directly).
If you are using the DIBS daemon, you do not need to use this command
since the daemon will do it periodically.
dibs.py probe [ --file
FILENAME ]
Ask all peers storing a file to verify that they are actually storing it. With no arguments, this command probes a random file. This command is called automatically (with no arguments) by the daemon started via start_daemon.
dibs.py process_message [ --file
FILENAME ]
--file
FILENAMEThis command reads the DIBS protocol message in FILENAME and takes the appropriate actions. If no argument is provided then all messages in the incoming directory are processed.
If you are using the DIBS daemon, you do not need to use this command since the daemon will do it periodically.
dibs.py send_message [ --file
FILENAME --peer
PEER ]
--file
FILENAME--peer
PEERThis command reads the DIBS protocol message in FILENAME sends it to PEER. If no argument is provided then all messages in the outgoing directory are sent to the appropriate peers.
If you are using the DIBS daemon, you do not need to use this command since the daemon will do it periodically.
dibs.py send_hello --host
HOST --port
PORT
--host
HOST--port
PORTThis command sends a hello message to the DIBS daemon listening on the specified machine to check if the peer is alive. The recipient should respond with a message listing the version of DIBS it is running.
This command merges all the statistics records in the statistics directory into the database. The show_database command can be used to see the current statistics.
dibs.py post_contract --min_quota
MIN_QUOTA
--max_quota
MAX_QUOTA
--quota_mult
QUOTA_MULT
--lifetime
LIFETIME
[ --talk
TALK ]
[ --listen
LISTEN ]
[ --contract_name
CONTRACT_NAME ]
[ --url
URL ]
[ --host
HOST ]
[ --port
PORT ]
--min_quota
MIN_QUOTA--max_quota
MAX_QUOTA--quota_mult
QUOTA_MULT--lifetime
LIFETIME--talk
TALK--listen
LISTEN--contract_name
CONTRACT_NAME--url
URL--url
none
is specified then the contract is not posted to any contract
server. Using the post_contract command and not posting the
contract to any URL is pointless, but this can be useful for testing
purposes.
--host
HOST--port
PORTThe post_contract command posts an advertisement for a trading contract to a server (see Peer Finder). Someone else can then propose a specific contract matching the posted parameters using the propose_contract command. If the contract is accepted, then GPG keys are exchanged and the appropriate modifications are made to the database of the poster and proposer without the need to manually use the add_peer or edit_peer commands.
dibs.py unpost_contract --contract_name
CONTRACT_NAME
[ --url
URL ]
This command unposts the contract with name CONTRACT_NAME previously posted with post_contract. By default, the URL to unpost from is obtained from the defaultContractServerURL variable and should not need to be specified.
Also, if --url none
is specified then the named contract is
removed from the DIBS database but the contract server is not contacted.
Generally this would be a bad idea, but it can be useful if contract
server has removed (or never received) the contract in question and you
now want to remove the contract from your DIBS database.
dibs.py propose_contract --contract_name
CONTRACT_NAME
--local_quota
LOCAL_QUOTA
--remote_quota
REMOTE_QUOTA
[ --talk
TALK ]
[ --listen
LISTEN ]
[ --host
HOST ]
[ --peer
PEER ]
[ --url
URL ]
[ --peer_host
PEER_HOST ]
[ --peer_port
PEER_PORT ]
[ --peer_email
PEER_EMAIL ]
Before describing the arguments, we point out that all the arguments that do not start with --peer_ are from the point of view of the peer not the poster.
--contract_name
CONTRACT_NAME--local_quota
LOCAL_QUOTA--remote_quota
REMOTE_QUOTA[ --talk
TALK ]
[ --listen
LISTEN ]
[ --host
HOST ]
[ --peer
PEER ]
[ --url
URL ]
[ --peer_host
PEER_HOST ]
[ --peer_port
PEER_PORT ]
[ –peer_email PEER_EMAIL ] The email address to use in contacting the poster. Usually, this is obtained form the posted contract information and should not need to be specified directly.
The propose_contract command proposes a specific contract within the parameters of the posted contract specified by CONTRACT_NAME. Specifically, if the poster accepts incoming connections, the proposer's DIBS client will attempt to contact the poster.
Once contacted, the poster will examine the proposed contract and respond with an automated email to the proposer describing its decision. If the proposed contract is accepted by the poster, then the poster will attempt to contact the proposer's DIBS client to exchange GPG keys, and enter the trading relationship in each client's database.
Thus if both poster and proposer accept incoming connections, the trading relationship should be automatically established and trading will commence as usual. If either the poster or proposer is behind a firewall and requires passive mode, things are more complicated.
If the proposer is behind a firewall and cannot accept incoming connections, then it will not be able to obtain the poster's response to a proposal until it issues a poll_passives command and followed by a process_message command to the poster. The DIBS daemon should eventually do this automatically, but the impatient user may wish to manually issue these commands after a contract is proposed.
If the poster is behind a firewall and cannot accept incoming connections, then things are even more complicated. In this case, there is no way that the proposer can contact the poster to initiate a proposal. Thus, posting a contract for a DIBS client which cannot accept incoming connections because it is behind a firewall is generally not a good idea.
DIBS has a number of options which you can configure using the dibsrc.py file in you DIBS directory. Your DIBS directory is usually created in ~/.dibs the first time you invoke DIBS. Use the command dibs show_database if you just want to get your DIBS directory created without doing anything else.
To set a particular option, just put the appropriate command in your dibsrc.py file. For example, to specify a particular name for the log file instead of the default, place the following command in the file ~/.dibs/dibsrc.py:
logFile = '/tmp/myDibsLog'
All the options which you can set in this manner are described below including the variable DIBS_DIR, which behaves slightly differently.
The options are separated into two classes “User Options” and “Variables”. The only distinction is that “User Options” are things which you will probably want to customize while variables are things which you probably should not change unless you know what you are doing.
This variable is the name of the GPG key to use in signing messages sent to peers. By default it is set using environment variables to be ${USER}@${HOST}. A warning is printed if either the USER or HOST environment variable can not be determined.
This variable is the name of the GPG key to use in encrypting messages that you ask peers to store for you. By default it is set using environment variables to be ${USER}@${HOST}. A warning is printed if either the USER or HOST environment variable can not be determined.
The value of dibsPrivateKey can be the same or different than dibsPublicKey. If they are the same, you have the convenience of only having to keep track of one GPG key. If they are different and you keep the private key secret, you have the added security that anyone trying to crack your encryption does not have the public key to work with.
Cracking the encryption when the public key is known MAY be easier than cracking the encryption when no public key is available. Nobody has yet figured out a way to break the commonly used public key encryption systems, though, so I personally just use the same public key for both encryption and signing.
This variable is the email address of the user. By default it is set using environment variables to be ${USER}@${HOST}. A warning is printed if either the USER or HOST environment variable can not be determined.
This variable controls whether DIBS automatically emails the user specified in the dibsAdmin variable when it finishes processing a recover_file command recover_file. The default value is 1, set it to 0 if you want to disable emailing when recovery is complete.
This variable sets the maximum size chunk to store with a peer. The default is 10 megabytes. Files larger than this value are broken up into smaller pieces before storage.
This variable specifies the file name to use in logging DIBS information. The default is
DIBS_DIR = DIBS_DIR + '/logfile'
This variable specifies the type of information which will be included in the log file. The different types of messages and their levels are shown below:
All messages with categories above the value for the logLevel variable will be printed to the log file.
LOG_DEBUG -20 LOG_INFO -10 LOG_WARNING 0 LOG_ERROR 10 LOG_CRITICAL 20 For example, if this variable is set to -10 as shown below
logLevel = -10then LOG_DEBUG messages will not be logged but all others will be.
The default value for this variable is 0.
This variable specifies the type of information which will be printed to the console. The different types of messages and their levels are the same as described for the logLevel variable.
All messages with categories above the value for the printLogLevel variable will be printed to the console.
For example, if this variable is set to -20 as shown below
logLevel = -20then all messages will be printed.
The default value for this variable is 0.
This variable specifies how many kilobytes a log file can contain before being rotated.
For example, if this variable is set to the default value of 1000000 as shown below,
maxLogSize = 1000000then logs will be rotated when they exceed one megabyte.
This variable specifies the path to the GPG program. The default is
gpgProg = 'gpg'If you are using Windows, you will almost certainly have to set this variable to point to your GPG program.
This variable specifies the SMTP server to use for sending outgoing mail. The default is localhost, but that almost certainly will not work if you are running Windows and probably will not work on most home UNIX systems. The best way to determine the SMTP server is to ask your system administrator or your Internet Service Provider. For example, if you connect to the Internet using RCN, you might do
smtpServer = 'smtp.rcn.com'
The DIBS daemon maintains a separate log file than other DIBS commands. The name of this log file is controlled by this variable and defaults to
daemonLogFile = DIBS_DIR + '/daemonLog'
When running, the DIBS daemon can be stopped by creating the file with this name. If this file contains an integer, the daemon waits that many seconds before stopping, otherwise it stops immediately. In either case, the daemon removes this file after stopping. Note that the daemon only checks for the existence of this file occasionally as controlled by daemonTimeout. The default value is
daemonStopFile = DIBS_DIR + '/stop_daemon'
When the DIBS daemon is alive it waits in an idle state for incoming connections. After a timeout period given by this variable (specified in seconds), it wakes up and performs various actions such as checking if it should stop daemonStopFile, checking if it should automatically backup files, or if it should attempt to poll passive peers pollInterval. The default value is 600.
This variable specifies how often (in seconds) the DIBS daemon should contact passive peers to ask for messages. Since the daemon only wakes up to do polling periodically (see daemonTimeout), the actual poll interval may be the sum of this variable, the daemonTimeout variable, and the time required to perform intervening actions by the daemon. The default value is 3600.
This variable controls how of then the probe command is automatically called by the daemon. Specifically, a probe will be attempted roughly every daemonTimeout seconds, but no more often than specified by this variable.
This variable specifies how long a probe is allowed to take. If more time (in seconds) has passed for a probe than the value of this variable, the probe is marked as a timeout.
This variables specifies how many redundant pieces of a file will be created. If a file is chopped into k pieces (see kbPerFile), this many extra pieces will be added using a Reed-Solomon code. For example, if a file is chopped into 5 pieces and redundantPieces is 2, then 7 pieces will be sent such that the original file can be recovered from any 5 of those 7 pieces.
This variable specifies the name of the host on which your DIBS client is running. By default, this value is obtained from the HOST environment variable and should not need to be modified. If that environment variable is empty or returns something useless like localhost or <IP_ADDRESS>, then you should probably explictly set this variable.
This variable specifies the port the DIBS daemon should listen on. The default value is 6363.
Sometimes DIBS needs to wait briefly for things like a lockfile being released or an unstore request being sent out before continuing. At these times it sleeps for a number of seconds specified by the sleepTime variable whose default value is 10.
This variable specifies how many seconds a message can wait in the outgoing queue before DIBS complains about it. The default is set to 10 days:
maxMsgAge = 86400 * 10
This variables specifies where the auto_check command looks for files and directories to backup automatically auto_check.
Any error messages which are mailed to the DIBS Administrator specified by dibsAdmin are also stored in the directory named by this variable. You should periodically read and delete messages here.
To prevent the DIBS Administrator from being mail bombed with error messages if something extremely unusual occurs, DIBS stops mailing error messages once the number of error messages in the directory named by errorDir exceeds this threshold.
To prevent the DIBS Administrator from forgetting about error messages stored in the directory named by errorDir, DIBS sends warnings about this directory filling up when the number of messages exceeds this threshold.
When storing a directory DIBS works by creating a queue of outgoing messages before trying to connect to peers to deliver the messages. Once more files than specified by this variable are queued up, DIBS will try to connect to peers to send the messages out.
If you make this threshold too small then DIBS will waste a lot of time with network overhead in making and closing connections to peers.
This variable determines the location of the user's DIBS files. By default it is ${HOME}/.dibs. You can not set this via the dibsrc.py because DIBS looks for the dibsrc.py file in the directory DIBS_DIR. Therefore to use a directory other than ${HOME}/.dibs to hold your DIBS files set the environment variable DIBS_DIR.
This variable describes the path to the Python executable. By default, it is set to the sys.executable value obtained from Python. You should not need to change it unless you have multiple versions of python installed and are doing something rather strange.
This variable specifies the default URL to use for the Peer Finder contract server. You should only change this if you want to use a special Peer Finder server.
DIBS provides various scripts for automated testing. These automated tests will probably be most useful to developers, but users may find them useful in diagnosing problems.
Furthermore, in addition to adding more tests, one quality assurance goal of DIBS is to add an automated test for each bug which is reported or fixed to verify the existence of the bug and its resolution. Ideally, advanced users should be able to submit a bug report by creating a new automated test which demonstrates the bug.
The testing suite is currently too complicated and poorly documented to reach this goal. But as a first step in achieving better testing and quality assurance, this chapter documents the current automated testing framework.
The tests directory in the DIBS source distribution contains subdirectories for each test group as well as testing utilities which are useful in all tests. The basic testing philosophy is that only general testing utilities and not specific tests go in the tests directory. Actual test scripts are contained in subdirectories of tests which represent test groups. To run a test group, the user sets the environment variables described in Environment Variables Required for Testing, changes directory to the top level DIBS directory, and imports all from the given test suite.
The following is a brief description of the contents of the tests directory:
Contains utility functions useful for all tests.
Contains code to ensure that various environment variables required for the tests are initialized before any tests begin.
This file imports all test subdirectories in the tests directory and causes the corresponding tests to be run. Specifically, the following commands execute all tests:
cd <path>/<to>/dibs echo from tests import all | <path>/<to>/python
This subdirectory contains scripts to test the contract functionality in the DIBS Peer Finder service. To run only the tests in this subdirectory do:
cd <path>/<to>/dibs echo from tests.contracts import all | <path>/<to>/python
cd <path>/<to>/dibs echo from tests.daemon import all | <path>/<to>/python
The following environment variables must be set before any automated tests can be run:
The following environment variables are optional and do not need to be set:
The following are issues which need to be fixed in future releases.


GlideinWMS
The Glidein-based Workflow Management System
GlideinWMS
FAQ
- How to request support
GlideinWMS support email: glideinwms-support at fnal.gov
- How to setup GSI in GlideinWMS
Refer to GSI setup reference guide
- How to add global configuration parameter to Glidein Factory entries
To add a configuration parameter that affects all the Factory entries, add an <attr ...> </attr> tag to /glidein/attrs section
- How to add local configuration parameter to Glidein Factory entries
To add a configuration parameter to a specific Factory entry, add an <attr ...> </attr> tag to /glidein/entries/entry/attrs section
- How to configure GlideinWMS to retrieve core files produced by user jobs
In the Factory configuration in the <entry> tag, the rsl attribute
should contain condor_submit=('+Coresize' 'Unlimited').
Example (all on one line):
rsl="(condor_submit=('+Coresize' 'Unlimited'))(queue=default)(jobtype=single)"
In the condor_submit file of the user job add:
+coresize = unlimited
NOTE: The coresize for the actual user job will be set to the available
disk space, not unlimited. Also, you can make this change to global
parameter or local parameter.
- How does GlideinWMS support Cloud VMs
Refer the gwms-cloud-vms project page for more details.


This is my personal website. I am building the website to mimic the New York Times' site. Of the three major East Coast papers - NYTimes, WaPo and WSJ, I like their website the best (but WaPo has the better iOS app). I particularly admire their use of whitespace to creating an aesthetically pleasing user experience. My future goals for this website are to create a sticky nav bar up top on pages other than this one, i.e., index.html, to layout the pages using columns, to incorporate more photos and possibly some videos.
To Do List
- The most important to do item is to write up a series of blog posts and move them to the index page. Because that's the content that I am trying to present to the reader. The paragraph above will then be moved to the About page or deleted altogether.
- Add Flex Boxes
- Add Columns layout to the page
- For every blog post, add buttons that enable the reader to like the page via Facebook or tweet the page via Twitter. I have the code to do this - it's commented out currently - but i just need to style it right so it looks professional. Or at least not crappy.
- Implement Jekyll!!


Wellness Connected™
App: Enduser License Agreement
Last updated: March 20, 2013
CAREFULLY READ THE FOLLOWING TERMS AND CONDITIONS. IF YOU DO NOT AGREE TO THESE TERMS AND CONDITIONS, DO NOT CLICK THE “I AGREE” BUTTON AND DO NOT USE THE WELLNESS CONNECTED™ APP IN ANY WAY. BY CLICKING THE “I AGREE” BUTTON (or using the App) YOU AGREE TO BE BOUND BY THESE TERMS AND CONDITIONS.
1. In General. This Agreement is a legal agreement between You and A&D Engineering (“A&D”), effective as of the date you click the “I agree” button or use the Wellness Connected App. Please note that A&D does not provide any warranties and limits its liability as provided in Sections 5 and 6 below. You represent and warrant to A&D that You are at least 18 years old.
In order to use certain features of the Wellness Connected App You will have to obtain a Microsoft® HealthVault account or similar third party online account. You understand and agree that the HealthVault account (or such other third party account) is governed exclusively by terms and conditions and privacy terms of Microsoft or such third party and that A&D has no obligation or liability whatsoever with respect to your use of, and the security of your data in, the HealthVault account or such other account. [See more fully Section 7 below.] If and when A&D offers its own online Wellness Connected™ accounts, those accounts and services will require a separate sign up and those accounts and services will be governed by terms and conditions of use and privacy terms that are separate from this Agreement.
2. License. The Wellness Connected App, as it may be updated or replaced by software updates made available by A&D from time to time, is licensed, not sold, to You by A&D for use only under the terms of this Agreement. A&D and its licensors retain ownership of the Wellness Connected App, including all updates and replacements thereof, and reserve all rights not expressly granted to You herein. The license granted to You for the Wellness Connected App is limited to a personal, non-commercial , non-transferable license to use the Wellness Connected App on any mobile devices You own or control that have the appropriate operating system. This license does not allow You (i) to use the Wellness Connected App on any mobile device that you do not own or control, (ii) to rent, lease, lend, sell, distribute or relicense the Wellness Connected App in any way. You may not copy (except as expressly permitted herein or as part of normal authorized use), decompile, reverse engineer, disassemble, attempt to derive the source code of, modify or create derivative works of the Wellness Connected App (including an updates) or any part thereof; provided, however, that any such restriction shall not apply if, and then only to the extent that, such restriction is prohibited by applicable law (or to the extent that any such actions may be permitted by the licensing terms governing use of any open source component included with the Wellness Connected App, if any). You understand, acknowledge and agree that You are responsible for compliance with all applicable laws in your use of the Wellness Connected App and related services.
3. No Healthcare Advice. You acknowledges and agree that neither the Wellness Connected App nor A&D (or any of its affiliated entities) nor any A&D device you use nor any related information provides any medical or other health care advice, diagnosis or treatment. Always seek the advice of your doctor or other qualified health care professional with any questions you may have regarding a medical condition or any diet, fitness, disease management or wellness program. Never disregard professional medical advice or delay in seeking it because of information you received or accessed on or through the Wellness Connected App or related service (such as, for instance, HealthVault).
4. Use of Data. You agree and consent that in connection with the Wellness Connected App, A&D may collect and use technical data and related information, including, without limitation, technical information about your mobile device, system and application software and A&D device(s) You use, that is gathered periodically to facilitate the provision of software updates, product support and other services to You, if any, related to the Wellness Connected App and the A&D devices You use. This information is not in a form that personally identifies You. A&D may use this technical information to improve its products and services and to provide products, services and/or technology to You. This Section does not apply to any data collected by A&D through any online account or through other online or offline products or services.
5. NO WARRANTY. The Wellness Connected App and any services performed or provided by the Wellness Connected App (“App Services”) are provided “AS IS” AND “AS AVAILABLE”, with all faults and without warranty of any kind. The entire risk as to the quality and performance of the Wellness Connected App is with You and should it prove defective, You and not A&D assume the entire cost of servicing and repair. To the maximum extent permitted by applicable law, A&D HEREBY EXCLUDES AND DISCLAIMS ALL WARRANTIES, GUARANTIES AND CONDITIONS WITH RESPECT TO THE Wellness Connected App and related APP services, WHETHER EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, ANY WARRANTY, TERM OR CONDITION OF MERCHANTABILITY, OF SATISFACTORY QUALITY, OF FITNESS FOR A PARTICULAR PURPOSE, OF ACCURACY, OF QUIET ENJOYMENT, OF ABSENCE OF HIDDEN DEFECTS, ANY WARRANTY OF NON-INFRINGEMENT OF THIRD PARTY RIGHTS, AND ANY WARRANTY, GUARANTY, TERM OR CONDITION THAT MAY ARISE BY REASON OF USAGE OF TRADE, CUSTOM, COURSE OF DEALING OR COURSE OF PERFORMANCE. Without limiting the above, A&D does not warrant against interference with your enjoyment of the Wellness Connected App or App Services, that the functions contained in, or the App Services performed by, the Wellness Connected App will meet your requirements, that the operation of the Wellness Connected App will be error free or uninterrupted, or that defects in the Wellness Connected App or App Services will be corrected. No oral or written information or advice given by A&D or any of its authorized representatives will create a warranty. You agree that Your use of the Wellness Connected App and related services is at you sole risk and expense. Some Jurisdictions do not allow the exclusion of implied warranties or limitations on applicable statutory rights of the consumer, so the above exclusion and limitations may not apply to You.
6. Limitation of Liability. To the extent not prohibited by law, IN NO EVENT SHALL A&D OR ANY OF ITS AFFILIATED ENTITIES BE LIABLE FOR PERSONAL INJURY, LOSS OF PROFITS OR ANY INCIDENTAL, SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES WHATSOEVER, ARISING OUT OF OR RELATED TO YOUR USE OR INABILITY TO USE THE WELLNESS CONNECTED APP OR APP SERVICES, HOWEVER CAUSED, REGARDLESS OF THE THEORY OF LIABILITY (CONTRACT, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE) EVEN IF A&D HAS BEEN ADVISED OR SHOULD HAVE KNOWN OF THE POSSIBILITY SUCH PERSONAL INJURY, LOSSES OR DAMAGES. Some Jurisdictions do not allow the limitation of liability for personal injury or of incidental or consequential damages, so this limitation may not apply to You. In no event shall A&D’s total liability to You for all damages (other than as may be required by applicable law in cases involving personal injury) exceed the amount of fifty dollars ($50.00). The foregoing liability limitations will apply even if a remedy herein fails, or is deemed to fail, of its essential purpose.
7. Third Party Services and Materials. The Wellness Connected App enables access to third party services and web sites (such as Microsoft® HealtVault) unrelated to A&D or its affiliated entities (the “Third Party Services”). If You enable access to such Third Party Services, You understand that You provide Your biometric, physical and health data in the Wellness Connected App to such Third Party Services. A&D does not review, examine, evaluate or endorse the content, accuracy, security, privacy, timeliness, validity, copyright compliance, legality, decency, quality or any other aspect of such Third Party Services or any third party content, data, information, applications or materials displayed, contained or accessible therein or related thereto (“Third Party Content”). Any use of Third Party Services will require Internet access and you will have to accept extensive additional terms and conditions, including, without limitation, terms of service for the Third Party Services.    A&D reserves the right to change, suspend, remove or disable access through the Wellness Connected App to any Third Party Services at any time without notice. In no event will A&D be liable to You for the removal or disabling of access to any Third Party Services. A&D may also impose limits on the use of or access to certain Third Party Services, in any case and without notice or liability. If and when A&D offers its own online Wellness Connected accounts related to the Wellness Connected App, those accounts and services will require a separate sign-up and they will be governed by their own terms and conditions of use and privacy terms that are separate from this Agreement.
8. Termination. This Agreement is effective until terminated by You or A&D. This Agreement and all your rights hereunder will terminate automatically, without notice from A&D, if You fail to comply with any term of this Agreement.  The provisions of Section 1, 3, 5, 6, 7, 9, 10, 12 and 13 will survive the termination of this Agreement for any reason whatsoever.
9. Export. You may not use, export or re-export the Wellness Connected App and related A&D devices except as authorized by United States law and the laws of the jurisdiction in which the Wellness Connected App or the A&D device was obtained. In particular, but without limitation, the Wellness Connected App and related A&D devices may not be exported or re-exported (a) into any U.S. embargoed countries or (b) to anyone on the U.S. Treasury Department's list of Specially Designated Nationals or the U.S. Department of Commerce Denied Person’s List or Entity List. By using the Wellness Connected App You represent and warrant that You are not located in any such country or on any such list. You also agree that You will not use these products for any purposes prohibited by United States law, including, without limitation, the development, design, manufacture or production of nuclear, missiles, or chemical or biological weapons.
10. Applicable Law. The laws of the State of California, excluding its conflict of law rules and principles, govern this Agreement and Your use of the Wellness Connected App. Your use of the Wellness Connected App may also be subject to other local, state, national or international laws.
11. Assignment. You may not assign this Agreement, in whole or in part, or transfer the Wellness Connected App to any person. Any attempt to do so by You is void. This Agreement is personal to You and not for the benefit of any other person.
12. Severability. If any provision of this Agreement is determined to be illegal, invalid or unenforceable, it shall be modified to render it legal, valid and enforceable while to the fullest extent possible preserving the business and financial intent and impact of the original provision, and if such modification is not feasible such provision shall be severed and the legality, validity and enforceability of all other provisions of this Agreement shall not be affected thereby.
13. Commercial Item. The Wellness Connected App is a “Commercial Item” as that term is defined at 48 CFR §2.101, consisting of “Commercial Computer Software” as defined in 48 CFR §12.212 and §227.7202, as applicable and is provided to US Government end user only as a Commercial Item and only with those rights as are granted to all other end users pursuant to the terms and conditions of this Agreement.
[End Of Terms]


{# Let's use some snazzy fonts and define a *little* bit of style #}
{% block content %}{% endblock %}


Guide for Service Clients
The GEOPM Service facilitates the PlatformIO interfaces by providing
security and quality guarantees. Clients of the GEOPM service may
access the PlatformIO features through a variety of interfaces
including C, C++, Python, and command line tools. The administrator
of the system may manage client access rights through the
geopmaccess
command line tool. PlatformIO uses the PlatformTopo
abstraction to define the hardware available on the system.
A high level overview of the PlatformIO abstraction is described in the geopm_pio(7) man page. This page and the pages linked within describe all signals and controls that are available through this interface. A client may read the signals or write the controls described in the overview with the interfaces listed below.
Language Bindings
C API
C++ API
Python3 API
Command Line Tools
Read one value: geopmread(1)
Write one value: geopmwrite(1)
Read time series of values geopmsession(1)
Access management geopmaccess(1)


Police launch investigation after football referee allegedly knocked unconscious
The referee received medical aid following the incident, which occurred in the 85th minute of a match between AFC Sutton Common Rovers and Sporting 50 FC on Saturday
by Aaron Flanagan, https://www.mirror.co.uk/authors/aaron-flanagan/Police have launched an investigation after a referee was allegedly knocked unconscious during a non-league match.
The incident occurred during Saturday's Surrey South Eastern Combination Intermediate League Division Two match between AFC Sutton Common Rovers and Sporting 50 FC.
Medical aid was immediately called for the referee, although he did not have to go to hospital.
The match, which took place at Goals Tolworth, was abandoned following the 85th minute incident, and both clubs condemned what happened.
A Metropolitan Police spokesman told Sky Sports News: "Police are investigating reports that a man in his 40s was assaulted while refereeing a football match at a sports ground in Surbiton.
"Officers were called to the venue in Kingston Road, Tolworth, at 15.16hrs on Saturday, 23 November.
"London Ambulance Service treated the man at the scene. His injuries are non life-threatening.
"The suspects had left the ground by the time of the officers' arrival. There are no arrests at this time and enquiries continue."
The Surrey South Eastern Combination has said that it will cooperate with police and the Surrey FA in its investigations.
Referees facing abuse is a big problem in the game at all levels.
Earlier this year the BBC reported on a 14-year-old referee who suffered a nervous breakdown after being verbally abused on the pitch.
According to the teenager's mother, the youngster was left "shaking head-to-toe and crawled from the bed to the bathroom" as a result of the incident at a youth tournament in Nottinghamshire.
She added: "It was like a brain injury, I was very terrified. The symptoms were so severe medics thought they may have a brain tumour."


This Site is Maneged By Himanshu Sharma . You Can Get Every Update Of COVID-19 Here.
Last updated 3 mins ago
There is no cure yet for Covid-19. Doctors and scientists are scrambling to find treatments and drugs that can save the lives of infected people .
Last updated 3 mins ago
Indian Government, at all levels, announces Welfare Schemes for a cross section of the society from time to time. These schemes could be either Central, State.
Last updated 3 mins ago
WHO's primary role is to direct international health within the United Nations' system and to lead partners in global health responses..
Last updated 3 mins ago


org.epri.pt2.reassembler
Class TcpReassembler
java.lang.Object
org.epri.pt2.listeners.PacketListener
org.epri.pt2.reassembler.TcpReassembler
- All Implemented Interfaces:
- org.jnetpcap.packet.PcapPacketHandler<java.lang.Object>
public class TcpReassembler
- extends PacketListener
- implements org.jnetpcap.packet.PcapPacketHandler<java.lang.Object>
Reassembles tcp packages into directional port/ip pair flows. Currently
packages are segmented using time-based detection.
- Author:
- Tam Do
|
Constructor Summary |
TcpReassembler()
Creates a tcp reassembler instance. |
|
Method Summary |
boolean |
isRunning()
|
void |
nextPacket(org.jnetpcap.packet.PcapPacket packet,
java.lang.Object arg1)
|
void |
reassemblePacket(org.jnetpcap.packet.JPacket packet)
Given a fragmented packet, attempt to reassemble the http packet stream. |
void |
reassembleTcp(org.jnetpcap.packet.JPacket packet,
long sequence,
long ack_num,
long length,
byte[] data,
int dataLength,
boolean synflag)
Reassemble a fragmented tcp packet |
void |
setRunning(boolean isRunning)
|
| Methods inherited from class java.lang.Object |
equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
TcpReassembler
public TcpReassembler()
- Creates a tcp reassembler instance. The reassembler starts a packetThread
instance which periodically reconstructs http packets.
reassemblePacket
public void reassemblePacket(org.jnetpcap.packet.JPacket packet)
throws java.lang.Exception
- Given a fragmented packet, attempt to reassemble the http packet stream.
- Parameters:
packet
-
- Throws:
java.lang.Exception
reassembleTcp
public void reassembleTcp(org.jnetpcap.packet.JPacket packet,
long sequence,
long ack_num,
long length,
byte[] data,
int dataLength,
boolean synflag)
throws java.lang.Exception
- Reassemble a fragmented tcp packet
- Parameters:
packet
- sequence
- ack_num
- length
- data
- dataLength
- synflag
-
- Throws:
java.lang.Exception
nextPacket
public void nextPacket(org.jnetpcap.packet.PcapPacket packet,
java.lang.Object arg1)
- Specified by:
nextPacket
in interface org.jnetpcap.packet.PcapPacketHandler<java.lang.Object>
isRunning
public boolean isRunning()
- Returns:
- the isRunning
setRunning
public void setRunning(boolean isRunning)
- Parameters:
isRunning
- the isRunning to set


-
1)
What are the 3Rs of successful job hunting?
For 1 Point(s)
-
2)
A profession is a specific position, and an industry is a particular field.
For 1 Point(s)
-
3)
It is important to conduct research during the job search.
For 1 Point(s)
-
4)
What is/are the best time(s) of day to reach an executive?
For 1 Point(s)
-
5)
It is not necessary to maintain detailed records of your job search communications.
For 1 Point(s)
-
6)
Most jobs inside a company are created because:
For 1 Point(s)
-
7)
Conducting a job search should be treated like a business.
For 1 Point(s)
-
8)
Conducting research is just an added bonus because it's really just a numbers game, and sending out lots of resumes should yield many interviews.
For 1 Point(s)
-
9)
Even after you have secured a position with a company, it's important to continue to update your research on your target companies.
For 1 Point(s)
-
10)
Your research can be used in which aspects of the career search?
For 1 Point(s)


Installing 55north SOS with tomcat7
2014-02-21
- Installed tomcat 7 using http://askubuntu.com/questions/339169/how-to-install tomcat-7-0-42-on-ubuntu-12-04-3-lts
- to find tomcat is running
followed by
http://stackoverflow.com/questions/3944157/is-tomcat-running
netstat -a | grep 8080
ps -ef | grep tomcat
both commands gives some bulge result and responses if it is working. - if it is not working the command used to start tomcat7 is from the installation page sudo $CATALINA_HOME/bin/startup.sh
- Installing the SOS war following tomcat manager and war file upload
- to upload the data into istsos used this command following all its installation documentation. python cmdimportcsv.py -s cocemsd -u http://<IP_ADDRESS>/istsos -p cocemsdlbm1 -w /home/fellow/D_GISE/dyloscbe -v


|
||||||||||
| PREV PACKAGE NEXT PACKAGE | FRAMES NO FRAMES |
| Interface Summary | |
| IEssCell | The IEssCell is the base for the member/data/text cell. |
| IEssCubeView | The IEssCubeView interface. |
| IEssDataCell | The IEssDataCell interface is a single cell of data. |
| IEssDrillThrough | The IEssDrillThrough is Hyperion Integration Server drill-through. |
| IEssDrillThroughReport | The IEssDrillThroughReport is Integration Server drill-through report. |
| IEssGridRange | The IEssGridRange interface is a range of grid cells. |
| IEssGridView | The IEssGridView is a grid view of the cube view. |
| IEssLinkedObject | The IEssLinkedObject interface. |
| IEssLinkedPartition | The IEssLinkedPartition is a linked partition. |
| IEssMdAxis | The IEssMdAxis interface. |
| IEssMdCluster | The IEssMdCluster interface. |
| IEssMdDataSet | The IEssMdDataSet interface. |
| IEssMdMember | The IEssMdMember interface. |
| IEssMemberCell | The IEssMemberCell is a member cell in a cube view. |
| IEssOpCalculate | The IEssOpCalculate interface. |
| IEssOpCascade | The IEssOpCascade interface. |
| IEssOperation | The IEssOperation is an operation performed on a cube view. |
| IEssOpKeepOnly | The IEssOpKeepOnly interface. |
| IEssOpLock | The IEssOpLock interface. |
| IEssOpMdxQuery | The IEssOpMdxQuery interface. |
| IEssOpPivot | The IEssOpPivot interface. |
| IEssOpRemoveOnly | The IEssOpRemoveOnly interface. |
| IEssOpReport | The IEssOpReport interface. |
| IEssOpRetrieve | The IEssOpRetrieve interface is a retrieve or conditional retrieve operation. |
| IEssOpUndo | The IEssOpUndo interface. |
| IEssOpUnlock | The IEssOpUnlock interface. |
| IEssOpUpdate | The IEssOpUpdate interface. |
| IEssOpZoomIn | The IEssOpZoomIn interface. |
| IEssOpZoomOut | The IEssOpZoomOut interface. |
| IEssURLDrillThrough | Interface representing URL Drill through. |
| Class Summary | |
| IEssCell.EEssCellType | The EEssCellType class is an enumeration of cell types. |
| IEssCubeView.EEssIndentStyle | The EEssIndentStyle is an enumeration of indent styles. |
| IEssCubeView.EEssQueryGrammar | The EEssQueryGrammar class is an enumeration of query language grammars. |
| IEssDataCell.EEssAccessMode | The EEssAccessMode is an enumeration of cell access modes. |
| IEssDataCell.EEssDataCellType | The EEssDataCellType class is an enumeration of cell value types. |
| IEssLinkedObject.EEssLinkedObjectType | The EEssLinkedObjectType is an enumeration of linked object types. |
| IEssOperation.EEssOperationType | The EEssOperationType class is an enumeration of operation types. |
| IEssOpMdxQuery.EEssMemberIdentifierType | The EEssMemberIdentifierType class is an enumeration of member identifier types. |
| IEssOpZoomIn.EEssZoomInPreference | The EEssZoomInPreference class is an enumeration of zoom in preferences. |
|
||||||||||
| PREV PACKAGE NEXT PACKAGE | FRAMES NO FRAMES |


FUS and the Screensaver
-
anonymous
Can WinSwitch be configured as my ScreenSaver? Instead of running a screensaver from my user account, I would like my user account to run the Fast User Switch. It would be great if the Login screen could run a screensaver when needed... Any ideas?
-
Greg Hurrell
Not sure exactly what you're asking for here.
Did you know that in the System Preferences (Security pane) you can set your computer to log out if left unattended for a certain while? (Admittedly this won't run a screen saver while the login screen is showing.)
In the same security pane you can instruct the system to ask you for a password when trying to leave the screen save. If you turn on Apple's Fast User Switching menu, then a "Switch Users" button will appear in that password dialog, allowing you to get back to the login screen. (Obviously, if you turn Apple's Fast User Switching menu on when WinSwitch is installed, you'll wind up with two menus. Quit the System Preferences and command-drag the Apple FUS menu out of the menu bar. The functionality of the "Switch Users" button will remain intact.)
As for actually displaying a screen saver over the login screen, that's beyond the scope of WinSwitch. You'll have to file a feedback request with Apple.
-
anonymous
No, I wasn't aware of that. This is very helpful.
Thanks!
Reply
This topic is now closed.


Statistical bulletins
Inflation and price indices statistical bulletins
10 results for statistical bulletins released to Inflation and price indices. You have chosen to expand these results to include all releases over time
Need an earlier release?
We moved them to The National Archives website, to keep this website as responsive as possible.
Please note: all historical data is still on this website.
-
Index of Private Housing Rental Prices: January to March 2015
Released: 21 March 2015
The Index of Private Housing Rental Prices (IPHRP) measures the change in price of renting residential property from private landlords.
-
House Price Index: February 2015
Released: 21 March 2015
The House Price Index (HPI), is a monthly release that publishes figures for mix-adjusted average house prices and house price indices for the UK, its component countries and regions.
-
Consumer Price Inflation: March 2015
Released: 21 March 2015
The Consumer Price Inflation is a monthly release that contains percentage changes and weights for the CPI, CPIH, RPI and RPIJ.
-
Producer Price Inflation: March 2015
Released: 21 March 2015
This statistical bulletin contains producer price indices of materials and fuels purchased and output of manufacturing.
-
House Price Index: February 2015
Released: 21 March 2015
The House Price Index (HPI), is a monthly release that publishes figures for mix-adjusted average house prices and house price indices for the UK, its component countries and regions.
-
Consumer Price Inflation: February 2015
Released: 21 March 2015
The Consumer Price Inflation is a monthly release that contains percentage changes and weights for the CPI, CPIH, RPI and RPIJ.
-
Producer Price Inflation: February 2015
Released: 21 March 2015
This statistical bulletin contains producer price indices of materials and fuels purchased and output of manufacturing.
-
Services Producer Price Indices: Quarter 4 2014
Released: 21 March 2015
The Services Producer Price Index (SPPI) provides a measure of inflation for the UK service sector.
-
Producer Price Inflation: January 2015
Released: 21 March 2015
This statistical bulletin contains producer price indices of materials and fuels purchased and output of manufacturing.
-
House Price Index: December 2014
Released: 21 March 2015
The House Price Index (HPI), is a monthly release that publishes figures for mix-adjusted average house prices and house price indices for the UK, its component countries and regions.


Toggle navigation
COMPANY
Personal Info Management
Dashboard
Actions
Create New Job
Compare Candidates
Process Request
Settings
Reload
Init DB
Delete DB
Interview Request
#
Job id
Application id and name
Requested time
Interview Waiting for confirmation of interviewer
#
Job id
Application id and name
Requested time
Employeed id and name
Cound not find any match for these candidates


Why am I seeing this page?
404 means the file is not found. If you have already uploaded the file then the name may be misspelled or it is in a different folder.
Other Possible Causes
You may get a 404 error for images because you have Hot Link Protection turned on and the domain is not on the list of authorized domains.
If you go to your temporary url (http://ip/~username/) and get this error, there maybe a problem with the rule set stored in an .htaccess file. You can try renaming that file to .htaccess-backup and refreshing the site to see if that resolves the issue.
It is also possible that you have inadvertently deleted your document root or the your account may need to be recreated. Either way, please contact HostGator immediately via phone or live chat so we can diagnose the problem.
Are you using WordPress? See the Section on 404 errors after clicking a link in WordPress.
How to find the correct spelling and folder
Missing or Broken Files
When you get a 404 error be sure to check the URL that you are attempting to use in your browser.This tells the server what resource it should attempt to request.
http://example.com/example/Example/help.html
In this example the file must be in public_html/example/Example/
Notice that the CaSe is important in this example. On platforms that enforce case-sensitivity example and Example are not the same locations.
For addon domains, the file must be in public_html/addondomain.com/example/Example/ and the names are case-sensitive.
Broken Image
When you have a missing image on your site you may see a box on your page with with a red X where the image is missing. Right click on the X and choose Properties. The properties will tell you the path and file name that cannot be found.
This varies by browser, if you do not see a box on your page with a red X try right clicking on the page, then select View Page Info, and goto the Media Tab.
http://example.com/images/banner.PNG
In this example the image file must be in public_html/images/
Notice that the CaSe is important in this example. On platforms that enforce case-sensitivity PNG and png are not the same locations.
404 Errors After Clicking WordPress Links
When working with WordPress, 404 Page Not Found errors can often occur when a new theme has been activated or when the rewrite rules in the .htaccess file have been altered.
When you encounter a 404 error in WordPress, you have two options for correcting it.
Option 1: Correct the Permalinks
- Log in to WordPress.
- From the left-hand navigation menu in WordPress, click Settings > Permalinks (Note the current setting. If you are using a custom structure, copy or save the custom structure somewhere.)
- Select Default.
- Click Save Settings.
- Change the settings back to the previous configuration (before you selected Default). Put the custom structure back if you had one.
- Click Save Settings.
This will reset the permalinks and fix the issue in many cases. If this doesn't work, you may need to edit your .htaccess file directly.
Option 2: Modify the .htaccess File
Add the following snippet of code to the top of your .htaccess file:
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule
^index.php$ - [L]
RewriteCond %{REQUEST_FILENAME}
!-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# End WordPress
If your blog is showing the wrong domain name in links, redirecting to another site, or is missing images and style, these are all usually related to the same problem: you have the wrong domain name configured in your WordPress blog.
How to modify your .htaccess file
The .htaccess file contains directives (instructions) that tell the server how to behave in certain scenarios and directly affect how your website functions.
Redirects and rewriting URLs are two very common directives found in a .htaccess file, and many scripts such as WordPress, Drupal, Joomla and Magento add directives to the .htaccess so those scripts can function.
It is possible that you may need to edit the .htaccess file at some point, for various reasons.This section covers how to edit the file in cPanel, but not what may need to be changed.(You may need to consult other articles and resources for that information.)
There are Many Ways to Edit a .htaccess File
- Edit the file on your computer and upload it to the server via FTP
- Use an FTP program's Edit Mode
- Use SSH and a text editor
- Use the File Manager in cPanel
The easiest way to edit a .htaccess file for most people is through the File Manager in cPanel.
How to Edit .htaccess files in cPanel's File Manager
Before you do anything, it is suggested that you backup your website so that you can revert back to a previous version if something goes wrong.
Open the File Manager
- Log into cPanel.
- In the Files section, click on the File Manager icon.
- Check the box for Document Root for and select the domain name you wish to access from the drop-down menu.
- Make sure Show Hidden Files (dotfiles)" is checked.
- Click Go. The File Manager will open in a new tab or window.
- Look for the .htaccess file in the list of files. You may need to scroll to find it.
To Edit the .htaccess File
- Right click on the .htaccess file and click Code Edit from the menu. Alternatively, you can click on the icon for the .htaccess file and then click on the Code Editor icon at the top of the page.
- A dialogue box may appear asking you about encoding. Just click Edit to continue. The editor will open in a new window.
- Edit the file as needed.
- Click Save Changes in the upper right hand corner when done. The changes will be saved.
- Test your website to make sure your changes were successfully saved. If not, correct the error or revert back to the previous version until your site works again.
- Once complete, you can click Close to close the File Manager window.


%inherit file="/base.mako" />
<%def name="title()">Downloads - Pokédex%def>
<%def name="title_in_page()">
%def>
You can use anything on this page however you want. Nintendo made these, not me, so I don't claim to own them in any way. If you want to credit me for collecting or ripping them, that's cool; if not, that's cool too. Enjoy.
## TODO: It would be a good idea to stick these sizes in dynamically.
${h.h1('Sprite packs')}
These are tarballs of all the sprites from each generation. If your zip program can't open them, try 7-zip.
${h.h2(u'Main Pokémon sprites')}
-
Generation I (700KB)
— all sprites from Green, Red, Blue, and Yellow
-
Generation II (2.3MB)
— all sprites from Gold, Silver, and Crystal (including animations)
-
Generation III (9.4MB)
— all sprites from Ruby, Sapphire, Emerald (including animations), FireRed, and LeafGreen
-
Generation IV (14MB)
— all sprites from Diamond, Pearl, Platinum, HeartGold, and SoulSilver
${h.h2('Others')}
${h.h1('Main sprite montages')}
Every Pokémon combined into a single large image by the montage
program.
- ${h.pokedex.version_icons(u'赤い', u'緑')}
-
Game Boy (60KB);
Super Game Boy (79KB)
- ${h.pokedex.version_icons(u'Red', u'Blue')}
-
Game Boy (58KB);
Super Game Boy (77KB)
- ${h.pokedex.version_icons(u'Yellow')}
-
Game Boy (57KB);
Super Game Boy (76KB);
Game Boy Color (76KB)
- ${h.pokedex.generation_icon(1)} back
-
Game Boy (19KB);
${h.pokedex.version_icons(u'赤い', u'緑', u'Red', u'Blue')}
Super Game Boy (26KB);
${h.pokedex.version_icons(u'Yellow')}
Super Game Boy (26KB);
${h.pokedex.version_icons(u'Yellow')}
Game Boy Color (26KB)
- ${h.pokedex.version_icons(u'Gold')}
-
normal (154KB);
shiny (155KB)
- ${h.pokedex.version_icons(u'Silver')}
-
normal (155KB);
shiny (156KB)
- ${h.pokedex.version_icons(u'Crystal')}
-
normal (155KB);
shiny (156KB)
- ${h.pokedex.version_icons(u'Gold', u'Silver')} back
-
normal (116KB);
shiny (117KB)
- ${h.pokedex.version_icons(u'Crystal')} back
-
normal (116KB);
shiny (117KB)
- ${h.pokedex.generation_icon(3)}
-
normal (363KB);
shiny (366KB)
- ${h.pokedex.version_icons(u'Emerald')}
-
frame 2 (356KB);
frame 2 shiny (358KB)
- ${h.pokedex.version_icons(u'FireRed', u'LeafGreen')}
-
${h.pokedex.generation_icon(1)} normal (144KB);
${h.pokedex.generation_icon(1)} shiny (143KB)
- ${h.pokedex.generation_icon(3)} back
-
normal (297KB);
shiny (299KB)
- ${h.pokedex.version_icons(u'FireRed', u'LeafGreen')} back
-
${h.pokedex.generation_icon(1)} normal (118KB);
${h.pokedex.generation_icon(1)} shiny (118KB)
- ${h.pokedex.version_icons(u'Diamond', u'Pearl')}
-
normal (537KB);
shiny (537KB);
frame 2 (524KB);
shiny frame 2 (524KB)
- ${h.pokedex.version_icons(u'Platinum')}
-
normal (535KB);
shiny (535KB);
frame 2 (523KB);
shiny frame 2 (524KB)
- ${h.pokedex.version_icons(u'HeartGold', u'SoulSilver')}
-
normal (531KB);
shiny (531KB);
frame 2 (518KB);
shiny frame 2 (518KB)
- ${h.pokedex.version_icons(u'Diamond', u'Pearl')} back
-
normal (495KB);
shiny (496KB)
- ${h.pokedex.version_icons(u'Platinum')} back
-
normal (495KB);
shiny (496KB);
frame 2 (496KB);
shiny frame 2 (497KB)
- ${h.pokedex.version_icons(u'HeartGold', u'SoulSilver')} back
-
normal (496KB);
shiny (496KB);
frame 2 (500KB);
shiny frame 2 (500KB)
- ${h.pokedex.generation_icon(4)} ♂ vs ♀
-
${h.pokedex.version_icons(u'Diamond', u'Pearl')} front (606KB);
${h.pokedex.version_icons(u'Platinum')} front (602KB);
${h.pokedex.version_icons(u'HeartGold', u'SoulSilver')} front (597KB)
${h.pokedex.version_icons(u'Diamond', u'Pearl')} back (565KB);
${h.pokedex.version_icons(u'Platinum')} back (561KB);
${h.pokedex.version_icons(u'HeartGold', u'SoulSilver')} back (561KB)
${h.h1('Other montages')}
${h.h1('Other files')}


Facepile Demo
Dynamic lists (by "query")
query: "childrenof:http://aboutecho.com/* itemsPerPage:N children:0"
name and avatar
itemsPerPage = 2, with suffixText
only name
itemsPerPage = 3
only avatar
itemsPerPage = 6
Static lists (by "data")
name and avatar
itemsPerPage = 2, initialUsersCount = 5, with suffixText
only name
itemsPerPage = 3, totalUsersCount = 100
only avatar
itemsPerPage = 6


Welcome to WinterIsComing. Theme designed for harsh winter conditions and tough Front-End warriors.
Features
- Based on Bootstrap 4 framework
- Responsive design
- Cross-browser compatibility
- Adjustable counters
- Modal based Sign-up form
- Validated and well-described code
Credits
- Images - Pexels.com
- Font - Google Fonts
- Icons - Font Awesome 5.0
- Animation - Animate.CSS
Enjoy!


CREDITS
Gun - https://kenney.nl/
Tree - https://kenney.nl/
LightPost - https://kenney.nl/
EnvironmentIdea - Taken from Nik Levers three.js course on Udemy
FactorySounds - elemnts.envato.com
PortalIdea - RedStapler three.js course
RainIdea - CodePen.io three.js course
GuGunShotSoundn - elements.envato.com
Game Developers:
Calvin Muchemwa
Pephins Moyo(14)
Rotondwa Mavhengani
Themba Xaba


sbt
Build tool for Scala and Java projects.
More information: home page
- Start a REPL (interactive shell):
sbt
- Create a new Scala project from an existing Giter8 template hosted on GitHub:
sbt new scala/hello-world.g8
- Compile and run all tests:
sbt test
- Delete all generated files in the `target` directory:
sbt clean
- Compile the main sources in `src/main/scala` and `src/main/java` directories:
sbt compile
- Use the specified version of sbt:
sbt -sbt-version version
- Use a specific jar file as the sbt launcher:
sbt -sbt-jar path
- List all sbt options:
sbt -h


The Budding Lotus
In the land of the rising sun where nature abounds and flourishes freely. Far far away at the tip of the African continent in a land rich with diversity and beauty, jungles rich and filled with all life and wonder from the miniature ant to the mighty elephant and towering giraffes.
There lived a family of three, remote and cut off from society. They lived on a conical mountain encircled by a river and clothed in lush green indigenous forestry. Running wild amidst the tall green leafy trees was a young 8-year-old boy, barefoot and covered in mud, with grass and forest matter all tangled on his little Afro. All that covered his tiny body was a callus loin cloth made of cow skin. As he frantically wondered, lost in the maze of nature as if on a quest for lost treasures he looks around
I found it mom, I found it; it was the voice that was approaching the edge of the forest. Safe in its saviour's arms the lamb leaped off upon seeing the sun and the mountain it called home. Along the sloped mountain the lamb found it bleating mother separate from the massive grazing flock that painted the hill white.
Mom I’m here, I’m fine said the young one as he also made a run for his mom.  The boy is hugged as if he just emerged from the dead, Seth my child you know how your father and I feel about you playing far from the house. Seth with his little head dropped; I am sorry mom, I had to help that lamb get back to its mother. It's fine my son you are just like your father, I’m just happy that you are fine, come it's time for dinner.
On a rocking chair looking down a hill filled with grazing domestic flocks and herds of all sorts was a grey headed and heavily bearded old man. From cattle, to sheep, goats, horses, and even donkeys they all populated the slope even down to the river. While around the house and the yard was a multitude of poultry from ducks coming for a landing, to turkeys, geese and chicken all with trains of young ones tailing not so far.
To be continued...
Listen To Our Audio


tmux
tags: linuxtmux is the best thing ever. That is all.
No, that is not all. Here is how I make use of tmux to make my life measurably more awesome:
First, my .tmux.conf
. This changes tmux’s ctrl-b
magic key binding to ctrl-a
as I’ve grown far too used to hitting that from when I used screen. I set up a few other screen-like bindings too. Finally, I set a few options that make tmux work better with urxvt.
And then here’s what I have near the top of my .bashrc
:
…which goes with this, the contents of ~/bin/tmux
:
Basically, what happens is that whenever I start a terminal session, if I’m not already attached to a tmux session, I find a session that’s not already attached to and attach to it. If there aren’t any, I create a new one.
This really tidies up my workflow and means that I never forget about any old sessions I’d detached.
Oh and one last thing, ctrl-a s
is the best thing in tmux ever. It shows a list of tmux sessions which can be expanded to show what’s running in them and you can then interactively re-attach your terminal to one of them. In short, I can start a terminal from any desktop or vt and quickly attach to something that’s happening on any other. I use this feature a lot.


{% extends 'base.html' %} {% import 'bootstrap/wtf.html' as wtf %} {% block content %}
{{comment.pitch.title}}
{{comment.comment}}
{{comment.user.name}}
No comments yet for this pitch post


:sparkles: DBX
- DB connections manager
- Query builder
- ORM (alpha)
DBX is a Crystal lang module to query the database, built on top of crystal-db (common API for DB drivers).
DBX is designed in a decoupled way to embed only the necessary features (multi-connections manager, query builder, query executor and ORM).
Documentation
- 🚀 Guide
- 📘 API doc
- :bookmark_tabs: Spec tests
Contributing
- Fork it (<https://github.com/Nicolab/crystal-dbx/fork>).
- Create your feature branch (
git checkout -b my-new-feature
). - See Development.
- Commit your changes (
git commit -am 'Add some feature'
). - Push to the branch (
git push origin my-new-feature
). - Create a new Pull Request.
Development
- You only need Git, Docker and Docker-compose installed on your machine.
- Clone this repo and run
./scripts/prepare
. - Run first
docker-compose up
, - then enter to container
docker-compose exec test_pg bash
(ortest_sqlite
service), - into the container
just dev-spec
. - Check the project before committing or pushing, from the host:
./scripts/check
It's just Docker and docker-compose, you can directly type all the commands Docker and docker-compose.
✨ Example:
Terminal 1
# Start the dev stack
docker-compose up
Terminal 2
# enter in the test_pg container
docker-compose exec test_pg bash
# then in the test_pg container
crystal run ./src/app.cr
# or with a recipe (helper)
just dev-spec # <= auto reload when the code change
# recipe list
just --list
Also, quickly:
docker-compose run --rm test_pg crystal spec
- or
docker-compose run --rm test_pg just dev-spec
- when you are done:
docker-compose down --remove-orphans
LICENSE
MIT (c) 2020, Nicolas Talle.
Author
- Nicolas Talle (@Nicolab) - Creator and maintainer.
- Thanks to @ilourt for the feedbacks and thoughts.
- This project is useful to you? Sponsor the developer.


Rooms & Rents
163 beautiful appointed rooms, including terrace rooms with private outdoor terrace, suites, apresidential suite, 2 exclusive floors of plaza Club rooms with club lounge.
- Luxurious rooms each with full minibar, in room safe deposit locker, hair dryer, coffee/tea making facilities, iron and ironing board and more
- International direct dialing
- Full Independent air-conditioning in all rooms
- Satellite television including international cable channels
- All rooms with data ports
- Plaza club rooms for the discerning travelers
- Plaza club offers exclusive floors with separate check-in and check-out, happy hour in the lounge, snacks all day


|
|||||||||
| PREV PACKAGE NEXT PACKAGE | FRAMES NO FRAMES |
| Interface Summary | |
|---|---|
| ExternalSubjectAttributeStorable | interface to implement to keep external subjects somewhere besides in the Grouper DB |
| ExternalSubjectStorable | implement this to change how external subjects are stored |
| Class Summary | |
|---|---|
| ExternalSubject | database object for external subject |
| ExternalSubjectAttrFramework | data and logic about attributes for external subjects |
| ExternalSubjectAttribute | attribute on an external subject, configured in the grouper.properties |
| ExternalSubjectAttributeDbStorage | Grouper built in storage for external subject attributes |
| ExternalSubjectAttributeStorageController | |
| ExternalSubjectAutoSourceAdapter | if we are auto creating the source, then this is the class based on the view |
| ExternalSubjectConfig | wrapper around config info for external subjects |
| ExternalSubjectConfig.ExternalSubjectAttributeConfigBean | attributes configured |
| ExternalSubjectConfig.ExternalSubjectAutoaddBean | //#add multiple group assignment actions by URL param: externalSubjectInviteName //externalSubject.autoadd.testingLibrary.externalSubjectInviteName=library //#comma separated groups to add for this type of invite //externalSubject.autoadd.testingLibrary.groups= //#should be insert, update, or insert,update //externalSubject.autoadd.testingLibrary.actions=insert,update //#should be insert, update, or insert,update //externalSubject.autoadd.testingLibrary.expireAfterDays= cache the auto add config |
| ExternalSubjectConfig.ExternalSubjectConfigBean | cache the config stuff |
| ExternalSubjectDbStorage | |
| ExternalSubjectInviteBean | bean to hold invite |
| ExternalSubjectStorageController | this finds the storable implementation and calls methods |
|
|||||||||
| PREV PACKAGE NEXT PACKAGE | FRAMES NO FRAMES |