text:
from __future__ import print_function
from __future__ import division
__author__ = """Alex "O." Holcombe""" ## double-quotes will be silently removed, single quotes will be left, eg, O'Connor
import numpy as np
import itertools #to calculate all subsets
from copy import deepcopy
from math import atan, pi, cos, sin, sqrt, ceil
import time, sys, platform, os, StringIO, gc
from psychopy import visual, core
import random
#If you run this code stand-alone, it will do a demo of the basic stimulus it is designed to provide

#BEGIN helper functions from primes.py
def gcd(a,b):
   """Return greatest common divisor using Euclid's Algorithm."""
   while b:
        a, b = b, a % b
   return a

def lcm(a,b):
   """Return lowest common multiple."""
   return (a*b)/gcd(a,b)

def LCM(terms):
   "Return lcm of a list of numbers."
   return reduce(lambda a,b: lcm(a,b), terms)
#END helper functions from primes.py

def calcCondsPerNumTargets(numRings,numTargets):
    #numRings is number of rings, each of which can have up to one target
    #numTargets is list or array of numTarget conditions, e.g. 1,2,3 means the experiment includes 1, 2, and 3 targets
    #Each target can be placed randomly in any of the rings.
    #Want all possibilities to be covered equally often. That means each target number condition has to include all the combinations
    #     of places that number of targets can go.
    #So that some targetNum conditinos don't have more trials than others, have to scale up each targetNum condition to the worst case.
    #Actually it's worse than that. To make them fit evenly, have to use least common multiple
    #3 rings choose 2 for targets, 3 rings choose 1 for target, have to have as many conditions as the maximum.
    #To find maximum, determine length of each.
    ringNums = np.arange(numRings)
    numPossibilitiesEach = list()
    for k in numTargets:
        numPossibilitiesCouldPutKtargets = len( list(itertools.combinations(ringNums,k)) )
        #print(numPossibilitiesCouldPutKtargets)
        numPossibilitiesEach.append(  numPossibilitiesCouldPutKtargets  )
    m = max( numPossibilitiesEach )  #because the worst case (number of targets) requires this many, have to have this many for all. Actually,
    leastCommonMultiple = LCM( numPossibilitiesEach )  #to have equal number of trials per numtargets, would have to use this figure for each
    #print('biggest=',m, ' Least common multiple=', leastCommonMultiple)
    return leastCommonMultiple

def accelerateComputer(slowFast, process_priority, disable_gc):
	# process_priority =  'normal' 'high' or 'realtime'
    if slowFast:
        if process_priority == 'normal':
            pass
        elif process_priority == 'high':
            core.rush(True)
        elif process_priority == 'realtime': # Only makes a diff compared to 'high' on Windows.
            core.rush(True, realtime = True)
        else:
            print('Invalid process priority:',process_priority,"Process running at normal.")
            process_priority = 'normal'
        if disable_gc:
            gc.disable()
    if slowFast==0: #turn off the speed-up
        if disable_gc:
            gc.enable()
        core.rush(False)

def openMyStimWindow(monitorSpec,widthPix,heightPix,bgColor,allowGUI,units,fullscr,scrn,waitBlank): #make it a function because have to do it several times, want to be sure is identical each time
    myWin = visual.Window(monitor=monitorSpec,size=(widthPix,heightPix),allowGUI=allowGUI,units=units,color=bgColor,colorSpace='rgb',fullscr=fullscr,screen=scrn,waitBlanking=waitBlank) #Holcombe lab monitor
    if myWin is None:
        print('ERROR: Failed to open window in openMyStimWindow!')
        core.quit()
    return myWin

def constructRingsAsGratings(myWin,numRings,radii,ringRadialMaskEachRing,numObjects,patchAngle,colors,stimColorIdxsOrder,gratingTexPix,blobToCueEachRing,ppLog):
    #Originally to construct a grating formed of the colors in order of stimColorIdxsOrder
    antialiasGrating = True
    autoLogging = False
    texEachRing=list() #texture which will draw the ring of objects via openGL texture on grating
    cueTexEachRing=list() #making a separate grating for the cue, wherein everything background color except the location of the cue
    ringsRadial=list(); #after making the rings of object, put them in this list
    cueRings=list() #after making grating for each cue, put it in this cue
    stimColorIdxsOrder= stimColorIdxsOrder[::-1]  #reverse order of indices, because grating texture is rendered in reverse order than is blobs version
    radialMaskEachRing=[[0,0,0,1,1,] ,[0,0,0,0,0,0,1,1,],[0,0,0,0,0,0,0,0,0,0,1,1,]]
    numUniquePatches= len( max(stimColorIdxsOrder,key=len) )
    numCycles =(1.0*numObjects) / numUniquePatches
    angleSegment = 360./(numUniquePatches*numCycles)
    if gratingTexPix % numUniquePatches >0: #gratingTexPix contains numUniquePatches. numCycles will control how many total objects there are around circle
        ppLog.warn('Warning: could not exactly render a '+str(numUniquePatches)+'-segment pattern radially, will be off by '+str( (gratingTexPix%numUniquePatches)*1.0 /gratingTexPix ) )
    if numObjects % numUniquePatches >0:
        msg= 'Warning: numUniquePatches ('+str(numUniquePatches)+') not go evenly into numObjects'; ppLog.warn(msg)
    #create texture for red-green-blue-red-green-blue etc. radial grating
    for i in range(numRings):
        #myTex.append(np.zeros([gratingTexPix,gratingTexPix,3])+[1,-1,1])
        texEachRing.append( np.zeros([gratingTexPix,gratingTexPix,3])+bgColor[0] ) #start with all channels in all locs = bgColor
        cueTexEachRing.append( np.ones([gratingTexPix,gratingTexPix,3])*bgColor[0]  )
    if patchAngle > angleSegment:
        msg='Error: patchAngle requested ('+str(patchAngle)+') bigger than maximum possible ('+str(angleSegment)+') numUniquePatches='+str(numUniquePatches)+' numCycles='+str(numCycles);
        print(msg); ppLog.error(msg)

    oneCycleAngle = 360./numCycles
    segmentSizeTexture = angleSegment/oneCycleAngle *gratingTexPix #I call it segment because includes spaces in between, that I'll write over subsequently
    patchSizeTexture = patchAngle/oneCycleAngle *gratingTexPix
    patchSizeTexture = round(patchSizeTexture) #best is odd number, even space on either size
    patchFlankSize = (segmentSizeTexture-patchSizeTexture)/2.
    patchAngleActual = patchSizeTexture / gratingTexPix * oneCycleAngle
    if abs(patchAngleActual - patchAngle) > .01:
        msg = 'Desired patchAngle = '+str(patchAngle)+' but closest can get with '+str(gratingTexPix)+' gratingTexPix is '+str(patchAngleActual);
        ppLog.warn(msg)

    for colrI in range(numUniquePatches): #for that portion of texture, set color
        start = colrI*segmentSizeTexture
        end = start + segmentSizeTexture
        start = round(start) #don't round until after do addition, otherwise can fall short
        end = round(end)
        ringColr=list();
        for i in range(numRings):
            ringColr.append(colors[ stimColorIdxsOrder[i][colrI] ])
        for colorChannel in range(3):
            for i in range(numRings):
                texEachRing[i][:, start:end, colorChannel] = ringColr[i][colorChannel];
            for cycle in range(int(round(numCycles))):
              base = cycle*gratingTexPix/numCycles
              for i in range(numRings):
                cueTexEachRing[i][:, base+start/numCycles:base+end/numCycles, colorChannel] = ringColr[1][colorChannel]
        #draw bgColor area (emptySizeEitherSideOfPatch) by overwriting first and last entries of segment
        for i in range(numRings):
            texEachRing[i][:, start:start+patchFlankSize, :] = bgColor[0]; #one flank
            texEachRing[i][:, end-1-patchFlankSize:end, :] = bgColor[0]; #other flank

        for cycle in range(int(round(numCycles))):
              base = cycle*gratingTexPix/numCycles
              for i in range(numRings):
                 cueTexEachRing[i][:,base+start/numCycles:base+(start+patchFlankSize)/numCycles,:] =bgColor[0];
                 cueTexEachRing[i][:,base+(end-1-patchFlankSize)/numCycles:base+end/numCycles,:] =bgColor[0]

    #color the segment to be cued white. First, figure out cue segment len
    segmentLen = gratingTexPix/numCycles*1/numUniquePatches
    WhiteCueSizeAdj=0 # adust the white cue marker wingAdd 20110923
    if numObjects==3:WhiteCueSizeAdj=110
    elif numObjects==6:WhiteCueSizeAdj=25
    elif numObjects==12:WhiteCueSizeAdj=-15
    elif numObjects==2:WhiteCueSizeAdj=200

    for i in range(numRings): #color cue position white
            if blobToCueEachRing[i] >=0: #-999 means dont cue anything
                blobToCueCorrectForRingReversal = numObjects-1 - blobToCueEachRing[i] #grating seems to be laid out in opposite direction than blobs, this fixes postCueNumBlobsAway so positive is in direction of motion
                if blobToCueCorrectForRingReversal==0 and numObjects==12:   WhiteCueSizeAdj=0
                cueStartEntry = blobToCueCorrectForRingReversal*segmentLen+WhiteCueSizeAdj
                cueEndEntry = cueStartEntry + segmentLen-2*WhiteCueSizeAdj
                cueTexEachRing[i][:, cueStartEntry:cueEndEntry, :] = -1*bgColor[0]   #-1*bgColor is that what makes it white?
                blackGrains = round( .25*(cueEndEntry-cueStartEntry) )#number of "pixels" of texture at either end of cue sector to make black. Need to update this to reflect patchAngle
                cueTexEachRing[i][:, cueStartEntry:cueStartEntry+blackGrains, :] = bgColor[0];  #this one doesn't seem to do anything?
                cueTexEachRing[i][:, cueEndEntry-1-blackGrains:cueEndEntry, :] = bgColor[0];
    angRes = 100 #100 is default. I have not seen any effect. This is currently not printed to log file!

    for i in range(numRings):
         ringsRadial.append(visual.RadialStim(myWin, tex=texEachRing[i], color=[1,1,1],size=radii[i],#myTexInner is the actual colored pattern. radial grating used to make it an annulus
            mask=ringRadialMaskEachRing[i], # this is a 1-D mask dictating the behaviour from the centre of the stimulus to the surround.
            radialCycles=0, angularCycles=numObjects*1.0/numUniquePatches,
            angularRes=angRes, interpolate=antialiasGrating, autoLog=autoLogging))
         #the mask is radial and indicates that should show only .3-.4 as one moves radially, creating an annulus
    #end preparation of colored rings
    #draw cueing grating for tracking task. Have entire grating be empty except for one white sector
         cueRings.append(visual.RadialStim(myWin, tex=cueTexEachRing[i], color=[1,1,1],size=radii[i], #cueTexInner is white. Only one sector of it shown by mask
                        mask = radialMaskEachRing[i], radialCycles=0, angularCycles=1, #only one cycle because no pattern actually repeats- trying to highlight only one sector
                        angularRes=angRes, interpolate=antialiasGrating, autoLog=autoLogging) )#depth doesn't seem to work, just always makes it invisible?

    currentlyCuedBlobEachRing = blobToCueEachRing #this will mean that don't have to redraw
    return ringsRadial,cueRings,currentlyCuedBlobEachRing
    ######### End constructRingAsGrating ###########################################################
