Interface ExoTrackSelection
-
- All Superinterfaces:
TrackSelection
- All Known Implementing Classes:
AdaptiveTrackSelection
,BaseTrackSelection
,FakeTrackSelection
,FixedTrackSelection
,RandomTrackSelection
@Deprecated public interface ExoTrackSelection extends TrackSelection
Deprecated.com.google.android.exoplayer2 is deprecated. Please migrate to androidx.media3 (which contains the same ExoPlayer code). See the migration guide for more details, including a script to help with the migration.ATrackSelection
that can change the individually selected track as a result of callingupdateSelectedTrack(long, long, long, List, MediaChunkIterator[])
orevaluateQueueSize(long, List)
. This only happens between calls toenable()
anddisable()
.
-
-
Nested Class Summary
Nested Classes Modifier and Type Interface Description static class
ExoTrackSelection.Definition
Deprecated.Contains of a subset of selected tracks belonging to aTrackGroup
.static interface
ExoTrackSelection.Factory
Deprecated.Factory forExoTrackSelection
instances.-
Nested classes/interfaces inherited from interface com.google.android.exoplayer2.trackselection.TrackSelection
TrackSelection.Type
-
-
Field Summary
-
Fields inherited from interface com.google.android.exoplayer2.trackselection.TrackSelection
TYPE_CUSTOM_BASE, TYPE_UNSET
-
-
Method Summary
All Methods Instance Methods Abstract Methods Default Methods Deprecated Methods Modifier and Type Method Description void
disable()
Deprecated.Disables this track selection.void
enable()
Deprecated.Enables the track selection.int
evaluateQueueSize(long playbackPositionUs, List<? extends MediaChunk> queue)
Deprecated.Returns the number of chunks that should be retained in the queue.boolean
excludeTrack(int index, long exclusionDurationMs)
Deprecated.Attempts to exclude the track at the specified index in the selection, making it ineligible for selection by calls toupdateSelectedTrack(long, long, long, List, MediaChunkIterator[])
for the specified period of time.Format
getSelectedFormat()
Deprecated.Returns theFormat
of the individual selected track.int
getSelectedIndex()
Deprecated.Returns the index of the selected track.int
getSelectedIndexInTrackGroup()
Deprecated.Returns the index in the track group of the individual selected track.Object
getSelectionData()
Deprecated.Returns optional data associated with the current track<EMAIL_ADDRESS>int
getSelectionReason()
Deprecated.Returns the reason for the current track selection.boolean
isTrackExcluded(int index, long nowMs)
Deprecated.Returns whether the track at the specified index in the selection is excluded.default void
onDiscontinuity()
Deprecated.Called to notify the selection of a position discontinuity.void
onPlaybackSpeed(float playbackSpeed)
Deprecated.Called to notify the selection of the current playback speed.default void
onPlayWhenReadyChanged(boolean playWhenReady)
Deprecated.Called to notify when the playback is paused or resumed.default void
onRebuffer()
Deprecated.Called to notify when a rebuffer occurred.default boolean
shouldCancelChunkLoad(long playbackPositionUs, Chunk loadingChunk, List<? extends MediaChunk> queue)
Deprecated.Returns whether an ongoing load of a chunk should be canceled.void
updateSelectedTrack(long playbackPositionUs, long bufferedDurationUs, long availableDurationUs, List<? extends MediaChunk> queue, MediaChunkIterator[] mediaChunkIterators)
Deprecated.Updates the selected track for sources that load media in discreteMediaChunk
s.-
Methods inherited from interface com.google.android.exoplayer2.trackselection.TrackSelection
getFormat, getIndexInTrackGroup, getTrackGroup, getType, indexOf, indexOf, length
-
-
-
-
Method Detail
-
enable
void enable()
Deprecated.Enables the track selection. Dynamic changes viaupdateSelectedTrack(long, long, long, List, MediaChunkIterator[])
,evaluateQueueSize(long, List)
orshouldCancelChunkLoad(long, Chunk, List)
will only happen after this call.This method may not be called when the track selection is already enabled.
-
disable
void disable()
Deprecated.Disables this track selection. No further dynamic changes viaupdateSelectedTrack(long, long, long, List, MediaChunkIterator[])
,evaluateQueueSize(long, List)
orshouldCancelChunkLoad(long, Chunk, List)
will happen after this call.This method may only be called when the track selection is already enabled.
-
getSelectedFormat
Format getSelectedFormat()
Deprecated.Returns theFormat
of the individual selected track.
-
getSelectedIndexInTrackGroup
int getSelectedIndexInTrackGroup()
Deprecated.Returns the index in the track group of the individual selected track.
-
getSelectedIndex
int getSelectedIndex()
Deprecated.Returns the index of the selected track.
-
getSelectionReason
@com.google.android.exoplayer2.C.SelectionReason int getSelectionReason()
Deprecated.Returns the reason for the current track selection.
-
getSelectionData
@Nullable Object getSelectionData()
Deprecated.Returns optional data associated with the current track selection.
-
onPlaybackSpeed
void onPlaybackSpeed(float playbackSpeed)
Deprecated.Called to notify the selection of the current playback speed. The playback speed may affect adaptive track selection.- Parameters:
playbackSpeed
- The factor by which playback is sped up.
-
onDiscontinuity
default void onDiscontinuity()
Deprecated.Called to notify the selection of a position discontinuity.This happens when the playback position jumps, e.g., as a result of a seek being performed.
-
onRebuffer
default void onRebuffer()
Deprecated.Called to notify when a rebuffer occurred.A rebuffer is defined to be caused by buffer depletion rather than a user action. Hence this method is not called during initial buffering or when buffering as a result of a seek operation.
-
onPlayWhenReadyChanged
default void onPlayWhenReadyChanged(boolean playWhenReady)
Deprecated.Called to notify when the playback is paused or resumed.- Parameters:
playWhenReady
- Whether playback will proceed when ready.
-
updateSelectedTrack
void updateSelectedTrack(long playbackPositionUs, long bufferedDurationUs, long availableDurationUs, List<? extends MediaChunk> queue, MediaChunkIterator[] mediaChunkIterators)
Deprecated.Updates the selected track for sources that load media in discreteMediaChunk
s.This method will only be called when the selection is enabled.
- Parameters:
playbackPositionUs
- The current playback position in microseconds. If playback of the period to which this track selection belongs has not yet started, the value will be the starting position in the period minus the duration of any media in previous periods still to be played.bufferedDurationUs
- The duration of media currently buffered from the current playback position, in microseconds. Note that the next load position can be calculated as(playbackPositionUs + bufferedDurationUs)
.availableDurationUs
- The duration of media available for buffering from the current playback position, in microseconds, orC.TIME_UNSET
if media can be buffered to the end of the current period. Note that if not set toC.TIME_UNSET
, the position up to which media is available for buffering can be calculated as(playbackPositionUs + availableDurationUs)
.queue
- The queue of already bufferedMediaChunk
s. Must not be modified.mediaChunkIterators
- An array ofMediaChunkIterator
s providing information about the sequence of upcoming media chunks for each track in the selection. All iterators start from the media chunk which will be loaded next if the respective track is selected. Note that this information may not be available for all tracks, and so some iterators may be empty.
-
evaluateQueueSize
int evaluateQueueSize(long playbackPositionUs, List<? extends MediaChunk> queue)
Deprecated.Returns the number of chunks that should be retained in the queue.May be called by sources that load media in discrete
MediaChunks
and support discarding of buffered chunks.To avoid excessive re-buffering, implementations should normally return the size of the queue. An example of a case where a smaller value may be returned is if network conditions have improved dramatically, allowing chunks to be discarded and re-buffered in a track of significantly higher quality. Discarding chunks may allow faster switching to a higher quality track in this case.
Note that even if the source supports discarding of buffered chunks, the actual number of discarded chunks is not guaranteed. The source will call
updateSelectedTrack(long, long, long, List, MediaChunkIterator[])
with the updated queue of chunks before loading a new chunk to allow switching to another quality.This method will only be called when the selection is enabled and none of the
MediaChunks
in the queue are currently loading.- Parameters:
playbackPositionUs
- The current playback position in microseconds. If playback of the period to which this track selection belongs has not yet started, the value will be the starting position in the period minus the duration of any media in previous periods still to be played.queue
- The queue of bufferedMediaChunks
. Must not be modified.- Returns:
- The number of chunks to retain in the queue.
-
shouldCancelChunkLoad
default boolean shouldCancelChunkLoad(long playbackPositionUs, Chunk loadingChunk, List<? extends MediaChunk> queue)
Deprecated.Returns whether an ongoing load of a chunk should be canceled.May be called by sources that load media in discrete
MediaChunks
and support canceling the ongoing chunk load. The ongoing chunk load is either the lastMediaChunk
in the queue or another type ofChunk
, for example, if the source loads initialization or encryption data.To avoid excessive re-buffering, implementations should normally return
false
. An example wheretrue
might be returned is if a load of a high quality chunk gets stuck and canceling this load in favor of a lower quality alternative may avoid a rebuffer.The source will call
evaluateQueueSize(long, List)
after the cancelation finishes to allow discarding of chunks, andupdateSelectedTrack(long, long, long, List, MediaChunkIterator[])
before loading a new chunk to allow switching to another quality.This method will only be called when the selection is enabled.
- Parameters:
playbackPositionUs
- The current playback position in microseconds. If playback of the period to which this track selection belongs has not yet started, the value will be the starting position in the period minus the duration of any media in previous periods still to be played.loadingChunk
- The currently loadingChunk
that will be canceled if this method returnstrue
.queue
- The queue of bufferedMediaChunks
, including theloadingChunk
if it's aMediaChunk
. Must not be modified.- Returns:
- Whether the ongoing load of
loadingChunk
should be canceled.
-
excludeTrack
boolean excludeTrack(int index, long exclusionDurationMs)
Deprecated.Attempts to exclude the track at the specified index in the selection, making it ineligible for selection by calls toupdateSelectedTrack(long, long, long, List, MediaChunkIterator[])
for the specified period of time.Exclusion will fail if all other tracks are currently excluded. If excluding the currently selected track, note that it will remain selected until the next call to
updateSelectedTrack(long, long, long, List, MediaChunkIterator[])
.This method will only be called when the selection is enabled.
- Parameters:
index
- The index of the track in the selection.exclusionDurationMs
- The duration of time for which the track should be excluded, in milliseconds.- Returns:
- Whether exclusion was successful.
-
isTrackExcluded
boolean isTrackExcluded(int index, long nowMs)
Deprecated.Returns whether the track at the specified index in the selection is excluded.- Parameters:
index
- The index of the track in the selection.nowMs
- The current time in the timebase ofSystemClock.elapsedRealtime()
.
-
-


Rockets hit military base near Baghdad airport, 6 hurt
by ReutersFour Katyusha rockets struck a military base next to Baghdad International Airport on Monday wounding "six fighters", a statement from the military said.
Security forces found a rocket launcher and several rockets in a search of the area, the statement said.


