text:
package com.samsung.sjs.constraintgenerator;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Consumer;

import org.mozilla.javascript.Node;
import org.mozilla.javascript.Token;
import org.mozilla.javascript.ast.Assignment;
import org.mozilla.javascript.ast.AstNode;
import org.mozilla.javascript.ast.AstRoot;
import org.mozilla.javascript.ast.Block;
import org.mozilla.javascript.ast.EmptyStatement;
import org.mozilla.javascript.ast.ExpressionStatement;
import org.mozilla.javascript.ast.ForInLoop;
import org.mozilla.javascript.ast.ForLoop;
import org.mozilla.javascript.ast.FunctionCall;
import org.mozilla.javascript.ast.FunctionNode;
import org.mozilla.javascript.ast.KeywordLiteral;
import org.mozilla.javascript.ast.Name;
import org.mozilla.javascript.ast.NodeVisitor;
import org.mozilla.javascript.ast.ObjectLiteral;
import org.mozilla.javascript.ast.ObjectProperty;
import org.mozilla.javascript.ast.PropertyGet;
import org.mozilla.javascript.ast.ReturnStatement;
import org.mozilla.javascript.ast.Scope;
import org.mozilla.javascript.ast.StringLiteral;
import org.mozilla.javascript.ast.UnaryExpression;
import org.mozilla.javascript.ast.VariableDeclaration;
import org.mozilla.javascript.ast.VariableInitializer;

import com.ibm.wala.util.collections.HashMapFactory;
import com.ibm.wala.util.collections.HashSetFactory;
import com.samsung.sjs.typeconstraints.ITypeTerm;
import com.samsung.sjs.types.AnyType;
import com.samsung.sjs.types.ArrayType;
import com.samsung.sjs.types.AttachedMethodType;
import com.samsung.sjs.types.ConstructorType;
import com.samsung.sjs.types.FunctionType;
import com.samsung.sjs.types.IntersectionType;
import com.samsung.sjs.types.MapType;
import com.samsung.sjs.types.NamedObjectType;
import com.samsung.sjs.types.ObjectType;
import com.samsung.sjs.types.Property;
import com.samsung.sjs.types.Type;
import com.samsung.sjs.types.TypeVariable;

/**
 * Utility functions used to implement constraint generation.
 *
 * @author ftip
 *
 */
public class ConstraintGenUtil {

	/**
	 * Check if an AstNode corresponds to a boolean constant.
	 */
	static boolean isBooleanConstant(AstNode node){
		if (node instanceof KeywordLiteral){
			KeywordLiteral kw = (KeywordLiteral)node;
			if (kw.toSource().equals("true") || kw.toSource().equals("false")){
				return true;
			}
		}
		return false;
	}

	/**
	 * Find return statements within a FunctionNode and checks if any of
	 * them returns a value.
	 *
	 */
	private static class ReturnStatementVisitor implements NodeVisitor {

		public ReturnStatementVisitor(FunctionNode fun){
			this.fun = fun;
		}

		@Override
		public boolean visit(AstNode node) {
			if (node instanceof ReturnStatement){
				ReturnStatement rs = (ReturnStatement)node;
				if (rs.getReturnValue() != null){
					if (ConstraintGenUtil.findEnclosingFunction(node) == fun){
						returnsValue = true;
					}
				}
			}
			return true;
		}

		public boolean returnsValue(){
			return this.returnsValue;
		}

		private FunctionNode fun;
		private boolean returnsValue = false;
	};

	/**
	 * Indicates if the function returns a value.
	 */
	static boolean returnsValue(FunctionNode node){
		ReturnStatementVisitor visitor = new ReturnStatementVisitor(node);
		node.visit(visitor);
		return visitor.returnsValue();
	}

	/**
	 * Check if an AstNode corresponds to "null"
	 */
	static boolean isNullConstant(AstNode node){
		if (node instanceof KeywordLiteral){
			KeywordLiteral kw = (KeywordLiteral)node;
			if (kw.toSource().equals("null")){
				return true;
			}
		}
		return false;
	}

	/**
	 * Check if an AstNode corresponds to the "this" reference.
	 *
	 * @param node
	 * @return
	 */
	public static boolean isThis(AstNode node){
		if (node instanceof KeywordLiteral){
			KeywordLiteral kw = (KeywordLiteral)node;
			if (kw.toSource().equals("this")){
				return true;
			}
		}
		return false;
	}

	/**
	 * find the function definition that immediately surrounds a given AST node.
	 * Returns null if there is no surrounding function.
	 *
	 */
	public static FunctionNode findEnclosingFunction(AstNode node) {
		AstNode current = node;
		while (current != null && !(current instanceof FunctionNode)){
			current = current.getParent();
		}
		FunctionNode fun = (FunctionNode)current;
		return fun;
	}

	public static Assignment findEnclosingAssignment(AstNode node) {
		AstNode current = node;
		while (current != null && !(current instanceof Assignment)){
			current = current.getParent();
		}
		Assignment a = (Assignment)current;
		return a;
	}

	/**
	 * Determine if a variable is declared outside the program.
	 * @param n
	 * @return
	 */
	static boolean isExternal(Name n){
		return findDecl(n) == null;
	}

	/**
	 * Finds the declaration of the called function. Assumes that the call's target
	 * is a Name, which is passed as the second parameter.
	 *
	 */
	static FunctionNode findFunDecl(FunctionCall fc, Name funName){
		List<FunctionNode> funsFound = findFunDecl2(fc, new ArrayList<FunctionNode>());
		for (int i=0; i < funsFound.size(); i++){
			FunctionNode fun = funsFound.get(i);
			if (funName.getIdentifier().equals(fun.getName())){
				return fun;
			}
		}
		return null;
	}

	/**
	 * Helper function for implementing findFunDecl(). Recursively walks up the AST
	 * to find functions available in enclosing scopes. Implemented because Rhinos's
	 * built-in support for finding enclosing scopes is highly erratic.
	 */
	private static List<FunctionNode> findFunDecl2(FunctionCall fc, ArrayList<FunctionNode> foundSoFar) {
		AstNode node = fc.getParent();
		while (node != null){
			if (node instanceof FunctionNode){
				FunctionNode fn = (FunctionNode)node;
				foundSoFar.add(fn);
			} else if (node instanceof AstRoot || node instanceof Block || node instanceof Scope){
				for (Iterator<Node> it = node.iterator(); it.hasNext(); ){
					Node n = it.next();
					if (n instanceof FunctionNode){
						FunctionNode fn = (FunctionNode)n;
							foundSoFar.add(fn);
					}
				}
			}
			node = node.getParent();
		}
		return foundSoFar;
	}

	/**
	 * Indicates if a given Name is a global variable
	 */
	static boolean isGlobal(Name name){
		return findDecl(name) == null;
	}

	/**
	 * Finds the declaration of the referenced Name.
	 */
	static Name findDecl(Name name){
		List<Name> declsFound = findDecl2(name);
		for (int i=0; i < declsFound.size(); i++){
			Name name2 = declsFound.get(i);
			if (name.getIdentifier().equals(name2.getIdentifier())){
				return name2;
			}
		}
		return null;
	}