#########################################

def gratingAngleToEuclidean(theta):
    euclidean = -1.0 * theta #because grating angles are clockwise and euclidean is counter-clockwise
    euclidean += 90 #because gratings start with 0 at North and Euclidean 0 is East
    return euclidean

def constructThickThinWedgeRingsTargetAndCue(myWin,initialAngle,radius,radialMask,radialMaskTarget,cueRadialMask,visibleWedge,numObjects,patchAngleThick,patchAngleThin,bgColor,
                                            thickWedgeColor,thinWedgeColor,targetAngleOffset,targetRadialOffset,gratingTexPix,cueColor,objToCue,ppLog):
    #Construct a grating formed of the colors in order of stimColorIdxsOrder
    #Also construct a similar cueRing grating with same colors, but one blob potentially highlighted.
    #cueRing Has different spacing than ringRadial, not sure why, I think because calculations tend to be off as it's
    #always one cycle.
    #radialMask doesn't seem to eliminate very-central part, bizarre
    antialiasGrating = False #Don't set this to true because in present context, it's like imposing a radial Gaussian ramp on each object
    autoLogging = False
    numCycles = numObjects
    segmentAngle = 360./numCycles
    #create texture for red-green-blue-red-green-blue etc. radial grating
    #2-D texture which will draw the ring of objects via openGL texture on grating
    ringTex = np.zeros([gratingTexPix,gratingTexPix,3])+bgColor[0]  #start with all channels in all locs = bgColor
    cueTex = np.zeros([gratingTexPix,gratingTexPix,3])+bgColor[0]  #start with all channels in all locs = bgColor
    oneCycleAngle = 360./numCycles
    def patchSizeForTexture(segmentAngle, patchAngle, oneCycleAngle, gratingTexPix):
        segmentSizeTexture = segmentAngle/oneCycleAngle *gratingTexPix #I call it segment because includes spaces between objects, that I'll write over subsequently
        if patchAngle > segmentAngle:
            msg='Error: patchAngle requested ('+str(patchAngle)+') bigger than maximum possible ('+str(segmentAngle)+')  numCycles='+str(numCycles)
            print(msg); ppLog.error(msg)
        patchSizeTexture = patchAngle*1.0/oneCycleAngle *gratingTexPix
        patchSizeTexture = round(patchSizeTexture) #best is odd number, even space on either size
        patchFlankSize =int( (segmentSizeTexture-patchSizeTexture)/2. )#this area will be drawn in bgColor
        patchAngleActual = patchSizeTexture*1.0 / gratingTexPix * oneCycleAngle
        if abs(patchAngleActual - patchAngle) > .01:
            msg = 'Desired patchAngle = '+str(patchAngle)+' but closest can get with '+str(gratingTexPix)+' gratingTexPix is '+str(patchAngleActual);
            ppLog.warn(msg)
        return segmentSizeTexture, patchSizeTexture, patchFlankSize

    #thick wedges. Create texture for visual.radialStim
    segmentSizeTexture, patchSizeTexture, patchFlankSize = patchSizeForTexture(segmentAngle, patchAngleThick, oneCycleAngle, gratingTexPix)
    start = 0 #identify starting texture position for this segment
    end = int( round( start + segmentSizeTexture ) ) #don't round until after do addition, otherwise can fall short
    angRes = 200 #100 is default. I have not seen an artifact at present when set to 100, two things drawn don't overlap exactly

    #First draw the entire segment in patchColr, then erase sides (flankers) leaving only the patchAngle
    ringTex[:, start:end, :] = thickWedgeColor[:]
    #spaces in between objects are termed the flanks, should be bgColor,
    ringTex[:, start:start+patchFlankSize, :] = bgColor[:]  #one flank
    ringTex[:, end-1-patchFlankSize:end, :] = bgColor[:]  #other flank

    #thin wedges. Create texture for visual.radialStim
    segmentSizeTexture, thinWedgeSizeTexture, patchFlankSizeThinWedge = patchSizeForTexture(segmentAngle, patchAngleThin, oneCycleAngle, gratingTexPix)

    #Instead of drawing the red and undisplaced blue with the same call to radialStim,
    #We will draw the red with one call to radialStim, then the thinner blue sliver on top, using radialMask so it's only the sliver and leaves the
    #remainder of the red showing.
    #First draw the thick red contexts thickWedges
    ringRadialThickWedges= visual.RadialStim(myWin, tex=ringTex, color=[1,1,1],size=radius,#ringTex is the actual colored pattern. radial grating used to make it an annulus
            visibleWedge=visibleWedge,
            ori = initialAngle, #essentially the phase of the grating
            mask=radialMask, # this is a 1-D mask masking the centre, to create an annulus
            radialCycles=0, angularCycles=numObjects,
            angularRes=angRes, interpolate=antialiasGrating, autoLog=autoLogging)

    #thinWedge, the usually-blue target
    #First draw the entire segment in thinWedgeColor, then erase sides (flankers) leaving only the patchAngle (wedge angle)
    thinRingTex = np.zeros([gratingTexPix,gratingTexPix,3])+bgColor[0]  #start with all channels in all locs = bgColor
    thinRingTex[:, start:end, :] = thinWedgeColor[:]
    #spaces in between objects are termed the flanks, should be bgColor,
    thinRingTex[:, start:start+patchFlankSize, :] = bgColor[:]  #one flank
    thinRingTex[:, end-1-patchFlankSize:end, :] = bgColor[:]  #other flank

    ringRadialThinWedges= visual.RadialStim(myWin, tex=thinRingTex, color=[1,1,1],size=radius,#ringTex is the actual colored pattern. radial grating used to make it an annulus
            visibleWedge=visibleWedge,
            ori = initialAngle, #essentially the phase of the grating
            mask=radialMaskTarget, # this is a 1-D mask masking the centre, to create an annulus
            radialCycles=0, angularCycles=numObjects,
            angularRes=angRes, interpolate=antialiasGrating, autoLog=autoLogging)

    #Draw target (task is to judge offset of thin wedge relative to thick wedge.
    #So, overdraw a single segment of the grating by using visibleWedge
    #angularPhase =
    #I need to not show the part of the thick wedge that will be displaced, while showing enough of thick wedge to overdraw previous location of thin wedge
    targetCorrectedForRingReversal = objToCue #numObjects-1 - objToCue #grating seems to be laid out in opposite direction than blobs, this fixes postCueNumBlobsAway so positive is in direction of motion
    kludgeWiden= 5
    visibleAngleStart = targetCorrectedForRingReversal*segmentAngle + (segmentAngle-patchAngleThick)/2 - kludgeWiden
    visibleAngleEnd = (visibleAngleStart+kludgeWiden) + patchAngleThick + kludgeWiden
    print('targetCorrectedForRingReversal = ',targetCorrectedForRingReversal,'targetRing initialAngle=', initialAngle, ' visibleAngleStart=',visibleAngleStart,' visibleAngleEnd=',visibleAngleEnd)
    if targetAngleOffset >= 0:
        visibleAngleEnd -= targetAngleOffset #don't show the part of the thick wedge that would be displaced
    else: #shifted the other way, towards the start, so spillover on that side needs to be avoided by not drawing it
        visibleAngleStart -= targetAngleOffset

    #DRAW THE TARGET RING, like the above ringRadial except displaced
    #Below call is identical to ringRadial except ori
    #set visibleWedge so it only highlights a single thick wedge
    targetRadial= visual.RadialStim(myWin, tex=thinRingTex, color=[1,1,1],size=radius+targetRadialOffset,#ringTex is the actual colored pattern. radial grating used to make it an annulus
            visibleWedge=[visibleAngleStart,visibleAngleEnd],
            ori = initialAngle+targetAngleOffset, #Always zero in the new version where the task is to judge the radial offset of the blue thin wedge
            mask=radialMaskTarget, # this is a 1-D mask masking the centre, to create an annulus
            radialCycles=0, angularCycles=numObjects,
            angularRes=angRes, interpolate=antialiasGrating, autoLog=autoLogging)

    #MAKE A COPY of the thick red ring to draw over undisplaced blue
    ringRadialThickWedgesCopy= visual.RadialStim(myWin, tex=ringTex, color=[1,1,1],size=radius,#ringTex is the actual colored pattern. radial grating used to make it an annulus
            visibleWedge=  (visibleAngleStart,visibleAngleEnd),
            ori=initialAngle,
            mask=radialMask, # this is a 1-D mask masking the centre, to create an annulus
            radialCycles=0, angularCycles=numObjects,
            angularRes=angRes, interpolate=antialiasGrating, autoLog=autoLogging)

    #Draw lines (alternative target)
    lines=[]
    #calculate estimated eccentricity that grating target would be at, if were using grating targets
    #Find the center of the ones in radialMaskTarget, multiply by grating radius
    oneIndices = np.where(radialMaskTarget==1)[0]
    oneIndexMean = np.mean(oneIndices)
    proportnOfRadius =  oneIndexMean / len(radialMaskTarget)
    proportnOfRadius += 0.5 * 1/len(radialMaskTarget) #Because grating mask doesn't work with centering, rather it's the beginning or something so need to add to get to center of wedge
    eccentricity = proportnOfRadius* radius
    eccentricity = eccentricity / 1.97 #Don't know why need to divide by almost 2
    #print("oneIndexMean = ", oneIndexMean, "proportnOfRadius = ", proportnOfRadius, "eccentricity = ", eccentricity)
    #Calculate appropriate line width in deg
    wedgeThicknessFraction = len( np.where(radialMask)[0] )  *    1.0 / len(radialMask)
    wedgeThickness =  wedgeThicknessFraction*radius/2
    targeti = targetCorrectedForRingReversal % numObjects # (targetCorrectedForRingReversal-1)  % numObjects   #dont know why have to subtract 1. Then have to mod numObjects so negative number gets turned into positive
    targetFillColors = np.array([[.9,.9,.9],[-.8,-.8,-.8]]) #  [-.3,-.3,-.3]
    for i in xrange(0,numObjects):
       lineHeight =  wedgeThickness * 1.0# *1.0
       lineWidth = lineHeight / 10
       angleDeg = initialAngle
       angleDeg+= (visibleAngleStart+visibleAngleEnd)/2  #because when gratings are drawn, there's this additional offset for which bit of the grating is visible
       angleDeg += i/numObjects*360
       tangentialOrientation = i/numObjects*360
       if __name__ != "__main__": #not self-test
            halfAngle = 360/numObjects/2 #For some reason target is offset by half the distance between two objects, even though that doesn't happen in helpersAOH self-test
            tangentialOrientation += halfAngle

       x = cos(   gratingAngleToEuclidean(angleDeg)*pi/180      ) * eccentricity
       y = sin(    gratingAngleToEuclidean(angleDeg)*pi/180      ) * eccentricity
       lineColor = targetFillColors[0]
       if i == targeti:
            print("line targeti=", targeti, " angleDeg=",angleDeg, "Euclidean angle=",gratingAngleToEuclidean(angleDeg) )
            orientation = tangentialOrientation
            if targetRadialOffset<0: #it's always one of two values, a negative one and a positive one
                #orientation = tangentialOrientation + 90
                lineColor = targetFillColors[1] #opposite color
       else:
            #orientation = tangentialOrientation + random.randint(0,1)*90
            lineColor = targetFillColors[ random.randint(0,1) ]
       #if orientation==tangentialOrientation: #make bigger because harder to see
       #     lineHeight *= 1.4 #for tangential, make longer
       #else: lineHeight *=.8
       #print("Drawing line ",i," at x=",x, " y=", y, "targetCorrectedForRingReversal=", targetCorrectedForRingReversal )
       #thisLine = visual.Rect(myWin, width=lineWidth, height=lineHeight, pos=(x,y), ori=orientation, fillColor=lineColor, lineColor=None, autoLog=autoLogging)
       thisLine = visual.Circle(myWin, radius=lineWidth, pos=(x,y), fillColor=lineColor, lineColor=None, autoLog=autoLogging)
       lines.append(thisLine)
    #CREATING CUE TEXTURE
    #Both inner and outer cue arcs can be drawn in one go via a radial mask
    #use visibleWedge so it only highlights a single thick wedge
    #draw texture for cueRing
    start = 0 #identify starting texture position for this segment
    start = int( round( start+patchFlankSize ) )
    end = int( round(start + segmentSizeTexture - patchFlankSize) )#don't round until after do addition, otherwise can fall short
    cueTex[:, start:end, :] = cueColor[:]
    #Actually because I'm only showing a tiny sliver via visibleAngle, could color the whole thing
    cueTex[:, :, :] = cueColor[:]

    #draw cue
    visibleAngleStart = 0; visibleAngleEnd=360
    if objToCue>=0:
        objToCueCorrectdForRingReversal = objToCue #numObjects-1 - objToCue #grating seems to be laid out in opposite direction than blobs, this fixes postCueNumBlobsAway so positive is in direction of motion
        visibleAngleStart = objToCueCorrectdForRingReversal*segmentAngle + (segmentAngle-patchAngleThick)/2
        visibleAngleEnd = visibleAngleStart + patchAngleThick
        print('objToCueCorrectdForRingReversal = ',objToCueCorrectdForRingReversal,' visibleAngleStart=',visibleAngleStart,' visibleAngleEnd=',visibleAngleEnd)

    cueRing = visual.RadialStim(myWin, tex=cueTex, color=[1,1,1],size=radius, #cueTexInner is white. Only one sector of it shown by mask
                    visibleWedge=[visibleAngleStart,visibleAngleEnd],
                    ori = initialAngle,
                    mask = cueRadialMask, radialCycles=0, angularCycles=1, #only one cycle because no pattern actually repeats- trying to highlight only one sector
                    angularRes=angRes, interpolate=antialiasGrating, autoLog=autoLogging)

    return ringRadialThickWedges,ringRadialThickWedgesCopy,ringRadialThinWedges,targetRadial,cueRing,lines
    ######### End constructThickThinWedgeRingsTargetAndCue ###########################################################
 ###########################################################  ###########################################################

