A summary of some new news related to CUNY's and CSI's response to the COVID-19 pandemic. See https://csi-covid19.github.io for the archive.
To add/suggest news, please email John Verzani
7/28 PSC injuction opposition The university's response in opposition to the PSC.
It includes hints as to how the remaining CARES funds will be distributed
CUNY has received about $251,000,000 of CARES Act funding. (Sapienza Decl., ¶ 17) About $118,000,000 of that funding, was already spent on emergency aid to students, in accordance with the CARES Act regulations. Id.; CARES Act §18004(c). The remaining $132,000,000 may be used for a variety of purposes, with the proviso that CUNY must “to the extent practicable, continue to pay its employees and contractors.” Id.; CARES Act § 18006. The DOE is expected to conduct post-audit reviews, and if it deems something an ineligible expenditure, CUNY will then have a disallowance and have to return funds to the federal government. (Id.)
Although CUNY has not finalized its plans for those funds in detail, it anticipates, broadly, using them for more direct and indirect aid to students: direct financial aid and counseling to students affected by the economic impact of the COVID-19 pandemic, training and professional development to help faculty and staff adapt to on-line instruction, and laptops for students with limited computer access to instruction. (Sapienza Decl., ¶ 19) All of these initiatives will help CUNY students, who, based on the surveys cited above, are struggling with loss of income, food and housing insecurity, and mental stress as a result. (Id.) These priorities are consistent with guidance institutions have received from DOE on the preferred ways of spending CARES Act. Funding.
It raises the threat of retrenchment in the context of HEO positions
Under the current dire economic conditions, however, it is impracticable to continue operations as normal and maintain all faculty and professional staff positions. (Sapienza Decl., ¶ 9) Because about 80 of CUNY’s costs relate to personnel, any serious budget cuts will necessarily involve personnel cuts. (Id.) In the face of these budget cuts, CUNY has so far preserved the employment of its full-time faculty and full -time professional staff, who are also represented by plaintiff. (Id., ¶ 10) Many of CUNY’s full-time faculty have tenure or certificates of continuous employment (for lecturers) and are therefore not subject to annual reappointments, unlike adjuncts. (Id., ¶ 9) Further, CUNY’s full-time staff represented by the PSC, who hold titles in the Higher Education Series (“HEO”), may also eventually earn semi-permanency under Article 13.3(b) of the collective bargaining agreement. (Id.)
CUNY has not instituted layoffs of full-time faculty and HEOs, although under CUNY’s Board of Trustees retrenchment policy, such layoffs are permitted according to specified procedures. (Sapienza Decl., ¶ 10) CUNY also has largely frozen new hiring. (Id.) In seeking to retain its employees to the extent practicable in the face of severe budget cuts, CUNY is continuing to date to pay in full all of its full-time faculty and HEOs represented by the PSC, as well as administrators and full-time white and blue collar employees represented by other labor organizations.
RESOLVED, That effective immediately, the University will implement a temporary suspension of standardized admissions testing requirements (e.g., SAT/ACT) for undergraduate admissions and will communicate to prospective students that it shall not consider standardized admissions tests in evaluating their applications; and be it further
RESOLVED, That this action will apply for the Spring 2021, Fall 2021, and Spring 2022 admission cycles only and the Chancellor shall take such actions as are reasonable and necessary to give effect to the foregoing while maintaining the University’s commitment to inclusive excellence.
7/28 Communicating risks (Thanks Suzy Shepardson)
Wearing face masks and practicing social distancing are not what many students had in mind when they pictured their college experience. Yet for students returning to campus this fall, these behaviors must be normalized if institutions stand a chance of slowing the spread of COVID-19.


|
|
10044577_10041_201819.pdf
|
UKPRN does not contain 8 numbers
|
|
|
10043873_10041_201819.pdf
|
Academic year is not a valid format
|
|
|
10056867_10041_201819.pdf
|
Document type code is not a valid format
|
|
|
10006473_10041_201819.pdf
|
Academic year is not a valid format
|
|
|
10006622_10041_201819.pdf
|
UKPRN is not recognised in the system
|
|
|
10044577_10041_201819.pdf
|
Document type code is not a valid format
|
|
|
10043873_10041_201819.pdf
|
UKPRN is not recognised in the system
|
|
|
10056867_10041_201819.pdf
|
UKPRN is not recognised in the system
|
|
|
10006943_10041_201819.pdf
|
UKPRN is not recognised in the system
|
|
|
10006622_10041_201819.pdf
|
Academic year is not a valid format
|
|
|
10044577_10041_201819.pdf
|
UKPRN does not contain 8 numbers
|
|
|
10043873_10041_201819.pdf
|
Academic year is not a valid format
|


