Class PromptOptions<T extends PromptOptions>
- java.lang.Object
-
- uk.co.samuelwall.materialtaptargetprompt.extras.PromptOptions<T>
-
- Type Parameters:
T
- The subclass that extends this.
- Direct Known Subclasses:
MaterialTapTargetPrompt.Builder
public class PromptOptions<T extends PromptOptions> extends java.lang.Object
Contains all the settings for creating a prompt.
-
-
Constructor Summary
Constructors Constructor Description PromptOptions(ResourceFinder resourceFinder)
Constructor.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description MaterialTapTargetPrompt
create()
Creates anMaterialTapTargetPrompt
with the arguments supplied to this builder.android.view.animation.Interpolator
getAnimationInterpolator()
Get the animation interpolator that is used.boolean
getAutoDismiss()
Get whether the prompt should dismiss itself when a touch event occurs outside the focal.boolean
getAutoFinish()
Get if the prompt should finish itself when a touch event occurs inside the focal.boolean
getBackButtonDismissEnabled()
Will the pressing the system back button dismiss the prompt.int
getBackgroundColour()
Get the background colour.boolean
getCaptureTouchEventOnFocal()
Get if the prompt should stop touch events on the focal point from passing to underlying views.boolean
getCaptureTouchEventOutsidePrompt()
Get if the prompt should stop touch events outside the prompt from passing to underlying views.android.view.View
getClipToView()
Get the view that the prompt canvas is clipped to.java.lang.String
getContentDescription()
Get the text for the accessibility content description.int
getFocalColour()
Get the focal point colour.float
getFocalPadding()
Get the padding between the text and the focal.float
getFocalRadius()
Get the focal point radius for the circle prompt focal.android.graphics.drawable.Drawable
getIconDrawable()
Get the icon drawn as the target.boolean
getIdleAnimationEnabled()
Is the focal animation enabled.boolean
getIgnoreStatusBar()
Get ignore status bar flagfloat
getMaxTextWidth()
Get the maximum width that the primary and secondary text can be.java.lang.CharSequence
getPrimaryText()
Get the text to draw for the primary text.int
getPrimaryTextColour()
Gets the primary text font colour.int
getPrimaryTextGravity()
Gets the gravity for the primary text.float
getPrimaryTextSize()
Get the primary text font size.android.graphics.Typeface
getPrimaryTextTypeface()
Get the typeface for the primary text.int
getPrimaryTextTypefaceStyle()
Get the primary text typeface style.PromptBackground
getPromptBackground()
Get the prompt focal renderer.PromptFocal
getPromptFocal()
Get the prompt focal renderer.PromptText
getPromptText()
Get thePromptText
implementation used to render the prompt text.ResourceFinder
getResourceFinder()
Get the resource finder being used.java.lang.CharSequence
getSecondaryText()
Get the secondary text.int
getSecondaryTextColour()
Get the secondary text colour.int
getSecondaryTextGravity()
Gets the gravity for the secondary text.float
getSecondaryTextSize()
Get the secondary text size.android.graphics.Typeface
getSecondaryTextTypeface()
Get the secondary text typeface.int
getSecondaryTextTypefaceStyle()
Get the secondary text typeface style.android.graphics.PointF
getTargetPosition()
Get the position on the screen that is being targeted.android.view.View
getTargetRenderView()
Get the view that is rendered as the target.android.view.View
getTargetView()
Gets the view that the prompt is targeting.float
getTextPadding()
Get the text left and right padding.float
getTextSeparation()
Get the distance between the primary and secondary text.boolean
isTargetSet()
Has the target been set successfully?void
load(int themeResId)
Loads the supplied theme into the prompt overwriting any previously set values if they are set in the theme.void
onExtraPromptStateChanged(MaterialTapTargetPrompt prompt, int state)
Handles emitting the additional prompt state changed events.void
onPromptStateChanged(MaterialTapTargetPrompt prompt, int state)
Handles emitting the prompt state changed events.T
setAnimationInterpolator(android.view.animation.Interpolator interpolator)
Set the interpolator to use in animations.T
setAutoDismiss(boolean autoDismiss)
Set whether the prompt should dismiss itself when a touch event occurs outside the focal.T
setAutoFinish(boolean autoFinish)
Set whether the prompt should finish itself when a touch event occurs inside the focal.T
setBackButtonDismissEnabled(boolean enabled)
Back button can be used to dismiss the prompt.T
setBackgroundColour(int colour)
Set the background colour.T
setCaptureTouchEventOnFocal(boolean captureTouchEvent)
Set if the prompt should stop touch events on the focal point from passing to underlying views.T
setCaptureTouchEventOutsidePrompt(boolean captureTouchEventOutsidePrompt)
Set if the prompt should stop touch events outside the prompt from passing to underlying views.T
setClipToView(android.view.View view)
Set the view to clip the prompt to.T
setContentDescription(int resId)
Set the accessibility content description text using the given resource id.T
setContentDescription(java.lang.String text)
Set the accessibility content description text to the given stringT
setFocalColour(int colour)
Set the focal point colour.T
setFocalPadding(float padding)
Set the padding between the text and the focal point.T
setFocalPadding(int resId)
Set the padding between the text and the focal point using the given resource id.T
setFocalRadius(float radius)
Set the focal point radius.T
setFocalRadius(int resId)
Set the focal point radius using the given resource id.T
setIcon(int resId)
Set the icon to draw in the focal point using the given resource id.T
setIconDrawable(android.graphics.drawable.Drawable drawable)
Set the icon to draw in the focal point.T
setIconDrawableColourFilter(int colour)
Sets the colour to use to tint the icon drawable.T
setIconDrawableTintList(android.content.res.ColorStateList tint)
Applies a tint to the icon drawableT
setIconDrawableTintMode(android.graphics.PorterDuff.Mode tintMode)
Sets the PorterDuff mode to use to apply the tint.T
setIdleAnimationEnabled(boolean enabled)
Enable/disable focal animation.T
setIgnoreStatusBar(boolean enabled)
Indicates whether to ignore system status bar.T
setMaxTextWidth(float width)
Set the max width that the primary and secondary text can be.T
setMaxTextWidth(int resId)
Set the max width that the primary and secondary text can be using the given resource id.T
setPrimaryText(int resId)
Set the primary text using the given resource id.T
setPrimaryText(java.lang.CharSequence text)
Set the primary text to the given CharSequence.T
setPrimaryText(java.lang.String text)
Set the primary text to the given stringT
setPrimaryTextColour(int colour)
Set the primary text colour.T
setPrimaryTextGravity(int gravity)
Set the primary text horizontal layout gravity.T
setPrimaryTextSize(float size)
Set the primary text font size.T
setPrimaryTextSize(int resId)
Set the primary text font size using the given resource id.T
setPrimaryTextTypeface(android.graphics.Typeface typeface)
Sets the typeface and style used to display the primary text.T
setPrimaryTextTypeface(android.graphics.Typeface typeface, int style)
Sets the typeface used to display the primary text.T
setPromptBackground(PromptBackground promptBackground)
Sets the renderer for the prompt background.T
setPromptFocal(PromptFocal promptFocal)
Sets the renderer for the prompt focal.T
setPromptStateChangeListener(MaterialTapTargetPrompt.PromptStateChangeListener listener)
Set the listener to listen for when the prompt state changes.T
setPromptText(PromptText promptText)
Set thePromptText
implementation to use to render the prompt text.T
setSecondaryText(int resId)
Set the secondary text using the given resource id.T
setSecondaryText(java.lang.CharSequence text)
Set the secondary text.T
setSecondaryText(java.lang.String text)
Set the secondary text.T
setSecondaryTextColour(int colour)
Set the secondary text colour.T
setSecondaryTextGravity(int gravity)
Set the secondary text horizontal layout gravity.T
setSecondaryTextSize(float size)
Set the secondary text font size.T
setSecondaryTextSize(int resId)
Set the secondary text font size using the give resource id.T
setSecondaryTextTypeface(android.graphics.Typeface typeface)
Sets the typeface used to display the secondary text.T
setSecondaryTextTypeface(android.graphics.Typeface typeface, int style)
Sets the typeface and style used to display the secondary text.void
setSequenceListener(MaterialTapTargetPrompt.PromptStateChangeListener listener)
Set the internal listener to listen for when the prompt state changes.T
setTarget(float left, float top)
Set the centre point as a screen positionT
setTarget(int target)
Set the view for the prompt to focus on using the given resource id.T
setTarget(android.view.View target)
Set the view for the prompt to focus on.T
setTargetRenderView(android.view.View view)
Change the view that is rendered as the target.T
setTextGravity(int gravity)
Set the primary and secondary text horizontal layout gravity.T
setTextPadding(float padding)
Set the text left and right padding.T
setTextPadding(int resId)
Set the text left and right padding using the given resource id.T
setTextSeparation(float separation)
Set the distance between the primary and secondary text.T
setTextSeparation(int resId)
Set the distance between the primary and secondary text using the given resource id.MaterialTapTargetPrompt
show()
Creates aMaterialTapTargetPrompt
with the arguments supplied to this builder and immediately displays the prompt.MaterialTapTargetPrompt
showFor(long milliseconds)
Creates aMaterialTapTargetPrompt
with the arguments supplied to this builder and immediately displays the prompt for the number of milliseconds supplied.
-
-
-
Constructor Detail
-
PromptOptions
public PromptOptions(@NonNull ResourceFinder resourceFinder)
Constructor.- Parameters:
resourceFinder
- The resource finder implementation to use to find resources.
-
-
Method Detail
-
load
public void load(@StyleRes int themeResId)
Loads the supplied theme into the prompt overwriting any previously set values if they are set in the theme.- Parameters:
themeResId
- The resource id for the theme.
-
getResourceFinder
@NonNull public ResourceFinder getResourceFinder()
Get the resource finder being used.- Returns:
- The resource finder being used.
-
setTarget
@NonNull public T setTarget(@Nullable android.view.View target)
Set the view for the prompt to focus on.- Parameters:
target
- The view that the prompt will highlight.- Returns:
- This Builder object to allow for chaining of calls to set methods
-
setTarget
@NonNull public T setTarget(@IdRes int target)
Set the view for the prompt to focus on using the given resource id.- Parameters:
target
- The view that the prompt will highlight.- Returns:
- This Builder object to allow for chaining of calls to set methods
-
getTargetView
@Nullable public android.view.View getTargetView()
Gets the view that the prompt is targeting.- Returns:
- The target view or null if not set or targeting a position.
-
setTarget
@NonNull public T setTarget(float left, float top)
Set the centre point as a screen position- Parameters:
left
- Centre point from screen lefttop
- Centre point from screen top- Returns:
- This Builder object to allow for chaining of calls to set methods
-
getTargetPosition
@Nullable public android.graphics.PointF getTargetPosition()
Get the position on the screen that is being targeted.- Returns:
- The target position or null if targeting a view.
-
setTargetRenderView
@NonNull public T setTargetRenderView(@Nullable android.view.View view)
Change the view that is rendered as the target. By default the view fromsetTarget(View)
is rendered as the target.- Parameters:
view
- The view to use to render the prompt target- Returns:
- This Builder object to allow for chaining of calls to set methods
-
getTargetRenderView
@Nullable public android.view.View getTargetRenderView()
Get the view that is rendered as the target.- Returns:
- The view used to render the prompt target.
-
isTargetSet
public boolean isTargetSet()
Has the target been set successfully?- Returns:
- True if set successfully.
-
setPrimaryText
@NonNull public T setPrimaryText(@StringRes int resId)
Set the primary text using the given resource id.- Parameters:
resId
- The string resource id for the primary text- Returns:
- This Builder object to allow for chaining of calls to set methods
-
setPrimaryText
@NonNull public T setPrimaryText(@Nullable java.lang.String text)
Set the primary text to the given string- Parameters:
text
- The primary text- Returns:
- This Builder object to allow for chaining of calls to set methods
-
setPrimaryText
@NonNull public T setPrimaryText(@Nullable java.lang.CharSequence text)
Set the primary text to the given CharSequence. It is recommended that you don't go crazy with custom Spannables.- Parameters:
text
- The primary text as CharSequence- Returns:
- This Builder object to allow for chaining of calls to set methods
-
getPrimaryText
@Nullable public java.lang.CharSequence getPrimaryText()
Get the text to draw for the primary text.- Returns:
- The primary text.
-
setPrimaryTextSize
@NonNull public T setPrimaryTextSize(@Dimension float size)
Set the primary text font size.- Parameters:
size
- The primary text font size- Returns:
- This Builder object to allow for chaining of calls to set methods
-
setPrimaryTextSize
@NonNull public T setPrimaryTextSize(@DimenRes int resId)
Set the primary text font size using the given resource id.- Parameters:
resId
- The resource id for the primary text size- Returns:
- This Builder object to allow for chaining of calls to set methods
-
getPrimaryTextSize
@Dimension public float getPrimaryTextSize()
Get the primary text font size.- Returns:
- The primary text font size.
-
setPrimaryTextColour
@NonNull public T setPrimaryTextColour(int colour)
Set the primary text colour.- Parameters:
colour
- The primary text colour resource id- Returns:
- This Builder object to allow for chaining of calls to set methods
-
getPrimaryTextColour
public int getPrimaryTextColour()
Gets the primary text font colour.- Returns:
- The primary text font colour.
-
setPrimaryTextTypeface
@NonNull public T setPrimaryTextTypeface(@Nullable android.graphics.Typeface typeface)
Sets the typeface and style used to display the primary text.- Parameters:
typeface
- The primary text typeface
-
setPrimaryTextTypeface
@NonNull public T setPrimaryTextTypeface(@Nullable android.graphics.Typeface typeface, int style)
Sets the typeface used to display the primary text.- Parameters:
typeface
- The primary text typefacestyle
- The typeface style- Returns:
- This Builder object to allow for chaining of calls to set methods
-
getPrimaryTextTypeface
@Nullable public android.graphics.Typeface getPrimaryTextTypeface()
Get the typeface for the primary text.- Returns:
- The primary text typeface.
-
getPrimaryTextTypefaceStyle
public int getPrimaryTextTypefaceStyle()
Get the primary text typeface style.- Returns:
- the primary text typeface style.
-
setSecondaryText
@NonNull public T setSecondaryText(@StringRes int resId)
Set the secondary text using the given resource id.- Parameters:
resId
- The secondary text resource id- Returns:
- This Builder object to allow for chaining of calls to set methods
-
setSecondaryText
@NonNull public T setSecondaryText(@Nullable java.lang.String text)
Set the secondary text.- Parameters:
text
- The secondary text- Returns:
- This Builder object to allow for chaining of calls to set methods
-
setSecondaryText
@NonNull public T setSecondaryText(@Nullable java.lang.CharSequence text)
Set the secondary text. It is recommended that you don't go crazy with custom Spannables.- Parameters:
text
- The secondary text as a CharSequence- Returns:
- This Builder object to allow for chaining of calls to set methods
-
getSecondaryText
@Nullable public java.lang.CharSequence getSecondaryText()
Get the secondary text.- Returns:
- The secondary text.
-
setSecondaryTextSize
@NonNull public T setSecondaryTextSize(@DimenRes int resId)
Set the secondary text font size using the give resource id.- Parameters:
resId
- The secondary text string resource id- Returns:
- This Builder object to allow for chaining of calls to set methods
-
setSecondaryTextSize
@NonNull public T setSecondaryTextSize(@Dimension float size)
Set the secondary text font size.- Parameters:
size
- The secondary text font size- Returns:
- This Builder object to allow for chaining of calls to set methods
-
getSecondaryTextSize
@Dimension public float getSecondaryTextSize()
Get the secondary text size.- Returns:
- The secondary text size.
-
setSecondaryTextColour
@NonNull public T setSecondaryTextColour(int colour)
Set the secondary text colour.- Parameters:
colour
- The secondary text colour resource id- Returns:
- This Builder object to allow for chaining of calls to set methods
-
getSecondaryTextColour
public int getSecondaryTextColour()
Get the secondary text colour.- Returns:
- The secondary text colour.
-
setSecondaryTextTypeface
@NonNull public T setSecondaryTextTypeface(@Nullable android.graphics.Typeface typeface)
Sets the typeface used to display the secondary text.- Parameters:
typeface
- The secondary text typeface
-
setSecondaryTextTypeface
@NonNull public T setSecondaryTextTypeface(@Nullable android.graphics.Typeface typeface, int style)
Sets the typeface and style used to display the secondary text.- Parameters:
typeface
- The secondary text typefacestyle
- The typeface style- Returns:
- This Builder object to allow for chaining of calls to set methods
-
getSecondaryTextTypeface
@Nullable public android.graphics.Typeface getSecondaryTextTypeface()
Get the secondary text typeface.- Returns:
- The secondary text typeface.
-
getSecondaryTextTypefaceStyle
public int getSecondaryTextTypefaceStyle()
Get the secondary text typeface style.- Returns:
- The secondary text typeface style.
-
setContentDescription
@NonNull public T setContentDescription(@StringRes int resId)
Set the accessibility content description text using the given resource id.- Parameters:
resId
- The string resource id for the accessibility content description text- Returns:
- This Builder object to allow for chaining of calls to set methods
-
setContentDescription
@NonNull public T setContentDescription(@Nullable java.lang.String text)
Set the accessibility content description text to the given string- Parameters:
text
- The accessibility content description text- Returns:
- This Builder object to allow for chaining of calls to set methods
-
getContentDescription
@Nullable public java.lang.String getContentDescription()
Get the text for the accessibility content description. Defaults to a concatenation of primary and secondary texts.- Returns:
- The accessibility content description text.
-
setTextPadding
@NonNull public T setTextPadding(@DimenRes int resId)
Set the text left and right padding using the given resource id.- Parameters:
resId
- The text padding dimension resource id- Returns:
- This Builder object to allow for chaining of calls to set methods
-
setTextPadding
@NonNull public T setTextPadding(@Dimension float padding)
Set the text left and right padding.- Parameters:
padding
- The padding on the text left and right- Returns:
- This Builder object to allow for chaining of calls to set methods
-
getTextPadding
@Dimension public float getTextPadding()
Get the text left and right padding.- Returns:
- The text left and right padding.
-
setTextSeparation
@NonNull public T setTextSeparation(@DimenRes int resId)
Set the distance between the primary and secondary text using the given resource id.- Parameters:
resId
- The dimension resource id for the text separation- Returns:
- This Builder object to allow for chaining of calls to set methods
-
setTextSeparation
@NonNull public T setTextSeparation(@Dimension float separation)
Set the distance between the primary and secondary text.- Parameters:
separation
- The distance separation between the primary and secondary text- Returns:
- This Builder object to allow for chaining of calls to set methods
-
getTextSeparation
@Dimension public float getTextSeparation()
Get the distance between the primary and secondary text.- Returns:
- the distance between the primary and secondary text.
-
setFocalPadding
@NonNull public T setFocalPadding(@DimenRes int resId)
Set the padding between the text and the focal point using the given resource id.- Parameters:
resId
- The dimension resource id for the focal to text distance- Returns:
- This Builder object to allow for chaining of calls to set methods
-
setFocalPadding
@NonNull public T setFocalPadding(@Dimension float padding)
Set the padding between the text and the focal point.- Parameters:
padding
- The distance between the text and focal- Returns:
- This Builder object to allow for chaining of calls to set methods
-
getFocalPadding
@Dimension public float getFocalPadding()
Get the padding between the text and the focal.- Returns:
- The padding between the text and the focal.
-
setAnimationInterpolator
@NonNull public T setAnimationInterpolator(@Nullable android.view.animation.Interpolator interpolator)
Set the interpolator to use in animations.- Parameters:
interpolator
- The animation interpolator to use- Returns:
- This Builder object to allow for chaining of calls to set methods
-
getAnimationInterpolator
@Nullable public android.view.animation.Interpolator getAnimationInterpolator()
Get the animation interpolator that is used.- Returns:
- The animation interpolator that is used.
-
setIdleAnimationEnabled
@NonNull public T setIdleAnimationEnabled(boolean enabled)
Enable/disable focal animation. true by default- Parameters:
enabled
- Idle animation enabled- Returns:
- This Builder object to allow for chaining of calls to set methods
-
getIdleAnimationEnabled
public boolean getIdleAnimationEnabled()
Is the focal animation enabled.- Returns:
- True if the idle animation is enabled.
-
setIcon
@NonNull public T setIcon(@DrawableRes int resId)
Set the icon to draw in the focal point using the given resource id.- Parameters:
resId
- The drawable resource id for the icon- Returns:
- This Builder object to allow for chaining of calls to set methods
-
setIconDrawable
@NonNull public T setIconDrawable(@Nullable android.graphics.drawable.Drawable drawable)
Set the icon to draw in the focal point.- Parameters:
drawable
- The drawable for the icon- Returns:
- This Builder object to allow for chaining of calls to set methods
-
getIconDrawable
@Nullable public android.graphics.drawable.Drawable getIconDrawable()
Get the icon drawn as the target.- Returns:
- The icon drawn as the target.
-
setIconDrawableTintList
@NonNull public T setIconDrawableTintList(@Nullable android.content.res.ColorStateList tint)
Applies a tint to the icon drawable- Parameters:
tint
- the tint to apply to the icon drawable,null
will remove the tint.- Returns:
- This Builder object to allow for chaining of calls to set methods
-
setIconDrawableTintMode
@NonNull public T setIconDrawableTintMode(@Nullable android.graphics.PorterDuff.Mode tintMode)
Sets the PorterDuff mode to use to apply the tint.- Parameters:
tintMode
- the tint mode to use on the icon drawable,null
will remove the tint.- Returns:
- This Builder object to allow for chaining of calls to set methods
-
setIconDrawableColourFilter
@NonNull public T setIconDrawableColourFilter(int colour)
Sets the colour to use to tint the icon drawable.- Parameters:
colour
- The colour to use to tint the icon drawable, callsetIconDrawableTintList(ColorStateList)
orsetIconDrawableTintMode(PorterDuff.Mode)
withnull
to remove the tint.- Returns:
- This Builder object to allow for chaining of calls to set methods
-
setPromptStateChangeListener
@NonNull public T setPromptStateChangeListener(@Nullable MaterialTapTargetPrompt.PromptStateChangeListener listener)
Set the listener to listen for when the prompt state changes.- Parameters:
listener
- The listener to use- Returns:
- This Builder object to allow for chaining of calls to set methods
-
setSequenceListener
public void setSequenceListener(@Nullable MaterialTapTargetPrompt.PromptStateChangeListener listener)
Set the internal listener to listen for when the prompt state changes. This does not return a builder is it's not intended to be user during the creation of Prompts- Parameters:
listener
- The listener to use
-
onPromptStateChanged
public void onPromptStateChanged(@NonNull MaterialTapTargetPrompt prompt, int state)
Handles emitting the prompt state changed events.- Parameters:
state
- The state that the prompt is now in.
-
onExtraPromptStateChanged
public void onExtraPromptStateChanged(@NonNull MaterialTapTargetPrompt prompt, int state)
Handles emitting the additional prompt state changed events.- Parameters:
state
- The state that the prompt is now in.
-
setCaptureTouchEventOnFocal
@NonNull public T setCaptureTouchEventOnFocal(boolean captureTouchEvent)
Set if the prompt should stop touch events on the focal point from passing to underlying views. Default is false.- Parameters:
captureTouchEvent
- True to capture touch events in the prompt- Returns:
- This Builder object to allow for chaining of calls to set methods
-
getCaptureTouchEventOnFocal
public boolean getCaptureTouchEventOnFocal()
Get if the prompt should stop touch events on the focal point from passing to underlying views.- Returns:
- True to capture touch events in the prompt
-
setMaxTextWidth
@NonNull public T setMaxTextWidth(@DimenRes int resId)
Set the max width that the primary and secondary text can be using the given resource id.- Parameters:
resId
- The dimension resource id for the max width that the text can reach- Returns:
- This Builder object to allow for chaining of calls to set methods
-
setMaxTextWidth
@NonNull public T setMaxTextWidth(@Dimension float width)
Set the max width that the primary and secondary text can be.- Parameters:
width
- The max width that the text can reach- Returns:
- This Builder object to allow for chaining of calls to set methods
-
getMaxTextWidth
@Dimension public float getMaxTextWidth()
Get the maximum width that the primary and secondary text can be.- Returns:
- The maximum text width.
-
setBackgroundColour
@NonNull public T setBackgroundColour(int colour)
Set the background colour. The Material Design Guidelines specify that this should be 244 or hex F4.- Parameters:
colour
- The background colour colour resource id- Returns:
- This Builder object to allow for chaining of calls to set methods
-
getBackgroundColour
public int getBackgroundColour()
Get the background colour.- Returns:
- The background colour.
-
setFocalColour
@NonNull public T setFocalColour(int colour)
Set the focal point colour.- Parameters:
colour
- The focal colour colour resource id- Returns:
- This Builder object to allow for chaining of calls to set methods
-
getFocalColour
public int getFocalColour()
Get the focal point colour.- Returns:
- The focal point colour.
-
setFocalRadius
@NonNull public T setFocalRadius(@DimenRes int resId)
Set the focal point radius using the given resource id.- Parameters:
resId
- The focal radius dimension resource id- Returns:
- This Builder object to allow for chaining of calls to set methods
-
setFocalRadius
@NonNull public T setFocalRadius(@Dimension float radius)
Set the focal point radius.- Parameters:
radius
- The focal radius- Returns:
- This Builder object to allow for chaining of calls to set methods
-
getFocalRadius
@Dimension public float getFocalRadius()
Get the focal point radius for the circle prompt focal.- Returns:
- The radius used for the circle prompt focal.
-
setAutoDismiss
@NonNull public T setAutoDismiss(boolean autoDismiss)
Set whether the prompt should dismiss itself when a touch event occurs outside the focal. Default is true. Listen for theMaterialTapTargetPrompt.STATE_NON_FOCAL_PRESSED
event in thesetPromptStateChangeListener(MaterialTapTargetPrompt.PromptStateChangeListener)
to handle the prompt being pressed outside the focal area.- Parameters:
autoDismiss
- True - prompt will dismiss when touched outside the focal, false - no action taken.- Returns:
- This Builder object to allow for chaining of calls to set methods
-
getAutoDismiss
public boolean getAutoDismiss()
Get whether the prompt should dismiss itself when a touch event occurs outside the focal.- Returns:
- True - prompt will dismiss when touched outside the focal, false - no action taken.
-
setAutoFinish
@NonNull public T setAutoFinish(boolean autoFinish)
Set whether the prompt should finish itself when a touch event occurs inside the focal. Default is true. Listen for theMaterialTapTargetPrompt.STATE_FOCAL_PRESSED
event in thesetPromptStateChangeListener(MaterialTapTargetPrompt.PromptStateChangeListener)
to handle the prompt target being pressed.- Parameters:
autoFinish
- True - prompt will finish when touched inside the focal, false - no action taken.- Returns:
- This Builder object to allow for chaining of calls to set methods
-
getAutoFinish
public boolean getAutoFinish()
Get if the prompt should finish itself when a touch event occurs inside the focal.- Returns:
- True if the prompt should finish itself when a touch event occurs inside the focal.
-
setCaptureTouchEventOutsidePrompt
@NonNull public T setCaptureTouchEventOutsidePrompt(boolean captureTouchEventOutsidePrompt)
Set if the prompt should stop touch events outside the prompt from passing to underlying views. Default is false.- Parameters:
captureTouchEventOutsidePrompt
- True to capture touch events out side the prompt- Returns:
- This Builder object to allow for chaining of calls to set methods
-
getCaptureTouchEventOutsidePrompt
public boolean getCaptureTouchEventOutsidePrompt()
Get if the prompt should stop touch events outside the prompt from passing to underlying views.- Returns:
- True if touch events will not be passed to views below the prompt.
-
setTextGravity
@NonNull public T setTextGravity(int gravity)
Set the primary and secondary text horizontal layout gravity. Default:Gravity.START
- Parameters:
gravity
- The horizontal gravity- Returns:
- This Builder object to allow for chaining of calls to set methods
-
setPrimaryTextGravity
@NonNull public T setPrimaryTextGravity(int gravity)
Set the primary text horizontal layout gravity. Default:Gravity.START
- Parameters:
gravity
- The horizontal gravity- Returns:
- This Builder object to allow for chaining of calls to set methods
-
getPrimaryTextGravity
public int getPrimaryTextGravity()
Gets the gravity for the primary text.- Returns:
- The primary texts gravity.
-
setSecondaryTextGravity
@NonNull public T setSecondaryTextGravity(int gravity)
Set the secondary text horizontal layout gravity. Default:Gravity.START
- Parameters:
gravity
- The horizontal gravity- Returns:
- This Builder object to allow for chaining of calls to set methods
-
getSecondaryTextGravity
public int getSecondaryTextGravity()
Gets the gravity for the secondary text.- Returns:
- The secondary texts gravity.
-
setClipToView
@NonNull public T setClipToView(@Nullable android.view.View view)
Set the view to clip the prompt to. The prompt won't draw outside the bounds of this view. Default:R.id.content
Null can be used to stop the prompt being clipped to a view.
- Parameters:
view
- The view to clip to- Returns:
- This Builder object to allow for chaining of calls to set methods
-
getClipToView
@Nullable public android.view.View getClipToView()
Get the view that the prompt canvas is clipped to. The prompt won't draw outside the bounds of this view.- Returns:
- The view that the prompt canvas is clipped to.
-
setBackButtonDismissEnabled
@NonNull public T setBackButtonDismissEnabled(boolean enabled)
Back button can be used to dismiss the prompt. Default: true- Parameters:
enabled
- True for back button dismiss enabled- Returns:
- This Builder object to allow for chaining of calls to set methods
-
getBackButtonDismissEnabled
public boolean getBackButtonDismissEnabled()
Will the pressing the system back button dismiss the prompt.- Returns:
- True if pressing the system back button will dismiss the prompt, false otherwise.
-
setIgnoreStatusBar
@NonNull public T setIgnoreStatusBar(boolean enabled)
Indicates whether to ignore system status bar. Drawing area will be increased to the top of screen regardless of status bar if this flag is true (status bar should be transparent to see any effect from this) Default: false- Parameters:
enabled
- true for drawing behind system status bar- Returns:
- This Builder object to allow for chaining of calls to set methods
-
getIgnoreStatusBar
public boolean getIgnoreStatusBar()
Get ignore status bar flag- Returns:
- true if status bar should be ignored, otherwise false
-
setPromptBackground
@NonNull public T setPromptBackground(@NonNull PromptBackground promptBackground)
Sets the renderer for the prompt background.- Parameters:
promptBackground
- The background shape to use.- Returns:
- This Builder object to allow for chaining of calls to set methods
-
getPromptBackground
@NonNull public PromptBackground getPromptBackground()
Get the prompt focal renderer.- Returns:
- The prompt focal instance.
-
setPromptFocal
@NonNull public T setPromptFocal(@NonNull PromptFocal promptFocal)
Sets the renderer for the prompt focal.- Parameters:
promptFocal
- The focal shape to use.- Returns:
- This Builder object to allow for chaining of calls to set methods
-
getPromptFocal
@NonNull public PromptFocal getPromptFocal()
Get the prompt focal renderer.- Returns:
- The prompt focal instance.
-
setPromptText
@NonNull public T setPromptText(@NonNull PromptText promptText)
Set thePromptText
implementation to use to render the prompt text.- Parameters:
promptText
- The prompt text implementation.- Returns:
- This Builder object to allow for chaining of calls to set methods
-
getPromptText
@NonNull public PromptText getPromptText()
Get thePromptText
implementation used to render the prompt text.- Returns:
- This Builder object to allow for chaining of calls to set methods
-
create
@Nullable public MaterialTapTargetPrompt create()
Creates anMaterialTapTargetPrompt
with the arguments supplied to this builder.Calling this method does not display the prompt. If no additional processing is needed,
show()
may be called instead to both create and display the prompt.Will return null if a valid target has not been set or the primary text is null. To check that a valid target has been set call
isTargetSet()
.- Returns:
- The created builder or null if no target
-
show
@Nullable public MaterialTapTargetPrompt show()
Creates aMaterialTapTargetPrompt
with the arguments supplied to this builder and immediately displays the prompt.Calling this method is functionally identical to:
MaterialTapTargetPrompt prompt = builder.create(); prompt.show();
Will return null if a valid target has not been set or the primary text and secondary text are null. To check that a valid target has been set call
isTargetSet()
.- Returns:
- The created builder or null if no target
-
showFor
@Nullable public MaterialTapTargetPrompt showFor(long milliseconds)
Creates aMaterialTapTargetPrompt
with the arguments supplied to this builder and immediately displays the prompt for the number of milliseconds supplied.Calling this method is functionally identical to:
MaterialTapTargetPrompt prompt = builder.create(); prompt.showFor(milliseconds);
Will return null if a valid target has not been set or the primary text and secondary text are null. To check that a valid target has been set call
isTargetSet()
.- Parameters:
milliseconds
- The number of milliseconds to show the prompt for.- Returns:
- The created builder or null if no target
-
-


