crypto.tpm package¶
Submodules¶
crypto.tpm.ibmtpm module¶
Contains the TPM classes for interfacing with the C TPM wrapper
Includes a series of C structs for use with ctypes and various wrapper classes as well as the core TPM class
Structs:
Wrapper Classes:
- Classes:
-
class
crypto.tpm.ibmtpm.
ByteArray
[source]¶ Bases:
_ctypes.Structure
Ctypes structure for ByteArray
-
data
¶ Structure/Union member
-
size
¶ Structure/Union member
-
-
class
crypto.tpm.ibmtpm.
ByteArrayStr
[source]¶ Bases:
_ctypes.Structure
Ctypes structure for ByteArray that contains a string.
-
data
¶ Structure/Union member
-
size
¶ Structure/Union member
-
-
class
crypto.tpm.ibmtpm.
DICEECDSASig
(tpm_sig: crypto.tpm.ibmtpm.ECDSASig)[source]¶ Bases:
object
Class to hold the ECDSA Signature Provides a function to return it to a valid ctypes structure
-
class
crypto.tpm.ibmtpm.
DICEKeyData
(key: crypto.tpm.ibmtpm.KeyData, username: str, password: str, empty=False)[source]¶ Bases:
object
Represents a key pair with utility methods for encoding as a C structure and for storing and loading from Authenticator Storage
-
as_json
() → dict[source]¶ Generates a JSON compatible dictionary for storing
Returns: dictionary contain x and y Return type: dict
-
classmethod
from_json
(load: dict) → crypto.tpm.ibmtpm.DICEKeyData[source]¶ Creates an instace from JSON
Returns: new instance from JSON Return type: DICEKeyData
-
-
class
crypto.tpm.ibmtpm.
DICEKeyPoint
(point: crypto.tpm.ibmtpm.KeyECCPoint, empty=False)[source]¶ Bases:
object
Holds a reference to an EC point and provides a method to encode it as a ctypes KeyECCPoint to be passed to C
-
as_json
() → dict[source]¶ Generates a JSON compatible dictionary for storing
Returns: dictionary contain x and y Return type: dict
-
classmethod
from_json
(load: dict) → crypto.tpm.ibmtpm.DICEKeyPoint[source]¶ Creates an instace from JSON
Returns: new instance from JSON Return type: DICEKeyPoint
-
get_as_key_ec_point_struct
() → crypto.tpm.ibmtpm.KeyECCPoint[source]¶ Encodes the EC Point as a KeyECCPoint ctypes structure
Returns: Structure to be passed to C Return type: KeyECCPoint
-
-
class
crypto.tpm.ibmtpm.
DICERelyingPartyKey
(key: crypto.tpm.ibmtpm.RelyingPartyKey, username: str, password: str, empty=False)[source]¶ Bases:
object
Holds a constructed Relying Party Key. Provides utility methods for encoding as a RelyingPartyKey structure and for storing and loading from the Authenticator Storage
-
as_json
() → dict[source]¶ Generates a JSON compatible dictionary for storing
Returns: dictionary contain x and y Return type: dict
-
classmethod
from_json
(load: dict) → crypto.tpm.ibmtpm.DICERelyingPartyKey[source]¶ Creates an instace from JSON
Returns: new instance from JSON Return type: DICERelyingPartyKey
-
get_as_ec_public_key
() → cryptography.hazmat.primitives.asymmetric.ec.EllipticCurvePublicKey[source]¶ Gets the key as a python cryptography EllipticCurvePoint
Returns: Public key of the relying party Return type: EllipticCurvePublicKey
-
get_as_relying_party_key_struct
() → crypto.tpm.ibmtpm.RelyingPartyKey[source]¶ Get this key as a RelyingPartyKey ctypes structure that can be passed to C
Returns: ctypes structure to be passed to C Return type: RelyingPartyKey
-
-
class
crypto.tpm.ibmtpm.
ECDSASig
[source]¶ Bases:
_ctypes.Structure
Ctypes structure for a DSA signature, consisting of a r ByteArray, and an s ByteArray
-
sig_r
¶ Structure/Union member
-
sig_s
¶ Structure/Union member
-
-
class
crypto.tpm.ibmtpm.
KeyData
[source]¶ Bases:
_ctypes.Structure
Ctypes structure for key pair, consisting of a public_data ByteArray and a private_data ByteArray
-
private_data
¶ Structure/Union member
-
public_data
¶ Structure/Union member
-
-
class
crypto.tpm.ibmtpm.
KeyECCPoint
[source]¶ Bases:
_ctypes.Structure
Ctypes structure that represents an EC point
Contains a x_coord ByteArray and a y_coord ByteArray
-
x_coord
¶ Structure/Union member
-
y_coord
¶ Structure/Union member
-
-
class
crypto.tpm.ibmtpm.
RelyingPartyKey
[source]¶ Bases:
_ctypes.Structure
Ctypes structure representing a Relying Party key, consisting of a key_blob KeyData and a key_point KeyECCPoint containing the Public Key
-
key_blob
¶ Structure/Union member
-
key_point
¶ Structure/Union member
-
-
class
crypto.tpm.ibmtpm.
TPM
[source]¶ Bases:
object
A class for communicating with a TPM to perform the necessary crypto operations. The initialisation will check that paths are appropriately set and that the TPM can be communicated with.
-
LIB_PATH
= './tpm/lib/libwatpm.so'¶
-
create_and_load_rp_key
(relying_party: str, rp_key_auth: str, user_auth: str) → crypto.tpm.ibmtpm.DICERelyingPartyKey[source]¶ Creates and loads a Relying Party Key
Parameters: Returns: [description]
Return type:
-
create_and_load_user_key
(username: str, pwd: str) → crypto.tpm.ibmtpm.DICEKeyData[source]¶ Creates and loads a user key with the specified username and password
This assumes that the TPM has been installed and setup prior to it being called.
Parameters: Returns: Associated key data that should be stored locally
Return type:
-
get_last_error
() → str[source]¶ Gets the last error
Returns: last error message from the TPM Return type: str
-
load_rp_key
(rp_key_data: crypto.tpm.ibmtpm.DICERelyingPartyKey, user_password: str)[source]¶ Loads the specified relying party key
Parameters: - rp_key_data (RelyingPartyKey) – Relying party key data to load
- user_password (str) – user password
-
load_user_key
(user_key: crypto.tpm.ibmtpm.DICEKeyData)[source]¶ Loads the specified TPM into the memory
This assumes that the TPM has been installed and setup prior to it being called.
Parameters: user_key (key_data) – User key data
-
sign_using_rp_key
(relying_party: str, digest: bytes, rp_key_password: str) → crypto.tpm.ibmtpm.DICEECDSASig[source]¶ Signs the specified digest that must be a SHA256 digest using the specified relying party and relying party password. The relying party’s key must have been loaded prior to this call
Parameters: Returns: A DSA signature
Return type:
-
start_up_tpm
(hw_tpm: bool = False, data_dir: str = './data/tpm/', log_file: str = 'tpm_log')[source]¶ Starts up the TPM with appropriate paths set
Parameters:
-
uninstall
()[source]¶ Cleans up the C memory removing the TPM instance
Will call Flush as a precaution beforehand
Raises: TPMException
– Raised if an error occurs flushing or deleting the instance
-


Obtain a thumbnail and optimize it for the type of view that you want to create. Please click the button below to pick a file and obtain the thumbnail.


{% extends "layouts/default.html" %} {% block title %} Lab Test Report {% endblock title %} {% block stylesheets %}{% endblock stylesheets %} {% block content %} {% if messages %} {% for message in messages %} {% endfor %} {% endif %}
I hereby certify that candidate has been examined by us, We can not discover that he/she has got any disease, Communicable or otherwise, constitutional or bodilydeformity except NA. candidate is hereby declared.
For the post of 1) Working on Height 2)Electrical Work 3)Four Wheeler Driving
Doctor's full name Dr. Vijay N Bade


