implemented in John Ousterhout's Tcl 7.5/Tk 4.1, icon drawn by Rei Shinozuka
Compatible with Sun Solaris, SunOS, Hewlett-Packard HP-UX, OSF/1, DEC
Ultrix, AT&T System V, SGI IRIX, Linux, SCO, IBM AIX, FreeBSD, BSDI
-- each of which, believe you me, is in some way different from all the others
Copyright © 1993-1996 Thomas A. Phelps
All Rights Reserved.
University of California, Berkeley
Department of Electrical Engineering and Computer Science
Computer Science Division
The latest version of TkMan is always available by anonymous
If you send me bug reports and/or suggestions for new features, include your MANPATH, the versions of TkMan, Tcl, Tk, X, and UNIX, your machine and X window manager names, the edited Makefile, a copy of your ~/.tkman file, and the first few lines of the tkman executable. Otherwise don't waste my time.
A graphical manual page browser, TkMan offers two major advantages over
Other features include:
* full text search of manual pages (with Glimpse; optional)
* when multiple pages match the search name, a pulldown list of all matches
* regular expression searches for manual page names
* a list of recently added or changed manual pages
* a "history" list of the most recently visited pages
* a preferences panel to control fonts, colors, and other system settings
* compatibility with compressed pages (both as source and formatted)
* diagnostics on your manual page installation
* elision of those unsightly page headers and footers
* and, when attempting to print a page available only in formatted form,
reverse compilation into [tn]roff source,
which can then be reformatted as good-looking PostScript.
This help page is shipped with the distribution in HTML form for easy printing.
There are several ways to specify the manual page you desire. You
can type its name into the entry box at the top of the screen and
press Return or click the man button. The name may be just the name of
the command or may end with .n or (n),
where n specifies in which section to look. Man pages are
matched using regular expressions, so you can use . to match
any single character, * to match any (zero or more) of the
previous regular expression, [ .. ] to match any
single character in the enclosed class; see
Usually TkMan searches the directories in your
apropos information is available by typing the name and clicking apropos or hitting Shift-Return. The output of apropos is piped through sort and uniq to remove duplicates. To pass the matches through additional filters, simply give the pipe as in a shell, e.g., `search | grep ^g' (each space character is significant) returns all the search-related commands which begin with the letter g. The results of the last apropos query are available under the Volumes menu.
You may also
see a button for glimpse, a full text search program that
requires only small index files ("typically 2-5% the size of the
original text" but larger percentages for smaller amounts of text),
written by Udi Manber, Sun Wu, and Burra Gopal of
the University of Arizona's Department of Computer Science. In their
performance measurements, "a search for Schwarzkopf allowing two
misspelling errors in 5600 files occupying 77MB took 7 seconds on a
SUN IPC". For example, one may search for the string `WWW' anywhere in any manual page
by typing in `WWW' in the entry line at the top of the
screen and clicking on the glimpse button
or typing Meta-Return (for meta-information, of course).
Escape and C-g can interrupt a search after the
current directory is done.
To employ glimpse's command line options, simply
place them before the search pattern in the entry box, or add them to
the default options by editing the man(glimpse) variable in
your ~/.tkman startup file (see Customizing TkMan, below).
For instance, to search for "perl" as a word and not part of another
word (as in "properly"), glimpse for -w perl.
Glimpse supports an AND operation denoted by the symbol
`;' and an OR operation denoted by the symbol
`,'.
Refer to the
The Paths pulldown gives you complete control over which directory hierarchies of
your
Whenever you have a man page name in the text display box, whether from apropos, a volume listing or a reference within another man page, you can double-click on it to hypertext-jump to it. Pressing shift while double-clicking opens up a new viewer box to display the page.
The last few man pages you looked at can be accessed directly through the History pulldown menu. The list is sorted top to bottom in order of increasing time since that page was last visited. Shortcuts lists your personal favorites and is used just like History, with the additional options of adding the current man page (by clicking +) or removing it (-) from the list. A shift-click on - removes all shortcuts.
(Man pages specified as above are processed through an nroff filter. TkMan can also read raw text from a file or from a command pipeline, which can then be read, searched and highlighted same as a man page. To read from a file, make the first character in the name a <, as in <~/foo.txt. To open a pipe, make the first character a | (vertical bar), as in `|gzcat foo.txt.gz' or `|cat ../foo.txt | grep bar' (that's no space after the first |, a space before and after any subsequent ones). After reading a file in this way, the current directory is set to its directory. Commands are not processed by a shell, but the metacharacters ., .., ~ and $ (for environment variables), are expanded nonetheless. Typing is eased further by file name completion, bound to Escape. Lone files (i.e., not part of a pipe) are automatically uncompressed--no need to read compressed files through a zcat pipe. It is not expected that reading raw text will be done much; it is included so the occasional non-man page documentation, say, a FAQ or RFC, may be read from the same environment.)
The full pathname of the current manual page is shown at the top of
the screen. Via the Preferences dialog, this can be changed to the
To the extent it follows conventional formatting, a manual page is parsed to yield its
section and subsection titles (which are directly available from the
Sections pulldown) and references to other man pages from throughout the page
including its
Within a man page or raw text file or pipe, you may add ad hoc highlighting, as though with a yellow marker (underlining on monochrome monitors). Highlighted regions may then be scrolled to directly through the Highlights pulldown menu. To highlight a region, select the desired text by clicking button 1, dragging to the far extent of the desired region and releasing the button, then click on the + next to Highlights. To remove any highlights or portions thereof in a region, select it as before but then click on -. A shift-click on the menu title tours through all the highlights on the page. A shift-click on - removes all highlights on the page. A complete set of pages with highlighting is available under the Volumes menu.
Highlighting information is robust against changes to and reformatting of the page. Here's how highlight reattachment works. When you highlight a region, the starting and ending positions are saved along with some the content of the highlighted region and context. When that page is viewed again, if those positions still match the context, the highlight is attached there (this is an exact match). If not, the context is searched forward and backward for a match, with the closer match chosen if there are matches in both directions (a repositioned match). If no match is found with the full context, gradually less and less of it is tried, reasoning that perhaps the content of the context has been changed (repositioned, but with less confidence, triggering a warning dialog). If still no match is found (an orphan), the highlight is reported at the bottom of the page, where it must be reattached manually before leaving the page or it will be forgotten. (Before TkMan v1.8b4, highlights were attached by positions only, and when the page modification date changed, the user had the choice of applying highlights at those same positions regardless of the text there now or throwing out the highlights wholesale. Old style highlights are automatically updated to the new style that can be automatically and robustly repositioned. The next time an old style page is viewed, the old style highlights are applied as before, and from those postions new style highlights are composed.) The annotation reattachment mechanism is inspried by Stanford's ComMentor system.
You can move about the man page by using the scrollbar or typing a number of key combinations familiar to Emacs aficionados. Space and C-v page down, and delete and M-v page up. C-n and C-p scroll up and down, respectively, by a single line (vi fans will be happy to hear that C-f and C-b also page down and page up, respectively). M-< goes to the head and M-> to the tail of the text. One may "scan" the page, which is to say scroll it up and down with the mouse but without the use of the scrollbar, by dragging on the text display with the middle mouse button pressed. Like Emacs, C-space will mark one's current location, which can be returned to later with C-x, which exchanges the then-current position with the saved mark; a second C-x swaps back.
C-s initiates an incremental search. Subsequently typing a few letters attempts to find
a line with that string, starting its search at the current match, if any,
or otherwise the topmost visible line.
A second C-s finds the next match of the string typed
so far. (If the current search string is empty, a second C-s retrieves the
previous search pattern.) C-r is similar to C-s but searches backwards.
Escape or C-g cancels searching.
Incremental search can be used to
quickly locate a particular command-line option or a particular command in
a group (as in csh's long list of internal commands).
At the bottom of the screen, type in a regular
expression to search for (see Tcl's
The Tab key moves the focus from the man page type-in line to the text view of the man page to the search line and back around. Shift-Tab jumps about in the opposite direction.
The Occasionals menu holds commands and options which you probably won't
frequently. Help returns to this
information screen. Although virtually made obsolete by TkMan, Kill Trees
makes a printout of the current man page on dead, cut, bleached trees, helping to starve the
planet of life-giving oxygen. A list of printers appears in the cascade menu; this
list may be edited in Preferences/Misc. (Even if only one printer is available,
it placed in the cascade menu, rather than being directly available. This is a feature.)
(If the [tn]roff source is not available, TkMan
asks if it should try to reverse compile the man page. If successful, this
produces much more appealing output than an
As with xman one may instantiate multiple viewers. When there is more than
one viewer you may choose man pages in one viewer and have their contents
shown in another. Use the Output pulldown (which appears and disappears
as relevant) to direct one viewer's output destination to another. With
this feature one may easily compare two similar man pages for differences,
keep one man page always visible, or examine several man pages from a
particular volume listing or a
At the bottom right corner of the screen, Mono toggles between the proportionally-spaced font and a monospaced one, for use in those man pages that rely on a fixed-width font to align columns. Quit exits TkMan, of course, after saving some state information (see below). To exit without saving status information, select the Quit option from the Occasionals pulldown.
The Preferences... choice in the Occasionals pulldown menu brings up a graphical user interface to setting various attributes of TkMan, including fonts, colors, and icons. Click on a checkbutton at the top of the window to bring up the corresponding group of choices. After making a set of choices, the Apply button reconfigures the running application to show these changes, OK sets the changes for use now and in the future, Cancel quits the dialog and sets all choices to their settings as of the time Preferences was called up, and Defaults resets the settings in the current group to those set by TkMan out of the box.
The first line in the Fonts group specifies the font to use for the general user interface, which amounts to the labels on buttons and the text in menus. The first menu in the line labeled Interface sets the font family, the next menu sets the font size, and the last the font styling (normal, bold, italics, bold-italics). Text display makes these settings for the text box in which the manual pages contents are displayed. For listings of all man pages in a particiular volume (as chosen with the Volumes menu), you may wish to use a smaller font so that more names fit on the screen at once. Screen DPI specifies the right set of fonts to use for your monitor.
Colors sets the foreground and background colors to use for the manual page text display box, the general user interface, and the buttons of the user interface. In addition it sets the color (or font) in which to show various classes of text in the text box, including manual page references, incremental search hits, regular expression search hits, and highlighted regions.
The See group specifies what information to display. Usually manual page headers and footers are uninteresting and therefore are stripped out, but a canonical header and footer (along the date the page was installed in the man/mann directory or formatted to the man/catn directory) to be shown at the bottom of every page can be requested. Solaris and IRIX systems come with many "subvolumes"--that is volumes with names like "3x" and "4dm" that form subgroupings under the main volumes "3" and "4", respectively--and you make use tkmandesc commands to add your own subvolumes. You can reduce the length of the main Volumes menu by placing all volumes in such groups as cascaded menus. When a highlighted passage is jumped to via the Highlights menu, some number of lines of back context are included; the exact number of lines is configurable. The information bar at the top of the window can display either the short, one-line description from a manual page's NAME section or the pathname of the page. Around the man page display area runs a buffer region, the exact width of which is configurable. Tk deviates from Motif behavior slightly, as for instance in highlighting buttons when they're under the cursor, but you can observe strict Motif behavior.
The Icon group sets all the options relating to iconification. The pathnames of the icon bitmap and icon mask should be the full pathnames (beginning with a `/').
If a man page has not been formatted by nroff, TkMan must first pipe the source text through nroff. By turing on Cache formatted (nroff'ed) pages in the Misc(ellaneous) group, the nroff-formatted text is saved to disk (if possible), thereby eliminating this time-consuming step the next time the man page is read. The on & compress setting will compress the page, which saves on disk space (often substantially as much of a formatted page is whitespace), but will make it unavailable to other manual pagers that don't handle compression. By default man page links are activated by double clicking. The first click puts the name in the entry box so that it can be used as the apropos or glimpse pattern as well. This click once to select, twice to launch follows the Macintosh convention. Since TkMan was written, some hypertext browsers have popularized a click-once-to-launch practice. The Mouse click to activate hyperlink switch chooses between the two. TkMan can extract section headers from all manual pages, but only some manual page macros format subsection headers in a way that can be distinguished from ordinary text; if your macros do, turn this option on to add subsections to the Sections menu. The History pulldown must balance depth of the list against ease of finding an entry; set your own inflection point with this menu. Volumes' (recent) choice will show all manual pages that have been added or changed n days, where n is set with this next menu. Glimpse works best when searching for relatively uncommon words; guard against getting too many hits by setting the maximum number reported. By default Glimpse indexes are placed at the root of the corresponding man hierarchy, where they can be shared. For the case when an individual may not have write permission there, a single, unified index can be created and stored locally (though you lose control of it from the Paths settings). Unified indexes are much faster that distributed. In this latter case and also for "stray cats" (i.e., directories not part of a set of man hierarchy directories), you should specify an auxiliary directory to hold the index. Proportional spacing wrecks the spacing used to set tables in columns, hence the Mono(space) button on the bottom line of the main screen.
There are four levels of configuration to TkMan.
(1) Transparent. Simply use TkMan and it will remember your window size and placement, short cuts, and highlights (if you quit out of TkMan via the Quit button).
(2) Preferences editor (see Preferences above).
(3) Configuration file. Most interesting settings, like the command(s) used to print the man page and some key bindings, can be changed by editing one's own ~/.tkman. Thus, a single copy of TkMan (i.e., the executable tkman) can be shared, but each user can have his own customized setup. (The file ~/.tkman is created/rewritten every time one quits TkMan via the Quit button in the lower right corner. Therefore, to get a ~/.tkman to edit, first run and quit TkMan. Do not create one from scratch as it will not have the proper format used for saving other persistent information, and your work will be overwritten, which is to say lost.) Be careful not to edit a ~/.tkman file only to have it overwritten when a currently-running TkMan quits.
Options that match the defaults are commented out (i.e., preceded by a #). This is so that any changes in the defaults will propagate nicely, while the file still lists all interesting variables. To override the default settings for these options, first comment in the line.
The ~/.tkman save file is the place to add or delete colors to the
default set, which will subsequently become menu choices in
Preferences, by editing in place the variable
man(colors). One may also edit the order of Shortcuts
in the man(shortcuts) variable.
Other interesting variables include
man(highlight), which can be edited to change the background
in place of the foreground, or both the foreground and
background, or a color and the font as with the following
setting:
set man(highlight) {bold-italics -background #ffd8ffffb332}
Arbitrary Tcl commands, including tkmandesc commands (described below), can be appended to ~/.tkman (after the ### your additions go below line).
To set absolutely the volume names for which all directories should be
searched, edit the parallel arrays on these existing lines:
set man(manList) ...
set man(manTitleList) ...
Changing the order volumes in these lists (make sure to keep the two lists
in parallel correspondence) changes the precedence of matches when two or
more pages have the same name: the page found in the earlier volume in this list
is show first.
Additional useful commands include
(4) Source code. Of course, but if you make generally useful changes or have suggestions for some, please report them back to me so I may share the wealth with the next release.
Key bindings related to the text display box are kept in the sb
array in ~/.tkman (for more information on Tcl's arrays, refer to
the
Like xman, TkMan gives you directory-by-directory control over named volume contents. Unlike and superior to xman, however, each individual user controls directory-to-volume placement, rather than facing a single specification for each directory tree that must be observed by all.
By default a matrix is created by taking the product of directories in the
The interface to this functionality takes the form of Tcl commands, so you
may need to learn Tcl--particularly the commands that deal with Tcl lists
(including
Directory titles and abbrevations are kept in lists. Abbreviations MUST be unique (capital letters are distinct from lower case), but need not correspond to actual directories. In fact, volume letters specified here supercede the defaults in identifying a volume in man page searches.
The following commands are appended to the file ~/.tkman (see Customizing TkMan, above).
To recreate a cross product of current section lists:
manDescDefaults
This cross product is made implicitly before other tkmandesc commands.
Almost always this is what one expects. If it is not, one may supress the
cross product by setting the variable manx(defaults) to a non-null, non-zero
value before other tkmandesc commands are invoked.
To add "pseudo" sections to the current volume name list, at various positions including
at end of the list, in alphabetical order, or before or after a specific volume:
manDescAddSects list of (letter, title pairs)
or manDescAddSects list of (letter, title) pairs sort
or manDescAddSects list of (letter, title) pairs before sect-letter
or manDescAddSects list of (letter, title) pairs after sect-letter
In manual page searches that produce multiple matches, the page found
in the earlier volume is the one shown by default.
To move/copy/delete/add directories:
manDescMove from-list to-list dir-patterns-list
manDescCopy from-list to-list dir-patterns-list
manDescDelete from-list dir-patterns-list
manDescAdd to-list dir-list
The dir-patterns-list uses the same meta characters as man
page searching (see above). It is matched against
Adding directories with manDescAdd also makes them available to Glimpse for its indexing.
Warning: Moving directories from their natural home slightly impairs searching speed when following a reference within a man page. For instance, say you've moved man pages for X Windows subroutines from their natural home in volume 3 to their own volume called `X'. Following a reference in XButtonEvent to XAnyEvent(3X11) first searches volume 3; not finding it, TkMan searches all volumes and finally finds it in volume X. With no hint to look in volume 3 (as given by the 3X11 suffix), the full volume search would have begun straight away. (Had you double-clicked in the volume listing for volume X or specified the man page as XButtonEvent.X, volume X would have been searched first, successfully.)
To help debug tkmandesc scripts, invoke manDescShow to dump to stdout the current correspondence of directories to volumes names.
(1) To collect together all man pages in default volumes 2 and 3 in all
directories into a volume called "Programmer Subroutines", add these lines
to the tail of ~/.tkman:
manDescAddSects {{p "Programmer Subroutines"}}
manDescMove {2 3} p *
To place the new section at the same position in the volume pulldown list
as volumes 2 and 3:
manDescAddSects {{p "Programmer Subroutines"}} after 2
manDescMove {2 3} p *
To move only a selected set of directories:
manDescAddSects {{p "Programmer Subroutines"}}
manDescMove * p {/usr/man/man2 /usr/local/man/man3}
(2) To have a separate volume with all of your and a friend's personal man
pages, keeping a duplicate in their default locations:
manDescAddSects {{t "Man Pages de Tom"} {b "Betty Page(s)"}}
manDescCopy *phelps* t *
manDescCopy *page* t *
(3) To collect the X windows man pages into two sections of their own, one
for programmer subroutines and another for the others:
manDescAddSects {{x "X Windows"}} after 1
manDescAddSects {{X "X Subroutines"}} after 3
manDescMove * x *X11*
manDescMove x X *3
(4) If you never use the programmer subroutines, why not
save time and memory by not reading them into the database?
manDescDelete * {*[2348]} (braces prevent Tcl from trying to execute [2348] as a command)
Alternatively but not equivalently:
manDescDelete {2 3 4 8} *
TkMan's tkmandesc capability is patterned after xman's mandesc files. By placing a mandesc file at the root of a man page directory tree, one may create pseudo volumes and move and copy subdirectories into them. Silicon Graphics has modified xman so that simply by creating a subdirectory in a regular man subdirectory one creates a new volume. This is evil. It violates the individual user's rights to arrange the directory-volume mapping as he pleases, as the mandesc file or subdirectory that spontaneously creates a volume is set a single place and must be observed by all who read that directory. By contrast, TkMan places the directory-to-volume mapping control in an individual's own ~/.tkman file. This gives the individual complete control and inflicts no pogrom on others who share man page directories. Therefore, mandesc files are not supported in any way by TkMan.
One may still share custom setups, however, by sharing the relevant lines of ~/.tkman. In fact, a tkmandesc version of the standard SGI man page directory setup is included in the contrib directory of the TkMan distribution. For assistance with SGI-specific directory manipulation, contact Paul Raines (raines@bohr.physics.upenn.edu).
TkMan uses RosettaMan to translate and reformat man pages (see
Tom Phelps
University of California, Berkeley
Computer Science Division
387 Soda Hall #1776
Berkeley, CA 94720-1776
USA
<EMAIL_ADDRESS>A World Wide Web page that lists other Tcl/Tk software and a related Berkeley Computer Science Division technical report, CSD-94-802, can be found at http://http.cs.berkeley.edu/~phelps/.
Permission to use, copy, modify, and distribute this software and its documentation for educational, research and non-profit purposes, without fee, and without a written agreement is hereby granted, provided that the above copyright notice, this and the following two paragraphs appear in all copies.
Help page last revised on $Date: 1996/07/17 00:57:39 $


When I think of the last time in my life where I've been the happiest, the proudest. and the most satisfied, the following values come to my mind:
I like having the feeling of accomplishment. It always makes you fell happy, proud, and satistied. It is because when you set some goal for yourself, you are expecting yourself to accomplish it no matter what obstacles you have out there. Therefore, when you were able to accomplish something, it shows that you have the ability to promise yourself. It tells yourself that you are capable of doing something difficult.
Having confidence is very important to me. It is because I always believe that when you are happy, you are always confident during that moment. Being confident about something means you have faith about it, you are good at it, and you are willing to accomplish it no matter what. Thus, being confident in your life is very important, especially during some important moment in your life: Taking an exam, Meeting someone important, Doing something impactful, etc. Sometimes, I believe that the more confident you are, the more happier you are.
People wants reputation. I can think of reputation is the value of your personal brand. The more reputation you have, the better your personal brand is. So that also means if you have a very high reputation, people will believe that you are credible, reliable, trustable and powerful. Therefore, when I felt like I was proudest person in the world, I actually believe I have a very high value of reputation among all others.
In summary, I strongly agree those values I mentioned above. If I have to rate, it would be 5 on a scale of 1 to 5
The last topic that someone asked my advice on was my friend who needed to decide whether he should go back to his hometown while giving up the legal status in the United States. Since that is a very serious topic, I tried to analyze the pros and cons of both optiopns with him. I believe I successfully express the values I mentioned above: Confidence and Reputation because thats probably why my friend had decided to come to me and ask for advice. Eventually, we were able to come up witha a conclusion where he could make the finally decision.
So this is what I think of values. What value do you agree?


It’s here! Phoenix LiveView leverages server-rendered HTML and Phoenix’s native WebSocket tooling so you can build fancy real-time features without all that complicated JavaScript. If you’re sick to death of writing JS (I had a bad day with Redux, don’t ask), then this is the library for you!
Phoenix LiveView is brand brand new so I thought I’d provide a short write-up of a super simple demo I built for anyone looking to get up and running. Keep in mind that the library is still a release candidate and as such, is subject to change.
What is LiveView?
Chris McCord said it best in his announcement back in December:
Phoenix LiveView is an exciting new library which enables rich, real-time user experiences with server-rendered HTML. LiveView powered applications are stateful on the server with bidirectional communication via WebSockets, offering a vastly simplified programming model compared to JavaScript alternatives.
Kill Your JavaScript
If you’ve waded through an overly complex SPA that Reduxes all the things (for example), you’ve felt the maintenance and iteration costs that often accompany all that fancy JavaScript.
Phoenix LiveView feels like a perfect fit for the 90% of the time that you do want some live updates but don’t actually need the wrecking ball of many modern JS frameworks.
Let’s get LiveView up and running to support a feature that pushes out live updates as our server enacts a step-by-step process of creating a GitHub repo.
Here’s the functionality we’re building:
Getting Started
The following steps are detailed in Phoenix LiveView Readme.
- Install the dependency in your
mix.exs
file:
def deps do
[
{:phoenix_live_view, "~> 0.2.0"}
]
end
- Update your app’s endpoint configuration with a signing salt for your live view connection to use:
# Configures the endpoint
config :my_app, MyApp.Endpoint,
...
live_view: [
signing_salt: "YOUR_SECRET"
]
Note: You can generate a secret by running mix phx.gen.secret
from the command line.
- Update your configuration to enable writing LiveView templates with the
.leex
extension.
config :phoenix,
template_engines: [leex: Phoenix.LiveView.Engine]
- Add the live view flash plug to your browser pipeline, after
:fetch_flash
pipeline :browser do
...
plug :fetch_flash
plug Phoenix.LiveView.Flash
end
- Import the following in your
lib/app_web.ex
file:
def view do
quote do
...
import Phoenix.LiveView, only: [live_render: 2, live_render: 3]
end
end
def router do
quote do
...
import Phoenix.LiveView.Router
end
end
- Expose a socket for LiveView to use in your endpoint module:
defmodule MyAppWeb.Endpoint do
use Phoenix.Endpoint
socket "/live", Phoenix.LiveView.Socket
# ...
end
- Add LiveView to your NPM dependencies:
# assets/package.json
{
"dependencies": {
...
"phoenix_live_view": "file:../deps/phoenix_live_view"
}
}
You’ll need to run npm install
after this step.
- Use the LiveView JavaScript library to connect to the LiveView socket in
app.js
import LiveSocket from "phoenix_live_view"
let liveSocket = new LiveSocket("/live")
liveSocket.connect()
- Your live views should be saved in the
lib/my_app_web/live/
directory. For live page reload support, add the following pattern to yourconfig/dev.exs
:
config :demo, MyApp.Endpoint,
live_reload: [
patterns: [
...,
~r{lib/my_app_web/live/.*(ex)$}
]
]
Now we’re ready to build and render a live view!
Rendering a Live View from the Controller
You can serve live views directly from your router. However, in this example we’ll teach our controller to render a live view. Let’s take a look at our controller:
defmodule MyApp.PageController do
use MyApp, :controller
alias Phoenix.LiveView
def index(conn, _) do
LiveView.Controller.live_render(conn, MyAppWeb.GithubDeployView, session: %{})
end
end
We’re calling on the live_render/3
function which takes in an argument of the conn
, the live view we want to render, and any session info we want to send down into the live view.
Now we’re ready to define our very own live view.
Defining the Live View
Our first live view will live in my_app_web/live/github_deploy_view.ex
. This view is responsible for handling an interaction whereby a user “deploys” some content to GitHub. This process involves creating a GitHub organization, creating the repo and pushing up some contents to that repo. We won’t care about the implementation details of this process for the purpose of this example.
Our live view will use Phoenix.LiveView
and must implement two functions: render/1
and mount/2
.
defmodule MyAppWeb.GithubDeployView do
use Phoenix.LiveView
def render(assigns) do
~L"""

<%= @deploy_step %>

"""
end
def mount(_session, socket) do
{:ok, assign(socket, deploy_step: "Ready!")}
end
end
Now that we have the basic pieces in place, let’s break down the live view process.
How It Works
The live view connection process looks something like this:
When our app receives an HTTP request for the index route, it will respond by rendering the static HTML defined in our live view’s render/1
function. It will do so by first invoking our view’s mount/2
function, only then rendering the HTML populated with whatever default values mount/2
assigned to the socket.
The rendered HTML will include the signed session info. The session is signed using the signing salt we provided to our live view configuration in config.exs
. That signed session will be sent back to the server when the client opens the live view socket connection. If you inspect the page rendering your live view in the browser, you’ll see that signed session:

...

Once that static HTML is rendered, the client will send the live socket connect request thanks to this snippet:
import LiveSocket from "phoenix_live_view"
let liveSocket = new LiveSocket("/live")
liveSocket.connect()
This initiates a stateful connection that will cause the view to be re-rendered anytime the socket updates. Since the page first renders as static HTML, we can rest assured that our page will always render for our user, even if JavaScript is disabled in the browser.
Now that we understand how the live view is first rendered and how the live view socket connection is established, let’s render some live updates.
Rendering Live Updates
LiveView is listening to updates to our socket and will re-render only the portions of the page that need updating. Taking a closer look at our render/1
function, we see that it renders the values of the keys assigned to our socket.
Where mount/2
assigned the values :deploy_step
, our render/1
function renders them like this:
def render(assigns) do
~L"""

<%= @deploy_step %>

"""
end
Note: The ~L
sigil represents Live EEx. This is the built-in LiveView template. Unlike .eex
templates, LEEx templates are capable of tracking and rendering only necessary changes. So, if the value of @deploy_step
changes, our template will re-render only that portion of the page.
Let’s give our user a way to kick off the “deploy to GitHub” process and see the page update as each deploy step is enacted.
LiveView supports DOM element bindings to give us the ability to respond to client-side events. We’ll create a “deploy to GitHub” button and we’ll listen for the click of that button with the phx-click event binding.
def render(assigns) do
~L"""

<button phx-click="github_deploy">Deploy to GitHub</button>

Status: <%= @deploy_step %>

"""
end
The phx-click
binding will send our click event to the server to be handled by GithubDeployView
. Events are handled in our live views by the handle_event/3
function. This function will take in an argument of the event name, a value and the socket.
There are a number of ways to populate the value
argument, but we won’t use that data point in this example.
Let’s build out our handle_event/3
function for the "github_deploy"
event:
def handle_event("github_deploy", _value, socket) do
# do the deploy process
{:noreply, assign(socket, deploy_step: "Starting deploy...")}
end
Our function is responsible for two things. First, it will kick off the deploy process (coming soon). Then, it will update the value of the :deploy_step
key in our socket. This will cause our template to re-render the portion of the page with <%= @deploy_step %>
, so the user will see Status: Ready!
change to Status: Starting deploy...
.
Next up, we need the “deploying to GitHub” process to be capable of updating the socket’s :deploy_step
at each turn. We’ll have our view’s handle_event/3
function send a message to itself to enact each successive step in the process.
def handle_event("github_deploy", _value, socket) do
:ok = MyApp.start_deploy()
send(self(), :create_org)
{:noreply, assign(socket, deploy_step: "Starting deploy...")}
end
def handle_info(:create_org, socket) do
{:ok, org} = MyApp.create_org()
send(self(), {:create_repo, org})
{:noreply, assign(socket, deploy_step: "Creating GitHub org...")}
end
def handle_info({:create_repo, org}, socket) do
{:ok, repo} = MyApp.create_repo(org)
send(self(), {:push_contents, repo})
{:noreply, assign(socket, deploy_step: "Creating GitHub repo...")}
end
def handle_info({:push_contents, repo}, socket) do
:ok = MyApp.push_contents(repo)
send(self(), :done)
{:noreply, assign(socket, deploy_step: "Pushing to repo...")}
end
def handle_info(:done, socket) do
{:noreply, assign(socket, deploy_step: "Done!")}
end
This code is dummied-up––we’re not worried about the implementation details of deploying our GitHub repo, but we can imagine how we might add error handling and other responsibilities into this code flow.
Our handle_event/3
function kicks off the deploy process by sending the :create_org
message to the view itself. Our view responds to this message by calling on code that enacts that step and by updating the socket. This will cause our template to re-render once again, so the user will see Status: Starting deploy...
change to Status: Creating GitHub org...
. In this way, the view enacts each step in the GitHub deploy process, updating the socket and causing the template to re-render each time.
Now that we have our live updates working, let’s refactor the HTML code out of our render/1
function and into its own template file.
Rendering a Template File
We’ll define our template in lib/my_app_web/templates/page/github_deploy.html.leex
:

<button phx-click="github_deploy">Deploy to GitHub</button>

Status: <%= @deploy_step %>

Next, we’ll have our live view’s render/1
function simply tell our PageView
to render this template:
defmodule MyApp.GithubDeployView do
use Phoenix.LiveView
def render(assigns) do
MyApp.PageView.render("github_deploy.html", assigns)
end
...
end
Now our code is a bit more organized.
Conclusion
From even this limited example, we can see what a powerful offering this is. We were able to implement this real-time feature with only server-side code, and not that many lines of server-side code at that! I really enjoyed playing around with Phoenix LiveView and I’m excited to see what other devs build with it. Happy coding!
Caught a mistake or want to contribute to the article? Edit this page on GitHub!


Info
The complete dataset: Allows downloading of the complete parsed data set.
The filtered dataset: Allows downloading of all parsed IMGT information of all transcripts that passed the chosen filter settings.
The alignment info on the unmatched sequences: Provides information of the subclass alignment of all unmatched sequences. For each sequence the chunck hit percentage and the nt hit percentage is shown together with the best matched subclass.
SHM Overview
The SHM Overview table as a dataset: Allows downloading of the SHM Overview table as a data set.
Motif data per sequence ID: Provides a file that contains information for each transcript on the number of mutations present in WA/TW and RGYW/WRCY motives.
Mutation data per sequence ID: Provides a file containing information on the number of sequences bases, the number and location of mutations and the type of mutations found in each transcript.
Base count for every sequence: links to a page showing for each transcript the sequence of the analysed region (as dependent on the sequence starts at filter), the assigned subclass and the number of sequenced A,C,G and T’s.
The data used to generate the percentage of mutations in AID and pol eta motives plot: Provides a file containing the values used to generate the percentage of mutations in AID and pol eta motives plot in the SHM overview tab.
The data used to generate the relative mutation patterns plot: Provides a download with the data used to generate the relative mutation patterns plot in the SHM overview tab.
The data used to generate the absolute mutation patterns plot: Provides a download with the data used to generate the absolute mutation patterns plot in the SHM overview tab.
SHM Frequency
The data generate the frequency scatter plot: Allows downloading the data used to generate the frequency scatter plot in the SHM frequency tab.
The data used to generate the frequency by class plot: Allows downloading the data used to generate frequency by class plot included in the SHM frequency tab.
The data for frequency by subclass: Provides information of the number and percentage of sequences that have 0%, 0-2%, 2-5%, 5-10%, 10-15%, 15-20%, >20% SHM. Information is provided for each subclass.
Transition Tables
The data for the 'all' transition plot: Contains the information used to generate the transition table for all sequences.
The data for the 'IGA' transition plot: Contains the information used to generate the transition table for all IGA sequences.
The data for the 'IGA1' transition plot: Contains the information used to generate the transition table for all IGA1 sequences.
The data for the 'IGA2' transition plot: Contains the information used to generate the transition table for all IGA2 sequences.
The data for the 'IGG' transition plot : Contains the information used to generate the transition table for all IGG sequences.
The data for the 'IGG1' transition plot: Contains the information used to generate the transition table for all IGG1 sequences.
The data for the 'IGG2' transition plot: Contains the information used to generate the transition table for all IGG2 sequences.
The data for the 'IGG3' transition plot: Contains the information used to generate the transition table for all IGG3 sequences.
The data for the 'IGG4' transition plot: Contains the information used to generate the transition table for all IGG4 sequences.
The data for the 'IGM' transition plot : Contains the information used to generate the transition table for all IGM sequences.
The data for the 'IGE' transition plot: Contains the information used to generate the transition table for all IGE sequences.
Antigen selection
AA mutation data per sequence ID: Provides for each transcript information on whether there is replacement mutation at each amino acid location (as defined by IMGT). For all amino acids outside of the analysed region the value 0 is given.
Presence of AA per sequence ID: Provides for each transcript information on which amino acid location (as defined by IMGT) is present. 0 is absent, 1 is present.
The data used to generate the aa mutation frequency plot: Provides the data used to generate the aa mutation frequency plot for all sequences in the antigen selection tab.
The data used to generate the aa mutation frequency plot for IGA: Provides the data used to generate the aa mutation frequency plot for all IGA sequences in the antigen selection tab.
The data used to generate the aa mutation frequency plot for IGG: Provides the data used to generate the aa mutation frequency plot for all IGG sequences in the antigen selection tab.
The data used to generate the aa mutation frequency plot for IGM: Provides the data used to generate the aa mutation frequency plot for all IGM sequences in the antigen selection tab.
The data used to generate the aa mutation frequency plot for IGE: Provides the data used to generate the aa mutation frequency plot for all IGE sequences in the antigen selection tab.
Baseline PDF (http://selection.med.yale.edu/baseline/): PDF containing the Antigen selection (BASELINe) graph for all sequences.
Baseline data: Table output of the BASELINe analysis. Calculation of antigen selection as performed by BASELINe are shown for each individual sequence and the sum of all sequences.
Baseline IGA PDF: PDF containing the Antigen selection (BASELINe) graph for all sequences.
Baseline IGA data: Table output of the BASELINe analysis. Calculation of antigen selection as performed by BASELINe are shown for each individual IGA sequence and the sum of all IGA sequences.
Baseline IGG PDF: PDF containing the Antigen selection (BASELINe) graph for all IGG sequences.
Baseline IGG data: Table output of the BASELINe analysis. Calculation of antigen selection as performed by BASELINe are shown for each individual IGG sequence and the sum of all IGG sequences.
Baseline IGM PDF: PDF containing the Antigen selection (BASELINe) graph for all IGM sequences.
Baseline IGM data: Table output of the BASELINe analysis. Calculation of antigen selection as performed by BASELINe are shown for each individual IGM sequence and the sum of all IGM sequences.
Baseline IGE PDF: PDF containing the Antigen selection (BASELINe) graph for all IGE sequences.
Baseline IGE data: Table output of the BASELINe analysis. Calculation of antigen selection as performed by BASELINe are shown for each individual IGE sequence and the sum of all IGE sequences.
CSR
The data for the IGA subclass distribution plot : Data used for the generation of the IGA subclass distribution plot provided in the CSR tab.
The data for the IGA subclass distribution plot : Data used for the generation of the IGG subclass distribution plot provided in the CSR tab.
Clonal relation
Sequence overlap between subclasses: Link to the overlap table as provided under the clonality overlap tab.
The Change-O DB file with defined clones and subclass annotation: Downloads a table with the calculation of clonal relation between all sequences. For each individual transcript the results of the clonal assignment as provided by Change-O are provided. Sequences with the same number in the CLONE column are considered clonally related.
The Change-O DB defined clones summary file: Gives a summary of the total number of clones in all sequences and their clone size.
The Change-O DB file with defined clones of IGA: Downloads a table with the calculation of clonal relation between all IGA sequences. For each individual transcript the results of the clonal assignment as provided by Change-O are provided. Sequences with the same number in the CLONE column are considered clonally related.
The Change-O DB defined clones summary file of IGA: Gives a summary of the total number of clones in all IGA sequences and their clone size.
The Change-O DB file with defined clones of IGG: Downloads a table with the calculation of clonal relation between all IGG sequences. For each individual transcript the results of the clonal assignment as provided by Change-O are provided. Sequences with the same number in the CLONE column are considered clonally related.
The Change-O DB defined clones summary file of IGG: Gives a summary of the total number of clones in all IGG sequences and their clone size.
The Change-O DB file with defined clones of IGM: Downloads a table with the calculation of clonal relation between all IGM sequences. For each individual transcript the results of the clonal assignment as provided by Change-O are provided. Sequences with the same number in the CLONE column are considered clonally related.
The Change-O DB defined clones summary file of IGM: Gives a summary of the total number of clones in all IGM sequences and their clone size.
The Change-O DB file with defined clones of IGE: Downloads a table with the calculation of clonal relation between all IGE sequences. For each individual transcript the results of the clonal assignment as provided by Change-O are provided. Sequences with the same number in the CLONE column are considered clonally related.
The Change-O DB defined clones summary file of IGE: Gives a summary of the total number of clones in all IGE sequences and their clone size.
Filtered IMGT output files
An IMGT archive with just the matched and filtered sequences: Downloads a .txz file with the same format as downloaded IMGT files that contains all sequences that have passed the chosen filter settings.
An IMGT archive with just the matched and filtered IGA sequences: Downloads a .txz file with the same format as downloaded IMGT files that contains all IGA sequences that have passed the chosen filter settings.
An IMGT archive with just the matched and filtered IGA1 sequences: Downloads a .txz file with the same format as downloaded IMGT files that contains all IGA1 sequences that have passed the chosen filter settings.
An IMGT archive with just the matched and filtered IGA2 sequences: Downloads a .txz file with the same format as downloaded IMGT files that contains all IGA2 sequences that have passed the chosen filter settings.
An IMGT archive with just the matched and filtered IGG sequences: Downloads a .txz file with the same format as downloaded IMGT files that contains all IGG sequences that have passed the chosen filter settings.
An IMGT archive with just the matched and filtered IGG1 sequences: Downloads a .txz file with the same format as downloaded IMGT files that contains all IGG1 sequences that have passed the chosen filter settings.
An IMGT archive with just the matched and filtered IGG2 sequences: Downloads a .txz file with the same format as downloaded IMGT files that contains all IGG2 sequences that have passed the chosen filter settings.
An IMGT archive with just the matched and filtered IGG3 sequences: Downloads a .txz file with the same format as downloaded IMGT files that contains all IGG3 sequences that have passed the chosen filter settings.
An IMGT archive with just the matched and filtered IGG4 sequences: Downloads a .txz file with the same format as downloaded IMGT files that contains all IGG4 sequences that have passed the chosen filter settings.
An IMGT archive with just the matched and filtered IGM sequences: Downloads a .txz file with the same format as downloaded IMGT files that contains all IGM sequences that have passed the chosen filter settings.
An IMGT archive with just the matched and filtered IGE sequences: Downloads a .txz file with the same format as downloaded IMGT files that contains all IGE sequences that have passed the chosen filter settings.


Stage 0 Notes – Getting Started with HTML
HTML documents are a key component of internet communications, as it is the language that is passed between the user, the user’s computer, the internet, and the web servers.
HTML = Hypertext Markup Language. HTML translates to text, markup (tags for arrangement), references (images and documents) and links to other locations.
Tags are used to mark the beginning and ending locations for special formatting. Start and end tags are enclosed in < > 's.
There are 2 types of HTML tags – inline and block. Inline tags are used to format a single line of text, whereas block tags are used to define formatting for a section of text, like a paragraph.
Image an invisible line drawn around a section where block tags control the style of that entire area.
Examples of some Inline tags:
a - anchor tag; use to define file/locations
b - makes text bold
br - line break tag (this is a void tag; it does not require an end tag)
em - italicizes text
Example of a block tag:
p - paragraph tag
Attributes are used with tags to define files and file locations.
Use attribute href with an anchor tag to define a link to a web page, or src with the img tag to define a location of an image.
There are some useful tools for experimenting with HTML that you can use for free on the web:
ScratchPad
Udacity Playground
CodePen
More fun to come!


First word
Designing a system like twitter, facebook or airbnb, first step is often User Registry.
The tables, we must use RDBMS, as it’s more reliable.
Table design
Friendship table is important:
Designing a system like twitter, facebook or airbnb, first step is often User Registry.
The tables, we must use RDBMS, as it’s more reliable.
Friendship table is important:
Assuming we use Python to do this.
We can write a simple Python crawler with the code below:
import re, urllib
textfile = file('depth_1.txt','wt')
print "Enter the URL you wish to crawl.."
print 'Usage - "http://phocks.org/stumble/creepy/" <-- With the double quotes'
myurl = input("@> ")
for i in re.findall('''href=["'](.[^"']+)["']''', urllib.urlopen(myurl).read(), re.I):
print i
for ee in re.findall('''href=["'](.[^"']+)["']''', urllib.urlopen(i).read(), re.I):
print ee
textfile.write(ee+'\n')
textfile.close()
scrapy has the tools to manage every stage of a web crawl, just to name a few:
Requests manager - in charge of downloading pages all concurrently behind the scenes! You won’t need to invest a lot of time in concurrent architecture.
Selectors - parse the html document (eg. XPath)
Pipelines - after you retrieve the data, there’s a bunch of functions to modify the data.
Following the spirit of other don’t repeat yourself frameworks, such as Django:
it makes it easier to build and scale large crawling projects by allowing developers to re-use their code.
For more, read Scrapy Architecture .
Scrapy Engine
control data flow
Scheduler
receives requests from the engine and enqueues them for feeding them later
Downloader
Spiders
Item Pipeline
Downloader middlewares
specific hooks that sit between the Engine and the Downloader and process requests
Spider middlewares
specific hooks that sit between the Engine and the Spiders and are able to process spider input (responses) and output (items and requests).
APScheduler? (todo)
add/remove jobs
I chose NoSQL/MongoDB. But why?
there’s only a few tables with few columns
no overly complex associations between nodes
huge amount of time-based data
scaling requirements: MongoDB better horizontal scaling
different field names: dynamical storage
We need to check AJAX response sometime and study each website’s API.
Some site would close certain APIs if they found out too many queries requests.
Study their URL structure.
eg.
www.abc.com/index.html?page=milk&start_index=0
Just play with the url params!
I defined extra column only to store keys (combine a few key columns, and convert to lower-case).
We can search using regex though, but:
Mongo (current version 2.0.0) doesn’t allow case-insensitive searches against indexed fields. For non-indexed fields, the regex search should be fine.
How to go about it:
searching with regex’s case insensitive means that mongodb cannot search by index, so queries against large datasets can take a long time.
Even with small datasets, it’s not very efficient… which could become an issue if you are trying to achieve scale.
As an alternative, you can store an uppercase copy and search against that…
If your field is large, such as a message body, duplicating data is probably not a good option. I believe using an extraneous indexer like Apache Lucene is the best option in that case.
write a sophisticated pipeline()
try not let bad data reach pipeline() - better
Make your spider better!
how? (todo)
输入一个数组，要求输出满足：a[0]<=a[1]>=a[2]<=a[3]>=…
O(n)，一边扫描即可。发现不符合条件的只要跟前面一个数对调就可以，
public int[] solve(int[] input) {
boolean incr = true;
int len = input.length;
int p = 1;
while (p < len) {
if (incr ^ (input[p - 1] < input[p])) {
Common.swap(input, p - 1, p);
}
p++;
incr = !incr;
}
return input;
}
Design a 2D dungeon crawling game. It must allow for various items in the maze - walls, objects, and computer-controlled characters.
Serialize:
if a certain cell has a wall to the North and West but not to the South or East, it would be represented as 1001, or 9… (e.g., “9,6,11,12\n3,10,10,4\n13,9,12,5\n3,6,1,6” in a 4x4 maze)
Design API~
This is most common and one of the simplest ways to generate a maze using a computer. It’s commonly implemented using Recursive backtrack.
from a random cell, select a random neighbour that hasn’t been visited.
removes the ‘wall’ and adds the new cell to a stack.
a cell with no unvisited neighbours is considered dead-end.
When at a dead-end it backtracks through the path until it reaches a cell with unvisited neighbours, continuing from there.
until every cell has been visited, the computer would backtrack all the way to the beginning cell.
Entire maze space is guaranted a complete visit.
To add difficulty and a fun factor to the DFS, you can influence the likelihood of which neighbor you should visit, instead of completely random.
By making it more likely to visit neighbors to your sides, you can have a more horizontal maze generation.
Strategy pattern (also known as the policy pattern) is a design pattern that enables an algorithm’s behavior to be selected at runtime.
For instance, a class that performs validation on incoming data may use a strategy pattern to select a validation algorithm based on the type of data, the source of the data, user choice… These factors are not known until run-time…
Since accelerate and brake behaviors change frequently between models, a common approach is to implement these behaviors in subclasses. This approach has significant drawbacks: accelerate and brake behaviors must be declared in each new Car model.
The strategy pattern uses composition instead of inheritance. This allows:
better decoupling between the behavior and the class that uses it. (i.e. behavior can be changed without breaking the classes that use it)
classes can switch between behaviors by changing the specific implementation used without requiring any significant code changes.
Code:
/* Encapsulated family of Algorithms
* Interface and its implementations
*/
public interface IBrakeBehavior {
public void brake();
}
public class BrakeWithABS implements IBrakeBehavior {
public void brake() {
System.out.println("Brake with ABS applied");
}
}
public class Brake implements IBrakeBehavior {
public void brake() {
System.out.println("Simple Brake applied");
}
}
/* Client which can use the algorithms above interchangeably */
public abstract class Car {
protected IBrakeBehavior brakeBehavior;
public void applyBrake() {
brakeBehavior.brake();
}
public void setBrakeBehavior(IBrakeBehavior brakeType) {
this.brakeBehavior = brakeType;
}
}
/* Client 1 uses one algorithm (Brake) in the constructor */
public class Sedan extends Car {
public Sedan() {
this.brakeBehavior = new Brake();
}
}
/* Client 2 uses another algorithm (BrakeWithABS) in the constructor */
public class SUV extends Car {
public SUV() {
this.brakeBehavior = new BrakeWithABS();
}
}
/* Using the Car Example */
public class CarExample {
public static void main(String[] args) {
Car sedanCar = new Sedan();
sedanCar.applyBrake(); // This will invoke class "Brake"
Car suvCar = new SUV();
suvCar.applyBrake(); // This will invoke class "BrakeWithABS"
// set brake behavior dynamically
suvCar.setBrakeBehavior( new Brake() );
suvCar.applyBrake(); // This will invoke class "Brake"
}
}
This gives greater flexibility in design and is in harmony with the Open/closed principle (OCP) that states that classes should be open for extension but closed for modification.
partition problem is the task of deciding whether a given multiset S of positive integers can be partitioned into two subsets S1 and S2 such that the sum of the numbers in S1 equals the sum of the numbers in S2.
Examples
arr[] = {1, 5, 11, 5}
Output: true
The array can be partitioned as {1, 5, 5} and {11}
arr[] = {1, 5, 3}
Output: false
The array cannot be partitioned into equal sum sets.
DP (only if sum of the elements is not too big).
We can create a 2D array of size (sum/2)*(n+1). And we can construct the solution in bottom up manner such that every filled entry has following property:
part[i][j] =
true if a subset of {arr[0], arr[1], ..arr[j-1]} has sum equal to i
false otherwise
Note that we always cares about whether there exist a valid subset from beginning to index i.
Example DP array for input “3,1,1,2,2,1”:
Say you have an array for which the ith element is the price of a given stock on day i.
Design an algorithm to find the maximum profit. You may complete at most k transactions.
Note:
You may not engage in multiple transactions at the same time (ie, you must sell the stock before you buy again).
Credits:
Special thanks to @Freezen for adding this problem and creating all test cases.
This question is very difficult. We need to do DP with 2 DP arrays, available to read here.
The 2 arrays' definition as follow:
global[i][j]=max(local[i][j],global[i-1][j])
当前到达第i天可以最多进行j次交易，最好的利润是多少（global[i][j]）
当前到达第i天，最多可进行j次交易，并且最后一次交易在当天卖出的最好的利润是多少（local[i][j]）
And the formula for calculating local[] is:
local[i][j]=max(global[i-1][j-1]+max(diff,0),local[i-1][j]+diff)，
第一个是全局到i-1天进行j-1次交易，然后加上今天的交易，如果今天是赚钱的话（也就是前面只要j-1次交易，最后一次交易取当前天），
第二个量则是取local第i-1天j次交易，然后加上今天的差值。
And the final code (by blogger Code_Ganker from the same link) would look like this:
public int maxProfit(int[] prices) {
if(prices==null || prices.length==0)
return 0;
int[] local = new int[3];
int[] global = new int[3];
for(int i=0;i<prices.length-1;i++)
{
int diff = prices[i+1]-prices[i];
for(int j=2;j>=1;j--)
{
local[j] = Math.max(global[j-1]+(diff>0?diff:0), local[j]+diff);
global[j] = Math.max(local[j],global[j]);
}
}
return global[2];
}
Resizable-array implementation of the List interface. (it’s actually an array of Object)
It’s not synced.
Random access – no need to traverse thru all nodes.
Circular array - Array size is pre-defined. Use head and tail to keep track of list position.
Insertion and deletion - Implement shiftRight() and shiftLeft() methods.
Actual code will come later…
Both Static class and Inner class are called nested class.
The purpose of a nested class is to clearly group the nested class with its surrounding class, signaling that these two classes are to be used together.
Now the 2 types:
Declare:
public class Outer {
public static class Nested {
}
}
Instantiate (just like a normal class):
Outer.Nested instance = new Outer.Nested();
public class Outer {
public class Inner {
}
}
Instantiate (you MUST have an instance of enclosing class, and look weird the ‘new’ keyword looks):
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
Inner class can access private members in enclosing class (static or non-static).
public class Outer {
private String text = "I am private!";
public class Inner {
public void printText() {
System.out.println(text);
}
}
}
Static class cannot access non-static members.
Java has no way of making a top-level class static but you can simulate a static class like this:
Declare your class final
Make the constructor private
Make all the members and functions of the class static
(this basically is a Singleton)
The class Exception and its subclasses are a form of Throwable that indicates conditions that a reasonable application might want to catch.
An exception is an event, which occurs during the execution of a program, that disrupts the normal flow of the program’s instructions.
When an error occurs within a method, the method creates an object and hands it off to the runtime system. The object, called an exception object, contains information about the error(eg. type, state etc).
Creating an exception object and handing it to the runtime system is called throwing an exception.
After a method throws an exception, the runtime system (i.e. JVM) attempts to find something to handle it. This is exception handler.


Press n or j to go to the next uncovered block, b, p or k for the previous block.
| File | Statements | Branches | Functions | Lines | |||||
|---|---|---|---|---|---|---|---|---|---|
| actions |
|
94.58% | 192/203 | 53.33% | 16/30 | 100% | 45/45 | 93.92% | 170/181 |
| components/auth |
|
95.45% | 42/44 | 100% | 6/6 | 88.89% | 16/18 | 100% | 42/42 |
| components/dashboard |
|
95.65% | 22/23 | 100% | 4/4 | 90% | 9/10 | 100% | 22/22 |
| components/layout |
|
89.29% | 25/28 | 100% | 8/8 | 70% | 7/10 | 100% | 25/25 |
| components/posts |
|
95.4% | 83/87 | 100% | 33/33 | 87.5% | 28/32 | 100% | 83/83 |
| components/profile-forms |
|
98.98% | 97/98 | 100% | 82/82 | 98.31% | 58/59 | 100% | 97/97 |
| components/profiles |
|
98.54% | 135/137 | 100% | 94/94 | 95.74% | 45/47 | 100% | 135/135 |
| components/routing |
|
83.33% | 5/6 | 100% | 4/4 | 66.67% | 2/3 | 100% | 5/5 |
| reducers |
|
97.44% | 38/39 | 100% | 38/38 | 87.5% | 7/8 | 100% | 38/38 |
| utils |
|
100% | 4/4 | 100% | 2/2 | 100% | 1/1 | 100% | 4/4 |


Plan your business trip to Africa.
Book your flight, hotel, ground transport and get connected with our wide African network.
Travel
Networking
Logistics
Travel
Networking
Logistics
Millions of people need help in
their logistics & finding the
right people in Africa.
No more filling forms for
seperate services. We book
your flight, hotel, driver and
even meetings.
Travel confidently to Africa.
We have your back.
Learn More
We currently service the large cities in Morocco. Ivory
Coast, Nigeria, Ethiopia and South Africa.
Let us know if you want us in another city/country.


I am a graduate of computer science from Long Island University in downtown Brooklyn, New York. This site contains information about my academic background, and interests, which include biking, gaming and just flat out having a heck of a good time with family and friends. I have two degrees, a Bachelors in Business Adminstration: (1998) from American Intercontinetal University Atlanta, Georgia and a Masters degree in computer science: (2013) from Long Island University Brooklyn, New York. A rambling and subjective biography follows.
I enjoy writing front-end code with these technologies


The Go Bootcamp is a 1 day class providing a comprehensive and idiomatic overview of the Go programming language. We will cover topics ranging from language syntax, Go's approach to object-oriented semantics, concurrency, channels and more. This class is great for anyone wanting to get a jump start on learning Go or wanting to understand more about the language and internals!
William Kennedy works in Miami, FL as a managing partner at Ardan Studios: a mobile, web and systems development company. He is also the co-author of the book Go In Action, the author of the blog GoingGo.Net and the organizer for Miami's Go and MongoDB meetups.
Working with data is a core component of many applications, and Go has great support for working with many different types of databases. In this workshop, we will cover the use of MongoDB to store and retrieve data with the mgo driver. Following this, you will learn best practices for building packages and apps that work with and expose data from any database.
Discover the full breadth and depth of the Go development and analysis tools available today. We will explore the go tool, golint, oracle, profiling, and various other utilities that will bolster your efficiency and capabilities as a developer. If you know the language and libraries but haven’t had time to peruse the toolchain, this is a great opportunity to learn about what you’ve been missing!
Come early and beat the registration lines.
The Go standard library provides a lot of great utility for building web applications and APIs, but it can sometimes it can be difficult to figure out how to build things the “right” way. In this two part workshop Jeremy and Mark will walk you through build web applications and APIs using the standard library and a few third party packages to make building applications fun and easy. Over the two parts Mark and Jeremy will build a web application with an Angular front-end that talks JSON to Go. Middleware, rendering, error handling, routing, testing, and more will covered.
Galvanize, 1062 Delaware Street, Denver, CO


| Shifting Scroll
| 0
| Common
| Mage
| 2
|
|
| Arcane Artificer
| 1
| Common
| Mage
| 2
|
|
| Barkskin
| 1
| Common
| Druid
| 2
|
|
| Candleshot
| 1
| Common
| Hunter
| 2
|
|
| Dark Pact
| 1
| Common
| Warlock
| 2
|
|
| Dire Mole
| 1
| Common
| Neutral
| 2
|
|
| Feral Gibberer
| 1
| Rare
| Neutral
| 2
| 1
|
| Gravelsnout Knight
| 1
| Rare
| Neutral
| 2
|
|
| Kingsbane
| 1
| Legendary
| Rogue
| 1
|
|
| Kobold Librarian
| 1
| Common
| Warlock
| 2
| 1
|
| Lesser Jasper Spellstone
| 1
| Rare
| Druid
| 2
|
|
| Psionic Probe
| 1
| Common
| Priest
| 2
|
|
| Unstable Evolution
| 1
| Epic
| Shaman
| 2
|
|
| Wax Elemental
| 1
| Common
| Neutral
| 2
|
|
| Bladed Gauntlet
| 2
| Epic
| Warrior
| 1
|
|
| Cavern Shinyfinder
| 2
| Common
| Rogue
| 2
|
|
| Cheat Death
| 2
| Common
| Rogue
| 2
|
|
| Crushing Hand
| 2
| Common
| Shaman
| 2
|
|
| Drygulch Jailor
| 2
| Common
| Paladin
| 2
|
|
| Drywhisker Armorer
| 2
| Common
| Warrior
| 2
| 1
|
| Evasion
| 2
| Epic
| Rogue
| 1
|
|
| Kobold Hermit
| 2
| Common
| Shaman
| 2
|
|
| Lesser Pearl Spellstone
| 2
| Rare
| Paladin
| 2
| 2
|
| Lesser Ruby Spellstone
| 2
| Rare
| Mage
| 2
|
|
| Murmuring Elemental
| 2
| Rare
| Shaman
| 2
|
|
| Plated Beetle
| 2
| Common
| Neutral
| 2
|
|
| Potion of Heroism
| 2
| Common
| Paladin
| 2
|
|
| Raven Familiar
| 2
| Common
| Mage
| 2
| 1
|
| Scorp-o-matic
| 2
| Rare
| Neutral
| 2
|
|
| Sudden Betrayal
| 2
| Common
| Rogue
| 2
| 1
|
| Vulgar Homunculus
| 2
| Common
| Warlock
| 2
|
|
| Wandering Monster
| 2
| Rare
| Hunter
| 2
|
|
| Benevolent Djinn
| 3
| Common
| Paladin
| 2
|
|
| Boisterous Bard
| 3
| Common
| Neutral
| 2
|
|
| Cave Hydra
| 3
| Common
| Hunter
| 2
|
|
| Dragonslayer
| 3
| Common
| Neutral
| 2
| 1
|
| Explosive Runes
| 3
| Rare
| Mage
| 2
|
|
| Fungal Enchanter
| 3
| Common
| Neutral
| 2
|
|
| Gilded Gargoyle
| 3
| Common
| Priest
| 2
| 1
|
| Greedy Sprite
| 3
| Rare
| Druid
| 2
|
|
| Healing Rain
| 3
| Common
| Shaman
| 2
| 1
|
| Kobold Apprentice
| 3
| Common
| Neutral
| 2
|
|
| Kobold Barbarian
| 3
| Rare
| Warrior
| 2
| 1
|
| Lone Champion
| 3
| Rare
| Neutral
| 2
|
|
| Primal Talismans
| 3
| Rare
| Shaman
| 2
| 1
|
| Rummaging Kobold
| 3
| Epic
| Neutral
| 1
|
|
| Sewer Crawler
| 3
| Common
| Neutral
| 2
|
|
| Shrieking Shroom
| 3
| Common
| Neutral
| 2
|
|
| Stoneskin Basilisk
| 3
| Common
| Neutral
| 2
|
|
| Toothy Chest
| 3
| Common
| Neutral
| 2
|
|
| Twilight Acolyte
| 3
| Epic
| Priest
| 1
|
|
| Twilight's Call
| 3
| Rare
| Priest
| 2
|
|
| Unidentified Elixir
| 3
| Common
| Priest
| 2
| 1
|
| Unidentified Maul
| 3
| Rare
| Paladin
| 2
|
|
| Astral Tiger
| 4
| Epic
| Druid
| 1
|
|
| Branching Paths
| 4
| Epic
| Druid
| 1
|
|
| Cataclysm
| 4
| Epic
| Warlock
| 1
|
|
| Cursed Disciple
| 4
| Common
| Neutral
| 2
|
|
| Duskbreaker
| 4
| Rare
| Priest
| 2
|
|
| Ebon Dragonsmith
| 4
| Rare
| Neutral
| 2
|
|
| Elven Minstrel
| 4
| Rare
| Rogue
| 2
|
|
| Flanking Strike
| 4
| Common
| Hunter
| 2
|
|
| Hoarding Dragon
| 4
| Common
| Neutral
| 2
|
|
| Hooked Reaver
| 4
| Rare
| Warlock
| 2
| 1
|
| Ironwood Golem
| 4
| Common
| Druid
| 2
| 1
|
| Kobold Illusionist
| 4
| Rare
| Rogue
| 2
| 1
|
| Kobold Monk
| 4
| Rare
| Neutral
| 2
|
|
| Lesser Amethyst Spellstone
| 4
| Rare
| Warlock
| 2
|
|
| Leyline Manipulator
| 4
| Rare
| Mage
| 2
|
|
| Oaken Summons
| 4
| Common
| Druid
| 2
| 1
|
| Shimmering Courser
| 4
| Epic
| Neutral
| 1
|
|
| Shroom Brewer
| 4
| Common
| Neutral
| 2
|
|
| Sneaky Devil
| 4
| Common
| Neutral
| 2
|
|
| Arcane Tyrant
| 5
| Epic
| Neutral
| 2
|
|
| Carnivorous Cube
| 5
| Epic
| Neutral
| 1
|
|
| Corrosive Sludge
| 5
| Common
| Neutral
| 2
| 1
|
| Deck of Wonders
| 5
| Epic
| Mage
| 2
|
|
| Fungalmancer
| 5
| Common
| Neutral
| 2
|
|
| Furbolg Mossbinder
| 5
| Rare
| Neutral
| 2
|
|
| Green Jelly
| 5
| Common
| Neutral
| 2
|
|
| Guild Recruiter
| 5
| Common
| Neutral
| 2
|
|
| Lesser Emerald Spellstone
| 5
| Rare
| Hunter
| 2
|
|
| Lesser Onyx Spellstone
| 5
| Rare
| Rogue
| 2
|
|
| Trogg Gloomeater
| 5
| Common
| Neutral
| 2
| 1
|
| Windshear Stormcaller
| 5
| Epic
| Shaman
| 1
|
|
| Crystal Lion
| 6
| Rare
| Paladin
| 2
|
|
| Gather Your Party
| 6
| Rare
| Warrior
| 2
|
|
| Gemstudded Golem
| 6
| Common
| Warrior
| 2
| 1
|
| Grumble, Worldshaker
| 6
| Legendary
| Shaman
| 1
|
|
| Hungry Ettin
| 6
| Rare
| Neutral
| 2
|
|
| Level Up!
| 6
| Epic
| Paladin
| 1
|
|
| Possessed Lackey
| 6
| Rare
| Warlock
| 2
|
|
| Rin, the First Disciple
| 6
| Legendary
| Warlock
| 1
|
|
| Seeping Oozeling
| 6
| Rare
| Hunter
| 2
|
|
| Spiteful Summoner
| 6
| Epic
| Neutral
| 2
|
|
| Unidentified Shield
| 6
| Common
| Warrior
| 2
| 1
|
| Val'anyr
| 6
| Legendary
| Paladin
| 1
|
|
| Crushing Walls
| 7
| Epic
| Hunter
| 1
|
|
| Lesser Diamond Spellstone
| 7
| Rare
| Priest
| 2
|
|
| Lesser Mithril Spellstone
| 7
| Rare
| Warrior
| 2
|
|
| Psychic Scream
| 7
| Epic
| Priest
| 2
|
|
| Silver Vanguard
| 7
| Common
| Neutral
| 2
|
|
| Temporus
| 7
| Legendary
| Priest
| 1
|
|
| Grand Archivist
| 8
| Epic
| Neutral
| 1
|
|
| Grizzled Guardian
| 8
| Rare
| Druid
| 2
|
|
| King Togwaggle
| 8
| Legendary
| Neutral
| 1
|
|
| Marin the Fox
| 8
| Legendary
| Neutral
| 1
|
|
| The Runespear
| 8
| Legendary
| Shaman
| 1
|
|
| Violet Worm
| 8
| Common
| Neutral
| 2
|
|
| Sleepy Dragon
| 9
| Common
| Neutral
| 2
|
|
| Voidlord
| 9
| Epic
| Warlock
| 1
|
|


Tesla House Concept Looks Sleek, Shows "Puzzle" Garage
by Andrei TutuWhile the debate on the design of the Tesla Cybertruck continues to keep the Internet on its toes, the Palo Alto automaker is enjoying extra exposure. For instance, Tesla's philosophy is now being applied to various fields where the company is not active, with these efforts coming from independent artists who render dreams such as the Tesla House we have here.
We're looking at a minimalist structure that features angular design, while large glass areas dominate the house. Of course, such a building would involve uber-modern materials and techniques, which should limit one's worries about thermal efficiency or privacy, for that matter.
The first level of the house is shaped in a way that makes one think of a puzzle garage, as it is shaped in a way that allows it to perfectly accommodate a Cybertruck. And you can expect this kind of proposal to include a solid charging infrastructure in its plans.
The living-space adventure we have here comes from Alexander Nerovnya, a Russian architect who shares his vision with the world via Instagram.
"From the standpoint of modern extreme minimalism, coupled with a touch of the 80's industrial design aesthetic, the look of the Tesla truck actually makes sense. Where Tesla uses shockingly simple shapes to design machines for the future, we at Alex Nerovnya Architecture use similar tools to visualize what might be just around the corner for architecture," the artist explains in the post portraying the structure.
Those of you who find this kind of design philosophy appealing should also check out the second Instagram post below, which sees the design master introducing a Tesla CyberTrailer, whose design is not unlike that of the house mentioned above.
And if the Tesla House, with the said garage solution, seems extreme, you should check out the Russian architect's proposal for rebuilding the roof of the Notre-Dame Cathedral in Paris - you'll find this in the third and fourth Instag posts below.
Following the fire that ruined an important part of the cathedral, Nerovnya came up with a solution involving a glass roof. This was submitted as part of a competition the French authorities launched in order to rebuild Notre-Dame.
"When the architectural competition for the reconstruction of Notre Dame takes place, the roof will be glass. The interior, as it should be in the Gothic Cathedral will be dark. The stained glass Windows weren't damaged," the artist mentions in the second Instagram post below.
No winner has been selected yet, and while French president Emmanuel Macron has vowed to complete the restoration in five years, nothing seems certain at the moment.


This is a about a young girl who wants very badly
to journey to the Great Salt Lake Valley, Utah, USA.
The setting is 1850.
[PLACEHOLDER]
Fourteen-year-old Alfred Cutler is living on the family
sheep ranch in the woods during the late nineteenth century.
One day, his pa comes home with distressing news—a large pack
of wolves has come to the area, spreading fear throughout the
rural community of Dunborough. Pa is worried his flock is in
danger because he has not finished the new fold yet. Will they
be able to protect the family sheep against this four-footed,
blood-thirsty band of marauders?
This is a story about a fantasy world
[PLACEHOLDER]
Fourteen-year-old Alfred Cutler is living on the family
sheep ranch in the woods during the late nineteenth century.
One day, his pa comes home with distressing news—a large pack
of wolves has come to the area, spreading fear throughout the
rural community of Dunborough. Pa is worried his flock is in
danger because he has not finished the new fold yet. Will they
be able to protect the family sheep against this four-footed,
blood-thirsty band of marauders?
Please Note: All characters and events in this story are completely ficticious. Any similarities between people, either living or dead, and circumstances, either current or past, are purely coincidental.


File | Database provides a quick way to switch databases in INCC, without replacing the primary default INCC database. The menu command opens a list dialog. The current database path is the first entry in the list. The additional entries in the list are for adding paths to other databases. To change a database, 1) check the box to the left of the desired database, 2) select the “OK” button to switch to the new INCC database.
To add a database to the list of database choices, 1) select the list entry to hold the path to the new database, 2) use the “Select” button to navigate to the database folder of an INCC database, 3) then when the folder with the correct filename is found, select “Open”, 4) the new database location will be placed in the list entry selected. Note that an INCC database folder must contain the database file ncc_db.dbd, the file dialog operation in step 3 will not accept a database folder section without the presence of this file. Additional checking occurs to detect if the selected database is compatible with current INCC software. The operation in step 3 will not open an INCC database from version prior to 5.00. Attempting to open an INCC database version prior to 5.00 generates an informational warning message. Please refer to see File | Restore All Data above for the correct procedure for accessing an INCC database version prior to INCC 5.00.
In a standalone INCC installation, the selected databases and last current database information is retained across INCC invocations. The last database accessed using the database switch feature will be the default database for INCC the next time INCC is started.
Note: when INCC runs under the control of a LANL Integrated Review System (IRS) configuration, database choices are temporary, changes are not retained after INCC is closed. INCC will restart using the IRS configured INCC database. The location of the earlier database choice is retained for convenience.


Uh oh, something bad happened!
The page couldn't be loaded because of an error in the system. Please let me know about this if you think it's severe!
The page couldn't be loaded because of an error in the system. Please let me know about this if you think it's severe!


WITNESS LIST Elections Committee (Subcommittee on Subcommittee on HB 331 -Processes and Pr) March 20, 1997-2:00P HB 1350 On: Steve McDonald (Tx Dem Pty) HB 1351 For: James Randall (himself) Mike Workman (himself) Steve McDonald (Tx Dem Pty) HB 1400 For: Amy Whitmer (Hart Info. Svs.) Mike Workman (himself) Steve McDonald (Tx Dem Pty) Against: James Randall (himself) Lester Van Pelt III (Repub Pty Tx) On: Melinda Nickless (Secy of State) Registering, but not testifying: For: Homero Lucero (Bexar Cty Comm Ct) On: Elizabeth Hanshaw-Ross (Secy of STate) HB 1652 For: Lester Van Pelt III (Repub Pty Tx) MIKE WORKMAN (himself) Steve McDonald (Tx Dem Pty) On: James Randall (himself) Registering, but not testifying: For: Homero Lucero (Bexar Cty Comm Ct) HB 1966 On: Melinda Nickless (Secy of State) Registering, but not testifying: On: Elizabeth Hanshaw-Ross (Secy of State)


atlp |
Routines for parsing, writing and accessing ATL formulas.
|
atm |
External header file for the package Atm.
|
dddmp |
Functions to read in and write out bdds to file
|
enum |
This is header file that should be included by any applicaition
|
img |
Methods for performing image computations.
|
intf |
|
inv |
Routines for parsing, writing and accessing invariants.
|
main |
External header file for the main package.
|
mc |
Fair CTL model checker and debugger.
|
mdl |
Building Modules and Performing Various Operations.
|
mvf |
Creation and manipulation of MDD-based multi-valued functions.
|
prs |
External header files from parser.
|
ref |
routines for refinement checking between modules
|
rtm |
Timing verification
|
sim |
External header file for simulation.
|
sl |
A small script secretful language
|
sym |
building symbolic transition relation for a module
|
trc |
|
var |
Data structures and routines to manipulate variables and
|


Encrypted Instant Messenger
If you are currently using an Instant Messenger like Telegram, LINE, Viber, WhatsApp, or plain SMS you should pick an alternative here.
{% include cardv2.html
title="Signal"
image="/assets/img/tools/Signal.png"
description="Signal is a mobile app developed by Open Whisper Systems. The app provides instant messaging, as well as voice and video calling.
All communications are end-to-end encrypted. Signal is free and open source."
labels="success:VoIP"
website="https://signal.org/"
forum="https://forum.privacytools.io/t/discussion-signal/664"
github="https://github.com/signalapp"
windows="https://signal.org/download/"
mac="https://signal.org/download/"
linux="https://signal.org/download/"
googleplay="https://play.google.com/store/apps/details?id=org.thoughtcrime.securesms"
android="https://signal.org/android/apk/#apk-danger"
ios="https://apps.apple.com/us/app/signal-private-messenger/id874139669"
%}
{% include cardv2.html
title="Wire"
image="/assets/img/tools/wire.png"
description="A free software End-to-End Encrypted chatting application that supports instant messaging, voice, and video calls. Full source code is available."
labels="warning:Warning:Wire stores some plaintext metadata about its users on their servers. This data includes profile names, profile pictures, usernames, and users' lists of connections and conversations.|success:VoIP"
website="https://wire.com/"
forum="https://forum.privacytools.io/t/discussion-wire/750"
github="https://github.com/wireapp/"
windows="https://wire.com/en/download"
mac="https://wire.com/en/download"
linux="https://wire.com/en/download"
googleplay="https://play.google.com/store/apps/details?id=com.wire"
android="https://wire.com/en/download"
ios="https://itunes.apple.com/app/wire/id930944768?mt=8"
web="https://app.wire.com"
%}
Complete Comparison
Worth Mentioning
- Briar - An ultra-secure peer-to-peer instant messenger that connects to contacts via Direct Wi-Fi, Bluetooth, or Tor over the internet, keeping its users protected from surveillance and censorship.
- RetroShare - An E2E encrypted instant messaging and voice/video call client. RetroShare supports both TOR and I2P.
- XMPP - Federated instant messaging protocol with OMEMO, OTR, or OpenPGP end-to-end encryption:
- Conversations (Android) - An open source Jabber/XMPP client for Android 4.4+ smartphones. OMEMO
- Gajim (FreeBSD, Linux, Windows) - An open source fully featured XMPP client. OMEMO
- Monal (iOS, MacOS) - An XMPP client in active development. OMEMO VoIP
- Other OMEMO ready clients.
- Kontalk - A community-driven instant messaging network. Supports end-to-end encryption. Both client-to-server and server-to-server channels are fully encrypted.
- Keybase - Warning End-to-end encrypted messaging with social verification.
- Status - Experimental A free and open-source, peer-to-peer, encrypted instant messanger with support for DAPPs.
- Tox - Experimental A free and open-source, peer-to-peer, encrypted instant messaging and video calling software. VoIP
- Jami (formerly Ring/SFLphone) - Gives you full control over your communications and an unmatched level of privacy. Jami has text messaging, video and audio calls, file transfer, video conferencing. VoIP
Related Information


A comment I hear frequently after a visit is, “That looked nothing like what I thought it would.” It’s a good place to start a discussion about the total redesign a flipped classroom brings.
A major criticism of the flipped classroom is that lecture is given as homework, and homework becomes the new class work. This view is too simplistic and leads to a labyrinth of other misconceptions. The main part of this argument assumes a flipped classroom simply injects video into a traditional teaching format. Assignments are not modified and class expectations do not change.
I think of this like adding more salt to saltines. It may increase the flavor a little, but you are not doing anything revolutionary to that cracker. Inevitably, the saltine tastes the same.
In order to leverage the power of video, either as instruction or as extension, you have to rethink what class looks like.
I do not have a preference where my students learn chemistry. I have a group that watches the videos the night before and then uses class time (extremely effectively, I might add) to work through challenge problems, labs, quizzes, and projects. In the same class, I have two students that work 30-35 hours each week outside of school. They use the class time to watch the videos together and then move forward. They rarely do chemistry at home, which is fine with me. Yet a third group does most of their chemistry at home, checks with me in class, and then moves on to geometry for the rest of the period. Each group is totally different than the others, but they are still learning.
I had to re-think what class looks like when information is available anywhere, any time.
Learning about and moving to a flipped classroom requires that you shift your thinking about class time in general. Your role, as the teacher, changes entirely. You have to be okay with students using class to learn chemistry, or using it to learn english, or math, or history. Part of the beauty in a flipped classroom is that it is no longer limited to my content. I can learn alongside students every day.  So. Cool.)
At this point, you may be thinking, “This sounds like something that could easily end up in anarchy.” I want to reassure you, that although this sounds uncoordinated and chaotic, it is a good, fulfilling chaos. Students are engaged in their learning. They are coaching one another through hard questions. Groups form spontaneously, based on self-identified needs. There is freedom to be wrong, free from a fear of failure or negative consequence. Since the class is student time, the “noise” is really hypothesis, creation, and critique in their purest forms. Also bear in mind, this change does not happen overnight. This movement requires a shift that has to occur in both the student’s, as well as the teacher’s, perception of school and the learning process. This requires a healthy investment of time and energy.
Don’t simply salt your class with video and call it a flipped classroom. Many teachers begin by adding some of the new with the old, but that approach will rapidly stagnate and your class will not feel any different than when you started. Challenge yourself to think outside the box about the time in class. Ask students for their opinions. You could even go so far as to implement an iteration of Google’s now-famous 20% time initiatives. By simply allowing for flexibility, your class dynamic can change dramatically.
Time spent in school should be spent meeting your student’s learning needs, not defining learning for them. We seem to have lost that vision in the age of industrialized education.
A true flip is not in when or where videos are assigned…it is time to go deeper. Flip your thinking about where learning happens and work with students on making the change.
Written on May 16th, 2012 by Brian Bennett Categorized in: All Flipclass Teaching
Leave a comment


Tables
Relationships
Utility Tables
Constraints
Anomalies
Columns
Donate
SchemaSpy Analysis of
zot
- Utility Tables
Generated by
SchemaSpy
Generated by
SchemaSpy
on on aug 19 21:08 CEST 2015
Legend:
Primary key columns
Columns with indexes
Excluded column relationships
Dashed lines show implied relationships
<
n
> number of related tables
Hide tables with implied relationships