Xperia M2 Review
Sony Xperia M2, the phone I am using right now.
Sony introduced this mid-range phone, Xperia M2 in CES 2014 and released in Q2 ‘14.
The price range is around USD300 (it’s around MYR 799 due today).
It’s not cheap, and I strongly NOT RECOMMENDING you if you wanna to buy a new Android phone.
Why? It’s that not good? No, it’s nice, but please don’t buy an old phone.
Anyway, let’s talk about this phone. Design, it’s nice. It has the (nearly) same design with Sony flagship devices like Z3, Z2 and Z1. But it is not using glass but plastic. That plastic is like a fingerprint-magnet, just holding that phone for a few seconds without cover, the back of phone will be full of fingerprint. So, a phone cover is highly recommended if you are using Xperia M2 right now.
Performance, it’s like a normal mid-range Android smartphone, it’s not so slow, normal browsing, Facebook, all no problem. Games? It still can run “Asphalt 8: Airborne” without any lag (the loading speed might be a bit bit longer ( ͡° ͜ʖ ͡°) ).
Camera. Firmware problem and it’s solved. Xperia M2 released to public with Android 4.3, Jelly Bean. During that time, the quality of camera is a bit horrible, especially the image noise. Luckily the problem solved after the Kitkat update. By the way, it’s running with a 8MP camera, with Full HD support.
Front camera of Xperia M2? I just ignore that camera. The front camera is ‘unusable’. A VGA-front camera, that’s is totally horrible. If you are a selfie-lover, just simply don’t buy this phone. Brought already, use the rear camera. Thanks to the Camera button, you still can take selfie with that rear-camera, just need a little practise and skill.
Speaker. It’s quite loud, thanks to Sony’s xLOUD technology and ClearPhase. You can enjoy a ‘not bad’ quality with Xperia M2.
BUT…. my phone having the biggest problem in this world (it look like I am the only one having this problem), which is the sound output (speaker and earphone, but no problem with Bluetooth earphone/speaker). The sound will stop playing randomly for 5 seconds -1 minute when the screen is off. I have no way to solve it, even after asking in XDA and Sony Support.
Conclusion: DON’T BUY.it’s not so cheap anyway. Buy Nexus 5 instead. Nexus 5 is a great phone but costs you around MYR 1200. Want cheaper, buy Moto G (second gen if possible)
Note: there is still no news about Android 5.0, Lollipop official update for Xperia M2. Sad news T.T


Dear All
As a part of pre-puja activities, DURGOTSAV-20116 is organizing a Science Exhibition involving School Children of Kalpakkam and Anupuram on 02-10-2016 from 09-00 a.m. to 07-00 p.m. (recession time: 12-00 noon to 04-00 p.m.) at AECS, Anupuram.
Director IGCAR and CMD, BHAVINI have kindly consented to grace the inaugural ceremony on 2nd Oct, 2016 at 9-00 a.m.
All of you are requested to visit the venue to witness the talents of our local children and encourage and appreciate their scientific acumen.
Durgotsav 2016 Committee


Walrus
Shop
About
Our Team
you have to
LISTEN TO THIS HIFI
shop classics
clear sounds
700 SERIES LIMITED EDITION
discover more
sm
1/3 of profits go to
PROTECT THE ARCTIC
learn more
Previous
Next
choose your groove
nunavut
foxe basin
bering
chukchi
Signup for Walrus Updates!
Full Name
Email
You agree to our Terms & Conditions and Privacy Policy by swithing right.
Sign me up!!


Bangladesh bat in maiden pink-ball test against India
KOLKATA, India: Bangladesh captain Mominul Haque won the toss and elected to bat against India at Eden Gardens on Friday in the first day-night test for both teams.
Visibility of the heavily-lacquered pink ball, especially at twilight, will be a concern for that players in only the 12th day-night test in the game's history.
"The wicket is dry and hard, that's why we want to bat first," Mominul said after winning the toss for the second and final match in the series.
The tourists made two changes as they seek to bounce back from their defeat inside three days in the opener.
Paceman Al-Amin Hossain and off-spinner Nayeem Hasan have come in to replace spin duo Taijul Islam and Mehedy Hasan Miraz.
India, who need only a draw to record their 12th successive home series victory, fielded the same side that triumphed in Indore.
"We'd have batted first as well," Kohli said.
"There's a decent grass cover on it, but it's a hard pitch. With the pink ball there will be something for the first 15 overs.
"The challenge is to adapt quickly. The ball travels quickly and can slips out of the hand."
Teams:
India: Rohit Sharma, Mayank Agarwal, Cheteshwar Pujara, Virat Kohli (captain), Ajinkya Rahane, Wriddhiman Saha (wicketkeeper), Ravindra Jadeja, Ravichandran Ashwin, Umesh Yadav, Mohammed Shami, Ishant Sharma.
Bangladesh: Shadman Islam, Imrul Kayes, Mominul Haque(captain), Mohammad Mithun, Mushfiqur Rahim, Mahmudullah, Liton Das (wickekeeper), Nayeem Hasan, Abu Jayed, Al-Amin Hossain, Ebadat Hossain.
(Editing by Peter Rutherford)


Success on {{ overview.pull_request.last_build_date | amDateFormat: 'YYYY-MM-DD HH:mm' }}
Failure on {{ overview.pull_request.last_build_date | amDateFormat: 'YYYY-MM-DD HH:mm' }}
Unknown
Your CI job is using a deprecated REST route to publish the build result and must be updated. Consult the documentation or the API Explorer for more information.


An implementation of Mutex Semantics between MPI processes.
More...
An implementation of Mutex Semantics between MPI processes.
Based loosely off of Andreas Prell's mpi_mutex.c (https://gist.github.com/aprell/1486197) and R. Thakur, R. Ross, and R. Latham, "Implementing Byte-Range Locks Using MPI One-Sided Communication," in Proc. of the 12th European PVM/MPI Users' Group Meeting (Euro PVM/MPI 2005), Recent Advances in Parallel Virtual Machine and Message Passing Interface, Lecture Notes in Computer Science, LNCS 3666, Springer, September 2005, pp. 119-128.
| Mutex MEL::MutexCreate |
( |
const int |
rank, |
|
|
const int |
size, |
|
|
const int |
root, |
|
|
const Comm & |
comm |
|
) |
| |
|
inline |
Create a MEL::Mutex across a comm world.
- Parameters
-
| [in] | rank | The rank of the calling process |
| [in] | size | The size of the comm world |
| [in] | root | The rank of the process who will own the mutex |
| [in] | comm | The comm world to share the mutex across |
| Mutex MEL::MutexCreate |
( |
const int |
root, |
|
|
const Comm & |
comm |
|
) |
| |
|
inline |
Create a MEL::Mutex across a comm world.
- Parameters
-
| [in] | root | The rank of the process who will own the mutex |
| [in] | comm | The comm world to share the mutex across |
| void MEL::MutexFree |
( |
Mutex & |
mutex | ) |
|
|
inline |
Free a MEL::Mutex.
- Parameters
-
| [in] | mutex | The mutex to free |
| void MEL::MutexLock |
( |
Mutex & |
mutex | ) |
|
|
inline |
Get the exclusive lock on a MEL::Mutex.
- Parameters
-
| [in] | mutex | The mutex to lock |
| bool MEL::MutexTest |
( |
const Mutex & |
mutex | ) |
|
|
inline |
Test if the mutex is currently locked.
- Parameters
-
| [in] | mutex | The mutex to lock |
| void MEL::MutexUnlock |
( |
Mutex & |
mutex | ) |
|
|
inline |
Release the exclusive lock on a MEL::Mutex.
- Parameters
-
| [in] | mutex | The mutex to lock |


