We’ve all been there before, you submit a pull request and moments later you get a comment like: “Hey you should use a native function here, they are so much faster” or “You can declare this final, that way we save some processing power”.
It’s great that we as developers keep an eye on this, but how true are these thing. And are they still a thing in newer PHP versions?
To the laboratory
Time to put some of these “good practices” to the test. I’ve selected 10 speed tricks that I’ve picked up over the years and we’re going to check how relevant they still are in PHP7.2.
So how are we going to test this? I’ve set up a small project that we are going to be running natively (no Docker, no vagrant) in MacOs (version: 10.13.5). The PHP version is the latest version currently on brew (PHP 7.2.8).
The benchmark itself uses PHPBench and we are going to compare each “trick” to its standard alternative. They are separate methods that each will be ran 1000 times over 5 iterations. So that means we will run each test 5000 times grouped over 5 results. That way we can minimise deviations and extract mean results.
Sounds like fun? Let’s bust some myths.
But before we begin, please a word of warning. We are going to zoom in on these claims. Some of these results might seem pretty high but that is only because we only run very small pieces of code. The results might not be that extreme in your day to day code.
Are single quotes faster than double quotes?
Let’s start out with a classic. As single quotes are encouraged by PSR we all might be getting some small speed bonuses without knowing it. We will test with this code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
<?php
public function double(): void
{
$words = [
"Taylor Swift",
"her",
"zodiac",
"sign is",
"sagittarius",
];
}
public function single(): void
{
$words = [
'Taylor Swift',
'her',
'zodiac',
'sign is',
'sagittarius',
];
}
|
And these are the results:
1
2
3
4
5
6
|
+-----------+-------------+--------+--------+------+-----+----------+---------+---------+---------+---------+---------+--------+-------+
| benchmark | subject | groups | params | revs | its | mem_peak | best | mean | mode | worst | stdev | rstdev | diff |
+-----------+-------------+--------+--------+------+-----+----------+---------+---------+---------+---------+---------+--------+-------+
| TestBench | benchDouble | | [] | 1000 | 5 | 890,368b | 0.217μs | 0.224μs | 0.222μs | 0.235μs | 0.006μs | 2.68% | 1.00x |
| TestBench | benchSingle | | [] | 1000 | 5 | 890,368b | 0.232μs | 0.235μs | 0.233μs | 0.241μs | 0.003μs | 1.49% | 1.05x |
+-----------+-------------+--------+--------+------+-----+----------+---------+---------+---------+---------+---------+--------+-------+
|
Turns out that single quotes are about 5% slower in this test.
is Json faster than XML?
Sometimes we like to use Json or XML to setup validation or config files. Most people like to use Json over XML due to readability reasons. But is it also faster?
A quick word of warning here, we will be using the native xmlrpc_encode
en xmlrpc_decode
functions. These are very experimental and not fully implemented. We could be using packages for this, something I would certainly advice in real projects, but that would skew the results too much (as we need to load them in etc). So here is the code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
<?php
public function xml(): void
{
$words = [
'Taylor Swift',
'has 2 cats',
'Meredith and',
'Olivia',
];
$encode = xmlrpc_encode($words);
$decode = xmlrpc_decode($encode);
}
public function json(): void
{
$words = [
'Taylor Swift',
'has 2 cats',
'Meredith and',
'Olivia',
];
$encode = json_encode($words);
$decode = json_decode($encode);
}
|
And unsurprisingly here are the results:
1
2
3
4
5
6
|
+-----------+-----------+--------+--------+------+-----+----------+----------+----------+----------+----------+---------+--------+--------+
| benchmark | subject | groups | params | revs | its | mem_peak | best | mean | mode | worst | stdev | rstdev | diff |
+-----------+-----------+--------+--------+------+-----+----------+----------+----------+----------+----------+---------+--------+--------+
| TestBench | benchXml | | [] | 1000 | 5 | 890,368b | 26.991μs | 27.577μs | 27.216μs | 28.325μs | 0.534μs | 1.94% | 28.13x |
| TestBench | benchJson | | [] | 1000 | 5 | 890,368b | 0.939μs | 0.980μs | 0.959μs | 1.025μs | 0.035μs | 3.54% | 1.00x |
+-----------+-----------+--------+--------+------+-----+----------+----------+----------+----------+----------+---------+--------+--------+
|
The native experimental functions that deal with XML are way slower in our tests.
Using loads of layered objects is way slower?
This one will be a bit messy to display. We are going to new up some classes and send the parameters down 3 layers. There we execute the same function as we otherwise would.
I think we all know that the new-ing up of classes will lose us some time, but let’s see how much time we lose.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
<?php
namespace App;
class Tester
{
public function spaghetti(): void
{
for ($i = 1; $i <= 100; $i++) {
$i++;
}
}
public function lasagne(): void
{
$layers = new LayerOne();
$layers->down();
}
}
class LayerOne
{
public function down(): void
{
$layer = new LayerTwo();
$layer->down();
}
}
class LayerTwo
{
public function down(): void
{
$layer = new LayerThree();
$layer->doTheLoop();
}
}
class LayerThree
{
public function doTheLoop(): void
{
for ($i = 1; $i <= 100; $i++) {
$i++;
}
}
}
|
1
2
3
4
5
6
|
+-----------+----------------+--------+--------+------+-----+----------+---------+---------+---------+---------+---------+--------+-------+
| benchmark | subject | groups | params | revs | its | mem_peak | best | mean | mode | worst | stdev | rstdev | diff |
+-----------+----------------+--------+--------+------+-----+----------+---------+---------+---------+---------+---------+--------+-------+
| TestBench | benchSpaghetti | | [] | 1000 | 5 | 890,368b | 1.121μs | 1.161μs | 1.155μs | 1.210μs | 0.029μs | 2.46% | 1.00x |
| TestBench | benchLasagne | | [] | 1000 | 5 | 890,368b | 1.418μs | 1.448μs | 1.432μs | 1.484μs | 0.026μs | 1.78% | 1.25x |
+-----------+----------------+--------+--------+------+-----+----------+---------+---------+---------+---------+---------+--------+-------+
|
Unsurprisingly the new-ing up of classes takes some time. In this case it comes down to about 25% slower. This obviously doesn’t mean you shouldn’t be using classes anymore. Personally I will always prefer the maintainability over the speed.
Native array functions should be faster than loops right?
This is a classic. It’s said that native array functions are faster than foreach loops because they are native C functions. This is the code we will be running:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
<?php
public function native(): void
{
$words = ['i', 'am', 'not', 'shouting'];
$shouts = array_map(
function ($word) {
return strtoupper($word);
}, $words);
}
public function loop(): void
{
$words = ['i', 'am', 'not', 'shouting'];
$shouts = [];
foreach ($words as $word) {
$shouts[] = strtoupper($word);
}
}
|
I’m going to be totally honest here and say that I’ve ran this test a few times now, cause I couldn’t really believe the results:
1
2
3
4
5
6
|
+-----------+-------------+--------+--------+------+-----+----------+---------+---------+---------+---------+---------+--------+-------+
| benchmark | subject | groups | params | revs | its | mem_peak | best | mean | mode | worst | stdev | rstdev | diff |
+-----------+-------------+--------+--------+------+-----+----------+---------+---------+---------+---------+---------+--------+-------+
| TestBench | benchNative | | [] | 1000 | 5 | 890,368b | 0.817μs | 0.847μs | 0.859μs | 0.876μs | 0.022μs | 2.60% | 1.36x |
| TestBench | benchLoop | | [] | 1000 | 5 | 890,368b | 0.611μs | 0.623μs | 0.616μs | 0.647μs | 0.013μs | 2.16% | 1.00x |
+-----------+-------------+--------+--------+------+-----+----------+---------+---------+---------+---------+---------+--------+-------+
|
Turns out that in this test the array_map
method is slower than the foreach
.
This probably has something to do with the anonymous function.
$row[’id’] is 7 times faster than $row[id] ?
I’ve never heard of this one. Apparently it’s a thing:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
<?php
public function fetchByString(): void
{
$array = [
'Ariana Grande\'s',
'favourite cereal',
'is cocoa puffs',
];
$who = $array['0'];
}
public function fetchByInteger(): void
{
$array = [
'Ariana Grande\'s',
'favourite cereal',
'is cocoa puffs',
];
$who = $array[0];
}
|
Turns out it doesn’t really make a lot of difference, at least not in the 700% range.
1
2
3
4
5
6
|
+-----------+--------------+--------+--------+------+-----+----------+---------+---------+---------+---------+---------+--------+-------+
| benchmark | subject | groups | params | revs | its | mem_peak | best | mean | mode | worst | stdev | rstdev | diff |
+-----------+--------------+--------+--------+------+-----+----------+---------+---------+---------+---------+---------+--------+-------+
| TestBench | benchString | | [] | 1000 | 5 | 890,368b | 0.228μs | 0.238μs | 0.233μs | 0.248μs | 0.008μs | 3.28% | 1.02x |
| TestBench | benchInteger | | [] | 1000 | 5 | 890,368b | 0.224μs | 0.232μs | 0.234μs | 0.242μs | 0.007μs | 2.98% | 1.00x |
+-----------+--------------+--------+--------+------+-----+----------+---------+---------+---------+---------+---------+--------+-------+
|
The string fetching is even marginally slower in our test by 2%.
Are throws super expensive?
Error handling is an important part of any application, but it is said you should be a bit weary of using extensive amounts of try catch
blocks. Time to put it to the test.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
<?php
public function errorHandling(): void
{
$i = 0;
try {
while ($i <= 100) {
$i++;
}
throw new \Exception('Some sweet error handling.');
} catch (\Exception $e) {
}
}
public function noErrorHandling(): void
{
$i = 0;
while ($i <= 100) {
$i++;
}
}
|
And the results:
1
2
3
4
5
6
|
+-----------+--------------+--------+--------+------+-----+----------+---------+---------+---------+---------+---------+--------+-------+
| benchmark | subject | groups | params | revs | its | mem_peak | best | mean | mode | worst | stdev | rstdev | diff |
+-----------+--------------+--------+--------+------+-----+----------+---------+---------+---------+---------+---------+--------+-------+
| TestBench | benchError | | [] | 1000 | 5 | 890,368b | 2.056μs | 2.164μs | 2.218μs | 2.226μs | 0.075μs | 3.45% | 1.55x |
| TestBench | benchNoError | | [] | 1000 | 5 | 890,368b | 1.346μs | 1.398μs | 1.367μs | 1.455μs | 0.045μs | 3.21% | 1.00x |
+-----------+--------------+--------+--------+------+-----+----------+---------+---------+---------+---------+---------+--------+-------+
|
Unsurprisingly we lose some time on the errorHandling. But personally I would always recommend having more error handling over having less.
What is the impact of unused vars?
Most static analysis tools tends to either complain about unused vars, or straight up remove them for you.
As unused vars in your code serve no real benefit, it doesn’t really makes sense to keep them. That said, let’s take a look at the cost.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
<?php
public function unusedvars(): void
{
$var1 = "Lorde";
$var2 = "loves";
$var3 = "peanut";
$var4 = "m&ms";
$i = 0;
while ($i <= 100) {
$i++;
}
}
public function noUnusedvars(): void
{
$i = 0;
while ($i <= 100) {
$i++;
}
}
|
and the results:
1
2
3
4
5
6
|
+-----------+-------------------+--------+--------+------+-----+----------+---------+---------+---------+---------+---------+--------+-------+
| benchmark | subject | groups | params | revs | its | mem_peak | best | mean | mode | worst | stdev | rstdev | diff |
+-----------+-------------------+--------+--------+------+-----+----------+---------+---------+---------+---------+---------+--------+-------+
| TestBench | benchUnusedVars | | [] | 1000 | 5 | 890,368b | 1.444μs | 1.483μs | 1.492μs | 1.507μs | 0.023μs | 1.53% | 1.07x |
| TestBench | benchNoUnusedVars | | [] | 1000 | 5 | 890,384b | 1.317μs | 1.382μs | 1.405μs | 1.424μs | 0.040μs | 2.88% | 1.00x |
+-----------+-------------------+--------+--------+------+-----+----------+---------+---------+---------+---------+---------+--------+-------+
|
So it is about 7% in our tests. But as you probably know, there is no real reason to keep those vars around.
Magic methods are slower than regular ones?
I love to use value objects. And in those objects I normally use __toString()
to cast the object to a string. But I’ve had some remarks that you should just make them yourself to have a speed boost. Time to take a look at that.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
<?php
class Tester
{
public function magic(): void
{
$tea = new Tea();
$advice = 'I know ' . $tea;
}
public function noMagic(): void
{
$tea = new Tea();
$advice = 'I know ' . $tea->toString();
}
}
class Tea
{
public function __toString(): string
{
return 'tea water shouln\t boil';
}
public function toString(): string
{
return 'tea water shouln\t boil';
}
}
|
1
2
3
4
5
6
|
+-----------+--------------+--------+--------+------+-----+----------+---------+---------+---------+---------+---------+--------+-------+
| benchmark | subject | groups | params | revs | its | mem_peak | best | mean | mode | worst | stdev | rstdev | diff |
+-----------+--------------+--------+--------+------+-----+----------+---------+---------+---------+---------+---------+--------+-------+
| TestBench | benchMagic | | [] | 1000 | 5 | 890,368b | 0.392μs | 0.401μs | 0.404μs | 0.409μs | 0.006μs | 1.46% | 1.12x |
| TestBench | benchNoMagic | | [] | 1000 | 5 | 890,368b | 0.342μs | 0.357μs | 0.361μs | 0.370μs | 0.010μs | 2.78% | 1.00x |
+-----------+--------------+--------+--------+------+-----+----------+---------+---------+---------+---------+---------+--------+-------+
|
Turns out magic methods are indeed a tiny bit slower, at about 12% in this test.
Final classes should be faster than non final classes?
A friend of mine (the very talented Wouter Sioen) declares his classes final
on creation and only changes it when they really need to be extended.
I’m pretty sure he does that due to OOP reasons, but maybe it’s also a bit faster. That could make sense right?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
<?php
class Tester
{
public function useFinal(): void
{
$tea = new Tea();
$advice = (string) $tea;
}
public function dontUseFinal(): void
{
$coffee = new Coffee();
$advice = (string) $coffee;
}
}
final class Tea
{
public function __toString(): string
{
return 'you should drink some';
}
}
class Coffee
{
public function __toString(): string
{
return 'you should drink some';
}
}
|
Turns out it does
1
2
3
4
5
6
|
+-----------+--------------+--------+--------+------+-----+----------+---------+---------+---------+---------+---------+--------+-------+
| benchmark | subject | groups | params | revs | its | mem_peak | best | mean | mode | worst | stdev | rstdev | diff |
+-----------+--------------+--------+--------+------+-----+----------+---------+---------+---------+---------+---------+--------+-------+
| TestBench | benchFinal | | [] | 1000 | 5 | 890,368b | 0.363μs | 0.369μs | 0.365μs | 0.382μs | 0.007μs | 1.96% | 1.00x |
| TestBench | benchNoFinal | | [] | 1000 | 5 | 890,368b | 0.373μs | 0.384μs | 0.386μs | 0.392μs | 0.006μs | 1.64% | 1.04x |
+-----------+--------------+--------+--------+------+-----+----------+---------+---------+---------+---------+---------+--------+-------+
|
In our tests it is slightly faster to use final
That said, I think it a good thing to do any way.
Ok this is the last one. This has brought so many discussions in the past. Docblocks over return types, code should be self documenting, … You’ve seen the discussions before.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
<?php
public function comments(): void
{
//Katy Perry is actually a stage name, her full name is Katheryn Elizabeth Hudson.
//Perry is actually her mother’s maiden name.
//She was born October 25, 1984 in Santa Barbara, California.
//She has an older sister, Angela, and younger brother, Dan.
//Both of her parents are pastors.
$i = 0;
while ($i <= 100) {
$i++;
}
}
public function noComments(): void
{
$i = 0;
while ($i <= 100) {
$i++;
}
}
|
All of those Katy Perry facts result in:
1
2
3
4
5
6
|
+-----------+-----------------+--------+--------+------+-----+----------+---------+---------+---------+---------+---------+--------+-------+
| benchmark | subject | groups | params | revs | its | mem_peak | best | mean | mode | worst | stdev | rstdev | diff |
+-----------+-----------------+--------+--------+------+-----+----------+---------+---------+---------+---------+---------+--------+-------+
| TestBench | benchComments | | [] | 1000 | 5 | 890,368b | 1.400μs | 1.435μs | 1.422μs | 1.470μs | 0.026μs | 1.80% | 1.08x |
| TestBench | benchNoComments | | [] | 1000 | 5 | 890,368b | 1.305μs | 1.326μs | 1.318μs | 1.346μs | 0.016μs | 1.19% | 1.00x |
+-----------+-----------------+--------+--------+------+-----+----------+---------+---------+---------+---------+---------+--------+-------+
|
About these tests
Some of these tests might surprise you, some might not. That said, please don’t stare yourself blind at the results here. Speed is just one part of software development, and I personally think marginal gains don’t out weight good developer practices.
At least you left here with some fun facts about pop stars.