	/**
	 * Helper function for implementing findDecl. Iteratively walks up the AST
	 * to find variables available in enclosing scopes. Implemented because Rhinos's
	 * built-in support for finding enclosing scopes is highly erratic.
	 */
	private static List<Name> findDecl2(Name name){
	    List<Name> foundSoFar = new ArrayList<>();
	    // maps an identifier to its canonical Name declaration in the current scope
	    Map<String,Name> foundInCurrentScope = HashMapFactory.make();
	    Consumer<Name> addToScope = (Name newName) -> {
	        String identifier = newName.getIdentifier();
            Name curName = foundInCurrentScope.get(identifier);
	        if (curName == null || newName.getAbsolutePosition() < curName.getAbsolutePosition()) {
	            foundInCurrentScope.put(identifier, newName);
	        }
	    };
		AstNode node = name.getParent();
		while (node != null){
			if (node instanceof FunctionNode){
				FunctionNode fn = (FunctionNode)node;
				for (AstNode param : fn.getParams()){
					if (param instanceof Name){
						Name paramName = (Name)param;
						addToScope.accept(paramName);
					}
				}
				Name funName = fn.getFunctionName();
				if (funName != null){
					addToScope.accept(funName);
				}
				// clear out current scope before going to parent
				foundSoFar.addAll(foundInCurrentScope.values());
				foundInCurrentScope.clear();
			}  else if (node instanceof AstRoot || node instanceof Block || node instanceof Scope){
				for (Iterator<Node> it = node.iterator(); it.hasNext(); ){
					Node n = it.next();
					if (n instanceof VariableDeclaration){
						VariableDeclaration vd = (VariableDeclaration)n;
						for (VariableInitializer vi : vd.getVariables()){
							AstNode target = vi.getTarget();
							if (target instanceof Name){
								Name targetName = (Name)target;
								addToScope.accept(targetName);
							}
						}
					} else if (n instanceof ForLoop){
						ForLoop fl = (ForLoop)n;
						AstNode init = fl.getInitializer();
						if (init instanceof VariableDeclaration){
							VariableDeclaration vd = (VariableDeclaration)init;
							for (VariableInitializer vi : vd.getVariables()){
								AstNode target = vi.getTarget();
								if (target instanceof Name){
									Name targetName = (Name)target;
									addToScope.accept(targetName);
								}
							}
						}
						AstNode body = fl.getBody();
						if (body instanceof Scope){
							Scope scope = (Scope)body;
							List<AstNode> stmts = scope.getStatements();
							for (AstNode stmt : stmts){
								if (stmt instanceof VariableDeclaration){
									VariableDeclaration vd = (VariableDeclaration)stmt;
									for (VariableInitializer vi : vd.getVariables()){
										AstNode target = vi.getTarget();
										if (target instanceof Name){
											Name targetName = (Name)target;
											addToScope.accept(targetName);
										}
									}
								}
							}
						}

					} else if (n instanceof ForInLoop){
						ForInLoop fl = (ForInLoop)n;
						AstNode iterator = fl.getIterator();
						if (iterator instanceof VariableDeclaration){
							VariableDeclaration vd = (VariableDeclaration)iterator;
							for (VariableInitializer vi : vd.getVariables()){
								AstNode target = vi.getTarget();
								if (target instanceof Name){
									Name targetName = (Name)target;
									addToScope.accept(targetName);
								}
							}
						}
					}else if (n instanceof FunctionNode){
						FunctionNode fn = (FunctionNode)n;
						Name funName = fn.getFunctionName();
						addToScope.accept(funName);
					}
				}
			}
			node = node.getParent();
		}
		// clear out top-level scope
		foundSoFar.addAll(foundInCurrentScope.values());
		return foundSoFar;
	}

	/**
	 * Remove start and end quotes from a string literal. Assumes the string is quoted.
	 */
	public static String removeQuotes(String s){
		assert(s.charAt(0) == '\'' || s.charAt(0) == '\"');
		assert(s.charAt(s.length()-1) == '\'' || s.charAt(s.length()-1) == '\"');
		return s.substring(1, s.length() - 1);
	}

	public static String quote(String s){
		return "\"" + s + "\"";
	}

	/**
	 * Tests if an object literal is an object by checking that all
	 * properties are unquoted.
	 */
	static boolean isObject(ObjectLiteral o){
		boolean result = (o.getElements().size() > 0);
		for (ObjectProperty prop : o.getElements()){
			AstNode left = prop.getLeft();
			result = result && (left instanceof Name);
		}
		return result;
	}

	/**
	 * Tests if an object literal is a map by checking that
	 * all properties are quoted.
	 * In JavaScript, both double quotes and single quotes are
	 * supported but for now we assume double quotes are used.
	 *
	 * Empty object literals are assumed to be maps.
	 */
	static boolean isMap(ObjectLiteral o){
		boolean result = true;
		for (ObjectProperty prop : o.getElements()){
			AstNode left = prop.getLeft();
			result = result && (left instanceof StringLiteral);
		}
		return result;
	}

	static class ThisVisitor implements NodeVisitor {
		public ThisVisitor(FunctionNode fun) {
			this.refersToThis = false;
			this.fun = fun;
		}

		public boolean refersToThis(){
			return refersToThis;
		}

		private boolean refersToThis;
		private FunctionNode fun;

		@Override
		public boolean visit(AstNode node) {
			if (isThis(node)){
				AstNode current = node;
				while (!(current instanceof FunctionNode)){
					current = current.getParent();
				}
				if (current == this.fun){
					refersToThis = true;
				}
			}
			return true;
		}
	}

	/**
	 * Determines if a function definition occurs in a position where it is
	 * assumed to be a method. For now, we assume this is only the case if
	 * the function refers to "this". This heuristic will need some further
	 * thinking/refinement
	 */
	public static boolean isMethod(FunctionNode fun){
		ThisVisitor tv = new ThisVisitor(fun);
		fun.visit(tv);
		return tv.refersToThis();
	}

	/**
	 * Determines if a FunctionNode is a constructor. This is done simply by
	 * checking if its name starts with a capital letter.
	 */
	public static boolean isConstructor(FunctionNode fun){
		String funName = fun.getName();
		return (funName != null && funName.length() > 0 && funName.charAt(0) >= 'A' && funName.charAt(0) <= 'Z');
	}

	/**
	 * Find the properties of "this" that a method/constructor reads/writes.
	 */
	private static class PropertyVisitor implements NodeVisitor {

		PropertyVisitor(){
			readProperties = new LinkedHashSet<String>();
			writtenProperties = new LinkedHashSet<String>();
		}

		@Override
		public boolean visit(AstNode node) {
			if (node instanceof PropertyGet){
				PropertyGet pg = (PropertyGet)node;
				AstNode target = pg.getTarget();
				String propName = pg.getProperty().getIdentifier();
				if (target instanceof KeywordLiteral && ConstraintGenUtil.isThis(target)){
					if (node.getParent() instanceof Assignment){
						Assignment a = (Assignment)node.getParent();
						if (a.getLeft() == node){
							writtenProperties.add(propName);
						} else {
							readProperties.add(propName);
						}
					} else {
						readProperties.add(propName);
					}
					readProperties.removeAll(writtenProperties); // if something is read and written, it should only be in the written set
				}
			} else if (node instanceof FunctionNode) {
			    // don't recurse into nested function body
			    return false;
			}
			return true;
		}

		public Set<String> getWrittenProperties(){
			return writtenProperties;
		}

		@SuppressWarnings("unused")
        public Set<String> getReadProperties(){
			return readProperties;
		}

		private Set<String> readProperties;
		private Set<String> writtenProperties;
	}

	/**
	 * For a given FunctionNode, return a set of names of properties
	 * that are written locally using assignments of the
	 * form "this.x = ..."
	 */
	public static Set<String> getWrittenProperties(FunctionNode fun){
		PropertyVisitor pv = new PropertyVisitor();
		fun.getBody().visit(pv);
		return pv.getWrittenProperties();
	}

	public static List<String> getPropertyNames(ObjectLiteral ol){
		List<String> propNames = new ArrayList<String>();
		for (ObjectProperty op : ol.getElements()){
			AstNode left = op.getLeft();
			if (left instanceof Name){
				propNames.add(((Name)left).getIdentifier());
			} else if (left instanceof StringLiteral){
				String identifier = ConstraintGenUtil.removeQuotes(((StringLiteral)left).toSource());
				propNames.add(identifier);
			} else {
				System.err.println(left.getClass().getName() + " " + left.toSource());
				throw new Error("unsupported case in getPropertyNames()");
			}
		}
		return propNames;
	}

	public static final Type OBJECT_TYPE = new ObjectType();
	public static final Type ARRAY_TYPE = new ArrayType(new AnyType());
    public static final Type MAP_TYPE = new MapType(new AnyType());
	public static final Type FUNCTION_TYPE = new FunctionType(new ArrayList<Type>(), new ArrayList<String>(), new AnyType());