if __name__ == "__main__": #do self-tests
    from psychopy import *
    from psychopy import monitors, logging
    monitorwidth = 38.5 #28.5 #monitor width in centimeters
    viewdist = 57.; #cm
    mon = monitors.Monitor("testMonitor",width=monitorwidth, distance=viewdist) #fetch the most recent calib for this monitor
    bgColor = [0,0,0] # [-1,-1,-1]
    allowGUI = True; units='deg'; fullscr=0; scrn=0; waitBlank=False
    #mon.setSizePix( (widthPix,heightPix) )
    widthPix = 800; heightPix = 600
    myWin = openMyStimWindow(mon,widthPix,heightPix,bgColor,allowGUI,units,fullscr,scrn,waitBlank)
    widthPix = myWin.size[0]; heightPix = myWin.size[1]

    #Task will be to judge which thick wedge has the thin wedge offset within it
    numObjects = 8
    initialAngle =random.random()*360
    gratingTexPix= 1024
    objToCue=0
    radius = 25.
    visibleWedge = [0,360]
    patchAngleThickWedges = 360/numObjects/2
    thickWedgeColor = [1,-1,-1]
    thinWedgeColor=[0,0,1]
    cueColor=[0,1,1]
    radialMask =   np.array( [0,0,0,0,1,0,0,0,0] )  #This is for the larger wedge that the TargetSliver is embedded in
    radialMaskThinWedge =   np.array( [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] ) #This is the sliver that's offset relative to the larger wedge, that you have to judge the offset of
    wedgeRadiusFraction = np.where(radialMask)[0][0]*1.0 / len(radialMask)
    print('wedgeRadiusFraction = ',wedgeRadiusFraction)
    wedgeThicknessFraction = len( np.where(radialMask)[0] )*1.0 / len(radialMask)
    print('wedgeThickness = ',wedgeThicknessFraction*radius)
    wedgeCenterFraction = wedgeRadiusFraction + wedgeThicknessFraction/2.

    targetSliverRadiusFraction = np.where(radialMaskThinWedge)[0][0]*1.0 / len(radialMaskThinWedge)
    print('targetSliverRadiusFraction = ',targetSliverRadiusFraction)
    targetSliverThicknessFraction = len( np.where(radialMaskThinWedge)[0] )*1.0 / len(radialMaskThinWedge)
    targetSliverCenterFraction = targetSliverRadiusFraction + targetSliverThicknessFraction/2.
    print('targetSliverThickness = ',targetSliverThicknessFraction*radius, ' targetSliverCenterFraction=',targetSliverCenterFraction)

    #distance of cue arc
    desiredArcDistanceFractionRadius = .23
    cueInnerArcDesiredFraction = wedgeCenterFraction - desiredArcDistanceFractionRadius
    cueOuterArcDesiredFraction = wedgeCenterFraction + desiredArcDistanceFractionRadius
    if cueOuterArcDesiredFraction > 1:
        msg='Can"t start outer arc at fraction='+str(cueOuterArcDesiredFraction)
        logging.error(msg); print(msg)
    fractionResolution = .02     #Quantisation of possible positions of cue arc
    binsNeeded = 1.0 / fractionResolution
    cueRadialMask = np.zeros( binsNeeded )
    #For the cueRadialMask, want everything zero except just inside and outside of the wedges.
    innerArcCenterPos = round( binsNeeded*cueInnerArcDesiredFraction )
    outerArcCenterPos = round( binsNeeded*cueOuterArcDesiredFraction )
    cueRadialMask[ innerArcCenterPos ] = 1
    cueRadialMask[ outerArcCenterPos ] = 1
    print('cueInnerArcDesiredFraction = ',cueInnerArcDesiredFraction, ' actual = ', innerArcCenterPos*1.0/len(cueRadialMask) )
    print('cueOuterArcDesiredFraction = ',cueOuterArcDesiredFraction, ' actual = ', outerArcCenterPos*1.0/len(cueRadialMask) )
    targetAngleOffset = 0; targetRadialOffset = -1
    thickWedgesRing,thickWedgesRingCopy, thinWedgesRing, targetRing, cueRing, lines =  \
        constructThickThinWedgeRingsTargetAndCue(myWin,initialAngle,radius,radialMask,radialMaskThinWedge,cueRadialMask,visibleWedge,numObjects,
                            patchAngleThickWedges,patchAngleThickWedges,bgColor,thickWedgeColor,thinWedgeColor,targetAngleOffset,targetRadialOffset,
                            gratingTexPix,cueColor,objToCue,ppLog=logging)

    keepGoing = True
    while keepGoing:
        thickWedgesRing.draw()
        thinWedgesRing.draw()
        cueRing.draw()
        #Draw thin wedges at same time as thick wedges. But when time to draw target, draw over old position of target thin wedge and draw displaced version
        #Now program the cue arcs and the target-displaced ring
        myWin.flip()
        for key in event.getKeys():       #check if pressed abort-type key
              if key in ['escape','q']:
                  keepGoing = False
                  respcount = 1
              else: #key in [
                print('key =', key)

    keepGoing = True #draw target superposed
    while keepGoing:
        #The thickWedgesRing, typically red, are drawn as a radial grating that occupies all 360 deg circular, with a texture to mask out everything else to create a ring
        #The thinWedgesRing, typically blue, are centered in the red and one of these wedges will be later displaced to create a target.
        #The targetRing is the displaced blue wedge. Actually a full circular radial grating, but visibleWedge set to subtend only the part where the target is.
        #The thickWedgesRingCopy is to draw over the old, undisplaced blue wedge, only in the target area. It is thus a copy of the thickWedgesRing,
        # with visibleWedge set to show only the target part
        #The cueRing is two white arcs to bring attention to the target area.
        thickWedgesRing.draw() #Draw red thick wedges
        thinWedgesRing.draw() #Draw thin blue wedge centered in thick red wedges
        #When time to draw target, draw over old position of target thin wedge and draw displaced version
        thickWedgesRingCopy.draw()
        targetRing.draw() #this is the particular blue patch offset. And drawing the rest in red, so that the undisplaced doesn't show through.
        for line in lines:
            line.draw()
        myWin.flip()
        for key in event.getKeys():       #check if pressed abort-type key
              if key in ['escape','q']:
                  keepGoing = False
                  respcount = 1
              else: #key in [
                print('key =', key)

