{ "info": { "author": "Nicolas H\u00f6ning", "author_email": "iam@nicolashoening.de", "bugtrack_url": null, "classifiers": [ "Development Status :: 4 - Beta", "Environment :: Console", "Intended Audience :: Developers", "License :: OSI Approved :: Apache Software License", "Natural Language :: English", "Operating System :: POSIX", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3.3", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: System :: Distributed Computing", "Topic :: Utilities" ], "description": "fjd\n===\n\n``fjd`` makes it easy to run computational jobs on many CPUs.\n\nThere are several powerful tools for dispatching dynamic lists of computational jobs to multiple, possibly distributed CPUs. However, for simple use cases, the effort of installation and setup is often too high.\n\nWith ``fjd``, the hurdle to get started is very low. Installation is easy. Pushing jobs into the queue only requires to put an executable script in a directory. Per default, all CPUs on your computer are used. Other computers can be used very easily, as well. Plus, your jobs can be written in any language.\n\n\n\nUsage\n-------\n\nYou can call ``fjd`` directly::\n\n $ fjd --exe \"mktemp XXX.tmp\" --repeat 5\n\nThis simple example creates five temporary files with random names. Each of the five jobs will be done on a different CPU (if you have that many).\n\nYou can also supply a list with parameters::\n\n $ fjd --exe 'touch bla$1.txt' --parameters 1,2,3,4\n\nThis will create four files: ``bla1.txt, bla2.txt, bla3.txt, bla4.txt``.\nHere, ``fjd`` will select by itself how many CPUs on your machine it should use.\nNote that if you use the placeholder ``$1``, use single quotes around the ``--exe`` command.\n\nTo use several computers, you can configure a number of hosts in your network and how many CPUs should be \nrunning on each (see an example of this below).\n\nFor illustration, here is the session output from the first example::\n\n $ fjd --exe \"mktemp XXX.tmp\" --repeat 5\n [fjd-recruiter] Hired 5 workers in project \"default\".\n [fjd-dispatcher] Started on project \"default\".\n [fjd-dispatcher] Job queue is empty and all jobs have finished. \n [fjd-recruiter] Fired 5 worker(s) in project \"default\".\n\n\n\nAdvanced usage\n-----------------\n\n``fjd`` can also be controlled in more detail.\n\nMost importantly, you can write an executable bash script for each job and put it in the queue. You have total freedom what each job is doing and when you put it in the queue. In the usual case your queue directory is ``~/.fjd/default/jobqueue`` (where ``default`` could be changed to a specific project name). Another option is to describe a job as a configuration file. We'll have an example below.\n\nThen, you can start one or more ``fjd-worker`` threads, like this::\n\n $ fjd-recruiter hire []\n\nPer default, this starts n-1 worker threads, where n is the number of CPUs on your machine. \n\nFinally, start a dispatcher::\n\n $ fjd-dispatcher\n\nNow the ``fjd-dispatcher`` assigns jobs to ``fjd-worker`` threads who are currently not busy, until the job queue is empty.\n\nYou can cancel the ``fjd-dispatcher`` process at any time (i.e. hit CTRL-C) and it will ask you if workers should be fired or not.\nBy the way, if screen sessions are running and you want them to stop,\nthen you can always fire workers by hand::\n\n $ fjd-recruiter fire\n\nor, to fire only the ones running one specific project (more on that option below)::\n\n $ fjd-recruiter --project fire\n\nIf you start a new dispatcher, it will first clean up (\"fire\") old screen sessions.\n\n\n\nInstallation\n-------------\n\nFirst, you need to have python 2.7, which the default python on almost all systems these days (note: python 3.x support is not there yet, but close; see issue #10 on github). Then::\n\n $ pip install fjd\n\nIf you do not have enough privileges (look for something like \"Permission denied\" in the output), install locally (for your user account only)::\n\n $ pip install fjd --user\n\nIf you do not have ``pip`` installed (I can't wait for everyone running Python 3.4), I made a `small script `_, which should help to install all needed things. Download it and make it executable::\n\n $ wget https://raw.github.com/nhoening/fjd/master/fjd/scripts/INSTALL\n $ chmod +x INSTALL\n\nNow you can install system-wide::\n\n $ ./INSTALL\n\nor, if you do not have root privileges, you can also install locally::\n\n $ source INSTALL --user\n\n**Note** - If you installed locally, this should be added to your ``~/.bashrc`` or ``~/.profile`` file::\n\n export PATH=~/.local/bin:$PATH\n\n**Note** - Installing locally could be the better choice, actually, because it might save you\nfrom installing ``fjd`` on each machine you want to use.\nIf they all share the home directory, they will all know about ``fjd`` once you are logged in. \n\n\n\nUsing several machines in your network\n----------------------------------------------------------\n\nWe can tell ``fjd`` about other machines in the network and how many workers we'd like\nto employ on them. To do that, we place a file called ``remote.conf`` in the project's\ndirectory. Here is an example::\n\n [host1]\n name: localhost\n workers: 3\n\n [host2]\n name: hyuga.sen.cwi.nl\n workers: 5\n\nThere is an `advanced example `_\nin the github repo which you can run and inspect. Use the scripts ``run-example.sh`` or \n``run-remote-example.sh`` to execute.\n\n**Note** - ``fjd`` works under the assumption that all CPUs are in a local network and can access a shared home directory.\n\n**Note** - If you normally have to type in a password to login to a remote machine via SSH,\nyou'll have to do this here, as well. You can configure passwordless login by\nputting a public key in ~/.ssh/authorized_keys. For the shared-home directory \nsetting we use ``fjd`` for, this makes a lot of sense, as you stay within your LAN anyway.\nIn general, some SSH configuration can go a long way to ease your life,\ne.g. by connection sharing through the ControlAuto option. Search the web or ask your local IT guy.\n\n\n\nInspecting the workers\n-------------------------\n\nWorkers are Unix screen sessions, you can see them by typing::\n\n $ screen -ls\n\nand inspect them if you want. As attaching to screen sessions is cumbersome\nand ``fjd`` can also close them before you have a chance to see what went wrong\n(this is an option you can set, see next example below),\n``fjd`` logs screen output to ``~/.fjd//screenlogs`` (each worker has\nits own log file).\n\nHere is an example log from a screen session of a worker::\n\n $ fjd-worker --project default\n [fjd-worker] Started with ID nics-macbook.fritz.box_1382522062.31.\n [fjd-worker] Worker nics-macbook.fritz.box_1382522062.31: I found a job.\n [fjd-worker] Worker nics-macbook.fritz.box_1382522062.31: Finished my job.\n [fjd-worker] Worker nics-macbook.fritz.box_1382522062.31: I found a job.\n [fjd-worker] Worker nics-macbook.fritz.box_1382522062.31: Finished my job.\n\n\n\nRunning several projects\n-----------------------------------\n\nNormally, the project directory is ``~/.fjd/default``. But you can tell ``fjd``\nto use a different project identifier (this way, you could have several projects\nrunning without them getting into each other's way, i.e. stopping one project \nwouldn't stop the workers of the other and you wouldn't override the first project \nif you start another). \n\nFor instance, you'd recruite workers and dispatch jobs with the ``--project`` parameter::\n\n $ fjd-recruiter --project remote-example hire\n $ fjd-dispatcher --project remote-example\n\nOr, if you call ``fjd`` from code::\n\n recruiter = Recruiter(project=project)\n recruiter.hire()\n Dispatcher(project=project)\n\n\n\nJobs as configuration files\n----------------------------------\n\nWhen a job is heavily parameterised, a bash script might not be convenient. I sometimes prefer a configuration file in such cases.\nIn this case, a job file should adhere to the general `INI-file standard `_.\nYou can write in there what you want - ``fjd`` only has one requirement. Add a ``fjd`` section, and specify which\ncommand to execute. Here is an example::\n\n [fjd]\n executable: python example/ajob.py\n\n [params]\n logfile: logfiles/job0.dat \n my_param: value0\n\nYour executable script gets this configuration file passed as a command line argument, so this would be called on the shell::\n\n python example/ajob.py \n\nIn addition, you can put other job-specific configuration in there for the executable\nto see, as I did here in the ``[params]``-section (I repeat: only the ``[fjd]``-section\nis required by ``fjd``).\n\nTake care to get relative paths correct (or simply make them absolute):\nIf paths are relative, they should be relative to the directory in which you\nstart the ``fjd-dispatcher``.\n\nThe `advanced example `_ also shows how this works.\nYou can use the script ``run-config-example.sh`` to run it.\n\n\n\nFAQ\n------------------------------------\n\nI know an existing simple tool with comparable features: `Gnu Parallel `_. How do you position ``fjd`` with respect to that?\n First off, Gnu Parallel is an awesome tool and very powerful. I found out about it just recently. It fits into the Unix workflow perfectly and you can do almost anything with it, if you're knowledgeable on the Unix command line (for instance if you use ``xargs`` a lot, you can become productive in Gnu parallel quickly). ``fjd`` delivers several functionalities that Gnu parallel delivers, but not all of them. I'd say there are three small aspects which are different in ``fjd`` - First, ``fjd`` is more explicit about worker processes (they are Unix screen sessions, which you can join live, but they also have their own log files each). Second, ``fjd`` lives in the Python ecosystem (which means you can edit it easier if you prefer Python over Perl and depend on it in Python programs you write). Third, jobs with many parameters can parametrised in config files, which I feel is quite convenient sometimes.\n In addition, ``fjd`` has one interesting feature to offer: the queue of jobs can be sorted on the fly, which can be useful for some use cases where it is important to always perform the job first which is most likely to lead to positive outcomes (e.g. in an optimisation context). \n \nCan I pass more than one parameter per job with the ``--parameters`` option?\n Yes. Separate items in lists per job with ``#``, e.g. ``--parameters \"'--my_param#1'\"`` or ``--exe 'cp $1 $2' --parameters \"a.txt#bckp/a.txt,b.txt#bckp/b.txt\"``.\n If your ``--exe`` parameter contains the $-index (e.g. ``--exe 'echo $1' --parameters 'Hello!,Bye!'``), then the parameter will replace it (i.e. ``$1`` becomes ``Hello!`` for one job and ``Bye!`` for the second.\n\nHow would I use ``fjd`` on a computation cluster?\n I use ``fjd`` to great effect on a PBS cluster (a system many of them use). The computation nodes on this system all have access to a shread home directory, so ``fjd`` can work well there. All I do is fill the job queue and for each computation node I order, I issue a ``fjd-recruiter hire X`` command, where ``X`` is the number of cores that node has.\n For illustration, I have `an example script `_, which I use to run >600K small jobs (In order to run a brute-force benchmark). \n\nHow does ``fjd`` work, in a nutshell?\n Small files in your home directory are used to indicate which jobs have to be done (these are created by you) and which workers are available (these are created automatically). Files are also used by ``fjd`` to assign workers to jobs.\n\n This simple file-based approach makes ``fjd`` very easy to use.\n\n For CPUs from several machines to work on your job queue, we make one necessary assumption: We assume that there is a shared home directory for logged-in users, which all machines can access. This setting is very common now in universities and companies.\n\n A little bit more detail about the ``fjd`` internals: \n The ``fjd-recruiter`` creates worker threads on one or more machines (a worker thread is a Unix screen session, which remains even if you log out).\n The ``fjd-worker`` processes announce themselves in the ``workerqueue`` directory. The ``fjd-dispatcher`` finds your jobs in the ``jobqueue`` directory and pairs a job with an available worker.\n It then removes those entries from the ``jobqueue`` and ``workerqueue`` directories and creates a new entry in ``jobpods``, where workers will pick up their assignments.\n\n Then, the dispatcher calls your executable script and passes the file that describes the job to it as parameter on the shell.\n Your script simply has to read the job file and act accordingly.\n\n All of these directories mentioned above exist in ``~/.fjd`` and will of course be created if they do not yet exist.", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://github.com/nhoening/fjd/", "keywords": null, "license": "Apache Software License", "maintainer": null, "maintainer_email": null, "name": "fjd", "package_url": "https://pypi.org/project/fjd/", "platform": "Unix", "project_url": "https://pypi.org/project/fjd/", "project_urls": { "Download": "UNKNOWN", "Homepage": "http://github.com/nhoening/fjd/" }, "release_url": "https://pypi.org/project/fjd/0.1.58/", "requires_dist": null, "requires_python": null, "summary": "Job distribution for everyone", "version": "0.1.58" }, "last_serial": 1120447, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "04cef3d6157dab8b3532c349b81a6e51", "sha256": "e539d699542d7567dc905f53969723bd2f0ae7b5d84da2de54c0ad7a78f33e8a" }, "downloads": -1, "filename": "fjd-0.1.tar.gz", "has_sig": false, "md5_digest": "04cef3d6157dab8b3532c349b81a6e51", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6053, "upload_time": "2013-10-16T10:24:09", "url": "https://files.pythonhosted.org/packages/86/55/d6a7e6ba66552c4589de58428e4e7d1b4ccd728e57694b889e416e208d6d/fjd-0.1.tar.gz" } ], "0.1.1": [ { "comment_text": "", "digests": { "md5": "689c14abfa0d86205d9369a5d4c0fcc5", "sha256": "d154628044abe3f1d34484b27955270b92aaaed50bc8f8c32e2bcf4ea1c19748" }, "downloads": -1, "filename": "fjd-0.1.1.tar.gz", "has_sig": false, "md5_digest": "689c14abfa0d86205d9369a5d4c0fcc5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6040, "upload_time": "2013-10-16T10:34:08", "url": "https://files.pythonhosted.org/packages/6d/d5/33fbe0627d356719613e9fb4fb20441e99286071eb4ec17e8339404f6975/fjd-0.1.1.tar.gz" } ], "0.1.10": [ { "comment_text": "", "digests": { "md5": "699b3ac7631fc291c04c1d95387d7152", "sha256": "afe566d5cc58ec095e603b33039accbf73d1dca9b8046f44e827d65defd8a4a7" }, "downloads": -1, "filename": "fjd-0.1.10.tar.gz", "has_sig": false, "md5_digest": "699b3ac7631fc291c04c1d95387d7152", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8005, "upload_time": "2013-10-23T10:09:54", "url": "https://files.pythonhosted.org/packages/fc/10/04531447250d038ef8e36efd4c411ad5891fa61808e63fb5d8885f0954a5/fjd-0.1.10.tar.gz" } ], "0.1.11": [ { "comment_text": "", "digests": { "md5": "203f961dcd079f144e31c2ad3b1e8273", "sha256": "4f03b9ee22a9235f0cfbdf3ff219d81784eba55301da3ca4e0366f49c1c8e5cb" }, "downloads": -1, "filename": "fjd-0.1.11.tar.gz", "has_sig": false, "md5_digest": "203f961dcd079f144e31c2ad3b1e8273", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8007, "upload_time": "2013-10-23T10:12:40", "url": "https://files.pythonhosted.org/packages/f6/9f/5adc073654d144d0c407b2e56ab5722911c2d6b60798270c01a257ee9891/fjd-0.1.11.tar.gz" } ], "0.1.12": [ { "comment_text": "", "digests": { "md5": "ae32fd94a17767c2be302764183d2307", "sha256": "ad21a0b9b18bbb54af71f0b64ddeea5f6c3552a1c0b2561bdee3ea095d189a55" }, "downloads": -1, "filename": "fjd-0.1.12.tar.gz", "has_sig": false, "md5_digest": "ae32fd94a17767c2be302764183d2307", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8002, "upload_time": "2013-10-23T10:13:49", "url": "https://files.pythonhosted.org/packages/c9/e3/06ccdba983169ef4af3a9ac1b1a5051cef2bc201a441de37edba34d36a0a/fjd-0.1.12.tar.gz" } ], "0.1.13": [ { "comment_text": "", "digests": { "md5": "965e5034780f0b03ce53cb572532100a", "sha256": "d03549876c82e961a498621ef11447bb593018c0038c7b0108f3553938a4c23d" }, "downloads": -1, "filename": "fjd-0.1.13.tar.gz", "has_sig": false, "md5_digest": "965e5034780f0b03ce53cb572532100a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8439, "upload_time": "2013-10-23T10:22:13", "url": "https://files.pythonhosted.org/packages/a7/a7/a02500aab58a15b5c10634b21420e18497335a5b57f4e0272e2d9900a063/fjd-0.1.13.tar.gz" } ], "0.1.14": [ { "comment_text": "", "digests": { "md5": "78d34c85b0a41c01e5c9b9cceb8fc1dd", "sha256": "585557125d60669f9d477eedb5a17742f3e0c5afc046172e64753ccf2afbf306" }, "downloads": -1, "filename": "fjd-0.1.14.tar.gz", "has_sig": false, "md5_digest": "78d34c85b0a41c01e5c9b9cceb8fc1dd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8161, "upload_time": "2013-10-25T09:07:28", "url": "https://files.pythonhosted.org/packages/ee/c2/1d2c02e868e5537eb06ddae506351f9f609c6a2ecbd8e90f3fc0c2a8366f/fjd-0.1.14.tar.gz" } ], "0.1.15": [ { "comment_text": "", "digests": { "md5": "3175784f8d7452ac1227341e69b8442e", "sha256": "d174f5a93ff661043521db02c2c5e0800b208a3d916d1c1494359dd4ffea78f4" }, "downloads": -1, "filename": "fjd-0.1.15.tar.gz", "has_sig": false, "md5_digest": "3175784f8d7452ac1227341e69b8442e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8578, "upload_time": "2013-10-25T09:56:50", "url": "https://files.pythonhosted.org/packages/24/fe/e1da9784e30aaea87bf4ffa50517566576c6fac8aa082f9f7cfad208b1bf/fjd-0.1.15.tar.gz" } ], "0.1.16": [ { "comment_text": "", "digests": { "md5": "799616190b4a1dcc5fa5e5f4e2908484", "sha256": "5b5a74176cbc6c296333a895490c61256d35b1c371dc5c23a3670b3d22b686bc" }, "downloads": -1, "filename": "fjd-0.1.16.tar.gz", "has_sig": false, "md5_digest": "799616190b4a1dcc5fa5e5f4e2908484", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9003, "upload_time": "2013-10-25T10:04:15", "url": "https://files.pythonhosted.org/packages/8f/7a/f79e51cc8905ae1d6cf918ce8ea595d249e3cf0c81d031cb708048fd0910/fjd-0.1.16.tar.gz" } ], "0.1.17": [ { "comment_text": "", "digests": { "md5": "9b8db48c807d23046631f4227380413f", "sha256": "8dc365bf723929fb5f7afdea1ce7623197eb6bcb50612ff1bfca222a49a87a48" }, "downloads": -1, "filename": "fjd-0.1.17.tar.gz", "has_sig": false, "md5_digest": "9b8db48c807d23046631f4227380413f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8991, "upload_time": "2013-10-25T10:06:36", "url": "https://files.pythonhosted.org/packages/fc/5d/8bc5ef190f514303355d2bf5ddebd94b4f577cec3f83822aa0f3667c3819/fjd-0.1.17.tar.gz" } ], "0.1.18": [ { "comment_text": "", "digests": { "md5": "f0f7804fad7d14d254c816b9c4ec8b6b", "sha256": "6faa36e4bcb080e126b4cec18da49a91c70d17a6b64d6834a78abf268137d81f" }, "downloads": -1, "filename": "fjd-0.1.18.tar.gz", "has_sig": false, "md5_digest": "f0f7804fad7d14d254c816b9c4ec8b6b", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9010, "upload_time": "2013-10-25T10:14:59", "url": "https://files.pythonhosted.org/packages/ed/05/a863a991b9b954fd331a613c48ae14b10fe59c4e640331a15072482c7911/fjd-0.1.18.tar.gz" } ], "0.1.2": [ { "comment_text": "", "digests": { "md5": "20b8a4ae48bd297cf720a099eaf7de8c", "sha256": "9825a86f4406fc8d36f7d8bdecf5c3d661c06255857c22c6216be5459025c8b9" }, "downloads": -1, "filename": "fjd-0.1.2.tar.gz", "has_sig": false, "md5_digest": "20b8a4ae48bd297cf720a099eaf7de8c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6366, "upload_time": "2013-10-16T15:46:46", "url": "https://files.pythonhosted.org/packages/c8/71/97a78e52f84886660a832fb616a95667d8dbaab7300eddf6285819281f1a/fjd-0.1.2.tar.gz" } ], "0.1.20": [ { "comment_text": "", "digests": { "md5": "1d7e7ab6143b114ae5f367ef7ef3c580", "sha256": "271c5ce3133fff44b29cafecc80ba98964a1439bf1a0f0d4ace6810825f9d8b3" }, "downloads": -1, "filename": "fjd-0.1.20.tar.gz", "has_sig": false, "md5_digest": "1d7e7ab6143b114ae5f367ef7ef3c580", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10320, "upload_time": "2013-10-26T14:34:50", "url": "https://files.pythonhosted.org/packages/a2/71/44dfc004abc80c4f7593a760b679078d41fda5c5acf4bb41de169eabe3fd/fjd-0.1.20.tar.gz" } ], "0.1.21": [ { "comment_text": "", "digests": { "md5": "21c8d4e025eb18b9aebf87b60988d277", "sha256": "43ad375ab7827addafe3adcc327c48cd14281d57bbcf0beb1290f1c2f62afc34" }, "downloads": -1, "filename": "fjd-0.1.21.tar.gz", "has_sig": false, "md5_digest": "21c8d4e025eb18b9aebf87b60988d277", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10487, "upload_time": "2013-10-26T21:36:44", "url": "https://files.pythonhosted.org/packages/a0/d0/9b26bd658ba44c07e33b3f876d7eac1bcd9f863ee10190ff8b085dde4368/fjd-0.1.21.tar.gz" } ], "0.1.22": [ { "comment_text": "", "digests": { "md5": "7434f4c81f7d8d84902e3e23e7dd3bba", "sha256": "d4f2035693ff625f28256ad77bfc98f5796a24e2db4fd005b2771820c760a863" }, "downloads": -1, "filename": "fjd-0.1.22.tar.gz", "has_sig": false, "md5_digest": "7434f4c81f7d8d84902e3e23e7dd3bba", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10645, "upload_time": "2013-10-30T19:06:05", "url": "https://files.pythonhosted.org/packages/f3/8c/856addd1725af7ff02735e496437bbeff9811a97526ce96ec927b975d0a2/fjd-0.1.22.tar.gz" } ], "0.1.23": [ { "comment_text": "", "digests": { "md5": "6892ad1eb3b85625937f21e26548083e", "sha256": "1d5021b69f4ad3c24cf76213d46d92d974619f53508e74392241a8647118ddf9" }, "downloads": -1, "filename": "fjd-0.1.23.tar.gz", "has_sig": false, "md5_digest": "6892ad1eb3b85625937f21e26548083e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10710, "upload_time": "2013-11-08T08:21:16", "url": "https://files.pythonhosted.org/packages/66/2c/7815434235a82e71d4571f487e306d6a087255bc24b7deb4422f0cc9c5a0/fjd-0.1.23.tar.gz" } ], "0.1.24": [ { "comment_text": "", "digests": { "md5": "54235050c01bcb041c931a2d68facd41", "sha256": "e8da58a18d2098645e92270fe6dee1387e03513369ffabfc46209e294e24ddf0" }, "downloads": -1, "filename": "fjd-0.1.24.tar.gz", "has_sig": false, "md5_digest": "54235050c01bcb041c931a2d68facd41", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10820, "upload_time": "2013-11-10T10:51:50", "url": "https://files.pythonhosted.org/packages/fc/85/329bfbb40c4c60d8dab2bf06ba690663eac1b64d36b54b6b0556a8dcb105/fjd-0.1.24.tar.gz" } ], "0.1.25": [ { "comment_text": "", "digests": { "md5": "42fb9af4ab6c747a4da3b78cc50bff06", "sha256": "8a73fd141ef8adcab3ac47dc806eeb7e9a3dca82753580022c70a00d0aa2ba9e" }, "downloads": -1, "filename": "fjd-0.1.25.tar.gz", "has_sig": false, "md5_digest": "42fb9af4ab6c747a4da3b78cc50bff06", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10819, "upload_time": "2013-11-10T11:12:51", "url": "https://files.pythonhosted.org/packages/b2/51/576a982ad6b59453996eb3e127aaad1f128a1053417fc5b4121a67f99306/fjd-0.1.25.tar.gz" } ], "0.1.26": [ { "comment_text": "", "digests": { "md5": "c5dd1558819d6e142f92fa6085090030", "sha256": "6c1f47be2d2b5da6abeaaa443353e3cf2a153259f1e560c8c5e5e139f2f2443b" }, "downloads": -1, "filename": "fjd-0.1.26.tar.gz", "has_sig": false, "md5_digest": "c5dd1558819d6e142f92fa6085090030", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10953, "upload_time": "2013-11-10T11:28:56", "url": "https://files.pythonhosted.org/packages/ff/f9/1024251731eb00e5b81026b0ddd44f06c801e398aaa33ee1507cd353e1d1/fjd-0.1.26.tar.gz" } ], "0.1.27": [ { "comment_text": "", "digests": { "md5": "c0e7543bb3836c6f9808af0fdd646cd4", "sha256": "1cfa92884bf3f926b5166f531dd7e513441752bf2bee0facaf420c96ceb67d64" }, "downloads": -1, "filename": "fjd-0.1.27.tar.gz", "has_sig": false, "md5_digest": "c0e7543bb3836c6f9808af0fdd646cd4", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10963, "upload_time": "2013-11-10T11:55:08", "url": "https://files.pythonhosted.org/packages/32/f2/45648d3432e99c6e8a00b2f3e9edb4724271966a881a3e0216425a83885a/fjd-0.1.27.tar.gz" } ], "0.1.28": [ { "comment_text": "", "digests": { "md5": "c01fff942b284ac46f59c5d138a68958", "sha256": "bdaab7ef787ee564cc1b66cc5832f5cdc4e6425cad28d6e71e77e9276008b354" }, "downloads": -1, "filename": "fjd-0.1.28.tar.gz", "has_sig": false, "md5_digest": "c01fff942b284ac46f59c5d138a68958", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11161, "upload_time": "2013-11-15T15:09:47", "url": "https://files.pythonhosted.org/packages/3e/5e/86022011b42d26b691578a6e5b5fb82b016d8b0a6cb3f34030971dbc002f/fjd-0.1.28.tar.gz" } ], "0.1.29": [ { "comment_text": "", "digests": { "md5": "920bd738f078f03ece660da9ba74ab01", "sha256": "2b5dd72a4dcb3057e4501979f1247533249b75c240d0dc9d2522a8f50d7258fd" }, "downloads": -1, "filename": "fjd-0.1.29.tar.gz", "has_sig": false, "md5_digest": "920bd738f078f03ece660da9ba74ab01", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11177, "upload_time": "2013-11-20T14:05:32", "url": "https://files.pythonhosted.org/packages/4d/47/bdf5ce1957109fec4951859a44f0dad8d625a86b7c25ddf3514912944700/fjd-0.1.29.tar.gz" } ], "0.1.3": [ { "comment_text": "", "digests": { "md5": "0ac07928996863c3f5e2442aa1c79faa", "sha256": "3335da982cb049f262815a8bb30860c9f037153c0908aefa1d5584b8b31eb62e" }, "downloads": -1, "filename": "fjd-0.1.3.tar.gz", "has_sig": false, "md5_digest": "0ac07928996863c3f5e2442aa1c79faa", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6389, "upload_time": "2013-10-17T18:22:13", "url": "https://files.pythonhosted.org/packages/17/5b/9d46646de129a6ab7a785fdcdeda81b75a069837343c7254e780a7a46172/fjd-0.1.3.tar.gz" } ], "0.1.30": [ { "comment_text": "", "digests": { "md5": "0212573738e38e5a09e93404a9f26ccd", "sha256": "72bb36223020b16cad14c48272979040018829acd370711bce90047e4340a032" }, "downloads": -1, "filename": "fjd-0.1.30.tar.gz", "has_sig": false, "md5_digest": "0212573738e38e5a09e93404a9f26ccd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12083, "upload_time": "2013-11-20T14:50:28", "url": "https://files.pythonhosted.org/packages/5b/0e/ac41ea44c66445c561c6461987cc73843a8eeeef95afe46723e3581ef7ed/fjd-0.1.30.tar.gz" } ], "0.1.31": [ { "comment_text": "", "digests": { "md5": "8b9d77e25c3ff41f655b68f261ab5912", "sha256": "d8dc8ba99890219f37b86f9be478d085eb07c1dd8c92520fe97c16170b907368" }, "downloads": -1, "filename": "fjd-0.1.31.tar.gz", "has_sig": false, "md5_digest": "8b9d77e25c3ff41f655b68f261ab5912", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12455, "upload_time": "2013-12-05T09:11:48", "url": "https://files.pythonhosted.org/packages/0e/50/bbc29689db6805d26ea8f66d1c3a3eb732a36ec8d2bb91aa9775f19df6da/fjd-0.1.31.tar.gz" } ], "0.1.32": [ { "comment_text": "", "digests": { "md5": "adc3d5e4bff47b0b6c579ca269ff8897", "sha256": "22edcee4710fe955c53eb2ece970b690e68c3e6de844979b1e147c7aefed69e1" }, "downloads": -1, "filename": "fjd-0.1.32.tar.gz", "has_sig": false, "md5_digest": "adc3d5e4bff47b0b6c579ca269ff8897", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12508, "upload_time": "2013-12-11T13:12:03", "url": "https://files.pythonhosted.org/packages/a0/5a/4b6f4e738c105db01296f2f786e0c28589441bcc55b45ca1697f2ca3fbc9/fjd-0.1.32.tar.gz" } ], "0.1.33": [ { "comment_text": "", "digests": { "md5": "2ea26c7b60e09f08949a471bd0d60f93", "sha256": "c4a52b38ed66ca3bce9d61e427cd6ef897cd8a9e5b68a71a10fcfd78016996c8" }, "downloads": -1, "filename": "fjd-0.1.33.tar.gz", "has_sig": false, "md5_digest": "2ea26c7b60e09f08949a471bd0d60f93", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12611, "upload_time": "2013-12-11T15:24:48", "url": "https://files.pythonhosted.org/packages/c1/71/9b60df7bf729e7f92ea52cc3ddc182bc6bd2b354a568b1fbb71ccb3780f4/fjd-0.1.33.tar.gz" } ], "0.1.34": [ { "comment_text": "", "digests": { "md5": "6bd5cceabc13833ebbe2ed3b3b68045e", "sha256": "4739ef8edf320c8ef0d36b02b4aa5ed16185d7fbc3681d311f7d7cd82aef91b9" }, "downloads": -1, "filename": "fjd-0.1.34.tar.gz", "has_sig": false, "md5_digest": "6bd5cceabc13833ebbe2ed3b3b68045e", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 11942, "upload_time": "2014-01-13T23:52:53", "url": "https://files.pythonhosted.org/packages/f1/6b/539ceb77757ca1d09e54d0bfc848a4eda44d10794d165402f99cda381bf6/fjd-0.1.34.tar.gz" } ], "0.1.35": [ { "comment_text": "", "digests": { "md5": "68af5c7a829d8f3f841257a67b96989a", "sha256": "b770f769616028a9bba1e841489435ddbf97284334ff4f0f347b22a74f310e7c" }, "downloads": -1, "filename": "fjd-0.1.35.tar.gz", "has_sig": false, "md5_digest": "68af5c7a829d8f3f841257a67b96989a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12815, "upload_time": "2014-01-17T11:37:51", "url": "https://files.pythonhosted.org/packages/93/21/69f1a29d027dcc83671c5c6f00f9234f27c7aec2e431f52048cce0533397/fjd-0.1.35.tar.gz" } ], "0.1.36": [ { "comment_text": "", "digests": { "md5": "a58f01a30df8fc8f72fcc961d3a14f42", "sha256": "1886d14c38e33dfb31ee743b7ad00e03841281a779ac444d59c51ce8373f58ca" }, "downloads": -1, "filename": "fjd-0.1.36.tar.gz", "has_sig": false, "md5_digest": "a58f01a30df8fc8f72fcc961d3a14f42", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12015, "upload_time": "2014-02-14T22:16:08", "url": "https://files.pythonhosted.org/packages/be/71/7d95574dc7e33d9d4a0c1a9f221d352d5bbeb9b0de77b6c2c3b249184bf2/fjd-0.1.36.tar.gz" } ], "0.1.37": [ { "comment_text": "", "digests": { "md5": "2cdcb356aa6c826c25778dab721af1dd", "sha256": "d78c4b517256019637767abc83f3090cd562f16d4fabdd6dfd1dc1641c2d328e" }, "downloads": -1, "filename": "fjd-0.1.37.tar.gz", "has_sig": false, "md5_digest": "2cdcb356aa6c826c25778dab721af1dd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12952, "upload_time": "2014-02-20T12:41:33", "url": "https://files.pythonhosted.org/packages/35/2c/154613b41f4a5a669f83ef843c88b1def3fbe787d419de686d75fa5ab503/fjd-0.1.37.tar.gz" } ], "0.1.38": [ { "comment_text": "", "digests": { "md5": "edd9dd95eb40d1f42eab7853fe81b3e8", "sha256": "e8bb081126472fc29b2cf9db8eed23839a310abb12d6c6d639d0977596a978a3" }, "downloads": -1, "filename": "fjd-0.1.38.tar.gz", "has_sig": false, "md5_digest": "edd9dd95eb40d1f42eab7853fe81b3e8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12963, "upload_time": "2014-02-24T09:13:03", "url": "https://files.pythonhosted.org/packages/60/2c/3e59004c8ee65fbd32f84054e301f73b147f77365f52e3ca222481443d67/fjd-0.1.38.tar.gz" } ], "0.1.39": [ { "comment_text": "", "digests": { "md5": "f08666d85873a637f396d2b66a4d577f", "sha256": "c8180d966dcd51a7b60cd534a30b54f7abbea5047556350f332aa6220f9b8b9d" }, "downloads": -1, "filename": "fjd-0.1.39.tar.gz", "has_sig": false, "md5_digest": "f08666d85873a637f396d2b66a4d577f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12968, "upload_time": "2014-02-24T09:15:04", "url": "https://files.pythonhosted.org/packages/86/6d/1bd5f1c9ab0f10539eeda6b50b0cf8e58670dbefdf5773604368f68a3d25/fjd-0.1.39.tar.gz" } ], "0.1.4": [ { "comment_text": "", "digests": { "md5": "018240ca555fab945e60c61ee4ea7487", "sha256": "919a4bd8cf083851bb824b63259341e6ae838b8b279c176c63fc2f710f8d29c6" }, "downloads": -1, "filename": "fjd-0.1.4.tar.gz", "has_sig": false, "md5_digest": "018240ca555fab945e60c61ee4ea7487", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6479, "upload_time": "2013-10-17T18:25:25", "url": "https://files.pythonhosted.org/packages/65/35/1acb2d688b9fe2c547cb0689ee2236e95be06eb75ee40f9f2c2a80980d4f/fjd-0.1.4.tar.gz" } ], "0.1.40": [ { "comment_text": "", "digests": { "md5": "47bf621b8a1f3e2568d39c300775bb41", "sha256": "1ade50d9fa8266be9d5bb6c9db745186fca2d903e060fac6b51c417aed04dff0" }, "downloads": -1, "filename": "fjd-0.1.40.tar.gz", "has_sig": false, "md5_digest": "47bf621b8a1f3e2568d39c300775bb41", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12959, "upload_time": "2014-02-24T09:35:50", "url": "https://files.pythonhosted.org/packages/b2/f5/6668d36b7a8fa8208b56c4ad485078b44f8b009822ddc81092884439aabe/fjd-0.1.40.tar.gz" } ], "0.1.41": [ { "comment_text": "", "digests": { "md5": "391f8ce5e38633e07c7885f4e23eb36a", "sha256": "6b5ee65c7791274d6baa75ab82e77463d8ac35c90fc84dc11511c38e8b55e050" }, "downloads": -1, "filename": "fjd-0.1.41.tar.gz", "has_sig": false, "md5_digest": "391f8ce5e38633e07c7885f4e23eb36a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 12279, "upload_time": "2014-02-26T11:08:48", "url": "https://files.pythonhosted.org/packages/61/4e/b53c8c507bf760c8c188b363098c074936fddce4b0b46254ec0b96b7857e/fjd-0.1.41.tar.gz" } ], "0.1.42": [ { "comment_text": "", "digests": { "md5": "0f33a2df61623ab64036d0cfd442b647", "sha256": "d78225cda988f70072b5f52762285666c4ce4470ce719a714f3397829e0dcb43" }, "downloads": -1, "filename": "fjd-0.1.42.tar.gz", "has_sig": false, "md5_digest": "0f33a2df61623ab64036d0cfd442b647", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13033, "upload_time": "2014-03-06T10:08:35", "url": "https://files.pythonhosted.org/packages/c2/5b/1f3c267bae2c85b050e739fe550ac0a6b2032373f029320bd3558126b5bb/fjd-0.1.42.tar.gz" } ], "0.1.5": [ { "comment_text": "", "digests": { "md5": "909c340d0348a5a44a1f7fa400e779c1", "sha256": "029f1816c61af8aa65b32c99f10e5dbf6153b4d9a7e3fcd2826a82cd19931a89" }, "downloads": -1, "filename": "fjd-0.1.5.tar.gz", "has_sig": false, "md5_digest": "909c340d0348a5a44a1f7fa400e779c1", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6704, "upload_time": "2013-10-17T21:36:42", "url": "https://files.pythonhosted.org/packages/3b/0e/c9167abd4e7d568f44f6c6468ab168152f12de911492f76a81609a02f9c1/fjd-0.1.5.tar.gz" } ], "0.1.51": [ { "comment_text": "", "digests": { "md5": "5173a463520209a2c406d325b1a50f3c", "sha256": "c79fcc9fb0dedca0031d2d6779bab6757b583c002d1ecd6ccb6ec3e57acc2b16" }, "downloads": -1, "filename": "fjd-0.1.51.tar.gz", "has_sig": false, "md5_digest": "5173a463520209a2c406d325b1a50f3c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13942, "upload_time": "2014-03-21T22:22:22", "url": "https://files.pythonhosted.org/packages/2e/61/29286659d44874f92758ad4d159dc56bec0bdc79c74c62e6c10a4b0713cb/fjd-0.1.51.tar.gz" } ], "0.1.55": [ { "comment_text": "", "digests": { "md5": "5deffed7ff34a158d9a73e788ca8774a", "sha256": "0c0227a59f518ae453378caa243853d3d7a6fd5a61117c22354f4f04a2a16301" }, "downloads": -1, "filename": "fjd-0.1.55.tar.gz", "has_sig": false, "md5_digest": "5deffed7ff34a158d9a73e788ca8774a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14913, "upload_time": "2014-03-28T08:11:55", "url": "https://files.pythonhosted.org/packages/45/a1/a4c79c5f9ed82a0c25e37c0f4ae8a8436960fb147202a7c60db57b4faa77/fjd-0.1.55.tar.gz" } ], "0.1.56": [ { "comment_text": "", "digests": { "md5": "a66648ad37f3db302abebf1bca90f20c", "sha256": "60c44db259b0b0e13f26e5d5111b6fe61d2eea2004caaa71006284488ea8538a" }, "downloads": -1, "filename": "fjd-0.1.56.tar.gz", "has_sig": false, "md5_digest": "a66648ad37f3db302abebf1bca90f20c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14343, "upload_time": "2014-05-29T15:16:28", "url": "https://files.pythonhosted.org/packages/46/93/3b09ec0dc7e38dd60bb1e15f0f1e8e5cb9d2d3503669c4bb34f3debe086d/fjd-0.1.56.tar.gz" } ], "0.1.57": [ { "comment_text": "", "digests": { "md5": "c6018e931a8271c1b282481149ef93d3", "sha256": "331407af96c0b8a85f53b437b53c5671ada71ea5104cd7be9223553d9e05e03c" }, "downloads": -1, "filename": "fjd-0.1.57.tar.gz", "has_sig": false, "md5_digest": "c6018e931a8271c1b282481149ef93d3", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14355, "upload_time": "2014-05-29T20:54:41", "url": "https://files.pythonhosted.org/packages/8c/ec/d412bbc8f30b5734d8be04d783b0682e76fb9f05aa277a0a042cda46c438/fjd-0.1.57.tar.gz" } ], "0.1.58": [ { "comment_text": "", "digests": { "md5": "d210f23312cfa1b7b1855ffdb1010227", "sha256": "9549553c57a6c463ff6fb6b5e5a8d9e6c318431c860036110782ebc80a3a1dfd" }, "downloads": -1, "filename": "fjd-0.1.58.tar.gz", "has_sig": false, "md5_digest": "d210f23312cfa1b7b1855ffdb1010227", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15102, "upload_time": "2014-06-10T15:26:11", "url": "https://files.pythonhosted.org/packages/1a/50/794e3ad2086eb87a0339afd589714eab3acfcdc64c7d754cc580fdcead97/fjd-0.1.58.tar.gz" } ], "0.1.6": [ { "comment_text": "", "digests": { "md5": "f3049d5ebc5d0c78c1168991993d9433", "sha256": "4b6935227b0521d893056d568a25d7838b71bb9d09f43ff29a9ea0731d336dc2" }, "downloads": -1, "filename": "fjd-0.1.6.tar.gz", "has_sig": false, "md5_digest": "f3049d5ebc5d0c78c1168991993d9433", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6754, "upload_time": "2013-10-17T21:43:15", "url": "https://files.pythonhosted.org/packages/a9/66/34438abdf4e4bcff67506a40057d392e3655ed9f09c9f053ce71c9a9c9e1/fjd-0.1.6.tar.gz" } ], "0.1.7": [ { "comment_text": "", "digests": { "md5": "567a3f07ecc9eaa4ae117cb83c1347bd", "sha256": "48e8f0e84810e1a651582e450e8591cb7986b3f32d36c00ed9211e947a80cfb1" }, "downloads": -1, "filename": "fjd-0.1.7.tar.gz", "has_sig": false, "md5_digest": "567a3f07ecc9eaa4ae117cb83c1347bd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6712, "upload_time": "2013-10-17T21:55:57", "url": "https://files.pythonhosted.org/packages/3e/77/70abdbc3073a62c781aaa121fc369ab29e28f180cd7b7f43b2145fb93a89/fjd-0.1.7.tar.gz" } ], "0.1.8": [ { "comment_text": "", "digests": { "md5": "5fab513c149e5c3d12b5ae12c7ffc0dd", "sha256": "93a17a5d78e7a7ae6d3552cfa69ad426529f39885135b1605098b53bd975457e" }, "downloads": -1, "filename": "fjd-0.1.8.tar.gz", "has_sig": false, "md5_digest": "5fab513c149e5c3d12b5ae12c7ffc0dd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7478, "upload_time": "2013-10-20T12:57:53", "url": "https://files.pythonhosted.org/packages/2a/f6/bc5b13155674f8e502bb5aee6dd453e2255438ac2014e85581cfd8601603/fjd-0.1.8.tar.gz" } ], "0.1.9": [ { "comment_text": "", "digests": { "md5": "ee219563d6b2a7cff41c79e404327e03", "sha256": "abc5fac37b5b75c87b0059116cfec6c0e8238e1dc7ae4e0d946eb95cd0d47c0e" }, "downloads": -1, "filename": "fjd-0.1.9.tar.gz", "has_sig": false, "md5_digest": "ee219563d6b2a7cff41c79e404327e03", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 8045, "upload_time": "2013-10-23T10:04:08", "url": "https://files.pythonhosted.org/packages/af/0d/7b2b25e25259a17a9d45df439c2405b15fecca0f53608bc831be3b1ee849/fjd-0.1.9.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "d210f23312cfa1b7b1855ffdb1010227", "sha256": "9549553c57a6c463ff6fb6b5e5a8d9e6c318431c860036110782ebc80a3a1dfd" }, "downloads": -1, "filename": "fjd-0.1.58.tar.gz", "has_sig": false, "md5_digest": "d210f23312cfa1b7b1855ffdb1010227", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 15102, "upload_time": "2014-06-10T15:26:11", "url": "https://files.pythonhosted.org/packages/1a/50/794e3ad2086eb87a0339afd589714eab3acfcdc64c7d754cc580fdcead97/fjd-0.1.58.tar.gz" } ] }