type Present = (
cursor: Cursor<any>,
...args: any[]
) => Markup;
Restate is a ~1 KB gzipped, virtual DOM-based, React-inspired, reasonably performant JavaScript library for building interactive HTML.
In Restate, you pass a value representing your application’s state and a function to present it as HTML (or, more generally, as DOM objects). Restate will then call your present function any time the state changes to get the new HTML it corresponds to.
Similarly to Elm and Redux, there’s a single state value and a pure HTML-producing function; state mutation is more like React’s. Compared to other libraries, it doesn’t need keys, reified actions nor immutable data structures to achieve similar optimizations in most cases.
This is its commented source code. See examples and get the library on GitHub!
This is all just an experiment. I haven’t even used it that much. It may be broken, maybe irremediably so.
Typically, your state will be a tree: either an object or an array with other objects and arrays inside. If only some parts of your state change, Restate is smart enough to only generate HTML for the parts that changed, if you help a bit.
A present function turns a node from the state tree into markup (typically, HTML). It may also take additional arguments.
You’ll want to make one of these for each node in your state tree. This way, Restate will remember the Markup each of these produced and, when refreshing the page’s markup, only call those whose state node and arguments changed.
A Present function should always produce the same Markup given the same state and arguments for this optimization to work.
type Present = (
cursor: Cursor<any>,
...args: any[]
) => Markup;
Markup represents a DOM node as a tuple.
type Markup =
it’s either an element…
Elem
… or a text node.
| {toString: () => string}
;
Elem is a representation of a DOM element.
type Elem = [
It has a tag name: p
, div
, a
, etc.
string,
It has attributes, like: {href: 'http://example.com', class: 'example'}
Dict<string | Function>,
And it has children.
Markup[]
];
Dict is an alias for an object with arbitrary keys.
type Dict<T> = {[key: string]: T};
A present function is handed a cursor that points to a node in the state tree.
From this cursor, it can walk the tree, getting cursor for parent and child nodes.
A present function will typically call child
to get a cursor for a
child node from the state tree, and then present
to include the child’s
HTML into its own.
By calling set
, a new presentation is triggered and new HTML to replace
the old one is generated by the present functions. Only the cursor’s
associated state tree node and its children are assumed to have possibly
changed; other nodes are assumed unchanged. This way, Restate can avoid
redundant calls to present functions by reusing parts of the old HTML
instead.
type Cursor<State> = {
parent: Cursor<any> | null;
root: Cursor<any>;
child: (key: StateKey) => Cursor<any> | null;
state: State;
set: (newState: State) => void;
present: (present: Present, ...presentArgs: any[]) => Markup;
};
type StateKey = string | number;
Restate
is the only variable exported by the library. It takes the DOM
element on which to put the DOM Restate produces, and the root of the
state tree with its present function.
const Restate: (
rootElement: Element,
rootState: any,
present: Present,
...presentArgs: any[]
) => void = (() => {
From here on, it’s all implementation details. Maybe some day it will be commented too!
let { setAttribute, removeAttribute, appendChild, removeChild, replaceChild, insertBefore } = Element.prototype;
let { createElement, createTextNode } = document;
onDOMOperation
may be a function to be notified about the DOM operations
the library performs. Useful for testing.
We rely on minifiers to get rid of the overhead in case it’s null
, by
removing the whole if
block.
let onDOMOperation: ((operation: any) => void) | null = null;
if (onDOMOperation) {
setAttribute = function(this: any, name: string, value: any) {
onDOMOperation!({
type: 'setAttribute',
element: this,
name: name,
value: value,
});
return this.setAttribute(name, value);
};
removeAttribute = function(this: any, name: string) {
onDOMOperation!({
type: 'removeAttribute',
element: this,
name: name,
});
this.removeAttribute(name);
};
appendChild = function(this: any, child: Node) {
onDOMOperation!({
type: 'appendChild',
parent: this,
child: child,
});
return this.appendChild(child);
};
removeChild = function(this: any, child: Node) {
onDOMOperation!({
type: 'removeChild',
parent: this,
child: child,
});
return this.removeChild(child);
};
replaceChild = function(this: any, newChild: Node, oldChild: Node) {
onDOMOperation!({
type: 'replaceChild',
parent: this,
newChild: newChild,
oldChild: oldChild,
});
return this.replaceChild(newChild, oldChild);
};
insertBefore = function(this: any, newChild: Node, refChild: Node) {
onDOMOperation!({
type: 'insertBefore',
parent: this,
newChild: newChild,
refChild: refChild,
});
return this.insertBefore(newChild, refChild);
};
createElement = function(this: any, tagName: string) {
let e = this.createElement(tagName);
onDOMOperation!({
type: 'createElement',
element: e,
});
return e;
};
createTextNode = function(this: any, text: string) {
let node = this.createTextNode(text);
onDOMOperation!({
type: 'createTextNode',
node: node,
});
return node;
};
}
function realizeAttr(e: Element, name: string, value: string | Function | null) {
if (typeof value !== 'string') {
(e as Dict<any>)[name] = value;
} else if (value) {
setAttribute.call(e, name, value);
if (name === 'value') {
value isn’t just an attribute, but a field in the underlying node object that isn’t set when the attribute is set.
(e as any).value = value;
}
} else {
removeAttribute.call(e, name);
}
};
function realizeDOM(virtual: Markup): Node {
if (!(virtual instanceof Array)) {
return createTextNode.call(document, virtual.toString());
}
let [tagName, attrs, children] = virtual;
let e = createElement.call(document, tagName);
for (let attr in attrs) {
realizeAttr(e, attr, attrs[attr]);
}
children.forEach((child) => {
appendChild.call(e, realizeDOM(child));
});
return e;
};
return (
rootElement: Element,
rootState: any,
present: Present,
...presentArgs: any[]
): void => {
while (rootElement.firstChild) {
removeChild.call(rootElement, rootElement.firstChild);
}
Here’s where the magic happens, mostly.
let updateDOM = (
parent: Node,
e: Node,
oldDOM?: Markup,
newDOM?: Markup,
): void => {
if (oldDOM === newDOM) {
} else if (newDOM === undefined) {
Nothing at new DOM; remove the old real DOM node from its parent.
removeChild.call(parent, e);
} else if (oldDOM === undefined) {
New node; just append it, as we know pos will be the last one, given there’s no corresponding node in the old DOM.
appendChild.call(parent, realizeDOM(newDOM));
} else if (!(newDOM instanceof Array)) {
New text node.
if (oldDOM != newDOM) {
Only replace if contents changed.
replaceChild.call(parent, realizeDOM(newDOM), e);
}
} else {
let [ oldTag, oldAttrs, oldChildren ] = oldDOM as Elem;
let [ newTag, newAttrs, newChildren ] = newDOM as Elem;
if (oldTag != newTag) {
If tags differ, throw old away.
replaceChild.call(parent, realizeDOM(newDOM), e);
return;
}
let newKeys: (string | undefined)[] = Object.keys(newAttrs);
newKeys.sort();
let i = 0;
let oldKeys = Object.keys(oldAttrs);
oldKeys.sort();
newKeys.concat([undefined]).forEach((newK) => {
while (i <= oldKeys.length) { // Will yield past the array, so last oldVal will be undefined.
let oldK = oldKeys[i];
let oldVal = oldAttrs[oldK];
let newVal = newAttrs[newK as string /* undefined yields undefined value, so it's fine */];
if (oldK == newK) {
if (oldVal != newVal) {
realizeAttr(e as Element, newK, newVal);
}
i++; return; // Advance both.
}
if (newK === undefined || newK > oldK) {
Got deleted.
realizeAttr(e as Element, oldK, null);
i++; continue; // Advance oldK.
}
Got added.
realizeAttr(e as Element, newK, newVal);
return; // Advance newK.
}
});
Here’s the gist of it: since we memoize Markups, and only Markups associated with state that changed gets regenerated, we can just assume the same child still has the same Markup object, even if the child got reordered with respect to its parent, and just use identity comparison to find its corresponding DOM node.
let newPositions = new Map<Markup, number>();
newChildren.forEach((c, newPos) => {
newPositions.set(c, newPos);
});
let swaps = new Map<number, number>();
oldChildren.forEach((c, oldPos) => {
let swapped = swaps.get(oldPos);
if (swapped !== undefined) {
oldPos = swapped;
}
let newPos = newPositions.get(c);
if (newPos === undefined || newPos === oldPos || newPos >= oldChildren.length) {
return;
}
swaps.set(newPos, oldPos);
});
swaps.forEach((l, r) => {
if (l > r) {
let tmp = l;
r = l;
l = tmp;
}
let tmp = oldChildren[l];
oldChildren[l] = oldChildren[r];
oldChildren[r] = tmp;
let lNode = e.childNodes[l];
let rNode = e.childNodes[r];
let rNext = rNode.nextSibling;
insertBefore.call(e, rNode, lNode);
insertBefore.call(e, lNode, rNext)
});
let realChildren: Node[] = [];
Array.prototype.forEach.call(e.childNodes, v => realChildren.push(v));
for (let i = 0; i < Math.max(newChildren.length, oldChildren.length); i++) {
updateDOM(e, realChildren[i], oldChildren[i], newChildren[i]);
}
}
};
const updateRootElement = (() => {
let currentDOM: Markup | undefined;
return (newDOM: Markup) => {
updateDOM(rootElement, rootElement.childNodes[0], currentDOM, newDOM);
currentDOM = newDOM;
};
})();
type CachedMarkup = {
cached: [ Present, any[], Markup ] | undefined,
children: CachedMarkups | undefined,
};
type CachedMarkups = CachedMarkup[] | Dict<CachedMarkup>;
function cachedMarkupsForKey<K>(markups: CachedMarkups): K extends number ? CachedMarkup[] : Dict<CachedMarkup> {
return markups as (K extends number ? CachedMarkup[] : Dict<CachedMarkup>);
}
let rootCachedMarkup = {} as CachedMarkup;
const makeCursor = (
state: any,
path: StateKey[],
cachedMarkup: CachedMarkup,
updatingPath: StateKey[],
root?: Cursor<any>,
parent?: Cursor<any>,
): Cursor<any> => {
let [updatingKey, ...nextUpdatingPath] = updatingPath;
if (updatingPath.length == 1) {
We’ve reached the end of the updating cursor. Subtree shouldn’t use saved DOMs anymore, as they may change.
cachedMarkup = {} as CachedMarkup;
}
cachedMarkup.children = cachedMarkup.children || (state instanceof Array ? [] : {});
let cursor = {
parent: parent || null,
root: root,
child: (key: StateKey) => {
if (state === undefined) {
return null;
}
let markupChildren = cachedMarkupsForKey(cachedMarkup.children as CachedMarkups);
let markupChild = markupChildren[key];
if (markupChild === undefined) {
markupChild = {} as CachedMarkup;
markupChildren[key] = markupChild;
}
return makeCursor(
state[key],
[...path, key],
markupChild,
Only pass nextUpdatingPath is the child is in the updating path.
key === updatingKey ? nextUpdatingPath : [],
root,
cursor as Cursor<any>,
);
},
state: state,
set: (newState: any) => {
let updating: any = rootState;
if (path.length == 0) {
rootState = newState;
} else {
path.forEach((k, i) => {
if (i == path.length - 1) {
updating[k] = newState;
} else {
updating = updating[k];
}
});
}
updateRootElement(present(makeCursor(rootState, [], rootCachedMarkup, path), ...presentArgs));
},
present: (present: Present, ...args: any[]): Markup => {
let cached = cachedMarkup.cached;
if (cached !== undefined && cached[0] === present && args.filter((v, i) => cached![1][i] !== v).length == 0) {
return cached[2];
}
return present(cursor as Cursor<any>, ...args);
},
};
if (root === undefined) {
cursor.root = cursor as Cursor<any>;
root = cursor as Cursor<any>;
}
return cursor as Cursor<any>;
};
updateRootElement(present(makeCursor(rootState, [], rootCachedMarkup, [])));
};
})();