During November 2020 and some of December 2020 I was unemployed (between jobs). During that time I thought I would attempt to solve a few problems with my programming skills. Since it’s been some time since I last created a project from scratch I knew this would be fun as well as keep me busy during my time out of work.
Over the many years I’ve been involved in tech. I’ve often crossed paths with WordPress (yuk). I always felt wordpress was overkill for the majority of use cases that use it. This was further confirmed by how many security issues (often stemming from plugins) would occur within wordpress and its ecosystem. I believed there must be a better way of creating such “simple” websites like blogs these days.
Since the majority of WordPress sites are blogs. That simply create what appear to be static websites created by small sets of data created by a handfull of authors. They are practically static websites with a complex and slow hosting setup.
StaticGenie aims to remove the complixity and produce a very easy to host and scale static website.
The journey begins…
Regards, ScottyCoder
During November 2020 and some of December 2020 I was unemployed (between jobs). During that time I thought I would attempt to solve a few problems with my programming skills. Since it's been some time since I last created a project from scratch I knew this would be fun as well as keep me busy during my time out of work. This was when StaticGenie was born...


[gecode-users] inter_r with views of vars in different spaces
Christian Schulte
cschulte at kth.se
Thu Dec 13 23:14:47 CET 2007
On a more general level, performing "read" operations (anything that is
const) on a view or variable is independent of the space the view or
variable belongs to (the only thing not to be done is to delete the space).
Anything goes!
When performing a "write" operation (anything that is not const) one has to
use the space as argument to these operations to which the view or variable
belongs. That's all.
Christian
--
Christian Schulte, www.ict.kth.se/~cschulte/
-----Original Message-----
From: users-bounces at gecode.org [mailto:users-bounces at gecode.org] On Behalf
Of Denys Duchier
Sent: Thursday, December 13, 2007 8:05 PM
To: users at gecode.org
Subject: Re: [gecode-users] inter_r with views of vars in different spaces
Guido Tack <tack at ps.uni-sb.de> writes:
> Denys Duchier wrote:
>
>> is it possible to use inter_r with IntViews of 2 vars each in a
>> different space?
>
> Do you mean something like:
>
> IntViewRanges i2r(i2);
> i1.inter_r(home, i2r);
>
> where i1 and i2 are from different spaces? That's possible.
yes, that's exactly what I meant. I wasn't sure whether that was
compatible with the space-local memory management.
Thanks,
--Denys
_______________________________________________
Gecode users mailing list
users at gecode.org
https://www.gecode.org/mailman/listinfo/gecode-users
More information about the gecode-users
mailing list