crux psm-convert
Usage:
crux psm-convert [options] <input PSM file> <output format>
Description:
This command reads in a file containing peptide-spectrum matches (PSMs) in one of a variety of supported formats and outputs the same PSMs in a different format.
Input:
- <input PSM file> – The name of a PSM file in tab-delimited text, SQT, PIN, pepXML or mzIdentML format.
- <output format> – The desired format of the output file. Legal values are tsv, html, sqt, pin, pepxml, mzidentml, barista-xml.
Output:
The program writes the following files to the folder
crux-output
. The name of the output folder can be set by the user using the--output-dir
option.
- psm-convert.<format>: a file containing the input PSMs in the requested format.
- psm-convert.log.txt: a log file containing a copy of all messages that were printed to the screen during execution.
- psm-convert.params.txt: a file containing the name and value of all parameters/options for the current operation. Not all parameters in the file may have been used in the operation. The resulting file can be used with the
--parameter-file
option for other crux programs.Options:
--input-format auto|tsv|html|sqt|pin|pepxml|mzidentml|barista-xml
– The format of the input PSMs. The keyword "auto" will cause the program to determine the file format based upon the filename extension. Default = auto.--output-dir <filename>
– The name of the directory where output files will be created. Default = crux-output.--overwrite T|F
– Replace existing files if true (T) or fail when trying to overwrite a file if false (F). Default = F.--parameter-file <filename>
– A file containing command-line or additional parameters. See the parameter documentation page for details. Default = no parameter file.--verbosity <0-100>
– Specify the verbosity of the current processes. Each level prints the following messages, including all those at lower verbosity levels: 0-fatal errors, 10-non-fatal errors, 20-warnings, 30-information on the progress of execution, 40-more progress information, 50-debug info, 60-detailed debug info. Default = 30.
Implementation suggestions:
- Subclass CruxApplication to create a PSMConvertApplication class.
- Looking at MzIdentMLWriter, PMCPepXMLWriter, PepXMLWriter, SQTWriter, and MatchFileWriter, etc., derive an abstract class "PSMWriter" with virtual methods for writing out a MatchCollection or ProteinMatchCollection. Make all writers a subclass of this abstract class. You will need to standardize the abstract method calls over all of the writers e.g. virtual writePSM(Match*), writeCollection(MatchCollection*), etc.
- Similiar to step #2, look at the MzIdentMLReader, PepXMLReader, SQTReader, and MatchFileReader class and derive an abstract class "PSMReader" that returns a MatchCollection or ProteinMatchCollection after parsing the inputed data file.
- Implement PSMConvertApplication, that parses the (<input PSM file>) using the correct file format parser (either determined by file extension or
--input-format
parameter) and then write out the psms in the (<output format>)Notes:
- OutputFiles.h,cpp gives many examples of how to write out PSMs from the internal data objects.
- MatchCollectionParser.h,cpp gives an example of parsing a psm file to create a MatchCollection object.
- Some file formats (e.g. mzid) will need the protein database in order to fully parse/write the file formats.
- There is a PMCMatchCollection object that handles the associations between proteins, peptides, and psms. It might be better to use this object and phase out MatchCollection in the future. This might need some discussion.


Distance Calculator Between 2 US Airports
As the crow flies
Airport 1:
Airport 2:
Calculate
Reset
Distance (miles)


climate suitable Qfly fruit habitat Queensland data projected distribution Australia Australian horticultural Maxent Australia, change model models suitability fly species {border-style scenarios px;} regions #ffffff;} current range future variables South temperature extent used using Australia’s FFEZ areas eastern potential southern spatial unsuitable Western area background costs currently occurrence pest ./j.-...x However, flies geographic occur Sutherst Victoria central different increase outbreaks projections scenarios. studies Australia. CLIMEX Entomology Northern Qfly, Tasmania changes development fly, projects px; results use {font-family Bactrocera Department Kumar Primary environmental font-size including industry likely management northern populations presence selection Climate Economic Figure New Qfly. Queensland, Research Tasmania, Yonow annual assess assessing double; global increases invasive major model. precipitation predictor resolution result scenarios, soil south-eastern species’ value km (). (Department (Fig. Holz Industries, MaxEnt Tephritidae) Territory abundance analysis based bias border-color border-width control decline distributions eradication errors false greater impacts indicate modelling niche proportion records refers regions. remain restricted solid; south-west state study time variables, warming {font-style {font-weight (i.e. Agricultural CSIRO Commons Creative Data Earth Fly Fruit Given International Model Neven Pest Plant Victoria, article assessment binary bold classified compared conservation contrast, correlative courier; developed dry effective em; establishment expansion free grid high host impact included influence insect model, modeling modelled models, moderate need obtained occurred output particularly patterns percentile periods plant predicted previous production pt;} risk south-western species. substantial suitability. threat threshold tryoni tryoni, zone zones