Java & Scala
It’s simple to build your client using the APIs. If you’re application is built on jvm you can also use the built-in Izanami client.
This client offer nice strategies for better performances.
You need to add repository
- Graddle
-
repositories { jcenter() maven { url 'https://raw.githubusercontent.com/mathieuancelin/json-lib-javaslang/master/repository/releases/' } }
- Sbt
-
resolvers ++= Seq( "jsonlib-repo" at "https://raw.githubusercontent.com/mathieuancelin/json-lib-javaslang/master/repository/releases", Resolver.jcenterRepo )
Add the following dependency to your project
- sbt
libraryDependencies += "fr.maif" %% "izanami-client" % "1.11.0"
- Maven
<dependency> <groupId>fr.maif</groupId> <artifactId>izanami-client_2.13</artifactId> <version>1.11.0</version> </dependency>
- Gradle
dependencies { compile group: 'fr.maif', name: 'izanami-client_2.13', version: '1.11.0' }
The client can be used in java or scala. There is two distinct dsl. Be sure to import the correct one :
- Java
-
import izanami.*; import izanami.javadsl.*;
- Scala
-
import izanami._ import izanami.scaladsl._
Izanami client is built with
- Scala: As programming language
- Akka: to handle global state, scheduler …
- Akka http: for http request, sse …
The scaladsl rely on :
- play json: for json handling
The javadsl rely on :
- vavr: For functional structures like future, either, option …
- play json java: For json handling
Setup the Izanami client
The first thing to do is to create a client. The client own the shared http client between config client, feature client and the experiment client.
You need to create a single client for all your application.
- Java
-
izanamiClient = IzanamiClient.client( system, ClientConfig.create("http://localhost:8089") .withClientId("xxxx") .withClientIdHeaderName("Another-Client-Id-Header") .withClientSecret("xxxx") .withClientSecretHeaderName("Another-Client-Secret-Header") .sseBackend() .withDispatcher("izanami-example.blocking-io-dispatcher") .withPageSize(50) .withZoneId(ZoneId.of("Europe/Paris")) );
- Scala
-
implicit val system = ActorSystem( "izanami-client", ConfigFactory.parseString(""" izanami-example.blocking-io-dispatcher { type = Dispatcher executor = "thread-pool-executor" thread-pool-executor { fixed-pool-size = 32 } throughput = 1 } """) ) val client = IzanamiClient( ClientConfig( host = "http://localhost:9000", clientId = Some("xxxx"), clientIdHeaderName = "Another-Client-Id-Header", clientSecret = Some("xxxx"), clientSecretHeaderName = "Another-Client-Id-Header", backend = SseBackend, pageSize = 50, zoneId = ZoneId.of("Europe/Paris"), dispatcher = "izanami-example.blocking-io-dispatcher" ) )
| Field | Description |
|---|---|
clientId |
The client id to access izanami APIs see Manage APIs keys |
clientSecretIdName |
A custom header for the client id |
clientSecret |
The client secret to access izanami APIs see Manage APIs keys |
clientSecretHeaderName |
A custom header for the client secret |
sseBackend |
Enable sse to get events from the server |
dispatcher |
Reference a dispatcher to manage thread pool |
pageSize |
Change the size of the pages when fetching from the server |
zoneId |
Zone Id to handle date |
Configs client
The config client is used to access the shared config in Izanami. To understand how configs work, just visit this
Setup the client
- Java
-
ConfigClient configClient = izanamiClient.configClient( Strategies.fetchStrategy(), Configs.configs( Config.config("my:config", Json.obj( Syntax.$("value", "Fallback value") )) ) );
- Scala
-
val configClient = client.configClient( strategy = FetchStrategy(), fallback = Configs( "test2" -> Json.obj("value" -> 2) ) )
When you set up a client you have to choose a strategy :
| Strategy | Description |
|---|---|
| Fetch | Call izanami for each request |
| Fetch with cache | Keep response in cache |
| Smart cache with polling | Keep data in memory and poll izanami to refresh the cache asynchronously. |
| Smart cache with sse | Keep data in memory and refresh the cache with the events from the izanami server. |
The fetch strategy
The fetch strategy will call izanami for each request.
- Java
-
ConfigClient configFetchStrategy = izanamiClient.configClient( Strategies.fetchStrategy(), Configs.configs( Config.config("my:config", Json.obj( Syntax.$("value", "Fallback value") )) ) );
- Scala
-
val configClient = client.configClient( strategy = FetchStrategy(), fallback = Configs( "test2" -> Json.obj("value" -> 2) ) )
The fetch with cache strategy
The fetch with cache will do dumb cache by http call. You have to provide a the max elements in cache and a TTL.
- Java
-
Integer maxElementInCache = 100; FiniteDuration ttl = FiniteDuration.create(20, TimeUnit.MINUTES); ConfigClient fetchWithCacheStrategy = izanamiClient.configClient( Strategies.fetchWithCacheStrategy(maxElementInCache, ttl), Configs.configs( Config.config("my:config", Json.obj( Syntax.$("value", "Fallback value") )) ) );
- Scala
-
val strategy = IzanamiClient( ClientConfig(ctx.host) ).configClient( strategy = FetchWithCacheStrategy(maxElement = 2, duration = 1.second), fallback = Configs( "test2" -> Json.obj("value" -> 2) ) )
The smart cache strategy
When you choose the smart cache, you have to provide patterns :
- Java
-
ConfigClient configClient = izanamiClient.configClient( Strategies.smartCacheWithPollingStrategy( FiniteDuration.create(20, TimeUnit.SECONDS), "my:configs:*", "other:pattern" ), Configs.configs( Config.config("my:config", Json.obj( Syntax.$("value", "Fallback value") )) ) );
- Scala
-
val configClient = client.configClient( strategy = CacheWithPollingStrategy( patterns = Seq("*"), pollingInterval = 3.second ), fallback = fallback )
The client will cache all the configs matching this patterns.
- With a poll strategy, the client will request the server to get change so you have to set a delay.
- With a SSE strategy, the client will listen events from the server to refresh the cache.
There is no TTL using this strategy so you have to choose the right patterns to be sure that all datas fit in memory.
Handling errors
An error handling strategy could be provided. You can choose between :
RecoverWithFallback
: If the call crash, the fallback is usedCrash
: The call will finish on error if an error occured while evaluating the feature, config or experiment.
- Java
-
ConfigClient configErrorStrategy = izanamiClient.configClient( Strategies.fetchStrategy(ErrorStrategies.crash()) );
- Scala
-
val configClient = izanamiClient.configClient( strategy = FetchStrategy(Crash), fallback = Configs( "test2" -> Json.obj("value" -> 2) ) )
Client usage
Get configs for a pattern
- Java
-
Future<Configs> futureConfigs = configClient.configs("my:*"); futureConfigs.onSuccess((Configs configs) -> { JsValue config = configs.config("my:config"); System.out.println(config.field("value").asString()); });
- Scala
-
val configs: Future[Configs] = configClient.configs("*") configs.onComplete { case Success(c) => println(c) case Failure(e) => e.printStackTrace() }
Get one config
- Java
-
Future<JsValue> futureConfig = configClient.config("my:config"); futureConfig.onSuccess((JsValue config) -> { System.out.println(config.field("value").asString()); });
- Scala
-
val futureConfig: Future[JsValue] = izanamiClient.config("test") futureConfig.onComplete { case Success(c) => println(c) case Failure(e) => e.printStackTrace() }
Create / Update / Delete configs
Create config using json
- Java
-
JsValue createdJson = configClient.createConfig("my:config", Json.obj(Syntax.$("value", "A configuration"))).get();
- Scala
-
val configCreated = client.createConfig("test", Json.obj("value" -> 1))
Create config using a config object
- Java
-
Config created = configClient.createConfig(Config.config("my:config", Json.obj(Syntax.$("value", "A configuration")))).get();
- Scala
-
val jsoncreated = client.createConfig(Config("test", Json.obj("value" -> 1)))
Update config using json
- Java
-
JsValue updatedJson = configClient.updateConfig("my:previous:config", "my:config", Json.obj(Syntax.$("value", "A configuration"))).get();
- Scala
-
val configUpdated = client.updateConfig("test", "newtest", Json.obj("value" -> 1))
Update config using a config object
- Java
-
Config updated = configClient.updateConfig("my:previous:config", Config.config("my:config", Json.obj(Syntax.$("value", "A configuration")))).get();
- Scala
-
val configUpdated = client.updateConfig("test", Config("newtest", Json.obj("value" -> 1)))
Delete a config
- Java
-
Done deleted = configClient.deleteConfig("my:config").get();
- Scala
-
val configDeleted = client.deleteConfig("test")
Autocreate configs
You can autocreate configs that are define as fallback. To enable this you need set the autocreate
parameter when the client is created.
- Java
-
Boolean autocreate = true; ConfigClient configClient = izanamiClient.configClient( Strategies.fetchStrategy(), Configs.configs( Config.config("my:config", Json.obj( Syntax.$("value", "Fallback value") )) ), autocreate );
- Scala
-
val izanamiClient = client.configClient( strategy = Strategies.fetchStrategy(), fallback = Configs( "test" -> Json.obj("value" -> 2) ), autocreate = true )
Features client
To understand how features work, just visit this
Setup the client
- Java
-
FeatureClient featureClient = izanamiClient.featureClient( Strategies.fetchStrategy(), Features.features( Features.feature("my:feature", false) ) );
- Scala
-
val featureClient = client.featureClient( strategy = FetchStrategy(), fallback = Features( DefaultFeature("test2", true) ) )
When you set up a client you have to choose a strategy :
| Strategy | Description |
|---|---|
| Fetch | Call izanami for each request |
| Fetch with cache | Keep response in cache |
| Smart cache with polling | Keep data in memory and poll izanami to refresh the cache asynchronously. The features that need a context are not cached because it can needs a huge amount of memory |
| Smart cache with sse | Keep data in memory and refresh the cache with the events from the izanami server. The features that need a context are not cached because it can needs a huge amount of memory |
The fetch strategy
The fetch strategy will call izanami for each request
- Java
-
FeatureClient featureClient = izanamiClient.featureClient( Strategies.fetchStrategy(), Features.features( Features.feature("my:feature", false) ) );
- Scala
-
val strategy = IzanamiClient( ClientConfig(host, pageSize = 2) ).featureClient( Strategies.fetchStrategy() )
The fetch with cache strategy
The fetch with cache will do dumb cache by http call. You have to provide a the max elements in cache and a TTL.
- Java
-
Integer maxElementInCache = 100; FiniteDuration ttl = FiniteDuration.create(20, TimeUnit.MINUTES); FeatureClient featureClientWithCache = izanamiClient.featureClient( Strategies.fetchWithCacheStrategy(maxElementInCache, ttl), Features.features( Features.feature("my:feature", false) ) );
- Scala
-
val strategy = IzanamiClient( ClientConfig(ctx.host) ).featureClient( strategy = FetchWithCacheStrategy(maxElement = 2, duration = 1.second), fallback = Features( DefaultFeature("test2", true) ) )
The smart cache strategy
When you choose the smart cache, you have to provide patterns to select the keys that will be in cache:
- Java
-
FeatureClient featureClient = izanamiClient.featureClient( Strategies.smartCacheWithSseStrategy( scala.Option.apply(FiniteDuration.create(1, TimeUnit.MINUTES)), "my:features:*", "other:pattern" ), Features.features( Features.feature("my:feature", false) ) );
- Scala
-
val featureClient = client.featureClient( strategy = CacheWithPollingStrategy( patterns = Seq("*"), pollingInterval = 3.second ), fallback = Features(fallback: _*) )
The client will cache all the configs matching this patterns.
- With a poll strategy, the client will request the server to get change so you have to set a delay.
- With a SSE strategy, the client will listen events from the server to refresh the cache.
The feature that need a context to be evaluated are not cached. The cache is used only for simple features or feature with release date.
There is no TTL using this strategy so you have to choose the right patterns to be sure that all datas fit in memory.
Handling errors
An error handling strategy could be provided. You can choose between :
RecoverWithFallback
: If the call crash, the fallback is usedCrash
: The call will finish on error if an error occured while evaluating the feature, config or experiment.
- Java
-
FeatureClient featureClientWithErrorHandling = izanamiClient.featureClient( Strategies.fetchStrategy(ErrorStrategies.crash()) );
- Scala
-
val featureClient = izanamiClient.featureClient( FetchStrategy(Crash) )
Client usage
List features
- Java
-
Future<Features> futureFeatures = featureClient.features("my:feature:*"); futureFeatures.onSuccess(features -> { boolean active = features.isActive("my:feature:test"); if (active) { System.out.println("Feature my:feature:test is active"); } else { System.out.println("Feature my:feature:test is active"); } JsObject tree = features.tree(); System.out.println("Tree is " + Json.prettyPrint(tree)); });
- Scala
-
val futureFeatures: Future[Features] = featureClient.features("*") futureFeatures.onComplete { case Success(features) => val active: Boolean = features.isActive("test") if (active) println(s"Feature test is active") else println(s"Feature test is not active") val tree: JsObject = features.tree() println(s"All features: ${Json.prettyPrint(tree)}") case Failure(e) => e.printStackTrace() }
Check feature
- Java
-
Future<Boolean> futureCheck = featureClient.checkFeature("my:feature");
- Scala
-
val futureCheck: Future[Boolean] = featureClient.checkFeature("test")
If the feature needs a context to be evaluated:
- Java
-
Future<Boolean> futureCheckContext = featureClient.checkFeature("my:feature", Json.obj( Syntax.$("context", true) ));
- Scala
-
val context = Json.obj("context" -> true) val checkWithContext: Future[Boolean] = featureClient.checkFeature("test", context)
Conditional code on feature
This execute a code and return a value if a feature is active:
- Java
-
Future<String> conditonal = featureClient.featureOrElse("my:feature", () -> "Feature is active", () -> "Feature is not active" );
- Scala
-
val conditonal: Future[String] = featureClient.featureOrElse("test") { "Feature is active" } { "Feature is not active" }
Or with a context
- Java
-
Future<String> conditonalContext = featureClient.featureOrElse( "my:feature", Json.obj(Syntax.$("context", true)), () -> "Feature is active", () -> "Feature is not active" );
- Scala
-
val conditonalWithContext: Future[String] = featureClient.featureOrElse("test", context) { "Feature is active" } { "Feature is not active" }
Create / update / delete
With the client you can mutate features.
Create with raw data:
- Java
-
Feature createdJson = featureClient.createJsonFeature( "my:feature", true, Features.hourRangeType(), Option.of(Json.obj( Syntax.$("startAt", "05:25"), Syntax.$("endAt", "16:30") )) ).get();
- Scala
-
val featureCreated = featureClient.createJsonFeature( "feature:test", true, FeatureType.HOUR_RANGE, Some(Json.obj("startAt" -> "05:25", "endAt" -> "16:30")) )
- Or with a feature object: Java
-
Feature created = featureClient.createFeature( Features.hourRange("my:feature", true, LocalTime.of(5, 25), LocalTime.of(16, 30)) ).get();
- Scala
-
val featureCreated = featureClient.createFeature( DateRangeFeature("test2", true, LocalDateTime.of(2019, 4, 12, 0, 0, 0), LocalDateTime.of(2019, 5, 13, 0, 0, 0)) )
Update a feature :
- Java
-
Feature updated = featureClient.updateFeature("my:previous:feature", Features.hourRange("my:feature:test", true, LocalTime.of(5, 25), LocalTime.of(16, 30))).get();
- Scala
-
val featureCreated = featureClient.updateFeature( "test", DateRangeFeature("test2", true, LocalDateTime.of(2019, 4, 12, 0, 0, 0), LocalDateTime.of(2019, 5, 13, 0, 0, 0)) )
Delete a feature :
- Java
-
Done deleted = featureClient.deleteFeature("my:feature").get();
- Scala
-
val deleted = featureClient.deleteFeature("test")
You can also activate or deactivate a feature
- Java
-
Feature activated = featureClient.switchFeature("my:feature", true).get();
- Scala
-
val activated = featureClient.switchFeature("test", false)
Autocreate features
You can autocreate features that are define as fallback. To enable this you need set the autocreate
parameter when the client is created.
- Java
-
Boolean autocreate = true; FeatureClient featureClient = izanamiClient.featureClient( Strategies.fetchStrategy(), Features.features( Features.feature("my:feature", false) ), autocreate );
- Scala
-
val featureClient = client .featureClient( FetchStrategy(Crash), autocreate = true, fallback = Features(feature) )
Experiments client
To understand how experiments work, just visit this
Setup the client
- Java
-
ExperimentsClient experimentsClient = izanamiClient.experimentClient(Strategies.fetchStrategy());
- Scala
-
val experimentClient = IzanamiClient(ClientConfig(host)) .experimentClient(Strategies.fetchStrategy())
For experiments, there is only two strategies available : fetch or dev.
Variants
Get a variant for a client
- Java
-
Future<Option<Variant>> futureVariant = experimentsClient.getVariantFor("my:experiment", "clientId"); futureVariant.onSuccess(mayBeVariant -> Match(mayBeVariant).of( Case($Some($()), exist -> { String phrase = "Variant is " + exist; System.out.println(phrase); return phrase; }), Case($None(), __ -> { String phrase = "Variant not found"; System.out.println(phrase); return phrase; }) ) );
- Scala
-
val mayBeFutureVariant: Future[Option[Variant]] = experimentClient.getVariantFor("test", "client1") mayBeFutureVariant.onComplete { case Success(mayBeVariant) => println(mayBeVariant) case Failure(e) => e.printStackTrace() }
Mark variant displayed
- Java
-
Future<ExperimentVariantDisplayed> futureDisplayed = experimentsClient.markVariantDisplayed("my:experiment", "clientId"); futureDisplayed.onSuccess(event -> System.out.println(event) );
- Scala
-
val futureDisplayed: Future[ExperimentVariantDisplayed] = experimentClient.markVariantDisplayed("test", "client1") futureDisplayed.onComplete { case Success(event) => println(event) case Failure(e) => e.printStackTrace() }
Mark variant won
- Java
-
Future<ExperimentVariantWon> futureWon = experimentsClient.markVariantWon("my:experiment", "clientId"); futureWon.onSuccess(event -> System.out.println(event) );
- Scala
-
val futureWon: Future[ExperimentVariantWon] = experimentClient.markVariantWon("test", "client1") futureWon.onComplete { case Success(event) => println(event) case Failure(e) => e.printStackTrace() }
Work with experiment
Get the experiment
- Java
-
Future<Option<ExperimentClient>> futureExperiment = experimentsClient.experiment("my:experiment"); futureExperiment.onSuccess(mayBeExperiment -> Match(mayBeExperiment).of( Case($Some($()), exist -> { String phrase = "Experiment is " + exist; System.out.println(phrase); return phrase; }), Case($None(), __ -> { String phrase = "Experiment not found"; System.out.println(phrase); return phrase; }) ) );
- Scala
-
val futureExperiment: Future[Option[ExperimentClient]] = experimentClient.experiment("test") futureExperiment.onComplete { case Success(Some(exp)) => println(s"Experiment is $exp") case Success(None) => println("Experiment not Found") case Failure(e) => e.printStackTrace() }
Once you get the experiment, you can get a variant for a client, mark variant displayed or mark variant won :
- Java
-
ExperimentClient experiment = mayExperiment.get(); Future<Option<Variant>> clientId = experiment.getVariantFor("clientId"); Future<ExperimentVariantDisplayed> displayed = experiment.markVariantDisplayed("clientId"); Future<ExperimentVariantWon> won = experiment.markVariantWon("clientId");
- Scala
-
val experiment: ExperimentClient = mayBeExperiment.get val futureVariant: Future[Option[Variant]] = experiment.getVariantFor("client1") val displayed: Future[ExperimentVariantDisplayed] = experiment.markVariantDisplayed("client1") val won: Future[ExperimentVariantWon] = experiment.markVariantWon("client1")
Experiment tree
You can get the experiments tree with associated variant for a client :
- Java
-
Future<JsValue> futureTree = experimentsClient.tree("*", "clientId"); futureTree.onSuccess(tree -> { assertThat(tree).isEqualTo( Json.obj( Syntax.$("my", Json.obj( Syntax.$("experiment", Json.obj( Syntax.$("variant", "A") )) )) ) ); });
- Scala
-
val experimentsTree = client.tree("*", "client1").futureValue experimentsTree must be( Json.obj( "izanami" -> Json.obj( "ab" -> Json.obj( "test" -> Json.obj( "variant" -> "A" ) ) ) ) ) val experimentsTree = client.tree("*", "client1").futureValue experimentsTree must be( Json.obj() )
Exposing izanami with a Proxy
When you have to use Izanami from the client side, you can’t call Izanami directly from the browser because it means the API keys are exposed to anyone.
The best solution is to use your backend as a proxy. You can do this with the jvm client.
- Java
-
ConfigClient configClient = izanamiClient.configClient( Strategies.dev(), Configs.configs( Config.config("configs:test", Json.obj( Syntax.$("value", 2) )) ) ); FeatureClient featureClient = izanamiClient.featureClient( Strategies.dev(), Features.features( Features.feature("features:test1", true) ) ); ExperimentsClient experimentsClient = izanamiClient.experimentClient( Strategies.dev(), Experiments.create( ExperimentFallback.create( "experiments:id", "Experiment", "An Experiment", true, Variant.create("A", "Variant A", scala.Option.apply("Variant A")) ))); Proxy proxy = izanamiClient.proxy() .withConfigClient(configClient) .withConfigPattern("configs:*") .withFeatureClient(featureClient) .withFeaturePattern("features:*") .withExperimentsClient(experimentsClient) .withExperimentPattern("experiments:*"); Future<Tuple2<Integer, JsValue>> fJsonResponse = proxy.statusAndJsonResponse(); fJsonResponse.onSuccess(t -> System.out.println("Code = " + t._1 + ", json body = " + t._2) ); //Or with string response and additional infos : Future<Tuple2<Integer, String>> fStringResponse = proxy.statusAndStringResponse(Json.obj().with("id", "ragnard.lodbrock@gmail.com"), "ragnard.lodbrock@gmail.com"); fStringResponse.onSuccess(t -> System.out.println("Code = " + t._1 + ", string body = " + t._2) ); // Experiment proxy Future<Tuple2<Integer, JsValue>> markVariantDisplayed = proxy.markVariantDisplayed("experiments:id", "ragnars.lodbrock@gmail.com"); Future<Tuple2<Integer, JsValue>> markVariantWon = proxy.markVariantWon("experiments:id", "ragnars.lodbrock@gmail.com");
- Scala
-
val client = IzanamiClient( ClientConfig("") ) val featureClient: FeatureClient = client.featureClient( strategy = Strategies.dev(), fallback = Features( DefaultFeature("features:test1", true) ) ) val configClient: ConfigClient = client.configClient( Strategies.dev(), fallback = Configs( "configs:test" -> Json.obj("value" -> 2) ) ) val experimentsClient: ExperimentsClient = client.experimentClient( strategy = Strategies.dev(), fallback = Experiments( ExperimentFallback( "experiments:id", "Experiment", "An experiment", true, Variant("A", "Variant A", Some("Variant A")) ) ) ) val proxy: Proxy = client .proxy() .withConfigClient(configClient) .withConfigPattern("configs:*") .withFeatureClient(featureClient) .withFeaturePattern("features:*") .withExperimentsClient(experimentsClient) .withExperimentPattern("experiments:*") val fResponseJson: Future[(Int, JsValue)] = proxy.statusAndJsonResponse() fResponseJson.onComplete { case Success((status, responseBody)) => println(s"Izanami respond with status $status and json body $responseBody") case _ => println("Oups something wrong happened") } //Or for a string response and additional infos val fResponseString: Future[(Int, String)] = proxy.statusAndStringResponse( context = Some(Json.obj("user" -> "ragnard.lodbrock@gmail.com")), userId =<EMAIL_ADDRESS>) fResponseString.onComplete { case Success((status, responseBody)) => println(s"Izanami respond with status $status and string body $responseBody") case _ => println("Oups something wrong happened") } // Experiment proxy val fDisplayed: Future[(Int, JsValue)] = proxy.markVariantDisplayed("experiments:id"<EMAIL_ADDRESS>val fWon: Future[(Int, JsValue)] = proxy.markVariantWon("experiments:id", "ragnard.lodbrock@gmail.com")