The decimal value of this prime was computed with calc and the English name was computed with number.
two hundred fifty nine cen-un-sexagin-tillion, one hundred seventeen cen-sexagin-tilliard, eighty six cen-sexagin-tillion, thirteen cen-novem-quinquagin-tilliard, two hundred two cen-novem-quinquagin-tillion, six hundred twenty seven cen-octo-quinquagin-tilliard, seven hundred seventy six cen-octo-quinquagin-tillion, two hundred forty six cen-septen-quinquagin-tilliard, seven hundred sixty seven cen-septen-quinquagin-tillion, nine hundred twenty two cen-sex-quinquagin-tilliard, four hundred forty one cen-sex-quinquagin-tillion, five hundred thirty cen-quin-quinquagin-tilliard, nine hundred forty one cen-quin-quinquagin-tillion, eight hundred eighteen cen-quattuor-quinquagin-tilliard, eight hundred eighty seven cen-quattuor-quinquagin-tillion, five hundred fifty three cen-tre-quinquagin-tilliard, one hundred twenty five cen-tre-quinquagin-tillion, four hundred twenty seven cen-do-quinquagin-tilliard, three hundred three cen-do-quinquagin-tillion, nine hundred seventy four cen-un-quinquagin-tilliard, nine hundred twenty three cen-un-quinquagin-tillion, one hundred sixty one cen-quinquagin-tilliard, eight hundred seventy four cen-quinquagin-tillion, nineteen cen-novem-quadragin-tilliard, two hundred sixty six cen-novem-quadragin-tillion, five hundred eighty six cen-octo-quadragin-tilliard, three hundred sixty two cen-octo-quadragin-tillion, eighty six cen-septen-quadragin-tilliard, two hundred one cen-septen-quadragin-tillion, two hundred nine cen-sex-quadragin-tilliard, five hundred sixteen cen-sex-quadragin-tillion, eight hundred cen-quin-quadragin-tilliard, four hundred eighty three cen-quin-quadragin-tillion, four hundred six cen-quattuor-quadragin-tilliard, five hundred fifty cen-quattuor-quadragin-tillion, six hundred ninety five cen-tre-quadragin-tilliard, two hundred forty one cen-tre-quadragin-tillion, seven hundred thirty three cen-do-quadragin-tilliard, one hundred ninety four cen-do-quadragin-tillion, one hundred seventy seven cen-un-quadragin-tilliard, four hundred forty one cen-un-quadragin-tillion, six hundred eighty nine cen-quadragin-tilliard, five hundred nine cen-quadragin-tillion, two hundred thirty eight cen-novem-trigin-tilliard, eight hundred seven cen-novem-trigin-tillion, seventeen cen-octo-trigin-tilliard, four hundred ten cen-octo-trigin-tillion, three hundred seventy seven cen-septen-trigin-tilliard, seven hundred nine cen-septen-trigin-tillion, five hundred ninety seven cen-sex-trigin-tilliard, five hundred twelve cen-sex-trigin-tillion, forty two cen-quin-trigin-tilliard, three hundred thirteen cen-quin-trigin-tillion, sixty six cen-quattuor-trigin-tilliard, six hundred twenty four cen-quattuor-trigin-tillion, eighty two cen-tre-trigin-tilliard, nine hundred sixteen cen-tre-trigin-tillion, three hundred fifty three cen-do-trigin-tilliard, five hundred seventeen cen-do-trigin-tillion, nine hundred fifty two cen-un-trigin-tilliard, three hundred eleven cen-un-trigin-tillion, one hundred eighty six cen-trigin-tilliard, one hundred fifty four cen-trigin-tillion, eight hundred sixty two cen-novem-vigin-tilliard, two hundred sixty five cen-novem-vigin-tillion, six hundred four cen-octo-vigin-tilliard, five hundred forty seven cen-octo-vigin-tillion, six hundred ninety one cen-septen-vigin-tilliard, one hundred twenty seven cen-septen-vigin-tillion, five hundred ninety five cen-sex-vigin-tilliard, eight hundred forty eight cen-sex-vigin-tillion, seven hundred seventy five cen-quin-vigin-tilliard, six hundred ten cen-quin-vigin-tillion, five hundred sixty eight cen-quattuor-vigin-tilliard, seven hundred fifty seven cen-quattuor-vigin-tillion, nine hundred thirty one cen-tre-vigin-tilliard, one hundred ninety one cen-tre-vigin-tillion, seventeen cen-do-vigin-tilliard, seven hundred eleven cen-do-vigin-tillion, four hundred eight cen-un-vigin-tilliard, eight hundred twenty six cen-un-vigin-tillion, two hundred fifty two cen-vigin-tilliard, one hundred fifty three cen-vigin-tillion, eight hundred forty nine cen-novem-dec-illiard, thirty five cen-novem-dec-illion, eight hundred thirty cen-octo-dec-illiard, four hundred one cen-octo-dec-illion, one hundred eighty five cen-septen-dec-illiard, seventy two cen-septen-dec-illion, one hundred sixteen cen-sex-dec-illiard, four hundred twenty four cen-sex-dec-illion, seven hundred forty seven cen-quin-dec-illiard, four hundred sixty one cen-quin-dec-illion, eight hundred twenty three cen-quattuor-dec-illiard, thirty one cen-quattuor-dec-illion, four hundred seventy one cen-tre-dec-illiard, three hundred ninety eight cen-tre-dec-illion, three hundred forty cen-do-dec-illiard, two hundred twenty nine cen-do-dec-illion, two hundred eighty eight cen-un-dec-illiard, seventy four cen-un-dec-illion, five hundred forty five cen-dec-illiard, six hundred seventy seven cen-dec-illion, nine hundred seven cen-novem-tilliard, nine hundred forty one cen-novem-tillion, thirty seven cen-octo-tilliard, two hundred eighty eight cen-octo-tillion, two hundred thirty five cen-septen-tilliard, eight hundred twenty cen-septen-tillion, seven hundred five cen-sex-tilliard, eight hundred ninety two cen-sex-tillion, three hundred fifty one cen-quin-tilliard, sixty eight cen-quin-tillion, four hundred thirty three cen-quattuor-tilliard, eight hundred eighty two cen-quattuor-tillion, nine hundred eighty six cen-tre-tilliard, eight hundred eighty eight cen-tre-tillion, six hundred sixteen cen-do-tilliard, six hundred fifty eight cen-do-tillion, six hundred fifty cen-un-tilliard, two hundred eighty cen-un-tillion, nine hundred twenty seven cen-tilliard, six hundred ninety two cen-tillion, eighty novem-nonagin-tilliard, three hundred thirty nine novem-nonagin-tillion, six hundred five octo-nonagin-tilliard, eight hundred sixty nine octo-nonagin-tillion, three hundred eight septen-nonagin-tilliard, seven hundred ninety septen-nonagin-tillion, five hundred sex-nonagin-tilliard, four hundred nine sex-nonagin-tillion, five hundred three quin-nonagin-tilliard, seven hundred nine quin-nonagin-tillion, eight hundred seventy five quattuor-nonagin-tilliard, nine hundred two quattuor-nonagin-tillion, one hundred nineteen tre-nonagin-tilliard, eighteen tre-nonagin-tillion, three hundred seventy one do-nonagin-tilliard, nine hundred ninety one do-nonagin-tillion, six hundred twenty un-nonagin-tilliard, nine hundred ninety four un-nonagin-tillion, two nonagin-tilliard, five hundred sixty eight nonagin-tillion, nine hundred thirty five novem-octogin-tilliard, one hundred thirteen novem-octogin-tillion, one hundred thirty six octo-octogin-tilliard, five hundred forty eight octo-octogin-tillion, eight hundred twenty nine septen-octogin-tilliard, seven hundred thirty nine septen-octogin-tillion, one hundred twelve sex-octogin-tilliard, six hundred fifty six sex-octogin-tillion, seven hundred ninety seven quin-octogin-tilliard, three hundred three quin-octogin-tillion, two hundred forty one quattuor-octogin-tilliard, nine hundred eighty six quattuor-octogin-tillion, five hundred seventeen tre-octogin-tilliard, two hundred fifty tre-octogin-tillion, one hundred sixteen do-octogin-tilliard, four hundred twelve do-octogin-tillion, seven hundred three un-octogin-tilliard, five hundred nine un-octogin-tillion, seven hundred five octogin-tilliard, four hundred twenty seven octogin-tillion, seven hundred seventy three novem-septuagin-tilliard, four hundred seventy seven novem-septuagin-tillion, nine hundred seventy two octo-septuagin-tilliard, three hundred forty nine octo-septuagin-tillion, eight hundred twenty one septen-septuagin-tilliard, six hundred seventy six septen-septuagin-tillion, four hundred forty three sex-septuagin-tilliard, four hundred forty six sex-septuagin-tillion, six hundred sixty eight quin-septuagin-tilliard, three hundred eighty three quin-septuagin-tillion, one hundred nineteen quattuor-septuagin-tilliard, three hundred twenty two quattuor-septuagin-tillion, five hundred forty tre-septuagin-tilliard, ninety nine tre-septuagin-tillion, six hundred forty eight do-septuagin-tilliard, nine hundred ninety four do-septuagin-tillion, fifty one un-septuagin-tilliard, seven hundred ninety un-septuagin-tillion, two hundred forty one septuagin-tilliard, six hundred twenty four septuagin-tillion, fifty six novem-sexagin-tilliard, five hundred nineteen novem-sexagin-tillion, fifty four octo-sexagin-tilliard, four hundred eighty three octo-sexagin-tillion, six hundred ninety septen-sexagin-tilliard, eight hundred nine septen-sexagin-tillion, six hundred sixteen sex-sexagin-tilliard, sixty one sex-sexagin-tillion, six hundred twenty five quin-sexagin-tilliard, seven hundred forty three quin-sexagin-tillion, forty two quattuor-sexagin-tilliard, three hundred sixty one quattuor-sexagin-tillion, seven hundred twenty one tre-sexagin-tilliard, eight hundred sixty three tre-sexagin-tillion, three hundred thirty nine do-sexagin-tilliard, four hundred fifteen do-sexagin-tillion, eight hundred fifty two un-sexagin-tilliard, four hundred twenty six un-sexagin-tillion, four hundred thirty one sexagin-tilliard, two hundred eight sexagin-tillion, seven hundred thirty seven novem-quinquagin-tilliard, two hundred sixty six novem-quinquagin-tillion, five hundred ninety one octo-quinquagin-tilliard, nine hundred sixty two octo-quinquagin-tillion, sixty one septen-quinquagin-tilliard, seven hundred fifty three septen-quinquagin-tillion, five hundred thirty five sex-quinquagin-tilliard, seven hundred forty eight sex-quinquagin-tillion, eight hundred ninety two quin-quinquagin-tilliard, eight hundred ninety four quin-quinquagin-tillion, five hundred ninety nine quattuor-quinquagin-tilliard, six hundred twenty nine quattuor-quinquagin-tillion, one hundred ninety five tre-quinquagin-tilliard, one hundred eighty three tre-quinquagin-tillion, eighty two do-quinquagin-tilliard, six hundred twenty one do-quinquagin-tillion, eight hundred sixty un-quinquagin-tilliard, eight hundred fifty three un-quinquagin-tillion, four hundred quinquagin-tilliard, nine hundred thirty seven quinquagin-tillion, nine hundred thirty two novem-quadragin-tilliard, eight hundred thirty nine novem-quadragin-tillion, four hundred twenty octo-quadragin-tilliard, two hundred sixty one octo-quadragin-tillion, eight hundred sixty six septen-quadragin-tilliard, five hundred eighty six septen-quadragin-tillion, one hundred forty two sex-quadragin-tilliard, five hundred three sex-quadragin-tillion, two hundred fifty one quin-quadragin-tilliard, four hundred fifty quin-quadragin-tillion, seven hundred seventy three quattuor-quadragin-tilliard, ninety six quattuor-quadragin-tillion, two hundred seventy four tre-quadragin-tilliard, two hundred thirty five tre-quadragin-tillion, three hundred seventy six do-quadragin-tilliard, eight hundred twenty two do-quadragin-tillion, nine hundred thirty eight un-quadragin-tilliard, six hundred forty nine un-quadragin-tillion, four hundred seven quadragin-tilliard, one hundred twenty seven quadragin-tillion, seven hundred novem-trigin-tilliard, eight hundred forty six novem-trigin-tillion, seventy seven octo-trigin-tilliard, one hundred twenty four octo-trigin-tillion, two hundred eleven septen-trigin-tilliard, eight hundred twenty three septen-trigin-tillion, eighty sex-trigin-tilliard, eight hundred four sex-trigin-tillion, one hundred thirty nine quin-trigin-tilliard, two hundred ninety eight quin-trigin-tillion, eighty seven quattuor-trigin-tilliard, fifty seven quattuor-trigin-tillion, five hundred four tre-trigin-tilliard, seven hundred thirteen tre-trigin-tillion, eight hundred twenty five do-trigin-tilliard, two hundred sixty four do-trigin-tillion, five hundred seventy one un-trigin-tilliard, four hundred forty eight un-trigin-tillion, three hundred seventy nine trigin-tilliard, three hundred seventy one trigin-tillion, one hundred twenty five novem-vigin-tilliard, thirty two novem-vigin-tillion, eighty one octo-vigin-tilliard, eight hundred twenty six octo-vigin-tillion, one hundred twenty six septen-vigin-tilliard, five hundred sixty six septen-vigin-tillion, six hundred forty nine sex-vigin-tilliard, eighty four sex-vigin-tillion, two hundred fifty one quin-vigin-tilliard, six hundred ninety nine quin-vigin-tillion, four hundred fifty three quattuor-vigin-tilliard, nine hundred fifty one quattuor-vigin-tillion, eight hundred eighty seven tre-vigin-tilliard, seven hundred eighty nine tre-vigin-tillion, six hundred thirteen do-vigin-tilliard, six hundred fifty do-vigin-tillion, two hundred forty eight un-vigin-tilliard, four hundred five un-vigin-tillion, seven hundred thirty nine vigin-tilliard, three hundred seventy eight vigin-tillion, five hundred ninety four novem-dec-illiard, five hundred ninety nine novem-dec-illion, four hundred forty four octo-dec-illiard, three hundred thirty five octo-dec-illion, two hundred thirty one septen-dec-illiard, one hundred eighty eight septen-dec-illion, two hundred eighty sex-dec-illiard, one hundred twenty three sex-dec-illion, six hundred sixty quin-dec-illiard, four hundred six quin-dec-illion, two hundred sixty two quattuor-dec-illiard, four hundred sixty eight quattuor-dec-illion, six hundred nine tre-dec-illiard, two hundred twelve tre-dec-illion, one hundred fifty do-dec-illiard, three hundred forty nine do-dec-illion, nine hundred thirty seven un-dec-illiard, five hundred eighty four un-dec-illion, seven hundred eighty two dec-illiard, two hundred ninety two dec-illion, two hundred thirty seven noni-lliard, one hundred forty four noni-llion, three hundred thirty nine octi-lliard, six hundred twenty eight octi-llion, eight hundred fifty eight septi-lliard, four hundred eighty five septi-llion, nine hundred thirty eight sexti-lliard, two hundred fifteen sexti-llion, seven hundred thirty eight quinti-lliard, eight hundred twenty one quinti-llion, two hundred thirty two quadri-lliard, three hundred ninety three quadri-llion, six hundred eighty seven tri-lliard, forty six tri-llion, one hundred sixty bi-lliard, six hundred seventy seven bi-llion, three hundred sixty two mi-lliard, nine hundred nine mi-llion, three hundred fifteen thousand, seventy one