Drop Box: Overview
What it does
The Drop Box feature allows instructors and students to share
documents within a private folder for each student. The Drop Box works
like Resources to allow you to upload many types of files and multiple
files at a time. The Drop Box also allows nested folders (folders
within folders).
Key concepts
Progress reports: Instructors can use the Drop Box
tool to provide private progress reports to each student in the class.
Adding participants: When you add participants or
students to a worksite, either automatically or manually, they will
have Drop Box folders by default (if the Drop Box is currently enabled).
Things to consider
- A new Drop Box item will automatically go into the folder that you
have open when you create the item.
- For plain text documents, HTML pages, and web links that you
create in the Drop Box interface, you can edit the content, as well as
information about the item, such as its name or description. For
uploaded files, you can edit only the information about the item, not
the content; to change the content, you must upload a new version of
the file.
- Whenever you add an item to the Drop Box, you have the option of
sending an automatic email notification.
- Make sure you know the laws and policies regarding the use of
copyrighted material.
Help documentation
For help documentation about the Drop Box tool, see Drop Box.


Police parade 36 suspected criminals, recover arms in Enugu
Chris Oji, Enugu
The Enugu State Police Command Tuesday, paraded 36 suspected criminals involved in various crimes in the state within the past one month.
Parading the suspects in Enugu, state Commissioner of Police, Mr Ahmad Abdurrahman, noted that the feat was achieved by police operatives of Operation Puff Adder and intelligence-led community-policing mechanisms.
Abdurrahman said that the Command also recovered six arms and three live cartridges as well as seven inverter batteries, one tricycle, one lorry and one hand set.
He said that other items recovered included; filling machine, cutting machine and short iron axe all used in fabricating locally-made guns as well as piles of MTN cables and Transmission Armoured Cables.
The police boss noted that the crimes the suspects committed included; armed robbery, kidnapping, cultism, vandalism, rape among others.
The commissioner said that the Command had succeeded in arresting two notorious locally-made arm manufacturers a fortnight ago in Nenwe community.
“Gabriel Udeh, 38, of Otuku community in Awgu Local Government Area and Orji James, 40, of Agbada in Nenwe community in Aninri Local Government Area were arrested by the State Criminal Investigation Department.
“The suspects engaged in the manufacture and sales of firearms and they were arrested with the aid of Nenwe Community Neighbourhood Watch Association.
“These suspects must have been the ones that supply arms to criminals, who in turn use it to terrorize law abiding residents of the state,’’ he said.
READ ALSO: Police parade pastor for alleged rape of church member
The commissioner also said that Command also arrested three suspected kidnappers, who operate in the state but live outside the state.
“Inspector Maaling Peter, 35, of Rijana Police Station, Kaduna State; Sargent Ojudu Tiny, 34, of 64 Police Mobile Force, Ikorodu, Lagos State and Iheanachor Osuji of Ogui, Enugu State were arrested for alleged kidnapping.
“The three suspects are still under investigation,’’ he said.
He noted that the Command on Nov. 9 arrested Pastor Sunday Egbo, 26, of Christ Mercy Ministry Ajuona Obukpa in Nsukka Local Government Area for violence and forceful rape of one Miss Blessing Ukwueze.
Abdurrahman, however, urged criminals to steer clear of Enugu State this yuletide, adding; “The command did a show-of-force today and we take other measures to clearly show criminals the way out of the state’’.
“We are prepared for the forthcoming yuletide and there would be no chance or breathing space for criminals in the state henceforth, ‘’ he said.