redpajama_set_name: RedPajamaGithub


text:
Artist: Loop
Label: Atp Recordings
Array 1 on LP
Vinyl LP pressing of this 2015 EP. Towards the end of 2013 saw the reformation of one of the most revered and respected late 80's UK alternative bands, Loop. The group, founded by Robert Hampson, hadn't played together since the early 90's but got together to curate a night at the legendary All Tomorrow's Parties at Camber Sands. US dates followed in 2014 and they then got back in the studio to start recording. The result is three brand new releases coming over the next year which see the band return to their hugely unique and era defining sound whilst sounding fresh and exciting. The first release is Array 1, four tracks of haunting, aggressive, beautiful noise. 'Precession', 'Aphelion', 'Coma' and 'Radial' are the first songs to be heard from their recording session done in Sub Station Studios in Rosyth in Scotland with the current line up of Robert Hampson (vocals/guitar), Hugo Morgan (bass), Wayne Maskell (drums) and Dan Boyd (guitar). With only an early version of 'Precession' having had any previous outing (at a show at the Garage in London at the end of 2014), this is the very first new music from the band since their third album, 1990's lost classic 'A Gilded Eternity.
1 Precession
2 Aphelion
3 Coma
4 Radial

redpajama_set_name: RedPajamaCommonCrawl


