| CONTENTS |
The "other" interactive editor that's commonly used is Emacs. Emacs actually refers to a family of editors; versions of Emacs run under most operating systems available. However, the most important (and most commonly used) version of Emacs is "GNU Emacs," developed by the Free Software Foundation.
Go to http://examples.oreilly.com/upt3 for more information on: emacs
GNU Emacs is popular because it's the most powerful editor in the Emacs family; it is also freely available under the terms of the FSF's General Public License. Although there are certainly strong differences of opinion between Emacs and vi users, most people agree that Emacs provides a much more powerful and richer working environment.
What's so good about Emacs, aside from the fact that it's free? There are any number of individual features that I could mention. (I'll give a list of favorite features in Section 19.2.) Emacs' best feature is the extent to which it interacts with other Unix features. For example, it has a built-in email system so you can send and receive mail without leaving the editor. It has tools for "editing" (deleting, copying, renaming) files, for running a Unix shell within Emacs, and so on. The C shell has a rather awkward command-history mechanism; the Korn shell has something more elaborate. But imagine being able to recall and edit your commands as easily as you edit a letter! That's far beyond the abilities of any shell, but it's simple when you run a shell inside your editor.
In this book, we can't give anywhere near as much attention to Emacs as we can to vi (Section 17.1), but we will point out some of its best features and a few tricks that will help you get the most out of it. For the impatient, here's a very brief survival guide to Emacs.
Like vi, Emacs can be started from the shell prompt by typing its name, emacs. Once started, emacs will present you with a helpful screen of commands. A word of advice: take the tutorial (CTRL-h t). If you want to edit an existing file, simply type emacs with the desired filename after it. While editing your file, you may save your work to disk with CTRL-x CTRL-s.
To exit emacs, type CTRL-x CTRL-c. If you haven't saved your work yet, you will have the opportunity to do so before Emacs quits.
Unlike vi, Emacs doesn't have a command mode. Like many more modern editors, Emacs allows the user to begin typing his document immediately. Terminal emulation willing, the arrow keys work as expected to move your cursor in and around lines of text. For long documents, you can move by pages rather than lines. Pressing CTRL-v moves the cursor lower in the document, while ESC-v moves the cursor towards the begining.
The BACKSPACE key normally erases one character to the left of the cursor, and the DELETE key erases the charater under the cursor. Entire lines of text may be removed using CTRL-k, which removes all text from the cursor to the end of the line. You can paste back the most recent cut with CTRL-y.
To undo your last action, type CTRL-x u. You can cancel out of a command sequence with CTRL-g. This is helpful when you're experiencing key lag and type a few extra CTRL-c's.
One last tip before moving on. The Emacs online help descibes key bindings using different abbreviations than used in this book. In the Emacs documentation, C-x is our CTRL-x. Their M-x is our ESC-x. The M stands for META key, which is mapped to the ESCAPE key and usually to the ALT key as well. For consistency, this chapter always refers to the ESCAPE key.
ML, BR, DC, and JJ
Here's the list we promised a list of our favorite features:
Emacs is a "windowed editor." Before anyone heard of the X Window System or the Macintosh, Emacs had the ability to divide a terminal's screen into several "windows," allowing you to do different things in each one. You can edit a different file in each window or read mail in one window, answer mail in another, issue shell commands in a third, and so on.
Now that we all have nice workstations with mice and other crawly things for navigating around a bitmapped screen, why do you care? First, you may not have a bitmapped screen, and even if you have one in the office, you may not at home. Second, I still find Emacs preferable to most "modern" window systems because I don't have to use a mouse. If I want to create another window, I just type CTRL-x 2 (which splits the current window, whatever it is, into two); if I want to work in another window, I just type CTRL-x o; if I want to delete a window, I type CTRL-x 0. Is this faster than reaching for my mouse and moving it around? You bet. Particularly since my mouse is hidden under a pile of paper. (Of course, it's hidden because I hardly ever need it.) Once you've created a window, it's just as easy to start editing a new file, initiate a shell session, and so on. Third, even though you're using a windowing system, you may not have a lot of screen real estate available. By having a split Emacs screen, all editing can be done in one window, leaving enough room for other applications, such as the Mozilla web browser, to be open. Whether you're developing web pages or just reading Slashdot while "working," you'll appreciate the free space on the screen. It isn't uncommon for Emacs users to always have Emacs open on their desktops.
You can start an interactive shell within any Emacs window; just type ESC-x shell, and you'll see your familiar shell prompt. It's easy to see why this is so useful. It's trivial to return to earlier comands, copy them, and edit them. Even more important, you can easily take the output of a command and copy it into a text file that you're editing obviously an extremely useful feature when you're writing a book like this. Emacs also lets you issue commands that operate on the contents of a window or a selected region within a window. Another benefit to doing shell work directly in Emacs is that every word that appears in that shell buffer is available for command completions (Section 19.6). So if you're creating a small shell script that has to reference a long directory name, being able to autocomplete that name is an invaluable feature.
In fact, there are many filesystem maintenance tasks with which Emacs can help you. You can view and manipulate directories and files with Dired mode, which can be activated by typing ESC-x dired. You'll be asked which directory you want to view (the current directory is the default). Do you want to remove a file that starts with a hyphen, but rm complains that your file is not a valid option? Start Emacs in Dired mode, select the file, and type D. Emacs will ask you for confirmation about the proposed deletion.  In dired mode, select each file with d, then remove them all with ESC-x dired-do-flagged-delete.
Emacs lets you define "keyboard macros" and sequences of commands that can be executed automatically. This is similar to vi's map (Section 18.2) facility, with one extra twist: Emacs actually executes the commands while you're defining the macro; vi expects you to figure out what you need to do, type it in without any feedback, and hope that the macro doesn't do anything hostile when you edit it. With Emacs, it's much easier to get the macro right. You can see what it's going to do as you're defining it, and if you make a mistake, you can correct it immediately.
To create a macro, you first need to tell Emacs that it needs to remember the next sequence of keystrokes by typing CTRL-x (. Now perform the desired actions. To end the macro recording, type CTRL-x ). To execute the most recently defined macro, type CTRL-x e. If you make a mistake when recording the marco, type CTRL-g to cancel out of the entire operation, and begin recording the macro again.
Even if you don't create your own macros, Emacs provides a rich set of text- editing features that often do what you mean. For instance, Emacs allows users to make rectangluar text cuts. This is very useful for removing leading whitespace from a series of lines. To make the cut, you must first define the starting point of the rectangle to be cut. Position the cursor in Emacs to the upper-left corner of the area to be excised. Then mark the area with CTRL-SPACE. Move the cursor down to the last line of the area to be removed and then over to right as far as is desired. This is the lowest and rightmost corner of the rectangle. Now remove the area with the key sequence CTRL-x r k.
Emacs has a large number of special editing modes that provide context-sensitive help while you're writing. For example, if you're writing a C program, the C mode will help you to observe conventions for indentation and commenting. It automatically lines up braces for you and tells you when parentheses are unbalanced. In X Windows, Emacs will even do syntax highlighting for you. Perl programmers get two editing modes to choose from, perl-mode and cperl-mode. Based on the file extension, Emacs will figure out which mode you want. (The default and simplest mode is called Fundamental.) You can enter a new mode by typing ESC- x and then the name of the mode. Emacs also integrates well with the perl debugger (ESC-x perldb) so that you can step through your running code in the editor. Emacs also supports many version-control systems including RCS and CVS. Checking out a file from RCS is as simple as typing CTRL-x v v. After you have made your edits, check in the file with CTRL-x v v. That's not a typo; Emacs can figure out the right thing to do with your file because it remembers the last version-control state. Pretty cool. There are special modes for virtually every programming language I've ever heard of. There are also special modes for HTML, troff, TEX, outlines, stick figures, etc. For any kind of programming, Emacs is the Integrated Development Environment of choice for many users.
Although I often use Emacs' mail facility as an example, I'm not personally fond of it. However, if you really like working within the Emacs environment, you should try it. Sending mail from Emacs (ESC-x mail) is convenient if you are already editing the file you wish to send. You can simply copy and paste your work into the mail buffer and send it along with CTRL-c CTRL-c. You can even add Cc: and Reply-to: fields to the message just by adding them to the mail buffer directly under the To: field.
Emacs also has a Usenet client called GNUS (ESC-x gnus) that has quite a following. What editor would be complete without an integrated FTP client? Certainly not Emacs. There are two ways to access FTP in Emacs. The first is to type ESC-x ftp. This gives you a shell-like ftp client. While this is nice, Emacs provides an even slicker way to FTP files. Ange-ftp mode allows Emacs users to open remote files almost as if they were local. To open a remote file or directory, simple type CTRL-x CTRL-f. However, you must specify the filename with a leading slash and your remote username followed by @ and followed again by the ftp hostname, a colon, and the full path you wish to retrieve. For example, if I wished to edit the file index.html as user edit on my web server, I would use the filename /edit@www.nowhere.com:/home/html/htdocs/index.html.
To extend the last example a bit, Emacs even has a web-browser mode so that you could look at the web page you just edited! In truth, lynx is still king of the ASCII web browsers, but the Emacs W3 mode is coming along. It doesn't normally come with Emacs, so you're going to have to look on the Web for it. It has very good integration with XEmacs (neθ Lucent Emacs) and can even display images.  Webjump comes with a list a predefined URLs, which can be expanded, of course. One of those URLs is Yahoo. When that site is selected, webjump will ask you for a query term to submit. After hitting return, the Yahoo search results will appear in a browser window. Again, it's a nice shortcut.
Emacs is the most customizable tool I've ever seen. Customization is based on the LISP programming language, so you need to learn some LISP before you can work with it much. However, once you know LISP, you can do virtually anything. For example, you could write a complete spreadsheet program within Emacs which means that you could use your normal Emacs commands to edit the spreadsheet and incorporate it (in whole or in part) into your documents. In fact, several Emacs spreadsheet modes exist, but their quality and functionality vary wildly. And, because of the FSF's General Public License, virtually all special-purpose packages are available for free.
ML and JJ
Emacs customizations are usually stored in a file called .emacs in your home directory. In Section 19.7, we've given a few customizations that I personally find convenient; if you're like most people, you'll add customizations over time. You'll end up doing this even if you're not a LISP programmer; if you know any other Emacs users, you'll soon be borrowing their shortcuts. The best way to customize Emacs to your taste is to find out what works for others . . . and then steal it. For that matter, many if not most of the customizations in my file were stolen from other users over the years. I hope I've gotten this process off to a good start.
However, you should also be aware of the "dark side" of customization. What happens if you sit down at someone else's system, start Emacs, and find out that he's customized it so extensively that it's unrecognizable? Or that a "helpful" administrator has installed some system-wide hacks that are getting in your way? Here's what will help. First, start emacs with the option -q; that tells Emacs not to load any .emacs initialization file. (If you want to load your initialization file instead of someone else's, try the option -u username).
That still doesn't solve the problem of system-wide customizations. To keep those from getting in the way, put the following line at the beginning of your .emacs file:
(setq inhibit-default-init t)
This turns off all "global" initializations. (If you're sharing someone else's system, you may still need the -u option to force Emacs to read your initialization file.)
ML, DC, and BR
If you're like most people, you often spend a few hours editing a file, only to decide that you liked your original version better. Or you press some strange sequence of keys that makes Emacs do something extremely weird and that you can't "undo." Emacs provides several ways to get out of these tight spots.
First, try the command ESC-x revert-buffer. Emacs will ask one of two questions: either "Buffer has been auto-saved recently. Revert from auto-save file? (y or n)" or "Revert buffer from file your-filename? (yes or no)".
Before deciding what to do, it's important to understand the difference between these two questions. Emacs creates an auto-save[1] file every 300 keystrokes you type. So, if you're reverting to the auto-save file, you'll at most lose your last 300 keystrokes. Maybe this is what you want but maybe you made the mistake a long time ago. In that case, you don't want to use the auto-save file; type n, and you'll see the second question, asking if you want to revert to the last copy of the file that you saved. Type yes to go back to your most recent saved version.
It's possible that you'll only see the second question ("Revert buffer from file . . . "). This means that you have saved the file sometime within the last 300 keystrokes.  It will create a new one every 300 keystrokes.
It's worth noting that Emacs is very picky about what you type. If it asks for a y or an n, you've got to type y or n. If it asks for yes or no, you've got to type yes or no. In situations like this, where the two styles are mixed up, you've got to get it right.
If you're in real trouble and you want to go back to your original file the way it was when you started editing you need to recover Emacs' backup file. If you're editing a file that already exists, Emacs will create a backup file as soon as it starts. If you're editing a new file, Emacs will create a backup the second time you save the file. Once it's created, the backup file is never touched; it stays there until the next time you start Emacs, at which point you'll get a new backup, reflecting the file's contents at the start of your editing session.
Now that we're over the preliminaries, how do you recover the backup file? Emacs doesn't have any special command for doing this; you have to do it by hand. The backup file's name is the same as your original filename, with a tilde (~) added to it. So quit Emacs (or start a shell), and type:
% mv your-filename ~ your-filename
Note that Emacs has the ability to save "numbered" backup files, like the VAX/VMS operating system. We've never played with this feature and don't think it's a particularly good idea. But it's there if you want it.
ML and DC
Many users are used to editors that are normally in overwrite mode: when you backspace and start typing, you type over the character that is underneath the cursor.[2] By default, Emacs works in insertion mode, where new characters are inserted just before the cursor's position.
If you prefer overwrite mode, just give the command ESC-x overwrite-mode. You can use command abbreviation (Section 19.6) to shorten this to ESC-x ov. On many keyboards, pressing INSERT also turns on overwrite mode. If you get tired of overwrite mode, use the same command to turn it off.
If you always want to use overwrite mode, create a file named .emacs in your home directory, and put the following line in it:
(setq-default overwrite-mode t)
This is a simple Emacs customization; for a lot more about customization, see O'Reilly & Associates' Learning GNU Emacs, by Bill Rosenblatt, Eric Raymond, and Debra Cameron.
ML and DC
Emacs has a great feature called command completion. Basically, command completion means that Emacs will let you type the absolute minimum and it will fill in the rest. You can use command completion whenever you're typing a filename, buffer name, command name, or variable name. Simply type enough of the name to be "unique" (usually the first few letters), followed by a TAB. Emacs will fill in the rest of the name for you. If the name isn't unique that is, if there are other filenames that start with the same letters Emacs will show you the alternatives. Type a few more letters to select the file you want, then press TAB again.
For example, if I'm trying to load the file outline.txt, I can simply give the command CTRL-x CTRL-f out TAB. Providing that there are no other filenames beginning with the letters out, Emacs will fill in the rest of the filename. When I see that it's correct, I press RETURN, and I'm done.
When you use command completion, always make sure that Emacs has successfully found the file you want. If you don't, the results may be strange: you may end up with a partial filename or the wrong file.
Along the same lines as command completion is a feature called dynamic expansion. After typing the first few letters of a word, you can have Emacs search all open buffers for completions of that word. Simply type ESC-/, and emacs will complete the partial word with one you've already typed. You can cycle through all the choices by repeating the keystroke. Warning: this feature is addictive.
ML and BR
I'm a very fast typist which means that I hate using special function keys, arrow keys, and especially mice. I deeply resent anything that moves me away from the basic alphanumeric keyboard. Even BACKSPACE and DELETE are obnoxious, since they force me to shift my hand position.
With this in mind, I've customized Emacs so that I can do virtually anything with the basic alphabetic keys, plus the CONTROL key. Here are some extracts from my .emacs file:
Go to http://examples.oreilly.com/upt3 for more information on: .emacs_ml
;; Make CTRL-h delete the previous character. Normally, this gets ;; you into the "help" system. (define-key global-map "\C-h" 'backward-delete-char) ;; make sure CTRL-h works in searches, too (setq search-delete-char (string-to-char "\C-h")) ;; bind the "help" facility somewhere else (CTRL-underscore). ;; NOTE: CTRL-underscore is not defined on some terminals. (define-key global-map "\C-_" 'help-command) ;; replacement (setq help-char (string-to-char "\C-_")) ;; Make ESC-h delete the previous word. (define-key global-map "\M-h" 'backward-kill-word) ;; Make CTRL-x CTRL-u the "undo" command; this is better than "CTRL-x u" ;; because you don't have to release the CTRL key. (define-key global-map "\C-x\C-u" 'undo) ;; scroll the screen "up" or "down" one line with CTRL-z and ESC z (defun scroll-up-one ( ) "Scroll up 1 line." (interactive) (scroll-up (prefix-numeric-value current-prefix-arg))) (defun scroll-down-one ( ) "Scroll down 1 line." (interactive) (scroll-down (prefix-numeric-value current-prefix-arg))) (define-key global-map "\C-z" 'scroll-up-one) (define-key global-map "\M-z" 'scroll-down-one) ;; Use CTRL-x CTRL-v to "visit" a new file, keeping the current file ;; on the screen (define-key global-map "\C-x\C-v" 'find-file-other-window)
The comments (lines beginning with two semicolons) should adequately explain what these commands do. Figure out which you need, and add them to your .emacs file. The most important commands are at the top of the file.
ML
Emacs has, oh, a hundred or so different search commands. (Well, the number's probably more like 32, but who's counting?) There are searches of absolutely every flavor you could ever imagine: incremental searches, word searches,[3] regular-expression searches, and so on.
However, when it comes to your plain old garden-variety search, Emacs is strangely deficient. There is a simple search that just looks for some arbitrary sequence of characters, but it's rather well hidden. In addition, it lacks one very important feature: you can't search for the same string repeatedly. That is, you can't say "Okay, you found the right sequence of letters; give me the next occurrence"; you have to retype your search string every time.
Go to http://examples.oreilly.com/upt3 for more information on: search.el
I thought this was an incredible pain until a friend of mine wrote a special search command. It's in the file search.el. Just stick this into your directory for Emacs hacks (Section 19.12), and add something like the following to your .emacs file:
;; real searches, courtesy of Chris Genly ;; substitute your own Emacs hack directory for /home/los/mikel/emacs (load-file "/home/los/mikel/emacs/search.el")
Now you can type CTRL-s to search forward and CTRL-r to search back. Emacs will prompt you for a search string and start searching when you press RETURN. Typing another CTRL-s or CTRL-r repeats your previous search. When you try this, you'll see one other useful feature: unlike the other Emacs searches, this kind of search displays the "default" (i.e., most recent) search string in the minibuffer. It's exactly the kind of search I want.
It's conceivable that you'll occasionally want incremental searches. You'll have to "rebind" them, though, to use them conveniently. Here are the key bindings that I use:
;; rebind incremental search as ESC-s and ESC-r (define-key global-map "\M-s" 'isearch-forward) (define-key global-map "\M-r" 'isearch-backward) ;; have to rebind ESC s separately for text-mode. It's normally ;; bound to 'center-line'. (define-key text-mode-map "\M-s" 'isearch-forward)
That is, ESC-s and ESC-r now give you forward and reverse incremental searches. And once you've started an incremental search, CTRL-s and CTRL-r still repeat the previous incremental search, just as they're supposed to.
Of course, now you'll have to rebind the "center-line" command if you're fond of it. In my opinion, it's not worth the trouble. The game of "musical key-bindings" stops here.
ML
I've seen a number of strange situations in which Emacs can't find files unless you type a complete ("absolute") pathname ( Section 1.16), starting from the root (/ ). When you try to visit a file, you'll get the message File not found and directory doesn't exist.
In my experience, this usually means that the C shell's PWD environment variable (Section 35.5) has been incorrectly set. There are a few (relatively pathological) ways of tricking the C shell into making a mistake. More commonly, though, I've seen a few systems on which the C shell sticks an extra slash into PWD: that is, its value will be something like /home/mike//Mail rather than /home/mike/Mail. Unix doesn't care; it lets you stack up extra slashes without any trouble. But Emacs interprets // as the root directory that is, it discards everything to the left of the double slash. So if you're trying to edit the file /home/mike//Mail/output.txt, Emacs will look for /Mail/output.txt. Even if this file exists, it's not what you want. [This also happens when Emacs is called from a (Bourne) shell script that has changed its current directory without changing PWD. JP]
This problem is particularly annoying because the shell will automatically reset PWD every time you change directories. The obvious solution, sticking unsetenv PWD in your .cshrc file, doesn't do any good.
What will work is defining an alias (Section 29.1):
(..) Section 43.7
alias gmacs "(unsetenv PWD; emacs \!*)"
A better solution might be to switch to another shell that doesn't have this problem. The Bourne shell (sh) obviously doesn't, since it doesn't keep track of your current directory.
ML
I remember being driven absolutely crazy by a guy (who hopefully won't be reading this) who called me every other week and asked me how to stick a page break into some text file he was writing. He was only printing on a garden-variety printer, for which inserting a page break is a simple matter: just add a formfeed character, CTRL-l. But CTRL-l already means something to Emacs ("redraw the screen"). How do you get the character into your file, without Emacs thinking that you're typing a command?
Simple. Precede CTRL-l with the "quoting" command, CTRL-q. CTRL-q tells Emacs that the next character you type is text, not a part of some command. So the sequence CTRL-q CTRL-l inserts the character CTRL-l into your file; you'll see ^L on your screen. (Note that this represents a single character, instead of two characters.) In turn, when you print the file on many printers, the CTRL-l will cause a page eject at the appropriate point.
You can use this technique to get any "control character" into an Emacs file. In fact, under pressure I've done some pretty bizarre binary editing not a task I'd recommend, but certainly one that's possible.
ML
Like vi, Emacs provides an "abbreviation" facility. Its traditional usage lets you define abbreviations for long words or phrases so you don't have to type them in their entirety. For example, let's say you are writing a contract that repeatedly references the National Institute of Standards and Technology. Rather than typing the full name, you can define the abbreviation nist. Emacs inserts the full name whenever you type nist, followed by a space or punctuation mark. Emacs watches for you to type an abbreviation, then expands it automatically as soon as you press the spacebar or type a punctuation mark (such as ., ,, !, ?, ;, or :).
One use for word-abbreviation mode is to correct misspellings as you type.  You can simply tell Emacs that these misspellings are "abbreviations" for the correct versions, and Emacs fixes the misspellings every time you type them. If you take time to define your common typos as abbreviations, you'll never be bothered with teh, adn, and recieve when you run the spellchecker. Emacs sweeps up after your typos and corrects them. For example, let's say that you define teh as an abbreviation for the. When you press the spacebar after you type teh, Emacs fixes it immediately, and you continue happily typing. You may not even notice that you typed the word wrong before Emacs fixes it.
Usually, if you go to the trouble of defining a word abbreviation, you will use it in more than one Emacs session. But if you'd like to try out abbreviation mode to see if you want to make it part of your startup, use the following procedure to define word abbreviations for this session:
Enter word-abbreviation mode by typing ESC-x abbrev-mode. abbrev appears on the mode line.
Type the abbreviation you want to use, and press CTRL-x a. Emacs then asks you for the expansion.
Type the definition for the abbreviation, and press RETURN. Emacs then expands the abbreviation; it will do so each time you type it followed by a space or punctuation mark. The abbreviations you've defined will work only during this Emacs session.
If you find that you like using word-abbreviation mode, you may want to make it part of your startup, as described in the following section.
Once you become hooked on abbreviation mode, make it part of your .emacs file so that you enter abbreviation mode and load your word-abbreviations file automatically. To define word abbreviations and make them part of your startup:
Add these lines to your .emacs file:
(setq-default abbrev-mode t) (read-abbrev-file "~/.abbrev_defs") (setq save-abbrevs t)
Save the .emacs file, and re-enter Emacs. Abbrev appears on the mode line. (You'll get an error at this point; ignore it it won't happen again.)
Type an abbreviation you want to use, and then type CTRL-x a following the abbreviation. Emacs asks you for the expansion.
Type the definition for the abbreviation, and press RETURN. Emacs expands the abbreviation and will do so each time you type it followed by a space or punctuation mark. You can define as many abbreviations as you wish by repeating Steps 3 and 4.
Type ESC-x write-abbrev-file to save your abbreviations file. Emacs asks for the filename.
Type ~/.abbrev_defs. Emacs then writes the file. You need only take this step the first time you define abbreviations using this procedure. After this file exists, the lines in your .emacs file load the abbreviations file automatically.
After you've followed this procedure the first time, you only need to use Steps 3 and 4 to define more abbreviations. When you add word abbreviations in subsequent sessions, Emacs asks whether you want to save the abbreviations file. Respond with a y to save the new abbreviations you've defined and have them take effect automatically. If you define an abbreviation and later regret it, use ESC-x edit-word-abbrevs to delete it.
DC
If you use any Emacs editor (GNU Emacs or any of the commercial alternatives), you may have written lots of handy LISP programs to use while you're editing. It's convenient to create a separate directory for these; a good name for this directory is (obviously) emacs; it's usually located in your home directory.
If you use GNU Emacs, you should put the following line in the .emacs file:
(setq load-path (append load-path '("your-emacs-directory")))
This tells Emacs that it should look in your personal Emacs directory to find your programs. (It's similar to the PATH (Section 35.6) environment variable.)
ML
If you have time to waste (and I mean really waste), Emacs has things to keep you occupied. There are lots of interesting special effects, such as "disassociated text." My favorite is a command called "psychoanalyze-pinhead." It's based on "doctor," which is a variation of the classic artificial-intelligence demonstration called "Eliza": the computer plays psychotherapist and asks you questions; you reply, and your answers are the basis for new questions. Nothing new, really; I remember it from my high school days, in the early 1970s. If you think you might be in need of a psychotherapist, save your money and try ESC-x doctor RETURN.
If you want to see something really interesting, try ESC-x psychoanalyze-pinhead. This takes the built-in "doctor" program and feeds it with quotations from the cult comic strip Zippy the Pinhead. The result is indeed bizarre. Here's some typical output:
I am the psychotherapist. Please, describe your problems. Each time you are finished talking, type RET twice.  Why do you say I picked karl malden's nose? Am I SHOPLIFTING? Is it because of your plans that you say are you shoplifting? Are you selling NYLON OIL WELLS?? If so, we can use TWO DOZEN!!
Press CTRL-c when you've had enough.
ML
[1] For reference, the name of the auto-save file is #your-filename#; that is, it sticks a hash mark (#) before and after the file's "regular" name.
[2] This includes some mainframe editors, like XEDIT, and (in my memory) a lot of older tools for word processing and general editing.
[3] These are especially nice because they can search for phrases that cross line breaks; most searches assume that all the text you want will all be on the same line. However, you can only search for whole words, and if you use troff or TEX, Emacs may be confused by your "markup."
| CONTENTS |


Cox's Bazaar sea beach is the longest beach in the world. And this is definitely one of the biggest tourist attractions
in the country. Located in Chittagong District, this sea beach faces the amazing waves of grand Bay of Bengal.
Miles of golden sands, towering cliffs, surfing waves, rare conch shells, colorful pagodas, Buddhist temples and tribes and
mouth-watering sea-food made Cox's Bazar the tourist capital of Bangladesh. There's a plenty of things to do in Cox's Bazar.
This is more than you can expect from a traditional sea beach..
Inani
Inani beach is only half an hour's drive from Cox’s Bazar. With the sea to the west and a background of steep hills to
the east, this beach will mesmerize with its amazing view.
 There are plenty of stores along the beach and in the town market filled with eye-catching items.
You will forget when to stop.And there is always a chance to get sporty against the waves of Bay of Bengal!
Ramu
This Buddhist village is about 16km away from Cox's Bazar situated on the main road to Chittagong.
There are monasteries, khyangs and pagodas with great religious importance which are rich in years old artifacts,
scripts, relics etc. There's a large bronze statue of Buddha measuring more than thirteen feet height.
The people of this Buddhist village has their own charm for being delicate and peace-loving.
Himchari
About 32km south of Cox’s Bazar, Himchari is a delightful place for famous broken hills and waterfalls.
Maheskhali
An island off the coast of Cox's Bazar. It has an area of 268 square kilometers.
Through the centre of the island and along the eastern coast line rises a range of low hills,
300 feet high; but the coast to the west and north is a lowlying treat, fringed by mangrove jungle.
In the hills on the coast is built the shrine of Adinath, dedicated to siva. By its side on the same hill is Buddhist Pagoda..
Accommodation
Hotel Sea-gull
Hotel Motel Zone
Cox's Bazar Sea Beach,
Cox's Bazar, Bangladesh. Tel : +88 0341 62480 – 90 Cell : +88<PHONE_NUMBER>1,
+88<PHONE_NUMBER>3, +88<PHONE_NUMBER>5, Fax : +88 0341 64436 Email<EMAIL_ADDRESS>Hotel Sea Crown
Marin Drive, Kola Toil New Beach
Kolatoli, Cox's Bazar, Bangladesh Phone : 88-0341-64795, 88-0341-64474 Mobile : 88-01817089420 Email : seacrownhotel[at]gmail com
14 Kalatoli Main Road, Hotel Motel Zone,
Cox's Bazar, Chittagong. Phone No. : +88 0341 51843-6, Fax :+88 0341 51062
Hotel Coral Reef
Distance : 1 Km from the sea beach. Communication : By Bus and Airlines from Dhaka. Facilities :Air condition room, Running hot & cold water, Minibar.
Each room with belcony, Family suite with kitchen and internet facilities. Address :
Hotel Coral Reef,
Plot # 47, Block # B,
Kalatoli, Coxs Bazar , Bangladesh Cell: (880) 01911-672135 or 01712-849373
Uni Resort Ltd
Distance : 1 Km from the sea beach. Communication : By Bus and Airlines from Dhaka. Facilities : Game Zone, Coffee & Pastry Shop, Stand by Generator, Business Centre, Restaurant,
24 hours room service, Gift shoop, Business centre. Game Zone and Conference hall with Multimedia projector and sound system. Address :
Uni Resort Ltd,
Kalatoli, Cox's Bazar , Bangladesh Cell:(880) 01911-672135 or 01712-849373
Hotel Mishuk
Distance : 40 Meters from the sea beach. Communication : By Bus and Airlines from Dhaka. Facilities : Full time generator service , Gizzard, Disline, Lift, Intercom.
Balcony with every room, Near sea beach, News paper, 24 hours room service and Lift.
Sea foods restaurant with Air conditioner, Local and International food, 24 hours room service. Address :
Hotel Mishuk,
Labonee More, Hotel Motel Zone,
Cox's Bazar, Bangladesh Cell: (880) 01911-672135 or 01712-849373
Nitol Bay Resort
Distance : 1 Km from the sea beach. Communication : By Bus and Airlines from Dhaka. Facilities : Fully AC, Swimming Pool, Roof Top lake, BBQ house, Restaurant, Internet. Swimming Pool,
Roof Top lake, BBQ house, Homely service . Address :
Nitol Bay Resort,
Kolatoli Beach Road,
Cox's Bazar, Bangladesh Cell: (880) 01911-672135 or 01712-849373


Our Enigneering class also learned how to create a website, which is how you are reading this now. We used sites like Github which gives you a platform for your coding. Finally, after we finished this coding in our file, we then were able to put our site on the web for everyone to see!


Just so that she gets to have fun with irregular verbs too :smiling_imp: :smile:
This little app is built with Electron, a tool which allows you to build app just like you build websites. I just :heart: it!
Those beautiful emoji that you're seeing are coming from Emojione. (#iwantemojione)
All the code is, of course, available at GitHub. Feel free to fork it, raise issues or even :star: it!
Hope you'll enjoy using this app! :slight_smile:
Made with :heart: by @math2001


Character
Id:
317
Name:
Shmlonathan Shmlower
Status:
Alive
Species:
Human
Gender:
Male
Origin:
unknown
Location:
Interdimensional Cable
Episodes:
['https://rickandmortyapi.com/api/episode/8']


Preparation time
1-2 hours
Cooking time
30 mins to 1 hour
Serves
Serves 4
Rough puff pastry makes a deliciously flaky topping to this classic pie recipe.
For the pastry, sift the flour into a bowl with a pinch of salt. Rub the butter into the flour until the mixture resembles breadcrumbs. Add enough water to bring the mixture together and then turn the mixture onto a work surface and knead to a smooth dough. Wrap the pastry in cling film and chill in the fridge for 10 minutes.
Roll the dough out on a floured work surface to a 20cm x 35cm/8in x 14in rectangle, fold it into thirds then wrap in cling film and return it to the fridge for 10 more minutes.
Remove the pastry from the fridge, turn it 90 degrees, then repeat step 2. Repeat this process three more times.
Meanwhile, make the filling. Melt butter in the pan and brown the meat on all sides. Cut the onion in half, stud each half with two cloves and add to the pan with the chicken.
Add the mushrooms and garlic, fry briefly for a few minutes then season with salt and freshly ground black pepper and add the wine.
Bring the mixture to a boil, let it simmer until the wine has reduced then reduce the heat and add the cream.
Cook very gently for about 10 minutes or until the chicken is cooked through then transfer the mixture to a pie dish about 23cm/9in in diameter. Brush the edges of the dish with water.
Preheat the oven to 200C/400F/Gas 6. Roll out the pastry and drape it over the top of the pie dish, trim the edges and press it firmly around the edges. Bake for about 25-30 minutes or until golden-brown.


FreeCodeCamp API project: Timestamp microservice
User stories:
- I can pass a string as a parameter, and it will check
to see whether that string contains either
- a unix timestamp
- or a natural language date (example: January 1, 2016)
- If it does, it returns both the Unix timestamp and the
natural language form of that date.
- If it does not contain a date or Unix timestamp, it
returns null for those properties.
Example usage:
https://timestamp-ms.herokuapp.com/December%2015,%202015
https://timestamp-ms.herokuapp.com/1450137600
Example output:
{ "unix":<PHONE_NUMBER>, "natural": "December 15, 2015" }


This application was created by Clemens Hübner during his master's thesis in computer science with the topic "Continuous Integration of Security Tests in Agile Development Processes".
For this thesis, 148 different security measures, preventing or mitigation the most common weaknesses in web applications, were analyzed and categorized regarding their ability to be transformed into agile development processes and the degree of automatic verification.
To allow an easier use of the results in development projects, this web application was designed and implemented.
The author can be contacted via Github.
The usage of the CWE as done in this work is granted by the MITRE Corporation as it is research work. As requested, the licence's text is reproduced below.
The use of the CWE contents in this work is still stubject to this license.
"The MITRE Corporation (MITRE) hereby grants you a non-exclusive, royalty-free license to use Common Weakness Enumeration (CWE™) for research, development, and commercial purposes.
Any copy you make for such purposes is authorized provided that you reproduce MITRE’s copyright designation and this license in any such copy."


Links you directly to 14er routes based on your desired difficulty, route length, and location so you can quickly choose a peak that’s a great fit for you... and your friends.


001/* 002// This software is subject to the terms of the Eclipse Public License v1.0 003// Agreement, available at the following URL: 004// http://www.eclipse.org/legal/epl-v10.html. 005// You must accept the terms of that agreement to use this software. 006// 007// Copyright (C) 2006-2012 Pentaho 008// All Rights Reserved. 009*/ 010package mondrian.util; 011 012import mondrian.olap.MondrianProperties; 013import mondrian.spi.Dialect; 014 015import org.apache.log4j.Logger; 016 017/** 018 * Holder for constants which indicate whether particular issues have been 019 * fixed. Reference one of those constants in your code, and it is clear which 020 * code can be enabled when the bug is fixed. Generally a constant is removed 021 * when its bug is fixed. 022 * 023 *
Cleanup items
 024 * 025 * The following is a list of cleanup items. They are not bugs per se: 026 * functionality is not wrong, just the organization of the code. If they were 027 * bugs, they would be in jira. It makes sense to have the list here, so that 028 * referenced class, method and variable names show up as uses in code searches. 029 * 030 *
 031 * 032 *
Obsolete {@link mondrian.olap.Id.Segment}
 033 *
Replace it by {@link org.olap4j.mdx.IdentifierSegment}. Likewise 034 * {@link mondrian.olap.Id.Quoting} with {@link org.olap4j.mdx.Quoting}. 035 * Should wait until after the mondrian 4 'big bang', because there are ~300 036 * uses of Segment in the code.
 037 * 038 *
 039 * 040 * @author jhyde 041 * @since Oct 11, 2006 042 */ 043public class Bug { 044 /** 045 * Whether Mondrian is 100% compatible with Microsoft Analysis Services 046 * 2005. We know that it is not, so this constant is {@code false}. 047 * 048 *
Use this 049 * field to flag test cases whose behavior is intentionally different from 050 * SSAS. If the behavior is unintentionally different and something 051 * we want to fix, log a bug, add a new {@code BugMondrianXxxFixed} constant 052 * to this class, and make the test case conditional on that constant 053 * instead. 054 * 055 *
See also the property 056 * {@link mondrian.olap.MondrianProperties#SsasCompatibleNaming}, 057 * which allows the user to choose certain behaviors which are compatible 058 * with SSAS 2005 but incompatible with Mondrian's previous behavior. 059 */ 060 public static final boolean Ssas2005Compatible = false; 061 062 /** 063 * If you want to tag a piece of code in mondrian that needs to be changed 064 * when we upgrade to a future version of olap4j, reference this function. 065 * It will always return false. 066 */ 067 public static boolean olap4jUpgrade(String reason) { 068 return false; 069 } 070 071 /** 072 * Whether 073 * MONDRIAN-229, 074 * "NON EMPTY when hierarchy's default member is not 'all'" 075 * is fixed. 076 */ 077 public static final boolean BugMondrian229Fixed = false; 078 079 // Properties relating to checkin 7641. 080 // This is part of the junit test Checkin_7641 that 081 // shows that there is a difference when the default 082 // member is not the one used in an axis. 083 // When Checkin 7641 is resolved, then this System property access and 084 // boolean should go away. 085 // (What's the bug associated with this??) 086 087 public static final boolean Checkin7641UseOptimizer = false; 088 089 /** 090 * Whether 091 * MONDRIAN-207, 092 * "IS EMPTY and IS NULL" is fixed. 093 */ 094 public static final boolean BugMondrian207Fixed = false; 095 096 /** 097 * Whether 098 * bug MONDRIAN-446, 099 * "Make Native NonEmpty consistant with MSAS" 100 * is fixed. 101 */ 102 public static final boolean BugMondrian446Fixed = false; 103 104 /** 105 * Whether 106 * bug MONDRIAN-313, 107 * "Predicate references RolapStar.Column when used in AggStar" 108 * is fixed. 109 */ 110 public static final boolean BugMondrian313Fixed = false; 111 112 /** 113 * Whether 114 * bug MONDRIAN-314, 115 * "Predicate sometimes has null RolapStar.Column" 116 * is fixed. 117 */ 118 public static final boolean BugMondrian314Fixed = false; 119 120 /** 121 * Whether 122 * bug MONDRIAN-328, 123 * "CrossJoin no empty optimizer eliminates calculated member" 124 * is fixed. 125 */ 126 public static final boolean BugMondrian328Fixed = false; 127 128 /** 129 * Whether 130 * bug MONDRIAN-361, 131 * "Aggregate Tables not working with Shared Dimensions" 132 * is fixed. 133 * 134 */ 135 public static final boolean BugMondrian361Fixed = false; 136 137 /** 138 * Whether 139 * bug MONDRIAN-441, 140 * "Parent-child hierarchies: <Join> used in dimension" 141 * is fixed. 142 */ 143 public static final boolean BugMondrian441Fixed = false; 144 145 /** 146 * Whether 147 * bug MONDRIAN-486, 148 * "HighCardinalityTest test cases disabled" 149 * is fixed. 150 */ 151 public static final boolean BugMondrian486Fixed = false; 152 153 /** 154 * Whether bug  155 * MONDRIAN-495, "Table filter concept does not support dialects." 156 * is fixed. 157 */ 158 public static final boolean BugMondrian495Fixed = false; 159 160 /** 161 * Whether 162 * bug MONDRIAN-503, 163 * "RolapResultTest disabled" 164 * is fixed. 165 */ 166 public static final boolean BugMondrian503Fixed = false; 167 168 /** 169 * Whether 170 * bug MONDRIAN-555, 171 * "Compound slicer counts cells twice in certain cases" is fixed. 172 * If a set in the slicer contains the same member more than once, or more 173 * generally, if the regions overlap, then mondrian counts the overlaps 174 * twice, whereas SSAS 2005 does not. 175 */ 176 public static final boolean BugMondrian555Fixed = false; 177 178 /** 179 * Whether 180 * bug MONDRIAN-584, 181 * "Native evaluation returns enumerated members in the wrong order" 182 * is fixed. A query that includes { Gender.M, Gender.F } should return 183 * results where the Gender.M values are returned before the Gender.F 184 * values. 185 */ 186 public static final boolean BugMondrian584Fixed = false; 187 188 /** 189 * Whether 190 * bug MONDRIAN-641, 191 * "Large NON EMPTY result performs poorly with ResultStyle.ITERABLE" 192 */ 193 public static final boolean BugMondrian641Fixed = false; 194 195 /** 196 * Whether 197 * bug MONDRIAN-648, 198 * "AS operator has lower precedence than required by MDX specification" 199 * is fixed. 200 */ 201 public static final boolean BugMondrian648Fixed = false; 202 203 /** 204 * Whether 205 * bug MONDRIAN-687, 206 * "Format treats negative numbers differently than SSAS" 207 * is fixed. 208 */ 209 public static final boolean BugMondrian687Fixed = false; 210 211 /** 212 * Whether bug 213 * bug MONDRIAN-747, 214 * "When joining a shared dimension into a cube at a level 215 * other than its leaf level, Mondrian gives wrong results" is fixed. 216 */ 217 public static final boolean BugMondrian747Fixed = false; 218 219 /** 220 * Whether 221 * bug MONDRIAN-759, 222 * "use dynamic parameters and PreparedStatement for frequently executed SQL 223 * patterns" is fixed. 224 */ 225 public static final boolean BugMondrian759Fixed = false; 226 227 /** 228 * Whether 229 * bug MONDRIAN-785, 230 * "Native evaluation does not respect ordering" is fixed. 231 */ 232 public static final boolean BugMondrian785Fixed = false; 233 234 /** 235 * Whether 236 * bug MONDRIAN-1001, 237 * "Tests disabled due to property trigger issues" is fixed. 238 */ 239 public static final boolean BugMondrian1001Fixed = false; 240 241 /** 242 * Whether RolapCubeMember and RolapMember have been fully segregated; any 243 * piece of code should be working with one or the other, not both. 244 */ 245 public static final boolean BugSegregateRolapCubeMemberFixed = false; 246 247 /** 248 * Returns whether to avoid a test because the memory monitor may cause it 249 * to fail. 250 * 251 *
Some tests fail if memory monitor is switched on, and Access and 252 * Derby tend to use a lot of memory because they are embedded. 253 * 254 * @param dialect Dialect 255 * @return Whether to avoid a test 256 */ 257 public static boolean avoidMemoryOverflow(Dialect dialect) { 258 return dialect.getDatabaseProduct() == Dialect.DatabaseProduct.ACCESS 259 && MondrianProperties.instance().MemoryMonitor.get(); 260 } 261 262 /** 263 * Returns true if we are running against 264 * {@link mondrian.spi.Dialect.DatabaseProduct#LUCIDDB} and we wish to 265 * avoid slow tests. 266 * 267 *
This is because some tests involving parent-child hierarchies are 268 * very slow. If we are running performance tests (indicated by the 269 * {@code mondrian.test.PerforceTest} logger set at 270 * {@link org.apache.log4j.Level#DEBUG} or higher), we expect the suite to 271 * take a long time, so we enable the tests. 272 * 273 *
Fixing either {@link #BugMondrian759Fixed MONDRIAN-759} or 274 * FRG-400, "rewrite 275 * statements containing literals to use internally-managed dynamic 276 * parameters instead" would solve the problem. 277 * 278 * @return Whether we are running LucidDB and we wish to avoid slow tests. 279 */ 280 public static boolean avoidSlowTestOnLucidDB(Dialect dialect) { 281 return 282 !BugMondrian759Fixed 283 && dialect.getDatabaseProduct() == Dialect.DatabaseProduct.LUCIDDB 284 && !Logger.getLogger("mondrian.test.PerformanceTest") 285 .isDebugEnabled(); 286 } 287} 288 289// End Bug.java


Welcome
For over 30 years, Le vera Pizza has been serving Kenya with a personal touch. Located at Langata Rd. in Galleria mall, we offer an array of authentic Italian-style pizzas, guaranteed to satisfy everyone’s taste buds. From our specialty thin-crust and double dough pizzas, quality has, and always will, remain our main ingredient.


References
Baron, David. 2010. The Beast in the Garden: A Modern Parable of Man and Nature. WW Norton & Company.
Bartmann, Richard M., Gary C. White, and Len H. Carpenter. 1992. “Compensatory Mortality in a Colorado Mule Deer Population.” Wildlife Monographs 121. Wiley on behalf of the Wildlife Society: pp. 3–39. http://0-www.jstor.org.library.unl.edu/stable/3830602.
Beissinger, Steven R, and M Ian Westphal. 1998. “On the Use of Demographic Models of Population Viability in Endangered Species Management.” The Journal of Wildlife Management. JSTOR, 821–41.
Berger, Joel. 2009. The Better to Eat You with: Fear in the Animal World. University of Chicago Press.
Bischof, Richard, Erlend B Nilsen, Henrik Brøseth, Peep Männil, Jaānis Ozolinš, and John DC Linnell. 2012. “Implementation Uncertainty When Using Recreational Hunting to Manage Carnivores.” Journal of Applied Ecology 49 (4). Wiley Online Library: 824–32.
Box, George EP. 1976. “Science and Statistics.” Journal of the American Statistical Association 71 (356). Taylor & Francis: 791–99.
Chauvenet, Aliénor LM, Peter WJ Baxter, Eve McDonald-Madden, and Hugh P Possingham. 2010. “Optimal Allocation of Conservation Effort Among Subpopulations of a Threatened Species: How Important Is Patch Quality?” Ecological Applications 20 (3). Wiley Online Library: 789–97.
Crouse, Deborah T, Larry B Crowder, and Hal Caswell. 1987. “A Stage-Based Population Model for Loggerhead Sea Turtles and Implications for Conservation.” Ecology 68 (5). Eco Soc America: 1412–23.
Doak, Daniel, Peter Kareiva, and Brad Klepetka. 1994. “Modeling Population Viability for the Desert Tortoise in the Western Mojave Desert.” Ecological Applications 4 (3). Eco Soc America: 446–60.
Havera, Stephen P, and Glen W Kruse. 1988. “Distribution and Abundance of Winter Populations of Bald Eagles in Illinois.” Champaign, Ill.: Illinois Natural History Survey.
Linkie, Matthew, Guillaume Chapron, Deborah J Martyr, Jeremy Holden, and NIGEL LEADER-WILLIAMS. 2006. “Assessing the Viability of Tiger Subpopulations in a Fragmented Landscape.” Journal of Applied Ecology 43 (3). Wiley Online Library: 576–86.
Linnell, John DC, Henrik Broseth, John Odden, and Erlend Birkeland Nilsen. 2010. “Sustainably Harvesting a Large Carnivore? Development of Eurasian Lynx Populations in Norway During 160 Years of Shifting Policy.” Environmental Management 45 (5). Springer: 1142–54.
Romesburg, H Charles. 1981. “Wildlife Science: Gaining Reliable Knowledge.” The Journal of Wildlife Management. JSTOR, 293–313.
Rosen, Joe. 2010. Lawless Universe: Science and the Hunt for Reality. JHU Press.
Runge, Michael C, John R Sauer, Michael L Avery, Bradley F Blackwell, and Mark D Koneff. 2009. “Assessing Allowable Take of Migratory Birds.” The Journal of Wildlife Management 73 (4). Wiley Online Library: 556–65.
Spencer, David L, and Calvin J Lensink. 1970. “The Muskox of Nunivak Island, Alaska.” The Journal of Wildlife Management. JSTOR, 1–15.
Turchin, Peter. 2003. Complex Population Dynamics: A Theoretical/Empirical Synthesis. Vol. 35. Princeton University Press.
Unsworth, James W., David F. Pac, Gary C. White, and Richard M. Bartmann. 1999. “Mule Deer Survival in Colorado, Idaho, and Montana.” The Journal of Wildlife Management 63 (1). Wiley on behalf of the Wildlife Society: pp. 315–26. http://0-www.jstor.org.library.unl.edu/stable/3802515.


Tartan Walk
Start (Example: WEH 7500)
End (Example: DH 2210)
Preferences (optional)
Elevator (less exercise)?
Outdoor (fresh air)?
Handicapped?
+ Advanced
Restroom
Food
Printer
ATM
Vending Machine
Water Foutain
"My heart is in the walk."
-Andrew Carnegie


Helian's Notes
Helian's Stage 1 Notes
Session 1: Understand the basics of web and HTML
What I learned:
- How the web works: When a person sends a HTML request to the server, and it gets returned a web page displayed on the browser of the client computer.
- What is HTML:HTML stands for Hypertext Markup
Language. HTML documents form the majority of the
content on the web.
- Tags and Elements: We use elements to form a HTML file by using tags for the browser to understand.
- Inline vs Block elements: HMTL elements are either Inline or blocks. The blocks are "invisible boxes".
Session 2: Creating a structured HTML document
What I learned:
- The "tree-like structure" HMTL: We can draw the relationship of the elements like a family tree.
- "Boxes" and "Boxes":
- Programmers Text Editor:
Session 3: Adding style to the structured HTML document with CSS
What I learned:
- Avoiding repetion: Less typing and it is also a way to avoid errors.
- Knowing CSS: Control the style of HTML related elements.


---
layout: post
title: "Wowio Facebook app"
---
Paula Wellings from Wowio, shows off some screenshots from the Facebook app she's developing. I've been hoping somebody over at Wowio was developing something like this. Wowio is prime for a Facebook app.
house cleaning [field notes]


Master Thesis, EPFL, Switzerland
Nov. 2022 - June. 2023
|
|
Master in Computer Science, ETH Zürich, Switzerland
Sep. 2020 - Present
|
|
Research Intern, Amazon AWA Shanghai AI Lab
Supervised by Tong He and Tianjun Xiao.
Jun. 2020 to Sept. 2020
|
|
Visiting student, University of California, Berkeley
DeepDrive & BAIR lab, supervised by Prof. Trevor Darrell.
Jul. 2019 to Dec. 2019
|
|
|
|
Source Free Domain Adaptation for Object Detection applied to Road Scene Understanding
Yan Hao*, Florent Forest*, Olga Fink
We propose a new source-free domain adaptation method for object detection applied to road scene understanding. Implementation bases on Detectron2 and Pytorch. Achieve state-of-the-art results for the adaptation from Cityscapes to Cityscapes Foggy and from Sim10k to Cityscapes.
Master Thesis. In preparation for conference submission.
|
|
|
3D Objectness Estimation via Bottom-up Regret Grouping
Zelin Ye, Yan Hao, Liang Xu, Rui Zhu,
Cewu Lu
We propose a robust 3D objectness estimation method in a bottom-up manner, i.e. first over-segment scene pointclouds and then group them iteratively with a novel regret mechanism to withdraw incorrect groupings.
Arvix.
|
|
|
PAL-Net: Predicate-Aware Learning for Scene Graph Generation
Liang Xu, Yong-Lu Li, Minyang Chen, Yan Hao,
Cewu Lu
Our proposed PAL-Net has two ingredients for scene graph generation. First we introduce a novel embedding loss for translation embedding in a metric learning manner. Then we take predicates as conditions for contextualmodeling to alleviate noise.
ICME. Oral.
|
|
|
Visual Rhythm Prediction with Feature-Aligned Network
Yutong Xie, Haiyang Wang, Yan Hao, Zihao Xu
The paper proposed a data-driven visual rhythm prediction method, in which several visual features are extractedand then fed into an end-to-end neural network to predict the visual onsets.
MVA
|
|


Para
nope
yup
simba
shere khan
dotted class
another dotted class
Furrfu
item
item
item
item
this is a link
this is a link
this is a link
this is a link
this is a link
unrelated
has, a comma


Pants Options
Pants is very configurable and has literally hundreds of tuneable parameters, known in Pants parlance as options.
Most options are automatically set to useful defaults. However it is inevitable that sooner or later you'll need to tweak some of them. For example, you may want to pin your Pants version.
The Pants options system is fairly complex. Codebase administrators will need to understand its details and nuances. End users, however, can usually get by with just a superficial view.
Option Scopes
Pants has many moving parts, and more can be added via custom plugins. To avoid option naming collisions, each configurable component is qualified by a scope.
- Global options belong to the global scope.
- Options for task
task
in goalgoal
belong to thegoal.task
scope. E.g.,gen.thrift
orcompile.zinc
. However if the task has the same name as the goal, then the scope is just that name. E.g.,./pants list
, not./pants list.list
. - Options for the global instance of subsystem
subsystem
belong to thesubsystem
scope. E.g.,jvm
orcache
. - Options for the instance of subsystem
subsystem
belonging to some other task or subsystem with scopescope
belong to thesubsystem.scope
scope. E.g.,cache.compile.zinc
.
The scope names are used to qualify the option names when setting their values, as explained in the remainder of this document.
Basic vs. Advanced Options
Some options, such as -l
to control the logging verbosity level, are
expected to be set directly by users, as needed. But most options are
expected to be configured once by a codebase administrator and not
directly modified by users. These latter options are called advanced
options, and are not enumerated in help messages by default. Advanced
options may change the way projects are built and packaged, impact the
build cache or change test behavior. For that reason, they should
usually be set in config files and checked in to the repo so that
build output is consistent, no matter which user invokes it.
To show the full list of options for a goal, including advanced
options, use ./pants <goal> --help-advanced
. You can view
all options for all scopes with ./pants --help-all --help-advanced
.
Recursive Options
A handful of global options, such as -l
, are recursive. That is, they have a global value which
can be overridden in each scope. This allows you, for example, to set different logging verbosity
levels in different tasks.
Option Types
Option value literal formats are the same on the command-line, environment variables and in pants.ini
,
with a couple of extra command-line conveniences.
Boolean Options
The boolean option values are: false
, False
, true
, True
.
On the command line, you can omit the value thus: --foo-bar
is the same as --foo-bar=false
,
and --no-foo-bar
is the same as --foo-bar=false
.
Int and Float Options
Specify values in decimal notation: --foo=5
, --bar=4.5
.
String Options
Surround strings with single or double quotes if they contain embedded spaces: --foo="hello, world"
.
List Options
List options can be appended to and filtered, as well as overridden.
For example, for an option --foo
whose default value is [1, 2]
, then in pants.ini
:
foo: 3
will yield[1, 2, 3]
.foo: +[3, 4]
will yield[1, 2, 3, 4]
.foo: -[1]
will yield[2]
.foo: [3, 4]
will yield[3, 4]
.
Multiple append and filter expressions may be delimited with commas, allowing you to append and filter simultaneously:
foo: +[3,4],-[1]
will yield[2, 3, 4]
.
On the command line you can append single values multiple times:
--foo=3 --foo=4
will yield the value[1, 2, 3, 4]
.
Note that these command line values will be appended to the value determined from the defaults
plus the values in pants.ini
. To override the value, use --foo=[3, 4]
.
Filters apply to the entire list constructed so far, and will filter all appearances of the value:
--foo=1 --foo=1 --foo=2 --foo=-[1]
will yield[2, 2]
.
Filters take precedence over appends, so you cannot "add something back in":
--foo=-[2] --foo=2
will yield[1]
.
Dict Options
Dict option values are Python-style dict literals: --foo={"a":1,"b":2}
.
Available Options
The options available in a given Pants-enabled codebase depend on which backends and plugins are activated.
- View all options available in a "vanilla" Pants install.
- To see a complete list of all basic options available in a given Pants-enabled codebase, enter
./pants help-all
. - To see global (or goal-specific) basic options, enter
./pants help (goal)
. - To see global (or goal-specific) basic and advanced options, enter
./pants help-advanced (goal)
.
Setting Option Values
Every Pants option can be set in one three ways, in descending order of precendence:
- Using a command-line flag.
- Using an environment variable.
- In a config file.
Config files are typically used to set codebase-wide defaults for all users. Individual users can then override various values using environment variables or command-line flags.
Options that aren't set by one of these three methods will fall back to a sensible default, so that Pants will work "out of the box" in common scenarios.
Command Line Flags
Option option
in scope foo.bar
can be set using the flag --foo-bar-option=<value>
.
Global options are set with no scope qualifier, e.g., --pants-workdir=/path/to/workdir
.
Values for single-letter flags (those that start with a single dash) can be set without the equals
sign: -ldebug
is the same as --level=debug
(-l
is a synonym for --level
). All other flags
must use an equals sign to set a value.
There's a useful shorthand that can save some typing when setting multiple options for a single task:
If you invoke a task explicitly on the command line then you can follow that task with unqualified
options in its scope. E.g., ./pants compile.zinc --no-incremental --name-hashing
instead of ./pants compile --no-compile-zinc-incremental --compile-zinc-name-hashing
.
Note that this shorthand requires you to mention a specific task, not just a goal: ./pants compile.zinc
instead of just ./pants compile
as you would usually enter. All tasks in the compile
goal will
still be executed, not just compile.zinc
, but the .zinc
addition is a convenience to support shorthand options.
Of course this works when specifying multiple goals, e.g.,
./pants compile.zinc --no-incremental --name-hashing test.junit --parallel-threads=4
Environment Variables
Option option
in scope foo.bar
can be set via the environment variable PANTS_FOO_BAR_OPTION
.
E.g., PANTS_COMPILE_ZINC_INCREMENTAL=false
.
Global options can be set using PANTS_GLOBAL_OPTION
as expected, but you can also omit the GLOBAL
and use PANTS_OPTION
. E.g., PANTS_LEVEL=debug
.
If a global option name itself starts with the word 'pants' then you can omit the repetition. E.g.,
PANTS_WORKDIR
instead of PANTS_PANTS_WORKDIR
.
Environment variables are overridden by command line flags, but take precedence over settings in config files.
Config File
The main Pants config file location is pants.ini
in your source tree's top-level directory.
If you installed pants as recommended this file should already exist.
The pants.ini
file is an INI file parsed by
ConfigParser. See
RFC #822
section 3.1.1 for the full rules python uses to parse ini file
entries.
A pants.ini
file looks something like:
[scope] option1: value1 option2: value2
Sections in the .ini
file correspond to the task name or
subsystem name, or a combination of both.
The [DEFAULT]
section is special: its values are available in all other sections. E.g.,
[DEFAULT] thrift_workdir: %(pants_workdir)s/thrift [GLOBAL] print_exception_stacktrace: True [gen.thrift] workdir: %(thrift_workdir)s [compile.zinc] args: [ '-C-Tnowarnprefixes', '-C%(thrift_workdir)s', ]
Note that continuation lines of multiple-line values must be indented. For example, the closing bracket in the multi-line list above.
Settings in config files are overridden by options specified in the environment or by command line flags.
There are a few differences in using options in the config file compared to invoking them from the command line:
- Omit the leading double dash (
--
) - Dash characters (
-
) are transposed to underscores (_
). - Boolean flag values are enabled and disabled by setting the value
of the option to
True
orFalse
- The prefix for long form options is not specified. Instead, you must organize the options into their appropriate sections.
Overlaying Config Files
Sometimes it's convenient to keep .ini
settings in more than one file. Perhaps you usually
operate Pants in one "mode", but occasionally need to use a tweaked set of settings.
Use the --pants-config-files
command-line option to specify a second .ini
file. Each of
this .ini
file's values override the corresponding value in pants.ini
, if any.
For example, if your pants.ini
contains the section
[test.junit] coverage_html_open: True debug: False
...and you invoke --pants-config-files=quick.ini
and your quick.ini
says
[test.junit] coverage_html_open: False skip: True
...then Pants will act as if you specified
[test.junit] coverage_html_open: False skip: True debug: False
Note that --pants-config-files
is a list-valued option, so all the
idioms of lists work. You can add a third file with another invocation
of --pants-config-files=<path>
, or you can replace the standard one
entirely with --pants-config-files=[<list>]
.
Troubleshooting Config Files
Use the Right Section Name
Section names must correspond to actual option scopes. Use the correct section name as specified in the help output:
# Wrong [compile] # The correct scope for the 'warnings' option is compile.zinc zinc_warnings: False # Right [compile.zinc] warnings: False
When in doubt, the scope is described in the heading for each option in the help output:
$ ./pants compile.zinc --help compile.zinc options: Compile Scala and Java code using Zinc. --[no-]compile-zinc-debug-symbols (default: False) Compile with debug symbol enabled. ...
Check the Formatting
Settings that span multiple lines should be indented. To minimize problems, follow these conventions:
- Followon lines should be indented four spaces.
- The ending bracket for lists and dicts should be indented two spaces.
Here are some examples of correctly and incorrectly formatted values:
# Right jvm_options: [ "foo", "bar" ] # Right jvm_options: [ "foo", "bar" ] # Wrong jvm_options: [ "foo", "bar" ] # Followon line must be indented # Wrong jvm_options: [ "foo", "bar" ] # closing bracket must be indented


\
A professional developer in a world of ever changing technology.
My background is in Web/Mobile Development, Geofencing, HTML/CSS/JavaScript/PHP/SQL/Drupal, Firebase and Ruby on Rails backend development, as well as Salesforce Development.
I also have experience in developing in other platforms such as C++, Python and Visual Basic.
With many years of experience in Team Management, Mentorship, App Development & Deployment, and Administrative Tech Consulting.


Reap the benefits of open source
From the team behind Apache Cordova, the Adobe PhoneGap framework is an open source distribution of Cordova — providing the advantage of technology created by a diverse team of pros along with a robust developer community — plus access to the PhoneGap toolset, so you can get to mobile faster.
-
{% include images/icon-wand.svg %}
PhoneGap Desktop App
Our desktop app is the snappiest way to create new PhoneGap apps without using the command line.
-
{% include images/icon-bolt.svg %}
PhoneGap Developer
Use our mobile app to connect your devices to your development machine, then see the changes you make instantly
-
{% include images/icon-cloud.svg %}
PhoneGap Build
Take the pain out of compiling locally — get app-store ready apps without the headache of maintaining native SDKs.
-
{% include images/icon-puzzle.svg %}
Plugin Library
Get access to the robust library of plugins to fully extend the capabilities of your hybrid mobile applications.
-
{% include images/icon-chest.svg %}
Third Party Tools
Find additional tools created by our amazing community to help you test, debug and manage your apps.
-
{% include images/icon-heart.svg %}
Developer Community
Connect and collaborate with our community of thousands, from beginners to experts, all working with PhoneGap.


Cute Stuff
Who's ready to get Cheesy.
You have been the best thing that's happened to me in along time. Not only are you my boyfriend, but you are literally my best friend. I can't believe it's been a year with you. I love you so much, you have no idea, and I can't wait to make new memories with you.


| 018:070 Khan | : |
He (Khidr) said: "Then, if you follow me, ask me not about anything till I myself mention it to you." |
| 018:070 Maulana | : |
He said: If thou wouldst follow me, question me not about aught until I myself speak to thee about it. |
| 018:070 Pickthal | : |
He said: Well, if thou go with me, ask me not concerning aught till I myself make mention of it unto thee. |
| 018:070 Rashad | : |
He said, "If you follow me, then you shall not ask me about anything, unless I choose to tell you about it." |
| 018:070 Sarwar | : |
He said to Moses, "If you will follow me, do not ask me about anything until I tell you the story about it." |
| 018:070 Shakir | : |
He said: If you would follow me, then do not question me about any thing until I myself speak to you about it |
| 018:070 Sherali | : |
He said, 'Well, if thou wouldst follow me, then ask me no questions about anything till I myself speak to thee about it.' |
| 018:070 Yusufali | : |
The other said: "If then thou wouldst follow me, ask me no questions about anything until I myself speak to thee concerning it." |
Concepts/Themes Covered:
This tool uses eight English parallel translations for the Holy Quran imported from Mr. Clay Smith. You can also visit Qurany Concepts for browsing the Quran themes or topics. If you want to search the Holy Quran for keywords, please visit Qurany Keywords.


Friday
we are open
- Mo. closed
- Tu. 1:00pm - 11:00pm
- We. 1:00pm - 11:00pm
- Th. 1:00pm - 11:00pm
- Fr. 2:00pm - 1:00am
- Sa. 2:00pm - 1:00am
- Su. 1:00pm - 11:00pm
Lorem ipsum
dolor sit amet, consectetur
Go to
other
Friday
we are open
Lorem ipsum
dolor sit amet, consectetur
Go to
other


TaskHunter
Create a New Task
Task Name:
Looks good!
Task Name cannot be blank
Description:
Looks good!
Task description cannot be blank
Due Date:
Looks good!
Date cannot be blank
Assigned to:
Looks good!
Assignee's name cannot be blank
Select task status
In Progress
Postponed
Completed
Looks good!
Status cannot be empty
Add
Outstanding Tasks


Preparation time
less than 30 mins
Cooking time
10 to 30 mins
Serves
Serves 4
Parsley sauce vierge makes a wonderful accompaniment to sea bass in this easy recipe - perfect for entertaining.
For the sea bass, preheat the oven to 180C/350F/Gas 4.
Cook the potatoes and fennel bulb in a pan of boiling, salted water for 15 minutes, or until cooked but still firm.
Strain, peel and cut the potatoes and fennel into thick slices. Set aside.
Blanch the pancetta in a pan of boiling water, then drain and refresh in cold water. Drain once more then place on kitchen paper to dry.
Season the sea bass with salt and freshly ground black pepper. Heat a dash of olive oil in a frying pan until hot and cook the fish skin-side down for four minutes, or until the skin starts to be crisp. Turn the fish over and place onto an oven tray skin-side up, then place in the oven for a further six minutes.
Meanwhile, add the potatoes, fennel and pancetta to the same pan you used to cook the fish and fry for a couple of minutes, or until the potatoes are slightly golden-brown.
Add the spring onions and fry for a further two minutes - be careful not to break the potatoes.
For sauce vierge, briefly warm the olive oil in a small saucepan over a low heat for about 30 seconds. Add the shallot and fry for two minutes. Remove from the heat, add the tomato, lime and balsamic vinegar and stir.
At the last minute add the chopped flatleaf parsley and salt and freshly ground black pepper, to taste.
To serve, spoon the ragoût onto the plate, top with the fish then drizzle the sauce vierge over.


My Bio
A little bio about me:
- I was born in Eugene, OR which grosses me out because I'm a big UW football fan and the hated ducks are from Eugene.
- I grew up in Marysville, WA from about age 2 on.
- I have two brothers and three sisters and I am the youngest of them.
- I'm a big fan of reading fantasy/science fiction novels. I also nerd out on video games.
- I am also a huge Marvel fan, as well as Star wars
- Since serving in the military I've been passionate about staying in shape whether it's lifting, cycling, or yoga.
Job Experience
- A fun job I learned was how to set mobile homes
- When I was 21 I joined the U.S. Army with an occupational specialty of Cavalry Scout. I served in the 1st Cavalry Division out of Fort Hood, TX and served in two tours in the Iraq theatre of war. Cav scout is a combat occupation.
- When I got out I landed a job shortly after delivering mattresses and frames for them and furniture
- I worked landscape construction building rockeries and hardscapes
- After that I worked for a sub-contractor that hired union ironworkers. So I did a lot of ironwork construction.
- What I've been doing for the last 2+ years is working customer service at an Exxon Mobil distributor
Top Ten Movie's:
- Lord of the Rings
- Captain America
- King Arthur (2017)
- The Shawshank Redemption
- The Green Mile
- Forrest Gump
- Dark Knight Trilogy
- Star Wars Saga
- Saving Private Ryan
- Interstellar


Insomnia {{ .Slug }}
Release
{{ partial "changelog-details" . }}
{{ partial "head" . }}
{{ partial "fontawesome" }} {{ partial "navbar" . }}{{ .Slug }}
ReleaseReady to speed up your API testing workflow?


--- title: "April AGM Manifestos" author: tudorfinaru roles: - title: President people: - name: Artemis Livingstone url: https://drive.google.com/file/d/1wJtcWn0bZR2RU7CbhjAjtpPOwPzujUdj/view?usp=sharing - title: Vice-President people: - name: Andi Dicu url: https://drive.google.com/file/d/1TPnZEznZh7hHzIr7XLn3sz-vhlhMe0au/view?usp=sharing - title: Secretary people: - name: Alexandra Purcarea url: https://drive.google.com/file/d/1razIEGpwzU_n_3Uftn7SiDuGrDMMcOP_/view?usp=sharing - title: Treasurer people: - name: Karthik Narayanan url: https://drive.google.com/file/d/1XyNDMmBAYlymGjTTlNkZL2WSu03h4CpG/view?usp=sharing - title: TechSec people: - name: Yuto Takano url: https://drive.google.com/file/d/1Ng0yN6KYwqTFWO3FlzmpJ0f1KtAvtVsA/view?usp=sharing - name: Jacob Walters url: https://drive.google.com/file/d/1XTlMBw5chzVyL8JbTmDkLKAsNxw199kl/view?usp=sharing - title: SocialSec people: - name: Paula Sparrow url: https://drive.google.com/file/d/15hJ7Vl_Cb4NxyEk1rYRqC9OaPVhfYQc2/view?usp=sharing - name: Fayz Siddiqui url: https://drive.google.com/file/d/1-Z6Fg-Frely_ukVLizW_V108XPrdxhty/view?usp=sharing - title: 2nd Year Rep people: - name: Paula Sparrrow url: https://drive.google.com/file/d/15Sp5c-Ma_PqO4SDLkcoP4l7DWW7yY6V6/view?usp=sharing - title: 3rd Year Rep people: - name: Nobody has run for this position. You could stand for election! - title: Final Year Rep people: - name: Mikey Andrejczuk - url: https://drive.google.com/file/d/1ATqZIgPX5CQIBQPA3_CtmHVd13hErohG/view?usp=sharing - title: Postgraduate Rep people: - name: Nobody has run for this position. You could stand for election! - title: Old Person Rep people: - name: Nobody has run for this position. You could stand for election! - title: Graphic Designer people: - name: Callum Leask url: https://drive.google.com/file/d/12fAiv6UBXx4fSX4Rz8xSt64QyhT2N_ok/view?usp=sharing ---
On Friday at 6pm we are holding our Annual General Meeting. These are the candidates' manifestos - please read them carefully and attend the event to hear their speeches!
| {{ role.title }} | |
| {{ person.name }} {% if person.url %} | view manifesto{% endif %} |
We hope you think carefully about who you choose to elect — please vote based on manifestos and speeches! Note that you may also vote for Ron (reopen nominations) for all positions.
Election candidates - please remember that if you are running for President, VP, Secretary or Treasurer, your speech may be up to 2 minutes long. Other roles have up to 1 minute. If you haven't bought membership yet, it's completely free :)
See you then!
CompSoc <3 You!


InfoPopper
Applications with InfoPopper support
There are already several applications supporting the InfoPopper. If your application is not listed, please contact us. We have also made a Developers section describing you in detail how you can add support for InfoPopper in your applications.
The Instant Messenger Kit
The IM kit can parse messages to InfoPopper that shows you when one of your buddies goes online/offline, changes status to available/away and with what protocol your buddy is connected with.
InfoPopper is also showing information when you are logging in with the
IM kit. It will show the login process for each protocol that you have
configured and then straight afterwards your online buddies with their
statuses.
For the AIM protocol InfoPopper will also show your friends' buddy
icons. On the screenshot a picture of our project leader changing his
online status to Away for the AOL Instant
Messenger (AIM) protocol.
Clicking on the InfoPopper when one of your buddies changes his/her status or send you a message, will open the relevant contact's chat window, so that you can start a chat with that person.
IconSetter utility -
It lets you set the icon for a person and a protocol.
slaad eg. build/utils/IconSetter /home/people/frankps "general"
/boot/home/Desktop/frank.jpg
The im_infopopper will look for an icon for the protocol a message comes from (eg. "aim"). If it can't find one it will look for the general one ("general"). If it still can't find one it uses the protocol icon.
The RSS Kit
The RSS kit has not been released yet, and is developed by Michael Davidson.
The Mail Daemon Replacement (MDR) Kit
InfoPopper is also capable of showing notifications of new e-mails received
with the Mail Daemon Replacement
(MDR) kit. Rumors are that also future versions of Beam
will be able to parse messages to the InfoPopper.
To make the InfoPopper notify you about new incoming e-mails, go to the Preferences
in MDR. For each e-mail account that you have configured, open E-mail
Filters settings, and then choose Incoming E-mail Filters in
the first pop-down menu and infopopperdisplay in the second pop-down
menu.
You will then see Send message to InfoPopper in the window over activated
filters. InfoPopper can of course run next to other filters.
After you have activated the infopopperdisplay filter in MDR, InfoPopper will
show you new incoming e-mails as the arrive on your system. InfoPopper will
display the sending e-mail address and the topic of the e-mail. Clicking on
a message shown in InfoPopper, will open that e-mail client that comes with
MDR.
When you are receiving new e-mails, the MDR plugin will look for the Person file who sent you an email and use their "general" icon. The plugin looks at the From email address. It queries for People files with an email matching that. If it finds it, it gets their "general" icon and displays that.
For now you'll need to use the IconSetter utility to set the "general" icon for a Person. If it cannot find a Person to match to the email, or the Person doesn't have a "general" icon, then the mail icon is used (like it was before). This works for any incoming mail, so you might set up a Person to represent the Dictionary.com word of the day and have their "general" icon be that of a Dictionary
Vision
Vision
is the default IRC client in Zeta. For a better user experience this
IRC client has a Notify List below the server and channel list on the
left side of the application's main window.
With InfoPopper you will be able to get better notifications on when
your friends are coming online and when they are going offline. Further
you will see messages containing your nickname.
SoundPlay
SoundPlay users can enjoy that InfoPopper shows them information about the current song being played. The tool shows you the album cover (48x48) - so called coverart, which in this case is the album hôtel costes 7 by Stephane Pompougnac. The track in this case is called Sunday Driver and Soundplay has played 42 % of the track).
Of more technical information, SoundPlay shows you what the
pitch has been set to and bitrate the track has been encoded in to.
The album covers are automatically downloaded from Amazon.com, and are
locally stored in the folder ~/config/settings/BeClan/InfoPopper/SoundPlay/AlbumCovers.
From time to time, you will find that Amazon hasn't got the
album or made available a picture of the album, you can then save a
picture of the album on the form {Artist}_{Album} .
BeShare
A demo implementation of InfoPopper support in BeShare has
been done by one of yellowTAB's developers, François Revol.
His version is only available on the Tycom BeShare server, and is
capable of parsing information when a download has been completed, when
your nickname get mentioned in the main chat window and when somebody
writes you a private message.
If you want to try this demo version of BeShare, please look for the following file on the BeShare server.
JABA
Jörn Weigend is the developer of JABA, and he got a kick when he saw InfoPopper in action, and added support for it more or less straight away. He later also developed the InfoPopper Settings interface.
JABA sends notifications to InfoPopper when the following important task have been completed or an error occur:
JABA is only available for ZETA.