Data which can be represented numerically is called quantitative data. This includes both data which is already numerical, and data which can be made numerical. Dates are a good example of quantitative data that isn't always written in numbers (for example, "March" doesn't seem numerical, but can be represented by 3 since it is the 3rd month of the year).
in-context


Chronicles
A collection of recently posted Chronicles curated by the team.
#SuperBowl
The Super Bowl is the annual championship game of the National Football League (NFL), the highest level of professional football in the United States, culminating a season that begins in the late summer of the previous calendar year. Relive the good, the bad and the ugly of Super Bowl 49.
#SuperBowl
The Super Bowl is the annual championship game of the National Football League (NFL), the highest level of professional football in the United States, culminating a season that begins in the late summer of the previous calendar year. Relive the good, the bad and the ugly of Super Bowl 49.


score
best
●
=
;
Get to
!
Undo
New
Continue?
Try again
HOW TO PLAY: Use your arrow keys to move the tiles. When two tiles with the same number touch, they merge into one!


Your Rides Are Here
We made exploration much easier
Easily track any workout you can imagine.
Use any of our free workouts or make up your own.
We made exploration much easier
Easily track any workout you can imagine.
Use any of our free workouts or make up your own.
Book a city taxi to your destination in your town in less than a minute.
Think the or organization same proposal to affected heard reclined in be it reassuring.
Think the or organization same proposal to affected heard reclined in be it reassuring.
Think the or organization same proposal to affected heard reclined in be it reassuring.
We are so excited and proud of our product. It's really easy to create a landing page for your awesome product.
Fly beast fourth, you stars. Them seasons sea spirit, which second. Hath May whales, creepeth light she'd. Moving saw fish.
Fly beast fourth, you stars. Them seasons sea spirit, which second. Hath May whales, creepeth light she'd. Moving saw fish.
Fly beast fourth, you stars. Them seasons sea spirit, which second. Hath May whales, creepeth light she'd. Moving saw fish.
DAILY DRIVERS
Monthly trip
SUPPORTED CITIES
Meet our small team that make those great products.
Since April 2016
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer posuere erat a ante.
Since April 2016
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer posuere erat a ante.
Since April 2016
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer posuere erat a ante.
We are so excited and proud of our product. It's really easy to create a landing page for your awesome product.
"Some quick example text to build on the card title and make up the bulk of the card's content. Some quick example text to build on."
Maryam Amiri
New York
"Some quick example text to build on the card title and make up the bulk of the card's content. Some quick example text to build on."
Maryam Amiri
New York
"Some quick example text to build on the card title and make up the bulk of the card's content. Some quick example text to build on."
Maryam Amiri
New York
As absolute is by amounted repeated entirely ye returned. These ready timed enjoy might sir yet one since.


{% extends "base.template.html" %} {% set title = "Reviews" %} {% set description = "Decide how many approvals are required and when review requests are sent" %} {% block content %}
This is how you determine how many approvals are required for this group to be approved, and how many review requests will be sent at a time (e.g. the max number of "pending" requested reviews at once). Additionally, you can decide what order reviewers are chosen in.
{% code "yaml" %}{% raw %} version: 3 groups: code: reviews: required: 3 # 3 approvals from this group are required request: 1 # 1 review request will be sent at a time request_order: shuffle # reviewers will be chosen in a random order author_value: 1 # if the PR author is in this group, automatically add +1 {% endraw %}{% endcode %}Use request_order: given
to have reviewers requested in the
same order that you provide them (most useful with specific users
).
This can be handy for putting reviewers in order of preference, but having
fallbacks in case people are unavailable.
Even though the PR author cannot approve their own PR within GitHub, you can still factor them in to your review process.
By using the author_value
setting, you can decide how the
required reviews are affected if the PR author is a member of this group.
By using a positive number, the author essentially "auto approves" their own PR.
{% code "yaml" %}{% raw %} version: 3 groups: code: reviews: # only 2 approvals required if author is in this group required: 3 author_value: 1 code: reviews: # only 1 approval required if author is in this group required: 3 author_value: 2 code: reviews: # no approval required if author is in this group required: 3 author_value: 3 {% endraw %}{% endcode %}By using a negative number, you can actually require more reviews if the author is also a member of the group. This might be useful if you want to ensure that any PR that this group "owns" gets more reviews than they usually do. For example, if the "security" team needs to give extra attention to their own PRs.
{% code "yaml" %}{% raw %} version: 3 groups: code: reviews: # require 4 approvals if the author is in this group required: 3 author_value: -1 {% endraw %}{% endcode %} {% endblock %}


Welcome to Scalabel
You can start with
creating a new labeling project
or check out our
homepage
for more info.


ONCE WERE WARRIORS A film review by Scott Renshaw Copyright 1995 Scott Renshaw
Starring: Rena Owen, Temuera Morrison, Mamaengaroa Kerr-Bell, Julian Arahanga, Taungaroa Emile. Screenplay: Riwia Brown. Director: Lee Tamahori.
Critics are often heard complaining about the lack of originality in American filmmaking, about remakes, TV-retreads and tired concepts dominating the multiplexes. When Hollywood does decide to show the audience something it has never seen before, it is usually technology leading the way (JURASSIC PARK, TERMINATOR 2). ONCE WERE WARRIORS is a wonderful example of what the movie-going experience can teach us given the opportunity. As an examination of the Maori culture in contemporary New Zealand, ONCE WERE WARRIORS showed me a world I had never seen before, and up until its overly melodramatic final half hour, it is a fascinating and unsettling drama.
ONCE WERE WARRIORS is the story of the Heke family, people of Maori descent living in present day Auckland. Beth (Rena Owen), a stoic homemaker, faces tremendous family pressures, most dangerously from her unemployed and frequently abusive husband Jake (Temuera Morrison). The children also present problems: oldest son Nig (Julian Arahanga) has left home in favor of the company of a Maori gang; middle son Boogie (Taungaroa Emile) has frequent run-ins with the law and may be taken away by social services; daughter Grace (Mamaengaroa Kerr-Bell) dreams of being a writer but is discouraged by the culture's traditional roles for women. These pressures continue to build, until a family tragedy forces Beth to decide if she can continue to live the same life.
The first image in ONCE WERE WARRIORS is an idyllic landscape, which is quickly revealed to be a billboard over a busy highway and a Maori "ghetto." Director Lee Tamahori sets up his story as one far removed from a perhaps-mythic past, and defined by a warrior culture in a land where the war for survival is fought against less tangible enemies. Often poor and treated with disdain by white authority figures, the Maori turn their aggression inward, in pointless and explosive barroom brawls and domestic violence. ONCE WERE WARRIORS has become a massive box office success in New Zealand for addressing this culture which accounts for almost 10% of its population, but it doesn't require a stretch to recognize that it is a story which translates all too well to stories of America's economically disadvantaged minority cultures. It is a specific story, but in many ways it is also a universal one.
The specific story is most effective thanks to several powerful performances.  Her love for Jake is as genuine as her frequent fear and hatred of him, and that conflict drives the film. Temuera Morrison is even more complex as Jake, because he makes a violent drunk appealing enough during his good moments to make the relationship convincing; he is Fred Flintstone with a serious attitude. Mamaengaroa Kerr-Bell, as the ever-more- pessimistic Grace, is also good, as is Taungaroa Emile as the troubled Boogie.
While it is frighteningly real violence which drives ONCE WERE WARRIORS for much of its running time, pathos unfortunately takes over in the third act. There is a drawn-out sequence which gives everyone a chance to cry and make a speech, and characters start to speak in platitudes like, "You're still a slave, Jake ... a slave to your fists" and "I'll wear my (tatoos) on the inside." By the end, I was wondering whether Tamahori was taking his cue from Hollywood, providing a feel-good resolution which tied up loose ends far too neatly, rather than sticking with the harsh realities of the world in which he has placed us. This takes nothing away from everything that has gone before, however. ONCE WERE WARRIORS is filled with memorable images, solid acting and a keen sense of place and character, but without even realizing it, Tamahori has also told a story about urban sub-cultures far from his own home.
On the Renshaw scale of 0 to 10 warriors: 8.
-- Scott Renshaw Stanford University Office of the General Counsel
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