text:
Supply of software terms and conditions and software license. Please review these license terms carefully. by purchasing the software you agree to be bound by these terms.
This license agreement (License) is an agreement between you (Customer or you) and HOP SOFTWARE LIMITED, a company incorporated in Scotland with company number SC530487 whose registered office is at 138 Atholl Road, Pitlochry PH16 5AG (Supplier).
The Supplier is the entire legal and beneficial owner and licensor of certain software products listed in Schedule 1 and is willing, in consideration of the Licence Fee and certain other obligations as set out below, to license the Customer to use the Software. The Supplier licenses the Software of the basis of this License and does not sell the Software to the Customer. The Supplier shall retain ownership of the Software at all times.
1.1 The definitions and rules of interpretation in this clause apply in the Licence.
Acceptance Date: the date on which the Customer is deemed to have accepted the Software under clause 3.2.
App Market: the Clover online application market at https://www.clover.com/appmarket operated by MarketPlace Merchant Solutions Limited with registered number IE539224 and with registered address at Unit 9, Richview Office Park, Clonskeagh Road, Dublin 14, Ireland.
App Market Terms: the "Clover App Market Terms of Use" available at https://www.clover.com/app-market-terms which govern the access and use of the App Market by the Customer.
Fee: the licence fee payable by the Customer to the Supplier for the Software in accordance with the payment arrangements specified within clause 6.
Go Live Date: the date on which the Software becomes available for immediate use by the Customer.
Intellectual Property Rights: patents, utility models, rights to inventions, copyright and related rights, trademarks and service marks, trade names and domain names, rights in get-up, goodwill and the right to sue for passing off or unfair competition, rights in designs, rights in computer software, database rights, rights to preserve the confidentiality of information (including know-how and trade secrets) and any other intellectual property rights, including all applications for (and rights to apply for and be granted), renewals or extensions of, and rights to claim priority from, such rights and all similar or equivalent rights or forms of protection which subsist or will subsist, now or in the future, in any part of the world.
Maintenance Release: release of the Software that corrects faults, adds functionality or otherwise amends or upgrades the Software, but which does not constitute a New Version.
Mobile Application: the HOP software mobile application for Android and IOS which has been developed by the Supplier and incorporates elements of the Software.
New Version: any new version of the Software which from time to time is publicly marketed and offered for purchase by the Supplier in the course of its normal business, being a version which contains such significant differences from the previous versions as to be generally accepted in the marketplace as constituting a new product.
Site: the premises from which the Customer carries out its business
Software: the computer programs listed in Schedule 1 and any Maintenance Release which is acquired by the Customer during the subsistence of this licence.
1.2 Clause, Schedule and paragraph headings shall not affect the interpretation of this agreement.
1.3 Unless the context otherwise requires:
(a) words in the singular shall include the plural and in the plural shall include the singular;
(b) A reference to a statute or statutory provision is a reference to it as amended, extended or re-enacted from time to time;
(c) a reference to one gender shall include a reference to the other genders; and
(d) any words following the terms including, include, in particular, for example or any similar expression shall be construed as illustrative and shall not limit the sense of the words, description, definition, phrase or term preceding those terms.
1.4 In the case of conflict or ambiguity between any provision contained in the body of this licence and any provision contained in the schedules or appendices, the provision in the body of this licence shall take precedence.
1.5 A person includes a natural person, corporate or unincorporated body (whether or not having separate legal personality) and that person's personal representatives, successors and permitted assigns.
1.6 References to clauses and Schedules are to the clauses and Schedules of this agreement and references to paragraphs are to paragraphs of the relevant Schedule.
1.7 The Schedules and Annexes form part of this licence and shall have effect as if set out in full in the body of this licence. Any reference to this licence includes the Schedules and Annexes.
2. APP MARKET TERMS MAY ALSO APPLY
2.1 The Customer hereby acknowledges that their use of the Software and fees payable therefor may be controlled by the App Market Terms as well as the License.
2.2 Where there is inconsistency between the License and the App Market Terms the latter shall prevail only insofar as the extent to which inconsistency exists.
3. DELIVERY, ACCEPTANCE AND INSTALLATION
3.1 The Supplier shall make the Software available on the App Market and delivery shall take place at such time as the Software becomes available for installation following download.
3.2 The Customer shall be deemed to have accepted the Software on the date the Customer commences operational use of the Software or three days after installation of the Software on the Customer's computer equipment, whichever is the earlier.
4. LICENCE
4.1 In consideration of the Fee paid by the Customer to the Supplier in accordance with the clause 6, the Supplier grants to the Customer a non-exclusive licence commencing on and including the date of this licence and terminating on the date of termination of this licence, to use the Software at the Site only.
4.2 In relation to scope of use:
(a) for the purposes of clause 4.1, use of the Software shall be restricted to use of the Software for the purpose of processing the Customer's data for the normal business purposes of the Customer (which shall not include allowing the use of the Software by any person other than the Customer or an employee of the Customer or for the benefit of any person other than the Customer).
(b) the Customer may not use the Software other than as specified in clause 4.1 and clause 4.2(a) without the prior written consent of the Supplier, and the Customer acknowledges that additional fees may be payable on any change of use approved by the Supplier.
(c) the Customer shall record the number and location of all copies of the Software supplied to it or copies made by it and take steps to prevent unauthorised copying.
(d) except as expressly stated in this clause 4, the Customer has no right (and shall not permit any third party) to copy, adapt, reverse engineer, decompile, disassemble, modify, adapt or make error corrections to the Software in whole or in part except to the extent that any reduction of the Software to human readable form (whether by reverse engineering, decompilation or disassembly) is necessary for the purposes of integrating the operation of the Software with the operation of other software or systems used by the Customer, unless the Supplier is prepared to carry out such action at a reasonable commercial fee or has provided the information necessary to achieve such integration within a reasonable period, and the Customer shall request the Supplier to carry out such action or to provide such information (and shall meet the Supplier's reasonable costs in providing that information) before undertaking any such reduction.
4.3 The Customer may not use any information provided by the Supplier or obtained by the Customer through the use of the Software to create any software whose expression is substantially similar to that of the Software nor use such information in any manner which would be restricted by any copyright subsisting in it.
4.4 The Customer shall not:
(a) sub-license, assign or novate the benefit or burden of this licence in whole or in part;
(b) allow the Software to become the subject of any charge, lien or encumbrance; and
(c) deal in any other manner with any or all of its rights and obligations under this agreement,
without the prior written consent of the Supplier.
4.5 The Supplier may at any time sub-license, assign, novate, charge or deal in any other manner with any or all of its rights and obligations under this licence, provided it gives written notice to the Customer.
4.6 Each party confirms it is acting on its own behalf and not for the benefit of any other person.
4.7 The Supplier when assigning any or all of its rights under this agreement may disclose to a proposed assignee any information in its possession that relates to this agreement or its subject matter, the negotiations relating to it and the other party which is reasonably necessary to disclose for the purposes of the proposed assignation.
4.8 The Customer shall:
(a) keep a complete and accurate record of the Customer's copying and disclosure of the Software and its users, and produce such record to the Supplier on request from time to time;
(b) notify the Supplier as soon as it becomes aware of any unauthorized use of the Software by any person;
(c) pay, for broadening the scope of the licences granted under this licence to cover the unauthorized use, an amount equal to the fees which the Supplier would have levied (in accordance with its normal commercial terms then current) had it licensed any such unauthorised use on the date when such use commenced together with interest at the rate provided for in clause 6.8, from such date to the date of payment.
4.9 The Customer shall permit the Supplier to inspect and have access to any premises (and to the computer equipment located there) at or on which the Software is being kept or used, and have access to any records kept in connection with this licence, for the purposes of ensuring that the Customer is complying with the terms of this licence, provided that the Supplier provides reasonable advance notice to the Customer of such inspections, which shall take place at reasonable times.
5. MAINTENANCE RELEASES
The Supplier will provide the Customer with all Maintenance Releases generally made available to its customers. The Supplier warrants that no Maintenance Release will adversely affect the then existing facilities or functions of the Software. The Customer shall install all Maintenance Releases as soon as reasonably practicable after receipt.
6.1 In accordance with the App Market Terms the operator of the App Market shall act on behalf of the Supplier in collecting all Fees and taxes prior to disbursement to the Supplier. Any reference to payment made by the Customer to the Supplier within this clause 6 shall encompass this payment mechanism. Where the Customer has entered into a licensing arrangement with the Supplier for use of the Software, the Mobile Application will be provided free of charge.
6.2 The Customer shall pay to the Supplier the Fee monthly in advance the first such payment being due and payable on the Go Live Date and each subsequent monthly payment falling due and payable one calendar month after the Go Live Date (or the last day of the calendar month occurring after the Go Live Date if earlier).
6.3 the Customer may terminate this licence at any time after the third anniversary of the Acceptance Date on giving 6 months' prior written notice of its intention to do so. Any notice to terminate this licence prior to the second anniversary of the Acceptance Date will only be effective if on receipt of the said notice the Supplier has already received payment of such Fee, in full, as would have fallen due and payable by the Customer for the period to i) second anniversary of the Go Live Date; or ii) the date 6 months after service of the notice, whichever date occurs later.
6.4 At any time after the second anniversary of the Go Live Date the Supplier may intimate by written notice to the Customer, no less than one month in advance, any reasonable variation of the monthly licence fee (the Reviewed Fee) as the Supplier deems necessary or desirable at the sole discretion of the Supplier. In the event the Customer does not agree to pay the Reviewed Fee it may terminate this Licence with immediate effect provided it delivers a notice to that effect in writing to the Supplier within 7 days of receipt of the notification of the Reviewed Fee (time being of the essence in respect of delivery of any such notice to the Supplier).
6.5 All sums payable under this licence are exclusive of VAT or any relevant local sales taxes, for which the Customer shall be responsible.
6.6 Payment of all sums falling due under this Licence by the Customer to the Supplier shall be paid by any of the payment methods specified within the App Market Terms as they may change from time to time.
6.7 If the Customer fails to make any payment due to the Supplier under this agreement by the due date for payment, then, without limiting the Supplier's remedies under clause 11, the Supplier shall have the right to modify or reduce the functionality of or discontinue access to the Software until such time as payment of all due and outstanding Fees has been made.
6.8 Without limiting the Supplier's remedies under clause 11, the Customer shall pay interest on any overdue amount at the rate of 5% per annum above Bank of Scotland PLC's base rate from time to time. Such interest shall accrue on a daily basis until payment of the overdue amount, whether before or after judgement. The Customer shall pay the interest together with the overdue amount.
7.1 Each party shall, during the term of this licence and thereafter, keep confidential all, and shall not use for its own purposes (other than implementation of this licence) nor without the prior written consent of the other disclose to any third party (except its professional advisors or as may be required by any law or any legal or regulatory authority) any, information of a confidential nature (including trade secrets and information of commercial value) which may become known to such party from the other party and which relates to the other party, unless that information is public knowledge or already known to such party at the time of disclosure, or subsequently becomes public knowledge other than by breach of this licence, or subsequently comes lawfully into the possession of such party from a third party. Each party shall use its reasonable endeavours to prevent the unauthorised disclosure of any such information.
7.2 No party shall make, or permit any person to make, any public announcement concerning this agreement without the prior written consent of the other parties except as required by law, any governmental or regulatory authority (including, without limitation, any relevant securities exchange), any court or other authority of competent jurisdiction.
8. SUPPLIER'S WARRANTIES
8.1 If, during the term of this licence, the Customer notifies the Supplier in writing of any defect or fault in the Software in consequence of which it fails to conform in all material respects to the Specification, and such defect or fault does not result from the Customer, or anyone acting with the authority of the Customer, having amended the Software or used it outside the terms of this licence for a purpose or in a context other than the purpose or context for which it was designed or in combination with any other software not provided by the Supplier, or it has not been loaded onto Supplier-specified or suitably configured equipment, the Supplier shall, at the Supplier's option, do one of the following:
(a) repair the Software;
(b) replace the Software; or
(c) terminate this licence immediately by notice in writing to the Customer (and refund any part of the Fee actually received by the Supplier from the Customer in respect of the period after termination of this Licence),
provided the Customer provides all the information that may be necessary to assist the Supplier in resolving the defect or fault, including a documented example of any defect or fault, or sufficient information to enable the Supplier to re-create the defect or fault.
8.2 The Supplier does not warrant that the use of the Software will be uninterrupted or error-free.
8.3 The Customer accepts responsibility for the selection of the Software to achieve its intended results and acknowledges that the Software has not been developed to meet the individual requirements of the Customer.
8.4 All other conditions, warranties or other terms which might have effect between the parties or be implied or incorporated into this licence or any collateral contract, whether by statute, common law or otherwise, are hereby excluded, including the implied conditions, warranties or other terms as to satisfactory quality, fitness for purpose or the use of reasonable skill and care.
9. LIMITS OF LIABILITY
9.1 Except as expressly stated in clause 9.2:
(a) the Supplier shall not in any circumstances have any liability for any losses or damages which may be suffered by the Customer (or any person claiming under or through the Customer), whether the same are suffered directly or indirectly or are immediate or consequential, and whether the same arise in contract, tort (including negligence) or otherwise howsoever, which fall within any of the following categories:
(i) special damage even if the Supplier was aware of the circumstances in which such special damage could arise;
(ii) loss of profits;
(iii) loss of anticipated savings;
(iv) loss of business opportunity;
(v) loss of goodwill;
(vi) loss or corruption of data,
provided that this clause 9.1(a) shall not prevent claims for loss of or damage to the Customer's tangible property that fall within the terms of clause 9.1(b) or any other claims for direct financial loss that are not excluded by any of categories (i) to (vi) inclusive of this clause 9.1(a);
(b) the total liability of the Supplier, whether in contract, delict, (including negligence) or otherwise and whether in connection with this licence or any collateral contract, shall in no circumstances exceed a sum equal to the Fee actually received by the Supplier in the preceding 12 month period of the duration of this Licence, or in the event that a period of twelve months has not elapsed from the commencement of the Licence, the sum equivalent to the Fee payable for 12 months' in the same terms then currently payable under the Licence; and
(c) the Customer agrees that, in entering into this licence, either it did not rely on any representations (whether written or oral) of any kind or of any person other than those expressly set out in this licence or (if it did rely on any representations, whether written or oral, not expressly set out in this licence) that it shall have no remedy in respect of such representations and (in either case) the Supplier shall have no liability in any circumstances otherwise than in accordance with the express terms of this licence.
9.2 The exclusions in clause 8.4 and clause 9.1 shall apply to the fullest extent permissible at law, but the Supplier does not exclude liability for:
(a) death or personal injury caused by the negligence of the Supplier, its officers, employees, contractors or agents;
(b) fraud or fraudulent misrepresentation;
(c) breach of the obligations implied by section 12 of the Sale of Goods Act 1979 or section 2 of the Supply of Goods and Services Act 1982; or
(d) any other liability which may not be excluded by law.
9.3 All dates supplied by the Supplier for the delivery or installation of the Software shall be treated as approximate only. The Supplier shall not in any circumstances be liable for any loss or damage arising from any delay in delivery or installation of the Software beyond such approximate dates.
9.4 All references to "the Supplier" in this clause 9 shall, for the purposes of this clause only, be treated as including all employees, subcontractors and suppliers of the Supplier, all of whom shall have the benefit of the exclusions and limitations of liability set out in this clause.
10.1 The Customer acknowledges that all Intellectual Property Rights in the Software and any Maintenance Releases belong and shall belong to the Supplier, and the Customer shall have no rights in or to the Software other than the right to use it in accordance with the terms of this licence.
10.2 The Supplier undertakes at its own expense to defend the Customer or, at its option, settle any claim or action brought against the Customer alleging that the possession or use of the Software (or any part thereof) in accordance with the terms of this licence infringes the UK Intellectual Property Rights of a third party (Claim) and shall be responsible for any reasonable losses, damages, costs (including legal fees) and expenses incurred by or awarded against the Customer as a result of or in connection with any such Claim. For the avoidance of doubt, clause 10.2 shall not apply where the Claim in question is attributable to possession or use of the Software (or any part thereof) by the Customer other than in accordance with the
terms of this licence, use of the Software in combination with any hardware or software not supplied or specified by the Supplier if the infringement would have been avoided by the use of the Software not so combined, or use of a non-current release of the Software.
10.3 If any third party makes a Claim, or notifies an intention to make a Claim against the Customer, the Supplier's obligations under clause 10.2 are conditional on the Customer:
(a) as soon as reasonably practicable, giving written notice of the Claim to the Supplier, specifying the nature of the Claim in reasonable detail;
(b) not making any admission of liability, agreement or compromise in relation to the Claim without the prior written consent of the Supplier (such consent not to be unreasonably conditioned, withheld or delayed);
(c) giving the Supplier and its professional advisers access at reasonable times (on reasonable prior notice) to its premises and its officers, directors, employees, agents, representatives or advisers, and to any relevant assets, accounts, documents and records within the power or control of the Customer, so as to enable the Supplier and its professional advisers to examine them and to take copies (at the Supplier's expense) for the purpose of assessing the Claim; and
(d) taking such action as the Supplier may reasonably request to avoid,
10.4 If any Claim is made, or in the Supplier's reasonable opinion is likely to be made, against the Customer, the Supplier may at its sole option and expense:
(a) procure for the Customer the right to continue to use the Software (or any part thereof) in accordance with the terms of this licence;
(b) modify the Software so that it ceases to be infringing;
(c) replace the Software with non-infringing software; or
(d) terminate this licence immediately by notice in writing to the Customer and refund any of the Fee paid by the Customer as at the date of termination (less a reasonable sum in respect of the Customer's use of the Software to the date of termination) on return of the Software and all copies thereof, provided that if the Supplier modifies or replaces the Software, the Customer shall have the same rights in respect thereof as it would have had under this Licence had the references to the date of this licence been references to the date on which such modification or replacement was made.
10.5 This clause 10 constitutes the Customer's exclusive remedy and the Supplier's only liability in respect of Claims and, for the avoidance of doubt, is subject to the limitations and provisions set out in clause 9.1.
11. DURATION AND TERMINATION
11.1 Without affecting any other right or remedy available to it, either party may terminate this agreement with immediate effect by giving written notice to the other party if:
(a) the other party fails to pay any amount due under this agreement on the due date for payment and remains in default not less than 10 days after being notified in writing to make such payment;
(b) the other party commits a material breach of any other term of this agreement which breach is irremediable or (if such breach is remediable) fails to remedy that breach within a period of 10 days after being notified in writing to do so;
(c) the other party suspends, or threatens to suspend, payment of its debts or is unable to pay its debts as they fall due or admits inability to pay its debts or is deemed unable to pay its debts within the meaning of section 123 of the Insolvency Act 1986 ;
(d) the other party commences negotiations with all or any class of its creditors with a view to rescheduling any of its debts, or makes a proposal for or enters into any compromise or arrangement with its creditors other than for the sole purpose of a scheme for a solvent amalgamation of that other party with one or more other companies or the solvent reconstruction of that other party;
(e) a petition is filed, a notice is given, a resolution is passed, or an order is made, for or in connection with the winding up of that other party other than for the sole purpose of a scheme for a solvent amalgamation of that other party with one or more other companies or the solvent reconstruction of that other party;
(f) an application is made to court, or an order is made, for the appointment of an administrator, or if a notice of intention to appoint an administrator is given or if an administrator is appointed, over the other party;
(g) the holder of a qualifying floating charge over the assets of that other party has become entitled to appoint or has appointed an administrative receiver;
(h) a person becomes entitled to appoint a receiver over the assets of the other party or a receiver is appointed over the assets of the other party;
(i) a creditor or encumbrancer of the other party attaches or takes possession of, or a distress, execution, sequestration or other such process is levied or enforced on or sued against, the whole or any part of the other party's assets and such attachment or process is not discharged within [14] days;
(j) any event occurs, or proceeding is taken, with respect to the other party in any jurisdiction to which it is subject that has an effect equivalent or similar to any of the events mentioned in clause 11.1(a) to clause 11.1(i)
(inclusive);
11.2 Any provision of this agreement that expressly or by implication is intended to come into or continue in force on or after termination or expiry of this agreement shall remain in full force and effect.
11.3 Termination or expiry of this agreement shall not affect any rights, remedies, obligations or liabilities of the parties that have accrued up to the date of termination or expiry, including the right to claim damages in respect of any breach of the agreement which existed at or before the date of termination or expiry.
11.4 On termination for any reason:
(a) all rights granted to the Customer under this licence shall cease;
(b) the Customer shall cease all activities authorised by this licence;
(c) the Customer shall immediately pay to the Supplier any sums due to the Supplier under this licence; and
(d) the Customer shall immediately destroy or return to the Supplier (at the Supplier's option) all copies of the Software then in its possession, custody or control and, in the case of destruction, certify to the Supplier that it has done so.
12. WAIVER
No failure or delay by a party to exercise any right or remedy provided under this agreement or by law shall constitute a waiver of that or any other right or remedy, nor shall it prevent or restrict the further exercise of that or any other right or remedy. No single or partial exercise of such right or remedy shall prevent or restrict the further exercise of that or any other right or remedy.
13. REMEDIES
Except as expressly provided in this agreement, the rights and remedies provided under this agreement are in addition to, and not exclusive of, any rights or remedies provided by law.
14.1 Subject to clause 2, this licence, the schedules and the documents annexed as appendices to this licence or otherwise referred to herein contain the whole agreement between the parties relating to the subject matter hereof and supersede all prior agreements, arrangements and understandings between the parties relating to that subject matter.
14.2 Each party acknowledges that, in entering into this licence it does not rely on any statement, representation, assurance or warranty (whether it was made negligently or innocently) of any person (whether a party to this licence or not).
14.3 Nothing in this clause shall limit or exclude any liability for fraud.
15.1 The Supplier may change these terms in order to reflect changes in law or best practice or to account for additional features which we may be introduced from time to time.
15.2 The Supplier shall give notice of any change in accordance with clause 19.
16. SEVERANCE
16.1 If any provision or part-provision of this agreement is or becomes invalid, illegal or unenforceable, it shall be deemed modified to the minimum extent necessary to make it valid, legal and enforceable. If such modification is not possible, the relevant provision or part-provision shall be deemed deleted. Any modification to or deletion of a provision or part-provision under this clause shall not affect the validity and enforceability of the rest of this agreement.
16.2 If any provision or part-provision of this agreement is invalid, illegal or unenforceable, the parties shall negotiate in good faith to amend such provision so that, as amended, it is legal, valid and enforceable, and, to the greatest extent possible, achieves the intended commercial result of the original provision.
17. NO PARTNERSHIP OR AGENCY
17.1 Nothing in this agreement is intended to, or shall be deemed to, establish any partnership or joint venture between any of the parties, constitute any party the agent of another party, or authorise any party to make or enter into any commitments for or on behalf of any other party.
17.2 Each party confirms it is acting on its own behalf and not for the benefit of any other person.
Neither party shall be in breach of this agreement nor liable for delay in performing, or failure to perform, any of its obligations under this agreement if such delay or failure result from events, circumstances or causes beyond its reasonable control. In such circumstances the affected party shall be entitled to a reasonable extension of the time for performing such obligations.
19.1 Any notice given to a party under or in connection with this contract shall be in writing and shall be:
(a) delivered by hand or by pre-paid first-class post or other next working day delivery service at its registered office (if a company) or its principal place of business (in any other case); or
(b) sent by fax to its main fax number.
19.2 Any notice shall be deemed to have been received:
(a) if delivered by hand, on signature of a delivery receipt; or
(b) if sent by pre-paid first-class post or other next working day delivery service, at 10.00 am on the second Business Day after posting.
19.3 This clause does not apply to the service of any proceedings or other documents in any legal action or, where applicable, any arbitration or other method of dispute resolution. For the purposes of this clause, "writing" shall not include e-mail.
20.1 This agreement and any dispute or claim arising out of or in connection with it or its subject matter or formation (including non-contractual disputes or claims) shall be governed by and construed in accordance with the law of Scotland.
20.2 The parties irrevocably agree that the courts of Scotland shall have exclusive jurisdiction to settle any dispute or claim that arises out of or in connection with this agreement or its subject matter or formation (including non-contractual disputes or claims).
Schedule 1 Software
• HOP Software Property Management System
• HOP Software Channel Management System
• HOP Software Booking Engine
• HOP Software EPOS Integration
• HOP Software Mobile Application – IOS
• HOP Software Mobile Application – Android
• HOP Software Bill To Room – Clover
Whether you are a B&B, guest house, an independent hotel, or a group or chain anywhere in the world, if you sell rooms, Hop has the solution to achieve your goals.
HopPMS
HopPay
HopApp
HopDigital
HopGift
hello@hopsoftware.com
Scotland: Summit House,
4-5 Mitchell Street, Edinburgh EH6 7BD
England: 9 Venture Point,
Chester CH2 4NE
South Africa: Durbanville,
Western Cape 7552
© HopSoftware Ltd 2022.


Minneapolis-based OneOme has raised $530k of a $600k equity funding round, according to this SEC disclosure.
Formed in 2013, OneOme works with physicians who place orders for patient test kits that the physician administers or are sent to directly the patient and back to the lab for DNA and bioinformatics analysis. This generates a personalized pharmacogenomic report in under 2 weeks at a cost of $249. Soon, this process will be integrated directly into the EMR experience.


text:
Q: Indoor Positioning and iBeacons So I had this idea for an app that requires  the position of a user's iPhone inside of a indoor area, like a house. I was going to use GPS and CoreLocation, but I realized that GPS services are bad/don't work indoors (for the accuracy I need, which is about +/- 3 meters). I heard of iBeacons and did some research on them to see if I could place those around "the house" and get the devices position in relation to the iBeacon. But, I read that they don't have good positioning since after ~10 meters the positioning isn't accurate. I am still sort of new to app development and was wondering if there was a way to accomplish device positioning indoors? Are their iBeacons with accurate range for positioning?
If this is the wrong place to post this, please redirect me to the right place :)

A: In my experience there isn't really anything native that's reliable within short distances like that.
The accuracy of GPS can vary pretty significantly depending on the specific connection and GPS fences can be error prone.
iBeacons seem promising, but due to the realities of bluetooth it can be strongly affected by anything coming in between the two devices including bodies, which is a problem when a device is often in people's pocket.
The other problem with iBeacons is something in the API seems either faulty, or unreliable. I'm unsure if this is a software or hardware issue, but regardless there are issues with the device keeping track of which beacons are and are not connected, with the notifications of entering/leaving a range being unreliable for consistent usage.
TLDR, IMO if you're looking for something more reliable than GPS, you're probably currently out luck :(

A: You explained that your project requires the position of a user's iPhone inside of a indoor area. I have helped deploy beacons for museums and cabaret bars in Japan. The cabarets send out advertisements to clients in the vicinity and further detailed advertisements when clients enter the premises. The set up for a good indoor location system using beacons is pretty straight forward and interesting. Beacons are a great solution for detecting when people move into some vaguely defined area, or when reaction time is of little importance. But there are other alternatives as discussed below.
Though it depends on the intended use and immediate surroundings as well, generally one can detect the presence of beacons as far away as 50-70 meters or as little as 10 inches.
It should also be noted that the basic signal strength can be set at different levels so the meaning of immediate, near, far (and out of range) can be very different for the same iBeacon at different settings.
For example at low power you could detect a threshold 30cm at +/- 5cm accuracy after 10 seconds, and the signal could not be detected at 10m. At full power you could probably detect a 10m treshold +/- 50cm after about 10 seconds. This signal could be detected at 50-70 but with huge fluctuations.
David's answer is actually referring to Mass Effect which increases the overall accuracy / triangulation of BLE.
New methods and technologies
The Real-time Locating System (RTLS) market
AoA
Accuracy of iBeacons is based on RSSI (Received Signal Strength Indication). RSSI is very sensitive to interference i.e. environment and even body interference. However, these factors don't affect the direction of the radio signal, so with the Angle-of-Arrival method it is possible to achieve continuous accuracy even down to a few centimeters, in real-time with BLE devices.
AoA Uses advanced antennas and locators to measure the direction (Angle-of-Arrival) of a radio signal transmitted by a tag. The result is sent to a positioning engine, which uses advanced algorithms to compute the tag's position and creates outputs in various formats. Many companies already use these systems.

A: the CoreLocation Beacons detection APIs in iOS don't really give you something equivalent to GPS.  GPS APIs will tell you "The phone is at these coordinates."  Beacon APIs will tell you "The phone is near this beacon."
The simplest way to tell you where you are within a house using beacons is to put a bunch of beacons around the house in different rooms, and perhaps at multiple locations within rooms.  But because beacon signals can travel 40 meters or more, you'll often see multiple beacons at the same time.  So you end up with APIs that tell you "The phone is near this list of beacons." You can then take the list of beacons that you are near, find which is closest based on the rough distance estimates the APIs provide, and you can assume that you are at the position specified by the closest beacon.
Doing all of this requires you to assign unique identifiers to each beacon, and have some kind of lookup table or database (either embedded in your app or exposed as a web service) that maps each beacon identifier to a meaningful location.  For example:
Beacon ID     Floor    Coordinates (meters from house NW corner)
65000         1        16, 23
65001         1        9, 45
65002         2        11, 14

Building all this is not trivial.  Beacons provide a basic building block to setting it up, but it isn't quit as easy as getting a pair of coordinates from GPS.

redpajama_set_name: RedPajamaStackExchange


Bauhead is a modern, clean and simple sans serif font. Free version is a Bauhead 40. It contains an uppercase and lowercase alphabet with numbers, symbols and multilanguage support. Bauhead font perfect for modern logo designs, headers and small amounts of text, posters and prints, vintage and craft designs.
Don't forget to check full Bauhead typeface by Mcraft including three weights.


text:
JESSICA ESCOBEDO
| Co-Visioning Urban Futures | Speculative Fiction | Systems Strategy | Rapid Prototyping | AR/VR/XR | UI/UX | AI | Strategic Foresight
Work About CV
With a population of 10 million and at least 107 cities, LA County has a big responsibility in providing residents with the latest information about new policies about ADUs. While individual cities in LA County develop and pass their own ADU Ordinances in the next couple of years, most cities are still operating under state law. Representatives from the LA County Homeless Initiative and the i-team in City of Los Angeles thought it would be a great idea to spread this information through a joint website that would act as a clearinghouse and direct people to the respective ADU Ordinance website per city.
While the content was very similar to that of the LA ADU Accelerator Program, this website was meant to:
Be simple (act as mainly a clearinghouse) and not have too may pages
Not look like the LA ADU Accelerator Program in style, color pallette, and branding
Provide county-wide stories and content
Provide accessible resources (as provided by LA County)
Using some content provided by county staff and some provided by me, I created this mockup and held several meetings with LA County to confirm branding style, palette, and content type.
Initial Designs
With a "go" from county and my fellowship ending within a couple of weeks, my goal was to finish the Drupal template with ITA. After an initial design meeting with the same developer team and learning that development would be faster using some coded components from the LA ADU Accelerator Program website, I negotiated different design options.
I changed the 'experimental' graphic elements such as the blob-shaped buttons and backgrounds, as well as off-grid layout. Feel free to check out the cleaned up verison of the prototype below:
View Adobe XD Clickable Prototype
Website is set to go-live in January 2020!
laadu.org
Website + Homeowner Application + Internal Scoring Process
Live Website: Los Angeles Accessory Dwellng Unit Accelerator Program
Team: i-team, Mayor Eric Garcetti's Office of Budget and Innovation
The Los Angeles Accessory Dwelling Unit Accelerator Program (LAADUAP) incentivizes ADU homeowners with a $10K grant to lease their Accessory Dwelling Unit to a housing insecure Angeleno. I joined a Program Manager, Design Researcher, and Research Intern within the i-team at the Mayor's Office of Budget & Innovation to co-develop content, prototypes, and manage production of the website towards completion along with the city's Information Technology Agency (ITA).
Content Design
High Fidelity Click Through Prototypes
Design Implementation on Drupal
2.5 Months
Google Suite (Docs, Sheets)
Drupal 7 Editor
Venice ADU by Duvivier Architects, featured on LAADAUP's website
Why We Built this Website
To provide accessible and accurate resources for homeowners looking for information about building an ADU in Los Angeles
To provide prospective applicants information about our incentive program and application process
Initial design inspirations for the content architecture came from similar programs in the ADU space:
Second Unit Resouces Center San Mateo County
Plus1House
LA Mas' Backyard Home Project
What is the Process to getting an ADU in Los Angeles?
This was the key question our website sought to demistify for the public.
As this was year two of the Mayor's Challenge project, I looked through the archive of documentation from past workshops that the previous designers and researchers had done with different city departments to map out the ADU process. Using Whimsical, a web-based diagramming tool, I digitized and compiled several documents: photos of post-it notes, the beginnings of a high-level digital diagram, and transcripts and notes from other stakeholder interviews.
ADU Process, version 1
In this process, I diagrammed the main phases and length of time a homeowner would go through from empty lot to new construction of ADU :
1) Checking to see if their property was in an eligible zone
2) Finding an architect to design the ADU
3) Getting all required permits and paying fees
4) Construction
5) Getting their Certificate of Occupancy from the city inspectors
After I created this flow, I cross-checked with several of our champions in the city departments and, to my surprise, learned that there was a lot had changed over the year, and would continue to change with the new ADU Ordinance. Moreover, this was a general flow, but the time it would take a homeowner really depends on the type of ADU project zone, and power line site conditions.
After getting feedback from different departments, I cleaned up the flow, and created new hierarchies for the major steps (in purple). These would become the main steps in the ADU Process content we would put online.
As a team, we wanted content to be:
Informative: including only the most pertinent information that minimizes confusion and points to additional and up-to-date points of contact
Accessible: from web accessibility standards to making sure the ADU Ordinance was written in layman's terms
Official: at the end of the day, all our copy would ultimately go through an extensive review process checking for tone, punctuation, and nonpartisanship by the city's Communications department
Visually appealing: but not to be confused with competitors' brand or style
See an Early Adobe XD Clickable Prototype
In addition to creating accordions of information, I wanted to create printable resources that Angelenos could print out. Since the process of getting a CofO is so long and there are many considerations when moving towards the next steps (i.e. do I have the financing to build my project?), I wanted homeowners to feel that they could track where they were in the process. While an online case management system seemed like an intuitive solution, 1) it wasn't feasible (development and timeline-wise) and 2) it would be too hard to integrate with other systems/databases. A low-tech solution that was equally as powerful was a printable checklist homeowners could keep throughout the duration of their process.
Example of printable PDF resource I co-designed: Building an ADU Checklist
Continuous Iteration
As our content was running and undergoing several rounds of internal and departmental reviews, testing, and edits, I held status meetings and frequent check-ins with a team of developers and managers from the city's Information Technology Agency; meticulously making sure the Drupal template they were preparing for us adhered to the design style guide we had provided.
Example of additional style guide I made and shared with developers
Homeowner Application Process
We went through several technological approaches to the homeowner application which changed as we had more meetings to determine feasibility. The following flow was prototyped first in Google Docs by a program manager and then designed in Whimsical. The application was broken into screener/eligibility questions, and then some sections for each department to score.
Homeowner Scoring Process
The program manager and I workshopped the overall flow with a strategist from Delivery Associates and I created a quick digital rendering for quick handoff for approval.
Me leading a group brainstorm on creating scoring rubric criteria
Other Visual Concepts
On slow days, I got to play with ideas for a t-shirt. 
Early Concepts for an interactive page to learn about ADU typologies
As a continuation of my research, I've iterated the design of my mobile AR app PLANNAR to adhere to new spaces and stakeholders. The following two are recent engagements I've had with the Chinatown Sustainability Dialogue Group and the Museum of Neon Art in Glendale, CA.
Context 1: Short Visioning Workshop with CCED
Chinatown Sustainability Dialogue group was working on reaching out to different community groups in Chinatown to get their input and sponsorship of a People's Plan they had put together. Not wanting to worry about ownership of large analog papers, they asked me if I could design them a mapping AR app.
For this new context, the purpose was not to ask the community for what they wanted from scratch, but to have a pre-populated library of assets that reflected the new policies written in the People's Plan and see if there was consensus among the community.
Audience: CCED is comprised primarily of high school - early college students who were tenant activists and familiar with Chinatown's issues.
Short time slot: Since these meetings ran on a tight schedule, I was given 10 minutes on the agenda to engage
Pre-defined assets: CSDG had developed a written document with desires from the community expressed in a number of other meetings.
I facilitated this short activity and asked members to for the first five minutes, talk amongst their group and pin down at least 5 items in certain parts of the Chinatown map, and ultimately photograph their creations. I made sure to design an activity where everyone was engaged--while one person pinned and photographed, the rest looked and pointed on the map where to place it. During this activity, I walked to each group and demonstrated how to place the pins, while also playing a looping video tutorial of how to use the app on the powerpoint slide.
Part 1: Mapping Community Desires (5 minutes)
Part 2: Feedback (5 minutes)
For the second part of the activity, I asked them to put 'ipads down' and write on post-it notes elements they thought were missing and place the post-it notes in the allotted "Additional" area adjacent to the map. I asked them to hold on to the post-it's during the remainder of our presentation in case they thought of something else. Later on in the presentation, we asked them to report back on what they pinned and wrote down.
Pins I created for this workshop
Demo I displayed on the screen as participants familiarized themselves with the task
This exercise was surprisingly successful in terms of setting the tone for the conversation about asking for community sposorship of a community plan. The participants found the activity to be engaging and fun, and felt that it gave them a quick way to express their desires. One of the participants had tried PLANNAR app's first iteration and mentioned to me afterwards that this version "made more sense" and seemed more "actionable."
I was not able to continue the workshops because of scheduling conflicts, but if I were to continue this, I would create and upload 2D pins based on the post-it notes and other feedback given from the participants.
Context 2: Pop-up Exhibit @MONA
I was invited to participate in Glendale Tech Week's "Floating Signifiers" exhibit and introduce my work with PLANNAR as a pop-up at the Museum of Neon Art in Glendale, CA.
This context was similar to the workshop I led at CCED, only that this time, there was more loose facilitation and self-initiated participation.
I designed the table to have three main calls to action:
Pick up the iPad to place AR objects on the map
Pick up the pens and post-it notes and place them in two sections (less of and more of)
Since I wanted to attract visitors to participate in the visioning exercise and discussion, I designed a poster explaining what the purpose of the pop-up was and used bright colorful palettes. I curated some assets to include smart city infrastructure (I had seen some article tlak about how 5G is killing birds as a contentious subject) and cubes to symbolically represent "affordable housing."
As the output of the AR maps did not have utilitarian use, I envisioned the out of the maps to be more of spatial collages and less informative/diagrammatic maps.
Audience: Everyday visitors to the Museum of Neon Art, participants of Glendale Tech Week of all ages and ethnicities.
Time slot: I was given two hours to exhibit this work.
Assets: In my initial conversations with the curators of the exhibit, I was told of existing tensions with specific developments (i.e. the cultural history and strong Armenian influence, burgeoning 'Silicon Mountains' branding
People were generally very excited about their ability to participate in the discussion, but had expectations that this information would be spread on social media or would reach the Mayor of Glendale in some way
People of all ages were really interested in seeing the 3D representations of their maps
Young people understood the concept of the app better than adults, and were more willing to generate ideas
The quick AR engagement triggered lengthly conversation about what they wish existed more and less in their community
Interesting to see transplants refrain from participating in the exercise altogether
One persistent limitation of this method is that there is not a quick way to create 3D assets that represent all of people's ideas - so more thought into the assets as a commnunity vocabulary would have to be redesigned. For the time being, I'm using post-it notes as an additional way to participate in the discussion. With more participation, it would be interesting to see patterns emerge and see how the conversation can reach different scales on social media.
There is potential for PLANNAR to exist as a new form of community engagement in Glendale's Urban Design studio! I'm excited to see how this project will evolve with access to insights from planners, continuous engagement, and better pool of participants (residents from the community).
PLANNAR: Co-Visioning with AR
Plannar is a mobile AR approach to cultivating a generative urbanism, specifically mobilizing long-term residents of Chinatown, Los Angeles to participate in the visioning of their neighborhood through the placement and "hearting" of literal and symbolic virtual objects around the neighborhood.
Conceptual Design, Research, UI/UX, Visual Design, Coded Prototyping, 3D Assets, Motion Design, Video Editing, Community Outreach
Unity 3D, Rhino 3D, After Effects, Photoshop, Illustrator, Sketch
This project arises from my discontent with community engagement strategies typically used in master planning, where conventional visioning methods entail brief workshops with only a few residents and use their participation as a proxy for consensus. In contrast, PLANNAR facilitates the generation of many site-and time-specific visions for the future, asserting bottom-up model of urban planning. Rather than ask residents to show up at a workshop, PLANNAR leverages what residents are already doing--walking around and using social media. In so doing, I propose that virtual space is new territory for meaningful public participation.
PLAY WALKS
The platform's playful and resonant AR object language expresses cultural values and preferences through the use of emoji's, symbolic objects, or 'literal' virtual objects. Residents collectively create and evaluate and a shared set of neighborhood visions through weekly "Play Walks."
During a week of generative urban play, residents can:
View objects from multiple perspectives (not just literal vantage points, but others' perspectives)
Live with the objects over time and notice their simulated changes in context (i.e. a tree that grows or shifts with season)
Learn the cultural significance of objects requested by different groups in the community
Form new social connections, whether creating relationships with strangers over a shared idea, concern, or simply being silly and imagining these futures with others in them
Be informed of the visioning discussion by reviewing weekly recaps, going back in time to see top highlights like most placed objects, most "liked" visions, resident feedback or requests for objects
AFFORDANCES OF AR PLATFORMS
Geo-Fenced Hearting Privileging Long-Term Residents
There's a difference in the set of actions that residents, visitors and commuters can perform on the platform. While anyone can view visioning activity on a map and in the different locations in the neighborhood, only residents are allowed to "heart" or "dislike" visions, giving them power to have final say in what objects are featured in the next round of "Play Walks." This feature prevents passive participation or astroturfing and enables ideologies and preferences of long-term residents to be integrated in the system before those of newer residents', thereby slowing down the ways in which technology colonizes the urban environment.
With greater adherence of AR as a common language among residents coupled with greater technological progress in the AR cloud and spatial mapping, Plannar proposes that these objects-as-preferred-visions be used as data points to inform urban development policy recommendations, creating counter blueprints to today's mixed use development trends and foreground the local imagination and ways of knowing.
NEW WORKFLOWS FOR THE FUTURE OF MAKING/PLANNING
ARTCENTER GRAD SHOW
@Pasadena Convention Center
^ Magical moment
Team: Radha Mistry (story strategist), Yime del Santiago (illustrator)
External Media:
The Autodesk University 2018 Opening Keynote with Andrew Anagnost, featuring the Los Angeles Winter 2030 scenario.
Redshift Article "Smart Reuse of Olympic Infrastructure Could Bring Home the Gold for Host Cities"
Radha Mistry's speculative fiction based on the four scenarios:
"Winter 2030: A Metropolis in Transit"
"Spring 2030: Robot Trainers and Small Town Mayors"
"Summer 2030: Micro-factories as First Responders"
"Autumn 2030: Rapid Recovery"
The Future of Work Worldbuilding Project was completed during a 3-month internship at Autodesk's Office of the CTO with the Corporate Strategy team during summer 2018. The purpose was to employ strategic foresight and develop four finely textured and researched speculative scenarios about the implications of automation on Autodesk's tools and customers, using fiction to prototype the future. What emerged were scenarios that included a season, terrain, artifact, and set of characters that used technology to adapt their career paths to new circumstances. Each were based on many in-person stakeholder interviews, reports, and current events. Set roughly in 2030, the scenarios are not meant to be a perfect prediction of the future, but rather serve as provocation for further tailoring Autodesk's corporate strategy to a preferred future that has been stress-tested with stakeholders in the industry.


A king cat lived in a beautiful and magnificent town. That king cat was pretty good looking. The king cat was stuck in a palace there a day. Your duty is to save the king cat from there. It will be helpful to find the hidden clues where the king cat is saved from there. Find all the clues and get that king cat out of there and congratulate you to win the game. The tricks of the trick are a little harder to find, but somehow it may be a matter of interest. This game is highly desirable. Find colors and numbers and items easily by finding the puzzles in it. Good luck and have a fun !


text:
Q: Given an analytic function on the unit disk, are the coefficients of its series expansion bounded? Let $D$ denote the unit disk in $\mathbb{C}$. Suppose I have an analytic function $f:D\to D$. Then I can write down its series expansion at, say, $z_0\in D$: $$f(z)=\sum_{n=0}^\infty a_n(z-z_0)^n\,.$$
Now, we know that $|f(z)|\le 1$, since $f(z)\in D$ for all $z\in D$. Does this imply that the coefficients $a_n$ are bounded? My instinct is to say yes, but I can't find a particularly convincing reason.
Thanks!

A: The $\limsup $ formula for the radius of convergence implies that any power series with bounded coefficients has radius of convergence $R\ge 1$. So, a series with $R<1$ must have unbounded coefficients. The easiest way to make the radius of convergence small is to stick a singularity nearby.
Given $z_0\ne 0$, we pick a point $a$ just outside the closed unit disk, so that $|z_0-a|<1$. For example, $a=(1+|z_0|/2)z_0/|z_0|$ works. The function $f(z)=c/(z-a)$ is our example when $c$ is small enough, such as $c=|a|-1$. If you believe the arguments given above, you don't even have to look at the coefficients.


iPhone repair services have been developed to help you repair your iPhone when it breaks or malfunctions. Not having to pay the cost of a brand new unit is a life saver for some and allows you to keep your existing unit in pristine condition. If you compare the price of repairing your existing unit against the cost of buying a new one, you'll find that you can save nearly 100 dollars even if the damage to the unit is substantial.
iPhones are very expensive pieces of equipment but even the best electronic technologies can't stand up to continued abuse. If something should go wrong with your iPhone, you need to understand that you have options available. The many repair shops available on the Internet today can help you to get your unit back to 100% functionality. Repairing your iPhone will save you a great deal of money and help you get your iPhone back to its original condition. Many repair centers even offer a warranty with their work. The repair technicians are usually always friendly, helpful, and available to repair your iPhone no matter when it breaks. You can count on repair shops that have been in business for a long time to know how to fix your item right the first time and give you the advice and information you need to make the best decision.
Don't take chances with your hard earned dollars. You will end up saving hundreds by keeping the original equipment that works and replacing or repairing what doesn't. Don't throw your iPhone away just because it has been damaged or is malfunctioning. Send it in, they'll fix it right!


text:
When is it appropriate to suspend an Employee?
When is it appropriate to…
On occasion, it may be necessary for an employer to suspend an employee (with full pay) while carrying out a workplace investigation.
Suspension could be appropriate where, for example: the employee has been accused of; harassment, bullying, or, where the employer has grounds to believe that the employee might deliberately cause damage, or, a health and safety risk to the business (or its employees), should they be allowed to remain at the workplace. However, suspension should only be undertaken after careful consideration, and the suspension should be kept under review to keep the amount of time of suspension to a minimum. Employers should make clear that the suspension is a neutral act and is neither a disciplinary sanction nor an assumption of guilt. Suspensions should be kept confidential at all time and should only be entered into taking into account the guidelines within the ACAS code of practice – Click here to see more detail.
If you have any further questions on the subject matter then please contact Karen Scott on 07762 629 448 or get in touch by clicking here.
Disclaimer: While every effort is made to ensure that the contents of these articles are up-to-date and accurate at the time of publication to the website, no warranty is given to that effect and Specialist HR Solutions Ltd does not assume responsibility for their accuracy and correctness. The articles are provided free of charge and for information purposes only and should not be seen as a substitute for dedicated legal advice.
Share with LinkedInShare with FacebookShare with TwitterShare with Google+Share with WhatsApp
PreviousPrevious post:How do I know the status of my worker who is engaged on a casual or zero hours contractNextNext post:Can I send a work email to my home email address without breaching GDPR laws?
How should I deal with a claim of sexual harassment at work?
Carrying out investigations in the workplace
How do I check the legal working status of migrant workers?
When is it lawful for an employer to deduct wages from an employee?
What is Statutory Sick Pay (SSP)?
What happens to notice pay when an employee resigns while on maternity leave?
Do I need to issue Employment Contracts for Zero hours workers?
How should I calculate holiday and bank holiday entitlement for part timers?
Code of Conduct(2)
Complaints(1)
Contracts(8)
Employment(21)
GDPR(2)
Holiday Pay(5)
Illness(2)
Investigations(3)
Maternity(1)
Migrant Workers(1)
Pay(17)
Pensions(1)
PILONs(1)


Complete range of manual pallet trucks, in standard version for handling Europallets, or in special version. Characterised by a robust frame and hydraulic pump, specific wheels and bearings to facilitate sliding are the ideal aid for simple and fast movements in narrow spaces. Details ROBUSTNESS AND RELIABILITY: Simple but robust structures characterised by quality components and a high degree of resistance, everything to ensure maximum effectiveness; the highly resistant structure and levers have a positive effect on the machine "lifetime" ensuring maximum efficiency over years, even when it is used regularly and intensively. QUALITY-PRICE: Thanks to the components resulting from research and from the experience of several years, it is possible to ensure a product of guaranteed quality at a very reasonable price. CUSTOMISATION: Possibility of maximum customisation, in terms of the fork length and external width, as well as of the wheel material (rubber, vulkolan, nylon) according to the work paving specifications so as to ensure the best smoothness. It is also possible to customise the type of roller at the end of the fork; available in single version or with double roller yoke. STANDARD EQUIPMENT Structure fully made of steel pieces Pump body fully made of steel Steel lever System to adjust the fork level in case of impacts and wear Automatic limit switch 1150mm-long forks Single or double roller Manual lifting pump Three-position lever Manual traction OPTIONAL EQUIPMENT It is possible to fit out the TPM in order to turn it into the ideal solution for each situation with particular customised structures such as for holding reels or with special stainless steel or galvanised parts for moving goods in special environments.