This documentation provide summary and notes on implementation of Internet Message Format as defined in RFC 5322.
1. Syntax
message = (fields / obs-fields) [CRLF body] fields = *(field-name ":" (field-body / unstructured) CRLF) field-name = 1*ftext field-body = (*([FWS] VCHAR) *WSP) unstructured = (*([FWS] VCHAR) *WSP) / obs-unstruct VCHAR = %d33-126 WSP = %d9 / %d32 ; tab or space ftext = %d33-57 / %d59-126 ; Printable US-ASCII, except %d0-32 and %d58 (":") body = (*(*998text CRLF) *998text) / obs-body text = %d1-9 / ; Characters excluding CR %d11 / ; and LF %d12 / %d14-127
-
Each line MUST be no more than 998 characters, excluding CRLF.
-
Each line SHOULD be no more than 78 characters, excluding the CRLF.
-
CR and LF MUST only occur together as CRLF; they MUST NOT appear independently in the body.
-
Each header field SHOULD be treated in its unfolded form for further syntactic and semantic evaluation.
-
"field-body" MUST NOT include CR and LF except when used in "folding" and "unfolding".
1.1. Folding White Space and Comments
CFWS = (1*([FWS] comment) [FWS]) / FWS FWS = ([*WSP CRLF] 1*WSP) / obs-FWS ; Folding white space comment = "(" *([FWS] ccontent) [FWS] ")" ccontent = ctext / quoted-pair / comment ctext = %d33-39 / ; Printable US-ASCII %d42-91 / ; characters not including %d93-126 / ; "(", ")", or "\" obs-ctext quoted-pair = "\" (VCHAR / WSP) / obs-qp
Folding is a function to split a line into multiline with CRLF and WSP. For example, the following line,
"Subject: This is a test" CRLF
can be folded into,
"Subject: This" CRLF WSP "is a test" CRLF
Unfolding is the process that reverse the output of folding into original input.
-
An unfolded header field has no length restriction and therefore may be indeterminately long.
-
Any CRLF that appears in FWS is semantically "invisible".
-
The "" in any quoted-pair is semantically "invisible".
-
Folding is permitted within the comment.
-
The parentheses and backslash characters may appear in a comment, so long as they appear as a quoted-pair.
-
Comment is not including the enclosing paretheses.
1.2. Atom
phrase = 1*word / obs-phrase word = atom / quoted-string atom = [CFWS] 1*atext [CFWS] dot-atom = [CFWS] dot-atom-text [CFWS] dot-atom-text = 1*atext *("." 1*atext) atext = ALPHA / DIGIT / ; Printable US-ASCII "!" / "#" / ; characters not including "$" / "%" / ; specials. Used for atoms. "&" / "'" / "*" / "+" / "-" / "/" / "=" / "?" / "^" / "_" / "`" / "{" / "|" / "}" / "~" specials = "(" / ")" / ; Special characters that do "<" / ">" / ; not appear in atext "[" / "]" / ":" / ";" / "@" / "\" / "," / "." / DQUOTE
-
The optional comments and FWS surrounding the rest of the characters are not part of the atom.
1.3. Quoted Strings
quoted-string = [CFWS] DQUOTE *([FWS] qcontent) [FWS] DQUOTE [CFWS] qcontent = qtext / quoted-pair qtext = %d33 / ; Printable US-ASCII %d35-91 / ; characters not including %d93-126 / ; "\" or the quote character obs-qtext
1.4. Date and Time Specification
Syntax,
date-time = [ day-of-week "," ] date time [CFWS] day-of-week = ([FWS] day-name) / obs-day-of-week day-name = "Mon" / "Tue" / "Wed" / "Thu" / "Fri" / "Sat" / "Sun" date = day month year day = ([FWS] 1*2DIGIT FWS) / obs-day month = "Jan" / "Feb" / "Mar" / "Apr" / "May" / "Jun" / "Jul" / "Aug" / "Sep" / "Oct" / "Nov" / "Dec" year = (FWS 4*DIGIT FWS) / obs-year time = time-of-day zone time-of-day = hour ":" minute [ ":" second ] hour = 2DIGIT / obs-hour minute = 2DIGIT / obs-minute second = 2DIGIT / obs-second zone = (FWS ( "+" / "-" ) 4DIGIT) / obs-zone
-
The date and time-of-day SHOULD express local time.
-
The form "+0000" on zone SHOULD be used to indicate a time zone at Universal Time.
-
The form "-0000" on zone indicate that the time was generated on a system that may be in a local time zone other than Universal Time and that the date-time contains no information about the local time zone.
-
A date-time specification MUST be semantically valid.
-
The day-of-week MUST be the day implied by the date.
-
The numeric day-of-month MUST be between 1 and the number of days allowed for the specified month (in the specified year).
-
The time-of-day MUST be in the range 00:00:00 through 23:59:60 (the number of seconds allowing for a leap second.
-
The last two digits of the zone MUST be within the range 00 through 59.
1.5. Address Specification
An address may either be an individual mailbox, or a group of mailboxes.
Format,
address-list = (address *("," address)) / obs-addr-list address = mailbox / group group = display-name ":" [group-list] ";" [CFWS] group-list = mailbox-list / CFWS / obs-group-list mailbox-list = (mailbox *("," mailbox)) / obs-mbox-list address = mailbox / group mailbox = name-addr / addr-spec name-addr = [display-name] angle-addr angle-addr = [CFWS] "<" addr-spec ">" [CFWS] / obs-angle-addr display-name = phrase addr-spec = local-part "@" domain local-part = dot-atom / quoted-string / obs-local-part domain = dot-atom / domain-literal / obs-domain domain-literal = [CFWS] "[" *([FWS] dtext) [FWS] "]" [CFWS] dtext = %d33-90 / ; Printable US-ASCII %d94-126 / ; characters not including obs-dtext ; "[", "]", or "\"
-
dot-atom form SHOULD be used,
-
quoted-string form SHOULD NOT be used;
-
Comments and folding white space SHOULD NOT be used around the "@" in the addr-spec.
2. Header
Format,
fields = *(trace *optional-field / *(resent-date / resent-from / resent-sender / resent-to / resent-cc / resent-bcc / resent-msg-id)) *(orig-date / from / sender / reply-to / to / cc / bcc / message-id / in-reply-to / references / subject / comments / keywords / optional-field)
[cols=".<2,.^1,.<1,.<6",options="header"] |=== | Field | Min number | Max number | Notes
| trace | 0 | unlimited | Block prepended - see 3.6.7 | resent-date | 0* | unlimited* | One per block, required if other resent fields are present - see 3.6.6 | resent-from | 0 | unlimited* | One per block - see 3.6.6 | resent-sender | 0* | unlimited* | One per block, MUST occur with multi-address resent-from - see 3.6.6 | resent-to | 0 | unlimited* | One per block - see 3.6.6 | resent-cc | 0 | unlimited* | One per block - see 3.6.6 | resent-bcc | 0 | unlimited* | One per block - see 3.6.6 | resent-msg-id | 0 | unlimited* | One per block - see 3.6.6 | orig-date | 1 | 1 | | from | 1 | 1 | See sender and 3.6.2 | sender | 0* | 1 | MUST occur withmulti-address from - see 3.6.2 | reply-to | 0 | 1 | | to | 0 | 1 | | cc | 0 | 1 | | bcc | 0 | 1 | | message-id | 0* | 1 | SHOULD be present - see 3.6.4 | in-reply-to | 0* | 1 | SHOULD occur in some replies - see 3.6.4 | references | 0* | 1 | SHOULD occur in some replies - see 3.6.4 | subject | 0 | 1 | | comments | 0 | unlimited | | keywords | 0 | unlimited | | optional-field | 0 | unlimited | |===
-
Header fields SHOULD NOT be reordered when a message is transported or transformed.
-
The trace header fields and resent header fields MUST NOT be reordered, and SHOULD be kept in blocks prepended to the message.
-
The only required header fields are the "Date" field and the originator address field(s) (which is "From", "Sender", and "Reply-To").
2.1. Date Field
The date and time at which the creator of the message indicated that the message was completed, not the time the message transferred.
orig-date = "Date:" date-time CRLF
2.2. Originator Fields
from = "From:" mailbox-list CRLF sender = "Sender:" mailbox CRLF reply-to = "Reply-To:" address-list CRLF
-
If the "From:" field contains more than one mailbox, then the sender field MUST appear in the message.
-
If the originator of the message can be indicated by a single mailbox and the author and transmitter are identical, the "Sender:" field SHOULD NOT be used. Otherwise, both fields SHOULD appear.
-
When the "Reply-To:" field is present, it indicates the address(es) to which the author of the message suggests that replies be sent.
-
In the absence of the "Reply-To:" field, replies SHOULD by default be sent to the mailbox(es) specified in the "From:" field unless otherwise specified by the person composing the reply.
-
In all cases, the "From:" field SHOULD NOT contain any mailbox that does not belong to the author(s) of the message.
2.3. Destination Fields
to = "To:" address-list CRLF cc = "Cc:" address-list CRLF bcc = "Bcc:" [address-list / CFWS] CRLF
The "To:" field contains the address(es) of the primary recipient(s) of the message.
The "Cc:" field (where the "Cc" means "Carbon Copy" in the sense of making a copy on a typewriter using carbon paper) contains the addresses of others who are to receive the message, though the content of the message may not be directed at them.
The "Bcc:" field (where the "Bcc" means "Blind Carbon Copy") contains addresses of recipients of the message whose addresses are not to be revealed to other recipients of the message.
There are three ways in which the "Bcc:" field is used,
-
The "Bcc:" line is removed even though all of the recipients (including those specified in the "Bcc:" field) are sent a copy of the message.
-
Recipients specified in the "To:" and "Cc:" lines each are sent a copy of the message with the "Bcc:" line removed as above, but the recipients on the "Bcc:" line get a separate copy of the message containing a "Bcc:" line. (When there are multiple recipient addresses in the "Bcc:" field, some implementations actually send a separate copy of the message to each recipient with a "Bcc:" containing only the address of that particular recipient.)
-
Since a "Bcc:" field may contain no addresses, a "Bcc:" field can be sent without any addresses indicating to the recipients that blind copies were sent to someone.
Which method to use with "Bcc:" fields is implementation dependent, but refer to the "Security Considerations" section of this document for a discussion of each.
2.4. Identification Field
Format,
message-id = "Message-ID:" msg-id CRLF in-reply-to = "In-Reply-To:" 1*msg-id CRLF references = "References:" 1*msg-id CRLF msg-id = [CFWS] "<" id-left "@" id-right ">" [CFWS] id-left = dot-atom-text / obs-id-left id-right = dot-atom-text / no-fold-literal / obs-id-right no-fold-literal = "[" *dtext "]"
-
Every message SHOULD have a "Message-ID:" field.
-
Reply messages SHOULD have "In-Reply-To:" and "References:" fields.
msg-id is intended to be machine readable and not necessarily meaningful to humans.
A liberal syntax is given for the id-right; however, the use of a domain is RECOMMENDED.
The "In-Reply-To:" and "References:" fields are used when creating a reply to a message. "In-Reply-To:" field may be used to identify the message (or messages) to which the new message is a reply (one or more parent), while the "References:" field may be used to identify a "thread" of conversation.
Trying to form a "References:" field for a reply that has multiple parents is discouraged.
The message identifier (msg-id) itself MUST be a globally unique identifier for a message.
Semantically, the angle bracket characters are not part of the msg-id; the msg-id is what is contained between the two angle bracket characters.
2.5. Informational Fields
subject = "Subject:" unstructured CRLF comments = "Comments:" unstructured CRLF keywords = "Keywords:" phrase *("," phrase) CRLF
When used in a reply, the "Subject" body MAY start with the string "Re: " (an abbreviation of the Latin "in re", meaning "in the matter of") followed by the contents of the "Subject:" field body of the original message. If this is done, only one instance of the literal string "Re: " ought to be used since use of other strings or more than one instance can lead to undesirable consequences.
2.6. Resent Fields
Each of the resent fields corresponds to a particular field elsewhere in the syntax.
resent-date = "Resent-Date:" date-time CRLF resent-from = "Resent-From:" mailbox-list CRLF resent-sender = "Resent-Sender:" mailbox CRLF resent-to = "Resent-To:" address-list CRLF resent-cc = "Resent-Cc:" address-list CRLF resent-bcc = "Resent-Bcc:" [address-list / CFWS] CRLF resent-msg-id = "Resent-Message-ID:" msg-id CRLF
-
Resent fields SHOULD be added to any message that is reintroduced by a user into the transport system.
-
A separate set of resent fields SHOULD be added each time this is done.
-
All of the resent fields corresponding to a particular resending of the message SHOULD be grouped together.
-
Each new set of resent fields is prepended to the message; that is, the most recent set of resent fields appears earlier in the message.
-
No other fields in the message are changed when resent fields are added.
-
When resent fields are used, the "Resent-From:" and "Resent-Date:" fields MUST be sent.
-
The "Resent-Message-ID:" field SHOULD be sent.
-
"Resent-Sender:" SHOULD NOT be used if "Resent-Sender:" would be identical to "Resent-From:".
-
The "Resent-Message-ID:" field provides a unique identifier for the resent message.
2.7. Trace Fields
trace = [return] 1*received return = "Return-Path:" path CRLF path = angle-addr / ([CFWS] "<" [CFWS] ">" [CFWS]) received = "Received:" *received-token ";" date-time CRLF received-token = word / angle-addr / addr-spec / domain
2.8. Optional Fields
The field names of any optional field MUST NOT be identical to any field name specified elsewhere in this document.
optional-field = field-name ":" unstructured CRLF
3. Obsolete Specification
3.1. Obsolete Date and Time
The syntax for the obsolete date format allows
-
a 2 digit year in the date field, and
-
alphabetic time zone specifiers
Where a two or three digit year occurs in a date, the year is to be interpreted as follows:
-
If a two digit year is encountered whose value is between 00 and 49, the year is interpreted by adding 2000, ending up with a value between 2000 and 2049.
-
If a two digit year is encountered with a value between 50 and 99, or any three digit year is encountered, the year is interpreted by adding 1900.
Obsolete zones,
EDT is semantically equivalent to -0400 EST is semantically equivalent to -0500 CDT is semantically equivalent to -0500 CST is semantically equivalent to -0600 MDT is semantically equivalent to -0600 MST is semantically equivalent to -0700 PDT is semantically equivalent to -0700 PST is semantically equivalent to -0800
However, because of the error in [RFC0822], any time zones SHOULD all be considered equivalent to "-0000" unless there is out-of-band information confirming their meaning.
3.2. Obsolete Addressing
There are four primary differences in addressing.
-
mailbox addresses were allowed to have a route portion before the addr-spec when enclosed in "<" and ">". The route is simply a comma-separated list of domain names, each preceded by "@", and the list terminated by a colon.
-
CFWS were allowed between the period-separated elements of local-part and domain (i.e., dot-atom was not used). In addition, local-part is allowed to contain quoted-string in addition to just atom.
-
mailbox-list and address-list were allowed to have "null" members. That is, there could be two or more commas in such a list with nothing in between them, or commas at the beginning or end of the list.
-
US-ASCII control characters and quoted-pairs were allowed in domain literals and are added here.
3.3. Obsolete Header Fields
-
Allows multiple occurrences of any of the fields.
-
Fields may occur in any order.
-
Any amount of white space is allowed before the ":" at the end of the field name.


Mayhem in California
Two dead in school attack; gunman shoots self
SANTA CLARITA, California (AP) — A student gunman opened fire yesterday at a Southern California high school, killing two students, wounding three others and shooting himself in the head, authorities said; he was in grave condition.
The shooting occurred around 7:30 am at Saugus High School in Santa Clarita, about 30 miles (48 kilometres) north-west of downtown Los Angeles.
Shauna Orandi, 16, said she was in her Spanish class doing homework when she heard four gunshots that she initially mistook as instruments from a band class. She said a student burst into the room saying he'd seen the gunman, and her classmates were stunned into silence.
“My worst nightmare actually came true,” she said later, as she left a nearby park with her father. “This is it. I'm gonna die.”
Freshman Rosie Rodriguez said she was walking up the library stairs when she heard noises that “sounded like balloons” popping. She realised they were gunshots when she saw other students running.
Still carrying a backpack laden with books, she ran across the street to a home, where a person she didn't know gave shelter to her and about 10 other students.
“I just heard a lot of kids crying. We were scared,” Rodriguez said.
On a normal day, she said, Saugus High School felt very safe.
“We never really thought this would happen in our school,” she said.
Los Angeles County Sheriff Alex Villanueva said six people were shot, including the 16-year-old student suspect.
No details were released on a motive and his name was not released. Yesterday was his birthday.
A video of the shooting showed the gunman shooting himself in the head. Authorities say he was carrying a .45 calibre handgun and used the last bullet on himself.
The two students who died were a 16-year-old girl and a 14-year-old male. Their names were not released.
Saugus High School and other schools in the area were locked down.
Television images showed deputies swarming the school and several people being moved on gurneys. Lines of students were escorted from the school by armed deputies.
Anxious parents were awaiting reunification with their children in a park near the high school.
Los Angeles County Undersheriff Tim Murakami has tweeted an apology to the parents, saying investigators needed to interview the students before they could be released.
Orandi said she has heard about so many school shootings that she always assumed she'd panic in such a moment.
But she said she stayed calm, thanks to the help of her teacher who locked down the classroom.
The shots rang out — “bang! pop!” — and Orandi said she heard people yelling and running. Students in the classroom started crying and hugging one another.
“I just couldn't believe it was happening,” Orandi said.
She was escorted from the classroom to the school gym and later picked up by her father Hamid Orandi.
“She burst out crying like crazy, but I felt better because I knew the danger was gone,” he said. “It's one of those random things you always have to worry about.”
His daughter said she would probably go home and vomit from the stress.
Student Sharon Orelana Cordova told KNBC-TV she hid under a table in a nurse's office until officers came to get her.
“When I got out, I saw this person lying on the ground...with blood all over,” she said.


Biden holding Democratic campaign town hall at Vegas school
by Ken Ritter, The Associated PressLAS VEGAS — Former Vice-President Joe Biden brought an alarmist warning to a diverse crowd of Democrats in early-caucus Nevada during a town hall at an elementary school in a historically minority Las Vegas neighbourhood.
Biden opened a town hall event Saturday saying that as long as Donald Trump is president, the security and future of the United States is at risk.
With fewer than 100 days before Nevada Democratic party caucuses, Biden is among the front-runners in crowded field of candidates for president.
His evening appearance drew more than 250 people a day before Biden and most other Democratic presidential candidates are due to attend a campaign event at a Las Vegas resort.
Answering the first question, about poverty, he drew applause saying the minimum wage should be $15 an hour.
Ken Ritter, The Associated Press


| Home | A.A.D.A.M | NLP | Machine Learning | Data Visualization | Z.O.E. | S.I.M.O.N. | C.A.M. | ChatBots | HTML |
I created the Culinary Aid and Manager (C.A.M.) to be an aid in the kitchen to help the user prepare meals and use machine learning to recommend a balanced diet for the user. The program uses speech recognition to interpret requests from the user and Text-to-Speech to aid the user in meal preparation.
Recipes are stored in a csv file and labelled by: meal type, complexity etc. Cam can take requests such as "Give me an easy breakfast to make". Cam will pick up on key-words such as "Easy" and "Breakfast" to guide the user (through instructions stored in a list) through the preparation of the meal.
Cam will store the users meals in a secondary csv file with the given date the food was consumed in order to steer away from this option upon the next request and give more variance to the next time a meal is requested This feature can also be used to ensure a balanced diet for the user.
For households with multiple members: User can give reference to Cam as to whom they are feeding (ie: themselves, the whole family, etc.) and Cam will suggest meals accordingly.


--- layout: data_model title: ObservablesType this_version: 1.1 ---
The ObservablesType is a type representing a collection of cyber observables.
| Field Name | Type | Description |
|---|---|---|
| @cybox_major_versionrequired | string |
The cybox_major_version field specifies the major version of the CybOX language utilized for this set of Observables. |
| @cybox_minor_versionrequired | string |
The cybox_minor_version field specifies the minor version of the CybOX language utilized for this set of Observables. |
| @cybox_update_versionoptional | string |
The cybox_update_version field specifies the update version of the CybOX language utilized for this set of Observables. This field MUST be used when using an update version of CybOX. |
| Observable_Package_Source0..1 | MeasureSourceType |
The Observable_Package_Source field is optional and enables descriptive specification of how this package of Observables was identified and specified. |
| Observable1..n | ObservableType | |
| Pools0..1 | PoolsType |
The Pools construct enables the description of Events, Actions, Objects and Properties in a space-efficient pooled manner with the actual Observable structures defined in the CybOX schema containing references to the pooled elements. This reduces redundancy caused when identical observable elements occur multiple times within a set of defined Observables. |


Express intent
Every Flex Direct API transaction starts with merchant sending Capture Context Request to Flex API "create session" endpoint. This page allows merchant to express intent in regard to the scope of data captured. Controls below drive generation of "Capture Context Request" JSON payload and visualize Flex Direct API capture capabilities.


This is an open source project. Contribute here.
Usage
Access the API endpoint with the eINFO program code encoded as query parameter c
.
/api?c={code}
Find the code parameter through the eINFO URL, i.e. http://www.electronicinfo.ca/programs/203/
.


My Experience
{% if experienceList %}
{% for experience in experienceList %}
{% assign period = experience.job.date.start | append: " - " | append:experience.job.date.end %}
{% assign location = experience.company.location.city | append: ", " | append:experience.company.location.country %}
{% include _cards/_card-work-experience.html
title = experience.job.title
subTitle = experience.company.name
period = period
location = location
description = experience.job.description
responsibilities = experience.job.responsibilities
%}
{% endfor %}
{% endif %}


Awesome teaching support from TAs who did the bootcamp themselves. Getting guidance from them and learning from their experiences was easy.
“ The staff seem genuinely concerned about my progress which I find really refreshing. The program gave me the confidence necessary to be able to go out in the world and present myself as a capable junior developer. The standard is above the rest. You will get the personal attention you need from an incredible community of lgart and amazing people. ”
I received a job offer mid-course, and the subjects I learned were current, if not more so, in the company I joined. I honestly feel I got every penny’s worth.
“ I was an EMT for many years before I joined the bootcamp. I’ve been looking to make a transition and have heard some people who had an amazing experience here. I signed up for the free intro course and found it incredibly fun! I enrolled shortly thereafter. The next 12 weeks was the best - and most grueling - time of my life. Since completing the course, I’ve successfully switched careers, working as a Software Engineer at a VR startup. ”
I received a job offer mid-course, and the subjects I learned were current, if not more so, in the company I joined. I honestly feel I got every penny’s worth.
“ I was an EMT for many years before I joined the bootcamp. I’ve been looking to make a transition and have heard some people who had an amazing experience here. I signed up for the free intro course and found it incredibly fun! I enrolled shortly thereafter. The next 12 weeks was the best - and most grueling - time of my life. Since completing the course, I’ve successfully switched careers, working as a Software Engineer at a VR startup. ”
Awesome teaching support from TAs who did the bootcamp themselves. Getting guidance from them and learning from their experiences was easy.
“ The staff seem genuinely concerned about my progress which I find really refreshing. The program gave me the confidence necessary to be able to go out in the world and present myself as a capable junior developer. The standard is above the rest. You will get the personal attention you need from an incredible community of lgart and amazing people. ”
Awesome teaching support from TAs who did the bootcamp themselves. Getting guidance from them and learning from their experiences was easy.
“ The staff seem genuinely concerned about my progress which I find really refreshing. The program gave me the confidence necessary to be able to go out in the world and present myself as a capable junior developer. The standard is above the rest. You will get the personal attention you need from an incredible community of lgart and amazing people. ”


RAR is a archive format used by popular proprietary RAR archiver, created by Eugene Roshal. There are two major versions of format (v1.5-4.0 and RAR v5+).
File format essentially consists of a linear sequence of blocks. Each block has fixed header and custom body (that depends on block type), so it's possible to skip block even if one doesn't know how to process a certain block type.
This page hosts a formal specification of RAR (Roshall ARchiver) archive files using Kaitai Struct. This specification can be automatically translated into a variety of programming languages to get a parsing library.
import kaitai_struct_nim_runtime
import options
import /common/dos_datetime
import "dos_datetime"
type
Rar* = ref object of KaitaiStruct
`magic`*: Rar_MagicSignature
`blocks`*: seq[KaitaiStruct]
`parent`*: KaitaiStruct
Rar_BlockTypes* = enum
marker = 114
archive_header = 115
file_header = 116
old_style_comment_header = 117
old_style_authenticity_info_76 = 118
old_style_subblock = 119
old_style_recovery_record = 120
old_style_authenticity_info_79 = 121
subblock = 122
terminator = 123
Rar_Oses* = enum
ms_dos = 0
os_2 = 1
windows = 2
unix = 3
mac_os = 4
beos = 5
Rar_Methods* = enum
store = 48
fastest = 49
fast = 50
normal = 51
good = 52
best = 53
Rar_MagicSignature* = ref object of KaitaiStruct
`magic1`*: seq[byte]
`version`*: uint8
`magic3`*: seq[byte]
`parent`*: Rar
Rar_Block* = ref object of KaitaiStruct
`crc16`*: uint16
`blockType`*: Rar_BlockTypes
`flags`*: uint16
`blockSize`*: uint16
`addSize`*: uint32
`body`*: KaitaiStruct
`addBody`*: seq[byte]
`parent`*: Rar
`rawBody`*: seq[byte]
`hasAddInst`*: bool
`headerSizeInst`*: int8
`bodySizeInst`*: int
Rar_BlockFileHeader* = ref object of KaitaiStruct
`lowUnpSize`*: uint32
`hostOs`*: Rar_Oses
`fileCrc32`*: uint32
`fileTime`*: DosDatetime
`rarVersion`*: uint8
`method`*: Rar_Methods
`nameSize`*: uint16
`attr`*: uint32
`highPackSize`*: uint32
`fileName`*: seq[byte]
`salt`*: uint64
`parent`*: Rar_Block
`rawFileTime`*: seq[byte]
Rar_BlockV5* = ref object of KaitaiStruct
`parent`*: Rar
proc read*(_: typedesc[Rar], io: KaitaiStream, root: KaitaiStruct, parent: KaitaiStruct): Rar
proc read*(_: typedesc[Rar_MagicSignature], io: KaitaiStream, root: KaitaiStruct, parent: Rar): Rar_MagicSignature
proc read*(_: typedesc[Rar_Block], io: KaitaiStream, root: KaitaiStruct, parent: Rar): Rar_Block
proc read*(_: typedesc[Rar_BlockFileHeader], io: KaitaiStream, root: KaitaiStruct, parent: Rar_Block): Rar_BlockFileHeader
proc read*(_: typedesc[Rar_BlockV5], io: KaitaiStream, root: KaitaiStruct, parent: Rar): Rar_BlockV5
proc hasAdd*(this: Rar_Block): bool
proc headerSize*(this: Rar_Block): int8
proc bodySize*(this: Rar_Block): int
##[
RAR is a archive format used by popular proprietary RAR archiver,
created by Eugene Roshal. There are two major versions of format
(v1.5-4.0 and RAR v5+).
File format essentially consists of a linear sequence of
blocks. Each block has fixed header and custom body (that depends on
block type), so it's possible to skip block even if one doesn't know
how to process a certain block type.
@see Source
]##
proc read*(_: typedesc[Rar], io: KaitaiStream, root: KaitaiStruct, parent: KaitaiStruct): Rar =
template this: untyped = result
this = new(Rar)
let root = if root == nil: cast[Rar](this) else: cast[Rar](root)
this.io = io
this.root = root
this.parent = parent
##[
File format signature to validate that it is indeed a RAR archive
]##
let magicExpr = Rar_MagicSignature.read(this.io, this.root, this)
this.magic = magicExpr
##[
Sequence of blocks that constitute the RAR file
]##
block:
var i: int
while not this.io.isEof:
block:
let on = this.magic.version
if on == 0:
let it = Rar_Block.read(this.io, this.root, this)
this.blocks.add(it)
elif on == 1:
let it = Rar_BlockV5.read(this.io, this.root, this)
this.blocks.add(it)
inc i
proc fromFile*(_: typedesc[Rar], filename: string): Rar =
Rar.read(newKaitaiFileStream(filename), nil, nil)
##[
RAR uses either 7-byte magic for RAR versions 1.5 to 4.0, and
8-byte magic (and pretty different block format) for v5+. This
type would parse and validate both versions of signature. Note
that actually this signature is a valid RAR "block": in theory,
one can omit signature reading at all, and read this normally,
as a block, if exact RAR version is known (and thus it's
possible to choose correct block format).
]##
proc read*(_: typedesc[Rar_MagicSignature], io: KaitaiStream, root: KaitaiStruct, parent: Rar): Rar_MagicSignature =
template this: untyped = result
this = new(Rar_MagicSignature)
let root = if root == nil: cast[Rar](this) else: cast[Rar](root)
this.io = io
this.root = root
this.parent = parent
##[
Fixed part of file's magic signature that doesn't change with RAR version
]##
let magic1Expr = this.io.readBytes(int(6))
this.magic1 = magic1Expr
##[
Variable part of magic signature: 0 means old (RAR 1.5-4.0)
format, 1 means new (RAR 5+) format
]##
let versionExpr = this.io.readU1()
this.version = versionExpr
##[
New format (RAR 5+) magic contains extra byte
]##
if this.version == 1:
let magic3Expr = this.io.readBytes(int(1))
this.magic3 = magic3Expr
proc fromFile*(_: typedesc[Rar_MagicSignature], filename: string): Rar_MagicSignature =
Rar_MagicSignature.read(newKaitaiFileStream(filename), nil, nil)
##[
Basic block that RAR files consist of. There are several block
types (see `block_type`), which have different `body` and
`add_body`.
]##
proc read*(_: typedesc[Rar_Block], io: KaitaiStream, root: KaitaiStruct, parent: Rar): Rar_Block =
template this: untyped = result
this = new(Rar_Block)
let root = if root == nil: cast[Rar](this) else: cast[Rar](root)
this.io = io
this.root = root
this.parent = parent
##[
CRC16 of whole block or some part of it (depends on block type)
]##
let crc16Expr = this.io.readU2le()
this.crc16 = crc16Expr
let blockTypeExpr = Rar_BlockTypes(this.io.readU1())
this.blockType = blockTypeExpr
let flagsExpr = this.io.readU2le()
this.flags = flagsExpr
##[
Size of block (header + body, but without additional content)
]##
let blockSizeExpr = this.io.readU2le()
this.blockSize = blockSizeExpr
##[
Size of additional content in this block
]##
if this.hasAdd:
let addSizeExpr = this.io.readU4le()
this.addSize = addSizeExpr
block:
let on = this.blockType
if on == rar.file_header:
let rawBodyExpr = this.io.readBytes(int(this.bodySize))
this.rawBody = rawBodyExpr
let rawBodyIo = newKaitaiStream(rawBodyExpr)
let bodyExpr = Rar_BlockFileHeader.read(rawBodyIo, this.root, this)
this.body = bodyExpr
else:
let bodyExpr = this.io.readBytes(int(this.bodySize))
this.body = bodyExpr
##[
Additional content in this block
]##
if this.hasAdd:
let addBodyExpr = this.io.readBytes(int(this.addSize))
this.addBody = addBodyExpr
proc hasAdd(this: Rar_Block): bool =
##[
True if block has additional content attached to it
]##
if this.hasAddInst != nil:
return this.hasAddInst
let hasAddInstExpr = bool((this.flags and 32768) != 0)
this.hasAddInst = hasAddInstExpr
if this.hasAddInst != nil:
return this.hasAddInst
proc headerSize(this: Rar_Block): int8 =
if this.headerSizeInst != nil:
return this.headerSizeInst
let headerSizeInstExpr = int8((if this.hasAdd: 11 else: 7))
this.headerSizeInst = headerSizeInstExpr
if this.headerSizeInst != nil:
return this.headerSizeInst
proc bodySize(this: Rar_Block): int =
if this.bodySizeInst != nil:
return this.bodySizeInst
let bodySizeInstExpr = int((this.blockSize - this.headerSize))
this.bodySizeInst = bodySizeInstExpr
if this.bodySizeInst != nil:
return this.bodySizeInst
proc fromFile*(_: typedesc[Rar_Block], filename: string): Rar_Block =
Rar_Block.read(newKaitaiFileStream(filename), nil, nil)
proc read*(_: typedesc[Rar_BlockFileHeader], io: KaitaiStream, root: KaitaiStruct, parent: Rar_Block): Rar_BlockFileHeader =
template this: untyped = result
this = new(Rar_BlockFileHeader)
let root = if root == nil: cast[Rar](this) else: cast[Rar](root)
this.io = io
this.root = root
this.parent = parent
##[
Uncompressed file size (lower 32 bits, if 64-bit header flag is present)
]##
let lowUnpSizeExpr = this.io.readU4le()
this.lowUnpSize = lowUnpSizeExpr
##[
Operating system used for archiving
]##
let hostOsExpr = Rar_Oses(this.io.readU1())
this.hostOs = hostOsExpr
let fileCrc32Expr = this.io.readU4le()
this.fileCrc32 = fileCrc32Expr
##[
Date and time in standard MS DOS format
]##
let rawFileTimeExpr = this.io.readBytes(int(4))
this.rawFileTime = rawFileTimeExpr
let rawFileTimeIo = newKaitaiStream(rawFileTimeExpr)
let fileTimeExpr = DosDatetime.read(rawFileTimeIo, this.root, this)
this.fileTime = fileTimeExpr
##[
RAR version needed to extract file (Version number is encoded as 10 * Major version + minor version.)
]##
let rarVersionExpr = this.io.readU1()
this.rarVersion = rarVersionExpr
##[
Compression method
]##
let methodExpr = Rar_Methods(this.io.readU1())
this.method = methodExpr
##[
File name size
]##
let nameSizeExpr = this.io.readU2le()
this.nameSize = nameSizeExpr
##[
File attributes
]##
let attrExpr = this.io.readU4le()
this.attr = attrExpr
##[
Compressed file size, high 32 bits, only if 64-bit header flag is present
]##
if (this.parent.flags and 256) != 0:
let highPackSizeExpr = this.io.readU4le()
this.highPackSize = highPackSizeExpr
let fileNameExpr = this.io.readBytes(int(this.nameSize))
this.fileName = fileNameExpr
if (this.parent.flags and 1024) != 0:
let saltExpr = this.io.readU8le()
this.salt = saltExpr
proc fromFile*(_: typedesc[Rar_BlockFileHeader], filename: string): Rar_BlockFileHeader =
Rar_BlockFileHeader.read(newKaitaiFileStream(filename), nil, nil)
proc read*(_: typedesc[Rar_BlockV5], io: KaitaiStream, root: KaitaiStruct, parent: Rar): Rar_BlockV5 =
template this: untyped = result
this = new(Rar_BlockV5)
let root = if root == nil: cast[Rar](this) else: cast[Rar](root)
this.io = io
this.root = root
this.parent = parent
proc fromFile*(_: typedesc[Rar_BlockV5], filename: string): Rar_BlockV5 =
Rar_BlockV5.read(newKaitaiFileStream(filename), nil, nil)