How might we make interactive land art? This project is one answer for this question, and I am open-sourcing it. This work will take a number of months to execute and I’ll be sharing updates at major milestones, with in-progress information about hardware, software, materials, process, and theory.
While I was in college in Seattle I made an interactive project using a big handheld spotlight, a pair of walkie-talkies, and an arduino. Seattle is very hilly, and on one hill I put the spotlight. Then from another hill one mile away, you could control the spotlight with your voice. At that distance, the light looked like any other streetlight – a tiny spec. But it only turned on when you were speaking into the walkie-talkie. I made a short film about setting the project up and using it, the light flashing on and off with every syllable you spoke.
I want to make another version of this project in Seattle again, but at a very large scale. Seattle is surrounded by mountains – to the east are the Cascades, and to the west are the Olympics. They’re a defining feature of the landscape – they’re the horizon, the walls of the wilderness that contains the city. I want to put a light out in these mountains, 35 miles away, that anyone can control in the city by visiting a url on their phone and speaking into it.
Background
Some thoughts about what the piece means to me:
- It may turn out to be an extreme digital interaction that will be worthwhile in itself. Someone using this will probably never have experienced anything like it before. Seeing a light turn on when you speak at the distance of 1 mile, or even 100 yards, is uncanny. At 35 miles it may be really strange and awe-inspiring.
- In one sense, activating the light is conceptually similar with posting something on the internet. You hit a button on your phone with your fingers, and thousands of miles away a server does some unknown task, and then pixels on someone else’s phone sends light into their eyeballs. I’m interested in playing with bringing this action-at-a-distance to the largest scale that one person can immediately experience.
- What is a city? What are the limits of a city? All these lights and other utilities that surround us and are interactive to varying degrees, what do they say to us? Are they benevolent?
-
I take a lot of inspiration from the Light and Space movement,
especially Robert Irwin.
- The idea of site-specific art: a piece that leverages the features of its environment. It can only exist in that place it was designed for – if you move it, it’s changed. The context is part of the work.
- The tactic of stripping a work down further and further because that’s one way to make art that can get at fundamental principles of experience. This piece is really just one pixel, far away.
- A fascination with the perception of space. I’m interested in how drawing attention to this tiny light as far as the eye can see will protract or flatten someone’s sense of distance and their larger environment.
The Tech
What follows is an audit over all the bases I have to cover to execute this project.
1. The Light
A light visible at 35 miles needs to be extremely bright, so only a radio tower beacon will do. This will be powered by a solar generator consisting of a solar panel, a battery, and a BMS (Battery Management System) that handles the charging and output. There are newer LED beacons that use less power. Radio tower obstruction lights are normally omnidirectional (the unidirectional ones are typically strobes, which won’t work for this), but I actually want focused light. Additionally, the light may not still be bright enough to be as visible as I want at 35 miles. I may need a parabolic reflector and/or a fresnel lens, and it may have to be custom designed and fabricated.
2. The Brains
The light will be turned on and off using a solid state relay controlled by a cellular-radio enabled IOT board. I’ve selected the Particle Electron because it’s more plug and play than using other things e.g. the Raspberry Pi for this application. It’ll provide some resiliency, for example if it crashes or if the power dies temporarily, afterwards it’ll come on and connect to the internet and the server again automatically. This would take work to configure with a R-pi. It’s also probably lower power. It has a pretty active community and core libraries for a TCP client, which I will use.
3. The Signal
Cell data. Woah boy, it’s weird. There are a lot of things we take for granted when we’re on wifi that we can’t with cellular data. You can see the cracks.
Particle actually offers cellular data as a service with an API, but I’ll be using too much data at the rate I’m sending to be able to take advantage of it.
Some napkin math about how much data I’ll need: I’ll need send a number describing the loudness of someone’s voice from the client to the server at around 25 times per second to achieve a time-resolution similar to video. Maybe as little as 10 times per second will be acceptable, but I won’t know until I prototype. I think my transmission unit might be around 128 bytes, but not sure on that either.
128 bytes x 25/sec x 60 sec x 60 min x 16 hours max = 184 megabytes per day, maybe 5-6 gb per month maximum.
There are two major cellular radio systems: CDMA and GSM. The Particle Electron only works with GSM providers. I’m in the USA, Verizon and Sprint are out because they’re CDMA, and AT&T and T-Mobile are the major GSM options. Rates for IoT device tiers from these carriers can be hard to understand and not that great of a deal I’ve found. At this point I’m going with a different carrier called Ting, which is made for IoT, and is a little more pay-as-you-go which is especially great for development.
A couple of other hurdles with cellular: latency and estimating signal strength. Latency will be explored in a hardware prototype soon. For signal strength, there’s a handy tool called OpenSignal that crowd sources signal strength readings across the map, and the cell providers have maps of their own you can download too. I’ll get a big cell antenna to boost the signal, as a just-in-case measure.
4. The Front End
Anyone in the Seattle are should be able to go to a url on a smartphone and begin controlling the light with their voice. The best way to send this type of streaming data is with websockets. I won’t send audio itself, because it’s bad for privacy and I don’t really need that high of resolution anyway. I’ll be essentially doing a lowpass filter in the browser, and sending a number representing the volume at a rate of 10 to 25 times per second, most likely. I’d like to keep the interface very minimal.
5. The Back End
This is going to be a real-time app that revolves around streaming data from many clients simultaneously. There are several websocket libraries that have better performance than socket.io, but actually for the number of users that will be using the app at once (maybe 100 max?) performance is not that important, and socket.io seems like the best choice for ease of development.
There will need to be some logic for mixing all incoming signals. I’ll write more on this later, but for now think of it as summing all incoming signals up to a certain limit, with some additional dynamic behavior when there are more than 5-10 simultaneous users. Then, the backend will pass the final output down to the Particle board via TCP.
At least in the beginning I’ll need to set up a system for logging and a dashboard to see the data and perform some administration actions. There are 3 reasons for this: for prototyping and iterative design in early stages; for documentation of how people used it after the project is over; and maybe even for managing bad actors while the piece is in play.
Land Use, Logistics, Design
There are some non-technical challenges to executing this piece too.
Selecting a site. Since I don’t live in Seattle anymore, I’ve used google maps to stake out a lot of the land surrounding the city. When I was visiting in October, I went on a hike in one potential location, and confirmed that it’s possible to see radio tower lights from more than 35 miles away.
I also need permission. To the east, the land covering the nearby Cascades is managed by a corporation. To the west, it’s managed by the National Forest Service. Using NFS land is highly regulated and there’s a protracted process to gain access, so it would be much easier to just send the corporation a letter. Anyway, NFS actually requires that you pursue non-public options for your use first. To ask for permission, I might think about some creative options like a video pitch or even something more out there. The work of Christo and Jeanne-Claude art required a lot of securing agreements with public agencies and private property owners, and the process of getting permission even became part of the work. It’s a different story when you are an early career unknown artist, though.
Either way, I may be required to get a Professional Engineer to look over my light’s specs and make sure it’s not a fire hazard. Even if it’s not legally required, I might do it anyway because it will make me and probably my hosts feel better. PE’s are often engaged for public art projects. I need to find one though, and I’m not sure the best way to go about that. Been following some word of mouth leads with other artists.
Also, I need to check that this light will be legal by FAA standards. It’s hard to understand if it is just by reading their regulations, because my use-case is so atypical – flashing white medium intensity at night. Usually it’s flashing red at night, or flashing white high intensity during the day. This may be allowed by I may have to make accommodations, for example I may have to put on the top of a ridge instead of on the side, or even put it on a radio tower, or even change the color to red.
Setup is going to require flying from NYC to Seattle, probably doing some fabrication there, and then getting a team of people to help install. I may have to secure some space to do staging/testing. I’ll have to rent a truck and maybe get permits to access land. Then, I’ll also want to take footage of setting the project up to use in documentation/ video version of the work, and take footage of people using it while I’m there. So I’ll need to rent video equipment and do some storyboarding to plan what my final project ideal would be.
Publicity. The social dimension of this piece is really important to me. I’m inspired by the All Rise project and the confusion it caused. People didn’t really know what to make of it at first, and there was some question about who was behind it, what their motives are, or even was it art. I would like this piece to slowly catch on in the same way. I may flyer in places that have line of sight to break out of my social bubble without using press. Flyers will have to be designed carefully because of the type of messaging/framing they give the piece.
The front end design will have to be carefully considered too. It’ll be really minimal, and dark so it doesn’t ruin people’s night vision.
And there’s another problem that’s a crossover between tech and non-tech. Mitigating abuse. There might be bad actors, it’ll be possible to troll the game and make it unusable for other people. I’ll need to set up some quick and dirty defenses against people gaming it, as well as using it from other locations outside of Seattle, but I don’t think I’ll ever be able to totally protect it. Also what I have in mind will be really time intensive – like might take just as much time as writing the rest of the app, so I may have to work on it once the thing is already launched, hoping it won’t go viral and attract “hackers” right away.
Alright, that was a long summary. In upcoming posts I’ll examine some of the individual components more in-depth!


I have always been interested in the inner workings of everything! Behind the scenes is where I excell.


| PostgreSQL 9.0.10 Documentation | ||||
|---|---|---|---|---|
| Prev | Up | Chapter 9. Functions and Operators | Next |
This section describes functions and operators for examining and manipulating bit strings, that is values of the types bit and bit varying. Aside from the usual comparison operators, the operators shown in Table 9-10 can be used. Bit string operands of &, |, and # must be of equal length. When bit shifting, the original length of the string is preserved, as shown in the examples.
Table 9-10. Bit String Operators
| Operator | Description | Example | Result |
|---|---|---|---|
| || | concatenation | B'10001' || B'011' | 10001011 |
| & | bitwise AND | B'10001' & B'01101' | 00001 |
| | | bitwise OR | B'10001' | B'01101' | 11101 |
| # | bitwise XOR | B'10001' # B'01101' | 11100 |
| ~ | bitwise NOT | ~ B'10001' | 01110 |
| << | bitwise shift left | B'10001' << 3 | 01000 |
| >> | bitwise shift right | B'10001' >> 2 | 00100 |
The following SQL-standard functions work on bit
strings as well as character strings:
length
,
bit_length
,
octet_length
,
position
,
substring
,
overlay
.
The following functions work on bit strings as well as binary
strings:
get_bit
,
set_bit
.
When working with a bit string, these functions number the first
(leftmost) bit of the string as bit 0.
In addition, it is possible to cast integral values to and from type bit. Some examples:
44::bit(10)<PHONE_NUMBER> 44::bit(3) 100 cast(-44 as bit(12))<PHONE_NUMBER>00 '1110'::bit(4)::integer 14
Note that casting to just "bit" means casting to bit(1), and so will deliver only the least significant bit of the integer.
Note: Prior to PostgreSQL 8.0, casting an integer to bit(n) would copy the leftmost n bits of the integer, whereas now it copies the rightmost n bits. Also, casting an integer to a bit string width wider than the integer itself will sign-extend on the left.