	/**
	 * Determines if a type is parameterized by checking if it refers to any TypeVariables.
	 * Used by the constraint generator to determine what constraints to generate.
	 */
	public static boolean isParameterized(Type type){
		if (type instanceof TypeVariable){
			return true;
		} else if (type.isPrimitive() || type.isAny()){
			return false;
                } else if (type instanceof NamedObjectType) {
                        // By fiat...
                        return false;
		} else if (type instanceof ArrayType){
			return isParameterized(((ArrayType)type).elemType());
		} else if (type instanceof FunctionType){
			FunctionType fType = (FunctionType)type;
			boolean result = isParameterized(fType.returnType());
			for (Type t : fType.paramTypes()){
				result = result || isParameterized(t);
			}
			return result;
		} else if (type instanceof AttachedMethodType){
			AttachedMethodType mType = (AttachedMethodType)type;
			boolean result = isParameterized(mType.returnType());
			for (Type t : mType.paramTypes()){
				result = result || isParameterized(t);
			}
			return result;
                } else if (type instanceof ConstructorType) {
                        ConstructorType ct = (ConstructorType)type;
                        boolean result = isParameterized(ct.returnType());
			for (Type t : ct.paramTypes()){
				result = result || isParameterized(t);
			}
			return result;
		} else if (type instanceof ObjectType){
			ObjectType oType = (ObjectType)type;
			boolean result = false;
			for (Property prop : oType.properties()){
				result = result || isParameterized(prop.getType());
			}
			return result;
		} else if (type instanceof IntersectionType){
			IntersectionType iType = (IntersectionType)type;
			boolean result = false;
			for (Type t : iType.getTypes()){
				result = result || isParameterized(t);
			}
			return result;
		} else if (type instanceof MapType){
			MapType mType = (MapType)type;
			return isParameterized(mType.elemType());
		} else {
			throw new Error("missing case: " + type.getClass().getName());
		}
	}

	public static boolean isMethodAssignedInObjectLiteral(FunctionNode n){
		return (n.getParent() instanceof ObjectProperty && n.getParent().getParent() instanceof ObjectLiteral);
	}

    public static boolean isNullUndefinedLitOrVoidOp(ITypeTerm term) {
        AstNode node = term.getNode();
        return isNullConstant(node)
                || (node instanceof Name && ((Name)node).getIdentifier().equals("undefined"))
                || (node instanceof UnaryExpression && ((UnaryExpression)node).getOperator() == Token.VOID);
    }

    public static boolean isNullConstant(ITypeTerm term) {
        return isNullConstant(term.getNode());
    }

    /**
     * For a {@link FunctionNode} representing a constructor, if the constructor C is
     * followed by a sequence of assignments of the form C.prototype.a = ...;, return
     * a set of all the properties written on the prototype.  If the assignments do not
     * fit that form, return the empty set.
     * @param consNode
     * @return
     */
    public static Set<String> getWrittenPrototypeProps(FunctionNode consNode) {
        Set<String> result = HashSetFactory.make();
        AstNode parent = consNode.getParent();
        boolean found = false;
        for (Node child: parent) {
            if (child instanceof EmptyStatement) {
                continue;
            }
            if (child.equals(consNode)) {
                found = true;
            } else if (found) {
                // looking for a statement of the form C.prototype.a = ...;
                boolean foundAssign = false;
                if (child instanceof ExpressionStatement) {
                    AstNode expression = ((ExpressionStatement)child).getExpression();
                    if (expression instanceof Assignment) {
                        Assignment assign = (Assignment) expression;
                        AstNode lhs = assign.getLeft();
                        if (lhs instanceof PropertyGet) {
                            PropertyGet pg = (PropertyGet) lhs;
                            AstNode pgTarget = pg.getTarget();
                            if (pgTarget instanceof PropertyGet) {
                                PropertyGet basePG = (PropertyGet) pgTarget;
                                if (basePG.getProperty().getIdentifier().equals("prototype")) {
                                    // BINGO
                                    result.add(pg.getProperty().getIdentifier());
                                    foundAssign = true;
                                }
                            }
                        }
                    }
                }
                if (!foundAssign) {
                    // stop looking for more assignments
                    break;
                }
            }
        }
        return result;
    }
}