Email is required.
Enter valid email address.
Email doesn't match with {{user.santa.name.first}}'s email
Congratulations {{user.santa.name.first}} you are santa for


About Us
How it Works
Breaking Stereotypes
Breaking Stereotypes
We strive to challenge other people's perceptions of race. By implementing an interface to chat with others, we hope to achieve our goal.
We encourage a friendly and open space to speak your mind and express your feelings about a given topic.
After chatting, you will be prompted to choose what ethnicity you think the person you chatted with is.


BrainLab-CI¶
Welcome to BrainLab-CI (BLCI)! BLCI is a continuous integration environment for collaborative, community experiments with data-quality controls and full provenance.
Welcome to BrainLab-CI (BLCI)! BLCI is a continuous integration environment for collaborative, community experiments with data-quality controls and full provenance.


Beta This is a test version of the layout of this page. Take the survey to help us improve it
Collection
Reports on the independent evaluation of the SEND pathfinders programme which tested reforms proposed in the SEND green paper.
In October 2011, we set up 20 trials with 31 local authorities to test the proposals in the SEND green paper . The aim is to improve the support available to children and young people with special educational needs and disabilities.
The proposals we are testing include the introduction of a new single assessment process, an education, health and care (EHC) plan and personal budgets for children, young people and families with SEND .
On 13 June 2013 we launched the first in a series of introductory pathfinder information packs , bringing together emerging principles, materials and case studies from the pathfinder programme. We will be updating the packs regularly and plan to publish new packs every 2 months.
The department commissioned an independent evaluation of the pathfinder programme to find out if the different approaches taken:
The independent evaluation, together with lessons learned from the pathfinders, has helped to draft the legislation and will support national implementation of the reforms.
In April 2013, we appointed pathfinder champions to help non-pathfinder areas prepare for the SEND reforms through a mix of regional events, workshops, and one-to-one support, as well as self-evaluation and planning tools.
This letter explains how the pathfinder champions can help local authorities to implement the reforms in their area.