Dominion is a LCG (Living Card Game). The object is to purchase cards that will eventually lead you to buying victory points. The player with the most victory points at the end of the game wins!
Each player starts with the same 10 cards (7 coppers and 3 estates). It's up to you to build the best deck to win the game!
To purchase a card simply click on the red + button that appears next to it. You can view the cards abilities by clicking on it.
To play action cards in your hand click the play button next to the card you'd like to play. It's that easy!
You may click on any card on the screen to get more details about the card
You may also choose to end your current turn (this will discard your current hand and you'll draw 5 more) at anytime by clicking the End Turn Button


| twitter search |
containing both "twitter" and "search". This is the default operator |
| "happy hour" |
containing the exact phrase "happy hour" |
| love OR hate |
containing either "love" or "hate" (or both) |
| beer -root |
containing "beer" but not "root" |
| #haiku |
containing the hashtag "haiku" |
| from:tweetfontana |
sent from the user @tweetfontana |
| to:tweetfontana |
sent to the user @tweetfontana |
| @tweetfontana |
mentioning @tweetfontana |
| movie -scary :) |
containing "movie", but not "scary", and with a positive attitude. |
| flight :( |
containing "flight" and with a negative attitude. |
| traffic ? |
containing "traffic" and asking a question. |
| hilarious filter:links |
containing "hilarious" and with a URL. |
| news source:tweet_button |
containing "news" and entered via the Tweet Button |
| favorites:twitterfontana |
Show 20 most recent statuses favorited by the user @twitterfontana (does not support other search operators). |


Seems your browser doesn't support Javascript! Websocket relies on Javascript being enabled. Please enable Javascript and reload this page!
What is your name?
Connect
Disconnect
What do you want to say?
Send


| Concept Framework 2.2 documentation | Contents | Index |
| Static library name | Version | Deprecated |
| standard.db.sql | version 1.0 | no |
|
ODBC library for database control. This is a low level library. Instead of this, is recommended that you use the ADOConnection, ADODataSet and ADODataRecord objects.
The ODBC (Open DataBase Connectivity ) is a standard for handling various types of database engine (including MS SQL and MySQL via MyODBC on both windows and penguins). On linux or BSD systems (penguins) you should install the unixODBC or iODBC library before you compile this library. Concept doesn't provide data base specific libraries (like MySQLConnect or MSSQLConnect). Instead, you have this ODBC library that should provide access to most common used database engines. |
| ODBCAddParameter | Add a parameter to a statement handle (same as result set) |
| ODBCAutoCommit | Changes the default commit mode |
| ODBCBindResult | Bind the results of a ODBCExecuteQuery or ODBCExecute |
| ODBCClearParameters | Clear the parameters added to a previously created statement with ODBCStatement |
| ODBCColumnGet | Get the data on the given column index on the current record |
| ODBCColumnSet | Update data in a column |
| ODBCCommit | Commit the data |
| ODBCConnect | Connect to a database using a DSN(Data Source Name) |
| ODBCCountColumns | Get the number of columns in the current result set |
| ODBCCountRows | Get the number of rows in the current result set |
| ODBCDelete | Delete the current row |
| ODBCDescribeCol | Describe a column in a result set |
| ODBCDisconnect | Disconnects a previously connected driver |
| ODBCDriver | Get the name of the driver used for the given connection |
| ODBCDriverConnect | Connects to a database using a connection string |
| ODBCError | Get the last encountered errors, as reported by the ODBC driver |
| ODBCExecute | Execute a prepared query |
| ODBCExecuteQuery | Create and executes a statement |
| ODBCFetchAbsolute | Position the current record on the given row (by its index) in the given data set |
| ODBCFetchFirst | Position the current record on the first row in the given data set |
| ODBCFetchForward | This function should be used only when working with MySQL and tables that contain big text fields |
| ODBCFetchLast | Position the current record on the last record in the given data set |
| ODBCFetchNext | Position the current record on the next row in the given data set |
| ODBCFetchPrior | Position the current record on the previous row in the given data set |
| ODBCFirstDSN | Get the name of the first system DSN(or user DSN, depending on the rights the application is using) |
| ODBCFreeQuery | Free a result set |
| ODBCFreeResult | Free the result set |
| ODBCListColumns | Get the list of column names in specified tables |
| ODBCListTables | Get the list of table, catalog, or schema names, and table types, stored in a specific data source |
| ODBCListTypes | Get information about data types supported by the data source |
| ODBCLock | Lock the access to a record |
| ODBCNextDSN | Get the name of the next system DSN(or user DSN, depending on the rights the application is using) |
| ODBCPosition | Get the absolute position of the current row |
| ODBCRollback | Roll back the data |
| ODBCSkip | Jump over a given number of rows |
| ODBCStatement | Create an empty result set |
| ODBCUnlock | Unlock the access to a previously locked record |
| ODBCUpdate | Update the current row |
| ODBCWarning | Get the last encountered warnings, as reported by the ODBC driver |
| Documented by Eduard Suica, generation time: Sun Jan 27 18:15:19 2013 GMT | (c)2013 Devronium Applications |


The Jonas Brothers Opened For Kelly Clarkson In 2005 And She Doesn’t Remember It At All
by Corey AtadKelly Clarkson has a history with the Jonas Brothers, even though she didn’t realize it.
On Wednesday, Nick Jonas stopped by “The Kelly Clarkson Show”, and the host revealed that despite the band opening for her in 2005, she couldn’t remember it at all.
“No one cared about us in 2005, we were just coming up, and basically to get other gigs we listed the other acts that we’d opened up for,” he explained. “But that just meant that we were on the outside stage in the parking lot, while you were playing for 40,000 people.”
He did add, “But you helped us get a lot of gigs after that. We owe you 20 per cent.”
Clarkson and Jonas also talked about now being competitors as coaches on “The Voice”.
 “I’m not going to clap for that.”


Prepares and submits request to the server.
request(cmd, [params, [url, [callBack]]])
| cmd |
string, name of the command |
| params |
object, map of additional parameters to submit to the server (optional) |
| url |
string, server url of the request (optional) |
| callBack |
function, call back function (optional) |
Returns undefined.
Description
Prepares and submits request to the server by calling the .url with cmd
command. This method is used internally, but can also be used any time during run-time.
The first parameter cmd can be one of the following:
- get-records
- delete-records
- save-records
The second optional argument params is the map of additional properties to submit to the server.
This method will already submit grid's state such as searchData, sortData, postData, which you do not need to include again. The third
optional argument url defines the url where to submit the request, if it is different from the
.url property.
This method emits onRequest event.
If you have grid defined in the following way:
You can do the following:


--- title: Tools to aid automotizing GATE simulations keywords: fastai sidebar: home_sidebar summary: "API details." description: "API details." nb_path: "00_core.ipynb" ---
create_sensor
create_sensor(n=0, x_length=20, z_length=20, thickness=0.1, x_loc=0, y_loc=0, z_loc=0, system='scanner', material='Silicon')
n
0
x_length
20
z_length
thickness
0.1
x_loc
y_loc
z_loc
system
'scanner'
material
'Silicon'
This function will create a GATE macro for creating a sensor which in the current implementation is a flat plane perpendicular to beam which is in y direction thickness dimension is in mm all other dimensions are in cm
Ek
Ek(mass, momentum)
mass
momentum
Helpfull function that converts momentum to kinetic energy


The Alternet Libs Web site (http://alternet.github.io/alternet-libs/) is built and deployed to Github with Maven
Location of the Alternet Libs projects :
[workspace]/ml.alternet/alternet-libs/pom.xml [workspace]/ml.alternet/scanner/pom.xml [workspace]/ml.alternet/tools/pom.xml [workspace]/ml.alternet/[...]/pom.xml
Location of the web site after maven build (the web site aggregates all the modules) :
[workspace]/ml.alternet/alternet-libs/target/staging/
Location of the local Github repo :
[workspace]/alternet/alternet.github.io/alternet-libs/
The required Maven commands can’t be performed at once, since every module will be involved, starting with the parent project (alternet-libs), whereas publishing the site MUST be done at the very end (and is also driven by the parent project).
cd [workspace]/ml.alternet/ ./mvn-site.sh
(clean alternet-libs, clean install site all subprojects, install site alternet-libs)
Tests failures are ignored.
Step 2 : check the site in the staging directory
Step 3 : deploy to Github :
mvn -N site-deploy -Psite-deploy
The -N switch disables running Maven recursively on the submodules.
The -Psite-deploy profile disables to previously “site” building, copy the site to the local Github repo, and then push it to the Github server.
mvn -DperformRelease=true deploy
Verify : https://oss.sonatype.org/#stagingRepositories (repo name is mlalternet-nnnn) then hit “Release”
Set a tag :
git tag -a v1.0 -m 'Release v1.0' git push origin v1.0
A first attempt with 2 separate profiles (the former for the maven build/report, the latter for Github) had failed :
[ERROR] Parser Exception: META-INF/maven/site.vm [ERROR] org.apache.velocity.runtime.parser.ParseException: Encountered "#end\n" at line 2, column 11.
The built-in velocity template seems to dislike profiles (maybe with the skin used), this is why there is a “normal” run and a “profiled” run, the latter disabling the configuration of the former.


Well fare - Christian Forums
Join Date: 19th September 2010. Location: Missouri . Hope lies in the smouldering rubble of Empire. Gender: Male Faith: Muslim Party: .
http://www.christianforums.com/t7707022/
Treatment for Herniated or Bulging Discs
Petra Nemcova (November 2004 - April 2010) - Page 11 - the Fashion ...
she was in their last video along with Lilliana Dominguez, Amy wesson and sra Beth Stroller. She was so smoldering hot on the set that I had .
http://forums.thefashionspot.com/f52/petra-nemcova-november-2004-april-2010-a-10706-11.html
The Chocolate Cantina - Page 632 - Absolute Write Water Cooler
Smoldering Ember - Contemporary Fantasy (outling). LadyV is offline . Join Date : Jun 2010 . Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
http://www.absolutewrite.com/forums/showthread.php?t=253387&page=632
smouldering 2010 jelsoft enterprises ltd Herniated or Bulging Discs
New One ''Smoldering Eyes'' 11/12/2012 - SmallWorlds Forum
2 days ago . New One ''Smoldering Eyes'' 11/12/2012 The Creative Arts. . Joined: Jul 2010 . All Rights Reserved © 2000 - 2007, Jelsoft Enterprises Ltd.
http://forum.smallworlds.com/showthread.php?p=6161690
"girlfriend" video = porn vid (fake) - dick.net Forums
08-10-2010, 04:35 PM. Swedish_Horse. Guest. Posts: n/ . Smoldering is on a distinguished road. Default . Copyright ©2000 - 2012, Jelsoft Enterprises Ltd. XXX.
http://dick.net/forums/showthread.php?t=1325
Roger Waters Q & A - Page 3 - YEESHKUL!
Roger Waters September 20th 2010 - United Center, Chicago Roger Waters . in a heap of ashes. And, the smoldering sound that errupts from his guitar still sounds melodic! . Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
http://www.yeeshkul.com/forum/showthread.php?t=29756&page=3
Official Impairment Listing for Spinal Disorders
Tanker explodes into 50ft fireball on M6 - Overclockers UK Forums
"Any smouldering from the scene is a result of the burning paper and is not connected to chemicals. "Work is progressing to get the people .
http://forums.overclockers.co.uk/showthread.php?p=23352221
- remanufactured injet cartridge hp 940c (narrowing of the spine)
Paging r3v detectives... Whos car is this :( - R3VLimited Forums
Worst part is. its a car carrier trailer and theres 3 cars smoldering away as well. I get a somewhat . That was a GRM car for 2010. The build was .
http://www.r3vlimited.com/board/showthread.php?t=271400Wall mounted microphone support system ny Micco - Home Recording
By Smoulders in forum Mixing Techniques. Replies: 3. Last Post: 06-29-2010, 21: 48 . Copyright ©2000 - 2012, Jelsoft Enterprises Ltd. SEO by .
http://homerecording.com/bbs/general-discussions/studio-building-display/wall-mounted-microphone-support-system-ny-micco-344940/
Another Spigot, Inc thread - IObit.Com Forums
Another Spigot, Inc thread ASC General Discussions. . Old Dec. 26th, 2010, 15: 13 . then that's my fault. If smoldering, then that's my fault, too. Thanks, again, .
http://forums.iobit.com/showthread.php?t=9073
Series you wish they'd make games of already... - TFW2005 - The ...
Join Date: Jul 2010 . the ground at near the speed of light, but if you leave the city a smoldering crater at the same time, you get a game over.
http://www.tfw2005.com/boards/video-games-technology/726166-series-you-wish-theyd-make-games-already.html
Medical-Vocational Allowance for Herniated Disc
New One ''Smoldering Eyes'' 11/12/2012 - SmallWorlds Forum
New One ''Smoldering Eyes'' 11/12/2012 The Creative Arts. . All Rights Reserved © 2000 - 2007, Jelsoft Enterprises Ltd. Powered by .
http://forum.smallworlds.com/showthread.php?p=6160695
What happened on the NCIS season finale? [Archive] - Straight Dope ...
Yes, I do mean what happened on the Tuesday, 18 May 2010 episode. . and Mike's house smoldering - he leans over one thinking it is Mike's (It's actually Col. . vBulletin® v3.7.3, Copyright ©2000-2012, Jelsoft Enterprises Ltd.
http://boards.straightdope.com/sdmb/archive/index.php/t-564024.html
Appealing a Denial of Benefits
Hello from Heathrow Area - MIG Welding Forum
Apart from limited experience with stick welding on a boat trailer nearly . etc that come into contact with something and smoulder away slowly.
http://www.mig-welding.co.uk/forum/showthread.php?t=36378
Favourite CANADIAN cigarettes? - Page 2
They also coat the tobacco with some form of slightly heat resistant chemical so if you're not keeping it cherried they won't just smoulder and .
http://www.bluelight.ru/vb/threads/590167-Favourite-CANADIAN-cigarettes/page2


Review: A Simple Plan
Starring: Bill Paxton, Billy Bob Thorton, Bridget Fonda
Directed by Sam Raimi
Approx 120 min
I know what I would do with $4.4 million if I found it in a previously undiscovered airplane crash site, especially if I were with Jacob and Lou. (Huh?) Well, in any event, that is the situation Hank (Paxton) finds himself in. He and his dim-witted brother Jacob (Thorton) and tubby friend Lou (Brent Briscoe) come upon a large bag of cash inside a plane wreck. Against his better judgement, Hank decides to go along with the idea of keeping it rather than going to the authorities. The rest of the film is a question of who is going to die to keep this a secret, and is it worth it? A Simple Wish lies along the lines of Very Bad Things, Clay Pigeons and even Fargo, and is kind of wrapped all into one little dark bundle. Oh, and its much better than any of those.
Sam Raimi took a departure from his normal freak-show horror-monkey films and made this stylish and intriguing picture. He really lets the audience sit back and watch the events unfold rather than force them down our throats as many directors prefer to do. I think Raimi knew he had a winner on his hands and decided to direct the picture on a natural flowing course.
One of the film's components can be linked to a recurring theme in Terrence Malick's The Thin Red Line. In Malick's three hour bore-a-thon, he makes an interesting attempt to link Mother Earth to his war story. It seemed nothing more than an occasional pretty cut to a field of flowing grass, a small bird, or a flowing body of water. Sure, there were obvious metaphorical connections, but there was no subtlty to his efforts. Raimi does a fine job of tying in a fox in a chicken coop and birds of prey to signify the future of the characters. I think most viewers may miss the comparison, but it is a very intriguing ingredient in the film.
And then there's Billy Bob Thorton, who is proof that the independent film industry is vital to the life blood of Hollywood. If it can continute to produce people like Thorton, Hollywood will be ok. He gives a fantastic and devastatingly deep performance here. It is not as engrossing as his Carl Childers character in Slingblade, but is is just as complex, if not more so. Jacob is slow and simple, and yet we so often see him deep in thought. I wondered if he was thinking about things that he would never say (or didn't know HOW to say) or if he was just taking a long time to think about the thing he just said. Here he really proves his worth as one of the best character actors in the industry.
Though the plot is somewhat unoriginal, it has a very appealing new twist in its characters. Paxton gives one of the better performances of his career as the straight and serious leader of the group (a far cry from Chet in Wierd Science). Perhaps Bridget Fonda is miscast as his advice-giving wife, but she certainly doesn't do anything ruin the picture. A Simple Plan can be included in the group of recent small Hollywood films that is just dark and pretty un-redeeming. But at least this one has an important message, unlike so many of its counterparts.
* * * 1/2 out of * * * * stars ©1999 Nick Amado<EMAIL_ADDRESS>check out my movie reviews at www.writerboy.com/nick (or I'll come to your house and read all my reviews outloud in Miss Piggy's voice)
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


Hello, I'm Abdulla
Thanks for dropping by!. I am a Software Developer with almost two years of professional experience. I did my master's thesis in data indexing and retrieval. As a developer, I developed intriguing software features, participated in refactoring, automated testing, API design, and enjoyed creating automation scripts. I have also handled production infrastructure, worked with prominent open-source software and Third-party APIs. I am curious about software scalability and designing system with reliability. I constantly discover things about Backend Development, Computing Infrastructure, and Site Reliability Engineering.
Apart from my technical interests, I enjoy culinary and poetry. Well, mostly Tamil cinematic songs with poetic lyrics :). This site mainly serves two purposes:- 1) A portal to exhibit my understanding of computing and share stuff that interests me (The Two Wind Rose). 2) To act as an index for beautiful resources I come across, especially in the field of computer science (Modern Eṭṭuttokai).