AstroDrishti is an initiative where were try to help people by making them alert about their future. Our goal is to provide this service at a very low price.
We analyze your Kundli and help you in your journey to attain success in your life. AstroDrishti will be your companion in good as well as bad times.
As we truly believe that somehow the planets have influence on us and if we understand the divine science of Astrology then life can become a lot easier.
Astrology is just a finger pointing at reality.
Hello guys, I know a lot of people think that if you have bad combinations in your chart then no matter what you do, ....
In this modern era we believe in science, technology, etc. But whenever we are not able to complete a work, or I can say we want the luck in our favour we just...
We all are living in an age that is supposed to be the last Yuga, Kali Yuga. It is said that there are four different yugas. The First Yuga was Satya yuga,.....
Religion is a social-cultural system of designated behaviors and practices, morals, worldviews, texts, sanctified places, prophecies, ethics,....
Honestly I never really believed in astrology. Why ? Its's simple. I always thought that the astologers were making things up and scaring other people for their own selfish reasons.
So first I want to ask a question that what comes in your mind when someone tells you about his/her profession....
App Provides with the janam kundli of user on the basis of data provided which is absolutely free and can be used infinitely.
App Provides with the Lagna and position of planets of user on the basis of data provided which is absolutely free and can be used infinitely.
App provides with the the prediction of health ,career , luxury and wealth with just a single tap and detailed analysis will be also option provided there.
About Us
After developing a keen interest in Astrology, positioning of planets influencing in our lives, being developers we decided to build an app for users so that person gets an astrologer in their pocket which will tell him/her about his future in a very planned manner. App will analyze your Kundli and help you in your journey to attain success in your life.