Lydia Chilton is an Assistant Professor in the Computer Science Department at Columbia University. She is an early pioneer in crowdsourcing complex tasks on Mechanical Turk. Currently she leads the Computational Design Lab, whose goal is to build AI tools that enhance people's productivity. She is also teaching courses such as UI-Design and Advanced Design at Columbia, and is the wind behind our wings as our Designathon’s faculty mentor.
Scott Barry Kaufman is a humanistic psychologist exploring the depths of human potential. His interest lies in using his research to help all kinds of minds live a creative, fulfilling, and self-actualized life. In 2015, he was named one of “50 Groundbreaking Scientists who are changing the way we see the world” by Business Insider.
Yohana Tesfamariam Tekeste is an experienced Staff Associate with a demonstrated history of working in the higher education industry. Yohana is interested in the development of various informative tools to help agricultural stakeholders in their decision making processes. She received a Master's Degree focused in Biotechnology from Columbia.
Co-founder and CEO of EVQLV. He is passionate about using machine learning to advance, evolve, and modernize biotech and the pharmaceutical industry. Skilled in the application of advanced technologies, machine learning, drug discovery, preclinical research, clinical studies, regulatory pathways, business process improvement, and leadership.
Harry West is a Professor of Practice in Mechanical Engineering, Industrial Engineering, and Operations Research. He is interested in the intersection of design, data and behavior change with a focus on developing new ways to reduce consumption. Harry was formerly the CEO of frog, Senior Partner at Prophet, and CEO at Continuum, developing new products with P&G such as Swiffer and ThermaCare.
Harry West is a Professor of Practice in Mechanical Engineering, Industrial Engineering, and Operations Research. He is interested in the intersection of design, data and behavior change with a focus on developing new ways to reduce consumption. Harry was formerly the CEO of frog, Senior Partner at Prophet, and CEO at Continuum, developing new products with P&G such as Swiffer and ThermaCare.
Sarah Morrison Smith is a Roman Family Teaching and Research Fellow at Barnard with a focus on Human-Centered Computing. Her interests are alternative input modalities via gestural interfaces, e-Science and data sharing in life sciences, and usable security. She has written many publications and was a reviewer in conferences such as the ACM International Conference on Intelligent User Interfaces.
Yohana Tesfamariam Tekeste is an experienced Staff Associate with a demonstrated history of working in the higher education industry. Yohana is interested in the development of various informative tools to help agricultural stakeholders in their decision making processes. She received a Master's Degree focused in Biotechnology from Columbia.
Alex Weintraub is a Core Lecturer for Art Humanities, receiving his Ph.D. in Columbia’s Department of Art History and Archaeology. He has published work in the peer-reviewed journal nonsite, exhibition catalogs for MoMA, and the Fondation Vincent van Gogh Arles. He has also presented at conferences at the Frick Collection, the University of Amsterdam, and the Institut national d’histoire de l’art.
Eugene Wu is an Assistant Professor of Computer Science at Columbia University. His current research areas are on developing tools to help provide explanations for anomalous data or analysis results. He was granted the VLDB 2018 10-year test of time award, best-of-conference citations at ICDE and VLDB, the SIGMOD 2016 best demo award, the NSF CAREER, and Google and Amazon faculty awards.