CoreDNS is a relatively new DNS server written in Go. CoreDNS was written keeping in mind the evolving needs of today and the ability to work well with cloud native applications. In Kubernetes 1.13, CoreDNS is the default cluster DNS server.
The objective of this learning module is to help participants understand the following:
Install Ubuntu Server on Virtualbox.
Before we start with CoreDNS, let’s take a look at how to run Bind as a Docker container. Since we are already familiar with Bind, this should help us get some context on CoreDNS by providing us a comparison between CoreDNS and Bind.
To begin, we wll create an ubuntu container and install Bind in it.
Run the below command to deploy the Ubuntu container for Bind.
docker run -it -p 53:53/udp --name bind --hostname bind ubuntu bash
Your prompt should have changed to something similar to the below.
root@bind:/#
You are now in the container where you will install Bind.
Let’s proceed with the installation.
Run the following commands in the container to install Bind and related tools. We will also install Vim which will let s edit configuration file.
apt update
apt install bind9 bind9utils vim -y
We will be configuring Bind as a simple forwarding server.
Run the below command to edit the configuration file.
vi /etc/bind/named.conf.options
Edit the configuration file as below.
options {
directory "/var/cache/bind";
forwarders {
<IP_ADDRESS>;
};
listen-on { any; };
};
Now, let’s start the DNS service.
service bind9 start
The expected output is as below.
root@bind:/# service bind9 start
* Starting domain name service... bind9 [ OK]
Detach from the container using the keyboard combination < CTRL+P Q >.
You should have detached from the container now.
Query the localhost for the A record of google.com.
The output should be as below.
# dig @localhost google.com
; <<>> DiG 9.11.3-1ubuntu1.2-Ubuntu <<>> @localhost google.com
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 28564
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: 50d02d3da9df35d4f87516ce5be9febb259bf180bbc6261a (good)
;; QUESTION SECTION:
;google.com. IN A
;; ANSWER SECTION:
google.com. 2 IN A <IP_ADDRESS>
;; Query time: 6 msec
;; SERVER: ::1#53(::1)
;; WHEN: Mon Nov 12 22:29:15 UTC 2018
;; MSG SIZE rcvd: 83
We have now run Bind from a Docker container and tested the server.
Let’s move on to CoreDNS.
Before we move on, we will need to kill the Bind container to free up UDP port 53 on the host.
 The output should be as below.
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
CoreDNS does provide a docker image but we will be looking at how to run it manually from an Ubuntu container.
The below command deploys the container.
docker run -it -p 53:53/udp --name coredns-manual --hostname coredns ubuntu bash
Your prompt should have changed to something similar to the below.
root@coredns:/#
root@coredns:/# apt update
Below are the steps to install CoreDNS
Precompiled binary executable file for CoreDNS can be obtained from the CoreDNS Github repository.
apt install wget vim -y
wget https://github.com/coredns/coredns/releases/download/v1.2.5/coredns_1.2.5_linux_amd64.tgz
mkdir ~/coredns
mv coredns_1.2.5_linux_amd64.tgz ~/coredns
cd ~/coredns
tar -xvzf coredns_1.2.5_linux_amd64.tgz
rm -f coredns_1.2.5_linux_amd64.tgz
This should produce an executable file named coredns.
root@coredns:~/coredns# ls -l
total 50440
-rwxr-xr-x 1 www-data www-data 39737920 Oct 24 20:10 coredns
Run the executable file.
The output should be as below.
root@coredns:~/coredns# ./coredns
.:53
2018/10/31 19:25:54 [INFO] CoreDNS-1.2.5
2018/10/31 19:25:54 [INFO] linux/amd64, go1.11.1, 204537b
CoreDNS-1.2.5
linux/amd64, go1.11.1, 204537b
Notice that the execution does not complete and go the prompt “root@coredns:~/coredns#” CoreDNS server is now running.
Detach from the container using the keyboard combination < CTRL+P Q >.
Now you should have detached from the container and shuold be in the prompt of the VM.
Run the command ‘docker ps’. Output should be as below(except for the Container ID).
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
858520e82135 ubuntu "bash" 4 hours ago Up 17 minutes <IP_ADDRESS>:53->53/udp, <IP_ADDRESS>:443->443/tcp coredns-manual
Under PORTS, “<IP_ADDRESS>:53->53/udp” shows that UDP port 53 on the host is mapped to UDP port 53 on the container.
Perform a few DNS queries against localhost. Notice that the response always looks similar to this.
# dig @localhost example.com
; <<>> DiG 9.11.3-1ubuntu1.2-Ubuntu <<>> @localhost example.com
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 25683
;; flags: qr aa rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 3
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: cbc94e442b78ed38 (echoed)
;; QUESTION SECTION:
;example.com. IN A
;; ADDITIONAL SECTION:
example.com. 0 IN A <IP_ADDRESS>
_udp.example.com. 0 IN SRV 0 0 59496 .
;; Query time: 0 msec
;; SERVER: ::1#53(::1)
;; WHEN: Wed Oct 31 19:41:50 UTC 2018
;; MSG SIZE rcvd: 117
This is expected. Since no configuration has been done, CoreDNS loads a plugin called whoami that responds with the IP address and port of the client.
Configuration parameters for CoreDNS are defined in a file named ‘Corefile’. CoreDNS is designed to run multiple server instances on the same host. These servers can run on different ports or the same port. A server block is a block of configuration statements in the corefile which define a server. Zone statements are configured in server blocks. If there are multiple server blocks listening on the same port (eg: port 53), the server will send a response from the server block with the zone with the closest match to the domain in the queried.
Below is a sample server block
test.com{
}
By default the server listens on port 53. To configure the server to listen on another port, say 1053, define the server block as below.
test.com:53 {
}
CoreDNS works by using plugins for different functionality. Plugin are programs that increase the functionality of CoreDNS. Plugins can be in-tree(from CoreDNS team) or external plugins(developed by the community or third parties).
Here are a few plugins which we will be working with:
These are in-tree plugins and don’t require any additional setup. These plugins can be invoked by calling them from the ‘Corefile’ as seen below.
test.com:53 {
log
}
CoreDNS by default does not support recursively resolving queries. The ‘forward’ in-tree plugin can be used to forward queries to a forwarder. There are external plugins that can bring this functionality to CoreDNS
To get started attach to the container ‘coredns-manual’.
#docker attach coredns-manual
Stop the running process using the keyboard combination <CTRL + C>.
Confirm that the working directory is ‘/root/coredns’.
root@coredns:~/coredns# pwd
/root/coredns
If not, change directory to /root/coredns.
cd /root/coredns
Create a file named ‘Corefile’.
vi Corefile
Insert the below text into the file.
test.com {
file db.test.com
}
Create a file named db.test.com and insert the below text into the file.
$ORIGIN test.com.
@ 3600 IN SOA ns1.test.com. admin.test.com. (
2017042745 ; serial
7200 ; refresh (2 hours)
3600 ; retry (1 hour)
1209600 ; expire (2 weeks)
3600 ; minimum (1 hour)
)
3600 IN NS ns1.test.com.
3600 IN NS ns2.test.com.
www IN A <IP_ADDRESS>
ns1 IN A <IP_ADDRESS>
ns2 IN A <IP_ADDRESS>
Start CoreDNS with the below command.
./coredns -conf Corefile
Detach from the container using the keyboard combination < CTRL+P Q >.
Query localhost for www.test.com. You should be able to see output as below.
# dig @localhost www.test.com 1 ↵
; <<>> DiG 9.11.3-1ubuntu1.2-Ubuntu <<>> @localhost www.test.com
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 51555
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 0
;; QUESTION SECTION:
;www.test.com. IN A
;; ANSWER SECTION:
www.test.com. 3600 IN A <IP_ADDRESS>
;; AUTHORITY SECTION:
test.com. 3600 IN NS ns1.test.com.
test.com. 3600 IN NS ns2.test.com.
;; Query time: 2 msec
;; SERVER: ::1#53(::1)
;; WHEN: Thu Nov 01 20:16:07 UTC 2018
;; MSG SIZE rcvd: 126
In the above excersise, we used the file plugin. The statement file db.test.com is to use the file ‘db.test.com’ as the zone file for the zone ‘test.com’.
Now we will look at the log plugin.
To see the ‘log’ plugin in action, let’s look at the logs for the ‘coredns-manual’ container. The command and output are below.
# docker logs coredns-manual --tail 10
root@coredns:~/coredns# ./coredns -conf Corefile
test.com.:53
2018/11/02 13:30:31 [INFO] CoreDNS-1.2.5
2018/11/02 13:30:31 [INFO] linux/amd64, go1.11.1, 204537b
CoreDNS-1.2.5
linux/amd64, go1.11.1, 204537b
Attach to the container again.
docker attach coredns-manual
Stop the running process using the keyboard combination <CTRL + C>.
Edit the file ‘Corefile’ and to match the below.
test.com {
file db.test.com
log
}
~
Start CoreDNS server.
./coredns -conf Corefile
Detach from the container using the keyboard combination < CTRL+P Q >.
Query localhost as above for www.test.com.
Now, check the logs for the container again.
You should see logs as below.
root@coredns:~/coredns#./coredns -conf Corefile
test.com.:53
2018/11/02 13:39:19 [INFO] CoreDNS-1.2.5
2018/11/02 13:39:19 [INFO] linux/amd64, go1.11.1, 204537b
CoreDNS-1.2.5
linux/amd64, go1.11.1, 204537b
<IP_ADDRESS>:60210 - [02/Nov/2018:13:48:05 +0000] 24028 "A IN www.test.com. udp 54 false 4096" NOERROR qr,aa,rd,ra 126 0.004729567s
Note that the logs now include query logs.
<IP_ADDRESS>:60210 - [02/Nov/2018:13:48:05 +0000] 24028 "A IN www.test.com. udp 54 false 4096" NOERROR qr,aa,rd,ra 126 0.004729567s
We are able to see these logs in docker logs since CoreDNS is running in a docker container. If CoreDNS was running on the host and not in a container, these logs would be printed to STDOUT.
Now, we will configure the forward plugin.
The forward plugin can forward queries to a specific set of servers. The plugin can also load balance using different methods between these servers.
We will configure a global forwarder and a forwarder for a specific domain name using the plugin.
Query localhost for google.com.
Attach to the container again.
docker attach coredns-manual
Stop the running process using the keyboard combination <CTRL + C>.
Edit the file ‘Corefile’ and to match the below.
test.com {
file db.test.com
log
}
. {
forward . <IP_ADDRESS>
}
Start CoreDNS server.
./coredns -conf Corefile
Detach from the container using the keyboard combination < CTRL+P Q >.
Query localhost for google.com. The response should be as below.
) # dig @localhost google.com 127 ↵
; <<>> DiG 9.11.3-1ubuntu1.2-Ubuntu <<>> @localhost google.com
In ; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 52732
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;google.com. IN A
;; ANSWER SECTION:
google.com. 36 IN A <IP_ADDRESS>
;; Query time: 12 msec
;; SERVER: ::1#53(::1)
;; WHEN: Fri Nov 02 14:13:49 UTC 2018
;; MSG SIZE rcvd: 65
The query was forwarded the <IP_ADDRESS> and resolved.
Below are the newly added entries in the ‘Corefile’.
. {
forward . <IP_ADDRESS>
}
The zone name here is ‘.’ (root). In the plugin statement we say ‘forward . <IP_ADDRESS>’ forward all queries under root to <IP_ADDRESS>.
Now query localhost for www.test.com. The query is resolving from the authoritative zone.
This is because, since both server blocks listen on the default port (53), the query for www.test.com is resolved from the server block for test.com and anything else would be resolved from the server block for root.
Now we will forward queries for a particular domain.
Below are the steps.
# docker cp coredns-manual:/root/coredns/coredns .
# docker cp coredns-manual:/root/coredns/Corefile .
# docker cp coredns-manual:/root/coredns/db.test.com .
# ls -l
total 38816
-rwxr-xr-x 1 root root 39737920 Oct 24 20:10 coredns
-rw-r--r-- 1 root root 73 Nov 2 14:11 Corefile
-rw-r--r-- 1 root root 367 Nov 1 20:25 db.test.com
example.com {
file db.example.com
log
}
mv db.test.com db.example.com
sed -i 's/test.com/example.com/g' db.example.com
docker run -itd --name coredns-forwarder ubuntu bash
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b91d9140f02b ubuntu "bash" 4 seconds ago Up 3 seconds coredns-forwarder
858520e82135 ubuntu "bash" 47 hours ago Up About an hour <IP_ADDRESS>:53->53/udp, <IP_ADDRESS>:443->443/tcp coredns-manual
docker cp coredns coredns-forwarder:/root/
docker cp Corefile coredns-forwarder:/root/
docker cp db.example.com coredns-forwarder:/root/
# docker exec coredns-forwarder ls /root
Corefile
coredns
db.example.com
docker attach coredns-forwarder
root@b91d9140f02b:/# cd /root
root@b91d9140f02b:~# ./coredns -conf Corefile
example.com.:53
2018/11/02 14:39:23 [INFO] CoreDNS-1.2.5
2018/11/02 14:39:23 [INFO] linux/amd64, go1.11.1, 204537b
CoreDNS-1.2.5
linux/amd64, go1.11.1, 204537b
Detach from the container using the keyboard combination < CTRL+P Q >.
Find the IP address of the ‘coredns-forwarder’ container. This is done by inspecting the defaulr docker network (bridge).
# docker network inspect bridge | grep -A 3 coredns-forwarder
"Name": "coredns-forwarder",
"EndpointID": "09020d084787b9dcff41f82f8c6be6d6d415dbea3ad53e64b66e8cc2411d4eae",
"MacAddress": "02:42:ac:11:00:03",
"IPv4Address": "<IP_ADDRESS>/16",
# docker attach coredns-manual
Stop the running CoreDNS server with the keyboard combination < CTRL + C >.
Edit the Corefile to match below but make sure that the IP address of the forwarder matches the IP address of ‘coredns-forwarder’.
test.com {
file db.test.com
log
}
. {
forward . <IP_ADDRESS>
}
example.com {
forward example.com <IP_ADDRESS>
}
./coredns -conf Corefile
Detach from the container using the keyboard combination < CTRL+P Q >.
Query localhost for www.example.com
# dig @localhost www.example.com 1 ↵
; <<>> DiG 9.11.3-1ubuntu1.2-Ubuntu <<>> @localhost www.example.com
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 47364
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 0
;; QUESTION SECTION:
;www.example.com. IN A
;; ANSWER SECTION:
www.example.com. 3600 IN A <IP_ADDRESS>
;; AUTHORITY SECTION:
example.com. 3600 IN NS ns1.example.com.
example.com. 3600 IN NS ns2.example.com.
;; Query time: 0 msec
;; SERVER: ::1#53(::1)
;; WHEN: Fri Nov 02 16:58:20 UTC 2018
;; MSG SIZE rcvd: 144
Since port 53 on the host is mapped to port 53 on the container coredns-manual, any queries on port 53 to localhost lands on this container. The query is forwarded from this container to the container ‘coredns-forwarder’ where an authoritative server for the zone ‘example.com’ is running. This is how the query is resolved.
Currently CoreDNS accepts three different protocols: plain DNS, DNS over TLS and DNS over gRPC. The protocol must me specified on the server block in the Corefile.
If you are interested in learning more about the topics discussed here, here are a few places to visit.