The Hummingbird Cam is a motion-triggered camera, featuring an ESP32-CAM development board and a passive infrared sensor.
Inspiration
Since May 2020, I have observed the hummingbirds that come to drink from the feeders set up around my house. I was able to take some decent pictures of them with a DSLR:
Photos taken with a Nikon D90 DSLR camera.
While I am able to take high-quality pictures of the hummingbirds with a normal camera, I have to wait for them to appear and manually take a photo each time. I would also sometimes startle the hummingbirds if I got too close, causing them to fly away. This is when I came up with the idea of using a motion-triggered camera. A motion-triggered camera would be able to take pictures of the hummingbirds up close without disturbing them. Products like this exist already for taking pictures of animals (trail cams), but that would take the fun out of building one.
Components
After doing some research online, I found components that would help me achieve this goal. The following section describes the devices and parts I used to build the Hummingbird Camera.
ESP32-CAM
The ESP32-CAM is a development board created specifically for use with a camera module. It uses the ESP32-S microcontroller developed by Espressif Systems. The microcontroller itself operates on 3.3V, but the development board has a built-in voltage regulator to convert a 5V input to the required 3.3V. Some of its specifications are listed below:
Detailed specifications for the ESP32-S microcontroller can be found in its datasheet.
The ESP32-CAM comes with an OV2640 camera module, a 2MP camera that supports a maximum resolution of 1632x1232. The picture settings can be modified in software, which can change the brightness, exposure, saturation, etc.
The ESP32-CAM can enter a deep-sleep state, where it only draws 20μA-150μA depending on the usage of the ULP coprocessor. The ESP32-CAM can wake up from deep sleep using an external wakeup as described on Espressif’s website.
HC-SR501 Passive Infrared Sensor
The HC-SR501 passive infrared (PIR) sensor is used to detect motion. It accepts an input voltage range from 5V to 20V and outputs a 3.3V signal when it detects motion. The time the signal is high and the detection range can be adjusted using the potentiometers on the board. The module also has two modes: single-trigger mode, where the output pulses for the set duration, or continuous mode, where the output stays high as long as it detects movement.
18650 Lithium-Ion Battery
I chose to use an 18650 battery from an old Raspberry Pi handheld project I worked on back in 2017. The one I used has a 2000mAh capacity.
Additionally, I used a modified 18650 Raspberry Pi shield from the same project, which essentially manages the power usage of the battery. It allows the battery to recharge from a 5V input and it steps up the 3.7V from the battery to a 5V output.
Crayon Box
Believe it or not, the case is actually a crayon box. I used this as the project’s enclosure because it’s small, readily available, and extremely low-cost: they’re only $1 each at the local supermarket. It’s also clear enough to take decent pictures through it while still offering some degree of protection from the elements.
I tested the water resistance of the box by placing paper inside, closing it, and putting it in the shower for a few minutes. It keeps out most of the water on its own, but some drops managed to slip in. This is mitigated by either sealing or covering the edges with each use. Covering each edge from front to back with plastic wrap and tape keeps all droplets out. The seal can also be made tighter by placing a thick tape around the edge, where the lid touches the case. The case can’t withstand being submerged for very long, so no underwater pictures.
Various Other Parts
To hold everything together, I used a solder board, female and male header pins, wires, and hot glue. A male USB cable was tucked inside and can be extended outside of the case to recharge the battery. A small switch was added to turn the device on and off. A Dremel was used to make a hole in the lid for the sensor to fit through.
I initially used zip-ties to hold the camera in place, but I cut two slots on either side of the case later on for reusable Velcro straps.
There is a header on the left side of the solder board for connecting a serial programmer, and a jumper for grounding IO-0 to put the ESP32-S into download mode. Programming the ESP32-CAM is tedious, as the jumper has to be moved back and forth when testing new code.
Note: I used a BJT circuit to pull a pin on the ESP32-CAM to ground whenever the PIR module triggered, but I later learned that I didn’t need it; the software does support wakeup from a HIGH signal. I may still be able to use the circuit for a future purpose that I’ll discuss later.
Programming
The Arduino IDE is used to program the ESP32-CAM, with an additional extension provided by Espressif. The code is written in C++. An external serial programmer is required to program the board, as it doesn’t have a USB port. The code I used for this can be found on my Github profile.
Results
The Hummingbird Cam functioned as intended when set up next to a hummingbird feeder. It sometimes triggers from the wind blowing the feeder and nearby plants around, but in most cases it captures the intended subjects. Below are some of the best photos taken so far:
There were also a couple of interesting moments captured by the camera, but they are less clear:
The Hummingbird Cam works reasonably well, but there are still a few issues to work out. The brightness and saturation in some of the photos are far too high. This seems to have the worst impact during the day, when the sun shines brightest on that side of the house. It takes better photos during the afternoon and evening. These parameters can be adjusted to an extent in software.
The case used to protect the electronics also adds a slight blue tint to the images. This can easily be corrected on a computer, but it is possible to do this on the ESP32-CAM right after taking a picture.
Future Work
I’ve looked into adding more features to the Hummingbird Cam, as it is pretty simple in its current state. Some of the features I’d like to add are listed below:
Implementing these features using only the ESP32-CAM to control all the peripherals may present an issue. Below is a schematic of the ESP32-CAM development board:
The top right-hand corner of the schematics shows the two 8-pin headers on either side of the module. Every pin is either designated for power, ground, download mode, or a signal line for the SD card and camera. If I used these pins for anything else, it would potentially interfere with using the SD card. The only pins that won’t interfere with the camera and SD card are U0TXD and U0RXD: the pins used for serial communication. Since I want to use both the SD card and the camera, I want to avoid connecting anything else to those pins, except HS2_DATA3 as the ext0 RTC wakeup pin.
I’ve contemplated adding an Arduino Nano (with some bidirectional level shifters) inside the case as a companion device. The Arduino would be able to exchange information with the ESP32-CAM using serial communication on U0TXD and U0RXD, and would consume less power than leaving WiFi or Bluetooth on.
The Arduino could also have an extra benefit: It can eliminate the need for an external programmer, since it can be programmed as one. If the BJT pull-down circuit is connected to an Arduino output at the base, and the collector output is changed to pull down IO-0 on the ESP32-CAM, the Arduino could ground the download pin on the ESP32-CAM automatically before programming.
When not being used to program the ESP32-CAM, the Arduino can be switched to a different mode to support peripherals like a small i2c display, an i2c real-time clock (RTC), some one-wire temperature sensors, and several buttons. The Arduino can read the voltage level of the battery and the output of a Hall Effect sensor using its ADC inputs. The Arduino could then communicate with the ESP32-CAM over the same serial pins it uses to program it. When not in use, the Arduino can enter deep sleep mode, similarly to the ESP32-CAM.
As of now, I think I am limited to a single GPIO pin for wakeup, since ext1 wakeup mode uses pins that aren’t exposed on this board. To get around this, I can have the Arduino send a code over serial as it triggers the wakeup and have the ESP32-CAM enter a different mode as it receives it. This would only need a few milliseconds to process, and would be sufficient to know the difference between a motion trigger wakeup and an Arduino wakeup.
The WiFi capability of the ESP32-CAM could be used to update its own internal RTC at periodic intervals or after receiving a command; however, its RTC is not very accurate and has no battery backup. It would be better in my case to use a more accurate RTC module with a small battery backup to store time information, and only update it as needed.
These proposed additions require testing to see if it will work. I already have all the parts I need to get this working, so a future post will describe how this goes.
Device Schematics
The schematics are pretty simple for this version:
Conclusion
This post has described the purpose, programming, construction, and deployment of the Hummingbird Cam. It succeeded in capturing many interesting photos of hummingbirds. I hope to improve the device so I can use it in different situations and to photograph other kinds of animals. I will make a post describing the features I add when they’re finished. Thanks for reading!