Academic Qualifications
- Ph.D. VLSI Design, ABV-APJ Technical University and Management (IIITM), Gwalior (2015).
- M. Tech. VLSI Design, ABV-APJ Technical University and Management (IIITM), Gwalior (2010).
- B. E. Electronics and Communication Engineering, RGTU Bhopal (2008).
Research interests
- Novel Semiconductor Device Design and Modeling.
- Device-Circuit Co-Design.
- Hybrid Device-Circuit Interaction.
- Analog and Mixed Signal Design.
- Tunnel FET, Graphene FET and other related devices.
- Low power VLSI Design.
Work Experience
- Assistant Professor at Manav Rachna International University (MRIU), Faridabad (2010-2011).
- Faculty Associate at APJ Technical University, Bangalore, Gujarat (June 2015- October 2015).
- Assistant Professor at APJ Technical University, Bangalore, Gujarat (November 2015 Onwards)
- Visiting Faculty at DA-IICT Gandhinagar.
Publications
International Peer Review Journals
- Kamal K. Jha, Varun Sharma, and Manisha Pattanaik, Line Tunnel FET Parameter Variations:A Simulation Study, Journal of Computational and Theoretical Nanoscience, Vol. 12, No. 09, pp. 1-4, 2015.
- Kamal K. Jha, Varun Sharma, and Manisha Pattanaik, Impact of Temperature Variations on Line Tunnel FET for Low Power Applications, Journal of Computational and Theoretical Nanoscience, Vol. 12, No. 11, pp. 1-4, 2015.
- Kamal K. Jha and Manisha pattanaik, Enhanced ON Current Pocket Tunnel FET for Circuits Operating Near-Threshold, Quantum matter, Vol. 4, No. 2, pp. 1-4, 2015.
- Abhishek Mishra, Kamal K. Jha, Manisha Pattanaik, Parameter Variation Aware Hybrid TFET-CMOS Based Power Gating Technique with a Temperature Variation Tolerant Sleep Mode, Microelectronics Journal, Vol. 45, No. 11, pp. 1515-1521, 2014.
- Kamal K. Jha, Manisha pattanaik, Analysis of Pocket Double Gate Tunnel FET for Low Standby Power Logic Circuits, International Journal of VLSI Design & Communication Systems (VLSICS), Vol. 4, No. 6, pp. 27-34, 2013.
- Kamal Kishor Jha, Anurag Srivastava, Dual Material Single Layer (DMSL) Segmentation of Insulator with High-k/Metal for Leakage Reduction and Low Power Application, ISST Journal of Electrical & Electronics Engineering Vol. 1 No.1, pp. 17-21, 2010.
International Conferences
- Jagdeep Rahul, Anurag Srivastava, Shekhar Yadav, Kamal Kishor Jha, Performance Evaluation of Junctionless Vertical Double Gate MOSFET, International Conference on Devices, Circuits and Systems (ICDCS), Coimbatore, India, March 2012.
- Shekhar Yadav, Anurag Srivastava, Jagdeep Rahul, Kamal Kishor Jha, TCAD Assessment of Nonconventional Dual Insulator Double Gate MOSFET, International Conference on Devices, Circuits and Systems (ICDCS), Coimbatore, India, March 2012.
- Kamal Kishor Jha, Anurag Srivastava, Manisha Pattanaik, Pradip Swarnkar, Design and Estimation of Drive Current of Scaled Devices by Selection of Suitable Metal Gate with Zr Oxide Dielectric in nm Regime, Proceedings of the International Conference on Nanoscience, Engineering and Technology (ICONSET), November 2011.
- Kamal Kishor Jha, Ankita Jain, Manisha Pattanaik, Anurag Srivastava, Performance Analysis of NMOS for Higher Speed and Low Power Applications, DATICS-Future Tech-10, IEEE Conference, South Korea,2010.
- Kamal Kishor Jha, Anurag Srivastava, DQWRTD MOSFET for Leakage Reduction and Low Power Applications, DATICS-Future Tech-10, IEEE Conference, South Korea, 2010.
National Conferences
- Kamal Kishor Jha, Anurag Srivastava, Gate Leakage Reduction through high-k/metal gate, National Seminar on Advances in Materials and Devices, ITM University, Gurgaon, India, May 2010.
- Kamal Kishor Jha, Anurag Srivastava, Scaling of NMOS 600-90nm, Seminar on Advancement & Future Trends in VLSI Design & Embedded Systems-ATVES, Feb. 2010.
Courses of interest
- Analog Electronics and Circuits.
- Electronic Devices and Circuits.
- Digital Electronics.
- Analog CMOS Integrated Circuits Design.
- Digital CMOS Integrated Circuits Design.
- Nano-scale Device Modeling.
- Nano-electronics/Nanotechnology.
Membership
Contact
Email<EMAIL_ADDRESS><EMAIL_ADDRESS>Phone::+91-7624024051