See: Description
| Interface | Description |
|---|---|
| BlockingOrderedDeque<E> | |
| ConcurrentList<E> |
A list that is thread-safe and supports concurrent mutations.
|
| ConcurrentStack<E> | |
| SharedCapacityDequeFactory.CloseableBlockingDeque<T> |
A
BlockingDeque that can be closed. |
| SharedCapacityDequeFactory.CloseableBlockingQueue<T> |
A
BlockingQueue that can be closed. |
| SharedCapacityDequeFactory.CloseableDeque<T> |
A
Deque that can be closed. |
| SharedCapacityDequeFactory.CloseableQueue<T> |
A
Queue that can be closed. |
| Class | Description |
|---|---|
| AbstractLockFreeBlockingDeque<E> |
An abstract blocking deque, useful for building deque implementations that do not rely on locks
for thread-safey.
|
| AbstractLockFreeBlockingOrderedDeque<E> | |
| AbstractLockFreeBlockingQueue<E> |
An abstract blocking queue, useful for building queue implementations that do not rely on locks
for thread-safety.
|
| ArrayBlockingDeque<E> |
A double-ended blocking queue backed by an array.
|
| ConcurrentSkipListOrderedQueue<E> | |
| ConcurrentSortedArraySet<E> |
A
NavigableSet that allows concurrent access. |
| ConcurrentSortedArraySet.Builder<E> |
A builder class for constructing instances of
ConcurrentSortedArraySet . |
| DoubleInstanceLockedTreeMap<K,V> |
A concurrent navigable map backed by a
TreeMap and made thread-safe via a
DoubleInstanceLock . |
| LockFreeArrayBlockingQueue<E> |
A blocking queue that is backed by an array and is lock-free.
|
| LockFreeLinkedBlockingDeque<E> |
A lock-free implementation of
BlockingDeque , backed by a ConcurrentLinkedDeque . |
| LockFreeLinkedBlockingQueue<E> |
A lock-free implementation of
BlockingQueue , backed by a ConcurrentLinkedQueue . |
| LockFreeSkipListBlockingQueue<E> |
A blocking ordered queue that uses a concurrent skip list to store elements.
|
| PersistentListBackedConcurrentList<E> | |
| PersistentMapBackedConcurrentMap<K,V> |
A concurrent map that is backed by a persistent map.
|
| ShardedConcurrentSets |
This utility class provides concurrent set implementations that wrap
normal (non-concurrent) sets to provide thread-safe access.
|
| ShardedConcurrentSets.Builder<E,T extends Set<E>> |
Creates concurrent set objects using the builder pattern.
|
| SharedCapacityDequeFactory |
A producer of queues and deques that all share a single bound.
|
| SimpleTreiberStack<T> |
A very simple, thread-safe stack.
|
| TreiberStack<T> |
A thread-safe stack.
|
This package contains several blocking queue and deque implementations that are lock-free.
Under certain workloads, particularly where contention might arise (many consumers and/or many
producers), these implementations may provide superior performance to the standard
implementations included in the java.util.concurrent
package (JSR 166).
There is also a factory class for instantiating concurrent sets. It operates using normal not-thread-safe set implementations and makes them thread-safe using sharding, for parallelism, and read-write locks, for thread-safety.
Also present are concurrent structures that use persistent collections and compare-and-swap.
These include both a
list
(which implements a new ConcurrentList
interface)
and a map.


Bike Charts
Search Specific Color
Search All Stolen Bikes
View Random Bike
Color of Bike:
--Please Select a Color--
Black
Blue
Brown
Green
Orange
Pink
Purple
Red
Silver or Gray
Stickers tape or other cover-up
Teal
White
Yellow or Gold
Zip Code:
Proximity:
--Please Select a Proximity--
2 Mile Radius
5 Mile Radius
10 Mile Radius
20 Mile Radius
50 Mile Radius
100 Mile Radius
Bikes Stolen After:
Submit
Sorted by:
--Please Select a Sort Option--
By Color
By Manufacturer
By Frame Material(Takes a Long Time)
Zip Code:
Proximity:
--Please Select a Proximity--
2 Mile Radius
5 Mile Radius
10 Mile Radius
20 Mile Radius
50 Mile Radius
100 Mile Radius
Bikes Stolen After:
Submit


Those who consider themselves to be strong partisans, strong Democrats and strong Republicans respectively, tend to be the most faithful in voting for their party's nominee for office and legislation that backs their party's agenda.
| Party | Number of Reps | % Voted with Prty |
|---|---|---|
| Republican | 46 | 70 |
| Democrat | 57 | 97 |
| Independent | 2 | 95 |
| First Name | Last Name | Number Party Votes | % Party Votes |
|---|
| First Name | Last Name | Number Party Votes | % Party Votes |
|---|