Demo app for the Deploying TensorFlow on a Web API workshop session, as presented as part of Deep Learning Workshops in Cape Town.
This project was developed my Michael Currin and available as a Github repo.


Full Name Marcie Van Auken
Age
Current City New York City, NY
I am a motivated, collaborative, and empathetic technology enthusiast with 5+ years experience in modern technology best practices, agile team dynamics, and product development. These skills paired with my design and leadership knowledge brings a well-rounded set of attributes that are relevant across varying roles in the product development world.
In October 2020, I graduated from the Master of Science in Technology Management program at Columbia University that not only opened up my eyes to the role of technology in driving business goals and initiatives, but also about relationships and their importance for proper strategy design, change-management, creativity, and performance.
I am currently…
A senior web and product developer for the Application Development Team at the Office of Alumni & Development at Columbia University.
For the past five years as part of the App Team, my role has evolved from fully front-end development work, to full stack, product design, and architecture of applications aligned with business goals. It is a truly rewarding experience. I will continue to take what I've learned and build off of these strengths for continual team (and self) improvement.
Send me a message to learn more!
Experience
Skills
App Dev
Design & Prototype
HTML5
CSS3
SASS
Node.js
SQL/Oracle
NoSQL
AWS
Git
JavaScript
JQuery
Bootstrap
Product & People
Teamwork
Agile & Sprint Methodology
Research & Documentation
Problem Solving
Verbal & Written Communication
Design Thinking
Tech Architecture & Design
Software
Microsoft Suite
Adobe Creative Suite
Mac OS
Education
M.S. in Technology Management
Columbia University, NYC, NY
October 2020 | Summa Cum Laude
Full coursework: Tech in the Business Environment, Accounting & Finance for Tech, Tech & the Law, Operations Mgmt in IT, Project Mgmt for Tech Execs, Raising Capital, Strategic Advocacy, Behavioral Challenges in Tech Mgmt, Machine Learning & AI, Leading Disruptive Change in a Digital Economy, Tech Mgmt Capstone
B.S. in Graphic Design
Northeastern University, Boston, MA
December 2010 | Cum Laude
Relevant courses: Visual Foundations 1 and 2, Color 1, Intro to Photography, Intro to Digital Tools, Graphic Design 1 and 2, Typography 1 and 2, Video 1, Information Design, Time-Based Design, Interactive Information Design, Graphic Design Degree Project and 20th Century Art
Design Thinking & Process
Design projects must pass through three spaces; inspiration, for the problem to find solutions; ideation, for generating, developing, and testing ideas that may lead to solutions; and implementation, for the charting of a path to market. Projects will loop back through these spaces more than once as ideas are refined and new directions taken.
Harvard Business Review / hbr.org
The Technology Management Capstone is the culmination of the MS in Technology Management degree program at Columbia University. In the Capstone Course, students had to develop a technology-based project, including:
My Capstone | Index
Index is a tunnel to your digital workflow. It’s mission is creating one centralized space where our digital assets are globally referenceable and then translated into personalized data trends and recommendations.
Download the full presentation here.
Please say hello &
for stopping by!


How It Works
Tax Saving Mutual Funds or ELSS beat every other tax saving option under section 80C. (you can save up to Rs. 45000 by making specified investments under Sec. 80C)
Sign up
Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the
Consult
Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the
Invest
Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the
Track and Review
Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the
Why FundInn
Tax Saving Mutual Funds or ELSS beat every other tax saving option under section 80C. (you can save up to Rs. 45000 by making specified investments under Sec. 80C)
Zero Fees
Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the
Secure Platform
Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the
AMFI Certified
Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the
Scientifically Selected Portfolio
Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the
Funds Explorer
Tax Saving Mutual Funds or ELSS beat every other tax saving option under section 80C. (you can save up to Rs. 45000 by making specified investments under Sec. 80C)
new to mutual funds ? know the basics
Goal Planner
Tax Saving Mutual Funds or ELSS beat every other tax saving option under section 80C. (you can save up to Rs. 45000 by making specified investments under Sec. 80C)
Buy a car
Buy a home
Education
Retirement
Vacation
Save Tax
Emergency Fund
Custom Goal
where should you invest?
Tax Saving Mutual Funds or ELSS beat every other tax saving option under section 80C. (you can save up to Rs. 45000 by making specified investments under Sec. 80C)
Investment Amount
No of years
For a period of 5 years would have accumulate to
elss
Rs. 50,000
fd
Rs. 50,000
ppf
Rs. 50,000
nsc
Rs. 50,000
Life Insurance
Rs. 50,000
Testimonials
Tax Saving Mutual Funds or ELSS beat every other tax saving option under section 80C. (you can save up to Rs. 45000 by making specified investments under Sec. 80C)
Fund Partners
Tax Saving Mutual Funds or ELSS beat every other tax saving option under section 80C. (you can save up to Rs. 45000 by making specified investments under Sec. 80C)
Contact Us
Tax Saving Mutual Funds or ELSS beat every other tax saving option under section 80C. (you can save up to Rs. 45000 by making specified investments under Sec. 80C)


Here is a function that will generate random
permutations of a set of integers,
where
a permutation is just an arrangement of the integers {1, 2, ..., n}.
Enter a positive integer n (1-30):
Random permutation of {1, ..., n}.


StormRend - Realm in Ruins
Lead Programmer
When the World Tree was under attack, the gods sent their Champions to come to its aid. Defeat the Frost Trolls, reclaim the World Tree and save the Realms from being plunged into Eternal Winter in this Norse-inspired turn-based strategy game.
GithubTowering Oasis
Lead Programmer
The player controls a 4-person group that needs climb a tower through lobbies and the elevator system. As a lead programmer I was in-charge of managing technical documents and implementing mechanics.
GithubRadioactive Amish Manic
Programmer
Make your way through an Amish wasteland and survive as long as you can. This was made in 3 days during a game jam at AIE Melbourne. We were given the name and we then had three days to make something from it, so we made a Crossy Road-like game set in an Amish wasteland.
Online Demo GithubSuper Fast Slime Boi
Programmer
You are Blu, a young slime with one goal: carry its flag from here to there If you die while carrying your flag, you go back to the start, but you can also plant your flag to create a checkpoint But don't forget, you HAVE to carry your flag to the end. Can you carry your flag to the finish line?
Github Itch.io


{% include '../includes/head.html' %}
{% block content %}{% endblock %}
{% include '../includes/foot.html' %}