Hi. Hope you are having a good life. An oscilloscope is a fundamental instrument for every electronics engineer or hobbyist to measure or analyze changes in any electrical signal. It displays an electrical signal with respect to time, so you can see every detail of the signal i.e. its shape, frequency, amplitude.
However, getting your own best beginner oscilloscope can be a tricky task. You may have a lot of questions in mind, like what parameters should I look for? What should be the price range for a beginner scope? What are the best oscilloscope making brands out there in the market? And perhaps a lot of more.
In this post, I try to help you solve this tricky task and find you the best oscilloscope if you are a beginner or hobbyist.
In summary, I will first investigate the popular oscilloscopes brands. Then we will move on to see how oscilloscopes are priced, like what parameters determines the prices for oscilloscopes. Then we will see how to select a scope that would be the best for our requirements. Then I will share some models from the brands we would discuss. And then we will finish our post with detail parameter discussions, like it would for the people excited to know every parameter in deep detail.
Of-course everything I share in this post is the best to my knowledge. I am not saying I am an expert. This is just a kind of help. Hopefully, this post will help you.
3 How are the best oscilloscopes priced?
6 Are there other great options available?
8 What is an Oscilloscope?
There are lot of manufactures out there making all kind of oscilloscopes i.e. Analog and Digital. Before saying anything about the famous brands, I think, a lot of beginners find it confusing what is analog and digital scope and which one is better. I guess it might be the first question for a lot people reading this.
Well, in general I believe it is the time to welcome the new technology i.e. digital. Digital scopes are far more better than analog as they have storing capability and plenty of other options. On the other hand analog scopes have high resolution as they are displaying the signal in real time. Why? Because in digital scope we have ADC (Analog to digital conversion), while in analog there is no ADC process. But clearly we don't use old analog scopes anymore in general. So, clear your mind from old scope and give your mind a clear answer that we are going to use only digital scope.
I am not just saying it in the air. I mean it. They are the best, they are in the industry for quite long time. Everyone who used a scope from these brands are happy with it. They are global brands and have a proven track record. I am sure if you are graduating from engineering university you may have seen a scope from these brands in your labs.
Let's see how are they competing with one another on Google and their overall brand presence.
Above trends chart is live. So, there may occur changes in it.
The time I am writing this post Tektronix is on the top of the game. It has more brand signals and presence than the rest. So, at this time for me and for you all Tektronix is the best brand among the above listed according to Google. It may change with time. If you are reading this post with trends changed go with brand that is beating the competition.
Now, the next question is how to select the oscilloscope that is best for one's requirements?
I think this is the most important thing to pay close attention to. I try to explain everything in a very simple possible language. So, don't worry. Just grab a piece of paper, pencil and a calculator. Answer all the questions I ask on the paper. By doing so you will have a rough model of your desire best beginner oscilloscope at the end.
The selection of oscilloscope depends on lot of things and parameters. Before jumping into parameters explanation and questions, the first step is to answer the following questions. Write all your answers on the paper.
For what situation you need a scope i.e. where you are to use it. For example on the bench, at a customer's site, under the hood of your car.
How many signals you want to measure at once? For example, how many measuring channels you will required in your scope.
A guess of frequencies you will measure with the scope. According to me you should be very sure of your frequency range to be measured by the scope. This question is very important, please pay very close attention to it. Wrong answer can cause you wastage of money.
What are the amplitudes of your signals? In case you don't know, leave it. Its ok.
Are the signals you are going to measure periodic or non periodic?
Coming towards the technical questions. At this point, some of you may get bored. But I am just trying to save you from wasting your money. This is my only intention here.
How much bandwidth you will require?
The answer is, multiply you highest frequency with 5. For example, if your highest measuring frequency is 10MHz, then the ideal beginner oscilloscope for you is with bandwidth 50MHz.
The more bandwidth is not an issue. Like for the said highest frequency you can also use a scope with 100MHz bandwidth, but it is not a good idea. Because it will cost you more money and most importantly if you are not professional you will end in getting high noise floor as well.
If you are thinking you are not sure of future. like you want to buy high bandwidth because you are not sure of the signals you will deal in future. Then let me tell you oscilloscopes have bandwidth upgrade options for less cost. You can upgrade the bandwidth in future if need it.
For those who want to learn bandwidth in more detail, I explain it at the end of the post.
How much sample rate you will need?
The answer is The Nyquist criterion which states that the sampling rate must be at least twice the maximum frequency that you want to measure. For example, if your maximum frequency is 10MHz then the ideal scope for you must have sample rate of 20MS/s.
Again higher sample rate will end in costing more money.
Are you buying a scope to deal with analysis of random signals like to capture the random and infrequent signals or glitches?
If yes, then select the one with high waveform capture rate and high memory depth.
For those who want to learn memory depth in more detail, I explain it at the end of the post.
What resolution and accuracy you need?
With a higher resolution oscilloscope, more accurate measurements are possible.
Above are the must answer questions. I hope you took them seriously. Now, if you didn't leave the post and still reading 😀 let's go further.
How are the best oscilloscopes priced?
The higher the above parameters, the higher are the prices. That was the reason I was asking you to pay close attention to your highest frequency in your required measurements.
Now, I think we have enough information about your beginner scope that we can see at the following models and can decide which is best for us.
Well, I just cannot emphasize this how much an oscilloscope is the basic need of every electronics hobbyist or beginner or any person involved in electronics. If you are thinking to learn or go with electronics without an oscilloscope, you are wrong.
For me, following are the must in beginner oscilloscopes.
Let's see what I get for you below.
This is a great deal, this model got everything. You will simply fall in love with this model. It got a lot of bandwidth ranges. I am sure it will match with your required bandwidth.
It got 5-year warranty, which is amazing.
Option to select the bandwidth of your choice. For your information, It has 30MHz, 50MHz, 70MHz, 100MHz, 150MHz, and 200MHz. This is crazy and too amazing.
Sample rate of 2GS/s, unbelievable.
For 30MHz bandwidth, it costs $425. For 200 MHz bandwidth it will cost you $1766. I think this is very decent price range for a beginner.
Most importantly it has UL Certified, CE approved, CAT II 300V safety rated. If you don't know about these terms just keep in mind for short they are safety standards.
They are very quiet during operation, as they got no cooling fan which mean greater reliability.
In summary, the Tektronix TBS1032B (Amazon link) has got everything a beginner or professional need for his projects.
The best alternatives to the above brand are the Rigol, Siglent and Hantek brands. I am sure, you may have heard of these brands in your own research on best oscilloscopes, if this post is not your very first. These brands are popular and trying their best to provide their customers with the best products.
Talking about the specific brand, Rigol, is a well-known company, making digital oscilloscopes since 1999. Its products have been used worldwide and people are very much satisfied with its products. I found that they have great customer services, and answer any question you ask them.
The model has 4 channels, best for car diagnosis. And if you are dealing with lot of signals at once, this model is for you.
50MHz bandwidth, same as the above model and can be upgraded, so don't worry.
Comes in nice packing and has a beautiful bright screen.
In summary, the Rigol DS1054Z (Amazon Link) Digital Oscilloscope is the second choice in selecting the best oscilloscope for beginners. You can use it as a student and can analysis your projects with it.
The Siglent Technology is new to oscilloscope industry but its models are too reliable and affordable. I did research on its every model, read people reviews, saw videos, and used my own engineering knowledge to compare it with other brands. At the end, I am very happy and positive about this brand, and decide to list it in my best oscilloscopes list.
Like I said, there are a lot of models from this brand. But, in my opinion, this is the best suited for beginners and hobbyists people. I personally like this model too much and it is just beautiful.
Sample rate of 500MS/s, this is the real time making the scope so powerful.
Lot of math functions including FFT function. This feature is important if you want to analyze signal in frequency domain.
Memory depth of 32Kpts, this is a kind of low but it is that too much bad.
In summary, the Siglent SD1052DL (Amazon Link) is my best oscilloscope for complete beginners, electronic hobbyists, and electrical engineering students. It will be a tool to measure all your signals, sum them, subtract them, give you the power of each signal, give you the frequency content of it.
See the comparison. You see Tektronix is the most expensive but most powerful among them all. But Rigol beats it in number of channels. Compare you requirement and budget and go for one. They are all the best beginner oscilloscopes.
Are there other great options available?
Obviously, there are many models you can check online. You will see some USB scopes too, just do not go for them. They are not really good until you buy the high-quality one.
I do not think Hantek needs any introduction for the majority of you people. It is well known for providing best quality beginner oscilloscopes. It has all the features as in the above oscilloscopes.
I love the model DSO5072P from Hantek for the beginners out there. It is simply amazing.
In summary, the Hantek DSO5072P (Amazon Link) can be the best alternatives to above ones if someone is low on budget. It is the most inexpensive scope I listed so far.
The only problem with Keysight which made me not to include it in beginner list of oscilloscopes is, it costs you a high amount of money.
But you know something, if you can buy this model, the DSOX1102A. It will be your lifetime oscilloscope unless you get more professional in electronics and their happens the demand for larger bandwidth and other stuff.
See yourself this model Keysight DSOX1102A on Amazon.
I don't know what you are going to do with these scopes. Good luck for what you gonna do with them. I created the list of applications, which I think can be effectively done by the above listed scopes.
In the rest of the post, I give info on what parameter to look for when someone decides to have a beginner oscilloscope in his lab.
As I said, an oscilloscope is the most fundamental instrument of every electronics engineer or hobbyist's lab. Its best use is when it comes to time-varying signals, and a multimeter or all other measuring instrument seems to fail.
It gives you a two-dimensional graph of a function (measuring signal) with respect to time, so you can clearly measure the signal frequency, amplitude, shape, rise time, distortion, time intervals, and few other parameters.
There exist two main types of oscilloscopes, the digital and analog. There was a time for analog oscilloscopes. I do not know, maybe some people are still using it. My first oscilloscope was analog too, and the first time I introduced to it was during my university first year. But the powerful analog to digital converters has changed everything.
Having an oscilloscope is very fundamental, fun and interesting. It gives you the power to see what's going on with the signals in a circuit.
If you are wondering how your sounds waves look like in telephone line, which is a very crazy idea, an oscilloscope is there to make your wish a reality.
The journey of an oscilloscope and electronics hobbyist starts at the very beginning. The first simple circuit he can design might be a passive low pass filter. Oscilloscope helps him to see the real-time frequency response of the filter, to analyze and verify the cutoff frequency for the designed filter.
Sometimes, a design circuit for some unknown reasons fails. We turn it on, it works fine but a sudden it fails. To analyze this problem, to know what amplitude of impulse signals that are causing the circuit to fail, we need an oscilloscope.
Pulse Width Modulated (PWM) signal can only be studied well if you can see it by eye. You can play around with duty cycles and amplitudes in a fun way if you can see it, in my opinion.
There are a lot of things to discover about this awesome instrument, the oscilloscope.
An electronic instrument is defined as good or bad based on some parameter judgments. A multimeter is good if it has high impedance and it is bad if it has bad safety measures. Same goes for an oscilloscope.
Following are the parameter which I think you should understand before you can judge any oscilloscope as good or bad. These parameters are not limited to just beginner oscilloscopes, you can apply it to any of oscilloscope.
Bandwidth is the most important parameter of all. It limits the ability of the scope to measure a signal. It shows the frequency range that the oscilloscope can accurately measure.
In other words, bandwidth is specified at the frequency at which a sinusoidal input signal is attenuated to 70.7% of the signal's true amplitude.
Oscilloscope is made of complex circuitry. The important part of the circuitry is the front end amplifiers, which work at the certain band of frequencies and define the bandwidth of an oscilloscope.
If someone needs a high bandwidth he needs a sophisticated front-end circuitry, which makes the whole oscilloscope very expensive.
In summary, the more is the bandwidth, the more powerful the oscilloscope is, and the most expensive as well. But a rule of thumb for selecting a good bandwidth is to have the bandwidth 5 times greater than the fundamental frequency of your measuring signal.
A very good point for beginners. If you have high bandwidth and you are playing with a low-frequency signal, you do not get accurate results. You get a lot of noise instead of great results. Sounds crazy! I know.
So, basically, I keep all these things in mind and try my knowledge best to make the list of oscilloscopes having bandwidth best for beginners.
The sample rate is the ability of an oscilloscope to how fast it can acquire the number of samples per second, or in simple words, it determines the amount of waveform information captured and displayed on the screen. The greater the sample rate, the more resolution it has, and in the result, you have every detail of your signal on display.
Above equation is Niquest criteria for sample rate. Oscilloscopes must obey this in order to be called a good or the best beginner oscilloscopes. This is an industrial adopted rule of thumb. But some industry people also recommend a sample rate that is 3 to 5 times the bandwidth.
The reason they provide is, you need a high sample rate to see any unexpected glitches or anomalies. In summary, the more samples you have in each period, the more signal detail you'll capture.
Let's see what Keysight Labs have got for us about the sample rate and bandwidth.
A good point for the beginner, without proper bandwidth, you will end in an attenuated or distorted signal. While without enough sample rate you will end in having no information that is very necessary to display the exact frequency, rise and fall times of your signal. You can also miss any glitch or anomaly occurring instantly.
One important thing to double check is the sample rate of the oscilloscope when all channels are turned on. Typically, when multiple channels are in use, the sample rate is split up among the channels. If you are using more than one channel, you'll want to make sure the sampling rate is still sufficient.
Memory depth is the measure of oscilloscope's memory to store signals. The more memory depth means you can capture signal at the highest sample rate. This is a very nice feature and a good oscilloscope must have a good size of depth memory. But it will make it costly.
The oscilloscope memory is directly tied to the sample rate. The more memory you have, the higher you can keep the oscilloscope's sample rate as you capture a longer period of time. The higher the sample rate, the higher the effective bandwidth of the oscilloscope.
It is the time oscilloscopes takes to update its screen. It is a very great and important feature to look for. Of course, who cares for an oscilloscope when it takes too much time to update its screen. As in such a situation, there is a good chance you may miss an important signal.
Above are the key parameter to look for in a good oscilloscope. Some other following useful aspects can also be taken into consideration.
They may not be the important parameters but I feel I should talk about them a little bit. For me, size is not that issue because I love working in the lab. There may be beginners which will use an oscilloscope for car diagnoses. For such people carry oscilloscope where and their, size is of a big problem.
The cost is the big issue. But you cannot have a cheap oscilloscope with great features. It just cannot happen. Good bandwidth, sample rates, built in wave generator, FFT, extra channels, good memory depth are the parameters which will cost you money.
I keep these problems in mind and try my knowledge best to enlist oscilloscopes you can carry everywhere and are of a reasonable price at a beginner level.
An important thing I like to consider for a beginner oscilloscope is the number of channels. I think 2 channels are more than enough.
For example, you want to see the communication of Arduino at the same time. Two channels will be enough to see what is coming to your Arduino and what is going away from it or to see the phase difference between 2 pulse trains or any two signals.
The best beginner oscilloscope should have some basic math functions i.e. addition, subtraction, multiplication, or FFT. It is very cool and useful to see voltage, current and their product (Power) on the same screen at the same time.
This is all that I want to share with you about the best beginner oscilloscope. I shared everything I want myself to be told.
Personally, I think, finding the best oscilloscope for beginners or for anyone is the second task. The first task is to find the brand you can trust and has a proven track record. This is my personal approach to buy anything. I used the same strategy here too.
In summary, I put myself in the shoes of a person who has just started with electronics or a person who wants to have a basic best oscilloscope.
Thank you and have a good life.
Hi I am Yaman. I am very happy to see you. I love electronics, having fun with it since childhood. Recently earned my degree in Electronics Engineering, and decided to share to the world what I have learned so far. In this blog I share my learning and together we have awesome time. Hopefully, it will be helpful to you and you will enjoy it.