| Methods' Summary |
| getSize |
Query the size of the bitmap. |
| hasAlpha |
Query transparency status of the bitmap. |
| getScaledBitmap |
Query a scaled copy of the original bitmap.
|
| Methods' Details |
getSize
- Description
- Query the size of the bitmap.
This method queries the bitmap size in pixel.
- Returns
- the bitmap size in pixel.
|
|
hasAlpha
- Description
- Query transparency status of the bitmap.
The method checks, whether the bitmap contains any alpha
information. The same information is also available at the
XColorSpace associated with this bitmap, though
much easier to access here (the color space then has a
component flagged
ColorComponentTag::ALPHA).
- Returns
- true, if the bitmap has alpha data, or false if
not.
|
|
getScaledBitmap
- Description
- Query a scaled copy of the original bitmap.
- Parameter newSize
- Requested size of the new bitmap. Both of the two size
components must be greater than zero.
- Parameter beFast
- When set to true, this parameter advises getScaledBitmap to
use the fastest available algorithm to scale the bitmap, which
might cause visible artifacts.
- Returns
- the new scaled bitmap.
- Throws
- com::sun::star::lang::IllegalArgumentException
if the size components are outside the specified range.
- Throws
- VolatileContentDestroyedException
if the contents of a volatile bitmap have been destroyed, and
thus cannot be read to generate the scaled bitmap.
|
|
Top of Page
Copyright © 2013, The Apache Software Foundation, Licensed under the Apache License, Version 2.0. Apache, the Apache feather logo, Apache OpenOffice and OpenOffice.org are trademarks of The Apache Software Foundation. Other names may be trademarks of their respective owners.


{% load static %}
Create your free account
{% csrf_token %}
First Name:
Last Name:
UserName:
{% for message in messages %} {{message}} {% endfor %}
Email:
{% for message in messages %} {{message}} {% endfor %}
Password:
Confirm password:
{% for message in messages %} {{message}} {% endfor %}
Sign up
Already have account? Sign in
What's inside you?
Show everyone by Signing up with us.


 The Common API gets and sends information to/from a business application through an adapter. This document aims to describe how an adapter should be implemented.
