diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/.DS_Store differ diff --git a/.obsidian/app.json b/.obsidian/app.json index c86340e..bc1f0bb 100644 --- a/.obsidian/app.json +++ b/.obsidian/app.json @@ -1,5 +1,20 @@ { +<<<<<<< HEAD "alwaysUpdateLinks": true, "showLineNumber": true, "showIndentGuide": true +======= + "legacyEditor": false, + "livePreview": true, + "fileSortOrder": "alphabeticalReverse", + "promptDelete": false, + "alwaysUpdateLinks": true, + "newFileLocation": "current", + "showUnsupportedFiles": true, + "newLinkFormat": "absolute", + "showLineNumber": true, + "vimMode": false, + "attachmentFolderPath": "Python/images", + "userIgnoreFilters": [] +>>>>>>> fa733254fe47587d3093f0989a1d3416983255de } \ No newline at end of file diff --git a/.obsidian/appearance.json b/.obsidian/appearance.json index d7f0c40..9990a4a 100644 --- a/.obsidian/appearance.json +++ b/.obsidian/appearance.json @@ -1,4 +1,5 @@ { +<<<<<<< HEAD "accentColor": "#d161ef", "translucency": true, "showViewHeader": true, @@ -8,4 +9,10 @@ "baseFontSize": 19, "textFontFamily": "Times New Roman", "interfaceFontFamily": "Times New Roman" +======= + "baseFontSize": 14, + "translucency": true, + "accentColor": "#c66bef", + "theme": "obsidian" +>>>>>>> fa733254fe47587d3093f0989a1d3416983255de } \ No newline at end of file diff --git a/.obsidian/backlink.json b/.obsidian/backlink.json new file mode 100644 index 0000000..48ee913 --- /dev/null +++ b/.obsidian/backlink.json @@ -0,0 +1,3 @@ +{ + "backlinkInDocument": true +} \ No newline at end of file diff --git a/.obsidian/community-plugins.json b/.obsidian/community-plugins.json index 819cee0..637e746 100644 --- a/.obsidian/community-plugins.json +++ b/.obsidian/community-plugins.json @@ -1,7 +1,12 @@ [ +<<<<<<< HEAD "find-unlinked-files", "obsidian-extract-pdf-annotations", "obsidian-style-settings", "obsidian-latex-suite", - "obsidian-matrix" + "obsidian-matrix", + "omnisearch" +======= + "obsidian-jupyter" +>>>>>>> fa733254fe47587d3093f0989a1d3416983255de ] \ No newline at end of file diff --git a/.obsidian/core-plugins.json b/.obsidian/core-plugins.json index c745349..a50ab9e 100644 --- a/.obsidian/core-plugins.json +++ b/.obsidian/core-plugins.json @@ -4,6 +4,7 @@ "switcher", "graph", "backlink", +<<<<<<< HEAD "canvas", "outgoing-link", "tag-pane", @@ -17,5 +18,13 @@ "outline", "word-count", "slides", +======= + "page-preview", + "note-composer", + "command-palette", + "editor-status", + "markdown-importer", + "word-count", +>>>>>>> fa733254fe47587d3093f0989a1d3416983255de "file-recovery" ] \ No newline at end of file diff --git a/.obsidian/global-search.json b/.obsidian/global-search.json new file mode 100644 index 0000000..0cf1bf9 --- /dev/null +++ b/.obsidian/global-search.json @@ -0,0 +1,5 @@ +{ + "showFullPath": false, + "linkStyle": "none", + "listStyle": "none" +} \ No newline at end of file diff --git a/.obsidian/graph.json b/.obsidian/graph.json index c19fffb..1851934 100644 --- a/.obsidian/graph.json +++ b/.obsidian/graph.json @@ -2,6 +2,7 @@ "collapse-filter": true, "search": "", "showTags": false, +<<<<<<< HEAD "showAttachments": false, "hideUnresolved": false, "showOrphans": true, @@ -18,5 +19,45 @@ "linkStrength": 1, "linkDistance": 250, "scale": 6.224922537640619, +======= + "showAttachments": true, + "hideUnresolved": true, + "showOrphans": true, + "collapse-color-groups": false, + "colorGroups": [ + { + "query": "path:Quan", + "color": { + "a": 1, + "rgb": 14701138 + } + }, + { + "query": "path:Pytho", + "color": { + "a": 1, + "rgb": 5399264 + } + }, + { + "query": "path:Computer", + "color": { + "a": 1, + "rgb": 7740567 + } + } + ], + "collapse-display": false, + "showArrow": false, + "textFadeMultiplier": -0.8, + "nodeSizeMultiplier": 1.04526774088542, + "lineSizeMultiplier": 3.17306722005208, + "collapse-forces": false, + "centerStrength": 0.568115234375, + "repelStrength": 9.44986979166667, + "linkStrength": 0.672037760416667, + "linkDistance": 194, + "scale": 0.4159036604496818, +>>>>>>> fa733254fe47587d3093f0989a1d3416983255de "close": false } \ No newline at end of file diff --git a/.obsidian/hotkeys.json b/.obsidian/hotkeys.json index c639ae8..9594a68 100644 --- a/.obsidian/hotkeys.json +++ b/.obsidian/hotkeys.json @@ -1,4 +1,5 @@ { +<<<<<<< HEAD "obsidian-extract-pdf-annotations:extract-annotations": [ { "modifiers": [ @@ -13,6 +14,14 @@ "Alt" ], "key": "E" +======= + "editor:toggle-code": [ + { + "modifiers": [ + "Mod" + ], + "key": "3" +>>>>>>> fa733254fe47587d3093f0989a1d3416983255de } ] } \ No newline at end of file diff --git a/.obsidian/note-composer.json b/.obsidian/note-composer.json new file mode 100644 index 0000000..dd32f4f --- /dev/null +++ b/.obsidian/note-composer.json @@ -0,0 +1,4 @@ +{ + "askBeforeMerging": true, + "replacementText": "embed" +} \ No newline at end of file diff --git a/.obsidian/page-preview.json b/.obsidian/page-preview.json new file mode 100644 index 0000000..cd43461 --- /dev/null +++ b/.obsidian/page-preview.json @@ -0,0 +1,3 @@ +{ + "preview": true +} \ 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/plugins/omnisearch/data.json b/.obsidian/plugins/omnisearch/data.json new file mode 100644 index 0000000..4ff1769 --- /dev/null +++ b/.obsidian/plugins/omnisearch/data.json @@ -0,0 +1,20 @@ +{ + "hideExcluded": false, + "ignoreDiacritics": true, + "indexedFileTypes": [], + "PDFIndexing": false, + "imagesIndexing": false, + "showShortName": false, + "ribbonIcon": true, + "showExcerpt": true, + "renderLineReturnInExcerpts": true, + "showCreateButton": false, + "hightlight": true, + "showPreviousQueryResults": true, + "simpleSearch": false, + "weightBasename": 2, + "weightH1": 1.5, + "weightH2": 1.3, + "weightH3": 1.1, + "welcomeMessage": "1.8.0-beta.3" +} \ No newline at end of file diff --git a/.obsidian/workspace b/.obsidian/workspace new file mode 100644 index 0000000..ab132fe --- /dev/null +++ b/.obsidian/workspace @@ -0,0 +1,104 @@ +{ + "main": { + "id": "275e54d6a308c5c2", + "type": "split", + "children": [ + { + "id": "aa10a324de303208", + "type": "leaf", + "state": { + "type": "markdown", + "state": { + "file": "Computers/Browser/Replit/About Replit.md", + "mode": "source", + "backlinks": true, + "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": 260.5 + }, + "right": { + "id": "9ad61fddd9987fc8", + "type": "split", + "children": [ + { + "id": "38f407691664dcad", + "type": "tabs", + "children": [ + { + "id": "719f427ad52bb2e6", + "type": "leaf", + "state": { + "type": "backlink", + "state": { + "file": "Computers/Browser/Replit/About Replit.md", + "collapseAll": false, + "extraContext": false, + "sortOrder": "alphabetical", + "showSearch": false, + "searchQuery": "", + "backlinkCollapsed": true, + "unlinkedCollapsed": true + } + } + } + ] + } + ], + "direction": "horizontal", + "width": 300, + "collapsed": true + }, + "active": "aa10a324de303208", + "lastOpenFiles": [ + "Quantum Realm/Welcome to Quantum 101.md", + "Quantum Realm/Games!!/Finally the fun part.md", + "Quantum Realm/Technologies/Security.md", + "Quantum Realm/Technologies/Optimizations.md", + "Quantum Realm/Technologies/Intro to Quantum Technologies.md", + "Quantum Realm/Algorithms/VOQC.md", + "Quantum Realm/Technologies/Computers.md", + "Quantum Realm/Algorithms/Teleportation.md", + "Quantum Realm/Algorithms/Choose Your Hero! er, Algo.md", + "Quantum Realm/Mechanics & Math/Intro to Mechanics & Math.md" + ] +} \ No newline at end of file diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index 2a0c791..4c6823b 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -7,44 +7,19 @@ "id": "4e83fd84ddd73cfb", "type": "tabs", "children": [ - { - "id": "047f30a01c1e0e83", - "type": "leaf", - "state": { - "type": "markdown", - "state": { - "file": "Coding Tips (Classical)/Project Vault/Current Occupations/Hack Manhattan/F.A.Q. for 137 W. 14th Street Members,.md", - "mode": "source", - "source": false - } - } - }, { "id": "74d85386e2039ea7", "type": "leaf", "state": { "type": "markdown", "state": { - "file": "Coding Tips (Classical)/Terminal Tips/Shells/Internet/Hosting/Browser talk/DNS.md", - "mode": "source", - "source": false - } - } - }, - { - "id": "714856d2eaf0596d", - "type": "leaf", - "state": { - "type": "markdown", - "state": { - "file": "Coding Tips (Classical)/Terminal Tips/Shells/Internet/Obsidian/Tips on Obsidian itself.md", + "file": "Coding Tips (Classical)/Terminal Tips/About terminal.md", "mode": "source", "source": false } } } - ], - "currentTab": 2 + ] } ], "direction": "vertical" @@ -102,7 +77,7 @@ } ], "direction": "horizontal", - "width": 289.5 + "width": 382.5 }, "right": { "id": "e641d8c09a3445f6", @@ -118,7 +93,7 @@ "state": { "type": "backlink", "state": { - "file": "Coding Tips (Classical)/Terminal Tips/Shells/Internet/Obsidian/Tips on Obsidian itself.md", + "file": "Coding Tips (Classical)/Terminal Tips/About terminal.md", "collapseAll": false, "extraContext": false, "sortOrder": "alphabetical", @@ -135,7 +110,7 @@ "state": { "type": "outgoing-link", "state": { - "file": "Coding Tips (Classical)/Terminal Tips/Shells/Internet/Obsidian/Tips on Obsidian itself.md", + "file": "Coding Tips (Classical)/Terminal Tips/About terminal.md", "linksCollapsed": false, "unlinkedCollapsed": true } @@ -158,7 +133,7 @@ "state": { "type": "outline", "state": { - "file": "Coding Tips (Classical)/Terminal Tips/Shells/Internet/Obsidian/Tips on Obsidian itself.md" + "file": "Coding Tips (Classical)/Terminal Tips/About terminal.md" } } } @@ -177,53 +152,59 @@ "daily-notes:Open today's daily note": false, "templates:Insert template": false, "command-palette:Open command palette": false, - "obsidian-matrix:Obsidian Matrix": false + "obsidian-matrix:Obsidian Matrix": false, + "omnisearch:Omnisearch": false } }, - "active": "714856d2eaf0596d", + "active": "74d85386e2039ea7", "lastOpenFiles": [ - "Coding Tips (Classical)/Terminal Tips/About terminal.md", - "Domains.md", - "Coding Tips (Classical)/Terminal Tips/Shells/Internet/Hosting/Browser talk/DNS.md", - "Coding Tips (Classical)/Terminal Tips/Shells/Internet/Hosting/Neocities.md", - "Coding Tips (Classical)/Terminal Tips/Shells/Computers (operating system)/Choosing a Name for Your Computer.md", - "Coding Tips (Classical)/Project Vault/Current Occupations/Hack Manhattan/F.A.Q. for 137 W. 14th Street Members,.md", - "Coding Tips (Classical)/Terminal Tips/Shells/Internet/Hosting/Servers/Repositories.md", - "Coding Tips (Classical)/Terminal Tips/Shells/Internet/Hosting/Servers/Replit.md", - "Coding Tips (Classical)/Terminal Tips/Shells/Internet/Hosting/On Hosts.md", - "Coding Tips (Classical)/Project Vault/Current Occupations/Shwetha Jayaraj Notes.md", - "Coding Tips (Classical)/Terminal Tips/Shells/Bash.md", - "Coding Tips (Classical)/Terminal Tips/Shells/Internet/Obsidian/Tips on Obsidian itself.md", - "Coding Tips (Classical)/Terminal Tips/Shells/Internet/Obsidian/Obsidian-git process.md", - "Coding Tips (Classical)/Terminal Tips/Commands + Settings/Languages/About Languages.md", - "Coding Tips (Classical)/Terminal Tips/Shells/Computers (operating system)/Apple Macbook/Homebrew.md", - "Coding Tips (Classical)/Terminal Tips/Shells/Computers (operating system)/Apple Macbook/Mac X Code.md", - "Coding Tips (Classical)/Terminal Tips/Shells/Computers (operating system)/Apple Macbook/MacPorts.md", - "Coding Tips (Classical)/Terminal Tips/CLI Tools/CLI Tool Collection.md", - "Coding Tips (Classical)/Terminal Tips/CLI Tools/ASCII.md", - "Coding Tips (Classical)/Terminal Tips/Shells/Internet/Hosting/Servers/Nginx.md", - "Coding Tips (Classical)/Terminal Tips/Commands + Settings/Command Shortcuts.md", - "Coding Tips (Classical)/Terminal Tips/Commands + Settings/Extra customizations.md", + "Coding Tips (Classical)/Terminal Tips/Shells/xonsh/Xonsh.md", "Coding Tips (Classical)/Terminal Tips/Shells/xonsh/Xontrib-avox.md", - "Coding Tips (Classical)/Terminal Tips/CLI Tools/package managers/Fink.md", - "Coding Tips (Classical)/Terminal Tips/CLI Tools/package managers/RPM.md", - "Coding Tips (Classical)/Terminal Tips/CLI Tools/Git.md", - "Coding Tips (Classical)/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230626195256.png", - "Quantum spaces.canvas", - "Coding Tips (Classical)/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230626071733.png", - "Coding Tips (Classical)/Terminal Tips/CLI Tools", - "Coding Tips (Classical)/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230626101329.png", - "Coding Tips (Classical)/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230626101300.png", - "Coding Tips (Classical)/Terminal Tips/Shells/Computers (operating system)", - "Coding Tips (Classical)/Terminal Tips/Shells/Computers (operating system)/Linux", - "Coding Tips (Classical)/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230626034045.png", - "Coding Tips (Classical)/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230625163413.png", - "Coding Tips (Classical)/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230625163218.png", - "Coding Tips (Classical)/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230624135042.png", - "Coding Tips (Classical)/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230624141203.png", - "Coding Tips (Classical)/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230624141130.png", - "Physics", - "Coding Tips (Classical)/Terminal Tips/Shells/Internet/APIs", - "Coding Tips/Computers/Internet/AIs" + "Coding Tips (Classical)/Terminal Tips/Shells/Bash.md", + "Coding Tips (Classical)/Project Vault/Obsidian/Obsidian-git process.md", + "Coding Tips (Classical)/Terminal Tips/About terminal.md", + "Coding Tips (Classical)/Terminal Tips/Commands + Settings/Internet/APIs/Useful APIs.md", + "Coding Tips (Classical)/Terminal Tips/Commands + Settings/Internet/Browser talk/DNS.md", + "Coding Tips (Classical)/Terminal Tips/Commands + Settings/Internet/Servers/Linode.md", + "Coding Tips (Classical)/Terminal Tips/Commands + Settings/Internet/Servers/Nginx.md", + "Coding Tips (Classical)/Terminal Tips/Commands + Settings/Internet/Servers/About Servers.md", + "Coding Tips (Classical)/Terminal Tips/Commands + Settings/Internet/Servers/Repos/Gitea.md", + "Coding Tips (Classical)/Terminal Tips/Commands + Settings/Internet/Servers/Repos/Gitlab.md", + "Coding Tips (Classical)/Terminal Tips/Commands + Settings/Internet/Servers/Repos/Github.md", + "Coding Tips (Classical)/Terminal Tips/Commands + Settings/Internet/Browser talk/About Browsers.md", + "Coding Tips (Classical)/Terminal Tips/Commands + Settings/Internet/Browser talk/Uniform Resource Identifier.md", + "Coding Tips (Classical)/Terminal Tips/Commands + Settings/Internet/Hosting/Frontend Tools.md", + "Coding Tips (Classical)/Terminal Tips/Commands + Settings/Extra customizations.md", + "Coding Tips (Classical)/Terminal Tips/Commands + Settings/Command Shortcuts.md", + "Coding Tips (Classical)/Terminal Tips/Shells/Zsh.md", + "Coding Tips (Classical)/Terminal Tips/Commands + Settings/Internet/Hosting/On Hosts.md", + "Coding Tips (Classical)/Terminal Tips/Commands + Settings/Internet/Servers/Repos/About Repositories.md", + "Coding Tips (Classical)/Terminal Tips/Commands + Settings/Internet/Servers/Repos", + "Coding Tips (Classical)/Terminal Tips/Commands + Settings/Internet/Hosting/Docker.md", + "Machine Tips (Quantum)/Resources/Welcome to Quantum 101.md", + "Coding Tips (Classical)/Terminal Tips/Commands + Settings/Internet/Browser talk/Domains.md", + "README.md", + "Coding Tips (Classical)/Terminal Tips/CLI Tools/CLI Tool Collection.md", + "Coding Tips (Classical)/Terminal Tips/Shells/xonsh", + "Coding Tips (Classical)/Terminal Tips/Commands + Settings/Internet/Tools", + "Coding Tips (Classical)/Project Vault/Obsidian/imgFiles/redditsave.com_we_always_have_that_senior_who_solve_everything-y2y8hevqny891.mp4", + "Coding Tips (Classical)/Project Vault/Obsidian/imgFiles/Untitled.png", + "Coding Tips (Classical)/Project Vault/Obsidian/imgFiles/Pasted image 20230626195256.png", + "Coding Tips (Classical)/Project Vault/Obsidian/imgFiles/Pasted image 20230626101329.png", + "Coding Tips (Classical)/Project Vault/Obsidian/imgFiles/Pasted image 20230626101300.png", + "Coding Tips (Classical)/Project Vault/Obsidian/imgFiles/Pasted image 20230626071733.png", + "Coding Tips (Classical)/Project Vault/Obsidian/imgFiles/Pasted image 20230626034045.png", + "Coding Tips (Classical)/Project Vault/Obsidian/imgFiles/Pasted image 20230625163413.png", + "Coding Tips (Classical)/Project Vault/Obsidian/imgFiles/Pasted image 20230625163218.png", + "Coding Tips (Classical)/Project Vault/Obsidian/imgFiles/Pasted image 20230624141203.png", + "Coding Tips (Classical)/Project Vault/Obsidian/imgFiles/Pasted image 20230624141130.png", + "Coding Tips (Classical)/Project Vault/Obsidian/imgFiles", + "Coding Tips (Classical)/Project Vault/Obsidian", + "Coding Tips (Classical)/Terminal Tips/Commands + Settings/Internet/Servers", + "Coding Tips (Classical)/Terminal Tips/Commands + Settings/Internet/Servers/Databases/Tools & Tables", + "Coding Tips (Classical)/Terminal Tips/Commands + Settings/Internet/Servers/Databases", + "Coding Tips (Classical)/Terminal Tips/Commands + Settings/Internet/Browser talk", + "Coding Tips (Classical)/Quantum spaces.canvas", + "Quantum spaces.canvas" ] } \ No newline at end of file diff --git a/Coding Tips (Classical) b/Coding Tips (Classical) deleted file mode 160000 index d066861..0000000 --- a/Coding Tips (Classical) +++ /dev/null @@ -1 +0,0 @@ -Subproject commit d066861e31f507c27e52a970ec7fb9beaa920a6a diff --git a/Domains.md b/Domains.md deleted file mode 100644 index 34a1ce6..0000000 --- a/Domains.md +++ /dev/null @@ -1,4 +0,0 @@ - -Indeed domains are your website name. Now that names can be changed rather easily, it is good to realize a way that works best for you in hosting and subdomain solutions. - -- Example of [domain versioning. ](https://docs.netlify.com/domains-https/custom-domains/)via Netlify \ No newline at end of file diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 17cb286..0000000 --- a/LICENSE +++ /dev/null @@ -1,117 +0,0 @@ -GNU GENERAL PUBLIC LICENSE -Version 2, June 1991 - -Copyright (C) 1989, 1991 Free Software Foundation, Inc. -51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - -Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. - -Preamble - -The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. - -When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. - -To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. - -For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. - -We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. - -Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. - -Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. - -The precise terms and conditions for copying, distribution and modification follow. - -TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - -0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. - -1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. - -You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. - -2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. - - c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. - -3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. - -If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. - -4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. - -5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. - -6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. - -7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. - -This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. - -8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. - -9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. - -10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. - -NO WARRANTY - -11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - -12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - -END OF TERMS AND CONDITIONS - -How to Apply These Terms to Your New Programs - -If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. - -To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. - - one line to give the program's name and an idea of what it does. Copyright (C) yyyy name of author - - This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. - -signature of Ty Coon, 1 April 1989 Ty Coon, President of Vice diff --git a/Project Vault/.DS_Store b/Project Vault/.DS_Store new file mode 100644 index 0000000..aed3e5c Binary files /dev/null and b/Project Vault/.DS_Store differ diff --git a/Project Vault/Current Occupations/.DS_Store b/Project Vault/Current Occupations/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Project Vault/Current Occupations/.DS_Store differ diff --git a/Project Vault/Current Occupations/Hack Manhattan/.DS_Store b/Project Vault/Current Occupations/Hack Manhattan/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Project Vault/Current Occupations/Hack Manhattan/.DS_Store differ diff --git a/Project Vault/Current Occupations/Hack Manhattan/Documentation Guide.md b/Project Vault/Current Occupations/Hack Manhattan/Documentation Guide.md new file mode 100644 index 0000000..eaaf75d --- /dev/null +++ b/Project Vault/Current Occupations/Hack Manhattan/Documentation Guide.md @@ -0,0 +1,2 @@ + +- a good guide of Data visualization setup \ No newline at end of file diff --git a/Project Vault/Current Occupations/Hack Manhattan/F.A.Q. for 137 W. 14th Street Members,.md b/Project Vault/Current Occupations/Hack Manhattan/F.A.Q. for 137 W. 14th Street Members,.md new file mode 100644 index 0000000..bb13c59 --- /dev/null +++ b/Project Vault/Current Occupations/Hack Manhattan/F.A.Q. for 137 W. 14th Street Members,.md @@ -0,0 +1,176 @@ + + +# F.A.Q. for 14th. Street Hm members/card holders  + + ======== + +If you still managed to keep your 14th st Hack Manhattan card & keys ! Congratulations - you now have a wonderful momento/gateway/key to Hack Manhattan Inc.  +Since every member familiar with 14th street coming back to visit the space has asked how to gain access to the new 34th street location with their key, here is a handy F.A.Q for a seamless transition. + +* Does your card still work?  + +Since the .json file for card holders to the 137 W. 14th location still lives on for record-keeping in the usual git repository & the pi to the door may not be connected anymore. Therefore The 14th Street card will **NOT** work for the new 34 W. 37th st location.  + + +* How do I get access to the new space? + +You must coordinate with an available member at the 34th st location to come to the space at 34 W. 37th Street to activate your card (& test that it works) and/or pick up your keys. You are then free to access the space at your leisure! + + + +Why the move? + +Though to be clear what I just did was absolutely not the proper way to grant access, the right way to do it is for each repository > Click Settings tab on top of the repository so like > wesite-spacey(that's the one for registering key cards)>Settings > collaborators &teams on the left > and individually choose members of the hm organization to add to the repo (if they said they're interested in contributing to it) + +====What should I know about the new location?==== +- the last one to leave the space at night should lock the outer building door +- we are not supposed to go above the floor we are on (2nd floor) to other floors +- roof access is prohibited +- + +Upon the sudden news,HM members frequenting the space created #Space-Force to figure out the situation and/or find a new home to avoid legal repercussion. The building ended up getting bought by new owners and after lots of searching and discussions with other tenants and also legal notices and bold decision making, 34 W 37th Street was decided upon as the alternate location for a 5 year lease. The lease began August 2022. A dedicated crew of Hack Manhattan members worked to move necessary materials from 14th street to 37th street. During the transition process + + + + +Does your card still work?  + +Since the .json file to the 14th location still lives on for the HM records in the usual repository, the pi to the door may not be connected anymore. Therefore the card will NOT work for the 37th st location.  + + + +Can you get a new card?  + +Yes you may get a new card for the new location at any time. + + + + +Can I set up the card myself?  + +While you may be familiar with setting up the rfid card yourself and doing the testing yourself, for the new location an email must be sent to the building manager (Mayer Saadia) to allow access through into the outside door through RFID which may take 24-48 hours. Alternatively, you may request physical keys instead to enter the building. For the inner door to Hack Manhattan after entering the building, the RFID card set up is as normal & any member who knows how to do this is capable of doing this. + + + + + + +Since a member kept frequently losing her card to the new space there is $5 fee for losing your new card though this isn’t enforced by anyone unless you’re just mean.  + + + +What is enforced though now is a code of conduct! + + + + +And bc it’s  been asked several times from people who was at the old space (because I somehow do still have my old building card though - the .json file for that lives on in the hm repo but the rfid connection to the door is taken down now @citybadger  would know more so old card stopped working end of last year for me but yeah a nice momento :’)  - the new cards are a different type of card aka they start w different numbers + +** + + +### How can I gain access to the 34 W 37th Street Location? + +You must coordinate with an available member at the 34th St location to come to the space at 34 W. 37th Street to activate your card (& test that it works) and/or pick up your keys. You are then free to access the space at your leisure! Welcome back! + + +### Can I set up the card myself? + +While you may be familiar with setting up the key card yourself, for the new location an email must be sent to the building manager (Mayer Saadia) to allow access through into the outside door via the associated key card which may take 24-48 hours on his end. Alternatively, you may request physical keys instead to enter the building in the meantime. + +For the inner door to Hack Manhattan after entering the building, the key card registration in the same process only now there is an alternate folder which corresponds to these key cards at the 34 W 37th St. It is generally considered okay for you to register your own keycard into the git. You may additionally request a member to do it for you. + +However, It is generally considered okay for you to register your own keycard into the git certain circumstances. + +- If it contains minor "hard fact" errors, such as an incorrect date, a mistake in spelling or grammar, or a dead link, then please correct those errors. +- If it contains spam, nonsense, or other sorts of [vandalism](https://en.wikipedia.org/wiki/Wikipedia:Vandalism "Wikipedia:Vandalism"), then please remove that. +- If it contains private information you strongly don't want shared, particularly if you are not famous, then please remove that. This might include, for example, your e-mail address or other private contact information, date of birth, religious affiliation, or sexual orientation. +- If its tone is clearly derogatory and cites either no sources or questionable sources, then please remove that (but be careful!). +- For serious legal issues, **including libel**, please send an E-mail to **info-en-q[![@](https://upload.wikimedia.org/wikipedia/commons/thumb/8/88/At_sign.svg/15px-At_sign.svg.png)](https://en.wikipedia.org/wiki/File:At_sign.svg "@")wikipedia.org**. + +If your edit does not fall under these categories, make an [edit request](https://en.wikipedia.org/wiki/Wikipedia:Edit_request "Wikipedia:Edit request"), preferably through the [Wikipedia:Edit Request Wizard](https://en.wikipedia.org/wiki/Wikipedia:Edit_Request_Wizard "Wikipedia:Edit Request Wizard"). The wizard will guide you on how to make an edit request, so follow the steps there. + +### Your article about me isn't exactly bad, but it could be better. How do I get it improved? + +We welcome suggestions for improvement to all articles. Feel free to contribute new information or make suggestions on the talk page. If you do not have any specific improvements in mind, however, you will likely be ignored. + +### There's no photo of me in my article (or I hate the one that's there). + +Feel free to contribute a photo under a suitable free content license. See [here](https://en.wikipedia.org/wiki/Wikipedia:Contact_us/Photo_submission "Wikipedia:Contact us/Photo submission") for more information. + +### I work in PR, and would like to fix up the article about the person or company I represent. Is that okay? + +The instructions in the "[The information in your article about me is wrong. How can I get it fixed?](https://en.wikipedia.org/wiki/Wikipedia:FAQ/Article_subjects#The_information_in_your_article_about_me_is_wrong._How_can_I_get_it_fixed?)" section above mostly follows here. **Disclose your conflict of interest**, and if the edit is simply fixing a minor error, go ahead. Otherwise, make an [edit request](https://en.wikipedia.org/wiki/Wikipedia:Edit_request "Wikipedia:Edit request"), preferably through the [Wikipedia:Edit Request Wizard](https://en.wikipedia.org/wiki/Wikipedia:Edit_Request_Wizard "Wikipedia:Edit Request Wizard"). + +Please be aware that other people _will_ edit what you've written, and that each article's history page is _public_ and will reflect _exactly_ what you have changed. If you aren't willing to accept that, then you should not edit. + +**Never do this**: + +- try to use Wikipedia to promote or advertise your client(s) (see [our guideline on conflict of interest](https://en.wikipedia.org/wiki/Wikipedia:COI "Wikipedia:COI"), for details) +- remove negative material (exception: material that violates our [policy regarding living people](https://en.wikipedia.org/wiki/Wikipedia:BLP "Wikipedia:BLP")) +- copy-and-paste content from another site, even if you manage the other site (if you personally _own_ the copyrighted text, see [WP:IOWN](https://en.wikipedia.org/wiki/Wikipedia:IOWN "Wikipedia:IOWN") for requirements for copying it) +- add information that cannot be independently verified, or that isn't significant for an encyclopedia article +- add, delete, or modify text that's particularly controversial or where facts are disputed (again, with the exception of removing unsourced controversial information about living people, per [WP:BLP](https://en.wikipedia.org/wiki/Wikipedia:BLP "Wikipedia:BLP")) + +### Somebody keeps vandalizing the article about me or my company. Can't you stop them? + +On Wikipedia, we have a very specific definition of vandalism, see [Wikipedia:Vandalism](https://en.wikipedia.org/wiki/Wikipedia:Vandalism "Wikipedia:Vandalism"). In short, vandalistic edits are bad-faith edits intended to disrupt the encyclopedia. You can revert those edits yourself, see [Help:Reverting](https://en.wikipedia.org/wiki/Help:Reverting "Help:Reverting"). You can also report people persistently vandalising at the [Administrator intervention against vandalism](https://en.wikipedia.org/wiki/Wikipedia:Administrator_intervention_against_vandalism "Wikipedia:Administrator intervention against vandalism") board. + +### Can I ask the police or someone else to stop it? + +No. The fastest and most reliable way to address vandalism is by simply reverting it. + +### Someone keeps writing negative things about me or my company. What can I do? + +If it's uncomplimentary but accurate and backed up by [reliable sources](https://en.wikipedia.org/wiki/Wikipedia:RS "Wikipedia:RS"), there is nothing you can do about it. If you feel the article is poorly-sourced, [unduly negative](https://en.wikipedia.org/wiki/Wikipedia:UNDUE "Wikipedia:UNDUE"), contains information that is irrelevant or otherwise not worth including, or is particularly hurtful to someone who's not a public figure, please make those comments on the article's talk page, or post to [Wikipedia:Biographies of living persons/Noticeboard](https://en.wikipedia.org/wiki/Wikipedia:Biographies_of_living_persons/Noticeboard "Wikipedia:Biographies of living persons/Noticeboard") to bring the article to the attention of the wider community. Editors must maintain balance in articles and abide by a [neutral point of view](https://en.wikipedia.org/wiki/Wikipedia:NPOV "Wikipedia:NPOV"). **Information won't be taken down just because it makes you unhappy.** + +### I keep making a change in my article and somebody keeps changing it back. Why? + +There are a variety of possibilities. Maybe someone thought your change was self-promoting or biased. Possibly the facts are disputed. Or it may be simply that someone thought your material wasn't worthy of inclusion, or was written in a style not suitable to an encyclopedia. + +To find out what happened, the first thing you should do is look at the history page for the article you edited. This will tell you who changed it, when, and often why. If it says something like "see talk", then look at the article's talk page. If you don't find a reason that makes sense to you, politely ask in talk page what happened to your change. Generally, then someone will tell you why your change was reverted. + +### Can I start an article about myself or my company? + +We **strongly** discourage this. Wikipedia is intended to be an objective resource, and it's very, very difficult for people to be fully objective about themselves or their company. + +If your life and achievements are verifiable and genuinely [notable](https://en.wikipedia.org/wiki/Wikipedia:N "Wikipedia:N"), then sooner or later someone else will probably create an article about you. If you write an article about yourself, the chances are pretty good that it will be deleted. + +Please note also that anything you write on Wikipedia will be mercilessly edited by others. Sometimes people who write about themselves end up requesting that their articles be deleted because the original piece has, over time, changed in ways they didn't like. + +### Why can't I advertise my company or product on Wikipedia? + +Please see [Wikipedia:Why can't I advertise my company or product on Wikipedia?](https://en.wikipedia.org/wiki/Wikipedia:Why_can%27t_I_advertise_my_company_or_product_on_Wikipedia%3F "Wikipedia:Why can't I advertise my company or product on Wikipedia?") + +### Who wrote the article about me or my company? + +The articles on Wikipedia are collaboratively written by volunteers. Almost all articles have more than one author. If you want to know who wrote a particular article, click on the "history" tab at the top of that page. That will show who has edited the page. It will display usernames for editors who have registered with Wikipedia, and IP addresses for editors who haven't registered. + +### How can I get rid of the article about myself or my company? + +We generally aim to improve articles rather than delete them. Saying an article is "bad" (or inaccurate, or biased, or badly written) isn't reason enough for it to be deleted: we would prefer you try to help us make it better. See our [deletion policy](https://en.wikipedia.org/wiki/Wikipedia:Deletion_policy "Wikipedia:Deletion policy"). + +### I am mentioned in an article about something else, and I would like the reference to me removed. How can I do that? + +You probably cannot. If you think the reference doesn't belong in an encyclopedia (because it's incorrect, or not worth mentioning), you can make that comment on the talk page. **Editors won't remove the reference just because you don't like it.** + +### I would like to sue you for lying about me in your article. How do I proceed? + +If you say this on Wikipedia, you'll probably get blocked. See [Wikipedia:No legal threats](https://en.wikipedia.org/wiki/Wikipedia:No_legal_threats "Wikipedia:No legal threats"). + +If you have a genuine legal concern, tell us about it by emailing **info-en-q![@](https://upload.wikimedia.org/wikipedia/commons/thumb/8/88/At_sign.svg/15px-At_sign.svg.png "@")wikimedia.org** with "Legal concern" in the subject line, and giving the exact URL of the article, and what you think is wrong. + +Some notes: + +- Your e-mail will be answered by a volunteer who will attempt to resolve your concern, but is unlikely to know anything about your situation in advance, so please be patient. +- We won't make your email (including your e-mail address) public. Nor will we give you other people's information, such as the IP addresses of registered users. +- Please don't send legal concerns to other Wikipedia e-mail addresses: that just slows things down. +- If you don't hear back, check your junk mail folder. +- We will not telephone you, even if you request that. + +### I would like more information on the topics covered in this FAQ. + +To ask for help, visit the [Wikipedia:Teahouse](https://en.wikipedia.org/wiki/Wikipedia:Teahouse "Wikipedia:Teahouse"). + +|show

- [v](https://en.wikipedia.org/wiki/Template:Wikipedia_help_pages "Template:Wikipedia help pages")
- [t](https://en.wikipedia.org/wiki/Template_talk:Wikipedia_help_pages "Template talk:Wikipedia help pages")
- [e](https://en.wikipedia.org/w/index.php?title=Template:Wikipedia_help_pages&action=edit)

[Wikipedia help pages](https://en.wikipedia.org/wiki/Help:Directory "Help:Directory")| | +|---|---| \ No newline at end of file diff --git a/Project Vault/Current Occupations/Hack Manhattan/RADIO/AIR.md b/Project Vault/Current Occupations/Hack Manhattan/RADIO/AIR.md new file mode 100644 index 0000000..e69de29 diff --git a/Project Vault/Current Occupations/Hack Manhattan/RADIO/Radio @ K2HMH.md b/Project Vault/Current Occupations/Hack Manhattan/RADIO/Radio @ K2HMH.md new file mode 100644 index 0000000..e764fce --- /dev/null +++ b/Project Vault/Current Occupations/Hack Manhattan/RADIO/Radio @ K2HMH.md @@ -0,0 +1 @@ +The radio \ No newline at end of file diff --git a/Project Vault/Current Occupations/Past/.DS_Store b/Project Vault/Current Occupations/Past/.DS_Store new file mode 100644 index 0000000..bd54ab7 Binary files /dev/null and b/Project Vault/Current Occupations/Past/.DS_Store differ diff --git a/Project Vault/Current Occupations/Past/Aetna/.DS_Store b/Project Vault/Current Occupations/Past/Aetna/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Project Vault/Current Occupations/Past/Aetna/.DS_Store differ diff --git a/Project Vault/Current Occupations/Past/Schrodinger/.DS_Store b/Project Vault/Current Occupations/Past/Schrodinger/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Project Vault/Current Occupations/Past/Schrodinger/.DS_Store differ diff --git a/Project Vault/Current Occupations/Past/T-Mobile/.DS_Store b/Project Vault/Current Occupations/Past/T-Mobile/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Project Vault/Current Occupations/Past/T-Mobile/.DS_Store differ diff --git a/Project Vault/Current Occupations/Past/Windtelligent.ai/.DS_Store b/Project Vault/Current Occupations/Past/Windtelligent.ai/.DS_Store new file mode 100644 index 0000000..795f49e Binary files /dev/null and b/Project Vault/Current Occupations/Past/Windtelligent.ai/.DS_Store differ diff --git a/Project Vault/Current Occupations/Past/Windtelligent.ai/AI/.DS_Store b/Project Vault/Current Occupations/Past/Windtelligent.ai/AI/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Project Vault/Current Occupations/Past/Windtelligent.ai/AI/.DS_Store differ diff --git a/Project Vault/Current Occupations/Past/Windtelligent.ai/AI/Intro to the AI.md b/Project Vault/Current Occupations/Past/Windtelligent.ai/AI/Intro to the AI.md new file mode 100644 index 0000000..05774cd --- /dev/null +++ b/Project Vault/Current Occupations/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/Project Vault/Current Occupations/Past/Windtelligent.ai/First Quarter Notebook.md b/Project Vault/Current Occupations/Past/Windtelligent.ai/First Quarter Notebook.md new file mode 100644 index 0000000..a427174 --- /dev/null +++ b/Project Vault/Current Occupations/Past/Windtelligent.ai/First Quarter Notebook.md @@ -0,0 +1,47 @@ +# First Quarter Notebook + +### April Events +- We won 3rd place in the hackathon! +- incorporated officially as Windtelligent AI LLC + + +--- +# 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/Project Vault/Current Occupations/Past/Windtelligent.ai/Intelligence/.DS_Store b/Project Vault/Current Occupations/Past/Windtelligent.ai/Intelligence/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Project Vault/Current Occupations/Past/Windtelligent.ai/Intelligence/.DS_Store differ diff --git a/Project Vault/Current Occupations/Past/Windtelligent.ai/Intelligence/Different Data Models.md b/Project Vault/Current Occupations/Past/Windtelligent.ai/Intelligence/Different Data Models.md new file mode 100644 index 0000000..679bab2 --- /dev/null +++ b/Project Vault/Current Occupations/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/Project Vault/Current Occupations/Past/Windtelligent.ai/Intelligence/HRRR.md b/Project Vault/Current Occupations/Past/Windtelligent.ai/Intelligence/HRRR.md new file mode 100644 index 0000000..4cbd5b6 --- /dev/null +++ b/Project Vault/Current Occupations/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/Project Vault/Current Occupations/Past/Windtelligent.ai/Intelligence/Referenced Papers.md b/Project Vault/Current Occupations/Past/Windtelligent.ai/Intelligence/Referenced Papers.md new file mode 100644 index 0000000..4b4766d --- /dev/null +++ b/Project Vault/Current Occupations/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/Project Vault/Current Occupations/Past/Windtelligent.ai/Intelligence/Windtelligent Wishlist.md b/Project Vault/Current Occupations/Past/Windtelligent.ai/Intelligence/Windtelligent Wishlist.md new file mode 100644 index 0000000..3bd3204 --- /dev/null +++ b/Project Vault/Current Occupations/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/Project Vault/Current Occupations/Past/Windtelligent.ai/Wind/.DS_Store b/Project Vault/Current Occupations/Past/Windtelligent.ai/Wind/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Project Vault/Current Occupations/Past/Windtelligent.ai/Wind/.DS_Store differ diff --git a/Project Vault/Current Occupations/Past/Windtelligent.ai/Windtelligent CTO.md b/Project Vault/Current Occupations/Past/Windtelligent.ai/Windtelligent CTO.md new file mode 100644 index 0000000..7760af3 --- /dev/null +++ b/Project Vault/Current Occupations/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](https://www.windtelligent.ai/) for Windtelligent explaining what we are trying to build and here is[ the wish list of things](obsidian://open?vault=Coding%20Tips&file=Careers%2FPast%2FWindtelligent.ai%2FIntelligence%2FWindtelligent%20Wishlist) that is still on the bucket list left to do with our product. One feature at a time remember. + +--- diff --git a/Project Vault/Current Occupations/Past/qubit x qubit/Microsoft Winter School TA.md b/Project Vault/Current Occupations/Past/qubit x qubit/Microsoft Winter School TA.md new file mode 100644 index 0000000..995994c --- /dev/null +++ b/Project Vault/Current Occupations/Past/qubit x qubit/Microsoft Winter School TA.md @@ -0,0 +1,3 @@ + +Being a lab TA for Microsoft! The program starts February 04th, 2023. +Here is the [airtable](https://airtable.com/shrONXl9UtcRkNQ5u) form to fill out for being a TA. And also [the general link ]([https://docs.google.com/document/d/1lbaVEoBO_9TJfREGF6SbVojhe9EDQ0bVOpsu-JZ61WI/edit#](https://docs.google.com/document/d/1lbaVEoBO_9TJfREGF6SbVojhe9EDQ0bVOpsu-JZ61WI/edit#))for information on the position itself. \ No newline at end of file diff --git a/Project Vault/Current Occupations/Past/qubit x qubit/Qubit x qubit Quantum Education Fellowship.md b/Project Vault/Current Occupations/Past/qubit x qubit/Qubit x qubit Quantum Education Fellowship.md new file mode 100644 index 0000000..55f06c1 --- /dev/null +++ b/Project Vault/Current Occupations/Past/qubit x qubit/Qubit x qubit Quantum Education Fellowship.md @@ -0,0 +1,24 @@ +All official documents pertaining to The Coding School are stored [here](https://drive.google.com/drive/folders/1NBKdnej_P7Tb3HPvJoHUWNNM20j-IF23?usp=share_link) - that will serve as the main drive for storing docs into for reference. + +This is mainly used for taking notes and as an on-going knowledge base of things I think of or have ideas about rather than putting it into a google doc or drive. + +"''No such thing, **bad** **student**. **Only** **bad** teacher.''" - Mr. Miyagi + +--- +- Days of the fellowship drive? +- Microsoft Winter School Lab TA [information](obsidian://open?vault=Obsidian&file=Coding%20Tips%2FCareers%2FCurrent%20Occupations%2Fqubit%20x%20qubit%2FMicrosoft%20Winter%20School%20TA) + +I've hardly kept my LinkedIn up to date but I'm excited to announce that I've started working a 1 year long fellowship at The Coding School, an international non-profit specifically dedicated to teaching and training diverse student populations around the globe the fundamentals of quantum mechanics, quantum computing, and AI through code. The reach and impact of this organization is inspiring particularly the Qubit by Qubit program which has educated over 40,000 students and where I am helping to teach and develop updated curriculum & coded notebooks for the various Quantum & AI programs. I'm glad I was able to the contribute to the curriculum of Sydney Quantum Academy and the current program of the Microsoft Winter School where I am excited for hundreds of students to learn about running quantum algorithms on the Azure Platform. The best thing about working here so far is the highly supportive and inclusive work culture with fast-paced action as there truly is a lot of work to be done in this mission-driven work to train in quantum and AI. as well as the AWS TRAIN Program serving to educate professionals at HBCUs and community colleges. I'm happy and excited to contribute to the awesome team here while I continuing to research and develop my own code and contributions to the quantum industry. :) + +The coolest thing is that education offers an environment for teams to work in a cross-company setting by learning about all the tools that are out there for efficient AI and quantum use. I hope more organizations continue to grow in this way and as a life-long learner, I hope I can teach some things along the way too to people that normally wouldn't know. I think this cross-corporation approach used to educate students is immensely useful in order to create a less divisive and more collaborative world and being able to introduce all the tools and tricks I've learned along way is something I am happy to do going forward that we can for curious technology learners will have huge impact in the years to come. + +In particular, I am grateful to my freshman year computer science professor at the University of Connecticut Alexander Russell who taught us functional programming in LISP and the intro to cryptography class while ALSO teaching juijuitsu , so while students barely hung on by a thread in his difficult programming course he was also able to literally kick our butts to those also taking Juijitsu! +He was awesome and also I'm grateful to my supervisor when I was an intern developer on the ML team under Gabriel Marques was the best boss I've ever had especially because he was such a good teacher to me. I took this approach with Charu and Brian this year and I am also glad they enjoyed their experience because it was derived from the experienced of being under Gabriel at Schrodinger. So a quick public thank you needs to be said to Gabriel Marques and my friend Peter Shenkin. + +For those interested, I would highly recommend enrolling in the Qubit by Qubit program open to any one from high school to senior citizens to get a sense of how things are taught, perhaps you can be a part of changing the landscape for tomorrow. + +As the saying goes, education isn't free, you have to pay attention. + +(i'm pro-FOSS though) + + diff --git a/Project Vault/Current Occupations/Past/qubit x qubit/Slides/About Slides.md b/Project Vault/Current Occupations/Past/qubit x qubit/Slides/About Slides.md new file mode 100644 index 0000000..a7d6cb1 --- /dev/null +++ b/Project Vault/Current Occupations/Past/qubit x qubit/Slides/About Slides.md @@ -0,0 +1,9 @@ + +Slides are lectures and lab materials that I have worked on at my time in Qubit by Qubit teaching quantum computing and AI. + +- AWS Professional Development TrAIn Program +- Sydney Quantum Academy Summer Camp +- Microsoft Winter School +- Qubit by Qubit Year-long quantum education program +- TRAIN Year-long AI education program +- CodeConnects - the older part of the original TCS initiative \ No newline at end of file diff --git a/Project Vault/Current Occupations/Past/some odd jobs/.DS_Store b/Project Vault/Current Occupations/Past/some odd jobs/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Project Vault/Current Occupations/Past/some odd jobs/.DS_Store differ diff --git a/Project Vault/Current Occupations/Potential and Future/.DS_Store b/Project Vault/Current Occupations/Potential and Future/.DS_Store new file mode 100644 index 0000000..f454428 Binary files /dev/null and b/Project Vault/Current Occupations/Potential and Future/.DS_Store differ diff --git a/Project Vault/Current Occupations/Potential and Future/60 careers/.DS_Store b/Project Vault/Current Occupations/Potential and Future/60 careers/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Project Vault/Current Occupations/Potential and Future/60 careers/.DS_Store differ diff --git a/Project Vault/Current Occupations/Potential and Future/60 careers/Academic Tutor.md b/Project Vault/Current Occupations/Potential and Future/60 careers/Academic Tutor.md new file mode 100644 index 0000000..89d40db --- /dev/null +++ b/Project Vault/Current Occupations/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/Project Vault/Current Occupations/Potential and Future/60 careers/Digital Media Specialist.md b/Project Vault/Current Occupations/Potential and Future/60 careers/Digital Media Specialist.md new file mode 100644 index 0000000..982e989 --- /dev/null +++ b/Project Vault/Current Occupations/Potential and Future/60 careers/Digital Media Specialist.md @@ -0,0 +1,53 @@ +For the Complexity Explorer site at Santa Fe Institute - + +https://santafeinstitute.teamtailor.com/jobs/2510236-digital-media-specialist?promotion=599946-trackable-share-link-sfi-website + +**Title:** Digital Media Specialist + +**Reports To:** Director of Communications + +**Classification:** Full time (37.5) hours per week + +**Job Description** + +The Santa Fe Institute is looking for a Digital Media Specialist with a committed interest in science to create compelling narratives using new media and digital tools. Reporting to the Director of Communications, the Digital Media Specialist will primarily manage our social media and audiovisual productions to create thoughtful engagement. They will also contribute to monitoring and documentation efforts on our online digital platforms. + +**Core Responsibilities:** + +- Coordinate and collaborate with communications team members and the SFI community of scientists and researchers to identify meaningful content to share on social media platforms (Twitter, Facebook, LinkedIn, Instagram, Mastodon, YouTube) +- Maintain a consistent voice for the Institute while adapting it to fit styles across platforms +- Contribute to creating digital communication kits that include short-form audiovisual elements +- Implement and support media campaigns aligned with SFI’s communication goals +- Populate, evaluate, and monitor our social and digital presence to inform and build positive engagement +- Stay up-to-date on digital media trends, patterns, and developments +- Manage and document SFI communications’ digital archives + +**Required skills and experience:** + +- Knowledge of social and digital media platforms, and their related trends, strategy, and metrics +- Strong verbal, written, and visual communication skills +- Experience producing and editing videos for web-based platforms +- Strong eye for photographic composition +- Ability to collaborate and develop ideas, openness to receiving constructive feedback, work in a team, and perform under tight deadlines + +**Required qualifications:** + +- Bachelor’s degree in science, communications, or a related field +- Minimum 2 years of work experience in digital media or similar role +- Proficiency with media software such as Final Cut Pro, Adobe Photoshop, etc. + +**Preferred skills and experience:** + +- Experience in a scientific and/or non-profit organization +- Ability to create animations, infographics, and data visualizations +- Knowledge of HTML and familiarity with content management systems + +**To Apply:** + +- Please submit a cover letter, resume, and contact information for 2-3 references. +- Please also submit screenshots of 5-10 social media posts you have authored with hyperlinks to original posts, and samples of your writing, audio, video, and other related digital media products. + + +The Santa Fe Institute is an equal opportunity employer. Women and members of underrepresented groups are especially encouraged to apply, as are individuals who have taken unconventional paths in their careers. + +SFI is a vaccinated community; to be employed by SFI and on-site you must provide proof of primary vaccination against COVID-19. \ No newline at end of file diff --git a/Project Vault/Current Occupations/Potential and Future/60 careers/Foamspace technical writer.md b/Project Vault/Current Occupations/Potential and Future/60 careers/Foamspace technical writer.md new file mode 100644 index 0000000..f683498 --- /dev/null +++ b/Project Vault/Current Occupations/Potential and Future/60 careers/Foamspace technical writer.md @@ -0,0 +1,39 @@ +# Foam application + +**About the Company** + +FOAM is a low cost, open source radio protocol made for blockchain applications needing verified location services independent of GPS. Our team is committed to building unprecedented use cases that offer a high level of security and resiliency, offering new solutions over conventional geospatial technologies. Proof of Location is a critical prerequisite for the further development of Web3 use cases, accelerating a world where smart contracts interact with the physical world. + + + +The Foamspace team is based out of the New Lab at the Brooklyn Navy Yard, an interdisciplinary workspace designed to support urban entrepreneurs leveraging advanced technologies and are a Remote friendly company. We are expanding our team with a number of exciting roles to support the launch of our network. + + + +The team is now working with external community members to setup “Trust Zones” in other locations, to stress test the radios and learn more about key Zone parameters such as distance, obstructions, shape, topography, etc. + + + +The FOAM team is looking for a technical writer who can write and refine technical user guides for Trust Zone operators. This includes documenting everything from Zone Anchor (radio hardware) assembly and installation, to running experiments and monitoring the health of Trust Zones using FOAM’s web-app called Hostel (software). The technical writer would be an Independent Contractor, but there is potential for being hired as a full-time employee later, depending on the quality of deliverables. + +### Responsibilities + +- Help develop and oversee the implementation of the FOAM Trust Zone beta program's documentation, communications, outreach, and logistics; while working together with the founders, engineering team, and project manager. +- Attend team meetings to gather content and generate interesting and engaging documentation, with guidance from engineering team and project manager. +- As a Technical Writer, you will be receiving hardware components and access to our internal Wiki. By following the FOAM Zone Anchor assembly instructions yourself, you will document your process, comment on and rewrite the guides as necessary. This further extends to mounting guides, antenna selection guides and guides that you can contribute to suggest as new contributions. +- The job may require management of the communication channels of potential Zone operators and community members, including overseeing content and material explaining the program. +- Additional duties may include research and communication with potential FOAM partners, help with strategizing work on future applications built on the protocol, and building a FOAM marketing presence on channels like Twitter, Discord, and Reddit. + +### Qualifications + +- Must be able to write clear and concise documentation. +- Excellent writing, communication, and organizational skills. +- Passionate about blockchain technology, decentralization, geospatial systems, and/or IoT systems. +- Able to quickly understand complex technical concepts and make them understandable through documentation. +- Technical documentation writing experience preferred. +- Bonus for hardware and/or software training experience, but not required. +- Bonus for having an understanding of radio equipment, geospatial systems, and/or any embedded systems. + +**Compensation** + +Competitive and commensurate with experience. \ No newline at end of file diff --git a/Project Vault/Current Occupations/Potential and Future/60 careers/IBM Data Scientist.md b/Project Vault/Current Occupations/Potential and Future/60 careers/IBM Data Scientist.md new file mode 100644 index 0000000..f289405 --- /dev/null +++ b/Project Vault/Current Occupations/Potential and Future/60 careers/IBM Data Scientist.md @@ -0,0 +1,73 @@ +# IBM Data Scientist Interview + +There are several types of questions they might ask. + +This is a[ good website](https://www.interviewquery.com/dashboard/home) to check out to try to prep for the interview. + +--- + +### String Mapping + +algorithms + +Easy + +[Answer now](https://www.interviewquery.com/questions/string-mapping) + +Given two strings, `string1` and `string2`, write a function `str_map` to determine if there exists a one-to-one correspondence (bijection) between the characters of `string1` and `string2`. + +For the two strings, our correspondence must be between characters in the same position/index. + +**Example 1:** + +**Input:** + +```python +string1 = 'qwe' +string2 = 'asd' + +string_map(string1, string2) == True + +# q = a, w = s, and e = d +``` + +**Example 2:** + +**Input:** + +```python +string1 = 'donut' +string2 = 'fatty' + +string_map(string1, string2) == False +# cannot map two distinct characters to two equal characters +``` + +**Example 3:** + +**Input:** + +```python +string1 = 'enemy' +string2 = 'enemy' + +string_map(string1, string2) == True +# there exists a one-to-one correspondence between equivalent strings +``` + +**Example 4:** + +**Input:** + +```python +string1 = 'enemy' +string2 = 'ymene' + +string_map(string1, string2) == False +# since our correspondence must be between characters of the same index, this case returns 'False' as we must map e = y AND e = e +``` + +### Total Transactions +- a good [SQL Hackerrank article ](https://towardsdatascience.com/9-tips-that-helped-me-clear-all-hackerrank-sql-challenges-in-2-weeks-479eb0084862) via Medium + +How would you deal with outliers when training a model? \ No newline at end of file diff --git a/Project Vault/Current Occupations/Potential and Future/60 careers/Java Application Engineer.md b/Project Vault/Current Occupations/Potential and Future/60 careers/Java Application Engineer.md new file mode 100644 index 0000000..b4a646e --- /dev/null +++ b/Project Vault/Current Occupations/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/Project Vault/Current Occupations/Potential and Future/60 careers/Job Data Engineer.md b/Project Vault/Current Occupations/Potential and Future/60 careers/Job Data Engineer.md new file mode 100644 index 0000000..fa7913c --- /dev/null +++ b/Project Vault/Current Occupations/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/Project Vault/Current Occupations/Potential and Future/60 careers/Learning System Analyst.md b/Project Vault/Current Occupations/Potential and Future/60 careers/Learning System Analyst.md new file mode 100644 index 0000000..abce80e --- /dev/null +++ b/Project Vault/Current Occupations/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/Project Vault/Current Occupations/Potential and Future/60 careers/Level 2 Desktop Engineer.md b/Project Vault/Current Occupations/Potential and Future/60 careers/Level 2 Desktop Engineer.md new file mode 100644 index 0000000..6093a3d --- /dev/null +++ b/Project Vault/Current Occupations/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/Project Vault/Current Occupations/Potential and Future/60 careers/ML for Brookhaven.md b/Project Vault/Current Occupations/Potential and Future/60 careers/ML for Brookhaven.md new file mode 100644 index 0000000..3b5b9ef --- /dev/null +++ b/Project Vault/Current Occupations/Potential and Future/60 careers/ML for Brookhaven.md @@ -0,0 +1,4 @@ +# Machine Learning Engineer Brookhaven National Labs + +application link: https://careers.peopleclick.com/careerscp/Client_brookhavenlab/external/profile/accountSummary.html?myAccPanel=draftApps + diff --git a/Project Vault/Current Occupations/Potential and Future/60 careers/NASA Engineer.md b/Project Vault/Current Occupations/Potential and Future/60 careers/NASA Engineer.md new file mode 100644 index 0000000..26f2d26 --- /dev/null +++ b/Project Vault/Current Occupations/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/Project Vault/Current Occupations/Potential and Future/60 careers/Palantir Solutions Engineer.md b/Project Vault/Current Occupations/Potential and Future/60 careers/Palantir Solutions Engineer.md new file mode 100644 index 0000000..01871b0 --- /dev/null +++ b/Project Vault/Current Occupations/Potential and Future/60 careers/Palantir Solutions Engineer.md @@ -0,0 +1,63 @@ +# Running List of References  + +Product Reliability Solutions Engineer + +--- + + +**Tasks and duties** + +Liaising with clients and technical and sales teams to determine requirements and solutions. Brainstorming with Software Developers and Engineers to find solutions to problems. Determining the optimal and most cost-effective solutions. Presenting solutions to clients and stakeholders. + +“"Solutions Engineers work closely with clients and partners to understand real world problems and solve them with code. They build and architect solutions that address these business challenges through technology.” + +A solutions engineer provides solutions to network problems. It's a highly technical position that often involves acting as a software developer to see development lifecycles through. As a solutions engineer, you cx  mmmusually work as part of a team to provide support for both the business and customers. + + + +Take your software engineering management introduction material and use that as a reference to answer problems  just as  efficiently as possible quite honestly. Palantir is sort of an evil company you arent losing out on anything if you don't work for them anyways.        + +--- + + + +Intro + +You have 60 minutes to read about a Palantir System and recommend how you'd approach troubleshooting a complaint from users. All of the information you need to know about (1) the original complaint and (2) the Palantir System is provided, but it is not essential to be familiar with all of the terminology used in the multiple choice questions. We recommend making sure you have reference materials available before starting this exercise as some of the words/concepts/tools might be new to you and will require some research. However you are not allowed to copy/paste any solutions you may find (including from websites, books, or friends and colleagues) to complete this assessment; all solutions must be your own. Use your reference materials and the information provided to determine the best way to investigate our Forward Deployed Engineer's product issue (it's what we do every day!). + +Good luck! + +--- + + +## Tips from Rachel the recruiter :  + +- Not a coding challenger, this is more of Troubleshooting assessment  +- The only part of coding is  a page  of code to  review, find the main bugs in application +- Trying to identify where is the code broken  +- How is this affecting the software/service  +- How to resolving the issue at hand  +- The first 4 questions →  multiple choice  +- Giving metrics - a scenario   +- Choose the best answer  possible +- Manager  said only one true  answer - what is likely to happen +- Questions 5  and 6 - system graphs questions  +- Something someone told her a customer experiencing slowness in an app  +- Services that the app does - asks what modules does this app do  +- They’ll give you technical data and metrics  to identify the exact issue based on the technical data given  +- Troubleshooting, debugging, more on the strategic side  +- Find where is  it broke +- How is it affecting the service, how would I go about solving this ? +- They're looking for you to list your process +- They want you to pretend as if you are already in the role  +- Documenting your process is key  + + + + + + +![](https://lh4.googleusercontent.com/HKukogtMWCz3nkxpFlAg-CKusNg_RZyR-u3hDfgPlj7GDAhCfO9VByre48gEo9x_RercGxr178mB-vtfwTKlKp3SWX2wyDy4-GZpYfBdGbtNAcsJFuQVWpsJrjXMMjAOgnU-ZRMreszsIzL6T9aX6ZfW4rfKHL7RijRkhu8giAU6KBaKoHZgxX4lKA) + +![](https://lh6.googleusercontent.com/J6RVUg8yWB_LJiVVh8haMKZbM7xK-RWlU8nLFTyi-7amv3gSW8NmWWG9wJiIJj0LjZmWgPPyAAr87x1nI0hToTtUMUI4H5ykFw-QEvM4gfPUgDvxOoDlSHNW-pIiheOH0kY406hQ_C8ko052SLg9gKxhGPdCNXqrrwKBSNzmYr_TDJe-qejZsPoNHQ) + diff --git a/Project Vault/Current Occupations/Potential and Future/60 careers/Quantum Computing Developer.md b/Project Vault/Current Occupations/Potential and Future/60 careers/Quantum Computing Developer.md new file mode 100644 index 0000000..9751779 --- /dev/null +++ b/Project Vault/Current Occupations/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/Project Vault/Current Occupations/Potential and Future/60 careers/Site Reliability Engineering Lead.md b/Project Vault/Current Occupations/Potential and Future/60 careers/Site Reliability Engineering Lead.md new file mode 100644 index 0000000..a2df22c --- /dev/null +++ b/Project Vault/Current Occupations/Potential and Future/60 careers/Site Reliability Engineering Lead.md @@ -0,0 +1,185 @@ + +# Site Reliability Engineering Lead + +612628BR + +Your Role and Responsibilities + +The IBM Discovery Platform is a cloud-native system for accelerating scientific discovery. It makes advanced tool kits for modeling, simulation, quantum, and other capabilities readily available to scientific organizations pursuing research in areas such as drug discovery, material science, climate modeling, etc. Acceleration is achieved both from the automation and productivity provided by the IBM Discovery Platform, as a whole, and from the specific capabilities provided by the tool kits individually. + +You will be part of a highly motivated and skilled team incubating a new business for IBM with the goal of accelerating science and societal impact, focusing especially in chemistry, materials, biomedical sciences, climate, and sustainability. As a Discovery Platform Site Reliability Engineer Lead, you will guide a team of site reliability engineers to spearhead the Discovery Platform's maturity as a highly available and reliable software as a service (SaaS) offering. You will mentor software engineers, product managers, and other team members on SRE principles and practices to ensure the Discovery Platform meets our reliability goals. + +Applicants should have prior experience with SRE tools and techniques for building, deploying, operating, and supporting large scale, hybrid cloud platforms and services, based on Kubernetes. Particular challenges include optimizing demanding workloads with large, distributed data sets, heterogeneous computation platforms, and operational requirements for highly available and reliable services, as well as regulated data on public and private infrastructure. + +What you will do + +Specific responsibilities include: + +- Provide technical leadership and mentoring of SREs and for the rest of the team on SRE principles, practices, and tools. + +- Implement and document deployed SRE tools and procedures.  + +- Provide and coordinate timely support efforts for incidents when they happen. + +- Work closely with other team leaders to refine the product roadmap, including specific features and release plans, especially as they influence or are influenced by SRE concerns. + +- Work closely with other engineers to refine the platform architecture and design consistent with state-of-the-art DevOps and Site Reliability Engineering (SRE) processes and practices that are used to create, deploy, and manage our software. + +- Work with minimal supervision solo or collaboratively with other team members as required to deliver high-quality work in an efficient manner. + + +Introduction + +At IBM, work is more than a job - it's a calling: To build. To design. To code. To consult. To think along with clients and sell. To make markets. To invent. To collaborate. Not just to do something better, but to attempt things you've never thought possible. Are you ready to lead in this new era of technology and solve some of the world's most challenging problems? If so, lets talk. + +Required Technical and Professional Expertise + +- BS/BA degree in a technical field, or equivalent experience. + +- 5+ years of experience in a Site Reliability Engineering role using one or more programming language ecosystems and software development processes. + +- Demonstrated ability to organize, prioritize, and multi-task in a fast paced, changing, and agile development environment to meet deadlines. + +- Effective written and verbal communication and interpersonal skills. + +- Leadership skills such as empathy, organization, the ability to guide and motivate others and to address the problems they encounter. + + +Preferred Technical and Professional Experience + +Any of the following additional skills are highly desirable. + +- Experience developing software with Python, Go, Bash, or similar languages, and their ecosystems of tools and libraries. + +- Experience with cloud-native environments, such as AWS (S3, lambda, CloudTrails, etc) or other cloud vendors. + +- Experience with Kubernetes. + +- Prior experience in a technical leadership role. + +- Experience in a data science or data engineering environment. + +- Experience with AI/ML, Quantum Computing, or High Performance Computing (HPC). + +- Experience in scientific research or software engineering for research. + + +Required Education + +Bachelor's Degree + +Preferred Education + +None + +About Business Unit + +IBM Research is the organic growth engine of IBM and an innovation engine for our customers and partners. As part of this mission, IBM Research anticipates and examines 'What's Next in Computing' to ultimately create and integrate the technologies the world relies upon to solve big challenges and unlock new opportunities. We create and pioneer new markets for IBM, our partners and customers as exemplified in our ongoing quest to reach practical and large-scale quantum computing. Across IBM Research, we realize the power and potential to accelerate discovery with our partners and clients by combining the power of high performance computing, AI, and Quantum, all integrated through the hybrid cloud. + +Wonder if IBM is the one for you? + +In a world where technology never stands still, we understand that, dedication to our clients success, innovation that matters, and trust and personal responsibility in all our relationships, lives in what we do as IBMers as we strive to be the catalyst that makes the world work better. + +Being an IBMer means you’ll be able to learn and develop yourself and your career, you’ll be encouraged to be courageous and experiment everyday, all whilst having continuous trust and support in an environment where everyone can thrive whatever their personal or professional background. + +Our IBMers are growth minded, always staying curious, open to feedback and learning new information and skills to constantly transform themselves and our company. They are trusted to provide on-going feedback to help other IBMers grow, as well as collaborate with colleagues keeping in mind a team focused approach to include different perspectives to drive exceptional outcomes for our customers. The courage our IBMers have to make critical decisions everyday is essential to IBM becoming the catalyst for progress, always embracing challenges with resources they have to hand, a can-do attitude and always striving for an outcome focused approach within everything that they do. + +Are you ready to be an IBMer? + +This job requires you to provide your COVID-19 vaccination status with supporting documentation, where legally permissible. + +About IBM + +IBM’s greatest invention is the IBMer. We believe that through the application of intelligence, reason and science, we can improve business, society and the human condition, bringing the power of an open hybrid cloud and AI strategy to life for our clients and partners around the world. + +Restlessly reinventing since 1911, we are not only one of the largest corporate organizations in the world, we’re also one of the biggest technology and consulting employers, with many of the Fortune 50 companies relying on the IBM Cloud to run their business. + +At IBM, we pride ourselves on being an early adopter of artificial intelligence, quantum computing and blockchain. Now it’s time for you to join us on our journey to being a responsible technology innovator and a force for good in the world. + +Other Relevant Job Details + +IBM offers a wide range of resources for eligible IBMers to thrive both inside and outside of work. In addition to a competitive benefits program consisting of medical and life insurance, retirement plans, and time off, eligible employees may also have access to: + +·12 weeks of paid parental bonding leave. Family care options are also available to support eligible employees during COVID-19. +·World-class training and educational resources on our personalized, AI-driven learning platform. IBM's learning culture supports your restless attitude to grow your skills and build the depth and scale of knowledge needed to achieve your career goals. +·Well-being programs to support mental and physical health. ·Financial programs that empower you to plan, save, and manage your money (including expert financial counseling, 401(k), IBM stock discount, etc.). +·Select educational reimbursement opportunities. +·Diverse and inclusive employee resource groups where you can network and connect with IBMers across the globe. +·Giving and volunteer programs to benefit charitable organizations and local communities. +·Discounts on retail products, services, and experiences. + +The compensation range for this position is based on a full-time schedule. The salary will vary depending on your job-related skills, experience and location. Pay increment and frequency of pay will be in accordance with employment classification and applicable laws. For part time roles, your compensation will be adjusted to reflect your hours. + +We consider qualified applicants with criminal histories, consistent with applicable law. + +IBM Vaccination Policy + +This job requires you to provide your COVID-19 vaccination status with supporting documentation, where legally permissible. + +Being You @ IBM + +IBM is committed to creating a diverse environment and is proud to be an equal opportunity employer. All qualified applicants will receive consideration for employment without regard to race, color, religion, gender, gender identity or expression, sexual orientation, national origin, genetics, pregnancy, disability, age, veteran status, or other characteristics. IBM is also committed to compliance with all fair employment practices regarding citizenship and immigration status. + +Country/Region + +United States + +State / Province + +MULTIPLE + +City / Township / Village + +MULTIPLE CITIES + +IBM Business Group + +Research + +Primary job category + +Site Reliability Engineer + +Secondary Job Category + +Other Site Reliability Engineer + +Role ( Job Role ) + +Site Reliability Engineering Professional + +Employment Type + +Full-Time + +Contract type + +Regular + +Projected Maximum Salary + +$251,000 + +Projected Minimum Salary + +$135,000 + +Early Professional Track + +Not Applicable - Professional Hire + +Position Type + +Professional + +Travel Required + +No Travel + +Company + +(0147) International Business Machines Corporation + +Is this role a commissionable/sales incentive based position? + +No \ No newline at end of file diff --git a/Project Vault/Current Occupations/Potential and Future/60 careers/Technical Writer position.md b/Project Vault/Current Occupations/Potential and Future/60 careers/Technical Writer position.md new file mode 100644 index 0000000..c600205 --- /dev/null +++ b/Project Vault/Current Occupations/Potential and Future/60 careers/Technical Writer position.md @@ -0,0 +1,20 @@ + +Minimum qualifications +• Bachelor's degree or equivalent practical experience. +• 1 year of experience creating content for a technical audience, including developer documentation, computer science course materials, and/or IT administration playbooks. +• Experience working with technologies (e.g., software or hardware systems) by investigation, experimentation (e.g., reading or running code), and/or interactions with subject matter experts (SMEs). Preferred qualifications: +• Experience working with researchers and software engineers. • Experience with Colab. +• Outstanding written communication skills to communicate to a technical audience. + +About the job +Technical writers plan, create, and maintain educational content as an integral part of the engineering or user experience. The content is often in the form of documentation, but may also be UI text, sample code, videos, or other educational material. + +Regardless of the content medium, technical writers are distinguished by their abilities to explain complex topics in a way that’s useful to their audience. Brain is a team of Scientists, Software Engineers, and other cross-functional collaborators who work together to make machines intelligent and improve people's lives through advancement in the fundamental theory and an understanding of machine learning and through research in the service of product. We believe that openly disseminating research is critical to a healthy exchange of ideas, leading to rapid progress in the field. As such, we publish our research regularly at academic conferences and release our tools as open source projects. + +Responsibilities +• Work with Research teams to create content that showcases their work through Google Research channels, conference presentations, etc. +• Create technical documentation for research efforts. +• Provide scientific editorial support to uplevel the written quality of papers. + + +Google is proud to be an equal opportunity workplace and is an affirmative action employer. We are committed to equal employment opportunity regardless of race, color, ancestry, religion, sex, national origin, sexual orientation, age, citizenship, marital status, disability, gender identity or Veteran status. We also consider qualified applicants regardless of criminal histories, consistent with legal requirements. See also Google's EEO Policy and EEO is the Law. If you have a disability or special need that requires accommodation, please let us know by completing our Accommodations for Applicants form \ No newline at end of file diff --git a/Project Vault/Current Occupations/Potential and Future/60 careers/Terra Quantum Applied Researcher Quantum Machine Learning.md b/Project Vault/Current Occupations/Potential and Future/60 careers/Terra Quantum Applied Researcher Quantum Machine Learning.md new file mode 100644 index 0000000..b815a1c --- /dev/null +++ b/Project Vault/Current Occupations/Potential and Future/60 careers/Terra Quantum Applied Researcher Quantum Machine Learning.md @@ -0,0 +1,58 @@ +** + +Terra Quantum Applied Researcher Quantum Machine Learning  + +Edit resume: [here](https://docs.google.com/document/d/1FS1aTo9YeQE_Ui0oiAlxtNYdnUC6kB3tcMvjbG9J6W0/edit) on google drive. +The one i ended up submitting is on [here](https://docs.google.com/document/d/1c2Z74e-aytXM40fnX2VCEViRh_Pzy4OjH5YXezLxus8/edit#). + +The Role:   + +The Quantum Applied Researcher (ML) is part of Terra Quantum’s research and development & delivery  organization, which is responsible for conducting the core research in quantum computing and implementing the  algorithms in a form of the software product, ensuring the company’s ability to implement it, and aligning the  product vision with the corporate vision. The Quantum Applied Researcher reports to the Program Manager  supporting continuous research and development and improvement, including algorithms engineering, -research, - design. With a clear and customer-oriented product mindset, the Quantum ML Engineer technically guides junior  members of their team in targeted and efficient algorithms engineering. Working closely with product management  and -strategy, the Quantum Applied Researcher understands all the technical aspects of developing scalable, easy to-use, secure, practical, and intuitive software. Also, the Quantum Applied Researcher will understand the market  needs in terms of quantum technology and what can be built on the research output.   + +With an eye for detail, the Quantum Applied Researcher (ML) helps their teams strive for perfection and has a  capacity for enthusiasm and shows their team that they partake in the paramount mission to make quantum  technologies broadly available and accessible and change the world for the better.   + +The Responsibilities  + +The Quantum Applied Researcher (ML) should expect to work on customer projects within the Quantum Machine  Learning Team.   + +Industrial customer projects implementation   + +o Bringing in novel quantum algorithmic ideas based on industry needs (chemistry, pharmaceutical,  energy, financial, automotive, space industries) and the state-of-the-art scientific literature  o Researching the existing classical and quantum machine learning solutions to customer problems  o Exploring and testing the best ways to hybridize classical machine learning solutions with  quantum machine learning   + +o Developing and implementing (in Python) quantum and hybrid quantum machine learning  algorithmic solutions to customer problems  + +o Working on finding a theoretical or empirical advantage of using hybrid quantum-classical  machine learning in customer problems  + +o Writing results as applied research papers, and assisting in business papers and reports  preparation   + +Software engineering and product preparation   + +o Packaging of the developed quantum machine learning algorithms and solutions into user-friendly libraries,  e.g. using Python frameworks  + +o Supporting the implementation of the APIs that are used to for the libraries access  + +o Under consideration of the product strategy, contributing to the software product architecture and  supporting Product team in to transition Terra Quantum’s portfolio projects and R&D into scalable and  reliable products   + +The Requirements  + +The Quantum Applied Researcher (ML) is expected to have the following qualifications.   + +● Degree in computer science, physics, mathematics, electrical engineering, or equivalent subject  ● Advanced expertise in one or more quantum programming languages (Qiskit, Q#, Pennylane, Cirq, Quipper,  Scaffold, tket)  + +● Publication record in quantum machine learning  + +● Experience working with the classical machine learning algorithms  + +● Expert knowledge in Python  + +● Expert knowledge in Pytorch and TensorFlow  + +● Experience in programming for GPUs and/or TPUs + +● Experience in office and management software, document, and presentation preparation (Outlook,  PowerPoint, Excel, Word, Overleaf, Jira and Confluence)  + +● Proficiency in written and spoken English  + +● Goal-oriented, analytical and the ability to work independently and within the team ● Clear and customer-oriented agile and team-oriented approach + +** \ No newline at end of file diff --git a/Project Vault/Current Occupations/Potential and Future/About 60 Careers.md b/Project Vault/Current Occupations/Potential and Future/About 60 Careers.md new file mode 100644 index 0000000..7b1fcec --- /dev/null +++ b/Project Vault/Current Occupations/Potential and Future/About 60 Careers.md @@ -0,0 +1,73 @@ +# 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 from Hack Manhattan 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 +33. [DevOps](https://jobs.ornl.gov/job/Oak-Ridge-Associate-DevOps-Engineer-TN-37830/848147600/?feedId=301500&utm_source=ResearchGate&utm_campaign=ORNL_RG&&sn=Indeed&?mode=apply&iis=Indeed&iisn=Indeed) for ORNL +34. Machine Learning Engineer for Brookhaven +35. Oak ridge [devops](https://jobs.ornl.gov/job/Oak-Ridge-Associate-DevOps-Engineer-TN-37830/848147600/?feedId=301500&utm_source=ResearchGate&utm_campaign=ORNL_RG&&sn=Indeed&?mode=apply&iis=Indeed&iisn=Indeed) +36. [Foamspace](obsidian://open?vault=Coding%20Tips&file=Careers%2F60%20careers%2FFoamspace%20technical%20writer) technical writer +37. [Solutions Engineer ](obsidian://open?vault=Coding%20Tips&file=Careers%2F60%20careers%2FPalantir%20Solutions%20Engineer)for Palantir +38. IBM [Data Scientist ](obsidian://open?vault=Coding%20Tips&file=Careers%2F60%20careers%2FIBM%20%20Data%20Scientist) +39. TerraQuantum [Quantum ML Researcher](obsidian://open?vault=Coding%20Tips&file=Careers%2FPotential%20and%20Future%2F60%20careers%2FTerra%20Quantum%20Applied%20Researcher%20Quantum%20Machine%20Learning) --> responded. result: want someone from Europe +40. Weights & Biases - Machine Learning Support Engineer --> responded. result: second interview-**never completed** +41. [Site Reliability Engineering Lead](obsidian://open?vault=Quantum%20Vault&file=Careers%2FPotential%20and%20Future%2F60%20careers%2FSite%20Reliability%20Engineering%20Lead) - IBM +42. AI Technical Trainer - Amelia.ai(IPSoft) --> result: quick second interview, rejected +43. [Graduate Research Assistant](https://www.indeed.com/viewjob?jk=49b167d1b119f048&from=mobRdr&utm_source=%2Fm%2F&utm_medium=redir&utm_campaign=dt) - Los Alamos Labs +44. Quantum Education Fellow - Qubit x Qubit//The coding school --> result: **success** + +--- + +Another list of 60 is needed in order to move forward from the fellowship position, ideally tech/quantum adjacent. + +1. Dispute Resolution Specialist --> resume sent over. +2. Google [Technical Writer. ](obsidian://open?vault=Obsidian&file=Coding%20Tips%2FCareers%2FPotential%20and%20Future%2F60%20careers%2FTechnical%20Writer%20position) +3. NSA Jobs +4. Digital Media Specialist for SFI +5. AssemblyAI --> interviewed: no +6. Space Dynamics Lab --> interviewed: haven't heard back +7. Schrodinger --> submitted application +8. Microsoft Quantum SWE --> submitted: no but encouraged to look at other roles + + diff --git a/Project Vault/Current Occupations/Potential and Future/Amazon/.DS_Store b/Project Vault/Current Occupations/Potential and Future/Amazon/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Project Vault/Current Occupations/Potential and Future/Amazon/.DS_Store differ diff --git a/Project Vault/Current Occupations/Potential and Future/Amazon/Amazon assessment link & instructions.md b/Project Vault/Current Occupations/Potential and Future/Amazon/Amazon assessment link & instructions.md new file mode 100644 index 0000000..ebd719c --- /dev/null +++ b/Project Vault/Current Occupations/Potential and Future/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/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/.DS_Store b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/.DS_Store differ diff --git a/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/HackerRank/.DS_Store b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/HackerRank/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/HackerRank/.DS_Store differ diff --git a/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/HackerRank/About HackerRank Tips.md b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/HackerRank/About HackerRank Tips.md new file mode 100644 index 0000000..83b1adb --- /dev/null +++ b/Project Vault/Current Occupations/Potential and Future/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/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/HackerRank/Tip 1..md b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/HackerRank/Tip 1..md new file mode 100644 index 0000000..dd343dd --- /dev/null +++ b/Project Vault/Current Occupations/Potential and Future/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/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/HackerRank/Tip 2.md b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/HackerRank/Tip 2.md new file mode 100644 index 0000000..b50f707 --- /dev/null +++ b/Project Vault/Current Occupations/Potential and Future/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/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/HackerRank/Tip 3.md b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/HackerRank/Tip 3.md new file mode 100644 index 0000000..e316c46 --- /dev/null +++ b/Project Vault/Current Occupations/Potential and Future/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/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/HackerRank/Tip 4.md b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/HackerRank/Tip 4.md new file mode 100644 index 0000000..3d2ff6f --- /dev/null +++ b/Project Vault/Current Occupations/Potential and Future/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/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/HackerRank/Tip 5.md b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/HackerRank/Tip 5.md new file mode 100644 index 0000000..6418bf1 --- /dev/null +++ b/Project Vault/Current Occupations/Potential and Future/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/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/HackerRank/Tip 6.md b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/HackerRank/Tip 6.md new file mode 100644 index 0000000..dc766a9 --- /dev/null +++ b/Project Vault/Current Occupations/Potential and Future/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/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/HackerRank/Tip 7.md b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/HackerRank/Tip 7.md new file mode 100644 index 0000000..4492b26 --- /dev/null +++ b/Project Vault/Current Occupations/Potential and Future/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/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/More tips + Basic steps of an algorithm.md b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/More tips + Basic steps of an algorithm.md new file mode 100644 index 0000000..9b3fac3 --- /dev/null +++ b/Project Vault/Current Occupations/Potential and Future/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/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/.DS_Store b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/.DS_Store differ diff --git a/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/Amazon Robot Python problem 1.md b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/Amazon Robot Python problem 1.md new file mode 100644 index 0000000..dfa711b --- /dev/null +++ b/Project Vault/Current Occupations/Potential and Future/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/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/Apple - Daily Coding Problem_ Problem #53 [Medium].pdf b/Project Vault/Current Occupations/Potential and Future/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/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/Apple - Daily Coding Problem_ Problem #53 [Medium].pdf differ diff --git a/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/Apple medium Daily Coding Problem_ Problem #53 [Medium].pdf b/Project Vault/Current Occupations/Potential and Future/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/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/Apple medium Daily Coding Problem_ Problem #53 [Medium].pdf differ diff --git a/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/Daily Coding Problem: Problem #26 [Medium].pdf b/Project Vault/Current Occupations/Potential and Future/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/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/Daily Coding Problem: Problem #26 [Medium].pdf differ diff --git a/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/Dropbox hardDaily Coding Problem_ Problem #54 [Hard].pdf b/Project Vault/Current Occupations/Potential and Future/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/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/Dropbox hardDaily Coding Problem_ Problem #54 [Hard].pdf differ diff --git a/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/How to solve a hard programming question.md b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/How to solve a hard programming question.md new file mode 100644 index 0000000..98ffed8 --- /dev/null +++ b/Project Vault/Current Occupations/Potential and Future/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/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/Microsoft Daily Coding Problem_ Problem #55 [Easy].pdf b/Project Vault/Current Occupations/Potential and Future/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/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/Microsoft Daily Coding Problem_ Problem #55 [Easy].pdf differ diff --git a/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/Microsoft medium Daily Coding Problem_ Problem #50 [Easy].pdf b/Project Vault/Current Occupations/Potential and Future/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/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/Microsoft medium Daily Coding Problem_ Problem #50 [Easy].pdf differ diff --git a/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/amazon/.DS_Store b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/amazon/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/amazon/.DS_Store differ diff --git a/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/amazon/Amazon Daily Coding Problem_ Problem #46 [Hard].pdf b/Project Vault/Current Occupations/Potential and Future/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/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/amazon/Amazon Daily Coding Problem_ Problem #46 [Hard].pdf differ diff --git a/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/amazon/Amazon Daily Coding Problem_ Problem #58 [Medium].pdf b/Project Vault/Current Occupations/Potential and Future/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/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/amazon/Amazon Daily Coding Problem_ Problem #58 [Medium].pdf differ diff --git a/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/amazon/Amazon Medium Daily Coding Problem_ Problem #57 [Medium].pdf b/Project Vault/Current Occupations/Potential and Future/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/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/amazon/Amazon Medium Daily Coding Problem_ Problem #57 [Medium].pdf differ diff --git a/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/amazon/Amazon Problem #29 [Easy].pdf b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/amazon/Amazon Problem #29 [Easy].pdf new file mode 100644 index 0000000..7527984 Binary files /dev/null and b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/amazon/Amazon Problem #29 [Easy].pdf differ diff --git a/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/amazon/Amazon easy Daily Coding Problem_ Problem #43 [Easy].pdf b/Project Vault/Current Occupations/Potential and Future/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/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/amazon/Amazon easy Daily Coding Problem_ Problem #43 [Easy].pdf differ diff --git a/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/amazon/Amazon hard Daily Coding Problem_ Problem #46 [Hard].pdf b/Project Vault/Current Occupations/Potential and Future/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/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/amazon/Amazon hard Daily Coding Problem_ Problem #46 [Hard].pdf differ diff --git a/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/amazon/Amazon medium Daily Coding Problem_ Problem #49 [Medium].pdf b/Project Vault/Current Occupations/Potential and Future/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/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/amazon/Amazon medium Daily Coding Problem_ Problem #49 [Medium].pdf differ diff --git a/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/amazon/Hard. Amazon Daily Coding Problem_ Problem #46 [Hard].pdf b/Project Vault/Current Occupations/Potential and Future/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/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/amazon/Hard. Amazon Daily Coding Problem_ Problem #46 [Hard].pdf differ diff --git a/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/amazon/MAIN coding problems .pdf b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/amazon/MAIN coding problems .pdf new file mode 100644 index 0000000..d933896 Binary files /dev/null and b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/amazon/MAIN coding problems .pdf differ diff --git a/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/amazon/easy amazon Daily Coding Problem_ Problem #43 [Easy].pdf b/Project Vault/Current Occupations/Potential and Future/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/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/amazon/easy amazon Daily Coding Problem_ Problem #43 [Easy].pdf differ diff --git a/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/easy. twosigma Daily Coding Problem_ Problem #45 [Easy].pdf b/Project Vault/Current Occupations/Potential and Future/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/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/easy. twosigma Daily Coding Problem_ Problem #45 [Easy].pdf differ diff --git a/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/facebook/.DS_Store b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/facebook/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/facebook/.DS_Store differ diff --git a/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/facebook/Facebook Medium Daily Coding Problem_ Problem #51 [Medium].pdf b/Project Vault/Current Occupations/Potential and Future/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/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/facebook/Facebook Medium Daily Coding Problem_ Problem #51 [Medium].pdf differ diff --git a/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/facebook/Facebook medium Daily Coding Problem_ Problem #60 [Medium].pdf b/Project Vault/Current Occupations/Potential and Future/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/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/facebook/Facebook medium Daily Coding Problem_ Problem #60 [Medium].pdf differ diff --git a/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/facebook/facebook - Daily Coding Problem_ Problem #51 [Medium].pdf b/Project Vault/Current Occupations/Potential and Future/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/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/facebook/facebook - Daily Coding Problem_ Problem #51 [Medium].pdf differ diff --git a/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/fb Daily Coding Problem: Problem #25 [Hard].pdf b/Project Vault/Current Occupations/Potential and Future/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/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/fb Daily Coding Problem: Problem #25 [Hard].pdf differ diff --git a/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/google/ Daily Coding Problem_ Problem #37 [Easy].pdf b/Project Vault/Current Occupations/Potential and Future/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/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/google/ Daily Coding Problem_ Problem #37 [Easy].pdf differ diff --git a/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/google/.DS_Store b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/google/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/google/.DS_Store differ diff --git a/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/google/Google Daily Coding Problem_ Problem #44 [Medium].pdf b/Project Vault/Current Occupations/Potential and Future/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/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/google/Google Daily Coding Problem_ Problem #44 [Medium].pdf differ diff --git a/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/google/Google LRU Daily Coding Problem_ Problem #52 [Hard].pdf b/Project Vault/Current Occupations/Potential and Future/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/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/google/Google LRU Daily Coding Problem_ Problem #52 [Hard].pdf differ diff --git a/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/google/Google Medium Daily Coding Problem_ Problem #56 [Medium].pdf b/Project Vault/Current Occupations/Potential and Future/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/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/google/Google Medium Daily Coding Problem_ Problem #56 [Medium].pdf differ diff --git a/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/google/Google Problem.md b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/google/Google Problem.md new file mode 100644 index 0000000..1df1a05 --- /dev/null +++ b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/google/Google Problem.md @@ -0,0 +1,7 @@ +# Google problem + +This problem was asked by Google. + +Given a word W and a string `S`, find all starting indices in `S` which are anagrams of `W`. + +For example, given that W is "ab", and S is "abxaba", return 0, 3, and 4. \ No newline at end of file diff --git a/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/google/Google medium Daily Coding Problem_ Problem #48 [Medium].pdf b/Project Vault/Current Occupations/Potential and Future/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/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/google/Google medium Daily Coding Problem_ Problem #48 [Medium].pdf differ diff --git a/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/google/LRU Cache.pdf b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/google/LRU Cache.pdf new file mode 100644 index 0000000..b1cc9cd Binary files /dev/null and b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/google/LRU Cache.pdf differ diff --git a/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/google/New York Institute of Technology Mail - Daily Coding Problem_ Problem #59 [Hard].pdf b/Project Vault/Current Occupations/Potential and Future/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/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/google/New York Institute of Technology Mail - Daily Coding Problem_ Problem #59 [Hard].pdf differ diff --git a/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/google/google coding problems .pdf b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/google/google coding problems .pdf new file mode 100644 index 0000000..8794b8a Binary files /dev/null and b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/google/google coding problems .pdf differ diff --git a/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/google/medium google. Daily Coding Problem_ Problem #44 [Medium].pdf b/Project Vault/Current Occupations/Potential and Future/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/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/google/medium google. Daily Coding Problem_ Problem #44 [Medium].pdf differ diff --git a/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/group 1/.DS_Store b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/group 1/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/group 1/.DS_Store differ diff --git a/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/group 1/Amazon - LeetCode.pdf b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/group 1/Amazon - LeetCode.pdf new file mode 100644 index 0000000..9e2e6fc Binary files /dev/null and b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/group 1/Amazon - LeetCode.pdf differ diff --git a/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/group 1/An Introduction To Backtracking.pdf b/Project Vault/Current Occupations/Potential and Future/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/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/group 1/An Introduction To Backtracking.pdf differ diff --git a/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/group 1/Daily Coding Problem_ Problem #19 [Medium].pdf b/Project Vault/Current Occupations/Potential and Future/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/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/group 1/Daily Coding Problem_ Problem #19 [Medium].pdf differ diff --git a/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/group 1/Daily Coding Problem_ Problem #21 [Easy].pdf b/Project Vault/Current Occupations/Potential and Future/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/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/group 1/Daily Coding Problem_ Problem #21 [Easy].pdf differ diff --git a/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/group 1/Daily Coding Problem_ Problem #22 [Medium].pdf b/Project Vault/Current Occupations/Potential and Future/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/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/group 1/Daily Coding Problem_ Problem #22 [Medium].pdf differ diff --git a/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/group 2/.DS_Store b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/group 2/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/group 2/.DS_Store differ diff --git a/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/group 2/Facebook practice problem[easy].pdf b/Project Vault/Current Occupations/Potential and Future/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/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/group 2/Facebook practice problem[easy].pdf differ diff --git a/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/group 2/How to Pick a Random Element from an Infinite Stream.pdf b/Project Vault/Current Occupations/Potential and Future/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/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/group 2/How to Pick a Random Element from an Infinite Stream.pdf differ diff --git a/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/group 2/Palantir Coding Problem.pdf b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/group 2/Palantir Coding Problem.pdf new file mode 100644 index 0000000..aabce80 Binary files /dev/null and b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/group 2/Palantir Coding Problem.pdf differ diff --git a/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/group 3/.DS_Store b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/group 3/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/group 3/.DS_Store differ diff --git a/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/group 3/Problem #31 [Easy].pdf b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/group 3/Problem #31 [Easy].pdf new file mode 100644 index 0000000..ad33a94 Binary files /dev/null and b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/group 3/Problem #31 [Easy].pdf differ diff --git a/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/group 3/binary tree problem.pdf b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/group 3/binary tree problem.pdf new file mode 100644 index 0000000..c341091 Binary files /dev/null and b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/group 3/binary tree problem.pdf differ diff --git a/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/group 3/google hard problem2.pdf b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/group 3/google hard problem2.pdf new file mode 100644 index 0000000..615469f Binary files /dev/null and b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/group 3/google hard problem2.pdf differ diff --git a/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/group 3/google problem hard.pdf b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/group 3/google problem hard.pdf new file mode 100644 index 0000000..fd70a10 Binary files /dev/null and b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/group 3/google problem hard.pdf differ diff --git a/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/group 3/google problem.pdf b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/group 3/google problem.pdf new file mode 100644 index 0000000..3a0092d Binary files /dev/null and b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/Practice Problems/group 3/google problem.pdf differ diff --git a/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/ipynb practice problems/.DS_Store b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/ipynb practice problems/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/ipynb practice problems/.DS_Store differ diff --git a/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/ipynb practice problems/Notebook code/.DS_Store b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/ipynb practice problems/Notebook code/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/ipynb practice problems/Notebook code/.DS_Store differ diff --git a/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/ipynb practice problems/Notebook code/K Closest Points to Origin(973).ipynb b/Project Vault/Current Occupations/Potential and Future/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/Project Vault/Current Occupations/Potential and Future/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/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/ipynb practice problems/Notebook code/LRU Cache(146).ipynb b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/ipynb practice problems/Notebook code/LRU Cache(146).ipynb new file mode 100644 index 0000000..1a4357e --- /dev/null +++ b/Project Vault/Current Occupations/Potential and Future/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/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/ipynb practice problems/Notebook code/Maximum Units on a Truck(1710).ipynb b/Project Vault/Current Occupations/Potential and Future/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/Project Vault/Current Occupations/Potential and Future/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/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/ipynb practice problems/Notebook code/Merge Intervals(56).ipynb b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/ipynb practice problems/Notebook code/Merge Intervals(56).ipynb new file mode 100644 index 0000000..e806c5c --- /dev/null +++ b/Project Vault/Current Occupations/Potential and Future/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/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/ipynb practice problems/Notebook code/Number of Provinces (547).ipynb b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/ipynb practice problems/Notebook code/Number of Provinces (547).ipynb new file mode 100644 index 0000000..b7cca3d --- /dev/null +++ b/Project Vault/Current Occupations/Potential and Future/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/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/ipynb practice problems/Notebook code/Robot in a circle (1041).ipynb b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/ipynb practice problems/Notebook code/Robot in a circle (1041).ipynb new file mode 100644 index 0000000..395ea3f --- /dev/null +++ b/Project Vault/Current Occupations/Potential and Future/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/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/ipynb practice problems/Notebook code/RunLengthEncoding.ipynb b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/ipynb practice problems/Notebook code/RunLengthEncoding.ipynb new file mode 100644 index 0000000..40bd9e4 --- /dev/null +++ b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/ipynb practice problems/Notebook code/RunLengthEncoding.ipynb @@ -0,0 +1 @@ +{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"provenance":[]},"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":null,"metadata":{"id":"4C8nYe_TRZFa"},"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":null,"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"},"execution_count":null,"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/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/ipynb practice problems/Notebook code/two singly linked lists intersect.ipynb b/Project Vault/Current Occupations/Potential and Future/Amazon/Coding Assessment/ipynb practice problems/Notebook code/two singly linked lists intersect.ipynb new file mode 100644 index 0000000..734e98a --- /dev/null +++ b/Project Vault/Current Occupations/Potential and Future/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/Project Vault/Current Occupations/Potential and Future/Career Tips.md b/Project Vault/Current Occupations/Potential and Future/Career Tips.md new file mode 100644 index 0000000..615e7af --- /dev/null +++ b/Project Vault/Current Occupations/Potential and Future/Career Tips.md @@ -0,0 +1,10 @@ + +Here are a collection of career tips that are collected through time. A lot of these may just become life tips as well not only for your career, but regardless there are important tidbits of info: + +--- + +- Communication Hacks as a Young Employee via [medium](https://betterhumans.pub/8-communication-hacks-i-use-to-appear-more-senior-as-a-young-employee-9106468bf5aa) +- "Respect Other People's Time" ~ + - this is an important one because while we want other's to respect our time, it is not often said that we must respect other people's time for the sake of not hurting another person's most valuable resource: time. + - No matter who they are, just respect the time they have and are giving you. When engaging with **anyone**, they are giving you their time. Don't take up their time just because you feel entitled to it, you don't! + - Not only will your own time not be respected if you don't respect other people's time, it is also showing that you don't care about others if you are holding the most space in time for yourself. Caring about others is integral to being a good human to being and a good person to work with, to love, to do anything really. \ No newline at end of file diff --git a/Project Vault/Current Occupations/QRG/.DS_Store b/Project Vault/Current Occupations/QRG/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Project Vault/Current Occupations/QRG/.DS_Store differ diff --git a/Project Vault/Current Occupations/QRG/About QRG.md b/Project Vault/Current Occupations/QRG/About QRG.md new file mode 100644 index 0000000..cf3f067 --- /dev/null +++ b/Project Vault/Current Occupations/QRG/About QRG.md @@ -0,0 +1,28 @@ +# Quantum Research Group + +Set up back in 2019-2020, a quantum club was formed. You started it and you are President. Be responsible so that this stays a thriving organization for others at the very least. + +For information about the quantum research group at NYIT, there is the public [Notion](https://www.notion.so/shwethajayaraj/The-Quantum-Research-Group-7150bc7f5d7e4ba384212a9816ce928b) page. It has been transferred as best as possible to read here at [The Quantum Research Group](obsidian://open?vault=Coding%20Tips&file=Careers%2FCurrent%20Occupations%2FQRG%2Fmore-qrg%2FThe%20Quantum%20Research%20Group). + +- A lot of the information found on the [quantum realm](obsidian://open?vault=Coding%20Tips&file=Computers%2FQuantum%20Realm%2FWelcome%20to%20Quantum%20101) is communicated and transferred for the education of this student group. +--- + +## 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. + + + +## 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 + + diff --git a/Project Vault/Current Occupations/QRG/more-qrg/.DS_Store b/Project Vault/Current Occupations/QRG/more-qrg/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Project Vault/Current Occupations/QRG/more-qrg/.DS_Store differ diff --git a/Project Vault/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/.DS_Store b/Project Vault/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Project Vault/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/.DS_Store differ diff --git a/Project Vault/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Quantum Papers.md b/Project Vault/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Quantum Papers.md new file mode 100644 index 0000000..15df245 --- /dev/null +++ b/Project Vault/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Quantum Papers.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](D-Wave's%202019%20Recap%20a1fe36f9d3bc4ee6b2044e51b78e7e32.md) + +[Menten AI](Menten%20AI%206efaacbaea83459fafe1254649b82b1f.md) + +[Quantum Error Correction - Notes](Quantum%20Error%20Correction%20-%20Notes.md) + +[Demonstrating Superposition ](Demonstrating%20Superposition%2072b6d49984f3441aad128915b7349e32.md) + +[Q-CTRL Tutorial ](Q-CTRL%20Tutorial%20cb0c1e016ea849e281b2878cb7401dca.md) + +[QPU Teleportation ](QPU%20Teleportation%203fc3984bc42342c2a8c650b75452ab56.md) + +[Learning Qiskit ](Learning%20Qiskit%20a6cf9a98cc344279b607fe28a6c08e45.md) + +[QURECA](QURECA%20ddd35e9bdd2843bbacb547fbb90ec6c3.md) + +[Quantum Qonvos. ](Quantum%20Qonvos%20dc00c53b7a774b8cb216c2bdd4986d5f.md) \ No newline at end of file diff --git a/Project Vault/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Ze Quantum Papers/.DS_Store b/Project Vault/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Ze Quantum Papers/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Project Vault/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Ze Quantum Papers/.DS_Store differ diff --git a/Project Vault/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Ze Quantum Papers/D-Wave's 2019 Recap a1fe36f9d3bc4ee6b2044e51b78e7e32.md b/Project Vault/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Ze Quantum Papers/D-Wave's 2019 Recap a1fe36f9d3bc4ee6b2044e51b78e7e32.md new file mode 100644 index 0000000..5fc14f2 --- /dev/null +++ b/Project Vault/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Ze Quantum Papers/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](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/Project Vault/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Ze Quantum Papers/Demonstrating Superposition 72b6d49984f3441aad128915b7349e32.md b/Project Vault/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Ze Quantum Papers/Demonstrating Superposition 72b6d49984f3441aad128915b7349e32.md new file mode 100644 index 0000000..f094485 --- /dev/null +++ b/Project Vault/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Ze Quantum Papers/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/Project Vault/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Ze Quantum Papers/Learning Qiskit a6cf9a98cc344279b607fe28a6c08e45.md b/Project Vault/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Ze Quantum Papers/Learning Qiskit a6cf9a98cc344279b607fe28a6c08e45.md new file mode 100644 index 0000000..3ad82e5 --- /dev/null +++ b/Project Vault/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Ze Quantum Papers/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/Project Vault/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Ze Quantum Papers/Menten AI 6efaacbaea83459fafe1254649b82b1f.md b/Project Vault/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Ze Quantum Papers/Menten AI 6efaacbaea83459fafe1254649b82b1f.md new file mode 100644 index 0000000..1c7b4f7 --- /dev/null +++ b/Project Vault/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Ze Quantum Papers/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](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](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](Screen_Shot_2020-04-30_at_1.13.16_PM.png) \ No newline at end of file diff --git a/Project Vault/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Ze Quantum Papers/Q-CTRL Tutorial cb0c1e016ea849e281b2878cb7401dca.md b/Project Vault/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Ze Quantum Papers/Q-CTRL Tutorial cb0c1e016ea849e281b2878cb7401dca.md new file mode 100644 index 0000000..0794c1b --- /dev/null +++ b/Project Vault/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Ze Quantum Papers/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/Project Vault/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Ze Quantum Papers/QPU Teleportation 3fc3984bc42342c2a8c650b75452ab56.md b/Project Vault/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Ze Quantum Papers/QPU Teleportation 3fc3984bc42342c2a8c650b75452ab56.md new file mode 100644 index 0000000..d3c0a22 --- /dev/null +++ b/Project Vault/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Ze Quantum Papers/QPU Teleportation 3fc3984bc42342c2a8c650b75452ab56.md @@ -0,0 +1 @@ +# QPU Teleportation \ No newline at end of file diff --git a/Project Vault/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Ze Quantum Papers/QURECA ddd35e9bdd2843bbacb547fbb90ec6c3.md b/Project Vault/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Ze Quantum Papers/QURECA ddd35e9bdd2843bbacb547fbb90ec6c3.md new file mode 100644 index 0000000..335e133 --- /dev/null +++ b/Project Vault/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Ze Quantum Papers/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/Project Vault/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Ze Quantum Papers/Quantum Error Correction - Notes.md b/Project Vault/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Ze Quantum Papers/Quantum Error Correction - Notes.md new file mode 100644 index 0000000..3ff6753 --- /dev/null +++ b/Project Vault/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Ze Quantum Papers/Quantum Error Correction - Notes.md @@ -0,0 +1,132 @@ +# Notes on Quantum Error Correction + +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/Project Vault/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Ze Quantum Papers/Quantum Qonvos dc00c53b7a774b8cb216c2bdd4986d5f.md b/Project Vault/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Ze Quantum Papers/Quantum Qonvos dc00c53b7a774b8cb216c2bdd4986d5f.md new file mode 100644 index 0000000..24537dd --- /dev/null +++ b/Project Vault/Current Occupations/QRG/more-qrg/The Quantum Research Group 7150bc7f5d7e4ba384212a9816ce928b/Ze Quantum Papers/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/Project Vault/Current Occupations/QRG/more-qrg/The Quantum Research Group.md b/Project Vault/Current Occupations/QRG/more-qrg/The Quantum Research Group.md new file mode 100644 index 0000000..b839eec --- /dev/null +++ b/Project Vault/Current Occupations/QRG/more-qrg/The Quantum Research Group.md @@ -0,0 +1,24 @@ +# 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](Quantum%20Papers.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 Papers](Quantum%20Papers.md) diff --git a/Project Vault/Current Occupations/QRG/more-qrg/images/.DS_Store b/Project Vault/Current Occupations/QRG/more-qrg/images/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Project Vault/Current Occupations/QRG/more-qrg/images/.DS_Store differ diff --git a/Project Vault/Current Occupations/QRG/more-qrg/images/Screen_Shot_2020-04-30_at_1.05.24_PM.png b/Project Vault/Current Occupations/QRG/more-qrg/images/Screen_Shot_2020-04-30_at_1.05.24_PM.png new file mode 100644 index 0000000..8c91eef Binary files /dev/null and b/Project Vault/Current Occupations/QRG/more-qrg/images/Screen_Shot_2020-04-30_at_1.05.24_PM.png differ diff --git a/Project Vault/Current Occupations/QRG/more-qrg/images/Screen_Shot_2020-04-30_at_1.07.59_PM.png b/Project Vault/Current Occupations/QRG/more-qrg/images/Screen_Shot_2020-04-30_at_1.07.59_PM.png new file mode 100644 index 0000000..37bcdac Binary files /dev/null and b/Project Vault/Current Occupations/QRG/more-qrg/images/Screen_Shot_2020-04-30_at_1.07.59_PM.png differ diff --git a/Project Vault/Current Occupations/QRG/more-qrg/images/Screen_Shot_2020-04-30_at_1.13.16_PM.png b/Project Vault/Current Occupations/QRG/more-qrg/images/Screen_Shot_2020-04-30_at_1.13.16_PM.png new file mode 100644 index 0000000..90cf2b2 Binary files /dev/null and b/Project Vault/Current Occupations/QRG/more-qrg/images/Screen_Shot_2020-04-30_at_1.13.16_PM.png differ diff --git a/Project Vault/Current Occupations/QRG/more-qrg/images/ec2d906e-472e-41fe-b7fe-4c5dc257ae50-1552335402254.png b/Project Vault/Current Occupations/QRG/more-qrg/images/ec2d906e-472e-41fe-b7fe-4c5dc257ae50-1552335402254.png new file mode 100644 index 0000000..bba2933 Binary files /dev/null and b/Project Vault/Current Occupations/QRG/more-qrg/images/ec2d906e-472e-41fe-b7fe-4c5dc257ae50-1552335402254.png differ diff --git a/Project Vault/Current Occupations/Shwetha Jayaraj Notes.md b/Project Vault/Current Occupations/Shwetha Jayaraj Notes.md new file mode 100644 index 0000000..9dc1c91 --- /dev/null +++ b/Project Vault/Current Occupations/Shwetha Jayaraj Notes.md @@ -0,0 +1,88 @@ +# 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. + +Maybe this could be a good README.md file or something later on. + +--- + +Obviously this gets edited with time & as life goes, but right now I am: + +- 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/) +- Doing my master's project at NYIT which relates to the [QRG](obsidian://open?vault=Coding%20Tips&file=Careers%2FCurrent%20Occupations%2FQRG%2FAbout%20QRG) & the [Quantum Realm](obsidian://open?vault=Coding%20Tips&file=Computers%2FQuantum%20Realm%2FWelcome%20to%20Quantum%20101) +- A [Quantum Education Fellow](obsidian://open?vault=Obsidian&file=Coding%20Tips%2FCareers%2FCurrent%20Occupations%2Fqubit%20x%20qubit%2FQubit%20x%20qubit%20Quantum%20Education%20Fellowship) for the international non-profit The Coding School. + +--- +# For the website & personal resume/blog: ? + +websites that point to me: +- https://meritpages.com/shwetha, https://elpha.com/members/shwetha +- My [LinkedIn](https://www.linkedin.com/in/shwethajayaraj) , MeritPages from NYIT, the [personal website](https://www.shwethajayaraj.com/) itself, + + +--- +## Brief Description: + + +I am a computer  science master’s student and quantum coder that is passionate about creating applications that will have real world impacts in the quantum industry. A computer science by training in undergrad and in my master’s,  I am hoping to do  my research in quantum algorithms so that I may best understand ways in which to code that is best compatible with the reality of quantum mechanics. I am currently the curriculum developer and Quantum Education Fellow at global non-profit Qubit by Qubit which has served to educate over 50,000 children globally to learn quantum computing and to train for a diverse quantum workforce tomorrow. I started the interdisciplinary Quantum Computing Club at my  university at NYIT which had no quantum information  curriculum in 2019 and presented the outcomes of this at the Max Planck Institute DCURQ2020. For my master’s work, I outlined how classical computing  transitioners can learn quantum programming  through a simple roadmap that outlined tips, tricks, best practices, as well as sample code and the most current quantum software tools to assist of the time. In 2020, I was chosen as a top 5 out of all applicants for the NNSF Fellowship and interviewed with various national laboratories. I have participated in and won several hackathons and enjoy learning and creating new tools for people to use. I have machine learning experience having underwent the experience of creating  a climate technology wind prediction system in 2022 and having interned on the machine learning team in 2021 at a fantastic Materials science and Bio-chem science company called Schrodinger where I assisted in developing their protein prediction software. I have hosted the NASA Space Apps Hackathon in New York City in 2022 and hope to impact others in positive  ways as I grow in the  future. In my free time, I make things at my local makerspace Hack Manhattan & enjoy listening to others to exchange ideas.  + +- QED-C 2022 Participant & Attendee at Quantum World Congress +- Winner of Nasdaq Equalithon for Women in AI 2019 +- LaunchHouse Hackthon winner for creating wind prediction app Windtelligent.ai 2022 +- Y-Combinator interview 2022 +- Start-up  School  Summer2022  +- TechCrunch attendee 2022   to meet Q-CTRL , quantum error correction  +- Quantum.Tech 2022 attendee  +- President of Quantum Computing Club 2020-2022 +- Board of Directors at Hack Manhattan, 2021-2022 Secretary,  2022-2023 Director-at-Large +- Intern at Schrodinger, 2021  +- Academic Computing Lab, NYIT, 2019-2021 +- Society of Women Engineers, ACM, IEEE +- Aetna IT Analyst, 2018-2019 +- Corporate Trainer, 2018 +- T-Mobile, Mobile Expert - 2017-2018 +- Digital technician, Special Collections & Archives University of Connecticut , 2016-2017 +--- + + +# Coding Projects: +A list + description of all the repositories I've worked on in the past or just forked for future programming when I have time: + +### **Projects:  +- [https://github.com/shwetha729/careerconnect](https://github.com/shwetha729/careerconnect) - desktop  and mobile application project developed as a career fair connection applications for  users to log into  at conferences they attend in person for  software engineering & management course, programmed  in PHP, Javascript, SQL, and JustinMind mobile mockup software + +- [https://github.com/shwetha729/ErrselaPie](https://github.com/shwetha729/ErrselaPie) - python  file used to move NYIT’s ETIC center robot E.R.R.S.E.L.A.  For more  information, visit our robot :  [E.R.R.S.E.L.A. ETIC Research Robot for Student Engagement & Learning Activities](http://nyitetic.nyit.edu/errsela/) + +- [https://github.com/shwetha729/Python-Peon](https://github.com/shwetha729/Python-Peon) - a collection of python examples,  knowledge base, self-made tutorials, and references of commonly used code to  come back to,  could have put this on gists but this  was made before github gists was a thing.  + + - [https://github.com/shwetha729/Java-jester-](https://github.com/shwetha729/Java-jester-) same thing as above except  for Java  + +- [https://github.com/shwetha729/Storm-Station-App](https://github.com/shwetha729/Storm-Station-App) - an app that was designed to be programmed for the storm station project we worked  on in puerto rico for   climate disasters and resilience  + +- [https://github.com/shwetha729/Contract_Bridge-Card_Game](https://github.com/shwetha729/Contract_Bridge-Card_Game) - I wasn’t able to find a contract bridge card game online  after learning  more  about the  game during my time at Schrodinger  so I  wanted to try making the  game.  + +- [https://github.com/shwetha729/shwetha729.github.io](https://github.com/shwetha729/shwetha729.github.io) - personal website that was originally a template and I never updated  in a long time. I should probably get around to updating  this soon. Uses the jekyll layout and manager.  + +- [https://github.com/shwetha729/leetcode-pairing-chrome-extension](https://github.com/shwetha729/leetcode-pairing-chrome-extension) - In  order to better ace coding interviews and assessment but along with  other people  also trying them, I tried learning to see if i could  improve the leetcode  pair programming  extension. I even got assistance  from the original  developers  since they had  stopped  working on updates too. I should probably get  around to seeing if I could  improve this at any point too. A good way to learn about chrome extensions and programming them  + +- [https://github.com/shwetha729/Siena-and-Shwetha](https://github.com/shwetha729/Siena-and-Shwetha) - one of the first Java software engineering projects made at UCONN with Sienna, a catering & dining application with GUI for multiple orders + +- [https://github.com/shwetha729/fmi-pediatrics-oncology](https://github.com/shwetha729/fmi-pediatrics-oncology) - FAIR data hackathon project with OntoForce where we won runner-up in the competition with 23&me taking first place in 2017. + +- [https://github.com/shwetha729/RobotPathPlanning](https://github.com/shwetha729/RobotPathPlanning) - forked and implemented for work in Algorithms course at Uconn  to demonstrate Djikstra’s algorithm, here used for robot  path  planning + +- [https://github.com/shwetha729/BeYourHero](https://github.com/shwetha729/BeYourHero) - for starting out learning about VR,  this is a DIY immersive project where you can be your  own hero, icon, avatar outside of VRchat which  was the only  kind  of game to allow  you to  do this at the time.  + + +### **Quantum  projects:  +- [https://github.com/shwetha729/quantum-go-fish](https://github.com/shwetha729/quantum-go-fish) - a YQI hackathon project creating a quantum version  of the go  fish  game. Can read more about gameplay concept [here](https://stacky.net/wiki/index.php?title=Quantum_Go_Fish).  + + - The further repo ahead of commit  found here: [https://github.com/shwetha729/Feynmans-Fish](https://github.com/shwetha729/Feynmans-Fish) + +- [https://gitlab.com/shwetha729/lisp-in-quantum/-/blob/main/How_does_Lisp_work.md](https://gitlab.com/shwetha729/lisp-in-quantum/-/blob/main/How_does_Lisp_work.md) - a gitlab project outlining how quantum programming works in LISP -  a much more intuitive language  for  quantum computing paradigms.  + +- [https://github.com/shwetha729/quantum-sky-oracle](https://github.com/shwetha729/quantum-sky-oracle) - github for  final master’s thesis project, a platform for educational resources for  quantum-curious as well as roadmap methodology for general outline flow instead of just resources thrown at students. + +- [https://github.com/shwetha729/qrg-2022-](https://github.com/shwetha729/qrg-2022-) website for  the  NYIT Quantum Computing Club, formerly known as the  QRG (quantum research group),  now NYIT Quantum seems to be catching on.   + +- [https://github.com/shwetha729/DualUnitaryCircuits-](https://github.com/shwetha729/DualUnitaryCircuits-) constructing dual unitary quantum gate circuits in hilbert space, learn more about how quantum architecture works  this way when designing yourself** \ No newline at end of file diff --git a/README.md b/README.md deleted file mode 100644 index cfdc914..0000000 --- a/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# notes - -all of my obsidian notes :] \ No newline at end of file diff --git a/Terminal Tips/.DS_Store b/Terminal Tips/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Terminal Tips/.DS_Store differ diff --git a/Terminal Tips/About terminal.md b/Terminal Tips/About terminal.md new file mode 100644 index 0000000..c18b417 --- /dev/null +++ b/Terminal Tips/About terminal.md @@ -0,0 +1,34 @@ +# 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. + + +#### Some Useful Terminal Commands: + +These are pretty helpful commands I've found over the years. One example being copying the current working directory: + +``` +pwd | pbcopy +``` + +This copies contents of all files & subdirectories in a folder/directory to another folder. +``` +cp -r /path/to/source/directory /path/to/destination/directory/ +``` \ No newline at end of file diff --git a/Terminal Tips/CLI Tools/ASCII.md b/Terminal Tips/CLI Tools/ASCII.md new file mode 100644 index 0000000..0a4ffc2 --- /dev/null +++ b/Terminal Tips/CLI Tools/ASCII.md @@ -0,0 +1,23 @@ + +ASCII (American Standard Code for Information Interchange) is a standard encoding for electronic communication. But people use it for art purposes as well as that retro-internet vibe. Lots of fun things can still be done usingASCII and is also resource efficient! + + +### Art +---- +For ASCII Star Wars movie in full in your terminal run: +``` +Telnet towel.blinkenlights.nl - +``` + +### Packages +--- + +- **Figlet** is how to create large text encodings in your terminal, run: +``` +figlet -c "This is an example" +``` + +![[Pasted image 20230625163413.png]] + +- **Toilet** uses ASCII encodings to create text/images in the terminal as an extension of the older figlet package +![[Pasted image 20230625163218.png]] diff --git a/Terminal Tips/CLI Tools/CLI Tool Collection.md b/Terminal Tips/CLI Tools/CLI Tool Collection.md new file mode 100644 index 0000000..f555bd6 --- /dev/null +++ b/Terminal Tips/CLI Tools/CLI Tool Collection.md @@ -0,0 +1,21 @@ + +There are so many things to do through the command line in your terminal! Here are a list of packages or tools that I already have or want to later try out for me to come back to. + +##### Currently: +--- +- [VHS](obsidian://open?vault=Obsidian&file=Coding%20Tips%20(Classical)%2FComputers%2FComputer%20Realm%2FTerminal%20Tips%2FCLI%20Tools%2FVHS) - cute gifs generated while typing in terminal + - additionally there is also `asciinema rec` +- [Figlet](obsidian://open?vault=Obsidian&file=Coding%20Tips%20(Classical)%2FComputers%2FComputer%20Realm%2FTerminal%20Tips%2FCLI%20Tools%2FASCII) - create large text headers within terminal + - can be additionally used with `toilet` +- [Vim](obsidian://open?vault=Obsidian&file=Coding%20Tips%20(Classical)%2FComputers%2FComputer%20Realm%2FTerminal%20Tips%2FCLI%20Tools%2FVim%2FVim) - my default command-line editor of choice +- [Wikit](obsidian://open?vault=Obsidian&file=Coding%20Tips%20(Classical)%2FComputers%2FComputer%20Realm%2FTerminal%20Tips%2FCLI%20Tools%2Fpackage%20managers%2FFink) - wikipedia search anything within terminal +- +- + + + +#### Later: +--- +- [Typer](https://github.com/maaslalani/typer) - a typing test in your terminal + - ![[Pasted image 20230626195256.png]] +- [Bubble Tea](https://github.com/charmbracelet/bubbletea) - a powerful TUI framework \ No newline at end of file diff --git a/Terminal Tips/CLI Tools/Git.md b/Terminal Tips/CLI Tools/Git.md new file mode 100644 index 0000000..2652fe2 --- /dev/null +++ b/Terminal Tips/CLI Tools/Git.md @@ -0,0 +1,271 @@ +# Git + +Git is a way to upload your packages onto a version control system of your choice (as in either [Gitlab](obsidian://open?vault=Obsidian&file=Coding%20Tips%2FComputers%2FInternet%2FTools%2FGitlab), Github, or other version control site of your choice) + +Below are some key commands to know: +Here is a fantastic [set of instructions for beginners.](https://docs.gitlab.com/ee/gitlab-basics/start-using-git.html) + +--- + +### Useful CLI instructions: + +- List ALL the git commands you've used so far: +``` +history | grep git +``` + +- Find .git directories in the current working directory, you can use a `.` instead of a path. This will search in the current directory as well as all subdirectories: +``` +find . -type d -name '.git' +``` + +- Seeing revision history is pretty important. This is able to done through the git-log command. +``` +git log --pretty=format:"%h - %an, %ar : %s" +``` + +--- + + +#### Git global setup: + +git config --global user.name "Shwetha Jayaraj" +git config --global user.email "shwetha.jayaraj@uconn.edu" +Some components of a [bare git clone](https://git-scm.com/docs/gitrepository-layout). + +--- +## Basics Reference + +- Create a new repository: + +``` +git clone git@gitlab.com:shwetha729/coding-tips.git +cd coding-tips +git switch -c main +touch README.md +git add README.md +git commit -m "add README" +git push -u origin main + +``` + +- When you have an empty folder to add to git repo  +``` +Git init  +Git add .  +Git status  +Git commit -m ‘your message’ # commit to local repo +Git remote add origin ‘urlname’ # add url from repo  +Git push -u origin master # push local content to github +``` + + +#### Push an existing folder: +``` +cd existing_folder +git init --initial-branch=main +git remote add origin git@gitlab.com:shwetha729/coding-tips.git +git add . +git commit -m "Initial commit" +git push -u origin main +``` + +Example 2: pushing changes from commit into your branch +``` +git push [nameofyournewremote] [url] +``` + +Example 3: + +#### Push an existing Git repository: + +Example 1: +``` +cd existing_repo +git remote rename origin old-origin +git remote add origin git@gitlab.com:shwetha729/coding-tips.git +git push -u origin --all +git push -u origin --tags + +``` + +Example 2: +``` +Git remote add origin https://github.com/username/repo.git +Git push -u origin master +``` + +Example 3: Forking an existing repo +``` +# fork the original repo on top right corners +git clone [git url] +git remote -v # syncs forked repo +git remote add upstream [git clone url] +``` + + +Example 4: Push changes from your commit into your branch  +``` +git push [nameofyournewremote] [url] +``` + +--- + +#### Branch controls + +- Create a new branch on git: +``` +$ git branch +``` + +- View all branches: +``` +git branch -a +``` + +- Rename just-created branch: + +``` +git branch -m +``` +- Add a new remote for your branch: +``` +git remote add [name_of_your_remote] [name_of_your_new_branch] +``` + +- Delete a branch on your local filesystem: +``` +$ git branch -d [name_of_your_new_branch] + +# or to force deletion + +$ git branch -D [name_of_your_new_branch] +``` + +- Delete a branch on github: +``` +$ git push origin :[name_of_your_new_branch] +``` + +- Go to desired branch +``` +git checkout [branchname] +# OR +#git checkout -- +``` + +- go to remote branch +``` +git checkout remotes/name/master +``` + + +This often leads to the following warning message: +`Note: switching to 'remotes/name/main'. +`You are in 'detached HEAD' state. You can look around, make experimental changes and commit them, and you can discard any commits you make in this state without impacting any branches by switching back to a branch. If you want to create a new branch to retain commits you create, you may do so (now or later) by using -c with the switch command. + +Example: +```git switch -c ``` +Or undo this operation with: +`git switch - + +Turn off this advice by setting config variable advice.detachedHead to false + HEAD is now at 10b9410 does this do anything? + +--- + + + - List all remote branches + +``` +git remote +``` +#### Example: Pushing this obsidian onto gitlab +If you're reading this on said gitlab, well this might be a bit meta then: + +``` +# To permanently cache the credentials + +git config --global credential.helper osxkeychain + +# To ignore files that could cause issues across different workspaces + +touch .gitignore +echo ".obsidian/cache +.trash/ +.DS_Store" > .gitignore + +# Making out local ZettelKasten into a local Git Repository + +git init +git add . +git commit -m "init" + +# Pushing our local repository into our remote repository on GitHub + +git remote add origin https://github.com/USER/REPONAME.git +git push -u origin master +``` + +--- + + +#### SSH things: +- **CREATE new ssh key:** + +For example, for ED25519: +``` +ssh-keygen -t ed25519 -C "" +``` + +For 2048-bit RSA: + +``` +ssh-keygen -t rsa -b 2048 -C "" +``` + +and then +``` +Generating public/private ed25519 key pair. Enter file in which to save the key (/home/user/.ssh/id_ed25519): +``` +press enter twice. + +``` +Enter passphrase (empty for no passphrase): Enter same passphrase again: +``` +then enter passphrase. + +- **COPY public key to Gitlab account for example (MacOS):** + +``` +tr -d '\n' < ~/.ssh/id_ed25519.pub | pbcopy +``` +Replace `id_ed25519.pub` with your filename. For example, use `id_rsa.pub` for RSA. + +Then sign in > top right > Preferences > SSH Keys > paste contents into Key box > type description into Title box > Add Key . + +- **VERIFY that you can connect** : + +``` +ssh -T git@gitlab.com + +>>Welcome to GitLab, @shwetha729! +``` +For more info on SSH, check out [here](https://docs.gitlab.com/ee/user/ssh.html#generate-an-ssh-key-pair). + + + + + + +---- + +#### Additional sources: +- a [git command cheat sheet ](https://dev.to/anitaparmar26/git-command-cheat-sheet-31ec) +- Gitlab's [git cheat sheet](https://about.gitlab.com/images/press/git-cheat-sheet.pdf) +- [Git for Obsidian](https://medium.com/analytics-vidhya/how-i-put-my-mind-under-version-control-24caea37b8a5) article +- Customizing [your git config](https://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration) +- Improving your [git performance](https://www.git-tower.com/blog/git-performance/) +- Improve your [git workflow](https://about.gitlab.com/blog/2020/04/07/15-git-tips-improve-workflow/) + + diff --git a/Terminal Tips/CLI Tools/VHS.md b/Terminal Tips/CLI Tools/VHS.md new file mode 100644 index 0000000..5154d1d --- /dev/null +++ b/Terminal Tips/CLI Tools/VHS.md @@ -0,0 +1,51 @@ + +The cutest CLI Plugin ever!! Here is a[ link to the github.](https://github.com/charmbracelet/vhs#installation) :) + +![[Pasted image 20230626101300.png]] +### How to use: + + +Generate a .tape file +``` +vhs new demo.tape +``` + +Edit the .tape file: +``` +vim demo.tape +``` + +Once edited, feed it into VHS +``` +vhs demo.tape +``` + +Recording a .tape +``` +vhs record > cassette.tape +``` + +Perform any action and `exit` the terminal to stop recording. You may wish to edit the .tape file as well. +To generate the .gif +``` +vhs cassette.tape +``` + + +To start the VHS server +``` +vhs serve +``` + +ssh into the server +``` +ssh vhs.example.com < demo.tape > demo.gif +``` +If you do use the server often, it is useful to automate this with [vhs-actions](https://github.com/charmbracelet/vhs-action). + +For further commands: +``` +vhs manual +``` + + diff --git a/Terminal Tips/CLI Tools/Vim/.DS_Store b/Terminal Tips/CLI Tools/Vim/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Terminal Tips/CLI Tools/Vim/.DS_Store differ diff --git a/Terminal Tips/CLI Tools/Vim/Vim.md b/Terminal Tips/CLI Tools/Vim/Vim.md new file mode 100644 index 0000000..46f8e05 --- /dev/null +++ b/Terminal Tips/CLI Tools/Vim/Vim.md @@ -0,0 +1,28 @@ +# About Vim + +I was extremely surprised I didn't set up a note about my default and OG editor of choice, vim. It is what has helped long term become very fast at typing and in general for understanding the power of just using whatever editor you are most comfortable with at the end of the day. Vim is what I used when I was editing t things on a chromebook and it is still what I am using to this day. + +--- + +There are many purposes to vim, you can use it for: +- [typing up your math notes ](https://castel.dev/post/lecture-notes-1/)by incorporating vim with [LaTeX](obsidian://open?vault=Coding%20Tips&file=Quantum%20Realm%2FTools%2FLaTeX) +- this [website](https://www.vim.so/#exercise) seems the easiest way to learn vim hands-on if you need a refresher +- [here are more tutorials](https://www.tutorialspoint.com/vim/index.htm) for reference, don't go to the site above +- ooh you can even create actions through vim for functions called ["tags"](https://www.tutorialspoint.com/vim/vim_using_vim_as_ide.htm) +- Tricks and tips from and for vim users is posted on the [wiki](https://vim.fandom.com/wiki/Vim_Tips_Wiki) +- generate the config file for your vimrc for different languages no matter where you go [here](https://vim-bootstrap.com/#tagline) + +--- + +## Vim vs NeoVim? + +There's a long history and different strains of Vim on the internet. One of the more popular alternatives seems to be NeoVim + +![[Pasted image 20221208182151.png]] +If you're comfortable using Vim, there may be no need to switch. + + +--- +## Vim for different use-cases +In fact, there is even a vim key-binding settings option here in Obsidian. +- here is the docs for vim-go for the go language. diff --git a/Terminal Tips/CLI Tools/package managers/.DS_Store b/Terminal Tips/CLI Tools/package managers/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Terminal Tips/CLI Tools/package managers/.DS_Store differ diff --git a/Terminal Tips/CLI Tools/package managers/Fink.md b/Terminal Tips/CLI Tools/package managers/Fink.md new file mode 100644 index 0000000..60ba25e --- /dev/null +++ b/Terminal Tips/CLI Tools/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/Terminal Tips/CLI Tools/package managers/Opam.md b/Terminal Tips/CLI Tools/package managers/Opam.md new file mode 100644 index 0000000..1f95735 --- /dev/null +++ b/Terminal Tips/CLI Tools/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/Terminal Tips/CLI Tools/package managers/Poetry.md b/Terminal Tips/CLI Tools/package managers/Poetry.md new file mode 100644 index 0000000..0fc166b --- /dev/null +++ b/Terminal Tips/CLI Tools/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/Terminal Tips/CLI Tools/package managers/RPM.md b/Terminal Tips/CLI Tools/package managers/RPM.md new file mode 100644 index 0000000..a56a86a --- /dev/null +++ b/Terminal Tips/CLI Tools/package managers/RPM.md @@ -0,0 +1,15 @@ + +RPM Package Manager (RPM) (originally Red Hat Package Manager, now a recursive acronym) is a free and open-source package management system. + +The name RPM refers to the .rpm file format and the package manager program itself. RPM was intended primarily for Linux distributions; the file format is the baseline package format of the Linux Standard Base. + +Although it was created for use in Red Hat Linux, RPM is now used in many Linux distributions such as PCLinuxOS, Fedora, AlmaLinux, CentOS, openSUSE, OpenMandriva, Oracle Linux, and many more. + +An RPM package can contain an arbitrary set of files. +- Most RPM files are “binary RPMs” (or BRPMs) containing the compiled version of some software. +- There are also “source RPMs” (or SRPMs) containing the source code used to build a binary package. + + +## Uses +--- +- RPM is used often to run AlpaLinux for my [gitea](obsidian://open?vault=Obsidian&file=Coding%20Tips%2FComputers%2FInternet%2FHosting%2FServers%2FGitea) server on [Linode](obsidian://open?vault=Obsidian&file=Coding%20Tips%2FComputers%2FInternet%2FHosting%2FLinode) \ No newline at end of file diff --git a/Terminal Tips/Commands + Settings/.DS_Store b/Terminal Tips/Commands + Settings/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Terminal Tips/Commands + Settings/.DS_Store differ diff --git a/Terminal Tips/Commands + Settings/Aliases.md b/Terminal Tips/Commands + Settings/Aliases.md new file mode 100644 index 0000000..253de88 --- /dev/null +++ b/Terminal Tips/Commands + Settings/Aliases.md @@ -0,0 +1,13 @@ +# Aliases + +Aliases in your terminal make shortcuts a lot easier when you're typing, use them properly + +--- + +- Setting #1 : default text editor alias since my editor of choice is [BBEdit](obsidian://open?vault=Coding%20Tips&file=Computers%2FMac%20OS%20X%2FBBEdit%2FBBEdit): + +``alias bbedit "open -a bbedit"`` + +then in the terminal type + +``bbedit FILE_NAME`` \ No newline at end of file diff --git a/Terminal Tips/Commands + Settings/Command Shortcuts.md b/Terminal Tips/Commands + Settings/Command Shortcuts.md new file mode 100644 index 0000000..61ffecc --- /dev/null +++ b/Terminal Tips/Commands + Settings/Command Shortcuts.md @@ -0,0 +1,44 @@ +# What was the command again? + +For when you run into those inevitable "how do I command to do that again?" moments to your trusty terminal. Remember: +*Communication is key* + +find password of public wifi network ; +``` +security find-generic password -wa "James Coffee Co" | pbcopy +``` +--> returns the password then pbcopy, copies output + +change screenshot options: +``` +#changes screenshot type +defaults write com.apple.screencapture type jpg + +#changes screenshot location folder +defaults write com.apple.screencapture location ~/Desktop/screenshots +``` + +Show which processes using most CPU/memory +``` +top -o rsize +``` + + +Download things: +``` +curl urlname > filelocation +``` + +Use touch id instead of sudo password +``` +sudo nano /etc/pam.d/sudo +``` +and then +``` +auth sufficient pam_tid.so +``` + +--- + +- [Book of secrets](https://github.com/trimstray/the-book-of-secret-knowledge/blob/master/README.md#list-of-commands-you-use-most-often) + diff --git a/Terminal Tips/Commands + Settings/Extra customizations.md b/Terminal Tips/Commands + Settings/Extra customizations.md new file mode 100644 index 0000000..53789e8 --- /dev/null +++ b/Terminal Tips/Commands + Settings/Extra customizations.md @@ -0,0 +1,16 @@ +# Terminal Customizing + +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: + +--- + +- Wikit is a cool way to have a summary come up straight through the terminal from wikipedia + - Getting [wikit](https://www.tecmint.com/wikipedia-commandline-tool/) set up on the terminal + - this led to the installation of [fink](obsidian://open?vault=Coding%20Tips&file=Computers%2FMac%20OS%20X%2FTerminal%20Tips%2FShells%2Fpackage%20managers%2FFink) as it's only available via Linux commands +- _watch Star Wars in terminal_ : ```Telnet towel.blinkenlights.nl - +- `cmatrix` & `asciiquarium` after brew install + - toilet --> turn any text into ascii art +- check health of SSD on your laptop to make it [last longer ](https://www.macworld.com/article/334283/how-to-m1-intel-mac-ssd-health-terminal-smartmontools.html)through ```smartmontools``` + + + diff --git a/Terminal Tips/Commands + Settings/Languages/About Languages.md b/Terminal Tips/Commands + Settings/Languages/About Languages.md new file mode 100644 index 0000000..2cc13ef --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/About Languages.md @@ -0,0 +1,28 @@ + +There are speaking languages and then there are programming languages. This is what we use to communicate with computers. For the languages that don't have folders of their own, this will serve as an extra page. + +There are even [ esoteric languages](https://en.wikipedia.org/wiki/Esoteric_programming_language) like lolcode and brainf@ck just to be difficult and to prove that languages are just such an arbitrary construct. Don't take it all too seriously. Indeed, there is a whole [theory on programming language](https://en.wikipedia.org/wiki/Programming_language_theory). + +**Speed** is important. Especially when it comes to [CPU time](https://benchmarksgame-team.pages.debian.net/benchmarksgame/download/fastest.svg). + +--- + + +# 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). + +--- + +Rust is meant to a systems language aimed to replace C and C++. I have not really played around with it too much myself but the creator of Rust, Graydon Hoare, posts regularly and I think his [blog](https://graydon2.dreamwidth.org/253769.html) and writings are pretty neat. + + +##### Resources: +--- +I used CodeAcademy a lot back when it was free and accessible but alas that was like 10 years ago and is not the case anymore. Here are some great learning resources to get started with languages: +- [Exercism.org](https://exercism.org/) - a forever-free non-profit coding platform for over 60 popular programming languages +- [Code.org](https://code.org/learn) is a great resource for people of all ages to start programming + +Remember that the best way to learn is just by **doing**! :) \ No newline at end of file diff --git a/Terminal Tips/Commands + Settings/Languages/Fortran.md b/Terminal Tips/Commands + Settings/Languages/Fortran.md new file mode 100644 index 0000000..04c17e6 --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/Fortran.md @@ -0,0 +1,36 @@ +Fortran stands for **For**mula **Tran**slating System - a programming language developed in 1857 at IBM. + +program hello_world.f90 +``` +program first + implicit none + ! write 'Hello World!' to stdout + write(*,*)"Hello world!" +end program first +``` + +compile and run with: +``` +$ gfortran hello_world.f90 -o hello_world +$ ./hello_world +``` + +All code taked place between the program first and end program first statements, where first is the nmae given to the program. The `!` indicates a comment and the `write(*,*)` instructs the computer to write the statement Hello World to the screen, indicated by the first asterisk using free-format, the second asterisk. The implicit none if a very important statement as well. + + +``` +program temperature + implicit none +! declare variables + real :: DegC, DegF + + write(*,*)"Please type in temp in Celcius" + ! the read statement read input from + ! keyboard and stores it invariable DegC + + DegF = (9./5)*DegC + 32. + + ! the write statement accepts multiple + ! strings or variables, separated + ! by commons +``` \ No newline at end of file diff --git a/Terminal Tips/Commands + Settings/Languages/Go/Testing in Go.md b/Terminal Tips/Commands + Settings/Languages/Go/Testing in Go.md new file mode 100644 index 0000000..c0e8cc3 --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/Go/Testing in Go.md @@ -0,0 +1,64 @@ + +Testing seems really intuitive too. This example was given and it makes sense. + +``` + +package main + +import ( + "testing" +) + +// LastIndex returns the index of the last instance of x in list, or +// -1 if x is not present. The loop condition has a fault that +// causes some tests to fail. Change it to i >= 0 to see them pass. +func LastIndex(list []int, x int) int { + for i := len(list) - 1; i > 0; i-- { + if list[i] == x { + return i + } + } + return -1 +} + +func TestLastIndex(t *testing.T) { + tests := []struct { + list []int + x int + want int + }{ + {list: []int{1}, x: 1, want: 0}, + {list: []int{1, 1}, x: 1, want: 1}, + {list: []int{2, 1}, x: 2, want: 0}, + {list: []int{1, 2, 1, 1}, x: 2, want: 1}, + {list: []int{1, 1, 1, 2, 2, 1}, x: 3, want: -1}, + {list: []int{3, 1, 2, 2, 1, 1}, x: 3, want: 0}, + } + for _, tt := range tests { + if got := LastIndex(tt.list, tt.x); got != tt.want { + t.Errorf("LastIndex(%v, %v) = %v, want %v", tt.list, tt.x, got, tt.want) + } + } +} + + +``` + +And when ran, it comes out to this: +``` +=== RUN TestLastIndex + prog.go:34: LastIndex([1], 1) = -1, want 0 + prog.go:34: LastIndex([2 1], 2) = -1, want 0 + prog.go:34: LastIndex([3 1 2 2 1 1], 3) = -1, want 0 +--- FAIL: TestLastIndex (0.00s) +FAIL +Program exited. +``` + +whereas a passing test would say: +``` +=== RUN TestLastIndex +--- PASS: TestLastIndex (0.00s) +PASS +Program exited. +``` \ No newline at end of file diff --git a/Terminal Tips/Commands + Settings/Languages/Go/Welcome to Go.md b/Terminal Tips/Commands + Settings/Languages/Go/Welcome to Go.md new file mode 100644 index 0000000..359e96e --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/Go/Welcome to Go.md @@ -0,0 +1,48 @@ + +Why learn Go? Well, their entire [webpage](https://go.dev/solutions/#case-studies) that explained literally that exact question may have had something to do with it. And I saw a youtube video yesterday saying how it was better than Rust, the literal most "loved" language currently in terms of long-term performance. So both of those two things got me sold. + +They have a rather intuitive learning module called [The Go Playground ](https://go.dev/play/)which makes it actually desirable to learn even. + +``` +// You can edit this code! +// Click here and start typing. +package main + +import "fmt" + +func main() { + fmt.Println("Hello, 世界") +} + +``` + +And tons more examples to try and out and learn from such as [Conway's Game of Life](https://go.dev/play/) and more. + +This is how a fibonacci sequence could be implemented: + +``` + +package main + +import "fmt" + +// fib returns a function that returns +// successive Fibonacci numbers. +func fib() func() int { + a, b := 0, 1 + return func() int { + a, b = b, a+b + return a + } +} + +func main() { + f := fib() + // Function calls are evaluated left-to-right. + fmt.Println(f(), f(), f(), f(), f()) +} + +``` +With the output being: 1 1 2 3 5 + +When actually looking at it, it's kinda cool. It's not actually hard recursion like the way that it seemed like before with lisp. \ No newline at end of file diff --git a/Terminal Tips/Commands + Settings/Languages/HTML & CSS.md b/Terminal Tips/Commands + Settings/Languages/HTML & CSS.md new file mode 100644 index 0000000..a5f6afd --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/HTML & CSS.md @@ -0,0 +1,165 @@ +# HTML + +My very first language that I learned at 12 when I was on neopets.com. It stands for HyperText Markup Language and it's used to create websites! The website thing really takes off in the future so it's good that you got pretty good at it at some point. Now if only you could remember your neopets username and password... + +Funnily enough I keep going back to the time I w as 12 and learning this stuff because I learned a bunch in a relatively short amount of time and it was so much fun designing my pet pages and my profile. + +For instance designing a [Neoshop Blog](https://www.sunnyneo.com/tutorial/blogtutorial.php)! + +
+ + + + + +
+ +
+ +Stuff Goes Here. Leave the Credit in the blog text. + + +
+
Blog coding by SunnyNeo.com









+
+
+ + +``` +
+ + + + + +
+ +
+ +Stuff Goes Here. Leave the Credit in the blog text. + + +
+
Blog coding by SunnyNeo.com









+
+
+``` + + +--- +``` + + + + + + Shwetha's Website + + + + +``` + + +- `

` is used for headers +- `

` is used for paragraphs +- omg remember a href?? +``` + Check out my website! +``` +- and then of course, can't forget about img src +``` + +``` +- +``` + + + + + +

Shwetha's Website

+

Welcome! Check out my website!

+ + +
My top animes are:
+
    +
  1. Sailor Moon + here +
  2. +
  3. Naruto
  4. +
  5. Dragonball Z
  6. +
+ +
I've lived in:
+
    +
  • India
  • +
  • California
  • +
  • Connecticut
  • +
+ + + + +``` + +##### Tables +Creating tables in HTML are possible too if you remember back to your neopets website. Indeed, this is where a bulk of your reference information can live. A good tutorial on getting a refresher with HTML tables is over [here](https://developer.mozilla.org/en-US/docs/Learn/HTML/Tables/Structuring_planet_data). + +![[Pasted image 20230619211526.png]] +An example of an HTML table^. The tutorial for that [found here.](https://developer.mozilla.org/en-US/docs/Learn/HTML/Tables/Structuring_planet_data) + +A thing called [HTMX](https://htmx.org/examples/) releases updates quite frequently. + +![[Pasted image 20230620180623.png]] +Here is the sample HTML code for a website visitor [counter](https://www.websiteout.net/counter.php)! +``` + + +``` + + + + +--- + +#### What is PUG? + +There is a template engine used for Node.js called Pug, formerly known as JADE, that is being used much more frequently nowadays because it compiles down to HTML. This makes for much more readable, html formatted code. +![[Pasted image 20230607204133.png]] +- [Pug to HTML ](https://codebeautify.org/pug-to-html-converter#:~:text=This%20tool%20that%20converts%20the,to%20Hyper%20Text%20Markup%20language.) converter + +--- + + + +# 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 +- [Coding an iOS calculator](https://www.youtube.com/watch?v=MaV9VqFMzB4) using CSS, HTML, and javascript +- fantastic [guide](https://every-layout.dev/rudiments/boxes/) on CSS by every-layout.dev + - [sidebar](https://every-layout.dev/layouts/sidebar/) layouts & [search bar l](https://every-layout.dev/demos/sidebar-input-with-button/)ayouts! +- if you're not using codepen.io what are you even doing. +- More tricks to be found [CSS-Tricks](https://css-tricks.com/) as well +- [CSS cursor](https://xuethms.tumblr.com/css-cursors) reference +- I've kept loads more webtools and front end references on raindrop.io + +--- + +### Other notes: +There a lot of philosophies about a "website" such as the [IndieWeb](https://indieweb.org/) which I think is great. + +via IndieWeb: +### Beyond Blogging and Decentralization + +The IndieWeb effort is [different](https://indieweb.org/different "different") from previous efforts/communities: + +- **[Principles](https://indieweb.org/Principles "Principles")** over project-centrism. Others assume a [monoculture](https://indieweb.org/monoculture "monoculture") of one project for all. We are developing a [plurality of projects](https://indieweb.org/principles#Plurality "principles"). The IndieWeb community has a [code-of-conduct](https://indieweb.org/code-of-conduct "code-of-conduct"). +- **[Publish on your site](https://indieweb.org/use_what_you_make "use what you make")** instead of emailing a list. Show before tell. Prioritize by [making what you need](https://indieweb.org/make_what_you_need "make what you need"), [creating](https://indieweb.org/create "create"), iterating on your own site. +- **[Design](https://indieweb.org/Design "Design")** first, protocols & formats second. Focus on good UX & [using your own prototype features](https://indieweb.org/use_what_you_make "use what you make") to create minimum necessary [formats](https://indieweb.org/formats "formats") & [protocols](https://indieweb.org/protocols "protocols"). \ No newline at end of file diff --git a/Terminal Tips/Commands + Settings/Languages/Javascript/.DS_Store b/Terminal Tips/Commands + Settings/Languages/Javascript/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Terminal Tips/Commands + Settings/Languages/Javascript/.DS_Store differ diff --git a/Terminal Tips/Commands + Settings/Languages/Javascript/Code Conventions.md b/Terminal Tips/Commands + Settings/Languages/Javascript/Code Conventions.md new file mode 100644 index 0000000..1ec959a --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/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/Terminal Tips/Commands + Settings/Languages/Javascript/Example of Javascript plugin works.md b/Terminal Tips/Commands + Settings/Languages/Javascript/Example of Javascript plugin works.md new file mode 100644 index 0000000..9e9a3e2 --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/Javascript/Example of Javascript plugin works.md @@ -0,0 +1,74 @@ +Looks like this when fetched: +![[Pasted image 20221212171637.png]] +# Obsidian Extract PDF Annotations Plugin + +This is a plugin for [Obsidian](https://obsidian.md). It extracts Annotations from PDF Files. + +## Usage + +This Plugin visits all PDF files in a given directory and extracts comments and highlights from the PDF files. It treats the first line of every comment as *Topic* for grouping the comments. + +Assume we have in a folder in our Vault containing PDF files, e.g: + +![vault_folder](https://github.com/munach/obsidian-pdf-annotations/blob/master/img/vault_folder.jpg?raw=true) + +and we have highlighted the Julia Hello World Programm with a note 'Hello World': + +![pdf_note](https://github.com/munach/obsidian-pdf-annotations/blob/master/img/pdf_note.jpg?raw=true) + +In the editor (e.g. \_Extract) we run the plugin's command `Extract PDF Annotations` (Hotkey Ctrl-P for all Commands). This will fetch all annotations in the PDF files in the current folder and sort them by *Topic*: + +![extracted_annotations](https://github.com/munach/obsidian-pdf-annotations/blob/master/img/extracted_annotations.jpg?raw=true) + +As such, you can relate comments for your topics (here 'Hello World') from several PDF files. + +### Commands +* `Extract PDF Annotations` Works when editing a markdown note. Searches all PDF files in current Folder for annotations, and inserts them at the current position of the open note. +* `Extract PDF Annotations on single file` Works while displaying a PDF file. Extracts annotations from this file and writes them to the note `Annotations for ` + +### Plugin Settings: + +* Use the first line of the comment as 'Topic' (and sort accordingly), or not +* Use folder name or PDF-Filename for sorting + +## Versions + +1.0.4 clean up hyphenation https://github.com/munach/obsidian-extract-pdf-annotations/issues/5 +1.0.3 updated highlight fetching to use QuadPoints instead of Rectangles + +## Installation / Build + +Fetch repository: +```bash +$ git clone https://github.com/munach/obsidian-extract-pdf-annotations.git +$ cd obsidian-extract-pdf-annotations +``` +Install dependencies: +``` +$ npm i +``` + +Transpile `main.ts`: +``` +$ npm run build +``` + +Then create the plugin directory and copy the files `main.js` and `manifest.json`, e.g.; +``` +$ mkdir ~/MyVault/.obsidian/plugins/obsidian-extract-pdf-annotations +$ cp main.js manifest.json ~/MyVault/.obsidian/plugins/obsidian-extract-pdf-annotations/ +``` + +Enable the plugin in Obsidan's setting. + +## Issues / Bugs + +[] works only on left-to-right highlights + +## Credits + +This plugin builds on ideas from Alexis Rondeaus Plugin https://github.com/akaalias/obsidian-extract-pdf-highlights, but uses obsidians build-in pdf.js library. + +## Author + +Franz Achermann diff --git a/Terminal Tips/Commands + Settings/Languages/Javascript/JSLint.md b/Terminal Tips/Commands + Settings/Languages/Javascript/JSLint.md new file mode 100644 index 0000000..900c9fd --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/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/Terminal Tips/Commands + Settings/Languages/Javascript/QML.md b/Terminal Tips/Commands + Settings/Languages/Javascript/QML.md new file mode 100644 index 0000000..829dc0e --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/Javascript/QML.md @@ -0,0 +1,7 @@ + +https://qml.guide/getting-started-with-qml/ + +**QML**, or Qt Markup Language, is a declarative language used to simplify the development with its neatly organized grammatical structure. **QML** **is** used to build QtQuick, to assist in building complex user interfaces. It's an easy to learn Javascript-based declarative markup and allows the quick creation and deployment of GUIs. + +Follow the above link to learn how to deploy a QML based GUI. +It is built in [qt.io](https://doc.qt.io/qt-6/qtquick-deployment.html) \ No newline at end of file diff --git a/Terminal Tips/Commands + Settings/Languages/Javascript/Welcome to JavaScript.md b/Terminal Tips/Commands + Settings/Languages/Javascript/Welcome to JavaScript.md new file mode 100644 index 0000000..ab6f9ac --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/Javascript/Welcome to JavaScript.md @@ -0,0 +1,10 @@ +# 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) +- Okay, start running JS projects with [stackblitz WebContainers](https://blog.stackblitz.com/posts/introducing-webcontainers/) +- cool website menu code tutorial [here](https://www.youtube.com/watch?v=NUeCNvYY_x4) +- a [collection of algorithms & data structures](https://github.com/TheAlgorithms/JavaScript) implemented in JS +- Tons and tons of javascript resources found over on [JSFiddle](https://jsfiddle.net/jorenvanhee/rmaeak0q/0/) +- [Vite](https://vitejs.dev/) to quickly deploy the apps \ No newline at end of file diff --git a/Terminal Tips/Commands + Settings/Languages/LaTeX.md b/Terminal Tips/Commands + Settings/Languages/LaTeX.md new file mode 100644 index 0000000..b32c668 --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/LaTeX.md @@ -0,0 +1,74 @@ +# LaTeX + +LaTex is an extremely high quality document creator and type-setting software and programming language. 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) Or watch this [amazing youtube video]([https://youtu.be/DOtM1mrWjUo](https://youtu.be/DOtM1mrWjUo)) preparing math notes in LaTeX using vim and terminal! + +--- +## Some really great extra features +- it is possible to create/write books and publish them directly to github with BookDown + - the example is able to view [here](https://xiangyunhuang.github.io/ElegantBookdown/). + - the git repo is [here](https://github.com/ElegantLaTeX/ElegantBook/blob/6ab10beda81252f0b478e05fa926199301347e4a/elegantbook.cls#L884) + - for elegantPaper instead of Book, the repo is [here](https://github.com/ElegantLaTeX/ElegantPaper/releases) + - your ElegantBook latex project is [here](https://www.overleaf.com/project/63923bb753a90a7b78bb2f09) + - all the available "elegant" projects are [here](https://github.com/ElegantLaTeX/) + +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/Terminal Tips/Commands + Settings/Languages/Lisp.md b/Terminal Tips/Commands + Settings/Languages/Lisp.md new file mode 100644 index 0000000..f397d39 --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/Lisp.md @@ -0,0 +1,6 @@ + +The very first programming language I learned in college. +- [Racket ]( https://matt.might.net/articles/i-love-you-in-racket/ )From Matt Might's Blog +- [Scheme VM](obsidian://open?vault=Obsidian&file=Quantum%20Vault%2FMy%20Quantum%20Work%2F%3CPROGRAMMING%202023%3E) from Programming 2023 +- [Lisp in Quantum ](obsidian://open?vault=Obsidian&file=Quantum%20Vault%2FQuantum%20Realm%2FCode%20%26%20Circuit%20Operations%2FLanguages%2FLISP%2FLisp%20in%20Quantum) +- Creating a Github[ timeline using LISP & HTML](https://github.com/rajasegar/cl-github-timeline)! :) \ No newline at end of file diff --git a/Terminal Tips/Commands + Settings/Languages/Markdown.md b/Terminal Tips/Commands + Settings/Languages/Markdown.md new file mode 100644 index 0000000..ace397d --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/Markdown.md @@ -0,0 +1,6 @@ + +You will inevitably learn a bunch about markdown simply from using Obsidian which is all full of just markdown files. Any tips and tricks that you do learn though can all go here. Happy marking down. :) + +--- + +Code phrases: \ No newline at end of file diff --git a/Terminal Tips/Commands + Settings/Languages/Python/.DS_Store b/Terminal Tips/Commands + Settings/Languages/Python/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Terminal Tips/Commands + Settings/Languages/Python/.DS_Store differ diff --git a/Terminal Tips/Commands + Settings/Languages/Python/Projects/.DS_Store b/Terminal Tips/Commands + Settings/Languages/Python/Projects/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Terminal Tips/Commands + Settings/Languages/Python/Projects/.DS_Store differ diff --git a/Terminal Tips/Commands + Settings/Languages/Python/Projects/API Python.md b/Terminal Tips/Commands + Settings/Languages/Python/Projects/API Python.md new file mode 100644 index 0000000..fb4d3a4 --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/Python/Projects/API Python.md @@ -0,0 +1,10 @@ +# 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 +- Postman is a wonderful tool to use if needing to grab APIs diff --git a/Terminal Tips/Commands + Settings/Languages/Python/Projects/Creating a Tree generator in python.md b/Terminal Tips/Commands + Settings/Languages/Python/Projects/Creating a Tree generator in python.md new file mode 100644 index 0000000..a4a7d7d --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/Python/Projects/Creating a Tree generator in python.md @@ -0,0 +1,3 @@ +Eventually finish up the guide by idk, actually doing it? found from [this website ](https://realpython.com/directory-tree-generator-python/)from RealPython :) + +Best way to get better at coding is to code. Not just read about it. \ No newline at end of file diff --git a/Terminal Tips/Commands + Settings/Languages/Python/Projects/Machine Learning/.DS_Store b/Terminal Tips/Commands + Settings/Languages/Python/Projects/Machine Learning/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Terminal Tips/Commands + Settings/Languages/Python/Projects/Machine Learning/.DS_Store differ diff --git a/Terminal Tips/Commands + Settings/Languages/Python/Projects/Machine Learning/ML Management.md b/Terminal Tips/Commands + Settings/Languages/Python/Projects/Machine Learning/ML Management.md new file mode 100644 index 0000000..e16b609 --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/Python/Projects/Machine Learning/ML Management.md @@ -0,0 +1,29 @@ +# 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 +- [WEKA](obsidian://open?vault=Coding%20Tips&file=Computers%2FPython%2FProjects%2FMachine%20Learning%2FWEKA) is a good resource data mining processes and machine learning testing +- Collection of [wolfram](https://resources.wolframcloud.com/NeuralNetRepository/?source=nav) neural nets + + +--- + + +**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 +Using [fast.ai](https://www.fast.ai/posts/2020-02-13-fastai-A-Layered-API-for-Deep-Learning.html) + +- As a reference, text generation has been happening since 2005 with [SCIGen](https://pdos.csail.mit.edu/archive/scigen/#talks) for instance. \ No newline at end of file diff --git a/Terminal Tips/Commands + Settings/Languages/Python/Projects/Machine Learning/OpenAI.md b/Terminal Tips/Commands + Settings/Languages/Python/Projects/Machine Learning/OpenAI.md new file mode 100644 index 0000000..a8578d9 --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/Python/Projects/Machine Learning/OpenAI.md @@ -0,0 +1,15 @@ +OpenAI is a company that tries to ensure the use of fair artificial intelligence and machine learning. It is the analogue to one-quantum. They have several releases in the community, most importantly GPT-3, Dall-e, and ChatGPT. They also have a plethora of papers out as well. + +--- + +- [Python documentation](https://beta.openai.com/docs/libraries/python-bindings) for installing OpenAI features, there is also a [Go library](https://github.com/sashabaranov/go-gpt3) for openAI as well. Using [chronology](https://github.com/OthersideAI/chronology) may be a good idea as well. + +```bash +$ pip install openai +``` + + +- ChatGPT can be found [here](https://chat.openai.com/chat). It is apparently available as limited preview for research. +- Dall-e can be found [here](https://labs.openai.com/). 50 credits are available for free. + + diff --git a/Terminal Tips/Commands + Settings/Languages/Python/Projects/Machine Learning/WEKA.md b/Terminal Tips/Commands + Settings/Languages/Python/Projects/Machine Learning/WEKA.md new file mode 100644 index 0000000..651fa96 --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/Python/Projects/Machine Learning/WEKA.md @@ -0,0 +1,10 @@ + +Weka is a data mining and machine learning tool. Processes and helpful documentation tips will be noted on here. + +--- + + +[Here](https://towardsdatascience.com/getting-started-with-weka-3-machine-learning-on-gui-7c58ab684513) is a medium article about getting started: + +1. Preprocessing: +- For binning you must use the [discretization](https://www.cs.waikato.ac.nz/ml/weka/mooc/moredataminingwithweka/slides/Class2-MoreDataMiningWithWeka-2014.pdf) filter which you can learn about [here](https://machinelearningmastery.com/transform-machine-learning-data-weka/) and [here](https://waikato.github.io/weka-wiki/discretizing_datasets/) \ No newline at end of file diff --git a/Terminal Tips/Commands + Settings/Languages/Python/Projects/Testing/.DS_Store b/Terminal Tips/Commands + Settings/Languages/Python/Projects/Testing/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Terminal Tips/Commands + Settings/Languages/Python/Projects/Testing/.DS_Store differ diff --git a/Terminal Tips/Commands + Settings/Languages/Python/Projects/Testing/Testing in python.md b/Terminal Tips/Commands + Settings/Languages/Python/Projects/Testing/Testing in python.md new file mode 100644 index 0000000..592eb65 --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/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/Terminal Tips/Commands + Settings/Languages/Python/Welcome to Python.md b/Terminal Tips/Commands + Settings/Languages/Python/Welcome to Python.md new file mode 100644 index 0000000..d8a3149 --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/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](obsidian://open?vault=Obsidian&file=Coding%20Tips%2FComputers%2FPython%2Ftools%2FIDEs%2FVSCode) + - [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 + - ultimately though it's how well you use your [tools](obsidian://open?vault=Coding%20Tips&file=Python%2Ftools%2FAbout%20Tool) when it comes to 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/Terminal Tips/Commands + Settings/Languages/Python/code/.DS_Store b/Terminal Tips/Commands + Settings/Languages/Python/code/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Terminal Tips/Commands + Settings/Languages/Python/code/.DS_Store differ diff --git a/Terminal Tips/Commands + Settings/Languages/Python/code/About codes.md b/Terminal Tips/Commands + Settings/Languages/Python/code/About codes.md new file mode 100644 index 0000000..b91d34c --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/Python/code/About codes.md @@ -0,0 +1,17 @@ +## 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. + +starts a local web server through python3 +``` +python3 -m http.server +``` +When people on your network go to your ipaddress & port 8000 they can see what you have, which is good for file transfer. +- [[convert a .ipynb to .py]] + - Similarly you can do the same convert but in [bulk](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=Computers%2FPython%2Fcodes%2FMore%20data%20types%2Flambda) function and other functions will also save time \ No newline at end of file diff --git a/Terminal Tips/Commands + Settings/Languages/Python/code/Classes.md b/Terminal Tips/Commands + Settings/Languages/Python/code/Classes.md new file mode 100644 index 0000000..e470a5b --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/Python/code/Classes.md @@ -0,0 +1,13 @@ + +Using classes to navigate between files in python is a common thing you will be doing. Hence, knowing when to create python classes is important as well as knowing how to use the methods created in the classes file. + +--- +For example: + +``` +import Car +``` + +if you have a `car.py` class file and you are trying to bring that into another `action.py` file. + +Learn more about imports in python [here](https://www.codementor.io/@sheena/python-path-virtualenv-import-for-beginners-du107r3o1). \ No newline at end of file diff --git a/Terminal Tips/Commands + Settings/Languages/Python/code/Lists/.DS_Store b/Terminal Tips/Commands + Settings/Languages/Python/code/Lists/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Terminal Tips/Commands + Settings/Languages/Python/code/Lists/.DS_Store differ diff --git a/Terminal Tips/Commands + Settings/Languages/Python/code/Lists/Enumerate().md b/Terminal Tips/Commands + Settings/Languages/Python/code/Lists/Enumerate().md new file mode 100644 index 0000000..84bddbe --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/Python/code/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/Terminal Tips/Commands + Settings/Languages/Python/code/Lists/Itertools Next() in list.md b/Terminal Tips/Commands + Settings/Languages/Python/code/Lists/Itertools Next() in list.md new file mode 100644 index 0000000..a7bbd5b --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/Python/code/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/Terminal Tips/Commands + Settings/Languages/Python/code/Lists/List len().md b/Terminal Tips/Commands + Settings/Languages/Python/code/Lists/List len().md new file mode 100644 index 0000000..5c510c3 --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/Python/code/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/Terminal Tips/Commands + Settings/Languages/Python/code/Lists/Lists.md b/Terminal Tips/Commands + Settings/Languages/Python/code/Lists/Lists.md new file mode 100644 index 0000000..cdeb415 --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/Python/code/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/Terminal Tips/Commands + Settings/Languages/Python/code/Lists/list comprehension example.md b/Terminal Tips/Commands + Settings/Languages/Python/code/Lists/list comprehension example.md new file mode 100644 index 0000000..0a5af2b --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/Python/code/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/Terminal Tips/Commands + Settings/Languages/Python/code/More data types/.DS_Store b/Terminal Tips/Commands + Settings/Languages/Python/code/More data types/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Terminal Tips/Commands + Settings/Languages/Python/code/More data types/.DS_Store differ diff --git a/Terminal Tips/Commands + Settings/Languages/Python/code/More data types/Explicitly Defining datatype in python function.md b/Terminal Tips/Commands + Settings/Languages/Python/code/More data types/Explicitly Defining datatype in python function.md new file mode 100644 index 0000000..620d9a3 --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/Python/code/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/Terminal Tips/Commands + Settings/Languages/Python/code/More data types/Trees in python.md b/Terminal Tips/Commands + Settings/Languages/Python/code/More data types/Trees in python.md new file mode 100644 index 0000000..d22bef5 --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/Python/code/More data types/Trees in python.md @@ -0,0 +1,50 @@ +# 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: + +```python +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/Terminal Tips/Commands + Settings/Languages/Python/code/More data types/lambda.md b/Terminal Tips/Commands + Settings/Languages/Python/code/More data types/lambda.md new file mode 100644 index 0000000..6adb0da --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/Python/code/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/Terminal Tips/Commands + Settings/Languages/Python/code/String Manipulation.md b/Terminal Tips/Commands + Settings/Languages/Python/code/String Manipulation.md new file mode 100644 index 0000000..83fa9d2 --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/Python/code/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/Terminal Tips/Commands + Settings/Languages/Python/code/arrays/.DS_Store b/Terminal Tips/Commands + Settings/Languages/Python/code/arrays/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Terminal Tips/Commands + Settings/Languages/Python/code/arrays/.DS_Store differ diff --git a/Terminal Tips/Commands + Settings/Languages/Python/code/arrays/About arrays.md b/Terminal Tips/Commands + Settings/Languages/Python/code/arrays/About arrays.md new file mode 100644 index 0000000..0039d59 --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/Python/code/arrays/About arrays.md @@ -0,0 +1,61 @@ +# 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. + +--- +``` +#finding max of an array + +``` +#### 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/Terminal Tips/Commands + Settings/Languages/Python/code/arrays/Initialize array of fixed length.md b/Terminal Tips/Commands + Settings/Languages/Python/code/arrays/Initialize array of fixed length.md new file mode 100644 index 0000000..ed7e367 --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/Python/code/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/Terminal Tips/Commands + Settings/Languages/Python/tools/.DS_Store b/Terminal Tips/Commands + Settings/Languages/Python/tools/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Terminal Tips/Commands + Settings/Languages/Python/tools/.DS_Store differ diff --git a/Terminal Tips/Commands + Settings/Languages/Python/tools/About Tool.md b/Terminal Tips/Commands + Settings/Languages/Python/tools/About Tool.md new file mode 100644 index 0000000..cf8c8cf --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/Python/tools/About Tool.md @@ -0,0 +1,16 @@ +# 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 +- BE LAZY, don't type the same over and over again - code generate instead with cookiecutter. +- 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/Terminal Tips/Commands + Settings/Languages/Python/tools/Environments/.DS_Store b/Terminal Tips/Commands + Settings/Languages/Python/tools/Environments/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Terminal Tips/Commands + Settings/Languages/Python/tools/Environments/.DS_Store differ diff --git a/Terminal Tips/Commands + Settings/Languages/Python/tools/Environments/Formatting/.DS_Store b/Terminal Tips/Commands + Settings/Languages/Python/tools/Environments/Formatting/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Terminal Tips/Commands + Settings/Languages/Python/tools/Environments/Formatting/.DS_Store differ diff --git a/Terminal Tips/Commands + Settings/Languages/Python/tools/Environments/Formatting/Cookiecutter.md b/Terminal Tips/Commands + Settings/Languages/Python/tools/Environments/Formatting/Cookiecutter.md new file mode 100644 index 0000000..96a55af --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/Python/tools/Environments/Formatting/Cookiecutter.md @@ -0,0 +1,180 @@ +Much of this is derived from [Tjelvar Olsson](https://www.tjelvarolsson.com/blog/using-cookiecutter-a-passive-code-generator/) blog of the importance of passive code generation in developing a template for python packaging. It should be used in all of your coding projects from the start. + +This will save so much time and energy as often the hardest thing in beginning to program is the standardized outline in which to begin from - especially as projects and codebases grow. + +--- +In [The Pragmatic Programmer](https://pragprog.com/book/tpp/the-pragmatic-programmer) Andrew Hunt and David Thomas talk about the importance of code generators when faced with the task of producing the same thing over and over. They further separate code generators into two types: passive and active. + +A passive code generator being one that saves on typing. It is run once, the result is placed into version control and then the code is built upon by hand. + +Whereas an active code generator is used to produce complete code by converting a source of meta-data into language(s) of interest. Active code generators are run frequently and as the resulting code is reproducible it is also disposable, hence it does not need to be tracked in version control. + +In this post I will show you how you can use a passive code generator to create a basic layout for a Python package. + +## Cookiecutter: a passive code generator + +A classic example where passive code generators are useful is in setting up an initial project structure. Let us take the example of creating a Python package, in the simplest case you will want to create a `setup.py` file and a directory with the desired package name containing an `__init__.py` file. Scott Torborg has created a great tutorial on [How To Package Your Python Code](http://www.scotttorborg.com/python-packaging/). + +Several tools exist to deal with this type of scenario. However, I quite like Audrey Roy’s [Cookiecutter](https://github.com/audreyr/cookiecutter). Let us illustrate it’s use by creating a minimal template for a Python package. + +Firs of all we install it using `pip`. + +``` +$ sudo pip install cookiecutter +``` + +Now we will create a funny looking directory structure. It is funny looking because it uses the [Jinja2](http://jinja.pocoo.org/) templating syntax. + +``` +$ mkdir -p mypyproject/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}} +``` + +Now create the file `myproject/cookiecutter.json` and add the code below to it. + +``` +{ + "repo_name": "mypackage", + "version": "0.0.1", + "author": "Your Name" +} +``` + +Let us have a look at the directory structure we have created. + +``` +$ tree mypyproject/ +mypyproject/ +├── cookiecutter.json +└── {{cookiecutter.repo_name}} + └── {{cookiecutter.repo_name}} + +2 directories, 1 file +``` + +We now have enough boilerplate to run cookiecutter. Actually we have more than enough, at this point we do not need the `version` and `author` variables. + +Let us create an “awesome” Python package to see it in action. + +``` +$ cookiecutter mypyproject/ +repo_name (default is "mypackage")? awesome +version (default is "0.0.1")? +author (default is "Your Name")? Tjelvar Olsson +``` + +Note that the prompts and default values are the key/value pairs specified in the `cookiecutter.json` file. + +Let us have a look at what was produced. + +``` +$ tree awesome/ +awesome/ +└── awesome + +1 directory, 0 files +``` + +Ok, great - let us add an `__init__.py` file to the leaf `myproject/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}` directory. + +``` +$ touch mypyproject/\{\{cookiecutter.repo_name\}\}/\{\{cookiecutter.repo_name\}\}/__init__.py +``` + +In the above we need to esacape the `{` and `}` characters when using bash. If you are not already using tab completion when using bash this may be a good point to try it out (just start typing the name of the file/directory of interest and then press the tab key). + +Let’s run `cookiecutter` again to see what we get now that we have added the `__init__.py` file. + +``` +$ cookiecutter mypyproject/ +repo_name (default is "mypackage")? awesome +version (default is "0.0.1")? +author (default is "Your Name")? Tjelvar Olsson +``` + +``` +$ tree awesome/ +awesome/ +└── awesome + └── __init__.py + +1 directory, 1 file +``` + +Great we now automatically get an `__init__.py` file added to our project when we create it. Now let us add a basic, but all the same templated, `setup.py` file to our project layout. Create the file `mypyproject/{{cookiecutter.repo_name}}/setup.py` and copy and paste the code below into it. + +``` +from setuptools import setup + +setup(name="{{ cookiecutter.repo_name }}", + version="{{ cookiecutter.version }}", + author="{{ cookiecutter.author }}" +) +``` + +Let us try this out. + +``` +$ cookiecutter mypyproject/ +repo_name (default is "mypackage")? awesome +version (default is "0.0.1")? +author (default is "Your Name")? Tjelvar Olsson +``` + +``` +$ tree awesome/ +awesome/ +├── awesome +│   └── __init__.py +└── setup.py + +1 directory, 2 files +``` + +``` +$ cat awesome/setup.py +from setuptools import setup + +setup(name="awesome", + version="0.0.1", + author="Tjelvar Olsson" +) +``` + +Great we now have a basic layout for building up a Python project! + +Now that you know the principles you can use them to automate the generation of your boilerplate code. + +## Making use of GitHub + +Once you start building up your template make sure that you save it on GitHub or BitBucket. _You are already using version control, right?_ + +A nice feature of Cookiecutter is that it has built in functionality for making use of templates stored in GitHub/Bitbucket. For example to make use of my default Python package layout, which includes: + +- setup.py +- test suite layout using nose and coverage +- sphinx docs layout using read the docs theme + +You can simply use the command below. + +``` +$ cookiecutter gh:tjelvar-olsson/cookiecutter-pypackage +Cloning into 'cookiecutter-pypackage'... +remote: Counting objects: 48, done. +remote: Compressing objects: 100% (37/37), done. +remote: Total 48 (delta 13), reused 37 (delta 8), pack-reused 0 +Unpacking objects: 100% (48/48), done. +Checking connectivity... done. +repo_name (default is "mypackage")? awesome +version (default is "0.0.1")? +authors (default is "Tjelvar Olsson")? +``` + +Alternatively, for an even more extensive setup have a look at [Audrey Roy’s ultimate python package template](https://github.com/audreyr/cookiecutter-pypackage). + +## Summary + +When you find yourself repeatedly doing the same thing it may be time to start thinking about using a code generator. In this post I have shown you how to use `cookiecutter` to produce a basic Python package template. + +However, it is not limited to Python package projects. You could use it to automate the setup of CMake / HTML / LaTeX files; the world is your oyster. + +Happy code generating! \ No newline at end of file diff --git a/Terminal Tips/Commands + Settings/Languages/Python/tools/Environments/Formatting/Formatting in python.md b/Terminal Tips/Commands + Settings/Languages/Python/tools/Environments/Formatting/Formatting in python.md new file mode 100644 index 0000000..88a1794 --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/Python/tools/Environments/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/Terminal Tips/Commands + Settings/Languages/Python/tools/Environments/Frameworks/.DS_Store b/Terminal Tips/Commands + Settings/Languages/Python/tools/Environments/Frameworks/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Terminal Tips/Commands + Settings/Languages/Python/tools/Environments/Frameworks/.DS_Store differ diff --git a/Terminal Tips/Commands + Settings/Languages/Python/tools/Environments/Frameworks/About Frameworks.md b/Terminal Tips/Commands + Settings/Languages/Python/tools/Environments/Frameworks/About Frameworks.md new file mode 100644 index 0000000..e247e35 --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/Python/tools/Environments/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/Terminal Tips/Commands + Settings/Languages/Python/tools/Environments/Intro to Python Environments.md b/Terminal Tips/Commands + Settings/Languages/Python/tools/Environments/Intro to Python Environments.md new file mode 100644 index 0000000..a6c5014 --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/Python/tools/Environments/Intro to Python Environments.md @@ -0,0 +1,110 @@ +Ultimately environments are just folder structures. But as with everything, programmers can make them seem real complicated. The power of the imagination! + +``` +>> which python +``` +Gives you the current environment for python for that folder. + +As listed in this [best practices](https://towardsdatascience.com/best-practices-for-setting-up-a-python-environment-d4af439846a) article, the way to do things now with python environments is to `pyenv` --> `pipX` --> `Poetry` + +## 1. PyEnv + +- list all available python versions: +``` +# List all available python versions +>pyenv install -l +:: [Info] :: Mirror: [https://www.python.org/ftp/python](https://www.python.org/ftp/python) +2.4-win32 +2.4.1-win32 +2.4.2-win32 +… +3.9.0a3 +3.9.0a4-win32 +3.9.0a4# Install a specific python version +>pyenv install 3.9.0a4# Rehash your new installables. Needed to update pyenv shims. +>pyenv rehash +``` + +- Global vs Local python versions + - check your global python version: +``` +# Set global python version +>pyenv global 3.9.0a4# Check global python version +>pyenv global +3.9.0a4 +``` + +- set your local python version within a specific project folder: +``` +# Install other verion of python +>pyenv install 3.8.2# Change directory to your project +>cd DreamProject# Set local python version inside your project +DreamProject>pyenv local 3.8.2# Check your local python version +DreamProject>pyenv local +3.8.2 +``` +- + +## PipX +The global python package installer. Keep this dry and don't overcrowd, as you can always do that within your python virtual environments itself. +For example, to install `black` formatter: +``` +# Verify global python version is active +>pyenv global +3.9.0a4# Install pipx +>pip install pipx# Make sure pipx is added to the path +>pipx ensurepath# Install black globally +>pipx install black# Check if install is successful +>black --version +black, version 20.8b1 +``` + +## 3. Poetry +The must-have to resolve dependency issues. Come back to update this later because you have to be finishing up your paper now. + +- initiation Poetry: +``` +# Create a directory and setup python version +DreamProject>pyenv local 3.8.2# Initiate poetry. This will ask meta info related to the project. DreamProject>poetry init +This command will guide you through creating your pyproject.toml config.Package name [DreamProject]: +Version [0.1.0]: +Description []: +Author [aspiring_dev <[aspiring_dev@gmail.com](mailto:mak.adi55@gmail.com)>, n to skip]: +License []: +Compatible Python versions [^3.8]: +``` +more about Poetry found here + +--- + +## **Some useful references:** +- as a forever reference, here is a reference on [all python environments](https://realpython.com/python-virtual-environments-a-primer/) via Real Python +- how to set up a python environment in [VSCode](https://code.visualstudio.com/docs/python/environments?source=post_page...) +- This is a useful [shortcut](https://iambonface.medium.com/how-to-declutter-your-python-3-virtual-environments-from-possible-version-conflicts-d9eed4998775) on how to declutter your python virtual environments. + +--- + +## Last word, the basics: +#### For virtual environments: +Python files tend to get pretty dang big nowadays, especially with all of these data science and machine learning projects. So the solution from the Python team was to create a python virtual environment. What's more, there's often[ library issues ](https://www.tjelvarolsson.com/blog/begginers-guide-creating-clean-python-development-environments/)if you don't have the right python imports set up so it eventually becomes necessary to create one. To be honest the **virtual** environment has been a system since the conception of the computer, but python gives them different names here, namely: +- [venv](obsidian://open?vault=Obsidian&file=Coding%20Tips%2FComputers%2FPython%2Ftools%2FEnvironments%2FVenv%2FVenv) +- [virtualenv](obsidian://open?vault=Obsidian&file=Coding%20Tips%2FComputers%2FLanguages%2FPython%2Ftools%2FEnvironments%2FVenv%2FVirtualenv) + - a really easy to set up [tutorial](https://iambonface.medium.com/how-to-declutter-your-python-3-virtual-environments-from-possible-version-conflicts-d9eed4998775) on virtualenv and virtualenvwrapper! +- [conda](obsidian://open?vault=Coding%20Tips&file=Computers%2FPython%2Ftools%2FEnvironments%2FConda) + +--- + +##### [Treat Them as Disposables](https://realpython.com/python-virtual-environments-a-primer/#treat-them-as-disposables "Permanent link") + +Virtual environments are disposable folder structures that you should be able to safely delete and re-create at any time without losing information about your code project. + +This means that you generally don’t put any additional code or information into your virtual environment manually. Anything that goes in there should be handled by your package manager, which will usually be `pip` or `conda`. + +You also shouldn’t commit your virtual environment to [version control](https://realpython.com/python-git-github-intro/#version-control), and you shouldn’t ship it with your project. + +Because virtual environments aren’t entirely self-sufficient Python installations but rely on the base Python’s standard library, you won’t create a portable application by distributing your virtual environment together with your code. + +--- + + + diff --git a/Terminal Tips/Commands + Settings/Languages/Python/tools/Environments/Venv/.DS_Store b/Terminal Tips/Commands + Settings/Languages/Python/tools/Environments/Venv/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Terminal Tips/Commands + Settings/Languages/Python/tools/Environments/Venv/.DS_Store differ diff --git a/Terminal Tips/Commands + Settings/Languages/Python/tools/Environments/Venv/Venv.md b/Terminal Tips/Commands + Settings/Languages/Python/tools/Environments/Venv/Venv.md new file mode 100644 index 0000000..125408a --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/Python/tools/Environments/Venv/Venv.md @@ -0,0 +1,30 @@ +Apparently venv is the way that Python suggests ([Python’s `venv` module](https://docs.python.org/3/library/venv.html) ) to create virtual environments. This module is part of Python’s standard library, and it’s the officially recommended way to create virtual environments since Python 3.5. + +**Note:** There are other great third-party tools for creating virtual environments, such as [conda](https://realpython.com/python-virtual-environments-a-primer/#the-conda-package-and-environment-manager) and [virtualenv](https://realpython.com/python-virtual-environments-a-primer/#the-virtualenv-project). Any of these tools can help you set up a Python virtual environment. + +For basic usage, `venv` is an excellent choice because it already comes packaged with your Python installation. With that in mind, you’re ready to create your first virtual environment. + +--- +# Create a virtual environment +To make a new virtual environment with `venv` simply: + +1. head to your project folder or make one +``` +mkdir project_folder # this makes a project folder +cd project_folder # head to your project folder +``` + +2. create a new venv environment +``` +python -m venv env_name +``` + +3. activate the environment +``` +source env_name/bin/activate +``` + +4. deactivate when done +``` +deactivate +``` \ No newline at end of file diff --git a/Terminal Tips/Commands + Settings/Languages/Python/tools/Environments/Venv/Virtualenv.md b/Terminal Tips/Commands + Settings/Languages/Python/tools/Environments/Venv/Virtualenv.md new file mode 100644 index 0000000..dc34b0b --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/Python/tools/Environments/Venv/Virtualenv.md @@ -0,0 +1,26 @@ +### The Virtualenv [Project](https://realpython.com/python-virtual-environments-a-primer/#the-virtualenv-project "Permanent link") + + +[Virtualenv](https://virtualenv.pypa.io/en/latest/) is a tool that was specifically made for creating isolated Python environments. It’s been a long-time favorite within the Python community and precedes the built-in `venv` module. + +Official docs found [here](https://virtualenv.pypa.io/en/latest/installation.html). +List all virtual environments installed on your system: + +``` +lsvirtualenv +``` + +By default, virtualenv creates environments in the `$HOME/.virtualenvs` directory on Linux and macOS, or in the `%USERPROFILE%\Envs` directory on Windows. You can use the `ls` command to list the contents of this directory and see the names of all the virtualenv environments installed on your system. + +--- + +The package is a superset of `venv`, which allows you to do everything that you can do using `venv`, and more. Virtualenv allows you to: + +- Create virtual environments more quickly +- [Discover](https://virtualenv.pypa.io/en/latest/user_guide.html#python-discovery) installed versions of Python without needing to provide the absolute path +- Upgrade the tool using `pip` +- Extend the functionality of the tool yourself + +Any of these additional functionalities can come in handy when you’re working on your Python projects. You might even want to save a blueprint of your virtualenv in code together with your project to aid reproducibility. Virtualenv has a rich [programmatic API](https://virtualenv.pypa.io/en/latest/user_guide.html#programmatic-api) that allows you to describe virtual environments without creating them. + +After [installing `virtualenv`](https://virtualenv.pypa.io/en/latest/installation.html) on your system, you can create and activate a new virtual environment similarly to how you do it using `venv`: \ No newline at end of file diff --git a/Terminal Tips/Commands + Settings/Languages/Python/tools/Environments/conda/.DS_Store b/Terminal Tips/Commands + Settings/Languages/Python/tools/Environments/conda/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Terminal Tips/Commands + Settings/Languages/Python/tools/Environments/conda/.DS_Store differ diff --git a/Terminal Tips/Commands + Settings/Languages/Python/tools/Environments/conda/Anaconda.md b/Terminal Tips/Commands + Settings/Languages/Python/tools/Environments/conda/Anaconda.md new file mode 100644 index 0000000..90fddf5 --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/Python/tools/Environments/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/Terminal Tips/Commands + Settings/Languages/Python/tools/Environments/conda/Conda.md b/Terminal Tips/Commands + Settings/Languages/Python/tools/Environments/conda/Conda.md new file mode 100644 index 0000000..b54cdb6 --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/Python/tools/Environments/conda/Conda.md @@ -0,0 +1,51 @@ +So basically conda has a lot of stuff... +It is the virtual environment of choice used by machine learning and data science people and it can even be compatible with other languages such as R, Julia, and many more. So it has a lot of packages that it comes built in with like a whole UI called Ananconda which is all pretty nifty. + +###### About Conda +This is what my "conda" looks like when I open the full anaconda: +![[Pasted image 20221117183151.png]] +So much stuff! So it is of no curiosity to see why those that want to get computations done choose Anaconda as it is a full system that compiles programs in an easy to read manner. + +A bit of a pitfall is the whole anaconda app may take up a significant portion of space on your laptop, which for my Macbook Air, I am also always wary of in order to get as much as I can in a simple way through it. + +--- + +Regardless, I've needed to use it multiple times now so I'll add helpful tips here: + + + +## Helpful tips! +- Conda is its own project that’s unrelated to `pip`. You can set it up on your system using the [Miniconda installer](https://docs.conda.io/en/latest/miniconda.html), which brings along the minimal requirements for running `conda` on your system. +- how to [create](https://docs.conda.io/projects/conda/en/latest/commands/create.html) environments after installation +- the official docs on maintaining a conda environment is found here + +Create a conda environment +``` +conda create -n +``` + + +Via `conda create` there's a bunch of options actually too: +~~~ +usage: conda create [-h] [--clone ENV] (-n ENVIRONMENT | -p PATH) [-c CHANNEL] + [--use-local] [--override-channels] + [--repodata-fn REPODATA_FNS] [--strict-channel-priority] + [--no-channel-priority] [--no-deps | --only-deps] + [--no-pin] [--copy] [-C] [-k] [--offline] [-d] [--json] + [-q] [-v] [-y] [--download-only] [--show-channel-urls] + [--file FILE] [--no-default-packages] + [--solver {classic} | --experimental-solver {classic}] + [--dev] + [package_spec [package_spec ...]] +~~~ + +Create an environment (env2) as a clone of an existing environment (env1): +~~~ + +conda create -n env2 --clone path/to/file/env1 +~~~ + +Create an environment containing the package 'sqlite': +~~~ +conda create -n myenv sqlite +~~~ \ No newline at end of file diff --git a/Terminal Tips/Commands + Settings/Languages/Python/tools/IDEs/0. INTRO Python Editors.md b/Terminal Tips/Commands + Settings/Languages/Python/tools/IDEs/0. INTRO Python Editors.md new file mode 100644 index 0000000..b7219e8 --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/Python/tools/IDEs/0. INTRO Python Editors.md @@ -0,0 +1,14 @@ +Your IDE or Integrated Development Environment, is wherever you choose to code in. Truthfully it could be on VSCode or it could be anywhere you wish with all the browser tools that are available to you nowadays as well, there are hardly any reasons to actually think too hard about your IDE anymore. + +--- +### Some of my coding environments: + +- There is [VSCode](obsidian://open?vault=Obsidian&file=Coding%20Tips%2FComputers%2FPython%2Ftools%2FIDEs%2FVSCode) or PyCharm +- There is [Colab](obsidian://open?vault=Coding%20Tips&file=Computers%2FPython%2Ftools%2FIPython%2FColab%2FAbout%20Colab) +- There is SageMaker Studio +- There is [Jupyter](obsidian://open?vault=Coding%20Tips&file=Computers%2FPython%2Ftools%2FIPython%2FJupyter) +- And of course, the original [IPython ](obsidian://open?vault=Coding%20Tips&file=Computers%2FPython%2Ftools%2FIPython%2FIPython) + + +Also: +- *a special mention* that I'd like to add here is [xonsh](obsidian://open?vault=Coding%20Tips&file=Computers%2FTerminal%20Tips%2FShells%2Fxonsh%2FXonsh) which doesn't go in this section but belongs in the Terminals where further details will be found because it is much more of a terminal function than a python one. \ No newline at end of file diff --git a/Terminal Tips/Commands + Settings/Languages/Python/tools/IDEs/VSCode.md b/Terminal Tips/Commands + Settings/Languages/Python/tools/IDEs/VSCode.md new file mode 100644 index 0000000..19be645 --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/Python/tools/IDEs/VSCode.md @@ -0,0 +1,6 @@ +This is not meant to be an educational how-to guide on VSCode because there are plenty of resources found within the docs itself on that. Instead, these are just a jumble of tips and tricks that I find useful to collect while I develop so that I don't have to constantly keep searching back again while I code. + +--- + +- Of course, start VSCode through your terminal by `code .` which will instantiate a new VSCode instance directly from that folder. +- \ No newline at end of file diff --git a/Terminal Tips/Commands + Settings/Languages/Python/tools/IPython/.DS_Store b/Terminal Tips/Commands + Settings/Languages/Python/tools/IPython/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Terminal Tips/Commands + Settings/Languages/Python/tools/IPython/.DS_Store differ diff --git a/Terminal Tips/Commands + Settings/Languages/Python/tools/IPython/Automate Jupyter notebooks with Github Actions.md b/Terminal Tips/Commands + Settings/Languages/Python/tools/IPython/Automate Jupyter notebooks with Github Actions.md new file mode 100644 index 0000000..b4754f4 --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/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/Terminal Tips/Commands + Settings/Languages/Python/tools/IPython/Colab/.DS_Store b/Terminal Tips/Commands + Settings/Languages/Python/tools/IPython/Colab/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Terminal Tips/Commands + Settings/Languages/Python/tools/IPython/Colab/.DS_Store differ diff --git a/Terminal Tips/Commands + Settings/Languages/Python/tools/IPython/Colab/About Colab.md b/Terminal Tips/Commands + Settings/Languages/Python/tools/IPython/Colab/About Colab.md new file mode 100644 index 0000000..4ad9d15 --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/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/Terminal Tips/Commands + Settings/Languages/Python/tools/IPython/Colab/Colab Code Snippets.md b/Terminal Tips/Commands + Settings/Languages/Python/tools/IPython/Colab/Colab Code Snippets.md new file mode 100644 index 0000000..cbed204 --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/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/Terminal Tips/Commands + Settings/Languages/Python/tools/IPython/Colab/Colab Command Palette.md b/Terminal Tips/Commands + Settings/Languages/Python/tools/IPython/Colab/Colab Command Palette.md new file mode 100644 index 0000000..1ab0db7 --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/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/Terminal Tips/Commands + Settings/Languages/Python/tools/IPython/Colab/Colab Forms.md b/Terminal Tips/Commands + Settings/Languages/Python/tools/IPython/Colab/Colab Forms.md new file mode 100644 index 0000000..0ad7ab8 --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/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/Terminal Tips/Commands + Settings/Languages/Python/tools/IPython/Colab/Colab Scratch Code Cells.md b/Terminal Tips/Commands + Settings/Languages/Python/tools/IPython/Colab/Colab Scratch Code Cells.md new file mode 100644 index 0000000..199d209 --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/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/Terminal Tips/Commands + Settings/Languages/Python/tools/IPython/Colab/Colab Shortcuts.md b/Terminal Tips/Commands + Settings/Languages/Python/tools/IPython/Colab/Colab Shortcuts.md new file mode 100644 index 0000000..751fdef --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/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/Terminal Tips/Commands + Settings/Languages/Python/tools/IPython/IPython.md b/Terminal Tips/Commands + Settings/Languages/Python/tools/IPython/IPython.md new file mode 100644 index 0000000..4a33e8e --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/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/Terminal Tips/Commands + Settings/Languages/Python/tools/IPython/Jupyter.md b/Terminal Tips/Commands + Settings/Languages/Python/tools/IPython/Jupyter.md new file mode 100644 index 0000000..0b051a1 --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/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/Terminal Tips/Commands + Settings/Languages/Python/tools/IPython/convert a .ipynb to .py.md b/Terminal Tips/Commands + Settings/Languages/Python/tools/IPython/convert a .ipynb to .py.md new file mode 100644 index 0000000..3012b1e --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/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/Terminal Tips/Commands + Settings/Languages/Python/tools/IPython/merge multiple notebooks.md b/Terminal Tips/Commands + Settings/Languages/Python/tools/IPython/merge multiple notebooks.md new file mode 100644 index 0000000..7122abb --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/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/Terminal Tips/Commands + Settings/Languages/Python/tools/IPython/notebook launcher.md b/Terminal Tips/Commands + Settings/Languages/Python/tools/IPython/notebook launcher.md new file mode 100644 index 0000000..640375a --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/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/Terminal Tips/Commands + Settings/Languages/Python/tools/Libraries/.DS_Store b/Terminal Tips/Commands + Settings/Languages/Python/tools/Libraries/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Terminal Tips/Commands + Settings/Languages/Python/tools/Libraries/.DS_Store differ diff --git a/Terminal Tips/Commands + Settings/Languages/Python/tools/Libraries/Performance Profiling Libraries.md b/Terminal Tips/Commands + Settings/Languages/Python/tools/Libraries/Performance Profiling Libraries.md new file mode 100644 index 0000000..8b5bc65 --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/Python/tools/Libraries/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 have. + +- 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/Terminal Tips/Commands + Settings/Languages/Python/tools/Libraries/Starlette.md b/Terminal Tips/Commands + Settings/Languages/Python/tools/Libraries/Starlette.md new file mode 100644 index 0000000..edeeb05 --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/Python/tools/Libraries/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/Terminal Tips/Commands + Settings/Languages/Python/tools/Libraries/Tensorflow/About TensorFlow.md b/Terminal Tips/Commands + Settings/Languages/Python/tools/Libraries/Tensorflow/About TensorFlow.md new file mode 100644 index 0000000..036d763 --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/Python/tools/Libraries/Tensorflow/About TensorFlow.md @@ -0,0 +1,7 @@ +Tensorflow is extremely powerful and you will be using it often. Keras was another library but now there was a merge so keras and tersorflow are the same thing. This field is changing quickly so it is important to stay on your feet! + +``` +import tensorflow as tf +``` + +- Using the [dataset builder to load](https://www.tensorflow.org/datasets/overview) datasets in \ No newline at end of file diff --git a/Terminal Tips/Commands + Settings/Languages/Python/tools/Libraries/Tensorflow/Quantization in TFLite.md b/Terminal Tips/Commands + Settings/Languages/Python/tools/Libraries/Tensorflow/Quantization in TFLite.md new file mode 100644 index 0000000..922d8f7 --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/Python/tools/Libraries/Tensorflow/Quantization in TFLite.md @@ -0,0 +1,191 @@ +source is via [tensorflow examples](https://tensorexamples.com/2020/07/23/Quantize-your-model-using-tflite.html) + +--- + +# Quantization in tensorflow-lite + +Jul 23, 2020 + +# Quantization in tensorflow-lite + +If you want to run your TensorFlow code on an embedded platform you want to quantize your neural network. Especially edge-tpu devices or raspberry pi devices are very suitable for running quantized code. + +In this post I will show you how to go from training a simple neural network to running a quantized version of this network. + +## Step 1: train a model + +For the sake of having a model to quantize we are building a simple classifier for MNIST digits. What model you use exactly doesn’t really matter, so I will take an easy one here. Feel free to experiment and make the model better. + +``` +import tensorflow as tf +import numpy as np +import sklearn.metrics + +print("The TensorFlow version used in this tutorial is", tf.__version__) + +(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data() + +# Transform the input into floating point inputs between 0 and 1 +x_train = x_train.astype('float32') / 255.0 +x_test = x_test.astype('float32') / 255.0 + +# Define a very simple model +model = tf.keras.models.Sequential([ + tf.keras.layers.Input(shape=(28,28)), + tf.keras.layers.Flatten(), + tf.keras.layers.Dense(128,activation='relu'), + tf.keras.layers.Dense(10, activation='softmax') +]) + +# Compile and train the model for one epoch... It's only to have something trained, not get the best score +model.compile( + loss='sparse_categorical_crossentropy', + optimizer=tf.keras.optimizers.Adam(0.001), + metrics=['accuracy'], +) +model.fit(x_train, y_train,epochs=1) + + +``` + +``` +The TensorFlow version used in this tutorial is 2.2.0 +1875/1875 [==============================] - 5s 2ms/step - loss: 0.2602 - accuracy: 0.9253 + + + + + + +``` + +## Step 2: save the model + +Imagine that you finally trained the perfect image classification algorithm! Naturally you save it to be able to load it later, or evaluate in different environments. + +``` +saved_model_dir = 'saved_models/saved_quantization_model' +model.save(saved_model_dir) + +``` + +``` +WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/resource_variable_ops.py:1817: calling BaseResourceVariable.__init__ (from tensorflow.python.ops.resource_variable_ops) with constraint is deprecated and will be removed in a future version. +Instructions for updating: +If using Keras pass *_constraint arguments to layers. +INFO:tensorflow:Assets written to: saved_models/saved_quantization_model/assets +``` + +## Step 3: Convert the model to a tflite model + +Now is the moment to take your model and turn it into a calibrated model. To calibrate your model you show the neural network multiple possible inputs. In the background the activations are calculated to get a feeling for the spread of the activations. This is why it’s important to make the calibration dataset representative for your use case. + +If you during this step never show an image of a certain number/class it is possible that your model in production has issues recognizing this number/class. For now I just take a low amount of samples to speed up the process. + +In this tutorial we are making all inference run in int8 values. The range of int8 is very low, there are now only 255 options for each activation in each layer. This will let you lose a lot of precision in your neural network. Always make sure in an evaluation step that your model is still able to detect everything. + +``` +num_calibration_steps = 150 + +# Load the model we saved in step 2, and set the optimizations +converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir) +converter.optimizations = [tf.lite.Optimize.DEFAULT] + +# Make a way to load a representativce dataset. +def representative_dataset_gen(): + sample_per_calibration_step = 8 + for calib_index in range(num_calibration_steps): + # Get sample input data as a numpy array. You can either randomly select, or have a fixed calibration dataset. + yield [[x_train[sample_per_calibration_step,...]]] + +# Choose the inference input and output, and set the supported ops. +converter.representative_dataset = representative_dataset_gen +converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8] +converter.inference_input_type = tf.int8 # or tf.uint8 +converter.inference_output_type = tf.int8 # or tf.uint8 +tflite_quant_model = converter.convert() + +``` + +## Step 4: save the tflite model + +So far your work has been on a big computer. Now it’s possible to transport your model to a low power device, such as your raspberry pi. + +``` +tflite_quant_model_save_path = 'saved_models/model_quant.tflite' +NUM_EVALUATE_SAMPLES = 128 + +open(tflite_quant_model_save_path, "wb").write(tflite_quant_model) + + +``` + +``` +104848 +``` + +## Step 5: load the tflite model and run inference. + +This is all code which is necessary to run inference on your embedded device :) Once you have this all looks really simple, right? + +``` +# Load quantized TFLite model +tflite_interpreter_quant = tf.lite.Interpreter(model_path=tflite_quant_model_save_path) + +# Set the input and output tensors to handle a small batch of images to evaluate on +input_details = tflite_interpreter_quant.get_input_details() +output_details = tflite_interpreter_quant.get_output_details() +tflite_interpreter_quant.resize_tensor_input(input_details[0]['index'], (NUM_EVALUATE_SAMPLES, 28, 28)) +tflite_interpreter_quant.resize_tensor_input(output_details[0]['index'], (NUM_EVALUATE_SAMPLES, 10)) +tflite_interpreter_quant.allocate_tensors() + +# Run inference on the first set of test images +tflite_interpreter_quant.set_tensor(input_details[0]['index'], x_test[:NUM_EVALUATE_SAMPLES, ...]) +tflite_interpreter_quant.invoke() + +tflite_q_model_predictions = tflite_interpreter_quant.get_tensor(output_details[0]['index']) +print("\nPrediction results shape:", tflite_q_model_predictions.shape) +``` + +``` +Prediction results shape: (128, 10) +``` + +## Step 6: evaluate your model performance + +As I mentioned in a previous step your model performance might have gone down. It is important to evaluate both your general performance as well as your performance for specific classes. Things which are rare or very similar to other objects might not be represented very well anymore. + +``` +# Get the true values and the predictions for the first N samples +y_true = y_test[:NUM_EVALUATE_SAMPLES] +y_pred = np.argmax(tflite_q_model_predictions, axis=1) + +# Calculate the accuracy and confusion matrics with sklearn +accuracy_score = sklearn.metrics.accuracy_score(y_true, y_pred) +confusion_mat = sklearn.metrics.confusion_matrix(y_true, y_pred) + +# Print the accuracy score and confusion matrix +print("Accuracy score:", accuracy_score) +print("Confusion matrix") +print(confusion_mat) + +``` + +``` +Accuracy score: 0.9609375 +Confusion matrix +[[10 0 0 0 0 0 0 0 0 0] + [ 0 15 0 0 0 0 0 0 0 0] + [ 0 0 9 1 0 0 0 0 0 0] + [ 0 0 0 12 0 0 0 0 0 0] + [ 0 0 0 0 20 0 0 0 0 0] + [ 0 0 0 1 0 8 1 0 0 0] + [ 0 0 0 0 0 0 12 0 0 0] + [ 0 0 0 0 1 0 0 18 0 0] + [ 0 0 0 0 0 0 0 0 3 0] + [ 0 0 0 0 1 0 0 0 0 16]] +``` + +## Conclusion + +Now you are able to run inference on low-power embedded devices! Enjoy! \ No newline at end of file diff --git a/Terminal Tips/Commands + Settings/Languages/Python/tools/Libraries/Tornado.md b/Terminal Tips/Commands + Settings/Languages/Python/tools/Libraries/Tornado.md new file mode 100644 index 0000000..5b7e81f --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/Python/tools/Libraries/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/Terminal Tips/Commands + Settings/Languages/Python/tools/Libraries/beautiful soup.md b/Terminal Tips/Commands + Settings/Languages/Python/tools/Libraries/beautiful soup.md new file mode 100644 index 0000000..deba73b --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/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/Terminal Tips/Commands + Settings/Languages/Python/tools/Libraries/matplotlib.md b/Terminal Tips/Commands + Settings/Languages/Python/tools/Libraries/matplotlib.md new file mode 100644 index 0000000..209df55 --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/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/Terminal Tips/Commands + Settings/Languages/Python/tools/Libraries/nbdev.md b/Terminal Tips/Commands + Settings/Languages/Python/tools/Libraries/nbdev.md new file mode 100644 index 0000000..9aa6c23 --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/Python/tools/Libraries/nbdev.md @@ -0,0 +1,8 @@ + +A fantastic way to write python packages and applications. +There is a fantastic video and documentation site written and uploaded by the developers themselves. For your next python project. + +https://nbdev.fast.ai/tutorials/tutorial.html + +- Watch [0 to published project in 90 minutes ](https://www.youtube.com/watch?time_continue=1855&v=l7zS8Ld4_iA&feature=emb_logo) +- you can showcase other docs from other codebases with showdoc! \ No newline at end of file diff --git a/Terminal Tips/Commands + Settings/Languages/Python/tools/Libraries/numpy/.DS_Store b/Terminal Tips/Commands + Settings/Languages/Python/tools/Libraries/numpy/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Terminal Tips/Commands + Settings/Languages/Python/tools/Libraries/numpy/.DS_Store differ diff --git a/Terminal Tips/Commands + Settings/Languages/Python/tools/Libraries/numpy/numpy.md b/Terminal Tips/Commands + Settings/Languages/Python/tools/Libraries/numpy/numpy.md new file mode 100644 index 0000000..504113a --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/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/Terminal Tips/Commands + Settings/Languages/Python/tools/Libraries/pandas/.DS_Store b/Terminal Tips/Commands + Settings/Languages/Python/tools/Libraries/pandas/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Terminal Tips/Commands + Settings/Languages/Python/tools/Libraries/pandas/.DS_Store differ diff --git a/Terminal Tips/Commands + Settings/Languages/Python/tools/Libraries/pandas/Pandas tips.md b/Terminal Tips/Commands + Settings/Languages/Python/tools/Libraries/pandas/Pandas tips.md new file mode 100644 index 0000000..f75540e --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/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/Terminal Tips/Commands + Settings/Languages/Python/tools/Libraries/pandas/Summary Stats & EDA.md b/Terminal Tips/Commands + Settings/Languages/Python/tools/Libraries/pandas/Summary Stats & EDA.md new file mode 100644 index 0000000..9ad3076 --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/Python/tools/Libraries/pandas/Summary Stats & EDA.md @@ -0,0 +1,38 @@ +EDA is exploratory data analysis. + +--- + +Calculating Summary Statistics for a pandas dataframe: +``` +df.describe() +``` + +![[Pasted image 20221220153731.png]] +for string variables it's +``` +df.describe(include='object') +``` + +![[Pasted image 20221220153821.png]] + +or calculate grouped by variable +``` +df.groupby('team').mean() + +df.groupby('team').median + +``` + +![[Pasted image 20221220154008.png]] + +For quick EDA through `pandas-profiling`: +``` +import numpy as np +import pandas as pd +import pandas_profiling +df = pd.DataFrame( + np.random.rand(100, 5), + columns=['a', 'b', 'c', 'd', 'e']) +df.profile_report(style={'full_width':True}) + +``` \ No newline at end of file diff --git a/Terminal Tips/Commands + Settings/Languages/Python/tools/Libraries/pandas/common pandas commands.md b/Terminal Tips/Commands + Settings/Languages/Python/tools/Libraries/pandas/common pandas commands.md new file mode 100644 index 0000000..e69fbfb --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/Python/tools/Libraries/pandas/common pandas commands.md @@ -0,0 +1,38 @@ +# 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 + + +--- + +More useful data science tutorials: +- [Geospatial data science](https://towardsdatascience.com/six-python-tips-for-geospatial-data-science-4438a531b0bf) and visualizations \ No newline at end of file diff --git a/Terminal Tips/Commands + Settings/Languages/Python/tools/Libraries/requests.md b/Terminal Tips/Commands + Settings/Languages/Python/tools/Libraries/requests.md new file mode 100644 index 0000000..aaed94b --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/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/Terminal Tips/Commands + Settings/Languages/Python/tools/Libraries/xlswriter/.DS_Store b/Terminal Tips/Commands + Settings/Languages/Python/tools/Libraries/xlswriter/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Terminal Tips/Commands + Settings/Languages/Python/tools/Libraries/xlswriter/.DS_Store differ diff --git a/Terminal Tips/Commands + Settings/Languages/Python/tools/Libraries/xlswriter/About xlswriter.md b/Terminal Tips/Commands + Settings/Languages/Python/tools/Libraries/xlswriter/About xlswriter.md new file mode 100644 index 0000000..b9bdf06 --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/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) + +``` diff --git a/Terminal Tips/Commands + Settings/Languages/SQL.md b/Terminal Tips/Commands + Settings/Languages/SQL.md new file mode 100644 index 0000000..986e6eb --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/SQL.md @@ -0,0 +1,5 @@ +# SQL + +SQL will become relevant at some point. Here are the basics though! + +- a quick [ crash course](https://jobs.ornl.gov/job/Oak-Ridge-Associate-DevOps-Engineer-TN-37830/848147600/?feedId=301500&utm_source=ResearchGate&utm_campaign=ORNL_RG&&sn=Indeed&?mode=apply&iis=Indeed&iisn=Indeed). \ No newline at end of file diff --git a/Terminal Tips/Commands + Settings/Languages/Wolfram.md b/Terminal Tips/Commands + Settings/Languages/Wolfram.md new file mode 100644 index 0000000..f7b05d0 --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/Wolfram.md @@ -0,0 +1,4 @@ + +Stephen Wolfram's mathematical language I discovered on a school computer when curiously opening Wolfram Mathematica Pro. + +The documentation on their site is definitely one to be admired and emulated. \ No newline at end of file diff --git a/Terminal Tips/Commands + Settings/Languages/XML.md b/Terminal Tips/Commands + Settings/Languages/XML.md new file mode 100644 index 0000000..fa0bcca --- /dev/null +++ b/Terminal Tips/Commands + Settings/Languages/XML.md @@ -0,0 +1,42 @@ +# 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. + +- [This](https://www.w3schools.com/xml/xml_tree.asp) is a fantastic article explaining how an XML diagram which we learned about in software engineering directly translates to the XML code that is used by the system. This is why diagrams are so important in software engineering overall. +- This [website](https://www.hezhengda.io/xml-file-from-quantum-espresso/) discusses how to extract XML files from quantum espresso. + +For example, this is the XML diagram: +![[Pasted image 20221208133914.png]] + +And this would be the XML code: +``` + + +   +    Everyday Italian +    Giada De Laurentiis +    2005 +    30.00 +   +   +    Harry Potter +    J K. Rowling +    2005 +    29.99 +   +   +    Learning XML +    Erik T. Ray +    2003 +    39.95 +   + + +``` + +Wait so hold on just a second, wouldn't this have applications in quantum?? + +- apparently, [this](https://github.com/photonquantum/actix-xml) is a XML extractor for actix-web a framework that is used in Rust +- \ No newline at end of file diff --git a/Terminal Tips/Shells/.DS_Store b/Terminal Tips/Shells/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Terminal Tips/Shells/.DS_Store differ diff --git a/Terminal Tips/Shells/Bash.md b/Terminal Tips/Shells/Bash.md new file mode 100644 index 0000000..e32d834 --- /dev/null +++ b/Terminal Tips/Shells/Bash.md @@ -0,0 +1,13 @@ +# 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. + + +- `touch` creates the file named `zk_sync` and `chmod +x` makes the file an executable file, but we still need to say what shell will execute this file, and what exactly are the commands to be executed. +- [ bash command](https://discussions.apple.com/thread/252176464) for Big Sur if you ever decide to upgrade +- the oh-my-zsh version of bash is now regularly maintained through a git repo called [Bash-It](https://github.com/Bash-it/bash-it) +- check the file size of something in your directory by ```wc -c /Users/shwethajayaraj/qisket/file``` + - you can further turn it into a bash variable by doing: + - ```myfilesize=$(wc -c "/etc/passwd" | awk '{print $1}') + printf "%d\n" $myfilesize + echo "$myfilesize"``` \ No newline at end of file diff --git a/Terminal Tips/Shells/Computers (operating system)/Apple Macbook/.DS_Store b/Terminal Tips/Shells/Computers (operating system)/Apple Macbook/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Terminal Tips/Shells/Computers (operating system)/Apple Macbook/.DS_Store differ diff --git a/Terminal Tips/Shells/Computers (operating system)/Apple Macbook/BBEdit/.DS_Store b/Terminal Tips/Shells/Computers (operating system)/Apple Macbook/BBEdit/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Terminal Tips/Shells/Computers (operating system)/Apple Macbook/BBEdit/.DS_Store differ diff --git a/Terminal Tips/Shells/Computers (operating system)/Apple Macbook/BBEdit/BBEdit.md b/Terminal Tips/Shells/Computers (operating system)/Apple Macbook/BBEdit/BBEdit.md new file mode 100644 index 0000000..0811f76 --- /dev/null +++ b/Terminal Tips/Shells/Computers (operating system)/Apple Macbook/BBEdit/BBEdit.md @@ -0,0 +1,27 @@ +# 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. +- More tips with BBEdit can be found [here](https://www.git-tower.com/blog/5-tips-for-bbedit-text-editor/) + +### [Language Modules](obsidian://open?vault=Coding%20Tips&file=Computers%2FMac%20OS%20X%2FBBEdit%2FList%20of%20language%20modules): +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). + + +#### note on Yojimbo: +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/Terminal Tips/Shells/Computers (operating system)/Apple Macbook/BBEdit/CLM.md b/Terminal Tips/Shells/Computers (operating system)/Apple Macbook/BBEdit/CLM.md new file mode 100644 index 0000000..4c7cea4 --- /dev/null +++ b/Terminal Tips/Shells/Computers (operating system)/Apple Macbook/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/Terminal Tips/Shells/Computers (operating system)/Apple Macbook/BBEdit/Example CLM.md b/Terminal Tips/Shells/Computers (operating system)/Apple Macbook/BBEdit/Example CLM.md new file mode 100644 index 0000000..82db1c4 --- /dev/null +++ b/Terminal Tips/Shells/Computers (operating system)/Apple Macbook/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/Terminal Tips/Shells/Computers (operating system)/Apple Macbook/BBEdit/List of language modules.md b/Terminal Tips/Shells/Computers (operating system)/Apple Macbook/BBEdit/List of language modules.md new file mode 100644 index 0000000..b59a5ca --- /dev/null +++ b/Terminal Tips/Shells/Computers (operating system)/Apple Macbook/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/Terminal Tips/Shells/Computers (operating system)/Apple Macbook/BBEdit/plist.md b/Terminal Tips/Shells/Computers (operating system)/Apple Macbook/BBEdit/plist.md new file mode 100644 index 0000000..ea18db6 --- /dev/null +++ b/Terminal Tips/Shells/Computers (operating system)/Apple Macbook/BBEdit/plist.md @@ -0,0 +1,77 @@ + +**What is a plist?** + +.plists are simple [XML](obsidian://open?vault=Obsidian&file=Coding%20Tips%2FComputers%2FLanguages%2FXML) document types used throughout Mac OS X. This format defines a set of primitive types, and is used within CLM for definition. + +--- + +## Create plist to trigger program to run at a specific time + +- This is done with the `launchd` agent on Mac OS +- Make sure to place it under ```~/Library/LaunchAgents. ~``` denotes home directory. +``` +~/Library/LaunchAgents/com.launchd.example.plist +``` + + +--- + +## Obsidian --> git workflow plist + +#### instead of the cron tab ######## + +- on MacOS use ```launchd``` service +- store within ```~/Library/LaunchAgents/us.shwetha.obsidian.plist``` for example +- the XML path will be as follows: + +``` +# Creating a Obsidian.md ---> Gitlab workflow + + + + + + Label + us.shwetha.obsidian + ProgramArguments + + /Users/shwethajayaraj/bin/zk_sync.sh + + StartInterval + 60 + + + + +###### another example ########## +### Runs bash /Users/Me/Desktop/push_release.sh on 3/22 at 11:11AM ### + +?xml version="1.0" encoding="UTF-8"?> + + + + Label + com.launchd.example + ProgramArguments + + bash + + /Users/Me/Desktop/push_release.sh + + StartCalendarInterval + + Month + 3 + Day + 22 + Hour + 11 + Minute + 11 + + + + +``` \ No newline at end of file diff --git a/Terminal Tips/Shells/Computers (operating system)/Apple Macbook/Homebrew.md b/Terminal Tips/Shells/Computers (operating system)/Apple Macbook/Homebrew.md new file mode 100644 index 0000000..8f304a3 --- /dev/null +++ b/Terminal Tips/Shells/Computers (operating system)/Apple Macbook/Homebrew.md @@ -0,0 +1,6 @@ + +Ah, yes, the mac package installer I've used since converting from my chromebook linux machine. It continues to update though but make sure to update any errors of the like here as well. + +- percent of people using Mac versions +![[Pasted image 20230422215326.png]] +- I am part of the 1% here. \ No newline at end of file diff --git a/Terminal Tips/Shells/Computers (operating system)/Apple Macbook/Mac X Code.md b/Terminal Tips/Shells/Computers (operating system)/Apple Macbook/Mac X Code.md new file mode 100644 index 0000000..ddd24e8 --- /dev/null +++ b/Terminal Tips/Shells/Computers (operating system)/Apple Macbook/Mac X Code.md @@ -0,0 +1,26 @@ +# Mac OSX & Apple + +The Operating System of the many browsers you peruse. The convenient system. + +- [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: get [Bike](https://www.hogbaysoftware.com/bike/) when you decide to upgrade to MacOS 11 +- [Eaglefiler](https://c-command.com/eaglefiler/) & [Tooth Fairy ](https://c-command.com/toothfairy/) +- there are certain things you must have XCode command line tools: + - you do not need to pay for this on the app store nor be part of the Apple Developer program as it usually comes bundled with the terminal and can check via ```gcc --version``` + +```Apple +(base) gcc --version + +Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/include/c++/4.2.1 + +Apple LLVM version 10.0.1 (clang-1001.0.46.4) + +Target: x86_64-apple-darwin18.7.0 + +Thread model: posix + +InstalledDir: /Library/Developer/CommandLineTools/usr/bin + +(base) +``` \ No newline at end of file diff --git a/Terminal Tips/Shells/Computers (operating system)/Apple Macbook/MacPorts.md b/Terminal Tips/Shells/Computers (operating system)/Apple Macbook/MacPorts.md new file mode 100644 index 0000000..4c5717e --- /dev/null +++ b/Terminal Tips/Shells/Computers (operating system)/Apple Macbook/MacPorts.md @@ -0,0 +1,83 @@ + +An alternative package installer to the more popular Homebrew though much older. The project started in 2002 as an initiative from Apple employees to install UNIX packages. Similar to Fink, Homebrew and BSD ports collections. + +--- +#### Installing +--- + +To install a package: +``` +sudo port install packagename +``` + +Update outdated ports: +``` +sudo port selfupdate +sudo port upgrade outdated +``` + +By default, MacPorts does not collect any statistics. However, users can optionally submit information by running: +``` +sudo port install mpstats +``` + +Searching available package: +``` +port search --name --glob 'git*' +``` + +List outdated packages: +``` +port outdated +``` + +``` +sudo portupgrade outdates + +##or for specific things +sudo port upgrade gnupg2 +``` + +List installed packages +``` +port installed +``` + +Looks at contents of port: +``` +port contents portname +``` + +`Contents` is helpful for finding the location of a port's executable after installing it +``` +port -q contents _`portname`_ | grep -E '/s?bin/ +``` + + +#### Uninstalling +--- +Uninstalls a package +``` +sudo port uninstall portname +``` + +Typically packages will also have dependent packages that were installed as well. +``` +#to tag dependent packages +sudo port uninstall --follow-dependents portname +``` + +List which ports depend on a given installed port. +``` +port dependents openssl +``` + + + + + +--- + +## References: +--- +For further info, refer to either the MacPorts [Guide](https://guide.macports.org/) or official [Wiki](https://trac.macports.org/wiki) \ No newline at end of file diff --git a/Terminal Tips/Shells/Computers (operating system)/Choosing a Name for Your Computer.md b/Terminal Tips/Shells/Computers (operating system)/Choosing a Name for Your Computer.md new file mode 100644 index 0000000..a5e19b7 --- /dev/null +++ b/Terminal Tips/Shells/Computers (operating system)/Choosing a Name for Your Computer.md @@ -0,0 +1,452 @@ +via the [official conference paper](https://datatracker.ietf.org/doc/html/rfc1178) + +Network Working Group D. Libes +Request for Comments: 1178 Integrated Systems Group/NIST +FYI: 5 August 1990 + + + Choosing a Name for Your Computer + +Status of this Memo + + This FYI RFC is a republication of a Communications of the ACM + article on guidelines on what to do and what not to do when naming + your computer [1]. This memo provides information for the Internet + community. It does not specify any standard. + + Distribution of this memo is unlimited. + +Abstract + + In order to easily distinguish between multiple computers, we give + them names. Experience has taught us that it is as easy to choose + bad names as it is to choose good ones. This essay presents + guidelines for deciding what makes a name good or bad. + + Keywords: domain name system, naming conventions, computer + administration, computer network management + +Introduction + + As soon as you deal with more than one computer, you need to + distinguish between them. For example, to tell your system + administrator that your computer is busted, you might say, "Hey Ken. + Goon is down!" + + Computers also have to be able to distinguish between themselves. + Thus, when sending mail to a colleague at another computer, you might + use the command "mail libes@goon". + + In both cases, "goon" refers to a particular computer. How the name + is actually dereferenced by a human or computer need not concern us + here. This essay is only concerned with choosing a "good" name. (It + is assumed that the reader has a basic understanding of the domain + name system as described by [2].) + + By picking a "good" name for your computer, you can avoid a number of problems that people stumble over again and again. + + Here are some guidelines on what NOT to do. + + + + +Libes [Page 1] + +RFC 1178 Name Your Computer August 1990 + + + Don't overload other terms already in common use. + + Using a word that has strong semantic implications in the + current context will cause confusion. This is especially true + in conversation where punctuation is not obvious and grammar is + often incorrect. + + For example, a distributed database had been built on top of + several computers. Each one had a different name. One machine + was named "up", as it was the only one that accepted updates. + Conversations would sound like this: "Is up down?" and "Boot + the machine up." followed by "Which machine?" + + While it didn't take long to catch on and get used to this + zaniness, it was annoying when occasionally your mind would + stumble, and you would have to stop and think about each word + in a sentence. It is as if, all of a sudden, English has + become a foreign language. + + Don't choose a name after a project unique to that machine. + + A manufacturing project had named a machine "shop" since it was + going to be used to control a number of machines on a shop + floor. A while later, a new machine was acquired to help with + some of the processing. Needless to say, it couldn't be called + "shop" as well. Indeed, both machines ended up performing more + specific tasks, allowing more precision in naming. A year + later, five new machines were installed and the original one + was moved to an unrelated project. It is simply impossible to + choose generic names that remain appropriate for very long. + + Of course, they could have called the second one "shop2" and so + on. But then one is really only distinguishing machines by + their number. You might as well just call them "1", "2", and + "3". The only time this kind of naming scheme is appropriate + is when you have a lot of machines and there are no reasons for + any human to distinguish between them. For example, a master + computer might be controlling an array of one hundred + computers. In this case, it makes sense to refer to them with + the array indices. + + While computers aren't quite analogous to people, their names + are. Nobody expects to learn much about a person by their + name. Just because a person is named "Don" doesn't mean he is + the ruler of the world (despite what the "Choosing a Name for + your Baby" books say). In reality, names are just arbitrary + tags. You cannot tell what a person does for a living, what + their hobbies are, and so on. + + + +Libes [Page 2] + +RFC 1178 Name Your Computer August 1990 + + + Don't use your own name. + + Even if a computer is sitting on your desktop, it is a mistake + to name it after yourself. This is another case of + overloading, in which statements become ambiguous. Does "give + the disk drive to don" refer to a person or computer? + + Even using your initials (or some other moniker) is + unsatisfactory. What happens if I get a different machine + after a year? Someone else gets stuck with "don" and I end up + living with "jim". The machines can be renamed, but that is + excess work and besides, a program that used a special + peripheral or database on "don" would start failing when it + wasn't found on the "new don". + + It is especially tempting to name your first computer after + yourself, but think about it. Do you name any of your other + possessions after yourself? No. Your dog has its own name, as + do your children. If you are one of those who feel so inclined + to name your car and other objects, you certainly don't reuse + your own name. Otherwise you would have a great deal of + trouble distinguishing between them in speech. + + For the same reason, it follows that naming your computer the + same thing as your car or another possession is a mistake. + + Don't use long names. + + This is hard to quantify, but experience has shown that names + longer than eight characters simply annoy people. + + Most systems will allow prespecified abbreviations, but why not + choose a name that you don't have to abbreviate to begin with? + This removes any chance of confusion. + + Avoid alternate spellings. + + Once we called a machine "czek". In discussion, people + continually thought we were talking about a machine called + "check". Indeed, "czek" isn't even a word (although "Czech" + is). + + Purposely incorrect (but cute) spellings also tend to annoy a + large subset of people. Also, people who have learned English + as a second language often question their own knowledge upon + seeing a word that they know but spelled differently. ("I + guess I've always been spelling "funxion" incorrectly. How + embarrassing!") + + + +Libes [Page 3] + +RFC 1178 Name Your Computer August 1990 + + + By now you may be saying to yourself, "This is all very + silly...people who have to know how to spell a name will learn + it and that's that." While it is true that some people will + learn the spelling, it will eventually cause problems + somewhere. + + For example, one day a machine named "pythagoris" (sic) went + awry and began sending a tremendous number of messages to the + site administrator's computer. The administrator, who wasn't a + very good speller to begin with, had never seen this machine + before (someone else had set it up and named it), but he had to + deal with it since it was clogging up the network as well as + bogging down his own machine which was logging all the errors. + Needless to say, he had to look it up every time he needed to + spell "pythagoris". (He suspected there was an abbreviation, + but he would have had to log into yet another computer (the + local nameserver) to find out and the network was too jammed to + waste time doing that.) + + Avoid domain names. + + For technical reasons, domain names should be avoided. In + particular, name resolution of non-absolute hostnames is + problematic. Resolvers will check names against domains before + checking them against hostnames. But we have seen instances of + mailers that refuse to treat single token names as domains. + For example, assume that you mail to "libes@rutgers" from + yale.edu. Depending upon the implementation, the mail may go + to rutgers.edu or rutgers.yale.edu (assuming both exist). + + Avoid domain-like names. + + Domain names are either organizational (e.g., cia.gov) or + geographical (e.g., dallas.tx.us). Using anything like these + tends to imply some connection. For example, the name "tahiti" + sounds like it means you are located there. This is confusing + if it is really somewhere else (e.g., "tahiti.cia.gov is + located in Langley, Virginia? I thought it was the CIA's + Tahiti office!"). If it really is located there, the name + implies that it is the only computer there. If this isn't + wrong now, it inevitably will be. + + There are some organizational and geographical names that work + fine. These are exactly the ones that do not function well as + domain names. For example, amorphous names such as rivers, + mythological places and other impossibilities are very + suitable. ("earth" is not yet a domain name.) + + + + +Libes [Page 4] + +RFC 1178 Name Your Computer August 1990 + + + Don't use antagonistic or otherwise embarrassing names. + + Words like "moron" or "twit" are good names if no one else is + going to see them. But if you ever give someone a demo on your + machine, you may find that they are distracted by seeing a + nasty word on your screen. (Maybe their spouse called them + that this morning.) Why bother taking the chance that they + will be turned off by something completely irrelevant to your + demo. + + Don't use digits at the beginning of the name. + + Many programs accept a numerical internet address as well as a + name. Unfortunately, some programs do not correctly + distinguish between the two and may be fooled, for example, by + a string beginning with a decimal digit. + + Names consisting entirely of hexadecimal digits, such as + "beef", are also problematic, since they can be interpreted + entirely as hexadecimal numbers as well as alphabetic strings. + + Don't use non-alphanumeric characters in a name. + + Your own computer may handle punctuation or control characters + in a name, but most others do not. If you ever expect to + connect your computer to a heterogeneous network, you can count + on a variety of interpretations of non-alphanumeric characters + in names. Network conventions on this are surprisingly + nonstandard. + + Don't expect case to be preserved. + + Upper and lowercase characters look the same to a great deal of + internet software, often under the assumption that it is doing + you a favor. It may seem appropriate to capitalize a name the + same way you might do it in English, but convention dictates + that computer names appear all lowercase. (And it saves + holding down the shift key.) + + Now that we've heard what not to do, here are some suggestions on + names that work well. + + Use words/names that are rarely used. + + While a word like "typical" or "up" (see above) isn't computer + jargon, it is just too likely to arise in discussion and throw + off one's concentration while determining the correct referent. + Instead, use words like "lurch" or "squire" which are unlikely + + + +Libes [Page 5] + +RFC 1178 Name Your Computer August 1990 + + + to cause any confusion. + + You might feel it is safe to use the name "jose" just because + no one is named that in your group, but you will have a problem + if you should happen to hire Jose. A name like "sphinx" will + be less likely to conflict with new hires. + + Use theme names. + + Naming groups of machines in a common way is very popular, and + enhances communality while displaying depth of knowledge as + well as imagination. A simple example is to use colors, such + as "red" and "blue". Personality can be injected by choices + such as "aqua" and "crimson". + + Certain sets are finite, such as the seven dwarfs. When you + order your first seven computers, keep in mind that you will + probably get more next year. Colors will never run out. + + Some more suggestions are: mythical places (e.g., Midgard, + Styx, Paradise), mythical people (e.g., Procne, Tereus, Zeus), + killers (e.g., Cain, Burr, Boleyn), babies (e.g., colt, puppy, + tadpole, elver), collectives (e.g., passel, plague, bevy, + covey), elements (e.g., helium, argon, zinc), flowers (e.g., + tulip, peony, lilac, arbutus). Get the idea? + + Use real words. + + Random strings are inappropriate for the same reason that they + are so useful for passwords. They are hard to remember. Use + real words. + + Don't worry about reusing someone else's hostname. + + Extremely well-known hostnames such as "sri-nic" and "uunet" + should be avoided since they are understood in conversation as + absolute addresses even without a domain. In all other cases, + the local domain is assumed to qualify single-part hostnames. + This is similar to the way phone numbers are qualified by an + area code when dialed from another area. + + In other words, if you have choosen a reasonable name, you do + not have to worry that it has already been used in another + domain. The number of hosts in a bottom-level domain is small, + so it shouldn't be hard to pick a name unique only to that + domain. + + + + + +Libes [Page 6] + +RFC 1178 Name Your Computer August 1990 + + + There is always room for an exception. + + I don't think any explanation is needed here. However, let me + add that if you later decide to change a name (to something + sensible like you should have chosen in the first place), you + are going to be amazed at the amount of pain awaiting you. No + matter how easy the manuals suggest it is to change a name, you + will find that lots of obscure software has rapidly accumulated + which refers to that computer using that now-ugly name. It all + has to be found and changed. People mailing to you from other + sites have to be told. And you will have to remember that + names on old backup media labels correspond to different names. + + I could go on but it would be easier just to forget this + guideline exists. + +Conclusion + + Most people don't have the opportunity to name more than one or two + computers, while site administrators name large numbers of them. By + choosing a name wisely, both user and administrator will have an + easier time of remembering, discussing and typing the names of their + computers. + + I have tried to formalize useful guidelines for naming computers, + along with plenty of examples to make my points obvious. Having been + both a user and site administrator, many of these anecdotes come from + real experiences which I have no desire to relive. Hopefully, you + will avoid all of the pitfalls I have discussed by choosing your + computer's name wisely. + +Credits + + Thanks to the following people for suggesting some of these + guidelines and participating in numerous discussions on computer + naming: Ed Barkmeyer, Peter Brown, Chuck Hedrick, Ken Manheimer, and + Scott Paisley. + + This essay first appeared in the Communications of the ACM, November, + 1989, along with a Gary Larson cartoon reprinted with permission of + United Press Syndicate. The text is not subject to copyright, since + it is work of the National Institute of Standards and Technology. + However, the author, CACM, and NIST request that this credit appear + with the article whenever it is reprinted. + + + + + + + +Libes [Page 7] + +RFC 1178 Name Your Computer August 1990 + + +References + + [1] Libes, D., "Choosing a Name for Your Computer", Communications + of the ACM, Vol. 32, No. 11, Pg. 1289, November 1989. + + [2] Mockapetris, P., "Domain Names - Concepts and Facilities", + RFC 1034, USC/Information Sciences Institute, November 1987. + +Security Considerations + + Security issues are not discussed in this memo. + +Author's Address + + Don Libes + Integrated Systems Group + National Institute of Standards and Technology + Gaithersburg, MD 20899 + + Phone: (301) 975-3535 + + EMail: libes@cme.nist.gov + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Libes [Page 8] + + + ![](chrome-extension://annlhfjgbkfmbbejkbdpgbmpbcjnehbb/images/saveicon.png) Save + +--- + +I suppose after reading that it is a great time to try a [random word generator](https://randomword.com/). \ No newline at end of file diff --git a/Terminal Tips/Shells/Computers (operating system)/Linux/AlpaLinux.md b/Terminal Tips/Shells/Computers (operating system)/Linux/AlpaLinux.md new file mode 100644 index 0000000..c90361f --- /dev/null +++ b/Terminal Tips/Shells/Computers (operating system)/Linux/AlpaLinux.md @@ -0,0 +1,37 @@ +The Linux distribution which my gitea server runs on. The [documentation](https://alpa.readthedocs.io/en/latest/topics/overview.html#copr-targets) exists here. Their git repository exists [here](https://github.com/orgs/alpa-team/repositories). + +---- + +Installing supervisord +``` +dnf install epel-release +``` + +``` +which yum +``` +/usr/bin/yum + +``` +yum install supervisor -y +``` + +Check your packages: +``` +cd /etc/ +ls +``` + +![[Pasted image 20230626071733.png]] + +``` +systemctl start supervisord +systemctl enable supervisord +``` +Output: Created symlink /etc/systemd/system/multi-user.target.wants/supervisord.service → /usr/lib/systemd/system/supervisord.service. + +Success! + + +--- + diff --git a/Terminal Tips/Shells/Internet/.DS_Store b/Terminal Tips/Shells/Internet/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Terminal Tips/Shells/Internet/.DS_Store differ diff --git a/Terminal Tips/Shells/Internet/APIs/Useful APIs.md b/Terminal Tips/Shells/Internet/APIs/Useful APIs.md new file mode 100644 index 0000000..5fdc563 --- /dev/null +++ b/Terminal Tips/Shells/Internet/APIs/Useful APIs.md @@ -0,0 +1,8 @@ + +API stands fro Application Programming Interface and it's just a way to stream internet data. You can do a lot with it manipulate it though without having to dig for it all in the interwebs and so it is often compiled into an API and used often. + +An API collection is further found on Postman. I've written about how to use [APIs in python here.](obsidian://open?vault=Obsidian&file=Coding%20Tips%2FComputers%2FLanguages%2FPython%2FProjects%2FAPI%20Python) + +---- +Here are some APIs for you to pull from: +- API for [sentiment analysis ](http://help.sentiment140.com/ap)aggregating social media data \ No newline at end of file diff --git a/Terminal Tips/Shells/Internet/Hosting/.DS_Store b/Terminal Tips/Shells/Internet/Hosting/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Terminal Tips/Shells/Internet/Hosting/.DS_Store differ diff --git a/Terminal Tips/Shells/Internet/Hosting/Browser talk/.DS_Store b/Terminal Tips/Shells/Internet/Hosting/Browser talk/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Terminal Tips/Shells/Internet/Hosting/Browser talk/.DS_Store differ diff --git a/Terminal Tips/Shells/Internet/Hosting/Browser talk/About Browsers.md b/Terminal Tips/Shells/Internet/Hosting/Browser talk/About Browsers.md new file mode 100644 index 0000000..8d1215d --- /dev/null +++ b/Terminal Tips/Shells/Internet/Hosting/Browser talk/About Browsers.md @@ -0,0 +1,25 @@ + +There are so many browsers. Usually people either stick with Chrome, Safari, or Microsoft Edge/Explorer. However, there is much more out there, of course. I've used Firefox, Brave, and now Vivaldi. They each require customizations and various tweaks to get used to. Especially that everything now is being geared as web-friendly (which I would have loved to have 7 years ago as a power-Chromebook user), the need for a good browser is essential. Here is a growing list of browsers. + +--- + +##### Browser List: + +- Firefox + - fantastic for open source users + - compatible for Linux users + - amazing Mozilla tutorials and programming guides +- Chrome - default ChromeOS browser +- Safari - default Mac & iPhone browser +- Microsoft Edge - default Windows browser +- Opera +- Tor +- Brave + - offshoot of Firefox + - comes with Tor capabilities + - BAT token concept - paying you for your attention + - secure +- [Vivaldi](obsidian://open?vault=Obsidian&file=Coding%20Tips%2FComputers%2FInternet%2FHosting%2FBrowser%20talk%2FUsing%20Vivaldi) +- Aloha Browser +- Opera GX +- Tor Browser \ No newline at end of file diff --git a/Terminal Tips/Shells/Internet/Hosting/Browser talk/DNS.md b/Terminal Tips/Shells/Internet/Hosting/Browser talk/DNS.md new file mode 100644 index 0000000..e5db59f --- /dev/null +++ b/Terminal Tips/Shells/Internet/Hosting/Browser talk/DNS.md @@ -0,0 +1,77 @@ +DNS, aka the **Domain Name System**, is the phonebook of the internet. + +More specifically, it is the hierarchical and distributed naming system for computers, services, and other resources in the internet or other IP networks. It associates various information with domain names assigned to each of the associated entities. And most notably, it translates domain names to the numerical IP addresses needed for locating and identifying computer services and devices. + +--- + +##### History +The Domain Name System has been an essential component since 1985. It was originally used the UDP (User Datagram Protocol) as transport over IP. However, reliability, security, and privacy concerns led to the use of TCP (Transmission Control Protocol) as well as other numerous other protocol developments. + +Example: +hostname `www.example.com` translates to the DNS address _93.184.216.34_ (IPv4) and _2606:2800:220:1:248:1893:25c8:1946_ (IPv6). The DNS can be quickly and transparently updates allowing service's location to change without affecting end users. + +--> What is the difference between IPv4 & IPv6? + +###### More Details: +The DNS reflects the structure of administrative responsibility on the internet. +- Though the data structure of the DNS is a tree data structure +![[Pasted image 20230624141203.png]] + + + +#### Issues: +--- + +- Some large ISPs have configured their DNS servers to violate rules + - such as by disobeying TTLs (Time To Live, for results obtained from a DNS request), or by indicating that a domain name does not exist just because one of its name servers does not respond. +- some web browsers maintain an internal DNS cache to avoid repeated lookups via the network. This practice can add extra difficulty when debugging DNS issues as it obscures the history of such data. + - Internet explorer is an exception up to IE 8 + - Chrome detects SNS issues and displays a specific message + +#### Uses +--- + +###### A DNS stores the following records in its database : +- **SOA**: start of authority +- IP Addresses +- **MX**: SMTP mail exchangers (MX) +- **NS**: name servers +- **PTR:** pointers for reverse DNS lookups (PTR) + - begins b +- **CNAME**: domain name aliases +- **DNSSEC**: domain name system security extensions +- **RP**: responsible person records +- **RBL**: real-time blackhole list to combat spam +- **TTL** : time to live + - associated with results obtained from DNS request + - TTL set by administrator of the authoritative DNS server + - may range from few seconds to days to weeks + - protocol supports caching for up to 68 years or none at all + +For more information, there is also a table of resource record definitions on the [Google Domains site](https://support.google.com/domains/answer/10751068?sjid=32632215372440938-NA). + + + +My DNS Files: + + + +![[Pasted image 20230624135042.png]] + +#### A list of DNS Services +Numerous DNS services exist. A non-exhaustive list is given below: +- Bunny DNS + - update static files pointing to `http://theqrg.org/images/logo.png` + - to your new bunny.net hostname `https://theqrg.b-cdn.net/images/logo.png` +- Cloudflare +- Digital Ocean +- Gandi +- Google Cloud DNS +- Hetzner DNS +- Linode DNS +- name.com +- Namecheap +- Netcup DNS +- Porkbun DNS +- Route53 +- Vultr DNS \ No newline at end of file diff --git a/Terminal Tips/Shells/Internet/Hosting/Browser talk/Uniform Resource Identifier.md b/Terminal Tips/Shells/Internet/Hosting/Browser talk/Uniform Resource Identifier.md new file mode 100644 index 0000000..fb05d72 --- /dev/null +++ b/Terminal Tips/Shells/Internet/Hosting/Browser talk/Uniform Resource Identifier.md @@ -0,0 +1,7 @@ +# Aka the URI + + +not to be confused with the URL ;) + +--- +These identifiers can be accessed via request over http. \ No newline at end of file diff --git a/Terminal Tips/Shells/Internet/Hosting/Browser talk/Uniform Resource Locator.md b/Terminal Tips/Shells/Internet/Hosting/Browser talk/Uniform Resource Locator.md new file mode 100644 index 0000000..306dd41 --- /dev/null +++ b/Terminal Tips/Shells/Internet/Hosting/Browser talk/Uniform Resource Locator.md @@ -0,0 +1 @@ +# The URL \ No newline at end of file diff --git a/Terminal Tips/Shells/Internet/Hosting/Browser talk/Using Vivaldi.md b/Terminal Tips/Shells/Internet/Hosting/Browser talk/Using Vivaldi.md new file mode 100644 index 0000000..c97f58d --- /dev/null +++ b/Terminal Tips/Shells/Internet/Hosting/Browser talk/Using Vivaldi.md @@ -0,0 +1,10 @@ +The customization in this new browser can be overwhelming at times but so very useful. So here is a handy list of customizations that I may find myself coming back to. + + +#### Customizations: +--- + + + +#### Hot Keys: +--- diff --git a/Terminal Tips/Shells/Internet/Hosting/Databases/.DS_Store b/Terminal Tips/Shells/Internet/Hosting/Databases/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Terminal Tips/Shells/Internet/Hosting/Databases/.DS_Store differ diff --git a/Terminal Tips/Shells/Internet/Hosting/Databases/Tools & Tables/.DS_Store b/Terminal Tips/Shells/Internet/Hosting/Databases/Tools & Tables/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Terminal Tips/Shells/Internet/Hosting/Databases/Tools & Tables/.DS_Store differ diff --git a/Terminal Tips/Shells/Internet/Hosting/Databases/Tools & Tables/AirTable.md b/Terminal Tips/Shells/Internet/Hosting/Databases/Tools & Tables/AirTable.md new file mode 100644 index 0000000..f6b2f5d --- /dev/null +++ b/Terminal Tips/Shells/Internet/Hosting/Databases/Tools & Tables/AirTable.md @@ -0,0 +1,8 @@ +# AirTable + +A fairly new database tool similar to Notion except used more professionally in companies by product people apparently. + Even in terms of user interface it is similar which makes it a lot more friendly to work with boring ol tables compared to excel and even google sheets. Thanks to my sign-up with a .edu account I have the pro plan for 120 days starting today (September 20th, 2022). And who knows where I'll be in 2024... + +[My Long Term Goals](https://airtable.com/appZdis6EGpmI7LZh/tblmPjnlhWmCw2zMi/viwRbaFDX3FCQhgZY?blocks=hide) airtable. +A [Business Expense Tracker](https://airtable.com/appZdis6EGpmI7LZh/tblmPjnlhWmCw2zMi/viwRbaFDX3FCQhgZY?blocks=hide) airtable. + diff --git a/Terminal Tips/Shells/Internet/Hosting/Databases/Tools & Tables/Google Sheets.md b/Terminal Tips/Shells/Internet/Hosting/Databases/Tools & Tables/Google Sheets.md new file mode 100644 index 0000000..34bcf42 --- /dev/null +++ b/Terminal Tips/Shells/Internet/Hosting/Databases/Tools & Tables/Google Sheets.md @@ -0,0 +1,5 @@ +# Google Sheets + +Okay we all know how to use this seemingly simple google version of an excel spreadsheet. However, there are some tips and tricks you may not have known! So go ahead and `docs.new` up a sheet to try these out: +- +- \ No newline at end of file diff --git a/Terminal Tips/Shells/Internet/Hosting/Databases/Tools & Tables/Microsoft Excel.md b/Terminal Tips/Shells/Internet/Hosting/Databases/Tools & Tables/Microsoft Excel.md new file mode 100644 index 0000000..640b6c6 --- /dev/null +++ b/Terminal Tips/Shells/Internet/Hosting/Databases/Tools & Tables/Microsoft Excel.md @@ -0,0 +1,4 @@ +# Excel + +Ah yes, the classic, the infamous, the powerful Microsoft Excel spreadsheet. There are a ton of things to do in here and it is worth doing. So here are some of the more helpful shortcuts in Excel you may find useful. + diff --git a/Terminal Tips/Shells/Internet/Hosting/Databases/Tools & Tables/Notions about Notion.md b/Terminal Tips/Shells/Internet/Hosting/Databases/Tools & Tables/Notions about Notion.md new file mode 100644 index 0000000..04387ae --- /dev/null +++ b/Terminal Tips/Shells/Internet/Hosting/Databases/Tools & Tables/Notions about Notion.md @@ -0,0 +1,31 @@ +# Notions about Notions + + +**A guide on how to Notion in the best way possible :-)** + +My own notion lives right at: https://www.notion.so/shwethajayaraj/ +[Has a lot of cool pointers and suggestions! ](https://www.youtube.com/watch?v=NoLg2qFiOxw) + +Tips from that video: +1. Use gifs for notion headers +2. synced blocks make things easier +3. create template buttons for interactive stuffs. +4. Use callouts as better headers to separate areas better. +5. Use notion-enhancer to make it look like anything you want! +6. Cmd+Shift+L to toggle between light and dark modes. +7. Embed hand-written notes on google drive onto Notion (tip #45) + +--- + + + +[https://www.youtube.com/watch?v=T-8pZg-pF9w](https://www.youtube.com/watch?v=T-8pZg-pF9w) + +1. [Indify.co](http://Indify.co) notion widgets +2. [Apption.co](http://Apption.co) for more notion widgets +3. You can play Spotify from Notion as well by embedding. + + + + +..this page originally made on notion ;) \ No newline at end of file diff --git a/Terminal Tips/Shells/Internet/Hosting/Docker.md b/Terminal Tips/Shells/Internet/Hosting/Docker.md new file mode 100644 index 0000000..e6f7935 --- /dev/null +++ b/Terminal Tips/Shells/Internet/Hosting/Docker.md @@ -0,0 +1,9 @@ +### What is it? +--- +Docker uses *containers* which are isolated from one another and come bundled withtheir own software, libraries, and configuration files. while still communicating witheachother through well-defined channels. An important thing to remember here is that since all the containers share the services of a single operating system kernel, **they use fewer resources than a virtual machine**. + +[DockerHub](https://hub.docker.com/) exists as a collection of images to quickly install on your machine. + + +Uses: +- install gitea with Docker \ No newline at end of file diff --git a/Terminal Tips/Shells/Internet/Hosting/Dreamhost.md b/Terminal Tips/Shells/Internet/Hosting/Dreamhost.md new file mode 100644 index 0000000..7f6d3e8 --- /dev/null +++ b/Terminal Tips/Shells/Internet/Hosting/Dreamhost.md @@ -0,0 +1,41 @@ +# Dreamhost + +Dreamhost is another hosting service to host web pages on. A bunch of dreamhost how-to's will be posted here as I figure out the process for it all. + +--- + + +- The file transfer protocol files will be managed through [here](https://panel.dreamhost.com/?tree=users.dashboard#), the Admin Panel. +- the current domain is `shwjay1.dreamhosters.com` +- shared hosting with PHP 8.0 +- user is  [dh_6xnpuv](https://panel.dreamhost.com/?tree=users&subtab=users¤t_step=Index&next_step=Edit&usid=3797568196)) +- List of File Transfer Protocol softwares are found [here](https://help.dreamhost.com/hc/en-us/articles/215613107-List-of-FTP-client-software) + - Filezilla is what is noted to use in tutorials + - through [Dreamhost they also have their own built in web FTP](https://help.dreamhost.com/hc/en-us/articles/360003490852-Using-the-website-file-manager-in-the-panel) as well + - [Wordpress](https://www.dreamhost.com/blog/category/tutorials/) tutorials + +--- + +### Some Youtube Video Walkthroughs + +- [DreamHost - Full Tutorial about the Cpanel of this host](https://www.youtube.com/watch?v=S7zEuU__DgE) +- [CPanel Tutorial : How to Use File Manager to Upload Website Files](https://www.youtube.com/watch?v=MJ-TH_Om54w) +- [DreamHost - How To Setup Your 1st Website in 9 Minutes](https://www.youtube.com/watch?v=eC1ciYNfxlU) +- [How to Upload Files with FTP to DreamHost (WebFTP tutorial)]( https://www.youtube.com/watch?v=k8z0K3pW1jc) + + +--- + +### Uploading files through +Read[ this file ](https://help.dreamhost.com/hc/en-us/articles/115006086308-How-to-view-your-DreamHost-site-using-your-hosts-file)to see how to view files through Dreamhost before DNS transfer. + +Type the following into terminal: +``` +sudo nano /private/etc/hosts +``` + +then in the hosts editor type the following: + +``` +10.0.0.1  shwjay1.dreashosters.com +``` \ No newline at end of file diff --git a/Terminal Tips/Shells/Internet/Hosting/Frontend Tools.md b/Terminal Tips/Shells/Internet/Hosting/Frontend Tools.md new file mode 100644 index 0000000..bd6c6fb --- /dev/null +++ b/Terminal Tips/Shells/Internet/Hosting/Frontend Tools.md @@ -0,0 +1,8 @@ +This is a simple running list of front-end easy tools I use for web making. + +- Netlify +- Vercel +- Jamstack: [List of static site generators](https://jamstack.org/generators/) +- [Jekyll Templates ](http://jekyllthemes.org/) for gh-pages +- Prose.io as a content editor + - and [getting started](https://github.com/prose/prose/wiki/Getting-Started) with prose \ No newline at end of file diff --git a/Terminal Tips/Shells/Internet/Hosting/Github Pages.md b/Terminal Tips/Shells/Internet/Hosting/Github Pages.md new file mode 100644 index 0000000..dbaf1c2 --- /dev/null +++ b/Terminal Tips/Shells/Internet/Hosting/Github Pages.md @@ -0,0 +1,54 @@ + + +Tools: +- Github + - website +- Jekyll + - [website](https://jekyllrb.com/) +- Prose + - +- Terminal + + + +This is where your own personal website lives. It is hosted via github for free and fully customizable to your heart's content so make sure to take full advantage of it! + +- [this](https://shwetha729.github.io/) is what your portfolio site looks like currently. +- and this is your [github repo](https://github.com/shwetha729/shwetha729.github.io) where your code files live +--- + +Publish files to a `gh-pages` branch on GitHub (or any other branch anywhere else). Do the following: +``` +npm install gh-pages --save-dev +``` + +or to add to a different branch: +`yarn add gh-pages` + + +--- + +[Watch this video ](https://www.youtube.com/watch?v=OltY8JIaP-4) + +How to Host a website on Github Pages. We can host a static HTML website for free on Github. You can only host static websites (HTML, CSS, JavaScript, including react, angular, bootstrap). You won't be able to upload a web application with a server (python flask/django, ruby on rails, node.js/express, etc). The steps are as followed: +1. Create a GitHub account and login +2. Create a repository and name it {username}.github.io if it's a personal website; else, name it whatever you like. +3. Upload your web page files to the new repository +4. Go to settings, pages, and click on source. Change 'none' to 'master' or 'main' (or whichever branch you'd like) Your website will have this structure: {username}.github.io/{repository-name} +5. To add a custom domain to your website, check out this video:    [![](https://www.gstatic.com/youtube/img/watch/yt_favicon.png) • How to add a Cust...](https://www.youtube.com/watch?v=rIXWUJ5U8bY&t=0s) + + +- Also here are a list and [video tutorials of web projects ](https://www.youtube.com/playlist?list=PLnKe36F30Y4bLhA-st9sC4ZthyV7nsL2Q) + + +--- + +## Getting my Github back up again. + +1. `git clone` my repository into a folder +2. if there are dependency issues use `yarn install` + + + + +Tips: diff --git a/Terminal Tips/Shells/Internet/Hosting/Linode.md b/Terminal Tips/Shells/Internet/Hosting/Linode.md new file mode 100644 index 0000000..da2a152 --- /dev/null +++ b/Terminal Tips/Shells/Internet/Hosting/Linode.md @@ -0,0 +1,5 @@ +A competitive cloud provider to AWS, Google, or Microsoft that is created for developers. + +--- + +![[Pasted image 20230505214204.png]] \ No newline at end of file diff --git a/Terminal Tips/Shells/Internet/Hosting/Neocities.md b/Terminal Tips/Shells/Internet/Hosting/Neocities.md new file mode 100644 index 0000000..feb3076 --- /dev/null +++ b/Terminal Tips/Shells/Internet/Hosting/Neocities.md @@ -0,0 +1,15 @@ + +Oh, I've arrived to the most joyous part of the internet (at times, there's definitely some strange stuff on there). [Neocities](https://neocities.org/browse). A forever open source website where you are free to make your own code and edit as you please. + +Here is my[ neocities website](https://shwetharts.neocities.org/) so far. + +--- + +Here are some others neocities sites I enjoy: +- https://nuange.neocities.org/ +![[Pasted image 20230610145132.png]] +- https://nuange.neocities.org/shnizkeria +- https://users2.smartgb.com/g/g.php?a=s&i=g26-36688-af +- https://cinni.net/?z=/sitename +- https://soap.coffee/~lthms/ +[- Beginnner's Guide to Neocities ](https://sadgrl.online/learn/articles/beginners-guide-neocities) \ No newline at end of file diff --git a/Terminal Tips/Shells/Internet/Hosting/On Hosts.md b/Terminal Tips/Shells/Internet/Hosting/On Hosts.md new file mode 100644 index 0000000..7497b0f --- /dev/null +++ b/Terminal Tips/Shells/Internet/Hosting/On Hosts.md @@ -0,0 +1,46 @@ +# Hosting + +This area will be for *all* of it when referencing a space on a browser or network. For visionary insights, look into [this IEEE article ](https://spectrum.ieee.org/the-fathers-of-the-internet-revolution-urge-todays-pioneers-to-reinvent-the-web)on the future of web. + + +#### The Order of ownerships of the Host +--- + +1. Domains + +In order for a website or application on a browser to exist in space it must be hosted. Therefore, this lies in a **domain**. +- Wordpress +- [Github Pages ](obsidian://open?vault=Coding%20Tips&file=Computers%2FBrowser%2FHosting%2FGithub%20Pages) +- [Dreamhost](obsidian://open?vault=Coding%20Tips&file=Computers%2FBrowser%2FHosting%2FDreamhost) + +--- + +2. Cloud Storage + +When there is a lot of data being hosted, it may need to be hosted through **cloud storage**. +- Google Cloud Platform +- AWS +- Azure + +--- + +3. Containers + +In order for the data in applications in storage to keep continuously running, often these clouds can be kept alive in a **container**. +- Docker +- Digital Ocean + - Digital Ocean [marketplace](https://marketplace.digitalocean.com/apps/appwrite) + - [Appwrite](https://appwrite.io/) - a backend for web servers and mobile apps + - can be instantiated within Digital Ocean + +--- + +4. NAS (Network Attached Storage) + +This takes all the abstraction of the above out by offloading all data onto a singular physical system to manage the network, your NAS. + +- From the [wiki](https://en.wikipedia.org/wiki/Network-attached_storage): + - **Network-attached storage** (**NAS**) is a file-level (as opposed to [block-level storage](https://en.wikipedia.org/wiki/Block-level_storage "Block-level storage")) [computer data storage](https://en.wikipedia.org/wiki/Computer_data_storage "Computer data storage") server connected to a [computer network](https://en.wikipedia.org/wiki/Computer_network "Computer network") providing data access to a [heterogeneous](https://en.wikipedia.org/wiki/Heterogeneous_computing "Heterogeneous computing") group of clients. The term "NAS" can refer to both the technology and systems involved, or a specialized device built for such functionality (as unlike tangentially related technologies such as [local area networks](https://en.wikipedia.org/wiki/Local_area_network "Local area network"), a NAS device is often a singular unit). +- [Synology](https://www.synology.com/en-us) is a popular NAS service + - here is a [list of cheatsheet commands ](https://github.com/wuseman/Synology +- Plex Servers \ No newline at end of file diff --git a/Terminal Tips/Shells/Internet/Hosting/Servers/About Servers.md b/Terminal Tips/Shells/Internet/Hosting/Servers/About Servers.md new file mode 100644 index 0000000..4bdc7b7 --- /dev/null +++ b/Terminal Tips/Shells/Internet/Hosting/Servers/About Servers.md @@ -0,0 +1,19 @@ +This is a[ fantastic set of tutorials](https://blog.nihilism.network/servers/) to check out when you have a moment on setting up servers in the right way. +Servers basically realized the whole hassle of hosting pages/website data personally/locally and decided to make a business out of managing the hosting side of things. It's all very bureaucratic but it's a race to see who can be bureacratic bigger and faster. Ideally, it should be ultimately up to the person themselves what they want to do with their hosting needs. + +The only reason people might need servers is for containers or larger buckets for machine learning memory or data aggregation/mining, which yeah usually does take up a lot of space and no one wants to host all of that data because a lot of what is run is a bunch of meaningless code based on powerful math that people don't really care but only want to see the results of. Data harvesters might need to use servers too. + +But the real ones should probably just stick to hosting? Using one of the following though is still a lot more official and better supported. + +--- +- AWS +- Azure +- Cloudron + - a fantastic self hosting solution + - create your own private cloud + - check out [here](https://www.cloudron.io/get.html) for the run script + - the full install tips: [found here.](https://docs.cloudron.io/installation/) + +- GCP +- GCS + - GCS is Google Cloud Storage and tensorflow works well here \ No newline at end of file diff --git a/Terminal Tips/Shells/Internet/Hosting/Servers/Cloudron.md b/Terminal Tips/Shells/Internet/Hosting/Servers/Cloudron.md new file mode 100644 index 0000000..fe728a1 --- /dev/null +++ b/Terminal Tips/Shells/Internet/Hosting/Servers/Cloudron.md @@ -0,0 +1,21 @@ + +Similar to Linode, this is a cloud provider that you can self host your servers or applications on. Here is a [demo](https://my.demo.cloudron.io/#/apps). Username: cloudron Password: cloudron + +Access your console [here](https://console.cloudron.io/). I have created an instance at my.server.com. In order to run the server: + +##### Set up Instructions: +Create a fresh Ubuntu Focal 20.04 x64 server and run these commands: +``` +wget https://cloudron.io/cloudron-setup +chmod +x ./cloudron-setup +./cloudron-setup --setup-token d67496f99587bb15000be6e2183db49e484fdf26ea2ebcf1913e9fe29aaf2589 +``` + +Cloudron is entirely self-hosted on your server. They cannot access your apps or the server. + +--- + +### Possibilities +You can do lots of things on Cloudron, the world is your oyster. Some things are: +- Install [OpenVPN](https://www.cloudron.io/store/io.cloudron.openvpn.html) +- Run [Gitea](obsidian://open?vault=Obsidian&file=Gitea) instance with 1-click deploy, or [here](https://git.cloudron.io/cloudron/gitea-app) for more info \ No newline at end of file diff --git a/Terminal Tips/Shells/Internet/Hosting/Servers/Gitea.md b/Terminal Tips/Shells/Internet/Hosting/Servers/Gitea.md new file mode 100644 index 0000000..ef96032 --- /dev/null +++ b/Terminal Tips/Shells/Internet/Hosting/Servers/Gitea.md @@ -0,0 +1,81 @@ +A beautiful self-hosted non-commercial git server. Small but powerful. A better alternative to the monoliths of Github & Gitlab. + +- Get set up with [these instructions](https://www.makeuseof.com/install-gitea-raspberry-pi-create-your-own-code-repository/) on hosting a gitea server using a raspberry pi + +Scripting migrations: +If you have a lot of repositories to migrate, it may be easier to write a script to migrate them. + +The easiest way to go about this would be to use the [Gitea API](https://docs.gitea.io/en-us/api-usage) to create a blank repository, and then use the Git command line to clone repositories from your existing service into Gitea: + +``` +git clone --mirror «url to old repository» +git remote set-url origin «url to new gitea repository» +git push --mirror origin + +``` + + +### More references: +--- +- Migrate from [github/gitlab to gitea](https://hostedgitea.com/article/how-to-migrate-from-github-to-gitea) +- Similar to github pages but for [gitea](https://github.com/42wim/caddy-gitea) +- Gitea for [many user databases](https://www.talkingquickly.co.uk/gitea-sso-with-keycloak-openldap-openid-connect) +- Gitea is highly customizeable. Here is a key of [all its configs](https://docs.gitea.com/next/administration/config-cheat-sheet) +- Using gitea with [Jenkins](https://plugins.jenkins.io/gitea/) +- A self-hosting[ cloud tutorial ](https://spin.atomicobject.com/2022/02/08/git-service-gitea/) +- You can also run gitea on [cloudron](obsidian://open?vault=Obsidian&file=Cloudron) +- Installing gitea onto [raspberry pi ](https://www.makeuseof.com/install-gitea-raspberry-pi-create-your-own-code-repository/#:~:text=Using%20Gitea&text=You%20can%20choose%20to%20make,as%20if%20it%20were%20GitHub.) +- A[ gitpod instance](https://gogitea-gitea-5jiuqihle03.ws-us97.gitpod.io/) of gitea + - gitpod is just an automated dev environment - think of it as a pre-build +- Disaster recovery for Gitea - Gitea’s [repository mirroring](https://docs.gitea.io/en-us/repo-mirror/) makes it relatively easy to replicate critical Git repositories so that teams can still work at minimal capacity until the production environment is back up and running. + - For more information, [read here. ](https://blog.inedo.com/self-hosted/gitea/#:~:text=Gitea%20will%20run%20on%20all,client%20tools%20on%20the%20server.) + + +## Installing the Gitea Server +--- +There are numerous ways you can install Gitea on your machine but don't get overwhelmed by the choices. Just choose what is easiest for you to get started and you can optimize afterwards. + +For me, since I'm currently on a Macbook it will be easiest to do a MacPorts install but perhaps I'll switch it over to be a Linux install at some point later. + +1. Go to [MacPorts](https://www.macports.org/install.php#installing), Click your Apple flavor, and download + install the .pkg (no fancy CLI needed for this step!) +2. Using Homebrew, install Gitea on your laptop! +3. Now go to Linode to set up your server with Alpine Linux. +4. Set up steps in this [video](https://www.youtube.com/watch?v=bVB24I7B0JQ) and create a node +5. SSH into the root IP +6. Push a test repo and there we have it! You set up your gitea :) +![[Pasted image 20230626034045.png]] + +Gitea Server details +- Site: Shwetha-Base : my self-hosted gitea server +- Path: /var/lib/gitea/data/gitea-repositories +- Run as username: msgit +- Server domain: 172.104.8.87 +- Gitea base url: http://172.104.8.87:3000/ +- log path:/var/lib/gitea/log +- server port and listening port - 22,3000 + +### Using Gitea Server +--- + +###### Linode +To start the server: +``` +systemctl start gitea.service +``` + +###### Caddy: +Using the gitea server with Caddy: +-->add the following server block to your Caddyfile +``` +git.example.com { +reverse_proxy localhost:3000 +} +``` + +**For Caddy with a subpath**: In case you already have a site, and you want Gitea to share the domain name, you can setup Caddy to serve Gitea under a sub-path by adding the following to your server block in your Caddyfile: + +``` +git.example.com { route /git/* { uri strip_prefix /git reverse_proxy localhost:3000 }} +``` + +Then set `[server] ROOT_URL = http://git.example.com/git/` in your configuration. \ No newline at end of file diff --git a/Terminal Tips/Shells/Internet/Hosting/Servers/Github.md b/Terminal Tips/Shells/Internet/Hosting/Servers/Github.md new file mode 100644 index 0000000..baa120c --- /dev/null +++ b/Terminal Tips/Shells/Internet/Hosting/Servers/Github.md @@ -0,0 +1,6 @@ +Github is one of the largest and most popular version control & codebase hosting site in the world. This website is the OG for uploading your code somewhere basically for all to see. Other versions include Gitlab, Bit Bucket, and more. + +There is also this site called Githubplus for quick downloading of anything on github. As well as [a site that generates](https://github-contributions.vercel.app/) all your github contributions in a single image! + +- This is the quick [cheatsheet for all things github ](https://upengareri.github.io/notes/git_cheatsheet/) through your terminal +- I have made a personal more in-depth [git commands sheet ](https://docs.google.com/document/d/1am1D9IryCxSWAA6a0RcdeW6EPZYqKkNIUqmXtxDtaBE/edit?usp=sharing)as well for reference. \ No newline at end of file diff --git a/Terminal Tips/Shells/Internet/Hosting/Servers/Gitlab.md b/Terminal Tips/Shells/Internet/Hosting/Servers/Gitlab.md new file mode 100644 index 0000000..71c2694 --- /dev/null +++ b/Terminal Tips/Shells/Internet/Hosting/Servers/Gitlab.md @@ -0,0 +1,41 @@ +# Gitlab + +Gitlab is a lot more open source than Github seems to be which is bought out by Microsoft and so runs very much most of the world in that sense, right? It is one of the largest codebase platforms that people use for simple version control for their programs but similar in the way that google docs is hosted by Google, thevery code that we use is technically all under Microsoft. + +Links: +- really great [contributor guidelines](https://gitlab.com/pages/pages.gitlab.io/-/blob/master/CONTRIBUTING.md) + +--- + +- Also since you haven't signed anything yet for Windtelligent.ai [this](https://about.gitlab.com/solutions/startups/) can still technically apply to you: + +- Similar to github gists, gitlab uses [snippets]( https://gitlab.com/-/snippets/new). + +- GitDock is a GUI for your git projects: https://www.youtube.com/watch?v=WkVS38wo4_w + +- This is my gitlab profile: https://gitlab.com/shwetha729 + +- Making a proper readme: https://www.makeareadme.com/ + +``` +---zk_sync.sh +``` + + + +..made with BBEdit + + +--- + +## Gitlab Pages + +- this is similar to Github Pages, except a lot better + - it is possible to create your[ own error messages](obsidian://open?vault=Obsidian&file=Coding%20Tips%2FComputers%2FInternet%2FTools%2FGitlab)! + - for further documentation [visit here](https://docs.gitlab.com/ee/user/project/pages/introduction.html#custom-error-codes-pages) +- use [doctoc](https://github.com/thlorenz/doctoc/#examples) for markdown files +- examples gitlab pages: + - a [wiki based ](https://pages.gitlab.io/ikiwiki/)one + - [gitbook](https://pages.gitlab.io/gitbook/) inside your gitlab page + - a[ jupyter notebook ](https://pages.gitlab.io/jupyterbook/markdown.html)inside gitlab + - \ No newline at end of file diff --git a/Terminal Tips/Shells/Internet/Hosting/Servers/Nginx.md b/Terminal Tips/Shells/Internet/Hosting/Servers/Nginx.md new file mode 100644 index 0000000..04f7ab1 --- /dev/null +++ b/Terminal Tips/Shells/Internet/Hosting/Servers/Nginx.md @@ -0,0 +1,5 @@ + +A powerful reverse proxy server to set up. Much to add further notes on here but for now here is a list of references. + +--- +- [Configuring HTTPS servers](https://nginx.org/en/docs/http/configuring_https_servers.html) \ No newline at end of file diff --git a/Terminal Tips/Shells/Internet/Hosting/Servers/Replit.md b/Terminal Tips/Shells/Internet/Hosting/Servers/Replit.md new file mode 100644 index 0000000..260aad5 --- /dev/null +++ b/Terminal Tips/Shells/Internet/Hosting/Servers/Replit.md @@ -0,0 +1,14 @@ +# Replit is everything +It is an IDE. It is a forkable github. It is a tutorial. It is graphics. It is games. And it is inspiration. You can push all your existing code from github or gitlab onto Replit or vice versa. And what's more it is very easy for all ages to learn about programming with. This will be extremely useful in the future as programming trends toward making it easier and easier for all to learn this essential skill of the future. + +Also it has [templates](https://replit.com/templates/websites) for pretty much anything you want to build. And if it's not there yet, you should probably make a template on there yourself. + +--- +#### **Things one can do on Replit:** +- Easily make your own forked repos inspired by others! +- [ Pair program](https://docs.replit.com/tutorials/pair-programming-using-multiplayer-with-repl-it) via Replit + - do this by pressing the *share* button in the top right hand corner +- Export repls into github + - next to *add file/add folder* --> three dots --> "Download as zip" + - import via github or gitlab + \ No newline at end of file diff --git a/Terminal Tips/Shells/Internet/Hosting/Servers/Repositories.md b/Terminal Tips/Shells/Internet/Hosting/Servers/Repositories.md new file mode 100644 index 0000000..c10a5f4 --- /dev/null +++ b/Terminal Tips/Shells/Internet/Hosting/Servers/Repositories.md @@ -0,0 +1,71 @@ + +- What is Software? + - A program, or bunch of nicely-packaged terminal commands and code to be run on your operating system shell of choice (aka your computer). + - typically retrieved from the Internet + - we take it for granted today but software really didn't exist a hundred years ago at all. +- What is a Repository? + - a location either physically or virtually where software is [hosted](obsidian://open?vault=Obsidian&file=Coding%20Tips%20(Classical)%2FTerminal%20Tips%2FShells%2FInternet%2FHosting%2FOn%20Hosts) to be referenced from in the future +--- + +##### A Repository of software repositories + +Here is a list of repos + +- [Github](https://github.com/) is the most popular one to rip things off of - owned by Microsoft + + - [githubplus](https://githubplus.com/) makes things even [easier](https://www.ghacks.net/2016/08/22/github-plus-easier-github-downloading/)  + + - it is also easy to just host websites through [GithubPages](obsidian://open?vault=Obsidian&file=Coding%20Tips%2FComputers%2FMac%20OS%20X%2FBrowser%2FHosting%2FGithub%20Pages) + +- [freesoft.dev](https://freesoft.dev/) also has tons of repos + +- [GraphLab](https://freesoft.dev/program/68400869) - a cool visualizer showing different graph algorithms  + +- [Gitlab](https://about.gitlab.com/) is another one to look through  + + - more documentation on that [here](obsidian://open?vault=Obsidian&file=Coding%20Tips%2FComputers%2FMac%20OS%20X%2FBrowser%2FTools%2FGitlab) + +- [Replit](https://replit.com/) may also have several softwares - more collaborative  + + - [About replit ](obsidian://open?vault=Obsidian&file=Coding%20Tips%2FComputers%2FMac%20OS%20X%2FBrowser%2FTools%2FReplit%2FAbout%20Replit) + +- [Bit Bucket ](https://bitbucket.org/)is another place software is hosted  + + - useful with Jira integration  + +- [GitTea](**[https://gitea.com/shway](https://gitea.com/shway)**) is a new open-source, community driven platform. And seems to be all around better in terms of independence from other git hosting solutions. Will have to test it out and see.  + + - Setting GitTea up [on Windows ](https://blog.inedo.com/self-hosted/gitea/#:~:text=Gitea%20will%20run%20on%20all,client%20tools%20on%20the%20server.) + + - For more information, check out the Git Tea notes.  + +![[Pasted image 20230517160012.png]] + + --- + + + + +#### Keys - because I always forget:  + +This should really be configured into some kind of script already, but since I haven't done that yet here is a reminder that for every repository I make, *I must have a key into that repository so  that I can git push it via my personal terminal*.  + +This is best practice when it comes to security so have this be second-nature. Scripts only serves as a time benefit after understanding.  +To do so:  +1. Make the new ssh key  + +``` + +ssh-keygen -t rsa -f ~/.ssh/gitname + +``` + +2. Edit the .ssh config file  + +``` + + + +``` + +3. Other things diff --git a/Terminal Tips/Shells/Internet/Obsidian/.DS_Store b/Terminal Tips/Shells/Internet/Obsidian/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/.DS_Store differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/Obsidian-git process.md b/Terminal Tips/Shells/Internet/Obsidian/Obsidian-git process.md new file mode 100644 index 0000000..bb9d881 --- /dev/null +++ b/Terminal Tips/Shells/Internet/Obsidian/Obsidian-git process.md @@ -0,0 +1,87 @@ +Resources: +- Follow the instructions [here](https://medium.com/analytics-vidhya/how-i-put-my-mind-under-version-control-24caea37b8a5) and document as you go: +- Refer back to [plists](obsidian://open?vault=Coding%20Tips&file=Computers%2FMac%20OS%20X%2FBBEdit%2Fplist) for a better understanding of implementation and usage. +- on Cron: https://osxdaily.com/2020/04/27/fix-cron-permissions-macos-full-disk-access/ +- apparently the extension [Obsidian-Git](https://github.com/denolehov/obsidian-git/wiki/Installation#existing-repo) already does this in an easier way now +- So this is how you [push it to your gitlab](https://about.gitlab.com/blog/2022/03/15/publishing-obsidian-notes-with-gitlab-pages/) +- Refer to the [Git page](obsidian://open?vault=Obsidian&file=Coding%20Tips%2FComputers%2FTerminal%20Tips%2FGit) on here for more shortcuts. + +--- + +#### Syncing my Obsidian: The Steps I took + +My Obsidian files are all stored within Google Drive. So in order to maintain sync while still preserving cloud storage space, I used a few different steps than the guides, and well really it was a culmination of it all. + +1. **Find your Google Drive location and copy the directory path. +``` +pwd | pbcopy +``` + +2. Go to your **local** projects folder and `git init` there locally. +``` +mkdir gitlab_sync +cd gitlab_sync +git init +git branch -m main +#renamed branch to main insted of master +#less typing xD + +``` + +3. Then create a bare clone copy into your copied google drive location. +``` +git clone --bare . ~user/Google\ Drive/My\ Drive/folder/location.git +``` + +4. Then go ahead and make a new remote using this git path inside your local directory. +``` +git remote add NameOfRemote ~user/Google\ Drive/My\ Drive/folder/location.git +``` + +5. Make some changes to your git repository by adding files and commit those changes. +``` +**git** add LICENSE.md +**git** commit -m 'Initial sync version' +``` + +6. Then I pushed the changes to the remote google drive location. +``` +git push -u origin main +``` + +##### Pushing to Gitlab +7. Next, I added the (SSH) remote of the gitlab server to upload to as well. +``` +git remote add NameofRemote git@gitblah.com:user/repo.git +``` + +8. I then created another branch for the upload sync to take place. +``` +git branch AnotherBranch +git checkout AnotherBranch #switch into it +``` + +9. + +10. Then follow the instructions [outlined on this article](https://techstreams.medium.com/git-google-drive-simple-git-host-3a84db4fc1fd). Basically you then create a git clone of it in your new directory by `git clone --bare . PATH_TO_GOOGLE_DRIVE_SYNC_FOLDER/ANY_SUBFOLDER_PATH/PROJECT_NAME.git` +11. Then do a git remote by `git remote add REMOTE_NAME PATH_TO_GOOGLE_DRIVE_SYNC_FOLDER/ANY_SUBFOLDER_PATH/PROJECT_NAME.git` +12. Add files to stage for commit and commit a message. +``` +git add . +git commit -m "an update message here" +``` + +13. Lastly, push the changes onto your quantum programming repo. +``` +git push -u origin main +``` +Voila! You should see the changes now [over here](https://gitlab.com/shwetha729/quantum-programming). Or wherever you decided to set up host the git remote server on. + +13. + +--- + + +- Lastly but not leastly, I stumbled upon Perlite in my search for obsidian sync. +![[Pasted image 20230206134648.png]] +The sample view of Perlite extension. \ No newline at end of file diff --git a/Terminal Tips/Shells/Internet/Obsidian/Tips on Obsidian itself.md b/Terminal Tips/Shells/Internet/Obsidian/Tips on Obsidian itself.md new file mode 100644 index 0000000..f0dddbc --- /dev/null +++ b/Terminal Tips/Shells/Internet/Obsidian/Tips on Obsidian itself.md @@ -0,0 +1,51 @@ +Obsidian is what I'm making all of this stuff that is on here right now on. For what it's worth, Obsidian is freaking cool, okay? At its core, it's just a bunch of markdown files and at its best, it is absolutely everything and anything that I want it to be. It's worth it as a knowledge management system and even if you don't use it as anything more than a note-taking software, it forces you to go back and to go over the things that you thought you knew. + + +Obsidian is resourceful because you are compiling knowledge as a story rather than as a file dump or a storage system. When you frame it as a story, you can go back and re-understand the things you had noted down before without losing current contextual relevancy. This allows you to quickly apply whatever was learned before to what you are dealing with now -- which is the whole point of learning anyhow! :) + +With all of the new automation tools that are coming out, it is important to note that Obidian is your *personal* knowledge-base, not a knowledge management base that needs to necessarily be the most efficient or most pretty of things. It can be messy and inefficient but at least your notes will be somewhere here for you to **iteratively build upon.** And that is the beauty of it. Plus, it's fun. [And when you have fun, you are more productive. ](https://stvbyr.tech/blog/what-i-learned-using-obsidian/) + +--- + + +# A Place for Obsidian Tips + +Place any tips or tricks you find on the web on here. + +--- + +- Plugins are very helpful. [Here](https://obsidian.md/plugins#) is the total list of plugins from Obsidian + - [Obsius plugin](https://github.com/jonstodle/obsius-obsidian-plugin) instead of paying to publish through Obsidian +- Put [Obsidian onto git](https://medium.com/analytics-vidhya/how-i-put-my-mind-under-version-control-24caea37b8a5) and update every few minutes! +- You already know how awesome [LaTex](obsidian://open?vault=Quantum%20Vault&file=Computers%2FMac%20OS%20X%2FLaTeX) is. Now Obsidian can [use](https://github.com/artisticat1/obsidian-latex-suite) it within it too!! (as plugin) +- You can create amazing [slides](https://mszturc.github.io/obsidian-advanced-slides/) in Obsidian and then publish them to github + - can create [presentation powerpoints](https://mszturc.github.io/obsidian-advanced-slides/examples/consult/#/) + - [portfolio](https://mszturc.github.io/obsidian-advanced-slides/examples/minml/#/) sites - + - [workout](https://mszturc.github.io/obsidian-advanced-slides/examples/legday/#/) plans !!? +- [This is a fantastic blog on Obsidian](https://www.thoughtasylum.com/obsidian/) features such as tags, keywords, using documentation, automation, and more. +- Another [raindrop collection](https://raindrop.io/davidblue/obsidian-20957282) of Obsidian things if you can't find on google! +- Really great [youtube](https://www.youtube.com/watch?v=8WZj7JNjsp8) of using Obsidian with your VSCode +- Another [very comprehensive guide](https://www.youtube.com/watch?v=wB89lJs5A3s) on youtube +- Proxying a [remote obsidian ](https://github.com/sytone/obsidian-remote) + +--- + +## Plugins + +The file to see all installed plugins through terminal is ```/Users/shwethajayaraj/Google\ Drive/My\ Drive/uploads/Obsidian/.obsidian/plugins/obsidian-extract-pdf-annotations``` + +##### Extract PDF Annotations +![[Pasted image 20221211145937.png]] +- above are the current hotkeys for pdf extraction +- the file to see plugin + +--- +Recent Obsidian Updates: + +## Misc. improvements + +- YouTube and Twitter links can now be embedded within your notes using the markdown image embed syntax (i.e. `![](https://www.youtube.com/...)`). +- We've redesigned all the tree components (e.g. File Explorer, Outline view) to make the visual hierarchy more clear. If you are using a custom theme, make sure to update it (Settings → Appearance → Check for updates) in case it was impacted at all. +- Bookmarks: Added new "Bookmark this block" menu item when right-clicking on a block ID. + +--- diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/.DS_Store b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/.DS_Store differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/7ohP4GDMGPrVKxNbijdYKdEFPk8EPgGeuMyZkPMZq1FL4wBRzD1xeYFiqQLTyUQNR5Fs2fwZYw8seUnx9UhiZzSoWLXCNHcywUUm.gif b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/7ohP4GDMGPrVKxNbijdYKdEFPk8EPgGeuMyZkPMZq1FL4wBRzD1xeYFiqQLTyUQNR5Fs2fwZYw8seUnx9UhiZzSoWLXCNHcywUUm.gif new file mode 100644 index 0000000..768951d Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/7ohP4GDMGPrVKxNbijdYKdEFPk8EPgGeuMyZkPMZq1FL4wBRzD1xeYFiqQLTyUQNR5Fs2fwZYw8seUnx9UhiZzSoWLXCNHcywUUm.gif differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20220703231737.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20220703231737.png new file mode 100644 index 0000000..29e2d01 Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20220703231737.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20220705203711.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20220705203711.png new file mode 100644 index 0000000..81c9ea9 Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20220705203711.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20220708092152.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20220708092152.png new file mode 100644 index 0000000..982bab3 Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20220708092152.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20220708092319.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20220708092319.png new file mode 100644 index 0000000..511fd37 Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20220708092319.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20220708093923.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20220708093923.png new file mode 100644 index 0000000..a0738c2 Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20220708093923.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20220708093939.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20220708093939.png new file mode 100644 index 0000000..6258cda Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20220708093939.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20220708094039.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20220708094039.png new file mode 100644 index 0000000..3558b56 Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20220708094039.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20220708094155.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20220708094155.png new file mode 100644 index 0000000..50948d1 Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20220708094155.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20220708094636.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20220708094636.png new file mode 100644 index 0000000..65959bc Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20220708094636.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20220708094651.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20220708094651.png new file mode 100644 index 0000000..bcf89c8 Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20220708094651.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20220708094708.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20220708094708.png new file mode 100644 index 0000000..a721c87 Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20220708094708.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20220709153922.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20220709153922.png new file mode 100644 index 0000000..ce939ce Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20220709153922.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20220709155517.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20220709155517.png new file mode 100644 index 0000000..7831d17 Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20220709155517.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20220709155559.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20220709155559.png new file mode 100644 index 0000000..8406ce1 Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20220709155559.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20220709161121.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20220709161121.png new file mode 100644 index 0000000..f96fd7e Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20220709161121.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20220709161448.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20220709161448.png new file mode 100644 index 0000000..98e7530 Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20220709161448.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20220730121832.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20220730121832.png new file mode 100644 index 0000000..3542fba Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20220730121832.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20220825004820.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20220825004820.png new file mode 100644 index 0000000..e30b01b Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20220825004820.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20220827183015.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20220827183015.png new file mode 100644 index 0000000..7af5778 Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20220827183015.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20220908174202.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20220908174202.png new file mode 100644 index 0000000..b345fc3 Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20220908174202.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221001152049.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221001152049.png new file mode 100644 index 0000000..65f5a17 Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221001152049.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221001152106.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221001152106.png new file mode 100644 index 0000000..cf7b81d Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221001152106.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221117183151.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221117183151.png new file mode 100644 index 0000000..6ac6b46 Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221117183151.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221121101944.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221121101944.png new file mode 100644 index 0000000..ddd5c58 Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221121101944.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221129134110.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221129134110.png new file mode 100644 index 0000000..38ad2f5 Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221129134110.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221129134133.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221129134133.png new file mode 100644 index 0000000..186bebc Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221129134133.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221129134332.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221129134332.png new file mode 100644 index 0000000..afe12de Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221129134332.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221129134615.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221129134615.png new file mode 100644 index 0000000..033076f Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221129134615.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221129135814.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221129135814.png new file mode 100644 index 0000000..a94c785 Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221129135814.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221129140410.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221129140410.png new file mode 100644 index 0000000..097ab51 Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221129140410.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221129155214.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221129155214.png new file mode 100644 index 0000000..a874eaf Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221129155214.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221129161036.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221129161036.png new file mode 100644 index 0000000..f19b2f6 Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221129161036.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221208133914.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221208133914.png new file mode 100644 index 0000000..0e2a008 Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221208133914.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221208182151.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221208182151.png new file mode 100644 index 0000000..afbd0ee Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221208182151.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221211145937.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221211145937.png new file mode 100644 index 0000000..91fa1a1 Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221211145937.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221212135426.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221212135426.png new file mode 100644 index 0000000..4456922 Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221212135426.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221212141116.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221212141116.png new file mode 100644 index 0000000..0031091 Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221212141116.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221212141353.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221212141353.png new file mode 100644 index 0000000..ec9c24a Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221212141353.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221212171637.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221212171637.png new file mode 100644 index 0000000..c749e43 Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221212171637.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221217144843.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221217144843.png new file mode 100644 index 0000000..8a89887 Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221217144843.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221217154914.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221217154914.png new file mode 100644 index 0000000..0f50728 Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221217154914.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221218205543.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221218205543.png new file mode 100644 index 0000000..3e2188b Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221218205543.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221218210829.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221218210829.png new file mode 100644 index 0000000..b23103f Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221218210829.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221220153731.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221220153731.png new file mode 100644 index 0000000..f088315 Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221220153731.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221220153821.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221220153821.png new file mode 100644 index 0000000..b937f9b Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221220153821.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221220154008.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221220154008.png new file mode 100644 index 0000000..1847dfc Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20221220154008.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230105170239.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230105170239.png new file mode 100644 index 0000000..f605ad6 Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230105170239.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230105172227.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230105172227.png new file mode 100644 index 0000000..04ef7c2 Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230105172227.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230111145151.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230111145151.png new file mode 100644 index 0000000..90ed5e4 Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230111145151.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230206134648.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230206134648.png new file mode 100644 index 0000000..c441087 Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230206134648.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230214113937.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230214113937.png new file mode 100644 index 0000000..b8135aa Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230214113937.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230214115036.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230214115036.png new file mode 100644 index 0000000..b5fbcce Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230214115036.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230215035805.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230215035805.png new file mode 100644 index 0000000..5f5e0dc Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230215035805.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230215040055.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230215040055.png new file mode 100644 index 0000000..288647a Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230215040055.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230215042855.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230215042855.png new file mode 100644 index 0000000..89b0814 Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230215042855.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230222143135.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230222143135.png new file mode 100644 index 0000000..336e7b7 Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230222143135.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230222143543.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230222143543.png new file mode 100644 index 0000000..89d9ea6 Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230222143543.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230222144148.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230222144148.png new file mode 100644 index 0000000..59bff68 Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230222144148.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230222144804.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230222144804.png new file mode 100644 index 0000000..9d6e6ed Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230222144804.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230224122914.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230224122914.png new file mode 100644 index 0000000..ba96f07 Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230224122914.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230315004917.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230315004917.png new file mode 100644 index 0000000..eb8067e Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230315004917.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230408064712.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230408064712.png new file mode 100644 index 0000000..a512f75 Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230408064712.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230408070410.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230408070410.png new file mode 100644 index 0000000..a512f75 Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230408070410.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230421093843.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230421093843.png new file mode 100644 index 0000000..cd5e04a Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230421093843.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230422215326.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230422215326.png new file mode 100644 index 0000000..82d3cd3 Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230422215326.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230501164740.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230501164740.png new file mode 100644 index 0000000..dff9b45 Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230501164740.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230505201618.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230505201618.png new file mode 100644 index 0000000..f23cd04 Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230505201618.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230505201904.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230505201904.png new file mode 100644 index 0000000..deb8757 Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230505201904.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230505214204.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230505214204.png new file mode 100644 index 0000000..b51d943 Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230505214204.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230517160012.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230517160012.png new file mode 100644 index 0000000..c7117af Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230517160012.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230517165043.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230517165043.png new file mode 100644 index 0000000..9ed6e05 Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230517165043.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230517171306.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230517171306.png new file mode 100644 index 0000000..15e2b2d Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230517171306.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230517172518.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230517172518.png new file mode 100644 index 0000000..dbc9257 Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230517172518.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230517172619.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230517172619.png new file mode 100644 index 0000000..dbc9257 Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230517172619.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230517182829.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230517182829.png new file mode 100644 index 0000000..ea391c8 Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230517182829.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230607184535.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230607184535.png new file mode 100644 index 0000000..19d8f43 Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230607184535.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230607204133.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230607204133.png new file mode 100644 index 0000000..f547bdf Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230607204133.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230610145132.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230610145132.png new file mode 100644 index 0000000..55cad2c Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230610145132.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230619211526.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230619211526.png new file mode 100644 index 0000000..096092c Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230619211526.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230620180623.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230620180623.png new file mode 100644 index 0000000..8043505 Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230620180623.png differ diff --git a/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230624135042.png b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230624135042.png new file mode 100644 index 0000000..068974e Binary files /dev/null and b/Terminal Tips/Shells/Internet/Obsidian/imgFiles/Pasted image 20230624135042.png differ diff --git a/Terminal Tips/Shells/Zsh.md b/Terminal Tips/Shells/Zsh.md new file mode 100644 index 0000000..009d042 --- /dev/null +++ b/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/Terminal Tips/Shells/xonsh/.DS_Store b/Terminal Tips/Shells/xonsh/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/Terminal Tips/Shells/xonsh/.DS_Store differ diff --git a/Terminal Tips/Shells/xonsh/Xonsh.md b/Terminal Tips/Shells/xonsh/Xonsh.md new file mode 100644 index 0000000..72f9cd0 --- /dev/null +++ b/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/Terminal Tips/Shells/xonsh/Xontrib-avox.md b/Terminal Tips/Shells/xonsh/Xontrib-avox.md new file mode 100644 index 0000000..108c256 --- /dev/null +++ b/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/test.txt b/test.txt deleted file mode 100644 index e87e4d2..0000000 --- a/test.txt +++ /dev/null @@ -1 +0,0 @@ -This is a test to see if I can push onto the repo. diff --git a/test2.txt b/test2.txt deleted file mode 100644 index aeeb30d..0000000 --- a/test2.txt +++ /dev/null @@ -1 +0,0 @@ -this is another test to see if i can push from the gdrive