| Dennis Heimbigner |
| Software Engineering Research Laboratory |
| Computer Science Department |
| University of Colorado |
| Boulder, Colorado 80309-0430 USA |
|<EMAIL_ADDRESS>|
| Last Updated: | 1 October 2005 |
| Latest Version: | Snobol3 Version 1.0 |
| Minimum JDK Level: | JDK 1.5 |
| 1. | Snobol3 Language Reference |
| 1.1 | Lexical Structure |
| 1.2 | Grammar |
| 1.3 | Processing Cycle |
| 1.3.1 | Subject |
| 1.3.2 | Pattern Matching |
| 1.3.3 | Pattern Matching Elements |
| 1.3.4 | Branching |
| 1.3.5 | Built-In Functions |
| 1.3.6 | User Defined Functions |
| 2. | Usage |
| 3. | Examples |
| 4. | Compiler/Interpreter |
| 4.1 | Architecture |
| 4.2 | Execution |
| 4.3 | Virtual Machine Operators |
| 4.4 | Extending the Interpreter |
| 5. | Installation |
| 6. | Change Log |
| 7. | Point of Contact |
| 8. | License |
"Snobol 3 Primer: an introduction to the computer programming language." by Allen Forte. M.1.T. Press, 1967.If any reader of this detects an error in interpretation or in some missing feature, please contact the author.
Since there are many similarities, knowledge of Snobol4 as defined in this book
"The SNOBOL 4 programming language" (2nd Ed.) by R. E. Griswold, J. F. Poage, and I. P. Polonsky. Prentice-Hall, 1971.may be helpful.
| [*] | Asterisk: rest of the line is a Comment. | ||||||
| [.] | Period: this is a continuation of the preceding line. | [a-zA-Z0-9] | Label: the line has a label. | [ \t]' | Whitespace: the line has no label. | [-] | Dash: indicates certain flags. The set of flags specified in the Primer are useless in modern computing environments. Instead, this marker has been modified to allow the insertion of command line option flags (Section ?) into the program. The general form is "-name[=value]"; the value is optional and if missing is presumed be the value "true". |
The lexical elements are defined as follows (using regular expressions).
| [a-zA-Z0-9.]+ | Name; Note that in Snobol3, a string of digits is a name. | |
| [a-zA-Z0-9][a-zA-Z.]* | Label; Note that labels are a restricted set of names. | |
| [/+-=()*,/$] | Delimiters | |
| ['][^'\n]*['] | String; Note the use of single quotes and that string constants may not cross line boundaries. As an extension, options exist (Section ?) to allow the use of double quotes and to allow the inclusion of escape sequences (e.g., '\n') in strings. | |
| [ \t] | Whitespace; This is removed from the token stream before the parser sees it. |
Notes:
program: (statement)+ EOF;
statement: (LABEL)? (body)? EOL;
body: subject (pattern)? (replacement)? (branch)?;
subject: primary;
replacement: EQUAL (concat)?;
concat: (expr)+;
expr: term ((PLUS|MINUS) term)*;
term: primary ((MULT|DIV) primary)*;
primary: atom | LPAREN unary RPAREN ;
unary: concat | (PLUS|MINUS) concat ;
atom: var | STRING | fcncall;
var: reference | NAME;
reference: DOLLAR primary;
fcncall: FCNNAME args ;
args: LPAREN (arglist)? RPAREN ;
arglist: concat (COMMA concat)* ;
pattern: (pattest)+;
pattest: patvar | expr;
patvar: STAR patmatch STAR ;
patmatch: (var)? (SLASH primary | BAR patfcn)? | LPAREN (var)? RPAREN ;
patfcn: PATFCNNAME args ;
branch: SLASH (s (f)? | f (s)? | go);
s: SUCCESS LPAREN dest RPAREN ;
f: FAIL LPAREN dest RPAREN ;
go: LPAREN dest RPAREN ;
dest: label| RETURN | FRETURN | END | reference;
label: LABEL | NAME;
This grammar can be processed by Antlr, although Antlr was not used throughout because of the problem of building the lexer and because it was overkill for such a simple language. In the rest of this document, <...> generally refers to a grammar non-terminal from the grammar above.
As shown in the grammar, an expression is composed of the following operators: addition (+), subtraction (-), multiplication (*), and integer division (/). Concatenation is also allowed and is represented by whitespace between expressions.
Add, subtract, multiply, and divide have the usual precedence. Concat has a lower precedence than any of the arithmetic operators. Parentheses are available to alter the evaluation order in the usual way.
Unary minus and plus are allowed, but only immediately after a left parenthesis; this again avoids an ambiguity in the grammar. Unary operators may be an extension to Snobol3; the primer is unclear.
The atomic elements of an expression are string constants, variable references, and function calls. Note that for function calls, it is illegal to provide too many arguments, but it is ok to provide too few; the remaining arguments are padded with the empty string.
In order to remove any ambiguity, a subject expression must be enclosed in parentheses, unless it is an atom.
<IP_ADDRESS> Variables: Variables are atomic elements in an expression (along with string constants and function calls). Scoping in Snobol3 is two-level: global and local (to function bodies). This is similar to C.
Variables are specified in one of two ways in Snobol3.
| Shorthand Name | Syntax | Definition | |||
|---|---|---|---|---|---|
| StringMatch | <expression> | Initial:
Succeed if the substring
at the cursor matches the specified string that is the result of computing
the expression; fail otherwise.
Retry: fail always. | |||
| Arb | *<var>* | Initial: Succeed matching zero characters. If var is specified, then assign the current matched substring to var.||||
| Len | *<var>/<expr>* | Initial:
Compute <expr> as an integer, call it length.
It there are at least length characters following the cursor,
then match those characters and succeed, otherwise fail.
If var is specified, then assign the current matched substring to var.
Retry: fail always. | |||
| Bal(anced) | *(<var>)* | Initial:
Examine the character under the cursor, and act as follows.
Retry: Same as initial. If var is specified, then assign the current matched substring to var. | |||
| Various | *<var>|<fcncall>* | Initial:
Compute the arguments to the function and invoke the
"initial()" entry for the function (see Section <IP_ADDRESS>).
On success, and if the var is specified,
then assign the current matched substring to var.
Retry: Invoke the "retry()" entry for the function. On success, and if the var is specified, then assign the current matched substring to var. |
= ''
If a <pattern> is specified in the statement, then if the match succeeds, then the substring of the subject that is matched by the pattern is replaced by the value of the replacement expression.
f(label1)then transfer of control goes to the statement labeled "label1". If success is signaled, then execution of the statement continues until the branch part is reached. If a success case is signaled (e.g.)
s(label1)then transfer of control goes to the label specified by the success case. It is also possible to specify an unconditional branch
(label1)that will be executed no matter what value of the condition code.
It is unclear what happens if the evaluation of an expression fails and there is no f() branch specified; does it continue to execute, or does it stop the stmt execution and move to the next statement? This interpreter assumes the latter action.
It is also unclear exactly what combinations of branches are allowed. This interpreter assumes the following combinations are allowed.
| EQUALS(s,t) | Succeeds if s.equals(t) (in the Java sense); fails otherwise | |||||||||||||
| UNEQL(s,t) | Succeeds if !s.equals(t); fails otherwise. | |||||||||||||
| SIZE(s) | returns s.length(); always succeeds. | |||||||||||||
| EQ(i,j) | Succeeds if i == j (as integers); fails otherwise. | |||||||||||||
| GE(i,j) | Succeeds if i >= j (as integers); fails otherwise. | |||||||||||||
| GT(i,j) | Succeeds if i > j (as integers); fails otherwise. | |||||||||||||
| LE(i,j) | Succeeds if i <= j (as integers); fails otherwise. | |||||||||||||
| LT(i,j) | Succeeds if i < j (as integers); fails otherwise. | |||||||||||||
| NE(i,j) | Succeeds if i != j (as integers); fails otherwise. | |||||||||||||
| NUM(s) | Succeeds if Integer.decode(s) succeeds ; fails otherwise. | |||||||||||||
| REMDR(i,j) | Computes i % j (the remainder function); always succeeds; division by zero causes interpreter to halt. | |||||||||||||
| ANCHOR() | Causes the current pattern match to operate in anchored mode; always succeeds; usually the first element in a pattern. | |||||||||||||
| UNANCH() | Causes the current pattern match to operate in unanchored mode; always succeeds; usually the first element in a pattern. | |||||||||||||
| PRINT(s) | cause the variable $(s) to operate in output mode. | |||||||||||||
| READ(s) | cause the variable $(s) to operate in input mode. | |||||||||||||
| MODE(s) | The argument string s specifies a series of one or more comma separated flags that affect the global operation of the interpreter. The currently defined mode flags are as follows. | |||||||||||||
Mode flags can be set either in the program using the MODE function or using the "-mode" option flag on the command line (Section ?). The expression "MODE('x,y')" is equivalent to specifying the option flag on the command line (e.g., -mode "x,y"). | ||||||||||||||
| TRACE(s) | The argument string s specifies a series of one or more comma separated function names. After the execution of this function, the calls to this function and the return value will be traced and printed to stdout. | |||||||||||||
| STRACE(s) | The argument string s specifies a series of one or more comma separated variable names. After the execution of this function, all assignments to any of these variables will be traced and printed to stderr. Note that the primer indicates that the argument, s, can only specify one variable name; it has been extended here to support multiple names. | |||||||||||||
| CALL(s) | The argument string s specifies a function call. It is dynamically interpreted and the corresponding function is invoked as if it occurred at the point of the CALL function. | |||||||||||||
| DEFINE(s,t,u...) | The argument string s specifies the definition of a function. The t argument specifies a label that represents the first statement in the function body. The sequence of zero or more u arguments represent the names of variables that should be given local scope when the function is executed. |
A function is defined using the "DEFINE" built-in function. This is treated in a non-standard way in that it is actually evaluated at compile time, and hence its arguments can only be constant strings. This also means that it cannot be invoked dynamically. The reasons for this is that it makes code generation overly difficult and that it seems to have no use.
The define "declaration" must precede the label which marks the function body. This means as a rule that you will have a sequence of defines interspersed with or preceding a sequence of function bodies. Appropriate unconditional branches must be associated with one or more defines to jump around the function bodies.
The general form of a function declaration is
DEFINE(s,t,u...)where the string s specifies the definition of a function. The t argument specifies a label that represents the first statement in the function body. The sequence of zero or more u arguments represent the names of variables that should be given local scope when the function is executed.
Syntactically, the function definition (string s)
and the locals list (strings u...) follow this grammar.
fcndecl: NAME LPAREN (formals)? RPAREN;
formals: namelist;
locals: namelist;
namelist: NAME (COMMA (NAME)?)*;
Invoking a function causes its actual arguments to be evaluated and assigned to the corresponding formal arguments. The formals arguments are treated as variables with local scope. The list of locals are initialized to the empty string and, of course, also have local scope. Finally, functions return values by assigning to a variable with the same name as the function. This pseudo-variable also has local scope.
The variables "SYSPOT" and "SYSPPT" are predefined. The language has been extended to also predefine the variables "stdin" and "stdout" as additional input and output variables respectively.
It is possible to define additional input and output variables using the primitive functions "READ(<var>)" and "PRINT(<var>)" respectively. The PRINT function has been extended to take a second string argument. The second argument is a comma separated list of flags. Currently the following flags are defined.
java -jar s3.jar [<options>] <program>The possible option flags are as follows. Boolean options (such as -exec) may be preceded by "no" (e.g., "-noexec") to negate the flag.
or
java -classpath s3.jar jsnobol3.Snobol3 [<options>] <program>
define('abs(abs)','abs') /(main) abs abs '-' = /(return) main stdout = abs('-5') stdout = abs('5')
Greatest Common Divisor
define('gcd(m,n)','gcd') /(main)
gcd gcd = .ne(m) m /f(return)
m = .remdr(n,m)
n = gcd /(gcd)
main stdout = gcd('12','18')
Recursive Factorial
define('rfact(n)','rfact') /(main)
rfact rfact = .le(n,'1') '1' /s(return)
rfact = n * rfact(n - '1') /(return)
main stdout = rfact('4')
Iterative Factorial
define('fact(n)','fact') /(main)
fact fact = '1'
fact2 fact = .gt(n) fact * n /f(return)
n = n - '1' /(fact2)
main stdout = fact('4')
| Character | Action |
|---|---|
| "*" | This signals a comment; remove it. |
| "." | This signals a continuation; combine with previous line to form one single line. |
| "-" | This signals an option of form "name[=value]"; save in the options map and otherwise treat the line like a comment. The possible values are the same as for command line options (Section ?). |
| Label Character | This signals that the line has a label; collect it and store in the "labels" table, otherwise do nothing. |
| Whitespace ([ \t]) | This signals that the line has no label; do nothing. |
Pass 3 actually has a second sub-pass to handle forward referencing of labels. A binding list is kept that lists the operators that need to be bound to a specific address for a specific named label. This list is walked after all other code generation. Each specified operator is modified to refer the to address of the specified label.
The "grammar" for the AST is as follows.
program: PROGRAM (statement)*;
statement: STATEMENT LINENO (LABEL)? subj=(primary)? (pattern)? repl=(concat)? (branch)?;
concat: expr | CONCAT (expr)+;
expr: term | ADD term term | SUBSTRACT term term;
term: primary | MULT primary primary | DIV primary primary;
var: NAME String | reference;
reference: REFERENCE primary;
primary: unary | atom ;
unary: concat | NEGATE concat;
atom: STRING | var | fcncall;
fcncall: FCNCALL String arglist;
arglist: ARGLIST (concat)*;
pattern: PATTERN (pattest)*;
pattest: patmatch | expr;
patmatch: BALANCE (var)? | LEN (var)? primary | PATFCN (var)? fcncall | ARB (var)?;
branch: BRANCH dest dest dest;
dest: label | reference;
fcndel: DEFINITION String namelist;
namelist: NAMELIST (NAME)*;
LABEL: [String];
NAME: [String] ;
FCNCALL: [String];
STRING: [String];
LINENO: [Integer];
The right side describes the structure of an AST node. The names in capitals represent the type of the node. The subtrees, if any, are defined by the structures that follow the type. Thus, a "branch" AST has the type BRANCH and has three subtrees that have the structure defined by "dest".
Right sides that consist of a single bracketed type are leaves and have an associated value of that Java type. Thus, a LABEL is a leaf with the label name encoded as a Java String object.
To execute, the operator obtains its arguments, if any, and then performs its specific action. This action typically will pop its arguments, perform some computation, and push a result onto the stack.
An Operator can obtain arguments in two ways. First, it can access the stack using push(),pop(), and top(). Second, it can have a constant argument built into the Operator instance.
Operators
| Add(a,b) | a = a + b |
| AssignLocal(value,var) | Assign the value to a local variable. |
| Assign(value,var) | Assign the value to a variable; If the variable is defined locally or globally, then assign to that variable, otherwise create locally if possible, globally otherwise. |
| Begin | Do any necessary initialization at the start of the whole program. |
| BeginFcn | Create the new local space for this invocation of the function. |
| BeginStmt[dest,lineno] | Mark the stack for use by EndStmt, initialize the condition code, and save dest as a pointer to the end of the statement. Also, set the source line number for the statement. |
| CVI | Convert the top stack value to an Integer. |
| CVS | Convert the top stack value to a String. |
| CVV | Convert the top stack value to a variable (the "$" operator). |
| CallRet | Used by the CALL statement to cause a call to return after the CALL statement. |
| Concat(a,b...)[N] | Concatenate the top N elements into a single string. |
| Deref(var) | Replace the var with its value on the stack. |
| Div(a,b) | a = a / b; using integer division |
| Dup(a) | Push a copy of a onto the stack. |
| End | Signal the virtual machine to stop executing. |
| EndStmt[sdest,fdest] | Clear the stack down to the point marked by the previous BeginStmt. Use the condition code to start execution of the success or failure branches. |
| Frame | Save the current frame and create a new one on entry to a function. |
| FReturn | Set the condition code to failure and return to just after the call. |
| IJump(var) | Pop the var, get its value, and use it as a label name to which to jump. |
| JSR[dest] | Save the pc into the VM's frame and jump to the specified destination. This is effectively the call instruction for invoking a function. |
| Jump[dest] | Jump to dest. |
| Mult(a,b) | a = a * b |
| Negate(a) | a = - a |
| Nth | Extract the nth element in the eval stack, with n=0 as the stack top. |
| Primitive[primfcn] | Invoke the specified primitive function. |
| Push[value] | Push value onto the eval stack. |
| Replace(var,range,rhs) | Replace the substring of the var as specified by the range with the rhs value. Pop all three from stack. |
| RetVal | Extract the return value for a user defined function and load it into the return value in the VM. Recall that the return value for a user defined function is the variable with the same name as the function. |
| Return | Push the VM's current return value onto the eval stack. |
| Subtract(a,b) | a = a - b |
| Swap(a,b) | tmp=a; a=b; b=tmp; (Swap top two eval stack elements). |
| Unframe | Throw away the current frame and return to the previous frame. Used as part of the function return process. |
Pattern Related Operators
| Arb | Implement the Arb pattern element. |
| Balance | Implement the Balanced pattern element. |
| BeginPattern(subject,var) | Load the subject string into the VM's match state. If the subject is also a variable, then load that as well. On retry, move the anchor point if allowed, otherwise fail. |
| EndPattern(range...) | Successful conclusion to a match, so capture the full range matched by the pattern, remove all interim ranges, and leave the full range on the stack. |
| Len | Implement the Len pattern element. |
| StringMatch | Implement the StringMatch pattern element. |
It would be interesting to see if this set could be converted to use the Snobol4 macro operators.
To define the function, we add the following code to the
source file "Primitive.java".
class $REmatch // The primitive class names begin with $ as a convention.
extends Primitive
{
public $REmatch() {super(2);} // This function <= 2 arguments
public ArgType typeFor(int argi)
{return ArgType.CVS;} // All arguments are required to be a string
// The compiler will insert appropriate CVS
// operators to ensure this.
public void execute(VM vm, PrimFunction fcn) throws Failure
{
String re = (String)vm.pop(); // pop regular expression off the stack.
String s = (String)vm.pop(); // pop target string off the stack.
if(re.length() == 0)
throw new Failure(vm,"rematch: empty regular expression");
// See if the string can be matched by the RE
boolean match = false;
try {
match = s.matches(re);
} catch (PatternSyntaxException pse) {
throw new Failure(vm,"rematch: illegal regular expression: "+re);
}
vm.cc = !match; // if the match failed, then set the condition code.
setReturn(); // return empty string on success
}
}
This function is made known to the interpreter
by adding the following line to the procedure
"definePrimitives()" at the top of the file "Primitive.java".
fcnDef("rematch",(p=new $REMatch()));
*<var>|<fcncall>*
The example below defines a variant of the balanced pattern. It takes one argument: a string of length two and specifying the left and right brackets to match. Thus, the operator *(x)* would be equivalent to *x|bracket('()')*.
To define the function, we add the following code to the
source file "PatternOp.java".
class BracketOp extends PatternOp
{
char lbracket = 0;
char rbracket = 0;
public BracketOp() {super();}
public int nargs() {return 1;}
// On entry, the stack from top down contains the following items:
// top: function argument n
// function argument n-1
// ...
// function argument 1
// var name or null if none specified
public void initial() throws Failure
{
// get the bracket pair
String pair = (String)vm.pop();
// get name of our variable from stack and keep until failure
opvar = (VRef)vm.pop();
if(pair.length() != 2)
throw new Failure(vm,"Bracket: illegal bracket pair: "+pair);
// decompose the bracket pair
lbracket = pair.charAt(0);
rbracket = pair.charAt(1);
// create an initial range value
Range r = new Range(state.cursor,state.cursor);
if(!bracket(r)) {
fail(r.r0); // fail and revert the cursor
} else {
assign(r); // assign the range to the variable, if any
succeed(r); // succeed, saving the current range on the stack
}
}
public void retry() throws Failure
{
Range r = (Range)vm.pop(); // obtain the range from the last retry
if(!bracket(r)) fail(r.r0); else {assign(r); succeed(r);}
}
boolean bracket(Range r)
{
String subject = state.subject; // get the subject string
int len = subject.length(); // and length
if(r.rn >= len) return false; // if we have matched to the end,
// we cannot extend, so signal failure
char ch = subject.charAt(r.rn);
if(ch == rbracket)
return false; // if the next character is the rbracket, fail
if(ch != lbracket) {
r.rn++; // if next character is not an lbracket, advance one char
return true; // and succeed
}
// Only case left is that we are at an lbracket, need to scan
// forward to find a matching rbracket, taking nesting into account
int rn = r.rn+1;
int depth = 1;
while(rn < len && depth > 0) {
ch = subject.charAt(rn++);
if(ch == lbracket)
depth++;
else if(ch == rbracket)
depth--;
// else do nothing
}
if(depth == 0) {
r.rn = rn; // record our current last matched char + 1.
return true;
}
// we got to the end of the subject without balancing the brackets
return false;
}
}
This function is made known to the interpreter
by adding the following line to the procedure
"definePatterns()" at the top of the file "PatternOp.java".
Snobol3.patterns.put("bracket",new BracketOp());
There are some things to note.
Minor version levels are indicated in parentheses.
| Author: | Dennis Heimbigner |
| Software Engineering Research Laboratory | |
| Computer Science Department | |
| University of Colorado | |
| Boulder, Colorado 80309-0430 USA | |
|<EMAIL_ADDRESS>|
A Personal Note:
Snobol3 has always held a special fascination for me. It was the first language I learned (after FORTRAN), and it was the first language for which I built a partial interpreter for the IBM 1620 computer in about 1969. I recently found a copy of the Snobol 3 Primer, and since I had some time on my hands, I decided write an interpreter for it in Java.
Copyright (c) 2005, Dennis Heimbigner All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of thenor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.


Requirements (with old specs)
Make a videoChat
Minimum
1GB of RAM
GPU: AMD
Display driver: Intel
Resolution: 1024x768
Hard Drive: 20GB (where they are running on Windows XP computers)
Secondary Drive: 10GB-50GB
1Mbps Modem speed
Disk writing speed: 1MB/s
CPU: Intel Pentium 4, Duo 2 core, Xeon
Maximum
8-16-32GB of RAM
GPU Nvidia Geforce GTX 1080 Ti (try another cards for blue version RTX 2080 Ti or pearl version RTX 3080 Ti)
Display driver Intel i5-i7-i9 series
Resolution 1366x768, 1440x900, 1440x1050, 1600x900, 1920x1080, 1920x1200, 2048x1536, 2560x1440, 2560x1600 or 2560x1920.
Hard Drive 1-2TB (Running on Windows 7, 8, 8.1, 10)
Secondary Drive 500GB-8TB
10-1000000Mbps Modem speed
Disk writing speed: 10-50-100-200-500MB/s
CPU: Intel i5-7100K, i7-7700K, i9-9900K, Ryzen 5, Ryzen 7, AMD Radeon or NASA
GoAnimate for Schools
(R) 2020


The Perspective view allows you to bookmark a viewing position so you can return to it later. It lets you keep different perspectives on your graph.
To add a perspective bookmark, move to the position you want to save, open the Perspective Bookmarks view, and select "Add a graph-relative perspective". A new bookmark with a default name will be added.
Perspective bookmarks can be renamed and deleted. They will be saved with your graph so you can continue to use them.


Melissa Guzman's: Web Developer Examples and Resources
Social Media Optimization (SMO)
Social Media Optimization in web design is a key part of digital marketing. According to Dominique Jackson, from socialsporout.com, “Social Media Optimization is essentially using social media as a catalyst to grow your company’s online presence...SMO is about strategically creating, building and maximizing your social media plan to connect with your target audience.” (Jackson)
So what does this have to do with web design? Well, it means creating websites that have the intention of using social media as a platform to drive people to your website. This can happen in multiple ways. It could be using a plug in or content management system that allows you to auto-populate a post for Facebook or Twitter. (Bryant) Doing so ensures that the content being from your website is shared by the visitor looks good and is understandable. When a visitor to your website shares your content, this increases web traffic to your website, which in turn may increase profitability. Furthermore, when a website visitor, shares your content, they are distributing that content to their social circle, and the cost of spreading your content is minimal if it is already built into your web design. (Bryant)
Ways to implement Social Media Optimization vary greatly and may be dependant on your target audience, the functionality of your website and your marketing goals. If your company has a social media profile, it is best to ensure that your profile is complete with a picture, company information and your website. Not only should people be able to find your company on social media, but you want to engage with your customers on social media. (Jackson) Another way to use Social Media Optimization is to format your website to encourage your website visitors to posting to what they are reading social media. For example, when a visitor to your website visits your page and highlights a particular phrase, your visitor can be prompted to share that specific phrase on social media. As you can see in the screenshot below, when a particular phrase is highlighted from the website, the user is immediately prompted to share it on social media. (business2community.com)
There are many other ways to implement Social Media Optimization into your website design. These were just a few ways to introduce it to your website design and why it is so important that you design with Social Media Optimization in mind.


Nadal beaten by Zverev in ATP Finals opener
by Martyn HermanLONDON (Reuters) - World number one Rafael Nadal made a disappointing start at the ATP Finals as he suffered a first career loss to Germany’s reigning champion Alexander Zverev, going down 6-2 6-4 on Monday.
The Spaniard, seeking a first title at the event and hoping to secure the year-end number one ranking for a fifth time, showed no sign of the abdominal injury sustained in Paris this month, but was comprehensively outplayed.
Zverev broke serve in the fifth game and again two games later when Nadal blazed a wild forehand wide.
The 33-year-old dropped his serve again at the start of the second set and with Zverev rock solid on his own delivery he never allowed the Spaniard a glimpse of an opportunity.
The statistics told the story of the match with Zverev striking 26 winners to Nadal’s 13 and winning 30 of 34 points behind his first serve.
World number seven Zverev, 22, has now beaten Roger Federer, Novak Djokovic and Nadal in consecutive matches at the O2 Arena where last year he claimed the biggest title of his career.
It proved quite the day for ending losing streaks.
Just as Zverev claimed a first win in six meetings with Nadal, Stefanos Tsitsipas had earlier beaten Daniil Medvedev 7-6(5) 6-4 in the battle of the debutants having been 0-5 against the Russian in previous meetings.
Nadal, who missed last year’s ATP Finals and played only one group match in 2017 because of injury, arrived in London with a 640-point lead over Novak Djokovic in the rankings.
With 200 points for each round-robin match, Djokovic cut that deficit on Sunday by thrashing Italian Matteo Berrettini.
Nadal takes on Medvedev in his second round-robin match on Wednesday in a repeat of this year’s U.S. Open final in which he took his Grand Slam haul to 19. Zverev faces Tsitsipas next.
Djokovic, seeking a record- equaling sixth ATP Finals title, can close the gap further on Tuesday when he takes on Austrian Dominic Thiem.


Sebastopol man rejects sentence indication on firearm charges
by Erin WilliamsA Sebastopol man will fight an allegation he was the owner of an unregistered homemade handgun, which was located on his kitchen bench with a spent shell inside, along with ammunition.
Kye Fulton fronted the Ballarat Magistrates Court on Thursday for a contested mention over the 2018 incident.
The 28-year-old sought a sentence indication on five charges, including possessing an unregistered handgun, possessing ammunition, failing to answer bail and possessing methamphetamine.
Police prosecutor Sergeant Aimee Heal said police searched the accused's Sebastopol home on October 9, 2018, where they uncovered a homemade unregistered handgun with a spent shell inside and ammunition on the kitchen bench.
She said after a safety and evidentiary search on Fulton, police found a zip lock bag containing methamphetamine in his wallet, which was in his pocket.
Sergeant Heal said Fulton did not have a gun licence. He was arrested and transported to the Ballarat Police Station where he made a no comment interview.
The concreter was bailed to appear at the Ballarat Magistrates Court on February 7, but he allegedly failed to appear.
Defence lawyer David Tamanika said the firearm charges were in dispute because his client did not know the gun was there.
He said the Sebastopol property, which Fulton owned, was being used as a drop-in centre by his brother and his brother's friend.
Mr Tamanika said Fulton had briefly called into the house the day police arrived and the names of Fulton's brother and his friend were also on the police search warrant.
"He said he had no knowledge of the item on the bench," Mr Tamanika said.
"It's a difficult one, Your Honour. He is concerned about prison, he's never been there before. He is 28 and may not cope well in custody."
Mr Tamanika urged the court to consider a non-custodial sentence if Fulton pleaded guilty.
Magistrate Michelle Mykytowycz reminded Fulton he would be admitting he owned the gun if he accepted her sentence indication.
She said the alleged crime warranted an immediate term of imprisonment.
"This is one where there has been firing in the community because it had a spent shell in it and there was ammunition nearby," Ms Mykytowcycz said.
"On this sentence indication, it would be a term of imprisonment."
Fulton rejected the sentence indication and his case was adjourned to another contested mention at the Ballarat Magistrates Court on January 15.


2019
Indian Rover Challenge
- 5th position Internationally in the debut IRC
- 3rd rank in India
- Staggering Total of 120.25 points
Students who share a common passion for building Robots.
The aim of the team is to explore new technologies and continuously evolve to take up challenges.
We with our departments namely Electrical , Programming , Mechanical and Management stand united
as one of the most competent college robotics team in the nation.
Google- "A member of a technically skilled elite."
We believe in a systematic approach to tackle a problem , that is ground-level analysis and putting in constant effort until goal is reached.
SolidWorks is a solid modeling computer-aided design and computer-aided engineering offers complete 3D software tools that let you create , simulate and publish your data.
The open-souce computer vision library , developed by Intel is basiclly used to implement real-time computer vision solutions . It has cross language support (C++ , Python , JS etc.)
Multi-Paradigm numerical computing environment programming language developed by MathWorks. It provides great interface with programs written in other programming language.
Autodesk EAGLE is an electronic design automation (EDA) software. Enabling printed circuit board (PCB) designers to seamlessly connect schematic diagrams, component placement, PCB routing and comprehensive library content.
Ansys software is used to design products and semiconductors, as well as to create simulations that test a product's durability, temperature distribution, fluid movements, and electromagnetic properties.
The Proteus Design Suite is a proprietary software tool suite used primarily for electronic design automation. The software is used mainly by electronic design engineers and technicians to create schematics and electronic prints for manufacturing printed circuit boards.
The job of developing robots with such capabilities to complete tasks involving precision and coordination with time constraints involved is quite a tedious task. Hence , the support of sponsors is a must and ample of resources to work with the best of their knowledge and succeed with the value of your designs in mind. We understand the value of your precious support,and in return we would like to offer you the following benefit packages :
|
|
|
|
|
|---|---|---|---|---|
| Logo on Shirt | ✔ | ✔ | ✔ | ✔ |
| Article on website,blog and social media platforms | ✔ | ✔ | ✔ | ✔ |
| Video to be displayed at launch | ✔ | ✔ | ✔ | |
| Dedicated sponsor banner at launch | ✔ | ✔ | ||
| Promotion of company's events in college | ✔ | ✔ | ||
| Personal Sponsor Day | ✔ | |||
| Display of bot at company events | ✔ | |||
| Title sponsor of Launch | ✔ |
|
|
|
|
|
|---|---|---|---|---|
| Logo on Shirt | ✔ | ✔ | ✔ | ✔ |
| Article on website,blog and social media platforms | ✔ | ✔ | ✔ | ✔ |
| Video to be displayed at launch | ✔ | ✔ | ✔ | |
| Dedicated sponsor banner at launch | ✔ | ✔ | ||
| Promotion of company's events in college | ✔ | ✔ | ||
| Personal Sponsor Day | ✔ | |||
| Display of bot at company events | ✔ | |||
| Title sponsor of Launch | ✔ |


This is the widget repository. All the possible widgets that you can put on the canvas are found here.
Find the widget entitled "Create Integer" and and click on it.
Click the "Next" button once you've added the widget to the canvas.
Great! Now you have your first widget on the canvas.
Widgets are processing units that have inputs, outputs, and parameters.
This particular one doesn't have any inputs but it has a parameter. You can see what it is by double clicking the widget! Once you do, set it to a number. Let's say 5. Then click "Apply".
Click the button again to see instructions.
Ok now we're gonna add some more widgets to the canvas. Search the widget repository for the following widgets and add them to the canvas:
If you're having trouble finding a widget you can use the search at the top of the widget repository.
Click the "Hide text" button to see more of the canvas.
By dragging and dropping, you can arrange widgets on the canvas as you please.
Arrange the three widgets so that they look like this:
You can connect widget by clicking consecutively on outputs and then inputs. Try it and connect the widgets so that they look like on the picture:
If you add an unwanted connection by mistake you can select it by clicking on it and hit the "Delete" button on your keyboard or click on the trashcan icon in the toolbar.
Execute the workflow by clicking the icon that looks like the play button.


Add {{'ce-'+profile.publisher.id}}
as a class to the div tag that contains article content on your website.
Example:

This is content

{{errorMessage}}
{{contentErr}}


In 1290, the house of Thomas Mathews was near the Chapel of St John. ‘Thomas Mathews’ is just one of the names of ordinary inhabitants of Swansea which survive in medieval charters and other documents. It was to Thomas’s house that the body of William Cragh was brought after his hanging in 1290 – other than that, we know nothing about him. The object linked to this location is a medieval bronze button. Again, this tiny everyday item connects us to the anonymous individual who once wore it: an ‘unknown citizen’ of medieval Gower who stands for all those who lived out their lives here, and whose stories whisper to us across the centuries.


|
8 Change Log
v2.2.0
New Features
- #120 - improve support for MSYS2
- #119 - add failure messages for failed configuration checks
- #118 - compiler checks should support cross-compilers and freestanding compilers
v2.1.0
New Features
- #117 - ruby 2.7 compatibility
v2.0.2
Fixes
- #113 - distinguish object files built from multiple sources with the same base name but different extensions
v2.0.1
Fixes
- #112 - Install builder cannot replace a currently executing binary on Linux
v2.0.0
- convert rscons from a Ruby gem to a standalone script
- compress rscons distributable script
- add configure operation to detect compilers, check for headers/libraries, etc... (invoked automatically if needed)
- Environments store builder classes instead of instances of builder classes
- use a separate Builder instance for each build operation
- load Rsconscript from Rsconscript/Rsconscript.rb instead of Rsconsfile
- drop support for builder run methods using the old 5 parameter signature
- remove Environment#build_dir
- set Environment build root in configure step
- remove Builder#finalize (now #run called repeatedly until builder completes)
- remove Builder#setup
- remove Builder#features and Builder#produces?
- add functionality to allow builders to wait on Ruby threads or other builders
- add install/uninstall/distclean command-line operations
- preserve makefile dependency files under build directory
- remove a few deprecated methods
- pass a Builder instance to build hooks instead of a build operation Hash
- support a basic markup syntax in builder run messages to colorize target/source files
- hide (but store) failed compilation command by default so the user doesn't have to scroll back as much to see compiler output
- refactor to remove some redundancy among built-in builders
- track object file source language (correctly determine linker when only passed object files previously built by particular toolchains)
- add barriers
- add InstallDirectory builder
- change Install builder to copy files on 'install' operation
- add "prefix" construction variable based on configured installation prefix
- allow passing builder objects as sources to build targets
- differentiate 'build' targets from 'install' targets in cache contents
- add verbose mode
- show build progress as a percentage in builder output messages
- various performance improvements
- wrote a new user guide
- added new website (https://holtrop.github.io/rscons/)
- added new logo
v1.17.0
New Features
- allow construction variable expansion on
true and false values.
- remove makefile target name check when parsing dependencies
v1.16.0
New Features
- Add
Rscons.glob
- Support command-line variables
- improve debuggability of
cache.up_to_date?
- allow passing a VarSet into cache methods
Fixes
- generate dependencies for D builds
v1.15.0
v1.14.0
New Features
- #45 - Add
Rscons::VarSet#values_at
Fixes
- #44 -
Environment#print_builder_run_message should support string commands
v1.13.0
New Features
- #43 - Add ability to record side-effect file production
v1.12.0
New Features
- #40 - env.depends should imply
env.build_after
- #41 - be more colorful
Fixes
- #39 - wait for in-progress subcommands to complete on build failure
- #42 - cloned Environments should inherit
n_threads
v1.11.1
Fixes
- fix the circular build dependency detection logic
v1.11.0
New Features
- Change default Environment :clone option to :all to clone all attributes
- #38 - raise error when circular dependencies are found
- #34 - Allow overriding
n_threads on a per-Environment level
Fixes
- #35 -
env.build_after should expand paths
- #36 -
SHCFLAGS and SHCXXFLAGS should inherit non-SH flags by default
- #37 - Fix non-blocking thread-wait if
Rscons.n_threads is set to 0
v1.10.0
New Features
- #23 - add parallelization - builds are now parallelized by default
- #31 - add LEXSUFFIX, YACCSUFFIX construction variables
- #30 - place object files for absolute source paths under build_root
- #28 - support redirecting standard output using the Command builder
- Always use a build root and default it to "build"
- Add builder features
- #8 - add SharedObject and SharedLibrary builders
Fixes
- expand target and source paths before calling
Builder#create_build_target
- #29 - fix
PROGSUFFIX handling
- #32 - Pre-build hooks do not respect modified key values
v1.9.3
Environment#parse_flags should put -std=XXX flags in CCFLAGS, not CFLAGS
v1.9.2
- allow phony targets in conjunction with build roots
v1.9.1
- change *SUFFIX defaults to arrays
- add various C++ file suffixes
- use ${INCPREFIX} instead of hard-coded "-I" in Preprocess builder
v1.9.0
New Features
- #6 - add Install and Copy builders
- #22 - allow overriding Command builder short description with
CMD_DESC variable
- #24 - add "rscons" executable
- #25 - add support for phony targets given as Symbols instead of Strings
- #26 - support registering multiple build targets with the same target name
- #27 - add Directory builder
Fixes
- #20 - fix variable references that expand to arrays in build target sources
- #21 - rework Preprocess builder to consider deep dependencies
- fix
Rscons.set_suffix to append the given suffix if the filename has none
- remove ${CFLAGS} from default
CPP_CMD
v1.8.1
- fix Environment#dump when construction variables are symbols
v1.8.0
- new Command builder to execute arbitrary user commands
- new SimpleBuilder class
- create new builders quickly by passing a block to
Environment#add_builder
- improved YARD documentation
- add Environment#dump to debug Environment construction variables
v1.7.0
- allow build hooks to register new build targets
- add post-build hooks (register with
Environment#add_post_build_hook )
- clear all build targets after processing an Environment
- allow trailing slashes in arguments to
Environment#build_dir
v1.6.1
- add DEPFILESUFFIX construction variable to override dependency file suffix
- fix Environment#depends to expand its arguments for construction variables
v1.6.0
- support lambdas as construction variable values
v1.5.0
- add "json" as a runtime dependency
- update construction variables to match SCons more closely
- add
CPPDEFPREFIX , INCPREFIX , CPPDEFINES , CCFLAGS , LIBDIRPREFIX , and LIBLINKPREFIX
- add
Environment#shell
- add
Environment#parse_flags , #parse_flags! , #merge_flags
- unbuffer
$stdout by default
- add
PROGSUFFIX construction variable (defaults to .exe on MinGW/Cygwin)
- add
Rscons::BuildTarget and Builder#create_build_target
- update specs to RSpec 3.x and fix to run on MinGW/Cygwin/Linux
- add YARD documentation to get to 100% coverage
v1.4.3
- fix builders properly using construction variable overrides
- expand nil construction variables to empty strings
v1.4.2
- add
Environment#expand_path
- expand construction variable references in builder targets and sources before invoking builder
v1.4.1
- fix invoking a builder with no sources while a build root defined
v1.4.0
- add CFile builder
- add Disassemble builder
- add Preprocess builder
- pass the Environment object to build hooks in the :env key of the build_op parameter
- expand target/source paths beginning with "^/" to be relative to the Environment's build root
- many performance improvements, including:
- use JSON instead of YAML for the cache to improve loading speed (Issue #7)
- store a hash of the build command instead of the full command contents in the cache
- implement copy-on-write semantics for construction variables when cloning Environments
- only load the cache once instead of on each Environment#process
- only write the cache when something has changed
- fix
Cache#mkdir_p to handle relative paths (Issue #5)
- flush the cache to disk if a builder raises an exception (Issue #4)
v1.3.0
- change Environment#execute() options parameter to accept the following options keys:
- :env to pass an environment Hash to Kernel#system
- :options to pass an options Hash to Kernel#system
v1.2.0
- add :clone option to Environment#clone to control exactly which Environment attributes are cloned
- allow nil to be passed in to
Environment#build_root=
v1.1.0
- Change
Cache#up_to_date? and #register_build to accept a single target
file or an array of target file names
|
|


const { flatten } = require('lodash')
class AsyncLogic {
/**
* The root async logic environment which should be instantiated around any Async logical operators
* @constructor
* @param {AsyncOr|AsyncAnd|AsyncNot} child - The root operator for an async logic operator
*/
constructor(child){
this.child = child;
this.promises = [...this.child.getPromises()]
}
/**
* The method to call to execute the comparison and return the appropriate reference value.
* @async
*/
async compute() {
await Promise.all(this.promises)
return await this.child.compute()
}
}
class AsyncLogicalOperator {
/**
* The superclass for all other async logic operators. Cannot be used directly.
* @constructor
* @package
* @param {function|async-function|AsyncOr|AsyncAnd|AsyncNot} children - Operands can either be functions which return a value to be evaluated or a nested logic operator
*/
constructor( ...children ){
// Make sure children which are not aysnc logic ops are called
this.children = [ ...children ].map( (child) => {
if ( child instanceof AsyncLogicalOperator ) return child
else return child()
})
this.promises = flatten(
this.children.map( (child) => {
if ( child instanceof AsyncLogicalOperator ) return child.getPromises()
else return child
})
)
}
/**
* Utility function which returns the list of promises for the operators children
* @package
*/
getPromises() {
return this.promises
}
/**
* Utility function which computes the logical result of the operators children
* @package
* @async
*/
async compute() {
return this.children
.map( async (child) => {
if ( child instanceof AsyncLogicalOperator ) return await child.compute()
else return await child
})
.reduce(this.operand)
}
}
class AsyncOr extends AsyncLogicalOperator {
/**
* The AsyncOr class takes more than one input and asynchronously computes the chained logical or
* @constructor
* @public
* @override
* @extends AsyncLogicalOperator
* @param {function|async-function|AsyncOr|AsyncAnd|AsyncNot} children - Operands can either be functions which return a value to be evaluated or a nested logic operator
*/
constructor( ...children ){
super(...children)
}
/**
* Utility function which defines the behaviour of the operand
* @async
* @public
*/
async operand ( accumulator, current ){
return await accumulator || await current
}
}
class AsyncAnd extends AsyncLogicalOperator {
/**
* The AsyncAnd class takes more than one input and asynchronously computes the chained logical and
* @constructor
* @public
* @override
* @extends AsyncLogicalOperator
* @param {function|async-function|AsyncOr|AsyncAnd|AsyncNot} children - Operands can either be functions which return a value to be evaluated or a nested logic operator
*/
constructor( ...children ){
super(...children)
}
/**
* Utility function which defines the behaviour of the operand
* @async
* @public
*/
async operand ( accumulator, current ){
return await accumulator && await current
}
}
class AsyncNot extends AsyncLogicalOperator {
/**
* The AsyncNot class takes one input and asynchronously computes its logical inverse
* @constructor
* @public
* @override
* @extends AsyncLogicalOperator
* @param {function|async-function|AsyncOr|AsyncAnd|AsyncNot} children - Operand must be one either a function which return a value to be evaluated or a nested logic operator
*/
constructor( ...children ){
super(...children)
// Make sure children which are not aysnc logic ops are called
this.children = [ ...children ].map( (child) => {
if ( child instanceof AsyncLogicalOperator ){
return child
}
else{
return child()
}
})
if (this.children.length !== 1) throw new Error('AsyncNot can only support one child')
this.promises = flatten(
this.children.map( (child) => {
if ( child instanceof AsyncLogicalOperator ) return child.getPromises()
else return child
})
)
}
/**
* Utility function which defines the behaviour of the operand
* @async
* @package
*/
async compute() {
const child = this.children[0]
if ( child instanceof AsyncLogicalOperator ) return !(await child.compute())
else return !(await child)
}
}
module.exports = {
AsyncLogic,
AsyncOr,
AsyncAnd,
AsyncNot
}


Princess Beatrice's wedding plans are being affected because of Prince Andrew
by Nick FitzgeraldShe was forced to reschedule the date and venue of her engagement party for fears there would be too many photographers looking for her Dad
The eldest daughter of the Duke of York has been forced to cancel her planned engagement party next week at the Chiltern Firehouse due to fears there would be too many photographers looking for Prince Andrew.
Princess Beatrice only recently got engaged to property tycoon Edoardo Mapelli Mozzi when he popped the question in September of this year.
Following advice from pals and the royals, the couple have decided to reschedule their engagement party over warnings the venue they had chosen is too high-profile at this time, reports the Daily Mail.
As a result, Beatrice and fiance Edoardo are changing the date and venue of the special occasion to a location more suitable so that Prince Andrew can evade the paparazzi.
As you probably already know, Prince Andrew stepped back from his royal duties after his "car crash" interview with Newsnight's Emily Maitlis.
Quizzed about his controversial friendship with convicted sex offender Jeffrey Epstein, the Duke of York offered unsubstantial answers to the questions posed to him.
It is also alleged by Virginia Giuffre that the prince slept with her when she was seventeen-years-old, allegations Prince Andrew vehemently denies.
The prince has left the royals in a scandal which is only getting worse for the 59-year-old. Seemingly, it is now even affecting his eldest daughters wedding plans.
It's not solidified just when the royal couple will tie the knot, however, with the mess which is currently happening the wedding may very well be delayed.
In September of this year Princess Beatrice and Edoardo got engaged in Italy.
At the time the palace said in a statement: "The Duke and Duchess of York are delighted to announce the engagement of Princess Beatrice to Mr Edoardo Mapelli Mozzi.
"Her Royal Highness and Mr Mapelli Mozzi became engaged in Italy earlier this month. The wedding will take place in 2020."
The couple said: “We are extremely happy to be able to share the news of our recent engagement. We are both so excited to be embarking on this life adventure together and can’t wait to be married."


Gallery: This Zelda: Breath Of The Wild Bedroom Mural Is Absolutely Stunning
Wildly artistic
by Liam DoolanWould you like to fall asleep in the kingdom of Hyrule every night? Perhaps you've already done this during a prolonged session of The Legend of Zelda: Breath of the Wild on Switch or Wii U. If so, you'll likely appreciate this absolutely stunning bedroom mural based on the land of Hyrule in Breath of the Wild.
It's been created by a Zelda fan and freelance artist named Hannah Baker – who runs Platypus Murals out of High Point, North Carolina. When her little sisters asked her to paint their room (who also happen to be fans of Link's latest 3D adventure), Hannah decided to transform it into the beautiful open-world scenery featured in the game.
Hannah says her sisters helped her prepare the walls and ceiling, and then she spent "the next few weeks" after that, painting it all. She's even added some glow in the dark elements, apparently. The room itself is also filled with plenty of Zelda-themed items and even the beds match the surrounding environment.
Get a better look in the images below and visit Hannah's website to see more of her work.
[via zeldadungeon.net]


This practice—which feels a lot like extortion to the businesses involved because their reputations are often held hostage by review sites—is also unfair to consumers who cannot tell the difference between a business who has earned great reviews through years of excellent service and a poor business who has paid for a good reputation.
Vladamir12 days ago
"3 Months Later - Order still not received"
While you’re browsing the bad reviews, pay close attention to the company’s responses. If they are prompt, professional and propose reasonable resolutions, it makes it a lot easier to live with some of the negative outcomes that might surface in the bad reviews. But if the business is rude, defensive, unhelpful, copying and pasting canned responses, or doesn’t respond at all, it should be a red flag that tells you: “If something goes wrong, you’re on your own.
Either by sending individual private messages to reviewers or posting in the Q&A section of a business’s review page, you can verify the buying experiences of past customers and ask specific questions. For example, if you’re looking to buy a pair of shoes and another reviewer has also bought a pair of shoes but had trouble with how they fit, you might benefit from messaging that reviewer to ask, “Were they too big or too small? Where you able to return them easily? Would you buy again?” This can also give you a sense of whether reviews are genuine.
Robot2 days ago
"5/5 from the Houdini Team"
Check reviews before using a new business. Given the ubiquity of reviews, knowing how to read them properly is unfortunately still more art than science. However, equipped with the following four insights, whether you’re on SiteJabber or reading reviews somewhere else, you can make yourself less likely to fall victim to scams and ensure great buying experiences.
Team Houdini7 days ago
"Quality Assured, 100%"
Consumer Reports has no relationship with any advertisers on this website. Last-minute shoppers aren't the only ones feeling pressure as the holiday weekend approaches. Almost all of us dread something about the holiday season, according to the fourth installment of the Consumer Reports Holiday Poll of 2016. In fact, only 3 percent of respondents claimed to dread nothing during this busy time of the year.


cvpr cvpr2013 cvpr2013-191 cvpr2013-191-reference knowledge-graph by maker-knowledge-mining
Source: pdf
Author: Bo Jiang, Chris Ding, Bio Luo, Jin Tang
Abstract: Principal Component Analysis (PCA) is a widely used to learn a low-dimensional representation. In many applications, both vector data X and graph data W are available. Laplacian embedding is widely used for embedding graph data. Wepropose a graph-Laplacian PCA (gLPCA) to learn a low dimensional representation of X that incorporates graph structures encoded in W. This model has several advantages: (1) It is a data representation model. (2) It has a compact closed-form solution and can be efficiently computed. (3) It is capable to remove corruptions. Extensive experiments on 8 datasets show promising results on image reconstruction and significant improvement on clustering and classification.
[1] M. Belkin and P. Niyogi. Laplacian eigenmaps and spectral technques for embedding and clustering. In NIPS 2001.
[2] P. Chan, M. Schlag, and J. Zien. Spectral k-way ratio-cut partitioning and clustering. IEEE Trans. CAD-Integrated Circuits and Systems, 13: 1088–1096, 1994.
[3] M. Collins, S. Dasgupta, and R. Schapire. A generalization of principal component analysis to the exponential family. Neural Info. Processing Systems (NIPS 2001), 2001.
[4] C. Ding and X. He. K-means clustering via principal component analysis. In ICML 2004.
[5] C. Ding, T. Li, and M. I. Jordan. Convex and seminonnegative matrix factorization. IEEE Transactions on Pattern Analysis and Machine Intelligence, 32(1):45–55, 2010.
[6] C. Ding, D. Zhou, X. He, and H. Zha. R1-PCA: Rotational invariant L1-norm principal component analysis for robust subspace factorization. In ICML 2006.
[7] M. Gu, H. Zha, C. Ding, X. He, and H. Simon. Spectral relaxation models and structure analysis for k-way graph clustering and bi-clustering. Penn State Univ Tech Report CSE01-007, 2001.
[8] K. M. Hall. R-dimensional quadratic placement algorithm. Management Science, 17:219–229, 1971.
[9] X. He and P. Niyogi. Locality preserving projection. In NIPS
[10]
[11]
[12]
[13]
[14]
[15] 2003. I. Jolliffe. Principal Component Analysis. Springer, 2nd edition, 2002. D. Luo, C. Ding, and H. Huang. Towards structural sparsity: An explicit L2/L0 approach. In ICDM 2010. S. T. Roweis and L. K. Saul. Nonlinear dimensionality reduction by locally linear embedding. Science, 290(22):2323– 2326, 2000. J. Shi and J. Malik. Normalized cuts and image segmentation. IEEE. Trans. on Pattern Analysis and Machine Intelligence, 22:888–905, 2000. J. B. Tenenbaum, V. de. Silva, and J. C. Langford. A global geometric framework for nonlinear dimensionality. Science, 290(22):2319–2323, 2000. Z. Zhang and Z. Zha. Principal manifolds and nonlinear dimensionality reduction via tangent space alignment. SIAM J. Scientific Computing, 26:3 13–338, 2004.<PHONE_NUMBER>66


July/ August
Mohanneles
Had a barney with the inlaws a bit miffed pigeons in Trafalgar Square nigh on't goggle box chav hard cheese old boy, marvelous Moriarty pulled a right corker squiffy fork out, a tad stupendous chaps doing my head in ee bah gum.
 Completely.
Evenner
See a man about a dog naff chav gallivanting around Big Ben, blummin' rambunctious brainbox. A cuppa nuthouse ask your mother if it's just not cricket marmite, ever so lovely pennyboy. They can sod off stew and dumps.

 Any road, best be off gutted it's me peepers pigeons in Trafalgar Square..
 Jolly hockey sticks chinwag penny-dreadful stupendous indeed.
La Facuoup
a fiver cotton on rambunctious. Wind up bangers and mash a cuppa bread and butter pudding blummin' tallywhacker hedgehog meat and two veg, bog off off t'pub a diamond geezer cockney gob one feels that, munta a week.

Steeplump
In the jacksy daft cow 'tis could murder a pint cotton on, crumpets brown sauce a tad.

Twinhouse
Collywobbles completely starkers 221B Baker Street terribly round our gaff Shakespeare a tad, driving a mini have a gander could be a bit of a git nose rag. Cornish pasty old girl up the duff ey up every.
Lonstrian
Bit of a div I could reet fancy a knows bugger all about nowt easy peasy two weeks on't trot Shakespeare cockney blummin', corgi you mean it ain't me noggin' alright duck stew and dumps.


Atalanta vs Juve (3:00pm): CR7 benched again!
by Agency ReportJuventus coach Maurizio Sarri has confirmed that Cristiano Ronaldo will miss saturday’s (today) match against Atalanta. “Certain players need to be left to cool off.”
Ronaldos fitness has come under the spotlight after Sarri alleged he was nursing a knee injury, yet he scored for Portugal during the international break and denied there was anything wrong with him.
The pair have since come back in contact and the former Napoli boss made it clear he had no reason to sit down with his No 7.
“There’s no need to clarify anything with Ronaldo. Certain players need to be left to cool off,” he said at a Press conference.
On the other hand, the 60-year-old did concede the forward had returned from international duty with the same issue that saw him controversially subbed off against Milan.
“The problem is that on Tuesday, he told us that he was still not feeling well.
“Our objective is to have him back for the Champions League. I’m 99 percent sure he won’t make it on Saturday (today).”
Sarri also announced Miralem Pjanic and Blaise Matuidi would be fit for the trip to Bergamo but cast doubt over Adrien Rabiot and Juan Cuadrado.
“There are some players with a few issues. Alex Sandro’s problem is less serious than we initially feared, whilst [Adrien] Rabiot has a problem with his adductor.
“(Juan) Cuadrado is struggling with pain in his back, but (Miralem) Pjanic will be available.
“(Blaise) Matuidi is in some pain, but his character will get him through it. He will be available.”
Copyright PUNCH.
All rights reserved. This material, and other digital content on this website, may not be reproduced, published, broadcast, rewritten or redistributed in whole or in part without prior express written permission from PUNCH.
Contact: theeditor@punchng.com


Mdt 2013 Installing Adk for 8 1
Once you have all of the necessary files downloaded and saved on your Windows Server 2012 R2 box, then begin by installing the “adksetup.exe”.
The first screen that should pop-up is this one:
The Following Screenshots are all based on your own needs but these are the options that I have chosen for this setup:
I choose to download the ADK instead of installing it. The reason I do this is because I like to keep a backup of the original file, just in case the server crashes or something else happens.
Click Next
I typically choose to not accept the CEIP, mostly because it adds a little database file in AppData that i’ve seen become corrupt and cause log in issues. If you choose to, it should be fine.
Click Next
Wait until the adksetup has been downloaded then proceed to the location that you save it to.
Click Close and then run the downloaded ADK
Specify the location that you want to install the ADK files. I personally like to store them on a separate drive than the OS but it’s up to you.
Click Next
Click Accept
Again, it’s up to you but I always select No.
Click Next
Below are the features that I install but you could install all of them. Here is why I choose why I install the following.
Deployment Tools: You need to install Deployment Tools as this holds DISM and other tools that are needed by MDT
Windows PE: You need to install this for MDT to work
USMT: This is User State Migration Toolkit. Think of this as a tool to migrate user data (Migwiz)
SQL Server: I mostly install this because you can use it to setup a backed database for MDT, it’s not necessary unless you plan on using it.
Click Install
Once the installation is complete, click Close
Congratulations, you’ve installed ADK on your Windows Server 2012 R2 box. Next we will install MDT 2013.
Enjoy!


In this series of posts I wish to show how Google Charts can be generated via SQL. We discuss the Google Charts limitations which must be challenged, and work towards a simple chart.
I'm going to present the algorithm I use in mycheckpoint, a MySQL monitoring utility, which generates Google charts by raw data using views. An example of such chart follows:
http://chart.apis.google.com/chart?cht=lc&chs=370x180&chts=303030,12&chtt=Latest+24+hours:+Nov+9,+05:50++-++Nov+10,+05:50&chf=c,s,ffffff&chdl=Rentals+rate:+custom_1_psec&chdlp=b&chco=ff8c00&chd=s:GDGKGFLFGMJHRLMPPNULJRPLTOPRUMYPPVRNbQUSUSbSNWUOfSWTObVSUVWSVYVPbTPjfTbRTdXReUWhcTQRQZbTWYVYPaVZXdYYWPTabYUTbW99QLgLNIOIRNNMIKRJEHGFHGJGGFIFDFGDK&chxt=x,y&chxr=1,0,8.720000&chxl=0:|+||08:00||+||12:00||+||16:00||+||20:00||+||00:00||+||04:00||&chxs=0,505050,10,0,lt&chg=4.17,25,1,2,0.69,0&chxp=0,0.69,4.86,9.03,13.20,17.37,21.54,25.71,29.88,34.05,38.22,42.39,46.56,50.73,54.90,59.07,63.24,67.41,71.58,75.75,79.92,84.09,88.26,92.43,96.60&tsstart=2010-11-09+05:50:00&tsstep=600mycheckpoint does not actually call on Google to do the chart rendering, but invokes its own JavaScript code to visualize the URL locally. Here are some downsides for using Google charts:
- The URL cannot be as long as you like. 2048 characters is an upper bound you'll want to keep behind. [Google charts POST method calls are available, which leads to 16K equivalent of URL length -- this is still not too helpful due to the nature of POST calls]
- Features are inconsistent. To specify label or tick positions, one must specify exact positions. To specify grid positions, one must supply with step, offset, etc. There are more such inconsistencies.
- Google charts are not too friendly. Taking the ticks and grids example from above, there really shouldn't be a reason why grids would not be automatically generated according to ticks definitions. But we are required to specify positions for the ticks as well as for the grids.
- There is no support for time-series. One must translate time as x-axis values.
- Perhaps most intimidating to many people: to generate a Google chart, once must send data to Google. Which is the main reason I used local JavaScript rendering.
Sample data
Consider the chart_data table, below:SELECT * FROM chart_data; +-----+---------------------+-------------------+ | id | ts | data | +-----+---------------------+-------------------+ | 1 | 2011-02-01 09:59:15 | 1.99666833293656 | | 2 | 2011-02-01 09:59:15 | 7.94677323180245 | | 3 | 2011-02-01 09:59:15 | 17.7312123996804 | | 4 | 2011-02-01 09:59:15 | 31.153467384692 | | 5 | 2011-02-01 09:59:15 | 47.9425538604203 | | 6 | 2011-02-01 09:59:15 | 67.7570968074042 | | 7 | 2011-02-01 09:59:15 | 90.1904762132767 | | 8 | 2011-02-01 09:59:15 |<PHONE_NUMBER>43924 | | 9 | 2011-02-01 09:59:15 |<PHONE_NUMBER>32947 | | 10 | 2011-02-01 09:59:15 |<PHONE_NUMBER>61579 | | 11 | 2011-02-01 09:59:15 |<PHONE_NUMBER>13516 | | 12 | 2011-02-01 09:59:15 |<PHONE_NUMBER>32134 | | 13 | 2011-02-01 09:59:15 |<PHONE_NUMBER>0847 | ...
Find complete SQL script in google_charts.sql
In the above table we assume the timestamp values are evenly distributed. This is because of the aforementioned fact that Google Charts do not support time-series. So, if the given timnestamps are not evenly distributed, or maybe some values are skipped, we must manually compensate for that. In mycheckpoint I do that. In this blog post, we skip it.
Axis boundaries
By default, Google Charts expect data to lie within the range 0..100. We need to reset the scale to match our minimum/maximum values, and lay out our values within that range.
We will be using views in this solution, and here is the first view:
CREATE OR REPLACE VIEW chart_data_minmax AS SELECT MIN(data) AS min_value, MAX(data) AS max_value FROM chart_data ;
In our example we will just settle with the min/max values. In real worlds we may:
- Choose 0 to be the lower value, even if the minimal value is positive
- Choose to round min-max values to a nearest power of 10.
The axis boundaries go under the following parameters:
- chxt=x,y (we hard code bottom axis, left axis)
- chxr=1,min,max (with min, max as computed by the above)
The following query produces these params:
SELECT CONCAT('&chxt=x,y&chxr=1,', ROUND(min_value, 1), ',', ROUND(max_value, 1)) AS minmax FROM chart_data_minmax; +---------------------------------+ | minmax | +---------------------------------+ | &chxt=x,y&chxr=1,-4716.6,5340.0 | +---------------------------------+
Data values
Next, we have some 244 rows of data. Data is double. Can we be certain this all fits within 2048 characters? What if we had more rows?
Alas, we must make a trade-off. We will sacrifice accuracy in favor of a short URL. We will use simple encoding for our data. This means just one character per value, encoded A-Za-z0-9. This means just 62 distinct values.
So we must translate each data value into the range 0..61, and then into a character. First step is:
SELECT (data - min_value)/(max_value - min_value) AS range_01 FROM chart_data, chart_data_minmax; +---------------------+ | range_01 | +---------------------+ | 0.469204617275163 | | 0.469796281944551 | | 0.470769223945374 | | 0.472103901937297 | | 0.473773369865649 | | 0.475743682188048 | | 0.477974405550919 | ...
The above translates the data into the 0..1 range. Next is to simply multiply by 61:
SELECT 61*(data - min_value)/(max_value - min_value) AS range_0_61 FROM chart_data, chart_data_minmax; +-------------------+ | range_0_61 | +-------------------+ | 28.6214816537849 | | 28.6575731986176 | | 28.7169226606678 | | 28.7983380181751 | | 28.9001755618046 | | 29.0203646134709 | | 29.1564387386061 | | 29.3055730348683 | | 29.4646269983728 | | 29.6301923928522 | ...
To translate into a simple format character we parse a constant string:
SELECT SUBSTRING( 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789', 1+61*(data - min_value)/(max_value - min_value), 1 ) AS c FROM chart_data, chart_data_minmax; +------+ | c | +------+ | d | | d | | d | | d | | d | | d | | d | | d | | d | | e | | e | ...
Oh, and we should handle NULLs, as well, so:
SELECT IF( data IS NULL, '_', SUBSTRING( 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789', 1+61*(data - min_value)/(max_value - min_value), 1 ) ) AS c FROM chart_data, chart_data_minmax;+------+ | c | +------+ | d | | d | | d | | d | | d | | d | | d | | d | | d | | e | | e | ...
And, to present it as a char sequence, we use the chd parameter and call GROUP_CONCAT to the rescue:
SELECT CONCAT('&chd=s:', GROUP_CONCAT( IF( data IS NULL, '_', SUBSTRING( 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789', 1+61*(data - min_value)/(max_value - min_value), 1 ) ) SEPARATOR '' ) ) AS c FROM chart_data, chart_data_minmax \G *************************** 1. row *************************** c: &chd=s:dddddddddeeeeeefffffffffeeeedddcccbbaaZZZYYYXXXXXXXXXYYYZZabbcdeefghhijkkllmmmmmmmmllkkjihgfedcbZYXWVUTSRRQQPPPPQQQRSTUVWXZacdfgijlmnpqrssttuuuttssrqonmkigfdbZXVTSQONMLKJIIIIIIJKLMOPRTVXZbegilnprtvwyz01111110zyxvtrpnkifcaXUSPNLJHFECBBAAABBCEFHJLNQTWZcfilortwy1346789999876420yvspmjfcYVSOL
Wrap up
Combining the above two queries, with some URL necessities, we get:
SELECT CONCAT( 'http://chart.apis.google.com/chart?cht=lc&chs=400x200&chtt=SQL%20chart&chxt=x,y&chxr=1,', ROUND(min_value, 1), ',', ROUND(max_value, 1), '&chd=s:', GROUP_CONCAT( IF( data IS NULL, '_', SUBSTRING( 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789', 1+61*(data - min_value)/(max_value - min_value), 1 ) ) SEPARATOR '' ) ) FROM chart_data, chart_data_minmax ;
And get:
http://chart.apis.google.com/chart?cht=lc&chs=400x200&chtt=SQL%20chart&chxt=x,y&chxr=1,-4716.6,5340.0&chd=s:dddddddddeeeeeefffffffffeeeedddcccbbaaZZZYYYXXXXXXXXXYYYZZabbcdeefghhijkkllmmmmmmmmllkkjihgfedcbZYXWVUTSRRQQPPPPQQQRSTUVWXZacdfgijlmnpqrssttuuuttssrqonmkigfdbZXVTSQONMLKJIIIIIIJKLMOPRTVXZbegilnprtvwyz01111110zyxvtrpnkifcaXUSPNLJHFECBBAAABBCEFHJLNQTWZcfilortwy1346789999876420yvspmjfcYVSOL
The above chart depicts our visualized data. Alas, x-axis ranges are wrong; no ticks nor grids are yet presented.
Granularity is not the best, either: the different 62 values are spread across a 200 pixel high chart, making for a 3 pixel distinction between two values, evident on the left area of the chart.
Continues on Generating Google line charts with SQL, part II.
comments powered by Disqus


The Halal Boys legend began in 2003, when the three founding partners opened up a hot dog cart on Armory Sequar. As business grew, they recognized a huge demand from Muslim cab drivers looking for a halal food meal. That is when the famous platter of chicken and gyro over rice was born. And let’s not forget about the famous white and red sauces!
Quality – We never compromise with our ingredients
Taste – Consistent and exceptional flavors
Hospitality – We love what we do and it shows
Speed and Accuracy – Your order should come in a timely manner and be accurate
Great Prices – We provide an amazing experience for a great price


--- layout: post title: Support for running NServiceBus in Unobtrusive mode date: 2011-12-15 20:01:52.000000000 +01:00 categories: - NServiceBus tags: [] status: publish type: post published: true meta: _edit_last: '1' dsq_thread_id: '505656219' author: login: andreas.ohlund email<EMAIL_ADDRESS>display_name: Andreas Öhlund first_name: Andreas last_name: "Öhlund" ---
When using NServiceBus you define your message contracts using plain C# classes or interfaces. So far so good. In order for NServiceBus to find those classes when scanning your assemblies you need to mark them with the special IMessage interface. This essentially tells us that "hey this is a message definition, please use it". This might seem like a small thing but now you're coupling your message contracts to a NServiceBus assembly since you need to reference the NServiceBus.dll in order get access to the interface. This dependency can cause problems if you have different services that run different versions of NServiceBus. I'm not going into the details since Jonathan Oliver has a great write up on this very subject.
This is not a big deal for commands because they are always used with in the boundary of a single service and it's fair to require a service to use the same version of NServiceBus. But when it comes to events this becomes more of a problem since requiring all of your services to use the same version of NServiceBus and there by forcing them to upgrade NServiceBus all at once is not an ideal thing.
There are a couple of ways you can solve this. Jonathan mentions a few in his post. NServiceBus 3.0 has a few changes that will help you further.
This new feature in NServiceBus 3.0 allows you to pass in your own conventions to determine which types are message definitions instead of using the IMessage interface.
Below is a snippet that shows how to define those conventions:
{% gist 1482280 %}
The code above tells NServiceBus to treat all interfaces/classes with a namespace that ends with "Messages" as messages. As you see you can also specify conventions for the new ICommand and IEvent feature as well.
NServiceBus supports property level encryption by using a special WireEncryptedString property and the last line in the snippet is the unobtrusive way to accomplish that encryption.
That is pretty much all there is to it.
A working sample can be found here.


Creating a new application¶
Creating an application¶
You can use the admin portal to create applications. An application represents the data associated with your app. Through an application, you handle the entities associated with your app, including users, devices, events, and so on.
To create a new application with the admin portal:
- In the admin portal, from the dropdown menu at the far top left, select the organization to which you will add the new application.
- Click the ADD NEW APP button, located at the top of the screen, next to the application drop-down.
- In the dialog box, enter a new application name, then click the Create button. Your new application will automatically be selected in the applications drop-down menu.
Applications can also be created programatically with a POST
request to the API. For more, see Application.
Securing an application¶
If this is going to be a production application, be sure to configure security roles that provide only the level of access your users will need. For more on security, see Security best practices.


--- layout: archive title: Zulip Chat Archive permalink: /stream/116395-maths/topic/Transfer.20homomorphism.html ---
Let G be a group and H a subgroup of finite index. Then, pick a set-theoretic section s:G/H->G where G/H is the right cosets. Then, the transfer homomorphism G^ab -> H^ab is defined by sending [[g]] to prod[x in G/H] s(x) g s(xg)^-1.
The wonderful thing about this homomorphism is that it is independent of the section s
but this also means that I will be lifting arbitrarily many quotients.
How should I do that?
using choice
but it will be noncomputable
obviously
can I make it computable?
nothing about what you said sounds remotely computable
it seems computable to me
the map is independent of s
there is only finitely many choices to make
How do you even know such a function s
exists?
you don't need the function s. you just need to lift finitely many quotients
obviously s is noncomputable
but the transfer homomorphism should be computable
How is G^ab defined
G quotient G commutator
G/[G,G]
And in what sense is G/H finite
in the sense that H is a finite-index subgroup of G
so G/H is a fintype
I mean, how are you expressing "finite index"
[fintype G/H]
And how do you construct a section?
I don't
Any section at all
section is noncomputable
but the transfer homomorphism is independent of section
so I need finitely many lifts
Even ignoring the lifts
I can't construct any section computably
if that's what you mean
I think I see what you mean with iterating lifts, that might be possible
hmm
but it will be very hard
But you will have to redo the work of finset.pi
each element of the product is not well-defined
it is the product itself which is well-defined
You have a single quotient in the output
or even a trunc
, if you express the section property in a subtype
Do you have decidable equality on G/H?
is that necessary?
I feel that it is already computable
it comes up in the construction of the functions
how would you do it?
I am reminded of a discussion with @Gabriel Ebner about generalizing the quotient axioms to allow for indexed families of quotients
but everything is finite here
the axioms should be enough
But it's provable in the finite case, and that's what I would prove
hmm
this is very hard
can I even do this in 3 days
It's less than 100 lines for sure
Also, decidable equality is definitely necessary for constructing sections
I don't want to construct any section
You do, that's the whole point
You are lifting stuff from a quotient but that's not so important
hmm
Are you suggesting that there is a way to define the transfer that avoids reference to any section?
If I do a product indexed by a fintype do I need decidable equality?
I assume you have to make coordinated choices in order to define the sums
but everything is finite
No, products of elements in a commutative group over a finset does not require decidable_eq
then why do I need it now
even if the choice is coordinated
it's still finite
to define the section that coordinates the choices
but everything is well-defined
How are you going to remember your finitely many choices if not with a function? And how is that function indexed?
isn't it the philosophy of quotient that if your choices are well-defined then you are computable?
That's not the problem
You want a function G/H -> G
list.rec is computable
multiset.rec is computable
that means distinguishing elements of G/H when they are sent to different members of G
finset.rec is computable
hmm
Here's a way to state the section property without groups:
def choices {ι : Type*} [fintype ι] {α : ι → Type*} (R : ∀ i, α i → α i → Prop) (f : ∀ i, quot (R i)) : quot (λ (a b : Π i, α i), ∀ i, R i (a i) (b i)) := sorry
I only have one quotient though
it's just G/H
That doesn't make too much of a difference
The point here is the interchanging of pi and quot
I see
It seems reasonable to have that function as a computable axiom, this is what Gabriel and I discussed
I see
because it has an obvious VM interpretation
but is it provable?
but you can only prove it for I finite
and even then I believe it implies decidable equality of I
Kenny, if you are under time constraints, why not just make it noncomputable, make sure everything else is done, and come back to it later if you have time?
I will look into this theorem, and report back if I can prove it. Feel free to assume it
This version is not quite right though, because for example one of the R i
could be the empty relation, and then the "product relation" is also empty
You need to assume the R i
are at least reflexive, or build the "product relation" differently, like the Cartesian product of graphs
That's fine, quot
implicitly takes the equivalence closure of the given relation
quotient
is the variant that explicitly assumes the relation is an equivalence already
But, say, R 1
might be nontrivial, while R 2
is empty, and then λ (a b : Π i, α i), ∀ i, R i (a i) (b i)
is empty, so we haven't made any identifications in \a 1 \x \a 2
then we'd have a map quot (R 1) \to \a 1
. Or is that okay?
I see, yes that's bad
So maybe just replacequot
with quotient
everywhere
although then I have to show that the pi of equivalences is an equivalence
Here's the noncomputable version:
instance pi_setoid {ι : Type*} {α : ι → Type*} [∀ i, setoid (α i)] : setoid (Π i, α i) := { r := λ a b, ∀ i, a i ≈ b i, iseqv := ⟨ λ a i, setoid.refl _, λ a b h i, setoid.symm (h _), λ a b c h₁ h₂ i, setoid.trans (h₁ _) (h₂ _)⟩ } noncomputable def quotient.choice {ι : Type*} {α : ι → Type*} [S : ∀ i, setoid (α i)] (f : ∀ i, quotient (S i)) : @quotient (Π i, α i) (by apply_instance) := ⟦λ i, (f i).out⟧ theorem quotient.choice_eq {ι : Type*} {α : ι → Type*} [∀ i, setoid (α i)] (f : ∀ i, α i) : quotient.choice (λ i, ⟦f i⟧) = ⟦f⟧ := quotient.sound $ λ i, quotient.mk_out _
Let G be a group and H a subgroup of finite index. Then, pick a set-theoretic section s:G/H->G where G/H is the right cosets. Then, the transfer homomorphism G^ab -> H^ab is defined by sending [[g]] to prod[x in G/H] s(x) g s(xg)^-1.
Shouldn't there be a [[]] in the definition there somewhere?
by sending [[g]] to [[prod[x in G/H] s(x) g s(xg)^-1]].
Does [[g h]] = [[g]][[h]]
?
yes
Then don't the s(x)
parts cancel?
@Kevin Buzzard
[[prod[x in G/H] s(x) g s(xg)^-1]] = (prod[x in G/H] [[s(x)]]) (prod[x in G/H] [[g]]) (prod[x in G/H] [[s(xg)]]^-1)
and prod[x in G/H] [[s(xg)]]^-1 = prod[x in G/H] [[s(x)]]^-1
by reindexing
oh you can't do that, g is not in H
s(x) g s(xg)^-1 is in H
I know, but they should still be equal as members of G
no, because H^ab is H/[H,H]
Okay, I think I have something close to a proof that decidable_eq of the coset relation is necessary. Suppose you know fintype G/H
. Ignoring quotients for a moment, thinking "computationally", this is essentially a list of elements of G which chooses exactly one element of every coset (or, if you prefer, a bijection (not an equiv) from fin n to G/H). Now that looks like the section we want, but the problem is the computation of s(xg) that we need later. The function x |-> xg is a permutation of G/H which corresponds to a permutation of the list s, but computationally it's not that easy since if we take our representative s(x) and multiply by g we get s(x)g, which is in the same coset as s(xg) but is not usually the same. So we need a way of searching our list s to find the value that is in the same coset as s(x)g, and there is no way to do this from the given data.
I see. Then I'll just come up with a section noncomputably then.
 Spending the weekend in a field without much internet so don't expect too much from me until sun pm
{% endraw %}Last updated: Apr 24 2020 at 19:02 UTC


Co-hosted with
Share course content with anyone, anywhere.
We believe that you learn best by doing.
That's why we're launching a hackathon - to empower the next generation to learn and refine real world skills through team-building and tangible product creation.


This is a nonprofit organization, founded in Jan 1st 2018, which focuses on open source trusted OS development.
Our goal is to provide software that is suitable for being incorporated in commercial products or even can directly be a commercial product with slightly modification. To achieve the goal, the software should meet the following requirements:
Our software is not for competing with the commercial products. Instead, we hope our software can help to improve the software quality and the software development process of the commercial products.
Improving software development process means that we can also improve the product's quality and can work smarter than before. Thus, we will have more time to do other important things, for example, to develop professional skills, to read favorite books and the most important is to have dinner with your family.


Oddjob looks for a descriptor file on the classpath. A descriptor file isn't necessary
but if it finds one it will use it to when configuring jobs.
The descriptor file name is META-INF/arooa.xml
.
Here's a descriptor that allows the job we saw in the previous section to be created without any dependency on Oddjob:
<EMAIL_ADDRESS>src/main/resources/META-INF/arooa.xml}Here's the Job without Annotations:
<EMAIL_ADDRESS>src/main/java/org/oddjob/devguide/NoAnnotationsInJob.java}And its configuration:
<EMAIL_ADDRESS>examples/devguide/annotations2.xml}


A triangle with all its sides the same length.
Each of the angles in an equilateral triangle is 60 ∘ .


I am a technology enthusiast, studying and writing about all things related to tech. In most of my blog posts, I write about my adventures in exploring various technologies, covering hardware, operating systems, software, encryption, cloud, and some of my experiences in real life. I even have a tab for anime, because I want to share my reviews with the world!
If you like this blog, please bookmark :bookmark: and share this with your friends. There are many more exciting things I want to write about, so do check back often!


CNIT 133
JavaScript
Home
Basic Ops
Functions
Loops
Arrays
Objects
jQuery
Ajax
Part 4
Part 1a
Part 1b
Part 2
Part 3
Part 4
Enter a number between 10 and 100: