commit d066861e31f507c27e52a970ec7fb9beaa920a6a Author: Shwetha Date: Mon Sep 12 10:22:19 2022 -0400 everything everywhere diff --git a/.obsidian/app.json b/.obsidian/app.json new file mode 100644 index 0000000..697723d --- /dev/null +++ b/.obsidian/app.json @@ -0,0 +1,7 @@ +{ + "legacyEditor": false, + "livePreview": true, + "fileSortOrder": "byCreatedTimeReverse", + "promptDelete": false, + "alwaysUpdateLinks": true +} \ No newline at end of file diff --git a/.obsidian/appearance.json b/.obsidian/appearance.json new file mode 100644 index 0000000..ba55833 --- /dev/null +++ b/.obsidian/appearance.json @@ -0,0 +1,3 @@ +{ + "baseFontSize": 14 +} \ No newline at end of file diff --git a/.obsidian/community-plugins.json b/.obsidian/community-plugins.json new file mode 100644 index 0000000..062acc4 --- /dev/null +++ b/.obsidian/community-plugins.json @@ -0,0 +1,3 @@ +[ + "obsidian-jupyter" +] \ No newline at end of file diff --git a/.obsidian/core-plugins.json b/.obsidian/core-plugins.json new file mode 100644 index 0000000..cc52ccb --- /dev/null +++ b/.obsidian/core-plugins.json @@ -0,0 +1,14 @@ +[ + "file-explorer", + "global-search", + "switcher", + "graph", + "backlink", + "page-preview", + "note-composer", + "command-palette", + "editor-status", + "markdown-importer", + "word-count", + "file-recovery" +] \ No newline at end of file diff --git a/.obsidian/graph.json b/.obsidian/graph.json new file mode 100644 index 0000000..5052281 --- /dev/null +++ b/.obsidian/graph.json @@ -0,0 +1,30 @@ +{ + "collapse-filter": true, + "search": "", + "showTags": false, + "showAttachments": true, + "hideUnresolved": false, + "showOrphans": true, + "collapse-color-groups": true, + "colorGroups": [ + { + "query": "", + "color": { + "a": 1, + "rgb": 14701138 + } + } + ], + "collapse-display": true, + "showArrow": true, + "textFadeMultiplier": 1.3, + "nodeSizeMultiplier": 1.61030790441176, + "lineSizeMultiplier": 2.34958639705882, + "collapse-forces": true, + "centerStrength": 0.520772058823529, + "repelStrength": 10, + "linkStrength": 1, + "linkDistance": 250, + "scale": 0.9238331697563902, + "close": false +} \ No newline at end of file diff --git a/.obsidian/hotkeys.json b/.obsidian/hotkeys.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/.obsidian/hotkeys.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/.obsidian/plugins/obsidian-jupyter/main.js b/.obsidian/plugins/obsidian-jupyter/main.js new file mode 100644 index 0000000..0050178 --- /dev/null +++ b/.obsidian/plugins/obsidian-jupyter/main.js @@ -0,0 +1,3343 @@ +/* +THIS IS A GENERATED/BUNDLED FILE BY ROLLUP +if you want to view the source visit the plugins github repository +*/ + +'use strict'; + +var obsidian = require('obsidian'); +var child_process = require('child_process'); +var require$$0$1 = require('fs'); +var url = require('url'); +var http = require('http'); +var https = require('https'); +var require$$0 = require('util'); +var path = require('path'); +var zlib = require('zlib'); +require('net'); +var tls = require('tls'); +var events = require('events'); +require('assert'); +var os = require('os'); + +function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } + +var require$$0__default$1 = /*#__PURE__*/_interopDefaultLegacy(require$$0$1); +var url__default = /*#__PURE__*/_interopDefaultLegacy(url); +var http__default = /*#__PURE__*/_interopDefaultLegacy(http); +var https__default = /*#__PURE__*/_interopDefaultLegacy(https); +var require$$0__default = /*#__PURE__*/_interopDefaultLegacy(require$$0); +var path__default = /*#__PURE__*/_interopDefaultLegacy(path); +var zlib__default = /*#__PURE__*/_interopDefaultLegacy(zlib); +var tls__default = /*#__PURE__*/_interopDefaultLegacy(tls); +var events__default = /*#__PURE__*/_interopDefaultLegacy(events); + +/*! ***************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */ + +function __awaiter$1(thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +} + +// Unique ID creation requires a high quality random # generator. In the browser we therefore +// require the crypto API and do not support built-in fallback to lower quality random number +// generators (like Math.random()). +var getRandomValues; +var rnds8 = new Uint8Array(16); +function rng() { + // lazy load so that environments that need to polyfill have a chance to do so + if (!getRandomValues) { + // getRandomValues needs to be invoked in a context where "this" is a Crypto implementation. Also, + // find the complete implementation of crypto (msCrypto) on IE11. + getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || typeof msCrypto !== 'undefined' && typeof msCrypto.getRandomValues === 'function' && msCrypto.getRandomValues.bind(msCrypto); + + if (!getRandomValues) { + throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported'); + } + } + + return getRandomValues(rnds8); +} + +var REGEX = /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i; + +function validate(uuid) { + return typeof uuid === 'string' && REGEX.test(uuid); +} + +/** + * Convert array of 16 byte values to UUID string format of the form: + * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX + */ + +var byteToHex = []; + +for (var i = 0; i < 256; ++i) { + byteToHex.push((i + 0x100).toString(16).substr(1)); +} + +function stringify$1(arr) { + var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0; + // Note: Be careful editing this code! It's been tuned for performance + // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434 + var uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID. If this throws, it's likely due to one + // of the following: + // - One or more input array values don't map to a hex octet (leading to + // "undefined" in the uuid) + // - Invalid input values for the RFC `version` or `variant` fields + + if (!validate(uuid)) { + throw TypeError('Stringified UUID is invalid'); + } + + return uuid; +} + +function v4(options, buf, offset) { + options = options || {}; + var rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved` + + rnds[6] = rnds[6] & 0x0f | 0x40; + rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided + + if (buf) { + offset = offset || 0; + + for (var i = 0; i < 16; ++i) { + buf[offset + i] = rnds[i]; + } + + return buf; + } + + return stringify$1(rnds); +} + +var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; + +function createCommonjsModule(fn) { + var module = { exports: {} }; + return fn(module, module.exports), module.exports; +} + +/* eslint complexity: [2, 18], max-statements: [2, 33] */ +var shams = function hasSymbols() { + if (typeof Symbol !== 'function' || typeof Object.getOwnPropertySymbols !== 'function') { return false; } + if (typeof Symbol.iterator === 'symbol') { return true; } + + var obj = {}; + var sym = Symbol('test'); + var symObj = Object(sym); + if (typeof sym === 'string') { return false; } + + if (Object.prototype.toString.call(sym) !== '[object Symbol]') { return false; } + if (Object.prototype.toString.call(symObj) !== '[object Symbol]') { return false; } + + // temp disabled per https://github.com/ljharb/object.assign/issues/17 + // if (sym instanceof Symbol) { return false; } + // temp disabled per https://github.com/WebReflection/get-own-property-symbols/issues/4 + // if (!(symObj instanceof Symbol)) { return false; } + + // if (typeof Symbol.prototype.toString !== 'function') { return false; } + // if (String(sym) !== Symbol.prototype.toString.call(sym)) { return false; } + + var symVal = 42; + obj[sym] = symVal; + for (sym in obj) { return false; } // eslint-disable-line no-restricted-syntax, no-unreachable-loop + if (typeof Object.keys === 'function' && Object.keys(obj).length !== 0) { return false; } + + if (typeof Object.getOwnPropertyNames === 'function' && Object.getOwnPropertyNames(obj).length !== 0) { return false; } + + var syms = Object.getOwnPropertySymbols(obj); + if (syms.length !== 1 || syms[0] !== sym) { return false; } + + if (!Object.prototype.propertyIsEnumerable.call(obj, sym)) { return false; } + + if (typeof Object.getOwnPropertyDescriptor === 'function') { + var descriptor = Object.getOwnPropertyDescriptor(obj, sym); + if (descriptor.value !== symVal || descriptor.enumerable !== true) { return false; } + } + + return true; +}; + +var origSymbol = typeof Symbol !== 'undefined' && Symbol; + + +var hasSymbols$1 = function hasNativeSymbols() { + if (typeof origSymbol !== 'function') { return false; } + if (typeof Symbol !== 'function') { return false; } + if (typeof origSymbol('foo') !== 'symbol') { return false; } + if (typeof Symbol('bar') !== 'symbol') { return false; } + + return shams(); +}; + +/* eslint no-invalid-this: 1 */ + +var ERROR_MESSAGE = 'Function.prototype.bind called on incompatible '; +var slice = Array.prototype.slice; +var toStr$1 = Object.prototype.toString; +var funcType = '[object Function]'; + +var implementation = function bind(that) { + var target = this; + if (typeof target !== 'function' || toStr$1.call(target) !== funcType) { + throw new TypeError(ERROR_MESSAGE + target); + } + var args = slice.call(arguments, 1); + + var bound; + var binder = function () { + if (this instanceof bound) { + var result = target.apply( + this, + args.concat(slice.call(arguments)) + ); + if (Object(result) === result) { + return result; + } + return this; + } else { + return target.apply( + that, + args.concat(slice.call(arguments)) + ); + } + }; + + var boundLength = Math.max(0, target.length - args.length); + var boundArgs = []; + for (var i = 0; i < boundLength; i++) { + boundArgs.push('$' + i); + } + + bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this,arguments); }')(binder); + + if (target.prototype) { + var Empty = function Empty() {}; + Empty.prototype = target.prototype; + bound.prototype = new Empty(); + Empty.prototype = null; + } + + return bound; +}; + +var functionBind = Function.prototype.bind || implementation; + +var src = functionBind.call(Function.call, Object.prototype.hasOwnProperty); + +var undefined$1; + +var $SyntaxError = SyntaxError; +var $Function = Function; +var $TypeError$1 = TypeError; + +// eslint-disable-next-line consistent-return +var getEvalledConstructor = function (expressionSyntax) { + try { + return $Function('"use strict"; return (' + expressionSyntax + ').constructor;')(); + } catch (e) {} +}; + +var $gOPD = Object.getOwnPropertyDescriptor; +if ($gOPD) { + try { + $gOPD({}, ''); + } catch (e) { + $gOPD = null; // this is IE 8, which has a broken gOPD + } +} + +var throwTypeError = function () { + throw new $TypeError$1(); +}; +var ThrowTypeError = $gOPD + ? (function () { + try { + // eslint-disable-next-line no-unused-expressions, no-caller, no-restricted-properties + arguments.callee; // IE 8 does not throw here + return throwTypeError; + } catch (calleeThrows) { + try { + // IE 8 throws on Object.getOwnPropertyDescriptor(arguments, '') + return $gOPD(arguments, 'callee').get; + } catch (gOPDthrows) { + return throwTypeError; + } + } + }()) + : throwTypeError; + +var hasSymbols = hasSymbols$1(); + +var getProto = Object.getPrototypeOf || function (x) { return x.__proto__; }; // eslint-disable-line no-proto + +var needsEval = {}; + +var TypedArray = typeof Uint8Array === 'undefined' ? undefined$1 : getProto(Uint8Array); + +var INTRINSICS = { + '%AggregateError%': typeof AggregateError === 'undefined' ? undefined$1 : AggregateError, + '%Array%': Array, + '%ArrayBuffer%': typeof ArrayBuffer === 'undefined' ? undefined$1 : ArrayBuffer, + '%ArrayIteratorPrototype%': hasSymbols ? getProto([][Symbol.iterator]()) : undefined$1, + '%AsyncFromSyncIteratorPrototype%': undefined$1, + '%AsyncFunction%': needsEval, + '%AsyncGenerator%': needsEval, + '%AsyncGeneratorFunction%': needsEval, + '%AsyncIteratorPrototype%': needsEval, + '%Atomics%': typeof Atomics === 'undefined' ? undefined$1 : Atomics, + '%BigInt%': typeof BigInt === 'undefined' ? undefined$1 : BigInt, + '%Boolean%': Boolean, + '%DataView%': typeof DataView === 'undefined' ? undefined$1 : DataView, + '%Date%': Date, + '%decodeURI%': decodeURI, + '%decodeURIComponent%': decodeURIComponent, + '%encodeURI%': encodeURI, + '%encodeURIComponent%': encodeURIComponent, + '%Error%': Error, + '%eval%': eval, // eslint-disable-line no-eval + '%EvalError%': EvalError, + '%Float32Array%': typeof Float32Array === 'undefined' ? undefined$1 : Float32Array, + '%Float64Array%': typeof Float64Array === 'undefined' ? undefined$1 : Float64Array, + '%FinalizationRegistry%': typeof FinalizationRegistry === 'undefined' ? undefined$1 : FinalizationRegistry, + '%Function%': $Function, + '%GeneratorFunction%': needsEval, + '%Int8Array%': typeof Int8Array === 'undefined' ? undefined$1 : Int8Array, + '%Int16Array%': typeof Int16Array === 'undefined' ? undefined$1 : Int16Array, + '%Int32Array%': typeof Int32Array === 'undefined' ? undefined$1 : Int32Array, + '%isFinite%': isFinite, + '%isNaN%': isNaN, + '%IteratorPrototype%': hasSymbols ? getProto(getProto([][Symbol.iterator]())) : undefined$1, + '%JSON%': typeof JSON === 'object' ? JSON : undefined$1, + '%Map%': typeof Map === 'undefined' ? undefined$1 : Map, + '%MapIteratorPrototype%': typeof Map === 'undefined' || !hasSymbols ? undefined$1 : getProto(new Map()[Symbol.iterator]()), + '%Math%': Math, + '%Number%': Number, + '%Object%': Object, + '%parseFloat%': parseFloat, + '%parseInt%': parseInt, + '%Promise%': typeof Promise === 'undefined' ? undefined$1 : Promise, + '%Proxy%': typeof Proxy === 'undefined' ? undefined$1 : Proxy, + '%RangeError%': RangeError, + '%ReferenceError%': ReferenceError, + '%Reflect%': typeof Reflect === 'undefined' ? undefined$1 : Reflect, + '%RegExp%': RegExp, + '%Set%': typeof Set === 'undefined' ? undefined$1 : Set, + '%SetIteratorPrototype%': typeof Set === 'undefined' || !hasSymbols ? undefined$1 : getProto(new Set()[Symbol.iterator]()), + '%SharedArrayBuffer%': typeof SharedArrayBuffer === 'undefined' ? undefined$1 : SharedArrayBuffer, + '%String%': String, + '%StringIteratorPrototype%': hasSymbols ? getProto(''[Symbol.iterator]()) : undefined$1, + '%Symbol%': hasSymbols ? Symbol : undefined$1, + '%SyntaxError%': $SyntaxError, + '%ThrowTypeError%': ThrowTypeError, + '%TypedArray%': TypedArray, + '%TypeError%': $TypeError$1, + '%Uint8Array%': typeof Uint8Array === 'undefined' ? undefined$1 : Uint8Array, + '%Uint8ClampedArray%': typeof Uint8ClampedArray === 'undefined' ? undefined$1 : Uint8ClampedArray, + '%Uint16Array%': typeof Uint16Array === 'undefined' ? undefined$1 : Uint16Array, + '%Uint32Array%': typeof Uint32Array === 'undefined' ? undefined$1 : Uint32Array, + '%URIError%': URIError, + '%WeakMap%': typeof WeakMap === 'undefined' ? undefined$1 : WeakMap, + '%WeakRef%': typeof WeakRef === 'undefined' ? undefined$1 : WeakRef, + '%WeakSet%': typeof WeakSet === 'undefined' ? undefined$1 : WeakSet +}; + +var doEval = function doEval(name) { + var value; + if (name === '%AsyncFunction%') { + value = getEvalledConstructor('async function () {}'); + } else if (name === '%GeneratorFunction%') { + value = getEvalledConstructor('function* () {}'); + } else if (name === '%AsyncGeneratorFunction%') { + value = getEvalledConstructor('async function* () {}'); + } else if (name === '%AsyncGenerator%') { + var fn = doEval('%AsyncGeneratorFunction%'); + if (fn) { + value = fn.prototype; + } + } else if (name === '%AsyncIteratorPrototype%') { + var gen = doEval('%AsyncGenerator%'); + if (gen) { + value = getProto(gen.prototype); + } + } + + INTRINSICS[name] = value; + + return value; +}; + +var LEGACY_ALIASES = { + '%ArrayBufferPrototype%': ['ArrayBuffer', 'prototype'], + '%ArrayPrototype%': ['Array', 'prototype'], + '%ArrayProto_entries%': ['Array', 'prototype', 'entries'], + '%ArrayProto_forEach%': ['Array', 'prototype', 'forEach'], + '%ArrayProto_keys%': ['Array', 'prototype', 'keys'], + '%ArrayProto_values%': ['Array', 'prototype', 'values'], + '%AsyncFunctionPrototype%': ['AsyncFunction', 'prototype'], + '%AsyncGenerator%': ['AsyncGeneratorFunction', 'prototype'], + '%AsyncGeneratorPrototype%': ['AsyncGeneratorFunction', 'prototype', 'prototype'], + '%BooleanPrototype%': ['Boolean', 'prototype'], + '%DataViewPrototype%': ['DataView', 'prototype'], + '%DatePrototype%': ['Date', 'prototype'], + '%ErrorPrototype%': ['Error', 'prototype'], + '%EvalErrorPrototype%': ['EvalError', 'prototype'], + '%Float32ArrayPrototype%': ['Float32Array', 'prototype'], + '%Float64ArrayPrototype%': ['Float64Array', 'prototype'], + '%FunctionPrototype%': ['Function', 'prototype'], + '%Generator%': ['GeneratorFunction', 'prototype'], + '%GeneratorPrototype%': ['GeneratorFunction', 'prototype', 'prototype'], + '%Int8ArrayPrototype%': ['Int8Array', 'prototype'], + '%Int16ArrayPrototype%': ['Int16Array', 'prototype'], + '%Int32ArrayPrototype%': ['Int32Array', 'prototype'], + '%JSONParse%': ['JSON', 'parse'], + '%JSONStringify%': ['JSON', 'stringify'], + '%MapPrototype%': ['Map', 'prototype'], + '%NumberPrototype%': ['Number', 'prototype'], + '%ObjectPrototype%': ['Object', 'prototype'], + '%ObjProto_toString%': ['Object', 'prototype', 'toString'], + '%ObjProto_valueOf%': ['Object', 'prototype', 'valueOf'], + '%PromisePrototype%': ['Promise', 'prototype'], + '%PromiseProto_then%': ['Promise', 'prototype', 'then'], + '%Promise_all%': ['Promise', 'all'], + '%Promise_reject%': ['Promise', 'reject'], + '%Promise_resolve%': ['Promise', 'resolve'], + '%RangeErrorPrototype%': ['RangeError', 'prototype'], + '%ReferenceErrorPrototype%': ['ReferenceError', 'prototype'], + '%RegExpPrototype%': ['RegExp', 'prototype'], + '%SetPrototype%': ['Set', 'prototype'], + '%SharedArrayBufferPrototype%': ['SharedArrayBuffer', 'prototype'], + '%StringPrototype%': ['String', 'prototype'], + '%SymbolPrototype%': ['Symbol', 'prototype'], + '%SyntaxErrorPrototype%': ['SyntaxError', 'prototype'], + '%TypedArrayPrototype%': ['TypedArray', 'prototype'], + '%TypeErrorPrototype%': ['TypeError', 'prototype'], + '%Uint8ArrayPrototype%': ['Uint8Array', 'prototype'], + '%Uint8ClampedArrayPrototype%': ['Uint8ClampedArray', 'prototype'], + '%Uint16ArrayPrototype%': ['Uint16Array', 'prototype'], + '%Uint32ArrayPrototype%': ['Uint32Array', 'prototype'], + '%URIErrorPrototype%': ['URIError', 'prototype'], + '%WeakMapPrototype%': ['WeakMap', 'prototype'], + '%WeakSetPrototype%': ['WeakSet', 'prototype'] +}; + + + +var $concat$1 = functionBind.call(Function.call, Array.prototype.concat); +var $spliceApply = functionBind.call(Function.apply, Array.prototype.splice); +var $replace$1 = functionBind.call(Function.call, String.prototype.replace); +var $strSlice = functionBind.call(Function.call, String.prototype.slice); + +/* adapted from https://github.com/lodash/lodash/blob/4.17.15/dist/lodash.js#L6735-L6744 */ +var rePropName = /[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g; +var reEscapeChar = /\\(\\)?/g; /** Used to match backslashes in property paths. */ +var stringToPath = function stringToPath(string) { + var first = $strSlice(string, 0, 1); + var last = $strSlice(string, -1); + if (first === '%' && last !== '%') { + throw new $SyntaxError('invalid intrinsic syntax, expected closing `%`'); + } else if (last === '%' && first !== '%') { + throw new $SyntaxError('invalid intrinsic syntax, expected opening `%`'); + } + var result = []; + $replace$1(string, rePropName, function (match, number, quote, subString) { + result[result.length] = quote ? $replace$1(subString, reEscapeChar, '$1') : number || match; + }); + return result; +}; +/* end adaptation */ + +var getBaseIntrinsic = function getBaseIntrinsic(name, allowMissing) { + var intrinsicName = name; + var alias; + if (src(LEGACY_ALIASES, intrinsicName)) { + alias = LEGACY_ALIASES[intrinsicName]; + intrinsicName = '%' + alias[0] + '%'; + } + + if (src(INTRINSICS, intrinsicName)) { + var value = INTRINSICS[intrinsicName]; + if (value === needsEval) { + value = doEval(intrinsicName); + } + if (typeof value === 'undefined' && !allowMissing) { + throw new $TypeError$1('intrinsic ' + name + ' exists, but is not available. Please file an issue!'); + } + + return { + alias: alias, + name: intrinsicName, + value: value + }; + } + + throw new $SyntaxError('intrinsic ' + name + ' does not exist!'); +}; + +var getIntrinsic = function GetIntrinsic(name, allowMissing) { + if (typeof name !== 'string' || name.length === 0) { + throw new $TypeError$1('intrinsic name must be a non-empty string'); + } + if (arguments.length > 1 && typeof allowMissing !== 'boolean') { + throw new $TypeError$1('"allowMissing" argument must be a boolean'); + } + + var parts = stringToPath(name); + var intrinsicBaseName = parts.length > 0 ? parts[0] : ''; + + var intrinsic = getBaseIntrinsic('%' + intrinsicBaseName + '%', allowMissing); + var intrinsicRealName = intrinsic.name; + var value = intrinsic.value; + var skipFurtherCaching = false; + + var alias = intrinsic.alias; + if (alias) { + intrinsicBaseName = alias[0]; + $spliceApply(parts, $concat$1([0, 1], alias)); + } + + for (var i = 1, isOwn = true; i < parts.length; i += 1) { + var part = parts[i]; + var first = $strSlice(part, 0, 1); + var last = $strSlice(part, -1); + if ( + ( + (first === '"' || first === "'" || first === '`') + || (last === '"' || last === "'" || last === '`') + ) + && first !== last + ) { + throw new $SyntaxError('property names with quotes must have matching quotes'); + } + if (part === 'constructor' || !isOwn) { + skipFurtherCaching = true; + } + + intrinsicBaseName += '.' + part; + intrinsicRealName = '%' + intrinsicBaseName + '%'; + + if (src(INTRINSICS, intrinsicRealName)) { + value = INTRINSICS[intrinsicRealName]; + } else if (value != null) { + if (!(part in value)) { + if (!allowMissing) { + throw new $TypeError$1('base intrinsic for ' + name + ' exists, but the property is not available.'); + } + return void undefined$1; + } + if ($gOPD && (i + 1) >= parts.length) { + var desc = $gOPD(value, part); + isOwn = !!desc; + + // By convention, when a data property is converted to an accessor + // property to emulate a data property that does not suffer from + // the override mistake, that accessor's getter is marked with + // an `originalValue` property. Here, when we detect this, we + // uphold the illusion by pretending to see that original data + // property, i.e., returning the value rather than the getter + // itself. + if (isOwn && 'get' in desc && !('originalValue' in desc.get)) { + value = desc.get; + } else { + value = value[part]; + } + } else { + isOwn = src(value, part); + value = value[part]; + } + + if (isOwn && !skipFurtherCaching) { + INTRINSICS[intrinsicRealName] = value; + } + } + } + return value; +}; + +var callBind = createCommonjsModule(function (module) { + + + + +var $apply = getIntrinsic('%Function.prototype.apply%'); +var $call = getIntrinsic('%Function.prototype.call%'); +var $reflectApply = getIntrinsic('%Reflect.apply%', true) || functionBind.call($call, $apply); + +var $gOPD = getIntrinsic('%Object.getOwnPropertyDescriptor%', true); +var $defineProperty = getIntrinsic('%Object.defineProperty%', true); +var $max = getIntrinsic('%Math.max%'); + +if ($defineProperty) { + try { + $defineProperty({}, 'a', { value: 1 }); + } catch (e) { + // IE 8 has a broken defineProperty + $defineProperty = null; + } +} + +module.exports = function callBind(originalFunction) { + var func = $reflectApply(functionBind, $call, arguments); + if ($gOPD && $defineProperty) { + var desc = $gOPD(func, 'length'); + if (desc.configurable) { + // original length, plus the receiver, minus any additional arguments (after the receiver) + $defineProperty( + func, + 'length', + { value: 1 + $max(0, originalFunction.length - (arguments.length - 1)) } + ); + } + } + return func; +}; + +var applyBind = function applyBind() { + return $reflectApply(functionBind, $apply, arguments); +}; + +if ($defineProperty) { + $defineProperty(module.exports, 'apply', { value: applyBind }); +} else { + module.exports.apply = applyBind; +} +}); + +var $indexOf = callBind(getIntrinsic('String.prototype.indexOf')); + +var callBound = function callBoundIntrinsic(name, allowMissing) { + var intrinsic = getIntrinsic(name, !!allowMissing); + if (typeof intrinsic === 'function' && $indexOf(name, '.prototype.') > -1) { + return callBind(intrinsic); + } + return intrinsic; +}; + +var util_inspect = require$$0__default["default"].inspect; + +var hasMap = typeof Map === 'function' && Map.prototype; +var mapSizeDescriptor = Object.getOwnPropertyDescriptor && hasMap ? Object.getOwnPropertyDescriptor(Map.prototype, 'size') : null; +var mapSize = hasMap && mapSizeDescriptor && typeof mapSizeDescriptor.get === 'function' ? mapSizeDescriptor.get : null; +var mapForEach = hasMap && Map.prototype.forEach; +var hasSet = typeof Set === 'function' && Set.prototype; +var setSizeDescriptor = Object.getOwnPropertyDescriptor && hasSet ? Object.getOwnPropertyDescriptor(Set.prototype, 'size') : null; +var setSize = hasSet && setSizeDescriptor && typeof setSizeDescriptor.get === 'function' ? setSizeDescriptor.get : null; +var setForEach = hasSet && Set.prototype.forEach; +var hasWeakMap = typeof WeakMap === 'function' && WeakMap.prototype; +var weakMapHas = hasWeakMap ? WeakMap.prototype.has : null; +var hasWeakSet = typeof WeakSet === 'function' && WeakSet.prototype; +var weakSetHas = hasWeakSet ? WeakSet.prototype.has : null; +var hasWeakRef = typeof WeakRef === 'function' && WeakRef.prototype; +var weakRefDeref = hasWeakRef ? WeakRef.prototype.deref : null; +var booleanValueOf = Boolean.prototype.valueOf; +var objectToString = Object.prototype.toString; +var functionToString = Function.prototype.toString; +var $match = String.prototype.match; +var $slice = String.prototype.slice; +var $replace = String.prototype.replace; +var $toUpperCase = String.prototype.toUpperCase; +var $toLowerCase = String.prototype.toLowerCase; +var $test = RegExp.prototype.test; +var $concat = Array.prototype.concat; +var $join = Array.prototype.join; +var $arrSlice = Array.prototype.slice; +var $floor = Math.floor; +var bigIntValueOf = typeof BigInt === 'function' ? BigInt.prototype.valueOf : null; +var gOPS = Object.getOwnPropertySymbols; +var symToString = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol' ? Symbol.prototype.toString : null; +var hasShammedSymbols = typeof Symbol === 'function' && typeof Symbol.iterator === 'object'; +// ie, `has-tostringtag/shams +var toStringTag = typeof Symbol === 'function' && Symbol.toStringTag && (typeof Symbol.toStringTag === hasShammedSymbols ? 'object' : 'symbol') + ? Symbol.toStringTag + : null; +var isEnumerable = Object.prototype.propertyIsEnumerable; + +var gPO = (typeof Reflect === 'function' ? Reflect.getPrototypeOf : Object.getPrototypeOf) || ( + [].__proto__ === Array.prototype // eslint-disable-line no-proto + ? function (O) { + return O.__proto__; // eslint-disable-line no-proto + } + : null +); + +function addNumericSeparator(num, str) { + if ( + num === Infinity + || num === -Infinity + || num !== num + || (num && num > -1000 && num < 1000) + || $test.call(/e/, str) + ) { + return str; + } + var sepRegex = /[0-9](?=(?:[0-9]{3})+(?![0-9]))/g; + if (typeof num === 'number') { + var int = num < 0 ? -$floor(-num) : $floor(num); // trunc(num) + if (int !== num) { + var intStr = String(int); + var dec = $slice.call(str, intStr.length + 1); + return $replace.call(intStr, sepRegex, '$&_') + '.' + $replace.call($replace.call(dec, /([0-9]{3})/g, '$&_'), /_$/, ''); + } + } + return $replace.call(str, sepRegex, '$&_'); +} + +var inspectCustom = util_inspect.custom; +var inspectSymbol = inspectCustom && isSymbol(inspectCustom) ? inspectCustom : null; + +var objectInspect = function inspect_(obj, options, depth, seen) { + var opts = options || {}; + + if (has$3(opts, 'quoteStyle') && (opts.quoteStyle !== 'single' && opts.quoteStyle !== 'double')) { + throw new TypeError('option "quoteStyle" must be "single" or "double"'); + } + if ( + has$3(opts, 'maxStringLength') && (typeof opts.maxStringLength === 'number' + ? opts.maxStringLength < 0 && opts.maxStringLength !== Infinity + : opts.maxStringLength !== null + ) + ) { + throw new TypeError('option "maxStringLength", if provided, must be a positive integer, Infinity, or `null`'); + } + var customInspect = has$3(opts, 'customInspect') ? opts.customInspect : true; + if (typeof customInspect !== 'boolean' && customInspect !== 'symbol') { + throw new TypeError('option "customInspect", if provided, must be `true`, `false`, or `\'symbol\'`'); + } + + if ( + has$3(opts, 'indent') + && opts.indent !== null + && opts.indent !== '\t' + && !(parseInt(opts.indent, 10) === opts.indent && opts.indent > 0) + ) { + throw new TypeError('option "indent" must be "\\t", an integer > 0, or `null`'); + } + if (has$3(opts, 'numericSeparator') && typeof opts.numericSeparator !== 'boolean') { + throw new TypeError('option "numericSeparator", if provided, must be `true` or `false`'); + } + var numericSeparator = opts.numericSeparator; + + if (typeof obj === 'undefined') { + return 'undefined'; + } + if (obj === null) { + return 'null'; + } + if (typeof obj === 'boolean') { + return obj ? 'true' : 'false'; + } + + if (typeof obj === 'string') { + return inspectString(obj, opts); + } + if (typeof obj === 'number') { + if (obj === 0) { + return Infinity / obj > 0 ? '0' : '-0'; + } + var str = String(obj); + return numericSeparator ? addNumericSeparator(obj, str) : str; + } + if (typeof obj === 'bigint') { + var bigIntStr = String(obj) + 'n'; + return numericSeparator ? addNumericSeparator(obj, bigIntStr) : bigIntStr; + } + + var maxDepth = typeof opts.depth === 'undefined' ? 5 : opts.depth; + if (typeof depth === 'undefined') { depth = 0; } + if (depth >= maxDepth && maxDepth > 0 && typeof obj === 'object') { + return isArray$3(obj) ? '[Array]' : '[Object]'; + } + + var indent = getIndent(opts, depth); + + if (typeof seen === 'undefined') { + seen = []; + } else if (indexOf(seen, obj) >= 0) { + return '[Circular]'; + } + + function inspect(value, from, noIndent) { + if (from) { + seen = $arrSlice.call(seen); + seen.push(from); + } + if (noIndent) { + var newOpts = { + depth: opts.depth + }; + if (has$3(opts, 'quoteStyle')) { + newOpts.quoteStyle = opts.quoteStyle; + } + return inspect_(value, newOpts, depth + 1, seen); + } + return inspect_(value, opts, depth + 1, seen); + } + + if (typeof obj === 'function') { + var name = nameOf(obj); + var keys = arrObjKeys(obj, inspect); + return '[Function' + (name ? ': ' + name : ' (anonymous)') + ']' + (keys.length > 0 ? ' { ' + $join.call(keys, ', ') + ' }' : ''); + } + if (isSymbol(obj)) { + var symString = hasShammedSymbols ? $replace.call(String(obj), /^(Symbol\(.*\))_[^)]*$/, '$1') : symToString.call(obj); + return typeof obj === 'object' && !hasShammedSymbols ? markBoxed(symString) : symString; + } + if (isElement(obj)) { + var s = '<' + $toLowerCase.call(String(obj.nodeName)); + var attrs = obj.attributes || []; + for (var i = 0; i < attrs.length; i++) { + s += ' ' + attrs[i].name + '=' + wrapQuotes(quote(attrs[i].value), 'double', opts); + } + s += '>'; + if (obj.childNodes && obj.childNodes.length) { s += '...'; } + s += ''; + return s; + } + if (isArray$3(obj)) { + if (obj.length === 0) { return '[]'; } + var xs = arrObjKeys(obj, inspect); + if (indent && !singleLineValues(xs)) { + return '[' + indentedJoin(xs, indent) + ']'; + } + return '[ ' + $join.call(xs, ', ') + ' ]'; + } + if (isError(obj)) { + var parts = arrObjKeys(obj, inspect); + if ('cause' in obj && !isEnumerable.call(obj, 'cause')) { + return '{ [' + String(obj) + '] ' + $join.call($concat.call('[cause]: ' + inspect(obj.cause), parts), ', ') + ' }'; + } + if (parts.length === 0) { return '[' + String(obj) + ']'; } + return '{ [' + String(obj) + '] ' + $join.call(parts, ', ') + ' }'; + } + if (typeof obj === 'object' && customInspect) { + if (inspectSymbol && typeof obj[inspectSymbol] === 'function') { + return obj[inspectSymbol](); + } else if (customInspect !== 'symbol' && typeof obj.inspect === 'function') { + return obj.inspect(); + } + } + if (isMap(obj)) { + var mapParts = []; + mapForEach.call(obj, function (value, key) { + mapParts.push(inspect(key, obj, true) + ' => ' + inspect(value, obj)); + }); + return collectionOf('Map', mapSize.call(obj), mapParts, indent); + } + if (isSet(obj)) { + var setParts = []; + setForEach.call(obj, function (value) { + setParts.push(inspect(value, obj)); + }); + return collectionOf('Set', setSize.call(obj), setParts, indent); + } + if (isWeakMap(obj)) { + return weakCollectionOf('WeakMap'); + } + if (isWeakSet(obj)) { + return weakCollectionOf('WeakSet'); + } + if (isWeakRef(obj)) { + return weakCollectionOf('WeakRef'); + } + if (isNumber(obj)) { + return markBoxed(inspect(Number(obj))); + } + if (isBigInt(obj)) { + return markBoxed(inspect(bigIntValueOf.call(obj))); + } + if (isBoolean(obj)) { + return markBoxed(booleanValueOf.call(obj)); + } + if (isString(obj)) { + return markBoxed(inspect(String(obj))); + } + if (!isDate(obj) && !isRegExp$1(obj)) { + var ys = arrObjKeys(obj, inspect); + var isPlainObject = gPO ? gPO(obj) === Object.prototype : obj instanceof Object || obj.constructor === Object; + var protoTag = obj instanceof Object ? '' : 'null prototype'; + var stringTag = !isPlainObject && toStringTag && Object(obj) === obj && toStringTag in obj ? $slice.call(toStr(obj), 8, -1) : protoTag ? 'Object' : ''; + var constructorTag = isPlainObject || typeof obj.constructor !== 'function' ? '' : obj.constructor.name ? obj.constructor.name + ' ' : ''; + var tag = constructorTag + (stringTag || protoTag ? '[' + $join.call($concat.call([], stringTag || [], protoTag || []), ': ') + '] ' : ''); + if (ys.length === 0) { return tag + '{}'; } + if (indent) { + return tag + '{' + indentedJoin(ys, indent) + '}'; + } + return tag + '{ ' + $join.call(ys, ', ') + ' }'; + } + return String(obj); +}; + +function wrapQuotes(s, defaultStyle, opts) { + var quoteChar = (opts.quoteStyle || defaultStyle) === 'double' ? '"' : "'"; + return quoteChar + s + quoteChar; +} + +function quote(s) { + return $replace.call(String(s), /"/g, '"'); +} + +function isArray$3(obj) { return toStr(obj) === '[object Array]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); } +function isDate(obj) { return toStr(obj) === '[object Date]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); } +function isRegExp$1(obj) { return toStr(obj) === '[object RegExp]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); } +function isError(obj) { return toStr(obj) === '[object Error]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); } +function isString(obj) { return toStr(obj) === '[object String]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); } +function isNumber(obj) { return toStr(obj) === '[object Number]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); } +function isBoolean(obj) { return toStr(obj) === '[object Boolean]' && (!toStringTag || !(typeof obj === 'object' && toStringTag in obj)); } + +// Symbol and BigInt do have Symbol.toStringTag by spec, so that can't be used to eliminate false positives +function isSymbol(obj) { + if (hasShammedSymbols) { + return obj && typeof obj === 'object' && obj instanceof Symbol; + } + if (typeof obj === 'symbol') { + return true; + } + if (!obj || typeof obj !== 'object' || !symToString) { + return false; + } + try { + symToString.call(obj); + return true; + } catch (e) {} + return false; +} + +function isBigInt(obj) { + if (!obj || typeof obj !== 'object' || !bigIntValueOf) { + return false; + } + try { + bigIntValueOf.call(obj); + return true; + } catch (e) {} + return false; +} + +var hasOwn = Object.prototype.hasOwnProperty || function (key) { return key in this; }; +function has$3(obj, key) { + return hasOwn.call(obj, key); +} + +function toStr(obj) { + return objectToString.call(obj); +} + +function nameOf(f) { + if (f.name) { return f.name; } + var m = $match.call(functionToString.call(f), /^function\s*([\w$]+)/); + if (m) { return m[1]; } + return null; +} + +function indexOf(xs, x) { + if (xs.indexOf) { return xs.indexOf(x); } + for (var i = 0, l = xs.length; i < l; i++) { + if (xs[i] === x) { return i; } + } + return -1; +} + +function isMap(x) { + if (!mapSize || !x || typeof x !== 'object') { + return false; + } + try { + mapSize.call(x); + try { + setSize.call(x); + } catch (s) { + return true; + } + return x instanceof Map; // core-js workaround, pre-v2.5.0 + } catch (e) {} + return false; +} + +function isWeakMap(x) { + if (!weakMapHas || !x || typeof x !== 'object') { + return false; + } + try { + weakMapHas.call(x, weakMapHas); + try { + weakSetHas.call(x, weakSetHas); + } catch (s) { + return true; + } + return x instanceof WeakMap; // core-js workaround, pre-v2.5.0 + } catch (e) {} + return false; +} + +function isWeakRef(x) { + if (!weakRefDeref || !x || typeof x !== 'object') { + return false; + } + try { + weakRefDeref.call(x); + return true; + } catch (e) {} + return false; +} + +function isSet(x) { + if (!setSize || !x || typeof x !== 'object') { + return false; + } + try { + setSize.call(x); + try { + mapSize.call(x); + } catch (m) { + return true; + } + return x instanceof Set; // core-js workaround, pre-v2.5.0 + } catch (e) {} + return false; +} + +function isWeakSet(x) { + if (!weakSetHas || !x || typeof x !== 'object') { + return false; + } + try { + weakSetHas.call(x, weakSetHas); + try { + weakMapHas.call(x, weakMapHas); + } catch (s) { + return true; + } + return x instanceof WeakSet; // core-js workaround, pre-v2.5.0 + } catch (e) {} + return false; +} + +function isElement(x) { + if (!x || typeof x !== 'object') { return false; } + if (typeof HTMLElement !== 'undefined' && x instanceof HTMLElement) { + return true; + } + return typeof x.nodeName === 'string' && typeof x.getAttribute === 'function'; +} + +function inspectString(str, opts) { + if (str.length > opts.maxStringLength) { + var remaining = str.length - opts.maxStringLength; + var trailer = '... ' + remaining + ' more character' + (remaining > 1 ? 's' : ''); + return inspectString($slice.call(str, 0, opts.maxStringLength), opts) + trailer; + } + // eslint-disable-next-line no-control-regex + var s = $replace.call($replace.call(str, /(['\\])/g, '\\$1'), /[\x00-\x1f]/g, lowbyte); + return wrapQuotes(s, 'single', opts); +} + +function lowbyte(c) { + var n = c.charCodeAt(0); + var x = { + 8: 'b', + 9: 't', + 10: 'n', + 12: 'f', + 13: 'r' + }[n]; + if (x) { return '\\' + x; } + return '\\x' + (n < 0x10 ? '0' : '') + $toUpperCase.call(n.toString(16)); +} + +function markBoxed(str) { + return 'Object(' + str + ')'; +} + +function weakCollectionOf(type) { + return type + ' { ? }'; +} + +function collectionOf(type, size, entries, indent) { + var joinedEntries = indent ? indentedJoin(entries, indent) : $join.call(entries, ', '); + return type + ' (' + size + ') {' + joinedEntries + '}'; +} + +function singleLineValues(xs) { + for (var i = 0; i < xs.length; i++) { + if (indexOf(xs[i], '\n') >= 0) { + return false; + } + } + return true; +} + +function getIndent(opts, depth) { + var baseIndent; + if (opts.indent === '\t') { + baseIndent = '\t'; + } else if (typeof opts.indent === 'number' && opts.indent > 0) { + baseIndent = $join.call(Array(opts.indent + 1), ' '); + } else { + return null; + } + return { + base: baseIndent, + prev: $join.call(Array(depth + 1), baseIndent) + }; +} + +function indentedJoin(xs, indent) { + if (xs.length === 0) { return ''; } + var lineJoiner = '\n' + indent.prev + indent.base; + return lineJoiner + $join.call(xs, ',' + lineJoiner) + '\n' + indent.prev; +} + +function arrObjKeys(obj, inspect) { + var isArr = isArray$3(obj); + var xs = []; + if (isArr) { + xs.length = obj.length; + for (var i = 0; i < obj.length; i++) { + xs[i] = has$3(obj, i) ? inspect(obj[i], obj) : ''; + } + } + var syms = typeof gOPS === 'function' ? gOPS(obj) : []; + var symMap; + if (hasShammedSymbols) { + symMap = {}; + for (var k = 0; k < syms.length; k++) { + symMap['$' + syms[k]] = syms[k]; + } + } + + for (var key in obj) { // eslint-disable-line no-restricted-syntax + if (!has$3(obj, key)) { continue; } // eslint-disable-line no-restricted-syntax, no-continue + if (isArr && String(Number(key)) === key && key < obj.length) { continue; } // eslint-disable-line no-restricted-syntax, no-continue + if (hasShammedSymbols && symMap['$' + key] instanceof Symbol) { + // this is to prevent shammed Symbols, which are stored as strings, from being included in the string key section + continue; // eslint-disable-line no-restricted-syntax, no-continue + } else if ($test.call(/[^\w$]/, key)) { + xs.push(inspect(key, obj) + ': ' + inspect(obj[key], obj)); + } else { + xs.push(key + ': ' + inspect(obj[key], obj)); + } + } + if (typeof gOPS === 'function') { + for (var j = 0; j < syms.length; j++) { + if (isEnumerable.call(obj, syms[j])) { + xs.push('[' + inspect(syms[j]) + ']: ' + inspect(obj[syms[j]], obj)); + } + } + } + return xs; +} + +var $TypeError = getIntrinsic('%TypeError%'); +var $WeakMap = getIntrinsic('%WeakMap%', true); +var $Map = getIntrinsic('%Map%', true); + +var $weakMapGet = callBound('WeakMap.prototype.get', true); +var $weakMapSet = callBound('WeakMap.prototype.set', true); +var $weakMapHas = callBound('WeakMap.prototype.has', true); +var $mapGet = callBound('Map.prototype.get', true); +var $mapSet = callBound('Map.prototype.set', true); +var $mapHas = callBound('Map.prototype.has', true); + +/* + * This function traverses the list returning the node corresponding to the + * given key. + * + * That node is also moved to the head of the list, so that if it's accessed + * again we don't need to traverse the whole list. By doing so, all the recently + * used nodes can be accessed relatively quickly. + */ +var listGetNode = function (list, key) { // eslint-disable-line consistent-return + for (var prev = list, curr; (curr = prev.next) !== null; prev = curr) { + if (curr.key === key) { + prev.next = curr.next; + curr.next = list.next; + list.next = curr; // eslint-disable-line no-param-reassign + return curr; + } + } +}; + +var listGet = function (objects, key) { + var node = listGetNode(objects, key); + return node && node.value; +}; +var listSet = function (objects, key, value) { + var node = listGetNode(objects, key); + if (node) { + node.value = value; + } else { + // Prepend the new node to the beginning of the list + objects.next = { // eslint-disable-line no-param-reassign + key: key, + next: objects.next, + value: value + }; + } +}; +var listHas = function (objects, key) { + return !!listGetNode(objects, key); +}; + +var sideChannel = function getSideChannel() { + var $wm; + var $m; + var $o; + var channel = { + assert: function (key) { + if (!channel.has(key)) { + throw new $TypeError('Side channel does not contain ' + objectInspect(key)); + } + }, + get: function (key) { // eslint-disable-line consistent-return + if ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) { + if ($wm) { + return $weakMapGet($wm, key); + } + } else if ($Map) { + if ($m) { + return $mapGet($m, key); + } + } else { + if ($o) { // eslint-disable-line no-lonely-if + return listGet($o, key); + } + } + }, + has: function (key) { + if ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) { + if ($wm) { + return $weakMapHas($wm, key); + } + } else if ($Map) { + if ($m) { + return $mapHas($m, key); + } + } else { + if ($o) { // eslint-disable-line no-lonely-if + return listHas($o, key); + } + } + return false; + }, + set: function (key, value) { + if ($WeakMap && key && (typeof key === 'object' || typeof key === 'function')) { + if (!$wm) { + $wm = new $WeakMap(); + } + $weakMapSet($wm, key, value); + } else if ($Map) { + if (!$m) { + $m = new $Map(); + } + $mapSet($m, key, value); + } else { + if (!$o) { + /* + * Initialize the linked list as an empty node, so that we don't have + * to special-case handling of the first node: we can always refer to + * it as (previous node).next, instead of something like (list).head + */ + $o = { key: {}, next: null }; + } + listSet($o, key, value); + } + } + }; + return channel; +}; + +var replace = String.prototype.replace; +var percentTwenties = /%20/g; + +var Format = { + RFC1738: 'RFC1738', + RFC3986: 'RFC3986' +}; + +var formats = { + 'default': Format.RFC3986, + formatters: { + RFC1738: function (value) { + return replace.call(value, percentTwenties, '+'); + }, + RFC3986: function (value) { + return String(value); + } + }, + RFC1738: Format.RFC1738, + RFC3986: Format.RFC3986 +}; + +var has$2 = Object.prototype.hasOwnProperty; +var isArray$2 = Array.isArray; + +var hexTable = (function () { + var array = []; + for (var i = 0; i < 256; ++i) { + array.push('%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase()); + } + + return array; +}()); + +var compactQueue = function compactQueue(queue) { + while (queue.length > 1) { + var item = queue.pop(); + var obj = item.obj[item.prop]; + + if (isArray$2(obj)) { + var compacted = []; + + for (var j = 0; j < obj.length; ++j) { + if (typeof obj[j] !== 'undefined') { + compacted.push(obj[j]); + } + } + + item.obj[item.prop] = compacted; + } + } +}; + +var arrayToObject = function arrayToObject(source, options) { + var obj = options && options.plainObjects ? Object.create(null) : {}; + for (var i = 0; i < source.length; ++i) { + if (typeof source[i] !== 'undefined') { + obj[i] = source[i]; + } + } + + return obj; +}; + +var merge = function merge(target, source, options) { + /* eslint no-param-reassign: 0 */ + if (!source) { + return target; + } + + if (typeof source !== 'object') { + if (isArray$2(target)) { + target.push(source); + } else if (target && typeof target === 'object') { + if ((options && (options.plainObjects || options.allowPrototypes)) || !has$2.call(Object.prototype, source)) { + target[source] = true; + } + } else { + return [target, source]; + } + + return target; + } + + if (!target || typeof target !== 'object') { + return [target].concat(source); + } + + var mergeTarget = target; + if (isArray$2(target) && !isArray$2(source)) { + mergeTarget = arrayToObject(target, options); + } + + if (isArray$2(target) && isArray$2(source)) { + source.forEach(function (item, i) { + if (has$2.call(target, i)) { + var targetItem = target[i]; + if (targetItem && typeof targetItem === 'object' && item && typeof item === 'object') { + target[i] = merge(targetItem, item, options); + } else { + target.push(item); + } + } else { + target[i] = item; + } + }); + return target; + } + + return Object.keys(source).reduce(function (acc, key) { + var value = source[key]; + + if (has$2.call(acc, key)) { + acc[key] = merge(acc[key], value, options); + } else { + acc[key] = value; + } + return acc; + }, mergeTarget); +}; + +var assign = function assignSingleSource(target, source) { + return Object.keys(source).reduce(function (acc, key) { + acc[key] = source[key]; + return acc; + }, target); +}; + +var decode = function (str, decoder, charset) { + var strWithoutPlus = str.replace(/\+/g, ' '); + if (charset === 'iso-8859-1') { + // unescape never throws, no try...catch needed: + return strWithoutPlus.replace(/%[0-9a-f]{2}/gi, unescape); + } + // utf-8 + try { + return decodeURIComponent(strWithoutPlus); + } catch (e) { + return strWithoutPlus; + } +}; + +var encode = function encode(str, defaultEncoder, charset, kind, format) { + // This code was originally written by Brian White (mscdex) for the io.js core querystring library. + // It has been adapted here for stricter adherence to RFC 3986 + if (str.length === 0) { + return str; + } + + var string = str; + if (typeof str === 'symbol') { + string = Symbol.prototype.toString.call(str); + } else if (typeof str !== 'string') { + string = String(str); + } + + if (charset === 'iso-8859-1') { + return escape(string).replace(/%u[0-9a-f]{4}/gi, function ($0) { + return '%26%23' + parseInt($0.slice(2), 16) + '%3B'; + }); + } + + var out = ''; + for (var i = 0; i < string.length; ++i) { + var c = string.charCodeAt(i); + + if ( + c === 0x2D // - + || c === 0x2E // . + || c === 0x5F // _ + || c === 0x7E // ~ + || (c >= 0x30 && c <= 0x39) // 0-9 + || (c >= 0x41 && c <= 0x5A) // a-z + || (c >= 0x61 && c <= 0x7A) // A-Z + || (format === formats.RFC1738 && (c === 0x28 || c === 0x29)) // ( ) + ) { + out += string.charAt(i); + continue; + } + + if (c < 0x80) { + out = out + hexTable[c]; + continue; + } + + if (c < 0x800) { + out = out + (hexTable[0xC0 | (c >> 6)] + hexTable[0x80 | (c & 0x3F)]); + continue; + } + + if (c < 0xD800 || c >= 0xE000) { + out = out + (hexTable[0xE0 | (c >> 12)] + hexTable[0x80 | ((c >> 6) & 0x3F)] + hexTable[0x80 | (c & 0x3F)]); + continue; + } + + i += 1; + c = 0x10000 + (((c & 0x3FF) << 10) | (string.charCodeAt(i) & 0x3FF)); + /* eslint operator-linebreak: [2, "before"] */ + out += hexTable[0xF0 | (c >> 18)] + + hexTable[0x80 | ((c >> 12) & 0x3F)] + + hexTable[0x80 | ((c >> 6) & 0x3F)] + + hexTable[0x80 | (c & 0x3F)]; + } + + return out; +}; + +var compact = function compact(value) { + var queue = [{ obj: { o: value }, prop: 'o' }]; + var refs = []; + + for (var i = 0; i < queue.length; ++i) { + var item = queue[i]; + var obj = item.obj[item.prop]; + + var keys = Object.keys(obj); + for (var j = 0; j < keys.length; ++j) { + var key = keys[j]; + var val = obj[key]; + if (typeof val === 'object' && val !== null && refs.indexOf(val) === -1) { + queue.push({ obj: obj, prop: key }); + refs.push(val); + } + } + } + + compactQueue(queue); + + return value; +}; + +var isRegExp = function isRegExp(obj) { + return Object.prototype.toString.call(obj) === '[object RegExp]'; +}; + +var isBuffer = function isBuffer(obj) { + if (!obj || typeof obj !== 'object') { + return false; + } + + return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj)); +}; + +var combine = function combine(a, b) { + return [].concat(a, b); +}; + +var maybeMap = function maybeMap(val, fn) { + if (isArray$2(val)) { + var mapped = []; + for (var i = 0; i < val.length; i += 1) { + mapped.push(fn(val[i])); + } + return mapped; + } + return fn(val); +}; + +var utils = { + arrayToObject: arrayToObject, + assign: assign, + combine: combine, + compact: compact, + decode: decode, + encode: encode, + isBuffer: isBuffer, + isRegExp: isRegExp, + maybeMap: maybeMap, + merge: merge +}; + +var has$1 = Object.prototype.hasOwnProperty; + +var arrayPrefixGenerators = { + brackets: function brackets(prefix) { + return prefix + '[]'; + }, + comma: 'comma', + indices: function indices(prefix, key) { + return prefix + '[' + key + ']'; + }, + repeat: function repeat(prefix) { + return prefix; + } +}; + +var isArray$1 = Array.isArray; +var split = String.prototype.split; +var push = Array.prototype.push; +var pushToArray = function (arr, valueOrArray) { + push.apply(arr, isArray$1(valueOrArray) ? valueOrArray : [valueOrArray]); +}; + +var toISO = Date.prototype.toISOString; + +var defaultFormat = formats['default']; +var defaults$1 = { + addQueryPrefix: false, + allowDots: false, + charset: 'utf-8', + charsetSentinel: false, + delimiter: '&', + encode: true, + encoder: utils.encode, + encodeValuesOnly: false, + format: defaultFormat, + formatter: formats.formatters[defaultFormat], + // deprecated + indices: false, + serializeDate: function serializeDate(date) { + return toISO.call(date); + }, + skipNulls: false, + strictNullHandling: false +}; + +var isNonNullishPrimitive = function isNonNullishPrimitive(v) { + return typeof v === 'string' + || typeof v === 'number' + || typeof v === 'boolean' + || typeof v === 'symbol' + || typeof v === 'bigint'; +}; + +var sentinel = {}; + +var stringify = function stringify( + object, + prefix, + generateArrayPrefix, + strictNullHandling, + skipNulls, + encoder, + filter, + sort, + allowDots, + serializeDate, + format, + formatter, + encodeValuesOnly, + charset, + sideChannel$1 +) { + var obj = object; + + var tmpSc = sideChannel$1; + var step = 0; + var findFlag = false; + while ((tmpSc = tmpSc.get(sentinel)) !== undefined && !findFlag) { + // Where object last appeared in the ref tree + var pos = tmpSc.get(object); + step += 1; + if (typeof pos !== 'undefined') { + if (pos === step) { + throw new RangeError('Cyclic object value'); + } else { + findFlag = true; // Break while + } + } + if (typeof tmpSc.get(sentinel) === 'undefined') { + step = 0; + } + } + + if (typeof filter === 'function') { + obj = filter(prefix, obj); + } else if (obj instanceof Date) { + obj = serializeDate(obj); + } else if (generateArrayPrefix === 'comma' && isArray$1(obj)) { + obj = utils.maybeMap(obj, function (value) { + if (value instanceof Date) { + return serializeDate(value); + } + return value; + }); + } + + if (obj === null) { + if (strictNullHandling) { + return encoder && !encodeValuesOnly ? encoder(prefix, defaults$1.encoder, charset, 'key', format) : prefix; + } + + obj = ''; + } + + if (isNonNullishPrimitive(obj) || utils.isBuffer(obj)) { + if (encoder) { + var keyValue = encodeValuesOnly ? prefix : encoder(prefix, defaults$1.encoder, charset, 'key', format); + if (generateArrayPrefix === 'comma' && encodeValuesOnly) { + var valuesArray = split.call(String(obj), ','); + var valuesJoined = ''; + for (var i = 0; i < valuesArray.length; ++i) { + valuesJoined += (i === 0 ? '' : ',') + formatter(encoder(valuesArray[i], defaults$1.encoder, charset, 'value', format)); + } + return [formatter(keyValue) + '=' + valuesJoined]; + } + return [formatter(keyValue) + '=' + formatter(encoder(obj, defaults$1.encoder, charset, 'value', format))]; + } + return [formatter(prefix) + '=' + formatter(String(obj))]; + } + + var values = []; + + if (typeof obj === 'undefined') { + return values; + } + + var objKeys; + if (generateArrayPrefix === 'comma' && isArray$1(obj)) { + // we need to join elements in + objKeys = [{ value: obj.length > 0 ? obj.join(',') || null : undefined }]; + } else if (isArray$1(filter)) { + objKeys = filter; + } else { + var keys = Object.keys(obj); + objKeys = sort ? keys.sort(sort) : keys; + } + + for (var j = 0; j < objKeys.length; ++j) { + var key = objKeys[j]; + var value = typeof key === 'object' && key.value !== undefined ? key.value : obj[key]; + + if (skipNulls && value === null) { + continue; + } + + var keyPrefix = isArray$1(obj) + ? typeof generateArrayPrefix === 'function' ? generateArrayPrefix(prefix, key) : prefix + : prefix + (allowDots ? '.' + key : '[' + key + ']'); + + sideChannel$1.set(object, step); + var valueSideChannel = sideChannel(); + valueSideChannel.set(sentinel, sideChannel$1); + pushToArray(values, stringify( + value, + keyPrefix, + generateArrayPrefix, + strictNullHandling, + skipNulls, + encoder, + filter, + sort, + allowDots, + serializeDate, + format, + formatter, + encodeValuesOnly, + charset, + valueSideChannel + )); + } + + return values; +}; + +var normalizeStringifyOptions = function normalizeStringifyOptions(opts) { + if (!opts) { + return defaults$1; + } + + if (opts.encoder !== null && opts.encoder !== undefined && typeof opts.encoder !== 'function') { + throw new TypeError('Encoder has to be a function.'); + } + + var charset = opts.charset || defaults$1.charset; + if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') { + throw new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined'); + } + + var format = formats['default']; + if (typeof opts.format !== 'undefined') { + if (!has$1.call(formats.formatters, opts.format)) { + throw new TypeError('Unknown format option provided.'); + } + format = opts.format; + } + var formatter = formats.formatters[format]; + + var filter = defaults$1.filter; + if (typeof opts.filter === 'function' || isArray$1(opts.filter)) { + filter = opts.filter; + } + + return { + addQueryPrefix: typeof opts.addQueryPrefix === 'boolean' ? opts.addQueryPrefix : defaults$1.addQueryPrefix, + allowDots: typeof opts.allowDots === 'undefined' ? defaults$1.allowDots : !!opts.allowDots, + charset: charset, + charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults$1.charsetSentinel, + delimiter: typeof opts.delimiter === 'undefined' ? defaults$1.delimiter : opts.delimiter, + encode: typeof opts.encode === 'boolean' ? opts.encode : defaults$1.encode, + encoder: typeof opts.encoder === 'function' ? opts.encoder : defaults$1.encoder, + encodeValuesOnly: typeof opts.encodeValuesOnly === 'boolean' ? opts.encodeValuesOnly : defaults$1.encodeValuesOnly, + filter: filter, + format: format, + formatter: formatter, + serializeDate: typeof opts.serializeDate === 'function' ? opts.serializeDate : defaults$1.serializeDate, + skipNulls: typeof opts.skipNulls === 'boolean' ? opts.skipNulls : defaults$1.skipNulls, + sort: typeof opts.sort === 'function' ? opts.sort : null, + strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults$1.strictNullHandling + }; +}; + +var stringify_1 = function (object, opts) { + var obj = object; + var options = normalizeStringifyOptions(opts); + + var objKeys; + var filter; + + if (typeof options.filter === 'function') { + filter = options.filter; + obj = filter('', obj); + } else if (isArray$1(options.filter)) { + filter = options.filter; + objKeys = filter; + } + + var keys = []; + + if (typeof obj !== 'object' || obj === null) { + return ''; + } + + var arrayFormat; + if (opts && opts.arrayFormat in arrayPrefixGenerators) { + arrayFormat = opts.arrayFormat; + } else if (opts && 'indices' in opts) { + arrayFormat = opts.indices ? 'indices' : 'repeat'; + } else { + arrayFormat = 'indices'; + } + + var generateArrayPrefix = arrayPrefixGenerators[arrayFormat]; + + if (!objKeys) { + objKeys = Object.keys(obj); + } + + if (options.sort) { + objKeys.sort(options.sort); + } + + var sideChannel$1 = sideChannel(); + for (var i = 0; i < objKeys.length; ++i) { + var key = objKeys[i]; + + if (options.skipNulls && obj[key] === null) { + continue; + } + pushToArray(keys, stringify( + obj[key], + key, + generateArrayPrefix, + options.strictNullHandling, + options.skipNulls, + options.encode ? options.encoder : null, + options.filter, + options.sort, + options.allowDots, + options.serializeDate, + options.format, + options.formatter, + options.encodeValuesOnly, + options.charset, + sideChannel$1 + )); + } + + var joined = keys.join(options.delimiter); + var prefix = options.addQueryPrefix === true ? '?' : ''; + + if (options.charsetSentinel) { + if (options.charset === 'iso-8859-1') { + // encodeURIComponent('✓'), the "numeric entity" representation of a checkmark + prefix += 'utf8=%26%2310003%3B&'; + } else { + // encodeURIComponent('✓') + prefix += 'utf8=%E2%9C%93&'; + } + } + + return joined.length > 0 ? prefix + joined : ''; +}; + +var has = Object.prototype.hasOwnProperty; +var isArray = Array.isArray; + +var defaults = { + allowDots: false, + allowPrototypes: false, + allowSparse: false, + arrayLimit: 20, + charset: 'utf-8', + charsetSentinel: false, + comma: false, + decoder: utils.decode, + delimiter: '&', + depth: 5, + ignoreQueryPrefix: false, + interpretNumericEntities: false, + parameterLimit: 1000, + parseArrays: true, + plainObjects: false, + strictNullHandling: false +}; + +var interpretNumericEntities = function (str) { + return str.replace(/&#(\d+);/g, function ($0, numberStr) { + return String.fromCharCode(parseInt(numberStr, 10)); + }); +}; + +var parseArrayValue = function (val, options) { + if (val && typeof val === 'string' && options.comma && val.indexOf(',') > -1) { + return val.split(','); + } + + return val; +}; + +// This is what browsers will submit when the ✓ character occurs in an +// application/x-www-form-urlencoded body and the encoding of the page containing +// the form is iso-8859-1, or when the submitted form has an accept-charset +// attribute of iso-8859-1. Presumably also with other charsets that do not contain +// the ✓ character, such as us-ascii. +var isoSentinel = 'utf8=%26%2310003%3B'; // encodeURIComponent('✓') + +// These are the percent-encoded utf-8 octets representing a checkmark, indicating that the request actually is utf-8 encoded. +var charsetSentinel = 'utf8=%E2%9C%93'; // encodeURIComponent('✓') + +var parseValues = function parseQueryStringValues(str, options) { + var obj = {}; + var cleanStr = options.ignoreQueryPrefix ? str.replace(/^\?/, '') : str; + var limit = options.parameterLimit === Infinity ? undefined : options.parameterLimit; + var parts = cleanStr.split(options.delimiter, limit); + var skipIndex = -1; // Keep track of where the utf8 sentinel was found + var i; + + var charset = options.charset; + if (options.charsetSentinel) { + for (i = 0; i < parts.length; ++i) { + if (parts[i].indexOf('utf8=') === 0) { + if (parts[i] === charsetSentinel) { + charset = 'utf-8'; + } else if (parts[i] === isoSentinel) { + charset = 'iso-8859-1'; + } + skipIndex = i; + i = parts.length; // The eslint settings do not allow break; + } + } + } + + for (i = 0; i < parts.length; ++i) { + if (i === skipIndex) { + continue; + } + var part = parts[i]; + + var bracketEqualsPos = part.indexOf(']='); + var pos = bracketEqualsPos === -1 ? part.indexOf('=') : bracketEqualsPos + 1; + + var key, val; + if (pos === -1) { + key = options.decoder(part, defaults.decoder, charset, 'key'); + val = options.strictNullHandling ? null : ''; + } else { + key = options.decoder(part.slice(0, pos), defaults.decoder, charset, 'key'); + val = utils.maybeMap( + parseArrayValue(part.slice(pos + 1), options), + function (encodedVal) { + return options.decoder(encodedVal, defaults.decoder, charset, 'value'); + } + ); + } + + if (val && options.interpretNumericEntities && charset === 'iso-8859-1') { + val = interpretNumericEntities(val); + } + + if (part.indexOf('[]=') > -1) { + val = isArray(val) ? [val] : val; + } + + if (has.call(obj, key)) { + obj[key] = utils.combine(obj[key], val); + } else { + obj[key] = val; + } + } + + return obj; +}; + +var parseObject = function (chain, val, options, valuesParsed) { + var leaf = valuesParsed ? val : parseArrayValue(val, options); + + for (var i = chain.length - 1; i >= 0; --i) { + var obj; + var root = chain[i]; + + if (root === '[]' && options.parseArrays) { + obj = [].concat(leaf); + } else { + obj = options.plainObjects ? Object.create(null) : {}; + var cleanRoot = root.charAt(0) === '[' && root.charAt(root.length - 1) === ']' ? root.slice(1, -1) : root; + var index = parseInt(cleanRoot, 10); + if (!options.parseArrays && cleanRoot === '') { + obj = { 0: leaf }; + } else if ( + !isNaN(index) + && root !== cleanRoot + && String(index) === cleanRoot + && index >= 0 + && (options.parseArrays && index <= options.arrayLimit) + ) { + obj = []; + obj[index] = leaf; + } else { + obj[cleanRoot] = leaf; + } + } + + leaf = obj; + } + + return leaf; +}; + +var parseKeys = function parseQueryStringKeys(givenKey, val, options, valuesParsed) { + if (!givenKey) { + return; + } + + // Transform dot notation to bracket notation + var key = options.allowDots ? givenKey.replace(/\.([^.[]+)/g, '[$1]') : givenKey; + + // The regex chunks + + var brackets = /(\[[^[\]]*])/; + var child = /(\[[^[\]]*])/g; + + // Get the parent + + var segment = options.depth > 0 && brackets.exec(key); + var parent = segment ? key.slice(0, segment.index) : key; + + // Stash the parent if it exists + + var keys = []; + if (parent) { + // If we aren't using plain objects, optionally prefix keys that would overwrite object prototype properties + if (!options.plainObjects && has.call(Object.prototype, parent)) { + if (!options.allowPrototypes) { + return; + } + } + + keys.push(parent); + } + + // Loop through children appending to the array until we hit depth + + var i = 0; + while (options.depth > 0 && (segment = child.exec(key)) !== null && i < options.depth) { + i += 1; + if (!options.plainObjects && has.call(Object.prototype, segment[1].slice(1, -1))) { + if (!options.allowPrototypes) { + return; + } + } + keys.push(segment[1]); + } + + // If there's a remainder, just add whatever is left + + if (segment) { + keys.push('[' + key.slice(segment.index) + ']'); + } + + return parseObject(keys, val, options, valuesParsed); +}; + +var normalizeParseOptions = function normalizeParseOptions(opts) { + if (!opts) { + return defaults; + } + + if (opts.decoder !== null && opts.decoder !== undefined && typeof opts.decoder !== 'function') { + throw new TypeError('Decoder has to be a function.'); + } + + if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') { + throw new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined'); + } + var charset = typeof opts.charset === 'undefined' ? defaults.charset : opts.charset; + + return { + allowDots: typeof opts.allowDots === 'undefined' ? defaults.allowDots : !!opts.allowDots, + allowPrototypes: typeof opts.allowPrototypes === 'boolean' ? opts.allowPrototypes : defaults.allowPrototypes, + allowSparse: typeof opts.allowSparse === 'boolean' ? opts.allowSparse : defaults.allowSparse, + arrayLimit: typeof opts.arrayLimit === 'number' ? opts.arrayLimit : defaults.arrayLimit, + charset: charset, + charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults.charsetSentinel, + comma: typeof opts.comma === 'boolean' ? opts.comma : defaults.comma, + decoder: typeof opts.decoder === 'function' ? opts.decoder : defaults.decoder, + delimiter: typeof opts.delimiter === 'string' || utils.isRegExp(opts.delimiter) ? opts.delimiter : defaults.delimiter, + // eslint-disable-next-line no-implicit-coercion, no-extra-parens + depth: (typeof opts.depth === 'number' || opts.depth === false) ? +opts.depth : defaults.depth, + ignoreQueryPrefix: opts.ignoreQueryPrefix === true, + interpretNumericEntities: typeof opts.interpretNumericEntities === 'boolean' ? opts.interpretNumericEntities : defaults.interpretNumericEntities, + parameterLimit: typeof opts.parameterLimit === 'number' ? opts.parameterLimit : defaults.parameterLimit, + parseArrays: opts.parseArrays !== false, + plainObjects: typeof opts.plainObjects === 'boolean' ? opts.plainObjects : defaults.plainObjects, + strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults.strictNullHandling + }; +}; + +var parse = function (str, opts) { + var options = normalizeParseOptions(opts); + + if (str === '' || str === null || typeof str === 'undefined') { + return options.plainObjects ? Object.create(null) : {}; + } + + var tempObj = typeof str === 'string' ? parseValues(str, options) : str; + var obj = options.plainObjects ? Object.create(null) : {}; + + // Iterate over the keys and setup the new object + + var keys = Object.keys(tempObj); + for (var i = 0; i < keys.length; ++i) { + var key = keys[i]; + var newObj = parseKeys(key, tempObj[key], options, typeof str === 'string'); + obj = utils.merge(obj, newObj, options); + } + + if (options.allowSparse === true) { + return obj; + } + + return utils.compact(obj); +}; + +var lib = { + formats: formats, + parse: parse, + stringify: stringify_1 +}; + +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +var __awaiter = (commonjsGlobal && commonjsGlobal.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; + + + + + +/** + * creates an url from a request url and optional base url (http://server:8080) + * @param {string} resource - a fully qualified url or relative path + * @param {string} baseUrl - an optional baseUrl (http://server:8080) + * @param {IRequestOptions} options - an optional options object, could include QueryParameters e.g. + * @return {string} - resultant url + */ +function getUrl(resource, baseUrl, queryParams) { + const pathApi = path__default["default"].posix || path__default["default"]; + let requestUrl = ''; + if (!baseUrl) { + requestUrl = resource; + } + else if (!resource) { + requestUrl = baseUrl; + } + else { + const base = url__default["default"].parse(baseUrl); + const resultantUrl = url__default["default"].parse(resource); + // resource (specific per request) elements take priority + resultantUrl.protocol = resultantUrl.protocol || base.protocol; + resultantUrl.auth = resultantUrl.auth || base.auth; + resultantUrl.host = resultantUrl.host || base.host; + resultantUrl.pathname = pathApi.resolve(base.pathname, resultantUrl.pathname); + if (!resultantUrl.pathname.endsWith('/') && resource.endsWith('/')) { + resultantUrl.pathname += '/'; + } + requestUrl = url__default["default"].format(resultantUrl); + } + return queryParams ? + getUrlWithParsedQueryParams(requestUrl, queryParams) : + requestUrl; +} +var getUrl_1 = getUrl; +/** + * + * @param {string} requestUrl + * @param {IRequestQueryParams} queryParams + * @return {string} - Request's URL with Query Parameters appended/parsed. + */ +function getUrlWithParsedQueryParams(requestUrl, queryParams) { + const url = requestUrl.replace(/\?$/g, ''); // Clean any extra end-of-string "?" character + const parsedQueryParams = lib.stringify(queryParams.params, buildParamsStringifyOptions(queryParams)); + return `${url}${parsedQueryParams}`; +} +/** + * Build options for QueryParams Stringifying. + * + * @param {IRequestQueryParams} queryParams + * @return {object} + */ +function buildParamsStringifyOptions(queryParams) { + let options = { + addQueryPrefix: true, + delimiter: (queryParams.options || {}).separator || '&', + allowDots: (queryParams.options || {}).shouldAllowDots || false, + arrayFormat: (queryParams.options || {}).arrayFormat || 'repeat', + encodeValuesOnly: (queryParams.options || {}).shouldOnlyEncodeValues || true + }; + return options; +} +/** + * Decompress/Decode gzip encoded JSON + * Using Node.js built-in zlib module + * + * @param {Buffer} buffer + * @param {string} charset? - optional; defaults to 'utf-8' + * @return {Promise} + */ +function decompressGzippedContent(buffer, charset) { + return __awaiter(this, void 0, void 0, function* () { + return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () { + zlib__default["default"].gunzip(buffer, function (error, buffer) { + if (error) { + reject(error); + } + resolve(buffer.toString(charset || 'utf-8')); + }); + })); + }); +} +var decompressGzippedContent_1 = decompressGzippedContent; +/** + * Builds a RegExp to test urls against for deciding + * wether to bypass proxy from an entry of the + * environment variable setting NO_PROXY + * + * @param {string} bypass + * @return {RegExp} + */ +function buildProxyBypassRegexFromEnv(bypass) { + try { + // We need to keep this around for back-compat purposes + return new RegExp(bypass, 'i'); + } + catch (err) { + if (err instanceof SyntaxError && (bypass || "").startsWith("*")) { + let wildcardEscaped = bypass.replace('*', '(.*)'); + return new RegExp(wildcardEscaped, 'i'); + } + throw err; + } +} +var buildProxyBypassRegexFromEnv_1 = buildProxyBypassRegexFromEnv; +/** + * Obtain Response's Content Charset. + * Through inspecting `content-type` response header. + * It Returns 'utf-8' if NO charset specified/matched. + * + * @param {IHttpClientResponse} response + * @return {string} - Content Encoding Charset; Default=utf-8 + */ +function obtainContentCharset(response) { + // Find the charset, if specified. + // Search for the `charset=CHARSET` string, not including `;,\r\n` + // Example: content-type: 'application/json;charset=utf-8' + // |__ matches would be ['charset=utf-8', 'utf-8', index: 18, input: 'application/json; charset=utf-8'] + // |_____ matches[1] would have the charset :tada: , in our example it's utf-8 + // However, if the matches Array was empty or no charset found, 'utf-8' would be returned by default. + const nodeSupportedEncodings = ['ascii', 'utf8', 'utf16le', 'ucs2', 'base64', 'binary', 'hex']; + const contentType = response.message.headers['content-type'] || ''; + const matches = contentType.match(/charset=([^;,\r\n]+)/i); + return (matches && matches[1] && nodeSupportedEncodings.indexOf(matches[1]) != -1) ? matches[1] : 'utf-8'; +} +var obtainContentCharset_1 = obtainContentCharset; + +var Util = /*#__PURE__*/Object.defineProperty({ + getUrl: getUrl_1, + decompressGzippedContent: decompressGzippedContent_1, + buildProxyBypassRegexFromEnv: buildProxyBypassRegexFromEnv_1, + obtainContentCharset: obtainContentCharset_1 +}, '__esModule', {value: true}); + +var httpOverHttp_1 = httpOverHttp; +var httpsOverHttp_1 = httpsOverHttp; +var httpOverHttps_1 = httpOverHttps; +var httpsOverHttps_1 = httpsOverHttps; + + +function httpOverHttp(options) { + var agent = new TunnelingAgent(options); + agent.request = http__default["default"].request; + return agent; +} + +function httpsOverHttp(options) { + var agent = new TunnelingAgent(options); + agent.request = http__default["default"].request; + agent.createSocket = createSecureSocket; + agent.defaultPort = 443; + return agent; +} + +function httpOverHttps(options) { + var agent = new TunnelingAgent(options); + agent.request = https__default["default"].request; + return agent; +} + +function httpsOverHttps(options) { + var agent = new TunnelingAgent(options); + agent.request = https__default["default"].request; + agent.createSocket = createSecureSocket; + agent.defaultPort = 443; + return agent; +} + + +function TunnelingAgent(options) { + var self = this; + self.options = options || {}; + self.proxyOptions = self.options.proxy || {}; + self.maxSockets = self.options.maxSockets || http__default["default"].Agent.defaultMaxSockets; + self.requests = []; + self.sockets = []; + + self.on('free', function onFree(socket, host, port, localAddress) { + var options = toOptions(host, port, localAddress); + for (var i = 0, len = self.requests.length; i < len; ++i) { + var pending = self.requests[i]; + if (pending.host === options.host && pending.port === options.port) { + // Detect the request to connect same origin server, + // reuse the connection. + self.requests.splice(i, 1); + pending.request.onSocket(socket); + return; + } + } + socket.destroy(); + self.removeSocket(socket); + }); +} +require$$0__default["default"].inherits(TunnelingAgent, events__default["default"].EventEmitter); + +TunnelingAgent.prototype.addRequest = function addRequest(req, host, port, localAddress) { + var self = this; + var options = mergeOptions({request: req}, self.options, toOptions(host, port, localAddress)); + + if (self.sockets.length >= this.maxSockets) { + // We are over limit so we'll add it to the queue. + self.requests.push(options); + return; + } + + // If we are under maxSockets create a new one. + self.createSocket(options, function(socket) { + socket.on('free', onFree); + socket.on('close', onCloseOrRemove); + socket.on('agentRemove', onCloseOrRemove); + req.onSocket(socket); + + function onFree() { + self.emit('free', socket, options); + } + + function onCloseOrRemove(err) { + self.removeSocket(socket); + socket.removeListener('free', onFree); + socket.removeListener('close', onCloseOrRemove); + socket.removeListener('agentRemove', onCloseOrRemove); + } + }); +}; + +TunnelingAgent.prototype.createSocket = function createSocket(options, cb) { + var self = this; + var placeholder = {}; + self.sockets.push(placeholder); + + var connectOptions = mergeOptions({}, self.proxyOptions, { + method: 'CONNECT', + path: options.host + ':' + options.port, + agent: false, + headers: { + host: options.host + ':' + options.port + } + }); + if (options.localAddress) { + connectOptions.localAddress = options.localAddress; + } + if (connectOptions.proxyAuth) { + connectOptions.headers = connectOptions.headers || {}; + connectOptions.headers['Proxy-Authorization'] = 'Basic ' + + new Buffer(connectOptions.proxyAuth).toString('base64'); + } + + debug('making CONNECT request'); + var connectReq = self.request(connectOptions); + connectReq.useChunkedEncodingByDefault = false; // for v0.6 + connectReq.once('response', onResponse); // for v0.6 + connectReq.once('upgrade', onUpgrade); // for v0.6 + connectReq.once('connect', onConnect); // for v0.7 or later + connectReq.once('error', onError); + connectReq.end(); + + function onResponse(res) { + // Very hacky. This is necessary to avoid http-parser leaks. + res.upgrade = true; + } + + function onUpgrade(res, socket, head) { + // Hacky. + process.nextTick(function() { + onConnect(res, socket, head); + }); + } + + function onConnect(res, socket, head) { + connectReq.removeAllListeners(); + socket.removeAllListeners(); + + if (res.statusCode !== 200) { + debug('tunneling socket could not be established, statusCode=%d', + res.statusCode); + socket.destroy(); + var error = new Error('tunneling socket could not be established, ' + + 'statusCode=' + res.statusCode); + error.code = 'ECONNRESET'; + options.request.emit('error', error); + self.removeSocket(placeholder); + return; + } + if (head.length > 0) { + debug('got illegal response body from proxy'); + socket.destroy(); + var error = new Error('got illegal response body from proxy'); + error.code = 'ECONNRESET'; + options.request.emit('error', error); + self.removeSocket(placeholder); + return; + } + debug('tunneling connection has established'); + self.sockets[self.sockets.indexOf(placeholder)] = socket; + return cb(socket); + } + + function onError(cause) { + connectReq.removeAllListeners(); + + debug('tunneling socket could not be established, cause=%s\n', + cause.message, cause.stack); + var error = new Error('tunneling socket could not be established, ' + + 'cause=' + cause.message); + error.code = 'ECONNRESET'; + options.request.emit('error', error); + self.removeSocket(placeholder); + } +}; + +TunnelingAgent.prototype.removeSocket = function removeSocket(socket) { + var pos = this.sockets.indexOf(socket); + if (pos === -1) { + return; + } + this.sockets.splice(pos, 1); + + var pending = this.requests.shift(); + if (pending) { + // If we have pending requests and a socket gets closed a new one + // needs to be created to take over in the pool for the one that closed. + this.createSocket(pending, function(socket) { + pending.request.onSocket(socket); + }); + } +}; + +function createSecureSocket(options, cb) { + var self = this; + TunnelingAgent.prototype.createSocket.call(self, options, function(socket) { + var hostHeader = options.request.getHeader('host'); + var tlsOptions = mergeOptions({}, self.options, { + socket: socket, + servername: hostHeader ? hostHeader.replace(/:.*$/, '') : options.host + }); + + // 0 is dummy port for v0.6 + var secureSocket = tls__default["default"].connect(0, tlsOptions); + self.sockets[self.sockets.indexOf(socket)] = secureSocket; + cb(secureSocket); + }); +} + + +function toOptions(host, port, localAddress) { + if (typeof host === 'string') { // since v0.10 + return { + host: host, + port: port, + localAddress: localAddress + }; + } + return host; // for v0.11 or later +} + +function mergeOptions(target) { + for (var i = 1, len = arguments.length; i < len; ++i) { + var overrides = arguments[i]; + if (typeof overrides === 'object') { + var keys = Object.keys(overrides); + for (var j = 0, keyLen = keys.length; j < keyLen; ++j) { + var k = keys[j]; + if (overrides[k] !== undefined) { + target[k] = overrides[k]; + } + } + } + } + return target; +} + + +var debug; +if (process.env.NODE_DEBUG && /\btunnel\b/.test(process.env.NODE_DEBUG)) { + debug = function() { + var args = Array.prototype.slice.call(arguments); + if (typeof args[0] === 'string') { + args[0] = 'TUNNEL: ' + args[0]; + } else { + args.unshift('TUNNEL:'); + } + console.error.apply(console, args); + }; +} else { + debug = function() {}; +} +var debug_1 = debug; // for test + +var tunnel$1 = { + httpOverHttp: httpOverHttp_1, + httpsOverHttp: httpsOverHttp_1, + httpOverHttps: httpOverHttps_1, + httpsOverHttps: httpsOverHttps_1, + debug: debug_1 +}; + +var tunnel = tunnel$1; + +var HttpClient_1 = createCommonjsModule(function (module, exports) { +// Copyright (c) Microsoft. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. +var __awaiter = (commonjsGlobal && commonjsGlobal.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); + + + + +let fs; +let tunnel$1; +var HttpCodes; +(function (HttpCodes) { + HttpCodes[HttpCodes["OK"] = 200] = "OK"; + HttpCodes[HttpCodes["MultipleChoices"] = 300] = "MultipleChoices"; + HttpCodes[HttpCodes["MovedPermanently"] = 301] = "MovedPermanently"; + HttpCodes[HttpCodes["ResourceMoved"] = 302] = "ResourceMoved"; + HttpCodes[HttpCodes["SeeOther"] = 303] = "SeeOther"; + HttpCodes[HttpCodes["NotModified"] = 304] = "NotModified"; + HttpCodes[HttpCodes["UseProxy"] = 305] = "UseProxy"; + HttpCodes[HttpCodes["SwitchProxy"] = 306] = "SwitchProxy"; + HttpCodes[HttpCodes["TemporaryRedirect"] = 307] = "TemporaryRedirect"; + HttpCodes[HttpCodes["PermanentRedirect"] = 308] = "PermanentRedirect"; + HttpCodes[HttpCodes["BadRequest"] = 400] = "BadRequest"; + HttpCodes[HttpCodes["Unauthorized"] = 401] = "Unauthorized"; + HttpCodes[HttpCodes["PaymentRequired"] = 402] = "PaymentRequired"; + HttpCodes[HttpCodes["Forbidden"] = 403] = "Forbidden"; + HttpCodes[HttpCodes["NotFound"] = 404] = "NotFound"; + HttpCodes[HttpCodes["MethodNotAllowed"] = 405] = "MethodNotAllowed"; + HttpCodes[HttpCodes["NotAcceptable"] = 406] = "NotAcceptable"; + HttpCodes[HttpCodes["ProxyAuthenticationRequired"] = 407] = "ProxyAuthenticationRequired"; + HttpCodes[HttpCodes["RequestTimeout"] = 408] = "RequestTimeout"; + HttpCodes[HttpCodes["Conflict"] = 409] = "Conflict"; + HttpCodes[HttpCodes["Gone"] = 410] = "Gone"; + HttpCodes[HttpCodes["TooManyRequests"] = 429] = "TooManyRequests"; + HttpCodes[HttpCodes["InternalServerError"] = 500] = "InternalServerError"; + HttpCodes[HttpCodes["NotImplemented"] = 501] = "NotImplemented"; + HttpCodes[HttpCodes["BadGateway"] = 502] = "BadGateway"; + HttpCodes[HttpCodes["ServiceUnavailable"] = 503] = "ServiceUnavailable"; + HttpCodes[HttpCodes["GatewayTimeout"] = 504] = "GatewayTimeout"; +})(HttpCodes = exports.HttpCodes || (exports.HttpCodes = {})); +const HttpRedirectCodes = [HttpCodes.MovedPermanently, HttpCodes.ResourceMoved, HttpCodes.SeeOther, HttpCodes.TemporaryRedirect, HttpCodes.PermanentRedirect]; +const HttpResponseRetryCodes = [HttpCodes.BadGateway, HttpCodes.ServiceUnavailable, HttpCodes.GatewayTimeout]; +const NetworkRetryErrors = ['ECONNRESET', 'ENOTFOUND', 'ESOCKETTIMEDOUT', 'ETIMEDOUT', 'ECONNREFUSED']; +const RetryableHttpVerbs = ['OPTIONS', 'GET', 'DELETE', 'HEAD']; +const ExponentialBackoffCeiling = 10; +const ExponentialBackoffTimeSlice = 5; +class HttpClientResponse { + constructor(message) { + this.message = message; + } + readBody() { + return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () { + let buffer = Buffer.alloc(0); + const encodingCharset = Util.obtainContentCharset(this); + // Extract Encoding from header: 'content-encoding' + // Match `gzip`, `gzip, deflate` variations of GZIP encoding + const contentEncoding = this.message.headers['content-encoding'] || ''; + const isGzippedEncoded = new RegExp('(gzip$)|(gzip, *deflate)').test(contentEncoding); + this.message.on('data', function (data) { + const chunk = (typeof data === 'string') ? Buffer.from(data, encodingCharset) : data; + buffer = Buffer.concat([buffer, chunk]); + }).on('end', function () { + return __awaiter(this, void 0, void 0, function* () { + if (isGzippedEncoded) { // Process GZipped Response Body HERE + const gunzippedBody = yield Util.decompressGzippedContent(buffer, encodingCharset); + resolve(gunzippedBody); + } + else { + resolve(buffer.toString(encodingCharset)); + } + }); + }).on('error', function (err) { + reject(err); + }); + })); + } +} +exports.HttpClientResponse = HttpClientResponse; +function isHttps(requestUrl) { + let parsedUrl = url__default["default"].parse(requestUrl); + return parsedUrl.protocol === 'https:'; +} +exports.isHttps = isHttps; +var EnvironmentVariables; +(function (EnvironmentVariables) { + EnvironmentVariables["HTTP_PROXY"] = "HTTP_PROXY"; + EnvironmentVariables["HTTPS_PROXY"] = "HTTPS_PROXY"; + EnvironmentVariables["NO_PROXY"] = "NO_PROXY"; +})(EnvironmentVariables || (EnvironmentVariables = {})); +class HttpClient { + constructor(userAgent, handlers, requestOptions) { + this._ignoreSslError = false; + this._allowRedirects = true; + this._allowRedirectDowngrade = false; + this._maxRedirects = 50; + this._allowRetries = false; + this._maxRetries = 1; + this._keepAlive = false; + this._disposed = false; + this.userAgent = userAgent; + this.handlers = handlers || []; + let no_proxy = process.env[EnvironmentVariables.NO_PROXY]; + if (no_proxy) { + this._httpProxyBypassHosts = []; + no_proxy.split(',').forEach(bypass => { + this._httpProxyBypassHosts.push(Util.buildProxyBypassRegexFromEnv(bypass)); + }); + } + this.requestOptions = requestOptions; + if (requestOptions) { + if (requestOptions.ignoreSslError != null) { + this._ignoreSslError = requestOptions.ignoreSslError; + } + this._socketTimeout = requestOptions.socketTimeout; + this._httpProxy = requestOptions.proxy; + if (requestOptions.proxy && requestOptions.proxy.proxyBypassHosts) { + this._httpProxyBypassHosts = []; + requestOptions.proxy.proxyBypassHosts.forEach(bypass => { + this._httpProxyBypassHosts.push(new RegExp(bypass, 'i')); + }); + } + this._certConfig = requestOptions.cert; + if (this._certConfig) { + // If using cert, need fs + fs = require$$0__default$1["default"]; + // cache the cert content into memory, so we don't have to read it from disk every time + if (this._certConfig.caFile && fs.existsSync(this._certConfig.caFile)) { + this._ca = fs.readFileSync(this._certConfig.caFile, 'utf8'); + } + if (this._certConfig.certFile && fs.existsSync(this._certConfig.certFile)) { + this._cert = fs.readFileSync(this._certConfig.certFile, 'utf8'); + } + if (this._certConfig.keyFile && fs.existsSync(this._certConfig.keyFile)) { + this._key = fs.readFileSync(this._certConfig.keyFile, 'utf8'); + } + } + if (requestOptions.allowRedirects != null) { + this._allowRedirects = requestOptions.allowRedirects; + } + if (requestOptions.allowRedirectDowngrade != null) { + this._allowRedirectDowngrade = requestOptions.allowRedirectDowngrade; + } + if (requestOptions.maxRedirects != null) { + this._maxRedirects = Math.max(requestOptions.maxRedirects, 0); + } + if (requestOptions.keepAlive != null) { + this._keepAlive = requestOptions.keepAlive; + } + if (requestOptions.allowRetries != null) { + this._allowRetries = requestOptions.allowRetries; + } + if (requestOptions.maxRetries != null) { + this._maxRetries = requestOptions.maxRetries; + } + } + } + options(requestUrl, additionalHeaders) { + return this.request('OPTIONS', requestUrl, null, additionalHeaders || {}); + } + get(requestUrl, additionalHeaders) { + return this.request('GET', requestUrl, null, additionalHeaders || {}); + } + del(requestUrl, additionalHeaders) { + return this.request('DELETE', requestUrl, null, additionalHeaders || {}); + } + post(requestUrl, data, additionalHeaders) { + return this.request('POST', requestUrl, data, additionalHeaders || {}); + } + patch(requestUrl, data, additionalHeaders) { + return this.request('PATCH', requestUrl, data, additionalHeaders || {}); + } + put(requestUrl, data, additionalHeaders) { + return this.request('PUT', requestUrl, data, additionalHeaders || {}); + } + head(requestUrl, additionalHeaders) { + return this.request('HEAD', requestUrl, null, additionalHeaders || {}); + } + sendStream(verb, requestUrl, stream, additionalHeaders) { + return this.request(verb, requestUrl, stream, additionalHeaders); + } + /** + * Makes a raw http request. + * All other methods such as get, post, patch, and request ultimately call this. + * Prefer get, del, post and patch + */ + request(verb, requestUrl, data, headers) { + return __awaiter(this, void 0, void 0, function* () { + if (this._disposed) { + throw new Error("Client has already been disposed."); + } + let parsedUrl = url__default["default"].parse(requestUrl); + let info = this._prepareRequest(verb, parsedUrl, headers); + // Only perform retries on reads since writes may not be idempotent. + let maxTries = (this._allowRetries && RetryableHttpVerbs.indexOf(verb) != -1) ? this._maxRetries + 1 : 1; + let numTries = 0; + let response; + while (numTries < maxTries) { + try { + response = yield this.requestRaw(info, data); + } + catch (err) { + numTries++; + if (err && err.code && NetworkRetryErrors.indexOf(err.code) > -1 && numTries < maxTries) { + yield this._performExponentialBackoff(numTries); + continue; + } + throw err; + } + // Check if it's an authentication challenge + if (response && response.message && response.message.statusCode === HttpCodes.Unauthorized) { + let authenticationHandler; + for (let i = 0; i < this.handlers.length; i++) { + if (this.handlers[i].canHandleAuthentication(response)) { + authenticationHandler = this.handlers[i]; + break; + } + } + if (authenticationHandler) { + return authenticationHandler.handleAuthentication(this, info, data); + } + else { + // We have received an unauthorized response but have no handlers to handle it. + // Let the response return to the caller. + return response; + } + } + let redirectsRemaining = this._maxRedirects; + while (HttpRedirectCodes.indexOf(response.message.statusCode) != -1 + && this._allowRedirects + && redirectsRemaining > 0) { + const redirectUrl = response.message.headers["location"]; + if (!redirectUrl) { + // if there's no location to redirect to, we won't + break; + } + let parsedRedirectUrl = url__default["default"].parse(redirectUrl); + if (parsedUrl.protocol == 'https:' && parsedUrl.protocol != parsedRedirectUrl.protocol && !this._allowRedirectDowngrade) { + throw new Error("Redirect from HTTPS to HTTP protocol. This downgrade is not allowed for security reasons. If you want to allow this behavior, set the allowRedirectDowngrade option to true."); + } + // we need to finish reading the response before reassigning response + // which will leak the open socket. + yield response.readBody(); + // let's make the request with the new redirectUrl + info = this._prepareRequest(verb, parsedRedirectUrl, headers); + response = yield this.requestRaw(info, data); + redirectsRemaining--; + } + if (HttpResponseRetryCodes.indexOf(response.message.statusCode) == -1) { + // If not a retry code, return immediately instead of retrying + return response; + } + numTries += 1; + if (numTries < maxTries) { + yield response.readBody(); + yield this._performExponentialBackoff(numTries); + } + } + return response; + }); + } + /** + * Needs to be called if keepAlive is set to true in request options. + */ + dispose() { + if (this._agent) { + this._agent.destroy(); + } + this._disposed = true; + } + /** + * Raw request. + * @param info + * @param data + */ + requestRaw(info, data) { + return new Promise((resolve, reject) => { + let callbackForResult = function (err, res) { + if (err) { + reject(err); + } + resolve(res); + }; + this.requestRawWithCallback(info, data, callbackForResult); + }); + } + /** + * Raw request with callback. + * @param info + * @param data + * @param onResult + */ + requestRawWithCallback(info, data, onResult) { + let socket; + if (typeof (data) === 'string') { + info.options.headers["Content-Length"] = Buffer.byteLength(data, 'utf8'); + } + let callbackCalled = false; + let handleResult = (err, res) => { + if (!callbackCalled) { + callbackCalled = true; + onResult(err, res); + } + }; + let req = info.httpModule.request(info.options, (msg) => { + let res = new HttpClientResponse(msg); + handleResult(null, res); + }); + req.on('socket', (sock) => { + socket = sock; + }); + // If we ever get disconnected, we want the socket to timeout eventually + req.setTimeout(this._socketTimeout || 3 * 60000, () => { + if (socket) { + socket.destroy(); + } + handleResult(new Error('Request timeout: ' + info.options.path), null); + }); + req.on('error', function (err) { + // err has statusCode property + // res should have headers + handleResult(err, null); + }); + if (data && typeof (data) === 'string') { + req.write(data, 'utf8'); + } + if (data && typeof (data) !== 'string') { + data.on('close', function () { + req.end(); + }); + data.pipe(req); + } + else { + req.end(); + } + } + _prepareRequest(method, requestUrl, headers) { + const info = {}; + info.parsedUrl = requestUrl; + const usingSsl = info.parsedUrl.protocol === 'https:'; + info.httpModule = usingSsl ? https__default["default"] : http__default["default"]; + const defaultPort = usingSsl ? 443 : 80; + info.options = {}; + info.options.host = info.parsedUrl.hostname; + info.options.port = info.parsedUrl.port ? parseInt(info.parsedUrl.port) : defaultPort; + info.options.path = (info.parsedUrl.pathname || '') + (info.parsedUrl.search || ''); + info.options.method = method; + info.options.timeout = (this.requestOptions && this.requestOptions.socketTimeout) || this._socketTimeout; + this._socketTimeout = info.options.timeout; + info.options.headers = this._mergeHeaders(headers); + if (this.userAgent != null) { + info.options.headers["user-agent"] = this.userAgent; + } + info.options.agent = this._getAgent(info.parsedUrl); + // gives handlers an opportunity to participate + if (this.handlers && !this._isPresigned(url__default["default"].format(requestUrl))) { + this.handlers.forEach((handler) => { + handler.prepareRequest(info.options); + }); + } + return info; + } + _isPresigned(requestUrl) { + if (this.requestOptions && this.requestOptions.presignedUrlPatterns) { + const patterns = this.requestOptions.presignedUrlPatterns; + for (let i = 0; i < patterns.length; i++) { + if (requestUrl.match(patterns[i])) { + return true; + } + } + } + return false; + } + _mergeHeaders(headers) { + const lowercaseKeys = obj => Object.keys(obj).reduce((c, k) => (c[k.toLowerCase()] = obj[k], c), {}); + if (this.requestOptions && this.requestOptions.headers) { + return Object.assign({}, lowercaseKeys(this.requestOptions.headers), lowercaseKeys(headers)); + } + return lowercaseKeys(headers || {}); + } + _getAgent(parsedUrl) { + let agent; + let proxy = this._getProxy(parsedUrl); + let useProxy = proxy.proxyUrl && proxy.proxyUrl.hostname && !this._isMatchInBypassProxyList(parsedUrl); + if (this._keepAlive && useProxy) { + agent = this._proxyAgent; + } + if (this._keepAlive && !useProxy) { + agent = this._agent; + } + // if agent is already assigned use that agent. + if (!!agent) { + return agent; + } + const usingSsl = parsedUrl.protocol === 'https:'; + let maxSockets = 100; + if (!!this.requestOptions) { + maxSockets = this.requestOptions.maxSockets || http__default["default"].globalAgent.maxSockets; + } + if (useProxy) { + // If using proxy, need tunnel + if (!tunnel$1) { + tunnel$1 = tunnel; + } + const agentOptions = { + maxSockets: maxSockets, + keepAlive: this._keepAlive, + proxy: { + proxyAuth: proxy.proxyAuth, + host: proxy.proxyUrl.hostname, + port: proxy.proxyUrl.port + }, + }; + let tunnelAgent; + const overHttps = proxy.proxyUrl.protocol === 'https:'; + if (usingSsl) { + tunnelAgent = overHttps ? tunnel$1.httpsOverHttps : tunnel$1.httpsOverHttp; + } + else { + tunnelAgent = overHttps ? tunnel$1.httpOverHttps : tunnel$1.httpOverHttp; + } + agent = tunnelAgent(agentOptions); + this._proxyAgent = agent; + } + // if reusing agent across request and tunneling agent isn't assigned create a new agent + if (this._keepAlive && !agent) { + const options = { keepAlive: this._keepAlive, maxSockets: maxSockets }; + agent = usingSsl ? new https__default["default"].Agent(options) : new http__default["default"].Agent(options); + this._agent = agent; + } + // if not using private agent and tunnel agent isn't setup then use global agent + if (!agent) { + agent = usingSsl ? https__default["default"].globalAgent : http__default["default"].globalAgent; + } + if (usingSsl && this._ignoreSslError) { + // we don't want to set NODE_TLS_REJECT_UNAUTHORIZED=0 since that will affect request for entire process + // http.RequestOptions doesn't expose a way to modify RequestOptions.agent.options + // we have to cast it to any and change it directly + agent.options = Object.assign(agent.options || {}, { rejectUnauthorized: false }); + } + if (usingSsl && this._certConfig) { + agent.options = Object.assign(agent.options || {}, { ca: this._ca, cert: this._cert, key: this._key, passphrase: this._certConfig.passphrase }); + } + return agent; + } + _getProxy(parsedUrl) { + let usingSsl = parsedUrl.protocol === 'https:'; + let proxyConfig = this._httpProxy; + // fallback to http_proxy and https_proxy env + let https_proxy = process.env[EnvironmentVariables.HTTPS_PROXY]; + let http_proxy = process.env[EnvironmentVariables.HTTP_PROXY]; + if (!proxyConfig) { + if (https_proxy && usingSsl) { + proxyConfig = { + proxyUrl: https_proxy + }; + } + else if (http_proxy) { + proxyConfig = { + proxyUrl: http_proxy + }; + } + } + let proxyUrl; + let proxyAuth; + if (proxyConfig) { + if (proxyConfig.proxyUrl.length > 0) { + proxyUrl = url__default["default"].parse(proxyConfig.proxyUrl); + } + if (proxyConfig.proxyUsername || proxyConfig.proxyPassword) { + proxyAuth = proxyConfig.proxyUsername + ":" + proxyConfig.proxyPassword; + } + } + return { proxyUrl: proxyUrl, proxyAuth: proxyAuth }; + } + _isMatchInBypassProxyList(parsedUrl) { + if (!this._httpProxyBypassHosts) { + return false; + } + let bypass = false; + this._httpProxyBypassHosts.forEach(bypassHost => { + if (bypassHost.test(parsedUrl.href)) { + bypass = true; + } + }); + return bypass; + } + _performExponentialBackoff(retryNumber) { + retryNumber = Math.min(ExponentialBackoffCeiling, retryNumber); + const ms = ExponentialBackoffTimeSlice * Math.pow(2, retryNumber); + return new Promise(resolve => setTimeout(() => resolve(), ms)); + } +} +exports.HttpClient = HttpClient; +}); + +// https://stackoverflow.com/a/47614491/1150961. +function setInnerHTML(elm, html) { + elm.innerHTML = html; + Array.from(elm.querySelectorAll("script")).forEach(oldScript => { + const newScript = document.createElement("script"); + Array.from(oldScript.attributes) + .forEach(attr => newScript.setAttribute(attr.name, attr.value)); + newScript.appendChild(document.createTextNode(oldScript.innerHTML)); + oldScript.parentNode.replaceChild(newScript, oldScript); + }); +} +const DEFAULT_SETTINGS = { + pythonInterpreter: 'python', + setupScript: '', +}; +class JupterPreview extends obsidian.FileView { + constructor(leaf, interpreter) { + super(leaf); + // Show a placeholder before we've converted the notebook. + this.contentEl.innerHTML = 'Converting notebook...'; + this.interpreter = interpreter; + } + onLoadFile(file) { + // Get the base path of the vault. + let adapter = file.vault.adapter; + if (!(adapter instanceof obsidian.FileSystemAdapter)) { + this.contentEl.innerHTML = 'Could not determine notebook path.'; + return null; + } + // Convert the file by writing it to a temporary location. Piping unfortunately leads to + // problems for long lines due to buffer overflows. + let basePath = adapter.getBasePath(); + let filename = `${basePath}/${file.path}`; + let htmlPath = `${os.tmpdir()}/${v4()}.html`; + let args = ['-m', 'nbconvert', `--output=${htmlPath}`, '--to=html', filename]; + let child = child_process.spawn(this.interpreter, args); + // Process the output and delete the temporary file. + child.on('close', (code) => { + if (code) { + this.contentEl.innerHTML = 'Failed to convert notebook to HTML.'; + } + else { + setInnerHTML(this.contentEl, require$$0$1.readFileSync(htmlPath).toString()); + } + require$$0$1.rm(htmlPath, () => null); + }); + return null; + } + getViewType() { + return 'ipynb'; + } + canAcceptExtension(extension) { + return extension === 'ipynb'; + } +} +class JupyterClient { + constructor(interpreter, args, options) { + this.interpreter = interpreter; + this.process = child_process.spawn(interpreter, args, options); + this.process.stdout.on('data', this.processStdOut.bind(this)); + this.process.stderr.on('data', this.processStdErr.bind(this)); + this.process.on('error', console.log); + this.promises = new Map(); + this.stdoutParts = []; + } + processStdOut(data) { + this.stdoutParts.push(data.toString()); + if (this.stdoutParts.last().endsWith('\n')) { + let response = JSON.parse(this.stdoutParts.join('')); + console.log('received response', response); + this.stdoutParts = []; + let promise = this.promises.get(response.id); + if (promise === undefined) { + console.error(`received response for unrecognised promise: ${response.id}`); + return; + } + promise(response.body); + } + } + processStdErr(data) { + console.log(data.toString()); + } + request(body) { + return __awaiter$1(this, void 0, void 0, function* () { + // Generate a random identifier. + let id = v4(); + // Send the request (\n terminated to make sure it gets picked up by the python process). + let data = JSON.stringify({ id: id, body: body }); + this.process.stdin.write(data + '\n'); + // Create a resolvable promise and store it against the id. + let resolve; + let promise = new Promise((resolve_, reject_) => { + resolve = resolve_; + }); + this.promises.set(id, resolve); + return promise; + }); + } + stop() { + this.process.stdin.end(); + } +} +class JupyterPlugin extends obsidian.Plugin { + postprocessor(src, el, ctx) { + return __awaiter$1(this, void 0, void 0, function* () { + // Render the code using the default renderer for python. + yield obsidian.MarkdownRenderer.renderMarkdown('```python\n' + src + '```', el, '', this.app.workspace.activeLeaf.view); + // Needed for positioning of the button and hiding Jupyter prompts. + el.classList.add('obsidian-jupyter'); + // Add a button to run the code. + let button = el.querySelector('pre').createEl('button', { + type: 'button', + text: 'Run', + cls: 'copy-code-button', + }); + button.setAttribute('style', `right: 32pt`); + button.addEventListener('click', () => { + button.innerText = 'Running...'; + this.getJupyterClient(ctx).request({ + command: 'execute', + source: `${this.settings.setupScript}\n${src}`, + }).then(response => { + // Find the div to paste the output into or create it if necessary. + let output = el.querySelector('div.obsidian-jupyter-output'); + if (output == null) { + output = el.createEl('div'); + output.classList.add('obsidian-jupyter-output'); + } + // Paste the output and reset the button. + setInnerHTML(output, response); + button.innerText = 'Run'; + }); + }); + }); + } + getJupyterClient(ctx) { + let client = this.clients.get(ctx.docId); + // Construct the interpeter path. + let cache = this.app.metadataCache.getCache(ctx.sourcePath); + let frontmatter = (cache ? cache.frontmatter : {}) || {}; + let interpreter = (frontmatter['obsidian-jupyter'] || {})['interpreter'] || this.settings.pythonInterpreter; + // If we have a client, check that the interpreter path is right and stop it if not. + if (client && client.interpreter != interpreter) { + console.log(`interpreter path (${client.interpreter}) for the client for doc ` + + `${ctx.docId} does not match the desired path (${interpreter})`); + client.stop(); + client = undefined; + } + // Create a new interpreter if required. + if (client === undefined) { + let options = { cwd: this.getBasePath() }; + let path = this.getRelativeScriptPath(); + client = new JupyterClient(interpreter, [path, ctx.docId], options); + this.clients.set(ctx.docId, client); + console.log(`created new client for doc ${ctx.docId} using interpreter ${interpreter}`); + } + return client; + } + createJupyterPreview(leaf) { + return new JupterPreview(leaf, this.settings.pythonInterpreter); + } + onload() { + return __awaiter$1(this, void 0, void 0, function* () { + console.log('loading jupyter plugin'); + this.clients = new Map(); + yield this.loadSettings(); + yield this.downloadPythonScript(); + this.addSettingTab(new JupyterSettingTab(this.app, this)); + this.registerMarkdownCodeBlockProcessor('jupyter', this.postprocessor.bind(this)); + this.registerView("ipynb", this.createJupyterPreview.bind(this)); + this.registerExtensions(["ipynb"], "ipynb"); + }); + } + downloadPythonScript() { + return __awaiter$1(this, void 0, void 0, function* () { + let path = this.getAbsoluteScriptPath(); + try { + let stats = require$$0$1.statSync(path); + if (!stats.isFile()) { + throw new Error('python script is missing'); + } + console.log(`python script exists at ${path}`); + } + catch (_a) { + console.log('downloading missing python script...'); + let client = new HttpClient_1.HttpClient('obsidian-jupyter'); + let url = `https://github.com/tillahoffmann/obsidian-jupyter/releases/download/${this.manifest.version}/obsidian-jupyter.py`; + let response = yield client.get(url); + if (response.message.statusCode != 200) { + throw new Error(`could not download missing python script: ${response.message.statusMessage}`); + } + let content = yield response.readBody(); + require$$0$1.writeFileSync(path, content); + console.log('obtained missing python script'); + } + }); + } + getRelativeScriptPath() { + return `${this.app.vault.configDir}/plugins/obsidian-jupyter/obsidian-jupyter.py`; + } + getAbsoluteScriptPath() { + return `${this.getBasePath()}/${this.getRelativeScriptPath()}`; + } + getBasePath() { + if (this.app.vault.adapter instanceof obsidian.FileSystemAdapter) { + return this.app.vault.adapter.getBasePath(); + } + throw new Error('cannot determine base path'); + } + onunload() { + console.log('unloading jupyter plugin'); + this.clients.forEach((client, docId) => { + console.log(`stopping client for doc ${docId}...`); + client.stop(); + }); + } + loadSettings() { + return __awaiter$1(this, void 0, void 0, function* () { + this.settings = Object.assign({}, DEFAULT_SETTINGS, yield this.loadData()); + }); + } + saveSettings() { + return __awaiter$1(this, void 0, void 0, function* () { + yield this.saveData(this.settings); + }); + } +} +class JupyterSettingTab extends obsidian.PluginSettingTab { + constructor(app, plugin) { + super(app, plugin); + this.plugin = plugin; + } + display() { + let { containerEl } = this; + containerEl.empty(); + new obsidian.Setting(containerEl) + .setName('Python interpreter') + .setDesc('Path to your python interpreter, e.g. `/usr/bin/python`.') + .setClass('wideSettingsElement') + .addText(text => text + .setValue(this.plugin.settings.pythonInterpreter) + .onChange((value) => __awaiter$1(this, void 0, void 0, function* () { + this.plugin.settings.pythonInterpreter = value; + yield this.plugin.saveSettings(); + }))); + new obsidian.Setting(containerEl) + .setName('Python setup script') + .setDesc('Script that is run prior to every execution of a python code block.') + .setClass('setupScriptTextArea') + .setClass('wideSettingsElement') + .addTextArea(text => text + .setValue(this.plugin.settings.setupScript) + .onChange((value) => __awaiter$1(this, void 0, void 0, function* () { + this.plugin.settings.setupScript = value; + yield this.plugin.saveSettings(); + }))); + new obsidian.Setting(containerEl) + .setName('Test python environment') + .setDesc('Run a script to test the setup of your python environment (view developer console for details).') + .addButton(button => { + button.setButtonText('Run test'); + button.onClick(evt => { + let client = this.plugin.getJupyterClient({ + docId: 'test-document', + sourcePath: null, + frontmatter: null, + addChild: null, + getSectionInfo: null, + }); + client.request({ + command: 'execute', + source: '1 + 1', + }).then(response => { + console.log('Received response', response); + new obsidian.Notice('Test successful, view developer console for details.'); + }).catch(error => { + console.error(error); + new obsidian.Notice('Test failed, view developer console for details.'); + }).finally(() => { + client.stop(); + this.plugin.clients.delete('test-document'); + }); + }); + }); + new obsidian.Setting(containerEl) + .setName('Install python dependencies') + .setDesc('This will modify your environment-use at your own risk.') + .addButton(button => { + button.setButtonText('Install dependencies'); + button.onClick(evt => { + let interpreter = this.plugin.settings.pythonInterpreter; + let command = `${interpreter} -u -m pip install --upgrade --upgrade-strategy eager jupyter`; + new obsidian.Notice('Installing dependencies; this may take some time...'); + child_process.exec(command, (error, stdout, stderr) => { + if (error) { + console.error(`failed to install dependencies: {error}`); + new obsidian.Notice('Failed to install dependencies, view developer console for details.'); + } + console.log(`install stdout: ${stdout}`); + console.log(`install stderr: ${stdout}`); + new obsidian.Notice('Installed dependencies, view developer console for details.'); + }); + }); + }); + } +} + +module.exports = JupyterPlugin; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsIm5vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvcm5nLmpzIiwibm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9yZWdleC5qcyIsIm5vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdmFsaWRhdGUuanMiLCJub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3N0cmluZ2lmeS5qcyIsIm5vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdjQuanMiLCJub2RlX21vZHVsZXMvaGFzLXN5bWJvbHMvc2hhbXMuanMiLCJub2RlX21vZHVsZXMvaGFzLXN5bWJvbHMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvZnVuY3Rpb24tYmluZC9pbXBsZW1lbnRhdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9mdW5jdGlvbi1iaW5kL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2hhcy9zcmMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvZ2V0LWludHJpbnNpYy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jYWxsLWJpbmQvaW5kZXguanMiLCJub2RlX21vZHVsZXMvY2FsbC1iaW5kL2NhbGxCb3VuZC5qcyIsIm5vZGVfbW9kdWxlcy9vYmplY3QtaW5zcGVjdC91dGlsLmluc3BlY3QuanMiLCJub2RlX21vZHVsZXMvb2JqZWN0LWluc3BlY3QvaW5kZXguanMiLCJub2RlX21vZHVsZXMvc2lkZS1jaGFubmVsL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3FzL2xpYi9mb3JtYXRzLmpzIiwibm9kZV9tb2R1bGVzL3FzL2xpYi91dGlscy5qcyIsIm5vZGVfbW9kdWxlcy9xcy9saWIvc3RyaW5naWZ5LmpzIiwibm9kZV9tb2R1bGVzL3FzL2xpYi9wYXJzZS5qcyIsIm5vZGVfbW9kdWxlcy9xcy9saWIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvdHlwZWQtcmVzdC1jbGllbnQvVXRpbC5qcyIsIm5vZGVfbW9kdWxlcy90dW5uZWwvbGliL3R1bm5lbC5qcyIsIm5vZGVfbW9kdWxlcy90dW5uZWwvaW5kZXguanMiLCJub2RlX21vZHVsZXMvdHlwZWQtcmVzdC1jbGllbnQvSHR0cENsaWVudC5qcyIsIm1haW4udHMiXSwic291cmNlc0NvbnRlbnQiOm51bGwsIm5hbWVzIjpbIl9fYXdhaXRlciIsInN0cmluZ2lmeSIsImhhc1N5bWJvbFNoYW0iLCJ0b1N0ciIsImJpbmQiLCJ1bmRlZmluZWQiLCIkVHlwZUVycm9yIiwicmVxdWlyZSQkMCIsIiRjb25jYXQiLCIkcmVwbGFjZSIsImhhc093biIsIkdldEludHJpbnNpYyIsImhhcyIsImlzQXJyYXkiLCJpc1JlZ0V4cCIsImluc3BlY3QiLCJkZWZhdWx0cyIsInNpZGVDaGFubmVsIiwiZ2V0U2lkZUNoYW5uZWwiLCJ0aGlzIiwicGF0aCIsInVybCIsInFzIiwiemxpYiIsImh0dHAiLCJodHRwcyIsInV0aWwiLCJldmVudHMiLCJ0bHMiLCJ0dW5uZWwiLCJyZXF1aXJlJCQxIiwiRmlsZVZpZXciLCJGaWxlU3lzdGVtQWRhcHRlciIsInRtcGRpciIsInV1aWQiLCJzcGF3biIsInJlYWRGaWxlU3luYyIsInJtIiwiUGx1Z2luIiwiTWFya2Rvd25SZW5kZXJlciIsInN0YXRTeW5jIiwiSHR0cENsaWVudCIsIndyaXRlRmlsZVN5bmMiLCJQbHVnaW5TZXR0aW5nVGFiIiwiU2V0dGluZyIsIk5vdGljZSIsImV4ZWMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBdURBO0FBQ08sU0FBU0EsV0FBUyxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRTtBQUM3RCxJQUFJLFNBQVMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLE9BQU8sS0FBSyxZQUFZLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsVUFBVSxPQUFPLEVBQUUsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRTtBQUNoSCxJQUFJLE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLE9BQU8sQ0FBQyxFQUFFLFVBQVUsT0FBTyxFQUFFLE1BQU0sRUFBRTtBQUMvRCxRQUFRLFNBQVMsU0FBUyxDQUFDLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7QUFDbkcsUUFBUSxTQUFTLFFBQVEsQ0FBQyxLQUFLLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7QUFDdEcsUUFBUSxTQUFTLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxNQUFNLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDLEVBQUU7QUFDdEgsUUFBUSxJQUFJLENBQUMsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsVUFBVSxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7QUFDOUUsS0FBSyxDQUFDLENBQUM7QUFDUDs7QUM3RUE7QUFDQTtBQUNBO0FBQ0EsSUFBSSxlQUFlLENBQUM7QUFDcEIsSUFBSSxLQUFLLEdBQUcsSUFBSSxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDaEIsU0FBUyxHQUFHLEdBQUc7QUFDOUI7QUFDQSxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUU7QUFDeEI7QUFDQTtBQUNBLElBQUksZUFBZSxHQUFHLE9BQU8sTUFBTSxLQUFLLFdBQVcsSUFBSSxNQUFNLENBQUMsZUFBZSxJQUFJLE1BQU0sQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLE9BQU8sUUFBUSxLQUFLLFdBQVcsSUFBSSxPQUFPLFFBQVEsQ0FBQyxlQUFlLEtBQUssVUFBVSxJQUFJLFFBQVEsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3JQO0FBQ0EsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO0FBQzFCLE1BQU0sTUFBTSxJQUFJLEtBQUssQ0FBQywwR0FBMEcsQ0FBQyxDQUFDO0FBQ2xJLEtBQUs7QUFDTCxHQUFHO0FBQ0g7QUFDQSxFQUFFLE9BQU8sZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2hDOztBQ2xCQSxZQUFlLHFIQUFxSDs7QUNFcEksU0FBUyxRQUFRLENBQUMsSUFBSSxFQUFFO0FBQ3hCLEVBQUUsT0FBTyxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN0RDs7QUNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSSxTQUFTLEdBQUcsRUFBRSxDQUFDO0FBQ25CO0FBQ0EsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRTtBQUM5QixFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNyRCxDQUFDO0FBQ0Q7QUFDQSxTQUFTQyxXQUFTLENBQUMsR0FBRyxFQUFFO0FBQ3hCLEVBQUUsSUFBSSxNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3JGO0FBQ0E7QUFDQSxFQUFFLElBQUksSUFBSSxHQUFHLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDLENBQUMs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 diff --git a/.obsidian/plugins/obsidian-jupyter/manifest.json b/.obsidian/plugins/obsidian-jupyter/manifest.json new file mode 100644 index 0000000..3ba31bc --- /dev/null +++ b/.obsidian/plugins/obsidian-jupyter/manifest.json @@ -0,0 +1,10 @@ +{ + "author": "Till Hoffmann", + "authorUrl": "https://github.com/tillahoffmann/obsidian-jupyter", + "description": "This plugin allows code blocks to be executed as Jupyter notebooks.", + "id": "obsidian-jupyter", + "isDesktopOnly": true, + "minAppVersion": "0.9.12", + "name": "Jupyter plugin", + "version": "0.8.1" +} diff --git a/.obsidian/plugins/obsidian-jupyter/obsidian-jupyter.py b/.obsidian/plugins/obsidian-jupyter/obsidian-jupyter.py new file mode 100644 index 0000000..84bc008 --- /dev/null +++ b/.obsidian/plugins/obsidian-jupyter/obsidian-jupyter.py @@ -0,0 +1,67 @@ +import argparse +import sys +from jupyter_client import KernelManager +import nbformat +from nbconvert import HTMLExporter +from nbclient import NotebookClient +from nbclient.exceptions import CellExecutionError +import json +import logging + + +# Parse input arguments. +parser = argparse.ArgumentParser() +parser.add_argument('document_id') +args = parser.parse_args() + +# Set up a logger that writes to stderr. +logging.basicConfig(level='INFO') +logger = logging.getLogger('obsidian-jupyter') +logger.info('started server for document %s', args.document_id) + +# Create a notebook and kernel. +cell = nbformat.v4.new_code_cell() +nb = nbformat.v4.new_notebook(cells=[cell]) +km = KernelManager() +client = NotebookClient(nb, km) + +try: + # Respond to each request. + for request in sys.stdin: + # Load the request and generate a response with matching id. + logger.info('received request: %s', request) + request = json.loads(request) + request_body = request['body'] + response = { + 'id': request['id'], + } + # Execute a cell. + if request_body['command'] == 'execute': + cell['source'] = request_body['source'] + try: + nb = client.execute(nb) + except CellExecutionError as ex: + logger.info('cell failed to execute: %s', ex) + html_exporter = HTMLExporter(template_name='basic') + (response_body, resources) = html_exporter.from_notebook_node(nb) + elif request_body['command'] == 'restart_kernel': + km.restart_kernel() + response_body = '' + else: + logger.error('unrecognised command: %s', request_body['command']) + response_body = '' + + # Pass the response back. + response['body'] = response_body + response = json.dumps(response) + sys.stdout.write(response + '\n') + logger.info('sent response: %s', response) + sys.stdout.flush() + sys.stderr.flush() +finally: + # Clean up the kernel. + if km.is_alive: + logger.info('shutting down kernel...') + km.shutdown_kernel() + +logger.info('exiting...') diff --git a/.obsidian/plugins/obsidian-jupyter/styles.css b/.obsidian/plugins/obsidian-jupyter/styles.css new file mode 100644 index 0000000..db4eacd --- /dev/null +++ b/.obsidian/plugins/obsidian-jupyter/styles.css @@ -0,0 +1,12 @@ +/* hide the output prompts of jupyter cells*/ +.obsidian-jupyter .prompt, .obsidian-jupyter .input { + display: none; +} + +.wideSettingsElement textarea, .wideSettingsElement input { + min-width: 300px; +} + +.setupScriptTextArea textarea { + font-family: monospace; +} diff --git a/.obsidian/workspace b/.obsidian/workspace new file mode 100644 index 0000000..5c992b9 --- /dev/null +++ b/.obsidian/workspace @@ -0,0 +1,103 @@ +{ + "main": { + "id": "275e54d6a308c5c2", + "type": "split", + "children": [ + { + "id": "5cdbcbcb75d4bb36", + "type": "leaf", + "state": { + "type": "markdown", + "state": { + "file": "Computers/Mac OS X/BBEdit/BBEdit.md", + "mode": "source", + "source": false + } + } + } + ], + "direction": "vertical" + }, + "left": { + "id": "1c0293fe9409c18e", + "type": "split", + "children": [ + { + "id": "daa89a86d8216c5f", + "type": "tabs", + "children": [ + { + "id": "fad8001c0a9fdae3", + "type": "leaf", + "state": { + "type": "file-explorer", + "state": {} + } + }, + { + "id": "5110ddb142633b7e", + "type": "leaf", + "state": { + "type": "search", + "state": { + "query": "", + "matchingCase": false, + "explainSearch": false, + "collapseAll": true, + "extraContext": false, + "sortOrder": "alphabetical" + } + } + } + ] + } + ], + "direction": "horizontal", + "width": 136.5 + }, + "right": { + "id": "9ad61fddd9987fc8", + "type": "split", + "children": [ + { + "id": "38f407691664dcad", + "type": "tabs", + "children": [ + { + "id": "719f427ad52bb2e6", + "type": "leaf", + "state": { + "type": "backlink", + "state": { + "file": "Computers/Mac OS X/BBEdit/BBEdit.md", + "collapseAll": false, + "extraContext": false, + "sortOrder": "alphabetical", + "showSearch": false, + "searchQuery": "", + "backlinkCollapsed": true, + "unlinkedCollapsed": true + } + } + } + ] + } + ], + "direction": "horizontal", + "width": 300, + "collapsed": true + }, + "active": "fad8001c0a9fdae3", + "lastOpenFiles": [ + "Computers/Mac OS X/BBEdit/List of language modules.md", + "Computers/Mac OS X/BBEdit/plist.md", + "Computers/Mac OS X/BBEdit/CLM.md", + "Computers/Mac OS X/BBEdit/XML.md", + "Computers/Mac OS X/BBEdit/Example CLM.md", + "Computers/Quantum Realm/Technologies/Intro to Quantum Technologies.md", + "Computers/Quantum Realm/Welcome to Quantum 101.md", + "Computers/Quantum Realm/Mechanics & Math/Intro to Mechanics & Math.md", + "Computers/Quantum Realm/Mechanics & Math/Quantum Formalism.md", + "Computers/Quantum Realm/Algorithms/VOQC.md" + ] +} \ No newline at end of file diff --git a/Careers/Current Occupations/Currently.md b/Careers/Current Occupations/Currently.md new file mode 100644 index 0000000..45e812d --- /dev/null +++ b/Careers/Current Occupations/Currently.md @@ -0,0 +1,10 @@ +# Current Occupations +Occupation is a good alternate word for jobs because these are certainly occupying my time at the moment rather heavily. Full-time at being a struggling human being though. + +--- + +Obviously this gets edited with time & as life goes, but right now I am: + +- President of Quantum Computing Club, Quantum Research Group at NYIT +- Apparently I am [NYC NASA ](https://2022.spaceappschallenge.org/locations/new-york/)local lead for the global Space Apps hackathon +- Director-at-Large of [Hack Manhattan ](https://hackmanhattan.com/) \ No newline at end of file diff --git a/Careers/Current Occupations/QRG/About QRG.md b/Careers/Current Occupations/QRG/About QRG.md new file mode 100644 index 0000000..a9c8a9f --- /dev/null +++ b/Careers/Current Occupations/QRG/About QRG.md @@ -0,0 +1,23 @@ +# Quantum Research Group + +Set up back in 2019-2020, I have to go back to making sure everything is all well with the club before school starts up again. You started it and you are President. Be responsible so that this stays a thriving organization for others at the very least. + +--- + +## Information: +- https://www.theqrg.org : currently inactive. And why? This is something that Justin already sent you the front end code for so it should be just a matter of paying for the dreamhost website and having it running. Get this up in the next week or so. + +For now though, there is the public [Notion](https://www.notion.so/shwethajayaraj/The-Quantum-Research-Group-7150bc7f5d7e4ba384212a9816ce928b) page. + +## Social Media +Though we are a bit weak on our activity, at the very least we have a presence or rather an existence at best on several of the major social media platforms. Perhaps these deserve obsidian pages of their own at some point to better expand upon the details and distribution of information upon. + +- [Instagram](https://www.instagram.com/theqrg/) +- NYIT [instagram](https://www.instagram.com/nyitquantum/) +- [Facebook](https://www.facebook.com/theqrg) +- [Twitter](https://twitter.com/theqrg) +- Youtube +- NYIT hub +- Discord +- Eventually I think it will be important to be on LinkedIn similar to [BSU](https://www.linkedin.com/groups/14111563/) +- Mailchimp \ No newline at end of file diff --git a/Careers/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b.md b/Careers/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b.md new file mode 100755 index 0000000..779561d --- /dev/null +++ b/Careers/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b.md @@ -0,0 +1,27 @@ +# The Quantum Research Group + +Originating from the Innovation Labs at New York Institute of Technology, a group of 4 qc-interested engineering & comp sci students sit down to found NYIT's very first quantum computing club in 2019. + +Desiring to expand their knowledge beyond the institution, The Quantum Research Group is a collective of students, professors, researchers, & industry experts across all disciplines in NYIT & New York City using an interdisciplinary lens to tackle the future's biggest & most exciting problems. This isn't just a computer science/engineering group, this is a group that needs everyone. + +And, indeed, everyone will need quantum computers. :) + +Come check us out! + +[NYC'S Research Collective for Quantum Computing](https://theqrg.org) + +Read more here at [Quantum Papers](The%20Quantum%20Research%20Group%207150bc7f5d7e4ba384212a9816ce928b/Quantum%20Papers%20dd45743c44324ec08c4becbe0f0611f1.md) : + +Want to learn more > get to googling! Or read through our attempt to collect nearly every possible QC related resource searched by our very own corgie Queen. + +Who's our mascot? : A corgi named Queen - a gender non-binary pup. + + + +![The%20Quantum%20Research%20Group%207150bc7f5d7e4ba384212a9816ce928b/Untitled.png](Untitled.png) + +### Check out what’s coming up for NYIT Quantum Computing Club ~ + +[Quantum Calendar (general) ](The%20Quantum%20Research%20Group%207150bc7f5d7e4ba384212a9816ce928b/Quantum%20Calendar%20(general)%209bcc9aec5f54408fa840a090fb6a1bf6.csv) + +[Quantum Papers](The%20Quantum%20Research%20Group%207150bc7f5d7e4ba384212a9816ce928b/Quantum%20Papers%20dd45743c44324ec08c4becbe0f0611f1.md) \ No newline at end of file diff --git a/Careers/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Quantum Calendar (general) 9bcc9aec5f54408fa840a090fb6a1bf6.csv b/Careers/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Quantum Calendar (general) 9bcc9aec5f54408fa840a090fb6a1bf6.csv new file mode 100755 index 0000000..6695115 --- /dev/null +++ b/Careers/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Quantum Calendar (general) 9bcc9aec5f54408fa840a090fb6a1bf6.csv @@ -0,0 +1,2 @@ +Name,Date,Property,Property 1,Property 2,Tags +SGA Senate Meetings,"February 11, 2022",,,, \ No newline at end of file diff --git a/Careers/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Quantum Calendar (general) 9bcc9aec5f54408fa840a090fb6a1bf6/SGA Senate Meetings 0aa84609f480490ab01e23a87d1df4bf.md b/Careers/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Quantum Calendar (general) 9bcc9aec5f54408fa840a090fb6a1bf6/SGA Senate Meetings 0aa84609f480490ab01e23a87d1df4bf.md new file mode 100755 index 0000000..62cf750 --- /dev/null +++ b/Careers/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Quantum Calendar (general) 9bcc9aec5f54408fa840a090fb6a1bf6/SGA Senate Meetings 0aa84609f480490ab01e23a87d1df4bf.md @@ -0,0 +1,3 @@ +# SGA Senate Meetings + +Date: February 11, 2022 \ No newline at end of file diff --git a/Careers/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Quantum Papers dd45743c44324ec08c4becbe0f0611f1.md b/Careers/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Quantum Papers dd45743c44324ec08c4becbe0f0611f1.md new file mode 100755 index 0000000..142265e --- /dev/null +++ b/Careers/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Quantum Papers dd45743c44324ec08c4becbe0f0611f1.md @@ -0,0 +1,30 @@ +# Quantum Papers + +By Shwetha Jayaraj + +![Quantum%20Papers%20dd45743c44324ec08c4becbe0f0611f1/7ohP4GDMGPrVKxNbijdYKdEFPk8EPgGeuMyZkPMZq1FL4wBRzD1xeYFiqQLTyUQNR5Fs2fwZYw8seUnx9UhiZzSoWLXCNHcywUUm.gif](7ohP4GDMGPrVKxNbijdYKdEFPk8EPgGeuMyZkPMZq1FL4wBRzD1xeYFiqQLTyUQNR5Fs2fwZYw8seUnx9UhiZzSoWLXCNHcywUUm.gif) + +> "We are in the universe and the universe is in us." - Neil Degrasse Tyson +> + +On the quest to learning more about the universe and improving humanity through scientific knowledge, I'll be accumulating notes and research on quantum computing here. I'll try to cover an ongoing knowledge base of quantum development, a history of what has already transpired to lead us to the exciting times in scientific discovery we have now, as well as the trials of quantum computing we have ahead. + +Coming from a computer science background, I will ultimately be interested in programming applications effectively using quantum computation methods to optimize a plethora of issues in our society. This is truly an exciting area of research that I am beyond passionate to continue learning for! Let's get started: + +[D-Wave's 2019 Recap](Quantum%20Papers%20dd45743c44324ec08c4becbe0f0611f1/D-Wave's%202019%20Recap%20a1fe36f9d3bc4ee6b2044e51b78e7e32.md) + +[Menten AI](Quantum%20Papers%20dd45743c44324ec08c4becbe0f0611f1/Menten%20AI%206efaacbaea83459fafe1254649b82b1f.md) + +[Quantum Error Correction - Notes](Quantum%20Papers%20dd45743c44324ec08c4becbe0f0611f1/Quantum%20Error%20Correction%20-%20Notes%20cd0549f4d3424fbd8df4eda4dd196e5c.md) + +[Demonstrating Superposition ](Quantum%20Papers%20dd45743c44324ec08c4becbe0f0611f1/Demonstrating%20Superposition%2072b6d49984f3441aad128915b7349e32.md) + +[Q-CTRL Tutorial ](Quantum%20Papers%20dd45743c44324ec08c4becbe0f0611f1/Q-CTRL%20Tutorial%20cb0c1e016ea849e281b2878cb7401dca.md) + +[QPU Teleportation ](Quantum%20Papers%20dd45743c44324ec08c4becbe0f0611f1/QPU%20Teleportation%203fc3984bc42342c2a8c650b75452ab56.md) + +[Learning Qiskit ](Quantum%20Papers%20dd45743c44324ec08c4becbe0f0611f1/Learning%20Qiskit%20a6cf9a98cc344279b607fe28a6c08e45.md) + +[QURECA](Quantum%20Papers%20dd45743c44324ec08c4becbe0f0611f1/QURECA%20ddd35e9bdd2843bbacb547fbb90ec6c3.md) + +[Quantum Qonvos. ](Quantum%20Papers%20dd45743c44324ec08c4becbe0f0611f1/Quantum%20Qonvos%20dc00c53b7a774b8cb216c2bdd4986d5f.md) \ No newline at end of file diff --git a/Careers/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Quantum Papers dd45743c44324ec08c4becbe0f0611f1/D-Wave's 2019 Recap a1fe36f9d3bc4ee6b2044e51b78e7e32.md b/Careers/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Quantum Papers dd45743c44324ec08c4becbe0f0611f1/D-Wave's 2019 Recap a1fe36f9d3bc4ee6b2044e51b78e7e32.md new file mode 100755 index 0000000..162137e --- /dev/null +++ b/Careers/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Quantum Papers dd45743c44324ec08c4becbe0f0611f1/D-Wave's 2019 Recap a1fe36f9d3bc4ee6b2044e51b78e7e32.md @@ -0,0 +1,56 @@ +# D-Wave's 2019 Recap + +D-Wave is one of the first quantum computing companies based in Canada to actively work on developing a quantum processing chip for future computation applications. In May 2019, they hosted a webinar that summarized their quantum developments up until that point. I've summarized some of their main takeaway points below. + +![D-Wave's%202019%20Recap%20a1fe36f9d3bc4ee6b2044e51b78e7e32/ec2d906e-472e-41fe-b7fe-4c5dc257ae50-1552335402254.png](D-Wave's%202019%20Recap%20a1fe36f9d3bc4ee6b2044e51b78e7e32/ec2d906e-472e-41fe-b7fe-4c5dc257ae50-1552335402254.png) + +## Simulating Physics with a Computer + +So what is a **qubit**? + +A qubit is not a physical thing in nature but rather a mathematical model. Essentially, anything that vibrates in nature acts as a harmonic oscillator function, or behaves as a wave. /include wave image here. A system with two energy levels is a qubit and their system of simulating these qubits is by creating a **superconducting** loop with two currents on either side. There's also the method for **trapped ion** chips to emulate qubit system as well that are being worked on. + +There are even interesting developments to explore qubit systems through mapping topological matter which is done by braiding patterns of particles as they move though space & time. + +Essentially, creating the physical qubit system is an engineering choice. This can be analagous to the classical computer being built through vacuum tubes. The qubit itself is a mathematical model of a simulated wave with two energy levels. + +## Standard Model of Quantum Computing + + Gate/Circuit Model + +How do you read a circuit model? + +- horizontal lines in the circuit model = the amount of qubits in the system +- A system composed of multiple qubits thus explodes exponentially +- if you have n qu bits —> vectors of 2^n + +$$ +n qubits = 2^n vectors +$$ + +Hence, the wave function of a nine qubits system would mean + +$$ +2^9 = 512 +$$ + +Hence, each gate acts on this wav function as a unitary matrix of size 512 x 512. Next, these measurements projects the vector onto a subspace. In the end, 1 final vector is outputted and some measurements will be made on this. + +Peter Shor made the discovery that factoring integers can be combines quickly with the Quantum Fourier Transform (QFT) + +You can factor quickly and efficiently using Shor's Algorithm now! However, quantum theory was still abstract back in 1994 but theoretically, since modern computers use the difficulty of factoring for its encryption foundation, a key mathematical concept was introduced. + +Quantum Computing now being researched heavily. However: + +**Problem:** The waves & noise associated with quantum measurements + +The *coherence property* of waves is leading many researchers into having issues with its stability. + +Explanation: At it's highest or lowest points when two waves come together and interfere with each other, one of two things occur: + +1. constructive interference: two interacting waves enforce each other +2. destructive interference: two interacting waves destroy each other + +In Shor's algorithm, this is still considered as numbers are accounted for to enforce or destroy. However, even still the issue of *noise* is still apparent in the waves. + +Explanation: the analogy of an actual ocean wave can be considered. When several waves crash into each other, there will be many ripples. Hence if you add more ripples to waves, it is possible to swamp the waves entirely. \ No newline at end of file diff --git a/Careers/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Quantum Papers dd45743c44324ec08c4becbe0f0611f1/D-Wave's 2019 Recap a1fe36f9d3bc4ee6b2044e51b78e7e32/ec2d906e-472e-41fe-b7fe-4c5dc257ae50-1552335402254.png b/Careers/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Quantum Papers dd45743c44324ec08c4becbe0f0611f1/D-Wave's 2019 Recap a1fe36f9d3bc4ee6b2044e51b78e7e32/ec2d906e-472e-41fe-b7fe-4c5dc257ae50-1552335402254.png new file mode 100755 index 0000000..bba2933 Binary files /dev/null and b/Careers/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Quantum Papers dd45743c44324ec08c4becbe0f0611f1/D-Wave's 2019 Recap a1fe36f9d3bc4ee6b2044e51b78e7e32/ec2d906e-472e-41fe-b7fe-4c5dc257ae50-1552335402254.png differ diff --git a/Careers/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Quantum Papers dd45743c44324ec08c4becbe0f0611f1/Demonstrating Superposition 72b6d49984f3441aad128915b7349e32.md b/Careers/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Quantum Papers dd45743c44324ec08c4becbe0f0611f1/Demonstrating Superposition 72b6d49984f3441aad128915b7349e32.md new file mode 100755 index 0000000..f094485 --- /dev/null +++ b/Careers/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Quantum Papers dd45743c44324ec08c4becbe0f0611f1/Demonstrating Superposition 72b6d49984f3441aad128915b7349e32.md @@ -0,0 +1,19 @@ +# Demonstrating Superposition + +***Superposition**: A* fundamental principle of quantum mechanics. It states that, much like waves in classical physics, any two quantum states can be added together and the result will be another valid quantum state. + +**The below diagram would be how a quantum computer solves a maze:** + +![https://miro.medium.com/max/1400/1*2sGsPcxJ4yt_njulA6s9Hw.gif](https://miro.medium.com/max/1400/1*2sGsPcxJ4yt_njulA6s9Hw.gif) + + **vs. its classical computer counterpart:** + +![https://miro.medium.com/max/1400/1*hEaCmvyVfLhX0ETjM7Z7aQ.gif](https://miro.medium.com/max/1400/1*hEaCmvyVfLhX0ETjM7Z7aQ.gif) + +# **How does this work?** + +This machine works based on the presence or absence of the clicks caused by the rotation of these mechanical levers. Although we have moved on from mechanical levers to digital bits, the same concept still governs all our computing efforts. The concept of **qubit** can easily be explained by saying that it can be 0 and 1 at the same time. But in the mechanical case, having a click and having no click at the same time, seems like an absurd case to make. This is the reason why even researchers working on Quantum Technology are not able to fully visualize it’s power and capabilities. + +However, let us try to make some sense of the situation here. In any way, computing power directly correlates to the number of computational states which exists at the same time. Let’s take the example of navigating a maze. When considering that a quantum particle is going through this maze, remember that a quantum particle has the unique property of being at 2 places at the same time due to the principle of quantum superposition. So when a quantum particle encounters various paths to take within the maze, it can decide to take all of those paths at the same time using superposition. + +If you think about it, this process closely resembles the paradigm of parallel computing. Due to quantum *superposition*, the quantum particle is able to navigate the maze in exponentially less time than the classical bit. \ No newline at end of file diff --git a/Careers/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Quantum Papers dd45743c44324ec08c4becbe0f0611f1/Learning Qiskit a6cf9a98cc344279b607fe28a6c08e45.md b/Careers/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Quantum Papers dd45743c44324ec08c4becbe0f0611f1/Learning Qiskit a6cf9a98cc344279b607fe28a6c08e45.md new file mode 100755 index 0000000..3ad82e5 --- /dev/null +++ b/Careers/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Quantum Papers dd45743c44324ec08c4becbe0f0611f1/Learning Qiskit a6cf9a98cc344279b607fe28a6c08e45.md @@ -0,0 +1,55 @@ +# Learning Qiskit + +Sample Code & Getting Started + +Step 1: Open up terminal and check for python 3.7+ or install python by following instructions. + +```python +#check which version of python you have +python -V +``` + +Step 2: Then install anaconda + +```python +brew cask install anaconda +``` + +(you can check if it has finished installing by running "jupyter notebook" in the terminal) + +Visit [here](https://medium.com/ayuth/install-anaconda-on-macos-with-homebrew-c94437d63a37)(MacOS) or [here](https://medium.com/@GalarnykMichael/install-python-on-mac-anaconda-ccd9f2014072)(Linux & Windows) if you are running into any issues. + +Step 3: + +**Topics:** + +Visualization: + +All visualizations found [here](https://nbviewer.jupyter.org/github/qutip/qutip-notebooks/blob/master/examples/visualization-exposition.ipynb) + +```python +%matplotlib inline +import matplotlib,pyplot as plt +import numpy as np +from qutip import * + +//Hinton +rho = rand_dm(5) +hinto(rho); + +//Sphereplot +theta = np.linspace(0, np.pi, 90) +phi = np.linspace(0, 2 * np.pi, 60) +sphereplot(theta, phi, orbital(theta, phi, basis(3, 0))); + +//Matrix_histogram +matrix_histogram(rho.full().real); +matrix_histogram_complex(rho.full()); + +b = Bloch() +b.add_vectors(expect(H.unit(), e_ops)) +b.add_points(result.expect, meth='1') +b.make_sphere() +``` + +Here's a list of all languages that are available for quantum programming: \ No newline at end of file diff --git a/Careers/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Quantum Papers dd45743c44324ec08c4becbe0f0611f1/Menten AI 6efaacbaea83459fafe1254649b82b1f.md b/Careers/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Quantum Papers dd45743c44324ec08c4becbe0f0611f1/Menten AI 6efaacbaea83459fafe1254649b82b1f.md new file mode 100755 index 0000000..fb05404 --- /dev/null +++ b/Careers/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Quantum Papers dd45743c44324ec08c4becbe0f0611f1/Menten AI 6efaacbaea83459fafe1254649b82b1f.md @@ -0,0 +1,30 @@ +# Menten AI + +AI & Quantum-Powered Protein Design: Using D-Wave's Quantum Leap Application + +2 Presentations: + +1. Hans Melo +2. Hassein + +Proteins are little machine that can form chemical reactions in the form of enzymes. + +There is a huge interest from the chemical and commercial industries to create better enzymes with commerical benefit. + +![Menten%20AI%206efaacbaea83459fafe1254649b82b1f/Screen_Shot_2020-04-30_at_1.05.24_PM.png](Menten%20AI%206efaacbaea83459fafe1254649b82b1f/Screen_Shot_2020-04-30_at_1.05.24_PM.png) + +# Current Protein Design is Limited + +Most protein that occur naturally through evolution is a very small field to explore. However, directed evolution in enzymes allows us to go a bit outside the field of nature. + +![Menten%20AI%206efaacbaea83459fafe1254649b82b1f/Screen_Shot_2020-04-30_at_1.07.59_PM.png](Menten%20AI%206efaacbaea83459fafe1254649b82b1f/Screen_Shot_2020-04-30_at_1.07.59_PM.png) + +Menten AI argues that somewhere in that grey space is the future of vaccines, the future of medicine, and other helpful health. That is what can be done with computational methods that currently exist as well future methods related to quantum engineering. It is only within the last 5-10 years that designing proteins on the computer could even be possible. Of all the proteins that were tested, it is only a small fraction of these that were ever successful. For the most part, he claims that this is a very ineffective and wasteful process. + +Menten plans on not only screening proteins but also creating new proteins. Developed a number of methods using quantum computing and machine learning. + +Used Quantum Approaches - Quantum Annealing for optimization + +The Core problem in protein design: + +![Menten%20AI%206efaacbaea83459fafe1254649b82b1f/Screen_Shot_2020-04-30_at_1.13.16_PM.png](Menten%20AI%206efaacbaea83459fafe1254649b82b1f/Screen_Shot_2020-04-30_at_1.13.16_PM.png) \ No newline at end of file diff --git a/Careers/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Quantum Papers dd45743c44324ec08c4becbe0f0611f1/Menten AI 6efaacbaea83459fafe1254649b82b1f/Screen_Shot_2020-04-30_at_1.05.24_PM.png b/Careers/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Quantum Papers dd45743c44324ec08c4becbe0f0611f1/Menten AI 6efaacbaea83459fafe1254649b82b1f/Screen_Shot_2020-04-30_at_1.05.24_PM.png new file mode 100755 index 0000000..8c91eef Binary files /dev/null and b/Careers/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Quantum Papers dd45743c44324ec08c4becbe0f0611f1/Menten AI 6efaacbaea83459fafe1254649b82b1f/Screen_Shot_2020-04-30_at_1.05.24_PM.png differ diff --git a/Careers/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Quantum Papers dd45743c44324ec08c4becbe0f0611f1/Menten AI 6efaacbaea83459fafe1254649b82b1f/Screen_Shot_2020-04-30_at_1.07.59_PM.png b/Careers/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Quantum Papers dd45743c44324ec08c4becbe0f0611f1/Menten AI 6efaacbaea83459fafe1254649b82b1f/Screen_Shot_2020-04-30_at_1.07.59_PM.png new file mode 100755 index 0000000..37bcdac Binary files /dev/null and b/Careers/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Quantum Papers dd45743c44324ec08c4becbe0f0611f1/Menten AI 6efaacbaea83459fafe1254649b82b1f/Screen_Shot_2020-04-30_at_1.07.59_PM.png differ diff --git a/Careers/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Quantum Papers dd45743c44324ec08c4becbe0f0611f1/Menten AI 6efaacbaea83459fafe1254649b82b1f/Screen_Shot_2020-04-30_at_1.13.16_PM.png b/Careers/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Quantum Papers dd45743c44324ec08c4becbe0f0611f1/Menten AI 6efaacbaea83459fafe1254649b82b1f/Screen_Shot_2020-04-30_at_1.13.16_PM.png new file mode 100755 index 0000000..90cf2b2 Binary files /dev/null and b/Careers/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Quantum Papers dd45743c44324ec08c4becbe0f0611f1/Menten AI 6efaacbaea83459fafe1254649b82b1f/Screen_Shot_2020-04-30_at_1.13.16_PM.png differ diff --git a/Careers/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Quantum Papers dd45743c44324ec08c4becbe0f0611f1/Q-CTRL Tutorial cb0c1e016ea849e281b2878cb7401dca.md b/Careers/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Quantum Papers dd45743c44324ec08c4becbe0f0611f1/Q-CTRL Tutorial cb0c1e016ea849e281b2878cb7401dca.md new file mode 100755 index 0000000..0794c1b --- /dev/null +++ b/Careers/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Quantum Papers dd45743c44324ec08c4becbe0f0611f1/Q-CTRL Tutorial cb0c1e016ea849e281b2878cb7401dca.md @@ -0,0 +1,11 @@ +# Q-CTRL Tutorial + +DISCLAIMER: A few prerequsites before reading: + +- Some Terminal knowledge +- Python & jupyter notebook manipulation +- Passion for quantum computing! + +# A quick & easy way to get started on Q-CTRL to stabilize those pesky computations! + +OK so this tutorial is about Q-CTRL not about installing python, anaconda, or how to use the terminal. If you need further assistance with those topics, check out these links here! :-) \ No newline at end of file diff --git a/Careers/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Quantum Papers dd45743c44324ec08c4becbe0f0611f1/QPU Teleportation 3fc3984bc42342c2a8c650b75452ab56.md b/Careers/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Quantum Papers dd45743c44324ec08c4becbe0f0611f1/QPU Teleportation 3fc3984bc42342c2a8c650b75452ab56.md new file mode 100755 index 0000000..d3c0a22 --- /dev/null +++ b/Careers/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Quantum Papers dd45743c44324ec08c4becbe0f0611f1/QPU Teleportation 3fc3984bc42342c2a8c650b75452ab56.md @@ -0,0 +1 @@ +# QPU Teleportation \ No newline at end of file diff --git a/Careers/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Quantum Papers dd45743c44324ec08c4becbe0f0611f1/QURECA ddd35e9bdd2843bbacb547fbb90ec6c3.md b/Careers/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Quantum Papers dd45743c44324ec08c4becbe0f0611f1/QURECA ddd35e9bdd2843bbacb547fbb90ec6c3.md new file mode 100755 index 0000000..335e133 --- /dev/null +++ b/Careers/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Quantum Papers dd45743c44324ec08c4becbe0f0611f1/QURECA ddd35e9bdd2843bbacb547fbb90ec6c3.md @@ -0,0 +1,11 @@ +# QURECA + +[http://www.vad1.com/](http://www.vad1.com/) + +QKD + +[https://www.edx.org/course/quantum-cryptography](https://www.edx.org/course/quantum-cryptography) + +[https://www.ida.org/research-and-publications/publications/all/o/ov/overview-of-the-status-of-quantum-science-and-technology-and-recommendations-for-the-dod](https://www.ida.org/research-and-publications/publications/all/o/ov/overview-of-the-status-of-quantum-science-and-technology-and-recommendations-for-the-dod) + +[https://docs.microsoft.com/en-us/quantum/tutorials/quantum-random-number-generator?tabs=tabid-qsharp](https://docs.microsoft.com/en-us/quantum/tutorials/quantum-random-number-generator?tabs=tabid-qsharp) \ No newline at end of file diff --git a/Careers/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Quantum Papers dd45743c44324ec08c4becbe0f0611f1/Quantum Error Correction - Notes cd0549f4d3424fbd8df4eda4dd196e5c.md b/Careers/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Quantum Papers dd45743c44324ec08c4becbe0f0611f1/Quantum Error Correction - Notes cd0549f4d3424fbd8df4eda4dd196e5c.md new file mode 100755 index 0000000..252d7ad --- /dev/null +++ b/Careers/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Quantum Papers dd45743c44324ec08c4becbe0f0611f1/Quantum Error Correction - Notes cd0549f4d3424fbd8df4eda4dd196e5c.md @@ -0,0 +1,132 @@ +# Quantum Error Correction - Notes + +A 3-level quantum system viewed as a graph. These off-diagonal elements represent how much simultaneous reality exists between each system. + +Have some input state and then some error/interaction happens to it that changes the state and error has happened to it and changed the whole system. Ideally, we would like to go back to the same state we started with. + +Normally in a quantum computer there are qubits. There is usually an input system. Once the operations occur in a quantum computer + +Ancilla qubits provide reduncancy for the computational basis, tell us which error occurred. + +Qubit —> superposition —> simulataneous reality —> it doesn't have to be 50/50 though and it can different ratios of positions. + +Another degree of freedom is also possible called **phase** so the angle around the sphere. + +The waves represent up or down. + +Quantum mechanice —> probability waves underlie everything. + +Superposition is due to the fact that everything is made of a wave. Since upness/downness is one degree of freedom. The relative phase is another degree. That's why the whole sphere is a qubit which is just a 2-level quantum system but is an infinite number of possible states. + +However a 3 level system is represented on surface of 8 dimensional hypersphere. It is possible to get complicated very quickly. + +Quantum mechanics is a much richer strcuture than we are used to in our classical thinking world. + +It can be that if we focus too much on a system that is bigger than q ubit and try to treat it as bigger than a qubit, it may lose its pure-state identity a bit and can act like multiple different quantum states. Imagine there is a weighted sum of these and thus + +Quantum mixed state: weighted sum will cause the net point to not be on the surface of the sphere and then cause it to be on the interior. + +we lose some usefulness of the quantum state then. + +We have these ancilla qubits and we first do a unitary encoding operation entangles the ancillas with input state to cause redundancy so that when an error occurs we can register it. + +We may have errors happening locally, if things were happening on qubit only that is the simplest error + +That can only be happened as an error on everything. + +In these error correction schemes, they oversimplify it so that these error corrections don't exactly work. + + Then, after recovery, there would be the computational unitary. This is the item that is the computation of the quantum computer. But after that there may be another layer of errors that happen, then another layer of recovery, and then computation. + +Then theoretically at the end, there were would be a unitary decoding operation + +What you would get back is the recovered input state which is exactly the same it was before the errors happened . + +Error channels are assumed to be local (they were thinking very classically when they made this - they had to think from what they were familiar with - will only focus on local errors in the beginning) + +Recovery operations includes projective measurements which causes destruction thus requiring more ancillas. + +A given code only works ofr a particular family of error channels. + +Simplest error channel : bit-flip operators —> flip a qubit that is up to the down state + +To some extent though it is a ruined or damaged state. + +**Encode via basis redundancy** —> People couldn't get their minds out of classical thinking though + +If superposition it will flip up to down and down to up + +Indent + +Square roots of probabilities directly determine what the probabilities of each outcome are. + +Entangled —> since none of the a or b can be factored out it is provably generally entangled. + +We want is an encoding that uses entanglement that uses some redundancy into the basis (still a simultaneous reality - not possible in a classical computer) and so we use the ancilla system described before. + +How to encode: + +1. Initial state and ancillas. —> we distribute the ancillas in into the initial state. The ancillas have their own states in this state and thus no entanglement. +2. Apply encoding unitary + +Review: + +Make simple assumptions: Only local error channels on each qubit, only one qubit get a particular error at a time. + +Identify orthogonal projectors that can distinguish the possible joint-system errors ( List our allowed errors — the ones we assume are the only things that happen) : the simplest is when nothing happens (identity), circle with the x is the tensor product is that is separates the subspaces where each qubit lives. + +Then list effects on encoded state: Notice that all corrupted results are orthogonal + +Have some experience working with kets (represent quantum outcomes) + +To understand if it is perpendicular —> which anytime 2 different basis elements in one qubit that are different — > this will cause 0 when they are interacting in some way + +In quantum mechanics —> perpendicular means outcomes that are mutually exclusive —> in fact in space they are at right angles + +A single state can be in a superposition of perpendicular outcomes (like alive & dead: two most mutually exclusive things we can think of) + +Create subspace identities for these corrupted outcomes + +Call these projectors or subspace projects —> for the original state, take the outcome and make a pure projector of it. + +this is an operator + +Similar to identity like having an identity for 8 level matrix. + +1 in the first position + +Each is a subspace identity for the corrupted states + +We take the identities and we enact them on the corrupted state + +Only the corrupted state then survives. + +The effect of projectors on corrupted results is often destructive + +Measurements are destructive to superposition (and that is what we are trying to protect) + +Thus we need measurement ancillas. + +Thus, design a projective measurement that is nondestructive on the main encoded system. + +1. Couple to measurement ancilla —> another operation called the measurement unitary which changes the ancillas in some way that changes them so that we make them unique and basically indentify the error. +2. Possible measurements of ancilla —> when you have unique tags that are perpendicular and now we have something that we can measure and don't care what happens to this tag - the attached superposition will now survive in each form in order to protect it. +3. Plan corrections based on measurement ancilla results - Then use measurement ancilla with whatever tag you got, apply a new operation that reverses that error - ideally it is the inverse operation of the error - though it is possible in this case but not always true - +4. Make corrections (feed-forward measurements to variable recovery operator) - you have thus reversed the error - all are the same original encoding state. + +Recovery Complete! + +Caveats: + +1. Is ancilla-assisted, need MN measurement ancillas for M logical qubits encoded with N +2. Measurement ancillas are assumed to be error-free - + +Starts to remind us of refrigerator - start to refrigerate something we need to refrigerate that , another problem we encounter when we try to cool things down to absolute zero + +1. Allowed errors are assumed invertible, otherwise recovery couldn't be done +2. Only local error channels assumed +3. Assumed only one error at a time - when trying to do more complicated things —> gets more complex because of the complexity possible that the error correction mechanism might have errors . Part of the reason we cool things down so much is that when we do that we can reduce those errors as much as possible. That is why we have these advanced refrigerators playing an important part in quantum computation. We are still in the vacuum tube days of quantum computing. The vacuum tube used to burn up, could not operate for long without replacing vacuum tubes. The transistors were a quantum leap forward. Revolutionized and made modern computers possible. What we need is something analagous of the transistor. Quantum error correction is bigger than quantum error correction — adapted it to a communications system. Coupled ideas of teleportation with quantum error correction to achieve powerful communication abilities. +4. An idea is not limited to the area for which it is intended. That might break you into a whole dimension of possibilities. Any ideas can turn out to be gold mines later. +5. Ideas had an wrote down paid off. Don't discard the value of your own thinking. +6. Maximally entangled states for n quantum states +7. \ No newline at end of file diff --git a/Careers/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Quantum Papers dd45743c44324ec08c4becbe0f0611f1/Quantum Qonvos dc00c53b7a774b8cb216c2bdd4986d5f.md b/Careers/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Quantum Papers dd45743c44324ec08c4becbe0f0611f1/Quantum Qonvos dc00c53b7a774b8cb216c2bdd4986d5f.md new file mode 100755 index 0000000..24537dd --- /dev/null +++ b/Careers/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Quantum Papers dd45743c44324ec08c4becbe0f0611f1/Quantum Qonvos dc00c53b7a774b8cb216c2bdd4986d5f.md @@ -0,0 +1,7 @@ +# Quantum Qonvos. + +*Quantum computing applies to everything that can be optimized.* + +Shway - So what can be optimized? + +Bo - What can't be optimized? \ No newline at end of file diff --git a/Careers/Past/Windtelligent.ai/AI/Intro to the AI.md b/Careers/Past/Windtelligent.ai/AI/Intro to the AI.md new file mode 100644 index 0000000..05774cd --- /dev/null +++ b/Careers/Past/Windtelligent.ai/AI/Intro to the AI.md @@ -0,0 +1,29 @@ +# Welcome to the AI + +Ah the world of artiifical intelligence. The electricity that powers all the tech tools of tomorrow including Windtelligent's! + +General ML things should be found in the larger vault I believe or even [here](obsidian://open?vault=Coding%20Tips&file=Python%2FProjects%2FMachine%20Learning%2FML%20Management), but I'm sure the shorter version will have relevance here as well. The extended if-then statement with some numbers at best. The start to decision making upon cell splitting. Add any fun links you'd like here. + +--- + +## In Review + +The 5 algorithms currently in review are: + + - Linear Regression + +- k-Nearest Neighbors + +- Decision Tree + +- Support Vector Machines + +- Multi-Layer Perceptron + +These are 5 algorithms that you can try on your regression problem as a starting point. A standard machine learning wind problem will be used to demonstrate each algorithm. + + +--- + +## Cross-Validation Review + diff --git a/Careers/Past/Windtelligent.ai/First Quarter Notebook.md b/Careers/Past/Windtelligent.ai/First Quarter Notebook.md new file mode 100644 index 0000000..f755549 --- /dev/null +++ b/Careers/Past/Windtelligent.ai/First Quarter Notebook.md @@ -0,0 +1,59 @@ +# First Quarter Notebook + +### April Events +- We won 3rd place in the hackathon! +- incorporated officially as Windtelligent AI LLC + + +### May Events + + +### June Events + + +### July Events + + +### August Events + + +--- +# Windtelligent Q1 +- created a private repository +- created a shared private drive +- created a baseline model & 2 demos +- emails and social media created + +--- + +# More Tools + +### ML Papers: +- Ax - [Bandit Optimization ](https://ax.dev/docs/banditopt.html) +- 2019 -[Deep Uncertainty Quantification](http://urban-computing.com/pdf/kdd19-BinWang.pdf) with NWP +- 2020 -[ WeatherBench](https://arxiv.org/abs/2002.00469) - benchmark for data driven weather forecasting +- 2019 - [Visual Wind Speed Prediction](https://paperswithcode.com/paper/seeing-the-wind-visual-wind-speed-prediction#code) RCNN +- 2020 - cubed sphere for [quicker](https://arxiv.org/abs/2003.11927) ensembling +- 2021 - Multi-station [forecasting](https://arxiv.org/pdf/2009.11239.pdf) RCNN +- [Tutorial](https://castlelab.princeton.edu/html/Presentations/Powell_UnifiedFrameworkforOUU_InformsTutorial_Nov132016.pdf) of Unified Framework Optimization under Uncertainy- 2016 +- + + +### Referenced Githubs: +- [NGBoost](https://github.com/stanfordmlgroup/ngboost) for probabilistic prediction +- [Deep ensemble](https://github.com/bond005/yandex-shifts-weather) for weather shifts +- SpaceApps [Meteomatics](https://github.com/spaceappsnyc/UnicodeUnicorns2019/blob/master/MeteoMatics_API_Python_Calls.py) API Calls +- Deep Learning with [DUQ](https://github.com/BruceBinBoxing/Deep_Learning_Weather_Forecasting) +- The [RESNet](https://github.com/luoye2333/ResNetLSTM) LSTM +- [UAV](https://github.com/weg-re/uav-analysis) Analysis +- Scikit [helper](https://github.com/sipposip/keras-tensorflow-scikit-utilities/blob/master/periodic_padding_keras_example.py) functions +- Deep CNN of [GCM](https://github.com/sipposip/simple-gcm-deep-learning) +- Deep learning models for [global weather prediction](https://github.com/jweyn/DLWP-CS) on a cubed sphere +- Multi-station [RCNN](https://github.com/IsmailAlaouiAbdellaoui/weather-forecasting-explainable-recurrent-convolutional-NN) +- [Streamlit]([https://github.com/streamlit/streamlit](https://github.com/streamlit/streamlit)) for demo +- Download HRRR model data through [Herbie](https://github.com/blaylockbk/Herbie) + +### Business tools +- [pitch deck](https://slidebean.com/template-category/startups) templates +- YC [freebies](https://www.notion.so/ycsus/eb459f79a61e40919b03165581a66680?v=210c4c5a5cc54579986dff74d9d52eb7&p=bc542889ac09432989d22631e025f692&pm=s) +- \ No newline at end of file diff --git a/Careers/Past/Windtelligent.ai/Intelligence/Different Data Models.md b/Careers/Past/Windtelligent.ai/Intelligence/Different Data Models.md new file mode 100644 index 0000000..679bab2 --- /dev/null +++ b/Careers/Past/Windtelligent.ai/Intelligence/Different Data Models.md @@ -0,0 +1,36 @@ +# What are the different data models ? + +These would be our potential competitors or companions! We hope to work with them in the goal of bettering wind knowledge. + +We are currently comparing against the HRRR & ECMWF models + +The goal is to give you the most accurate forecast data available. A single forecast model will never be the most accurate in all situations, so by having access to the world’s top forecast models you can be assured to get the best possible forecast, to give you greater confidence in your decision-making. + +PredictWind has been the market leader for accurate forecasts in the recreational market since 2008. Using the CSIRO CCAM model with 450 high-resolution domains around the world, PredictWind covers most popular recreational marine users in the world. + +--- + +**PWG:** Stands for the PredictWind proprietary weather model that uses the [NCEP](http://www.nco.ncep.noaa.gov/pmb/products/gfs/) global initial conditions, processed through the CSIRO CCAM model to generate the PWG forecast. + +**PWE:** Stands for the PredictWind proprietary weather model that uses the [ECMWF](http://www.ecmwf.int/en/about/who-we-are) global initial conditions, processed through the CSIRO CCAM model to generate the PWE forecast. + +Using the ECMWF and NCEP initial conditions (which are comparable to a 'photographic' snapshot that contains the current state of the Earth's atmosphere) enable us to run our own worldwide weather models, and we are the only private company in the world that has this proprietary technology. + +**GFS:** Stands for Global Forecast System from [NCEP](http://www.nco.ncep.noaa.gov/pmb/products/gfs/). This is used by most other weather websites/apps. We now display the GFS-FV3 model when you see the GFS label in PredictWind. It’s the first significant upgrade to GFS in about 40 years. Unlike the previous GFS model, GFS-FV3 is able to simulate vertical movements such as updrafts, a key component of severe weather, at very high resolution. So far, tests suggest that the FV3 model has more accurate five-day forecasts, as well as better predictions of hurricane tracks and intensification. Although the new FV3 core has shown improvements over GFS it remains ranked 3rd for accuracy behind ECMWF(1st) and UKMO(2nd). + +**ECMWF:** Stands for European Center for Medium-Range Weather Forecasts and is highly regarded by Meteorologists and top Navigators around the world. The ECMWF High RES model consistently rates as the top global weather model from a national weather service with the highest rating scores. In March 2016 ECMWF increased the resolution of their model to a record-breaking 9 km resolution, which is currently the highest resolution global model available. ECMWF data has a very high acquisition cost, and this is why the data is not widely used by many weather websites, and has been traditionally used only by top yacht racing teams and meteorologists. + +**SPIRE:** Is a truly innovative company with the largest nanosatellite network in space. Spire uses a unique technique of measuring the earth’s atmosphere with 3x more [radio occultation](https://share.predictwind.com/yAulreQb) data than any other commercial entity. This gives an advantage in forecast accuracy for remote locations. The Spire model is #1 for wind speed and direction accuracy using data from offshore weather buoys. It is #2 behind the ECMWF for land-based weather stations. +​You can learn more about Spire by watching this [video](https://www.youtube.com/watch?v=5kpw5WeR5V4). + +**UKMO:** Otherwise known as the “Unified Model” by the UK Meteorological Office has a long reputation as a market leader in forecast modelling. UKMO has very similar accuracy to the ECMWF model offshore, and is slightly behind the ECMWF & Spire models for the land based weather stations. + +**HRRR:** Stands for High-Resolution Rapid Refresh and is an NOAA real-time 3-km resolution, hourly updated, cloud-resolving, convection-allowing atmospheric model, initialized by 3 km grids with 3 km radar assimilation. Radar data is assimilated in the HRRR every 15 min over a 1-h period adding further detail to that provided by the hourly data assimilation from the 13 km radar-enhanced Rapid Refresh. To learn more see the [video](https://www.youtube.com/watch?v=tIPHkPeW7CA). + +**NAM:** Stands for North American Mesoscale Forecast System and is one of NOAA’s major weather models, which in this case covers most of North America. NAM is a mesoscale model, which means that the numerical analysis is able to model land, and other features, at a higher resolution than in a global model, leading to improved forecast accuracy. + +**AROME:** Is a small scale numerical prediction model, operational at Meteo-France since December 2008. It was designed to improve short-range forecasts of severe events such as intense Mediterranean precipitations (Cévenole events), severe storms, fog, urban heat during heat waves. This model is highly regarded by top racing navigators and beats the ECMWF forecast. + +---------------- + +Comparing the PWG/PWE forecasts allows you to gauge the confidence level in the forecast, and adding the GFS/ECMWF/ SPIRE & UKMO forecasts take your confidence to a new level. Generally the unique PredictWind model, and its higher resolution will be more accurate, but with all 9 forecasts you can have greater confidence in your forecast to make the best decision. \ No newline at end of file diff --git a/Careers/Past/Windtelligent.ai/Intelligence/HRRR.md b/Careers/Past/Windtelligent.ai/Intelligence/HRRR.md new file mode 100644 index 0000000..4cbd5b6 --- /dev/null +++ b/Careers/Past/Windtelligent.ai/Intelligence/HRRR.md @@ -0,0 +1,17 @@ +# High Rapid Refresh Rate + +This is the model currently used in North America and the USA standard for weather forecasting + +[More on HRRR](https://www.cpc.ncep.noaa.gov/products/analysis_monitoring/enso_update/sstanim.shtml) at the climate prediction center via National Weather service. + +**![](https://lh5.googleusercontent.com/rBCKNSPJEtuocSt9Ur6yO9NUoRLp7OeCUhldgFKy95K0r0D3erqxHf-MbFm1NE9nMDynFyA8I5fej_NI6RzlEwn1id8jzkKxbMq7nXSWvy4JE7KFs1hN4MbQjHFnVZklQMQVIF2kruIf2BQZbWBmLg)** +- uses HRRR ensemble (HRRRE) prediction v3 currently +- This data is publicly available [here](https://console.cloud.google.com/marketplace/product/noaa-public/hrrr?project=python-232920&pli=1) as well. + - via Google Cloud console, engage [quickstart](https://cloud.google.com/storage/docs/access-public-data?hl=en_US) + - real-time 3-km resolution + - hourly-updated + - assimilated every 15 min + - as far back as 2014 + - available via GRIB2 files + - further [toolkits](https://www.ncdc.noaa.gov/wct/) + \ No newline at end of file diff --git a/Careers/Past/Windtelligent.ai/Intelligence/Referenced Papers.md b/Careers/Past/Windtelligent.ai/Intelligence/Referenced Papers.md new file mode 100644 index 0000000..4b4766d --- /dev/null +++ b/Careers/Past/Windtelligent.ai/Intelligence/Referenced Papers.md @@ -0,0 +1,23 @@ +# Papers we are basing it off of + +We are basing it off of very recent papers in which ML models have been used for higher forecasting power. + +- [Short-term wind speed prediction](https://drive.google.com/file/d/1RdGwLX0m2LwVay2DOmdZomcTeUCL_f80/view?usp=sharing) using Extended Kalman Filter and ML + - [Research](https://drive.google.com/file/d/1RdGwLX0m2LwVay2DOmdZomcTeUCL_f80/view?usp=sharing) on short-term wind speed +- Real-time Forecasting [Framework](https://drive.google.com/file/d/1RdGwLX0m2LwVay2DOmdZomcTeUCL_f80/view?usp=sharing) using Deep Learning + - [codebase](https://github.com/BruceBinBoxing/Deep_Learning_Weather_Forecasting) for their paper +- [Geophysical Constraints ](https://drive.google.com/file/d/1RdGwLX0m2LwVay2DOmdZomcTeUCL_f80/view?usp=sharing)worldwide +- Accelerating [Weather Prediction](https://drive.google.com/file/d/1dhRQFjIBVEHJBsnloHD4NX02Y8-9HYQJ/view?usp=sharing) using Near-Memory Reconfigurable Fabric +- [ Feasibility of soft computing](https://drive.google.com/file/d/1-JaR0f5HSKwnqwMbyGkFXwFFf3tp3cKa/view?usp=sharing) for estimating long-term monthly mean wind speed +- Visual Wind Speed prediction [ using CNN & RNN](https://arxiv.org/pdf/1905.13290v3.pdf) + - For Wind Energy res-=ource quantification, air pollution monitoring, and weather forecasting +- Short-term wind speed prediction to [correct numerical weather forecasting ](https://www.sciencedirect.com/science/article/abs/pii/S0306261922002264) + - Specifically, the values of the mean absolute error (MAE), the mean absolute percentage error (MAPE), and the root mean square error (RMSE) are 0.1042 m/s, 4.63% and 0.1309 m/s after correction, decreased by 94.13%, 91.75% and 93.93%, respectively, compared to those without correction. + + +### Further Reading +- *Heaven's Breath: A Natural History of the Wind* by Lyall Watson + + +--- + diff --git a/Careers/Past/Windtelligent.ai/Intelligence/Windtelligent Wishlist.md b/Careers/Past/Windtelligent.ai/Intelligence/Windtelligent Wishlist.md new file mode 100644 index 0000000..3bd3204 --- /dev/null +++ b/Careers/Past/Windtelligent.ai/Intelligence/Windtelligent Wishlist.md @@ -0,0 +1,33 @@ +# Windtelligent Wishlist + +It'd be nice to see these things to get a better ML representation of what exactly we are doing under the hood. How our model compares to other wind forecast models and more. This will certainly be a growing bucket list so make sure to knock it off as you go along. And celebrate the victories! + +--- + + +## On the AI itself. +- our github +- our [reference papers ](obsidian://open?vault=Coding%20Tips&file=Careers%2FCurrent%20Occupations%2FWindtelligent%2FIntelligence%2FReferenced%20Papers) +- our [benchmarks](https://github.com/pangeo-data/WeatherBench) +- our demos +- on different wind features +- the[ daily 'do](https://drive.google.com/drive/folders/1bxiS58CH4kyUA0lmB4_JWYp2l1bwO2cm?usp=sharing) journal +- being better with Python and continuing to learn +- eventually incorporating quantum technology in there as well QML + +## On Quantum... +- Rigetti [enhancing](https://www.globenewswire.com/news-release/2021/12/01/2344216/0/en/Rigetti-Enhances-Predictive-Weather-Modeling-with-Quantum-Machine-Learning.html) predictive weather +- IBM Quantum [partnering](https://www.cnet.com/tech/tech-industry/ibm-unveils-weather-forecasting-system-commercial-quantum-computing-at-ces/) with weather +- Potentials for [major improvements](https://1qbit.com/blog/quantum-computing/forecasting-the-weather-using-quantum-computers/) on current numerical methods and predictions of meterological conditions + +## On Deployable Product +- [FastAPI](https://pythonawesome.com/fastapi-skeleton-app-to-serve-machine-learning-models-production-ready/) with Python on ML apps +- Timeline + +## On the website and our marketing presence +- our [website](https://www.windtelligent.ai/) +- airbenders and our story +- potential other websites +- our twitter +- other social medias +- other climate companies \ No newline at end of file diff --git a/Careers/Past/Windtelligent.ai/Windtelligent CTO.md b/Careers/Past/Windtelligent.ai/Windtelligent CTO.md new file mode 100644 index 0000000..64fe945 --- /dev/null +++ b/Careers/Past/Windtelligent.ai/Windtelligent CTO.md @@ -0,0 +1,11 @@ +# About Windtelligent AI + +Currently, I am the Chief Technology Officer (CTO) of a wind speed prediction company. Cool! But there is so much to it so there's a lot to apply to it. Primarily it is a large collections of to-do's and projects that are python-related. + +--- + +It may be worth it to continue keeping the collection of [folders](https://drive.google.com/drive/folders/1EUG5KNLwkm4lnwofyf4tRIw3_mwzZb5W?usp=sharing) that I have building the company and to further delve into the growing [github](https://github.com/katerspotaters/HackHouse_Wind/pull/30) repository which I have still yet to make changes or contribute to.... + +Anyways, here is the website for Windtelligent and here is the the list of things that is still on the bucket list left to do with our product. One feature at a time rememember. + +--- diff --git a/Careers/Potential and Future/60 careers/Academic Tutor.md b/Careers/Potential and Future/60 careers/Academic Tutor.md new file mode 100644 index 0000000..89d40db --- /dev/null +++ b/Careers/Potential and Future/60 careers/Academic Tutor.md @@ -0,0 +1,8 @@ +# Academic Tutor + +This is probably due to me still having Academic Computing at NYIT as my current position still which is false but this message was sent by Melissa Mayer at Success Academy via Linkedin + +--- +### Offer At Success Academy! + +Hi Shwetha Hope all is well and happy Monday! I am reaching out because your background and experience as an academic tutor falls in line with a few key roles we are filling here. I’d love to speak with you to chat more about these roles within our schools- can you hop on a quick call? If so, you can sign up for a time with me here: [https://calendly.com/melissa-mayer-1/15-minute-zoom-call?utm_medium=mmayer](https://calendly.com/melissa-mayer-1/15-minute-zoom-call?utm_medium=mmayer) Please also be sure to "Accept" or "Decline" this message. Thanks! Melissa Melissa Mayer Senior Human Resources Recruiter at Success Academy Charter Schools \ No newline at end of file diff --git a/Careers/Potential and Future/60 careers/Amazon/Amazon assessment link & instructions.md b/Careers/Potential and Future/60 careers/Amazon/Amazon assessment link & instructions.md new file mode 100644 index 0000000..ebd719c --- /dev/null +++ b/Careers/Potential and Future/60 careers/Amazon/Amazon assessment link & instructions.md @@ -0,0 +1,61 @@ + +## Hi Shwetha, + +Thank you for your interest in Amazon's Software Development Engineer (SDE) opportunities! We would like to invite you to complete our online assessment, the first step of our recruitment process. Your time investment for the online assessment should take about 2 hours. To progress in the recruitment process, please complete the assessment within 7 days of receiving this email. + +At Amazon, we hire the best minds in technology to innovate and build on behalf of our customers. The intense focus we have on our customers is the reason we are one of the world's most beloved brands – customer obsession is part of our company DNA. Amazonians chart their own path by owning their development, their career, and their future. What unites Amazonians across teams and geographies is that we are all striving to delight our customers and make their lives easier. The scope and scale of our mission drives us to seek diverse perspectives, be resourceful, and navigate through ambiguity. By working together on behalf of our customers, we are building the future one innovative product, service, and idea at a time. + +To begin the assessment, please read the instructions and follow the link below. + +Overview + +We encourage you to complete all sections of the assessment in one session. Once the 105-minute Coding Challenge timer starts, it doesn’t stop – even if you exit. If you need to take a break, the best time to do it is after the Coding Challenge. You don’t need to exit the assessment to take a quick break between sections. If you do exit out of the assessment, your work will be saved. When you return, you will start from where you left off. Remember, you must complete all 2 sections below before we can consider you for a Software Development Engineer role. + +1. Coding Challenge: this timed section takes 105 minutes; work through 2 coding problems and explain your approach. + +2. Amazon Work Style Survey: typically takes 7 minutes; answer questions about how you approach work in general + + +Once you’ve completed the assessment, you’ll see a confirmation screen verifying that all your responses have been received. Then, you’ll complete a 1 minute Feedback Survey. + + + +What about trying out a demo first? + +[The Coding Assessment Demo](https://9n3bwgl2.r.us-west-2.awstrack.me/L0/https:%2F%2Fwww.hackerrank.com%2Ftest%2F63ek10mhil5%2F60d306ab105867d80fca544041154273/1/0201000016mcm5bi-k23sldu7-kcbm-3ua7-lh5q-2s71nrs6o5g0-000000/sUbs8C3fZGODwpLQGMTBnDc_auY=276) is optional to help you get familiar with the platform before starting the actual assessment. You can use it as part of your preparation. + +Instructions (please read before you begin): + +- Do not click the Start My Assessment link below until you're ready to start and complete the assessment. + +- Set aside at least 2 hours in a quiet location where you can focus. + +- Make sure your internet connection is stable. + +- Use the latest version of Google Chrome, Firefox or Safari. + +- Respond to the acknowledgement that you'll complete the assessment without external assistance or resources. + + +During the coding challenge: + +- You may choose from the following languages: C, C++, C#, Go, Java, JavaScript, Kotlin, Objective C, Python, Ruby, Scala, or Swift. + +- Find supported compiler versions [here](https://9n3bwgl2.r.us-west-2.awstrack.me/L0/https:%2F%2Fwww.hackerrank.com%2Ftests%2Finfo%2Ffaq/1/0201000016mcm5bi-k23sldu7-kcbm-3ua7-lh5q-2s71nrs6o5g0-000000/HBHkV2VNBBOgLcTxtrBDy8WTDzI=276). + +- Manage your time effectively by checking the on-screen timer regularly. + +- Complete the entire assessment in one sitting - the coding challenge timer can't be paused once you have started. + + +We value the people we hire and appreciate your interest in Amazon! Please email your recruiter if you have further questions. + +Ready to go? + + + +Assessment Link: [https://9n3bwgl2.r.us-west-2.awstrack.me/L0/https:%2F%2Fassessments.amazon.jobs%2F%3Fauth=3jYr9JOLzX4npyxXWVTayRQXiJc3680IlAcweMTS_Bc%23%2Fassessment%2FHire_0c60a08f-3fe5-459f-84ac-01d20d6c6753/1/0201000016mcm5bi-k23sldu7-kcbm-3ua7-lh5q-2s71nrs6o5g0-000000/FOmm5JH7BTZsouvnLbYaCw1Ypjg=276](https://9n3bwgl2.r.us-west-2.awstrack.me/L0/https:%2F%2Fassessments.amazon.jobs%2F%3Fauth=3jYr9JOLzX4npyxXWVTayRQXiJc3680IlAcweMTS_Bc%23%2Fassessment%2FHire_0c60a08f-3fe5-459f-84ac-01d20d6c6753/1/0201000016mcm5bi-k23sldu7-kcbm-3ua7-lh5q-2s71nrs6o5g0-000000/FOmm5JH7BTZsouvnLbYaCw1Ypjg=276) + + + +** \ No newline at end of file diff --git a/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/HackerRank/About HackerRank Tips.md b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/HackerRank/About HackerRank Tips.md new file mode 100644 index 0000000..83b1adb --- /dev/null +++ b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/HackerRank/About HackerRank Tips.md @@ -0,0 +1,53 @@ +## To do the online coding assessment: + +it may be helpful to watch these videos as well. +-[ first tip:](obsidian://open?vault=Coding%20Tips&file=Tip%201.) don't panic + - very easy to get overwhelmed by big wall of text and make sure to read entire problem and all cases before writing the code + - write down notes and keywords +- [second tip](obsidian://open?vault=Coding%20Tips&file=Tip%202): don't worry about writing bad code at first + - they know it will take iterations + - you can always submit multiple times! + - run the stub code first and see if there are any sample test cases +- [third tip:](obsidian://open?vault=Coding%20Tips&file=Tip%203) submit your own test cases + - generating your own test cases shows that you are understanding the question fully before coding +- [fourth tip:](obsidian://open?vault=Coding%20Tips&file=Tip%204) use language reference materials + - important when you forget how to list comprehension in python + - you are always free to look up docs +- [fifth tip](obsidian://open?vault=Coding%20Tips&file=Tip%205): do the easy questions first!! + - you won't feel as stressed out +- [sixth tip](obsidian://open?vault=Coding%20Tips&file=Tip%206): start doing the easiest solution first even if it is not the most optimized solution, at least having that answer at all maybe +-[ seventh tip:](obsidian://open?vault=Coding%20Tips&file=Tip%207) TAKE the sample test!! + + +--- +## Techniques while coding: + +What you should be focusing on is the techniques and approaches. A lot of times, these techniques can be applied in other problems as well. + +Some important techniques to focus on: + +- rabbit and tortoise 2 pointer approach +- level order traversal using a queue +- backtracking +- drawing a recursion tree + +--- + + +### Signs that you are not ready for a programming job. + +1. You are not able to code in front of other people + a. if you are not able to code on the spot, work with other people work in software development + b. also just record yoursef while coding +2. You should be able to explain how data flows through that application on a high level +3. You don't have any substantial portfolio projects + - companies are going to want to see that you are able +4. Unable to debug applications. + - being a programmer means you are constantly going to fix +5. Not doing any coding challenges. + - have to get good at coding under pressure on platforms like hackerrank or leetcode. + +--- + +[Amazon common topics](https://www.educative.io/blog/crack-amazon-coding-interview-questions#questions) + diff --git a/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/HackerRank/Tip 1..md b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/HackerRank/Tip 1..md new file mode 100644 index 0000000..dd343dd --- /dev/null +++ b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/HackerRank/Tip 1..md @@ -0,0 +1,6 @@ +## Don't Panic +Write down any & all notes + keywords you may need here: + + + + diff --git a/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/HackerRank/Tip 2.md b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/HackerRank/Tip 2.md new file mode 100644 index 0000000..b50f707 --- /dev/null +++ b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/HackerRank/Tip 2.md @@ -0,0 +1,3 @@ +## Write down all the bad code you can. +without worrying about if it is optimized or not: + diff --git a/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/HackerRank/Tip 3.md b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/HackerRank/Tip 3.md new file mode 100644 index 0000000..e316c46 --- /dev/null +++ b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/HackerRank/Tip 3.md @@ -0,0 +1,17 @@ +## Submit Your Own Test Cases +Try out all your own test cases: + + + + + + + + + + + + + + +and also run the sample tests they give you. \ No newline at end of file diff --git a/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/HackerRank/Tip 4.md b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/HackerRank/Tip 4.md new file mode 100644 index 0000000..3d2ff6f --- /dev/null +++ b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/HackerRank/Tip 4.md @@ -0,0 +1,8 @@ +## Use Language Reference Materials + +If using Python, include any docs, references, or shortcuts you may need as a syntax cheat sheet here: + + +Links for python references and methods & [tutorials](https://realtoughcandy.io/courses/1755860/lectures/40270341) + +A lot of references can also be found [here](https://pythonawesome.com/a-python-markdown-parser-that-syntax-plugins-and-high-speed/) \ No newline at end of file diff --git a/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/HackerRank/Tip 5.md b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/HackerRank/Tip 5.md new file mode 100644 index 0000000..6418bf1 --- /dev/null +++ b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/HackerRank/Tip 5.md @@ -0,0 +1,2 @@ +## Do the easy questions first. +Rank in terms of difficulty: \ No newline at end of file diff --git a/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/HackerRank/Tip 6.md b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/HackerRank/Tip 6.md new file mode 100644 index 0000000..dc766a9 --- /dev/null +++ b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/HackerRank/Tip 6.md @@ -0,0 +1,2 @@ +## Start doing the easiest solution first +Even if it's not the optimized or right solution, know that this is the easiest way and that you at least have some process thought of for that \ No newline at end of file diff --git a/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/HackerRank/Tip 7.md b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/HackerRank/Tip 7.md new file mode 100644 index 0000000..4492b26 --- /dev/null +++ b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/HackerRank/Tip 7.md @@ -0,0 +1,2 @@ +## TAKE the Sample Test! +Gives a good estimate of how the real one may go! Get yourself used to the environment and time constraints: \ No newline at end of file diff --git a/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/More tips + Basic steps of an algorithm.md b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/More tips + Basic steps of an algorithm.md new file mode 100644 index 0000000..9b3fac3 --- /dev/null +++ b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/More tips + Basic steps of an algorithm.md @@ -0,0 +1,119 @@ + +**Basic steps for an algorithm:** + + input → instructions → execution → output → termination + +--- + + + +[These](https://www.jjinux.com/2022/08/python-my-favorite-python-tricks-for.html) are more leetCode tips and tricks for [python](obsidian://open?vault=Coding%20Tips&file=Python%2FWelcome%20to%20Python): + 1. Using help() + 2. Using enumerate() + 3. Using items() + 4. Using [] vs. get() + 5. Range() is smarter than you think + 6. Print(f'') debugging + 7. For else + 8. Using a list as a stack + 9. sort() vs. sorted() + 10. Using deque + 11. Set and fronzenset + 12. Using a stack instead of recusion + 13. Using yield from + 14. Pre-intialize your list + 15. collections.Counter() + 16. Using defaultdict() + 17. Using heapq + 18. Use biset for binary search + 19. Using namedtuple and dataclasses + 20. Using closures + 21. Using match statement + 22. Using OrderedDict + 23. Using @functools.cache + 24. Debugging ListNodes + 25. Saving memory with the array module + 26. Using an exception for the success case rather than the error case + 27. Using VSCode, etc. + +--- + + +[This youtube](https://www.youtube.com/watch?v=KLlXCFG5TnA&list=PLot-Xpze53ldVwtstag2TL4HQhAnC8ATf) series offers great explanations of how to do each kind of problem! +Amazon follows a similar pattern for testing, and the questions may change according to what position you’re interested in. For a software engineer, you’ll have a coding round of three to four questions, varying from easy to medium difficulty. Then you’ll undergo an aptitude and psychometric round. + +Amazon’s online coding assessment includes these topics: + +- Number theory + +- Greedy algorithm + +- Binary search + +- Dynamic programming + +- Divide and conquer + +- Hash tables, maps, trees + +- Graph algorithm + + +### Tips And Tricks To Help You Prepare + +It helps candidates to have a strong skill set in data structure and algorithms. Although not required, Amazon offers support in multiple languages, so being bilingual might make you stand out from the crowd. + +There are many ways to apply to Amazon, whether on campus, via referral, or through a coding contest. Practice all the important topics previously listed in LeetCode (more about LeetCode is explained below). Try to complete 30 to 40 questions from each topic to make sure you have a broad range of knowledge and are prepared for anything. + +The questions for this assessment can be difficult. But if you dedicate three to four months in advance, you’ll optimize your coding skills. With the right preparation, the test will be easier. Be familiar with coding platforms, practice on popular sites, and also check questions from previous interviews. + + + + +--- + + +## Preparation strategy Amazon Online Coding Test + +Do practise all the important topics given before and also strategy practising from Leetcode. Ideally, there is no number but you can try practising 30-40 questions from each topic and it will be enough for most of the hiring challenges. + + + +### Five Things that Amazon Is Measuring Using the Online Coding Test + +- Problem Statement Retention: can you read a coding problem and understand what it’s asking? + +- Coding Ability: can you understand the problem, figure out an efficient solution, and then translate the solution into an accurate code? + +- Data Structure Application: can you take a problem and apply an appropriate data structure to solve the problem in the simplest way? Do you know when to use a list/map/set/etc.? + +- Runtime Complexity: can you go over your own code and assess what runtime complexity and major issues it might have? + +- Simplification: can you create a simple solution to a complicated problem, in a way that most people would understand? + + +### Two Things That Amazon Is NOT Testing On This Online Coding Round + +1. Deep Knowledge of a Specific Language: you can code in any language that you feel comfortable with and Amazon won’t be testing your expertise in specific languages. + +2. Purposefully Confusing or Tricky Questions: the coding problems are straightforward and are not intended to trick you in any way. + + +Amazon is interested in your demonstration of problem-solving, writing correct code, applying patterns, data structures and algorithms, and optimizing for algorithmic performance on the tests. + +*Note: As of 2022, Amazon removed the coding approach questionnaire and debugging questions parts. + + + +### How to Prepare for the Amazon Coding Assessment? + +When preparing for the online coding test, focus on these four areas: + +- Algorithms: Basic Searching, Basic Sorting, Tree Traversal, Graph Traversal. + +- Data Structures: Heaps, linked lists, arrays, trees (especially binary trees), hash tables, stacks, and recursion. + +- Fundamentals: Go back and re-educate yourself on all data structures and data structure algorithms. Understand all time and space complexity. Make sure you even get into more unique things, like hashmaps, b+trees (and variants), and caches (and associated algorithms). + + +Understand high-scale architecture: Go look at how other big sites are structured \ No newline at end of file diff --git a/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/Amazon Robot Python problem 1.md b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/Amazon Robot Python problem 1.md new file mode 100644 index 0000000..dfa711b --- /dev/null +++ b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/Amazon Robot Python problem 1.md @@ -0,0 +1,99 @@ +Robot problem (most frequently asked) + +**Remember:** think of each problem when you are coding them like a story. You have to explain to yourself where you are in the story and if it helps to write it down then please do that as well. You will have to create and author the story as you go of course. Retell it in the way that it makes most sense for you. + +##### Revisiting the [Robot ](https://colab.research.google.com/drive/1N6CVDK8RDLCw51gS-qTRMVTM2LUAoUSd)Problem +Think about the way you would first tackle this problem and use the 6 tips to quickly devise the answer. + +Find a way to retell this problem as quickly as you can - a robot is at the origin of a coordinate map (0,0 + Y axis + N+1 + X Axis W -1 R(0,0) E +2 + S -1 + +Instructions: +G: go straight 1 +L: turn anti-clockwise 90 degrees +R: turn clockwise 90 degrees + +Robot performs the instructions in order and keeps looping those same instructions. +Return true iff there is a circle s.t. iff the robot can never leave the circle +(return true if the robot is iterating the same way in circle instruction set and doesnt not stop following circle instructions) +^ that would be the base case. + +circle equation: x^2 + y^2 = r^2 + +given a point (h, k) that the robot is now in +update the circle equation. +circle equation gets updated: (x-h)^2 +(y-k)^2 = r^2 + +how to check if there is a circle: if coordinates x, y, h, k, r are any of the coordinates. + +an example input may be: "GGLGG" +true --> check for circle +example: GG +false --> not for cicle + +GL --> true +W --> true + +for the (0,0) case +x^2 + y^2 = r^2 +if x + +c = [i,k] + +input = [] +for r in input[i,k] + if "G": + c[1] = +2 + if L: + c[0] = -1 + if R: + c[0] = +1 +if r = 0 + return true +else + continue. + +---- +Solution: You were on the right track but have to practice with syntax more. +a directions array needs to be intiialized with: +``` +directions = [(0,1),(1,0)(0,-1)(-1,0)] +``` + +each time G, L, or R called the direction and then x,y coordiante as well as d is also updated +but first make sure to set them to 0. +``` +x = 0 +y = 0 +d = 0 +``` + +your for loop was pretty much spot on but here is the appropriate syntax for that in python. + +``` +for instruction in instructions: + if instruction == 'G': + x += direction[d][0] + y += directions[d][1] +//the base case is north, G + + if instruction == 'L': + d = (d+3) % 4 + + else: + d = (d+1) %4 + +//this makes sense. you will only be calling a reference to any of the directions if you are actually going forward one of the four coordinates aka the G. otherwise you are simily just updating d. + +return (x,y) == (0,0) or d > 0 + +``` +This will mean that ultimately the coordinate will return to (x,y) or that the direction will continue being greater than +the syntax for it to return a boolean is by giving it this kind of definition +``` + def isRobotBounded(self, instructions:str) -> bool: +``` + diff --git a/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/Apple - Daily Coding Problem_ Problem #53 [Medium].pdf b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/Apple - Daily Coding Problem_ Problem #53 [Medium].pdf new file mode 100644 index 0000000..8738a67 Binary files /dev/null and b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/Apple - Daily Coding Problem_ Problem #53 [Medium].pdf differ diff --git a/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/Apple medium Daily Coding Problem_ Problem #53 [Medium].pdf b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/Apple medium Daily Coding Problem_ Problem #53 [Medium].pdf new file mode 100644 index 0000000..c53dc54 Binary files /dev/null and b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/Apple medium Daily Coding Problem_ Problem #53 [Medium].pdf differ diff --git a/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/Daily Coding Problem: Problem #26 [Medium].pdf b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/Daily Coding Problem: Problem #26 [Medium].pdf new file mode 100644 index 0000000..e599d32 Binary files /dev/null and b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/Daily Coding Problem: Problem #26 [Medium].pdf differ diff --git a/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/Dropbox hardDaily Coding Problem_ Problem #54 [Hard].pdf b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/Dropbox hardDaily Coding Problem_ Problem #54 [Hard].pdf new file mode 100644 index 0000000..0d69a5f Binary files /dev/null and b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/Dropbox hardDaily Coding Problem_ Problem #54 [Hard].pdf differ diff --git a/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/How to solve a hard programming question.md b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/How to solve a hard programming question.md new file mode 100644 index 0000000..98ffed8 --- /dev/null +++ b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/How to solve a hard programming question.md @@ -0,0 +1,101 @@ +So let's go over the thought process for solving tricky coding interview questions. I often find it's not enough to just be able to solve the problem; you really need to vocalize your thought process. This shows that you're a strong communicator and that you didn't just get lucky solving this one particular problem. + +The question we'll work through is the following: return a new sorted merged list from K sorted lists, each with size N. Before we move on any further, you should take some time to think about the solution! + +1. First, go through an example. This buys time, makes sure you understand the problem, and lets you gain some intuition for the problem. For example, if we had [[10, 15, 30], [12, 15, 20], [17, 20, 32]], the result should be [10, 12, 15, 15, 17, 20, 20, 30, 32]. + +2. Next, give any solution you can think of (even if it's brute force). It seems obvious that if we just flattened the lists and sorted it, we would get the answer we want. The time complexity for that would be O(KN log KN), since we have K * N total elements. + +3. The third step is to think of pseudocode—a high-level solution for the problem. This is where we explore different solutions. The things we are looking for are better space/time complexities but also the difficulty of the implementation. You should be able to finish the solution in 30 minutes. Here, we can see that we only need to look at K elements in each of the lists to find the smallest element initially. Heaps are great for finding the smallest element. Let's say the smallest element is E. Once we get E, we know we're interested in only the next element of the list that held E. Then we'd extract out the second smallest element and etc. The time complexity for this would be O(KN log K), since we remove and append to the heap K * N times. + +4. Initialize the heap. In Python this this is just a list. We need K tuples. One for the index for which list among the list of lists the element lives; one for the element index which is where the element lives; and the value of the element. Since we want the key of the heap to be based on the value of the element, we should put that first in the tuple. + +5. While the heap is not empty we need to: + + +- Extract the minimum element from the heap: (value, list index, element index) + +- If the element index is not at the last index, add the next tuple in the list index. + + +4. Write the actual code. Ideally, at this point, it should be clear how the code should look like. Here's one example: + +```jupyter +def merge(lists): + + merged_list = [] + + + + heap = [(lst[0], i, 0) for i, lst in enumerate(lists) if lst] + + heapq.heapify(heap) + + + + while heap: + + val, list_ind, element_ind = heapq.heappop(heap) + + + + merged_list.append(val) + + + + if element_ind + 1 < len(lists[list_ind]): + + next_tuple = (lists[list_ind][element_ind + 1], + + list_ind, + + element_ind + 1) + + heapq.heappush(heap, next_tuple) + + return merged_list + + ``` + + + +5. Think of test cases and run them through your interviewer. This shows that you're willing to test your code and ensure it's robust. I like to think of happy cases and edge cases. Our original example would be a happy case. Edge cases might be. + + +- lists is []. + +- lists only contains empty lists: [[], [], []]. + +- lists contains empty lists and non-empty lists: [[], [1], [1,2]]. + +- lists contains one list with one element: [[1]]. + +- lists contains lists of varying size: [[1], [1, 3, 5], [1, 10, 20, 30, 40]]. + + +7. Finally, the interviewer should ask some follow-up questions. One common question is: what other solutions are there? There's actually another relatively simple solution that would use a divide-and-conquer strategy. We could recursively merge each half of the lists and then combine the two lists. This would have the same asymptotic complexities but would require more "real" memory and time. + + +Doing all these steps will definitely help you crystallize your thought process, grasp the problem better, and show that you are a strong communicator and help you land that job offer! + + + +And companies like Google, hire developers based on the same skills. So if you’re a coding enthusiast  hunting for that dream job, the Google Coding Challenge is just the thing for you. + +Here are some of the best methods and techniques to practice for Google coding challenges: + +- Practice coding problems every day for at least a month leading up to the challenge. + +- Get comfortable with the platforms used for these challenges. + +- Pick an object-oriented programming language. You must be able to code algorithms in Python, C++, or Java. + +- Use platforms like Leetcode, TopCoder, and CodeChef to expose yourself to a wide range of programming problems. + + +Still not sure where to start? + +Here’s a comprehensive guide about [Google Coding Challenge and how it could land you your next dream job: Read Now](https://d1khqf04.na1.hubspotlinks.com/Ctc/GF+113/d1KhQf04/VVv7Hx8XF4zBW89cr8l8nHcHWW8hW1h34KP4h2N4FBQMt3hwqkV1-WJV7CgCYGW81ZQWP2l16flW4RMHYs2YXTx4N5GJKzTxvdNrW8kW3rh5WpLJMW36FxxL1pTf2KW9lLhH-96yht2W2JYyfm1099FpW6BznN92wswLyW8lFJMv3xdXNYVcNKQ-3ZRfPVW8jqx5t76Tz4cW2jTHpM4nM_--N829J14w5_P3N836ZZ5N_CH3F4bzpMZC8RbW3CF5W62NdbzyW7_T5M51fJZGhW5Hd4Fn63_KnLW50LCrc2RFcYmW9kt5fF5ns-_YW7hxdxR8DQ8h1Vqc1SR5rm-qrW4DJdZf7jvPLlW8H52QL7vWb8WW9gYppp6Wp4HTW3_8c692WqP1v32mL1) + +Happy Coding! + diff --git a/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/Microsoft Daily Coding Problem_ Problem #55 [Easy].pdf b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/Microsoft Daily Coding Problem_ Problem #55 [Easy].pdf new file mode 100644 index 0000000..d9dcfee Binary files /dev/null and b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/Microsoft Daily Coding Problem_ Problem #55 [Easy].pdf differ diff --git a/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/Microsoft medium Daily Coding Problem_ Problem #50 [Easy].pdf b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/Microsoft medium Daily Coding Problem_ Problem #50 [Easy].pdf new file mode 100644 index 0000000..5d9f315 Binary files /dev/null and b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/Microsoft medium Daily Coding Problem_ Problem #50 [Easy].pdf differ diff --git a/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/amazon/Amazon Daily Coding Problem_ Problem #46 [Hard].pdf b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/amazon/Amazon Daily Coding Problem_ Problem #46 [Hard].pdf new file mode 100644 index 0000000..86b7293 Binary files /dev/null and b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/amazon/Amazon Daily Coding Problem_ Problem #46 [Hard].pdf differ diff --git a/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/amazon/Amazon Daily Coding Problem_ Problem #58 [Medium].pdf b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/amazon/Amazon Daily Coding Problem_ Problem #58 [Medium].pdf new file mode 100644 index 0000000..7ad7c06 Binary files /dev/null and b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/amazon/Amazon Daily Coding Problem_ Problem #58 [Medium].pdf differ diff --git a/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/amazon/Amazon Medium Daily Coding Problem_ Problem #57 [Medium].pdf b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/amazon/Amazon Medium Daily Coding Problem_ Problem #57 [Medium].pdf new file mode 100644 index 0000000..5f681ec Binary files /dev/null and b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/amazon/Amazon Medium Daily Coding Problem_ Problem #57 [Medium].pdf differ diff --git a/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/amazon/Amazon Problem #29 [Easy].pdf b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/amazon/Amazon Problem #29 [Easy].pdf new file mode 100644 index 0000000..7527984 Binary files /dev/null and b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/amazon/Amazon Problem #29 [Easy].pdf differ diff --git a/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/amazon/Amazon easy Daily Coding Problem_ Problem #43 [Easy].pdf b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/amazon/Amazon easy Daily Coding Problem_ Problem #43 [Easy].pdf new file mode 100644 index 0000000..8f4454a Binary files /dev/null and b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/amazon/Amazon easy Daily Coding Problem_ Problem #43 [Easy].pdf differ diff --git a/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/amazon/Amazon hard Daily Coding Problem_ Problem #46 [Hard].pdf b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/amazon/Amazon hard Daily Coding Problem_ Problem #46 [Hard].pdf new file mode 100644 index 0000000..0ad4b2b Binary files /dev/null and b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/amazon/Amazon hard Daily Coding Problem_ Problem #46 [Hard].pdf differ diff --git a/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/amazon/Amazon medium Daily Coding Problem_ Problem #49 [Medium].pdf b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/amazon/Amazon medium Daily Coding Problem_ Problem #49 [Medium].pdf new file mode 100644 index 0000000..ba919ee Binary files /dev/null and b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/amazon/Amazon medium Daily Coding Problem_ Problem #49 [Medium].pdf differ diff --git a/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/amazon/Hard. Amazon Daily Coding Problem_ Problem #46 [Hard].pdf b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/amazon/Hard. Amazon Daily Coding Problem_ Problem #46 [Hard].pdf new file mode 100644 index 0000000..3a0c66d Binary files /dev/null and b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/amazon/Hard. Amazon Daily Coding Problem_ Problem #46 [Hard].pdf differ diff --git a/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/amazon/MAIN coding problems .pdf b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/amazon/MAIN coding problems .pdf new file mode 100644 index 0000000..d933896 Binary files /dev/null and b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/amazon/MAIN coding problems .pdf differ diff --git a/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/amazon/easy amazon Daily Coding Problem_ Problem #43 [Easy].pdf b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/amazon/easy amazon Daily Coding Problem_ Problem #43 [Easy].pdf new file mode 100644 index 0000000..383e3af Binary files /dev/null and b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/amazon/easy amazon Daily Coding Problem_ Problem #43 [Easy].pdf differ diff --git a/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/easy. twosigma Daily Coding Problem_ Problem #45 [Easy].pdf b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/easy. twosigma Daily Coding Problem_ Problem #45 [Easy].pdf new file mode 100644 index 0000000..b20633d Binary files /dev/null and b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/easy. twosigma Daily Coding Problem_ Problem #45 [Easy].pdf differ diff --git a/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/facebook/Facebook Medium Daily Coding Problem_ Problem #51 [Medium].pdf b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/facebook/Facebook Medium Daily Coding Problem_ Problem #51 [Medium].pdf new file mode 100644 index 0000000..3b8c583 Binary files /dev/null and b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/facebook/Facebook Medium Daily Coding Problem_ Problem #51 [Medium].pdf differ diff --git a/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/facebook/Facebook medium Daily Coding Problem_ Problem #60 [Medium].pdf b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/facebook/Facebook medium Daily Coding Problem_ Problem #60 [Medium].pdf new file mode 100644 index 0000000..5db3b2a Binary files /dev/null and b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/facebook/Facebook medium Daily Coding Problem_ Problem #60 [Medium].pdf differ diff --git a/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/facebook/facebook - Daily Coding Problem_ Problem #51 [Medium].pdf b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/facebook/facebook - Daily Coding Problem_ Problem #51 [Medium].pdf new file mode 100644 index 0000000..64d835d Binary files /dev/null and b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/facebook/facebook - Daily Coding Problem_ Problem #51 [Medium].pdf differ diff --git a/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/fb Daily Coding Problem: Problem #25 [Hard].pdf b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/fb Daily Coding Problem: Problem #25 [Hard].pdf new file mode 100644 index 0000000..e2a43e3 Binary files /dev/null and b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/fb Daily Coding Problem: Problem #25 [Hard].pdf differ diff --git a/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/google/ Daily Coding Problem_ Problem #37 [Easy].pdf b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/google/ Daily Coding Problem_ Problem #37 [Easy].pdf new file mode 100644 index 0000000..634fcd0 Binary files /dev/null and b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/google/ Daily Coding Problem_ Problem #37 [Easy].pdf differ diff --git a/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/google/Google Daily Coding Problem_ Problem #44 [Medium].pdf b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/google/Google Daily Coding Problem_ Problem #44 [Medium].pdf new file mode 100644 index 0000000..4e48b5a Binary files /dev/null and b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/google/Google Daily Coding Problem_ Problem #44 [Medium].pdf differ diff --git a/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/google/Google LRU Daily Coding Problem_ Problem #52 [Hard].pdf b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/google/Google LRU Daily Coding Problem_ Problem #52 [Hard].pdf new file mode 100644 index 0000000..ed246c5 Binary files /dev/null and b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/google/Google LRU Daily Coding Problem_ Problem #52 [Hard].pdf differ diff --git a/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/google/Google Medium Daily Coding Problem_ Problem #56 [Medium].pdf b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/google/Google Medium Daily Coding Problem_ Problem #56 [Medium].pdf new file mode 100644 index 0000000..c74fc9d Binary files /dev/null and b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/google/Google Medium Daily Coding Problem_ Problem #56 [Medium].pdf differ diff --git a/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/google/Google medium Daily Coding Problem_ Problem #48 [Medium].pdf b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/google/Google medium Daily Coding Problem_ Problem #48 [Medium].pdf new file mode 100644 index 0000000..2a3f72b Binary files /dev/null and b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/google/Google medium Daily Coding Problem_ Problem #48 [Medium].pdf differ diff --git a/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/google/LRU Cache.pdf b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/google/LRU Cache.pdf new file mode 100644 index 0000000..b1cc9cd Binary files /dev/null and b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/google/LRU Cache.pdf differ diff --git a/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/google/New York Institute of Technology Mail - Daily Coding Problem_ Problem #59 [Hard].pdf b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/google/New York Institute of Technology Mail - Daily Coding Problem_ Problem #59 [Hard].pdf new file mode 100644 index 0000000..8f2e680 Binary files /dev/null and b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/google/New York Institute of Technology Mail - Daily Coding Problem_ Problem #59 [Hard].pdf differ diff --git a/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/google/google coding problems .pdf b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/google/google coding problems .pdf new file mode 100644 index 0000000..8794b8a Binary files /dev/null and b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/google/google coding problems .pdf differ diff --git a/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/google/medium google. Daily Coding Problem_ Problem #44 [Medium].pdf b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/google/medium google. Daily Coding Problem_ Problem #44 [Medium].pdf new file mode 100644 index 0000000..baf7a5f Binary files /dev/null and b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/google/medium google. Daily Coding Problem_ Problem #44 [Medium].pdf differ diff --git a/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/group 1/Amazon - LeetCode.pdf b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/group 1/Amazon - LeetCode.pdf new file mode 100644 index 0000000..9e2e6fc Binary files /dev/null and b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/group 1/Amazon - LeetCode.pdf differ diff --git a/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/group 1/An Introduction To Backtracking.pdf b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/group 1/An Introduction To Backtracking.pdf new file mode 100644 index 0000000..17f662b Binary files /dev/null and b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/group 1/An Introduction To Backtracking.pdf differ diff --git a/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/group 1/Daily Coding Problem_ Problem #19 [Medium].pdf b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/group 1/Daily Coding Problem_ Problem #19 [Medium].pdf new file mode 100644 index 0000000..27344de Binary files /dev/null and b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/group 1/Daily Coding Problem_ Problem #19 [Medium].pdf differ diff --git a/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/group 1/Daily Coding Problem_ Problem #21 [Easy].pdf b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/group 1/Daily Coding Problem_ Problem #21 [Easy].pdf new file mode 100644 index 0000000..8346fba Binary files /dev/null and b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/group 1/Daily Coding Problem_ Problem #21 [Easy].pdf differ diff --git a/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/group 1/Daily Coding Problem_ Problem #22 [Medium].pdf b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/group 1/Daily Coding Problem_ Problem #22 [Medium].pdf new file mode 100644 index 0000000..9be402c Binary files /dev/null and b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/group 1/Daily Coding Problem_ Problem #22 [Medium].pdf differ diff --git a/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/group 2/Facebook practice problem[easy].pdf b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/group 2/Facebook practice problem[easy].pdf new file mode 100644 index 0000000..0462468 Binary files /dev/null and b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/group 2/Facebook practice problem[easy].pdf differ diff --git a/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/group 2/How to Pick a Random Element from an Infinite Stream.pdf b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/group 2/How to Pick a Random Element from an Infinite Stream.pdf new file mode 100644 index 0000000..83f9890 Binary files /dev/null and b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/group 2/How to Pick a Random Element from an Infinite Stream.pdf differ diff --git a/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/group 2/Palantir Coding Problem.pdf b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/group 2/Palantir Coding Problem.pdf new file mode 100644 index 0000000..aabce80 Binary files /dev/null and b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/group 2/Palantir Coding Problem.pdf differ diff --git a/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/group 3/Problem #31 [Easy].pdf b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/group 3/Problem #31 [Easy].pdf new file mode 100644 index 0000000..ad33a94 Binary files /dev/null and b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/group 3/Problem #31 [Easy].pdf differ diff --git a/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/group 3/binary tree problem.pdf b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/group 3/binary tree problem.pdf new file mode 100644 index 0000000..c341091 Binary files /dev/null and b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/group 3/binary tree problem.pdf differ diff --git a/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/group 3/google hard problem2.pdf b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/group 3/google hard problem2.pdf new file mode 100644 index 0000000..615469f Binary files /dev/null and b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/group 3/google hard problem2.pdf differ diff --git a/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/group 3/google problem hard.pdf b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/group 3/google problem hard.pdf new file mode 100644 index 0000000..fd70a10 Binary files /dev/null and b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/group 3/google problem hard.pdf differ diff --git a/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/group 3/google problem.pdf b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/group 3/google problem.pdf new file mode 100644 index 0000000..3a0092d Binary files /dev/null and b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/Practice Problems/group 3/google problem.pdf differ diff --git a/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/ipynb practice problems/Notebook code/K Closest Points to Origin(973).ipynb b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/ipynb practice problems/Notebook code/K Closest Points to Origin(973).ipynb new file mode 100644 index 0000000..246d78a --- /dev/null +++ b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/ipynb practice problems/Notebook code/K Closest Points to Origin(973).ipynb @@ -0,0 +1 @@ +{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"name":"K Closest Points to Origin(973).ipynb","provenance":[],"authorship_tag":"ABX9TyPPXwejMq9b9je8LJjGDe8j"},"kernelspec":{"name":"python3","display_name":"Python 3"},"language_info":{"name":"python"}},"cells":[{"cell_type":"markdown","source":["# 973. K Closest Points to Origin\n","Medium\n","5755\n","212\n","Add to List\n","Share\n","Given an array of points where points[i] = [xi, yi] represents a point on the X-Y plane and an integer k, return the k closest points to the origin (0, 0).\n","The distance between two points on the X-Y plane is the Euclidean distance (i.e., √(x1 - x2)2 + (y1 - y2)2).\n","You may return the answer in any order. The answer is guaranteed to be unique (except for the order that it is in).\n"," \n","Example 1:\n","\n","Input: points = [[1,3],[-2,2]], k = 1\n","Output: [[-2,2]]\n","Explanation:\n","The distance between (1, 3) and the origin is sqrt(10).\n","The distance between (-2, 2) and the origin is sqrt(8).\n","Since sqrt(8) < sqrt(10), (-2, 2) is closer to the origin.\n","We only want the closest k = 1 points from the origin, so the answer is just [[-2,2]].\n","\n","Example 2:\n","Input: points = [[3,3],[5,-1],[-2,4]], k = 2\n","Output: [[3,3],[-2,4]]\n","Explanation: The answer [[-2,4],[3,3]] would also be accepted.\n","\n"," \n","Constraints:\n","1 <= k <= points.length <= 104\n","-104 < xi, yi < 104\n"],"metadata":{"id":"x-sKjh1g1iNk"}},{"cell_type":"code","execution_count":null,"metadata":{"id":"x8F1f23v1g8y"},"outputs":[],"source":["# https://developers.google.com/maps/documentation/javascript/reference/marker"]}]} \ No newline at end of file diff --git a/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/ipynb practice problems/Notebook code/LRU Cache(146).ipynb b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/ipynb practice problems/Notebook code/LRU Cache(146).ipynb new file mode 100644 index 0000000..1a4357e --- /dev/null +++ b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/ipynb practice problems/Notebook code/LRU Cache(146).ipynb @@ -0,0 +1 @@ +{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"name":"LRU Cache(146).ipynb","provenance":[],"authorship_tag":"ABX9TyOsmw23tcD/vN9IF7r+SVvQ"},"kernelspec":{"name":"python3","display_name":"Python 3"},"language_info":{"name":"python"}},"cells":[{"cell_type":"markdown","source":["#Problem 146.: LRU Cache \n","\n","Design a data structure that follows the constraints of a Least Recently Used (LRU) cache.\n","Implement the LRUCache class:\n","LRUCache(int capacity)Initialize the LRU cache with positive size capacity.\n","int get(int key) Return the value of the key if the key exists, otherwise return -1.\n","void put(int key, int value) Update the value of the key if the key exists. Otherwise, add the key-value pair to the cache. If the number of keys exceeds the capacity from this operation, evict the least recently used key.\n","The functions get and put must each run in O(1) average time complexity.\n"," \n","Example 1:\n","Input\n","[\"LRUCache\", \"put\", \"put\", \"get\", \"put\", \"get\", \"put\", \"get\", \"get\", \"get\"]\n","[[2], [1, 1], [2, 2], [1], [3, 3], [2], [4, 4], [1], [3], [4]]\n","Output\n","[null, null, null, 1, null, -1, null, -1, 3, 4]\n","\n","Explanation\n","LRUCache lRUCache = new LRUCache(2);\n","lRUCache.put(1, 1); // cache is {1=1}\n","lRUCache.put(2, 2); // cache is {1=1, 2=2}\n","lRUCache.get(1); // return 1\n","lRUCache.put(3, 3); // LRU key was 2, evicts key 2, cache is {1=1, 3=3}\n","lRUCache.get(2); // returns -1 (not found)\n","lRUCache.put(4, 4); // LRU key was 1, evicts key 1, cache is {4=4, 3=3}\n","lRUCache.get(1); // return -1 (not found)\n","lRUCache.get(3); // return 3\n","lRUCache.get(4); // return 4\n","\n"," \n","Constraints:\n","1 <= capacity <= 3000\n","0 <= key <= 104\n","0 <= value <= 105\n","At most 2 * 105 calls will be made to get and put.\n"],"metadata":{"id":"_crI8_Sa9Zcp"}},{"cell_type":"code","execution_count":null,"metadata":{"id":"juGQYQmA9PNr"},"outputs":[],"source":[""]}]} \ No newline at end of file diff --git a/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/ipynb practice problems/Notebook code/Maximum Units on a Truck(1710).ipynb b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/ipynb practice problems/Notebook code/Maximum Units on a Truck(1710).ipynb new file mode 100644 index 0000000..7a31eea --- /dev/null +++ b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/ipynb practice problems/Notebook code/Maximum Units on a Truck(1710).ipynb @@ -0,0 +1 @@ +{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"name":"Maximum Units on a Truck(1710).ipynb","provenance":[],"authorship_tag":"ABX9TyMPa7aHf8gizP2bmfNeQt6/"},"kernelspec":{"name":"python3","display_name":"Python 3"},"language_info":{"name":"python"}},"cells":[{"cell_type":"markdown","source":["# 1710. Maximum Units on a Truck\n","Easy\n","\n","You are assigned to put some amount of boxes onto one truck. You are given a 2D array boxTypes, where boxTypes[i] = [numberOfBoxesi, numberOfUnitsPerBoxi]:\n","numberOfBoxesi is the number of boxes of type i.\n","numberOfUnitsPerBoxi is the number of units in each box of the type i.\n","You are also given an integer truckSize, which is the maximumnumber of boxes that can be put on the truck. You can choose any boxes to put on the truck as long as the number of boxes does not exceed truckSize.\n","Return the maximum total number of units that can be put on the truck.\n"," \n","Example 1:\n","Input: boxTypes = [[1,3],[2,2],[3,1]], truckSize = 4\n","Output: 8\n","Explanation: There are:\n","- 1 box of the first type that contains 3 units.\n","- 2 boxes of the second type that contain 2 units each.\n","- 3 boxes of the third type that contain 1 unit each.\n","You can take all the boxes of the first and second types, and one box of the third type.\n","The total number of units will be = (1 * 3) + (2 * 2) + (1 * 1) = 8.\n","\n","Example 2:\n","Input: boxTypes = [[5,10],[2,5],[4,7],[3,9]], truckSize = 10\n","Output: 91\n","\n"," \n","Constraints:\n","1 <= boxTypes.length <= 1000\n","1 <= numberOfBoxesi, numberOfUnitsPerBoxi <= 1000\n","1 <= truckSize <= 106\n"],"metadata":{"id":"p9Gx6G8X_G0Q"}},{"cell_type":"code","execution_count":null,"metadata":{"id":"UOjK-p2dXAkF"},"outputs":[],"source":["class Solution:\n"," def maximumUnits(self, B: List[List[int]], T: int) -> int:\n"," B.sort(key=lambda x: x[1], reverse=True)\n"," ans = 0\n"," for b,n in B:\n"," boxes = min(b, T)\n"," ans += boxes * n\n"," T -= boxes\n"," if T == 0: return ans\n"," return ans\n","\n"," "]},{"cell_type":"code","source":[""],"metadata":{"id":"w_e4D3vcVO8M"},"execution_count":null,"outputs":[]}]} \ No newline at end of file diff --git a/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/ipynb practice problems/Notebook code/Merge Intervals(56).ipynb b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/ipynb practice problems/Notebook code/Merge Intervals(56).ipynb new file mode 100644 index 0000000..e806c5c --- /dev/null +++ b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/ipynb practice problems/Notebook code/Merge Intervals(56).ipynb @@ -0,0 +1 @@ +{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"name":"Merge Intervals(56).ipynb","provenance":[],"authorship_tag":"ABX9TyPLNkDlxD68AxVO2CjjAmsW"},"kernelspec":{"name":"python3","display_name":"Python 3"},"language_info":{"name":"python"}},"cells":[{"cell_type":"markdown","source":["# 56. Merge Intervals\n","Medium\n","\n","Given an array of intervals where intervals[i] = [starti, endi], merge all overlapping intervals, and return an array of the non-overlapping intervals that cover all the intervals in the input.\n"," \n","Example 1:\n","Input: intervals = [[1,3],[2,6],[8,10],[15,18]]\n","Output: [[1,6],[8,10],[15,18]]\n","Explanation: Since intervals [1,3] and [2,6] overlap, merge them into [1,6].\n","\n","Example 2:\n","Input: intervals = [[1,4],[4,5]]\n","Output: [[1,5]]\n","Explanation: Intervals [1,4] and [4,5] are considered overlapping.\n","\n"," \n","Constraints:\n","1 <= intervals.length <= 104\n","intervals[i].length == 2\n","0 <= starti <= endi <= 104\n"],"metadata":{"id":"RVkPngGz960v"}},{"cell_type":"code","execution_count":null,"metadata":{"id":"UGH7xlpb95bU"},"outputs":[],"source":[""]}]} \ No newline at end of file diff --git a/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/ipynb practice problems/Notebook code/Number of Provinces (547).ipynb b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/ipynb practice problems/Notebook code/Number of Provinces (547).ipynb new file mode 100644 index 0000000..b7cca3d --- /dev/null +++ b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/ipynb practice problems/Notebook code/Number of Provinces (547).ipynb @@ -0,0 +1 @@ +{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"name":"Number of Provinces (547).ipynb","provenance":[],"authorship_tag":"ABX9TyPu1aY+cOeg5Poif8p8a8gH"},"kernelspec":{"name":"python3","display_name":"Python 3"},"language_info":{"name":"python"}},"cells":[{"cell_type":"markdown","source":["# Problem 547. Number of Provinces\n","\n","There are n cities. Some of them are connected, while some are not. If city ais connected directly with city b, and city b is connected directly with city c, then city a is connected indirectly with city c.\n","A province is a group of directly or indirectly connected cities and no other cities outside of the group.\n","You are given an n x n matrix isConnected where isConnected[i][j] = 1 if the ith city and the jth city are directly connected, and isConnected[i][j] = 0 otherwise.\n","Return the total number of provinces.\n"," \n","Example 1:\n","\n","Input: isConnected = [[1,1,0],[1,1,0],[0,0,1]]\n","Output: 2\n","\n","Example 2:\n","\n","Input: isConnected = [[1,0,0],[0,1,0],[0,0,1]]\n","Output: 3\n","\n"," \n","Constraints:\n","1 <= n <= 200\n","n == isConnected.length\n","n == isConnected[i].length\n","isConnected[i][j] is 1 or 0.\n","isConnected[i][i] == 1\n","isConnected[i][j] == isConnected[j][i]\n"],"metadata":{"id":"_1UGGadq9wNI"}},{"cell_type":"code","execution_count":null,"metadata":{"id":"xNWavXK-9pml"},"outputs":[],"source":[""]}]} \ No newline at end of file diff --git a/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/ipynb practice problems/Notebook code/Robot in a circle (1041).ipynb b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/ipynb practice problems/Notebook code/Robot in a circle (1041).ipynb new file mode 100644 index 0000000..395ea3f --- /dev/null +++ b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/ipynb practice problems/Notebook code/Robot in a circle (1041).ipynb @@ -0,0 +1 @@ +{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"name":"Robot in a circle (1041).ipynb","provenance":[],"mount_file_id":"1N6CVDK8RDLCw51gS-qTRMVTM2LUAoUSd","authorship_tag":"ABX9TyMfx0mRceDnoVgQg541ZY3a"},"kernelspec":{"name":"python3","display_name":"Python 3"},"language_info":{"name":"python"}},"cells":[{"cell_type":"markdown","source":["# 1041. Robot in a Circle\n","\n","On an infinite plane, a robot initially stands at (0, 0) and faces north. Note that:\n","The north direction is the positive direction of the y-axis.\n","The south direction is the negative direction of the y-axis.\n","The east direction is the positive direction of the x-axis.\n","The west direction is the negative direction of the x-axis.\n","The robot can receive one of three instructions:\n","\"G\": go straight 1 unit.\n","\"L\": turn 90 degrees to the left (i.e., anti-clockwise direction).\n","\"R\": turn 90 degrees to the right (i.e., clockwise direction).\n","The robot performs the instructionsgiven in order, and repeats them forever.\n","Return true if and only if there exists a circle in the plane such that the robot never leaves the circle.\n"," \n","Example 1:\n","Input: instructions = \"GGLLGG\"\n","Output: true\n","Explanation: The robot is initially at (0, 0) facing the north direction.\n","\"G\": move one step. Position: (0, 1). Direction: North.\n","\"G\": move one step. Position: (0, 2). Direction: North.\n","\"L\": turn 90 degrees anti-clockwise. Position: (0, 2). Direction: West.\n","\"L\": turn 90 degrees anti-clockwise. Position: (0, 2). Direction: South.\n","\"G\": move one step. Position: (0, 1). Direction: South.\n","\"G\": move one step. Position: (0, 0). Direction: South.\n","Repeating the instructions, the robot goes into the cycle: (0, 0) --> (0, 1) --> (0, 2) --> (0, 1) --> (0, 0).\n","Based on that, we return true.\n","\n","Example 2:\n","Input: instructions = \"GG\"\n","Output: false\n","Explanation: The robot is initially at (0, 0) facing the north direction.\n","\"G\": move one step. Position: (0, 1). Direction: North.\n","\"G\": move one step. Position: (0, 2). Direction: North.\n","Repeating the instructions, keeps advancing in the north direction and does not go into cycles.\n","Based on that, we return false.\n","\n","Example 3:\n","Input: instructions = \"GL\"\n","Output: true\n","Explanation: The robot is initially at (0, 0) facing the north direction.\n","\"G\": move one step. Position: (0, 1). Direction: North.\n","\"L\": turn 90 degrees anti-clockwise. Position: (0, 1). Direction: West.\n","\"G\": move one step. Position: (-1, 1). Direction: West.\n","\"L\": turn 90 degrees anti-clockwise. Position: (-1, 1). Direction: South.\n","\"G\": move one step. Position: (-1, 0). Direction: South.\n","\"L\": turn 90 degrees anti-clockwise. Position: (-1, 0). Direction: East.\n","\"G\": move one step. Position: (0, 0). Direction: East.\n","\"L\": turn 90 degrees anti-clockwise. Position: (0, 0). Direction: North.\n","Repeating the instructions, the robot goes into the cycle: (0, 0) --> (0, 1) --> (-1, 1) --> (-1, 0) --> (0, 0).\n","Based on that, we return true.\n","\n"," \n","Constraints:\n","1 <= instructions.length <= 100\n","instructions[i] is 'G', 'L'\n"],"metadata":{"id":"XiAC8FSd7ezE"}},{"cell_type":"code","execution_count":5,"metadata":{"id":"s3jO-ovb7K4m","executionInfo":{"status":"ok","timestamp":1656786251777,"user_tz":240,"elapsed":219,"user":{"displayName":"Shwetha Jayaraj","userId":"01455478857425759475"}}},"outputs":[],"source":["class Solution:\n"," def isRobotBounded(self, instructions: str) -> bool:\n"," x = 0\n"," y = 0\n"," d = 0\n"," directions = [(0, 1), (1, 0), (0, -1), (-1, 0)]\n","\n"," for instruction in instructions:\n"," if instruction == 'G':\n"," x += directions[d][0]\n"," y += directions[d][1]\n"," elif instruction == 'L':\n"," d = (d + 3) % 4\n"," else:\n"," d = (d + 1) % 4\n","\n"," return (x, y) == (0, 0) or d > 0\n"]}]} \ No newline at end of file diff --git a/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/ipynb practice problems/Notebook code/RunLengthEncoding.ipynb b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/ipynb practice problems/Notebook code/RunLengthEncoding.ipynb new file mode 100644 index 0000000..b58067d --- /dev/null +++ b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/ipynb practice problems/Notebook code/RunLengthEncoding.ipynb @@ -0,0 +1 @@ +{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"name":"RunLengthEncoding.ipynb","provenance":[],"authorship_tag":"ABX9TyPUnEszduwA02MLOUSNCrqj"},"kernelspec":{"name":"python3","display_name":"Python 3"},"language_info":{"name":"python"}},"cells":[{"cell_type":"markdown","source":["# Problem statement: Run-length encoding is a fast and simple method of encoding strings. The basic idea is to represent repeated successive characters as a single count and character. For example, the string \"AAAABBBCCDAA\" would be encoded as \"4A3B2C1D2A\".\n","Implement run-length encoding and decoding. You can assume the string to be encoded have no digits and consists solely of alphabetic characters. You can assume the string to be decoded is valid"],"metadata":{"id":"8CyZfl83RfPm"}},{"cell_type":"code","execution_count":34,"metadata":{"id":"4C8nYe_TRZFa","executionInfo":{"status":"ok","timestamp":1657480478655,"user_tz":240,"elapsed":206,"user":{"displayName":"Shwetha Jayaraj","userId":"01455478857425759475"}}},"outputs":[],"source":["def runlength(x):\n"," \n"," encoded = []\n"," count_lc=[i+1 for l in x]\n","\n"," for letter in enumerate(x, start=0):\n"," if letter == letter + 1: \n"," count_lc \n","\n"," print(count_lc + letter)\n"]},{"cell_type":"code","source":["runlength(\"AAALLLLNNN\")"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":294},"id":"Q3igp4nGU6oC","executionInfo":{"status":"error","timestamp":1657480487155,"user_tz":240,"elapsed":288,"user":{"displayName":"Shwetha Jayaraj","userId":"01455478857425759475"}},"outputId":"85f71018-5fc8-4b99-8fcb-66750db8ab4d"},"execution_count":35,"outputs":[{"output_type":"error","ename":"TypeError","evalue":"ignored","traceback":["\u001b[0;31m---------------------------------------------------------------------------\u001b[0m","\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)","\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mrunlength\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"AAALLLLNNN\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m","\u001b[0;32m\u001b[0m in \u001b[0;36mrunlength\u001b[0;34m(x)\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mcount_lc\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m+\u001b[0m\u001b[0;36m1\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mletter\u001b[0m \u001b[0;32min\u001b[0m \u001b[0menumerate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstart\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcount_lc\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mletter\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m","\u001b[0;31mTypeError\u001b[0m: can only concatenate list (not \"tuple\") to list"]}]},{"cell_type":"code","source":[""],"metadata":{"id":"WDQ_jbQ4fGUT"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["def solve(self, n):\n"," n = 5\n"," n = len(lst)\n"," lst = [i for i in len(range())]\n"," for i in range(lst):\n"," print(sum(i))"],"metadata":{"id":"r1d7p9i5jkiX","executionInfo":{"status":"ok","timestamp":1657514543697,"user_tz":240,"elapsed":162,"user":{"displayName":"Shwetha Jayaraj","userId":"01455478857425759475"}}},"execution_count":19,"outputs":[]},{"cell_type":"code","source":["last = \n","lst = [i +2 for in range(1,)]"],"metadata":{"id":"3m0HPpRgn4p4"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":["length = n #the amount of items in array\n","list = a"],"metadata":{"id":"Zvycj7-MwnIk"},"execution_count":null,"outputs":[]},{"cell_type":"code","source":[""],"metadata":{"id":"ghbZRMzWj0Is"},"execution_count":null,"outputs":[]}]} \ No newline at end of file diff --git a/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/ipynb practice problems/Notebook code/two singly linked lists intersect.ipynb b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/ipynb practice problems/Notebook code/two singly linked lists intersect.ipynb new file mode 100644 index 0000000..734e98a --- /dev/null +++ b/Careers/Potential and Future/60 careers/Amazon/Coding Assessment/ipynb practice problems/Notebook code/two singly linked lists intersect.ipynb @@ -0,0 +1 @@ +{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"name":"two singly linked lists intersect.ipynb","provenance":[],"authorship_tag":"ABX9TyNtgbtPO4eoV8gx9lU5WUwx"},"kernelspec":{"name":"python3","display_name":"Python 3"},"language_info":{"name":"python"}},"cells":[{"cell_type":"markdown","source":["Good morning! Here's your coding interview problem for today.\n","\n","This problem was asked by Google.\n","\n","Given two singly linked lists that intersect at some point, find the intersecting node. The lists are non-cyclical.\n","\n","For example, given A = 3 -> 7 -> 8 -> 10 and B = 99 -> 1 -> 8 -> 10, return the node with value 8.\n","\n","In this example, assume nodes with the same value are the exact same node objects.\n","\n","Do this in O(M + N) time (where M and N are the lengths of the lists) and constant space.\n","\n"],"metadata":{"id":"3G8FVIVZidWn"}},{"cell_type":"code","execution_count":null,"metadata":{"id":"WitH3QFMia6a"},"outputs":[],"source":[""]}]} \ No newline at end of file diff --git a/Careers/Potential and Future/60 careers/Java Application Engineer.md b/Careers/Potential and Future/60 careers/Java Application Engineer.md new file mode 100644 index 0000000..b4a646e --- /dev/null +++ b/Careers/Potential and Future/60 careers/Java Application Engineer.md @@ -0,0 +1,50 @@ +# Java Application Engineer + +[Here](https://app.sparkmailapp.com/web-share/-AzP-YyEyPW6CL2iFmU6HdOPt_5u8H_0MAh0zYyA) is the link to the email for you to reply to. + +--- + +## Description: +Hello +I am Aparna, a recruiter with **Pyramid Consulting, Inc.** a leading staffing organization. I came across your profile in one of the job boards and feel that your skills and professional experience would be a good fit for a position with one of our premier clients. Please review the job description below. If you are interested in this position please forward your updated resume for immediate consideration and preferred time to discuss this opportunity further. + +**Java/Application Support Engineer** +**Atlanta, GA/Remote** +**Fulltime role** + +Required Qualifications: +•     Bachelor’s degree or foreign equivalent required from an accredited institution. Will also consider three years of progressive experience in the specialty in lieu of every year of education +•     At least 4 years of Information Technology experience +•     At least 4 years of experience in Java & Unix Application Production Support with exposure to Financials Domain. +•     Experience in SDLC and ITIL +•     Experience of troubleshooting issues by analyzing Application logs. +•     Experience of any scripting language such as: Unix Scripting, Perl, etc. +•     Conduct L2/L3 support to the team where you will interface with key stakeholders and apply your technical proficiency across various aspects of application support for our client using various monitoring tools to perform fault analysis, failure avoidance and diagnosis and resolution for any impacting issues in a distributed environment. +•     Work closely with development and engineering team to provide input on new functionality and system performance, capacity management, monitoring and testing of infra upgrades and platform releases +•     Troubleshoot issues by analyzing Application logs + +Preferred Qualifications: +•     Experience with production support with exposure to Financial Domain is a plus +•     Excellent Communications and client interaction skills along with exceptional written and verbal skills as well as technical documentation +•     Extraordinary Planning, Project Management, Coordination, and Analytical skills +•     Hands-on experience in working in Global Delivery Model with onsite/offshore resources +•     Exceptional Organizational Skills +•     Ability to manage and prioritize tasks efficiently +•     Readiness to demonstrate a proactive attitude + +**Thanks and Regards,** +Aparna Chandra +Recruiter +Pyramid Consulting, Inc +3060 Kimball Bridge Rd Suite 200 +Alpharetta, GA +Email: [Aparna.Chandra@pyramidci.com](mailto:Aparna.Chandra@pyramidci.com); Desk: (804) 212-0912 +Web: [www.pyramidci.com](www.pyramidci.com) +USA | Canada | UK | India | Singapore + +**How am I doing? My goal is to provide you with excellent service. If you have questions, suggestions, feedback about your experience, or need to escalate an issue, feel free to mail at [FeedbackQC@pyramidci.com](mailto:FeedbackQC@pyramidci.com)** +If you are not looking for jobs, you can share this email with your friends/relatives who might get benefited. + +You have received this message because either you have contacted our Company to express interest in employment, or you have posted your Resume in an area accessible to recruiters or HR professionals, which implies an interest in being contacted regarding employment opportunities. + +If you would prefer to no longer receive any emails whatsoever from our Company, you may opt out at anytime by clicking [here](https://jobs.pyramidci.com/optout.jsp?d=39345f736a61796172616a406e7969742e656475&e=f2&t11=1658170741939). \ No newline at end of file diff --git a/Careers/Potential and Future/60 careers/Job Data Engineer.md b/Careers/Potential and Future/60 careers/Job Data Engineer.md new file mode 100644 index 0000000..fa7913c --- /dev/null +++ b/Careers/Potential and Future/60 careers/Job Data Engineer.md @@ -0,0 +1,76 @@ +# Job Data Engineer + +Here is the [link](https://app.sparkmailapp.com/web-share/K1ZE_i4i43hnfvZVaajkv8fvlte-M9JwkBjhv-Rb) to the email for you to reply to. + +--- + +## Description +Hello Shwetha Jayaraj + +My name is Khushi Gupta and I am a Staffing Specialist at MSR Cosmos . I am reaching out to you on an exciting job opportunity with one of our clients. + +Role: Data Engineer +Location: Remote (USA) + +Type : C2C +  +  +Who are we looking for?  +We are looking for a skilled and motivated Sr Spark Data Engineer, In this role, you'll bring advanced subject matter knowledge to solve complex business issues, and we'll look to your Spark data engineering subject matter expertise! In this role, you will frequently contribute to the development of new ideas and methods. You will also get to work on complex, interesting problems, where analysis of situations or data requires an in-depth evaluation of multiple factors. We'd love for you to provide expertise to functional project teams, and you may also participate in cross-functional initiatives. +  +Technical Skills:   +•    In this role, you'll bring advanced subject matter knowledge to solve complex business issues, and we'll look to your Spark data engineering subject matter expertise! +•    You will also get to work on complex, interesting problems, where analysis of situations or data requires an in-depth evaluation of multiple factors +•    We'll rely on your experience and expertise to provide direction and guidance to process improvements, including in helping to establish/advise on policies +•    development for complex, secure and performant data solutions and models, including design, analysis, coding, testing, and integration of structured/unstructured data +•    Ability to work as a Big Data Engineer as an individual contributor or team player +•    Mines data using modern tools and programming languages +•    Collaborates and communicates with project team regarding project progress and issue resolution +•    Communicates and drives data insights/innovation into the business +•    Builds and manages relationships throughout the organization +•    Ties insights into effective visualizations communicating business value and innovation potential +•    Manages relationships with business partners to evaluate and foster data driven innovation, provide domain-specific expertise in cross-organization projects/initiatives +•    Maintains proficiency within the data science domain by keeping up with technology and trend shifts +•    Contributes to industry data science domain initiatives +•    Represents the data science team for all phases of larger and more-complex development projects +•    Defines and implements models to uncover patterns and predictions creating business value and innovation +•    Provides guidance, training and mentoring to team members +•    Collaborates with peers, junior engineers, data scientists and project team +•    Typically interacts with high- level Individual Contributors, Managers, Directors and Program Core Teams +•    Drives design innovation resolution. +Must” Experience: +•    Extensive Hands-on experience on Big Data frameworks like Spark, Hive using Scala or Python  +•    Extensive experience in AWS services – Redshift, Athena, EMR, DocumentDB, S3  +•    Knowledge of AI & Data Science  +•    Exposure to CI/CD pipeline & Github.  +•    Experience in ETL, Data Lake and Data warehouse pipeline.  +•    Experience using statistics, mathematics, algorithms and programming languages to solve big data challenges.  +•    Fluent in structured and unstructured data, its management, and modern data transformation methodologies.  +•    Ability to define and create complex models to pull valuable insights, predictions and innovation from data.  +•    Effectively and creatively tell stories and create visualizations to describe and communicate data insights.  +•    Strong analytical and problem-solving skills.  +•    Excellent written and verbal communication skills; mastery in English and local language.  +•    Ability to effectively communicate data insights and negotiate options at senior management levels.  +Scope & Impact +•    Collaborates with peers, junior engineers, data scientists and project team. +•    Typically interacts with high- level Individual Contributors, Managers, Directors, and Program Core Teams. +•    Drives design innovation.  +Behavioral Skills:  +•    Very good communication skills +•    Should be very interactive and top on deliverables being working from client environment +•    Ready to learn new tools and technology in back-end area +Qualification:  +•     Bachelor's, Master's or PHD degree in Mathematics, Economics, Physics, Computer Science, or equivalent. +•    6-10 years’ professional experience +  +  +  +  +  +Thanks and Regards, +Khushi Gupta +MSRCOSMOS   +Direct : +1 925-892-2037 +Fax: 925-219-0934 +Email : [khushigupta@msrcosmos.com](mailto:khushigupta@msrcosmos.com "mailto:khushigupta@msrcosmos.com") + diff --git a/Careers/Potential and Future/60 careers/Learning System Analyst.md b/Careers/Potential and Future/60 careers/Learning System Analyst.md new file mode 100644 index 0000000..abce80e --- /dev/null +++ b/Careers/Potential and Future/60 careers/Learning System Analyst.md @@ -0,0 +1,9 @@ +# Learning System Analyst + +From Haylee at Matlen Silver via a [LinkedIn](https://www.linkedin.com/notifications/?filter=all) message: + +--- + +### Learning System Analyst- Remote! + +Hi Shwetha, Happy Thursday! My name is Haylee with Matlen Silver and I am reaching out to see if you are on the job market? With your background I feel as though you would be a great fit for the Learning System Analyst opportunity I have. It is fully remote, and has a contract length of 6 months with a possibility of conversion. Experience with HTML, CSS, and Javascript are a hug plus for this opportunity. If interested, please send your latest resume to [hricci@matlensilver.com](mailto:hricci@matlensilver.com) :) Haylee Ricci Recruiter - MSP Division at Matlen Silver \ No newline at end of file diff --git a/Careers/Potential and Future/60 careers/Level 2 Desktop Engineer.md b/Careers/Potential and Future/60 careers/Level 2 Desktop Engineer.md new file mode 100644 index 0000000..6093a3d --- /dev/null +++ b/Careers/Potential and Future/60 careers/Level 2 Desktop Engineer.md @@ -0,0 +1,10 @@ +# Level 2 Desktop Engineer + +From Jon Janco as a message on [LinkedIn](https://www.linkedin.com/notifications/?filter=all) + +--- + + +### Opportunity + +We have an immediate need with our client for a Level 2 Desktop Engineer. This is a 6-month contract-to-hire position. The client is located in Manhattan. Must be able to work onsite 2 days a week and must be Covid vaccinated. Please let me know if you would like to hear more about this opportunity! Details: Our client is hiring a hands-on IT Support Specialist who will be responsible for overseeing the day-to-day activities of information technology (IT) at the client. The role is multi-faceted: from end-user support, user provisioning, office multi-media tech, corporate tool management and configuration, endpoint device management and troubleshooting, and office network management. The role is a blend of creative problem solving and practical actions to support daily corporate IT operations Responsibilities ? Manage access provisioning and de-provisioning. ? Manage client's office network. ? Provide technical support to clients' internal team. ? Own, configure & tune corporate SaaS applications. ? Work with colleagues across our business to troubleshoot and resolve corporate IT issues. Qualifications I? Curious, interested in learning, great listening and communication skills ? Record of working well with others in a technical and collaborative environment ? Proven success in a role that is similar. ? Hands-on experience and continued interest in systems administration in G-Suite, Microsoft, Mac, office technologies (wireless/video screens), and ideally Confluence, Jira, and other tools used to enable product development. ? Working knowledge of Local Area Network configuration and troubleshooting. ? Strong verbal and written communication skills and ability to translate IT knowhow into concise and easy-to-follow self-help articles for end-users to follow. ? 2+ years of experience in a Service Desk, IT support role Jon Janco [jon@sierrasolutionsgroup.com](mailto:jon@sierrasolutionsgroup.com) 518-225-1901 \ No newline at end of file diff --git a/Careers/Potential and Future/60 careers/NASA Engineer.md b/Careers/Potential and Future/60 careers/NASA Engineer.md new file mode 100644 index 0000000..26f2d26 --- /dev/null +++ b/Careers/Potential and Future/60 careers/NASA Engineer.md @@ -0,0 +1,17 @@ +# NASA Engineer + +Working at NASA would be an absolute dream. I hope I can be someone that works within the organization and makes a difference because they are making leaps within its org to bring science to everyone. I align very strongly with NASA's entire mission and I will do whatever it takes to make them proud if chosen. + +https://www.usajobs.gov/job/668771500 + +https://www.usajobs.gov/job/668809900 + +https://www.usajobs.gov/job/668973600 + +https://www.usajobs.gov/job/668977300 + +https://www.usajobs.gov/job/669191900 + +https://www.usajobs.gov/job/669539600 + +https://www.usajobs.gov/Applicant/Application/668618100/Documents?Saved=True diff --git a/Careers/Potential and Future/60 careers/Quantum Computing Developer.md b/Careers/Potential and Future/60 careers/Quantum Computing Developer.md new file mode 100644 index 0000000..9751779 --- /dev/null +++ b/Careers/Potential and Future/60 careers/Quantum Computing Developer.md @@ -0,0 +1,18 @@ +# Quantum Computing Developer + +Okay now we are delving into actual positions I care about category in terms of positions I admire. This was sent by Michelle Silungan , a senior Recruiter at Protiviti. + +--- + +### Quantum Computing Developer Position - Protiviti + +Dear Shwetha, Your expertise in Computer Science & Quantum Computing is impressive. Our National Emerging Technologies practice is growing and I think you'd be a strong addition to the team. Are you interested in a brief conversation? If you know of a qualified colleague, feel free to share my contact information. Attached you'll find an overview of our Technology Consulting practice. Thank you for your time - it is appreciated. Best, Michelle Silungan Senior Recruiter at Protiviti [michelle.silungan@protiviti.com](mailto:michelle.silungan@protiviti.com) +(312) 995 5070 + +The call w ith protiviti with Michelle went well. I think when they said what the allotted budget was for this role and because it is a more senior role they would still have to screen for those kinds of qualities as well first. Next steps include + +2nd interview - Talk with Konstantin - I learned a lot though and it's written down in my notes. + +=== + +Result: **did not get the job** \ No newline at end of file diff --git a/Careers/Potential and Future/About 60 Careers.md b/Careers/Potential and Future/About 60 Careers.md new file mode 100644 index 0000000..434d2cc --- /dev/null +++ b/Careers/Potential and Future/About 60 Careers.md @@ -0,0 +1,48 @@ +# 60 Career Checklist of Job Applications + +In terms of priorities to obtain a career that you admire & of what you want! Though of course, as the [essay](http://paulgraham.com/love.html) explains, it requires a bit of diligent discipline to apply & achieve. + +Thanks to Nick for telling me about this method of applying to stuff when I'm looking to switch occupation about making a list of 60 with the jobs I don't like at the top so that it doesn't freak me out too much when I apply and receive word back from ones I really was hoping for. + +Remember: the first ones of the list are the ones you care about the **least** so don't stress about those ones too much. At this point is just whichever job responds back to you. You can find coding assessment tips [here](obsidian://open?vault=Coding%20Tips&file=Python%2FCoding%20Assessment%2FHackerRank%2FAbout%20HackerRank%20Tips). However, some of these jobs may not even require a coding assessment. Remember, Schrodinger never asked one of you! :-) Refer back to your older positions too and all the things that you had learned from your experiences there. + +Good luck and keep going! + +--- + +#### List of Tech Companies + +1. [Java Application Engineer ](obsidian://open?vault=Coding%20Tips&file=60%20Careers%2FJava%20Application%20Engineer)via pyramidconsulting +2. Senior Software Developer at Dairy.com ---> applied. result: +3. [Academic Tutor](obsidian://open?vault=Coding%20Tips&file=Academic%20Tutor) at Success Academy Charter Schools ---> responded. result: +4. [ Level 2 Desktop Engineer ](obsidian://open?vault=Coding%20Tips&file=Level%202%20Desktop%20Engineer)via Sierra Solutions Group --->responded. result: +5. [Job Data Engineer ](obsidian://open?vault=Coding%20Tips&file=Careers%2FPotential%20and%20Future%2FJob%20Data%20Engineer)with MSR Cosmos +6. [ Learning System Analyst ](obsidian://open?vault=Coding%20Tips&file=Learning%20System%20Analyst)at Matlen Silver ---> responded. result: +7. Quantum Blockchain Engineer, EmpireDAO +8. Craigslist ads for software engineer. terrible experience. never again... +9. Software Engineer Intern at Instacator - Handshake job +10. Blackstone engineer - handshake job +11. IBM backend developer intern - handshake job +12. Software engineer - TDA creative - linkedin job +13. Full Stack Software Engineer at Open System Technology - linkedin job +14. TandemAI -linkedin job +15. Climate Caopital - linkedin job +16. Chronograph - linkedin job +17. linkedin job +18. linkedin job +19. linkedin job +20. linkedin job +21. linkedin job +22. . Software Developer for Genshin Impact +23. Ubisoft, [AI Programmer Star Wars ](https://www.ubisoft.com/en-us/company/careers/search/743999840286682-ai-programmer-star-wars-project-) ---> responded. result: +24. Software Engineer, [Deloitte](https://www.linkedin.com/jobs/view/3143827180/?alertAction=markasviewed&savedSearchAuthToken=1%26AQGxrGO_UnnpvQAAAYIn_xhZMYb3ilwsV7yNqSQHny69alyCuLR1dh8ne6OBlZzYWdxiK5wy47nSmmcEcmHroT3rMXWjXCJ1x5fBNWJ4lGIwH37RES3LkLDVfsV7QCk07baBoZ1fOV51k1tAbdbwPzUUhvFWW92G9BFyaRK784JrRPcMyg0IEKLylgR62WBstfRlz1k3JE29w5REd5WYwQLFnbNmiDSCPnUutByyVnJl8TL6YitqNWK1jOhXWHqQpQYqbxdAEaRpqbOg_uaneAyzS7_DZNyGwDUkg29OG1wyR54Kx-eDjOFJ%26AUyHogGMsbpEtsSB659OD2WetQCe&savedSearchId=1724376514&refId=bd4ed403-75f9-492e-82fc-6c3ff477e3e5&trackingId=7NGlk3oStWueNKtzR3HnMw%3D%3D&midToken=AQH1LkuI1z1DRA&midSig=0LmTg3jW0sOqk1&trk=eml-email_job_alert_digest_01-job_alert-11-member_details_mercado&trkEmail=eml-email_job_alert_digest_01-job_alert-11-member_details_mercado-null-5w7ygx%7El5x0znc5%7Eea-null-jobs%7Eview) +25. [Microsoft](https://www.microsoft.com/en-us/research/blog/ai4science-to-empower-the-fifth-paradigm-of-scientific-discovery/) AI [Researcher](https://www.microsoft.com/en-us/research/opportunity/msra-full-time-researchers-post-docs-internships-all-levels/?ocid=eml_pg354067_gdc_comm_mw&mkt_tok=MTU3LUdRRS0zODIAAAGF2gFVaqzZJhSUQUJ8JidOqYeyBl1LaivWL_2QwX8aE5nsUiAwuHnwzdm7gGCxMqOtO968xoF5YPN_et59qVjnLRWjERrruG4LJS6ag1LNIwEL19gbMYLsKPPa) +26. Senior Level Machine Learning Engineer at ADP ---> responded. -->**result: reply back to Cristian Hassan** +27. Software Engineer at Amazon ---> responded.--> **result: follow up +28. Product Manager at Schrodinger +29. [Quantum Computing Developer](obsidian://open?vault=Coding%20Tips&file=Quantum%20Computing%20Developer) at Protiviti ---> result: rejected +30. [D-Wave](https://jobs.lever.co/dwavesys/dffdfe5f-15bd-442a-ab82-d67008f3ebf4/apply) Software Developer/Researcher Algorithms ---> +31. NASA [Engineer](obsidian://open?vault=Coding%20Tips&file=Careers%2FPotential%20and%20Future%2F60%20careers%2FNASA%20Engineer) **applied** +32. Quant Developer Consultant position at CME + + diff --git a/Computers/Browser/CSS.md b/Computers/Browser/CSS.md new file mode 100644 index 0000000..ede0d8f --- /dev/null +++ b/Computers/Browser/CSS.md @@ -0,0 +1,9 @@ +# CSS + +Ah the design and creative part of front end coding. This is what I started out doing when I was around 12 years old on neopets.com. The world has gotten a lot better since then now and we have many options for web design and front end programming. + +--- + + +- One of the best tools to use for CSS is https://tailwindcss.com/ + - for more info on how to set it up: https://tailwindcss.com/docs/installation \ No newline at end of file diff --git a/Computers/Browser/Javascript/Code Conventions.md b/Computers/Browser/Javascript/Code Conventions.md new file mode 100644 index 0000000..1ec959a --- /dev/null +++ b/Computers/Browser/Javascript/Code Conventions.md @@ -0,0 +1,376 @@ +# Code Conventions for the JavaScript Programming Language + +written by Douglass Crockford on 2019-05-15. read via browser [here](https://www.crockford.com/code.html). + +--- +This is a set of coding conventions and rules for use in JavaScript programming. + +The long-term value of software to an organization is in direct proportion to the quality of the codebase. Over its lifetime, a program will be handled by many pairs of hands and eyes. If a program is able to clearly communicate its structure and characteristics, it is less likely that it will break when modified in the never-too-distant future. Code conventions can help in reducing the brittleness of programs. + +All of our JavaScript code is sent directly to the public. It should always be of publication quality. Neatness counts. Diversity of people, culture, and perspective is a good and valueable thing. Diversity of programming styles is a bad thing. It creates friction, impeding the ability of people to work together. It can make it easier for bugs to form and hide. + +## JavaScript Files  + +JavaScript programs should be stored in and delivered as `.js` files. + +JavaScript code should not be embedded in HTML files unless the code is specific to a single session. Code in HTML adds significantly to pageweight with no opportunity for mitigation by caching, minification, and compression. + +## Whitespace + +Where possible, these rules are consistent with centuries of good practice with literary style. Deviations from literary style should only be tolerated if there is strong evidence of a significant benefit. Personal preference is not a significant benefit. + +Blank lines improve readability by setting off sections of code that are logically related. + +Blank spaces should always be used in the following circumstances: +circumstances: + +- A keyword followed by `(` left parenthesis should be separated by a space. Spaces are used to make things that are not invocations look less like invocations, so for example, there should be space after `if` or `while`. + + while (true) { + +- A blank space should not be used between a function value and its invoking `(` left parenthesis. This helps to distinguish between keywords and function invocations. +- The word `function` is always followed with one space. +- No space should separate a unary operator and its operand except when the operator is a word such as `typeof`. +- All binary operators should be separated from their operands by a space on each side except `.` period and `(` left parenthesis and `[` left bracket. +- Every , comma should be followed by a space or a line break. +- Each ; semicolon at the end of a statement should be followed with a line break. +- Each ; semicolon in the control part of a `for`statement should be followed with a space. + +Every statement should begin aligned with the current indentation. The outermost level is at the left margin. The indentation increases by 4 spaces when the last token on the previous line is `{` left brace, `[` left bracket, `(` left paren. The matching closing token will be the first token on a line, restoring the previous indentation. + +The ternary operator can be visually confusing, so wrap the entire ternary expression in parens. The condition, the `?` question mark, and the `:` colon always begins a line, indented 4 spaces. + + let integer = function ( + value, + default_value + ) { + value = resolve(value); + return ( + typeof value === "number" + ? Math.floor(value) + : ( + typeof value === "string" + ? value.charCodeAt(0) + : default_value + ) + ); + }; + +Clauses (`case`, `catch`, `default`, `else`, `finally`) are not statements and so should not be indented like statements. + +Use of tabs invites confusion, argument,and crying, with little compensating value. Do not use tabs. Use space. + +## Comments  + +Be generous with comments. It is useful to leave information that will be read at a later time by people (possibly your future self) who will need to understand what you have done and why. The most valuable comments talk about intentions and reasons, things that are not easily discovered by reading the code. The comments should be well-written and clear, just like the code they are annotating. An occasional nugget of humor might be appreciated. Frustrations and resentments will not. + +It is important that comments be kept up-to-date. Erroneous comments can make programs even harder to read and understand. + +Make comments meaningful. Focus on what is not immediately visible. Don't waste the reader's time with stuff like + + // Set i to zero. + + i = 0; + +Use line comments, not block comments. The comments should start at the left margin. + +## Variable Declarations  + +All variables should be declared before used. JavaScript does not require this, but doing so makes the program easier to read and makes it easier to detect undeclared variables that may become implied. Implied global variables should never be used. Use of global variables should be minimized. + + let current_entry; // currently selected table entry + let level; // indentation level + let size; // size of the table + +## Function Declarations + +All functions should be declared before they are used. Inner functions should come after the outer function's variable declarations. This helps make it clear what variables are included in its scope. + +There should be no space between the name of a function and the `(` left parenthesis of its parameter list. There should be one space between the `)` right parenthesis and the `{` left curly brace that begins the statement body. The body itself is indented four spaces. The `}` right curly brace is aligned with the line containing the beginning of the declaration of the function. + + function outer(c, d) { + let e = c * d; + + function inner(a, b) { + return (e * a) + b; + } + + return inner(0, 1); + } + +This convention works well with JavaScript because in JavaScript, functions and object literals can be placed anywhere that an expression is allowed. It provides the best readability with inline functions and complex structures. + + function getElementsByClassName(className) { + let results = []; + walkTheDOM( + document.body, + function (node) { + let array; // array of class names + let ncn = node.className; // the node's classname + +// If the node has a class name, then split it into a list of simple names. +// If any of them match the requested name, then append the node to the list of results. + + if (ncn && ncn.split(" ").indexOf(className) >= 0) { + results.push(node); + } + } + ); + return results; + } + +If a function literal is anonymous, there should be one space between the word `function` and the `(` left parenthesis. If the space is omitted, then it can appear that the function's name is `function`, which is an incorrect reading. + + div.onclick = function (e) { + return false; + }; + + that = { + method: function () { + return this.datum; + }, + datum: 0 + }; + +Use of global functions should be minimized. + +When a function is to be invoked immediately, the entire invocation expression should be wrapped in parens so that it is clear that the value being produced is the result of the function and not the function itself. + +let collection = (function () { + let keys = []; + let values = []; + + return { + get: function (key) { + let at = keys.indexOf(key); + if (at >= 0) { + return values[at]; + } + }, + set: function (key, value) { + let at = keys.indexOf(key); + if (at < 0) { + at = keys.length; + } + keys[at] = key; + values[at] = value; + }, + remove: function (key) { + let at = keys.indexOf(key); + if (at >= 0) { + keys.splice(at, 1); + values.splice(at, 1); + } + } + }; +}()); + +## Names  + +Names should be formed from the 26 upper and lower case letters (`A` .. `Z`, `a` .. `z`), the 10 digits (`0` .. `9`), and `_` underbar. Avoid use of international characters because they may not read well or be understood everywhere. Do not use `$` dollar sign or `\` backslash in names. + +Do not use `_` underbar as the first or last character of a name. It is sometimes intended to indicate privacy, but it does not actually provide privacy. If privacy is important, use closure. Avoid conventions that demonstrate a lack of competence. + +Most variables and functions should start with a lower case letter. + +Constructor functions that must be used with the `new`prefix should start with a capital letter. JavaScript issues neither a compile-time warning nor a run-time warning if a required `new` is omitted. Bad things can happen if `new` is missing, so the capitalization convention is an important defense. + +Global variables should be avoided, but when used should be in `ALL_CAPS`. + +## Statements  + +### Simple Statements  + +Each line should contain at most one statement. Put a `;` semicolon at the end of every statement that does not end with a `{`block`}`. Note that an assignment statement that is assigning a function literal or object literal is still an assignment statement and must end with a semicolon. + +JavaScript allows any expression to be used as a statement. This can mask some errors, particularly in the presence of semicolon insertion. The only expressions that should be used as statements are assignments, invocations, and `delete`. + +### Compound Statements  + +Compound statements are statements that contain lists of statements enclosed in `{ }` curly braces. + +- The enclosed statements should be indented four more spaces. +- The `{` left curly brace should be at the end of the line that begins the compound statement. +- The `}` right curly brace should begin a line and be indented to align with the beginning of the line containing the matching `{` left curly brace. +- Braces should be used around all statements, even single statements, when they are part of a control structure, such as an `if` or `for` statement. This makes it easier to add statements without accidentally introducing bugs.  + +### Labels  + +Statement labels should be avoided. Only these statements should be labeled: `while`, `do`, `for`, `switch`. + +### `return` Statement  + +The return value expression must start on the same line as the `return` keyword in order to avoid semicolon insertion. + +### `if` Statement  + +An `if` statement should have one of these forms: + +``` +if (condition) { + statements +} +``` + + +``` +if (condition) { + statements +} else { + statements +} + +``` + +``` +if (condition) { + statements +} else if (condition) { + statements +} else { + statements +} + +``` + + +### `for` Statement  + +The `for` should be avoided, preferring the array methods if possible. When the `for` statement is used, it should one of these forms: + +``` +for (initialization; condition; update) { + statements +} + +for ( + initialization; + condition; + update +) { + statements +} +``` + + +### while Statement  + +A  `while` statement should have the following form: + +``` +while (condition) { + statements +} + +``` + +### `do` Statement  + +A `do` statement should have this form: + +``` +do { + statements + } while (condition); + +``` + +Unlike the other compound statements, the `do`statement always ends with a `;` semicolon. + +### `switch` Statement  + +A `switch` statement should be avoided, but when used should have this form: + +``` +switch (expression) { +case expression: + statements +default: + statements +} +``` + + +Each `case` is aligned with the `switch`. This avoids over-indentation. A `case` label is not a statement, and should not be indented like one. + +Each group of statements (except the `default`) should end with `break`, `return`, or `throw`. Do not fall through. + +### `try` Statement  + +The `try` statement should have this form: + +``` +try { + statements +} catch (variable) { + statements +} +``` + + +The `finally` clause should be avoided. If it is used, it should have this form: + +``` +try { + statements +} catch (variable) { + statements +} finally { + statements +} + +``` + +### `continue` Statement  + +Avoid use of the `continue` statement. It tends to obscure the control flow of the function. + +### `with` Statement  + +The `with` statement [should not be used](http://yuiblog.com/blog/2006/06/01/global-domination/). + +## `{}` and `[]` + +Use `{}` instead of `new Object()`. Use `[]` instead of `new Array()`. + +Use arrays when the member names would be sequential integers. Use objects when the member names are arbitrary strings or names. + +### `,` comma Operator  + +Avoid the use of the comma operator. (This does not apply to the comma separator, which is used in object literals, array literals, and parameter lists.) Having a character that is sometimes a separator and sometimes an operator is a source of confusion. + +### Assignment Expressions  + +Avoid doing assignments in the condition part of `if`and `while` statements. + +Is + + if (a = b) { + +a correct statement? Or was + + if (a == b) { + +intended? Avoid constructs that cannot easily be determined to be correct. + +### `===` and `!==` Operators.  + +Use the `===` and `!==` operators. The `==` and `!=` operators produce false positives and false negatives, so they should not be used. + +### Confusing Pluses and Minuses  + +Be careful to not follow a `+` with `+` or `++`. This pattern can be confusing. Insert parens between them to make your intention clear. + + total = subtotal + +myInput.value; + +is better written as + + total = subtotal + Number(myInput.value); + +so that the `+ +` is not misread as `++`. Avoid `++`. + +### `eval` is Evil  + +The `eval` function is the most misused feature of JavaScript. Avoid it. + +`eval` has aliases. Do not use the `Function` constructor. Do not pass strings to `setTimeout` or `setInterval`. \ No newline at end of file diff --git a/Computers/Browser/Javascript/JSLint.md b/Computers/Browser/Javascript/JSLint.md new file mode 100644 index 0000000..900c9fd --- /dev/null +++ b/Computers/Browser/Javascript/JSLint.md @@ -0,0 +1,11 @@ +# JSLint + +According to the [instructions](https://www.jslint.com/help.html) doc, JSLint is a code quality tool for JavaScript. + +The Principle of the Good Parts is + +> If a feature is sometimes useful and sometimes dangerous and if there is a better option then always use the better option. + +It can be accessed [here](https://www.jslint.com). Really understanding what is being explained here is key to using JSLint properly when debugging JavaScript. + +And it was written in [BBEdit](obsidian://open?vault=Coding%20Tips&file=Computers%2FMac%20OS%20X%2FBBEdit). \ No newline at end of file diff --git a/Computers/Browser/Javascript/Welcome to JavaScript.md b/Computers/Browser/Javascript/Welcome to JavaScript.md new file mode 100644 index 0000000..15f0793 --- /dev/null +++ b/Computers/Browser/Javascript/Welcome to JavaScript.md @@ -0,0 +1,5 @@ +# Welcome + +Everyone will have to use JavaScript in some capacity when being on the web. Might as well pick up some hints as you go. Here are a few resources. + +- [8 ways to learn javascript](https://www.fosslife.org/8-ways-learn-javascript-online) \ No newline at end of file diff --git a/Computers/Browser/Tools/Extensions.md b/Computers/Browser/Tools/Extensions.md new file mode 100644 index 0000000..7a5780a --- /dev/null +++ b/Computers/Browser/Tools/Extensions.md @@ -0,0 +1,3 @@ +# Extensions + +You haven't properly pimped out your browser if you haven't installed some extensions. That's what make browsers so fun anyhow, all the customizeability! \ No newline at end of file diff --git a/Computers/Browser/Tools/Prototyping tools.md b/Computers/Browser/Tools/Prototyping tools.md new file mode 100644 index 0000000..b4e4446 --- /dev/null +++ b/Computers/Browser/Tools/Prototyping tools.md @@ -0,0 +1,14 @@ +# Prototyping tools + + +There are many tools to use when it comes to organization and design of a prototype. Yes of course it is easier to build this with a team but also it can entirely be done by yourself too if you have the creative passion to see it to completion. + +Take all the time you need remember. This is your creation. + + +Tools for motion prototyping: +https://www.framer.com/motion/ + +Tools for mobile app prototyping: +https://cloud.justinmind.com/usernote/toLogin.action + diff --git a/Computers/Browser/Tools/Webscraping.md b/Computers/Browser/Tools/Webscraping.md new file mode 100644 index 0000000..ab1fe15 --- /dev/null +++ b/Computers/Browser/Tools/Webscraping.md @@ -0,0 +1,49 @@ +# Webscraping + + +Webscraping is a common task in the CS world that makes it easy and efficient to extract large amounts of data. It is part of a larger topic of data mining which allows for the human understandable analysis of all the data that is out there. + +You will often use requests and beautifulsoup libraries. + +--- + +#### Comparing web scraping libraries: +![[Pasted image 20220730121832.png]] + +## Sample scraper +```python +import pandas as pd +from bs4 import BeautifulSoup +from selenium import webdriver +driver = webdriver.Chrome(executable_path='/nix/path/to/webdriver/executable') driver.get('https://your.url/here?yes=brilliant') +results = [] +other_results = [] +content = driver.page_source +soup = BeautifulSoup(content) +for a in soup.findAll(attrs={'class': 'class'}): + name = a.find('a') + if name not in results: + results.append(name.text) +for b in soup.findAll(attrs={'class': 'otherclass'}): + name2 = b.find('span') + other_results.append(name.text) +series1 = pd.Series(results, name = 'Names') +series2 = pd.Series(other_results, name = 'Categories') +df = pd.DataFrame({'Names': series1, 'Categories': series2}) +df.to_csv('names.csv', index=False, encoding='utf-8') +``` + +You can also use asyncio or multithreading to make web scraping even [faster](https://oxylabs.io/blog/how-to-make-web-scraping-faster). +Right click > Inspect > Network + +##### More helpful tutorials +- [How To Scraper Yelp Review For Free [No Coding Required] | ProWebScraper](https://medium.com/prowebscraper/how-to-scraper-yelp-reviews-899b7480eb8d) + +- [How to Build a Web Scraper With Python [Step-by-Step Guide] | HackerNoon](https://hackernoon.com/how-to-build-a-web-scraper-with-python-step-by-step-guide-jxkp3yum) + +- [Python Web Scraping Tutorial: Step-By-Step [2022 Guide] | Oxylabs](https://oxylabs.io/blog/python-web-scraping) +- [ Intro to Yelp Scraping using Python ](https://towardsdatascience.com/intro-to-yelp-web-scraping-using-python-78252318d832) + + +## Alternative tools: +- [Octoparse](https://developer.chrome.com/docs/devtools/workspaces/?utm_source=devtools) is a good one which is free for 14 days. \ No newline at end of file diff --git a/Computers/Browser/Tools/Workspaces.md b/Computers/Browser/Tools/Workspaces.md new file mode 100644 index 0000000..da5e4d5 --- /dev/null +++ b/Computers/Browser/Tools/Workspaces.md @@ -0,0 +1,5 @@ +# Workspaces + +Found first within Right Click > Inspect on Brave browser. Checked out the learn more link and here we are. + +Go through the full demo walkthrough to learn more [here](https://developer.chrome.com/docs/devtools/workspaces/?utm_source=devtools). \ No newline at end of file diff --git a/Computers/Browser/Unform Resource Identifier.md b/Computers/Browser/Unform Resource Identifier.md new file mode 100644 index 0000000..f77bcb1 --- /dev/null +++ b/Computers/Browser/Unform Resource Identifier.md @@ -0,0 +1,4 @@ +# Aka the URI + + +not to be confused with the URL ;) \ No newline at end of file diff --git a/Computers/Browser/Uniform Resource Locator.md b/Computers/Browser/Uniform Resource Locator.md new file mode 100644 index 0000000..e69de29 diff --git a/Computers/Browser/XPath.md b/Computers/Browser/XPath.md new file mode 100644 index 0000000..3ffb6c1 --- /dev/null +++ b/Computers/Browser/XPath.md @@ -0,0 +1,5 @@ +# Xpath + +XPath stands for XML Path Language. It is a language that allows you to navigate to a specific element in an XML document. + +XPaths will often be used in [BBEdit](obsidian://open?vault=Coding%20Tips&file=Computers%2FMac%20OS%20X%2FBBEdit). \ No newline at end of file diff --git a/Computers/Mac OS X/BBEdit/BBEdit.md b/Computers/Mac OS X/BBEdit/BBEdit.md new file mode 100644 index 0000000..bdb3179 --- /dev/null +++ b/Computers/Mac OS X/BBEdit/BBEdit.md @@ -0,0 +1,25 @@ +# BBEdit + + *BBEdit : the Swiss Army **Chainsaw** of Programmers' Editor* + + + +It simple but powerful text editor with lots of [new](http://www.barebones.com/products/bbedit/bbedit14.html) [features](http://www.barebones.com/products/bbedit/features.html) with its [BBEdit 1](http://www.barebones.com/support/bbedit/notes-14.0.html)4 release. + + +### Language Modules: +Notice, that it doesn't have python, html, java/javascript or more popular languages among the list.. +- interestingly, there is a feature where if you are designing your own language, you may be able to create am "Edit in BBEdit" command. + - in fact, it even seems to be [encouraged](http://www.barebones.com/support/develop/). + + +- the [codeless language module reference](http://www.barebones.com/support/develop/clm.html#TypesOfCodelessLanguageModules) is made to make things extremely easy for you + - there is even a section where you can pull up docs for a language within a keyword. + - ![[Pasted image 20220908174202.png]] + - In this context, “symbols” are any runs of text defined by the “[Identifier and Keyword](http://www.barebones.com/support/develop/clm.html#IdentifyingKeywordStrings)” character sets. Spelling-dictionary words will be offered only if the user has enabled the feature in the “Editing” preferences panel. + + + +For any questions or issues you encounter, start a post on the [BBEdit google group](https://groups.google.com/g/bbedit). Or if something crashes, contact [tech support](https://www.barebones.com/contact/technical.html). + +P.S. [Yojimbo](http://www.barebones.com/products/yojimbo/tour-end.html) is a fantastic partner to work alongside BBEdit for quickly storing your files for viewing. The benefit of this is that you can use BBEdit to simply write, and you can use Yojimbo to view, store, collect, and take out pretty much anything your mind can think of. This is so fantastic because it is intuitively how we organize information even in the real world as well, part of the "stutter" that happens with human/computer interaction is when things are not intuitive. By providing this metaphorical interface, Yojimbo is infinitely ahead of the cloud game which, although may be fast and can store more data "online", is terrible for the environment and doesn't lead to actual real-world outputs. \ No newline at end of file diff --git a/Computers/Mac OS X/BBEdit/CLM.md b/Computers/Mac OS X/BBEdit/CLM.md new file mode 100644 index 0000000..4c7cea4 --- /dev/null +++ b/Computers/Mac OS X/BBEdit/CLM.md @@ -0,0 +1,11 @@ +# CLM + + +CLM stands for Codeless Language Module done via BBEdit most commonly. It is the easiest way to define things in actionable ways within your machine. And the possibiltiies are truly endless. +Here is the [example](obsidian://open?vault=Coding%20Tips&file=Computers%2FMac%20OS%20X%2FBBEdit%2FExample%20CLM) for a simple CLM. + +CLMs take the form of property list files (plists) +There are tons of information about CLMs on this [page](http://www.barebones.com/support/develop/clm.html). Read very carefully ;) + + +And, indeed, this is different than [Language Server Protocols](http://www.barebones.com/support/bbedit/lsp-notes.html), or LSPs, for short. \ No newline at end of file diff --git a/Computers/Mac OS X/BBEdit/Example CLM.md b/Computers/Mac OS X/BBEdit/Example CLM.md new file mode 100644 index 0000000..82db1c4 --- /dev/null +++ b/Computers/Mac OS X/BBEdit/Example CLM.md @@ -0,0 +1,65 @@ +# Example + +This is an example as given in the CLM doc of a "My Language" file, a severe subset of the Ruby scripting language. + +``` + + + + + + + + + BBEditDocumentType + CodelessLanguageModule + + + BBLMLanguageDisplayName My Language + BBLMLanguageCode MyL! + + + BBLMColorsSyntax + + + BBLMKeywordList + + class + def + if + elsif + else + end + do + for + return + + + + BBLMCommentLineDefault # + + + Language Features + + Identifier and Keyword Character Class + A-Za-z0-9_\?! + + + +``` + +**Things to notice here:** + +- If you don’t want the module to do anything other than take up space in the language pop-up, just specify `BBEditDocumentType`, `BBLMLanguageDisplayName`, and `BBLMLanguageCode`. But this is the minimal _useful_ language module. +- For syntax coloring, you must turn on `BBLMColorsSyntax`. +- For something to color, you must provide a list of keywords in `BBLMKeywordList`. +- BBEdit requires that you provide a method — line or block — for commenting-out lines with the Un/Comment Selection command. In this case, `BBLMCommentLineDefault` specifies the # line-comment token. +- You must also specify how to identify keywords, in the `Language Features `dictionary, using either `Identifier` and `Keyword Characters `or `Identifier` and `Keyword Character` `Class`. +- You _don’t_ have to provide a `BBLMSuffixMap` or `BBLMFileNamesToMatch` list. Without them, your user will have to pick the language out of the pop-up. + +For more info, go [here](http://www.barebones.com/support/develop/clm.html#Examples). \ No newline at end of file diff --git a/Computers/Mac OS X/BBEdit/List of language modules.md b/Computers/Mac OS X/BBEdit/List of language modules.md new file mode 100644 index 0000000..b59a5ca --- /dev/null +++ b/Computers/Mac OS X/BBEdit/List of language modules.md @@ -0,0 +1,9 @@ +# List of Language Modules + +Here is a more complete list of language modules made via BBEdit that are more useful for me rather than what they list on the official site. + + + +- **Nim** - plist link: https://gist.github.com/ytomino/4c9d186d78a27ad202ac +- orgASM - (IDE for any microprocessor) - http://www.hinton-instruments.co.uk/archive/macide.html +- \ No newline at end of file diff --git a/Computers/Mac OS X/BBEdit/XML.md b/Computers/Mac OS X/BBEdit/XML.md new file mode 100644 index 0000000..af0c4d3 --- /dev/null +++ b/Computers/Mac OS X/BBEdit/XML.md @@ -0,0 +1,5 @@ +# XML + +Extensible Markup Language (**XML**) is a markup language and file format for storing, transmitting, and reconstructing arbitrary data. It defines a set of rules for encoding documents in a format that is both human-readable and machine-readable. + +Utilized often in [BBEdit](obsidian://open?vault=Coding%20Tips&file=Computers%2FMac%20OS%20X%2FBBEdit) for CLMs. \ No newline at end of file diff --git a/Computers/Mac OS X/BBEdit/plist.md b/Computers/Mac OS X/BBEdit/plist.md new file mode 100644 index 0000000..a0a13bb --- /dev/null +++ b/Computers/Mac OS X/BBEdit/plist.md @@ -0,0 +1,4 @@ +# plist + + +plists are simple XML document types used throughout Mac OS X. This format defines a set of primitive types, and is used within CLM for definition. \ No newline at end of file diff --git a/Computers/Mac OS X/Mac X Code.md b/Computers/Mac OS X/Mac X Code.md new file mode 100644 index 0000000..e5ab5e5 --- /dev/null +++ b/Computers/Mac OS X/Mac X Code.md @@ -0,0 +1,6 @@ +# Mac OSX & Apple + + +- [Monitor](https://developer.apple.com/library/archive/documentation/Performance/Conceptual/power_efficiency_guidelines_osx/MonitoringEnergyUsage.html) the activity of your laptop through XCode +- [BBEdit](obsidian://open?vault=Coding%20Tips&file=Computers%2FMac%20OS%20X%2FBBEdit) is a fantastic text editor and not even just that is entirely worth the learn. +- Mac tips: \ No newline at end of file diff --git a/Computers/Quantum Realm/Algorithms/VOQC.md b/Computers/Quantum Realm/Algorithms/VOQC.md new file mode 100644 index 0000000..89d7332 --- /dev/null +++ b/Computers/Quantum Realm/Algorithms/VOQC.md @@ -0,0 +1,26 @@ +# VOQC + +VOQC, also pronounced as *vox*, is short for verfied optimizer for quantum circuits. Since many current quantum frameworks use qasm files, voqc was created as a way to debug circuits from compile error upon construction, as is my understanding anyways. The official paper though can be found [here](https://arxiv.org/pdf/1912.02250.pdf). And it is pretty informative! In order to install fully though, you will also need to install [opam](obsidian://open?vault=Coding%20Tips&file=Opam). + +--- + +**Example: Quantum teleportation:** + +The idea behing quantum teleportation is transmit a state psi from one party (Alice) to another (Bob) using a shared entangled state. A circuit for this is shown in a corresponding SQIR program. + +``` +Definition bell: ucom base 3 := H 1; CNOT 1 2 +Definition alice: com base 3 := CNOT 0 1 ; H 0; measure 0; measure 1. +Definition bob : com base 3 := CNOT 1 2; Cz 0 1; reset 0; reset 1. +Definition teleport : com base 3 := bell; alice, bob +``` + +SQIR : a quantum language pronounced *squire* which stands for small quantum intermediate representation. They maintain a [github](https://github.com/inQWIRE/SQIR) with several examples of implementation. Upon implementation, there seems to be an extraction process as well which is further documented [here](https://github.com/inQWIRE/mlvoqc). It takes a highly mathematical approach and is compatibly based on COQ. + +More information of Verified Quantum Computing can also be found [here](http://www.cs.umd.edu/~rrand/vqc/index.html). + +--- + +## An example of optimization! + +- Reading this [tutorial](https://nbviewer.org/github/inQWIRE/pyvoqc/blob/main/tutorial.ipynb) is extremely helpful in understanding what the point of voqc is. It makes constructing circuits a lot easier than having to understand all the gate logic and needing to create them all by hand. \ No newline at end of file diff --git a/Computers/Quantum Realm/Mechanics & Math/Intro to Mechanics & Math.md b/Computers/Quantum Realm/Mechanics & Math/Intro to Mechanics & Math.md new file mode 100644 index 0000000..cdc370c --- /dev/null +++ b/Computers/Quantum Realm/Mechanics & Math/Intro to Mechanics & Math.md @@ -0,0 +1,8 @@ +# Intro/Summary of Quantum Mechanics +The formalisms of somewhat knowing what each part of this is called will be somewhat important for you to seem knowledgeable in what you're talking about but might not be as necessary in application. Regardless, it'll give you major street cred around the quantum realm. + +- Quantum formalism will help understand what kind of math it's based on + - primarily linear algebra & matrices +- Funny enough, another Obsidian user has made a **much** more extensive guide called [The Quantum Well ](https://publish.obsidian.md/myquantumwell/Welcome+to+The+Quantum+Well!)which presents most of the math and physics you will ever need to know. +- since my Obsidian focuses primarily on the programming and tech, the above foundational knowledge will be useful for those that are curious. + diff --git a/Computers/Quantum Realm/Mechanics & Math/Quantum Formalism.md b/Computers/Quantum Realm/Mechanics & Math/Quantum Formalism.md new file mode 100644 index 0000000..e44d5b6 --- /dev/null +++ b/Computers/Quantum Realm/Mechanics & Math/Quantum Formalism.md @@ -0,0 +1,9 @@ +# Formalism + + + +**Abstract:  ** + + +Please  humor me if this  is a stretch but I thought this something worth exploring from a more  mathematical perspective and proof: As radio waves are currently the  longest emitting  electromagnetic  frequencies,  would  they  play a role in accounting for noise specifically in wind by formulating  a way in which radio  waves detecting noise via wind can communicate this rather naturally in a math formulation to quantum computing. There seems to be a lot of similarity between these  two  industries and rather  than approaching it from a photonic  or superconducting/circuit perspective,  I wanted  to take a moment  to  understand if this can be better formalized in an equation demonstrating the relationship between the earth’s wind, radio waves tested via  ham amateur radio, and factoring these into error mitigation in quantum computing. Although many  things may  account for  the noise that leaves  quantum  computers largely still unusable today, such as natural earth perturbations, I am still  interested in primarily exploring atmospheric  wind in a mathematical approach. + diff --git a/Computers/Quantum Realm/Technologies/Computers.md b/Computers/Quantum Realm/Technologies/Computers.md new file mode 100644 index 0000000..38d2a2c --- /dev/null +++ b/Computers/Quantum Realm/Technologies/Computers.md @@ -0,0 +1,14 @@ +# Quantum Computers + +Quantum computers are here and very much real. And there's lot's to choose from. Similar to how regular computers started out in the 70s, the most common ones today are the IBM Quantum Computers, more appropriate to call them servers though as they are often accessed via the cloud nowadays. + +Hardware + + + +Cloud Hybrid + + + +Annealers +- the one and only and first quantum computer, D-Wave, is the choice here \ No newline at end of file diff --git a/Computers/Quantum Realm/Technologies/Internet.md b/Computers/Quantum Realm/Technologies/Internet.md new file mode 100644 index 0000000..ade4f47 --- /dev/null +++ b/Computers/Quantum Realm/Technologies/Internet.md @@ -0,0 +1,3 @@ +# Quantum Internet + +A cryptographic application to send information through. \ No newline at end of file diff --git a/Computers/Quantum Realm/Technologies/Intro to Quantum Technologies.md b/Computers/Quantum Realm/Technologies/Intro to Quantum Technologies.md new file mode 100644 index 0000000..e3eb244 --- /dev/null +++ b/Computers/Quantum Realm/Technologies/Intro to Quantum Technologies.md @@ -0,0 +1,45 @@ +# Quantum Tech + + +Quantum technologies have the potential to dramatically change certain areas and industries as know it as we apply it and as the sector develops. There are 4 main kinds of quantum technologies that will come up: + +## 1. Quantum computers + +- These devices are here and san speed up certain calculations dramatically  +- Not just both 0 and 1 but rather in between 0 and 1  +- Can process much more information with qubits than bits +- This speedup  only works with certain calculations  +- To be useful  - need to bring  a large number of  qubits (~1 mill qubits) +- Question is not will it work, it is rather **will it scale** + - quantum computers already exist today + - yet status is similar to how nuclear fusion worked 50 years ago, effective and still in process + +## 2. Quantum internet + +- Information transmitted with quantum effects +- Uses quantum cryptography as a security protocol +- It irreversibly changes the state of an information particle   +- Cannot transfer info faster than speed of light or with any other quantum effect  +- quantum computer can break current protocols  +- Quantum internet can be safe from hacking by quantum computers +- Caveat - Post quantum or quantum-safe cryptography + - People that work on quantum  things dont like to mention this though + +## 3. Quantum metrology + +- Collection of measurements to improve quantum effects  +- Medicine and material science  +- Can make do with very few particles with minimal damage to sample +- Most promising quantum technology + +## 4. Quantum simulations + +- Very useful in trying to understand complicated system  +- By reproducing system that you can control better to better predict system +- Dramatic shift in modern physics as you can take out mathematics  +- Instead of simulating with mathematics you model it directly  with another system  +- Simulate particles similar to the higgs which you cannot do in any other way  + - though headlines like the simulated wormhole is nonsense + + +via [source](https://www.youtube.com/watch?v=b-aGIvUomTA) \ No newline at end of file diff --git a/Computers/Quantum Realm/Technologies/Machine Learning.md b/Computers/Quantum Realm/Technologies/Machine Learning.md new file mode 100644 index 0000000..3c88b31 --- /dev/null +++ b/Computers/Quantum Realm/Technologies/Machine Learning.md @@ -0,0 +1,56 @@ +# Machine Learning (QML) + +Quantum machine learning is one of the biggest pillars of quantum computing application that we will see in the workforce of the future +One of the big contenders in this field is Xanadu.ai's [pennylane](https://pennylane.ai/) software. Recently version 0.25 was just released and a lot more applications can be created. + + + +The following questions can finally be answered with [this](https://pennylane.ai/blog/2022/08/pennylane-v025-released/#new-return-types-for-qnodes-with-multiple-measurements) release: + + + +#### How many qubits/gates do I need to run this algorithm? + +module for estimating through process of first and second quantization: + +``` +# first quantization + +>>> n = 100000 # number of plane waves +>>> eta = 156 # number of electrons +>>> omega = 1145.166 # unit cell volume in atomic units +>>> algo = FirstQuantization(n, eta, omega) +>>> algo.gates +1.10e+13 +>>> algo.qubits +4416 +``` +``` +# second quantization with double factored Hamiltonian +# Hamiltonia + +symbols = ['O', 'H', 'H'] +geometry = np.array([[0.00000000, 0.00000000, 0.28377432], + [0.00000000, 1.45278171, -1.00662237], + [0.00000000, -1.45278171, -1.00662237]], requires_grad = False) + +mol = qml.qchem.Molecule(symbols, geometry, basis_name='sto-3g') +core, one, two = qml.qchem.electron_integrals(mol)() + +algo = DoubleFactorization(one, two) +``` +``` + +``` + +and voila! + +``` + +>>> print(algo.gates, algo.qubits) +103969925, 290 +``` + + + +and even more capabilities are available the more you explore! :) \ No newline at end of file diff --git a/Computers/Quantum Realm/Technologies/Metrology.md b/Computers/Quantum Realm/Technologies/Metrology.md new file mode 100644 index 0000000..ab33e1c --- /dev/null +++ b/Computers/Quantum Realm/Technologies/Metrology.md @@ -0,0 +1,3 @@ +# Quantum Metrology + +In which special tools are being created to observe quantum effects \ No newline at end of file diff --git a/Computers/Quantum Realm/Technologies/Optimizations.md b/Computers/Quantum Realm/Technologies/Optimizations.md new file mode 100644 index 0000000..9fe12e3 --- /dev/null +++ b/Computers/Quantum Realm/Technologies/Optimizations.md @@ -0,0 +1,3 @@ +# Quantum Optimizations + +Using QAOA \ No newline at end of file diff --git a/Computers/Quantum Realm/Tools/Computer choices/IBM/Qiskit-Nature.md b/Computers/Quantum Realm/Tools/Computer choices/IBM/Qiskit-Nature.md new file mode 100644 index 0000000..8348c8d --- /dev/null +++ b/Computers/Quantum Realm/Tools/Computer choices/IBM/Qiskit-Nature.md @@ -0,0 +1,47 @@ +# Qiskit -Nature + + +The main cloud application that uses superconducting qubits is qisket. Qisket Nature depends on the main package. + +- [Thermodynamic observable calculations ](https://qiskit.org/documentation/nature/tutorials/06_calculating_thermodynamic_observables.html)with IBM quantum + +### Installation + +``` +pip install qiskit[nature] +``` + +Further instructions can be read [here](https://qiskit.org/documentation/nature/getting_started.html). Installed via xonsh. + +--- +For hydrogen storage notebook --> use the ground state solver docs: + +### 1. Define a molecular system: + +Ask for the electronic part of a hydrogen molecule: +``` +from qiskit import Aer +from qiskit_nature.drivers import UnitsType, Molecule +from qiskit_nature.drivers.second_quantization import ( + ElectronicStructureDriverType, + ElectronicStructureMoleculeDriver, +) +from qiskit_nature.problems.second_quantization import ElectronicStructureProblem +from qiskit_nature.converters.second_quantization import QubitConverter +from qiskit_nature.mappers.second_quantization import JordanWignerMapper + +molecule = Molecule( + geometry=[["H", [0.0, 0.0, 0.0]], ["H", [0.0, 0.0, 0.735]]], charge=0, multiplicity=1 +) +driver = ElectronicStructureMoleculeDriver( + molecule, basis="sto3g", driver_type=ElectronicStructureDriverType.PYSCF +) + +es_problem = ElectronicStructureProblem(driver) +qubit_converter = QubitConverter(JordanWignerMapper()) +``` + +### 2. Define solver: +A solver aka the algorithm that the ground state is computed with. In chemistry the gound state is found with **variational quantum eignesolver (VQE)** + +### 3. \ No newline at end of file diff --git a/Computers/Quantum Realm/Tools/Computer choices/IBM/Qiskit.md b/Computers/Quantum Realm/Tools/Computer choices/IBM/Qiskit.md new file mode 100644 index 0000000..1621f68 --- /dev/null +++ b/Computers/Quantum Realm/Tools/Computer choices/IBM/Qiskit.md @@ -0,0 +1,10 @@ +# Qiskit + +Qiskit is the fundamental thingy(best way to describe it at this point) that a lot of quantum computers will refer to nowadays (at least for the moment) from IBM. We first have to create a conda environment (or a xonsh one!) in which we install qiskiet and all necessary distributions. Here are the docs to get [started](https://qiskit.org/documentation/getting_started.html). + +--- + +There seems to be qiskit distributions for: +- qiskit-visualization +- [qiskit-nature](obsidian://open?vault=Coding%20Tips&file=Qiskit-Nature) +- qiskiet-metal \ No newline at end of file diff --git a/Computers/Quantum Realm/Tools/LaTeX.md b/Computers/Quantum Realm/Tools/LaTeX.md new file mode 100644 index 0000000..a6f5e65 --- /dev/null +++ b/Computers/Quantum Realm/Tools/LaTeX.md @@ -0,0 +1,68 @@ +# LaTeX + +LaTex is an extremely high quality document creator and type-setting software. You can produce sophisticated ``articles``, ``reports``, ``books``, ``letters``, and ``slides`` this way for presentation of information to the scientific community. + +Make sure to read the README.md file upon installation also found [here](https://www.tug.org/mactex/READ_ME_FIRST.pdf). + +You can learn more at[ learnlatex.org. ](https://www.learnlatex.org/en/lesson-05) + +--- + + +For a ``letter`` for instance, a document class will look like this: + +``` +\documentclass{letter} +\usepackage[T1]{fontenc} +\begin{document} + +\begin{letter}{Some Address\\Some Street\\Some City} + +\opening{Dear Sir or Madam,} + +This is an example of a highly sophisticated & educated correspondence. + +\closing{Yours,} + +\end{letter} + +\end{document} +``` + + +In another example, we may see an ``article`` document may be written: + +``` +\documentclass{article} % Change the class here +\usepackage[T1]{fontenc} + +\begin{document} + +\section{Introduction} + +This is a sample document with some dummy +text\footnote{and a footnote}. This paragraph is quite +long as we might want to see the effect of making the +document have two columns. + +\end{document} +``` + +--- + +### LaTeX Presentations + +- some examples and templates can be found [here](atextemplates.com/template/beamer-presentation) + - They are very clean and academic-looking +- How to create your own LaTeX Presentation! + - follow [this](https://texblog.org/2008/01/21/create-your-slides-presentations-with-latex/) tutorial to get started :) + +We start by defining the document-class + +``` +\documentclass[landscape]{slides} +``` + +But you may be better off editing a document simply through [Overleaf](https://www.overleaf.com/project/6306feb35a99fd317a79ec3a) as well. + +![[Pasted image 20220825004820.png]] \ No newline at end of file diff --git a/Computers/Quantum Realm/Tools/Simulations.md b/Computers/Quantum Realm/Tools/Simulations.md new file mode 100644 index 0000000..3e81a9e --- /dev/null +++ b/Computers/Quantum Realm/Tools/Simulations.md @@ -0,0 +1,5 @@ +# Quantum Simulations + +Whole systems are simulated without need for data or equations of mathematics by altering the options/probabilities of systems themselves. Helps us better understand complex systems. + +The[ qiskit-nature](obsidian://open?vault=Coding%20Tips&file=Computers%2FQuantum%20Realm%2FTechnologies%2FComputer%20choices%2FIBM%2FQiskit-Nature) package would be a good one to use here. \ No newline at end of file diff --git a/Computers/Quantum Realm/Tools/Testing/Arline Benchmarks.md b/Computers/Quantum Realm/Tools/Testing/Arline Benchmarks.md new file mode 100644 index 0000000..323ca62 --- /dev/null +++ b/Computers/Quantum Realm/Tools/Testing/Arline Benchmarks.md @@ -0,0 +1,33 @@ +# Arline Benchmarks + +The Arline Benchmarks are an independent third-party analysis tool to compare all the quantum processors that exist today with no affiliation to any of them. This then removes any bias and only looks at processors in terms of efficiency and speed-up. It has been used for compiler performance testing and more. Furthermore, it autogenerates benchmarking reports in LaTeX so you can get to experience that as well. You may also run it online [here](https://www.arline.io/arline-benchmarks) by uploading the qasm files and comparing. It currently works with Qiskit, Tket, PyZX, & VOQC. + +### Folder Structure +The folder structure for Arline Benchmarks once installed looks like this: + +``` +arline_benchmarks +│ +├── arline_benchmarks # platform classes +│ ├── config_parser # parser of pipeline configuration +│ ├── engine # pipeline engine +│ ├── metrics # metrics for pipeline comparison +| ├── pipeline # pipeline +│ ├── reports # LaTeX report generator +│ ├── strategies # list of strategies for mapping/compression/rebase +│ └── targets # target generator +│ +├── circuits # qasm circuits dataset +│ +├── configs # configuration files +│ └── compression # config .jsonnet file and .sh scripts +│ +├── docs # documentation +│ +├── scripts # run files +│ +└── test # tests + ├── qasm_files # .qasm files for test + └── targets # test for targets module +``` + diff --git a/Computers/Quantum Realm/Tools/The prep & prototyping/Agnostiq.md b/Computers/Quantum Realm/Tools/The prep & prototyping/Agnostiq.md new file mode 100644 index 0000000..5ddf70c --- /dev/null +++ b/Computers/Quantum Realm/Tools/The prep & prototyping/Agnostiq.md @@ -0,0 +1,9 @@ +# Agnostiq + +Agnostiq is a platform that helps streamline the tools needed to build quantum solutions for the future. + +There is an open source version called covalent as well which is worth trying as well. + +![[Pasted image 20220827183015.png]] + +Covalent allows for an easy workflow environment as well and can be used to further coordinate your quantum work as you delve further. \ No newline at end of file diff --git a/Computers/Quantum Realm/Tools/The prep & prototyping/Choose Your Hero! er, Algo.md b/Computers/Quantum Realm/Tools/The prep & prototyping/Choose Your Hero! er, Algo.md new file mode 100644 index 0000000..e69de29 diff --git a/Computers/Quantum Realm/Tools/The prep & prototyping/Get to hacking!/Womanium Process.md b/Computers/Quantum Realm/Tools/The prep & prototyping/Get to hacking!/Womanium Process.md new file mode 100644 index 0000000..ef58dce --- /dev/null +++ b/Computers/Quantum Realm/Tools/The prep & prototyping/Get to hacking!/Womanium Process.md @@ -0,0 +1,18 @@ +# Womanium 2022 + +Here I will go through all research, steps, processes, tests, and methods used for the Womanium Hackathon. + +The main github repo: https://github.com/spendierk/Womanium_Hackathon_TKET_2022 + +*Primary Goals include:* + - [Building](https://github.com/spendierk/Womanium_Hackathon_TKET_2022/blob/main/Building%20circuits%20with%20pytket.ipynb) circuits with ``pytket`` + - comparing againsts others with [Arline Benchmarks](obsidian://open?vault=Coding%20Tips&file=Arline%20Benchmarks) + - Solving for the hydrogen storage problem with LiCl molecule as found [here](https://qiskit.org/documentation/nature/tutorials/03_ground_state_solvers.html). + +--- + + +## A-Z: Arline Benchmarks: +1. Firstly, it was discussed that the [arline benchmark](https://github.com/ArlineQ/arline_benchmarks)s will be a good place to begin to compare quantum processing speeds! Begin by following that and installing that on your machine. + +- the verified optimizer for quantum circuits or [VOQC](https://github.com/inQWIRE/pyvoqc) is another analysis tool we will need. Install that as well. \ No newline at end of file diff --git a/Computers/Quantum Realm/Welcome to Quantum 101.md b/Computers/Quantum Realm/Welcome to Quantum 101.md new file mode 100644 index 0000000..bcdc248 --- /dev/null +++ b/Computers/Quantum Realm/Welcome to Quantum 101.md @@ -0,0 +1,21 @@ +# Welcome! + +You've become curious as any adventurer would and have decided to embark on a grand journey: the journey to understand quantum - in all of its computation, application, and more. It's a journey I'm undergoing myself as I begin to write this and instead of creating an archive of quantum papers, code, games, platforms, tools, research, or more I thought it'd be more impactful to create an obsidian knowledge base as I continue to grow into the quantum journey along with you all. + +This will be helpful to me as both review and discovery as well as hopefully to you and others who have decided in various moments in life to begin the path to conquer what lies at the end of the quantum quest. + + + +[Next up](obsidian://open?vault=Coding%20Tips&file=Computers%2FQuantum%20Realm%2FIntro%20to%20Quantum%20Technologies): Look over at THE intro to quantum tech to get up to speed. [--> ](obsidian://open?vault=Coding%20Tips&file=Computers%2FQuantum%20Realm%2FTechnologies%2FIntro%20to%20Quantum%20Technologies) + +Welcome & Good Luck! ^-^ + +--- + +##### When finished: the 3 current main applications +As said by Konstantinos there are generally **three large pillars** of application to use QC for: + +1. [Optimizations](obsidian://open?vault=Coding%20Tips&file=Quantum%20Optimizations) +2.[ Machine Learning ](obsidian://open?vault=Coding%20Tips&file=Quantum%20Machine%20Learning) +3. [Simulations](obsidian://open?vault=Coding%20Tips&file=Quantum%20Simulations) + diff --git a/Computers/Terminal Tips/About terminal.md b/Computers/Terminal Tips/About terminal.md new file mode 100644 index 0000000..abe7077 --- /dev/null +++ b/Computers/Terminal Tips/About terminal.md @@ -0,0 +1,20 @@ +# Your terminal is everything! + +Your terminal is the main way that you interact with the machine. So you have to make sure that it is optimized to be as lightweight as possible. + +If you ever want to take a screen recording of the terminal just type in: +``` +asciinema rec +``` + +Copy and paste with [xclip](https://github.com/astrand/xclip)! You can even [share](https://www.fosslife.org/2-tools-linux-terminal-sharing?cmid=4a5288c5-330b-4694-a774-0e44f9a5fa28) your terminal screen with multiple users using screen & tmux. + +--- + + +Eventually the goal is to port the info I've gather on [this](https://docs.google.com/document/d/1HSj4i64hM6291LXvIoWxMJfYn35geWJaAWY9oXkOmm0/edit#) document over to here..eventually. + + +- The whole bash versus zsh debate is nicely compared to on [this](https://stackabuse.com/zsh-vs-bash/) site. Both are great, use whichever you prefer. + +- There is a near infinite amount of things to play around and improve on in your terminal - thus [Terminal To-do's](obsidian://open?vault=Coding%20Tips&file=Terminal%20To-do's) are born. \ No newline at end of file diff --git a/Computers/Terminal Tips/Shells/Bash.md b/Computers/Terminal Tips/Shells/Bash.md new file mode 100644 index 0000000..6f86703 --- /dev/null +++ b/Computers/Terminal Tips/Shells/Bash.md @@ -0,0 +1,3 @@ +# Bash + +Bash is a classic and should always be understood. After all, it was the first shell that you used so there's a bit of nostalgia surrounding it. \ No newline at end of file diff --git a/Computers/Terminal Tips/Shells/Zsh.md b/Computers/Terminal Tips/Shells/Zsh.md new file mode 100644 index 0000000..009d042 --- /dev/null +++ b/Computers/Terminal Tips/Shells/Zsh.md @@ -0,0 +1,7 @@ +# Zsh + +Zsh is a bit trendier nowadays and it is the current shell of choice for my system now. So, having tips of navigation here is a bit important. + +--- + +- Oh-my-zsh is a very popular customization tool to [pimp](https://stackabuse.com/pimp-my-terminal-an-introduction-to-oh-my-zsh/) out your terminal \ No newline at end of file diff --git a/Computers/Terminal Tips/Shells/package managers/Fink.md b/Computers/Terminal Tips/Shells/package managers/Fink.md new file mode 100644 index 0000000..60ba25e --- /dev/null +++ b/Computers/Terminal Tips/Shells/package managers/Fink.md @@ -0,0 +1,58 @@ +# Fink + +Fink is a really useful package that allows you to use those **"sudo apt-get**" commands that you love so well rather than just relying on mac OS's "brew" commands. This is awesome because it opens up a whole new world of Linux packages that aren't previously as easily available with the Apple command-tools. + +And you get to go back to using your more familiar Linux commands that you are more comfortable with anyways! YAY! Time to work + + +--- + +#### quick how-to learned via [the internet](**[https://www.digimantra.com/howto/apple-aptget-command-mac/](https://www.digimantra.com/howto/apple-aptget-command-mac/)**) :') +1. Go to the [source](https://www.finkproject.org/download/srcdist.php) release page and download appropriate package. Since I am mac 10.14 I am able to download the [helper script](https://github.com/fink/scripts/releases/tag/setup/0.45.6) package. (A note: this works only on macOS 10.9-10.15 currently) You should download all the three files you see on the page. **![](https://lh6.googleusercontent.com/THW3OubFhoTD6gnwGVSr4dr7ewVvRmvZSbbyDP80YJJjlLMdbKdqZElReaeeuM2E6dptw84Yb8I2HSuQa0zF4l6mF7T1PMvyHuqCu1I0ytR-0OxGw5VN8zcZpZOsnhqY7Oqo3eqFfYaTE8MrLFtMsQE)** + +2. You will make sure that you have xcode installed (or if you're like me and never bothered to download xcode because it takes up WAYY too much storage space, just the command tools should suffice for ] 10.14) You can check for this by ```sudo xcode-select --install``` + +3. When you double click on InstallFink (right click on "Open with" > "Terminal" if you're not using the safari browser like me) and it will open up in the terminal + +4. Press any key to continue and press "n" if you are not installing xcode (like previously stated, just the commant tools will suffice for 10.14) + +5. Allow it to finish setting up and installing and voila! + +6. Log off and log in and set up the environment via ```/sw/bin/pathsetup.sh``` + +7. You can press enter through a lot of the default configurations (side note - your proxy:  http://shway:moon@jedisailor:00711 , FTP: http://shway:moon@jedisailor:00719) + +8. The basic commands to completing full set up is: +``` +>>>cd fink-0.45.6 + +>>>./bootstrap (to start bootstrap) + +>>>./bootstrap /path (where path is where your directory will be) + +>>>/sw/bin/pathsetup.sh (the default path if not specified) + +``` + +9. Then open a new terminal and in the /sw folder run the following: +``` +>>>fink selfupdate-rsync +>>>fink index -f + +OR + +>>>fink selfupdate-git +>>>fink index -f +``` + +10. To use ```fink``` in terminals going forward the setup.sh script will automatically set up in your .profile +11. Ta da! You can use fink install or sudo apt-get now! For any further info, refer to the [docs](https://www.finkproject.org/doc/index.php). And also make sure to refer to [this](https://www.finkproject.org/doc/usage/index.php) for info on fink keyword usage :) Enjoy. + + +--- + + +#### Things installed via Fink +- **[Wikit](https://www.tecmint.com/wikipedia-commandline-tool/)** - package that allows you to wikipedia summary anything through terminal + - usage: ```wikit ``` +- \ No newline at end of file diff --git a/Computers/Terminal Tips/Shells/package managers/Opam.md b/Computers/Terminal Tips/Shells/package managers/Opam.md new file mode 100644 index 0000000..1f95735 --- /dev/null +++ b/Computers/Terminal Tips/Shells/package managers/Opam.md @@ -0,0 +1,5 @@ +# Opam + +Opam is an open-sourced package manager for OCaml (a functional programming language and system) and supports multiple simultaneous compiler installations, flexible package constraints, and a Git-friendly development workflow. This is a necessary package install that is needed for many of the quantum programs that will be used. + +The full install instructions can be found [here](https://github.com/ocaml/opam). \ No newline at end of file diff --git a/Computers/Terminal Tips/Shells/package managers/Poetry.md b/Computers/Terminal Tips/Shells/package managers/Poetry.md new file mode 100644 index 0000000..0fc166b --- /dev/null +++ b/Computers/Terminal Tips/Shells/package managers/Poetry.md @@ -0,0 +1,90 @@ +# Python Poetry + +A useful python project & package manager that exists within venv & converts to a readable directory. + +--- + + +### Some important commands: + +- Install poetry using the installer: +``` +curl -sSL https://install.python-poetry.org | python3 - +``` +(this is more [recommended](https://python.land/virtual-environments/python-poetry) than simply pip-installing) +this is currently installed in the ```/Users/shwethajayaraj/.local/bin``` for me. + +Output: +``` +Installing Poetry (**1.1.14**): Done + + + +Poetry (**1.1.14**) is installed now. Great! + + + +To get started you need Poetry's bin directory (/Users/shwethajayaraj/.local/bin) in your `PATH` + +environment variable. + + + +Add `export PATH="/Users/shwethajayaraj/.local/bin:$PATH"` to your shell configuration file. + + + +Alternatively, you can call Poetry explicitly with `**/Users/shwethajayaraj/.local/bin/poetry**`. + + + +You can test that everything is set up by executing: + + + +`**poetry --version**` +``` + +- Keeping poetry up to date: +``` +poetry self update +``` + + +- Starting a project with Poetry +``` +poetry new demo +``` + +- Install and remove packages +``` +poetry add requests +``` +``` +poetry remove +``` + + +- install dependences of existing python project (as listed in the pyproject.toml file) +``` +poetry install +``` + +- convert existing project to poetry +``` +cd my-project + +poetry init +``` + +- Starting a shell with the python virtual environment activated +``` +poetry shell +``` + + +### More Useful commands: +- Exporting requirement to a txt file +``` +poetry export -f requirements.txt > requirements.txt +``` diff --git a/Computers/Terminal Tips/Shells/package managers/Terminal To-do's.md b/Computers/Terminal Tips/Shells/package managers/Terminal To-do's.md new file mode 100644 index 0000000..e5df61f --- /dev/null +++ b/Computers/Terminal Tips/Shells/package managers/Terminal To-do's.md @@ -0,0 +1,9 @@ +# Terminal To-do's + +Because customizing your terminal for your computer is FUN! Here is a list of things that is on my tentative list of things I'd like to play around with: + +--- + +~~- Getting [wikit](https://www.tecmint.com/wikipedia-commandline-tool/) set up on the terminal ~~ + - t~~his led to the installation of [fink](obsidian://open?vault=Coding%20Tips&file=Terminal%20Tips%2FFink) as it's only available via Linux commands~~ +- \ No newline at end of file diff --git a/Computers/Terminal Tips/Shells/package managers/conda/Anaconda.md b/Computers/Terminal Tips/Shells/package managers/conda/Anaconda.md new file mode 100644 index 0000000..90fddf5 --- /dev/null +++ b/Computers/Terminal Tips/Shells/package managers/conda/Anaconda.md @@ -0,0 +1,20 @@ +# Anaconda python environment manager + +Anaconda is a great tool used by large machine learning projects and teams to create virtual environments to run their program on. It is often more useful than venv nowadays and a way to run your app without needing to containerize it through Docker or Kubernetes. + +#### Some important commands: + +To see all conda environments available: +``` +conda info --envs +``` + + +For more detailed info, refer to the [docs](https://docs.conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html). + +--- + +**To return a list of all the virtual environments you've made, search:** +``` +find ~ -d -name "site-packages" 2>/dev/null +``` \ No newline at end of file diff --git a/Computers/Terminal Tips/Shells/xonsh/Xonsh.md b/Computers/Terminal Tips/Shells/xonsh/Xonsh.md new file mode 100644 index 0000000..72f9cd0 --- /dev/null +++ b/Computers/Terminal Tips/Shells/xonsh/Xonsh.md @@ -0,0 +1,47 @@ +# Xonsh Stuff + +Xonsh is basically a terminal for python which is super cool but even better because you can literally also do bash commands inside it. + +Begin by simply typing ``xonsh`` into the terminal. + +## Setting up an environment +There is entirely no need for conda here as it can be done with a simple vox command: +1. Load the xontrig by typing: +``` +xontrib load vox +``` + +2. Create a new environment: +``` +vox new world1 +``` + +3. List any existing or activate the environment: +``` +$ vox list +Available environments: + eggs + world1 + spam +``` + +``` +$ vox activate world1 + Activated "world1". +``` + +4. More info found here such as: [Exit or remove the environment ](https://xon.sh/python_virtual_environments.html) + + +--- + +- there is a xonsh [vim file ](https://xon.sh/python_virtual_environments.html) but to be quite honest, you already have kite installed and that seems a lot better. +- if every in doubt just type in cheatsheet +- Make python extensions with [xontrib](https://asciinema.org/a/499605) + + +## Things installed with xontrib +- xontrib-avox +- xontrib loaded the [prompt-bar](https://github.com/anki-code/xontrib-prompt-bar) +- xontrib loaded the [cheatsheet](https://github.com/anki-code/xonsh-cheatsheet/blob/main/README.md +- \ No newline at end of file diff --git a/Computers/Terminal Tips/Shells/xonsh/Xontrib-avox.md b/Computers/Terminal Tips/Shells/xonsh/Xontrib-avox.md new file mode 100644 index 0000000..108c256 --- /dev/null +++ b/Computers/Terminal Tips/Shells/xonsh/Xontrib-avox.md @@ -0,0 +1,26 @@ +# Xontrib-avox + +This is a way to activate new environments and unactivate environments as you cd around projects. This is a lot more useful than conda as it treats projects as directories (similar to how obsidian works) . + +Example: + +1. setting a project as ```$PROJECT_DIRS = [p'~/code']``` +2. setting a project directory as ```~/code/spam ``` +3. ```avox``` then will use the venv name as ```spam``` + + +### Installation + +``` +pip install xontrib-avox +``` + +or just clone the original [repo](https://github.com/AstraLuma/xontrib-avox) with pip. + +#### Configuration +You must configure ```$PROJECT_DIRS``` by: + +``` +$PROJECT_DIRS = ["~/code"] +``` + diff --git a/Python/Projects/API Python.md b/Python/Projects/API Python.md new file mode 100644 index 0000000..ee6d5d9 --- /dev/null +++ b/Python/Projects/API Python.md @@ -0,0 +1,9 @@ +# API creation in python + +There are several ways to do this in an effective way. + +- This [tutorial](https://www.youtube.com/watch?v=5ZMpbdK0uqU) is the start of a simple way to create using a flask application and ngrok for a public api. + - [ngrok](https://ngrok.com/#) - a necessary tool for api creation + - pycharm is the IDE of choice here + - flask application + - check out debug tips \ No newline at end of file diff --git a/Python/Projects/Machine Learning/ML Management.md b/Python/Projects/Machine Learning/ML Management.md new file mode 100644 index 0000000..dd08e91 --- /dev/null +++ b/Python/Projects/Machine Learning/ML Management.md @@ -0,0 +1,25 @@ +# ML Management +This will be important to keep a log of all of the tests that you'll want to run as you begin the EDA process. + +**Sacred** +- [Sacred](https://github.com/IDSIA/sacred) is a fantastic open-source tool to use to pipeline the test process. As explained [here](https://towardsdatascience.com/managing-machine-learning-projects-226a37fc4bfa), it can really help to log all of the runs that you do with your model. + +- Use [CatalyzeX](https://chrome.google.com/webstore/detail/aiml-papers-with-code-eve/aikkeehnlfpamidigaffhfmgbkdeheil?hl=en) for code with ML papers. + +- Python [wrapper](https://github.com/nottheswimmer/dalle) for Dall-E API + +- PyTorch package to train and audit ML models for[ Individual Fairness](https://github.com/IBM/inFairness) + +- [Truss](https://www.baseten.co/) serves any model without boilerplate code + + + +**Deep Note & more ML repos** +- [Deep Note](https://deepnote.com/workspace/windtelligent-e87f4ef4-a5f5-4f9b-8def-624a9e35da51/project/Welcome-2ef6e214-0da3-4ac5-9287-5e0d8ca5839f/%2Fnotebook.ipynb) is being used along with[ hugging face](https://huggingface.co/) to document an indepth analaysis on ML python tools +- [BLOOM](https://huggingface.co/bigscience/bloom) 176 billion parameter LLM model created by researchers & FOSS + - here are some [examples](https://github.com/Sentdex/BLOOM_Examples) + +--- + +#### Further reading and tutorials: +[Animated](https://nnfs.io/neural_network_animations) tutorials of Neural Networks \ No newline at end of file diff --git a/Python/Projects/Testing/Testing in python.md b/Python/Projects/Testing/Testing in python.md new file mode 100644 index 0000000..592eb65 --- /dev/null +++ b/Python/Projects/Testing/Testing in python.md @@ -0,0 +1,29 @@ +# Testing functions + + +Once you have created your definitions you want to put them in a main class and have something to display if the functions passed. For example: + + +``` + def test_sum(): + assert sum([1, 2, 3]) == 6, "Should be 6" + +def test_sum_tuple(): + assert sum((1, 2, 2)) == 6, "Should be 6" + +if __name__ == "__main__": + test_sum() + test_sum_tuple() + print("Everything passed") +``` + + +This [site](https://realpython.com/python-testing/) has several differnt testing methods that can be used with python. Unittest, nose, and [pytest](https://docs.pytest.org/en/latest/) are the most commonly used. + +How to execute pytest: +https://docs.pytest.org/en/latest/ + +## testing paradigms in python +- tox +- pytest +- \ No newline at end of file diff --git a/Python/Welcome to Python.md b/Python/Welcome to Python.md new file mode 100644 index 0000000..f29018a --- /dev/null +++ b/Python/Welcome to Python.md @@ -0,0 +1,35 @@ +## Welcome to Python + + +“The joy of coding Python should be in seeing short, concise, readable classes that express a lot of action in a small amount of clear code — not in reams of trivial code that bores the reader to death.” + +— Guido van Rossum + + +**All the resources that I could ever have when it comes to python. It was doing me no good having it in google drive folder. Instead Obsidian is here for the rescue! + +--- + + +1. Pick Your IDE! + - [jupyterlab](obsidian://open?vault=Coding%20Tips&file=[[Jupyter]]) + - PyCharm + - VSCode + - [iPython](obsidian://open?vault=Coding%20Tips&file=IPython) + - [Colab](https://drive.google.com/drive/folders/1Onol-r4UUfwz-CxSt4FkhSD8_CLa1U3S?usp=sharing) + - the best way to understand something is to [reverse engineer](https://dagshub.com/blog/reverse-engineering-google-colab/) it. + +2. The basics. + - [Dive in](https://diveinto.org/python3/table-of-contents.html) here! + - It's good to reference the [docs](https://docs.python.org/3/tutorial/) too + - ultinately though it's how well you use your [tools](obsidian://open?vault=Coding%20Tips&file=Python%2Ftools%2FAbout%20Tool) with python. + +3. Practice makes Perfect! + - here are [practice](obsidian://open?vault=Coding%20Tips&file=Coding%20Assessment%2FPractice%20Problems%2FAmazon%20Python%20problem%201) problems + - [test them ](obsidian://open?vault=Coding%20Tips&file=Python%2FProjects%2FTesting%2FTesting%20in%20python)out & show as you go. + - this is the official [reference](https://python-reference.readthedocs.io/en/latest/docs/functions/index.html) to use + +Note to self: organize the info put together [here](https://docs.google.com/document/d/1omDv8IhUAnflVvrEEYNvERqWtZeg8H93QsYrXCVRpXs/edit) from many years ago as next task put it into practice in obsidian/wherever + + +sidenote: a few [formatting]([https://notes.dannyhatcher.com/Notes/Markdown+Formatting](https://notes.dannyhatcher.com/Notes/Markdown+Formatting)) tips for obsidian going forward. \ No newline at end of file diff --git a/Python/codes/About codes.md b/Python/codes/About codes.md new file mode 100644 index 0000000..38b361c --- /dev/null +++ b/Python/codes/About codes.md @@ -0,0 +1,15 @@ +## About code + +I think the point of things here is to maintain a collection of code and knowledge bases so that you don't have to keep rewriting the freaking wheel. + + +- [[convert a .ipynb to .py]] + +- [bulk Convert Python files to IPython Notebook Files (py to ipynb conversion) +](https://www.webucator.com/article/bulk-convert-python-files-to-ipython-notebook-file/) + +- Saving i[python notebooks to AWS S3](https://github.com/davidbrai/ipythonnb-s3) buckets. And alternatively automating ML within amazon[ with CodeWhisperer](https://aws.amazon.com/blogs/aws/now-in-preview-amazon-codewhisperer-ml-powered-coding-companion/). Setting up mySQL [database](https://towardsdatascience.com/how-to-set-up-an-aws-mysql-database-c33eba8870eb) to AWS is of use too. + +- using[ list comprehension](obsidian://open?vault=Coding%20Tips&file=Python%2Fcodes%2Flist%20comprehension%20example) rather than loops and other conditionals may also save time + +- using the [lambda](obsidian://open?vault=Coding%20Tips&file=Python%2Flambda) function and other functions will also save time \ No newline at end of file diff --git a/Python/codes/Lists/Enumerate().md b/Python/codes/Lists/Enumerate().md new file mode 100644 index 0000000..84bddbe --- /dev/null +++ b/Python/codes/Lists/Enumerate().md @@ -0,0 +1,51 @@ +# Enumerate() method + + +Enumerate() function returns an enumerate object. You cannot loop through an enumerate object so have to convert it to a list like so: + +```jupyter +list(enumerate(shopping_list)) + +# Output +[(0, 'fruits'), + (1, 'cookies'), + (2, 'cereals'), + (3, 'protein bars'), + (4, 'post-it notes')] +``` + +the next() method on ther iterator object is used to retreive successive items. + +``` +shopping_list_enum = enumerate(shopping_list) +``` + +When you make calls from the next() function you get: +```jupyter +next(shopping_list_enum) +# (0, 'fruits') +next(shopping_list_enum) +# (1, 'cookies') +next(shopping_list_enum) +# (2, 'cereals') +next(shopping_list_enum) +# (3, 'protein bars') +next(shopping_list_enum) +# (4, 'post-it notes') + +``` + + +```jupyter +for index, item in enumerate(shopping_list, start = 1): + print(f"index:{index}, item:{item}") + +# Output +index:1, item:fruits +index:2, item:cookies +index:3, item:cereals +index:4, item:protein bars +index:5, item:post-it notes +``` + +You can use enumerate function to loop through Python strings, dictionaries, and tuples! \ No newline at end of file diff --git a/Python/codes/Lists/Itertools Next() in list.md b/Python/codes/Lists/Itertools Next() in list.md new file mode 100644 index 0000000..a7bbd5b --- /dev/null +++ b/Python/codes/Lists/Itertools Next() in list.md @@ -0,0 +1,18 @@ +# Use the itertools library + + +Get the next element in python List using next(): + + + +```jupyter +from itertools import cycle + +list_colors = ['red','blue', 'green', 'black'] + +colors = cycle(list_colors) + +for i in range(10): + print(next(colors)) + +``` diff --git a/Python/codes/Lists/List len().md b/Python/codes/Lists/List len().md new file mode 100644 index 0000000..5c510c3 --- /dev/null +++ b/Python/codes/Lists/List len().md @@ -0,0 +1,9 @@ +# Len() function + +The length of a list via the len() function can be confusing as it can be used in conjuction with range() as well as with a colon in signifying the beginning or end of a list. + +```a[len(a):]```  +- This gets you the length of a to the end. It selects a range. + +If you reverse: +`a[:len(a)]` it will get you the beginning to whatever is `len(a)`. \ No newline at end of file diff --git a/Python/codes/Lists/Lists.md b/Python/codes/Lists/Lists.md new file mode 100644 index 0000000..cdeb415 --- /dev/null +++ b/Python/codes/Lists/Lists.md @@ -0,0 +1,95 @@ +# Lists + +The list structure in python is extremely useful in making certain processes iterate faster. + + +The basic structure is: +``` + +for item in : + # do something on item + +# item: looping variable +# : any Python iterable: list, tuple, dictionary, string, and so on. + +``` + +```python +farm = list() +``` + +The colon: +```python +[1:5] is equivalent to "from 1 to 5" (5 not included) +[1:] is equivalent to "1 to end" +[len(a):] is equivalent to "from length of a to end" +``` + +For example let's take a shopping list: + +```jupyter +shopping_list = ["fruits","cookies","cereals","protein bars","post-it notes"] + +for item in shopping_list: + print(item) + +# Output +fruits +cookies +cereals +protein bars +post-it notes +``` + +Now, using an index we can also increment inside the loop! +```jupyter + +index = 0 +for item in shopping_list: + print(f"index:{index}, {item}") + index += 1 + +# Output +index:0, fruits +index:1, cookies +index:2, cereals +index:3, protein bars +index:4, post-it notes + +``` +This may not be efficient though since you always have to remember to increment the index. + + +## Range() +The ```len()``` function return the length of any python object. The ```range()``` function return a range object which you can use for looping. + +So then you can do: +```jupyter +for index in range(len(shopping_list)): + print(f"index:{index}, item: {shopping_list[index]}") + +# Output +index:0, item: fruits +index:1, item: cookies +index:2, item: cereals +index:3, item: protein bars +index:4, item: post-it notes +``` + +The [enumerate()](obsidian://open?vault=Coding%20Tips&file=Python%2Fcodes%2Flist%20comprehension%20example) function takes this to the next level. + +Sum of odd numbers in a list: + +```jupyter + + +lst = [0, 4, 6, 9, 2, 3, 1] + +s = sum([num for num in lst if num % 2 != 0]) + +print(s) + +#Output: +13 +``` + diff --git a/Python/codes/Lists/list comprehension example.md b/Python/codes/Lists/list comprehension example.md new file mode 100644 index 0000000..0a5af2b --- /dev/null +++ b/Python/codes/Lists/list comprehension example.md @@ -0,0 +1,76 @@ +# List comprehension + + +As stated, list comprehension saves time and codes. It is a simple way to generate a list comparing to using loops. + +Instead of creating a for loop to create a list of squares the same can be done in this way: + +``` +x_square_lc=[i**2 for i in x] +print(x_square_lc) +``` + +And the output would be: 1, 4, 9, 15, 25 + + +--- +## Loop through two lists with zip() +``` +for f, b in zip(foo, bar): + print(f, b) +``` + +A quick note on the the index of next element of a [list](https://iambipin.medium.com/accessing-next-element-while-iterating-python-tips-44a6fc563490) This adds the element with the next element in the list and outputs a new list. + +## Enumerate() +For more on enumerate() go [here](obsidian://open?vault=Coding%20Tips&file=Enumerate()). +```jupyter +list1 = [1, 8, 3, 4, 9, 6] +new_list = [] +for index, elem in enumerate(list1): + current_elem = elem + next_elem = list1[index+1] + new_list.append(current_elem + next_elem) + +print(new_list) + +``` + +However the above is incorrect in python, it should actually be: +```jupyter + +new_list = [] +for index, elem in enumerate(list1): +if(index<(len(list1)-1)): +new_list.append(elem + list1[index+1]) +else: +new_list.append(elem) + +print(new_list) + + +``` + +IndexError can quickly be fixed with this: +``` +if(index<(len(list1)-1)): +``` + +This can also be much more quickly done with list comprehension: +```jupyter +new_list = [elem+list1[index+1] if(index<(len(list1)-1)) else elem for index, elem in enumerate(list1)] +print(new_list) + +Output: +[9, 11, 7, 13, 15, 6] + +``` + + +breaking down list comprehension: +``` +new_list = [elem+list1[index+1] if(index<(len(list1)-1)) else elem for index, elem in enumerate(list1)] + +``` + +Take a moment to understand what is going on there! \ No newline at end of file diff --git a/Python/codes/More data types/Explicitly Defining datatype in python function.md b/Python/codes/More data types/Explicitly Defining datatype in python function.md new file mode 100644 index 0000000..620d9a3 --- /dev/null +++ b/Python/codes/More data types/Explicitly Defining datatype in python function.md @@ -0,0 +1,37 @@ +Unlike other languages likein Java, C, etc, python is a strongly-typed dynamic language so we havet to specify the data type. + +Only way to specify data of specific types if by providing eplcot dataty[es while calling functions] +```jupyter +# function definition +def add(num1, num2): + print("Datatype of num1 is ", type(num1)) + print("Datatype of num2 is ", type(num2)) + return num1 + num2 + +# calling the function without +# explicitly declaring the datatypes +print(add(2, 3)) + +# calling the function by explicitly +# defining the datatype as float +print(add(float(2), float(3))) + +``` + +function for string concatenation: +```jupyter +# function definition +def concatenate(num1, num2): + print("Datatype of num1 is ", type(num1)) + print("Datatype of num2 is ", type(num2)) + return num1 + num2 + +# calling the function without +# explicitly declaring the datatypes +print(concatenate(111, 100)) + +# calling the function by explicitly +# defining the datatype as float +print(concatenate(str(111), str(100))) + +``` \ No newline at end of file diff --git a/Python/codes/More data types/Trees in python.md b/Python/codes/More data types/Trees in python.md new file mode 100644 index 0000000..a4b85e8 --- /dev/null +++ b/Python/codes/More data types/Trees in python.md @@ -0,0 +1,52 @@ +# Trees in Python + + +Written by the author of the [anytree](https://pypi.org/project/anytree/) package: +``` + +```python +from anytree import Node, RenderTree + +udo = Node("Udo") +marc = Node("Marc", parent=udo) +lian = Node("Lian", parent=marc) +dan = Node("Dan", parent=udo) +jet = Node("Jet", parent=dan) +jan = Node("Jan", parent=dan) +joe = Node("Joe", parent=dan) + +print(udo) +Node('/Udo') +print(joe) +Node('/Udo/Dan/Joe') + +for pre, fill, node in RenderTree(udo): + print("%s%s" % (pre, node.name)) +Udo +├── Marc +│ └── Lian +└── Dan + ├── Jet + ├── Jan + └── Joe + +print(dan.children) +(Node('/Udo/Dan/Jet'), Node('/Udo/Dan/Jan'), Node('/Udo/Dan/Joe')) +``` + +or without using a package the way to do it would be: + +``` +class Tree: + def __init__(self, data): + self.children = [] + self.data = data + +left = Tree("left") +middle = Tree("middle") +right = Tree("right") +root = Tree("root") +root.children = [left, middle, right] + +``` + diff --git a/Python/codes/More data types/lambda.md b/Python/codes/More data types/lambda.md new file mode 100644 index 0000000..6adb0da --- /dev/null +++ b/Python/codes/More data types/lambda.md @@ -0,0 +1,109 @@ +# Lambda + +Lambda is a small anonymous fucntion that behaves like a normal function. For example, instead of calculating square it is possible to simply do: + +``` +cal_square = lambda(x:x**2) +``` + +Can also use lambda to sort using your own defined functions. For example: + +``` +a=['a1', 'a128', 'a33', 'b78', 'd99', 'z782'] +sorted(a, key==lambda x:int(x[1:])) +``` +Output will return: +['a1', 'a33', 'b78', 'd99', 'a128', 'z782'] + +Lambda can also be used manipulate pandas dataframes by using ```apply``` : +``` +df=pd.DataFrame({'a':[1,2,3], 'b':[4,5,6], 'c':[7,8,9]}) +df +``` + +![[Pasted image 20220708092152.png]] + +``` +df['sum_abc']=df.apply(lambda x:x.a+x.b+x.c, axis=1) +df +``` + +![[Pasted image 20220708092319.png]] + +--- + +## map() function + +```map``` takes a function and as a list as parameters, it applies the function to every item in the list. It avoids loops and is faster. + +example: +``` +def cal_square(x): + return x**2 + +x=[1,2,3,4,5] + +list(map(cal_square, x)) +``` + +Output: [1,4,9,16,25] + +---- + +## filter() function + +```filter``` applyies a filter to a list and returns items that satisfied the conditions. If only want positive items in a list for instance simply apply ```filter``` to the list. For example: + +``` +def filter_pos(x): + return x>0 + +x=[1,2,3,4,5,-1,-2,-3,-4,-5] +list(filter(filter_pos, x)) +``` +Output: [1,2,3,4,5] + +--- + +## Join() function + +You should use join to concatenate strings toogether. Though the straightforward way to join strings is to use ```+``` , for example: + +``` +x = ['7', 'Python', 'Tricks', 'to', 'Make', 'Your', 'Code', 'Better', 'and', and 'Smarter'] +title='' +for i in x: + title=title+ ' '+i +print(title) +``` + +but instead can just do: + +``` +x = ['7', 'Python', 'Tricks', 'to', 'Make', 'Your', 'Code', 'Better', 'and', and 'Smarter'] + +title=' '.join(x) +print(title) +``` + +Both will still output '7 Python Tricks to Make Your Code Better and Smarter' + +--- + +## enumerate() + +This adds counters to the data which can be very useful. + +``` +x = somelist.csv + +for count,ele in enumerate(x,start=0): + print(count,ele) + +``` + +output: +0 firstitem +1 seconditem +2 thirditem +...and so on \ No newline at end of file diff --git a/Python/codes/String Manipulation.md b/Python/codes/String Manipulation.md new file mode 100644 index 0000000..83fa9d2 --- /dev/null +++ b/Python/codes/String Manipulation.md @@ -0,0 +1,64 @@ +# String Manipulation + +Shortcuts, cheatsheets, and sample codes that may be frequently used for strings. + + +--- + + +How to remove every other letter from a string: + +```python +>>> 'abcdefg'[::2] +>'aceg' +``` + +--- + + +To remove all characters after a specific character/substring from a string, you must use the str.replace() method in Python 3.+: + +```python + +list_str = {'Abc.ex', 'Bcd.ex', 'cde.ex', 'def.jpg', 'efg.jpg'} +new_set = {x.replace('.ex', '').replace('.jpg', '') for x in list_str} +print(new_set) + +``` + +output: +``` +{'Bcd', 'Abc', 'cde', 'def', 'efg'} +``` + +Can also use str.removesuffix('suffix') method which will remove suffix if there is one, and if there isn't will return original word: + +```python +text = 'Quickly' +print(text.removesuffix('ly')) +print(text.removesuffix('World')) +``` + +output: + +``` +Quick +Quickly +``` +the partition method was introduced in python 2.5 and can also be used to get rid of a section. + +```python +text = 'text.com/yes/?/noandifwillthisbethere' + +head, sep, tail = text.partition('?') + +print(head) +``` +output: +``` +text.com/yes/ + +``` + +--- + diff --git a/Python/codes/arrays/About arrays.md b/Python/codes/arrays/About arrays.md new file mode 100644 index 0000000..787a153 --- /dev/null +++ b/Python/codes/arrays/About arrays.md @@ -0,0 +1,57 @@ +# Arrays in Python + +Arrays in python are a largely different data structure entirely than the more commonly used [list](obsidian://open?vault=Coding%20Tips&file=Python%2Fcodes%2FLists%2FLists), and different still than the pythonic dictionary. Arrays are different than lists than in the sense that they are used for entirely different purposes as lists are more iterable and arrays have the advantage of being of fixed size. + +In python3, they are most commonly called by using [numpy](obsidian://open?vault=Coding%20Tips&file=Python%2Ftools%2Fnumpy%2Fnumpy) array. + +It is used by creating an ```np.array([])``` call. + + +#### 0-D array +This is simply the same as just having one object + +``` +import numpy as np +arr = np.array(42) +print(arr) +``` + + +#### 1-D array +This is a more classic array that we can set of fixed size. +``` +import numpy as np +arr = np.arr([1, 2, 3, 4, 5]) +print(arr) +``` + + +#### 2-D array +Arrays that have 1-D arrays as its elements and are often used to represent matrix or 2nd order tensors. Numpy has a sub module called ```numpy.mat``` to deal with such operations. + +``` +import numpy as np + +arr = np.array([[1, 2, 3], [4, 5, 6]]) + +print(arr) +``` + +#### Higher DImensional arrays +Create a defined number of dimensions by using ```ndmin``` argument like so: + +A 5 dimensional array: +``` + +import numpy as np + +arr = np.array([1, 2, 3, 4], ndmin=5) + +print(arr) +print('number of dimensions :', arr.ndim) +``` + + +## To check the number of dimensions + +Simply use the ```ndim ``` attribute on an object. \ No newline at end of file diff --git a/Python/codes/arrays/Initialize array of fixed length.md b/Python/codes/arrays/Initialize array of fixed length.md new file mode 100644 index 0000000..ed7e367 --- /dev/null +++ b/Python/codes/arrays/Initialize array of fixed length.md @@ -0,0 +1,26 @@ +# Initializing array of fixed size + +Thanks to the wizards of StackOverflow: + +``` + +>>> lst = [None] * 5 +>>> lst +[None, None, None, None, None] +``` + +The way to specifically define an array beautifully answered by a wizard in StackOverflow: +``` +a = numpy.empty(n, dtype=object) +``` + +his creates an array of length n that can store objects. It can't be resized or appended to. In particular, it doesn't waste space by padding its length. This is the Python equivalent of Java's: + +``` + +\\Ah! Something I'm familiar with!! +Object[] a = new Object[n]; + +``` + +If you're really interested in performance and space and know that your array will only store certain numeric types then you can change the dtype argument to some other value like int. Then numpy will pack these elements directly into the array rather than making the array reference int objects. \ No newline at end of file diff --git a/Python/images/7ohP4GDMGPrVKxNbijdYKdEFPk8EPgGeuMyZkPMZq1FL4wBRzD1xeYFiqQLTyUQNR5Fs2fwZYw8seUnx9UhiZzSoWLXCNHcywUUm.gif b/Python/images/7ohP4GDMGPrVKxNbijdYKdEFPk8EPgGeuMyZkPMZq1FL4wBRzD1xeYFiqQLTyUQNR5Fs2fwZYw8seUnx9UhiZzSoWLXCNHcywUUm.gif new file mode 100755 index 0000000..768951d Binary files /dev/null and b/Python/images/7ohP4GDMGPrVKxNbijdYKdEFPk8EPgGeuMyZkPMZq1FL4wBRzD1xeYFiqQLTyUQNR5Fs2fwZYw8seUnx9UhiZzSoWLXCNHcywUUm.gif differ diff --git a/Python/images/Pasted image 20220703231737.png b/Python/images/Pasted image 20220703231737.png new file mode 100644 index 0000000..29e2d01 Binary files /dev/null and b/Python/images/Pasted image 20220703231737.png differ diff --git a/Python/images/Pasted image 20220705203711.png b/Python/images/Pasted image 20220705203711.png new file mode 100644 index 0000000..81c9ea9 Binary files /dev/null and b/Python/images/Pasted image 20220705203711.png differ diff --git a/Python/images/Pasted image 20220708092152.png b/Python/images/Pasted image 20220708092152.png new file mode 100644 index 0000000..982bab3 Binary files /dev/null and b/Python/images/Pasted image 20220708092152.png differ diff --git a/Python/images/Pasted image 20220708092319.png b/Python/images/Pasted image 20220708092319.png new file mode 100644 index 0000000..511fd37 Binary files /dev/null and b/Python/images/Pasted image 20220708092319.png differ diff --git a/Python/images/Pasted image 20220708093923.png b/Python/images/Pasted image 20220708093923.png new file mode 100644 index 0000000..a0738c2 Binary files /dev/null and b/Python/images/Pasted image 20220708093923.png differ diff --git a/Python/images/Pasted image 20220708093939.png b/Python/images/Pasted image 20220708093939.png new file mode 100644 index 0000000..6258cda Binary files /dev/null and b/Python/images/Pasted image 20220708093939.png differ diff --git a/Python/images/Pasted image 20220708094039.png b/Python/images/Pasted image 20220708094039.png new file mode 100644 index 0000000..3558b56 Binary files /dev/null and b/Python/images/Pasted image 20220708094039.png differ diff --git a/Python/images/Pasted image 20220708094155.png b/Python/images/Pasted image 20220708094155.png new file mode 100644 index 0000000..50948d1 Binary files /dev/null and b/Python/images/Pasted image 20220708094155.png differ diff --git a/Python/images/Pasted image 20220708094636.png b/Python/images/Pasted image 20220708094636.png new file mode 100644 index 0000000..65959bc Binary files /dev/null and b/Python/images/Pasted image 20220708094636.png differ diff --git a/Python/images/Pasted image 20220708094651.png b/Python/images/Pasted image 20220708094651.png new file mode 100644 index 0000000..bcf89c8 Binary files /dev/null and b/Python/images/Pasted image 20220708094651.png differ diff --git a/Python/images/Pasted image 20220708094708.png b/Python/images/Pasted image 20220708094708.png new file mode 100644 index 0000000..a721c87 Binary files /dev/null and b/Python/images/Pasted image 20220708094708.png differ diff --git a/Python/images/Pasted image 20220709153922.png b/Python/images/Pasted image 20220709153922.png new file mode 100644 index 0000000..ce939ce Binary files /dev/null and b/Python/images/Pasted image 20220709153922.png differ diff --git a/Python/images/Pasted image 20220709155517.png b/Python/images/Pasted image 20220709155517.png new file mode 100644 index 0000000..7831d17 Binary files /dev/null and b/Python/images/Pasted image 20220709155517.png differ diff --git a/Python/images/Pasted image 20220709155559.png b/Python/images/Pasted image 20220709155559.png new file mode 100644 index 0000000..8406ce1 Binary files /dev/null and b/Python/images/Pasted image 20220709155559.png differ diff --git a/Python/images/Pasted image 20220709161121.png b/Python/images/Pasted image 20220709161121.png new file mode 100644 index 0000000..f96fd7e Binary files /dev/null and b/Python/images/Pasted image 20220709161121.png differ diff --git a/Python/images/Pasted image 20220709161448.png b/Python/images/Pasted image 20220709161448.png new file mode 100644 index 0000000..98e7530 Binary files /dev/null and b/Python/images/Pasted image 20220709161448.png differ diff --git a/Python/images/Pasted image 20220730121832.png b/Python/images/Pasted image 20220730121832.png new file mode 100644 index 0000000..3542fba Binary files /dev/null and b/Python/images/Pasted image 20220730121832.png differ diff --git a/Python/images/Pasted image 20220825004820.png b/Python/images/Pasted image 20220825004820.png new file mode 100644 index 0000000..e30b01b Binary files /dev/null and b/Python/images/Pasted image 20220825004820.png differ diff --git a/Python/images/Pasted image 20220827183015.png b/Python/images/Pasted image 20220827183015.png new file mode 100644 index 0000000..7af5778 Binary files /dev/null and b/Python/images/Pasted image 20220827183015.png differ diff --git a/Python/images/Pasted image 20220908174202.png b/Python/images/Pasted image 20220908174202.png new file mode 100644 index 0000000..b345fc3 Binary files /dev/null and b/Python/images/Pasted image 20220908174202.png differ diff --git a/Python/images/Untitled.png b/Python/images/Untitled.png new file mode 100755 index 0000000..12244f2 Binary files /dev/null and b/Python/images/Untitled.png differ diff --git a/Python/images/redditsave.com_we_always_have_that_senior_who_solve_everything-y2y8hevqny891.mp4 b/Python/images/redditsave.com_we_always_have_that_senior_who_solve_everything-y2y8hevqny891.mp4 new file mode 100644 index 0000000..0071296 Binary files /dev/null and b/Python/images/redditsave.com_we_always_have_that_senior_who_solve_everything-y2y8hevqny891.mp4 differ diff --git a/Python/tools/About Tool.md b/Python/tools/About Tool.md new file mode 100644 index 0000000..bf42db7 --- /dev/null +++ b/Python/tools/About Tool.md @@ -0,0 +1,15 @@ +# Tools are to be used! + + +There are already hundreds maybe thousands of tools for python that are already programmed for you to use via an import. Here are a collection of such wonderful tools for you to potentially use in your next coding project. While I attempt to further explore some new tools, other more intelligent people than I have already explained many modules such as Doug Hellman who created[ Python 3 Module of the Week](https://pymotw.com/3/). + + +- A multi-purpose[ visual editor ](multi-purpose visual editor to connect Python functions visually (a node editor))to connect Python functions visually +- an easy way to[ build and deploy ML microservices](https://github.com/unionai-oss/unionml) +- A good how-to of[ Django steps ](https://brntn.me/blog/six-things-i-do-every-time-i-start-a-django-project/) +- [Asyncio](https://docs.python.org/3/library/asyncio.html) is super crucial + - is it something [you should use](https://www.laac.dev/blog/should-you-use-asyncio-next-python-web-application/)? +- A pretrained [language model.](https://github.com/yandex/YaLM-100B) with 100B parameters! +- Using [pandas](obsidian://open?vault=Coding%20Tips&file=Python%2Ftools%2FPandas%20tips) and seaborn in jupyter is crucial +- here are some numpy tips +- At the heart of any analysis project is a good set of labeled data, Make sure to use annotations with [tortus](https://towardsdatascience.com/tortus-e4002d95134b). \ No newline at end of file diff --git a/Python/tools/Formatting/Formatting in python.md b/Python/tools/Formatting/Formatting in python.md new file mode 100644 index 0000000..88a1794 --- /dev/null +++ b/Python/tools/Formatting/Formatting in python.md @@ -0,0 +1,112 @@ +# Best Practices for Formatting + + + +Formatting is a huge part of programming in python as it greatly increases readability while going over code. You want your code to be as readable as possible because it is a language that interacts with both other programs and humans at the end of the day. If the code that your write is not readable and simply just works, that is okay too. It is called code for a reason. + +There is an unreal amount of updates that happen for the formatting syntax of Python. Just try to keep up as you go along but don't stress too much about it. + +Realistically though, your code will engage with other humans as well as programs. So always create readability for both yourself as an english language native as well as others. + +Using comments, docstrings, and just good documenting as shown with the [documentation](https://github.com/lilleswing/alphafold/blob/b88f8dacef5d94e4d3d49613d08523feb20caec1/alphafold/data/templates.py#L151) of AlphaFold here is crucial. + +--- + +Sample definition format: + +```jupyter + + +def plot_cv_over_time(scores, stds, fname=None): + +   """ + +   :param scores: list[float] + +   :param stds: list[float] + +   :param fname: string + +   :return: + +       Writes plot to fname.png + +       Plots Cross Validation Score vs Model Number Run + +       Also Plots top3 mean score vs Model Number Run + +   """ + +   top3 = [] + +   top3_at_time = [] + +   for elem in scores: + +       top3.append(elem) + +       top3 = sorted(top3, reverse=True) + +       top3 = top3[:3] + +       top3_at_time.append(np.mean(top3)) + + model_nums = list(range(len(scores))) + +   plt.figure(figsize=(10, 6)) + +   plt.grid() + +   plt.plot(model_nums, scores) + +   plt.plot(model_nums, top3_at_time) + +   plt.errorbar(model_nums, + +                scores, + +                yerr=stds, + +                fmt='o', + +                color='blue') + +   plt.xlabel("Models Ran") + +   plt.ylabel("Score") + +   plt.legend(['Model Executed', 'Mean Top 3']) + +   if fname is None: + +       plt.show() + +   else: + +       if not fname.endswith('.png'): + +           fname = fname + '.png' + +       plt.savefig(fname) + +if trainset is not None: + +       data_metrics = calculate_data_metrics(trainset.y, is_classification) + +       # Performance over course of training + +       _plot_incremental_performance(base_dir, holdout, trainset, hps, + +                                     plot_path, is_classification) + +   else: + +       data_metrics = {} + +   return metrics, data_metrics + + +        +``` + + diff --git a/Python/tools/Frameworks/About Frameworks.md b/Python/tools/Frameworks/About Frameworks.md new file mode 100644 index 0000000..e247e35 --- /dev/null +++ b/Python/tools/Frameworks/About Frameworks.md @@ -0,0 +1,9 @@ +# About Frameworks + +Frameworks are extremely important when actually deploying a fully functional application or program under a template. + +They are key for reusability so the best way to be good at thoroughly grasping them is to use them! Try different ones out it's the only way to grow. + +--- + +There are 8 little frameworks explained [here](). diff --git a/Python/tools/Frameworks/Performance Profiling Libraries.md b/Python/tools/Frameworks/Performance Profiling Libraries.md new file mode 100644 index 0000000..4e2e3bf --- /dev/null +++ b/Python/tools/Frameworks/Performance Profiling Libraries.md @@ -0,0 +1,11 @@ +# Performance Profiling Libraries + + +Given Python's growing use of async metaphors, the ability to profile concurrent code is a powerful tool to havee. + +- Time & TimeIt +- cProfile +- Snakeviz +- Yappi + +These are discussed in more detail [here](https://www.infoworld.com/article/3600993/9-nifty-libraries-for-profiling-python-code.html). \ No newline at end of file diff --git a/Python/tools/Frameworks/Starlette.md b/Python/tools/Frameworks/Starlette.md new file mode 100644 index 0000000..edeeb05 --- /dev/null +++ b/Python/tools/Frameworks/Starlette.md @@ -0,0 +1,19 @@ +# Starlette + + +[Starlette](https://www.starlette.io/) is a lightweight [ASGI](https://asgi.readthedocs.io/en/latest/) framework/toolkit, which is ideal for building async web services in Python. + +It is production-ready, and gives you the following: + +- A lightweight, low-complexity HTTP web framework. +- WebSocket support. +- In-process background tasks. +- Startup and shutdown events. +- Test client built on `requests`. +- CORS, GZip, Static Files, Streaming responses. +- Session and Cookie support. +- 100% test coverage. +- 100% type annotated codebase. +- Few hard dependencies. +- Compatible with `asyncio` and `trio` backends. +- Great overall performance [against independent benchmarks](https://www.techempower.com/benchmarks/#hw=ph&test=fortune&l=zijzen-sf). \ No newline at end of file diff --git a/Python/tools/Frameworks/Tornado.md b/Python/tools/Frameworks/Tornado.md new file mode 100644 index 0000000..5b7e81f --- /dev/null +++ b/Python/tools/Frameworks/Tornado.md @@ -0,0 +1,113 @@ +# Tornado + +[Tornado](http://www.tornadoweb.org/) is a Python web framework and asynchronous networking library, originally developed at [FriendFeed](https://en.wikipedia.org/wiki/FriendFeed). By using non-blocking network I/O, Tornado can scale to tens of thousands of open connections, making it ideal for [long polling](http://en.wikipedia.org/wiki/Push_technology#Long_polling), [WebSockets](http://en.wikipedia.org/wiki/WebSocket), and other applications that require a long-lived connection to each user. + +Tornado can be roughly divided into three major components: + +- A web framework (including [`RequestHandler`](https://www.tornadoweb.org/en/stable/web.html#tornado.web.RequestHandler "tornado.web.RequestHandler") which is subclassed to create web applications, and various supporting classes). + +- Client- and server-side implementions of HTTP ([`HTTPServer`](https://www.tornadoweb.org/en/stable/httpserver.html#tornado.httpserver.HTTPServer "tornado.httpserver.HTTPServer") and [`AsyncHTTPClient`](https://www.tornadoweb.org/en/stable/httpclient.html#tornado.httpclient.AsyncHTTPClient "tornado.httpclient.AsyncHTTPClient")). + +- An asynchronous networking library including the classes [`IOLoop`](https://www.tornadoweb.org/en/stable/ioloop.html#tornado.ioloop.IOLoop "tornado.ioloop.IOLoop") and [`IOStream`](https://www.tornadoweb.org/en/stable/iostream.html#tornado.iostream.IOStream "tornado.iostream.IOStream"), which serve as the building blocks for the HTTP components and can also be used to implement other protocols. + + +The Tornado web framework and HTTP server together offer a full-stack alternative to [WSGI](http://www.python.org/dev/peps/pep-3333/). While it is possible to use the Tornado HTTP server as a container for other WSGI frameworks ([`WSGIContainer`](https://www.tornadoweb.org/en/stable/wsgi.html#tornado.wsgi.WSGIContainer "tornado.wsgi.WSGIContainer")), this combination has limitations and to take full advantage of Tornado you will need to use Tornado’s web framework and HTTP server together. + +---- +Example of concurrent web spider with ```tornado.queues``` + +``` +#!/usr/bin/env python3 + +import asyncio +import time +from datetime import timedelta + +from html.parser import HTMLParser +from urllib.parse import urljoin, urldefrag + +from tornado import gen, httpclient, queues + +base_url = "http://www.tornadoweb.org/en/stable/" +concurrency = 10 + +async def get_links_from_url(url): + """Download the page at `url` and parse it for links. + + Returned links have had the fragment after `#` removed, and have been made + absolute so, e.g. the URL 'gen.html#tornado.gen.coroutine' becomes + 'http://www.tornadoweb.org/en/stable/gen.html'. + """ + response = await httpclient.AsyncHTTPClient().fetch(url) + print("fetched %s" % url) + + html = response.body.decode(errors="ignore") + return [urljoin(url, remove_fragment(new_url)) for new_url in get_links(html)] + +def remove_fragment(url): + pure_url, frag = urldefrag(url) + return pure_url + +def get_links(html): + class URLSeeker(HTMLParser): + def __init__(self): + HTMLParser.__init__(self) + self.urls = [] + + def handle_starttag(self, tag, attrs): + href = dict(attrs).get("href") + if href and tag == "a": + self.urls.append(href) + + url_seeker = URLSeeker() + url_seeker.feed(html) + return url_seeker.urls + +async def main(): + q = queues.Queue() + start = time.time() + fetching, fetched, dead = set(), set(), set() + + async def fetch_url(current_url): + if current_url in fetching: + return + + print("fetching %s" % current_url) + fetching.add(current_url) + urls = await get_links_from_url(current_url) + fetched.add(current_url) + + for new_url in urls: + # Only follow links beneath the base URL + if new_url.startswith(base_url): + await q.put(new_url) + + async def worker(): + async for url in q: + if url is None: + return + try: + await fetch_url(url) + except Exception as e: + print("Exception: %s %s" % (e, url)) + dead.add(url) + finally: + q.task_done() + + await q.put(base_url) + + # Start workers, then wait for the work queue to be empty. + workers = gen.multi([worker() for _ in range(concurrency)]) + await q.join(timeout=timedelta(seconds=300)) + assert fetching == (fetched | dead) + print("Done in %d seconds, fetched %s URLs." % (time.time() - start, len(fetched))) + print("Unable to fetch %s URLS." % len(dead)) + + # Signal all the workers to exit. + for _ in range(concurrency): + await q.put(None) + await workers + +if __name__ == "__main__": + asyncio.run(main()) +``` diff --git a/Python/tools/IPython/Automate Jupyter notebooks with Github Actions.md b/Python/tools/IPython/Automate Jupyter notebooks with Github Actions.md new file mode 100644 index 0000000..b4754f4 --- /dev/null +++ b/Python/tools/IPython/Automate Jupyter notebooks with Github Actions.md @@ -0,0 +1,3 @@ +# Automate actions + +https://innerjoin.bit.io/automate-jupyter-notebooks-on-github-9d988ecf96a6 diff --git a/Python/tools/IPython/Colab/About Colab.md b/Python/tools/IPython/Colab/About Colab.md new file mode 100644 index 0000000..4ad9d15 --- /dev/null +++ b/Python/tools/IPython/Colab/About Colab.md @@ -0,0 +1,9 @@ +## Tips for Colab Programming for coding assessments, tests, and more + + +Colab is a fantastic IDE in my opinion and serves a better function than jupyter does (which I prefer in the iPython mode anyhow). When actually trying to program in a safe environment, colab does the job. Otherwise just use a full-fledged environment like PyCharm and VSCode right? Or otherwise vim and ipython would do the trick. + +- It is located right in your google drive and includes things like [forms](obsidian://open?vault=Coding%20Tips&file=Python%2Ftools%2FColab%2FColab%20Forms) & [scratch](obsidian://open?vault=Coding%20Tips&file=Python%2Ftools%2FColab%2FColab%20Scratch%20Code%20Cells) cells. +- Here is a[ list of keyboard shortcuts](obsidian://open?vault=Coding%20Tips&file=Python%2Ftools%2FColab%2FColab%20Shortcuts) as well for your convenience. +- Use [code snippets](obsidian://open?vault=Coding%20Tips&file=Python%2Ftools%2FColab%2FColab%20Code%20Snippets) effectively!! This is fantastic feature of colab. +- [Open in Colab](https://openincolab.com/) offers a quick snippet to add the little open in colab button on your page :) \ No newline at end of file diff --git a/Python/tools/IPython/Colab/Colab Code Snippets.md b/Python/tools/IPython/Colab/Colab Code Snippets.md new file mode 100644 index 0000000..cbed204 --- /dev/null +++ b/Python/tools/IPython/Colab/Colab Code Snippets.md @@ -0,0 +1,9 @@ +# About Code Snippets + +So similar to the amazingness of iPython for having magic and pretty much a whole library of references of magic commands if anyone ever gets lost or confused, colab has this feature called code snippets. At first I just thought it was something like gist but really - + +![[Pasted image 20220709161121.png]] + +That's right. It's basically for literally everything. We have arrived at the future. And we are no longer pain-stakingly google searching for the correct implementation of code anymore. There are references right here. + +:') \ No newline at end of file diff --git a/Python/tools/IPython/Colab/Colab Command Palette.md b/Python/tools/IPython/Colab/Colab Command Palette.md new file mode 100644 index 0000000..1ab0db7 --- /dev/null +++ b/Python/tools/IPython/Colab/Colab Command Palette.md @@ -0,0 +1,5 @@ +# About Colab's Command Palette + +The feature that distinguishes this from editors such as vim or iPython is now the addition of a command palette which is comparable to multitude of options available in more full-bodied environments like VSCode and PyCharm but **right inside of the browser**. + +![[Pasted image 20220709161448.png]] diff --git a/Python/tools/IPython/Colab/Colab Forms.md b/Python/tools/IPython/Colab/Colab Forms.md new file mode 100644 index 0000000..0ad7ab8 --- /dev/null +++ b/Python/tools/IPython/Colab/Colab Forms.md @@ -0,0 +1,13 @@ +# About Forms + + +Forms are cool they look like this: +![[Pasted image 20220709153922.png]] +And I think the intention is to create a pseudo application *within* the code so that larger operations such as perhaps methods or functions or classes can be introduced which is currently not there by simply using jupyter notebooks! This is a fantastic new feature + +**Shortcuts: +- Control + Option + F: add form +- Control + Option + B: add form field +- Control + Option + >: Clear all outputs +- Control + Option + ; : Clear selected outputs +- Control + Option + E: edit all form attributes \ No newline at end of file diff --git a/Python/tools/IPython/Colab/Colab Scratch Code Cells.md b/Python/tools/IPython/Colab/Colab Scratch Code Cells.md new file mode 100644 index 0000000..199d209 --- /dev/null +++ b/Python/tools/IPython/Colab/Colab Scratch Code Cells.md @@ -0,0 +1,14 @@ +## Colab Scratch Cells + +Another great feature of colab which allows for another panel purely for running scratch code alongside your running code. This is so helpful!! + + +- Option + Shift + C: open scratch code cell +- Option + X: Copy to scratch cell + +![[Pasted image 20220709155517.png]] + +As you can see you can have many multiple scratch cells! +![[Pasted image 20220709155559.png]] + +& it will appear right next to the code you're actually working on. This way you can even have a kind of pseudo code while you think so that you dont have to worry so much about errors and you can break it down a bit better, \ No newline at end of file diff --git a/Python/tools/IPython/Colab/Colab Shortcuts.md b/Python/tools/IPython/Colab/Colab Shortcuts.md new file mode 100644 index 0000000..751fdef --- /dev/null +++ b/Python/tools/IPython/Colab/Colab Shortcuts.md @@ -0,0 +1,111 @@ + + # Custom Key Bindings + + HOT KEYS ARE EVERYTHING. Huge kudos to Karl for teaching me this. This is essentially a duplication of [colab-tips.ipynb](https://colab.research.google.com/drive/1ju7pew4kxM1GwXLYeyXkTpcFHacPa8rS?authuser=1#scrollTo=tnqElr23RLo3) in a more readable format here. Use either when working inside of colab. + +##### 1. basic cell creation: + +- Command + B: new code cell under +- Option + T: new text cell +- Option + Shift + C: open [scratch code cell](obsidian://open?vault=Coding%20Tips&file=Python%2Ftools%2FColab%2FColab%20Scratch%20Code%20Cells) +- Option + D: Delete cell/selection +- Option + K: Cut cell/selection +- Command/ctrl + option + C: Copy selection or cell +- Option + Shift + S: Copy to scratch cell +- Command + Shift + B : convert to code cell +- Command + Shift + T: convert to text cell + +- Press (Enter) on text cell to start editing +- Press (colon:) to show emoji :-) + + +--- + +##### 2. Start coding +- Control+Option+G: Mount Drive +- Control+Option+U: Unmount Drive +- Command + /: add section header +- Command + Shift + Up/down: Insert code cell up/down +- Command + Shift + - : Split at cursor + + +#### 2.1 & running cells +- Command + Enter: run the focused cell +- Command + F9: Run all cells in notebook +- Command + F10: Run selected cell and all cells after +- Option + Enter: Run cell and insert new cell +- Shift + Enter: Run cell and select next cell +- Command + Shift + Z: undo last cell action +- Command + Shift + Y: redo cell action +- Option + R: Interrupt execution +- Option + A: Reconnect + +#### 2.2 moving through cells + +- Command + Shift + [ / ] : focus previous/next tab +- Option + up: focus last run cell + +- Command + J : jump to cell +- Command + left: previous cell +- Command + right: next cell +- Control + Option + left/right: merge focused cell with previous/next cell +- Shift + click: select multiple cells +- Option + M : Merge selected cells: +- Shift up/down: grow selection to include cells up/down +- Control + Option + up/down: Move selected cells up/down + + + + + + + +--- + + + +##### 4. For more tools while programming + +- Control + Option + L : locate in drive +- Option + L: toggle line numbers +- Control + Shift + P : show command palette +- Command + Shift + F: show file browser +- Command + Shift + R: show revision history +- Control + Option + H: show executed code history +- Option + 2: Show table of contents +- Option + 1: Show terminal +- Option + 3: Show/Hide code +- Option.+ 0: Show/hide output +- Option + 4: Show variable inspector +- Control + option + C: show code snippests pane + +--- + + + +##### 5. For downloading and other settings + +- Control + Option + I : download as .ipynb notebook +- Control + Option + P : download as .py notebook +- option + shift + d : show difference between notebooks +- Control + Shift + 6: Share notebook +- Option + O : Create new notebook +- Command + O : Open a new notebook +- Command + S: Save the notebook +- Command + Shift + U: upload notebook +- Option + S: open settings +- Option + G: open notebook settings +- Option + E: open editor settings +- Option + 6: Show/hide status bar +- Command + Shift + K: show keyboard shortcuts + +--- + + + +#### [Forms](obsidian://open?vault=Coding%20Tips&file=Python%2Ftools%2FColab%2FColab%20Forms) +- Control + Option + F: add form +- Control + Option + B: add form field +- Control + Option + >: Clear all outputs +- Control + Option + ; : Clear selected outputs +- Control + Option + E: edit all form attributes diff --git a/Python/tools/IPython/IPython.md b/Python/tools/IPython/IPython.md new file mode 100644 index 0000000..4a33e8e --- /dev/null +++ b/Python/tools/IPython/IPython.md @@ -0,0 +1,46 @@ + # Ipython + +The true GOAT if we're going to be real. Big shout-out to Gabe from Schrodinger for truly putting me onto iPython. + +### Magic! +![[redditsave.com_we_always_have_that_senior_who_solve_everything-y2y8hevqny891.mp4]] + +iPython uses [MAGIC](https://ipython.readthedocs.io/en/stable/interactive/magics.html#) ! :) + +To load a file: +``` +%load filename.py +``` + +To save a file: +``` +%%writefile filename.py +``` + +To return a list of magic commands: use ```%magic``` +More useful magic commands can be found [here](https://towardsdatascience.com/useful-ipython-magic-commands-245e6c024711) and [here](https://towardsdatascience.com/top-10-magic-commands-in-python-to-boost-your-productivity-1acac061c7a9)! + +--- + +**Some notes:** Make sure to read the [docs](https://ipython.readthedocs.io/en/stable/interactive/tips.html) though. +Reading about iPython led to installing xonsh +Which ultimately led to [this](https://gitter.im/xonsh/xonsh) community for support. + +Personally I think xonsh is really cool and could potentiallY be better than iPython?? It might need a note of its own eventually. + +Setting up [xonsh](obsidian://open?vault=Coding%20Tips&file=Xonsh) virtual environments seem a lot more easier than the python conda method. + +Running ipython : +![[Pasted image 20220703231737.png]] + +--- + + +Fun facts: +- did you know you can create clusters and [parallel compute ](https://ipyparallel.readthedocs.io/en/latest/)in ipython? +- here are some additional [cookbooks](https://github.com/ipython/ipython/wiki/Cookbook:-Notebook-utilities) for iPython. + + +--- + +This may be better off in the VSCode section but here is a[ useful tutorial](https://www.scheidt-mt.com/en/blog/vscode_ipython/) on using iPython within VSCode should you ever make the switch to something a bit more user-friendly. diff --git a/Python/tools/IPython/Jupyter.md b/Python/tools/IPython/Jupyter.md new file mode 100644 index 0000000..0b051a1 --- /dev/null +++ b/Python/tools/IPython/Jupyter.md @@ -0,0 +1,35 @@ +# Jupyter + + +Ah yes jupyter notebooks. That thing that you thought was only used for data science and not real programmers because you never really used it in your undergrad or even masters CS classes and then realized that maybe you really aren't a real programmer then and now here you are. + + +Because it has widespread use and you should probably know this stuff. + +[Jupyter shortcuts ](https://nocomplexity.com/documents/jupyterlab/keyboardshortcuts.html) + +You know that you can run jupyter straight up inside of Obsidian right? + +Install [jupyter for obsidian](https://github.com/tillahoffmann/obsidian-jupyter). The python interpreter should be set to the path ```/usr/bin/python``` + +```jupyter +import numpy as np +from matplotlib import pyplot as plt + +x = np.linspace(0,1) +y = np.exp(-x) * np.sin(4 * np.pi * x) +plt.plot(x,y) +pass + +``` + + + +[Extensions](https://medium.com/data-for-everyone/best-extensions-for-jupyterlab-185ab5f3e05c) on [extensions](https://neptune.ai/blog/jupyterlab-extensions-for-machine-learning) on extensions. + +--- + +Ways to do things: +- convert a[ .ipynb to .py ](obsidian://open?vault=Coding%20Tips&file=convert%20a%20.ipynb%20to%20.py) +- alternatively, some other things to try out may be the [starboard notebook ](https://github.com/gzuidhof/starboard-notebook) +- you can actually even [create a dashboard ](https://mljar.com/blog/dashboard-python-jupyter-notebook/)within Jupyter! \ No newline at end of file diff --git a/Python/tools/IPython/convert a .ipynb to .py.md b/Python/tools/IPython/convert a .ipynb to .py.md new file mode 100644 index 0000000..3012b1e --- /dev/null +++ b/Python/tools/IPython/convert a .ipynb to .py.md @@ -0,0 +1,6 @@ +###### convert a .ipynb to .py +``` +$ nbconvert --to script [YOUR_NOTEBOOK].ipynb +``` + + diff --git a/Python/tools/IPython/merge multiple notebooks.md b/Python/tools/IPython/merge multiple notebooks.md new file mode 100644 index 0000000..7122abb --- /dev/null +++ b/Python/tools/IPython/merge multiple notebooks.md @@ -0,0 +1,44 @@ +nbmerge.py file +``` +#!/usr/bin/env python +# Note, updated version of +# https://github.com/ipython/ipython-in-depth/blob/master/tools/nbmerge.py +""" +usage: + +python nbmerge.py A.ipynb B.ipynb C.ipynb > merged.ipynb +""" + +import io +import os +import sys + +from IPython import nbformat + +def merge_notebooks(filenames): + merged = None + for fname in filenames: + with io.open(fname, 'r', encoding='utf-8') as f: + nb = nbformat.read(f, as_version=4) + if merged is None: + merged = nb + else: + # TODO: add an optional marker between joined notebooks + # like an horizontal rule, for example, or some other arbitrary + # (user specified) markdown cell) + merged.cells.extend(nb.cells) + if not hasattr(merged.metadata, 'name'): + merged.metadata.name = '' + merged.metadata.name += "_merged" + print(nbformat.writes(merged)) + +if __name__ == '__main__': + notebooks = sys.argv[1:] + if not notebooks: + print(__doc__, file=sys.stderr) + sys.exit(1) + + merge_notebooks(notebooks) + + +``` \ No newline at end of file diff --git a/Python/tools/IPython/notebook launcher.md b/Python/tools/IPython/notebook launcher.md new file mode 100644 index 0000000..640375a --- /dev/null +++ b/Python/tools/IPython/notebook launcher.md @@ -0,0 +1,292 @@ +branded ipyhton notebook launcher.py + +``` +"""============================== +Branded IPython Notebook Launcher +================================= + +Executing this module will create an overlay over ipython notebooks own static +files and templates and overrides static files and templates and copies over all +example notebooks into a temporary folder and launches the ipython notebook server. + +You can use this to offer an interactive tutorial for your library/framework/... + + +To use this script properly, create three folders in the same folder this script +resides in: + + parent + | + +- this_script.py + | + +- templates/ + | | + | ... + | + +- static/ + | | + | ... + | + |+ notebooks/ + | | + | ... + + +The folders templates and static may be empty, but must exist. Read the +docstring of merge_dirs to find out how these folders are treated. + +If you put those folders anywhere else, change the variables in the +Configuration section below. + +In your setup.py you can add the following to your entry_points: + + [console_scripts] + my_framework_tutorial = framework.examples.notebooks.this_script:launch_notebook_server + +and a binary will be created for the user's system that launches this script. + +Additionally, add these package_data entries, so that the static files +get installed, too: + + package_data = { + 'framework.examples.notebooks': + ['notebooks/*', 'static/**/*', 'templates/*'], + } + + +License +------- + +Copyright (c) 2011, Timo Paulssen +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. + * The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL TIMO PAULSSEN BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +Revision History +---------------- + + 1.0 2011-12-19 + First release. + + 1.1 2011-12-20 + Don't use os.system for starting the notebook. + Cleaner clean-up. +""" + +import os +import shutil +import tempfile +from itertools import izip + +try: + from IPython.frontend.html.notebook import notebookapp +except ImportError: + print "You don't seem to have IPython installed, or the dependencies of " + print "ipython notebook are not met." + + raise + +"""================== +Configuration section +===================== +""" + +"""This is the base path in which the modified templates/, static/ and the +example notebooks can be found:""" +BASE_PATH = os.path.dirname(__file__) + + +"""By default, the template, static and notebooks folder will be assumed inside +BASE_PATH:""" +TEMPLATE_PATH = os.path.join(BASE_PATH, "templates") +STATIC_PATH = os.path.join(BASE_PATH, "static") +EXAMPLES_PATH = os.path.join(BASE_PATH, "notebooks") + + +"""These are the folders from which the original templates and static files are +taken. You should not have to change this. It will usually be correct.""" +NOTEBOOK_BASE_PATH = os.path.dirname(notebookapp.__file__) +NOTEBOOK_TEMPLATE_PATH = os.path.join(NOTEBOOK_BASE_PATH, "templates") +NOTEBOOK_STATIC_PATH = os.path.join(NOTEBOOK_BASE_PATH, "static") + +"""This name will be the prefix for the temporary folder""" +PROJECT_NAME = "my_pretty_framework" + + + +"""These extra arguments go directly between the tornado arguments and the +arguments passed to this script on the commandline:""" +#notebook_extra_args = ["--gui=qt"] # for example +notebook_extra_args = [""] + + +"""========= +Code section +============ +""" + +def merge_dirs(base, overlay, target, preserve_originals=False): + """This function merges a base and an overlay folder into a target folder. + + If a folder exists in base or overlay only, it will be symlinked + into the target. + + If a folder exists in both, the folder is created in the target and + merging continues with the contents of both folders. + + If a file exists in base or overlay only, it will be symlinked from base. + + If a file exists in both and preserve_originals is True, the file from + base will be symlinked here with a original_ prefix. The file from the + overlay will be symlinked into the target. + """ + + def replace_prefix(prefix, path, new_prefix): + assert path.startswith(prefix) + if path.startswith("/"): + path = path[1:] + return os.path.join(new_prefix, path[len(prefix):]) + + base_w = os.walk(base, followlinks=True) + overlay_w = os.walk(overlay, followlinks=True) + + from_base_dirs = [] + from_over_dirs = [] + from_base_files = [] + from_over_files = [] + preserved_originals = [] + + # walk the base and overlay trees in parallel + for (base_t, over_t) in izip(base_w, overlay_w): + (base_path, base_dirs, base_files) = base_t + (over_path, over_dirs, over_files) = over_t + + # don't recurse into dirs that are only in base or only in overlay. + # instead, just symlink them. + # this keeps both walkers in sync. + for subdir in set(base_dirs[:] + over_dirs[:]): + if subdir not in over_dirs: + base_dirs.remove(subdir) + from_base_dirs.append(os.path.join(base_path, subdir)) + elif subdir not in base_dirs: + over_dirs.remove(subdir) + from_over_dirs.append(os.path.join(base_path, subdir)) + + for fn in set(base_files[:] + over_files[:]): + if fn in over_files and fn in base_files and preserve_originals: + preserved_originals.append(os.path.join(base_path, fn)) + if fn not in over_files: + from_base_files.append(os.path.join(base_path, fn)) + else: + from_over_files.append(os.path.join(over_path, fn)) + + # link full directories over + for source, dirlist in ((base, from_base_dirs), (overlay, from_over_dirs)): + for dir_link in dirlist: + os.symlink(dir_link, replace_prefix(source, dir_link, target)) + + # link files over. + for source, filelist in ((base, from_base_files), + (overlay, from_over_files), + (base, preserved_originals)): + for file_link in filelist: + target_file = replace_prefix(source, file_link, target) + + # preserved originals get an original_ prefix + if filelist is preserved_originals: + tfp, tfn = os.path.dirname(target_file), os.path.basename(target_file) + target_file = os.path.join(tfp, "original_" + tfn) + + parent_dir = os.path.dirname(target_file) + if not os.path.exists(parent_dir): + os.makedirs(parent_dir) + os.symlink(file_link, target_file) + + +def create_overlay(): + """This function copies all files from the source to the target and then + links all missing files from IPython itself to the target. + + Templates that are overridden will be linked to orig_{filename}, so that + changes to templates can just use tornadowebs own template extension scheme. + + It returns a tuple with the temporary path as well as a dictionary with keys + 'template_path' and 'static_path', which are absolute paths to the merged + templates and static files.""" + + # create the temporary folder where overlay and base are merged + path = tempfile.mkdtemp(prefix=PROJECT_NAME + "_tutorial") + + template_path = os.path.join(path, "templates") + static_path = os.path.join(path, "static") + os.mkdir(template_path) + os.mkdir(static_path) + + merge_dirs(NOTEBOOK_TEMPLATE_PATH, TEMPLATE_PATH, template_path, True) + merge_dirs(NOTEBOOK_STATIC_PATH, STATIC_PATH, static_path) + + return path, {'template_path': template_path, 'static_path': static_path} + +def copy_example_notebooks(target_path): + shutil.copytree(EXAMPLES_PATH, os.path.join(target_path, "notebooks")) + +def launch_notebook_server(): + import sys + import signal + base_path, settings = create_overlay() + copy_example_notebooks(base_path) + + print + print "running notebook overlay from", base_path + print + print "hit ctrl-c to exit the tutorial" + print + + app = notebookapp.NotebookApp() + app.initialize(argv=[ + '''--NotebookApp.webapp_settings=%s''' % (settings), + '''--NotebookManager.notebook_dir="%s"''' % (os.path.join(base_path, "notebooks"))] + + notebook_extra_args + + sys.argv[1:]) + + # somewhere in initialize, the SIGINT handler gets set to be ignored. + # we have to undo that + signal.signal(signal.SIGINT, signal.default_int_handler) + + try: + app.start() + except KeyboardInterrupt: + pass + finally: + print + print "deleting", base_path + shutil.rmtree(base_path) + + print "goodbye" + +if __name__ == "__main__": + launch_notebook_server() + + ![](chrome-extension://annlhfjgbkfmbbejkbdpgbmpbcjnehbb/images/saveicon.png) Save + +``` \ No newline at end of file diff --git a/Python/tools/Libraries/beautiful soup.md b/Python/tools/Libraries/beautiful soup.md new file mode 100644 index 0000000..deba73b --- /dev/null +++ b/Python/tools/Libraries/beautiful soup.md @@ -0,0 +1,40 @@ +# Beautiful Soup + +Beautiful Soup is a popular library commonly used for webscraping, or the automated process of gathering public data extracting large amounts of public data from target websites in seconds. + +Used often alongside to [requests](obsidian://open?vault=Coding%20Tips&file=Requests), it is a parser to extract the data from HTML and can turn even invalid markup into a parse tree. It cannot request data and is only designed for parsing. + +**Part 1: Get HTML using Requests** + + +``` +import requests url='https://oxylabs.io/blog' response = requests.get(url) +``` + +**Part 2: Find Element ** + +``` +from bs4 import BeautifulSoup soup = BeautifulSoup(response.text, 'html.parser') print(soup.title) + +``` + +output will be: +```javascript +

Oxylabs Blog

+``` + +Due to its simple ways of navigating, searching and modifying the parse tree, Beautiful Soup is ideal even for beginners and usually saves developers hours of work. For example, to print all the blog titles from this page, the **findAll()** method can be used. On this page, all the blog titles are in h2 elements with class attribute set to ```blog-card__content-title```. This information can be supplied to the findAll method as follows + +```python +blog_titles = soup.findAll('h2', attrs={"class":"blog-card__content-title"}) +for title in blog_titles: print(title.text) +# Output: +# Prints all blog tiles on the page +``` + +Can also easily work with CSS Selectors so don't even need findAll. + +```python +blog_titles = soup.select('h2.blog-card__content-title') for title in blog_titles: + print(title.text) +``` diff --git a/Python/tools/Libraries/matplotlib.md b/Python/tools/Libraries/matplotlib.md new file mode 100644 index 0000000..209df55 --- /dev/null +++ b/Python/tools/Libraries/matplotlib.md @@ -0,0 +1,3 @@ +# Matplotlib + +Matplotlib is an essential visualization and plotting package in python that you will inevitably have to use to display your results. [This](https://colab.research.google.com/drive/1cu9L58gM1yzp9pe79ERGC5alKDKHLACk#scrollTo=nvS772Uuqok3) colab notebook is an excellent way to see what the full power of this package can hold. \ No newline at end of file diff --git a/Python/tools/Libraries/numpy/numpy.md b/Python/tools/Libraries/numpy/numpy.md new file mode 100644 index 0000000..504113a --- /dev/null +++ b/Python/tools/Libraries/numpy/numpy.md @@ -0,0 +1,9 @@ +# Numpy tips +Numpy will be a library that you will use time and time again so you had better get familiar with it. + +``` +import numpy as np +``` + +Most famously they are used for creating [arrays](obsidian://open?vault=Coding%20Tips&file=Python%2Fcodes%2Farrays%2FAbout%20arrays) in python in efficient ways. + diff --git a/Python/tools/Libraries/pandas/Pandas tips.md b/Python/tools/Libraries/pandas/Pandas tips.md new file mode 100644 index 0000000..f75540e --- /dev/null +++ b/Python/tools/Libraries/pandas/Pandas tips.md @@ -0,0 +1,74 @@ +# Pandas tips + +Pandas will be used all the time in jupyter notebooks and datasets. So it's best to get familiar with it while you can. + +- It is useful to know the[ common ways](obsidian://open?vault=Coding%20Tips&file=Python%2Fcodes%2Fcommon%20pandas%20commands) it is used first. +- Also merging cells when you should is helpful. +- [Geocoding](https://towardsdatascience.com/six-python-tips-for-geospatial-data-science-4438a531b0bf) spatial data + + +#### read_csv() + +### copy() + +``` +df2=df1.copy() +df2['b']=df2['b']+100 +df2 +``` +![[Pasted image 20220708093923.png]] + +``` +df1 +``` +![[Pasted image 20220708093939.png]] + +### concat() + +``` +df3=pd.concat([df1,df2]) +df3 +``` + +![[Pasted image 20220708094039.png]] + + +If you have multiple files to deal with, you can also combine pd.concat and pd.read_csv + +``` +for i in path_data.glob("*.csv"): + print(i) +``` + +![[Pasted image 20220708094155.png]] + +``` +flightlist = pd.concat(pd.read_csv(file) for file in path_data.glob("*.csv")) +``` + +### value_counts() + +Used to count unique values. + +``` +df['callsign'].value_counts() +``` +![[Pasted image 20220708094708.png]] +can also be normalized by setting ``` normalize=True``` + +``` +df['callsign'].value_counts(normalize=True) + +``` +![[Pasted image 20220708094651.png]] +Can also be used for continuous data by putting them into discrete intervals using ```bins``` + +``` +df['altitude_1'].value_counts(bins=10) +``` + +![[Pasted image 20220708094636.png]] + +- More tips for data analysis can be found [here](https://towardsdatascience.com/5-useful-tips-for-exploratory-data-analysis-using-pandas-in-python-7c05808c9408) + - including data missing %, max values rows, aggregate across columns, and more +- \ No newline at end of file diff --git a/Python/tools/Libraries/pandas/common pandas commands.md b/Python/tools/Libraries/pandas/common pandas commands.md new file mode 100644 index 0000000..8f984a8 --- /dev/null +++ b/Python/tools/Libraries/pandas/common pandas commands.md @@ -0,0 +1,32 @@ +# Common SQL queries in pandas + +Pandas is a way to transform dataframes with the datasets you have so you have got to be comfortable using it. Make sure to import pandas and seaborn. Here are some popular commands. This [website](https://towardsdatascience.com/writing-5-common-sql-queries-in-pandas-90b52f17ad76) was useful for learning about that + + +- Import packages and load the data + +``` +# Import packages +import pandas as pd +import seaborn as sns + +# Import data +tips = sns.load_dataset('tips') +``` + +- View top 5 records in the dataset + +``` +tips.head() + +# specify the amount by placing number inside +# the default is 5 + +tips.head(8) +``` + +![[Pasted image 20220705203711.png]] +- Filter data +- Sort data +- Aggregate data +- Aggregate data by group diff --git a/Python/tools/Libraries/requests.md b/Python/tools/Libraries/requests.md new file mode 100644 index 0000000..aaed94b --- /dev/null +++ b/Python/tools/Libraries/requests.md @@ -0,0 +1,28 @@ +# Requests + +Requests is a crucially important library in python that will be used very often for anything that requires acquiring data or communicating with another interface for your necessary functions. + +The standard Python HTTP libraries can be difficultto use and may require bulky lines of code and hence, requests was born. + + +Unlike other HTTP libraries, the [Requests library](https://oxylabs.io/blog/python-requests) simplifies the process of making such requests by reducing the lines of code, in effect making the code easier to understand and debug without impacting its effectiveness. The library can be installed from within the terminal using the pip command: + +``` +pip install requests +``` + +Requests library provides easy methods for sending HTTP GET and POST requests. For example, the function to send an HTTP Get request is aptly named get(): + +``` +import requests response = requests.get("https://oxylabs.io/”) print(response.text) +``` + +And the way to output if a form needs to be posted is easily done using t he post() method. The following shows how form data can be sent as a dictionary: + +``` +form_data = {'key1': 'value1', 'key2': 'value2'} response = requests.post("https://oxylabs.io/ ", data=form_data) print(response.text) +``` + +However, this library is limited in that it does not *parse* the extracted HTML data, ie doesn't convert data into a more readable form for analyiss. + +It also cannot scrape websites written purely in JavaScript. \ No newline at end of file diff --git a/Python/tools/Libraries/xlswriter/About xlswriter.md b/Python/tools/Libraries/xlswriter/About xlswriter.md new file mode 100644 index 0000000..b9bdf06 --- /dev/null +++ b/Python/tools/Libraries/xlswriter/About xlswriter.md @@ -0,0 +1,59 @@ +# Xlswriter + + +``` + +Import xlswriter + + +#create file (workbook) and worksheet +outWorkbook = xlsxwriter.Workbook("out.xlsx") +outSheet = outWorkbook.add_worksheet() + +#declare data +Names = ["Oklahoma", "Non", "Mary"] +Values = [70,80,90] + + +#write headers +For item in range(len(names)): + outSheet.write(x, y +outSheet.write("A1", "ANMES) +outSheet.write("B1", "Scores") + +#declare data to file +outSheet.write(" + +outWorkbook.close() + + +``` + +Sci- kit Learn & keras: + +``` +# create a function that returns a model, taking as parameters things you +# want to verify using cross-valdiation and model selection +def create_model(optimizer='adagrad', + kernel_initializer='glorot_uniform', + dropout=0.2): + model = Sequential() + model.add(Dense(64,activation='relu',kernel_initializer=kernel_initializer)) + model.add(Dropout(dropout)) + model.add(Dense(1,activation='sigmoid',kernel_initializer=kernel_initializer)) + + model.compile(loss='binary_crossentropy',optimizer=optimizer, metrics=['accuracy']) + + return model + +# wrap the model using the function you created +clf = KerasRegressor(build_fn=create_model,verbose=0) + +# just create the pipeline +pipeline = Pipeline([ + ('clf',clf) +]) + +pipeline.fit(X_train, y_train) + +```