text:
http://tvtropes.org/pmwiki/pmwiki.php/Roleplay/HyperspaceEvangelion
Roleplay / Hyperspace Evangelion
Create New - Create New - Analysis Characters FanficRecs FanWorks Fridge Haiku Headscratchers ImageLinks Laconic PlayingWith Quotes Recap ReferencedBy Synopsis Timeline Trivia WMG YMMV
From left to right: Phillip Mhaol, Ara Kim, Yuki Minase, The Paper Bag Teacher, Elidia, Anatoly Petrov, Kurumi Ishihara, Takumi Kyosuga, Azami Sicarius, Steiner Laudo
"This document- seven pages in length- is the written form of assigning to NERV to be a Pilot! You Children were all brought here, together, in this class, because you have that Potential! You can all be heroes! You can save the world, have parental issues, and probably die! ...I mean, save the world. You can save the world. Ah, how sad it all is..."
— Paper Bag Teacher
Hyperspace Evangelion is an Adeptus Evangelion tRPG Campaign running AD 3 VA's Draft 05, a Dark Heresy modification, inspired by the Shinji And Warhammer 40 K fanfiction, designed to run games in the world of the anime series Neon Genesis Evangelion. The campaign can be found on the Hyperspace Forums , created and hosted by GM Elvis Strunk, and has a wikia page dedicated to its universe and plot.
Hyperspace Evangelion takes place in what could be construed as an alternative universe in the greater Evangelion metaverse with an all new cast, drawing heavily in terms of influence and setting from the original animated source material, Neon Genesis Evangelion, and to a lesser degree, the End of Evangelion and Rebuild of Evangelion, but with a number of crucial differences and deviations from the canon universe.
Hyperspace Evangelion starts in Tokyo-3, Japan, 2020, 20 years after the Second Impact, a catastrophic event of apocalyptic magnitude that ultimately resulted in the death of nearly half the world's human population, the near destruction of the entire southern hemisphere, cataclysms such as massive geological disturbances and tidal waves in the northern hemisphere, and irrevocable changes to global climate, habitability, and weather patterns leading to the global extinction of much of the earth's native animal and plant life. What remained of Humanity following the Second Impact inherited a world that would scarcely comfort them. The survivors of the cataclysm were quickly beset upon by bizarre, anomalous life forms; Angels, the progeny of Adam, and Lilin, the progeny of Lilith, powerful beings that transcended life as modern science understood it and defied the laws of physics. Worse, Humanity was caught between the two in a proxy war between their progenitors, facing almost certain extinction, were it not for the development of the first Evangelion. A human-created weapon based on Lilin life paradigms (widely believed by the public to be gigantic robotic mechanized combat units) capable of engaging Angels and Lilin directly and holding its own in battle, the Evangelion and the organization that developed and fielded them, NERV, saved Humanity from the brink, affording human kind a second chance to fight for the right to inherit the post-Second Impact world.
The player pilots were brought in from all over the world for deployment at NERV's headquarters in Tokyo-3 to replenish the depleted Tokyo-3 Evangelion corp following what was likely a devastating Angel or Lilin attack. Here, the new rookie pilots and their one remaining veteran pilot attend the same class (on account of the lack of school-age children) at a local secondary school and live together in a communal home provided by NERV, forging bonds of friendship, discovering the warmth of love, finding space for laughter between the tears, and saving a world too far gone. And then it all comes tumbling down.
As with its parent source material, Hyperspace Evangelion is, at first glance, a relatively standard Humongous Mecha premise, complete with giant "robots", unreasonably big weapons, no taxpayer expense spared, and eldritch abominations with ill defined goals and gains. On closer inspection, however, the campaign emphasizes character studies revolving around the seven primary player characters, their intrinsic strengths and flaws, and their struggles to find self-identity, meaningful relationships, and catharsis while overcoming a gambit of challenges unique to each character and his or her backstory, including societal rejection and vilification, clinical depression, sheltered ignorance, and pathological individualism.
Technically, Hyperspace Evangelion is a collaborative writing and role play exercise between seven individual writers, each of whom was responsible for bringing a unique character with a defining set of character traits and personal conflicts into the plot and overarching setting of the campaign. Hyperspace Evangelion was met with such enthusiasm that players competed for positions in the campaign through a series of character interviews and a semi-canon role play exercise. Since its inception, Hyperspace Evangelion has also inspired several non-canon role play instances that take place in-universe, typically coinciding with real-world holidays, and several works of non-canon fanfiction.
Hyperspace Evangelion shares many (but not all) of the same tropes as Neon Genesis Evangelion. In the interest of avoiding redundancy, such basic tropes that result from common elements of the setting and associated plot elements will not be listed. This page will, instead, focus on the tropes centered around the characters and other unique aspects of Hyperspace Evangelion.
See here for more information about the canon Evangelion franchise as a whole.
Hyperspace Evangelion provides examples of:
A-Cup Angst: Yuki has complained multiple times regarding her chest proportions, comparing herself unfavorably with the other female pilots. Of course, she's only 14...
Airborne Aircraft Carrier: Airborne Eva Carrier actually. NERV's carrier is a crowning achievement to engineering and taxpayer yen spent and is capable of flying the pilots and their Evas to outlaying areas for deployment. Via rocket propelled drop pods.
All Men Are Perverts: Steiner's fantasized about masturbating over Elidia's comatose body (admittedly in non-canon fashion), Takumi is the underworld's major supplier of ill-gotten pantsu, Phillip juggles at least 3 celebrity girlfriends at all times, and Anatoly doesn't qualify to be called a man.
Action Girl: Yuki, Elidia, and Azami all pilot gigantic, multi-story living mecha to slay otherwise untouchable eldritch abominations. Enough said.
Apologises a Lot: Steiner; barely a single post containing his dialogue goes past without some form of apology for how worthless he is or how pointless his words are. Including his apologies.
Artificial Human: Elidia is the world's first "Manufactured" human, a scientific accomplishment only rivaled by the extreme cost in terms of material, scientific, and monetary resources required to achieve it. While superficially, NERV maintains that the Manufactured Program is designed to provide a source of reliable and expendable Eva pilots, the truth is that the Human race faces extinction in two or three successive generations due to the after-effects of the Second Impact. Elidia, manufactured specifically to overcome "Adam's Stigmata", represents Humanity's best hope for continuity of the species.
Attack Its Weak Point: Most Angels have a Core location that needs to be destroyed to defeat them, otherwise they tend to regenerate or shrug off damage. Some Angels have traits removing or altering the fuction of said location, and Lilin are not known to posess it at all.
Bag of Holding: Takumi's pockets are filled with an endless supply of women's pantsu. He's also pulled a grappling hook and a live octopus out of his pockets.
BFG: Technically all Eva-scaled firearms qualify for this description. Arguably, the Great Positron Cannon, a massive energy sniper rifle, is the largest such weapon. The recoil of the weapon is such that the Eva firing it must be in a prone position and not even Sleipnir's specialized sniper gunframe, which can tote standard 2-handed Eva-scaled weapons with ease, can carry the weapon or move it once it's been locked into firing position.
Big Brother Instinct: Takumi has taken it upon himself (by self-invitation) to look after Yuki as an adopted younger sister... much to the idol's displeasure and exasperation.
Bling of War: Yuki's Eva, Unit Zero, is the world's first privatized Evangelion. As such, it sports all manner of garish civilian advertisements and corporate logos. It probably even all lights up for that extra splash of publicity at night-time fights.
Bond Creatures: Evangelion in this Ad Eva campaign are portrayed as sentient (or at least intelligent) entities with their own personalities and motivations. Each Eva has a unique affinity for and relationship with its respective pilot, no two pairings experiencing synchronization the same way.
Calling Your Attacks: Yuki's insistence that they follow mecha tropes has led to her ripping off anime like Gunbuster when she divekicked an Angel after an aerial drop - this was broadcast across the entire city, too, due to some advance preparations on her part.
Caped Mecha: This hasn't happened yet in the campaign, but you know it will. Looking at you, Yuki Minase...
Cast Full of Crazy: All player characters needed to take a certain number of drawbacks, some of which manifest as mental instabilities or pathologies. As the campaign progresses, additional mental pathologies emerge as the result of accumulation of stress and "ego" damage from piloting the Evangelion and exposures to soul-rending experiences involving Angels, Lilin, Evangelion, or any combination thereof.
Child Soldiers: The pilots are all teenagers, owing to the fact that the Evangelion cannot be piloted effectively by anyone born prior to the Second Impact, 20 years ago.
Childhood Friend Romance: Takumi and Kurumi are prime examples of this trope, having developed strong feelings for one another during their shared childhood and young adulthood with one another as they struggled to survive in the anarchy of Japan's mountainous countryside after the Second Impact. Elidia and her creator Mathias are also an example, although their shared childhood never actually existed and is based entirely on the fact that Elidia inherited altered copies of Mathias's memories as a surrogate for the years of childhood she never lived.
Clones Are People, Too: Elidia is portrayed as a one-of-a-kind prototype Manufactured human. Ideally, NERV intends to scale the Manufactured Program towards "mass" production of Manufactured in an attempt to reverse the impending extinction of the human race due to Angelic Contamination. So far, however, Elidia is the world's one and only Manufactured human, as much a key to Humanity's immediate as well as future survival as a species. Needless to say, she's hardly the expendable clone most of the general and ignorant public believes her to be.
Corporate-Sponsored Superhero: Horizon paid a large sum of money to NERV in order to 'rent' an Evangelion of their own and have teen idol Yuki be the pilot. This has come with certain other caveats, like advertising, film and TV rights, interviews, documentaries, and access to certain parts of the base.
Crippling Overspecialization: Elidia wields the Great Positron Cannon when piloting Sleipnir, an unwieldy, extremely long-ranged weapon that's capable of tremendous damage output, but that also leaves its pilot cripplingly defenseless and utterly reliant upon her teammates. The issue is compounded by the fact that her Evangelion, Sleipnir, was never designed for close-quarters combat, having tissue-paper thin armor and low survivability in general.
Cyber Cyclops: Elidia's Eva, Sleipnir, has one gigantic, clearly artificial monoeye. Apparently the lack of depth perception doesn't hamper its function as a Sniper-Type Eva.
Divine Conflict: Adam and Lilith, each waging war against one another by proxy, Adam through his Angelic Host and Lilith through her Lilin Horde. Humanity and its Evangelion just happen to be caught between the two.
Dysfunction Junction: All the player characters, even Yuki (maybe), have some kind of major, crippling character flaw or circumstance that make them, for lack of better terms, poorly socializable. Particularly with one another. The issue is only exacerbated as the campaign progresses and the characters become increasingly mentally unstable and traumatized.
Epic Fail:
Elidia any time she tries to sing, dance, or otherwise attempt something musically inclined.
Phillip getting torn to shreds in the tutorial fight by charging ahead of any support.
Fatal Flaw: Alphabetically? Or Chronologically?
Yuki is hopelessly optimistic owing to her sheltered life and rose-tinted glasses. She's also physically frail to illness and injury, quite literally having a physiological flaw that's potentially lethal.
Anatoly is a pilot trapped by his past, unable to move on, either to find happiness and peace or to save his own life. He also has a potentially fatal genetic accident called cancer.
Elidia is a girl driven by high and unrestrained emotions and passions with no societal context to temper them save for imprinted memories. Most people think she's a total weirdo anyways given her background, even if she's not acting like one at the moment.
Phillip has a fundamental mistrust of all of humanity (unless you're an attractive female pop idol) and suffers from an inability to form, much less appreciate, human relationships.
Steiner suffers from crippling clinical depression and self-loathing, unable to see any good in himself or the circumstances he finds himself in.
Azami, like Phillip, also hedges her bets against the world, having lost the only people she ever considered family and close to her heart. Azami comes across as standoffish on the best of days and prioritizes the mission objective over any petty issues such as friendships, comraderie, and collateral damage.
Fortune Teller: Complete with tongueless manservant, the enigmatic Madame Kou is on the barely helpful side with her lack of actual advice, instead providing only somewhat helpful sayings.
Explosive Overclocking: The Great Positron Cannon generates so much heat after firing that attempting to fire again too soon after a prior discharge can cause the entire weapon to explode. Consistent with this trope, the GPC also uses so much power that it requires the use of two toroid fusion reactors on site (and a city's power grid if available) to fire.
Flaming Sword: Camael, the first Angel, had the ability to strike out with flaming sword-like AT field projections, consistent with his namesake. In an ironic twist of realism, Camael never actually managed to hit anything with this power.
Gender Bender: Elidia carries the neural patterns and memories of her male creator as the foundation for her own personality and ego, essentially a female counterpart to the good doctor with a borrowed past and "soul".
Good Is Not Soft: Takumi is all smiles and country bumpkin charm, looking after his friends and loved ones. Despite appearances, the fellow actually has quite the affinity with an ax and is no stranger to the idea of homicide.
Hero Insurance: You don't even want to know how much it costs to fix up the city after an Angel/Lilin fight...
Hime Cut: Azami wears her hair as such.
Hot-Blooded: Elidia and Phillip are prime examples, needing little excuse or provocation to enter into a no-holds-barred brawl. These two were fighting even before canon!
Humongous Mecha: The campaign's based on Neon Genesis Evangelion. Enough said.
Identical Stranger: Grace, an NPC encountered on one of Philip's random wanderings who seems uncannily similar to the description of one of one of Yuki's fellow teen idols, but totally isn't. Also Efta, one of the former Evangelion pilots who piloted alongside Anatoly before she left the corps, and Elidia.
Idol Singer: Yuki's profession before become an Eva pilot. She used this as leverage in order to get selected as a pilot in the first place - her fame and backing would remove at least some of the financial burden from NERV and potentially earn them some good PR from the backing of her parent company.
In Harmony with Nature: Elidia has a natural affinity for all living things, ranging from plants to animals. Curiously, they seem to resonate with her on a deeper level as well. More than once, she's commented on the "songs" of living things around herself and others.
Interservice Rivalry: The Manufactured Project and the Neo-Spartan Project, both of which compete for limited NERV funding and support and have a notoriously rocky relationship with one another.
Killer Rabbit: One of the Lilin encountered by NERV before the events of canon was described as resembling a giant rabbit. Anatoly was one of the pilots defeated by the Lilin, leading him to develop PTSD as a result. To date, Anatoly is still terrified of the fluffy critters. Of course, having your face eaten by one the size of a skyscraper will do that to a person.
Kiss Me, I'm Virtual: Rabbit, the AI interface who represents the MAGI, is the only character to have anything approaching a cordial relationship with Steiner. Computer Geek meets Pretty AI Girl; classic.
Lethal Chef: Kurumi Ishihara's cooking's level of spiciness makes the Second Impact seem like a lukewarm bath.
Mad Scientist's Beautiful Daughter: Elidia was designed by her creator to meet and exceed certain aesthetic feminine ideals, all ostensibly to help her public image. See "All Men Are Perverts" above.
Mama Bear: Elidia's Evangelion, Sleipnir, has a warm, protective soul and disposition towards its pilot. The lengths to which it will go to protect her are... extreme.
Mega-Corp: Horizon, which directly controls the vast majority of communications and media infrastructure and owns an impressive portfolio of controlling stakes in a large number of other corporate interests in a wide variety of industries in the post Second Impact world. Horizon's also recently gotten into the business of saving the world, sponsoring Yuki Minase, one of their teen idols, to pilot an Evangelion in a massive publicity stunt billed as a "gesture of corporate responsibility".
Mega Twintails: Elidia characteristically wears her hair as twintails that rival those of Miku Hatsune. It's explained that the accelerated gestation and aging during her creation process allowed her to essentially keep 17 years' worth of hair growth intact prior to being "birthed". Elidia's twintails fall to her mid-thighs and are probably heavy enough to put her at risk of osteoarthritis of the neck in about 30 years or so.
Miko: Yuki is a shrine maiden at her family's ancestral Shinto shrine. She takes her duties seriously and continues to attend to her duties, time permitting.
Mix-and-Match Man: Elidia is a genetic chimera from multiple unspecified donor sources. Enough of the process was subject to chance and random variation that both she and her creator dismiss the possibility of recreating her precisely, even if it were economically feasible to produce additional copies of her.
Motion Capture Mecha: Describes Philip's Evangelion (which features a cradle ala Pacific Rim that reads his physical movements to pilot the Eva) in particular, although it's possible the other Evangelion can also mimic their pilots' physical movements if needed to.
Moving Buildings: Like its counterpart in the Evangelion universe, Adeva's Tokyo-3 features buildings which withdraw underground when under threat from Angel or Lilin attacks. Other fortress assets ordinarily hidden underground so as to not alarm the city's citizenry also qualify, doing the exact reverse when the city is under attack.
Mysterious Antarctica: Ground Zero of the Second Impact, Antarctica is a continent shrouded in mystery, if it even still exists in any meaningful way.
Omnidisciplinary Scientist: Mathias, NERV's go to man for all medical, Evangelion, and technological needs. You know he's legit because of the white lab coat. The man's probably got more degrees than he has years past puberty. Also likely extends to Gerard, the other NERV wunderkind on payroll.
One-Way Visor: Sachiko Minoru, NERV's operations director, wears a custom visor that completely obscures her eyes, leaving the woman inscrutable on the best of days.
Only the Chosen May Ride: The Evangelion only synchronize with individuals born after the Second Impact, and only a handful of them at that. Even pilots who are capable of synchronizing with one Eva may find it impossible to synchronize with another, as evidenced by Elidia's ill-fated attempt to synchronize with Unit Zero.
Or Was It a Dream?: Chapter 2 starts with a shared dream among the pilots which, unbeknownst to them, was a vision of actual events in the city that evening. The veracity of the dream was confirmed at the end of the chapter as one of the pilots experiences the tragedy of the "dream" first hand.
Otaku Surrogate: Yuki's super into old mecha anime and gaming - she has name-dropped Super Robot Wars as a favorite, and stays up late at night for raids. Becoming a mecha pilot was a dream come true.
Our Angels Are Different: The Angels from Ad Eva are strikingly different from those depicted by Judaeo-Christian religion, like those of the source material. The Lilin are also radically different from Angels as depicted by the Evangelion universe, for example, lacking the signature red cores which typify the Angels of Evangelion.
Paper-Thin Disguise: The Paper Bag Teacher literally has a paper-thin disguise as he wears a paper bag over his head.
Pimped-Out Car: Gerard's customized NERV limousine seems to feature all the necessities of civilization, including a minibar, snack fridge, entertainment system. The darned thing probably has a fishtank in it too... Eat your heart out, Xzibit.
Rage Against the Heavens: See Divine Conflict above; what remains of Humanity has thrown its efforts behind NERV's efforts to fight back against Adam and Lilith, fielding Evangelion to meet and slay the Gods' proxies on their own terms.
Red Shirt Army: NERV and the UN's conventional military forces who are utterly ineffective at slowing or distracting the Angels/Lilin attacking the city and who largely exist in the plot only to be wiped out and to make players feel bad.
Russian Guy Suffers Most: Anatoly's only stated goals in life are to retire from the Eva corp and to find that special girl to be lazy for the rest of his life with. Instead he gets dumped by his previous love interest and cancer, all before the campaign even started. Tough.
Scare Campaign: The CRG's generally anti-NERV and specifically anti-Manufactured rhetoric.
Sensual Spandex: The pilots' plugsuits, which are just as anatomically revealing as the show's.
Shell-Shocked Veteran: Anatoly, the only surviving active-duty member of Tokyo-3's Eva Corp before the player pilots arrived. By his own admission, he's only a shadow of his former self, struggling with PTSD and widely metastatic cancer. This trope will probably extend to most, if not all of the player pilots later in the campaign.
Shock and Awe: Camael, the first true Angel confronted by the cast, wielded, among other powers, a deadly ability to generate electrical surges that had the potential to fry any Evangelion still connected to its umbilical power source. Fortunately, the pilots were running on reserve power for most of the battle as they had chosen to deploy outside the city's power grid in an attempt to prevent further civilian casualties, limiting the Angel's ability to use its power to full effect.
Shower Scene: Elidia and Yuki bathe together (and each other) frequently.
Stress Vomit: Elidia does this when Takumi decides to treat all the pilots to some delicious, ethically reprehensible whale meat sashimi.
Sunglasses at Night: NERV's resident rockstar/science-geek combo loves to drive his custom limousine at nighttime with his sunglasses on. Tokyo-3's lamp posts and pedestrians are less than thrilled by the idea.
Super Mode: Under circumstances of extreme duress, the Evangelion have the potential of going berserk, overriding their pilots' control or otherwise supplanting them and circumventing NERV's cybernetic inhibitors, allowing them to single-handedly defeat their Angelic or Lilin opponents, albeit at a devastating cost to the city, NERV, and the pilots themselves.
Technicolor Eyes: Azami and Elidia have red and yellow eyes respectively. While not as fantastical, Anatoly, Steiner and Takumi all have green eyes.
The Nicknamer: Phillip has an Irish nickname for just about every character in the campaign. Not that anyone (including the players) can keep any of them straight.
The Spartan Way: The Neo Spartan Program, which trains Evangelion Pilots from displaced children, irrespective of lost youth and consent issues. The Neo Spartan program's methods are extreme and their candidates effective, if not somewhat scarred soldiers. Azami is the Neo Spartan representative dispatched to Tokyo-3 for service in the Eva Corp.
Trauma Conga Line: Player pilots accumulate traumas that manifest as psychiatric illnesses as their piloting stress and ego damage accumulate. These effects are permanent and cannot be lost or otherwise "cured."
Triple Shifter: Describes Mathias, who seems to literally live in NERV's laboratories and is always in some state of extreme sleep deprivation and/or half-starvation. Also extends to NERV's security staff which seem to be conveniently present 24/7.
Uterine Replicator: Presumably describes the apparatuses used to create Elidia. Although the Manufactured Project's origins and facilities are murky, even to Elidia, whose creator deliberately expunged his own memories regarding the program prior to imprinting her with them, she's referenced on multiple occasions being pulled from "the tube," presumably the gestation apparatus she occupied during her creation process.
Villain with Good Publicity: Niles Septimus, local Coalition for Responsible Genomics strongman, and the CRG as a whole enjoys strong and enthusiastic-bordering-on-fanatic support from a not-insignificant portion of the public, collectively becoming a thorn in the side for NERV in general and the Manufactured Program in particular.
What Beautiful Eyes!: Elidia's eyes are an unusual, but undeniably attractive golden amber, a hallmark of her origins as a manufactured human. A number of characters have commented on this particular feature, although it may have also attracted the attention of a certain aspiring serial killer.
Honorable Hogwarts
Play-by-Post Games
If Bay Forum Were A Mountain Hall

redpajama_set_name: RedPajamaCommonCrawl


text:
Jackson Wang raves about bak kut teh and kopi during week-long Singapore trip
Jackson Wang has been in Singapore since Aug 2 for a series of travel vlogs as part of a collaboration with the Singapore Tourism Board. ST PHOTO: GIN TAY
Jan Lee
Fans and passers-by whipped out their smartphones and took photographs when they spotted Hong Kong-born K-pop star Jackson Wang grabbing bak kut teh at the foodcourt in The Shoppes at Marina Bay Sands (MBS) recently.
"It was so good," the 28-year-old star enthuses about his meal during a group interview with local media on Aug 10.
Sitting in a newly renovated MBS suite with his artfully styled dyed hair, tiny hoop earrings and a patterned jacket with sheer sleeves, Wang looked every part the star who made history earlier this year as the first solo Chinese performer at American music festival Coachella.
Despite the attention he attracted, he still managed to have a peaceful lunch. He says: "Honestly? People are there for lunch, they don't care that much. They have their own lives and are busy with their own things."
A member of boy band Got7 who has carved out a successful solo career for himself with variety appearances in China and several English-language music releases, Wang has been in Singapore since Aug 2 for a series of travel vlogs as part of a collaboration with the Singapore Tourism Board. He is expected to stay until Aug 14, before flying to the United States.
This is not the star's first time in the Republic - he came as a teenage fencer competing in the 2010 Youth Olympic Games and even sneaked out to visit the Night Safari then.
BTS' Jin completes basic military training
NCT 127 to hold first virtual K-pop concert in Roblox
Ticket sales for Blackpink's newly-added second National Stadium concert kick off Feb 6
Taiwanese singer Rainie Yang and former K-pop star Jessica Jung get pally
Speaking in a mix of English and Mandarin, he says: "I've been to many countries but a lot of times, it feels like it doesn't even count because I'm going from the airport to an event venue to the hotel. And sometimes when I do get to venture out, it's to touristy spots that locals might not actually go to that much.
"This time, I discovered places I didn't know about. I went to places such as Sentosa and Universal Studios Singapore, but I also got to go to Kusu Island and St John's Island, which I hadn't heard about. It's very refreshing."
Singapore's coffee culture also left an impression.
"I went to Nanyang Old Coffee. I tried the kopi here with the gah dai (extra sugar) and siu dai (less sugar) versions. It's like the coffee is custom-made."
Unfortunately, Wang missed a quintessential Singaporean experience - the National Day Parade's fireworks show - despite being in the Marina Bay area. He laments: "I heard the noise. I was asking my team, 'Where can we see it? Can anybody tell me anything?'"
His trip here coincides with promotions for his upcoming album Magic Man, slated to be released in September.
Wang, who has opened up about his mental health struggles in recent interviews, says he is the most "raw he's ever been" in the album.
He adds that he has not been living a life true to himself in the last few years. "I want to show the not-perfect side of me. A lot of people support and have heard of Jackson Wang, but there's another side to me too. I want to show whoever's watching the true me," he says.
"At the end of the day, you just can't have everything, you can't have everybody liking you. People will like you, people will hate you, people will talk a lot of different stuff about you, but I just want to be honest with my audience and try my best to do the things I believe in."
Wang is deeply involved in his musical outputs, putting together his own team to prepare his solo releases.
"My vision and dream are in my head. Everyone else can understand what they are only to a certain degree. If I want something to be done the way I envisioned it, I just have to do it myself."
The multi-hyphenate also opened a concept space at Voco Orchard for his streetwear label Team Wang Design's latest collection while in Singapore. Juggling so many projects has made him feel the passing of time more acutely.
"In the blink of an eye, I'm 28. In the past, wherever I went, I was the didi (Mandarin for younger brother). I called everyone Ge and Jie (Mandarin for older brother and older sister). Now, I'm starting to hear that used on me and I realise, wow, time is passing and I have to grab it," he says.
Jackson Wang wishes Singapore happy birthday at Marquee party
In Pictures: K-pop star Jackson Wang hosts sold out party at nightclub Marquee
When asked what he does in the little free time he has, Wang got candid with reporters about his efforts to stay in shape.
"I go to the gym. It's something I both enjoy and have to do. Sometimes, I wake up in the morning and check my phone to go through my photo shoots and so on. Then I'll put down my phone, look in the mirror and get a shock. The person in the pictures and in the mirror are so different. Like, man, I've put on weight. I got to go for a run," he says with a laugh.
But perhaps what Wang wants most of all in his personal time is just that - personal time. The singer says he could not recall the last time he went on his own vacation.
To guffaws from his staff, Wang jokes: "If I had the time, I'd want to cut off ties with my team and just not communicate with them. I'm so tired of them. I just want to wander somewhere, breathe the air and not stay in a hotel.
"I have homes in Shanghai and Seoul, but they're like hotels to me. And hotels are like my home at this point. It's been that way for seven or eight years. Enough is enough, you know?"
Got7's Jackson Wang opens about struggles with mental health and fame as a K-idol
Music Scene: K-pop boy band Got7 reunite for eponymous EP
k-popjackson wangMusicsinger