http://action.vday.org/site/R?i=x5fA-oN0yplkKVOYQKmQeA
http://action.vday.org/site/R?i=0movRZ_JCRUCfTmYskDqLA
http://action.vday.org/site/R?i=rdKewg3wA15WRB5Iidrm3A
http://action.vday.org/site/R?i=ZhOx4vlTU5_XQ_mPbHkLFw
http://action.vday.org/site/R?i=AkpfMXBqS9Mn4iwqQcPaKg
http://action.vday.org/site/R?i=mEoufGUbfZIJOQHHkcySjg
Building the Revolution Around the World!
Building Rev 1.jpg
Building Rev 2.jpg
With less than four weeks until 14 February, activists are sharing
their Rise for Revolution videos, photos, memes, posters & event
plans on a daily basis. Tibetans in exile and Indian activists are
rising event for climate justice, conflict resolution, and
peacebuilding; in Santa Fe activists are marching for victims of sex
trafficking, in Germany & the UK they are rising for and with
refugees, in Croatia activists are mounting a strong rising against
the governments attempts to restrict reproductive rights and much
more! Be sure to visit the One Billion Rising homepage for the latest
news and updates.
http://action.vday.org/site/R?i=BC6bRIYKKpPtKtntvpztsA
READ News & Blogs >
http://action.vday.org/site/R?i=NFZFbjLm7iyAabGedAO8cg
FIND/PLAN an event near you >
http://action.vday.org/site/R?i=aLGp8y5mgk47pbwihnlyfA
Building Rev india.jpeg
building rev india 2.jpg
NEW Rise for Revolution Videos
http://action.vday.org/site/R?i=PJE3Uj0P6Nnq6Ia3P1Q5QA
Columbus Rising activists share
campaign >
http://action.vday.org/site/R?i=oZZx_EK-mzNQoNXNj58c1A
http://action.vday.org/site/R?i=ksj60wN4kN1S_HyIYd8Rdw
http://action.vday.org/site/R?i=U5pEsxhiIm5cjcJaE1V-dg
Activists in Poland are ready to LISTEN! ACT! RISE! >
http://action.vday.org/site/R?i=QocwQ3VykWALiPfM1AHl3g
http://action.vday.org/site/R?i=Xg9_QU7cCj2oQ7unBbUVYw
Lumads, indigenous tribes in the Philippines, are RISING against
militarization and the forced evacuation from their ancestral lands
>
http://action.vday.org/site/R?i=f7fV4hFRXjtsdtrOOy3WGw
Order Your One Billion Rising 2016 Gear - Shipping Deadlines
Approaching
Screen Shot 2016-01-20 at 11.45.11 AM.png
http://action.vday.org/site/R?i=Z31NU8r4Eb0QQsdFoHIwqw
One Billion Rising: Rise For Revolution clothing is available from
Spreadshirt. Shipping deadlines are fast approaching - to ensure
your merchandise arrives on time for your RISING, please note the
shipping deadlines provided by Spreadshirt.
http://action.vday.org/site/R?i=iFeSa-0ktjKxreIemwPgLg
MORE Details >
http://action.vday.org/site/R?i=PpZE5sgv5Yly4Zd8_G7ICA
SHOP One Billion Rising Gear >
http://action.vday.org/site/R?i=eFgkn0UA0A7lK_fsi5AInw
http://action.vday.org/site/R?i=t6-PpbandRkBqjIvPwEQUg
http://action.vday.org/site/R?i=rFU7NNvdL-x5HRdaZVNGXw
http://action.vday.org/site/R?i=mH_tuztUpyJ4Y4RZNKF4ag
http://action.vday.org/site/R?i=79F-TN0kiF7mSiNGpyWaWw
http://action.vday.org/site/R?i=0yvuqxca3wVOXoUexqAQvw
http://action.vday.org/site/R?i=ACcGQ5Mlli0oUiMvg9Rvgg
http://action.vday.org/site/R?i=vn8ydVAkQVvOUHvl3CuPtg
http://action.vday.org/site/R?i=qjQS0qMsB_sViO6peUq6FQ
unsubscribe
http://action.vday.org/site/CO?i=JNbjDfn5qw3uJJJAa6cdDce4YShSi0i7&cid=1062
Powered By Blackbaud


Hear It Live: Marshall Burns' dark humour reflected in 'Dead and Gone'
On the new record Dogs & Booze, “Dead and Gone” is Marshall Burns' duet with Kacy Anderson of Kacy & Clayton.
by Ashley MartinHear It Live is a closer look at a song and its writer/performer. Hear “Dead and Gone” when Marshall Burns performs next week in Regina.
The artist
Marshall Burns is a familiar face in the Regina music scene. Since he first played a Regina Folk Festival tweener set at age 13, the guitar-playing songwriter has been performing around town.
In Grade 12, he co-founded indie rock band Rah Rah, which had a solid 10-year run before its 2016 hiatus.
Burns plays classic country music with The Alley Dawgs every Tuesday night at the Fat Badger. (A 600-song cover rotation makes repeats rare. “We have a lot of regulars who come every week or most every week. So we try to make sure that we’re keeping the show entertaining … and different every time for them.”)
And now, Burns has got a solo record — his first one ever, if you can believe it.
Producing a solo record was different from his previous experience with bands.
“It’s your name; it’s your project; you’re lining everybody up to do this and make it come to life,” said Burns.
“It’s nice at times to have final say and have more control.  Things weren’t being split up between a five-person band.”
The song
On the record Dogs & Booze, “Dead and Gone” is a duet with Kacy Anderson of cousin-duo Kacy & Clayton.
It’s a song about two fictional characters, a long-time couple, elderly and “extremely unhappy.”
“I thought that was kind of unique; I feel like I haven’t heard this story before in song necessarily,” said Burns. “When you’re writing, you’re trying to do something that you feel you haven’t seen done quite that same way. And that’s generally what drives you to want to create something.”
Burns enjoys storytelling, and this is a story-song.
The words
A man notices his wife “tiring of my stories” and “growing cold.”
“You’re waiting out your days, too tired to make any changes,” the song continues. “Steadfast in your ways and yet closed off to all exchanges.”
The chorus goes, “So here we are together, but quite alone. My darling’s living for that day I’m dead and gone.”
The lyrics draw on a “dark humour” that Burns enjoys about songwriting.
“It’s a little over the top intentionally. I hope there’s not too many people lying there next to their partner, hoping that they’re dead and gone,” said Burns.
More so, it’s about “feeling incapable of changing your surroundings,” he added. “Your hands are tied in life and you’re in a position that you don’t necessarily want to be in, but you aren’t sure how to break out of that.”
Listen now
As with Burns’ other music, Dogs & Booze will be available on streaming services upon its release.
Many of the songs date back to Burns’ time with The Lonesome Weekends, a country band active in Regina a decade ago.
The album was recorded three years ago — with Jeff Romanyk (drums), Joel Passmore (bass), Chris Sleightholm (guitar) and Ian Cameron (pedal steel) — and took this long to mix and finalize.
These past few years, Burns got a full-time job “and music wasn’t the only thing that I was focused on like it had been. So that kind of slowed down the whole process.”
Hear it live
Burns has scheduled two album release shows at The Artesian in Regina on Wednesday, Nov. 20, and Thursday, Nov. 21. (The first show sold out quickly, hence the call to add the second. Both nights start at 7:30 p.m.)
Backing Burns in concert are Romanyk, Cameron, Sleightholm and Andy Beisel.
Lexi Buzash of Suncliffs will open.
Tickets are $20 in advance at artesianon13th.ca.


You may have heard of Intercons such as Intercon Mid-Atlantic, and Intercon NorthEasts, and even Intercons with numbers after them. Those are Intercons that happened outside the New England area. They were loads of fun, but sadly, all of them are currently defunct.
New England Interactive Literature (NEIL) is the group of volunteers that brings you the New England Intercons.
The Live Action RolePlayers Association (LARPA) owns the Intercon trademark.


Quick Editors:
DStarRepeater |
ircDDBGateway |
TimeServer |
MMDVMHost |
DMRGateway |
YSFGateway |
P25Gateway
Full Editors:
DMRGateway |
PiStar-Remote |
WiFi Config |
BM API Key |
System Cron |
RSSI Dat
Tools:
SSH Access