Architectural overview - Common API
Information Models
The Common API consist of standardized information models that will presented as resources in the Consumer API. Each Common API can consist of one or more information models. The models are documented here https://informasjonsmodell.felleskomponent.no
Consumer API
Consumer API is where clients (applications, processes etc) access the data from the Business Application. Provider API Provider API is where the adapter feeds the Common API with data.
Adapter
The adapter is the “link” between the Common API and the Business Application. The main tasks for the adapter is: Getting data from the Business Application Mapping the data from the business application model to the Common API model Sending the mapped data to the Common API
Common API internals
The Common API has two main services:
- Cache service
- Event service
Cache Service
The cache service has the following responsibility: Store data from the business applications for all the organisations using the Common API Populate the cache Keeps track of which data has changed since the last time the cache was populated
Event service
The internals in the Common API is event based. An event is created by:
- Cache Service
- Client
When a client hits a endpoint in the Consumer API the Common API is generating an event and sends it to the Cache Service. An event from the client will never go all the way down to the adapter.
When the Cache Service need to update the cache it sends an event down to the adapter.
All events are logged at all stages.
Event flow
Provider API
The provider API is where the adapter communicates with the Common API. The adapter connects to get events from the Common API and sends back the response with the information from the business application.
The provider API makes use of SSE (Server-Sent-Events) (https://en.wikipedia.org/wiki/Server-sent_events) to send events to the adapter.
Endpoints
| Endpoint | Method | Flow# | Description |
|---|---|---|---|
| /provider/sse/:id | GET | 1 | The adapter registers on this endpoint. Id should be an UUID. If the adapter supports several orgId’s each orgId must have it’s own UUID. |
| /provider/status | POST | 3 | When the adapter receives an event it should post back a status to tell the provider if the event can be handled. |
| /provider/response | POST | 4 | This is where the adapter sends back the response. |
Authentication
The provider API is secured with OAuth2 using the Resource Owner Password Credentials Grant flow.
The Adapter is both Resource Owner and Client. See https://github.com/FINTprosjektet/fint-oauth-consumer-client-sample for an example implementation.
Error handling
The adapter must handle the following error scenarios: The event sent from the provider is not understood There is something wrong with the received event Could not communicate with the source system
All of the error situations should result in an event sent from the adapter to the provider with the status PROVIDER_REJECTED
. If the adapter has information about the error this can be added to the message field in the event-object.
Adapter skeleton
There is a skeleton as a starting point and guideline for develop a adapter. This skeleton has code for communicating with the provider api. See the readme for more information.
| Language | Link |
|---|---|
| Java | https://github.com/FINTprosjektet/fint-sse-adapter-skeleton |
| C# | https://github.com/FINTprosjektet/fint-sse-adapter-skeleton-csharp |
Information Models
The main purpose of the adapter is to map the internal business application model to the FINT information model. This includes relations between objects.
The FINT information model consist of two key elements:
Main classes which represent the resources. This can be a person, student, employee, employment, code and so on. Relations between main classes.
For more information about the FINT information model and a description of all the classes, attributes and relations one can go to https://informasjonsmodell.felleskomponent.no.
The technical implementations of the models can be found at https://github.com/FINTmodels.
Vocabulary
| Norwegian term | English term |
|---|---|
| Felleskomponent | Common API |
| Fagapplikasjon | Business application |


Prof. Udaykumar R. Yaragatti
Director, MNIT Jaipur
Prof G. K. Prabhu
President, MUJ
Prof N. N. Sharma
Pro-President, MUJ
Prof Jagannath Korody
Dean FoE, MUJ
Prof R. S. Shekhawat
Director SCIT, MUJ
Organized By:
School of Electrical, Electronics and
Communication Engineering, Manipal University Jaipur


Our Mission is to have the best and most unique nursing home on Aruba!
At our nursing home we make all of our clients feel at home, we treat them as our own parents, sons, daughters and siblings. We give them tender loving care, the best care on the Island. Be attentive, have a listening ear, be there for them 24/7.
Our team consist of qualified nurses and nurses aid's.
We've chosen people who can do the work as it should be done, people with love and patience for our clients
If you would like a quotation or would like to get in touch with us send us an email or call.


--- title: Default Collections View permalink: "/collections/" layout: page ---
{{ project.short-description }}


Main Page
|
Modules
|
Class Hierarchy
|
Alphabetical List
|
Compound List
|
File List
|
Compound Members
Errors handling
Modules
Exceptions
[NOHEADER]
enum
cinfodb::error
{
cinfodb::err_no
= 0,
cinfodb::err_read
,
cinfodb::err_write
,
cinfodb::err_noent
}
Codes returned by functions.
More...
Enumeration Type Documentation
enum
cinfodb::error
[inherited]
Codes returned by functions.
Enumeration values:
err_no
no error
err_read
can't read from database
err_write
can't write to database
err_noent
entry not found
Definition at line
53
of file
cinfodb.h
.
Generated on Thu Dec 25 13:37:24 2003 for vqwww: hosting by
1.3.3


PPTP web page does not need stylesheet support.
If you wish🤟 the stylesheet site, plz go to WAVI Site.


Wolves chief scout responds to Milan enforcer rumours; talks Cutrone
Wolves’ chief scout John Marshall has responded to the rumours the midland club may go in for a midfield target they were heavily linked with over the summer, and has opened up on the slow start experienced by star striker signing Patrick Cutrone.
With a Europa League campaign to juggle, Nuno Espirito Santo elected to bring in promising Italian attacker Patrick Cutrone to offer stern competition for Raul Jimenez in the number nine position.
The 21-year-old has made 19 appearances so far for the club but starts have been in short supply for the Italian international.
Speaking to TMW at the Wyscout Forum in Amsterdam (via MilanNews.it)
“He’s doing exactly what we expected,” said Marshall.
“He is settling well, the competition is strong but he is giving his contribution. He has everything to become more and more of a protagonist in our eyes.
“And besides, he is a player much loved by the fans. On the field he always gives everything, we are happy with him.”
Wolves were persistently linked with another Milan player during the summer – Franck Kessie.
The Ivory Coast international’s slide down the pecking order this campaign at the San Siro had been predicted, leading to mass speculation a move to Molineux could materialise.
On the Kessie links over the summer, Marshall added: “There was an interest, but there was never a real negotiation.
“January bid? I don’t think so, we have so many players in midfield.”


So people can recognize you and type something like '@merituser' instead of address.
{{formData.aliasValidationError}}


Argentina's Renewable Energy Potential
Abogados inHouse
In this article, I explain how distributed generation of renewable energy can help overcome Argentina's energy crisis by leveraging private investment. I calculated installed capacities and generation factors using data from the CIA World Factbook and using formulas taken from a course in renewable energy at the University of Florida.


Gecode::Set::BndSet Class Reference
Inherited by
Gecode::Set::GLBndSet, and
Gecode::Set::LUBndSet.
List of all members.
Detailed Description
Sets of integers.
Definition at line 152 of file var-imp.icc.
|
Constructors and initialization |
| | BndSet (void) |
| | Default constructor. Creates an empty set.
|
| | BndSet (Space *home, int i, int j) |
| | Initialize as the set .
|
| | BndSet (Space *home, const IntSet &s) |
| | Initialize as the set represented by s.
|
Memory management |
| void | dispose (Space *home) |
| | Free memory used by this set.
|
Value access |
| int | min (void) const |
| | Return smallest element.
|
| int | max (void) const |
| | Return greatest element.
|
| int | minN (unsigned int n) const |
| | Return n -th smallest element.
|
| unsigned int | size (void) const |
| | Return size.
|
Tests |
| bool | empty (void) const |
| | Test whether this set is empty.
|
| bool | in (int i) const |
| | Test whether i is an element of this set.
|
Update operations |
| void | become (Space *home, const BndSet &s) |
| | Make this set equal to s.
|
Range list access for iteration |
| RangeList * | ranges (void) const |
| | Return range list for iteration.
|
Cloning |
| void | update (Space *home, BndSet &x) |
| | Update this set to be a clone of set x.
|
Public Member Functions |
| bool | isConsistent (void) const |
| | Check whether internal invariants hold.
|
Static Public Attributes |
| static const int | MAX_OF_EMPTY = Limits::min-1 |
| | Returned by empty sets when asked for their maximum element.
|
| static const int | MIN_OF_EMPTY = Limits::max+1 |
| | Returned by empty sets when asked for their minimum element.
|
Protected Member Functions |
| void | fst (RangeList *r) |
| | Set first range to r.
|
| void | lst (RangeList *r) |
| | Set last range to r.
|
| RangeList * | fst (void) const |
| | Return first range.
|
| RangeList * | lst (void) const |
| | Return last range.
|
| template<class I> |
| bool | overwrite (Space *home, I &i) |
| | Overwrite the ranges with those represented by i.
|
Protected Attributes |
| unsigned int | _size |
| | The size of this set.
|
Constructor & Destructor Documentation
| Gecode::Set::BndSet::BndSet |
( |
void |
|
) |
[inline] |
Default constructor. Creates an empty set.
Definition at line 113 of file integerset.icc.
| Gecode::Set::BndSet::BndSet |
( |
Space * |
home, |
|
|
int |
i, |
|
|
int |
j | |
|
) |
| | [inline] |
| Gecode::Set::BndSet::BndSet |
( |
Space * |
home, |
|
|
const IntSet & |
s | |
|
) |
| | |
Initialize as the set represented by s.
Definition at line 44 of file integerset.cc.
Member Function Documentation
| void Gecode::Set::BndSet::fst |
( |
RangeList * |
r |
) |
[inline, protected] |
| void Gecode::Set::BndSet::lst |
( |
RangeList * |
r |
) |
[inline, protected] |
| RangeList * Gecode::Set::BndSet::fst |
( |
void |
|
) |
const [inline, protected] |
| RangeList * Gecode::Set::BndSet::lst |
( |
void |
|
) |
const [inline, protected] |
| void Gecode::Set::BndSet::dispose |
( |
Space * |
home |
) |
[inline] |
| int Gecode::Set::BndSet::min |
( |
void |
|
) |
const [inline] |
| int Gecode::Set::BndSet::max |
( |
void |
|
) |
const [inline] |
| int Gecode::Set::BndSet::minN |
( |
unsigned int |
n |
) |
const [inline] |
| unsigned int Gecode::Set::BndSet::size |
( |
void |
|
) |
const [inline] |
| bool Gecode::Set::BndSet::empty |
( |
void |
|
) |
const [inline] |
| bool Gecode::Set::BndSet::in |
( |
int |
i |
) |
const [inline] |
| void Gecode::Set::BndSet::become |
( |
Space * |
home, |
|
|
const BndSet & |
s | |
|
) |
| | [inline] |
| RangeList * Gecode::Set::BndSet::ranges |
( |
void |
|
) |
const [inline] |
template<class I>
| bool Gecode::Set::BndSet::overwrite |
( |
Space * |
home, |
|
|
I & |
i | |
|
) |
| | [inline, protected] |
Overwrite the ranges with those represented by i.
Definition at line 218 of file integerset.icc.
| void Gecode::Set::BndSet::update |
( |
Space * |
home, |
|
|
BndSet & |
x | |
|
) |
| | [inline] |
Update this set to be a clone of set x.
Definition at line 189 of file integerset.icc.
| bool Gecode::Set::BndSet::isConsistent |
( |
void |
|
) |
const |
Check whether internal invariants hold.
Definition at line 294 of file integerset.cc.
Member Data Documentation
Returned by empty sets when asked for their maximum element.
Definition at line 171 of file var-imp.icc.
Returned by empty sets when asked for their minimum element.
Definition at line 173 of file var-imp.icc.
The documentation for this class was generated from the following files:


Police investigating after man is dropped off at hospital with gunshot wound
by Breaking News StaffDAYTON — Dayton police are investigating after a man was dropped off at Miami Valley Hospital with a potentially life-threatening gunshot wound to his left side, according to dispatch records.
The vehicle that dropped the man off left the hospital.
Records indicated that police were investigating an area near the intersection of Germantown Street and Broadway Street in relation to this shooting.
We are working to learn more, and will update this story with any new information.


Below, you can find all of the tools that are currently available via the RA API.
| Tool | Description |
|---|---|
| IP Lookup | Retrieve detailed information on an IPV4 address. |
| Username Lookup | Check hundreds of sites to see if there is an account with the specified username. |
| Discord Token Lookup | Get detailed, sensitive information from an individual's Discord authorization token. |
| VIN Lookup | Get a plethora of information about a vehicle's details using its Vehicle Identification Number |


{{ .Params.lead | safeHTML }}
Get startedProvision a new development environment for your project in less than 5 seconds.
DLX is infinitely customizable because you create the base image. Use your tools, your way.
Spin up a temporary development container to test a theory or explore a new tool. Use DLX to create long-lived containers to run services on your network too. How about a k3s cluster in 15 seconds?
The DLX client runs on macOS, Linux, and Windows. Provision your containers from where you want to work, access them anywhere on your network.
DLX is a wrapper for LXD, a battle tested container manager.
Your containers work like virtual machines. Use systemd, install mysql, use Docker.


Introduction
This is a style guide to help in formatting Markdown content for the site. In general, I’ve tried to adhere to GitHub style, with the intention that anything that renders on GitHub will render here as well. The following isn’t meant to be exhaustive, just a reminder of what’s possible with Markdown.
Headings
# Heading 1
## Heading 2
### Heading 3
#### Heading 4
##### Heading 5
###### Heading 6
Heading 1
Heading 2
Heading 3
Heading 4
Heading 5
Heading 6
Text styling
Italicize text by surrounding it in *asterisks* or _underscores_.
Bold text by surrounding it with **double asterisks** or __double underscores__.
Combine with **_double asterisks plus underscores_**.
Strike-through text with ~~double tildes~~.
Superscript contiguous text with carrots like x^2y, surround with parentheses for more complex expressions like x^(2y + 3z).
Italicize text by surrounding it in asterisks or underscores.
Bold text by surrounding it with double asterisks or double underscores.
Combine with double asterisks plus underscores.
Strike-through text with double tildes.
Superscript contiguous text with carrots like x^2y, surround with parentheses for more complex expressions like x^(2y + 3z).
Lists
* Thing one with an asterisk
+ Thing two with a plus
- Thing three with a minus
1. The first order of business
2. The second order of business
* The first part of the 2nd order
* The second part of the 2nd order
3. The third order of business
- Thing one with an asterisk
- Thing two with a plus
- Thing three with a minus
- The first order of business
- The second order of business
- The first part of the 2nd order
- The second part of the 2nd order
- The third order of business
Links
[This is an external link to Google](http://www.google.com/)
[This is a relative link to elsewhere in the site](/projects/)
This is an external link to Google
This is a relative link to elsewhere in the site
Images
Images work like links, but with a prefaced !. This supports SVG as well PNG, JPG, etc…
![](/images/papers/bedford-canalization.png)
![An image with alt text](/images/papers/bedford-global-migration.png)
![](/images/logo.svg)
Can always drop in HTML, so sizing adjustments can be done with:
<img style="width:30px;" src="/images/logo.svg"/>
Code
A bit of inline monospaced font can be made `by surrounding text with backticks`.
A bit of inline monospaced font can be made by surrounding text with backticks
.
Larger code blocks can be made by surrounding the block with three backticks ```
, and code can be highlighted by specifying language after the backticks, like so:
```javascript
var s = "JavaScript syntax highlighting";
alert(s);
```
```ruby
s = "Ruby syntax highlighting";
puts s
```
var s = "JavaScript syntax highlighting";
alert(s);
s = "Ruby syntax highlighting";
puts s
Tables
column A | column B | column C | column D
-------- | -------- | -------- | --------
1A | 1B | 1C | 1D
2A | 2B | 2C | 2D
3A | 3B | 3C | 3D
| column A | column B | column C | column D |
|---|---|---|---|
| 1A | 1B | 1C | 1D |
| 2A | 2B | 2C | 2D |
| 3A | 3B | 3C | 3D |
Blockquotes
> The data we have is not the data we want, and the data we need is not the data we have.
The data we have is not the data we want, and the data we need is not the data we have.
Horizontal rule
Use three of more hyphens, asterisks or underscores.
***
---
___
Line breaks
Here's a line for us to start with.
This line is separated by two newlines, so it will be a separate paragraph.
This line is also a separate paragraph, though...
Adding a single line break does not create a new paragraph.
Here’s a line for us to start with.
This line is separated by two newlines, so it will be a separate paragraph.
This line is also a separate paragraph, though… Adding a single line break does not create a new paragraph.


msvcore process state
Process state have process info.
Class
You have use msvcorestate for access to process state.
Call msvcoremain(args, arg); for initialize class values.
Class values
unsigned int procupped; // The start time of the process. Unit time.
MString[BAD LINK] winpath; // Windows home path. (Windows only).
MString procpath; // Process file path.
MString thispath; // Curent path.
ILink[BAD LINK] link; // Curerent path in ILink.
Example
printf("This path: %s.\r\n", msvcorestate.thispath);


Laravel Valet
- Introduction
- Installation
- Serving Sites
- Sharing Sites
- Site Specific Environment Variables
- Custom Valet Drivers
- Other Valet Commands
Introduction
Valet is a Laravel development environment for Mac minimalists. No Vagrant, no /etc/hosts
file. You can even share your sites publicly using local tunnels. Yeah, we like it too.
Laravel Valet configures your Mac to always run Nginx in the background when your machine starts. Then, using DnsMasq, Valet proxies all requests on the *.test
domain to point to sites installed on your local machine.
In other words, a blazing fast Laravel development environment that uses roughly 7 MB of RAM. Valet isn't a complete replacement for Vagrant or Homestead, but provides a great alternative if you want flexible basics, prefer extreme speed, or are working on a machine with a limited amount of RAM.
Out of the box, Valet support includes, but is not limited to:
However, you may extend Valet with your own custom drivers.
Valet Or Homestead
As you may know, Laravel offers Homestead, another local Laravel development environment. Homestead and Valet differ in regards to their intended audience and their approach to local development. Homestead offers an entire Ubuntu virtual machine with automated Nginx configuration. Homestead is a wonderful choice if you want a fully virtualized Linux development environment or are on Windows / Linux.
Valet only supports Mac, and requires you to install PHP and a database server directly onto your local machine. This is easily achieved by using Homebrew with commands like brew install php
and brew install mysql
. Valet provides a blazing fast local development environment with minimal resource consumption, so it's great for developers who only require PHP / MySQL and do not need a fully virtualized development environment.
Both Valet and Homestead are great choices for configuring your Laravel development environment. Which one you choose will depend on your personal taste and your team's needs.
Installation
Valet requires macOS and Homebrew. Before installation, you should make sure that no other programs such as Apache or Nginx are binding to your local machine's port 80.
- Install or update Homebrew to the latest version using
brew update
. - Install PHP 7.3 using Homebrew via
brew install php
. - Install Composer.
- Install Valet with Composer via
composer global require laravel/valet
. Make sure the~/.composer/vendor/bin
directory is in your system's "PATH". - Run the
valet install
command. This will configure and install Valet and DnsMasq, and register Valet's daemon to launch when your system starts.
Once Valet is installed, try pinging any *.test
domain on your terminal using a command such as ping foobar.test
. If Valet is installed correctly you should see this domain responding on <IP_ADDRESS>
.
Valet will automatically start its daemon each time your machine boots. There is no need to run valet start
or valet install
ever again once the initial Valet installation is complete.
Using Another Domain
By default, Valet serves your projects using the .test
TLD. If you'd like to use another domain, you can do so using the valet tld tld-name
command.
For example, if you'd like to use .app
instead of .test
, run valet tld app
and Valet will start serving your projects at *.app
automatically.
Database
If you need a database, try MySQL by running brew install<EMAIL_ADDRESS>on your command line. Once MySQL has been installed, you may start it using the brew services start<EMAIL_ADDRESS>command. You can then connect to the database at <IP_ADDRESS>
using the root
username and an empty string for the password.
PHP Versions
Valet allows you to switch PHP versions using the valet use php@version
command. Valet will install the specified PHP version via Brew if it is not already installed:
valet use<EMAIL_ADDRESS>valet use php
Upgrading
You may update your Valet installation using the composer global update
command in your terminal. After upgrading, it is good practice to run the valet install
command so Valet can make additional upgrades to your configuration files if necessary.
Upgrading To Valet 2.0
Valet 2.0 transitions Valet's underlying web server from Caddy to Nginx. Before upgrading to this version you should run the following commands to stop and uninstall the existing Caddy daemon:
valet stop
valet uninstall
Next, you should upgrade to the latest version of Valet. Depending on how you installed Valet, this is typically done through Git or Composer. If you installed Valet via Composer, you should use the following command to update to the latest major version:
composer global require laravel/valet
Once the fresh Valet source code has been downloaded, you should run the install
command:
valet install
valet restart
After upgrading, it may be necessary to re-park or re-link your sites.
Serving Sites
Once Valet is installed, you're ready to start serving sites. Valet provides two commands to help you serve your Laravel sites: park
and link
.
- Create a new directory on your Mac by running something like
mkdir ~/Sites
. Next,cd ~/Sites
and runvalet park
. This command will register your current working directory as a path that Valet should search for sites. - Next, create a new Laravel site within this directory:
laravel new blog
. - Open
http://blog.test
in your browser.
That's all there is to it. Now, any Laravel project you create within your "parked" directory will automatically be served using the http://folder-name.test
convention.
The link
command may also be used to serve your Laravel sites. This command is useful if you want to serve a single site in a directory and not the entire directory.
- To use the command, navigate to one of your projects and run
valet link app-name
in your terminal. Valet will create a symbolic link in~/.config/valet/Sites
which points to your current working directory. - After running the
link
command, you can access the site in your browser athttp://app-name.test
.
To see a listing of all of your linked directories, run the valet links
command. You may use valet unlink app-name
to destroy the symbolic link.
{tip} You can use
valet link
to serve the same project from multiple (sub)domains. To add a subdomain or another domain to your project runvalet link subdomain.app-name
from the project folder.
By default, Valet serves sites over plain HTTP. However, if you would like to serve a site over encrypted TLS using HTTP/2, use the secure
command. For example, if your site is being served by Valet on the laravel.test
domain, you should run the following command to secure it:
valet secure laravel
To "unsecure" a site and revert back to serving its traffic over plain HTTP, use the unsecure
command. Like the secure
command, this command accepts the host name that you wish to unsecure:
valet unsecure laravel
Sharing Sites
Valet even includes a command to share your local sites with the world. No additional software installation is required once Valet is installed.
To share a site, navigate to the site's directory in your terminal and run the valet share
command.  That's it.
To stop sharing your site, hit Control + C
to cancel the process.
Site Specific Environment Variables
Some applications using other frameworks may depend on server environment variables but do not provide a way for those variables to be configured within your project. Valet allows you to configure site specific environment variables by adding a .valet-env.php
file within the root of your project. These variables will be added to the $_SERVER
global array:
<?php
return [
'WEBSITE_NAME' => 'My Blog',
];
Custom Valet Drivers
You can write your own Valet "driver" to serve PHP applications running on another framework or CMS that is not natively supported by Valet. When you install Valet, a ~/.config/valet/Drivers
directory is created which contains a SampleValetDriver.php
file. This file contains a sample driver implementation to demonstrate how to write a custom driver. Writing a driver only requires you to implement three methods: serves
, isStaticFile
, and frontControllerPath
.
All three methods receive the $sitePath
, $siteName
, and $uri
values as their arguments. The $sitePath
is the fully qualified path to the site being served on your machine, such as /Users/Lisa/Sites/my-project
. The $siteName
is the "host" / "site name" portion of the domain (my-project
). The $uri
is the incoming request URI (/foo/bar
).
Once you have completed your custom Valet driver, place it in the ~/.config/valet/Drivers
directory using the FrameworkValetDriver.php
naming convention. For example, if you are writing a custom valet driver for WordPress, your file name should be WordPressValetDriver.php
.
Let's take a look at a sample implementation of each method your custom Valet driver should implement.
The serves
Method
The serves
method should return true
if your driver should handle the incoming request. Otherwise, the method should return false
. So, within this method you should attempt to determine if the given $sitePath
contains a project of the type you are trying to serve.
For example, let's pretend we are writing a WordPressValetDriver
. Our serves
method might look something like this:
/**
* Determine if the driver serves the request.
*
* @param string $sitePath
* @param string $siteName
* @param string $uri
* @return bool
*/
public function serves($sitePath, $siteName, $uri)
{
return is_dir($sitePath.'/wp-admin');
}
The isStaticFile
Method
The isStaticFile
should determine if the incoming request is for a file that is "static", such as an image or a stylesheet. If the file is static, the method should return the fully qualified path to the static file on disk. If the incoming request is not for a static file, the method should return false
:
/**
* Determine if the incoming request is for a static file.
*
* @param string $sitePath
* @param string $siteName
* @param string $uri
* @return string|false
*/
public function isStaticFile($sitePath, $siteName, $uri)
{
if (file_exists($staticFilePath = $sitePath.'/public/'.$uri)) {
return $staticFilePath;
}
return false;
}
{note} The
isStaticFile
method will only be called if theserves
method returnstrue
for the incoming request and the request URI is not/
.
The frontControllerPath
Method
The frontControllerPath
method should return the fully qualified path to your application's "front controller", which is typically your "index.php" file or equivalent:
/**
* Get the fully resolved path to the application's front controller.
*
* @param string $sitePath
* @param string $siteName
* @param string $uri
* @return string
*/
public function frontControllerPath($sitePath, $siteName, $uri)
{
return $sitePath.'/public/index.php';
}
Local Drivers
If you would like to define a custom Valet driver for a single application, create a LocalValetDriver.php
in the application's root directory. Your custom driver may extend the base ValetDriver
class or extend an existing application specific driver such as the LaravelValetDriver
:
class LocalValetDriver extends LaravelValetDriver
{
/**
* Determine if the driver serves the request.
*
* @param string $sitePath
* @param string $siteName
* @param string $uri
* @return bool
*/
public function serves($sitePath, $siteName, $uri)
{
return true;
}
/**
* Get the fully resolved path to the application's front controller.
*
* @param string $sitePath
* @param string $siteName
* @param string $uri
* @return string
*/
public function frontControllerPath($sitePath, $siteName, $uri)
{
return $sitePath.'/public_html/index.php';
}
}
Other Valet Commands
| Command | Description |
|---|---|
valet forget |
Run this command from a "parked" directory to remove it from the parked directory list. |
valet paths |
View all of your "parked" paths. |
valet restart |
Restart the Valet daemon. |
valet start |
Start the Valet daemon. |
valet stop |
Stop the Valet daemon. |
valet uninstall |
Uninstall the Valet daemon entirely. |


--- layout: post title: Building a horizontal JMS Bridge between two WildFly Servers using ActiveMQ Artemis date: '2016-11-18T06:28:00.001-08:00' author: Bennet Schulz tags: - JMS - WildFly - ActiveMQ modified_time: '2016-11-18T06:28:23.366-08:00' thumbnail: https://2.bp.blogspot.com/-zNAr0O3xzpU/VK-dALeLNhI/AAAAAAAAACQ/8EDW0gv0Srk/s72-c/wildfly_logo_stacked_600px.png blogger_id: tag:blogger.com,1999:blog-3189340956761677857.post-1364193161745190813 blogger_orig_url: http://www.bennet-schulz.com/2016/11/building--horizontal-jms-bridge-between-wildfly-servers.html permalink: /:year/:month/:title.html ---
Sometimes it's necessary to connect different Message Brokers together. In Enterprise Messaging this scenario is known as Bridging. It can be done with JMS and different protocols like AMQP, ActiveMQ Artemis core protocol. This blogpost focusses on Bridging with JMS and two Apache ActiveMQ Artemis Brokers running which are running in WildFly.
JMS Bridges typically are used to connect Queues and Topics on different brokers or servers.
The Bridge forwards messages from a source to a target broker whereas both brokers do not have to be in the same
cluster.
That makes bridging suitable for reliably sending messages from one cluster to another, for instance across a WAN,
and where the connection may be unreliable.
It can also be used for horizontal scaling of Message Brokers like HiveMQ does.
There are two different deployment scenarios. In this blogpost I am configuring the Bridge inside a WildFly by using the source Broker. It's also possibile to use an additional ActiveMQ Broker as Bridge which would located in the middle of both Brokers.
The previous picture shows the scenario we want to configure.
As you can see we need to configure a Queue on the source Broker, a Queue on the target Broker and we need some
configuration to connect both Queues.
Note: I didn't find a better image for devices. Therefore I chose the iPhone image. Feel free to
visualize something else ;-)
In the first step you have to download and unzip a
WildFly server two times for source and target as you can see in the previous picture.
In the next step you have to configure the standalone-full.xml
of your source
WildFly which is located in the standalone/configuration
folder of WildFly.
After opening the XML file you have to add a Source Queue to the Source Broker by adding the following snippet to
the
standalone-full.xml:
This snippet creates a new JMS Queue with name JMSBridgeSourceQueue.
In the next step you have to configure the Bridge.
A Bridge has got lots of configuration options like max-batch-time, max-retries and so on.
This isn't part of this post.
The next more important configurations to get the Bridge up and running are the source tag which points to the
formerly created jms-queue and the target tag which contains configurations for the target queue of the destination
broker.
As you can see the target broker needs a authentication.
Therefore you need to create a Application User on the target Broker.
After configuring the source Broker you have to configure the target one.
As described before the JMS Bridge requires an Application User which has to be added on the destination Broker and
referenced in the source Broker
standalone-full.xml
file.
This Application User can be created by using the add-user.sh
script which is located in the bin
folder.
In the last step you also have to configure the standalone-full.xml
file of the target Broker.
You have to create a JMS Queue with the same name as the destination of the soure Brokers Bridge configuration.
That's it.
In the last step you can start both servers and check the logfiles.
The Bridge is up and running if both WildFlies start sucessfully without any errors.
./standalone.sh -Djboss.socket.binding.port-offset=100 -c standalone-full.xml
./standalone.sh -c standalone-full.xml
A JMS Bridge can be configured with lots of properties. Quality of service, max-batch-time and max-batch-size max-retries and a failure-retry-interval.
Have fun with your JMS Bridge!


This task is part of a research study being conducted by the Teachable AI Lab at Drexel University. The purpose of the research is to better understand how best to structure the interactions between a human and an Artificial Intelligence (AI) system when either the human or the AI is trying to teach the other something new.
During this experiment, which we expect to take approximately 30 minutes, you will be asked to either teach an agent (AI system or another human) to perform a range of tasks or the agent will assume the role of the teacher and try and provide you with guidance on the same tasks. These interactions will take place through a web-based simulation environment and a web-based user interface.
Participation in this study is limited to individuals age 18 and older and fluent in English.
Additionally, all participants are required to have a modern web browser, such as Chrome, Safari, Edge, or Firefox, with WebGl support enabled (a requirement for using the web-based simulation).
The risks and discomfort associated with participation in this study are no greater than those ordinarily encountered in daily life or during other online activities.
There may be no personal benefit from your participation in the study but the knowledge received may be of value to humanity.
For participating in this task, you will be paid $3.625 directly through Mechanical Turk.
Additionally, there is an opportunity to receive a bonus on this task based on your performance as either a teacher or student. If you are randomly assigned the role of a teacher, then your bonus will be based on the performance of the agent you teach on a pre-determined set of test tasks at the end of training (the test score will vary from 0 to 100 percent).
Similarly, if you're randomly assigned the role of a student, then your bonus will be based on your performance on a pre-determined set of test tasks after the agent provides you with training.
A maximum bounus of $2 will be awarded for a perfect score on the test tasks and the bonus will be prorated for scores less than 100% (i.e., bonus = $2 * test score).
There will be no cost to you if you participate in this study.
The data captured for the research does not include any personally identifiable information about you. Your IP address and Worker ID will not be captured and stored.
By participating in this research, you understand and agree that Teachable AI Lab at Drexel University may be required to disclose your consent form, data and other personally identifiable information as required by law, regulation, subpoena or court order. Otherwise, your confidentiality will be maintained in the following manner:
Finally, by participating, you understand and agree that the data and information gathered during this study may be used by Teachable AI Lab and published and/or disclosed by Teachable AI Lab to others outside of Teachable AI Lab. However, your name, address, contact information and other direct personal identifiers in your consent form will not be mentioned in any such publication or dissemination of the research data and/or results by Teachable AI Lab.
If you have any questions about this study, you should feel free to ask them by contacting the Principal Investigator now at:
Chris MacLellan, PhD Associate Professor Drexel University Teachable AI Lab 3141 Chestnut Street, Philadelphia, PA, 19104 Phone:<PHONE_NUMBER> Email<EMAIL_ADDRESS>you have questions later, desire additional information, wish to withdraw your participation, or to report objections to this study please contact the Principle Investigator (Chris MacLellan) by mail, phone or e-mail in accordance with the contact information listed above.
Your participation in this research is voluntary. You may discontinue participation at any time during the research activity.
By accepting below you agree to to the following statements:


Account
zzy
Edit Avatar
Account Information
Full Name:
Email:
Address:
Favourite Research Area
Computer Vision
Object Recognition
Scene Understanding
Activity Recognition
Active Vision
Visual Data Mining
Natural Language Processing
Parsing
Machine translation
Speech Recognition
Context Modeling. Dialog Systems
Update


Endless Plains [ak72], plain, in Imperia, wilderness
Last updated Turn #66
Endless Plains [ak72], plain, in Imperia, wilderness
------------------------------------------------------------------------
5: Pack of wolves [fq9z], wolves, number: 12, arrived from the west.
5: Pack of wolves [ax8w], wolves, number: 8, arrived from the west.
6: Pack of wolves [do1w], wolves, number: 10, went south.
6: His Trusty Trustedness Baron Timothy of Timidia [f1y], refugee, went
6: north.
6: Horde of rats [gf6f], rats, number: 9, went north.
6: Pack of wolves [gb4e], wolves, number: 10, went north.
6: Pack of wolves [cu9d], wolves, number: 15, went west.
6: Pack of wolves [aj2j], wolves, number: 9, arrived from the north.
6: Wild men [hq5e], savages, number: 28, arrived from the east.
6: Pack of wolves [bn4r], wolves, number: 9, arrived from the west.
6: Dolf [x2b], refugee, with one riding horse, arrived from the south.
6: Pack of wolves [fm4l], wolves, number: 7, arrived from the south.
6: Pack of wolves [bf0y], wolves, number: 9, arrived from the west.
6: Pack of wolves [fo2j], wolves, number: 9, arrived from the east.
7: Band of thieves [hs7v], bandits, number: 58, went east.
7: Pack of wolves [fq9z], wolves, number: 12, went east.
7: Pack of wolves [ax8w], wolves, number: 8, went east.
7: Pack of wolves [ho2a], wolves, number: 8, arrived from the south.
8: Pack of wolves [aj2j], wolves, number: 9, went south.
8: Wild men [hq5e], savages, number: 28, went west.
8: Pack of wolves [bn4r], wolves, number: 9, went east.
8: Dolf [x2b], refugee, with one riding horse, went west.
8: Pack of wolves [fm4l], wolves, number: 7, went north.
8: Pack of wolves [bf0y], wolves, number: 9, went east.
8: Pack of wolves [fo2j], wolves, number: 9, went west.
8: Pack of wolves [gh9s], wolves, number: 8, arrived from the west.
8: Pack of wolves [gp7o], wolves, number: 11, arrived from the west.
9: Pack of wolves [ho2a], wolves, number: 8, went east.
9: Pack of wolves [bg0u], wolves, number: 10, arrived from the north.
9: Horde of rats [de0z], rats, number: 8, arrived from the west.
10: Pack of wolves [gh9s], wolves, number: 8, went east.
10: Pack of wolves [gp7o], wolves, number: 11, went east.
10: Pack of wolves [en4z], wolves, number: 11, arrived from the east.
10: Pack of wolves [fh1y], wolves, number: 12, arrived from the east.
11: Pack of wolves [bg0u], wolves, number: 10, went south.
11: Horde of rats [de0z], rats, number: 8, went east.
11: Pack of wolves [io5g], wolves, number: 12, arrived from the north.
11: Pack of wolves [fl5q], wolves, number: 9, arrived from the west.
11: Pack of wolves [ak9r], wolves, number: 9, arrived from the west.
12: Band of thieves [dm5m], bandits, number: 22, went west.
12: Pack of wolves [en4z], wolves, number: 11, went west.
12: Pack of wolves [fh1y], wolves, number: 12, went west.
12: Pack of wolves [et6q], wolves, number: 10, arrived from the east.
12: Jens Sen [b7a], refugee, arrived from the south.
12: Pack of wolves [gp1c], wolves, number: 13, arrived from the east.
12: Pack of wolves [hs7r], wolves, number: 11, arrived from the west.
12: Pack of wolves [ij1p], wolves, number: 12, arrived from the north.
12: Pack of wolves [hs6u], wolves, number: 8, arrived from the west.
12: Pack of wolves [gi1y], wolves, number: 11, arrived from the west.
13: Pack of wolves [io5g], wolves, number: 12, went south.
13: Pack of wolves [fl5q], wolves, number: 9, went east.
13: Pack of wolves [ak9r], wolves, number: 9, went east.
13: Pack of wolves [fn4v], wolves, number: 10, arrived from the south.
13: Pack of wolves [bd6x], wolves, number: 11, arrived from the west.
14: Pack of wolves [et6q], wolves, number: 10, went west.
14: Pack of wolves [gp1c], wolves, number: 13, went west.
14: Pack of wolves [hs7r], wolves, number: 11, went east.
14: Pack of wolves [ij1p], wolves, number: 12, went south.
14: Pack of wolves [hs6u], wolves, number: 8, went east.
14: Pack of wolves [gi1y], wolves, number: 11, went east.
14: Pack of wolves [gb4e], wolves, number: 10, arrived from the north.
14: Pack of wolves [hz9e], wolves, number: 11, arrived from the west.
15: Jens Sen [b7a], refugee, went north.
15: Pack of wolves [fn4v], wolves, number: 10, went north.
15: Pack of wolves [bd6x], wolves, number: 11, went east.
15: Pack of wolves [ff7s], wolves, number: 11, arrived from the east.
15: Pack of wolves [fj2j], wolves, number: 11, arrived from the west.
15: Pack of wolves [go4k], wolves, number: 10, arrived from the west.
16: Pack of wolves [gb4e], wolves, number: 10, went south.
16: Pack of wolves [hz9e], wolves, number: 11, went east.
16: Groo the Wanderer [h8g], refugee, with one peasant, one riding horse,
16: arrived from the east.
16: Savage [ch7c], savages, number: 46, arrived from the east.
16: Pack of wolves [bh9o], wolves, number: 11, arrived from the west.
16: Pack of wolves [cb7v], wolves, number: 7, arrived from the south.
16: Pack of wolves [cf0c], wolves, number: 11, arrived from the west.
17: Pack of wolves [ff7s], wolves, number: 11, went west.
17: Pack of wolves [fj2j], wolves, number: 11, went east.
17: Pack of wolves [go4k], wolves, number: 10, went east.
17: Yaron Darkhand [w0e], refugee, with one peasant, arrived from the west.
18: Pack of wolves [bh9o], wolves, number: 11, went east.
18: Pack of wolves [cb7v], wolves, number: 7, went north.
18: Pack of wolves [cf0c], wolves, number: 11, went east.
18: Horde of rats [fw2y], rats, number: 41, arrived from the west.
18: Pack of wolves [eq6k], wolves, number: 9, arrived from the west.
18: Pack of wolves [eo5m], wolves, number: 12, arrived from the south.
18: Pack of wolves [gm4s], wolves, number: 7, arrived from the east.
19: Pack of wolves [ag3s], wolves, number: 12, arrived from the east.
19: Pack of wolves [hs0k], wolves, number: 10, arrived from the west.
19: Pack of wolves [jd3d], wolves, number: 14, arrived from the south.
19: Pack of wolves [au7v], wolves, number: 11, arrived from the south.
20: Yaron Darkhand [w0e], refugee, with one peasant, went north.
20: Horde of rats [fw2y], rats, number: 41, went east.
20: Pack of wolves [eq6k], wolves, number: 9, went east.
20: Pack of wolves [eo5m], wolves, number: 12, went north.
20: Pack of wolves [gm4s], wolves, number: 7, went west.
20: Pack of wolves [bl5v], wolves, number: 11, arrived from the east.
20: Pack of wolves [ct9j], wolves, number: 15, arrived from the west.
20: Pack of wolves [cd4w], wolves, number: 12, arrived from the west.
20: Pack of wolves [iz3v], wolves, number: 11, arrived from the west.
21: Pack of wolves [ag3s], wolves, number: 12, went west.
21: Pack of wolves [hs0k], wolves, number: 10, went east.
21: Pack of wolves [jd3d], wolves, number: 14, went north.
21: Pack of wolves [au7v], wolves, number: 11, went north.
21: Ronjar [e8y], refugee, with one riding horse, arrived from the west.
21: Pack of wolves [gg9m], wolves, number: 10, arrived from the south.
21: Pack of wolves [em1j], wolves, number: 8, arrived from the east.
22: Pack of wolves [bl5v], wolves, number: 11, went west.
22: Pack of wolves [ct9j], wolves, number: 15, went east.
22: Pack of wolves [cd4w], wolves, number: 12, went south.
22: Pack of wolves [iz3v], wolves, number: 11, went east.
22: Wild men [ec3s], savages, number: 50, arrived from the east.
22: Pack of wolves [hs7r], wolves, number: 11, arrived from the east.
22: Lady Keisha the Bold, Mistress of Sadena [x7s], refugee, with
22: one peasant, one skirmisher, arrived from the west.
22: Pack of wolves [ag7u], wolves, number: 11, arrived from the south.
22: Pack of wolves [bk4r], wolves, number: 9, arrived from the west.
22: Pack of wolves [fk2l], wolves, number: 10, arrived from the south.
23: Groo the Wanderer [h8g], refugee, with one peasant, one riding horse,
23: went west.
23: Ronjar [e8y], refugee, with one riding horse, went west.
23: Pack of wolves [gg9m], wolves, number: 10, went north.
23: Pack of wolves [em1j], wolves, number: 8, went west.
23: Pasty Sycophant [u4r], refugee, arrived from the north.
23: Pack of wolves [iv1c], wolves, number: 13, arrived from the west.
23: Pack of wolves [aw2s], wolves, number: 11, arrived from the south.
23: Pack of wolves [bw2l], wolves, number: 14, arrived from the west.
23: Pack of wolves [ag2i], wolves, number: 13, arrived from the west.
23: Pack of wolves [dt8p], wolves, number: 10, arrived from the west.
24: Wild men [ec3s], savages, number: 50, went west.
24: Pack of wolves [hs7r], wolves, number: 11, went west.
24: Lady Keisha the Bold, Mistress of Sadena [x7s], refugee, with
24: one peasant, one skirmisher, went east.
24: Pack of wolves [ag7u], wolves, number: 11, went north.
24: Pack of wolves [bk4r], wolves, number: 9, went east.
24: Pack of wolves [fk2l], wolves, number: 10, went north.
24: Pack of wolves [en5z], wolves, number: 10, arrived from the west.
24: Pack of wolves [jl5w], wolves, number: 9, arrived from the west.
24: Pack of wolves [if2h], wolves, number: 11, arrived from the south.
25: Pack of wolves [iv1c], wolves, number: 13, went east.
25: Pack of wolves [aw2s], wolves, number: 11, went west.
25: Pack of wolves [bw2l], wolves, number: 14, went east.
25: Pack of wolves [ag2i], wolves, number: 13, went east.
25: Pack of wolves [dt8p], wolves, number: 10, went east.
25: Pack of wolves [cp8j], wolves, number: 12, arrived from the north.
25: Pack of wolves [id6s], wolves, number: 13, arrived from the west.
25: Pack of wolves [jl1z], wolves, number: 7, arrived from the north.
26: Savage [ch7c], savages, number: 47, went west.
26: Pack of wolves [en5z], wolves, number: 10, went east.
26: Pack of wolves [jl5w], wolves, number: 9, went east.
26: Pack of wolves [if2h], wolves, number: 11, went north.
26: Pack of wolves [bn4r], wolves, number: 9, arrived from the east.
26: Pack of wolves [dv0t], wolves, number: 10, arrived from the west.
26: Pack of wolves [im6n], wolves, number: 14, arrived from the west.
26: Pack of wolves [gl2x], wolves, number: 12, arrived from the west.
26: Pack of wolves [gr5h], wolves, number: 11, arrived from the north.
27: Pasty Sycophant [u4r], refugee, went south.
27: Pack of wolves [cp8j], wolves, number: 12, went south.
27: Pack of wolves [id6s], wolves, number: 13, went east.
27: Pack of wolves [jl1z], wolves, number: 7, went south.
27: Pack of wolves [ca2d], wolves, number: 13, arrived from the west.
27: Pack of wolves [du4f], wolves, number: 9, arrived from the west.
28: Pack of wolves [bn4r], wolves, number: 9, went west.
28: Pack of wolves [dv0t], wolves, number: 10, went east.
28: Pack of wolves [im6n], wolves, number: 14, went east.
28: Pack of wolves [gl2x], wolves, number: 12, went east.
28: Pack of wolves [gr5h], wolves, number: 11, went south.
28: Pack of wolves [fa1a], wolves, number: 12, arrived from the south.
29: Pack of wolves [ca2d], wolves, number: 13, went east.
29: Pack of wolves [du4f], wolves, number: 9, went east.
29: Pack of wolves [ii7h], wolves, number: 12, arrived from the west.
29: Pack of wolves [ck1y], wolves, number: 8, arrived from the north.
30: Pack of wolves [fa1a], wolves, number: 12, went north.
30: Savage [bf4i], savages, number: 40, arrived from the north.
30: Pack of wolves [bu4l], wolves, number: 10, arrived from the west.
30: Pack of wolves [dr4t], wolves, number: 12, arrived from the east.
30: Pack of wolves [dw6q], wolves, number: 7, arrived from the north.
Routes leaving Endless Plains:
North, plain, to Endless Plains [aj72], 7 days
East, plain, to Endless Plains [ak73], 7 days
South, plain, to Endless Plains [al72], 7 days
West, plain, to Endless Plains [ak71], 7 days
Seen here:
Savage [ch7c], savages, number: 47
Pasty Sycophant [u4r], refugee
Pack of wolves [bn4r], wolves, number: 9
Pack of wolves [dv0t], wolves, number: 10
Pack of wolves [im6n], wolves, number: 14
Pack of wolves [gl2x], wolves, number: 12
Pack of wolves [gr5h], wolves, number: 11
Pack of wolves [ca2d], wolves, number: 13
Pack of wolves [du4f], wolves, number: 9
Pack of wolves [fa1a], wolves, number: 12
Pack of wolves [ii7h], wolves, number: 12
Pack of wolves [ck1y], wolves, number: 8
Savage [bf4i], savages, number: 40
Pack of wolves [bu4l], wolves, number: 10
Pack of wolves [dr4t], wolves, number: 12
Pack of wolves [dw6q], wolves, number: 7


Ruppert Metcalfe
UI Developer
Workd Description goes here, and make it short, but concise.
Learn More
Ruppert Metcalfe
UI Developer
Workd Description goes here, and make it short, but concise.
Learn More
Ruppert Metcalfe
UI Developer
Workd Description goes here, and make it short, but concise.
Learn More
Ruppert Metcalfe
UI Developer
Workd Description goes here, and make it short, but concise.
Learn More


<pd>
The <pd>
element specifies a parameter definition within a parameter
list entry. This element is part of the DITA programming domain, a special set of DITA
elements designed to document programming tasks, concepts, and reference information.
Category: Programming elements


[gecode-users] Clockwise constraint
Malcolm Ryan
malcolmr at cse.unsw.edu.au
Tue Jun 3 11:33:23 CEST 2008
On 03/06/2008, at 6:40 PM, Guido Tack wrote:
>
>> If we kept the smallest value of b
>> between propagations the amortised cost of the computation could be
>> small.
>
> That wouldn't help, because you cannot start checking for values
> starting from that previous smallest value.
Why not? Most of the time the old value of 'b' will still be a valid
solution. If it isn't, we know that none of the smaller values are
solutions so we should be able to count upwards from there (or jump
straight to min(B), if b < min(B)). Ie, something like:
if (B.min() > A.max() && B.max() < C.min()) {
// set X = true
}
if (!B.in(b)) {
b = B.min();
}
possible = false;
lb = A.min();
ub = C.max();
max = B.max();
for (; b <= max; b++) {
if (b > lb && b < ub) {
possible = true;
break;
}
}
if (!possible) {
// set X = false
}
Wouldn't that work? Or am I making some incorrect assumptions about
the data available to propagators?
>> How would I go about adding this to Gecode/J?
>
> Unfortunately, we just found out that one important ingredient for
> reified propagators currently does not work in Gecode/J: you cannot
> return ES_SUBSUMED from a propagator (which you need in order to
> rewrite into other propagators). So I'm afraid currently the only
> option is to add the propagator in C++ and then interface it to Java.
That was what I had in mind. I remember you saying previously that the
Java Propagator class is not suitable for "real" problems.
Malcolm
More information about the gecode-users
mailing list


--- layout: post title: 'Databases & Rails: Week 1 Introduction' date: '2012-06-14T13:17:00-05:00' tags: - rails - web - postgresql - postgres - database - storage - data permalink: /post/25098659429/databases-rails-week-1-introduction ---
It’s that time of year again, I’m teaching a course at the University of Texas, though this time i’m officially an Adjunct Professor!! That means not only are students learning all about Rails, they’re getting credit for it. I’ve taken the liberty to re-record some of my material and share it. Hopefully you’ll be able to follow along at home.
This first week we focus on databases and won’t get into Rails until the second week. Skipping around is encouraged however if you don’t understand something please go back and check the previous material.
The first part of this lecture covers the format and content of the course, why we use databases, and how the web is structured around data and data storage. It’s fairly non technical, so feel free to skip if you already know how data on say Facebook gets saved when you submit a status update.
This second part of this lecture starts out by designing a fake database in a spreadsheet, explaining why a database is NOT like excel, and why we would want to use a database over methods you might be more familiar with. We then create a database in PostgreSQL, create tables, insert data, and query it. If you’re a beginner or have never manually manipulated a production quality database this video is for you.
Homework:
Watch command line basics, and then install Ruby & Rails on your system
Thanks for stopping by I’m hoping to split up the content so that you can zoom into the section you’re interested in without having to go through the whole course. As always if you have questions or comments message me @schneems


{{ track.title }}
Download on SoundCloud
{{ track.title }}
Download on SoundCloud
{{ track.title }}
Download on SoundCloud
{{ track.title }}
Download on SoundCloud
{{ track.title }}
Download on SoundCloud
{{ track.title }}
Download on SoundCloud


Amazon EMR EbsConfiguration EbsBlockDeviceConfigs
EbsBlockDeviceConfigs
is a property of the Amazon EMR EbsConfiguration property that defines the settings for the Amazon Elastic Block Store (Amazon EBS)
volumes that Amazon EMR (Amazon EMR) associates with your instances.
Syntax
JSON
{ "VolumeSpecification" :
VolumeSpecification
, "VolumesPerInstance" :Integer
}
YAML
VolumeSpecification:
VolumeSpecification
VolumesPerInstance:Integer
Properties
VolumeSpecification
-
The settings for the Amazon EBS volumes.
Required: Yes
Type: Amazon EMR EbsConfiguration EbsBlockDeviceConfig VolumeSpecification
VolumesPerInstance
-
The number of Amazon EBS volumes that you want to create for each instance in the EMR cluster or instance group. The number cannot be 0.
Required: No
Type: Integer


--- layout: stats title: Georgia Statistics permalink: "/stats/teams/georgia.html" ---
| Year | Team | Status | Finish | W-L | PPG | PAPG | Margin | TU/G | N/G | BHrd | BPts | PPB |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2016 | Georgia | UG | 27 | 5-11 | 142.5 | 203.4 | -60.9 | 6.94 | 1.38 | 111 | 1280 | 11.53 |
| Year | Round | Team | Opponent | Result | Score | 10 | -5 | PPB | Packet |
|---|---|---|---|---|---|---|---|---|---|
| 2016 | 1 (Prelims) | Georgia | Illinois A | Loss | 75 - 200 | 4 | 3 | 12.50 | Georgia Tech |
| 2016 | 2 (Prelims) | Georgia | Chicago D | Win | 190 - 135 | 7 | 0 | 17.14 | Michigan B + Chicago C + Illinois |
| 2016 | 3 (Prelims) | Georgia | WUSTL | Loss | 140 - 255 | 7 | 0 | 10.00 | MIT B + Stanford B |
| 2016 | 4 (Prelims) | Georgia | Pittsburgh | Win | 205 - 145 | 10 | 1 | 11.00 | Stanford A + Louisville |
| 2016 | 6 (Prelims) | Georgia | Michigan State | Win | 230 - 125 | 11 | 2 | 11.82 | WUSTL + Virginia |
| 2016 | 7 (Prelims) | Georgia | Maryland B | Win | 155 - 80 | 8 | 1 | 10.00 | Dartmouth + Chicago B |
| 2016 | 8 (Prelims) | Georgia | Ottawa | Win | 240 - 135 | 11 | 0 | 11.82 | Columbia A + Columbia B |
| 2016 | 9 (Prelims) | Georgia | Stanford A | Loss | 80 - 350 | 4 | 0 | 10.00 | MIT A |
| 2016 | 10 (Prelims) | Georgia | Oklahoma | Loss | 70 - 265 | 4 | 2 | 10.00 | Michigan A |
| 2016 | 11 (Prelims) | Georgia | Columbia A | Loss | 110 - 320 | 5 | 2 | 14.00 | Berkeley A |
| 2016 | 13 (Playoffs) | Georgia | Chicago B | Loss | 90 - 265 | 5 | 2 | 10.00 | Editors 1 |
| 2016 | 14 (Playoffs) | Georgia | Northwestern | Loss | 165 - 190 | 9 | 1 | 8.89 | Editors 2 |
| 2016 | 15 (Playoffs) | Georgia | Princeton | Loss | 145 - 155 | 7 | 3 | 12.86 | VCU + Virginia + Oxford |
| 2016 | 16 (Playoffs) | Georgia | Georgia Tech | Loss | 120 - 210 | 6 | 2 | 11.67 | Editors 3 |
| 2016 | 17 (Playoffs) | Georgia | McGill | Loss | 150 - 185 | 7 | 2 | 12.86 | Editors 4 |
| 2016 | 18 (Playoffs) | Georgia | Harvard A | Loss | 115 - 240 | 6 | 1 | 10.00 | Editors 5 |
| Year | Team | Player | Games | Tossups | Negs | Pts | PPG |
|---|---|---|---|---|---|---|---|
| 2016 | Georgia | Jason Fern | 16 | 71 | 10 | 660 | 41.25 |
| 2016 | Georgia | Kailyn LaPorte | 16 | 13 | 0 | 130 | 8.12 |
| 2016 | Georgia | Evan Knox | 16 | 15 | 9 | 105 | 6.56 |
| 2016 | Georgia | Julia Tallant | 16 | 12 | 3 | 105 | 6.56 |


app
/
cz.palda97.lpclient.model.repository
/
PipelineRepository
/
resetUploadStatus
resetUploadStatus
fun
resetUploadStatus
(
)
:
Unit
Sets
liveUploadStatus
to
NEUTRAL
.


Do you have any questions? Please do not hesitate to contact me directly. I will come back to you within a matter of hours to assist you.
Houston, TX 77054, USA
830-352-7507
iescan4@gmail.com


|
Figure 1
|
Flow diagram of study selection process. |
|
Figure 2
|
Published entry and exit screening measures in response to S ... |
|
Figure 3
|
Published entry screening measures in response to Influenza ... |
|
Figure 4
|
Published entry and exit screening measures in response to E ... |


Family mood at the museum. Tag yourself.
4/9/2022, 10:07:39 AM
Favs: 4
Retweets: 0
link--- layout: tweet ---
Family mood at the museum. Tag yourself.
4/9/2022, 10:07:39 AM
Favs: 4
Retweets: 0
linkLower left definitely the kids every 15 minutes or so until something grabs their interest again 🤣
4/9/2022, 10:08:34 AM
Favs: 1
Retweets: 0
linkMood when kids find out there’s yet another floor.
4/9/2022, 10:09:01 AM
Favs: 2
Retweets: 0
link


A device for measuring the slope of something.
It is widely used to measure the angle of elevation/depression when finding the heights of buildings and trees


Object Property: instructionalMethod
http://purl.org/dc/terms/instructionalMethod
Annotations (7)
-
description "Instructional Method will typically include ways of presenting instructional materials or conducting instructional activities, patterns of learner-to-learner and learner-to-instructor interactions, and mechanisms by which group and individual levels of learning are measured. Instructional methods include all aspects of the instruction and learning processes from planning and implementation through evaluation and feedback." (en-us)
-
hasVersion http://dublincore.org/usage/terms/history/#instructionalMethod-002
-
issued "2005-06-13" ()
-
modified "2008-01-14" ()
-
comment "A process, used to engender knowledge, attitudes and skills, that the described resource is designed to support." (en-us)
-
isDefinedBy http://purl.org/dc/terms/
-
label "Instructional Method" (en-us)
Ranges (1)


Meiosis
Documentation
Table of Contents
01 - Introduction and Goals
02 - Initial State and Actions
03 - Streams
04 - Meiosis with Function Patches
05 - Meiosis with Mergerino
06 - Cells
07 - Views
08 - Services
09 - Nesting
10 - Preventing Re-renders
11 - The Meiosis Pattern Cheatsheet
12 - What's Next?
Meiosis
is developed by foxdonut (
Twitter
/
GitHub
) and is released under the MIT license.


College or University Name
Email
Phone Number
Check on all that apply
Enter 0 if none
Do you want Accommodation provided by the University
Rs. 200 per Registration


faceBell
press the
SPACE
key or
ENTER
key to gain access
Take Photo
Your identity was verified!
Sorry, your identity could not be verified.
Your photo is being sent to the owner for approval.


Test Automation with Kafka - Set up the AVA Test Framework
Introduction
We’re going to use AVA as our chosen test runner. AVA takes advantage of asynchronous functions and runs your tests concurrently. In addition, test files are run in parallel as separate processes, giving you even better performance and an isolated environment for each test file.
Setup
Install and setup AVA -
npx create-ava --next
.Within your directory, you should have a very basic
package.json
file now configured. This is similar to yourpom.xml
in Java, used by Maven to build the project.Create a file named
test.js
. AVA defaults to the following patternstest.js test-*.js test/**/*.js **/__tests__/**/*.js **/*.test.js
, so it will run your test file without any additional configuration.Within your test file, you need to import the test function from AVA. You can then create your first test scaffold.
import test from 'AVA; test('Your test name', t => { });
Our test framework is now ready to have Kafka integrated into.


Srinagar flea market abuzz with shoppers
Few shops were also open in areas around the commercial hub of Lal Chowk.
by PTIThe weekly flea market in Srinagar witnessed a huge rush of customers on Sunday, four days after threatening posters had enforced a shutdown in most parts of Kashmir, officials said.
Shops opened on Sunday morning at some places in the Kashmir valley, including here in civil lines areas of the city and mini buses plied, the officials said.
They said few shops were also open in areas around the commercial hub of Lal Chowk.
However, officials said, most of the shops and other business establishments were shut in downtown — the old city areas of the city here.
While there was a semblance of normalcy in the Kashmir valley over the past few weeks after about three months of protest shutdown over the abrogation of Article 370, the fresh shutdown started on Wednesday as threatening posters warning shopkeepers and public transport operators appeared at some places in the city here and elsewhere.
The police have taken note of these incidents and several such modules have been busted by arresting several persons.


How To Ask A Good Question
November 15th, 2014
Life is a continuous education. One of the major attractions to programming for me is that there is an endless amount of information to digest, and the entire tech industry is constantly evolving. There will always be something new to figure out and explore which means the career of a programmer is dependent on constantly asking questions and learning new technologies. But what differentiates a good question from a bad question?
It is important to understand how to ask good questions, because when you ask a good question (especially in an online forum) you are more likely to find someone who can answer your question, and the answer is more likely to help you out. The characteristics of a good question are:
- Be specific: Write a title that summarizes the specific problem
- Be detailed: Make it clear what you are trying to get out of the question
- Ask the right person/choose the right forum
- Google is your friend: Try to find an answer before asking your question
- Spelling, grammar, and presentation are important
Lets look at an example of a poor question from Stackoverflow.com:
How can i create an array based on the user input?
The person who asked this question is unlikely to receive a helpful answer. The first problem is that the title is not specific enough. What language is this person working in? The next problem is that the question is formatted poorly. You should introduce your problem before posting any code. The first paragraph in your question is the second thing most readers will see, so make it as engaging and informative as possible. The third major problem is the grammar and punctuation. The poster has some capitalization mistakes in the title of the question as well as in the last sentence. The poster should have had someone more comfortable with writing in english proofread his post before submitting it.
Now lets look at a an example of a good question from Stackoverflow.com:
How can you get Subclipse in Aptana to work with the newest release of Subversion?
The author of this question is very specific about what he is having difficulty with in the title of his post. He provides a very detailed description of exactly what error he is getting, why he believes it is happening, and possible solutions he has already tried. He acknowledges in his post that this may not be strictly a programming question, but justifies why he believes he may find someone in this forum who can give him an answer. His spelling and grammar are correct throughout the entire post which makes his question easier to read and understand.
Now that you have seen the difference between a good question and a bad question, what can you do to make sure you only ask good questions? The most important thing to do is to review what you have written before submitting it. Imagine you are seeing this question for the first time and ask yourself the following questions:
- Does it make sense?
- Is it clear what is being asked?
- Is it easy to read and understand?
- Did you demonstrate the problem?
- What are you trying to accomplish?
- What have you already tried?
- Did you explain how you have failed?
Following these guidelines won’t guarantee that every question you ask or post to a forum will be answered, but it does make it more likely that someone else will be able to understand and answer your question. Another side helpful side effect of going through this process is that you can sometimes figure out an answer to your own question before having to ask it.
Thanks for reading.


HOME
Refresh
Track the Frack home
SUBMIT YOUR INFORMATION
RESOURCES
Site Map
User's photo blog
Help
ABOUT US
Bios
News
Support
Media Contact
Home
LINKS
BOCOCCR-Boulder
Dangers of Fracking
Earthjustice-CO
Fractracker.org
Industry reporting
Earthworks
EPA
ExxonMobil
Sierra Club
MAPS
Local scales
Submit a site
Report generator
Refresh
Form for data submission
HERE IS SOME SPACEFILLING CONTENT
Email address
First Name
Last Name
Street Address
City
Zip Code
Please add my contact information to your notification list
Submit


From the newsletter ... |
|
The big "0"I'm involved in two celebrations in little over a fortnight. During February my "baby" is coming up for a big "0" -- her 30th birthday -- and if that makes her feel old, what do you think it does for her father? The other event happened at the end of January. St Mary's Church, Cogges, celebrated a very big "0" -- 900 years, no less. That's thirty times thirty! But that's from the date of the first written record, when the old manor became a priory as the church and house were given to the Norman abbey at Fécamp. The church was already in use by then, and probably incorporates the remains of an even earlier Saxon church. Cogges in the early 1100's was just a tiny village, where the main road to Witney from Oxford and Woodstock crossed the Windrush by a ford: it consisted of a handful of tiny, thatched wattle-and-daub cottages clustered around the priory and church, with the new, moated manor rising splendidly by the river. It feels like a different world from the Cogges we know today. Every trace of that old village has disappeared, the priory has changed beyond recognition, and the fortified manor house was demolished centuries ago to be replaced by the house at the heart of the farm museum. Only the church remains, greatly enlarged but still the same, after more than 900 years. Yet the church, old as it is, is far from a museum piece. It stands -- as it always has -- as a sign of God's presence in the world and of the enduring power of the Christian gospel to bring new life to individuals, families and communities. Visit the church any Sunday morning, and you will find, not some archaic ritual, but a place vibrantly alive, filled with people keen to know God's presence, to live in relationship with him, and to "make Christ known by word and deed." Cogges may change -- the world may change, the pace of life may change -- but we have found the secret of security and peace. It's not just 900 years old but 2000 -- "Jesus Christ is the same yesterday and today and for ever." Cogges Parish | Other articles | Feedback © 2004; Published in Cogges Parish monthly newsletter, February 2004 |