All of VCS including Mercurial SCM have a common problem with binary files of repository, namely:
If the files were being changed, their versions (even mistaken or stale) are all present in VCS history - nearly 'as is', with minimal packing if any.
In the course of time, this accumulation of binaries would involve the terrific size of remote repository and its local clones. No wonder that you might hear about 60 Gb repositories - what if not the updateable binaries could fatten them?
At that, the value of the binary history is often minimal if not equal to zero.
So, at an opportunity the updateable binaries are excluded from the VCS history at all, by means of .gitignore, .hgignore etc.
But what can you do e.g. with bitbucket sites (and analogues) that are built as usual Mercurial SCM repositories? Imagine you have a download page with links to binary files (.zip, .rar, .exe, .pdf etc.) and those files are disposed to update, often at that. To be downloaded or anyhow available, the binaries must be present in the site repository, i.e. in hg history.
It's a pity that Mercurial SCM doesn't provide the 'no history for a specific file' facility. Hopefully, this would be fixed in future, but for now we need some workarounds.
A method proposed below allows to minimize the binary overheads for a bitbucket site managed by Mercurial SCM.
We'll consider the following case only:
Pitifully, the bitbucket announced Sunsetting Mercurial support in Bitbucket which means "Mercurial features and repositories will be officially removed from Bitbucket and its API on June 1, 2020".
Nevertheless I hope the below considerations still apply to any of other Mercurial hostings.
The code below is for use in Linux, though being a bit remade it would fit to other platforms.
First of all, let's subdivide the binary files into:
1st and 2nd types are well suited to be included into hg history. We commit them once (twice or thrice as for 2nd type) and don't care about them anymore.
But the binaries of 3rd and 4th types should be somehow excluded from hg history.
At that, these binaries should be available in a site, both remote and local. On a local machine, these binaries must be at one of hg heads, as a localized version of TortoiseHg shows:
Figure 1
A development is going on at the tip head where all commits are done, while the binary files are sort of outsiders: they are not on the tip head and stated as '?' (not managed) in 'hg status'. On the above picture, the binaries are in BIN revision.
The bitbucket.org would not allow to push the multiple heads to a remote repository. To be exact, it would resist to the pushing of multiple heads as it's prone to confuse.
Thus, we should delete this outside BIN revision before pushing the tip head. We should strip BIN commit on bitbucket repository as well!
Then we should restore the 'bin' files as BIN revision on the tip. And to 'hg push' to a remote repository.
So, the remote repository would contain our 'essential changes' and binaries. All of these would be seen in our bitbucket site.
At last, on a local machine we 'hg update' to a revision just prior to BIN. On the picture below, this situation is marked with It's not the tip revision! :
Figure 2
No sooner than we commit new essential changes, the local repository would return to a state similar to the previous:
Figure 3
Comparing Figure 1 and Figure 3, we see that the cycle repeats and there are no binary revisions between #4 and #8 except for the outside BIN.
The cost of this method is that you should push all of 'bin' directory to bitbucket each time at pushing, even when there are no changes in 'bin' and the only change is a character in some page.html. What can you do with this? Push to your remote repository as rarely as possible. Push when the essential changes have been accumulated in your local repository.
The preparatory steps:
[ui] username = MyName<EMAIL_ADDRESS>[extensions] extdiff = fetch = strip =which enable diff, fetch, strip hg extensions. At that, the most important is the strip.
syntax: regexp ^.+\.bak/.+ ^\.hgignorewhich exclude .hgignore file and *.bak directories (e.g. bin.bak) from the hg history.
With this initialization done, let's start the working cycle described above.
First of all you must strip BIN commit on bitbucket repository before 'hg push'! You cannot otherwise strip the remote commits.
After that, run the e_menu items:
Main menu -> Hg -> Next -> Push with BIN
The 'Push with BIN' item brings up the warning message:
Figure 4
After selecting 'OK' you'll get two windows (a bit moved and resized for this figure):
Figure 5
The right window is a console showing a current state of repository. View it carefully and pay attention mostly to:
It it's OK, close the window and enter the name of 'binary files' revision in the left dialog.
The name of 'BIN' revision should correspond to the directory of binary files:
If you select 'BIN' for the revision name, you should have 'bin' directory of binaries.
If 'BIN2' revision, then 'bin2' directory.
'BINARY' revision -> 'binary' directory.
'DOWNLOAD' -> 'download'.
etc.
After entering the name of 'binary files' revision ('BIN' by default) and selecting 'OK' you would push the last commits + 'BIN' revision (as the tip commit) to bitbucket. Your only action would be entering your bitbucket password.
After entering the password and pushing, view the results and notice the position of last essential commit in hg history.
Most likely it is 3rd from the tip (just under 'BIN' revision). You should confirm it in the following dialog:
Figure 6
... and you would get the final messages:
Figure 7
Well done. Run Main menu -> Hg -> tortoisehg - thg menu item to check if the state is like on Figure 2.
Probably, the only trouble you would come into while using this method is the forgotten stripping of BIN commit at bitbucket.
A little trouble indeed.
To get over it, you should go to your bitbucket repository and strip all BIN commits whatever they are.
After that you should repeat 'Push with BIN' described in the previous section.
Let's look at this a bit closer. Suppose, we have bitbucket repository where there is (unstripped) BIN commit:
Figure 8
Suppose, we've made a blunder with pushing another BIN commit to bitbucket repository.
We would see the following sad picture at bitbucket:
Figure 9
At bitbucket we should perform 'Strip commit' all the same.
We go through bitbucket's Repository -> Settings -> Strip commits and enter BIN in 'Commit to strip' field:
Figure 10
Then we do 'Preview strip' and 'Confirm strip'.
We perform the stripping twice because there are two BIN commits at bitbucket repository (in our test case).
We have the following picture at the second stripping:
Figure 11
After the second stripping we have a correct commit history at bitbucket repository:
Figure 12
...and after 'Push with BIN' we have the desired:
Figure 13
The following recommendations might be useful:
You may change the Main menu -> Hg -> Next -> Push with BIN menu item.
After all, you'll see that there is nothing special about this.
Just press Ctrl+E keys or right-click on the menu to edit its code:
R: Push with BIN R: cd %PD R: Push with BIN R: %q "Push with BIN" " This will push your last commits + BIN \ \n so that: \ \n * a new development cycle would begin \ \n * you would go on committing in:\n %PD \ \n * ... till a next 'Push with BIN' \ \n\n Please, view the messages to follow..."  All of 'bin' directory are stated as '?' by hg status. \ \n 2. No other changes (M,A,R...) are stated by hg status. \ \n 3. Your essential development head is the tip. \ \n 4. 'BIN' is stripped by Bitbucket/Settings/Strip commits. \n" \ -weight bold == ::RGEO - ::RBIN R: Push with BIN R: %C set ::rbin [string tolower "$::RBIN"] SW: Push with BIN SW: \ echo '###################### backup $::rbin to .$::rbin.bak' ; \ rm -f -r $::rbin.bak/* ; \ mkdir $::rbin.bak ; \ cp -a $::rbin/* $::rbin.bak ; \ echo '###################### remove $::RBIN commit' ; \ hg update $::RBIN ; \ hg strip --no-backup $::RBIN ; \ hg update tip ; \ echo '###################### restore $::rbin from $::rbin.bak' ; \ rm -f -r $::rbin/* ; \ mkdir $::rbin ; \ date '+Updated: %%n %%F at %%X' 1> $::rbin.bak/README ; \ cp -a $::rbin.bak/* $::rbin ; \ echo '###################### CHECKING hg status' ; \ hg status ; \ read -n 1 -p \ 'MAKE SURE that ? $::rbin files would be committed only. Press a key to continue...' ; \ echo '###################### add $::rbin/* and commit' ; \ hg add $::rbin/* ; \ hg commit -m $::RBIN ; \ hg tag $::RBIN ; \ echo '###################### push to Bitbucket' ; \ hg push -f ; \ echo '###################### REMEMBER the revision prior to $::RBIN' ; \ hg log -l 7 ; \ echo '###################### REMEMBER the revision prior to $::RBIN' R: Push with BIN R: %I ques "WORKING REVISION" {entRev {{Revision prior to $::RBIN:} {} \ {-w 20}} {"$::REV1"} lab} -head "\n Enter a revision prior to $::RBIN. \ \n It is a main stream of development. \ \n Most likely, it is -3 (2 level under the tip). \n" -weight bold == ::REV1 SW: Push with BIN SW: \ echo '\n\n###################### go to a revision prior to $::RBIN' ; \ hg update -r $::REV1 ; \ echo '\n\n###################### restore $::rbin from $::rbin.bak (possibly not-committed)' ; \ rm -f -r $::rbin/* ; \ mkdir $::rbin ; \ cp -a $::rbin.bak/* $::rbin ; \ hg status ; \ hg summary ; \ echo '###################### THE END'


Place Your Pizza order
Size
Small, 10"
Medium, 14"
Large, 18"
Crust
Crispy
Stuffed
Gluten-free
Topping :
Bacon
Chicken
Beef
Vegetables
Place Order
Pizza Cost BreakDown
Pizza Size :
Pizza Crust :
Pizza Topping :
Price in Kshs :
Want delivery ?
Checkout


you have just logged out
username
$(username)
IP address
$(ip)
MAC address
$(mac)
session time
$(uptime)
$(if session-time-left)
time left
$(session-time-left)
$(endif)
bytes up/down
$(bytes-in-nice) / $(bytes-out-nice)


Saltmarsh retreat zone (front page of Mangrove Cove Monitoring web site)
Photopoints to monitor expansion of mangroves across the saltmarsh, wrecks and other features. The annual comparisons run down the columns, and will continue to be added over time. In the first two and a half years of monitoring there has been a visbile increase in the extent of the mangroves and a reduction in saltmarsh extent.
Location 1: Northern corner of the top level (right on top) of the amphitheatre (no marker required) |
|---|
March 2008 |
December 2008 |
December 2010 - saltmarsh patch starting to disappear |
December 2011 |
Jan 2013 |
Jan 2014 |
Dec 2015 |
Jan 2017 |
Jan 2018
|
Location 2: The Mound with the Kaurna interpretive material - a small orange peg is inserted in the garden bed to mark where to stand to take the photograph
|
|---|
March 2008 - central gap in magrove cover on the site is still visible |
December 2008 |
December 2010 |
December 2011 |
Jan 2013 |
Jan 2014 |
December 2015 |
Jan 2017 |
Jan 2018 |
Location 3: The corner of the railway fence south of Mangrove Cove. White paint has been sprayed round the base of the post at the correct location. View north |
|---|
March 2008 |
December 2008 |
December 2010 |
December 2011 |
Jan 2013 |
Jan 2014
|
December 2015 |
Jan 2017 (look carefully to observe the mangrove seedlings on the base of the ramp in the furthest part of the site) |
Jan 2018 |
Location 4 (NW view): The corner of the railway fence south of Mangrove Cove. White paint has been sprayed round the base of the post at the correct location. View north-west |
|---|
March 2008 - saltmarsh visible through gap in mangroves |
December 2008 |
December 2010 |
December 2011 - mangrove gap filled in |
Jan 2013 |
December 2015 |
Jan 2017 (photo missing a portion on right side) |
Jan 2017 |
Follow this link to:
Saltmarsh retreat zone (front page of Mangrove Cove Monitoring web site)