Contains helper functions used to implement NDK NIMU transport driver interface for ICSS. More...
#include <stdint.h>
#include <ti/csl/hw_types.h>
#include <ti/csl/csl_mdioAux.h>
#include "ti/transport/ndk/nimu_icss/src/nimu_icss_transport_log.h"
#include "ti/transport/ndk/nimu_icss/src/nimu_icssSwitchEmac.h"
#include "ti/transport/ndk/nimu_icss/nimu_icssIoctl.h"
#include "ti/drv/icss_emac/icss_emacStatistics.h"
#include "ti/drv/icss_emac/icss_emacStormControl.h"
#include "ti/transport/ndk/nimu_icss/nimu_icssEth.h"
Functions | |
| void | NIMU_ICSS_packetInit (NIMU_IcssEmacPkt *pNimuPacket) |
| The function initialize an NIMU_IcssEmacPkt to receive packets. | |
| void | NIMU_ICSS_packetShutdown (NIMU_IcssPdInfo *pi) |
| The function free Rx packet buffer. | |
| static void | NIMU_ICSS_updateStats (NIMU_IcssPdInfo *pd, uint8_t portNo) |
| Update our local copy of the statistics. | |
| void | NIMU_ICSS_openPeripheral (NIMU_IcssPdInfo *pi) |
| Opens the EMAC peripheral at the given physical index and initializes it to an embryonic state. More... | |
| uint32_t | NIMU_ICSS_closePeripheral (NIMU_IcssPdInfo *pi) |
| Closed the EMAC peripheral indicated by the supplied instance handle. When called, the EMAC device will shutdown both send and receive operations, and free all pending transmit and receive packets. More... | |
| uint32_t | NIMU_ICSS_getStatistics (NIMU_IcssPdInfo *pi, NIMU_IcssStatistics *pStatistics, uint8_t portNo) |
| Called to get the current device statistics. The statistics structure contains a collection of event counts for various packet sent and receive properties. Reading the statistics also clears the current statistic counters, so the values read represent a delta from the last call. More... | |
| uint32_t | NIMU_ICSS_clearStatistics (NIMU_IcssPdInfo *pi, uint8_t portNo) |
| Called to clear the current device statistics for a particular port. | |
| uint32_t | NIMU_ICSS_setConfig (NIMU_IcssPdInfo *pi, void *pBuf, uint32_t size) |
| This function is called to perform various get/set operations on the EMAC ALE table, statistics counters etc. | |
| uint32_t | NIMU_ICSS_sendPacket (Handle hEMAC, NIMU_IcssEmacPkt *pPkt) |
| Sends a Ethernet data packet out the EMAC device. On a non-error return, the EMAC device takes ownership of the packet. The packet is returned to the application's free pool once it has been transmitted. | |
| uint32_t | NIMU_ICSS_rxServiceCheck (ICSS_EmacHandle hEMAC, int32_t prioQueue) |
| This function should be called every time there is an EMAC device Rx interrupt to process the packet. More... | |
Contains helper functions used to implement NDK NIMU transport driver interface for ICSS.
| uint32_t NIMU_ICSS_closePeripheral | ( | NIMU_IcssPdInfo * | pi | ) |
Closed the EMAC peripheral indicated by the supplied instance handle. When called, the EMAC device will shutdown both send and receive operations, and free all pending transmit and receive packets.
The function returns zero on success, or an error code on failure. Possible error code include: NIMU_ICSS_INVALID_PARAM - A calling parameter is invalid
| uint32_t NIMU_ICSS_getStatistics | ( | NIMU_IcssPdInfo * | pi, |
| NIMU_IcssStatistics * | pStatistics, | ||
| uint8_t | portNo | ||
| ) |
Called to get the current device statistics. The statistics structure contains a collection of event counts for various packet sent and receive properties. Reading the statistics also clears the current statistic counters, so the values read represent a delta from the last call.
The statistics information is copied into the structure pointed to by the pStatistics argument. The function returns zero on success, or an error code on failure. Possible error code include: NIMU_ICSS_INVALID_PARAM - A calling parameter is invalid
| void NIMU_ICSS_openPeripheral | ( | NIMU_IcssPdInfo * | pi | ) |
Opens the EMAC peripheral at the given physical index and initializes it to an embryonic state.
The calling application must supply a operating configuration that includes a callback function table. Data from this config structure is copied into the device's internal instance structure so the structure may be discarded after NIMU_ICSS_openPeripheral() returns. In order to change an item in the configuration, the EMAC device must be closed and then re-opened with the new configuration.
The application layer may pass in an hApplication callback handle,
that will be supplied by the EMAC device when making calls to the application callback functions.
An EMAC device handle is written to phEMAC. This handle must be saved by the caller and then passed to other EMAC device functions.
The default receive filter prevents normal packets from being received until the receive filter is specified by calling EMAC_receiveFilter().
A device reset is achieved by calling NIMU_ICSS_closePeripheral() followed by NIMU_ICSS_openPeripheral().
The function returns zero on success, or an error code on failure.
Possible error codes include: SWITCH_ERR_DEV_ALREADY_OPEN - The device is already open NIMU_ICSS_INVALID_PARAM - A calling parameter is invalid
| uint32_t NIMU_ICSS_rxServiceCheck | ( | ICSS_EmacHandle | hEMAC, |
| int32_t | prioQueue | ||
| ) |
This function should be called every time there is an EMAC device Rx interrupt to process the packet.
Note that the application has the responsibility for mapping the physical device index to the correct EMAC_serviceCheck() function. If more than one EMAC device is on the same interrupt, the function must be called for each device.


The ex-First Minister is expected to attend a preliminary hearing before a full trial, set to take place early next year.
Mr Salmond was charged with a total of 14 offences on January 24 this year.
He strongly denies all allegations against him.
Mr Salmond was Scotland’s First Minister between 2007 and 2014.
Police began an investigation following a Scottish Government inquiry into complaints of sexual harassment against him.
Mr Salmond launched a judicial review against the government’s handling of the probe, saying he had been treated unfairly.
The government later conceded its procedures had been flawed and paid out over £500,000 for the ex-top Nat’s legal fees.