>>
<<
Usr
Pri
JfC
LJ
Phr
Dic
Voc
!:
Help
Primer
Table
A table is a two dimensional array of atoms. Tables cannot be written directly as a constant as can an atom or a list, but instead must be created with a primitive. The dyad $ (shape) can create tables. The left argument indicates the count of items in each dimension and the right argument provides items to populate the table.
2 3 $ 7 NB. a 2 by 3 table of 7's
7 7 7
7 7 7
2 3 $ 7 8 9 10 11 12
7 8 9
10 11 12
2 3 $ 7 8 NB. cycle through atoms to get enough
7 8 7
8 7 8
3 4 $ 'abcdefghijklmnopqrstuv'
abcd
efgh
ijkl
The monad $ (shape of) gives the shape of its argument. The shape is the list of the count of atoms in each dimension of the argument.
a =. 2 3 $ 7
$ a
2 3
The monad i. (integers), introduced earlier for creating a list of integers, can be used to create tables of integers.
i.5 NB. list of 5 integers
0 1 2 3 4
i. 2 3 NB. 2 by 3 table of integers
0 1 2
3 4 5
>>
<<
Usr
Pri
JfC
LJ
Phr
Dic
Voc
!:
Help
Primer


{% extends "layout/base.html" %}
| Article Type | Hype score | Headline | |
| Opinion | 97 |
Hidden Obamacare Secret: “RFID Chip Implants” Mandatory for All by March 23, 2013 | |
| Opinion | 99 |
Threaten to Threaten | |
| News | 4 |
U.S. and Allies Push for Strong U.N. Measure on Syria’s Arms |


UIStyleController
class UIStyleController
extends
UIRenderableController
Renderable wrapper that controls the style of its single content component, by applying one of the given styles based on the current value of a property.
Constructor
(content?:
UIRenderable
): UIStyleController
.state
string | boolean
Currently selected style (string index into UIStyleController.styles
object, or true to apply the single style
object).
.style
string |
UIStyle
Style that is applied if the current state
is not false or undefined.
.styles
{ [name: string]: string |
UIStyle
; }
Available styles to be applied to the content component (plain object).
.baseStyle
Base style (taken from the content component right after it is assigned to the content
property).
.renderContext
Inherited from UIRenderableController.renderContext
.
.content
TContent
Inherited from UIRenderableController.content
.
.delegateEvent() protected
(e:
ManagedEvent
, propertyName: string): true
Inherited from UIRenderableController.delegateEvent
.
.render()
(callback?: RenderCallback<Output<
UIRenderable
, any>>): void
Inherited from UIRenderableController.render
.
.isPresetComponent() protected
(): boolean
Inherited from Component.isPresetComponent
.
.getParentComponent()
<TParent extends Component = Component>(ParentClass?:
ComponentConstructor
<TParent>): TParent
Inherited from Component.getParentComponent
.
.getBoundParentComponent()
<TParent extends Component>(ParentClass?:
ComponentConstructor
<TParent>): TParent
Inherited from Component.getBoundParentComponent
.
.emitAction()
(name: string, inner?:
ManagedEvent
, context?:
ManagedObject
): void
Inherited from Component.emitAction
.
.propagateComponentEvent() deprecated
(name: string, inner?:
ManagedEvent
): void
Inherited from Component.propagateComponentEvent
.
.managedId
number
Inherited from ManagedObject.managedId
.
.managedState
Inherited from ManagedObject.managedState
.
.getReferenceCount() protected
(): number
Inherited from ManagedObject.getReferenceCount
.
.getManagedReferrers() protected
():
ManagedObject
[]
Inherited from ManagedObject.getManagedReferrers
.
.getManagedParent() protected
<TParent extends ManagedObject = ManagedObject>(ParentClass?:
ManagedObjectConstructor
<TParent>): TParent
Inherited from ManagedObject.getManagedParent
.
.emit()
<TEvent extends ManagedEvent = ManagedEvent, TConstructorArgs extends any[] = any[]>(e: string | TEvent | (new (...args: TConstructorArgs) => TEvent), ...constructorArgs: TConstructorArgs): this
Inherited from ManagedObject.emit
.
.emitChange()
(name?: string): void
Inherited from ManagedObject.emitChange
.
.propagateChildEvents() protected deprecated
(...types: ((new (...args: any[]) =>
ManagedEvent
) | ((e:
ManagedEvent
) => any))[]): this
Inherited from ManagedObject.propagateChildEvents
.
.activateManagedAsync() protected
(): Promise<any>
Inherited from ManagedObject.activateManagedAsync
.
.deactivateManagedAsync() protected
(): Promise<void>
Inherited from ManagedObject.deactivateManagedAsync
.
.destroyManagedAsync() protected
(): Promise<void>
Inherited from ManagedObject.destroyManagedAsync
.
.onManagedStateActivatingAsync() protected
(): Promise<void>
Inherited from ManagedObject.onManagedStateActivatingAsync
.
.onManagedStateActiveAsync() protected
(): Promise<void>
Inherited from ManagedObject.onManagedStateActiveAsync
.
.onManagedStateDeactivatingAsync() protected
(): Promise<void>
Inherited from ManagedObject.onManagedStateDeactivatingAsync
.
.onManagedStateInactiveAsync() protected
(): Promise<void>
Inherited from ManagedObject.onManagedStateInactiveAsync
.
.onManagedStateDestroyingAsync() protected
(): Promise<void>
Inherited from ManagedObject.onManagedStateDestroyingAsync
.
UIStyleController.Presets
UIStyleController presets type, for use with Component.with
.
.state
string | boolean
Currently selected style (string index into UIStyleController.styles
object; or true
to apply the single style
object).
.style
string |
UIStyle
Style that is applied if the current state
is not false or undefined.
.styles
{ [name: string]: string |
UIStyle
; }
Available styles to be applied to the content component (plain object).


C++ Coding Guidelines¶
I. Introduction¶
These are the internal C++ guidelines for the machines-in-motion group. The same guidelines are used in the Open Dynamic Robot Initiative
The following rules present basic guidelines for our C++ code. The goal is to have code that is formatted in a consistent and easily readable way while at the same time not being overly complicated by specifying every detail. For such guidelines to be practical, newcomers should be able to read them within a few minutes and be able to memorize them. So these rules intentionally do not cover every detail but rather aim at specifying only the big, important things.
 Note, however, that we have a few small deviations from the Google style.
