libflac.js
FLAC data stream encoder and decoder compiled in JavaScript using emscripten.
Features
- available as pure JavaScript, JavaScript+binary, JavaScript+WASM
- encode/decode data all-at-once (~ file) or chunk-by-chunk (~ stream)
- supported container formats: native FLAC container (
*.flac
), OGG container (*.ogg
)
For immediate use, the /dist
sub-directory contains the compiled
files for the libflac.js
JavaScript library, as well as a minified version.
Complied from
libFLAC
(staticC
library) version: 1.3.3
Used librarylibogg
(staticC
library) version: 1.3.4
Used compilerEmscripten
version: 1.39.19
Used compilerEmscripten
toolchain: LLVM (upstream)
In order to build libflac.js, make sure you have emscripten installed (with toolchain LLVM/upstream
; default since version 1.39.x).
On running make
, the build process will download the sources for the
FLAC and OGG libraries, extract them, and build the JavaScript version of libflac.
IMPORTANT changes for version
5.x
: simplified naming scheme and library location!
- removed version information from library file names, e.g.
libflac4-1.3.2.min.js -> libflac.min.js
- moved all library files directly into
dist/
, i.e. there are no sub-directoriesdist/min/
anddist/dev/
anymore
Encoder Demo
Try the Encoding Demo for encoding *.wav
files to FLAC.
Or try the speech-to-flac demo that encodes the audio stream from a microphone to FLAC.
Decoder Demo
Try the Decoding Demo for decoding *.flac
files to *.wav
files.
TODO example for decoding a FLAC audio stream (i.e. where data/size is not known beforehand).
API Documentation
See doc/index.html for the API documentation.
- Usage
- Building
- Contributors
- Acknowledgments
- License
Usage
Including libflac.js
Browser
Include the library file, e.g. if library file(s) libflac.js
is in the same
directory as the referencing HTML file:
<script src="libflac.js" type="text/javascript"></script>
WebWorker
Import the library file, e.g. if library file(s) libflac.js
is in the same
directory as the referencing worker script file:
importScripts('libflac.js');
Node
In Node.js
:
install with npm
# install from npm
npm install --save libflacjs
# install latest from master branch
npm install --save git+https://github.com/mmig/libflac.js.git
then, use factory method for loading one of the library variants:
//load default/release asm.js variant:
var Flac = require('libflacjs')();
// use one of the optimization-variants:
// * <empty> / "release"
// * "min"
// * "dev"
// use one of the technology-variants:
// * <empty> / "asmjs"
// * "wasm"
//
// can be combined with dot, e.g. "min.wasm":
var FlacFactory = require('libflacjs');
var Flac = FlacFactory('min.wasm');
Flac.on('ready', function(event){
...
Alternatively, instead of loading via the factory method, the library variants
can also be require
d directly:
// for example:
var Flac = require('libflacjs/dist/libflac.js');
// or
var Flac = require('libflacjs/dist/libflac.wasm.js');
React/webpack
For reactjs
:
install with npm
(see above), and require()
the library file directly, like
// for example:
var Flac = require('libflacjs/dist/libflac.js');
// or
var Flac = require('libflacjs/dist/libflac.wasm.js');
NOTE
min
andwasm
variants will most likely require additional configuration of the build system, see also section aboutwebpack
integration
Angular/webpack
For Angular
(TypeScript
):
install with npm
(see above), and import
the library file directly, like
// for example:
import * as Flac from 'libflacjs/dist/libflac';
// or
import * as Flac from 'libflacjs/dist/libflac.wasm';
NOTE unfortunately, current typings do not allow to set Flac.onready
when imported this way.
This limitation can be worked around by casting to any
, i.e.
(Flac.onready as any) = (evt: Flac.ReadyEvent) => console.log('Flac is ready now: ', evt.target);
Or use Flac.on('ready', ...
instead, or import with require
statement, e.g. like
import * as FlacModule from 'libflacjs/dist/index.d';//import declaration file for typings
declare var require: Function;//NOTE most likely, the require function needs to be explicitly declared, if other envorinments than node are targeted
const Flac: typeof FlacModule = require('libflacjs/dist/libflac.js');
NOTE
min
andwasm
variants will most likely require additional configuration of the build system, see also section about asyncwebpack
integration
WebWorker with webpack
When using libflac.js
from a WebWorker in a webpack
project, the worker-loader
plugin is required, e.g. install with
npm install --save-dev worker-loader
Then include a rule in the webpack
configuration, so that the file with the WebWorker
implementation will be built as a seperate script:
in the module.rules
array add an entry, e.g. if the file name is flacworker.js
something similar to
{
//this must match the file-name of the worker script:
test: /\bflacworker\.js$/i,
use: {
loader: 'worker-loader',
options: { name: 'worker-[name].[hash].js' }
}
},
See section Async Initialization with webpack
for additional details, in case the included library variant includes a binary or *.wasm
file.
Then for creating the WebWorker instance use something like
// var flacWorker = new Worker('flacworker.js'); //<- normal way to create a WebWorker instance
var flacWorker = require('./flacworker.js')(); //<- create a WebWorker instance with webpack worker-loader plugin
flacWorker.onmessage = function(event) {
console.log('received message from flacWorker ', event.data);
}
flacWorker.postMessage(...
In the WebWorker script itself, do load the libflac.js
library like
//importScripts('libflac.js');//<- normal way to load a script within a WebWorker
// for including a "single file variant" of libflac.js, e.g. the standard version:
var Flac = require('libflacjs/dist/libflac.js');
// OR for including a .wasm variant, e.g standard-wasm (for binary of min-version include its *.mem file):
require.resolve('libflacjs/dist/libflac.wasm.wasm') // <- force webpack to include the binary file
var Flac = require('libflacjs/dist/libflac.wasm.js')
self.onmessage = function(event) {
console.log('received message from main thread ', event.data);
}
Async Initialization
Including dynamically loaded libflac.js
:
Some variants of the libflac.js
library are loaded asynchronously
(e.g. minimized/optimized variants may load a separate binary file during initialization of the library).
In this case, you have to make sure, not to use libflac.js
before it has been completely loaded / initialized.
Code example:
//either use Flac.on() or set handler Flac.onready:
Flac.on('ready', function(event){
var libFlac = event.target;
//NOTE: Flac === libFlac
//execute code that uses libflac.js:
someFunctionForProcessingFLAC();
};
//... or set handler
Flac.onready = function(event){
var libFlac = event.target;
//NOTE: Flac === libFlac
//execute code that uses libflac.js:
someFunctionForProcessingFLAC();
};
// IMPORTANT: if execution environment does not support Object.defineProperty, then
// setting the handler will have no effect, if Flac is already initialized.
// In this case, the ready-state needs to be checked, and if already TRUE,
// the handler-code should be triggered immediately insteady of setting
// the handler.
if( !Flac.isReady() ){
Flac.onready = function(event){
var libFlac = event.target;
//NOTE: Flac === libFlac
//call function that uses libflac.js:
someFunctionForProcessingFLAC();
};
} else {
//execute code that uses libflac.js:
someFunctionForProcessingFLAC();
}
NOTE: If Object.defineProperty()
is not supported in the execution environment,
then the onready()
handler will not be called, when the library already
has been initialized before assigning it to Flac.onready
(i.e. when
Flac.isReady()
returns true
).
In this case, you should check Flac.isReady()
and provide alternative code
execution to the onready()
function, in case Flac.isReady()
is true
(or use Flac.on('ready', ...)
instead).
Including Dynamically Loaded libflac.js from Non-Default Location
Variants of the libflac.js
library that are loaded asynchronously do usually also load some additional files.
If the library-file is not loaded from the default location ("page root"), but from a sub-directory/-path, you need to let the library know, so that it searches for the additional files, that it needs to load, in that sub-directory/-path.
For this, the path/location must be stored in the global variable FLAC_SCRIPT_LOCATION
before the libflac.js
library is loaded.
If FLAC_SCRIPT_LOCATION
is given as string
, it specifies the path to the libflac.js
files (see examples below), e.g.
//location example as string:
FLAC_SCRIPT_LOCATION = 'libs/';
Note, that the path/location should end with a slash ("/"
), e.g. 'some/path/'
(however, the library will try to automatically add a slash, if it is missing).
If FLAC_SCRIPT_LOCATION
is given as an object, it specifies mappings of the file-names to the file-paths of the libflac.js
files (see examples below), e.g.
//location example as object/mapping:
FLAC_SCRIPT_LOCATION = {
'libflac.min.js.mem': 'libs/flac.mem'
};
An example for specifying the path/location at libs/
in an HTML file:
<script type="text/javascript">window.FLAC_SCRIPT_LOCATION = 'libs/';</script>
<script src="libs/libflac.js" type="text/javascript"></script>
Or example for specifying the path/location at libs/
in a WebWorker script:
self.FLAC_SCRIPT_LOCATION = 'libs/';
importScripts('libs/libflac.js');
Or example for specifying the path/location at libs/
in Node.js script:
process.env.FLAC_SCRIPT_LOCATION = './libs/';
var Flac = require('./libs/libflac.js');
NOTE: setting
FLAC_UMD_MODE
has no effect since v5.0.1: automatic export to global namespace has been dropped in case of loading as AMD or CommonJS module, i.e. settingprocess.env.FLAC_UMD_MODE = true
when running in Node.js will have no effect anymore, instead export manually to global namespace, e.g. withglobal.Flac = require('libflacjs')()
.
Example for specifying custom path and file-name via mapping (originalFileName -> <newPath/newFileName>
):
in this case, the file-name(s) of the additionally required files (e.g. *.mem
or .wasm
files)
need to be mapped to the custom path/file-name(s), that is,
for all the required files of the used library variant (see details below).
self.FLAC_SCRIPT_LOCATION = {
'libflac.min.js.mem': 'libs/flac.mem'
};
importScripts('libs/flac.min.js');
Async Initialization with webpack
When using libflac.js
in a webpack
build process and a library variant with binary files
(e.g. min variant with *.mem
files or wasm variant with *.wasm
files) is targeted,
then the file-loader
plugin for webpack
is required, e.g. install with
npm install --save-dev file-loader
Then include a rule in the webpack
configuration, so that the file with the binary files will be included with the correct file names that libflac.js
expects:
in the module.rules
array add an entry, e.g. if the file name is flacworker.js
something similar to
{
test: /\.(wasm|mem)$/i,
use: {
loader: 'file-loader',
options: {
//NOTE binary file must be included with its original file name,
// so that libflac.js lib can find it:
name: function(file) {
return path.basename(file)
}
}
},
},
Alterantively to using the exact file name of the binary files, FLAC_SCRIPT_LOCATION
could be configured to use the file name generated by file-loader
plugin, see details above for configuring FLAC_SCRIPT_LOCATION
Library Variants
default vs min
vs dev
There are multiple variants available for the library, that are compiled with different
settings for debug-output and code optimization, namely debug
, min
, and the
default (release) library variants.
asm.js
vs WASM
In addition, for each of these variants, there is now a wasm
variant (WebAssembly) available:
the old/default variants are compiled for asm.js
which is "normal" JavaScript, with some
optimizations that browsers can take advantage of by specifically supporting asm.js
(e.g. FireFox).
(from the Emscripten documentation)
WebAssembly is a new binary format for executing code on the web, allowing much faster start times (smaller download, much faster parsing in browsers)
In short, the (old) asm.js
is backwards compatible, since it is simply JavaScript
(and browsers that specifically support it, can execute it optimized/more efficiently),
while the new WebAssembly
format requires more recent/modern browsers, but is generally
more efficient with regard to code size and execution time.
Example WASM
Feature Detection
simple detection of WASM
support in browser:
var Flac;
if(typeof WebAssembly === 'object' && WebAssembly){
//load wasm-based library
Flac = require('libflac.min.wasm.js');
//or, for example, in worker script: importScripts('libflac.min.wasm.js');
} else {
//load asm.js-based library
Flac = require('libflac.min.js');
//or, for example, in worker script: importScripts('libflac.min.js');
}
Variants and Notes
NOTE the
WebAssembly
variant does not create/encode "binary-perfect" FLAC files compared to the other library variants, or compared to the FLAC command-line tool.
More specifically, comparing the encoding results byte-by-byte with encoding results from theasm.js
variants, or separately encoded data using the FLAC command-line tool, results are different for theWebAssembly
variant. However, the reverse operation, decoding these "binary-different" FLAC files (usingWebAssembly
, orasm.js
or the command-line tool) results in the same WAV data again.
It seems, theWebAssembly
variant chooses different frame-sizes while encoding; e.g. the max. frame-size may differ from when encoding with theasm.js
variant or with the command-line tool.
NOTES for dynamically loaded library variants:
- the corresponding required files must be included in the same directory as the library/JavaScript file
- the additional required files file must not be renamed (or the library/JavaScript file must be edited accordingly)
- see also the section above for handling dynamically loaded library variants, and, if appropriate, the section for including dynamically loaded libraries from a sub-path/location
Default Library:
(see /dist
)
- ASM.js Variant:
libflac.js
- WebAssembly variant (dynamically loaded):
libflac.wasm.js
libflac.wasm.wasm
(required; will be loaded by the library)libflac.wasm.js.symbols
(optional; contains renaming information)
Minified Library:
(see /dist
)
- ASM.js Variant (dynamically loaded):
libflac.min.js
libflac.min.js.mem
(required; will be loaded by the library)libflac.min.js.symbols
(optional; contains renaming information)
- WebAssembly variant (dynamically loaded):
libflac.min.wasm.js
libflac.min.wasm.wasm
(required; will be loaded by the library)libflac.min.wasm.js.symbols
(optional; contains renaming information)
Development Library:
(see /dist
)
- ASM.js Variant:
libflac.dev.js
currently not supported by LLVM toolchainlibflac.dev.js.map
(optional; mapping to C code)libflac.dev.js.symbols
(optional; contains renaming information)
- WebAssembly variant (dynamically loaded):
libflac.dev.wasm.js
libflac.dev.wasm.wasm
(required; will be loaded by the library)libflac.dev.wasm.js.map
(optional; mapping to C code)
Encoding with libflac.js
Generally, libflac.js
supports a subset of the libflac encoding interface for encoding audio data to FLAC (no full support yet!).
Supported encoding types:
- encode from
PCM
data all-at-once - encode from
PCM
data chunk-by-chunk (i.e. streaming)
Supported target containers:
- native
FLAC
container OGG
transport container
See example/encode.html for a small example,
on how to encode a WAV
file.
For a larger example on how to encode audio data from the microphone see the Speech to FLAC example.
Basic steps for encoding:
- create encoder
- specify encoding parameters, like channels, sampling rate, compression level etc.
- initialize encoder
- for native FLAC container or OGG container
- specify write callback and/or other optional callback(s)
- encode data (chunks)
- finish encoding
- delete encoder
Encoding Example
Encoding example using the utility class Encoder
const Flac = require('libflacjs')();
//or as import (see section "Including libflac.js" for more details):
// import * as flacFactory from 'libflacjs';
// const Flac = flacFactory();
const Encoder = require('libflacjs/lib/encoder').Encoder;
//or as import:
//import { Encoder } from 'libflacjs/lib/encoder';
//helper function for converting interleaved audio to list of channel-audio
//(for actual code, see example in tools/test/util/utils-enc.ts):
// function deinterleave(Int32Array, channels) => Int32Array[]
//NOTE if async-library variant is used, should wait for initialization:
//Flac.onready(function(){ ...
const data = new Int32Array(someAudioData);//<- someAudioData: PCM audio data converted to Int32Array samples
const encodingMode = 'interleaved';// "interleaved" | "channels"
const encoder = new Encoder(flac, {
sampleRate: sampleRate, // number, e.g. 44100
channels: channels, // number, e.g. 1 (mono), 2 (stereo), ...
bitsPerSample: bitsPerSample, // number, e.g. 8 or 16 or 24
compression: compressionLevel, // number, value between [0, 8] from low to high compression
verify: true // boolean (OPTIONAL)
isOgg: false // boolean (OPTIONAL), if encode FLAC should be wrapped in OGG container
});
if(encodingMode === 'interleaved'){
//encode interleaved audio data (call multiple times for multiple audio chunks, i.e. "streaming")
encoder.encode(data);
//NOTE if data is TypedArray other than Int32Array then optional argument numberOfSamples MUST be given:
//encoder.encode(data, numberOfSamples);
} else {
//de-interleave data into channels-array
// i.e. a list/array of Int32Arrays (list.length corresponds to channels)
const list = deinterleave(data, channels);// returns an Int32Array which's length corresponds to channels
//do encode to FLAC (call multiple times for multiple audio chunks, i.e. "streaming")
encoder.encode(list);
//NOTE if data was TypedArray other than Int32Array then optional argument numberOfSamples MUST be given:
//encoder.encode(list, numberOfSamples);
}
encoder.encode();
const encData = encoder.getSamples();
const metadata = encoder.metadata;
encoder.destroy();
// or encoder.reset() for reusing the encoder instance
// -> do something with the encoded FLAC data encData and metadata
Barebones Encoding Example
Encoding example using the library functions directly
//prerequisite: loaded libflac.js & available via variable Flac
//NOTE if async-library variant is used, should wait for initialization:
//Flac.onready(function(){ ...
var flac_encoder,
CHANNELS = 1,
SAMPLERATE = 44100,
COMPRESSION = 5,
BPS = 16,
VERIFY = false,
BLOCK_SIZE = 0,
flac_ok = 1,
USE_OGG = false;
////////
// [1] CREATE -> IN param: config { ... } (encoding parameters)
//overwrite default configuration from config object
COMPRESSION = config.compression;
BPS = config.bps;
SAMPLERATE = config.samplerate;
CHANNELS = config.channels;
VERIFY = config.isVerify;//verification can be disabled for speeding up encoding process
BLOCK_SIZE = config.blockSize;
USE_OGG = config.useOgg;
//init encoder
flac_encoder = Flac.create_libflac_encoder(SAMPLERATE, CHANNELS, BPS, COMPRESSION, 0, VERIFY, BLOCK_SIZE);
if (flac_encoder == 0){
return;
}
////////
// [2] INIT -> OUT: encBuffer (encoded data), metaData (OPTIONALLY, FLAC metadata)
//for storing the encoded FLAC data
var encBuffer = [];
//for storing the encoding FLAC metadata summary
var metaData;
// [2] (a) setup writing (encoded) output data
var write_callback_fn = function(encodedData /*Uint8Array*/, bytes, samples, current_frame){
//store all encoded data "pieces" into a buffer
encBuffer.push(encodedData);
};
// [2] (b) optional callback for receiving metadata
function metadata_callback_fn(data){
// data -> [example] {
// min_blocksize: 4096,
// max_blocksize: 4096,
// min_framesize: 14,
// max_framesize: 5408,
// sampleRate: 44100,
// channels: 2,
// bitsPerSample: 16,
// total_samples: 267776,
// md5sum: "50d4d469448e5ea75eb44ab6b7f111f4"
//}
console.info('meta data: ', data);
metaData = data;
}
// [2] (c) initialize to either write to native-FALC or to OGG container
var status_encoder;
if(!USE_OGG){
// encode to native FLAC container
status_encoder = Flac.init_encoder_stream(flac_encoder,
write_callback_fn, //required callback(s)
metadata_callback_fn //optional callback(s)
);
} else {
// encode to OGG container
status_encoder = Flac.init_encoder_ogg_stream(flac_encoder,
write_callback_fn, //required callback(s)
metadata_callback_fn //optional callback(s)
);
}
flac_ok &= (status_encoder == 0);
////////
// [3] ENCODE -> IN: for this example, a PCM Float32 audio, single channel (mono) stream
// buffer (Float32Array)
// ... repeat encoding step [3] as often as necessary
//convert input data to signed int data, in correspondence to the bps setting (i.e. in this case int32)
// see API docs on FLAC__stream_encoder_process_interleaved() for more details
var buf_length = buffer.length;
var buffer_i32 = new Int32Array(buf_length);
var view = new DataView(buffer_i32.buffer);
var volume = 1;
var index = 0;
for (var i = 0; i < buf_length; i++){
view.setInt32(index, (buffer[i] * (0x7FFF * volume)), true);
index += 4;
}
var flac_return = Flac.FLAC__stream_encoder_process_interleaved(flac_encoder, buffer_i32, buf_length);
if (flac_return != true){
console.log("Error: FLAC__stream_encoder_process_interleaved returned false. " + flac_return);
}
// encoding mode: either interleaved samples or array of channel-samples
var mode = 'interleaved';// "interleaved" | "channels"
// do encode the audio data ...
var flac_return;
if(mode === 'interleaved'){
//VARIANT 1: encode interleaved channels: TypedArray -> [ch1_sample1, ch2_sample1, ch1_sample1, ch2_sample2, ch2_sample3, ...
flac_return = Flac.FLAC__stream_encoder_process_interleaved(flac_encoder, buffer_i32, buf_length);
} else {
//VARIANT 2: encode channels array: TypedArray[] -> [ [ch1_sample1, ch1_sample2, ch1_sample3, ...], [ch2_sample1, ch2_sample2, ch2_sample3, ...], ...]
//code example for splitting an interleaved Int32Array into its channels:
var ch_buf_i32 = new Array(CHANNELS).fill(null).map(function(){ return new Uint32Array(buf_length/CHANNELS); });
for(var i=0; i < buf_length; i += CHANNELS){
for(var j=0; j < CHANNELS; ++j){
ch_buf_i32[j][i / CHANNELS] = buffer_i32[i + j];
}
}
// ... encode the array of channel-data:
flac_return = Flac.FLAC__stream_encoder_process(flac_encoder, ch_buf_i32, buf_length / CHANNELS);
}
////////
// [4] FINISH ENCODING
flac_ok &= Flac.FLAC__stream_encoder_finish(flac_encoder);
console.log("flac finish: " + flac_ok);
////////
// [5] DESTROY: delete encoder
//after usage: free up all resources for the encoder
Flac.FLAC__stream_encoder_delete(flac_encoder);
////////
// [6] ... do something with the encoded data, e.g.
// merge "encoded pieces" in encBuffer into one single Uint8Array...
Decoding with libflac.js
Generally, libflac.js
supports a subset of the libflac decoding interface for decoding audio data from FLAC (no full support yet!).
Supported decoding types:
- decode from
FLAC
data toPCM
data all-at-once - decode from
FLAC
data toPCM
chunk-by-chunk (i.e. streaming)
Supported source containers:
- native
FLAC
container OGG
transport container
See example/decode.html for a small example,
on how to decode a FLAC
file.
Basic steps for decoding:
- create decoder
- specify if checksum verification should be processed
- initialize decoder
- specify if source is native FLAC container or OGG container
- specify read and write callback and/or other optional callback(s)
- start decoding data (chunks)
- finish decoding
- delete decoder
Decoding Example
Decoding example using the utility class Decoder
const Flac = require('libflacjs')();
//or as import (see section "Including libflac.js" for more details):
// import * as flacFactory from 'libflacjs';
// const Flac = flacFactory();
const Decoder = require('libflacjs/lib/decoder').Decoder;
//or as import:
//import { Decoder } from 'libflacjs/lib/decoder';
//NOTE if async-library variant is used, should wait for initialization:
//Flac.onready(function(){ ...
const binData = new Uint8Array(someFlacData);// <- someFlacData: binary FLAC data
const decodingMode = 'single';// "single" | "chunked"
const decoder = new Decoder(Flac, {
verify: true // boolean (OPTIONAL)
isOgg: false // boolean (OPTIONAL), if FLAC audio is wrapped in OGG container
});
if(decodingMode === 'single'){
//use as-single-chunk mode: invokce decode once with the complete FLAC data
decoder.decode(binData);
} else {
//use multiple-chunks mode ("streaming"): invoke decodeChunk(...) for each chunk...
decoder.decodeChunk(binData);
//... and finalize decoding by invoking decodeChunk() without arguments
decoder.decodeChunk();
}
const decData = decoder.getSamples(/* return interleaved samples? */ true);// <- returns Uint8Array
//or: non-interleaved samples, i.e. array of channels data:
// const decData = decoder.getSamples(false);// <- returns Uint8Array[]
const metadata = decoder.metadata;
decoder.destroy();
// or decoder.reset() for reusing the decoder instance
// -> do something with the decoded PCM audio data decData and metadata
Barebones Decoding Example
Decoding example using the library functions directly
//prerequisite: loaded libflac.js & available via variable Flac
//NOTE if async-library variant is used, should wait for initialization:
//Flac.onready(function(){ ...
var VERIFY = true,
USE_OGG = false;
////////
// [1] CREATE -> IN: config { ... } (decoding parameters)
//overwrite default configuration from config object
VERIFY = config.isVerify;//verification can be disabled for speeding up decoding process
//decode from native FLAC container or from OGG container
USE_OGG = config.isOgg;
// create decoder
var flac_decoder = Flac.create_libflac_decoder(VERIFY);
if (flac_decoder == 0){
return;
}
////////
// [2] INIT -> OUT: decBuffer (decoded data), metaData (OPTIONALLY, FLAC metadata)
// IN: flacData Uint8Array (FLAC data)
// [2] (a) setup reading input data
var currentDataOffset = 0;
var size = flacData.buffer.byteLength;
//function that will be called for reading the input (FLAC) data:
function read_callback_fn(bufferSize){
var end = currentDataOffset === size? -1 : Math.min(currentDataOffset + bufferSize, size);
var _buffer;
var numberOfReadBytes;
if(end !== -1){
_buffer = flacData.subarray(currentDataOffset, end);
numberOfReadBytes = end - currentDataOffset;
currentDataOffset = end;
} else {
//nothing left to read: return zero read bytes (indicates end-of-stream)
numberOfReadBytes = 0;
}
return {buffer: _buffer, readDataLength: numberOfReadBytes, error: false};
}
// [2] (b) setup writing (decoded) output data
//for "buffering" the decoded data:
var decBuffer = [];
//for storing the decoded FLAC metadata
var metaData;
//function that will be called for decoded output data (WAV audio)
function write_callback_fn(channelsBuffer, frameHeader){
// channelsBuffer is an Array of the decoded audio data (Uint8Array):
// the length of array corresponds to the channels, i.e. there is an Uint8Array for each channel
// frameHeader -> [example] {
// bitsPerSample: 8
// blocksize: 4096
// channelAssignment: 0
// channels: 2
// crc: 0
// number: 204800
// numberType: "samples"
// sampleRate: 44100
// subframes: undefined // -> needs to be enabled via
// // Flac.setOptions(flac_decoder, {analyseSubframes: true})
// // -> see API documentation
//}
decBuffer.push(channelsBuffer);
}
// [2] (c) optional callbacks for receiving details about errors and/or metadata
function error_callback_fn(err, errMsg, client_data){
console.error('decode error callback', err, errMsg);
}
function metadata_callback_fn(data){
// data -> [example] {
// min_blocksize: 4096,
// max_blocksize: 4096,
// min_framesize: 14,
// max_framesize: 5408,
// sampleRate: 44100,
// channels: 2,
// bitsPerSample: 16,
// total_samples: 267776,
// md5sum: "50d4d469448e5ea75eb44ab6b7f111f4"
//}
console.info('meta data: ', data);
metaData = data;
}
// [2] (d) intialize for reading from native-FLAC or from OGG container
var flac_ok = 1;
var status_decoder;
if(!USE_OGG){
// decode from native FLAC container
status_decoder = Flac.init_decoder_stream(
flac_decoder,
read_callback_fn, write_callback_fn, //required callback(s)
error_callback_fn, metadata_callback_fn //optional callback(s)
);
} else {
// decode from OGG container
status_decoder = Flac.init_decoder_ogg_stream(
flac_decoder,
read_callback_fn, write_callback_fn, //required callback(s)
error_callback_fn, metadata_callback_fn //optional callback(s)
);
}
flac_ok &= status_decoder == 0;
if(flac_ok != 1){
return;
}
////////
// [3] DECODE -> IN: FLAC audio data (see above, the read-callack)
// ... repeat encoding step [3] as often as necessary
// example for chunk-by-chunk (stream mode) or all-at-once decoding (file mode)
var mode = 'stream';// 'stream' | 'file'
var state = 0;
var flac_return = 1;
if(mode == 'stream'){
// VARIANT 1: decode chunks of flac data, one-by-one
//request to decode data chunks until end-of-stream is reached:
while(state <= 3 && flac_return != false){
flac_return &= Flac.FLAC__stream_decoder_process_single(flac_decoder);
state = Flac.FLAC__stream_decoder_get_state(flac_decoder);
}
flac_ok &= flac_return != false;
} else if(mode == 'file'){
// VARIANT 2: decode complete data stream, all-at-once
flac_return &= Flac.FLAC__stream_decoder_process_until_end_of_stream(flac_decoder);
//optionally: retrieve status
state = Flac.FLAC__stream_decoder_get_state(flac_decoder);
}
if (flac_return != true){
return;
}
////////
// [4] FINISH DECODING
// finish Decoding
flac_ok &= Flac.FLAC__stream_decoder_finish(flac_decoder);
////////
// [5] DESTROY: delete dencoder
// alternatively reset the decoder, and then re-initialize for re-using the decoder instance
//after usage: free up all resources for the decoder
Flac.FLAC__stream_decoder_delete(flac_decoder);
////////
// [6] ... do something with the decoded data, e.g.
// merge "decoded pieces" in decBuffer into a single data stream and add WAV header...
Decoding Metadata Example
Example for extracting the metadata while decoding FALC audio
// prerequisites: loaded & initialized Flac library
//... create decoder flacDecoder (see code examples above)
//enable all metadata types:
Flac.FLAC__stream_decoder_set_metadata_respond_all(flacDecoder);
//or enable only seek table metadata:
Flac.FLAC__stream_decoder_set_metadata_respond(flacDecoder, 3);
// example seek table metadata (see docs for details):
// {
// num_points: 1,
// points: [{
// frame_samples: 4096,
// sample_number: 0,
// stream_offset: 0
// }]
// }
//or enable only vorbis comment metadata:
Flac.FLAC__stream_decoder_set_metadata_respond(flacDecoder, 4);
// example vorbis comment metadata:
// {
// comments: ["TRACKNUMBER=2/9"],
// entry: "reference libFLAC 1.3.3 20190804",
// num_comments: 1
// }
//or enable only cue sheet metadata:
Flac.FLAC__stream_decoder_set_metadata_respond(flacDecoder, 5);
// example cue sheet metadata (see docs for details):
// {
// is_cd: 0,
// lead_in: 88200,
// media_catalog_number: "1234567890123",
// num_tracks: 2,
// tracks: [{
// isrc: "",
// num_indices: 1,
// indices: [{offset: 0, number: 1}],
// number: 1,
// offset: 0,
// pre_emphasis: false,
// type: "AUDIO"
// }, {
// isrc: "",
// num_indices: 0,
// indices: [],
// number: 170,
// offset: 267776,
// pre_emphasis: false,
// type: "AUDIO"
// }]
// }
//or enable only all picture metadata:
Flac.FLAC__stream_decoder_set_metadata_respond(flacDecoder, 6);
// example vorbis comment metadata:
{
type: 3, // image type (see docs FLAC__StreamMetadata_Picture_Type)
mime_type: "image/jpeg", //the mime type
description: "Cover image for the track",
width: 1144, // the image width in pixel
height: 1144, // the image height in pixel
depth: 24, // the depth in bits
colors: 0, // colors (e.g. for GIF images)
data_length: 45496, // the size of the binary image data (in bytes)
data: Uint8Array // the binary image data
}
//the metadata callback which stores the metadata in a list:
var streamMetadata, metadataList = [];
function metadata_callback_fn(data, dataBlock){
if(data){
// the stream metadata:
streamMetadata = data;
} else {
// other metadata types:
metadataList.push(dataBlock);
// dataBlock[example]:
// {
// data: METADATA, // the metadata, e.g. stream info, seek table, vorbis comment, picture,...
// isLast: 0, // wether the metadata block is the last block befor the audio data
// length: 1032, // the length/size of the metadata (in byte)
// type: 4, // metadata type, [0, 6] (higher metadata types are as of yet UNKNOWN)
// }
}
}
//... initilize decoder flacDecoder with metadata_callback_fn,
// and decode flac data (see code examples above)
API
See the doc/index.html for the API documentation.
Building
Building libflac.js requires that emscripten is installed and configured.
See the emscripten documentation and its main site for an introduction, tutorials etc.
For changing the targeted libflac version, modify the Makefile
:
...
FLAC_VERSION:=1.3.2
...
Build *nix (libflac 1.3.0 or later)
If necessary, activate the appropriate emscripten
toolchain (e.g. llvm
or the older fastcomp
toolchain; default is llvm
)
# list versions
emsdk list
# activate a specific version with llvm toolchain
# NOTE update Makefile if necessary with selected toolchain
# TOOL_CHAIN:=$(TOOL_CHAIN_LLVM)
emsdk activate <version>
# activate a specific version with fastcomp toolchain
# NOTE update Makefile if necessary with selected toolchain
# TOOL_CHAIN:=$(TOOL_CHAIN_FASTCOMP)
emsdk activate <version>-fastcomp
NOTE when activating a toolchain,
emsdk
will print some information on how to set the correct enviornment variables, e.g.... To conveniently access the selected set of tools from the command line, consider adding the following directories to PATH, or call 'source <path>/emsc/emsdk_env.sh' to do this for you. ...
even when not changing a toolset via
emsdk activate ...
you may need to update/export the variables for the emsdk toolchain
Start build process by executing the Makefile
:
make
(build process was tested on Unbuntu 18.04)
Changing The Library API
The API for libflac.js (e.g. exported functions) are mainly specified in libflac_post.js
.
Functions that will be exported/used from the native libflac
implementation need to be declared in
the compile option -s EXPORTED_FUNCTIONS='[...]'
(see variable EMCC_OPTS:=...
in Makefile
);
note, when manually editing EXPORTED_FUNCTIONS
, that the function-names must be prefixed with _
, i.e. for
function the_function
, the string for the exported function would be _the_function
.
There is a helper script that will try to extract the compile option from libflac_post.js
(i.e. the list of functions that need to be declared).
Run the script with Node.js
in tools/
(and copy&paste the output value):
cd tools
node extract_EXPORTED_FUNCTIONS.js
IMPORTANT: the helper script extracts function names that are invoked by Module.ccall()
or Module.cwrap()
.
If invoked dynamically (i.e. use of variable instead of string), add a DEV comment
where the function is explicitly stated as string, e.g.
//DEV comment for exported-functions script:
// Module.ccall('FLAC__stream_decoder_init_stream'
// Module.ccall('FLAC__stream_decoder_init_ogg_stream'
var func_name = test? 'FLAC__stream_decoder_init_stream' : 'FLAC__stream_decoder_init_ogg_stream';
Module.ccall(
func_name,
Legacy Build Instructions
For more details and/or build instructions for older libflac.js
versions, see
CHANGELOG.md
Contributors
See CONTRIBUTORS
for list of contributors.
Acknowledgments
This project was inspired by Krennmair's libmp3lame-js project for JS mp3 encoding.
License
libflac.js is compiled from the reference implementation of FLAC (BSD license); the additional resources and wrapper-code of this project is published under the MIT license (see file LICENSE).


At ARSTECH we are a very committed team of HVAC professionals who have a decade of meticulous experience. We specialise
in end-to-end solutions in HVAC systems as per customer specifications. ARSTECH strives to consistently meet
the increasing demand for quality and service for each and every project that we undertake. We have been the
best solution for many, ranging from high efficiency central AC systems to single room fixtures. Our experienced
professionals not only capture your need but also design efficient solutions and implement them successfully.
We are not done here, we confirm our customer’s satisfaction to its full capacity and provide our extended services
as and how required.
PRODUCTS
High Wall Splits
Ceiling Suspended Cassette
Tower
Ductable
Commercial Ventilation systems
Centralised AC systems
Services
ARSTECH is in the HVAC field since 2011. We have a highly efficient in-house team for ‘Design, Execution, Installation
and even Maintenance of HVAC systems’. We believe and specialise in providing end-to-end solutions in HVAC such
as VRV’s, Duct systems, Ventilations etc.
Maintenance & Servicing
Splits, Cassette’s, Ducted AC, Package Unit, VRV & Chillers and Multibrand ACs of varied Tonnage
AMC for HVAC
Comprehensive, Non comprehensive, and Labour only.
Plant Audit
Upgrades and replacement advice
Benefits
Many benefits can be achieved through regular routine maintenance and a comprehensive plant inspection. Such benefits
are Reduced downtime Lower running cost Increased longevity of your equipment.
Contact Us
High Wall Splits
Also known as a Portable split system has an indoor unit on wheels connected to an outdoor unit via flexible
pipes, similar to a permanently fixed installed unit.
Treehouse is a free PSD web template built by Mathavan Jaya.
This is bright and spacious design perfect for people or startup companies looking to showcase their apps
or other projects.
You can download the PSD template in this portfolio sample item at FreebiesXpress.com.
Project Name
Lorem ipsum dolor sit amet consectetur.
Start Bootstrap's Agency theme is based on Golden, a free PSD website template built by Mathavan Jaya.
Golden is a modern and clean one page web template that was made exclusively for Best PSD Freebies. This
template has a great portfolio, timeline, and meet your team sections that can be easily modified to fit
your needs.
You can download the PSD template in this portfolio sample item at FreebiesXpress.com.
Project Name
Lorem ipsum dolor sit amet consectetur.
Escape is a free PSD web template built by Mathavan Jaya.
Escape is a one page web template that was designed with agencies in mind. This template is ideal for those
looking for a simple one page solution to describe your business and offer your services.
You can download the PSD template in this portfolio sample item at FreebiesXpress.com.
Project Name
Lorem ipsum dolor sit amet consectetur.
Dreams is a free PSD web template built by Mathavan Jaya.
Dreams is a modern one page web template designed for almost any purpose. It’s a beautiful template that’s
designed with the Bootstrap framework in mind.
You can download the PSD template in this portfolio sample item at FreebiesXpress.com.


isambard.ampal.pdb_parser module¶
Contains code for parsing PDB files.
-
class
PDBColFormat
(**kwargs)[source]¶ Bases:
sqlalchemy.ext.declarative.api.Base
Database handler for ampal_database.py.
-
atom_col
¶
-
atom_name
¶
-
id
¶
-
-
class
PdbParser
(pdb, path=True, pdb_id='', ignore_end=False)[source]¶ Bases:
object
Parses a PDB file and produces and AMPAL Assembly.
Parameters: - pdb (str) – Either a path to a PDB file or a string containing PDB format structural data.
- path (bool, optional) – If true, flags pdb as a path and not a PDB string.
- pdb_id (str, optional) – Identifier for the Assembly.
- ignore_end (bool, optional) – If false, parsing of the file will stop when an “END” record is encountered.
-
proc_functions
¶ dict – Keys are PDB labels i.e. “ATOM” or “END”, values are the function that processes that specific line.
-
id
¶ str – Identifier for the Assembly.
-
pdb_lines
¶ [str] – Input PDB split into line.
-
new_labels
¶ bool – Indicates if new atom or residue labels have been found while parsing the PDB file.
-
state
¶ int – Current state being appended to. This is used on multi-state files like NMR structures.
-
pdb_parse_tree
¶ dict – This dictionary represents the parse tree of the PDB file. Each line of the structure is broken down into a key, the entry label, and a value, the data.
-
current_line
¶ int – The line that is currently being parsed.
-
ignore_end
¶ bool, optional – If false, parsing of the file will stop when an “END” record is encountered.
-
gen_states
(monomer_data, parent)[source]¶ Generates the states dictionary for a Monomer.
- monomer_data : list
- A list of atom data parsed from the input PDB.
- parent : ampal.Monomer
- Monomer used to assign ampal_parent on created Atoms.
-
make_ampal
()[source]¶ Generates an AMPAL object from the parse tree.
Notes
Will create an Assembly if there is a single state in the parese tree or an AmpalContainer if there is more than one.
-
proc_chain
(chain_info, parent)[source]¶ Converts a chain into a Polymer type object.
Parameters: - chain_info ((set, OrderedDict)) – Contains a set of chain labels and atom records.
- parent (ampal.Assembly) – Assembly used to assign ampal_parent on created Polymer.
Raises: ValueError
– Raised if multiple or unknown atom types found within the same chain.AttributeError
– Raised if unknown Monomer type encountered.
-
proc_monomer
(monomer_info, parent, mon_cls=False)[source]¶ Processes a records into a Monomer.
Parameters: - monomer_info ((set, OrderedDict)) – Labels and data for a monomer.
- parent (ampal.Polymer) – Polymer used to assign ampal_parent on created Monomer.
- mon_cls (Monomer class or subclass, optional) – A Monomer class can be defined explicitly.
-
convert_pdb_to_ampal
(pdb, path=True, pdb_id='', ignore_end=False)[source]¶ Converts a PDB file into an AMPAL object.
Parameters: - pdb (str) – Either a path to a PDB file or a string containing PDB format structural data.
- path (bool, optional) – If true, flags pdb as a path and not a PDB string.
- pdb_id (str, optional) – Identifier for the Assembly.
- ignore_end (bool, optional) – If false, parsing of the file will stop when an “END” record is encountered.
Returns: ampal – AMPAL object that contains the structural information from the PDB file provided. If the PDB file has a single state then an Assembly will be returned, otherwise an AmpalContainer will be returned.
Return type: ampal.Assembly or ampal.AmpalContainer


Way Too Cool 50 km
Cool CA/USA
Website: www.wtc50k.com
Race Winners
(26 runnings)
10 Mar
2012 3:27:45 3:49:41 12 Mar
2011 3:28:01 4:02:25 13 Mar
2010
3:41:48 4:13:54 14 Mar
2009
3:39:52
4:12:21
08 Mar
2008
3:32:13
3:55:22
10 Mar
2007
3:41:51
4:07:53
11 Mar
2006
3:37:56
4:17:56
12 Mar
2005
3:39:29
4:11:08
13 Mar
2004
3:32:52
4:16:33
08 Mar
2003
3:18:17
4:02:43
09 Mar
2002
3:31:58
4:13:21
10 Mar
2001
3:36:57
4:19:39
11 Mar
2000
3:45:07
4:18:58
13 Mar
1999
3:39:57
4:09:14
14 Mar
1998
3:48:27
4:13:01
15 Mar
1997
3:37:12
4:24:04
09 Mar
1996
3:41:37
4:27:34
11
Mar
1995
3:56:55
3:56:55
12
Mar
1994
3:30:44
4:12:15
13
Mar
1993
3:36:06
3:59:32
14
Mar
1992
3:41:51
4:31:30
09 Mar
1991
3:39:31
4:52:19
10
Mar
1990
3:53:44
4:44:37
Notes: 1990 was the inaugural year. For 1994-97 the race was known as Cool Canyon Crawl.
07 Mar
2015
3:04:48.5
Patrick Smyth (UT/USA)
3:41:55.3
Megan Roche (CA/USA)
08 Mar
2014
3:16:51
Chris Vargo (CO/USA)
3:53:09
Magdalena Boulet (CA/USA)
09 Mar
2013
3:08:50
Maxwell King (OR/USA)
4:06:45
Meghan Arbogast (OR/USA)
Gary Gellin (CA/USA)
Tyler Stewart (CA/USA)
Mike Wolfe (MT/USA)
Joelle Vaught-3
Leo Pantilat-2
Joelle Vaught-2
Leo Pantilat (CA/USA)
Caitlin Smith (CA/USA)
Todd Braje (OR/USA)
Susannah Beck (OR/USA)
Lewis Taylor (OR/USA)
Beverly Anderson-Abbs (CA/USA)
Phil Kochik (WA/USA)
Joelle Vaught (ID/USA)
Dave Mackey-2
Nikki Kimball (MT/USA)
Dave Mackey (CO/USA)
Anthea Schmid (CO/USA)
Uli Steidl (WA/USA)
Elizabeth Fagan-Gottlieb (CA/USA)
Carl Andersen-3
Mary Fagan-Churchill (CA/USA)
Nate McDowell (OR/USA)
Emma Davies (CA/USA)
Rich Hanna-3
Luanne Park-3
Carl Andersen-2
Karen Brown-2
Mark Richtman (CA/USA)
Luanne Park-2
Tom Johnson-3
Kim Bruyn (CA/USA)
Carl Andersen
(CA) + Tom Johnson-2
Karen Brown
Dave Scott
(CA/USA)
Ann Trason-2
Rich Hanna-2
Luanne Park (CA/USA)
Rich Hanna (CA/USA)
Ann Trason (CA/USA)
Sean Crom
(CA/USA)
Rachel Atchley
(NV/USA)
Tom Johnson
(CA/USA)
Rachael Procter
Dennis Rinde
(CA/USA)
Pam Martin
Most Wins
(1990-date)
Men
3
.
Tom Johnson
(CA/USA)
1991,1996-97
Rich Hanna (CA/USA)
1993-94,2000
Carl Andersen (CA/USA)
1996,1999,2002
Women
3
Luanne Park (CA/USA)
1994,1998,2000
Joelle Vaught (ID/USA)
2006,2010-11
Prize Money
(ADR qualified runners)
No information on prize money has been reported for this race.
Race Time Bias
(sec/km)
The race time bias is not calculated for distances beyond 45 km.
Competitive Level
(1990-date)
Insufficient data to calculate the competitive level.
Last Updated on
23 Jan 2016
Contributors: Juraj Gasparovic (50), Emmett Rahl (2), Klaas Loonstra (5)


Euro 2020 qualifying: Who will reach the finals?
by Dale JohnsonEuro 2020 kicks off in June next year and the 20 automatic qualifiers are known. Here is a look at how they got there and at the 16 teams that will fight for four remaining places via playoffs next March.
- Stream Euro 2020 qualifiers (replay) on ESPN+ | Final tables
QUALIFIED FOR FINALS
Austria
Belgium
Croatia
Czech Republic
Denmark
England
Finland
France
Germany
Italy
Netherlands
Poland
Portugal
Russia
Spain
Sweden
Switzerland
Turkey
Ukraine
Wales
What is still to be decided?
There are four places still to be won. Sixteen teams will enter the playoffs in March to fight for these spots.
JUMP TO: Who will take part in the playoffs? | Finals draw seeds and pots
How the groups played out
GROUP A
England won the group and will be seeded in the finals draw. Czech Republic have also made it to finals, while Kosovo will be away to North Macedonia in the League D playoffs. Bulgaria are guaranteed a playoff, path to be confirmed.
GROUP B
Ukraine will be seeded in the draw and Portugal in Pot 3. Serbia will be away to Norway in the League C playoff semifinals.
GROUP C
Germany will be seeded with Netherlands in Pot 2. Northern Ireland are in the playoffs on will be away to Bosnia and Herzegovina in League B, while Belarus will be away to Georgia in the League D playoff.
GROUP D
Switzerland won the group and will be in draw Pot 2, while Denmark finish second and go into Pot 3. Republic of Ireland must go into the playoffs and will be away to Slovakia in League B. Georgia will be at home to Belarus in the League D playoff semifinals.
GROUP E
Croatia won the group and will be in Pot 2 for the draw. Wales took second place and will slot into Pot 4. Slovakia will be in playoff path B at home to Republic of Ireland, while Hungary's playoff path is to be determined.
GROUP F
Spain won the group and will be seeded in the draw. Sweden will also be at the finals after finishing second, and will be in Pot 3. Norway will be at home to Serbia in the League C playoff semifinal, while Romania will be in the playoffs, and it is almost certain that UEFA will place them into path A to play away to Iceland.
GROUP G
Poland are group winners and will be in Pot 2, with runners-up Austria in Pot 3,. North Macedonia will play Kosovo at home in the League D playoff path. Israel will also be in the playoffs, path to be determined.
GROUP H
France (Pot 2) and Turkey (Pot 3) have both qualified for the finals, while Iceland are guaranteed a home semifinal in the League A path -- probably at home to Romania.
GROUP I
Belgium have won the group and will be seeded in the finals draw, while Russia have qualified and will be in Pot 2. Scotland will have a home semifinal in the League C playoff path.
GROUP J
Italy are through and are guaranteed to be seeded in the finals draw. Finland are also through to their first tournament and will be in Pot 4, while Bosnia and Herzegovina have a home semifinal against Northern Ireland in the League B playoff path.
PLAYOFFS
The best-performing nations from the UEFA Nations League who do not qualify automatically for Euro 2020 will get a playoff place.
There will be 16 teams in the playoffs, with four in each from a UEFA Nations League path.
The winners of the two one-legged semifinals (March 26) will meet in the final (March 31) for a place at Euro 2020.
The highest-ranked nation will be at home in the semifinal. While on Nov. 22 (11 a.m. UK, 6 a.m. ET), UEFA will draw the home team for the final ties.
The playoff system is explained in greater detail here.
- Euro 2020 playoffs draw: How it works
The UEFA Nations League rankings are in the following order, for teams who have not qualified automatically.
League A: Iceland
League B: Bosnia and Herzegovina, Slovakia, Republic of Ireland, Northern Ireland
League C: Scotland, Norway, Serbia, Bulgaria, Israel, Romania, Hungary
League D: Georgia, Macedonia, Kosovo, Belarus
There will be a draw, also on Friday, between Bulgaria, Israel, Romania and Hungary to decide which nations move to League A. At least one of Romania and Hungary would move to ensure there are not three hosts in the League C path. It would be unavoidable to have two hosts in one path, A or C depending on the draw.
The confirmed and possible fixtures are:
League A
Iceland vs. Hungary/Romania
Bulgaria/Israel vs. Israel/Hungary
League B
Bosnia and Herzegovina vs. Northern Ireland
Slovakia vs. Republic of Ireland
League C
Scotland vs. Bulgaria/Israel/Hungary/Romania
Norway vs. Serbia
League D
Georgia vs. Belarus
North Macedonia vs. Kosovo
FINALS DRAW
The draw will be held on Saturday, Nov. 30, in Bucharest, Romania. The draw ceremony will begin at midday ET (6 p.m. CET) and is expected to last 50 minutes in total (with 20 minutes for the draw itself).
- Click here to find out how the finals draw will work
Pot 1: Belgium, Italy, England, Germany, Spain, Ukraine
Pot 2: France, Poland, Switzerland, Croatia, Netherlands, Russia
Pot 3: Portugal, Turkey, Denmark, Austria, Sweden, Czech Republic
Pot 4: Wales, Finland, Playoff A, Playoff B, Playoff C, Playoff D
One team from each pot would be drawn into the six groups.


---
sort_order: 12
tei_id: rdx_b5h9g.p.idm178677088
annotation_count: 0
images:
small-thumbnail: https://readux.library.emory.edu/books/emory:b5h9g/pages/emory:pchmg/mini-thumbnail/
json: https://readux.library.emory.edu/books/emory:b5h9g/pages/emory:pchmg/info/
full: https://readux.library.emory.edu/books/emory:b5h9g/pages/emory:pchmg/fs/
page: https://readux.library.emory.edu/books/emory:b5h9g/pages/emory:pchmg/single-page/
thumbnail: https://readux.library.emory.edu/books/emory:b5h9g/pages/emory:pchmg/thumbnail/
title: Page 12
number: 12
---
{% raw %}4{% endraw %}
{% raw %}JACOB HODGES.{% endraw %}
{% raw %}at this time, a friend on earth to counse'{% endraw %}
{% raw %}or to care for him. There were then no{% endraw %}
{% raw %}Sabbath-schools, nor such public provi-{% endraw %}
{% raw %}si >n for the instruction of the poor, as{% endraw %}
{% raw %}is now found in almost every commu¬{% endraw %}
{% raw %}nity.  It is not known that a solitary{% endraw %}
{% raw %}lesion of useful instruction was ever given{% endraw %}
{% raw %}to ^.his African child.{% endraw %}
{% raw %}After spending ten years in his native{% endraw %}
{% raw %}place, exposed to all the evils of his{% endraw %}
{% raw %}wretched parentage, Jacob was shipped{% endraw %}
{% raw %}oh board the schooner Lydia, of Philadel¬{% endraw %}
{% raw %}phia, in the West India trade, in the ca¬{% endraw %}
{% raw %}pacity of waiting boy. In this situation,{% endraw %}
{% raw %}well calculated to perpetuate his igno¬{% endraw %}
{% raw %}rance and to confirm him in every vicious{% endraw %}
{% raw %}propensity, and farther removed than ever{% endraw %}
{% raw %}from the means of education and moral{% endraw %}
{% raw %}improvement, he soon became distin¬{% endraw %}
{% raw %}guished for every species of wickedness{% endraw %}
{% raw %}that his circumstances allowed Beina{% endraw %}


minecraft Tutorial: How To Make A Football/Soccer Pitch
The YouTube challenge TSMC - Minecraft has a larger number of step-by-step build instructions that can work well with setting up classroom, sports fields, buildings, etc. Follow along with these to be inspired and become a more proficient builder.
Minecraft - How To Build A Tennis Court! Today I'm going to be showing how to Build a nice and easy Minecraft Tennis Court for Minecraft.
How to build an epic collage/NFL football stadium
In this tutorial i show you how to make a Baseball field in minecraft! for all of your city building needs! this can be made for your city, town, village. you can add this to a school or a park or even convert it into a stadium :)


---
layout: default
title: About Chunchun
---
Hello, world! This is Chunchun. I'm a software engineer.
Software Engineer
Feb 2019 - Dec 2020 (1 yr 11 mos)
- Worked on an internal web app that supports 300+ daily users (Python + Django).
- Built a learning tool for students to study ancient Greek.
Software Engineer
Sep 2017 - Feb 2019 (1 yr 6 mos)
- Built the frontend part of the e-commerce web app from scratch (React + Go).
- Implemented internal iOS app (React Native).
- Implemented dashboard (React).
- Developed internal web app for hub warehouse and operation management team (React + Go + PostgresSQL).
- Built and maintained the HappyReturns.com website (Gatsby.js).
- Implemented mobile version web app (React) and developed reporting tools for customers and retailer partners (Go).
Web Application Developer
Aug 2015 - Dec 2016 (1 yr 5 mos)
- Worked with a research team that aims to provide online analytical, computational, and graphing tools for Statistics education
- Transformed and upgraded the SOCR Charts Applets from Java to a browser-independent HTML5/JavaScript framework. The new version is compatible with more browsers and does not require any browser plugins
- Developed user interactive Charts using D3.js and embedded the Charts into the SOCR Analytical Toolbox framework
SOCR Analytical Toolbox Website Link
(Try sample dataset: Data Input > SOCR datasets > [pick one] > Load > Charts)
Javascript
React
React Native
Python
Django
Git
HTML
CSS
Java
PostgresSQL
MySQL
University of California, Los Angeles (UCLA)
BS, Computer Science and Engineering


My personal project site for CIT 261
Week 05 includes the following assessments:
The localStorage
API allows you to persist data on a client's machine that will persist even
through a browser restart. Session storage only allows you to store data until the browser is closed.
To test the local storage functionality, use the inputs and their associated buttons, and then refresh the page or restart the browser.
Arrays, associative arrays, and objects can all be stored on localStorage in a similar fashion. They should
be stored by converting them to JSON
using JSON.stringify()
and then parsed back
into javascript objects by using JSON.parse()
. Modify the list below and click save to persist
a new array.
function saveAssociativeArray() {
var testAssociativeArray = [];
testAssociativeArray["book"] = "Harry Potter";
testAssociativeArray["city"] = "London";
console.log("storing:", testAssociativeArray);
localStorage.setItem("testAssociativeArray", JSON.stringify(testAssociativeArray));
}
function saveObject() {
var testObject = {
hello: "World",
count: 1
};
console.log("storing:", testObject);
localStorage.setItem("testObject", JSON.stringify(testObject));
}
Change my colors! Enter valid hex values in the text boxes below:


JOHNNY MNEMONIC A film review by Christopher Null Copyright 1995 Christopher Null
In 2021, when the world is basically ruled by corporate Japan, humans with microchip brain implants are used to transport the most important of data files.
This is the world of writer William Gibson, and it seems like a pretty interesting place to visit. It's unfortunate that JOHNNY MNEMONIC does very little in this setting and comes off as little more than a remake of TRON, without the lightcycle sequence.
The plot (if you can't guess) is like this: Keanu Reeves is one of these cyber-couriers, his brain so packed with information he doesn't even know his last name. The information? The cure for "NAS," the plague of the next century. Out to get him? Both the corporation he's working for and their rivals, preacher/mercenary Dolph Lundgren (yes, it's true), plus the LoTeks, a gang of antiestablishment types led by Ice-T. On his side is a doctor (Henry Rollins, rounding out the pop culture cast) and newcomer Dina Meyer, as his bodyguard.
Lots of characters here--almost all of them plastic and lifeless, especially Reeves in what could have been a great role. In fact, the whole movie is a "could have been," but it mostly sells out to the young video game crowd the film is destined to attract and never makes a point except for one brief scene with Rollins jumping around and howling about how technology is bad. Whatever.
On the redeeming side are the ultra-cool cyberspace sequences, which are required viewing on the big screen. Also good, but overpowered by the animation, is Meyer as Johnny's bodyguard and eventual love interest. Together, these two aspects of the movie make it largely watchable.
The main problem with JOHNNY MNEMONIC (as if I hadn't listed enough already) is the plot: the bad guys are trying to get Johnny's *head* in order to extract the information. What's the point of a human courier if you can get the info out just by chopping his head off? Maybe a portable hard drive would be cheaper next time.
RATING: **1/2
|* Unquestionably awful | |** Sub-par on many levels | |*** Average quality, hits and misses | |**** Good, memorable film | |***** Perfection |
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


The question pops up from time to time. What is the difference between a Developer Evangelist and Developer Advocate?
I should know, since I've had both titles (working as a Developer Advocate now), but the reality is, that both titles are loosely defined, and what you do very much depends on the company you work for. I think there are some general guidelines though.
Evangelism and advocacy has become a popular way to engage with the end users, the developers and the communities relevant to the product.
Developer Evangelist
The typical Developer Evangelist addresses a broader audience, and presenting at conferences is a common way to introduce developers and communities to the product. The Evangelist also produces content, both as articles, social media posts and guides/tutorials.
You can consider an Evangelist the company's spokesperson, and in a lot of ways, there are similarities between evangelism and marketing. It is important to note, an Evangelist's success is not measured in sales numbers.
Outcome: The Developer Evangelist creates awareness and communities around a product, and introduces the right audience to the product. The goal is to spike interest in the product and get it in the hands of developers.
Developer Advocate
The typical Developer Advocate picks up where the Evangelist left off. Where the Evangelist introduces the product to developers and communities, Advocates typically shows how the product can be used, in the audience's context. The Advocates making sure the developers have the resources they need to become successful with the product. This can be documentation, code samples, developer support etc.
The Advocate work more 2-ways, as the Advocate is both representing the company and the developers/communities. The Developer Advocate's goal is to make both the company and the users (developers) happy, and creating the best possible developer journey (the developer experience from discovery to full implementation in production).
Since the Advocate typically has deeper technical discussions with developers, the Advocate has a good feeling of which obstacles or objections developers have towards the product, and can go back to Engineering and share that knowledge.
Outcome: The Developer Advocate drives developers further down the funnel, and provides what developers need to make an educated decision to implement the product or not. By working more directly with the end users (developers), the Advocate can provide valuable feedback about how the product is being perceived in the community, and how to drive adoption.
Summary
Weather you speak to an Evangelist or an Advocate, they will most likely be able to provide the same. They are both experts in the product, event though their audience typically are different. Communicating the value and use of the product is core, the different lies in how far they are taking you down the path towards actually using the product and integrating the product in their own stack.
Companies choose to have either Evangelists or Advocates, so it's not unusual to have a great deal of overlap between the roles, and the job can easily be something in-between, regardless of the title. A lot of times it comes down to which of the titles the company feels more comfortable with, more than the actual work being done in the role.


package using maven
2014-04-24
PackageusingMavenforGRIB2JSON
- Java based tools such as grib2json has to compiled with maven
- latest maven is installed, following as per this note (https://github.com/saconswl/Real_time_air_pollution_Mod_Proj-2013-2014/blob/home/working_notes/wn_2013-10/Installing_maven_in_Ubuntu_12.04.md)
- the tool grib2json requieres java 1.7
- made huge search due to error while trying for
mvn package
it gives error of
Error: JAVA_HOME is not defined correctly. We cannot execute
”/usr/lib/jvm/jdk1.7.0”/bin/java
- later found that, the system doesn’t containing jdk1.7.0
- installed jdk1.7.0 follwoing (http://askubuntu.com/questions/117189/apt-get-install-openjdk-7-jdk-doesnt-install-javac-why)
- now providing
sudo mvn
gives details of mvn installation without error. - now the grib2json as told in its documentation works without error
- it makes a folder named grib2json-0.8.0-SNAPSHOT.tar.gz
- unziping of it contain grib2json file inside bin foldeer
- executing this file as
sh grib2json
givies indication of its working!


{% extends "index.html" %} {% block content %} Articles: Resources for Buying Selling Trading and Mining Tools: A Tool for charting ICOS: Mining: {% endblock %}


Install with NPM:
$ npm install evaluatex
Use a minified version in a webapp:
<script src="node_modules/evaluatex/dist/evaluatex.min.js"></script> <script type="text/javascript"> evaluatex(); <script>
Get zipped releases here.
Check it on Github.
Evaluatex is a parser that reads and evaluates LaTeX and ASCII math. It can safely resolve math
expressions, without relying on Javascript's eval
, which is evil. It's especially powerful when
combined with math markup tools such as Mathquill.
const fn = evaluatex(expression, constants = {}, options = {}); const result = fn(variables = {});
evaluatex()
compiles a math expression into a function fn
.expression
is an ASCII or LaTeX expression to be parsed and evaluated.constants
is a map of constant values - values that don't change if you invoke fn
more than
once.
options
is a map of options for the compiler.result
is the numerical result of the calculation.variables
is a map of variables that can change between invocations of fn
.Change the math below and see the result on the right. You may use any functions and objects in Javascript's
Math
.
Evaluatex takes a string containing a math expression and returns a compiled function. The compiled function evaluates the math and returns the result.
Throughout this manual, you may change the underlined math in any of the examples to explore how Evaluatex works.
A one-liner:
const result = evaluatex("1 + 2 * 3 / 4")()
Evaluatex returns a function because you can invoke it multiple times with different variables.
Evaluatex supports all of the features you should expect from a simple calculator, including order of operations. You can use parentheses, square brackets, or curly braces interchangeably.
Exponents use the ^
operator.
You can use named values in expressions that are visible to the expression only. This avoids the need for eval()
.
See the
Constants and variables section for more.
Implicit multiplication with brackets or variables is not a problem.
Be careful with associativity: 1 / 2a
is (1 / 2) * a
.
You have full access to all functions and constants in Javascript's Math
object.
You can omit brackets from simple functions, but be careful with implicit multiplication.
When in doubt, use parentheses.
You can define custom functions as constants.
Multi-argument functions work just as well, but they require parentheses.
There are several functions built in to Evaluatex to help with logs, roots, and trigonometry.
Absolute values work like a charm, as do factorials, which round to the nearest integer before performing the calculation.
You can refer to symbols, such as x
, in a math expression. These symbols can be constants or variables.
Constants are specified in the call to evaluatex()
as the second parameter. Their values are compiled by Evaluatex into the resultant equation. Use constants if you know that they won't change between invocations. Constants may be numeric values or functions, but not expressions like PI/2
.
Variables are specified when calling the compiled function. Their values can be changed between invocations.  Variables may only be numeric values, and not functions.
You can combine constants and variables. Constants have priority over variables - if you define a constant, you can't change it without re-compiling the expression.
LaTeX parses math a little differently. Turn on LaTeX behaviour with a flag:
In the previous example, the power takes only the first symbol after it, so it reads like x^2 * 4
. Use curly braces to fix that.
LaTeX commands are also supported, like \frac
. The following example is interpreted as 1 / 20 * 3
.
Report issues on Github. Evaluatex does its best to be correct, but unanticipated bugs features might exist.
Evaluatex is licensed under the MIT license. This means that you can probably use it in your project, as long as you don't pass it off as your own or blame the author for the inevitable heat death of the universe.


java.util.List.set()
methods. Such calls could be replaced
by the shorter and clearer keyed access form.
Example:
def list = ["foo"]
list.set(0, "bar") // list.set(0, "bar") could be replaced with list[0] = "bar"
After the quick-fix is applied:
def list = ["foo"]
list[0] = "bar"


Employee name is required.
Employee last name is required.
Employee address is required.
Employee phone number is required.
Employee date of hire is required.
Employee department is required.


| DOSE: |
4 hits |
smoked |
Cannabis |
(plant material) |
The following report is written to provide a speculative look at an unusually psychedelic experience with cannabis. I've provided information about myself here, and things that may have affected the experience. I also wrote the experience out with much detail, so the title of this report may seem out of place for a bit. If this is the only interest of the reader, skip the first 6-7 paragraphs of the experience.
A little about me:
I'm not by any means a regular cannabis user. I've used it about 12-13 times in my life. I usually tell people that it's 'not my plant.' I say this for several reasons. For one, from the first time I used it (however enjoyable it was) it didn't feel like it was part of me. I know people who smoke cannabis on a daily basis--some use it as a recreational ally, some as a detrimental escape from nothing in particular. Suffice to say, I've never been an avid user of recreational drugs. However, I have spent the last year or so of my life in a deep fascination with entheogenic plants/experiences. I do feel the connection with that subject, more so than I'll bother to write here. If I ever get around to it (more so, *when* I get around to it), I'll post my experiences with other plant-teachers, along with some more personal insight and such, under the same nickname.
If there were one thing I think I should state here, that would have heavy influence on my (or anyone else’s) experiences with any drug, is that I have an immense respect for all psychoactive substances. I'm not the most experienced tripper out there by any means, but I take comfort in the sense of wonder I get when I think about the things I've already learned, and have yet to learn down the road-I've found that more times than not, that light of wonder and love of life can take one farther than simply using the drugs.
I try to meditate before I use any of them, and get to a calm and serene state of being so that I am entering the experiment with the most light inside me as possible. As I stated before, I have a deep respect for plant-teachers--However, I am slightly biased towards cannabis, which I feel obliged to include in this report. Up until this experience, it has had little spiritual impact on me (that I have made note of anyway), though it has had a lot of aesthetic value-and sometimes the line between the two is minimal or nonexistent. This could be because I haven't fully allowed myself a full experience of cannabis, but rather have used it as either an experiment in the field, or to enjoy life with friends. I don't feel that either of these are negative, but it's not the road I feel is mine to walk down more than once a blue moon.
Past Drug Experience:
Cannabis, Psilocybin Mushrooms, Salvia Divinorum (standard potency leaf) are the most entheogenic, or most noteworthy in the field of spiritual experiences. I've also experimented with a variety of herbs, including skullcap, kava, white lotus, passionflower, valerian, etc.
The Experience:
Set: serene and social, but slightly anxious
Setting: mountain range
It was a late summer day, and the sun was still in the sky. We (Me [male], S [female] and K [male]) had planned on going on a walk through the woods. We live in northwestern Nevada, so the woods were probably more like a treesy mountain range, rather than a dense and wet Oregon-style forest. I love trees and the outdoors. K grew up there, and S was going to move out there soon, so a walk through the woods sounded great. Me and K drove up there at about 6:30 PM, and S was supposed to meet us there within 10 minutes.
At about 7:00, she hadn't showed up, so we called her on her cell phone. It turns out she had made a mistake on where to meet us, and had been there longer than we had, somewhere else, waiting for us. She drove down with her two cousins in the car, and one of them wanted to drive back home because he wasn't up for the walk. He took the car, and S said that the spot she'd been waiting at was much more scenic and away from developmental areas, so we drove out there. I'm not sure where the time went here, as the rest of the night is kind of a haze as far as time goes, but I think we arrived at the spot at about 8:30, though it only took us about 10 minutes to get there.
Now as stated before, I'm not one to use cannabis much, and I probably turn it down more than I join in, because it always ends up very recreational with little spiritual value, and I feel like I've done something wrong (medical paranoia-side affect from cannabis, or is it really just not my thing?). However, we were in the woods, which I loved, and I was feeling like it was going to be a good experience, so I figured this would be the ideal time/place to use it.
We all intended on smoking, so we parked the car in the new spot, and headed up a trail for about 100 ft. We came to a 3-way (4-way if u count the way we came from) crossroads, and couldn't decide which way to go, plus it was getting dark. K and I had brought our guitars, but I left mine in the car, as it had no strap to carry it around on, but K brought his with him. Anyway, here we were at the crossroads, me, S, K and J (S's cousin)-and after a short blues riff from K to make a song out of which road to take, we chose one.
About fifty feet down the road, we realized it would be ridiculous to choose a road before we smoked the cannabis, because we might not remember which way back (a night in the middle of the woods with no camping material and some parents expecting us back home that night would be a less-than-desirable experience). We went back to the crossroads, and S filled her glass pipe with the stuff. The amount of cannabis she had can be compared to the size of a half of a French fry--for four people. We saw this and paused for a second to wonder what she was thinking, then verbalized this thought in a bit of skepticism. She assured us that it was very strong, and was enough for everybody, so she lit it up and hit it. It got passed around the four of us for about 5 minutes, and so she put it away and we started talking. From this point on (actually it was more like from the first time we were at the crossroads), K would be playing guitar all night.
I usually have a 2-minute onset to cannabis, and every time it's the same story. I keep telling myself it won't work this time and that it's not going to affect me, and then it hits me like a sack of bricks and I eat those thoughts at surprise for its potency. 10 minutes later, I was thinking, 'You know, I hate to sound typical, but it really should have kicked in by now.' And as usual, just when I have given up on waiting for it to kick in, it kicked in.
Some of the things I was experiencing I would consider 'typical cannabis effects,'. First, the strange and foreign feeling that most psychoactives bring with them. Like something is different but it's hard to tell what. This was followed shortly after by the screeching halt of 'normal perception of space and time.' For a second, my body carried on its usual functions, like walking, while the way I perceived it slowed down to the point that it is relatable to being underwater. My mind, however, was still working at full speed. This creates the effect that I think most people laugh and smile about when they are on cannabis. My mind works at full speed, but my body can't process its commands quick enough, and it's kind of a new and funny sensation.
Then comes what I would call the most distinctive effect cannabis has had on me, which is what I call 'the paper doll effect.' This is when the entire world takes on an animated quality and appears as though everything is a 2-dimensional object (like paper) in a 3-dimensional world. Basically, everything looks like paper dolls in a pop-up book.
So all of the aforementioned effects are taking place in the middle of a mountain range trail, when it is getting pretty dark out, so we decide to go for a walk down one of the paths. I ask J if he is feeling the paper doll effect, and he says no. S says that J doesn't usually get very high when he uses it, and K said that he wasn't as up as I was either. S usually feels higher when she uses cannabis with me, most likely because I am a really goofy guy when I am under the influence of it, and it rubs off on her and makes her feel a little more loosened up.
So we are walking down this trail and 3 out of 4 of us are musicians. I try K's guitar, but my body's lack of ability to follow the mind in adequate time disables me in playing most of what I can normally. I tried Al Dimeola style soloing, and it came out as a clump of clumsily muted tones, similar to a 5 year old on speed trying to play the same thing. I gave the guitar back to K, and we proceeded down the ever-darkening dirt road. A minute or so later, K exclaims, 'This is the road that the devil meets you on to take your soul! Like Robert Johnson, we even have a guitar!' and he started to run backwards with J. A bit more of this kind of nonsense happened, and then we started to head back.
The walk back to the car was kind of frightening, as the road seemed much longer and I was getting paranoid. I had just seen the movie The Village, and so had S who was making eerie comments about how those creature could be in these woods. We got back to the car, and pulled a futon out of the back of K's car/van/truck/whatever. We laid it out on the open field of dead pine needles and weeds. This is where it started to get weird for cannabis.
While K was off walking around and playing guitar within 20 ft. of us, me, S and J were lying on the futon, looking up at the stars. These weren't city stars like you see from downtown; this was out in the middle of the woods-type stars. When I focused on the brightest one, all the other ones would start to connect and take on the form of metal jacks, spiraling towards the center of the universe, which was the star I was looking at.
K said, 'If you look at the sky, and hold really still, can you see it move over us?' So we held really still, and sure enough, we saw the sky move over us. It wasn't like something was flying up there, it was like we were being so still, we could witness the cycle of day/night, watching the sky spin on its axis. Then, I would look at one spot in the sky, and I would all of a sudden be looking at an eye, staring right down at me. Then, a spider-web style fractal started spinning towards the eye. I told J and he focused for a second and saw it too. Then S heard us and saw it too.
The fractal changed constantly, from spider webs, to video-game style 3D cubes, to puzzle pieces, to eyes. When it changed to eyes, that's when it really hit me, like 'cannabis has never had this psychedelic of an effect on me before.' The 'eye in the sky' (as Alan Parsons would say) took on a whole tunnel that led up to the heavens. It was exactly like the DMT art I've seen (ex. Alex Gray).
The eye was like there was a tear in the fabric of the heavens, and an eye was peeping through. It was female, and very pretty (I have a thing for eyes anyway). I sat up and looked at K's car, and the fractal persisted. I could see the 3D-block fractal pouring into the tire-area of his car, because that was the darkest part of his car to look at, where I could see it best. The cubes were pink/red/blue/green, but very light in color. Very similar in color to 'blips,' as people call them-a common effect of Psilocybin mushrooms.
After about another hour of this sky-wonder, we decided to drive back into town.
This was at about 10 PM. After we got back, we had Del Taco. After about a half hour of talking and eating, we drove S and J home and then K dropped me off and he went home. That night (last night) I slept really well. This all happened yesterday, so I have a fairly clear concept of what happened.
Conclusion:
This is by far the most psychedelic experience I've had with cannabis. I highly doubt that it was laced with anything, as you cannot lace cannabis with any drug (that I am aware of) of that effect. I have never used PCP, but I imagine PCP laced cannabis would be much more disorienting and delirious. Now, I haven't completely ruled out the idea that J and S saw the visions I did because I told them to look for them, and that it was a placebo effect, and maybe that's half of it (or more).
I believe, however, that psychedelic drugs open up doors in the mind, and we experience and perceive things that we are usually shut off to. This would explain why DMT visions are so alike. It is possible, depending on what you personally believe, that all of us walked through the open doors in our minds that night, and experienced something of another dimension, as our minds and spirits caught a glimpse of that reality. I've never known this to be particularly true with cannabis, but this experience shook that ground.
In any event, I feel that what we (or at least I) experienced was real, and am grateful for it, even though I still woke up this morning feeling as though I'd done something wrong (the medical anxiety, or some psychological block, I don't know). That was always the missing link with cannabis- I usually feel like I've misused it, or like I used it selfishly, but this is probably an effect of my own self-analysis and constant strive to do 'the right thing' and be the purist person I can, even though, ironically- I believe that right and wrong is a fallacy, and all things in existence are really just one. Earth being one big ball of matter and complexly-designed life, each grain of sand on the beach taking their own route to the same place.
Just remember the man, Timothy Leary's words: 'Just relax and float downstream.' Good luck and Best regards.
Experience Reports are the writings and opinions of the individual authors who submit them.
Some of the activities described are dangerous and/or illegal and none are recommended by Erowid.


servers = computers dedicated to hosting
element is a set of tags
different tags do diff stuff
attributes are certain elements of tags.
e.g anchor tag is used to link and href is element that names webpage
image has attributes for source and text to display if source is no good
inline vs block elements
blocks create a container around the elements which auto creates a linebreak
different attributes will eventually allow for customization of the rectangle
div and span are inline and block elements to create a container


Fourth Industrial Revolution
Patent applications for smart object technologies, on which the Fourth Industrial Revolution depends, are rising rapidly, according to a new study. More than 5,000 “Internet of Things” (IoT) patent applications were filed in 2016 at the European Patent Office (EPO). This marks a growth rate of 54% over the last three years. Compared to the 8% growth rate for all patent applications, IoT technologies are rapidly attracting inventors.


Cook, Robert Hunter
| Birth Name | Cook, Robert Hunter |
| Gender | male |
| Age at Death | 93 years, 1 day |
Narrative
Marriage Certificate - #1642 was at William St, (no suburb)!! according to the rites of the Presbyterian Church. The Consent of Edmund Rosebery J.P. Guardian of Minors was given to the Marriage.
It was witnessed by C.R.Henderson & Rosa Henderson ??
Robert was 19yrs old, a Salesman from Paddington, & Elizabeth was 20yrs old, from Sydney.
There is no mention of the parents names or occupation.
SMH - COOK - Robert Hunter, 2 Feb 1955, at a private hospital, Drummoyne, late of 44 West Pde, West Ryde, loved father of Ernest, Arthur, James, Rose, Agnes, Herbert(dec), George(dec), Albert(dec), and Lillian(dec). Privately Cremated. (No funeral notice).
World War 1 - Fiche C10.
#1168 Cpl Albert Victor Cook 2nd M.G.Bat. enlisted 1/2/1915 K.I.A. 5/5/1917
#843 Sgt George Frederick Cook 17th Battalian " 23/3/1915 K.I.A. 23/4/1916.
There are 4 George Frederick Cooks.!!!
Events
| Event | Date | Place | Description | Sources |
|---|---|---|---|---|
| Birth | 1862-02-01 | Ryde NSW #13254 | ||
|
|
||||
| Death | 1955-02-02 | Drummoyne NSW (age 93yrs) | ||
|
|
||||
| Burial | 1955-02-04 | Privately Cremated at Rookwood NSW | ||
|
|
Parents
| Relation to main person | Name | Birth date | Death date | Relation within this family (if not by birth) |
|---|---|---|---|---|
| Father | Cook, Thomas (Draper) | 1815-09-17 | 1876-05-26 | |
| Mother | McFadden, Rosa | 1835-02-09 | 1911-05-14 | |
| Sister | Cook, Ellen Mary | 1853-04-25 | 1921-02-12 | |
| Sister | Cook, Annie Rebecca | 1854-07-28 | 1944-08-28 | |
| Sister | Cook, Rose Alice “Alice” | 1856-02-28 | 1930-03-15 | |
| Brother | Cook, Thomas William Freibeth | 1858-03-17 | 1933-08-10 | |
| Brother | Cook, Henry Forbes | 1860-03-22 | 1861-08-16 | |
| Cook, Robert Hunter | 1862-02-01 | 1955-02-02 | ||
| Sister | Cook, Florence Jane Marven | 1863-07-31 | 1943-09-09 | |
| Brother | Cook, Albert Edward | 1865-12-24 | 1872-12-08 | |
| Sister | Cook, Lillien Victoria | 1868-04-09 | 1904 | |
| Brother | Cook, George Francis | 1870-09-17 | 1872-12-11 | |
| Brother | Cook, Frederick Augustus | 1872-12-06 | 1892-03-13 | |
| Brother | Cook, John Leslie | 1875-01-09 |
Families
Family of Cook, Robert Hunter and Copeman, Elizabeth Ann |
||||||||||||||||||||||||||||||||
| Married | Wife | Copeman, Elizabeth Ann ( * 1861-08-25 + 1939-12-01 ) | ||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||
| Children |
| Name | Birth Date | Death Date |
|---|---|---|
| Cook, Herbert Robert | 1883-08-17 | 1943-01-23 |
| Cook, Ernest Alfred | 1884-10-02 | 1956-11-02 |
| Cook, Arthur Thomas | 1886-06-10 | 1963-04-21 |
| Cook, James Edward “Jim” | 1888-01-28 | 1967-08-17 |
| Cook, George Frederick | 1890-02-05 | 1916-04-23 |
| Cook, Rose Alice | 1892-01-31 | 1959-08-13 |
| Cook, Albert Victor | 1893-07-26 | 1917-05-05 |
| Cook, Lillian May “Lily” | 1895-04-25 | 1950-07-08 |
| Cook, Agnes Ellen | 1897-08-27 | 1995-09-29 |
| Type | Value | Notes | Sources |
|---|---|---|---|
| _UID | 3D8469F6E40FD8119853C0DD05ACDD71833F |
Attributes
| Type | Value | Notes | Sources |
|---|---|---|---|
| _UID | 288469F6E40FD8119853C0DD05ACDD716EEF |
Pedigree
- Cook, Thomas (Draper)


Specifically I design user experiences (UX) and advise companies on what to build in their version one, how to gain customers and how to keep them happy. I do this by understanding the following…
My work typically involves the production of personas, sketches, and wireframes, followed later in development by measurement via analytics reports and user testing.
I am the User Experience lead at Contrast. We design and develop software for ourselves and for clients. Our own product Exceptional is a very popular web based error handler for most popular languages.
My day to day work in Contrast involves meeting clients & their customers to gain a full understanding of the business. Then I design the customer experience that will be most profitable in the long term.
Before Contrast, I was a senior analyst at iQ Content, Irelands largest usability firm. Previous to that I worked as a lecturer and researcher in NUI Maynooth.
I write primarily on the Contrast Blog and very rarely on my personal blog. Here are some recent articles…
I regularly give talks about topics relating to User Experience design, Strategy for start-ups, and the business of web applications. Often I give talks with my co-founder Eoghan, which are both informative and entertaining.
I'm on Twitter as @destraynor. My personal email address is<EMAIL_ADDRESS>For work enquiries, use<EMAIL_ADDRESS>I also use Flickr sporadically, own an unmaintained and useless LinkedIn account, keep my Facebook to my friends, and I'm not a big fan of phone-calls.


Goal 7
Be able to use accounting/financial information appropriately in investment, credit, regulatory, and management decisions
Financial Accounting
Let me be clear from the beginning of this: I don't like accounting. I want to commend the people who do this on a daily basis, because this line of work is most definitely not for me. However, I did take the class, I learned the content, and I'm grateful for taking it. For one, it taught me that I don't want to do these caclulations every single day. I also learned much about credit and debit, t-charts, and other formulas in order to help me talk to accountants who might need my services. Much of business operates around money, and IT is here to support not just creatives, or philosophers, or people with non-math related ideas. We are here to serve all peoples, and that includes accountants. One thing Silicon Valley has taught me is that in order to make the best product, you must live and breathe what you're trying to build. Even if I may not like it, I can after this class, live and breathe accounting without suffocating, and hopefully make the best product I can for pepole who need it.
Managerial Finance
Let's go ahead and continue the saga of my hatred of accounting. Finance is more accouunting. However, at the very least, this goes more into the big picture when it comes to finances, as opposed to accounting. I like seeing the big picture of a company's finances. It allows you to see a larger scope then you see right now, and sometimes it can unlock the secrets of a company when you're looking at purchasing it, or trying to correct its overall budget. That was valuable when looking at finances in this class.
This specific assignment was one I thought was particularly useful. Accounting is always trying to find the current status of a company, while finance can project the big picture, even if there are similar threads between the two. This specific assignment compared two different projects together to see which project had a better chance of making more money at the end by comparing risk, net present value, and the internal rate of return. Comparing these can make one project that looks far more attractive, seem like an impossible dream, and vice versa. Knowing which project will make the company more money in the long run and help stakeholders better in the long run, is far more important sometimes then just trying to push a company in a direction you "feel" would be better.
Macroeconomics
First take: Macroeconomics is fun. It's a difficult class to be sure, but it's absolutely a blast. Why is that? Because all it is is philosophy for money! Money influences so much human thought in the world. Especially in the United States, where Capitalism is one of the core tennents for our country, making money that much more important. However, because of its philisophic background, it contains a number of difficult phrases and terms in order to explain the complex phenomenea behind the minds of money, and of course, the political action of money.
So lessons learned are a few things. For one, politics influences our economies far more then pure businesses do these days. Considering the upcoming elections, I do wonder if Republicans are going to change the economic tide in the next year after elections. Of course, the Democrats may also win the elections, so I'm curious what will happen in the future regauarding that. It's been an interesting election season in 2016 for sure. As well, it's helped me to understand different terms that are useful when working with accountants at my job at Koch.


WELCOME TO MY PAGE!
Hi, I'm Aditi Desai
My name is Aditi Desai and I live in Borivali.Coming to my
educational qualification.
Currently im pursuing Computer engineering from St.Francis
Institute of Technology and i have done my schooling from
SVIS, Borivali.(SSc Board).
My hobbies are dancing, painting and sometimes
travelling.
I have a keen interest in ML and web hosting.
Apart from this, I'm also exploring different subjects like
cloud computing.
Talking about my technical skills, I learned Python,Java,C
and C++ programming language and am currently learning Swift.
I have good knowledge of Data structure and Algorithms.
I made many projects in these languages that I have learned.
My short-term goal is to get a job in a reputed
company and my long-term goal is to achieve a good position
where I can build my career and help the organization.


{% extends "base_generic.html" %} {% block content %}
Are you sure you want to delete the book: {{book}}?


The start view is the view displayed when you start zEdit.
To start a session, select the application mode you want to use from the application mode dropdown and the profile you want to use from the profile dropdown, then click the Start Session button.


LIFE AND NOTHING BUT A film review by Sandy Grossmann Copyright 1990 Sandy Grossmann
Director: Bertrand Tavernier Cast: Philippe Noiret, Sabine Azema, Pascal Vignal Screenplay: Jean Cosmos and Bertrand Tavernier
Synopsis: A unique film about resiliency and resolve, set in post-WWI France in 1920. Philippe Noiret (the lead actor) won a Cesar, the French equivalent of the Oscar, for his work in this movie. The story is unusual and the characters well-developed, but it's unlikely to command a large audience, so see it before it disappears altogether. In French, with subtitles.
Major Dellaplane (Philippe Noiret) is the director of the War Casualties Information Bureau. One of his official responsibilities is to match corpses, amnesiacs, and worldly effects with the 350,000 reports of soldiers missing in action (MIA). The other official but secret responsibility is to find a very dead, very unrecognizable, but very French unknown soldier to go under the Arc de Triumphe in Paris.
You might say he doesn't see his job in the same light as his superiors. Methodically, Dellaplane leads the effort of counting corpses, photographing faces, interviewing family members, and collecting identifying information about each missing soldier. He ignores the request for an unknown soldier for as long as possible.
The idea of giving up on identifying any corpse is morally repugnant to Dellaplane. He does what any unwilling bureaucrat would: he stalls for time and impedes "progress". Impatiently, his superior tells him to find a body already and stop sending the horrid body count statistics. His superior wants unidentified corpses exhumed in hopes of finding a suitable candidate. Dellaplane provides Oriental gravediggers who will not touch the dead for religious reasons.
Most of France, it seems, is impatient to bury the 1,500,000 dead along with all the remnants of war. Except, of course, for the families of the 350,000 missing and for the new profiteers of war: the war-memorial sculptors/artisans, the lumber suppliers, the cooks who feed the remaining army, and the private investigators who--for a fee--locate and bundle up the dead.
If this were an American movie, we'd see grim people in a grim landscape. The camera would show us, for example, a close-up of a face edged in tragedy then would shift focus and show us an artistically arranged stack of decomposing bodies. But this isn't an American movie. We see no corpses. Instead of iconic characters whose names might as well be Heartbroken or Disillusioned, we meet villagers and soldiers who simply and anonymously do their jobs of clearing debris and rebuilding the village. They are pragmatic and unsentimental.
We meet two women: Irene (Sabine Azema), the Parisienne daughter-in-law of a senator, and Alice (Pascal Vignal), a local schoolteacher. Irene is looking for her MIA husband, and Alice is looking for her MIA fiancee. Irene seems to be the imperious upperclass type when we first meet her, while Alice seems the impressionable, tenderhearted young thing.
Irene attempts to use her father-in-law's clout and her pointedly superior social position to increase the amount of effort expended in finding her husband. Major Dellaplane is not impressed. He tells Irene that her husband will receive precisely 1/350,000th of his attention. Also, she should harbor no romantic notions that her husband will reappear and be all right, Dellaplane tells her curtly. Even if he is alive, the very fact that he hasn't returned makes it a good thing that he hasn't: he is either dead or might as well be dead.
Alice gets a similar lecture from the Major. Neither lecture has the desired effect, though; both women are determined to find what they're looking for. We begin to see that Irene and Alice share more than a common goal. They share qualities called fortitude and loyalty and perseverance. Much like Dellaplane himself.
We learn about Dellaplane gradually, the way we would in person. He is an intriguing, complex man. An example to the men underneath him, he is courageous in the face of danger, unquestionably willing to work ceaselessly through a crisis, and completely committed to his cause. He is a gentleman. He is also temperamental, abrupt, and boorish.
He has researched Irene's husband, but he doesn't share this information with her until he can produce a definitive answer. During the rest of the film, we watch their relationship change from mutual hostility to mutual respect.
Dellaplane resists the effort to symbolize or glorify the colossal loss of life. To him, such symbolism hides the loss. More important to Dellaplane is to chronicle the deaths as completely as possible so that the business of life can ensue. Every day, civilians gather outside a mined tunnel, hoping to find clues that reveal whether their sons died in there. They cannot go home without knowing. Neither can France heal without this issue put to rest.
Yet the officials over Dellaplane glorify the dead instead of laying them to rest. Villagers attempt to redraw their village boundaries so they can show they had losses. The sculptors delight in the 35,000 villages that each want a monument honoring their dead. Soldiers stand to sing a patriotic song in a surge of national fervor.
The director offers a counterpoint: We see an aunt and uncle enter the mined tunnel in order to identify and claim their nephew. A young soldier accompanies them. When the makeshift casket is opened, the aunt looks in and tilts her head. "He is so thin," she says. The soldier faints; the uncle carries him out. Perhaps nowhere else in the film is the personal reality of war so sharply drawn.
This is an understated piece, done by the same director as A SUNDAY IN THE COUNTRY. Tavernier shows us both the consequences of chauvinism and the resilience that allowed France to emerge with such dignity. The warning and the hope, one could say.
-- Sandra J. Grossmann<EMAIL_ADDRESS>.
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


The Monocle.Selection object performs two roles. Firstly, it polls
components for any selected text.
It fires a monocle:selection
event whenever text is
selected (and when that selection changes), and
fires a monocle:deselection
event whenever all text is
deselected.
Secondly, it ensures that all text is deselected when a page turn interaction commences.


The amount of matter contained in an object.
The mass of an object is usually measured in grams(g), kilograms(kg) or tonnes.


Provides a data-driven projection-based method for estimating changepoints in high-dimensional time series. Multiple changepoints are estimated using a (wild) binary segmentation scheme.
| Version: | 1.0.1 |
| Imports: | stats, graphics, MASS |
| Published: | 2016-07-02 |
| Author: | Tengyao Wang and Richard Samworth |
| Maintainer: | Tengyao Wang <t.wang at statslab.cam.ac.uk> |
| License: | GPL-3 |
| NeedsCompilation: | no |
| In views: | TimeSeries |
| CRAN checks: | InspectChangepoint results |
| Reference manual: | InspectChangepoint.pdf |
| Package source: | InspectChangepoint_1.0.1.tar.gz |
| Windows binaries: | r-devel: InspectChangepoint_1.0.1.zip, r-release: InspectChangepoint_1.0.1.zip, r-oldrel: InspectChangepoint_1.0.1.zip |
| OS X binaries: | r-release: InspectChangepoint_1.0.1.tgz, r-oldrel: InspectChangepoint_1.0.1.tgz |
| Old sources: | InspectChangepoint archive |
Please use the canonical form https://CRAN.R-project.org/package=InspectChangepoint to link to this page.