Using RequireJS In WordPress
byAs mentioned in my 2013 site redesign post, I started redesigning this site on top of WordPress but eventually switched over to Jekyll. This was because my goal was to use RequireJS to control all the site's JavaScript in a specific way, and WordPress kept me from doing this.
The issue: my RequireJS setup needed to treat jQuery as a dependency for certain code modules. But a default WordPress install includes jQuery, and WP needs to manage it and other internal JS files in a manner that benefits its entire ecosystem: a manner that imposed limits on what I wanted RequireJS to do.
(Side note: this post is long so if you're looking for a quick answer for using RequireJS inside of WordPress, go to the "How To Use jQuery, RequireJS & WordPress Together" section.)
Table of Contents
- Assumptions & Notes
- What Is RequireJS?
- A RequireJS Example
- How I THOUGHT RequireJS Should Bring jQuery Into WordPress
- The RIGHT Way To Load jQuery Into WordPress
- How To Use jQuery, RequireJS & WordPress Together
- RequireJS/AMD, WordPress & The Future?
- Conclusion
Assumptions & Notes
I'm making a few assumptions:
The main assumption is that you understand WordPress beyond configuring it inside the Dashboard. This post discusses adding code to WordPress files so you should be comfortable doing this. You should also understand that adjusting code in WP is relatively easy when using the WordPress Codex as a reference.
All my initial RequireJS/WordPress work was done inside a child theme, a well-defined WP best practice, so I'm assuming you know how to implement this. If not, the Child Theme docs in the WordPress Codex clearly describe how it's done.
RequireJS is relatively new when compared to WordPress so I do walk through the former more that the latter, but it's still only a walk-through. RequireJS can do much more than the tasks discussed in this post so I'm assuming that you're curious about RequireJS and have no problem reading a few things to better understand it, starting with the RequireJS API docs.
Some notes...
This post should not be looked as my stating that "WordPress is bad." WordPress is awesome and I will continue to use it, but it was not the way to go in order to meet the RequireJS-related goal I set for myself with this redesign. I discuss this at great length in my site redesign post.
When I started working on the redesign, I was working with WordPress version 3.5.2. I then left for Jekyll and since that time, WordPress has released versions 3.6 and 3.7, the latter being released shortly before this post's publish date.
TwentyTwelve was the default theme for 3.5.2, and was what my child theme was based upon. Both 3.6 and 3.7 use TwentyThirteen as its default theme, which loads JavaScript onto a WP site differently from TwentyTwelve and previous themes.
I did test some RequireJS things in version 3.6/TwentyThirteen and did no testing in version 3.7 testing at all because it was released roughly three weeks before this post's publish date. So this post's point of view is from using RequireJS inside a 3.5.2/TwentyTwelve setup, but what really matters is how WordPress pre-installs JS libraries and plugins before the themes actually use them. That, I have tested across all the versions and themes mentioned: the pre-install process is the same all around.
And finally, there were some RequireJS things that I struggled with at both the beginning and end of the redesign. I pile a ton of gratitude onto Cary Landholt for helping me through the struggles. Spending some time going through Cary's YouTube screencasts is time well spent, particularly his RequireJS ones that are geared for beginners.
What Is RequireJS?
RequireJS is a script loader written in JavaScript that creates a dependency management system within your website or web app. It's based on the Asynchronous Module Definition (AMD) specification which defines a code pattern for loading JS files in an asynchronous, organized, non-blocking fashion.
Generally speaking, a RequireJS setup consists of two parts:
A group of modules: single units of JavaScript code that execute either a code block or a small group of closely-related code blocks. You can create multiple modules, with each module executing the code block(s).
Configurations: settings you pass to RequireJS so it can properly manage all the modules within your site or app, making sure everything works seamlessly.
The modules contain not only the code needed to run your task(s), but also lists the dependencies that this code needs to run the task(s). These dependencies are things like the core jQuery library and plugins
Based on the configurations, RequireJS asynchronously loads the modules and dependencies onto your site. Let's examine this further by looking at an example of how RequireJS works on kaidez.com.
A RequireJS Example
This site's search functionality is powered by the Tipue Search plugin for jQuery. It takes end-user searches and returns the search results based on the data in a JSON object containing the site content.
Tipue needs four separate JS files to work and should be listed in the following order on an HTML page:
jquery.js
: the core jQuery library.tipuesearch_content.js
: the file that contains the JSON object with the site content.tipuesearch_set.js
: the file that sets rules for certain words inputed into the search field, rules such as "ignore words like 'the' and 'or' in search inputs".tipuesearch.js
: the core Tipue plugin code.
In the past, setting up this functionality usually meant placing all these files in <script>
tags on your HTML page in the order above, then putting your custom Tipue code somewhere below them. RequireJS allows for an easier process.
First, we add the only <script>
tag we need...it should go as close to the bottom of the page as possible:
<script data-main="scripts/config" src="scripts/require.js"></script>
The info in the data-main
attribute refers to a file called config.js
which contains the configurations. The .js
is purposely left off because RequireJS always assume that the info referenced in this attribute is a JavaScript file.
require.js
refers to the file containing the core RequireJS code.
Both files are in a directory called scripts
.
The configurations in our config.js
file look like this:
// We're only talking about creating one module here but this is
// the config setup for creating multiple modules. This is
// what's being discussed because it's common practice to use
// multiple modules in a site/app build. The process for
// configuring a single module is discussed over at:
// http://requirejs.org/docs/api.html#define.
requirejs.config({
baseUrl: "/",
deps: ["search"],
paths: {
jquery: "libs/jquery.min", // v.1.10.2
tipue: "libs/tipuesearch.min",
tipueset: "libs/tipuesearch_set",
tipuesetContent: "libs/tipuesearch_content"
},
shim: {
tipue: {
deps: ["jquery"],
exports: "tipue"
}
}
});
Let's break all this down...
requirejs.config({
...
});
We wrap our code in a JavaScript object that will pass our configurations to the core RequireJS code.
baseUrl: "/",
baseURL
represents a relative reference to the location of all the JS files that RequireJS must manage. In this case, the location is the scripts
folder.
(Side note: I'm using a very simplified file structure in order to keep this post from being too long, but the RequireJS docs do outline some best practices in terms of organizing your code. The Load JavaScript Files section in the RequireJS docs is the place to read up on this.)
deps: ["search"],
deps
is an array of all the dependencies for our site or app. The dependencies are the code modules that we talked about and are really just .js
files. Therefore, the search
that's mentioned in the array is referring to a file called search.js
and will contain the code needed to make Tipue work on the site. We'll get to that code shortly and to be clear, search.js
is located in the scripts
folder.
paths: {
jquery: "libs/jquery.min", // v.1.10.2
tipue: "libs/tipuesearch.min",
tipueset: "libs/tipuesearch_set",
tipuesetContent: "libs/tipuesearch_content"
},
paths
is a JavaScript object that lists the dependencies for the items listed in the deps
array...you can think of them as the "dependencies of the dependencies". These files are located in a directory called libs
that's in our scripts
folder.
As you can see, these are the previously-discussed four files that Tipue needs to function properly on our website. Also note that we're using jQuery 1.10.2: this will be important when we start talking about the last part of the configs.
shim: {
tipue: {
deps: ["jquery"],
exports: "tipue"
}
}
As previously-mentioned, RequireJS is based on the AMD spec which defines a code pattern for loading JS files asynchronously. JavaScript files containing this pattern are said to be "AMD-compliant."
If the dependency is not AMD-compliant, RequireJS must force it to be so. That's what's happening here in this shim
setting.
tipue
is a reference to our core Tipue plugin code that was defined in the paths
object. It's not AMD-compliant so it's shimmed in.
deps
tells RequireJS that the shimmed-in file needs jQuery to work properly. exports
, a core Node.js concept, properly exposes the shimmed-in file to RequireJS so it can treat it as a dependency based on the AMD spec.
Both the tipueset
and tipuesetContent
files listed in paths
are also not AMD-compliant; however, they're just providing support for tipue
to do its job instead of executing code. In this instance, there's no need to shim them.
jQuery also doesn't need to be shimmed in. This is because we're using version 1.10.2 and jQuery has been AMD-compliant since version 1.7.
Now that our configs are set, we need to create the code that runs our Tipue search functionality. This goes into the search.js
file that we referred to earlier in our deps
array and looks like this:
define(["jquery","tipuesetContent","tipueset","tipue"], function($, tipuesetContent, tipueset, tipue) {
$("#tipue_search_input").tipuesearch({
"show": 10,
"showURL": false,
"highlightEveryTerm": true
});
});
The define()
method first defines all the code's dependencies in the array, then passes them as parameters for use by a callback function. Note that they're listed in the order outlined above: RequireJS will load things in this order.
The callback function contains our custom code, which does the following tasks:
- It takes the returned search results and places them in a page element with an id of
tipue_search_input
- It will "show" 10 results per page.
- it will not "show the URL" for each result.
- It will "highlight" whatever the search term was by bolding it.
Our code is done. When our HTML page loads into a browser, scripts/require.js
looks at the configurations in scripts/config
and notices the deps: ["search"]
setting, which refers to scripts/search.js
. It then sees that search
needs four files to work properly, all of which are listed in the paths
object.
RequireJS loads these four files and scripts/search.js
into the <head>
tag, and in the proper order. If the <script>
tag is placed as close to the bottom of the page as possible, all the files will usually load in a manner that doesn't slow down your site's/app's load time. The code in scripts/search.js
executes after everything loads.
(Side note: your project's RequireJS files can be concatenated and minified down to a single file, but discussing this is outside the scope of this post. The RequireJS optimization docs outline how to get this done. Plus, Cary Landholt has a great YouTube screencast on RequireJS Optimization.)
This was the code that I wanted to integrate into WordPress...and this was where I started running into problems. Understanding these problems "requires" an understanding a few things about WordPress.
How I THOUGHT RequireJS Should Bring jQuery Into WordPress
While TwentyThirteen preloads jQuery and other JavaScript files into the site's HTML, the TwentyTwelve theme I was working with does not. I was fine with this because as the above example illustrates, you only need to load one script
tag onto the page to get RequireJS working.
As mentioned in the beginning, a default WordPress install contains jQuery other internal JS files. So I figured that I would just bring jQuery into my RequireJS configs by pointing to where WordPress placed it during install via the paths
object:
paths: {
// This ignores the 'baseURL' setting, but works well for Wordpress
http://kaidez.com/wp-includes/js/jquery/jquery.js,
...
}
This worked fine for my RequireJS setup but creates potential future problems inside of WordPress.
The RIGHT Way To Load jQuery Into WordPress
The default WordPress install contains many JS file that are "registered," meaning that WP knows they exist but doesn't necessarily load them into the theme's HTML. jQuery is an unloaded registered file in TwentyTwelve so it can come into the HTML in one of two ways:
- a WordPress plugin that needs jQuery loads it in during the plugin's install.
- a WordPress PHP function called
wp_enqueue_script
loads it onto the page. This needs to be hand-written and should be placed in a customfunctions.php
file in your child theme...read more about wp_enqueue_script and functions.php
Once a registered file is loaded in like this, WordPress knows not to install it again. In other words, if jQuery loads into the HTML via either a plugin or wp_enqueue_script
, subsequent plugins requiring jQuery won't install it and will just use the one already installed.
Looking at my code snippet above, I didn't use any of these two methods...I just referred to the file in the paths
object. This meant that WordPress had absolutely NO idea that jQuery was already on the site.
As a result, if I installed a WordPress plugin requiring jQuery, WP would load it into the HTML, meaning there would be two jQuery files on my page and that's not good. I was 99.99999% sure that I wouldn't be using such plugins and this would be a non-issue, but I wasn't 100% sure.
How To Use jQuery, RequireJS & WordPress Together
With the 3.5.2/ TwentyTwelve setup, the safest thing to do was to use wp_enqueue_script
to bring jQuery into the HTML. The code for this would be placed in the just-mentioned functions.php
file and would look like this:
<?php
function my_scripts_method() {
wp_enqueue_script( 'jquery' );
}
add_action( 'wp_enqueue_scripts', 'my_scripts_method' );
?>
This loaded jQuery onto my page while preventing jQuery duplicates from loading, but I wasn't sure how to integrate this setup with my RequireJS functionality.
I surfed the web awhile looking for an answer, eventually posting something on RequireJS' GitHub Issue Tracker. It was at that point that RequireJS creator James Burke gave me an answer so simple that to this day, I'm kicking myself for not figuring it out on my own:
"...if jquery is already in the page, what you could do is detect for it before doing [a] require() loading and set it up as the 'jquery' module value:
if (typeof jQuery === 'function') {
define('jquery', function () { return jQuery; });
}
//Now require your code:
require(['app'], function (){});
This assumes jquery was loaded before the require call. If so, then this approach means requirejs will not load another version of jquery."
Yup...kicking myself for missing the obvious. Had I stuck with WordPress, I would apply wp_enqueue_script
to jQuery in using the method above, then setup search.js
like this:
if (typeof jQuery === 'function') {
define('jquery', function () { return jQuery; });
}
define(["jquery","tipuesetContent","tipueset","tipue"], function($, tipuesetContent, tipueset, tipue) {
$("#tipue_search_input").tipuesearch({
"show": 10,
"showURL": false,
"highlightEveryTerm": true
});
});
I tested this inside of WordPress and it worked like a charm, but I had to get jQuery on the page via wp_enqueue_script
. This meant that jQuery would be placed in a <script>
tag on my page and be excluded from my final RequireJS build.
This is, generally, not how RequireJS works and I was very stubborn about managing all my site's JavaScript with RequireJS so I could better understand how it works. It was at this point that I went over to Jekyll but if I ever need to use RequireJS and WordPress together, I would do so using the method above.
RequireJS/AMD, WordPress & The Future?
RequireJS and AMD are gaining in popularity so integrating them into WordPress is worth a discussion. Web searches show some RequireJS implementations inside of WordPress by developers, but there's no indication from the core WP team that AMD functionality will be bundled in a future version.
An interesting discussion has built up around a feature request ticket to bring AMD JavaScript loading into WordPress. Referring primarily to jQuery, the discussion's main point is that the various WordPress plugins don't necessarily use the same versions of the JavaScript library. Some plugins require an older version of jQuery: creating an AMD system that allows plugin developers to load an older version is offered as a solution to the problem.
WordPress somewhat solved this problem with the release of the TwentyThirteen theme. The theme comes bundled with jQuery Migrate, which detects and loads deprecated jQuery features. Plugin developers in need of jQuery's older features can take advantage of this, after testing things, of course.
At the same time, the core WordPress team encourages plugin authors to update their plugin code when one of their dependencies get updated. jQuery Migrate may be solving a problem, but the core team would prefer it if authors applied updates themselves...WordPress SEO plugin creator Joost de Valk wrote a great post on this subject.
Even if jQuery Migrate didn't solve this problem, I'm of the opinion that WordPress can't do much more than this right now. Integrating RequireJS or another AMD JavaScript solution is nice to have in WP, but not crucial to its growth and survival. And doing so would mean a major code rewrite of how WordPress already handles JavaScript, which is currently fine as is.
Simply put, WordPress is content management system meant to solve customer and business problems. It needs to be demonstrated that AMD/RequireJS can solve such a problems and until that happens, I can't see this functionality landing into WordPress...just my opinion on all this.
Conclusion
Bringing RequireJS into WordPress is possible, but you may have to make adjustments in some spots to make sure everything works. That's a natural occurrence in web development though, so feel free to review the many links above and go ahead and do so.


Click here to see our locations and find the 716 Quesadillas closest to you.
Browse our menu at any time by clicking here.
Have a question? Suggestions? Send us an email.


THE MIRROR HAS TWO FACES A film review by Scott Renshaw Copyright 1996 Scott Renshaw
(Tri-Star) Starring: Barbra Streisand, Jeff Bridges, Lauren Bacall, Mimi Rogers, Pierce Brosnan, George Segal, Brenda Vaccaro. Screenplay: Richard LaGravenese. Producers: Barbra Streisand, Arnon Milchan. Director: Barbra Streisand. MPAA Rating: PG-13 (profanity, adult themes) Running Time: 125 minutes. Reviewed by Scott Renshaw.
Mock Barbra Streisand if you will for her insistence upon being photographed with the kind of back-lighting we haven't seen since Stevie Nicks was making music videos; after all, you'll be in good company if you do. Cinematographer Dante Spinotti and many of his technicians were fired from the production of THE MIRROR HAS TWO FACES, supposedly for not shooting her in the most flattering manner possible, leading to insider jabs like "The Mirror Has Two Chins." Whatever the reasons for the rosy, soft-focus look of MIRROR, it is a style which works for this decidedly old-fashioned romantic comedy. It is only when the film strays from the traditions of 1940s screwball that it loses its opportunity to be a real comic treat.
Streisand plays Rose Morgan, a Columbia University literature professor resigned to the role of ugly duckling, living in the shadow of a glamour-obsessed mother (Lauren Bacall) and losing lovers to her more beautiful sister Claire (Mimi Rogers). A well-meaning Claire tries to help Rose by responding for her to a personal ad placed by Gregory Larkin (Jeff Bridges), a math professor whose inability to deal rationally with sexual relationships has led him to seek celibate, intellectual companionship. When the two meet, they become fast friends, exactly the kind of non-romantic partners Gregory has in mind, inspiring him to propose a marriage which will be of minds only. Rose accepts, but complications arise when she finds herself violating their arrangement by making the mistake of falling in love with her husband.
THE MIRROR HAS TWO FACES draws most of its charm from the appealing pairing of Streisand and Bridges. Bridges has long been one of our most under-appreciated actors, but his versatility is on full display in the quirky role of Gregory. There is a certain stock quality to the "hapless intellectual" part, but Bridges gives it more warmth and self-awareness; it is because he _knows_ that he is hapless that he resorts to such unconventional methods in the first place. Streisand also does nice work making Rose's growing frustration both funny and touching, and she has a wonderfully natural scene giving a lecture on love in romantic literature. Together Bridges and Streisand share a goofy chemistry in their very lack of chemistry, supported admirably by Rogers, Bacall, Pierce Brosnan (as Rogers' husband), George Segal (in the "his confidante" role) and Brenda Vaccaro (in the "her confidante" role).
In many ways, THE MIRROR HAS TWO FACES is the perfect set-up for a throwback romantic farce, but along the way to the "happily ever after" it keeps stumbling over some fairly fundamental points. The script by Richard LaGravenese has its share of tart one-liners, but it is awfully talky. MIRROR's one entertaining scene of physical comedy, in which Rose tries gamely to seduce Gregory, comes quite late in the game, by which time it has become clear that its two hour plus running time was doing the story no favors. Streisand may have wanted a lush romantic fairy tale full of Marvin Hamlisch strings and doe-eyed conversations, but she sacrificed a lean, sharp comedy in the process. She also doesn't use that extra time to establish how much alike Rose and Gregory are in their romanticism; if Bridges makes one big mistake in his performance, it is making Gregory's rationalizations for his behavior sound too pat. It should be clear that both parties are struggling against the same feelings, if struggling unequally, rather than appearing that Streisand is the desperate woman pursuing the reluctant man.
There is, of course, also the matter of how convinced you are that Rose is the homely closet case she is supposed to be. Streisand may be nobody's idea of a conventional beauty, but her boudoir-photograph style close-ups throughout the film tend to work against the baggy sweaters and frumpy demeanor; when she finally goes for full-on glamour late in the film, it is less a metamorphosis than a relief. Many viewers may find her character too far-fetched to swallow, much as they had problems with Janeane Garofolo as the "ugly one" in THE TRUTH ABOUT CATS & DOGS, but I'm not convinced that is the problem. THE MIRROR HAS TWO FACES is reminiscent of Hollywood film-making when the star was always filmed, like Claudette Colbert, with only her best side to the camera, and it is pleasant enough in its retro sort of way. The smiles rarely turn into laughs, however, and Streisand's notorious attention to detail has somehow caused her to miss the big picture: at some point, this romance needed to set off a spark. THE MIRROR HAS TWO FACES doesn't quite have that fire, substituting a warm, soft lamp placed strategically behind Streisand's hair.
On the Renshaw scale of 0 to 10 mirror images: 6.
Visit Scott Renshaw's MoviePage http://www-leland.stanford.edu/~srenshaw Subscribe to receive reviews directly via email See details on the MoviePage
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


BookKeeper Getting Started Guide
Programming with BookKeeper
Instantiating BookKeeper.
The first step to use BookKeeper is to instantiate a BookKeeper object:
org.apache.bookkeeper.BookKeeper
There are three BookKeeper constructors:
public BookKeeper(String servers) throws KeeperException, IOException
where:
-
servers is a comma-separated list of ZooKeeper servers.
public BookKeeper(ZooKeeper zk) throws InterruptedException, KeeperException
where:
-
zk is a ZooKeeper object. This constructor is useful when the application also using ZooKeeper and wants to have a single instance of ZooKeeper.
public BookKeeper(ZooKeeper zk, ClientSocketChannelFactory channelFactory) throws InterruptedException, KeeperException
where:
-
zk is a ZooKeeper object. This constructor is useful when the application also using ZooKeeper and wants to have a single instance of ZooKeeper.
-
channelFactory is a netty channel object (org.jboss.netty.channel.socket).
Creating a ledger.
Before writing entries to BookKeeper, it is necessary to create a ledger. With the current BookKeeper API, it is possible to create a ledger both synchronously or asynchronously. The following methods belong to org.apache.bookkeeper.client.BookKeeper.
Synchronous call:
public LedgerHandle createLedger(int ensSize, int qSize, DigestType type, byte passwd[]) throws KeeperException, InterruptedException, IOException, BKException
where:
-
ensSize is the number of bookies (ensemble size);
-
qSize is the write quorum size;
-
type is the type of digest used with entries: either MAC or CRC32.
-
passwd is a password that authorizes the client to write to the ledger being created.
All further operations on a ledger are invoked through the LedgerHandle object returned.
As a convenience, we provide a createLedger with default parameters (3,2,VERIFIABLE), and the only two input parameters it requires are a digest type and a password.
Asynchronous call:
public void asyncCreateLedger(int ensSize, int qSize, DigestType type, byte passwd[], CreateCallback cb, Object ctx )
The parameters are the same of the synchronous version, with the exception of cb and ctx. CreateCallback is an interface in org.apache.bookkeeper.client.AsyncCallback, and a class implementing it has to implement a method called createComplete that has the following signature:
void createComplete(int rc, LedgerHandle lh, Object ctx);
where:
-
rc is a return code (please refer to org.apache.bookeeper.client.BKException for a list);
-
lh is a LedgerHandle object to manipulate a ledger;
-
ctx is a control object for accountability purposes. It can be essentially any object the application is happy with.
The ctx object passed as a parameter to the call to create a ledger is the one same returned in the callback.
Adding entries to a ledger.
Once we have a ledger handle lh obtained through a call to create a ledger, we can start writing entries. As with creating ledgers, we can write both synchronously and asynchronously. The following methods belong to org.apache.bookkeeper.client.LedgerHandle.
Synchronous call:
public long addEntry(byte[] data) throws InterruptedException
where:
-
data is a byte array;
A call to addEntry returns the status of the operation (please refer to org.apache.bookeeper.client.BKDefs for a list);
Asynchronous call:
public void asyncAddEntry(byte[] data, AddCallback cb, Object ctx)
It also takes a byte array as the sequence of bytes to be stored as an entry. Additionaly, it takes a callback object cb and a control object ctx. The callback object must implement the AddCallback interface in org.apache.bookkeeper.client.AsyncCallback, and a class implementing it has to implement a method called addComplete that has the following signature:
void addComplete(int rc, LedgerHandle lh, long entryId, Object ctx);
where:
-
rc is a return code (please refer to org.apache.bookeeper.client.BKDefs for a list);
-
lh is a LedgerHandle object to manipulate a ledger;
-
entryId is the identifier of entry associated with this request;
-
ctx is control object used for accountability purposes. It can be any object the application is happy with.
Closing a ledger.
Once a client is done writing, it closes the ledger. The following methods belong to org.apache.bookkeeper.client.LedgerHandle.
Synchronous close:
public void close() throws InterruptedException
It takes no input parameters.
Asynchronous close:
public void asyncClose(CloseCallback cb, Object ctx) throws InterruptedException
It takes a callback object cb and a control object ctx. The callback object must implement the CloseCallback interface in org.apache.bookkeeper.client.AsyncCallback, and a class implementing it has to implement a method called closeComplete that has the following signature:
void closeComplete(int rc, LedgerHandle lh, Object ctx)
where:
-
rc is a return code (please refer to org.apache.bookeeper.client.BKDefs for a list);
-
lh is a LedgerHandle object to manipulate a ledger;
-
ctx is control object used for accountability purposes.
Opening a ledger.
To read from a ledger, a client must open it first. The following methods belong to org.apache.bookkeeper.client.BookKeeper.
Synchronous open:
public LedgerHandle openLedger(long lId, DigestType type, byte passwd[]) throws InterruptedException, BKException
-
ledgerId is the ledger identifier;
-
type is the type of digest used with entries: either MAC or CRC32.
-
passwd is a password to access the ledger (used only in the case of VERIFIABLE ledgers);
Asynchronous open:
public void asyncOpenLedger(long lId, DigestType type, byte passwd[], OpenCallback cb, Object ctx)
It also takes a a ledger identifier and a password. Additionaly, it takes a callback object cb and a control object ctx. The callback object must implement the OpenCallback interface in org.apache.bookkeeper.client.AsyncCallback, and a class implementing it has to implement a method called openComplete that has the following signature:
public void openComplete(int rc, LedgerHandle lh, Object ctx)
where:
-
rc is a return code (please refer to org.apache.bookeeper.client.BKDefs for a list);
-
lh is a LedgerHandle object to manipulate a ledger;
-
ctx is control object used for accountability purposes.
Reading from ledger
Read calls may request one or more consecutive entries. The following methods belong to org.apache.bookkeeper.client.LedgerHandle.
Synchronous read:
public Enumeration<LedgerEntry> readEntries(long firstEntry, long lastEntry) throws InterruptedException, BKException
-
firstEntry is the identifier of the first entry in the sequence of entries to read;
-
lastEntry is the identifier of the last entry in the sequence of entries to read.
Asynchronous read:
public void asyncReadEntries(long firstEntry, long lastEntry, ReadCallback cb, Object ctx) throws BKException, InterruptedException
It also takes a first and a last entry identifiers. Additionaly, it takes a callback object cb and a control object ctx. The callback object must implement the ReadCallback interface in org.apache.bookkeeper.client.AsyncCallback, and a class implementing it has to implement a method called readComplete that has the following signature:
void readComplete(int rc, LedgerHandle lh, Enumeration<LedgerEntry> seq, Object ctx)
where:
-
rc is a return code (please refer to org.apache.bookeeper.client.BKDefs for a list);
-
lh is a LedgerHandle object to manipulate a ledger;
-
seq is a Enumeration<LedgerEntry> object to containing the list of entries requested;
-
ctx is control object used for accountability purposes.
Deleting a ledger
Once a client is done with a ledger and is sure that nobody will ever need to read from it again, they can delete the ledger. The following methods belong to org.apache.bookkeeper.client.BookKeeper.
Synchronous delete:
public void deleteLedger(long lId) throws InterruptedException, BKException
-
lId is the ledger identifier;
Asynchronous delete:
public void asyncDeleteLedger(long lId, DeleteCallback cb, Object ctx)
It takes a ledger identifier. Additionally, it takes a callback object cb and a control object ctx. The callback object must implement the DeleteCallback interface in org.apache.bookkeeper.client.AsyncCallback, and a class implementing it has to implement a method called deleteComplete that has the following signature:
void deleteComplete(int rc, Object ctx)
where:
-
rc is a return code (please refer to org.apache.bookeeper.client.BKDefs for a list);
-
ctx is control object used for accountability purposes.


Make you own poll, Give a title and add some options. You can edit it anytime you want. Happy Polling.