{% extends "pages/challenge_settings_base.html" %} {% load crispy from crispy_forms_tags %} {% load url %} {% block breadcrumbs %}
{% endblock %} {# Do not show the footer as this is broken with SummernoteInplaceWidget #} {% block footer %}{% endblock %} {% block content %}Use this form to create a new phase for your challenge with a separate evaluation method. For instance, you could have a training and test phase, or have a phase for each task.
{% else %} {% include "evaluation/partials/phase_closed_warning.html" with phase=object %} {% endif %} {% crispy form %} {% endblock %}


--- layout: post status: publish published: true title: It's not the tools, it's how they're used author: display_name: Tomas Restrepo login: tomasr email<EMAIL_ADDRESS>url: http://winterdom.com/ author_login: tomasr author_email<EMAIL_ADDRESS>author_url: http://winterdom.com/ wordpress_id: 1003 wordpress_url: http://winterdom.com/2007/06/itsnotthetoolsitshowtheyreused date: '2007-06-17 17:39:42 +0000' date_gmt: '2007-06-17 17:39:42 +0000' categories: - Development - Architecture tags: [] comments: [] ---
In my previous entry about Morts, Nick Malik left an interesting response. What caught my eye the most was his comment that:
"If you find yourself having to maintain a program that was not written to be maintained, don't blame the maker of the tools!"
I agree with this sentiment to a large degree. How people use the tools, is critical. But, that's only part of the story. See, a lot of tools don't lend themselves towards wiring maintainable code. Some of Microsoft's current tools fall in that category, unfortunately. For example, some don't lend themselves towards creating testable code. That's a big problem all by itself.
So I'd like to take Nick's comment and turn it an opportunity. Sure, it's the people using the tool that take most of the blame, however, the maker of the tool may (should!) have a significant responsibility in creating tools that encourage the creation of maintainable code. (Notice I use the word encourage here).
There's a thin, but significant line between tools that allow you to create crappy code quickly and then leave you high and dry, versus tools that encourage you towards creating good code. The key here is that the tools should make it as painless and natural as possible to do the right thing. This is not about wizards. It's not about visual designers. It's about code.
Microsoft is in a unique position to provide this, but so far some teams within it insist on making the default way of creating applications to be the one that favors quick and dirty over the one that favors maintainable code. The latter does not need to take longer, be more complicated, or be harder than the former, but some tools insist on making it that way. Choosing the right abstractions, by the way, is a key step here.


Click this button to upload new strings to and download new translations from transifex. Note that for syncing categories, you might have to restart all containers if the app runs multiple containers.


PhotoWeekly.com
A website dedicated to sharing photos..enjoy!
-
Winter Landscape "fish eye lens"
Picture taken in Saratoga Springs, UT, April,14,2012 by Jaran Hope (Nikon D3200/ fish eye lens)
-
Macro Carnation Photo
This is a picture of a carnation flower i had at my house, photo taken April,17,2012
-
Macro Carnation Photo With Flash
This picture of a carnation flower like the one above but i used flash and held it closer towards the flower to get the darker background effect.


| classFuncs {shinyjs} | R Documentation |
Add or remove a CSS class from an HTML element.
addClass
adds a CSS class, removeClass
removes a CSS class, toggleClass
adds the class if it is
not set and removes the class if it is already set.
addCssClass
, removeCssClass
, and
toggleCssClass
are synonyms that may be safer to use if you're
working with S4 classes (since they don't mask any existing S4 functions).
If condition
is given to toggleClass
, that condition will be used
to determine if to add or remove the class. The class will be added if the
condition evaluates to TRUE
and removed otherwise. If you find
yourself writing code such as if (test()) addClass(id, cl) else removeClass(id, cl)
then you can use toggleClass
instead: toggleClass(id, cl, test())
.
CSS is a simple way to describe how elements on a web page should be
displayed (position, colour, size, etc.). You can learn the basics
at W3Schools.
addClass(id = NULL, class = NULL, selector = NULL, asis = FALSE) addCssClass(id = NULL, class = NULL, selector = NULL, asis = FALSE) removeClass(id = NULL, class = NULL, selector = NULL, asis = FALSE) removeCssClass(id = NULL, class = NULL, selector = NULL, asis = FALSE) toggleClass( id = NULL, class = NULL, condition = NULL, selector = NULL, asis = FALSE ) toggleCssClass( id = NULL, class = NULL, condition = NULL, selector = NULL, asis = FALSE )
id |
The id of the element/Shiny tag |
class |
The CSS class to add/remove |
selector |
JQuery selector of the elements to target. Ignored if the |
asis |
If |
condition |
An optional argument to |
If you use S4 classes, you should be aware of the fact that both S4 and
shinyjs
use the removeClass()
function. This means that when using S4,
it is recommended to use removeCssClass()
from shinyjs
, and to
use methods::removeClass()
for S4 object.
shinyjs
must be initialized with a call to useShinyjs()
in the app's ui.
useShinyjs
,
runExample
,
inlineCSS
,
if (interactive()) { library(shiny) shinyApp( ui = fluidPage( useShinyjs(), # Set up shinyjs # Add a CSS class for red text colour inlineCSS(list(.red = "background: red")), actionButton("btn", "Click me"), p(id = "element", "Watch what happens to me") ), server = function(input, output) { observeEvent(input$btn, { # Change the following line for more examples toggleClass("element", "red") }) } ) } ## Not run: # The shinyjs function call in the above app can be replaced by # any of the following examples to produce similar Shiny apps toggleClass(class = "red", id = "element") addClass("element", "red") removeClass("element", "red") ## End(Not run) ## toggleClass can be given an optional `condition` argument, which ## determines if to add or remove the class if (interactive()) { shinyApp( ui = fluidPage( useShinyjs(), inlineCSS(list(.red = "background: red")), checkboxInput("checkbox", "Make it red"), p(id = "element", "Watch what happens to me") ), server = function(input, output) { observe({ toggleClass(id = "element", class = "red", condition = input$checkbox) }) } ) }


| DOSE: |
3 Tbsp |
oral |
Nutmeg |
(ground / crushed) |
0:00- I get myself and E some chocolate milk and put 3 Tbsp into each, then two more of my friends decide they want some, so I hook J up with 2 Tbsp and D 3 Tbsp. We all try just downing it. I managed it in 2 sessions, as did J and E. D was sipping on it for awhile before trying, he eventually couldn't get it all down, he probably had bout 2.8 Tbsp.
0:10- Most of us are feeling a very weak buzz.
0:30- I'm feeling slightly happy, a little hot. Others the same.
1:00- Start feeling a little bit sick, especially in stomach.
1:30- We are walking to a friends house, E tries to intentionally vomit many times.  For awhile we all felt like ass, but I was just hoping for the best, I mean we still had awhile to go before we reached peak.
2:10- We finally settle in, after going to one friends house, leaving, looking for some bud, then going back to another friends house. Lying down is the only thing to make the stomach pain/nausea go away.
2:40- I notice that I start feeling kind of euphoric, and the nausea feeling fades away. What is interesting is that this 'stage' hit E about 5 minutes after me, D about 20 minutes, and J about 40 minutes.
3:00- One of my friends showed us his stereo system, daammn, blew us away. He turned on just the right songs for the situation. I fell into a state of ecstacy. I kept bouncing to the beat, I couldn't stand still without sort of dancing. E was at the same level and we were having the time of our lives.
I remember I threw myself on a bed, and E followed me and did the same. I doubt it means we are gay or anything, but just playful because we were basically in ecstacy. So anyways, on the bed we were like playing with each other, not intimately, just like wrestling in probably the pansiest looking way, and giggling uncontrollably in the process.
4:30- Start gettin up to peak, the happiness slightly went away, but I wasn't depressed or anything. Anyways, around here is when my sober friends, myself, and J decided to spark up the bud. Spliced up a nice dime-sized blunt, and lit it up.
From here on, I start getting deep, philosophically and all. I ponder what life is, and although I can't describe it or quite remember it 100%, I think a sane person could understand it, but would never believe it. I kind of am free, and try to go against the norm and be as abnormal I can be.
5:00- I get home and lie down, I intentionally close my eyes and cover them with my hands for some closed eye visuals time. Lovely little patterns of lights and such. The cottonmouth drives E, D, and I to the kitchen. When I get up I get a small blood rush, I walk to the kitchen feeling pretty rushy, then suddenly I can't take it, it starts going dark and I collapse to the kitchen floor and have what I think is a seizure. My body was shaking uncontrollably and it was sort of like a flash, then I got myself up. My friends response was, 'What the fuck?' but they didn't call the ER or anything, which I am glad they didn't do. I can tell from this collapse sign that my body is screaming for rest, so that's exactly what I do. I lie down for about 1-2 hours with eyes open for some of it, and closed for others. Just talking with my friends and tripping out.
14:00- Wake up, feel like ass, still kinda buzzed, cottonmouth blows.
15:30- Get up to get some food and liquids.  It is very very intense. I have had only 1 similar rush in my life. I start freezing up, everything turns black, my hearing turns off, and I feel myself drop on the floor and start sort of pushing myself in a circle with my feet with no control. I am shaking a little bit. I hear one of my friends say my name in a 'What's going on' manner. I get some help up, but I got up on my own for the most part, I am a few steps from the couch so I get there as fast as I can and lie down. From here I knew I better not stand up again, unless I want to go through that again. So I just lie down and chill with my friends again.
16:30- Time to test my walking ability again.  I wanna even the blood out through my body. About 20 minutes after this I stand up for about 1 minute, no rush. I go to the kitchen to finally get some food and drink. After munching for a bit, I head out to my room and go to my bed, and fall asleep.
26:00- I wake up again, feel pretty shitty. My parents comment on how wasted I look. From here on I just do the usual on the computer, check in on the games I play, email, etc. I have the most intoxicated feeling ever, and it just doesn't go away. Got some pizza, liquids, took a Daily Multi-Vitamin, Vitamin B complex and Vitamin C. For some reason my left leg (thigh area) has been twitching since I woke up again.
 I loved the effects at peak, but the next day on Nutmeg has to be the worst time of my life. I am in a way, paralyzed. Also, I remember that up until almost 3 hours after we took the nutmeg, we all felt sort of like we had the flu and wanted to throw up. After the 3 hours we felt pretty good.  I now know why people say don't waste your time trying to figure out what life is.
I am glad I only bought 4 ounces of Nutmeg instead of a full pound, because I won't be doing it again. If there were no side-effects (the blood rushes with the seizures, day after shittiness, cottonmouth like hell, etc.), and it stayed at peak for the entire course, then I would probably do it again. The ecstacy like stage was unbelievably fun.
Experience Reports are the writings and opinions of the individual authors who submit them.
Some of the activities described are dangerous and/or illegal and none are recommended by Erowid.


Status: | View on Marvel.com
{{series.publisher.name}} | {{series.start_year}} | {{series.count_of_issues + 1}} View on Comic Vine
{{marvelDescription}}
{{ creators.writers | orderBy:'toString()' | joinBy:", "}}
{{ creators.pencillers | orderBy:'toString()' | joinBy:", "}}


Cache Algorithms
This post is originally written for Cache Algo only, before I found out this 2 topics are very similar, so I changed the title to “Cache and Page Replacement Algorithms”.
Equation
of memory reference time is:
T = m * T(m) + T(h) + E
m: miss ratio = 1 - hit ratio
T(m): time for main memory access
T(h): latency (when there’s a hit)
E: secondary effects liek queuing effects etc.
hit ratio
how often a searched-for item is actually found in the cache
latency
how long after requesting a desired item the cache can return that item (when there is a hit).
Replacement policy
Bélády’s Algorithm (Optimal Algorithm)
The optimal algorithm, not implementable in practise.
LFU
Least Frequently Used, slow and not very adaptive.
LRU
Fast and adaptive, but hard to implement.
It can be implemented with either a counter or a stack/doubleLinkedList.
Web browser use this.
LRU2 and 2Qs
LRU2 - Only add entries to the cache the second time they are accessed.
Two Queues - Add entries to an normal LRU cache. If accessed again, move it to second, larger, LRU cache.
MRU (most recent used)
Some claim that MRU cache algorithms have more hits than LRU due to their tendency to retain older data.
FIFO
Low-overhead, fast but not adaptive.
Second-chance
Modified version of FIFO. Relatively better than FIFO at little cost.
Initially, a reference bit is set. Instead of removing old entries, it clears reference bit first, and insert that entry at the back of the queue. An entry is only cleared if the reference bit is not set. This is like a circular queue.
If all the pages have been referenced, second chance degenerates into pure FIFO. Why? Let’s say all entries reference are set, the pointer will go around the entire list and clear all references, and in the end come back to the starting point. Then, it’s like a FIFO. For more, see the link.
Clock
Modified version of second-hand. Better than second hand. Instead of pushing to the back, it keep a “hand” pointer in the circular list. link
When cache miss occurs and no empty place exists, then I consult the R (referenced) bit at the hand’s location to know what I should do. If R is 0, then I will place the new entry at the “hand” position, otherwise I will clear the R bit. Then, I will increment the hand (iterator) and repeat the process until an entry is replaced.
Simple time-based
Fast, but not adaptive. Entries remain in cache for a specific amount of time.
Extended time-based expiration
Only clear cache at certain points in time (say every 5 minutes).
Conclusion
Each replacement strategy is a compromise between hit rate and latency.
One more thing
What is Distributed cache?
Distributed cache is an extension of the traditional concept of cache used in a single locale.
A distributed cache may span multiple servers so that it can grow in size and in transactional capacity. It is mainly used to store application data residing in database and web session data.
The idea of distributed caching has become feasible now because main memory has become very cheap and network cards have become very fast (speed of 1 Gbit is now standard, and 10 Gbit is gaining traction).
Also, a distributed cache works well on lower cost machines usually employed for web servers as opposed to database servers which require expensive hardware.


Home
About
Projects
(current)
Blog
{% include navbar.html %}
Shared joy is double joy
Ideas, tools, experiments, learnings...
Last post
Other posts
If you want to collaborate on creating amazing products you are very welcome to contact me.


{% extends "_layouts/base.html" %} {% block page_title %}AppsCake{% endblock %} {% block page_class %}Home{% endblock %} {% block content %}
AppsCake is an easy to use web app capable of deploying AppScale, the open source app engine, over various infrastructures. AppsCake currently supports deployment strategies over Amazon EC2, Eucalyptus Private Cloud and Virtualbox.
{{ error_message }}
{% endif %}


{% extends "base.html" %} {% import "macros/macros.html" as macros %} {% block title %}
We often get inbound inquiries that go something like: "I'm somewhat familiar with Hoon and I've gone through all the tutorials. What's a project I can work on?" Apprenticeships are our answer to that.
Apprenticeships onboard developers to the Urbit programming community. This community has a wide variety of tasks, and uses multiple languages to program the runtime and frontends, although Urbit userspace and kernel work is always Hoon.
There are two kinds of apprenticeships: userspace apprenticeships, which are oriented towards developers that are looking to build applications on Urbit—and kernelspace apprenticeships, which are oriented towards more experienced Urbit developers that want to take a stab at working on Urbit core directly.
Apprenticeships proceed in two stages:
The developer offers guidance and review of the project, and the apprentice contributes directly to the Urbit project. The apprentice also receives compensation in the form of address space when the project is completed. After that, the apprentice should be equipped to contribute further to substantial grants or even apply for a job in some cases.
The resource we are trying to grow is developers, not lines of code. As a result, apprentice projects can be focused more on developer onboarding than immediate utility to Urbit, in order to speed the learning process. Check out available apprenticeships below:
{% for page in term.pages %} {% if not page.extra.canceled %} {{ macros::grant(page=page, classes="full c1-10-lg mv5")}} {% endif %} {% endfor %}


Click "MY PROFILE" to return to the "about me" page. Also below "MY PROFILE", you will find some of the projects, several unfinished, that I've been working on. Please click the different ones below (listed in no particular order) to see some of my progress.
After getting my doctorates, I felt like taking on another challenge to expand my set of skills even more. Throughout my academic career, I realized I enjoyed most of the data crunching and running statistical programs. I really found the "behind-the-scenes" work exciting, and heard that a coding career would encompass a similar type of workstyle. Back in middle school, I would design layouts for websites for free website platforms, such as geocities, angelfire, xanga, and myspace. Unfortunately, these were all deleted, and I lost my portfolio of work, in addition to my passion to continue coding back then. Now that I'm older, and heard of a possibility to regain the skills I once had (and learn a breadth and depth of much more!), I decided to take the opportunity.
In terms of my academic career, my research interests included studying the experiences of those underrepresented in STEM fields. I always admired those who were able to take on the challenge of being in a place that they may not felt they belonged in, especially how they navigated barriers and persevered. As I'm entering my life into a career, I think that being able to be in the tech industry would achieve one of my goals I've always had. The underrepresentation of certain groups of people in this field limits the advances and creativity the tech field could have, and hopefully I could add to it with my own unique experiences.
Some of my current interests include trying to gain more understanding of full-stack development. I'm interested in broadening my knowledge to learn of the powerful tools a developer has in creating their space in the web. On another note, my first pet I ever had was a hamster, and its name was Zsa Zsa. It was so cute, but its lifespan was only about 2 years. Afterwards, I never had a pet because of the heartbreak of losing one /sadface. I also enjoy food. Food is a necessity, and when I say food, I mean all kinds of food. I especially love spicy food! Szechuan handpulled noodles are one of my favorites. In terms of what I do to pass time, I like to browse youtube for cute animals. Please check out this Cat Spa for a way to fall asleep and relax.


The Specific UI provides standard response triggers for certain
GenInteractionType
, when built as dialog boxes. These standard response triggers contain an appropriate
InteractionCommand
and usually a visual moniker chosen by the Specific UI.
The standard response triggers (and their visual monikers under OSF/Motif) for each GII
_type
are shown in the figure below.
The Specific UI automatically places these standard response triggers in a reply bar within the dialog. In most cases, you will not have to deal directly with any of these standard response triggers; the Specific UI will create and manage them. In other cases, you must either supply additional response triggers or replace the existing default response triggers. Additional triggers must be supplied for GIT_COMMAND and GIT_MULTIPLE_RESPONSE Interactions. You may replace existing triggers to customize their behavior or even just to change their visual monikers.
You should add
HINT_SEEK_REPLY_BAR
to any additional triggers you supply so that they will be placed in the reply bar area of the Interaction (though this is not necessary). If you add more than one trigger, their order within the Interaction's children will be the order they appear in the reply bar. However, supplemental reply bar triggers will appear to the right of any IC_OK, IC_YES, IC_STOP, or IC_APPLY and to the left of any IC_DISMISS, IC_RESET, or IC_NO trigger.
Certain triggers may act as default triggers in the reply bar. Default triggers do not need to be explicitly activated (i.e. clicked on) to send out their action. Default triggers may also be activated if the user performs a default activation (normally hitting "Return" or double-clicking on an object within the dialog). Normally this default activation trigger will be the first trigger in the reply bar. Default triggers may be highlighted in some manner by the Specific UI. You can override this behavior by marking any reply trigger of your choosing with the hint
HINT_DEFAULT_DEFAULT_ACTION
.
The Specific UI gives
HINT_DEFAULT_DEFAULT_ACTION
to the IC_APPLY, IC_OK and IC_YES triggers in any reply bars it creates. (These are normally the first triggers anyway.) For example, the "OK" trigger in a GIT_NOTIFICATION dialog may be activated by either clicking on the trigger or hitting RETURN.
Whenever a dialog is initially brought on-screen, the trigger marked with HINT_DEFAULT_DEFAULT_ACTION will act as the default activation trigger. However, activating any other trigger will make that trigger the default activation trigger the next time the dialog is brought on-screen. You can avoid this by adding
HINT_PREVENT_DEFAULT_OVERRIDES
on the GenInteraction itself. This will allow the
HINT_DEFAULT_DEFAULT_ACTION
trigger to always remain the default trigger.


buku - Bookmark manager like a text-based mini-web
buku [OPTIONS] [KEYWORD [KEYWORD ...]]
buku is a command-line utility to store, tag, search and organize bookmarks.
Features
* Store
bookmarks with auto-fetched title, tags and description
* Auto-import from Firefox, Google Chrome and Chromium
* Open bookmarks and search results in browser
* Shorten, expand URLs, browse cached page from Wayback
Machine
* Text editor integration
* Lightweight, clean interface, custom colors
* Powerful search options (regex, substring...)
* Continuous search with on the fly mode switch
* Portable, merge-able database to sync between systems
* Import/export bookmarks from/to HTML, Markdown or Orgfile
* Smart tag management using redirection (>>, >,
<<)
* Multithreaded full DB refresh, manual encryption support
* Shell completion scripts, man page with handy examples
|
1. |
The database file is stored in: |
-
$XDG_DATA_HOME/buku/bookmarks.db, if XDG_DATA_HOME is
defined (first preference), or
- $HOME/.local/share/buku/bookmarks.db, if HOME is
defined (second preference), or
- %APPDATA%\buku\bookmarks.db, if you are on Windows,
or
- the current directory.
|
2. |
If the URL contains characters like ’;’, ’&’ or brackets they may be interpreted specially by the shell. To avoid it, add the URL within single or double quotes (’/"). | ||
|
3. |
URLs are unique in DB. The same URL cannot be added twice. | ||
|
4. |
Bookmarks with immutable titles are listed with ’(L)’ after the title. | ||
|
5. |
Tags: |
- Comma (’,’) is
the tag delimiter in DB. A tag cannot have comma(s) in it.
Tags are filtered (for unique tags) and sorted. Tags are
stored in lower case and can be replaced, appended or
deleted.
- Page keywords having a word to comma ratio > 3 are
appended to description rather than tags.
- Parent folder (and subfolder) names are converted to
all-lowercase tags during bookmarks HTML import.
- Releases prior to v2.7 support both capital and lower
cases in tags. From v2.7 all tags are stored in lowercase.
An undocumented option --fixtags is introduced to modify the
older tags. It also fixes another issue where the same tag
appears multiple times in the tagset of a record. Run
buku --fixtags once.
- Tags can be edited from the prompt very easily using
’>>’ (append), ’>’
(overwrite) and ’<<’ (remove) symbols. The
LHS of the operands denotes the indices and ranges of tags
to apply (as listed by --tag or key ’t’ at
prompt) and the RHS denotes the actual DB indices and ranges
of the bookmarks to apply the change to.
|
6. |
Update operation: |
- If --title, --tag or
--comment is passed without argument, clear the
corresponding field from DB.
- If --url is passed (and --title is omitted), update the
title from web using the URL. Description is updated (if
--comment is omitted). Tags remain untouched.
- If indices are passed without any other options (--url,
--title, --tag, --comment and --immutable), read the URLs
from DB and update titles, description and append tags from
web. Bookmarks marked immutable are skipped.
- Can update bookmarks matching a search, when combined with
any of the search options and no arguments to update are
passed.
|
7. |
Delete operation: |
- When a record is deleted, the
last record is moved to the index.
- Delete doesn’t work with range and indices provided
together as arguments. It’s an intentional decision to
avoid extra sorting, in-range checks and to keep the auto-DB
compaction functionality intact. On the same lines, indices
are deleted in descending order.
- Can delete bookmarks matching a search, when combined with
any of the search options and no arguments to delete are
passed.
|
8. |
Search works in mysterious ways: |
- Case-insensitive.
- Matches words in URL, title and tags.
- --sany : match any of the keywords in URL, title or tags.
Default search option.
- --sall : match all the keywords in URL, title or tags.
- --deep : match substrings (’match’
matches ’rematched’) in URL, title and tags.
- --sreg : match a regular expression (ignores --deep).
- --stag : search bookmarks by tags, or list all tags
alphabetically with usage count (if no arguments). Delimit
the list of tags in the query with ’,’ to search
for bookmarks that match ANY of the listed tags. Delimit
tags with ’+’ to search for bookmarks that match
ALL of the listed tags. Note that ’,’ and
’+’ cannot be used together in the same search.
Exclude bookmarks matching certain tags from the results by
using ’ - ’ followed by the tags. Note that the
’ - ’ operator and the ’ + ’
delimiter must be space separated: ’ - ’ instead
of ’-’ and ’ + ’ instead of
’+’. This is to distinguish them from hyphenated
tags (e.g., ’some-tag-name’) and tags with
’+’s (e.g., ’some+tag+name’).
- Search for keywords along with tag filtering is possible.
Two searches are issued (one for keywords and another for
tags) and the intersection of the 2 sets is returned as the
resultset.
- Search results are indexed incrementally. This index is
different from actual database index of a bookmark record
which is shown within ’[]’ after the title.
- Results for any keyword matches are ordered by the
number of keyword matches - results matching more keywords
(match score) will appear earlier in the list.
Results having the same number of matches will be ranked by
their record DB index. If only one keyword is searched,
results will be ordered by DB index, since all matching
records will have the same match score.
|
9. |
Import: |
- Auto-import looks in the
default installation path and default user profile.
- URLs starting with ’place:’,
’file://’ and ’apt:’ are ignored
during import.
- Parent folder (and subfolder) names are automatically
imported as tags if --tacit is used.
- Tags are merged even if bookmark URL exists when --tacit
is used.
|
10. |
Encryption is optional and manual. AES256 algorithm is used. To use encryption, the database file should be unlocked (-k) before using buku and locked (-l) afterwards. Between these 2 operations, the database file lies unencrypted on the disk, and NOT in memory. Also, note that the database file is unencrypted on creation. | ||
|
11. |
Editor support: |
- A single bookmark can be
edited before adding. The editor can be set using the
environment variable *EDITOR* or by explicitly specifying
the editor. The latter takes precedence. If -a is used along
with -w, the details are populated in the editor template.
- In case of edit and update (a single bookmark), the
existing record details are fetched from DB and populated in
the editor template. The environment variable EDITOR must be
set. Note that -u works independently of -w.
- All lines beginning with "#" will be stripped.
Then line 1 will be treated as the URL, line 2 will be the
title, line 3 will be comma separated tags, and the rest of
the lines will be parsed as descriptions.
|
12. |
Proxy support: please refer to the ENVIRONMENT section. | ||
|
13. |
Alternative DB file: |
- The option --db (to specify an alternative database file location) is app-only. Manual usage is prone to issues arising from human error.
-a --add URL [tag, ...]
Bookmark URL along with comma-separated tags. A tag can have multiple words.
-u --update [...]
Update fields of the bookmarks at specified indices in DB. If no arguments are specified, all titles and descriptions are refreshed from the web. Tags remain untouched. Works with update modifiers for the fields url, title, tag and comment. If only indices are passed without any edit options, titles and descriptions are fetched and updated (if not empty). Accepts hyphenated ranges and space-separated indices. Updates search results when used with search options, if no arguments.
-w --write [editor|index]
Edit a bookmark in editor before adding it. To edit and update an existing bookmark, the index should be passed. However, in this case the environment variable EDITOR must be set. The last record is opened in EDITOR if index=-1.
-d --delete [...]
Delete bookmarks. Accepts space-separated list of indices (e.g. 5 6 23 4 110 45) or a single hyphenated range (e.g. 100-200). Note that range and list don’t work together. Deletes search results when combined with search options, if no arguments.
-v --version
Show program version and exit.
-h --help
Show program help and exit.
--url [...]
Specify the URL, works with --update only. Fetches and updates title if --title is not used.
--tag [+|-] [...]
Specify comma separated tags, works with --add, --update. Clears the tags, if no arguments passed. Appends or deletes tags, if list of tags is preceded by ’+’ or ’-’ respectively.
--title [...]
Manually specify the title, works with --add, --update. Omits or clears the title, if no arguments passed.
-c --comment [...]
Add notes or description of the bookmark, works with --add, --update. Clears the comment, if no arguments passed.
--immutable N
Set the title, description and tags of a bookmark immutable during autorefresh. Works with --add, --update. N=1 sets the immutable flag, N=0 removes it. If omitted, bookmarks are added with N=0.
-s --sany keyword [...]
Search bookmarks with ANY of
the keyword(s) in URL, title or tags and show the results.
Prompts to enter result number to open in browser. Note that
the sequential result index is not the DB index. The DB
index is shown within ’[]’ after the title.
This is the default search option for positional arguments
if no other search option is specified.
-S --sall keyword [...]
Search bookmarks with ALL
keywords in URL, title or tags and show the results.
Behaviour same as --sany.
Special keywords:
"blank": list entries with empty title/tag
"immutable": list entries with locked title
NOTE: To search the keywords, use --sany
|
--deep |
Search modifier to match substrings. Works with --sany, --sall. |
-r --sreg expression
Scan for a regular expression match.
-t --stag [tag [,|+] ...] [- tag, ...]
Search bookmarks by tags.
Use ’,’ delimiter to find entries matching ANY
of the tags
Use ’ + ’ delimiter to find entries matching ALL
of the tags. (Note that the ’ + ’ delimiter must
be space separated)
NOTE: Cannot combine ’,’ and ’+’ in
the same search
Use ’ - ’ to exclude bookmarks that match the
tags that follow. (Note that the ’-’ operator
must be space separated).
List all tags alphabetically, if no arguments. The usage
count (number of bookmarks having the tag) is shown within
first brackets.
-x --exclude keyword [...]
Exclude bookmarks matching the specified keywords. Works with --sany, --sall, --sreg and --stag.
-l --lock [N]
Encrypt (lock) the DB file with N (> 0, default 8) hash passes to generate key.
-k --unlock [N]
Decrypt (unlock) the DB file with N (> 0, default 8) hash passes to generate key.
|
--ai |
Auto-import bookmarks from Firefox, Google Chrome and Chromium browsers. |
-e --export file
Export bookmarks to Firefox
bookmarks formatted HTML. Works with all search options.
Markdown is used if file has extension
’.md’. Markdown format: [title](url), 1 entry
per line.
Orgfile is used if file has extension
’.org’ Orgfile format: * [[url][title]], 1 entry
per line.
A buku database is generated if file has extension
’.db’.
-i --import file
Import bookmarks from Firefox bookmarks formatted HTML. file is considered Firefox-exported JSON if it has ’.json’ extension, Markdown (compliant with --export format) if it is ’.md’, Orgfile if the extension is ’.org’ or another buku database if the extension is ’.db’.
-p --print [...]
Show details (DB index, URL, title, tags and comment) of bookmark record by DB index. If no arguments, all records with actual index from DB are shown. Accepts hyphenated ranges and space-separated indices. A negative value (introduced for convenience) behaves like the tail utility, e.g., -n shows the details of the last n bookmarks.
-f --format N
Show selective monochrome
output with specific fields. Works with --print. Search
results honour the option when used along with --json.
Useful for creating batch scripts.
N = 1, show only URL.
N = 2, show URL and tags in a single line.
N = 3, show only title.
N = 4, show URL, title and tags in a single line.
N = 5, show title and tags in a single line.
To omit DB index from printed results, use N0, e.g., 10, 20,
30, 40, 50.
-j --json
Output data formatted as JSON, works with --print output and search results.
--colors COLORS
Set output colors. Refer to the COLORS section below for details.
|
--nc |
Disable color output in all messages. Useful on terminals which can’t handle ANSI color codes or scripted environments. |
-n --count N
Number of results to show per page (default 10).
|
--np |
Do not show the prompt, run and exit. |
-o --open [...]
Open bookmarks by DB indices or ranges in browser. Open a random index if argument is omitted.
|
--oa |
Open all search results immediately in the browser. Works best with --np. When used along with --update or --delete, URLs are opened in the browser first and then modified or deleted. |
--replace old new
Replace old tag with new tag if both are passed; delete old tag if new tag is not specified.
--shorten index|URL
Shorten the URL at DB index or an independent URL using the tny.im URL shortener service.
--expand index|URL
Expand the URL at DB index or an independent URL shortened using tny.im.
--cached index|URL
Browse the latest cached version of the URL at DB index or an independent URL using the Wayback Machine. Useful for viewing the content of bookmarks which are not live any more.
--suggest
Show a list of similar tags to choose from when adding a new bookmark.
--tacit
Show lesser output. Reduces the verbosity of certain operations like add, update etc.
--threads
Maximum number of parallel network connection threads to use during full DB refresh. By default 4 connections are spawned. N can range from 1 to 10.
|
-V |
Check the latest upstream version available. This is FYI. It is possible the latest upstream released version is still not available in your package manager as the process takes a while. |
-g --debug
Show debug information and additional logs.
|
1-N |
Browse search results by indices and ranges. |
O [id|range [...]]
Try to open search results or indices (when not in a search context) in a GUI browser. Toggle try to open urls in a GUI based browser (even if BROWSER is set) if no arguments. Toggling is useful when trying to open bookmarks by DB index.
|
a |
Open all search results in browser. |
s keyword [...]
Search for records with ANY keyword.
S keyword [...]
Search for records with ALL keywords.
|
d |
Toggle deep search to match substrings (’pen’ matches ’opened’). |
r expression
Run a regular expression search.
t [...]
Search bookmarks by a tag. List all tags alphabetically, if no arguments.
g taglist id|range [...] [>>|>|<<] [record id|range ...]
Append, set, remove specific or all tags by indices and/or ranges to bookmark indices and/or ranges (see EXAMPLES section below). Search by space-separated taglist id(s) and/or range if records are omitted.
o id|range [...]
Browse bookmarks by indices and/or ranges.
p id|range [...]
Print bookmarks by indices and/or ranges.
w [editor|id]
Edit and add or update a bookmark.
|
c id |
Copy url at search result index to clipboard. |
|||
|
? |
Show help on prompt keys. |
q, ^D, double Enter
Exit buku.
Completion scripts
Shell completion scripts for
Bash, Fish and Zsh can be found in:
https://github.com/jarun/buku/blob/master/auto-completion
BROWSER
Overrides the default browser.
Refer to:
http://docs.python.org/library/webbrowser.html
|
EDITOR |
If defined, will be used as the editor to edit bookmarks with option --write. |
https_proxy
If defined, will be used to
access http and https resources through the configured
proxy. Supported format:
http[s]://[username:password@]proxyhost:proxyport/
GUI integration
buku can be integrated
in a GUI environment with simple tweaks. Please refer to:
https://github.com/jarun/buku/wiki/System-integration
buku allows you to customize the color scheme via a five-letter string, reminiscent of BSD LSCOLORS. The five letters represent the colors of
|
- |
index |
|||
|
- |
title |
|||
|
- |
URL |
|||
|
- |
description/comment/note |
|||
|
- |
tag |
respectively. The five-letter
string is passed is as the argument to
the --colors option, or as the value of the
environment variable
BUKU_COLORS.
We offer the following colors/styles:
The default colors string is oKlxm, which stands for
|
- |
bright cyan index |
|||
|
- |
bold bright green title |
|||
|
- |
bright yellow URL |
|||
|
- |
normal description |
|||
|
- |
bright blue tag |
Note that
|
- |
Bright colors (implemented as \x1b[90m - \x1b[97m) may not be available in all color-capable terminal emulators; | ||
|
- |
Some terminal emulators draw bold text in bright colors instead; | ||
|
- |
Some terminal emulators only distinguish between bold and bright colors via a default-off switch. |
Please consult the manual of
your terminal emulator as well as
https://en.wikipedia.org/wiki/ANSI_escape_code for
details.
|
1. |
Edit and add a bookmark from editor: |
buku -w
buku -w ’gedit -w’
buku -w ’macvim -f’ -a https://ddg.gg search
engine, privacy
|
The first command picks editor from the environment variable EDITOR. The second command opens gedit in blocking mode. The third command opens macvim with option -f and the URL and tags populated in template. | |||
|
2. |
Add a bookmark with tags ’search engine’ and ’privacy’, comment ’Search engine with perks’, fetch page title from the web: |
buku -a https://ddg.gg search engine, privacy -c Search engine with perks
|
In the output, >: url, +: comment, #: tags. | |||
|
3. |
Add a bookmark with tags ’search engine’ & ’privacy’ and immutable custom title ’DDG’: |
buku -a https://ddg.gg search engine, privacy --title ’DDG’ --immutable 1
|
Note that URL must precede tags. | |||
|
4. |
Add a bookmark without a title (works for update too): |
buku -a https://ddg.gg search engine, privacy --title
|
5. |
Edit and update a bookmark from editor: |
buku -w 15012014
|
This will open the existing bookmark’s details in the editor for modifications. Environment variable EDITOR must be set. | |||
|
6. |
Update existing bookmark at index 15012014 with new URL, tags and comments, fetch title from the web: |
buku -u 15012014 --url http://ddg.gg/ --tag web search, utilities -c Private search engine
|
7. |
Fetch and update only title for bookmark at 15012014: |
buku -u 15012014
|
8. |
Update only comment for bookmark at 15012014: |
buku -u 15012014 -c this is a new comment
|
Applies to --url, --title and --tag too. | |||
|
9. |
Export bookmarks tagged ’tag 1’ or ’tag 2’ to HTML, Markdown, Orgfile or a new database: |
buku -e
bookmarks.html --stag tag 1, tag 2
buku -e bookmarks.md --stag tag 1, tag 2
buku -e bookmarks.org --stag tag 1, tag 2
buku -e bookmarks.db --stag tag 1, tag 2
|
All bookmarks are exported if search is not opted. |
||||
|
10. |
Import bookmarks from HTML, Markdown or Orgfile: |
buku -i
bookmarks.html
buku -i bookmarks.md
buku -i bookmarks.db
|
11. |
Delete only comment for bookmark at 15012014: |
buku -u 15012014 -c
|
Applies to --title and --tag too. URL cannot be deleted without deleting the bookmark. | |||
|
12. |
Update or refresh full DB with page titles from the web: |
buku -u
buku -u --tacit (show only failures and exceptions)
|
This operation can update the title or description fields of non-immutable bookmarks by parsing the fetched page. Fields are updated only if the fetched fields are non-empty. Tags remain untouched. | |||
|
13. |
Delete bookmark at index 15012014: |
buku -d 15012014
|
The last index is moved to the deleted index to keep the DB compact. Add --tacit to delete without confirmation. | |||
|
14. |
Delete all bookmarks: |
buku -d
|
15. |
Delete a range or list of bookmarks: |
buku -d
100-200
buku -d 100 15 200
|
16. |
Search bookmarks for ANY of the keywords ’kernel’ and ’debugging’ in URL, title or tags: |
buku kernel
debugging
buku -s kernel debugging
|
17. |
Search bookmarks with ALL the keywords ’kernel’ and ’debugging’ in URL, title or tags: |
buku -S kernel debugging
|
18. |
Search bookmarks tagged ’general kernel concepts’: |
buku --stag general kernel concepts
|
19. |
Search for bookmarks matching ANY of the tags ’kernel’, ’debugging’, ’general kernel concepts’: |
buku --stag kernel, debugging, general kernel concepts
|
20. |
Search for bookmarks matching ALL of the tags ’kernel’, ’debugging’, ’general kernel concepts’: |
buku --stag kernel + debugging + general kernel concepts
|
21. |
Search for bookmarks matching any of the keywords ’hello’ or ’world’, excluding the keywords ’real’ and ’life’, matching both the tags ’kernel’ and ’debugging’, but excluding the tags ’general kernel concepts’ and ’books’: |
buku hello world --exclude real life --stag ’kernel + debugging - general kernel concepts, books’
|
22. |
List all unique tags alphabetically: |
buku --stag
|
23. |
Run a search and update the results: |
buku -s kernel debugging -u --tag + linux kernel
|
24. |
Run a search and delete the results: |
buku -s kernel debugging -d
|
25. |
Encrypt or decrypt DB with custom number of iterations (15) to generate key: |
buku -l 15
buku -k 15
|
The same number of iterations must be specified for one lock & unlock instance. Default is 8, if omitted. | |||
|
26. |
Show details of bookmarks at index 15012014 and ranges 20-30, 40-50: |
buku -p 20-30 15012014 40-50
|
27. |
Show details of the last 10 bookmarks: |
buku -p -10
|
28. |
Show all bookmarks with real index from database: |
buku -p
buku -p | more
|
29. |
Replace tag ’old tag’ with ’new tag’: |
buku --replace ’old tag’ ’new tag’
|
30. |
Delete tag ’old tag’ from DB: |
buku --replace ’old tag’
|
31. |
Append (or delete) tags ’tag 1’, ’tag 2’ to (or from) existing tags of bookmark at index 15012014: |
buku -u
15012014 --tag + tag 1, tag 2
buku -u 15012014 --tag - tag 1, tag 2
|
32. |
Open URL at index 15012014 in browser: |
buku -o 15012014
|
33. |
List bookmarks with no title or tags for bookkeeping: |
buku -S blank
|
34. |
List bookmarks with immutable title: |
buku -S immutable
|
35. |
Shorten the URL www.google.com and the URL at index 20: |
buku
--shorten www.google.com
buku --shorten 20
|
36. |
Append, remove tags at prompt (taglist index to the left, bookmark index to the right): |
// append tags
at taglist indices 4 and 6-9 to existing tags in bookmarks
at indices 5 and 2-3
buku (? for help) g 4 9-6 >> 5 3-2
// set tags at taglist indices 4 and 6-9 as tags in
bookmarks at indices 5 and 2-3
buku (? for help) g 4 9-6 > 5 3-2
// remove all tags from bookmarks at indices 5 and 2-3
buku (? for help) g > 5 3-2
// remove tags at taglist indices 4 and 6-9 from tags in
bookmarks at indices 5 and 2-3
buku (? for help) g 4 9-6 << 5 3-2
|
37. |
List bookmarks with colored output: |
$ buku --colors oKlxm -p
Arun Prakash Jana<EMAIL_ADDRESS>https://github.com/jarun/buku
https://github.com/jarun/buku/wiki
https://github.com/jarun/buku/issues
Copyright © 2015-2021 Arun Prakash Jana<EMAIL_ADDRESS>License GPLv3+:
GNU GPL version 3 or later
<http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and
redistribute it. There is NO WARRANTY, to the extent
permitted by law.


[wp-smart-honeypot] element index
All elements
a
i
l
n
s
w
_
_
top
__construct
wpCommentSmartHoneyPotPlugin::__construct()
in wp-smart-honeypot.php
Construct the class.
a
top
$addOn
wpCommentSmartHoneyPotPlugin::$addOn
in wp-smart-honeypot.php
$approvedComment
wpCommentSmartHoneyPotPlugin::$approvedComment
in wp-smart-honeypot.php
i
top
$icon_list
wpCommentSmartHoneyPotPlugin::$icon_list
in wp-smart-honeypot.php
$idRegex
wpCommentSmartHoneyPotPlugin::$idRegex
in wp-smart-honeypot.php
$insertAt
wpCommentSmartHoneyPotPlugin::$insertAt
in wp-smart-honeypot.php
l
top
$label
wpCommentSmartHoneyPotPlugin::$label
in wp-smart-honeypot.php
$label_list
wpCommentSmartHoneyPotPlugin::$label_list
in wp-smart-honeypot.php
n
top
$nameRegex
wpCommentSmartHoneyPotPlugin::$nameRegex
in wp-smart-honeypot.php
s
top
$salt
wpCommentSmartHoneyPotPlugin::$salt
in wp-smart-honeypot.php
w
top
wp-smart-honeypot.php
wp-smart-honeypot.php
in wp-smart-honeypot.php
wpCommentSmartHoneyPotPlugin
wpCommentSmartHoneyPotPlugin
in wp-smart-honeypot.php
Wordpress Comment Smart Honeypot Plugin.
wpcsh_check_form
wpCommentSmartHoneyPotPlugin::wpcsh_check_form()
in wp-smart-honeypot.php
Comment Approved.
wpcsh_encrypt_author
wpCommentSmartHoneyPotPlugin::wpcsh_encrypt_author()
in wp-smart-honeypot.php
Obfuscate the author field.
wpcsh_encrypt_comment
wpCommentSmartHoneyPotPlugin::wpcsh_encrypt_comment()
in wp-smart-honeypot.php
Obfuscate the comment field.
wpcsh_encrypt_email
wpCommentSmartHoneyPotPlugin::wpcsh_encrypt_email()
in wp-smart-honeypot.php
Obfuscate the email field.
wpcsh_encrypt_url
wpCommentSmartHoneyPotPlugin::wpcsh_encrypt_url()
in wp-smart-honeypot.php
Obfuscate the url field.
wpcsh_hidden_field_and_script
wpCommentSmartHoneyPotPlugin::wpcsh_hidden_field_and_script()
in wp-smart-honeypot.php
Comment Form Creation.
wpcsh_init
wpCommentSmartHoneyPotPlugin::wpcsh_init()
in wp-smart-honeypot.php
Initialize WP Comment Smart Honeypot Plugin.
wpcsh_insert_honey_pot
wpCommentSmartHoneyPotPlugin::wpcsh_insert_honey_pot()
in wp-smart-honeypot.php
Insert the Honeypot Field
wpcsh_pre_post
wpCommentSmartHoneyPotPlugin::wpcsh_pre_post()
in wp-smart-honeypot.php
Pre Comment On Post
a
i
l
n
s
w
_


Package provides the possibility to sampling complete datasets from a normal distribution to simulate cluster randomized trails for different study designs.
| Version: | 1.0 |
| Imports: | mvtnorm, stats |
| Suggests: | knitr, rmarkdown, lme4 |
| Published: | 2017-02-06 |
| Author: | Diana Trutschel, Hendrik Treutler |
| Maintainer: | Diana Trutschel <Diana.Trutschel at dzne.de> |
| License: | GPL-3 |
| NeedsCompilation: | no |
| Materials: | README |
| CRAN checks: | samplingDataCRT results |
| Reference manual: | samplingDataCRT.pdf |
| Vignettes: |
Using samplingDataCRT |
| Package source: | samplingDataCRT_1.0.tar.gz |
| Windows binaries: | r-devel: samplingDataCRT_1.0.zip, r-release: samplingDataCRT_1.0.zip, r-oldrel: samplingDataCRT_1.0.zip |
| OS X binaries: | r-release: samplingDataCRT_1.0.tgz, r-oldrel: samplingDataCRT_1.0.tgz |
Please use the canonical form https://CRAN.R-project.org/package=samplingDataCRT to link to this page.


Assessment and diagnostics for comparing competing clustering solutions, using predictive models. The main intended use is for comparing clustering/classification solutions of ecological data (e.g. presence/absence, counts, ordinal scores) to 1) find an optimal partitioning solution, 2) identify characteristic species and 3) refine a classification by merging clusters that increase predictive performance. However, in a more general sense, this package can do the above for any set of clustering solutions for i observations of j variables.
| Version: | 0.2.0 |
| Depends: | R (≥ 3.1.0) |
| Imports: | stats, methods, mvabund (≥ 3.1), ordinal (≥ 2015.1-21) |
| Suggests: | testthat, knitr, rmarkdown |
| Published: | 2018-01-16 |
| Author: | Mitchell Lyons [aut, cre] |
| Maintainer: | Mitchell Lyons <mitchell.lyons at gmail.com> |
| BugReports: | https://github.com/mitchest/optimus/issues |
| License: | GPL-3 |
| URL: | https://github.com/mitchest/optimus/ |
| NeedsCompilation: | no |
| Materials: | README NEWS |
| CRAN checks: | optimus results |
| Reference manual: | optimus.pdf |
| Vignettes: |
Optimus workflow |
| Package source: | optimus_0.2.0.tar.gz |
| Windows binaries: | r-devel: optimus_0.2.0.zip, r-release: optimus_0.2.0.zip, r-oldrel: optimus_0.2.0.zip |
| OS X binaries: | r-release: optimus_0.2.0.tgz, r-oldrel: optimus_0.2.0.tgz |
| Old sources: | optimus archive |
Please use the canonical form https://CRAN.R-project.org/package=optimus to link to this page.


2 references to CheckTypeNames
System.Management.Automation (2)
engine\remoting\client\JobManager.cs (2)
573
if (!
CheckTypeNames
(sourceAdapter, jobSourceAdapterTypes))
879
if (
CheckTypeNames
(sourceAdapter, adapterTypeNames))


13 Miscellaneous
Reusable elements that can be used across the site.
13.1 Locals Editor
Deprecated - This component will be replaced in the future please don't use it anymore.

Label

<input name="lastName" type="text" class="form-control input-lg">
EN

13.2 Thumbnails
Thumbnail with Status Indicator and centered hover content
selected state
.active

Status

<button class="btn btn-primary btn-lg">Some Button</button>

<button class="btn btn-default">Some Button</button>

13.3 Alerts
Provide the user with contextual and relevant feedback for typical user actions through the utilization of a handful of available and flexible alert messages
Well done! You successfully read this important alert message.
Heads Up! Are you sure you want to do that?
Stop! This is all wrong.

<button type="button" class="close" data-dismiss="alert" aria-label="Close">×</button>
Well done! You successfully read this important alert message.

<button type="button" class="close" data-dismiss="alert" aria-label="Close">×</button>
Heads Up! Are you sure you want to do that?

<button type="button" class="close" data-dismiss="alert" aria-label="Close">×</button>
Stop! This is all wrong.


Thank you for your preference
To receive more news about our restaurant
Menu
Quantites
How do you want to pay?
Would you recommend the Goat's Pizza Delivery to a friend?
Any comments or suggestions for our restaurant?


| Ticket ID: 409788 | |
| Name: |
Parker Seidel
No Active Support
|
| Email: |
<EMAIL_ADDRESS>|
| Response Time: |
72hours, 60hours left
|
| Last Action: |
Never been locked
Link to public post
|
| Status: |
Not answered
|


Getting Credits
Neutron Drive is brought to you by the following Members
{{ level[0] }}s
{{ user.name }}
Thanks to the following open source projects that made Super Neutron Drive possible.
-
ACE Editor
Ace is an embeddable code editor written in JavaScript. It matches the features and
performance of native editors such as Sublime, Vim and TextMate. It can be easily
embedded in any web page and JavaScript application. Ace is maintained as the primary
editor for Cloud9 IDE and is the successor of the Mozilla Skywriter (Bespin) project.
-
AngularJS
An open-source web application framework, maintained by Google and community, that
assists with creating single-page applications, one-page web applications that only
require HTML, CSS, and JavaScript on the client side. Its goal is to augment web
applications with model–view–controller (MVC) capability, in an effort to make both
development and testing easier.
-
Bootstrap
Bootstrap is the most popular HTML, CSS, and JS framework for developing responsive,
mobile first projects on the web.
-
Font Awesome
Font Awesome gives you scalable vector icons that can instantly be customized — size,
color, drop shadow, and anything that can be done with the power of CSS.
-
jQuery
jQuery is a fast, small, and feature-rich JavaScript library. It makes things like HTML
document traversal and manipulation, event handling, animation, and Ajax much simpler
with an easy-to-use API that works across a multitude of browsers. With a combination of
versatility and extensibility, jQuery has changed the way that millions of people write
JavaScript.
-
AngularUI
User interface companion suite to the AngularJS framework.
-
Javascript MD5
JavaScript MD5 implementation. Compatible with server-side environments like node.js,
module loaders like RequireJS and all web browsers.
-
Typo.js
Typo.js is a JavaScript spellchecker that uses Hunspell-style
dictionaries. Its main use is to allow Chrome extensions to perform
client-side spellchecking.


Customer Registration
Please choose your information to begin the process
First Name
Last Name
City
State
Pin Code


{% extends "organizing_hub_groups.html" %} {% load bootstrap3 django_bootstrap_breadcrumbs pages_tags static wagtailcore_tags %} {% block breadcrumbs %} {{ block.super }} {% add_group_url as link_url %} {% breadcrumb "Add Group" link_url %} {% endblock %} {% block content %} {{ block.super }}
Our Revolution is made up of local groups from all around the world. To add your existing group to ourrevolution.com/groups, begin by filling out the form below.
Don't have a group? Visit our organizing resources to find out how you can start one.
* = required field
Please submit only one form per group. If your group has received a group ID, please reach out to us at organizing@ourrevolution.com.


|
|
CIFXGlyphCommandList Class ReferenceInheritance diagram for CIFXGlyphCommandList:
List of all members.
|
Public Member Functions |
| U32 IFXAPI | AddRef () |
| U32 IFXAPI | Release () |
| IFXRESULT IFXAPI | QueryInterface (IFXREFIID riid, void **ppv) |
| IFXRESULT IFXAPI | AddTagBlock (IFXGlyph2DCommands::EGLYPH_TYPE comType, F64 x=0, F64 y=0) |
| IFXRESULT IFXAPI | AddMoveToBlock (F64 x, F64 y) |
| IFXRESULT IFXAPI | AddLineToBlock (F64 x, F64 y) |
| IFXRESULT IFXAPI | AddCurveToBlock (F64 x1, F64 y1, F64 x2, F64 y2, F64 x3, F64 y3, U32 numSteps=CURVE_STEPS_NUM) |
| IFXRESULT IFXAPI | GetList (IFXSimpleList **ppList) |
Private Member Functions |
| | CIFXGlyphCommandList () |
| virtual | ~CIFXGlyphCommandList () |
| IFXRESULT | RobustConstructor () |
Private Attributes |
| U32 | m_refCount |
| IFXSimpleList * | m_pData |
Friends |
| IFXRESULT IFXAPI_CALLTYPE | CIFXGlyphCommandList_Factory (IFXREFIID iid, void **ppv) |
Constructor & Destructor Documentation
| CIFXGlyphCommandList::CIFXGlyphCommandList |
( |
|
) |
[private] |
|
|
|
This is the component constructor.
It doesn't do anything significant.
- Note:
- Significant state initialization is done by the RobustConstructor method if it's available or an interface specific Initialize method if one's supported.
|
| CIFXGlyphCommandList::~CIFXGlyphCommandList |
( |
|
) |
[private, virtual] |
|
|
|
This is the component destructor.
After all references to the component are released, it performs any necessary cleanup activities. |
Member Function Documentation
| IFXRESULT CIFXGlyphCommandList::AddCurveToBlock |
( |
F64 |
x1, |
|
|
F64 |
y1, |
|
|
F64 |
x2, |
|
|
F64 |
y2, |
|
|
F64 |
x3, |
|
|
F64 |
y3, |
|
|
U32 |
numSteps = CURVE_STEPS_NUM |
|
) |
[virtual] |
|
| IFXRESULT CIFXGlyphCommandList::AddLineToBlock |
( |
F64 |
x, |
|
|
F64 |
y |
|
) |
[virtual] |
|
| IFXRESULT CIFXGlyphCommandList::AddMoveToBlock |
( |
F64 |
x, |
|
|
F64 |
y |
|
) |
[virtual] |
|
| U32 CIFXGlyphCommandList::AddRef |
( |
|
) |
[virtual] |
|
|
|
This method increments the reference count for an interface on a component.
- Note:
- It should be called for every new copy of a pointer to an interface on a given component.
- Returns:
- It returns a U32 that contains a value from 1 to 2^32 - 1 that defines the new reference count. The return value should only be used for debugging purposes.
Implements IFXUnknown. |
| IFXRESULT CIFXGlyphCommandList::GetList |
( |
IFXSimpleList ** |
ppList |
) |
[virtual] |
|
| IFXRESULT CIFXGlyphCommandList::QueryInterface |
( |
IFXREFIID |
riid, |
|
|
void ** |
ppv |
|
) |
[virtual] |
|
|
|
This method provides access to the various interfaces supported by a component.
Upon success, it increments the component's reference count and hands back a pointer to the specified interface.
- Note:
- A number of rules must be adhered to by all implementations of IFXAPI QueryInterface . For a list of such rules, refer to the IFXCOM usage guidelines.
- Returns:
- Upon success, IFX_OK is returned. Otherwise, either IFX_E_INVALID_POINTER or IFX_E_UNSUPPORTED are returned.
Implements IFXUnknown. |
| U32 CIFXGlyphCommandList::Release |
( |
|
) |
[virtual] |
|
|
|
This method decrements the reference count for the calling interface on a component.
- Note:
- If the reference count on a component falls to zero, the component is destroyed.
- Returns:
- It returns a U32 that contains a value from 1 to 2^32 - 1 that defines the new reference count. The return value should only be used for debugging purposes.
Implements IFXUnknown. |
| IFXRESULT CIFXGlyphCommandList::RobustConstructor |
( |
|
) |
[private] |
|
|
|
This is the component's constructor that can return a result code.
In it, allocation of other components or memory can be performed. It's called by the factory function only, immediately after the component has been created and has been AddRef'd.
- Note:
- If nothing meaningful happens in this method, it can be removed from this class (as well as its usage from the factory function).
- Returns:
- Upon success, IFX_OK is returned. Otherwise, one of the following are returned:
- Todo:
- : return codes.
|
Friends And Related Function Documentation
| IFXRESULT IFXAPI_CALLTYPE CIFXGlyphCommandList_Factory |
( |
IFXREFIID |
iid, |
|
|
void ** |
ppv |
|
) |
[friend] |
|
|
|
This is the CIFXComponentName component factory function.
It's used by IFXCreateComponent to create an instance of the component and hand back a pointer to a supported interface that's requested.
- Note:
- This component can be instaniated multiple times.
- Parameters:
-
| interfaceId | Reference to the interface id that's supported by the component that will be handed back. |
| ppInterface | Pointer to the interface pointer that will be initialized upon successful creation of the component. |
- Returns:
- Upon success, IFX_OK is returned. Otherwise, one of the following failures are returned: IFX_E_COMPONENT, IFX_E_INVALID_POINTER, IFX_E_OUT_OF_MEMORY or IFX_E_UNSUPPORTED.
|
Member Data Documentation
© 1999 - 2006 Intel Corporation. All rights reserved.
* Other names and brands may be claimed as the property of others.
|
|


FROM THE DESK OF MR ALIABDULAHI (ESQ) TH HEAD OF FILE DEPARTMENT, IN BANK OF AFRICA(B.O.A) OUAGADOUGOU BURKINA-FASO WEST AFRICA. US$10.5M (TEN MILLION FIVE HUNDRED THOUSAND UNITED STATES DOLLARS) REMITTANCE OF CONFIDENTIAL IS THE CASE") COMLIMENTS OF THE SEASON 2007, I AM (MR ALIABDULAHI(ESQ)HEAD OF FILE DEPARTMENT & DEBT RECOVERING IN( BANK OF AFRICA) OUAGADOUGOU BURKINA-FASO WEST AFRICA.  THIS IS BY VIRTUE OF ITS NATURE AS BEING UTTERLY CONFIDENTIAL AND TOP SECRET. HOWEVER AFTER SERIES OF PETITION WAS RECIEVED BY THIS PRESENT REGIME FROM FOREIGN CONTRACTORS AND INABILITY OF THE BANK OF AFRICA (B.O.A)TO FULFILL THEIR OBLIGATION FOR THE PAYMENT TO ITS FOREIGN CREDITORS, IN CONJUNCTION WITH THE COUNCIL OF MINISTERS, THEY MANDATED US TO CARRY OUT A CAREFUL AND COMPREHENSIVE REVIEW OF ALL OVERDUE PAYMENTS TO FOREIGN CONTRACTORS AND TO EFFECT PAYMENTS IMMEDIATELY. DURING THE ABOVE MENTIONED PROCESS, WE DISCOVERED AN ABANDONED SUM OF US$10.5M (TEN MILLION FIVE HUNDRED THOUSAND UNITED STATES DOLLARS )IN AN ACCOUNT THAT BELONGS TO ONE OF OUR FOREIGN CUSTOMER (MR. ANDREAS SCHRANNER FROM MUNICH, GERMANY) WHO DIED ALONG WITH HIS ENTIRE FAMILY IN A PLANE CRASH THAT HAPPENED ON (MONDAY 31 JULY 2000).SINCE WE GOT INFORMATION ABOUT HIS DEATH, WE HAVE BEEN EXPECTING HIS NEXT OF KIN TO COME OVER AND CLAIM HIS MONEY BECAUSE WE CANNOT RELEASE IT UNLESS SOME BODY APPLIES FOR IT AS NEXT OF KIN OR RELATION TO THE DECEASED AS INDICATED IN OUR BANKING GUIDELINES AND LAWS BUT ALONG SIDE UNFORTUNATELY WE LEARNT THAT ALL HIS SUPPOSED NEXT OF KIN OR RELATION DIED WITH HIM AT THE PLANE CRASH LEAVING NOBODY BEHIND FOR THE CLAIM.  I AGREE THAT 40% OF THIS MONEY WILL BE FOR YOU AS A FOREIGN PARTNER, IN RESPECT TO THE PROVISION OF A FOREIGN ACCOUNT,AND 50% WOULD BE FOR ME, WHILE 10% WILL BE FOR EXPENSES INCURE DURING THE TRANSACTION.


Popular Wishaw shop worker is this week's Say it with Flowers winner
Maggie Dunne was nominated by her daughter Michelle for all the hard work she does for her family.
by Gregor Farquharson, https://www.dailyrecord.co.uk/authors/gregor-farquharson/A popular Aldi worker who’s known by everyone is this week’s Say It With Flowers winner.
Maggie Dunne was nominated by her daughter Michelle for all the hard work she does for her family.
Michelle said: “My mum home-schooled me since I was 14 and helped me get into university to study mental health nursing.
“She helped support me through having my baby, Tommy, who I was 38 weeks pregnant with when I graduated.”
Maggie also helped Michelle get through uni by helping with essays and living costs.
“She read all my essays through to make sure they were okay and supported me financially. She paid for my car insurance and gave me rent-free accommodation while I was studying.”
Maggie currently works long weekends in Aldi but that doesn’t get her down and she has become a well-known face in the store.
“All her customers love her,” said Michelle.
“When I was getting scans when I was pregnant, everyone would say hello to her when walking through the hospital.”
We helped Michelle surprise her mum at their Newmains home with a beautiful bouquet, courtesy of Pixies Petals.
“She really is just a great mum, she never asks for anything and never complains about anything.
“She is 58 and has sore arms but she is always smiling and making time for people. She does everything for everyone.”
If you would like to nominate someone for our Say it with Flowers competition, you can do so by emailing their name, the reason for the nomination and a contact phone number for yourself to: news@wishawpress.co.uk.


{% extends 'base.html'%} {% import 'macros.html' as macro%} {% block content %}
{{new.author}}
{{new.description}}
{{new.timePublished}}


Numbers that are formed by multiplying ten by itself a particular number of times. When written in base ten, they end in that number of zeroes. The first few powers of ten are:
$$\begin{aligned}
10 = 10^{1} & = & ten \\
100 = 10^{2} & = & hundred \\
1000 = 10^{3} & = & thousand \\
1000000 = 10^{6} & = & million \\
1000000000 = 10^{9} & = & billion \\
1000000000000 = 10^{12} & = & trillion \\
10^{15} & = & quadrillion \\
10^{18} & = & quintillion \\
10^{21} & = & sextillion \\
10^{24} & = & septillion \\
10^{27} & = & octillion \\
10^{30} & = & nonillion \\
10^{33} & = & decillion \end{aligned}$$