clc y = StressVsTime(:,2);% Stress Fluctuation pks = findpeaks(abs(y)); % Determination of peak stress values L1 = min(pks); L2 = 1*max(pks)/10; L3 = 2*max(pks)/10; L4 = 3*max(pks)/10; L5 = 4*max(pks)/10; L6 = 5*max(pks)/10; L7 = 6*max(pks)/10; L8 = 7*max(pks)/10; L9 = 8*max(pks)/10; L10 = 9*max(pks)/10; L11 = 10*max(pks)/10;
Determination of number of cycles in the stress range 1 (i.e. NStress_1)
u=1; v=size(pks); Nsigma_1=0; %number of cycles with sigma_1 stress for i=u:1:v if abs(y(i,:))>L1 && abs(y(i,:))< L2 Nsigma_1=Nsigma_1+1; else Nsigma_1=Nsigma_1+0; end end Nsigma_1;
Determination of number of cycles in the stress range 1 (i.e. NStress_2)
u=1; v=size(y,1); Nsigma_2=0; %number of cycles with sigma_2 stress for i=u:1:v if abs(y(i,:))>L2 && abs(y(i,:))< L3 Nsigma_2=Nsigma_2+1; else Nsigma_2=Nsigma_2+0; end end Nsigma_2;
Determination of number of cycles in the stress range 1 (i.e. NStress_3)
u=1; v=size(y,1); Nsigma_3=0; %number of cycles with sigma_3 stress for i=u:1:v if abs(y(i,:))>L3 && abs(y(i,:))< L4 Nsigma_3=Nsigma_3+1; else Nsigma_3=Nsigma_3+0; end end Nsigma_3;
Determination of number of cycles in the stress range 1 (i.e. NStress_4)
u=1; v=size(y,1); Nsigma_4=0; %number of cycles with sigma_4 stress for i=u:1:v if abs(y(i,:))>L4 && abs(y(i,:))< L5 Nsigma_4=Nsigma_4+1; else Nsigma_4=Nsigma_4+0; end end Nsigma_4;
Determination of number of cycles in the stress range 1 (i.e. NStress_5)
u=1; v=size(y,1); Nsigma_5=0; %number of cycles with sigma_5 stress for i=u:1:v if abs(y(i,:))>L5 && abs(y(i,:))< L6 Nsigma_5=Nsigma_5+1; else Nsigma_5=Nsigma_5+0; end end Nsigma_5;
Determination of number of cycles in the stress range 1 (i.e. NStress_6)
u=1; v=size(y,1); Nsigma_6=0; %number of cycles with sigma_6 stress for i=u:1:v if abs(y(i,:))>L6 && abs(y(i,:))< L7 Nsigma_6=Nsigma_6+1; else Nsigma_6=Nsigma_6+0; end end Nsigma_6;
Determination of number of cycles in the stress range 1 (i.e. NStress_7)
u=1; v=size(y,1); Nsigma_7=0; %number of cycles with sigma_7 stress for i=u:1:v if abs(y(i,:))>L7 && abs(y(i,:))< L8 Nsigma_7=Nsigma_7+1; else Nsigma_7=Nsigma_7+0; end end Nsigma_7;
Determination of number of cycles in the stress range 1 (i.e. NStress_8)
u=1; v=size(y,1); Nsigma_8=0; %number of cycles with sigma_8 stress for i=u:1:v if abs(y(i,:))>L8 && abs(y(i,:))< L9 Nsigma_8=Nsigma_8+1; else Nsigma_8=Nsigma_8+0; end end Nsigma_8;
Determination of number of cycles in the stress range 1 (i.e. NStress_9)
u=1; v=size(y,1); Nsigma_9=0; %number of cycles with sigma_9 stress for i=u:1:v if abs(y(i,:))>L9 && abs(y(i,:))< L10 Nsigma_9=Nsigma_9+1; else Nsigma_9=Nsigma_9+0; end end Nsigma_9;
Determination of number of cycles in the stress range 1 (i.e. NStress_10)
u=1; v=size(y,1); Nsigma_10=0; %number of cycles with sigma_10 stress for i=u:1:v if abs(y(i,:))>L10 && abs(y(i,:))< L11 Nsigma_10=Nsigma_10+1; else Nsigma_10=Nsigma_10+0; end end Nsigma_10;
Cycles = 1/2*[Nsigma_1, Nsigma_2, Nsigma_3, Nsigma_4, Nsigma_5, Nsigma_6, Nsigma_7, Nsigma_8, Nsigma_9, Nsigma_10] % Devided by 2 to make a full cycle.
Cycles = 1.0e+05 * Columns 1 through 7 0.0119 1.0821 1.0236 0.9953 0.8992 0.5657 0.2306 Columns 8 through 10 0.0579 0.0091 0.0013
%N1 = 1.05E3; N2 = 1.15E3; N3 = 1.35E3; N4 = 1.85E3; N5 = 1.05E4; N6 = 1.2E4; N7 = 1.7E4; N8 = 1.05E5; N9 = 1.2E5; N10 = 1.0E6; N11 = inf; %%%%%%%%%Enter the number of cycles (Ni)here for the corresponding stress range N1 = 1.2E5; N2 = 1.0E6; N3 = inf; N4 = inf; N5 = inf; N6 = inf; N7 = inf; N8 = inf; N9 = inf; N10 = inf; N11 = inf;
Accumulated fatigue (AF)
disp ('STEP_01: From SN Curve, Enter the corresponding values for N1 to N11 for (L1+L2/2) to (L9+L10/2) @(Line 187 to 197)') disp ('STEP_02: Then enter the future predicted Stress Level @(Line 212)') AF = Cycles(:,1)/N10 + Cycles(:,2)/N9 + Cycles(:,3)/N8 + Cycles(:,4)/N7 + Cycles(:,5)/N6 + Cycles(:,6)/N5 + Cycles(:,7)/N4 +Cycles(:,8)/N3 + Cycles(:,9)/N2 + Cycles(:,10)/N1; disp ('Remaining n/Ni'); R = 1-AF; % Remaining n/Ni
STEP_01: From SN Curve, Enter the corresponding values for N1 to N11 for (L1+L2/2) to (L9+L10/2) @(Line 187 to 197) STEP_02: Then enter the future predicted Stress Level @(Line 212) Remaining n/Ni
%%%%%%%%%Enter the future predicted stress value here to get the remaining cycles before failure %RemainingNumberofCycles = R*Ni for the corresponding future stress level disp ('Remaining Number of Cycles for the current inputs:') RemainingCycles = R*1E5 % Assuming the future stress level is 200 MPa. Value taken from SN curve
Remaining Number of Cycles for the current inputs: RemainingCycles = 9.9803e+04


Sport
public enum Sport : UInt8
FIT Sport Types
-
Generic
Declaration
Swift
case generic = 0
-
Running
Declaration
Swift
case running = 1
-
Cycling
Declaration
Swift
case cycling = 2
-
Multi-Sport Transition
Declaration
Swift
case multisportTransition = 3
-
Fitness Equipment
Declaration
Swift
case fitnessEquipment = 4
-
Swimming
Declaration
Swift
case swimming = 5
-
Basketball
Declaration
Swift
case basketball = 6
-
Soccer
Declaration
Swift
case soccer = 7
-
Tennis
Declaration
Swift
case tennis = 8
-
American Football
Declaration
Swift
case americanFootball = 9
-
Training
Declaration
Swift
case training = 10
-
Walking
Declaration
Swift
case walking = 11
-
Cross Country Skiing
Declaration
Swift
case crossCountrySkiing = 12
-
Alpine Skiing
Declaration
Swift
case alpineSkiing = 13
-
Snow Boarding
Declaration
Swift
case snowboarding = 14
-
Rowing
Declaration
Swift
case rowing = 15
-
Mountaineering
Declaration
Swift
case mountaineering = 16
-
Hiking
Declaration
Swift
case hiking = 17
-
Mulitsport
Declaration
Swift
case mulitsport = 18
-
Paddling
Declaration
Swift
case paddling = 19
-
Flying
Declaration
Swift
case flying = 20
-
eBiking
Declaration
Swift
case eBiking = 21
-
Motorcycling
Declaration
Swift
case motorcycling = 22
-
Boating
Declaration
Swift
case boating = 23
-
Driving
Declaration
Swift
case driving = 24
-
Golf
Declaration
Swift
case golf = 25
-
Hang Gliding
Declaration
Swift
case hangGliding = 26
-
Horseback Riding
Declaration
Swift
case horsebackRiding = 27
-
Hunting
Declaration
Swift
case hunting = 28
-
Fishing
Declaration
Swift
case fishing = 29
-
Inline Skating
Declaration
Swift
case inlineSkating = 30
-
/ Rock Climbing
Declaration
Swift
case rockClimbing = 31
-
Sailing
Declaration
Swift
case sailing = 32
-
Ice Skating
Declaration
Swift
case iceSkating = 33
-
Sky Diving
Declaration
Swift
case skyDiving = 34
-
Snowshoeing
Declaration
Swift
case snowshoeing = 35
-
Snowmobiling
Declaration
Swift
case snowmobiling = 36
-
Stand Up Paddel Boarding
Declaration
Swift
case standUpPaddelboarding = 37
-
Surfing
Declaration
Swift
case surfing = 38
-
Wakeboarding
Declaration
Swift
case wakeboarding = 39
-
Water Skiing
Declaration
Swift
case waterSkiing = 40
-
Kayaking
Declaration
Swift
case kayaking = 41
-
Rafting
Declaration
Swift
case rafting = 42
-
Wind Surfing
Declaration
Swift
case windSurfing = 43
-
Kite Surfing
Declaration
Swift
case kiteSurfing = 44
-
Tactical
Declaration
Swift
case tactical = 45
-
Jump Master
Declaration
Swift
case jumpMaster = 46
-
Boxing
Declaration
Swift
case boxing = 47
-
Floor Climbing
Declaration
Swift
case floorClimbing = 48
-
All
Declaration
Swift
case all = 254
-
Invalid
Declaration
Swift
case invalid = 255
-
String Value for the Enum
Declaration
Swift
public var description: String { get }
-
String value for Sport
Declaration
Swift
public var stringValue: String { get }


Measurement Naming Convention¶
In order for the Measurement class to work properly, the user should follow this naming convention:
YYYY_MM_DD_HHmm_IDENTIFIER_TYPE.dat
(not case sensitive)
where…
IDENTIFIER
denotes the type of measurement or the reason for the measurement. The following values are common and recognized by PIGOR:dcX#
: DC coil (for the magnetic field in x-direction) scan for the DC coil with the number #. A sine fit is automatically applied, whenTYPE
is not set.dcZ#
: DC coil scan in z-direction (compensation field) for DC coil number #. Fitted with a polynomial of order 5 by default.pos#
: position scan with stage number #. Fitted with a Gaussian by default.
TYPE
specifies and overrides the type of fitting/analysis that should be applied by PIGOR. Possible values:- fitting types
poly5
: polynom of order 5sine_lin
: sine plus additional added linear functionsine
: sinegauss
: Gauß fit
- special analysis types
pol
: specifies that this measurement is a degree of polarisation measurement. This will automatically calculate the degree of polarisation for any given number of points (number of data points must be multiple of four)
Types can be combined within a types group (gauss and pol for example, like “gauss_pol” or “pol_gauss”).


{% extends 'transfers/base.html' %} {% block h1_title %} {% regroup uploads by transfer_group as upload_groups %} {{page_title}} {{upload_groups|length}} accessions {% endblock %} {% block content %} {% regroup uploads by transfer_group as upload_groups %}


|
Other Info:
|
|
Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum is simply dummy text of the printing and typesetting industry.
|
|
Lorem Ipsum is simply dummy text of the printing and typesetting industry
|
dummy text of the printing typesetting
printing and typesetting industry
|
|
|
|


I have been doing woodworking for about 6 year and, like you, I am still learning new trick and techniques to make the finished products even better.
Above (from left to right) is a stool I made out of mahogany and birch and to the left are two pens I made out of mahogany and purple heart.
| Update Summary for Website | ||
|---|---|---|
| Project | Date | Notes |
| V1 | January 26 |
Pages added:
The CSS present:
|
| V2 | February 6 |
The CSS present:
|
| V3 | February 20 |
The CSS present:
|
| V4 | March 12 |
CSS Changes to the Website:
|


DB/Container name: {{dbname}}
DB Username: {{dbuser}}
Owner: {{owner}}
Contact: {{contact}}
Description: {{description}}
Access: {{access}}
Application: {{app_name}}
{# Size: {{size}}
#}
{# Memory Limit: {{memlimit}}
#}
{# Connections: {{connections}}
#}
Expected Life: {{life}}
Backup Frequency: {{backup_freq}}
Backup Window: {{backup_window}}
Point in time recovery: {{pitr}}
Maintenance Window: {{maintain}}
Support level: {{support}}
{# Phi: {{phi}}
#}