import math
from torch import nn
from torch import Tensor
from collections import OrderedDict
from functools import partial
from einops.layers.torch import Rearrange, Reduce
ReLUInPlace = partial(nn.ReLU, inplace=True)
[docs]class SpatialSE(nn.Module):
"""Implementation of Squeeze and Excitation Module proposed in `Squeeze-and-Excitation Networks <https://arxiv.org/abs/1709.01507>`_
The idea is to apply a learned an channel-wise attention.
It squeezes spatially and excitates channel-wise.
The authors reported a bigger performance increase where the number of features are higher.
.. image:: https://github.com/FrancescoSaverioZuppichini/glasses/blob/develop/docs/_static/images/se.png?raw=true
Further visualisation from `Concurrent Spatial and Channel ‘Squeeze & Excitation’ in Fully Convolutional Networks <https://arxiv.org/abs/1803.02579>`_
.. image:: https://github.com/FrancescoSaverioZuppichini/glasses/blob/develop/docs/_static/images/SpatialSE.png?raw=true
Examples:
Add `SpatialSE` to your own model is very simple.
>>> nn.Sequential(
>>> nn.Conv2d(32, 64, kernel_size=3),
>>> SpatialSE(64, reduction=4)
>>> nn.ReLU(),
>>> )
You can also direcly specify the number of features inside the module
>>> nn.Sequential(
>>> nn.Conv2d(32, 64, kernel_size=3),
>>> SpatialSE(64, reduced_features=10)
>>> nn.ReLU(),
>>> )
The following example shows a more advance scenarion where we add Squeeze ad Excitation to a `ResNetBasicBlock`.
>>> class SENetBasicBlock(ResNetBasicBlock):
>>> def __init__(self, in_features: int, out_features: int, reduction: int =16, *args, **kwargs):
>>> super().__init__(in_features, out_features, *args, **kwargs)
>>> # add se to the `.block`
>>> self.block.add_module('se', SpatialSE(out_features))
Creating the original seresnet50
>>> from glasses.nn.models.classification.resnet import ResNet, ResNetBottleneckBlock
>>> from glasses.nn.att import ECA, WithAtt
>>> se_resnet50 = ResNet.resnet50(block=WithAtt(ResNetBottleneckBlock, att=SpatialSE))
>>> se_resnet50.summary()
Args:
features (int): Number of features
reduction (int, optional): Reduction ratio used to downsample the input. Defaults to 16.
reduced_features (int, optional): If passed, use it instead of calculating the reduced features using `reduction`. Defaults to None.
"""
def __init__(
self,
features: int,
reduction: int = 16,
reduced_features: int = None,
activation: nn.Module = ReLUInPlace,
):
super().__init__()
self.reduced_features = (
features // reduction if reduced_features is None else reduced_features
)
self.avg_pool = nn.AdaptiveAvgPool2d(1)
self.att = nn.Sequential(
OrderedDict(
{
"fc1": nn.Linear(features, self.reduced_features, bias=False),
"act1": activation(),
"fc2": nn.Linear(self.reduced_features, features, bias=False),
"act2": nn.Sigmoid(),
}
)
)
[docs] def forward(self, x: Tensor) -> Tensor:
b, c, _, _ = x.size()
y = self.avg_pool(x).view(b, c)
# y has shape [B, C]
y = self.att(y)
# resphape to [B, C, 1, 1] to match the space dims of x
y = y.view(b, c, 1, 1)
return x * y.expand_as(x)
[docs]class ChannelSE(SpatialSE):
"""Modified implementation of Squeeze and Excitation Module proposed in `Concurrent Spatial and Channel ‘Squeeze & Excitation’ in Fully Convolutional Networks <https://arxiv.org/abs/1803.02579>`_
It squeezes channel-wise and excitates spatially.
.. image:: https://github.com/FrancescoSaverioZuppichini/glasses/blob/develop/docs/_static/images/ChannelSE.png?raw=true
Examples:
Add `ChannelSE` to your own model is very simple.
>>> nn.Sequential(
>>> nn.Conv2d(32, 64, kernel_size=3),
>>> ChannelSE(64, reduction=4)
>>> nn.ReLU(),
>>> )
You can also direcly specify the number of features inside the module
>>> nn.Sequential(
>>> nn.Conv2d(32, 64, kernel_size=3),
>>> ChannelSE(64, reduced_features=10)
>>> nn.ReLU(),
>>> )
Creating the cseresnet50
>>> from glasses.nn.models.classification.resnet import ResNet, ResNetBottleneckBlock
>>> from glasses.nn.att import ECA, WithAtt
>>> se_resnet50 = ResNet.resnet50(block=WithAtt(ResNetBottleneckBlock, att=ChannelSE))
>>> se_resnet50.summary()
Args:
features (int): Number of features
reduction (int, optional): Reduction ratio used to downsample the input. Defaults to 16.
reduced_features (int, optional): If passed, use it instead of calculating the reduced features using `reduction`. Defaults to None.
"""
def __init__(
self, features: int, *args, activation: nn.Module = ReLUInPlace, **kwargs
):
super().__init__(features, *args, activation=activation, **kwargs)
self.att = nn.Sequential(
OrderedDict(
{
"conv1": nn.Conv2d(features, self.reduced_features, kernel_size=1),
"act1": activation(),
"conv2": nn.Conv2d(self.reduced_features, features, kernel_size=1),
"act2": nn.Sigmoid(),
}
)
)
[docs] def forward(self, x: Tensor) -> Tensor:
y = self.avg_pool(x)
y = self.att(y)
return x * y
[docs]class SpatialChannelSE(nn.Module):
"""Implementation of Spatial and Channel Squeeze and Excitation Module proposed in `Concurrent Spatial and Channel ‘Squeeze & Excitation’ in Fully Convolutional Networks <https://arxiv.org/abs/1803.02579>`_
This module combines booth Spatial and Channel Squeeze and Excitation
.. image:: https://github.com/FrancescoSaverioZuppichini/glasses/blob/develop/docs/_static/images/SpatialAndChannelSE.png?raw=true
Examples:
Add `SpatialChannelSE` to your own model is very simple.
>>> nn.Sequential(
>>> nn.Conv2d(32, 64, kernel_size=3),
>>> SpatialChannelSE(64, reduction=4)
>>> nn.ReLU(),
>>> )
You can also direcly specify the number of features inside the module
>>> nn.Sequential(
>>> nn.Conv2d(32, 64, kernel_size=3),
>>> SpatialChannelSE(64, reduced_features=10)
>>> nn.ReLU(),
>>> )
Creating scseresnet50
>>> from glasses.nn.models.classification.resnet import ResNet, ResNetBottleneckBlock
>>> from glasses.nn.att import ECA, WithAtt
>>> se_resnet50 = ResNet.resnet50(block=WithAtt(ResNetBottleneckBlock, att=SpatialChannelSE))
>>> se_resnet50.summary()
Args:
features (int): Number of features
reduction (int, optional): Reduction ratio used to downsample the input. Defaults to 16.
reduced_features (int, optional): If passed, use it instead of calculating the reduced features using `reduction`. Defaults to None.
"""
def __init__(self, *args, **kwargs):
super().__init__()
self.spatial_se = SpatialSE(*args, **kwargs)
self.channel_se = ChannelSE(*args, **kwargs)
[docs] def forward(self, x: Tensor) -> Tensor:
s_se = self.spatial_se(x)
c_se = self.channel_se(x)
return x * (s_se + c_se)
[docs]class ECA(nn.Module):
"""Implementation of Efficient Channel Attention proposed in `ECA-Net: Efficient Channel Attention for Deep Convolutional Neural Networks <https://arxiv.org/pdf/1910.03151.pdf>`_
.. image:: https://github.com/FrancescoSaverioZuppichini/glasses/blob/develop/docs/_static/images/ECA.png?raw=true
Examples:
>>> # create ecaresnet50
>>> from glasses.models.classification.resnet import ResNet, ResNetBottleneckBlock
>>> from glasses.nn.att import ECA, WithAtt
>>> eca_resnet50 = ResNet.resnet50(block=WithAtt(ResNetBottleneckBlock, att=ECA))
>>> eca_resnet50.summary()
Args:
features (int, optional): Number of features features. Defaults to None.
kernel_size (int, optional): [description]. Defaults to 3.
gamma (int, optional): [description]. Defaults to 2.
beta (int, optional): [description]. Defaults to 1.
"""
def __init__(
self, features: int, kernel_size: int = 3, gamma: int = 2, beta: int = 1
):
super().__init__()
assert kernel_size % 2 == 1
t = int(abs(math.log(features, 2) + beta) / gamma)
k = t if t % 2 else t + 1
self.att = nn.Sequential(
Reduce("b c h w -> b 1 c", reduction="mean"),
nn.Conv1d(1, 1, kernel_size=k, padding=k // 2, bias=False),
Rearrange("b 1 c -> b c 1 1"),
nn.Sigmoid(),
)
[docs] def forward(self, x: Tensor) -> Tensor:
y = self.att(x)
return x * y
[docs]class WithAtt:
"""Utility class that adds an attention module after `.block`.
:Usage:
>>> WithAtt(ResNetBottleneckBlock, att=SpatialSE)
>>> WithAtt(ResNetBottleneckBlock, att=ECA)
>>> from functools import partial
>>> WithAtt(ResNetBottleneckBlock, att=partial(SpatialSE, reduction=8))
"""
def __init__(self, block: nn.Module, att: nn.Module = SpatialSE):
self.block = block
self.att = att
def __call__(
self, in_features: int, out_features: int, *args, **kwargs
) -> nn.Module:
b = self.block(in_features, out_features, *args, **kwargs)
b.block.add_module("se", self.att(out_features))
return b


Great.gov.uk includes a useful set of guides on expanding to the UK.
Read our guide Set up a business, where you can find:
- step by step guides to registering the most common types of UK businesses
- links to specific UK rules for different business models
- details of the different responsibilities if you run the business from home or from a separate rented or purchased property
- information on your responsibilities if you take on additional permanent or temporary staff


Transformations
Transformations always have at least one input and one output. Inputs can be connected either to other transformations or sources, and the output can also connect to other transformations or to destinations. The purpose of a transformation component is to take the data from its input(s) and post the transformed data to its outputs. This is done on a row-by-row basis. As soon as there is any data in the input, the transformation will start and post the result to the output.
Buffering
Every transformation will come with an input. If the components connected to the input post data faster than the transformation can process it, the buffer will hold this data until the transformation can continue with the next item. This allows a source to read as fast as possible, allowing the already read data to be buffered in the memory - so the transformation will always have some data ready to process.
Non-Blocking and Blocking transformations
Transformation can be either blocking or non-blocking.
Non-Blocking transformations will start to process data as soon as it finds something in its input buffer. In the moment where it discovers data in there, it will start to transform it and send the data to registered output components.
Blocking transformations will stop the data processing for the whole pipe - the input buffer will wait until all data has reached the input. This means it will wait until all sources in the pipe connected to the transformation have read all data from their source, and all transformations before have processed the incoming data. When all data was read from the connected sources and transformations further down the pipe, the blocking transformation will start the transformation. In a transformation of a blocking transformation, you will therefore have access to all data buffered within the memory. For instance, the sort component is a blocking transformation. It will wait until all data has reached the transformation block - then it will sort it and post the sorted data to its output.
Non blocking tranformations
RowTransformations
The RowTransformation is the simplest but most powerful transformation in ETLBox. The generic transformation has two types
- the type of the input data and the type of the output data. When creating a RowTransformation, you pass a delegate describing how each record in the dataflow is transformed. Here you can add any C# code that you like.
The RowTransformation is a non blocking transformation, so it won't use up much memory even for high amounts of data.
Here is an example that convert a string array into a MySimpleRow
object.
public class MySimpleRow
{
public int Col1 { get; set; }
public string Col2 { get; set; }
}
RowTransformation<string[], MySimpleRow> trans = new RowTransformation<string[], MySimpleRow>(
csvdata =>
{
return new MySimpleRow()
{
Col1 = int.Parse(csvdata[0]),
Col2 = csvdata[1]
};
});
LookupTransformation
The lookup is a row transformation, but before it starts processing any rows it will load all data from the given LookupSource into memory and will make it accessible as a List object. Though the lookup is non-blocking, it will take as much memory as the lookup table needs to be loaded fully into memory.
A lookup can be used with the Attributes MatchColumn
and RetrieveColumn
. The MatchColumn defines which property in the target object needs to match, so
that the lookup should retrieve the value. The RetrieveColumn maps the retrieved value to a property in the target class.
Let's look at an example:
public class LookupData
{
[MatchColumn("LookupId")]
public int Id { get; set; }
[RetrieveColumn("LookupValue")]
public string Value { get; set; }
}
public class InputDataRow
{
public int LookupId { get; set; }
public string LookupValue { get; set; }
}
MemorySource<InputDataRow> source = new MemorySource<InputDataRow>();
source.Data.Add(new InputDataRow() { LookupId = 1 });
MemorySource<LookupData> lookupSource = new MemorySource<LookupData>();
lookupSource.Data.Add(new LookupData() { Id = 1, Value = "Test1" });
var lookup = new LookupTransformation<InputDataRow, LookupData>();
lookup.Source = lookupSource;
MemoryDestination<InputDataRow> dest = new MemoryDestination<InputDataRow>();
source.LinkTo(lookup);
lookup.LinkTo(dest);
If you don't want to use attributes, you can define your own lookup functions.
DbSource<MyLookupRow> lookupSource = new DbSource<MyLookupRow>(connection, "Lookup");
List<MyLookupRow> LookupTableData = new List<MyLookupRow>();
LookupTransformation<MyInputDataRow, MyLookupRow> lookup = new Lookup<MyInputDataRow, MyLookupRow>(
lookupSource,
row =>
{
Col1 = row.Col1,
Col2 = row.Col2,
Col3 = LookupTableData.Where(ld => ld.Key == row.Col1).Select(ld => ld.LookupValue1).FirstOrDefault(),
Col4 = LookupTableData.Where(ld => ld.Key == row.Col1).Select(ld => ld.LookupValue2).FirstOrDefault(),
return row;
}
, LookupTableData
);
Splitting data
In some of your data flow you may want to split the data and have it processed differently in the further flow. E.g. your data comes from one source and you want parts of it written into one destination and parts of it written into another. Or you like to split up data based on some conditions. For this purpose you can use the Multicast
Multicast
The Multicast
is a component which basically duplicates your data. It has one input and two or more outputs.
(Technically, it could also be used with only one output, but then it wouldn't do much.)
Multicast is a non-blocking operation.
The following code demonstrate a simple example where data would be duplicated and copied into two destinations - a database table and a Json file.
var source = new CsvSource("test.csv");
var multicast = new Multicast();
var destination1 = new JsonDestination("test.json");
var destination2 = new DbDestination("TestTable");
source.LinkTo(multicast);
multicast.LinkTo(destination1);
multicast.LinkTo(destination2);
If you want to split data, you can use Predicates. Predicates allow you to let only certain data pass. E.g. the following code would only copy data into Table1 where the first column is greater 0, the rest will be copied into Table2.
var source = new CsvSource("test.csv");
var multicast = new Multicast();
var destination1 = new DbDestination("Table1");
var destination2 = new DbDestination("Table2");
source.LinkTo(multicast);
multicast.LinkTo(destination1, row => row[0] > 0);
multicast.LinkTo(destination2, row => row[0] < 0);
Please note: Make sure when using predicate that always all rows arrive at a destination. Use a VoidDestination
for records that you don't want to keep. See more about this in the article about Predicates.
Merging data
If you want to merge data in your dataflow, you can use the MergeJoin
. This basically joins the outcome
of two sources or transformations into one data record.
MergeJoin
The MergeJoin accepts two inputs and has one output. A function describes how the two inputs are combined into one output. E.g. you can link two sources with the MergeJoin, define a method how to combine these records and produce a new merged output. The data type of the output and the inputs can be different, as long as you handle it in the join function. MergeJoin is a non blocking transformation.
DbSource<MyInputRowType1> source1 = new DbSource<MyInputRowType1>(Connection, "MergeJoinSource1");
DbSource<MyInputRowType2> source2 = new DbSource<MyInputRowType2>(Connection, "MergeJoinSource2");
DbDestination<MyOutputRowType> dest = new DbDestination<MyOutputRowType>(Connection, "MergeJoinDestination");
MergeJoin<MyInputRowType1, MyInputRowType2, MyOutputRowType> join = new MergeJoin<MyInputRowType1, MyInputRowType2, MyOutputRowType>(
(inputRow1, inputRow2) => {
return new MyOutputRowType() {
Value = inputRow1.Value + inputRow2.Value
};
});
source1.LinkTo(join.Target1);
source2.LinkTo(join.Target2);
join.LinkTo(dest);
Aggregation
The aggregation allow you to aggregate data in your flow in a non-blocking transformation. Aggregation functions are sum, min, max and count. This means that you can calculate a total sum, the min or max value or the count of a all items in your flow. Also, you can define your own aggregation function. The aggregation does not necessarily be calculated on your whole data. You can specify that your calculation is grouped by a particular property or function.
There are two ways to use the Aggregation. The easier way is to make use of the attributes AggregationColumn
and GroupColumn
. The first parameter is the
property name of target property.
public class MyRow
{
public string ClassName { get; set; }
public double DetailValue { get; set; }
}
public class MyAggRow
{
[GroupColumn(nameof(MyRow.ClassName))]
public string GroupName { get; set; }
[AggregateColumn(nameof(MyRow.DetailValue), AggregationMethod.Sum)]
public double AggValue { get; set; }
}
MemorySource<MyRow> source = new MemorySource<MyRow>();
Aggregation<MyRow, MyAggRow> agg = new Aggregation<MyRow, MyAggRow>();
MemoryDestination<MyAggRow> dest = new MemoryDestination<MyAggRow>();
source.LinkTo(agg);
agg.LinkTo(dest);
To achieve the same behaviour with your own functions, you could create the Aggregation like this:
Aggregation<MyRow, MyAggRow> agg = new Aggregation<MyRow, MyAggRow>(
(row, aggValue) => aggValue.AggValue += row.DetailValue,
row => row.ClassName,
(key, agg) => agg.GroupName = (string)key
);
Blocking Transformations
BlockTransformation
A BlockTransformation waits until all data is received at the BlockTranformation - then it will be available in a List object and you can do modifications on your whole data set. Keep in mind that this transformation will need as much memory as the amount of data you loaded.
BlockTransformation<MySimpleRow> block = new BlockTransformation<MySimpleRow>(
inputData => {
inputData.RemoveRange(1, 2);
inputData.Add(new MySimpleRow() { Col1 = 4, Col2 = "Test4" });
return inputData;
});
Sort
A sort will wait for all data to arrive and then sort the data based on the given sort method.
Comparison<MySimpleRow> comp = new Comparison<MySimpleRow>(
(x, y) => y.Col1 - x.Col1
);
Sort<MySimpleRow> block = new Sort<MySimpleRow>(comp);


In music, the melody is the most prominent line of notes in the song at the time, usually the loudest. It is the part that is being showcased by the rest of the parts: the bass and the harmony. My point is that the harmony ties it all together, while not being enough to rule on its own, like a nice rug. People are not music though, and what I'm getting at is that its awesome when people work together as a team. Working as a cook required teamwork as second nature, and playing music over half my life taught me the importance of the middle roles in life. So my actual point is that I, for one, can take one for the team and not be in charge all the time, and I think the people that are willing to be lead, the easier a time the leaders will have leading.


|
Final Fantasy CDs |
||
|
|
Welcome to the library of Daryl's airship! Feel free to browse through the volumes of info I've collected on the many Final Fantasy CDs. Unfortunately, I can't read Japanese very well, so I can't give complete information, such as singer names, background, and whatever other cool info they're giving in the liner notes.
May 14, 2015: Wow. After a few years, finally an update! Unfortunately I am no longer following the CD releases beyond what is already listed on this site, as I can't afford to do so anymore. There are a few promotional CDs, miscellaneous collections, and soundtrack re-releases that I will probably eventually post, but for the most part, beyond the two Final Fantasy XIV soundtracks the site will no longer be updated with subsequent CDs.
All CD covers pictured on the description pages are the original Square (Japanese) versions. All Final Fantasy games are referred to by their Japanese numbering. All "buy" links will lead you to the original Japanese versions. All scans have been done by myself, except where noted.
|


[tap or hover over a skill to see]
how to truly design and create a delightful, intuitive, and effective user experience that solves a problem.
how to deconstruct research insights into fundamental building blocks, and use those to construct a brand new experience the aligns with users' mental models.
that communication design remains at the heart of my design work. I am constantly reevaluating how I can best convey my concepts to others in all aspects of what I create.
how to work with clients to understand their goals, refine that information into an approachable brand, and expand that brand throughout the organization.
the importance of staying constantly attuned to current design trends. I've become experienced in visual design of print, digital, and animated materials, and am always looking to other designers to improve my skills.
how to juggle client or internal stakeholders, market demands, development constraints, and user experience to design a product that scales through a planned roadmap for an organization.
how to effectively recruit, lead and manage a team. Throughout my editorship in college, leadership role on my capstone team at Carnegie Mellon, and leader/manager role on countless software project teams, I have learned to motivate a group of individuals towards a creative task.
how to design many different forms of user interfaces, such as video games, websites, mobile applications, and more.
the importance of assessing my designs throughout the entire process. I've conducted and interpreted many different forms of exploratory, generative, and evaluative user research.
to create product concepts from ground zero, beginning with contextual research, to conceptualization, testing and iteration, and refinement/rendering of final concepts.
how to develop a product from start to finish, using a 4-step process of identification, understanding, conceptualization, and realization. Working with clients and leading a team through this process has been invaluable.
when illustration can have a powerful impact on design and communication, and the importance of aesthetic in an illustration's messaging.
when video can be effective and how to leverage current production trends to take video footage or animations to the next level.


{% extends "layout.html" %} {% block content %}
Record the docs helps you write documentation for humans. Humans who want pictures and gifs, not obscure jargon. Why don't you try the one of the following projects?
Yup - no need to do any complex setup. Just select a project and get going.
Record the docs gives you 100% compatibility with readthedocs. Gone are worries of doc builds and hosting for your open source projects.
Don't tell me - show me. Record walkthroughs instead of using complex jargon.


Doctor Find
We do the work so you dont have to
Doctor Find
We do the work so you dont have to
Doctor Find
We do the work so you dont have to
The worlds premiere doctor finding app
Enter in your medical issue
Search


This example will allow you to draw several rectangles via a feedback tool below.
When you click submit, a screenshot will be rendered to a canvas element (will appear below). below.
View the source to take a look at the code.
Below is the rendered result.
Please give a short description of your feedback. You can also highlight or blackout parts of the screen.


JONASFERRY.COM
2016-11-21
FERRYHACK GRID RULES
OVERVIEW
Ferryhack started in October 2013 as a combination of rules from WHITEHACK and written adventures from DRAKAR OCH DEMONER. The first adventure saw two players crawl through The Pyramid of the Spider King (Spindelkonungens pyramid), and has been followed by many old-school Drakar adventures in a bi-weekly campaign. The name Ferryhack is used by the players to refer to my (Jonas Ferry) propensity to add, modify, and remove rules from Whitehack. We started with Whitehack 1, but have moved on to a house-ruled version of Whitehack 2.
In addition to rules from Whitehack 2 (2015) and Drakar och Demoner 2.1 (1985), the main inspiration is Moldvay's BASIC DUNGEONS AND DRAGONS (1981).
This text describes the grid rules used mainly during the adventures DEAD FOREST (Döda skogen, 1985), GATES OF POWER (Maktens portar, 1985), and HEART OF DARKNESS (Mörkrets hjärta, 1986). At the start of VOICE FROM THE PAST (Rösten från forntiden, 1986), the group returned to the theater of mind, described in FERRYHACK.
TABLE OF CONTENTS
GRID
ABBREVIATIONS
ARMOR
DEFENSIVE MOVEMENT
DISENGAGE
ENCUMBRANCE
FLANK
FREE ATTACK
HORSE
MOVEMENT
SPELLS
SQUARE
XP
HOUSE RULES
ABBREVIATIONS
AC Armor Class or Action Complexity
AV Attack Value or Attribute Value
BEP Base Encumbrance Point
CHA Charisma attribute
CON Constitution attribute
CP Copper Piece
DEX Dexterity attribute
GP Gold Piece
HD Hit Dice
HP Hit Points
INT Intelligence attribute
MP Magic Points
NPC Non-Player Character
PC Player Character
SL Spell Level
SP Silver Piece
ST Saving Throw
STR Strength attribute
XP Experience Points
WIS Wisdom attribute
ARMOR
Armor does not take up slots when worn, only when carried. Some monsters wear armor (e.g. orcs wear studded leather or leather and shield), some monsters wear armor in addition to natural armor (e.g. one type of ogre may have natural armor 0 and chainmail while another have natural armor 2 and leather), and some monster only have natural armor (e.g. wolves). The sum of natural armor and worn armor is found in Whitehack's monster table.
Armor AC Mv(sq) Slots Cost(gp)
Cloth 1 0 1 1
Shield 1 -1 1 5
Leather 2 0 2 15
Leather 3 0 4 20
(studded)
Chainmail 4 -1 6 30
Splint Mail 5 -1 8 40
Full Plate 6 -1* 10 50
* To run in full plate, roll STR. Success means second move action is used, failure means PC cannot move at all next round.
DEFENSIVE MOVEMENT
By default when a PC or monster is attacked, the defender moves defensively to a square backwards or diagonally backwards. It is considered a part of the defense and does not provoke free attacks from other opponents. By default, the attacker moves to the square that the defender occupied.
The defender can choose to stand their ground, which gives the attacker combat advantage. If a square is occupied by a wall, item, or another character, the defender must move to a free square. If all squares are occupied, the defender may move to a square with an ally if the ally makes a defensive movement of their own. If all squares are occupied with non-allies, the defender must stand their ground and give the attacker combat advantage.
Combat advantage from standing ground is added to combat advantage from flanking. The squares are the same as for FLANK.
The attacker can choose to not follow the defender by using the special combat option Fight Defensively from Whitehack. This makes it possible to disengage and use the second movement action for full movement.
The special combat option Trick (Push) and the Strong melee option 2 (Push) take effect after the defender's movement and the attacker's follow-up move.
The diagrams show an attacker (a) that attacks a defender (d), and the squares that the defender can move to (x).
___ ___ ___
| | x | x |
|___|___|___|
| | d | x |
|___|___|___|
| a | | |
|___|___|___|
___ ___ ___
| | | x |
|___|___|___|
| a | d | x |
|___|___|___|
| | | x |
|___|___|___|
DISENGAGE
To disengage from combat, one action is used to defend and one action is used to move carefully away from the opponent. An unecumbered human moves 3 squares when disengaging. Disengaging does not provoke a free attack.
ENCUMBRANCE
Equipment is carried in slots divided between body, backpack, and sack. One slot is equal to 1 BEP or 2-3 kg. 200 small items (e.g. coins, rings, jewels) use one slot. Normal sized items (e.g. swords, shields) use one slot. A quiver with 20 items of ammunition (e.g. quiver with arrows, bolts, sling stones) use one slot. Large items (e.g. two-handed swords, halberds) use two slots.
The body carries 5 slots. A one-handed weapon use 1 slot, a shield 1 slot, and a two-handed weapon 2 slots. Worn armor does not use any slots. Used body slots do not affect movement.
A small backpack carries 5 slots while a large backpack carries 10 slots. Any slots used in a small backpack reduce movement by 1 square. Any slots used in a large backpack reduce movement by 2 squares.
A sack carries 5 slots. Any slots used in a sack reduce movement by 1 square.
STR 13+ gives an extra slot of each type and STR 16+ gives two extra slots.
TYPE SLOTS SLOTS SLOTS ENC
STR 12- STR 13+ STR 16+
Body 5 6 7 0
Backpack 5 6 7 2
small
Backpack 10 12 14 4
large
Sack 5 6 7 2
GEAR SLOTS COST(sp)
200 sp 1 200
Ration 1/2 1
Ration 1/4 3
(trail)
Bandages 1/2 2
Torch 1/2 1/6
Lantern 2 10
Lamp oil 1/4 2
Quiver 1 5
Saddle 5 25
Saddle bags - 10
Tent 5 15
(1 person)
FLANK
The attacker gets combat advantage if an ally is placed behind or diagonally behind the defender.
Combat advantage from flanking is added to combat advantage from standing ground. The squares are the same as for DEFENSIVE MOVEMENT.
The diagrams show an attacker (a) that attacks a defender (d), and the squares where an ally must stand to give the attacker combat advantage.
___ ___ ___
| | x | x |
|___|___|___|
| | d | x |
|___|___|___|
| a | | |
|___|___|___|
___ ___ ___
| | | x |
|___|___|___|
| a | d | x |
|___|___|___|
| | | x |
|___|___|___|
FREE ATTACK
PCs and monsters guard their surrounding eight squares. If an opponent leaves a guarded square, the guard gets a free attack. Characters with more than one free attack (e.g. Strong) may attack once for each guarded square that is left, a number of times equal to the character's level.
The only thing that provokes a free attack is to move away from a guarded square. Readying a potion, quaffing a potion, or preparing a spell does not provoke a free attack.
The diagram shows a guard (g) and the eight guarded squares (x).
___ ___ ___
| x | x | x |
|___|___|___|
| x | g | x |
|___|___|___|
| x | x | x |
|___|___|___|
HORSE
Pack animals have three encumbrance levels, with a number of slots according to class, e.g. mule=20. Master bred animals (cost x 20) get death saves at 5+HD. A normal human take up 40 slots. 1 slot = 1 BEP = 2-3 kg.
Encumbrance Move(sq)
First level Full
Second level -2
Third level -3
Class HD Move(sq) Slots Cost(sp)
Donkey 1 6 15 15
Mule 1 8 20 20
Small horse 1 8 20 30
Horse 2 10 25 60
Work horse 3 8 50 90
War horse 3 8 50 120
MOVEMENT
Each PC and monster can use one or two actions for movement each combat round. Moving carefully (e.g. disengage from combat or sneak) means movement per action is halved. Walking or running doesn't affect the movement per action, it all depends on if the character use one or two actions for movement. Wearing full plate armor means that the second movement action (after modification) is halved.
Species Move(sq)
Giant 8
Human 6
Elf 6
Dwarf 4
Halfling 4
Goblin 4
SPELLS
Spellcasters learn spells by assigning them to active or inactive slots. It takes 12 hours to switch an inactive spell into an active slot. Spellcasting monsters have HD number of active spells and an equal number of inactive.
Spells have a minimum level for PCs or a minimum HD for monsters to learn the spell. A spellcaster can cast spells of a spell level equal to or lower than their level.
Spells take a full round of concentration to prepare where the spellcaster cannot do anything else. When the spell is prepared, the spell and spell level (SL) must be stated, but the target is decided when the spell takes effect. The spell takes effect immediately before the spellcaster's next round, so they can use the next round to prepare a new spell.
Successful spells and critical failures cost 1 MP per SL. Failed spells cost 1 MP regardless of SL. Aborted spells do not cost any MP.
A PC spellcaster's chance of success is based on their save vs magic, with +2 for all wise characters. WIS 13+ gives +1 and WIS 16+ gives +2.
Caster WIS WIS WIS
level 12- 13+ 16+
1 8 9 10
2 9 10 11
3 10 11 12
4 11 12 13
5 12 13 14
6 13 14 15
7 14 15 16
8 15 16 17
9 16 17 18
10 17 18 19
A monster spellcaster's chance of success is 5+HD and their MP is 10+HD, with +1 chance of success at HD 3 and +2 at HD 6.
As long as a spellcaster concentrates on an active spell they can not do anything else, not even move or speak.
The spells are presented with the Swedish name in parenthesis.
Adding spell descriptions is work in progress.
Level 1
Mirror Image (AVBILD), range 20 squares, duration 2 dungeon turns
Creates one human-sized illusion per SL. Extra SLs create multiple illusions or one larger illusion. The illusion is only visual, and has no sound, taste, or substance. The illusion can be made to move as long as the spellcaster concentrates.
Fire (ELD), range 80 squares, duration instant
Heats a sphere the size of a square and makes 1d6 damage. Extra SL either gives an extra affected square or +1d6 damage in any combination. Stopped by Armor (SKYDD), but not by Anti Magic (ANTIMAGI). See entry on FIRE for damage and save.
Frost (FROST)
See Fire (ELD), but cold. There's no corresponding effect to catching on fire.
Seal (FÖRSEGLA), range touch, duration 2 dungeon turns
Binds together two objects that don't move and fit together, for example a door to the frame or a sword to the scabbard. The objects are impossible to separate for the spell's duration, and any attempts to bash them open (i.e. chests or doors) take an extra dungeon turn. Each extra SL either adds two extra dungeon turns of duration or an extra dungeon turn of durability against bashing.
Light (LJUS), range 80 squares, duration 1 dungeon turn
Makes part of an object (approximately 4x4x4 cm) glow and illuminate 2 squares in each direction. Each extra SL either adds 2 extra squares in each direction or increases duration by 1 dungeon turn. To overcome the spell Darkness (MÖRKER) an equal SL or more of Light (LJUS) is needed.
Resistance (MOTSTÅNDSKRAFT), range touch, duration 2 dungeon turns
Protects from damage from the spells Fire (ELD) and Frost (FROST), as well as normal damage from heat or cold. Decreases 1 HP of damage per SL from those sources. If the user takes damage from multiple sources at the same time, the damage is decreased for each of them.
Darkness (MÖRKER), range 80 squares, duration 1 dungeon turn
Makes part of an object (approximately 4x4x4 cm) consume all light in 2 squares in each direction. Each extra SL either adds 2 extra squares in each direction or increases duration by 1 dungeon turn. To overcome the spell Light (LJUS) an equal SL or more of Darkness (MÖRKER) is needed.
Stone Wall (STENVÄGG), range 8 squares, duration 1 dungeon turn
Pulls up a wall from the dirt or a stone floor that is 1 square thick, 3 squares wide, and 3 squares high. Each extra SL adds the length of a square in one direction.
Level 2
Anti Magic (ANTIMAGI), range 80 squares, duration 1 dungeon turn
Placed on a creature or item and protects a volume of 3x3x3 squares. Gives +1 save vs magic per SL. A spell that is successfully saved is returned at the spellcaster. If cast in conjuction with Armor (SKYDD), the chance of success for Anti Magic (ANTIMAGI) is decreased by 1 per SL Armor (SKYDD).
Lightning (BLIXT), range 40 squares, duration instant, quick
Shoots a lightning bolt from the spellcaster to the closest target in front of the spellcaster. If two targets are equal, it's drawn to the target with most metal. Target gets save vs magic for half damage. This spell is quick, which means it takes effect the same combat round as it is prepared, not the next round.
Energy Beam (ENERGISTRÅLE), range 80 squares, duration instant
A beam of magic energy that does 1d6 damage per SL if it hits the target. Roll to-hit vs target AC, but not save vs magic.
Curse Weapon (FÖRBANNA VAPEN), range 80 squares, duration 1 dungeon turn
Gives a weapon -1 AV and damage per SL. Each extra SL gives an extra -1, which may be divided between multiple weapons.
Enchant Weapon (FÖRTROLLA VAPEN), range 80 squares, duration 1 dungeon turn
Gives a weapon +1 AV and damage per SL. Each extra SL gives an extra +1, which may be divided between multiple weapons. Enchanted weapons damage monsters that only take damage from magic weapons.
Lift (LYFT), range 80 squares, duration 2 dungeon turns
Lifts one human-sized object per SL, and can fly it through the air at a speed of 8 squares per movement action. Can be divided between multiple objects to make them all lighter or break a fall. When breaking a fall, each SL missing from lifting the full objects gives 1d6 damage.
Decrease (MINSKA), range touch, duration 1 dungeon turn
Decrease the target's STR, DEX, or CON by 1 per SL. Attributes cannot be decreased below 1.
Dispel (SKINGRA), range 80 squares, duration instant, quick
Destroys another spell, or banishes an elemental, of equal or lower SL. Dispel (SKINGRA) must target a specific spell, but the spellcaster only needs an approximate idea of what the spell is. If the target is protected by Anti Magic (ANTIMAGI) it gets to save vs magic to avoid destruction. Items get to save with 10+1 per SL Anti Magic (ANTIMAGI). A spell that is being prepared can be dispelled, if the SL is equal or higher than the spell to destroy.
Armor (SKYDD), range 80 squares, duration 1 dungeon turn
Adds +1 AC per SL. If cast in conjuction with Anti Magic (ANTIMAGI), the chance of success for Armor (SKYDD) is decreased by 1 per SL Anti Magic (ANTIMAGI).
Telepathy (TANKEÖVERFÖRING), range 80 squares, duration 10 combat rounds
Makes it possible to communicate without sounds with one target creature per SL. The target can be intelligent or not. Only surface thoughts and feelings can be communicated.
Direction (VARSEBLIVNING), range 40 squares, duration 1 combat round
The spellcaster describes what they look for (e.g. a hidden door, gold, another mind), and the spell points in the direction of the closest thing of that kind. Each extra SL gives the direction to the closest thing of another kind.
Increase (ÖKA), range touch, duration 1 dungeon turn
Increase the target's STR, DEX, or CON by 1 per SL.
Open (ÖPPNA), range touch, duration instant
Opens locked doors and chests, and makes swords fall out of their scabbards. To overcome the spell Seal (FÖRSEGLA) an equal SL or more of Open (ÖPPNA) is needed.
Level 3
Protector (BESKYDDARE), range touch, duration permanent
Nine stones are placed on the ground to protect a volume of 2x2x2 squares. Each extra SL adds the length of 2 squares in one direction. The spell works as a combination of Anti Magic (ANTIMAGI) SL 1 and Energy Beam (ENERGISTRÅLE) SL 1. Any spell saved by Anti Magic (ANTIMAGI) triggers an Energy Beam (ENERGISTRÅLE) that targets the spellcaster.
Summon/Banish Elemental (FRAMMANA/SKICKA BORT ELEMENTAR), range 8 squares, duration 10 combat rounds
Summons a human-sized air, fire, earth, or water elemental of 1 HD per SL from an existing instance of that element within range. When summoned in combat, the elemental gets the same intiative as the spellcaster. The spellcaster concentrates to move the elemental, otherwise the elemental stands still.
To banish an elemental, the spellcaster casts an equal or higher SL as the elemental's HD. The elemental rolls save vs magic with 10+HD. Each extra SL of Banish Elemental (SKICKA BORT ELEMENTAR) above HD gives -1 to the save.
Elementals are affected by magic and their attacks count as magic attacks. Elementals are allowed one free attack per combat round.
The four elementals are different spells and must be learned separately.
S/B Elemental Air-Sylph (F/SB ELEMENTAR LUFT-SYLF)
The air sylph is a vaguely human-looking entity made of whirling wind.
It can:
1. Move 12 squares per action unecumbered, 8 squares carrying a note on paper, and 1 square carrying items up to 20 slots.
2. Blow someone to the ground, same as Trick (Push).
3. Steer an arrow or thrown weapon for +1 AV and damage per HD.
4. Not be harmed by physical weapons.
5. Destroy a fire salamander if the air sylph has an equal or higher HD. The fire salamander gets a save at 10+HD to survive.
S/B Elemental Fire-Salamander (F/SB ELEMENTAR ELD-SALAMANDER)
The fire salamander is a lizard made of fire.
It can:
1. Move 4 squares per action.
2. Attack a target with fire making 1d6 damage per HD. See entry on FIRE.
3. Ignite flammable objects.
4. Illuminate 1 square per HD in each direction.
5. Be harmed by physical weapons.
6. Heal itself from a fire. Make an attack roll and heal as many HP.
7. Destroy an air sylph if the fire salamander has an equal or higher SL. The air sylph gets a save at 10+HD to survive.
8. Heat a metal weapon to increase damage by 1d6 for a number of combat turns equal to the fire salamander's HD. After the fight, roll save or weapon breaks.
S/B Elemental Earth-Gnome (F/SB ELEMENTAR JORD-GNOM)
The earth gnome is a humanoid entity made of clay.
It can:
1. Move 4 squares per action.
2. Attack with AV 10+HD and damage 1d6 per HD.
3. Be harmed by physical weapons, but attacker must roll save or weapon breaks.
4. Give the direction to closet deposit of a type of metal specified by the spellcaster.
5. Destroy an water undine if the earth gnome has an equal or higher SL. The water undine gets a save at 10+HD to survive.
6. Destroy a fire elemental by lowering both elementals' HP until one is destroyed.
S/B Elemental Water-Undine (F/SB ELEMENTAR VATTEN-UNDIN)
The water undine is either a pillar of water or a female entity.
It can:
1. Move 1 square per action on land and 6 in water, and can carry 20 slots per SL in water.
2. Drown a target for 1d6 damage per combat round.
3. Take half damage rounded up from physical weapons.
4. Destroy an earth gnome if the water undine has an equal or higher SL. The earth gnome gets a save at 10+HD to survive.
5. Destroy a fire elemental by lowering both elementals' HP until one is destroyed.
6. Make weapons work under water as if on land.
Invisibility (OSYNLIGHET), range touch, duration 2 dungeon turns
Turns one human-sized target invisible. An invisible person can only walk (i.e. use one normal or two careful movement actions) and talk and remain invisible. If they fight, run, use magic, or gets hurt, the spell is broken.
Sight (SYN), range 80 squares, duration 10 combat turns
The spellcaster can see and hear what happens in an area they are familiar with and is within the full range. If the spellcaster is not familiar with the area, the range is limited to 20 squares. Each extra SL allows the spellcaster to observe 24 hours back in time. If the spellcaster touches an item they get a vision of a previous owner or one use of the item. Each SL gives a 10% chance of finding the activation phrase of a magic item. The spellcaster can only try this once per item, until the spellcaster increase their level.
Level 4
Transform (FÖRÄNDRA), range 20 squares, duration 2 dungeon turns
Transforms one human-sized item or creature into another of the same type (i.e. animal, plant, or mineral). Attributes remain the same, as does size, and the spell does not give access to any supernatural abilities of the new form. Unwilling targets get to save vs magic. Each extra SL can transform a single larger target or multiple regular-sized targets.
Heal (HELA), range touch, duration instant
Heals 1d6 HP per SL of damage from cuts, bruises, fire, cold, Energy Beam (ENERGISTRÅLE), Lightning (BLIXT), or acid. It does not heal damage from poison or disease.
Control Person (KONTROLLERA PERSON), range 80 squares, duration 10 combat rounds
Controls one intelligent creature (i.e. not animals) per SL. The target gets to save vs magic. If the first save is successful, target avoids the full effect, otherwise the target gets to save each combat turn to act independantly that turn. The spellcaster must concentrate on the targets, otherwise they fall down. Targets cannot not perform independant actions and cannot be made to commit suicide. If the spellcaster's concentration is broken, current targets fall into a deep sleep. Sleeping targets gets to CON save each combat round to wake up.
Teleportation (TELEPORTERA), range touch, duration instant
Teleports a human-sized item or creature to a place the spellcaster knows well at most 100 m away. Each extra SL adds another 100 m. Unwilling targets gets to save vs magic.
The following spells from Drakar och Demoner Expert (1985) are used when creating magic items. They are not available to PCs.
Level 5
Charge (LADDNING): ...
Level 6
Permanence (PERMANENS): ...
Sigil (SIGILL): ...
Level 7
Nexus (NEXUS): ...
SQUARE
1.5 x 1.5 meter squares are used in dungeon maps. Movement and ranges are described in squares.
XP
XP for treasure is collected when treasure is spent. Treasure is divided between the PCs by the players. If an NPC helps the PCs find the treasure, the referee negotiates for their share of treasure. Only valuables (e.g. coins, jewels) and art objects (e.g. jewelry, paintings) are treasure. Utility articles (e.g. weapons, tools) are not treasure and do not give XP.
- Treasure spent to acquire equipment gives XP to current PC.
- Treasure donated (e.g. by partying, giving to the poor, offering to religion) gives XP to current and next PC.
- Treasure in the form of magic items donated to NPCs give XP to next PC as 1/10 of their resale value.
1 silver piece = 1 XP.
XP for defeated monsters (not necessarily killed) is divided between the PCs by the players. If an NPC helps the PCs in the fight, the referee negotiates for their share of XP.
XP for written adventures are handed out when the PCs have explored a specificed part of the adventure. The referee decided on how many XP the complete adventure is worth based on length and difficulty, and divides them between different parts of the adventure. In a five level dungeon, the PCs may get 500 XP after each level explored. In a five checkpoint linear adventure, the PCs may get 500 XP at each checkpoint. Adventure XP is individual, and is not divided between multiple characters. The player must be present for their PC to get adventure XP.
JONASFERRY.COM