These guidelines may evolve in time so it is first good practice to check them upon creation of a new package or code refactoring.
II. Folder Structure and File Naming¶
Header files should be in a folder:
include/<name_of_the_project>/*
, e.g.#include "tuto_sphinx_doxygen/gains_configuration.hpp"
File extension for header files:
.hpp
Source files should be in a folder named
src/
. The file should have the same name as the header with extension.cpp
.When using templates: If you want to separate declaration and definition, put the declaration to a
.hpp
header file as usual and the definition to a file with extension.hxx
in the same directory (which is included at the bottom of the.hpp
file).Preferably each class should be in a separate file with name class_name_in_lower_case. However, this is not a strict rule, if several smaller classes are logically closely related, they may go to the same file.
Executable scripts should be placed in the
scripts/
folder. And should have a CMake install rule that makes them executable upon installation.The C++/pybind11 code for wrapping C++ code to Python must be placed in
srcpy/
III. Naming¶
Give as descriptive a name as possible, within reason. Do not worry about saving horizontal space as it is far more important to make your code immediately understandable by a new reader. Do not use abbreviations that are ambiguous or unfamiliar to readers outside your project, and do not abbreviate by deleting letters within a word. Abbreviations that would be familiar to someone outside your project with relevant domain knowledge are OK. As a rule of thumb, an abbreviation is probably OK if it’s listed in Wikipedia.
Formatting of names should be as follows:
types (classes, structs, …): FirstUpperCamelCase
functions, methods: lower_case_with_underscores
variables: lower_case_with_underscores
class members: like_variables_but_with_trailing_underscore_
constants: UPPER_CASE_WITH_UNDERSCORES
global variables: Should generally be avoided but if needed, prefix them with g_, i.e. g_variable_name.
IV. Add Units to Variable Names¶
Variables that hold values of a specific unit should have that unit appended to
the name. For example if a variable holds the velocity of a motor in krpm it
should be called velocity_krpm
instead of just velocity
. Some more examples:
duration_us (use “u” instead of “µ”)
voltage_mV
acceleration_mps2, i.e.
\[ \frac{m}{s^2}\]
V. C/C++ Formatting¶
V.1. Line Length¶
Limit the length of lines to 80 characters.
This may seem hard to follow sometimes but makes it much easier to view two or even three files next to each other (important during code review or when resolving merge conflicts).
V.2. Indentation¶
Use spaces instead of tabs.
4 spaces per “tab”.
V.3. Position of braces¶
Opening brace always goes to the next line.
Always add braces for single-line if/loop/etc.
Example:
namespace bar
{
class Foo
{
void my_function(const Foo &foo, int *output_arg)
{
if (condition)
{
...
}
else if (other_condition)
{
...
}
else
{
...
}
while (condition)
{
...
}
}
}
} // namespace
V.3. Spaces¶
Add single spaces between if/for/etc., the condition and the brace. add spaces
around most binary operators. Exception: No spaces around ::
, .
and ->
.
Also no spaces for unary operators (i++
, &x
, *x
, …).
Example:
int x = 42;
for (int i = 0; i < x; i++)
{
int y = i * x;
if (y == foo.bar->baz)
{
...
}
}
V.4. Formatting of switch blocks¶
See the following example for proper indentation of switch blocks.
Always add a default case, even when it is technically not needed.
If the default block is empty, it shall contain a comment to indicate that this is intentional.
The default case shall either be the first or the last case, preferably the last.
Non-empty cases shall be terminated by an unconditional break.
switch (x)
{
case 1:
// ...
break;
case 2:
// ...
break;
case 3: // multiple cases for one block are okay
case 4:
// ...
break;
case 5: // BAD. A non-empty case without break should not be
something(); // used
case 6:
more();
break;
default:
// no action needed
break;
}
VI. C/C++ Coding Guidelines¶
VI.1. Pass objects by const reference¶
In general, non-primitive data types should be passed to functions by const reference instead of by value.
void foobar(const Foo &foo); // good
void foobar(Foo foo); // results in copy of `foo`. Only do this if const
// reference is not possible for some reason.
VI.2. #pragma once vs Include Guards¶
Prefer #pragma once over include guards. #pragma once is not part of the official standard but is widely supported by compilers and much simpler to maintain.
Note that there are some border cases where #pragma once is causing issues (e.g. on Windows or when having a weird build setup with symlinks or copies of files). In such cases use traditional include guards. Make sure they have unique names by composing them from the package name and the path/name of the file (e.g. MY_PACKAGE_PATH_TO_FILE_FILENAME_H). Please do not add underscore as prefix nor suffix beccause this is reserved for the compiler preproccesor variables.
VI.3. Keep scopes small¶
Avoid adding anything to the global namespace if possible. This means
Use a namespace when defining extern symbols.
Use an anonymous namespace or static for symbols that are only used internally.
Generally define symbols in the smallest possible scope, i.e. if a variable is only used inside one loop, define it inside this loop (however, do not consider this to be a very strict rule, deviate from it where it seems reasonable).
VI.4. Use types with explicit sizes¶
The header stdint defines primitive types with explicit sizes: int32_t, uint32_t, int16_t, … They should be preferred over the build-in types int, unsigned, short, … To use them add the following include:
#include <stdint>


The values that started my journey
I am very excited to be a part of Dev Bootcamp. I felt that way when I was preparing to apply in December because I was sacrificing my two week Christmas vacation from work, and spending that time with my nose in various (intimidating) programming books. And I certainly felt that way when I was accepted and went dancing around my house feeling really good about myself. But what started all this? What values led me to give up my Christmas vacation to study, get accepted into the DBC program, and give up my (rather good) job at a software company? The answer might surprise you.
I am towards to upper middle area of DBC’s age group. At 42 years old when I was accepted, I had already had a decent career in the IT community. But back in 1998 I worked for a video game company. There, I received a ring side seat for the development of some world class games. The programmers on those projects made me feel like what I was doing was like pumping gas, and they were designing race cars. I could show up with a beer helmet, and cheer from the side lines but I wasn’t one of them. But I have wanted to be a programmer ever since. And watching fifteen years tick by without doing more to make that a reality is something I regret.
Some of my deepest values in life include having a family, having a great relationship with my wife, being a great friend that values friendship, and finally growing as a person. But most of these items have been met for many years now, and thats a true blessing. However, I have felt that the “growing” in my career is something that has been lacking for years. And I finally decided that this value was being so disregarded that it was beginning to cause me emotional pain and frustration as a working adult. And one morning, I simply woke up and decided that (dammit) I was going to do something about it. And this brought me to DBC.
This brings to one of my insecurities to light. As someone that isn’t 22 years old, I have some significant life experience in both my career and my personal life. I don’t feel like someone that’s in his forties, but here I am. I suppose that arriving onsite could lead me to feel “over the hill” so to speak. But I like to think that I could have a tremendous career as a programmer over the next twenty five years. But I do fear having some stereotype threat from my age group.
To address this, I have decided to just be myself and exercise patience and understanding with those around me. And of course, try to be the best colleague to my fellow Fiery Skippers that I can be during our time together in the program. The goal of my journey has always been personal and career growth, and I want to make sure that I commit all of my efforts towards driving that initiative forward.


Are you tired of constantly thinking of what to cook or to order?
Click on the "Be Ready to be MEAL-ANATED!" button and be blown away by two random recipes (1 for your
meal and another for a fund drink [some drinks require you to be the age of 21 or older]).


Preparation time
30 mins to 1 hour
Cooking time
10 to 30 mins
Serves
Serves 2
A decadent barbecue feast that is sure to impress.
Equipment: You will need a small plank of untreated hard wood such as cherry, apple or oak, soaked in water for 30 minutes that fits in a barbecue, and a lidded barbecue.
To make the ham butter, heat a small saucepan over a medium heat and cook the ham to render the fat. Leave to cool, then beat into the soft butter with the smoked paprika.
Preheat a barbecue to a high heat.
To make the vegetables, heat the unsalted butter in a frying pan and cook the courgette ribbons for 1 minute.
Cook the broad beans and peas in their pods on the barbecue for a few minutes on each side to warm through. Barbecue the rounds of courgette for 3 minutes on each side. Lightly brush the Little Gem quarters with olive oil and barbecue for 2 minutes on each side.
To make the crispy kale, fill a deep-fat fryer or a large, deep, heavy-bottomed saucepan two-thirds full with the vegetable oil. Heat to 180C (a cube of bread should turn brown in 1 minute when dropped in.) CAUTION: Hot oil can be dangerous. Do not leave unattended. Deep-fry the kale until crisp, then drain on kitchen paper. Mix the salt and sugar with a pinch of smoked paprika and sprinkle over the kale.
To make the scallops and prawns, place the pre-soaked plank on one side of the barbecue. Season the prawns and scallops with a little olive oil and lemon juice and place on the other side of the barbecue. Cook with the lid down for 4–5 minutes, until smoky and cooked through. Remove from the heat and brush the ham butter all over.
Place the vegetables, prawns and scallops on a large serving plate and serve with lemon wedges and the ham butter on the side.


The next topic we will be discussing is DNS, which stands for Domain Name System. DNS is designed to make the internet accessible to human beings. DNS translates IP address from numbers to letter.
How does the DNS process work? First, your web browser or device performs a DNS lookup, which is just finding the IP address of a domain. Then, that request is received by the DNS resolver, who is responsible for finding the correct IP address for the hostname. Once, resolver reaches a DNS server it goes through a TLD( Top Level Domain) for example .com to name a server of a specific domain. When it reaches said Domain, it acquires the Ip address and returns it back to the DNS client. Finally, the client can connect to the correct server through IP address


TAB
or ALT + TAB
to focus on the canvasARROWS
to navigate between entitys - only one entity can be highlighted at any timeSHIFT + ARROWS
to move the highlighted entityALT + BACKSPACE
to show/hide the minimapALT + SHIFT + ARROWS
also moves the minimap (when the canvas element is focussed)ALT + ARROWS
will also move the red rectangle around the minimapSHIFT + CLICK
to select an entitySHIFT + CLICK
on a selected entity will unselect itRETURN
will select/unselect the currently highlighted entityBACKSPACE
will clear all the currently selected entitysMOVE
pin and two orbiting pins labelled ROLL
and SCALE
Moving
W
(up), A
(left), S
(down) and D
(right) keysMOVE
pin without moving the selected entitys alongside it, hold down the SHIFT
key while performing the drag-drop action; this can also be done on the keyboard by holding down the shift key while pressing the WASD
keysQ
key to bring up an alert formScaling
SCALE
pin; scaling is done using the MOVE
pin as the reference point for the actionN
to scale down, M
to scale upSHIFT
key while performing the drag-drop action or pressing the scale keysB
key to bring up an alert formRotating
ROLL
pin; rotation is done using the MOVE
pin as the reference point for the actionK
to rotate clockwise, J
to rotate anti-clockwiseSHIFT
key while performing the drag-drop action or pressing the rotate keysH
key to bring up an alert formEditing other entity attributes
Non-QWERTY keyboards
CTRL + C
keyboard combinationCTRL + X
keyboard combinationCTRL + V
keyboard combinationThis is more of a proof-of-concept than a demo test. It does give the Keyboard object a good work-out. But the demo is buggy and would need some serious work before being put into a production-ready product.
Note the animation is slow, due to some expensive filters being applied to a big canvas. Work needs to be done to make the system performant.
Touch test: the entitys should be draggable, preventing scroll movement; when the canvas itself is dragged the screen should scroll as expected.


---
layout: menupage
title: "How to use this site"
---
{{ site.title }}
{{page.title}}
Reading stories
- Click on a story to read it.
- Click on Change language to read the story in a different language.
- Click on {{ site.lang1_code }} and {{ site.lang2_code }} icons to switch quickly between {{ site.lang1 }} and {{ site.lang2 }}, respectively.
Listening to stories
- Click on the icon beside any text on the page to hear the text read aloud.
- To pause or restart the audio at any point, click again on the icon.
- To hear the entire story read aloud, click on the audio controls at the top of the page.
Downloading stories
- To download any story, click on the Download PDF button at the top or bottom of the page.
- To download the full audio for any story, right-click on the audio controls at the top of the page and select Save Audio As... to save the audio file to your computer.


WARNING
Content Under Development
See
release page for
latest official PDF version.
 The biggest limitation left in the renderer is no shadow rays, but that is
why we get caustics and subsurface for free. It’s a double-edged design decision.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++
hitable *final() {
int nb = 20;
hitable **list = new hitable*[30];
hitable **boxlist = new hitable*[10000];
hitable **boxlist2 = new hitable*[10000];
material *white = new lambertian( new constant_texture(vec3(0.73, 0.73, 0.73)));
material *ground = new lambertian( new constant_texture(vec3(0.48, 0.83, 0.53)));
int b = 0;
for (int i = 0; i < nb; i++) {
for (int j = 0; j < nb; j++) {
float w = 100;
float x0 = -1000 + i*w;
float z0 = -1000 + j*w;
float y0 = 0;
float x1 = x0 + w;
float y1 = 100*(drand48()+0.01);
float z1 = z0 + w;
boxlist[b++] = new box(vec3(x0,y0,z0), vec3(x1,y1,z1), ground);
}
}
int l = 0;
list[l++] = new bvh_node(boxlist, b, 0, 1);
material *light = new diffuse_light( new constant_texture(vec3(7, 7, 7)) );
list[l++] = new xz_rect(123, 423, 147, 412, 554, light);
vec3 center(400, 400, 200);
list[l++] = new moving_sphere(center, center+vec3(30, 0, 0),
0, 1, 50, new lambertian(new constant_texture(vec3(0.7, 0.3, 0.1))));
list[l++] = new sphere(vec3(260, 150, 45), 50, new dielectric(1.5));
list[l++] = new sphere(vec3(0, 150, 145), 50,
new metal(vec3(0.8, 0.8, 0.9), 10.0));
hitable *boundary = new sphere(vec3(360, 150, 145), 70, new dielectric(1.5));
list[l++] = boundary;
list[l++] = new constant_medium(boundary, 0.2,
new constant_texture(vec3(0.2, 0.4, 0.9)));
boundary = new sphere(vec3(0, 0, 0), 5000, new dielectric(1.5));
list[l++] = new constant_medium(boundary, 0.0001,
new constant_texture(vec3(1.0, 1.0, 1.0)));
int nx, ny, nn;
unsigned char *tex_data = stbi_load("earthmap.jpg", &nx, &ny, &nn, 0);
material *emat = new lambertian(new image_texture(tex_data, nx, ny));
list[l++] = new sphere(vec3(400,200, 400), 100, emat);
texture *pertext = new noise_texture(0.1);
list[l++] = new sphere(vec3(220,280, 300), 80, new lambertian( pertext ));
int ns = 1000;
for (int j = 0; j < ns; j++) {
boxlist2[j] = new sphere(
vec3(165*drand48(), 165*drand48(), 165*drand48()), 10, white);
}
list[l++] = new translate(new rotate_y(
new bvh_node(boxlist2,ns, 0.0, 1.0), 15), vec3(-100,270,395));
return new hitable_list(list,l);
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Running it with 10,000 rays per pixel yields:
![Image 9-1](../assets/img9-01.jpg)
Now go off and make a really cool image of your own! See http://in1weekend.com/ for pointers to
further reading and features, and feel free to email questions, comments, and cool images to me at
ptrshrl@gmail.com.


open filename
Opens filename
, which should be the name of a
GrADS data descriptor file, also called a control file.
.ctl
. Provided you adhere to this standard, there is no
need to type the extension .ctl
when issuing the
open
command.
open jandata.1966
open jandata.1966.ctl
Both of these commands will have the same effect -- opening the GrADS
data descriptor file "jandata.1966.ctl"
.


This is a quick guide on getting started on course development and management for Stat 140. If you have any questions beyond what’s covered here, please contact Dibya. If you haven’t already, create a Gitlab account here, and send an email to Dibya with your username, asking to be added to the repo.
The main center of course development is on GitLab under the organization PROBABILITY. You can access it at https://gitlab.com/probability.
If you’re correctly configured, you should see the following repositories
Prob140
libraryCourse materials are homeworks, labs, and questions. Homeworks are weekly assignments composed of unrelated questions; they are released on Wednesday, and are due on Tuesday at midnight the following week. Labs are 2-hr long weekly assignment with some natural progression (or ultimate goal). Questions are small problems which are used to create homeworks.
Course materials begin in the course-materials
(Internal Course Materials) repository. To learn how to create a new homework or a new lab, view the README in the course-materials
repository. Once they have been designed and extensively tested, we will export the student code base from the course-materials
repository, and place it into the assets
repository. The student will now be able to click an Interact link, which will download the folder from the assets
repository, and put it into their Jupyter server.
After the student has finished the assignment, they will use a library called gsExport
to generate a PDF for use in Gradescope. This library segments the Jupyter notebook so it’s easier to grade in Gradescope. Students will then submit this segmented PDF to gradescope, at which point grading happens. Once the deadline passes, the solution will be also be placed into the assets
repository.
The textbook is a compilation of Markdown files and Jupyter Notebooks, all embedded in a GitBook.
In order for the iPython notebook parser to correctly go through your notebook, there are exactly three things that you have to follow:
1) When writing the notebook, remember to put “#SETUP” in cells that contain import code, “#SOLUTION” in cells that contains solutions (or where students should place solutions)
2) When writing doctests, remember to start the cell with “%%runDoctest”, and put in all the doctests that you’d like following: Here’s an example
%%runDoctest
>>> 1+1
2
>>> 10 == 2
False
3) Remember to put
in front of new questions and subquestions; this tells our Gradescope Exporter that a new question begins here, and to put the appropriate page break. Remember that the maximum difference between two
is 2 pages, so if you think that the student will write more than 2 pages, be sure to insert more
characters.
Here’s an example of what this might look like (another really good guide is the starter notebook which is created when you make a new lab/question). All of these cells are markdown cells, by the way.
Cell 1

## Subpart 1
What is 1+1?
Cell 2
#SOLUTION
2
Cell 3

## Subpart 2
What is 1+2?
Cell 4
#SOLUTION
3


Uses of Class
com.mypurecloud.sdk.v2.model.ReportingTurn
-
Uses of ReportingTurn in com.mypurecloud.sdk.v2.model
Modifier and TypeMethodDescriptionReportingTurn.askAction
(ReportingTurnAction askAction) The bot flow 'ask' action associated with this reporting turn (e.g.ReportingTurn.askActionResult
(ReportingTurn.AskActionResultEnum askActionResult) Result of the bot flow 'ask' action.ReportingTurn.botPrompts
(List<String> botPrompts) The bot prompts associated with this reporting turn.ReportingTurn.dateCreated
(Date dateCreated) Timestamp indicating when the original turn was created.ReportingTurn.intent
(ReportingTurnIntent intent) The intent and associated slots detected during this reporting turn.ReportingTurn.knowledge
(ReportingTurnKnowledge knowledge) The knowledge data captured during this reporting turn.ReportingTurn.sessionEndDetails
(SessionEndDetails sessionEndDetails) The details related to end of bot flow session.The bot session ID that this reporting turn is grouped under.The chosen user input associated with this reporting turn.Modifier and TypeMethodDescriptionReportingTurnsResponse.entities
(List<ReportingTurn> entities) void
ReportingTurnsResponse.setEntities
(List<ReportingTurn> entities)


Diet Watchers
Diet Watchers is a front end app that helps users be health conscious when cooking. Using 3rd party APIs, it finds ingredient nutrition facts and also searches for tasty recipes including those ingredients. Random food facts, just for fun!


I enjoy functional programming and helping others find their love of it too. I also ride motorcycles and make pie crusts from scratch. Expect dad jokes and taking care of business every day.
I'm a strong engineer with a decade of experience in the telecom industry. I'm extremely optimistic about the future of technology. I feel like it just gets better, easier and more powerful every year.
Quiz yourself with questions randomly selected from the last few years of the show. Written in Elixir with a React frontend. The frontend was a bit of an afterthought, but there are a lot more features I would like to add in the future.
Close ProjectA modern solution to generating unique passwords for any website from a single master password and a hint based on the website url. Built as a firefox addon, it provides a variety of password generation options, saves site tags, and has password hints so that no one can ever discover your master password.
Close ProjectThis is a pure javascript card counter. Used by the best twilight struggle players in the world and unfortunately also many of my opponents!
Close Project