| I l@ve RuBoard |
13.6 Utility ModulesThis section presents the source code of the utility modules imported and used by the page scripts shown above. There aren't any new screen shots to see here, because these are utilities, not CGI scripts (notice their .py extensions). Moreover, these modules aren't all that useful to study in isolation, and are included here primarily to be referenced as you go through the CGI scripts' code. See earlier in this chapter for additional details not repeated here. 13.6.1 External ComponentsWhen I install PyMailCgi and other server-side programs shown in this book, I simply upload the contents of the Cgi-Web examples directory on my laptop to the top-level web directory on my server account (public_html ). The Cgi-Web directory also lives on this book's CD (see http://examples.oreilly.com/python2), a mirror of the one on my PC. I don't copy the entire book examples distribution to my web server, because code outside the Cgi-Web directory isn't designed to run on a web server. When I first installed PyMailCgi, however, I ran into a problem: it's written to reuse modules coded in other parts of the book, and hence in other directories outside Cgi-Web. For example, it reuses the mailconfig and pymail modules we wrote in Chapter 11, but neither lives in the CGI examples directory. Such external dependencies are usually okay, provided we use package imports or configure sys.path appropriately on startup. In the context of CGI scripts, though, what lives on my development machine may not be what is available on the web server machine where the scripts are installed. To work around this (and avoid uploading the full book examples distribution to my web server), I define a directory at the top-level of Cgi-Web called Extern, to which any required external modules are copied as needed. For this system, Extern includes a subdirectory called Email, where the mailconfig and pymail modules are copied for upload to the server. Redundant copies of files are less than ideal, but this can all be automated with install scripts that automatically copy to Extern and then upload Cgi-Web contents via FTP using Python's ftplib module (discussed in Chapter 11). Just in case I change this structure, though, I've encapsulated all external name accesses in the utility module in Example 13-10. Example 13-10. PP2E\Internet\Cgi-Web\PyMailCgi\externs.py############################################################## # Isolate all imports of modules that live outside of the # PyMailCgi PyMailCgi directory. Normally, these would come # from PP2E.Internet.Email, but when I install PyMailCgi, # I copy just the Cgi-Web directory's contents to public_html # on the server, so there is no PP2E directory on the server. # Instead, I either copy the imports referenced in this file to # the PyMailCgi parent directory, or tweak the dir appended to # the sys.path module search path here. Because all other # modules get the externals from here, there is only one place # to change when they are relocated. This may be arguably # gross, but I only put Internet code on the server machine. ############################################################## import sys sys.path.append('..') # see dir where Email installed on server from Extern import Email # assumes a ../Extern dir with Email dir from Extern.Email import pymail # can use names Email.pymail or pymail from Extern.Email import mailconfig This module appends the parent directory of PyMailCgi to sys.path to make the Extern directory visible (remember, PYTHONPATH might be anything when CGI scripts are run as user "nobody") and preimports all external names needed by PyMailCgi into its own namespace. It also supports future changes; because all external references in PyMailCgi are made through this module, I have to change only this one file if externals are later installed differently. As a reference, Example 13-11 lists part of the external mailconfig module again. For PyMailCgi, it's copied to Extern, and may be tweaked as desired on the server (for example, the signature string differs slightly in this context). See the pymail.py file in Chapter 11, and consider writing an automatic copy-and-upload script for the Cgi-Web\Extern directory a suggested exercise; it's not proved painful enough to compel me to write one of my own. Example 13-11. PP2E\Internet\Cgi-Web\Extern\Email\mailconfig.py############################################ # email scripts get server names from here: # change to reflect your machine/user names; # could get these in command line instead ############################################ # SMTP email server machine (send) smtpservername = 'smtp.rmi.net' # or starship.python.net, 'localhost' # POP3 email server machine, user (retrieve) popservername = 'pop.rmi.net' # or starship.python.net, 'localhost' popusername = 'lutz' # password is requested when run ...rest omitted # personal info used by PyMailGui to fill in forms; # sig-- can be a triple-quoted block, ignored if empty string; # addr--used for initial value of "From" field if not empty, myaddress =<EMAIL_ADDRESS>mysignature = '--Mark Lutz (http://rmi.net/~lutz) [PyMailCgi 1.0]' 13.6.2 POP Mail InterfaceThe loadmail utility module in Example 13-12 depends on external files and encapsulates access to mail on the remote POP server machine. It currently exports one function, loadnewmail, which returns a list of all mail in the specified POP account; callers are unaware of whether this mail is fetched over the Net, lives in memory, or is loaded from a persistent storage medium on the CGI server machine. That is by design -- loadmail changes won't impact its clients. Example 13-12. PP2E\Internet\Cgi-Web\PyMailCgi\loadmail.py################################################################### # mail list loader; future--change me to save mail list between # cgi script runs, to avoid reloading all mail each time; this # won't impact clients that use the interfaces here if done well; # for now, to keep this simple, reloads all mail on each operation ################################################################### from commonhtml import runsilent # suppress print's (no verbose flag) from externs import Email # load all mail from number 1 up # this may trigger an exception def loadnewmail(mailserver, mailuser, mailpswd): return runsilent(Email.pymail.loadmessages, (mailserver, mailuser, mailpswd)) It's not much to look at -- just an interface and calls to other modules. The Email.pymail.loadmessages function (reused here from Chapter 11) uses the Python poplib module to fetch mail over sockets. All this activity is wrapped in a commonhtml.runsilent function call to prevent pymail print statements from going to the HTML reply stream (although any pymail exceptions are allowed to propagate normally). As it is, though, loadmail loads all incoming email to generate the selection list page, and reloads all email again every time you fetch a message from the list. This scheme can be horribly inefficient if you have lots of email sitting on your server; I've noticed delays on the order of a dozen seconds when my mailbox is full. On the other hand, servers can be slow in general, so the extra time taken to reload mail isn't always significant; I've witnessed similar delays on the server for empty mailboxes and simple HTML pages too. More importantly, loadmail is intended only as a first-cut mail interface -- something of a usable prototype. If I work on this system further, it would be straightforward to cache loaded mail in a file, shelve, or database on the server, for example. Because the interface exported by loadmail would not need to change to introduce a caching mechanism, clients of this module would still work. We'll explore server storage options in the next chapter. 13.6.3 POP Password EncryptionTime to call the cops. We discussed the approach to password security adopted by PyMailCgi earlier. In brief, it works hard to avoid ever passing the POP account username and password across the Net together in a single transaction, unless the password is encrypted according to module secret.py on the server. This module can be different everywhere PyMailCgi is installed and can be uploaded anew at any time -- encrypted passwords aren't persistent and live only for the duration of one mail-processing interaction session.[4] Example 13-13 is the encryptor module I installed on my server while developing this book.
Example 13-13. PP2E\Internet\Cgi-Web\PyMailCgi\secret.py############################################################################### # PyMailCgi encodes the pop password whenever it is sent to/from client over # the net with a user name as hidden text fields or explicit url params; uses # encode/decode functions in this module to encrypt the pswd--upload your own # version of this module to use a different encryption mechanism; pymail also # doesn't save the password on the server, and doesn't echo pswd as typed, but # this isn't 100% safe--this module file itself might be vulnerable to some # malicious users; Note: in Python 1.6, the socket module will include standard # (but optional) support for openSSL sockets on the server, for programming # secure Internet transactions in Python; see 1.6 socket module docs; ############################################################################### forceReadablePassword = 0 forceRotorEncryption = 1 import time, string dayofweek = time.localtime(time.time( ))[6] ############################################################################### # string encoding schemes ############################################################################### if not forceReadablePassword: # don't do anything by default: the urllib.quote or # cgi.escape calls in commonhtml.py will escape the # password as needed to embed in in URL or HTML; the # cgi module undoes escapes automatically for us; def stringify(old): return old def unstringify(old): return old else: # convert encoded string to/from a string of digit chars, # to avoid problems with some special/nonprintable chars, # but still leave the result semi-readable (but encrypted); # some browser had problems with escaped ampersands, etc.; separator = '-' def stringify(old): new = '' for char in old: ascii = str(ord(char)) new = new + separator + ascii # '-ascii-ascii-ascii' return new def unstringify(old): new = '' for ascii in string.split(old, separator)[1:]: new = new + chr(int(ascii)) return new ############################################################################### # encryption schemes ############################################################################### if (not forceRotorEncryption) and (dayofweek % 2 == 0): # use our own scheme on evenly-numbered days (0=monday) # caveat: may fail if encode/decode over midnite boundary def do_encode(pswd): res = '' for char in pswd: res = res + chr(ord(char) + 1) # add 1 to each ascii code return str(res) def do_decode(pswd): res = '' for char in pswd: res = res + chr(ord(char) - 1) return res else: # use the standard lib's rotor module to encode pswd # this does a better job of encryption than code above import rotor mykey = 'pymailcgi' def do_encode(pswd): robj = rotor.newrotor(mykey) # use enigma encryption return robj.encrypt(pswd) def do_decode(pswd): robj = rotor.newrotor(mykey) return robj.decrypt(pswd) ############################################################################### # top-level entry points ############################################################################### def encode(pswd): return stringify(do_encode(pswd)) # encrypt plus string encode def decode(pswd): return do_decode(unstringify(pswd)) This encryptor module implements two alternative encryption schemes: a simple ASCII character code mapping, and Enigma-style encryption using the standard rotor module. The rotor module implements a sophisticated encryption strategy, based on the "Enigma" encryption machine used by the Nazis to encode messages during World War II. Don't panic, though; Python's rotor module is much less prone to cracking than the Nazis'! In addition to encryption, this module also implements an encoding method for already-encrypted strings. By default, the encoding functions do nothing, and the system relies on straight URL encoding. An optional encoding scheme translates the encrypted string to a string of ASCII code digits separated by dashes. Either encoding method makes non-printable characters in the encrypted string printable. <IP_ADDRESS> Default encryption scheme: rotorTo illustrate, let's test this module's tools interactively. First off, we'll experiment with Python's standard rotor module, since it's at the heart of the default encoding scheme. We import the module, make a new rotor object with a key (and optionally, a rotor count), and call methods to encrypt and decrypt: C:\...\PP2E\Internet\Cgi-Web\PyMailCgi>python >>> import rotor >>> r = rotor.newrotor('pymailcgi') # (key, [,numrotors]) >>> r.encrypt('abc123') # may return non-printable chars ' \323an\021\224' >>> x = r.encrypt('spam123') # result is same len as input >>> x '* _\344\011pY' >>> len(x) 7 >>> r.decrypt(x) 'spam123' Notice that the same rotor object can encrypt multiple strings, that the result may contain non-printable characters (printed as \ascii escape codes when displayed, possibly in octal form), and that the result is always the same length as the original string. Most importantly, a string encrypted with rotor can be decrypted in a different process (e.g., in a later CGI script) if we recreate the rotor object: C:\...\PP2E\Internet\Cgi-Web\PyMailCgi>python >>> import rotor >>> r = rotor.newrotor('pymailcgi') # can be decrypted in new process >>> r.decrypt('* _\344\011pY') # use "\ascii" escapes for two chars 'spam123' Our secret module by default simply uses rotor to encrypt, and does no additional encoding of its own. It relies on URL encoding when the password is embedded in a URL parameter, and HTML escaping when the password is embedded in hidden form fields. For URLs, the following sorts of calls occur: >>> from secret import encode, decode >>> x = encode('abc$#<>&+') # CGI scripts do this (rotor) >>> x ' \323a\016\317\326\023\0163' >>> import urllib # urllib.urlencode does this >>> y = urllib.quote_plus(x) >>> y '+%d3a%0e%cf%d6%13%0e3' >>> a = urllib.unquote_plus(y) # cgi.FieldStorage does this >>> a ' \323a\016\317\326\023\0163' >>> decode(a) # CGI scripts do this (rotor) 'abc$#<>&+' <IP_ADDRESS> Alternative encryption schemesTo show how to write alternative encryptors and encoders, secret also includes a digits-string encoder and a character-code shuffling encryptor; both are enabled with global flag variables at the top of the module:
To show how these alternatives work, lets's set forceReadablePassword to 1 and forceRotorEncryption to 0, and reimport. Note that these are global variables that must be set before the module is imported (or reloaded), because they control the selection of alternative def statements. Only one version of each kind of function is ever made by the module: C:\...\PP2E\Internet\Cgi-Web\PyMailCgi>python >>> from secret import * >>> x = encode('abc$#<>&+') >>> x '-98-99-100-37-36-61-63-39-44' >>> y = decode(x) >>> y 'abc$#<>&+' This really happens in two steps, though -- encryption and then encoding (the top-level encode and decode functions orchestrate the two steps). Here's what the steps look like when run separately: >>> t = do_encode('abc$#<>&+') # just our encryption >>> t "bcd%$=?'," >>> stringify(t) # add our own encoding '-98-99-100-37-36-61-63-39-44' >>> unstringify(x) # undo encoding "bcd%$=?'," >>> do_decode(unstringify(x)) # undo both steps 'abc$#<>&+' This alternative encryption scheme merely adds 1 to the each character's ASCII code value, and the encoder inserts the ASCII code integers of the result. It's also possible to combine rotor encryption and our custom encoding (set both forceReadablePassword and forceRotorEncryption to 1), but URL encoding provided by urllib works just as well. Here are a variety of schemes in action; secret.py is edited and saved before each reload: >>> import secret >>> secret.encode('spam123') # default: rotor, no extra encoding '* _\344\011pY' >>> reload(secret) # forcereadable=1, forcerotor=0 <module 'secret' from 'secret.py'> >>> secret.encode('spam123') '-116-113-98-110-50-51-52' >>> reload(secret) # forcereadable=1, forcerotor=1 <module 'secret' from 'secret.py'> >>> secret.encode('spam123') '-42-32-95-228-9-112-89' >>> ord('Y') # the last one is really a 'Y' 89 >>> reload(secret) # back to default rotor, no stringify <module 'secret' from 'secret.pyc'> >>> import urllib >>> urllib.quote_plus(secret.encode('spam123')) '%2a+_%e4%09pY' >>> 0x2a # the first is really 42, '*' 42 >>> chr(42) '*' You can provide any kind of encryption and encoding logic you like in a custom secret.py, as long as it adheres to the expected protocol -- encoders and decoders must receive and return a string. You can also alternate schemes by days of the week as done here (but note that this can fail if your system is being used when the clock turns over at midnight!), and so on. A few final pointers:
Internet security is a much bigger topic than can be addressed fully here, and we've really only scratched its surface. For additional information on security issues, consult books geared exclusively towards web programming techniques.
13.6.4 Common Utilities ModuleThe file commonhtml.py, shown in Example 13-14, is the Grand Central Station of this application -- its code is used and reused by just about every other file in the system. Most of it is self-explanatory, and I've already said most of what I wanted to say about it earlier, in conjunction with the CGI scripts that use it. I haven't talked about its debugging support, though. Notice that this module assigns sys.stderr to sys.stdout, in an attempt to force the text of Python error messages to show up in the client's browser (remember, uncaught exceptions print details to sys.stderr). That works sometimes in PyMailCgi, but not always -- the error text shows up in a web page only if a page_header call has already printed a response preamble. If you want to see all error messages, make sure you call page_header (or print Content-type: lines manually) before any other processing. This module also defines functions that dump lots of raw CGI environment information to the browser (dumpstatepage), and that wrap calls to functions that print status messages so their output isn't added to the HTML stream (runsilent). I'll leave the discovery of any remaining magic in this code up to you, the reader. You are hereby admonished to go forth and read, refer, and reuse. Example 13-14. PP2E\Internet\Cgi-Web\PyMailCgi\commonhtml.py#!/usr/bin/python ######################################################### # generate standard page header, list, and footer HTML; # isolates html generation-related details in this file; # text printed here goes over a socket to the client, # to create parts of a new web page in the web browser; # uses one print per line, instead of string blocks; # uses urllib to escape parms in url links auto from a # dict, but cgi.escape to put them in html hidden fields; # some of the tools here are useful outside pymailcgi; # could also return html generated here instead of # printing it, so it could be included in other pages; # could also structure as a single cgi script that gets # and tests a next action name as a hidden form field; # caveat: this system works, but was largely written # during a 2-hour layover at the Chicago O'Hare airport: # some components could probably use a bit of polishing; # to run standalone on starship via a commandline, type # "python commonhtml.py"; to run standalone via a remote # web brower, rename file with .cgi and run fixcgi.py. ######################################################### import cgi, urllib, string, sys sys.stderr = sys.stdout # show error messages in browser from externs import mailconfig # from a package somewhere on server # my address root urlroot = 'http://starship.python.net/~lutz/PyMailCgi' def pageheader(app='PyMailCgi', color='#FFFFFF', kind='main', info=''): print 'Content-type: text/html\n' print '<html><head><title>%s: %s page (PP2E)</title></head>' % (app, kind) print '<body bgcolor="%s"><h1>%s %s</h1><hr>' % (color, app, (info or kind)) def pagefooter(root='pymailcgi.html'): print '</p><hr><a href="http://www.python.org">' print '<img src="../PyErrata/PythonPoweredSmall.gif" ' print 'align=left alt="[Python Logo]" border=0 hspace=15></a>' print '<a href="%s">Back to root page</a>' % root print '</body></html>' def formatlink(cgiurl, parmdict): """ make "%url?key=val&key=val" query link from a dictionary; escapes str( ) of all key and val with %xx, changes ' ' to + note that url escapes are different from html (cgi.escape) """ parmtext = urllib.urlencode(parmdict) # calls urllib.quote_plus return '%s?%s' % (cgiurl, parmtext) # urllib does all the work def pagelistsimple(linklist): # show simple ordered list print '<ol>' for (text, cgiurl, parmdict) in linklist: link = formatlink(cgiurl, parmdict) text = cgi.escape(text) print '<li><a href="%s">\n %s</a>' % (link, text) print '</ol>' def pagelisttable(linklist): # show list in a table print '<p><table border>' # escape text to be safe count = 1 for (text, cgiurl, parmdict) in linklist: link = formatlink(cgiurl, parmdict) text = cgi.escape(text) print '<tr><th><a href="%s">View</a> %d<td>\n %s' % (link, count, text) count = count+1 print '</table>' def listpage(linkslist, kind='selection list'): pageheader(kind=kind) pagelisttable(linkslist) # [('text', 'cgiurl', {'parm':'value'})] pagefooter( ) def messagearea(headers, text, extra=''): print '<table border cellpadding=3>' for hdr in ('From', 'To', 'Cc', 'Subject'): val = headers.get(hdr, '?') val = cgi.escape(val, quote=1) print '<tr><th align=right>%s:' % hdr print ' <td><input type=text ' print ' name=%s value="%s" %s size=60>' % (hdr, val, extra) print '<tr><th align=right>Text:' print '<td><textarea name=text cols=80 rows=10 %s>' % extra print '%s\n</textarea></table>' % (cgi.escape(text) or '?') # if has </>s def viewpage(msgnum, headers, text, form): """ on View + select (generated link click) very subtle thing: at this point, pswd was url encoded in the link, and then unencoded by cgi input parser; it's being embedded in html here, so we use cgi.escape; this usually sends nonprintable chars in the hidden field's html, but works on ie and ns anyhow: in url: ?user=lutz&mnum=3&pswd=%8cg%c2P%1e%f0%5b%c5J%1c%f3&... in html: <input type=hidden name=pswd value="...nonprintables.."> could urllib.quote the html field here too, but must urllib.unquote in next script (which precludes passing the inputs in a URL instead of the form); can also fall back on numeric string fmt in secret.py """ pageheader(kind='View') user, pswd, site = map(cgi.escape, getstandardpopfields(form)) print '<form method=post action="%s/onViewSubmit.cgi">' % urlroot print '<input type=hidden name=mnum value="%s">' % msgnum print '<input type=hidden name=user value="%s">' % user # from page|url print '<input type=hidden name=site value="%s">' % site # for deletes print '<input type=hidden name=pswd value="%s">' % pswd # pswd encoded messagearea(headers, text, 'readonly') # onViewSubmit.quotetext needs date passed in page print '<input type=hidden name=Date value="%s">' % headers.get('Date','?') print '<table><tr><th align=right>Action:' print '<td><select name=action>' print ' <option>Reply<option>Forward<option>Delete</select>' print '<input type=submit value="Next">' print '</table></form>' # no 'reset' needed here pagefooter( ) def editpage(kind, headers={}, text=''): # on Send, View+select+Reply, View+select+Fwd pageheader(kind=kind) print '<form method=post action="%s/onSendSubmit.cgi">' % urlroot if mailconfig.mysignature: text = '\n%s\n%s' % (mailconfig.mysignature, text) messagearea(headers, text) print '<input type=submit value="Send">' print '<input type=reset value="Reset">' print '</form>' pagefooter( ) def errorpage(message): pageheader(kind='Error') # or sys.exc_type/exc_value exc_type, exc_value = sys.exc_info( )[:2] # but safer,thread-specific print '<h2>Error Description</h2><p>', message print '<h2>Python Exception</h2><p>', cgi.escape(str(exc_type)) print '<h2>Exception details</h2><p>', cgi.escape(str(exc_value)) pagefooter( ) def confirmationpage(kind): pageheader(kind='Confirmation') print '<h2>%s operation was successful</h2>' % kind print '<p>Press the link below to return to the main page.</p>' pagefooter( ) def getfield(form, field, default=''): # emulate dictionary get method return (form.has_key(field) and form[field].value) or default def getstandardpopfields(form): """ fields can arrive missing or '' or with a real value hard-coded in a url; default to mailconfig settings """ return (getfield(form, 'user', mailconfig.popusername), getfield(form, 'pswd', '?'), getfield(form, 'site', mailconfig.popservername)) def getstandardsmtpfields(form): return getfield(form, 'site', mailconfig.smtpservername) def runsilent(func, args): """ run a function without writing stdout ex: suppress print's in imported tools else they go to the client/browser """ class Silent: def write(self, line): pass save_stdout = sys.stdout sys.stdout = Silent( ) # send print to dummy object try: # which has a write method result = apply(func, args) # try to return func result finally: # but always restore stdout sys.stdout = save_stdout return result def dumpstatepage(exhaustive=0): """ for debugging: call me at top of a cgi to generate a new page with cgi state details """ if exhaustive: cgi.test( ) # show page with form, environ, etc. else: pageheader(kind='state dump') form = cgi.FieldStorage( ) # show just form fields names/values cgi.print_form(form) pagefooter( ) sys.exit( ) def selftest(showastable=0): # make phony web page links = [ # [(text, url, {parms})] ('text1', urlroot + '/page1.cgi', {'a':1}), ('text2', urlroot + '/page1.cgi', {'a':2, 'b':'3'}), ('text3', urlroot + '/page2.cgi', {'x':'a b', 'y':'a<b&c', 'z':'?'}), ('te<>4', urlroot + '/page2.cgi', {'<x>':'', 'y':'<a>', 'z':None})] pageheader(kind='View') if showastable: pagelisttable(links) else: pagelistsimple(links) pagefooter( ) if __name__ == '__main__': # when run, not imported selftest(len(sys.argv) > 1) # html goes to stdout |
| I l@ve RuBoard |


to the unofficial toolkit for the Lox programming language. This page is still under development, so pop back in a couple of weeks!
Lox is a programming language devised by Robert Nystrom for the book "Crafting Interpreters". It's dynamically typed, classy and I think pretty neat. Here's a little snippet:
class Breakfast { init(meat, bread) { this.meat = meat; this.bread = bread; } // ... } class Brunch < Breakfast { init(meat, bread, drink) { super.init(meat, bread); this.drink = drink; } } var benedict = Brunch("ham", "English muffin"); benedict.serve("Noble Reader");


public class MBeanServerInvocationHandler extends Object implements InvocationHandler
InvocationHandler
that forwards methods in an MBean's
management interface through the MBean server to the MBean.
Given an MBeanServerConnection
, the ObjectName
of an MBean within that MBean server, and a Java interface
Intf
that describes the management interface of the
MBean using the patterns for a Standard MBean or an MXBean, this
class can be used to construct a proxy for the MBean. The proxy
implements the interface Intf
such that all of its
methods are forwarded through the MBean server to the MBean.
If the InvocationHandler
is for an MXBean, then the parameters of
a method are converted from the type declared in the MXBean
interface into the corresponding mapped type, and the return value
is converted from the mapped type into the declared type. For
example, with the method
public List<String> reverse(List<String> list);
and given that the mapped type for List<String>
is String[]
, a call to proxy.reverse(someList)
will convert
someList
from a List<String>
to a String[]
,
call the MBean operation reverse
, then convert the returned
String[]
into a List<String>
.
The method Object.toString(), Object.hashCode(), or
Object.equals(Object), when invoked on a proxy using this
invocation handler, is forwarded to the MBean server as a method on
the proxied MBean only if it appears in one of the proxy's
interfaces. For a proxy created with JMX.newMBeanProxy
or JMX.newMXBeanProxy
, this means that the method must appear in the
Standard MBean or MXBean interface. Otherwise these methods have
the following behavior:
MBeanServerInvocationHandler
s was constructed with
a Class
argument then the other must have been constructed
with the same Class
for equals
to return true.
| Constructor and Description |
|---|
MBeanServerInvocationHandler(MBeanServerConnection connection,
ObjectName objectName)
Invocation handler that forwards methods through an MBean
server to a Standard MBean.
|
MBeanServerInvocationHandler(MBeanServerConnection connection,
ObjectName objectName,
boolean isMXBean)
Invocation handler that can forward methods through an MBean
server to a Standard MBean or MXBean.
|
| Modifier and Type | Method and Description |
|---|---|
MBeanServerConnection |
getMBeanServerConnection()
The MBean server connection through which the methods of
a proxy using this handler are forwarded.
|
ObjectName |
getObjectName()
The name of the MBean within the MBean server to which methods
are forwarded.
|
Object |
invoke(Object proxy,
Method method,
Object[] args)
Processes a method invocation on a proxy instance and returns
the result.
|
boolean |
isMXBean()
If true, the proxy is for an MXBean, and appropriate mappings
are applied to method parameters and return values.
|
static <T> T |
newProxyInstance(MBeanServerConnection connection,
ObjectName objectName,
Class<T> interfaceClass,
boolean notificationBroadcaster)
Return a proxy that implements the given interface by
forwarding its methods through the given MBean server to the
named MBean.
|
public MBeanServerInvocationHandler(MBeanServerConnection connection, ObjectName objectName)
Invocation handler that forwards methods through an MBean
server to a Standard MBean. This constructor may be called
instead of relying on JMX.newMBeanProxy
, for instance if you need to supply a
different ClassLoader
to Proxy.newProxyInstance
.
This constructor is not appropriate for an MXBean. Use
MBeanServerInvocationHandler(MBeanServerConnection,
ObjectName, boolean)
for that. This constructor is equivalent
to new MBeanServerInvocationHandler(connection,
objectName, false)
.
connection
- the MBean server connection through which all
methods of a proxy using this handler will be forwarded.objectName
- the name of the MBean within the MBean server
to which methods will be forwarded.public MBeanServerInvocationHandler(MBeanServerConnection connection, ObjectName objectName, boolean isMXBean)
Invocation handler that can forward methods through an MBean
server to a Standard MBean or MXBean. This constructor may be called
instead of relying on JMX.newMXBeanProxy
, for instance if you need to supply a
different ClassLoader
to Proxy.newProxyInstance
.
connection
- the MBean server connection through which all
methods of a proxy using this handler will be forwarded.objectName
- the name of the MBean within the MBean server
to which methods will be forwarded.isMXBean
- if true, the proxy is for an MXBean
, and
appropriate mappings will be applied to method parameters and return
values.public MBeanServerConnection getMBeanServerConnection()
The MBean server connection through which the methods of a proxy using this handler are forwarded.
public ObjectName getObjectName()
The name of the MBean within the MBean server to which methods are forwarded.
public boolean isMXBean()
If true, the proxy is for an MXBean, and appropriate mappings are applied to method parameters and return values.
public static <T> T newProxyInstance(MBeanServerConnection connection, ObjectName objectName, Class<T> interfaceClass, boolean notificationBroadcaster)
Return a proxy that implements the given interface by
forwarding its methods through the given MBean server to the
named MBean. As of 1.6, the methods JMX.newMBeanProxy(MBeanServerConnection, ObjectName, Class)
and
JMX.newMBeanProxy(MBeanServerConnection, ObjectName, Class,
boolean)
are preferred to this method.
This method is equivalent to Proxy.newProxyInstance
(interfaceClass.getClassLoader(),
interfaces, handler)
. Here handler
is the
result of new
MBeanServerInvocationHandler(connection, objectName)
, and
interfaces
is an array that has one element if
notificationBroadcaster
is false and two if it is
true. The first element of interfaces
is
interfaceClass
and the second, if present, is
NotificationEmitter.class
.
T
- allows the compiler to know that if the interfaceClass
parameter is MyMBean.class
, for example,
then the return type is MyMBean
.connection
- the MBean server to forward to.objectName
- the name of the MBean within
connection
to forward to.interfaceClass
- the management interface that the MBean
exports, which will also be implemented by the returned proxy.notificationBroadcaster
- make the returned proxy
implement NotificationEmitter
by forwarding its methods
via connection
. A call to NotificationBroadcaster.addNotificationListener(javax.management.NotificationListener, javax.management.NotificationFilter, java.lang.Object)
on the proxy will
result in a call to MBeanServerConnection.addNotificationListener(ObjectName,
NotificationListener, NotificationFilter, Object)
, and likewise
for the other methods of NotificationBroadcaster
and NotificationEmitter
.JMX.newMBeanProxy(MBeanServerConnection, ObjectName, Class, boolean)
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
InvocationHandler
invoke
in interface InvocationHandler
proxy
- the proxy instance that the method was invoked onmethod
- the Method
instance corresponding to
the interface method invoked on the proxy instance. The declaring
class of the Method
object will be the interface that
the method was declared in, which may be a superinterface of the
proxy interface that the proxy class inherits the method through.args
- an array of objects containing the values of the
arguments passed in the method invocation on the proxy instance,
or null
if interface method takes no arguments.
Arguments of primitive types are wrapped in instances of the
appropriate primitive wrapper class, such as
java.lang.Integer
or java.lang.Boolean
.null
and the interface method's return type is
primitive, then a NullPointerException
will be
thrown by the method invocation on the proxy instance. If the
value returned by this method is otherwise not compatible with
the interface method's declared return type as described above,
a ClassCastException
will be thrown by the method
invocation on the proxy instance.Throwable
- the exception to throw from the method
invocation on the proxy instance. The exception's type must be
assignable either to any of the exception types declared in the
throws
clause of the interface method or to the
unchecked exception types java.lang.RuntimeException
or java.lang.Error
. If a checked exception is
thrown by this method that is not assignable to any of the
exception types declared in the throws
clause of
the interface method, then an
UndeclaredThrowableException
containing the
exception that was thrown by this method will be thrown by the
method invocation on the proxy instance.UndeclaredThrowableException
Submit a bug or feature
For further API reference and developer documentation, see Java SE Documentation. That documentation contains more detailed, developer-targeted descriptions, with conceptual overviews, definitions of terms, workarounds, and working code examples.
Copyright © 1993, 2015, Oracle and/or its affiliates. All rights reserved.


{% extends "base.html" %} {% load static %} {% load bootstrap4 %} {% load i18n %} {% block content %}
Welcome to the safemasks data portal. We provide
To ensure integrety for our data, we review individual user before providing access to our entire data. Learn about our review process.
{% endblocktrans %}We automatically acquire data from remote sources like (...), our partners (...) and trusted buyers. After careful review and consideration, our experts rate individually obtained products or suppliers. We aggreate all ratings to formulate recommendations.
{% endblocktrans %}(+1)
, neutral (0)
and negative (-1)
—utilizing different sources.
This allows as to formulate aggreate ratings from different sources based on
A supplier is considered trustworthy if the average rating is above 0.5
.
For verified users, we provide acces to our supplier database in machine readable format (rest-API, JSON) at portal.safemasks.de/api.
Example python access:
import requests
url = "https://portal.safemask.de/api/suppliers/?format=json"
response = requests.get(url, auth=("{user}","{password}"))
print(reponse.data)
{% endblocktrans %}


I am currently a senior at Oakland Charter High School. I am passionate about technology especially when it comes to computer science, I also like to solve problems and I will keep thinking about the solutions unless I solved them, I guess I am a little stubborn. Information Technology has started a significant revolution and influenced the world over a decade, therefore I decided to pursue a computer science degree. Technology will keep changing the world and moving us forward, that’s what I believe and I am so glad that I am part of the next generation of tech talent.


Simulates identity and trivia quizzes on a CMS static page or data acquisition form. The library expects the form to be the usual assortment of radio buttons seen on social media and clickbait sites.
Link the styles and JavaScript in the <head>
element of the page.
<!-- Bootstrap Grid is used for the default breadcrumbs. If you're not using the breadcrumbs or have your own content then you don't need this. --> <link rel="stylesheet" href="https://server.name.com/path/bootstrap-grid.min.css" /> <!-- TEG Fake Pages provides the pagination of each question in the quiz. The styles do the actual hiding and showing of content. The library just swaps class names. If you don't want the fake pagination, don't include this or TEGFakePages.js below. --> <link rel="stylesheet" href="https://server.name.com/path/TEGFakePages.css" /> <!-- The baseline TEGQuiz styles only provide highlighting for selected answers. --> <link rel="stylesheet" href="https://server.name.com/path/TEGQuiz.css" /> <!-- Scripts should be in this order. This is a must. --> <script src="https://server.name.com/path/jquery-3.5.0.min.js" type="text/javascript"></script> <!-- TEG jQuery Utilities is required by TEGFakePages --> <script src="https://server.name.com/path/TEGUtilities.js" type="text/javascript"></script> <script src="https://server.name.com/path/TEGFakePages.js" type="text/javascript"></script> <!-- TQWhoAmI.js defines behavior for an identity quiz. --> <script src="https://server.name.com/path/TQWhoAmI.js" type="text/javascript"></script> <!-- TEGQuiz.js provides baseline quiz functionality and initializes the quiz type. --> <script src="https://server.name.com/path/TEGQuiz.js" type="text/javascript"></script>
Initialize the quiz object. This can be done in the <body>
element or in an external JS file.
jQuery(document).ready(function() { window.TEGForm = new TEGQuiz({ paginationOptions: { pageItemParentSelector: '', }, whoAmIOptions : { categories: { 'category01': { count: 0, win : 'You are in Category 1!', }, 'category02': { count: 0, win : 'You are in Category 2!', }, 'category03': { count: 0, win : 'You are in Category 3!', }, 'category04': { count: 0, win : 'You are in Category 4!', }, }, // end categories answers : { '#checkbox205': 'category01', '#checkbox206': 'category02', '#checkbox207': 'category03', '#checkbox208': 'category04', }, // end answers }, // end whoAmIOptions }); // any additional stuff goes here }); // end jQuery(document).ready
For a functional example see Static Form Example Who Am I.
| Property | Type | Default | Description |
|---|---|---|---|
| options | Collection | See Options below. | A collection of options for configuring the quiz. |
| args | Collection | {} |
A collection of the query string parameters from the URL of the form. |
| form | jQuery Object | {[]} |
jQuery object initialized with the HTML element selected by the formSelector option below.
|
| questions | jQuery Object | {} |
A jQuery object containing the form fields which will be counted to score the results. |
| submitButton | jQuery Object | {} |
A jQuery object containing the form submit button. |
| submmitted | Boolean | false |
Used in conjunction with the option resultsBeforeSubmit to control form submission.
|
| quiz | Collection |
{ getResults: function() { if (console) { console.warn('WARNING: TEGQuiz.quiz.getResults not overridden.'); } // end if console available } } |
A JavaScript object containing the properties and functions defined by the Quiz Type Plugin used. |
| Method | Description |
|---|---|
| runAfterAnswer() | Runs the functions in the afterAnswer collection option below. |
| errorHandler() | Runs the functions in the errorQueue collection option below. |
| submitHandler() | Runs the functions in the submitQueue collection option below. |
| getAnswerCount() | Returns the number of questions answered. |
| Option | Type | Default | Description |
|---|---|---|---|
| formSelector | String | 'form' |
CSS selector to identify the form element. This object will be hidden so that all the various swapping and rearranging happens out of sight. |
| questionSelector | String | 'input[type="checkbox"], input[type="number"], input[type="radio"], input[type="range"], select' |
CSS selector to identify the form fields. |
| questionExcludeSelector | String | '#firstName, #lastName, #email' |
CSS selector form fields to exclude from quiz processing. |
| answerHighlightClass | String | 'selected' |
CSS class name to be added to the labels of selected quiz answers. If answerLabelSelector is set, the library will attempt to add the value of
answerHighlightClass as a CSS class name to the field label when the input field changes.
|
| afterAnswer | Collection |
{ // runs after every question everyTime: function(event) { // update the results TEGQuiz.form .find(TEGQuiz.options.resultSelector) .html(TEGQuiz.quiz.getResults()); return true; }, } |
Collection of functions to run after questions are answered. The function named
everyTime will run when any answer is selected. Additional functions can be added for each question by adding a member with a key value matching the ID of a form element in the
questions collection.
|
afterAnswer
Function for a Specific Question{ /* The key value for each entry must match the ID of the * answer label for which it is to run. The function * will receive the event that fired the onClick handler. */ 'questionID': function(event) { if (console) { console.log('afterAnswer.questionID\n' + 'this = ' + this + '\n' + 'event = ' + event + '\n'); } }, }
| Option | Type | Default | Description |
|---|---|---|---|
| submitSelector | String | 'input[type="submit"]' |
CSS selector of the form submit button used to create the submitButton property. |
| usePagination | Boolean | typeof TEGFakePages === 'function' |
True if the library
TEG Fake Pages is available.
|
| paginationOptions | Collection | {} |
A collection of options to pass to TEG Fake Pages. See TEG Fake Pages for full documentation. |
| useTrivia | Boolean | typeof TQTrivia === 'function' |
True if the Quiz Type Plugin TEG Quiz Trivia is available. |
| triviaOptions | Collection | {} |
A collection of options to pass to TEG Quiz Trivia. See the associated HTML file for full documentation. |
| useWhoAmI | Boolean | typeof TQWhoAmI === 'function' |
True if the Quiz Type Plugin TEG Quiz Who Am I is available. |
| whoAmIOptions | Collection | {} |
A collection of options to pass to TEG Quiz Who Am I. See the associated HTML file for full documentation. |
| resultsBeforeSubmit | Boolean | true |
Determines if results must be calculated and shown to the user before the form is submitted. If this is
true then the first submission will be halted and the results requested from the Quiz Type Plugin.
|
| resultSelector | String | '.results' |
CSS selector of HTML element to display the results of the quiz. |
| afterLoad | Function | function(Options) { if (console) { console.log('TEGQuiz.afterLoad\n' + 'Options = ' + Options + '\n'); } return false; } |
CSS selector of HTML element to display the results of the quiz. |
| submitQueue | Collection of Functions | { '00500_quizHandler' : function(event) { if (console) { console.warn('005_quizHandler not overridden as expected.'); } // end if console available return true; } // end ['005_quizHandler']() } |
A collection of functions to be run as the
form.onSubmit event handler. Each entry in the collection will be run in alphabetical order by key name. The
Quiz Type Plugins will override the entry with the key word 00500_quizHandler .
|
| errorQueue | Collection of Functions | { '00500_quizErrorHandler': function(event) { if (console) { console.warn('00500_quizErrorHandler not overridden as expected.'); } // end if console available return true; } } |
A collection of functions to be run if any of the
form.onSubmit event handlers returns false. Each entry in the collection will be run in alphabetical order by key name. The
Quiz Type Plugins will override the entry with the key word 00500_quizErrorHandler .
|


Welcome to Kinstruction!
In order to use this site, you must agree to the following:
- I am are either 18 years of age (and at least as old as the minimum legal age to view adult content in my country or region).

- I am visiting this site of my own free will, and am wearing my Big Boy/Girl pants. I will take responsibility for my actions.
- I understand that the contents of this site are for entertainment purposes only.


In order to work the component in a desired manner it is recommended that the tables that hold the tree data should contain certain fields.
All of these fields and the type of the model should be set with setTableConfig and and setTreeModel php methods.
By example if we use the nested set model and our system fields in the tree table are named lft, rgt and level then the appropriate setting can look like this
<?php .... // Connection to the server $conn = new PDO(DB_DSN,DB_USER,DB_PASSWORD); // Create the jqTreeGrid instance $tree = new jqTreeGrid($conn); ..... // set the table and primary key $tree->table = 'nested_category'; $tree->setPrimaryKeyId('category_id'); // set model $tree->setTreeModel('nested'); //set the table configuration $tree->setTableConfig(array('id'=>'category_id', 'left'=>'lft', 'right'=>'rgt')); ... ?>
Having this in mind bellow we will discuss the both models.


The complete list of grammar tokens is given in the table below.
These tokens are all described in this section except for
scope =
‹Routine›,
which is postponed to the next.
' ‹word›' |
that literal word only |
noun |
any object in scope |
held |
object held by the actor |
multi |
one or more objects in scope |
multiheld |
one or more held objects |
multiexcept |
one or more in scope, except the other object |
multiinside |
one or more in scope, inside the other object |
| ‹attribute› | any object in scope which has the attribute |
creature |
an object in scope which is animate |
noun = ‹Routine› |
any object in scope passing the given test |
scope = ‹Routine› |
an object in this definition of scope |
number |
a number only |
| ‹Routine› | any text accepted by the given routine |
topic |
any text at all |
To recap, the parser goes through a line of grammar tokens trying to match each against some text from the player's input. Each token that matches must produce one of the following five results:
Ordinarily, a single line, though it may contain many tokens, can produce at most two substantial results ((a) to (d)), at most one of which can be multiple (b). (See the exercises below if this is a problem.) For instance, suppose the text “green apple on the table” is parsed against the grammar line:
* multi 'on' noun -> Insert
The multi
token matches “green apple” (result: a single object, since
although multi
can match
a multiple object, it doesn't have to), 'on'
matches “on” (result: nothing) and the second
noun
token matches
“the table” (result: a single object again). There are two
substantial results, both objects, so the action that comes out is
<Insert apple table>
. If the text had been “all
the fruit on the table”, the multi
token might have resulted in a list: perhaps of an apple, an orange
and a pear. The parser would then have generated and run through three
actions in turn: <Insert apple table>
, then
<Insert orange table>
and finally
<Insert pear table>
, printing out the name of each
item and a colon before running the action:
>put all the fruit on the table
Cox's pippin: Done.
orange: Done.
Conference pear: Done.
The library's routine InsertSub
, which
actually handles the action, only deals with single objects at a time,
and in each case it printed “Done.”
· · · · ·
'
‹word›'
This matches only the literal word given, sometimes called
a preposition because it usually is one, and produces no resulting
information. (There can therefore be as many or as few of them on a
grammar line as desired.) It often happens that several prepositions really
mean the same thing for a given verb: for instance “in”,
“into” and “inside” are often synonymous.
As a convenient shorthand, then, you can write a series of prepositions
(only) with slashes /
in between, to mean “one of
these words”. For example:
* noun 'in'/'into'/'inside' noun -> Insert
noun
Matches any single object “in scope”, a
term defined in the next section and which roughly means “visible
to the player at the moment”.
held
Matches any single object which is an immediate possession
of the actor. (Thus, if a key is inside a box being carried by the actor,
the box might match but the key cannot.) This is convenient for two reasons. Firstly,
many actions, such as Eat
or Wear
,
only sensibly apply to things being held. Secondly, suppose we have grammar
Verb 'eat' * held -> Eat;
and the player types “eat the banana” while
the banana is, say, in plain view on a shelf. It would be petty of the
game to refuse on the grounds that the banana is not being held.
So the parser will generate a Take
action for the banana
and then, if the Take
action succeeds, an Eat
action. Notice that the parser does not just pick up the object, but
issues an action in the proper way – so if the banana had rules
making it too slippery to pick up, it won't be picked up. This is
called “implicit taking”, and happens only for the player,
not for other actors.
multi
Matches one or more objects in scope. The
multi-
tokens indicate
that a list of one or more objects can go here. The parser works out
all the things the player has asked for, sorting out plural nouns and
words like “except” in the process. For instance, “all
the apples” and “the duck and the drake” could match
a multi
token but not
a noun
token.
multiexcept
Matches one or more objects in scope, except that it does
not match the other single object parsed in the same grammar line. This
is provided to make commands like “put everything in the rucksack”
come out right: the “everything” is matched by all of the
player's possessions except the rucksack, which stops the parser from
generating an action to put the rucksack inside itself.
multiinside
Similarly, this matches anything inside the other single
object parsed on the same grammar line, which is good for parsing
commands like “remove everything from the cupboard”.
‹attribute› Matches any object in scope which has the given attribute. This is useful for sorting out actions according to context, and perhaps the ultimate example might be an old-fashioned “use” verb:
Verb 'use' 'employ' 'utilise' * edible -> Eat * clothing -> Wear ... * enterable -> Enter;
creature
Matches any object in scope which behaves as if living.
This normally means having animate
: but, as an exceptional
rule, if the action on the grammar line is Ask
,
Answer
, Tell
or AskFor
then
having talkable
is also acceptable.
noun =
‹Routine›
“Any single object in scope satisfying some condition”.
When determining whether an object passes this test, the parser sets the
variable noun
to the object in question and calls the routine.
If it returns true
, the parser accepts the object, and
otherwise it rejects it. For example, the following should only apply
to animals kept in a cage:
[ CagedCreature; if (noun in wicker_cage) rtrue; rfalse; ]; Verb 'free' 'release' * noun=CagedCreature -> FreeAnimal;
So that only nouns which pass the CagedCreature
test are allowed. The CagedCreature
routine can appear anywhere
in the source code, though it's tidier to keep it nearby.
scope =
‹Routine›
An even more powerful token, which means “an object
in scope” where scope is redefined specially. You can also choose
whether or not it can accept a multiple object. See §32.
number
Matches any decimal number from 0 upwards (though it rounds
off large numbers to 10,000), and also matches the numbers “one”
to “twenty” written in English. For example:
Verb 'type' * number -> TypeNum;
causes actions like <Typenum 504>
when
the player types “type 504”. Note that noun
is
set to 504, not to an object. (While inp1
is set to 1,
indicating that this “first input” is intended as a number:
if the noun had been the object which happened to have number 504,
then inp1
would have been set to this object, the same
as noun
.) If you need more exact number parsing, without
rounding off, and including negative numbers, see the exercise below.
•
EXERCISE 83
Some games, such as David M. Baggett's game ‘The Legend Lives!’
produce footnotes every now and then. Arrange matters so that these
are numbered [1]
, [2]
and so on in order
of appearance, to be read by the player when “footnote 1”
is typed.
▲
The entry point ParseNumber
allows you to provide your
own number-parsing routine, which opens up many sneaky possibilities –
Roman numerals, coordinates like “J4”, very long telephone
numbers and so on. This takes the form
[ ParseNumber buffer length; ...returning false if no match is made, or the number otherwise... ];
and examines the supposed ‘number’ held
at the byte address buffer
, a row of characters of the
given length. If you provide a ParseNumber
routine but
return false
from it, then the parser falls back on
its usual number-parsing mechanism to see if that does any better.
▲▲
Note that ParseNumber
can't return 0 to mean the number
zero, because 0 is the same as false
. Probably
“zero” won't be needed too often, but if it is you can always
return some value like 1000 and code the verb in question to understand
this as 0. (Sorry: this was a poor design decision made too long ago
to change now.)
topic
This token matches as much text as possible, regardless
of what it says, producing no result. As much text as possible means
“until the end of the typing, or, if the next token is a
preposition, until that preposition is reached”. The only way
this can fail is if it finds no text at all. Otherwise, the variable
consult_from
is set to the number of the first word of the
matched text and consult_words
to the number of words.
See §16 and §18
for examples of topics being used.
‹Routine›
The most flexible token is simply the name of a “general
parsing routine”. As the name suggests, it is a routine to do some
parsing which can have any outcome you choose, and many of the interesting
things you can do with the parser involve writing one. A general parsing
routine looks at the word stream using NextWord
and
wn
(see §28) to make its decisions,
and should return one of the following. Note that the values beginning
GPR_
are constants defined by the library.
On an unsuccessful match, returning GPR_FAIL
,
it doesn't matter what the final value of wn
is. On a
successful match it should be left pointing to the next thing after
what the routine understood. Since NextWord
moves wn
on by one each time it is called, this happens automatically unless
the routine has read too far. For example:
[ OnAtorIn; if (NextWord() == 'on' or 'at' or 'in') return GPR_PREPOSITION; return GPR_FAIL; ];
duplicates the effect of
'on'/'at'/'in'
,
that is, it makes a token which accepts any of the words “on",
“at" or “in" as prepositions. Similarly,
[ Anything; while (NextWordStopped() ~= -1) ; return GPR_PREPOSITION; ];
accepts the entire rest of the line (even an empty
text, if there are no more words on the line), ignoring it.
NextWordStopped
is a form of NextWord
which
returns the special value −1 once the original word stream has
run out.
If you return GPR_NUMBER
, the number
which you want to be the result should be put into the library's
variable parsed_number
.
If you return GPR_MULTIPLE
, place your
chosen objects in the table multiple_object
: that is,
place the number of objects in multiple_object-->0
and the objects themselves in -->1
, …
The value GPR_REPARSE
should only be
returned if you have actually altered the text you were supposed to be
parsing. This is a feature used internally by the parser when it asks
“Which do you mean…?” questions, and you can use
it too, but be wary of loops in which the parser eternally changes
and reparses the same text.
· · · · ·
▲
To parse a token, the parser uses a routine called ParseToken
.
This behaves almost exactly like a general parsing routine, and returns
the same range of values. For instance,
ParseToken(ELEMENTARY_TT, NUMBER_TOKEN)
parses exactly as number
does: similarly for NOUN_TOKEN
, HELD_TOKEN
,
MULTI_TOKEN
, MULTIHELD_TOKEN
,
MULTIEXCEPT_TOKEN
, MULTIINSIDE_TOKEN
and
CREATURE_TOKEN
. The call
ParseToken(SCOPE_TT, MyRoutine)
does what scope=MyRoutine
does. In fact ParseToken
can parse any kind of token,
but these are the only cases which are both useful enough to mention
and safe enough to use. It means you can conveniently write a token
which matches, say, either the word “kit” or
any named set of items in scope:
[ KitOrStuff; if (NextWord() == 'kit') return GPR_PREPOSITION; wn--; return ParseToken(ELEMENTARY_TT, MULTI_TOKEN); ];
· · · · ·
•
EXERCISE 84
Write a token to detect small numbers in French, “un”
to “cinq”.
•
EXERCISE 85
Write a token called Team
, which matches only against
the word “team” and results in a multiple object containing
each member of a team of adventurers in a game.
•▲
EXERCISE 86
Write a token to detect non-negative floating-point numbers like
“21”, “5.4623”, “two point oh eight”
or “0.01”, rounding off to two decimal places.
•▲
EXERCISE 87
Write a token to match a phone number, of any length from 1 to 30 digits,
possibly broken up with spaces or hyphens (such as “01245 666
737” or “123-4567”).
•▲▲
EXERCISE 88
(Adapted from code in "timewait.h": see the references
below.) Write a token to match any description of a time of day, such
as “quarter past five”, “12:13 pm”,
“14:03”, “six fifteen” or “seven
o'clock”.
•▲
EXERCISE 89
Code a spaceship control panel with five sliding controls, each
set to a numerical value, so that the game looks like:
>look
Machine Room
There is a control panel here, with five slides, each of which can
be set to a numerical value.
>push slide one to 5
You set slide one to the value 5.
>examine the first slide
Slide one currently stands at 5.
>set four to six
You set slide four to the value 6.
•▲
EXERCISE 90
Write a general parsing routine accepting any amount of text, including
spaces, full stops and commas, between double-quotes as a single token.
•
EXERCISE 91
On the face of it, the parser only allows two parameters to an action,
noun
and second
. Write a general parsing routine
to accept a third
. (This is easier than it looks: see
the specification of the NounDomain
library routine
in §A3.)
•
EXERCISE 92
Write a token to match any legal Inform decimal, binary or hexadecimal
constant (such as -321
, $4a7
or
$$1011001
), producing the correct numerical value in
all cases, while not matching any number which overflows or underflows
the legal Inform range of −32,768 to 32,767.
•
EXERCISE 93
Add the ability to match the names of the built-in Inform constants
true
, false
, nothing
and
NULL
.
•
EXERCISE 94
Now add the ability to match character constants like '7'
,
producing the correct character value (in this case 55, the ZSCII
value for the character ‘7’).
•▲▲
EXERCISE 95
Next add the ability to match the names of attributes, such as
edible
, or negated attributes with a tilde in front,
such as ~edible
. An ordinary attribute should parse
to its number, a negated one should parse to its number plus 100.
(Hint: the library has a printing rule called DebugAttribute
which prints the name of an attribute.)
•▲▲
EXERCISE 96
And now add the names of properties.
•
REFERENCES
Once upon a time, Andrew Clover wrote a neat library extension called
"timewait.h" for parsing times of day, and allowing
commands such as “wait until quarter to three”. L. Ross
Raszewski, Nicholas Daley and Kevin Forchione each tinkered with and
modernised this, so that there are now also "waittime.h"
and "timesys.h". Each has its merits.


{% import 'partials/section.html' as section %} {% extends "layouts/_twocol.html" %} {% block page_title %}Check your email - Forgot password - ONS Business Surveys{% endblock %} {% block main %}
Please follow the link in the email we've sent you to reset your password and sign in to your account.
{% endblock main %}


| | |
- builtins.object
-
- Accounts
class Accounts(builtins.object) |
| |
Accounts(client, maxAccounts, maxAccountBalance, minBill)
Accounts Collection. |
| |
Methods defined here:
- __init__(self, client, maxAccounts, maxAccountBalance, minBill)
- Accounts Collection Default Constructor.
Args:
client (Client): Account client (owner).
maxAccounts (int): Maximum accounts per client.
maxAccountBalance (int): Max account balance.
minBill (int): Minimum denomination bills.
- __str__(self)
- Accounts output.
Returns:
String: Output Account string.
- createAccounts(self)
- Create three accounts of the client.
- createRandomAccounts(self)
- Create a random account collection.
- randomSelectedAccount(self, client)
- Selecting an Account.
Args:
client (Client): Account client (owner).
Returns:
Account: The selected Account.
Data descriptors defined here:
- __dict__
- dictionary for instance variables (if defined)
- __weakref__
- list of weak references to the object (if defined)
- accounts
- client
| |


ABS National Focal Point (NFP)
{{nfpCount}}
Competent National Authorities (CNA)
{{nationalAuthority}}
Legislative, administrative or policy measures on access and benefit-sharing (MSR)
{{nationalMeasure}}
National Databases and Websites (NDB)
{{database}}
Checkpoints (CP)
{{absCheckpoint}}
Internationally Recognized Certificates of Compliance (IRCC)
{{Permit}}
Checkpoint Communiqués (CPC)
{{absCheckpointCommunique}}
Interim National Report on the Implementation of the Nagoya Protocol (NR)
{{absNationalReport}}


Moderator: Joe M.
kinral wrote:I'm slowly catching up with Marz. I'll bully him for you someday.
Sex4Cash wrote:You need to get a sexy mirror shield like I found yesterday! I'm also catchin up foo! Just need rings and lvls. Figure 10 levels (now 15) yesterday wasn't terrible for part-time.
Sex4Cash wrote:Can't log in atm for a screenie - but offhand its: 36armor 25 mag resist 7%steal hp 5%steal mp
Karl G. wrote:No, steals don't work atm.
+1 ability level means that if you're level 17, you have the abilities of a level 18!
Users browsing this forum: No registered users and 1 guest


| ID | Name | Category | Pubkisher | Author | Base Price | Discount | Sub total |
|---|---|---|---|---|---|---|---|
| {{newbook.id}} | {{newbook.name}} | {{newbook.categoryId}} | {{newbook.publisher}} | {{newbook.author}} | {{newbook.basePrice}} Tk | Apply | {{newbook.subTotal}} |
University Book Center
Address: Gazipur Chourasta, Dhaka
Phone:
Date:
| ID | Name | Category | Pubkisher | Author | Base Price | Discount | Sub total |
|---|---|---|---|---|---|---|---|
| {{newbook.id}} | {{newbook.name}} | {{newbook.categoryId}} | {{newbook.publisher}} | {{newbook.author}} | {{newbook.basePrice}} Tk | Apply | {{newbook.subTotal}} |


I Alone Level-up: Chapter 13
He did not want to attract unwanted attention . The gazes that fell on him were uncomfortable, and he did not want to reveal his strange phenomenon to others . What was the saying? “Let sleeping dogs lie . ”?
He wanted to increase his attributes away from prying eyes .
‘I don’t think there are any issues with leaving now . ’
Thankfully, all the tests they ran came up positive; there was nothing wrong with his health . He was able to discharge whenever he wanted . Rather, both the Association and the hospital appeared to want him to leave… They probably felt that it was a waste to spend all that money taking care of a mere E-rank Hunter . Compared to the S-rank Hunters who received a small portion of a country’s budget if they required healing, Jinwoo lived in another world .
As such, he felt that it was about time he left the hospital .
There was also something he wanted to check out .
“Where did I put it…”
Searching his pockets, Jinwoo took something out .
It was a golden key .
Due to its simple design, the key almost appeared to be decorational .
After looking at it for some time, Jinwoo put the key back in his pockets .
As he was in the middle of the discharge procedures, he saw a young nurse running to him in a hurry .
“Pant . pant . ! Sung Jinwoo-ssi, are you leaving right now?”
“Huh? Oh, yes . ”
It was his assigned nurse, Choi Yura . She looked to be sad at the news of his discharge . Not understanding her expression, Jinwoo became confused . He wondered if something had happened, but could not place his fingers on what . After fidgeting, she held out a small notepad .
“Could I have your contact information?”
“My contact information?”
“Yes… if it’s okay with you…”
Did she want to send some test results later? Not thinking too much about it, Jinwoo took her notepad . Then he realized all she had given him was the notepad .
As he blatantly stared at her, Yura blushed .
“What, what is it?”
“Er… I don’t have a pen . ”
“Oh, oh! Sorry, one second . ”
She must’ve forgotten in her hurry . She quickly turned to leave .
‘Oh, wait . If it’s a pen…’
In a blink of an eye, he was suddenly holding a pen in his hand . As if responding to his thoughts, the pen had automatically appeared from his inventory . It seemed that he was able to freely store and retrieve the items from his inventory just by thinking about it . It was a rather convenient function of the inventory . Confirming what was in his hand, Jinwoo stopped Yura,
“Oh wait, it looks like I had one in my pockets . ”
“Oh? Phew, that’s good . ”
Yura clutched her chest and sighed in relief . Jinwoo smiled as he wrote his phone number on the notepad . This was not the first time something like this had happened . The items that came out of the Random Box often found a way to be useful, in one way or another . The day after he received a raincoat, it rained . The day before his water cooler ran out of cups, a cup had appeared . Although he did receive few unneeded items like the bandages, most had found their use .
“Here you go . ”
Yura received the notepad with a happy expression, then bowed her head .
“Then I’ll be in your care . ”
“Hmm? Ah, yes . Me as well . ”
Turning around, Yura quickly disappeared around the corner . As he watched her shuffle away, Jinwoo tilted his head .
‘Be in my care? Huh?’
She seemed like a cute nurse with good manners .
With that in mind, Jinwoo left the hospital with a spring in his steps .
The first place he went to was the Hunter Association building located in the Guro district of Seoul . As he had lost his phone in the Double Dungeon, he needed a replacement . A Hunter’s phone used special mechanisms and could only be obtained directly from the Association .
The Association staff told Jinwoo after looking at his monitor,
“It looks like Hunter-nim’s phone will be available in about 2 weeks . ”
“Really? That long?”
Jinwoo exclaimed in surprise . His old phone was smashed to pieces when he was running from the Statue of God, and now they were telling him it would be 2 weeks before he could get a new one .
“If you have an urgent need for one, we can lend you a temporary phone . The rental fee is 50 thousand won . ”
50 thousand won… Just the rental fee was that high . At his current status, it was too expensive .
‘Well, it’s not like anyone’s going to call me . ’
If they could not contact him through his phone, the Association would call him at home . So there wasn’t a need for him to use money on a rental .
Jinwoo shook his head,
“I’ll just wait . ”
“Understood . When your new device is ready, we’ll send it directly to your home . ”
“Thank you . ”
He stood up . His errands were now over . He had already finished the daily quest, and the process of requesting a new phone at the Association was over as well . As he exited the building, he took out the golden key again .
‘Is it time for this thing?’
The key’s information was outlined in green letters on the floating screen .
| Dungeon Key. |
| Rarity[1]: E-rank. Type: Key. Key to access an Instant Dungeon . Usable in Hapjeong Subway Station #3 . |
It was one of the rewards from a Random Box . At first, he was confused at the appearance a key, but looking at the first instance of a “rarity” on an item, he knew it was not something ordinary . It was one of the main reasons he had decided to leave the hospital .
‘A key to access an Instant Dungeon…’
Even if it was called “Instant”, a Dungeon was a Dungeon . It was a word that brought back a lot of painful memories . Once, he had participated in an E-rank raid but received a big injury and had to be hospitalized for a week .
‘At least at that time, no one else got hurt in the party…’
However, if he entered a Dungeon with this key, it would have to be completely alone .
Jinwoo made the decision after thinking for some time .
‘I could just check it out and leave . ’
There was always the option of running away . Diligently running 10km everyday, Jinwoo was confident in his ability to run away .
That confidence was a mistake .
slam, slam!
“This is… a wall?”
He pounded on the invisible barrier and tried to scream towards the outside, but there was no response . The people outside walked by, taking no notice of him . Occasionally, someone would walk down the stairs into the subway station, but the moment they reached the invisible wall, they disappeared . Compared to the outside, it seemed like this place was in a separate dimension .
As Jinwoo used all his strength to try and force his way out, he received another message .
ring~
| You cannot exit the Dungeon . . Please defeat the boss or use a “return stone”[2] |
It was the same message he received when he first tried to leave .
The dungeon key that he was holding disappeared the moment he took a step into the Subway Station #3 . When he panicked and turned around to leave, an invisible barrier was already blocking his way .
He had initially expected to find a Gate or a secret entrance somewhere in the station, but his expectations were off the mark . And worse, contrary to a normal Dungeon, it was impossible for him to leave .
“Contrary to a normal Dungeon…”
With a heavy sigh, he turned around .
The station had transformed, combining its natural interior with elements of a jungle . The walls were covered in vines, and the smell of rotting corpse stabbed at Jinwoo’s nose . From a distance, he even heard something resembling an animal’s cry .
“ . ”
Instead of finding an entrance somewhere in Hapjeong Subway Station, the entire station had become the Dungeon .
Jinwoo retrieved the steel sword from his inventory .
ring~
| Kim Sangshik’s Steel Sword. |
| Attack Power +10. |
If retreat wasn’t an option, the only way was forward .
Jinwoo gulped as he slowly descended the stairs into the station . He held his breath and looked around, but did not sense anything . Yet he could not relax; carelessness was not allowed . Even among the lower level magic beasts, there were ones that could hide their presence . Rather, it was because they were lower level that they had to hide their presence and attempt an ambush .
He passed by a bathroom and came upon an underground shopping center . The various storefronts were in a state of deterioration . With no humans in sight, the dimly lit area was reminiscent of an apocalyptic movie . A hair-raising chill washed over Jinwoo .
flicker- flicker-
As if on their last legs, several of the ceiling lights flickered on and off .
Walking on weeds that grew out from broken tiles, Jinwoo looked around anxiously .
“ . ”
His surroundings were empty, but he felt something looking at him .
‘And this smell . ’
A strong stench of a rotting corpse was coming from somewhere . Having entered many Dungeons before, it was a familiar smell to Jinwoo .
‘It’s a beast type magic beast[3]’
However, he could not pinpoint its location . It was almost as if was waiting to ambush a prey .
‘So you’re gonna hide and wait for an opportunity, eh?’
Then he’ll give it an opportunity .
Jinwoo turned around and showed his back on purpose, then slowly walked in the direction he came from . Predators tended to attack a prey’s exposed back; the beast type magic beasts were no different .
It was after he took his third step,
shatter!
The windows of a clothing storefront broke apart as something leaped through it from inside . The moment it landed on the floor, it immediately jumped again towards the back of Jinwoo’s neck .
Roar!
Having already anticipated the attack, Jinwoo responded to the creature’s roar by swinging his sword as he turned around . It was an impressive reflex!
slash-!
The sharp sword caught the chin of the attacking beast as it swung through the air . Falling away, the beast shrieked as it rolled on the ground .
whimper- whimper-
It was a large wolf with red furs . Having lost its entire snout, the wolf tossed and turned on the ground in pain . When Jinwoo looked closer, he was able to see a name above the beast’s head, similar to the centipedes from the Penalty Zone .
‘Steel-teeth Lycan’ [4]
However, unlike the centipedes whose name was in red, his current enemy’s name was in white .
‘No time to think about it!’
With the beast writhing on the ground in pain, the opportunity to finish it was now . Jinwoo ran across the distance between the two . He brought down his sword as he reached the beast . Its head was cleanly separated from its body .
whimper-!
The Lycan let out a death rattle as it passed .
| You’ve defeated the Steel-teeth Lycan . . |
“Good!”
But he did not have time to celebrate . From the broken window, two more Lycans that were hiding in the darkness came out .
‘Ah, it had friends . ’
Jinwoo’s eyes widened,
Roar!
Baring their scary fangs, the two beasts closed the gap toward Jinwoo in an instant . Jinwoo furrowed his brows . In his excitement to slay the first Lycan, he had brought down his sword with too much force, and now the sword was stuck in the ground .
‘It’s stuck!’
While he was struggling to pull out the sword, one of the Lycans pounced towards his face .
“Whoa!”
He quickly lowered his head to evade . The Lycan that missed his head could not control its speed and crashed into the ground .
crack!
The ground where its fangs struck cracked .
‘Guess “Steel-teeth” isn’t just a name’
But there was no time to be impressed, the other Lycan was now coming at him . The sword did not appear to be coming out anytime soon .
“Shit!”
Having no choice, he abandoned the sword and swung his fist at the Lycan in midair .
woosh!
Making noise like the wind, his fist flew through the air .
smash!
Upon impact, the Lycan’s head exploded . The headless body of the Lycan struck the ceiling then fell to the ground .
slam!
“ . ?”
Jinwoo looked at his fist in surprise .
Its destructive power was not something he had expected .
Translator’s Notes:
[1]: “Rarity” (입수 난이도): Lit . “to obtain/get/acquire” 입수 + “difficulty” 난이도 > “the difficulty in obtaining this item” > “rarity”
[2]: “return stone” (귀환석): Lit . “to return” 귀환 + “rock” 석 > a return stone . In some video games, it’s an item that allows the user to return to the nearest safe place (towns, save points, etc…) . Called “hearthstone” in WoW .
[3]: “beast type magic beast” (짐승형 마수): Lit . “beast/animal” 짐승 + “type” 형 + “magic beast” 마수; the two words for “beast” are different in Korean . A bit awkward to say “beast type magic beast”, but Jinwoo clarifying the “type” of the magic beast here has the implication that “magic beast” just refers to any hostile entity in a Dungeon (meaning their forms are not just limited to beasts and animals) .
[4]: ‘steel-teeth lycan’ (강철 이빨 라이칸) . Pretty literal translation . “Steel” 강철 + “tooth” 이빨 . Someone told me “Lycan” is the korean pronunciation of lycan, short for lycanthrope . Thanks to /u/Zarryiosiad for the reference .


{{ define "main" }}
{{ .Description }}{{ .Title | markdownify }}
Create a dashboard view for your app using Rivet's mobile-first designed components. This example shows how Rivet's flexible type scale and spacing utilities can be combined to create layouts that work for all screens.
See the exampleRivet can be integrated with any frontend Javascript framework, including React, Angular and VueJS. This article will walk you through converting a Rivet alert component to a React component.
Read this articleWe've created an Axure wireframe kit with accurate representations of all the Rivet components.
Download the Axure kitGet started using Rivet by heading over the the component documentation. You can learn about all the ways you can use Rivet and best practices for implementing it in your next project.
Go to documentation


VERY INSANE DOGS TIC TAC TOE
Dunk Power
Home Team
Clock
Dunk Power
Away Team
Reset Board
Choose your shot
2 pointer
3 pointer
Dunk!
Shot Maker
Release to Shoot!
Selection Menu
Home Team
Lakers
Clippers
Mavericks
Away Team
Pacers
Heat
Celtics
Game Type
Tic-Tac-Toe Classic
Tic-Tac-Toe - 6x6
Connect 4 Classic
Connect 4 - 10x10
Timer
10 sec
2 min
5 min
10 min
No timer
Start