Troubleshooting a service network
Typically, you can create a service network without referencing this troubleshooting guide. However, this guide provides some tips for situations when the service network does not perform as expected.
See Resolving common problems if you have encountered a specific issue using the skupper
CLI.
A typical troubleshooting workflow is to check all the sites and create debug tar files.
Checking sites
Using the skupper
command-line interface (CLI) provides a simple method to get started with troubleshooting Skupper.
-
Check the site status:
$ skupper status --namespace west Skupper is enabled for namespace "west" in interior mode. It is connected to 2 other sites. It has 1 exposed services.
The output shows:
-
A site exists in the specified namespace.
-
A link exists to two other sites.
-
A service is exposed on the service network and is accessible from this namespace.
-
-
Check the service network:
$ skupper network status --namespace west Sites: ├─ [local] 05f8c38 - west │ URL: <IP_ADDRESS> │ mode: interior │ name: west │ namespace: west │ version: 1.0.2 │ ╰─ Services: │ ╰─ name: backend │ address: backend: 8080 │ protocol: tcp ╰─ [remote] 1537b82 - east URL: <IP_ADDRESS> name: east namespace: east sites linked to: 05f8c38-west version: 1.0.2 ╰─ Services: ╰─ name: backend address: backend: 8080 protocol: tcp ╰─ Targets: ├─ name: backend-77f8f45fc8-smckp ├─ name: backend-77f8f45fc8-gh6tp ╰─ name: backend-77f8f45fc8-m58tg
If the output is not what you expected, you might want to check links before proceeding. The output shows:
-
There are 2 sites on the service network,
east
andwest
. -
Details for each site, for example the namespace names.
-
The original services that are exposed (Targets), in this case the three backend services exposed using the
tcp
protocol. -
The services available on the service network, including the port number. For example,
backend:8080
.
-
-
Check the status of services exposed on the service network:
$ skupper service status Services exposed through Skupper: ╰─ backend (tcp port 8080) ╰─ Targets: ╰─ app=backend name=backend
The output shows the
backend
service and the related target of that service.The related targets for services are only displayed when the target is available on the current cluster. -
List the events for a site:
$ skupper debug events NAME COUNT AGE GatewayQueryRequest 3 9m12s 3 gateway request 9m12s SiteQueryRequest 3 9m12s 3 site data request 9m12s ServiceControllerEvent 9 10m24s 2 service event for west/frontend 10m24s 1 service event for west/backend 10m26s 1 Checking service for: backend 10m26s 2 Service definitions have changed 10m26s 1 service event for west/skupper-router 11m4s DefinitionMonitorEvent 15 10m24s 2 service event for west/frontend 10m24s 1 service event for west/backend 10m26s 1 Service definitions have changed 10m26s 5 deployment event for west/frontend 10m34s 1 deployment event for west/skupper-service-controller 11m4s ServiceControllerUpdateEvent 1 10m26s 1 Updating skupper-internal 10m26s ServiceSyncEvent 3 10m26s 1 Service interface(s) added backend 10m26s 1 Service sync sender connection to 11m4s amqps://skupper-router-local.west.svc.cluster.local:5671 established 1 Service sync receiver connection to 11m4s amqps://skupper-router-local.west.svc.cluster.local:5671 established IpMappingEvent 5 10m34s 1 <IP_ADDRESS> mapped to frontend-6b4688bf56-rp9hc 10m34s 2 mapped to frontend-6b4688bf56-rp9hc 10m54s 1 <IP_ADDRESS> mapped to 11m4s skupper-service-controller-6c97c5cf5d-6nzph 1 <IP_ADDRESS> mapped to skupper-router-547dffdcbf-l8pdc 11m4s TokenClaimVerification 1 10m59s 1 Claim for efe3a241-3e4f-11ed-95d0-482ae336eb38 succeeded 10m59s
The output shows sites being linked and a service being exposed on a service network. However, this output is most useful when reporting an issue and is included in the Skupper debug tar file.
Checking links
You must link sites before you can expose services on the service network.
By default, tokens expire after 5 minutes and you can only use a token once.
Generate a new token if the link is not connected.
You can also generate tokens using the -token-type cert option for permanent reusable tokens.
|
This section outlines some advanced options for checking links.
-
Check the link status:
$ skupper link status --namespace east Links created from this site: ------------------------------- Link link1 is connected
A link exists from the specified site to another site, meaning a token from another site was applied to the specified site.
Running skupper link status
on a connected site produces output only if a token was used to create a link.If you use this command on a site where you did not create the link, but there is an incoming link to the site:
$ skupper link status --namespace west Links created from this site: ------------------------------- There are no links configured or connected Currently connected links from other sites: ---------------------------------------- A link from the namespace east on site east(536695a9-26dc-4448-b207-519f56e99b71) is connected
-
Check the verbose link status:
$ skupper link status link1 --verbose --namespace east Cost: 1 Created: 2022-10-24 12:50:33 +0100 IST Name: link1 Namespace: east Site: east-536695a9-26dc-4448-b207-519f56e99b71 Status: Connected
The output shows detail about the link, including a timestamp of when the link was created and the associated relative cost of using the link.
The status of the link must be
Connected
to allow service traffic.
Checking gateways
By default, skupper gateway
creates a service type gateway and these gateways run properly after a machine restart.
However, if you create a docker or podman type gateway, check that the container is running after a machine restart. For example:
-
Check the status of Skupper gateways:
$ skupper gateway status Gateway Definition: ╰─ machine-user type:podman version:2.4.0 ╰─ Bindings: ╰─ mydb:3306 tcp mydb:3306 localhost 3306
This shows a podman type gateway.
-
Check that the container is running:
$ podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4e308ef8ee58 quay.io/skupper/skupper-router:2.4.0 /home/skrouterd/b... 26 seconds ago Up 27 seconds ago machine-user
This shows the container running.
To view stopped containers, use podman ps -a
ordocker ps -a
. -
Start the container if necessary:
$ podman start machine-user
Creating a Skupper debug tar file
The debug tar file contains all the logs from the Skupper components for a site and provides detailed information to help debug issues.
-
Create the debug tar file:
$ skupper debug dump my-site Skupper dump details written to compressed archive: `my-site.tar.gz`
-
You can expand the file using the following command:
$ tar -xvf kind-site.tar.gz k8s-versions.txt skupper-versions.txt skupper-router-deployment.yaml skupper-router-867f5ddcd8-plrcg-skstat-g.txt skupper-router-867f5ddcd8-plrcg-skstat-c.txt skupper-router-867f5ddcd8-plrcg-skstat-l.txt skupper-router-867f5ddcd8-plrcg-skstat-n.txt skupper-router-867f5ddcd8-plrcg-skstat-e.txt skupper-router-867f5ddcd8-plrcg-skstat-a.txt skupper-router-867f5ddcd8-plrcg-skstat-m.txt skupper-router-867f5ddcd8-plrcg-skstat-p.txt skupper-router-867f5ddcd8-plrcg-router-logs.txt skupper-router-867f5ddcd8-plrcg-config-sync-logs.txt skupper-service-controller-deployment.yaml skupper-service-controller-7485756984-gvrf6-events.txt skupper-service-controller-7485756984-gvrf6-service-controller-logs.txt skupper-site-configmap.yaml skupper-services-configmap.yaml skupper-internal-configmap.yaml skupper-sasl-config-configmap.yaml
These files can be used to provide support for Skupper, however some items you can check:
- versions
-
See
*versions.txt
for the versions of various components. - ingress
-
See
skupper-site-configmap.yaml
to determine theingress
type for the site. - linking and services
-
See the
skupper-service-controller-*-events.txt
file to view details of token usage and service exposure.
Improving Skupper router performance
If you encounter Skupper router performance issues, you can scale the Skupper router to address those concerns.
| Currently, you must delete and recreate a site to reconfigure the Skupper router. |
For example, use this procedure to increase throughput, and if you have many clients, latency.
-
Delete your site or create a new site in a different namespace.
Note all configuration and delete your existing site:
$ skupper delete
As an alternative, you can create a new namespace and configure a new site with optimized Skupper router performance. After validating the performance improvement, you can delete and recreate your original site.
-
Create a site with optimal performance CPU settings:
$ skupper init --router-cpu 5
-
Recreate your configuration from step 1, recreating links and services.
While you can address availability concerns by scaling the number of routers and somewhat improve performance, for example skupper init --routers 3 , typically this is not necessary.
|
Resolving common problems
The following issues and workarounds might help you debug simple scenarios when evaluating Skupper.
Cannot initialize skupper
If the skupper init
command fails, consider the following options:
-
Check the load balancer.
If you are evaluating Skupper on minikube, use the following command to create a load balancer:
$ minikube tunnel
For other Kubernetes flavors, see the documentation from your provider.
-
Initialize without ingress.
This option prevents other sites from linking to this site, but linking outwards is supported. Once a link is established, traffic can flow in either direction. Enter the following command:
$ skupper init --ingress none
See skupper init for more options.
Cannot link sites
To link two sites, one site must be accessible from the other site. For example, if one site is behind a firewall and the other site is on an AWS cluster, you must:
-
Create a token on the AWS cluster site.
-
Create the link on the site inside the firewall.
|
By default, a token is valid for only 15 minutes and can only be used once. See Using Skupper tokens for more information on creating different types of tokens. |
Cannot access Skupper console
Starting with Skupper release 1.3, the console is not enabled by default. To use the new console, which is a preview feature and may change, see Using the Skupper console.
Use skupper status
to find the console URL.
Use the following command to display the password for the admin
user:doctype: article
$ kubectl get secret/skupper-console-users -o jsonpath={.data.admin} | base64 -d
Cannot create a token for linking clusters
There are several reasons why you might have difficulty creating tokens:
- Site not ready
-
After creating a site, you might see the following message when creating a token:
Error: Failed to create token: Policy validation error: Skupper is not enabled in namespace
Use
skupper status
to verify the site is working and try to create the token again. - No ingress
-
You might see the following note after using the
skupper token create
command:Token written to <path> (Note: token will only be valid for local cluster)
This output indicates that the site was deployed without an ingress option. For example
skupper init --ingress none
. You must specify an ingress to allow sites on other clusters to link to your site.You can also use the
skupper token create
command to check if an ingress was specified when the site was created.


Exodus 39:31
And they tied unto it a lace of blue, to fasten it on high upon the mitre; as the LORD commanded Moses.


--- layout: listing title: Publications & Talks poster: redwoods --- {% assign pubs = site.publications | sort: 'date' | reverse %} {% for post in pubs %}
{% for tg in post.tags %} {{ tg }} {% endfor %}


A ProMash Recipe Report
In looking through my archived email I realized that many of my old ProMash recipes that I thought were lost to time and changing computers live on.
A blog is a better place for these recipes to live—that’s why this post is here.
Pumpkin Beer
A ProMash Recipe Report
BJCP Style and Style Guidelines
-------------------------------
21-A Spice/Herb/Vegetable, Spice, Herb or Vegetable Beer
Recipe Specifics
----------------
Batch Size (L): 22.71 (6 Gallons) Wort Size (L): 22.71
Total Grain (kg): 5.78
Anticipated OG: 1.057 Plato: 13.96
Anticipated SRM: 12.6
Anticipated IBU: 19.1
Brewhouse Efficiency: 70 %
Wort Boil Time: 60 Minutes
Grain/Extract/Sugar
% Amount Name Origin Potential SRM
-----------------------------------------------------------------------------
55.0 3.18 kg. Pale Malt(2-row) Great Britain 1.038 3
17.1 0.99 kg. Vienna Malt Germany 1.037 3
8.5 0.49 kg. Munich Malt Germany 1.037 8
6.6 0.38 kg. Flaked Oats America 1.033 2
3.9 0.23 kg. Crystal 40L America 1.034 40
3.9 0.23 kg. Special B Malt Belgian 1.030 120
3.5 0.20 kg. Brown Sugar Generic 1.046 4
1.5 0.09 kg. Molasses Generic 1.036 80
Hops
Amount Name Form Alpha IBU Boil Time
-----------------------------------------------------------------------------
28.00 g. Goldings - E.K. Pellet 7.50 19.1 30 min.
Yeast
-----
White Labs WLP002 English Ale
Mash Schedule
-------------
Step Rest Start Stop Heat Infuse Infuse Infuse
Step Name Time Time Temp Temp Type Temp Amount Ratio
---------------------------------------------------------------------------------
1 5 60 154 154 Infuse 173 14.88 2.71
Total Water Qts: 15.72 - After Additional Infusions
Total Water L: 14.88 - After Additional Infusions
Total Mash Volume L: 18.55 - After Additional Infusions
All temperature measurements are degrees Fahrenheit.
All infusion amounts are in Liters.
All infusion ratios are Liters/Kilograms.
Notes
-----
4g CaCl2.H2O/5gallons of water
revitalized 2 vials WLP 002 at 8:45am day of brew
Mash Temp: 150
Mash pH: 5.38
Mash gravity: 1.085 (95% mash eff)
Preboil pH: 5.31
Preboil Gravity: 1.045 (70% eff)
88mL molassas @ 5min left in boil
200g brown sugar @ 5min left it boil
American Amber
A ProMash Recipe Report
BJCP Style and Style Guidelines
-------------------------------
10-B American Ale, American Amber Ale
Min OG: 1.045 Max OG: 1.060
Min IBU: 25 Max IBU: 48
Min Clr: 10 Max Clr: 17 Color in SRM, Lovibond
Recipe Specifics
----------------
Batch Size (L): 22.71 Wort Size (L): 22.71
Total Grain (kg): 5.68
Anticipated OG: 1.054 Plato: 13.31
Anticipated SRM: 11.9
Anticipated IBU: 89.8
Brewhouse Efficiency: 70 %
Wort Boil Time: 60 Minutes
Grain/Extract/Sugar
% Amount Name Origin Potential SRM
-----------------------------------------------------------------------------
44.0 2.50 kg. Pale Malt(2-row) Great Britain 1.038 3
32.0 1.82 kg. Vienna Malt Germany 1.037 3
8.0 0.45 kg. Crystal 75L Great Britian 1.034 75
8.0 0.45 kg. Munich Malt Germany 1.037 8
4.0 0.23 kg. CaraVienne Malt Belgium 1.034 22
4.0 0.23 kg. Flaked Oats America 1.033 2
Potential represented as SG per pound per gallon.
Hops
Amount Name Form Alpha IBU Boil Time
-----------------------------------------------------------------------------
28.00 g. Centennial Pellet 10.50 27.3 30 min.
28.00 g. Simcoe Pellet 13.00 33.7 30 min.
28.00 g. Centennial Pellet 10.50 12.9 10 min.
28.00 g. Simcoe Pellet 13.00 15.9 10 min.
28.00 g. Centennial Pellet 10.50 0.0 0 min.
28.00 g. Simcoe Pellet 13.00 0.0 0 min.
28.00 g. Centennial Pellet 10.50 0.0 Dry Hop
28.00 g. Simcoe Pellet 13.00 0.0 Dry Hop
Yeast
-----
BrewTek CL-50 California Pub Brewery Ale
Mash Schedule
-------------
Mash Name: Fix_40_60_70
Total Grain kg: 5.68
Total Water Qts: 15.00 - Before Additional Infusions
Total Water L: 14.19 - Before Additional Infusions
Tun Thermal Mass: 0.20
Grain Temp: 20.50 C
Step Rest Start Stop Heat Infuse Infuse Infuse
Step Name Time Time Temp Temp Type Temp Amount Ratio
---------------------------------------------------------------------------------
3 5 60 149 149 Infuse 168 14.19 2.50
Total Water Qts: 15.00 - After Additional Infusions
Total Water L: 14.19 - After Additional Infusions
Total Mash Volume L: 17.99 - After Additional Infusions
All temperature measurements are degrees Fahrenheit.
All infusion amounts are in Liters.
All infusion ratios are Liters/Kilograms.
APA
A ProMash Recipe Report
Recipe Specifics
----------------
Batch Size (Gal): 6.00 Wort Size (Gal): 6.00
Total Grain (Lbs): 11.38
Anticipated OG: 1.059 Plato: 14.55
Anticipated SRM: 6.3
Anticipated IBU: 39.7
Brewhouse Efficiency: 85 %
Wort Boil Time: 60 Minutes
Grain/Extract/Sugar
% Amount Name Origin Potential SRM
-----------------------------------------------------------------------------
41.8 4.75 lbs. Pale Malt(2-row) America 1.036 2
40.7 4.63 lbs. Pale Malt(2-row) Great Britain 1.038 3
4.4 0.50 lbs. Wheat Malt America 1.038 2
8.8 1.00 lbs. Munich Malt(2-row) America 1.035 6
4.4 0.50 lbs. Crystal 40L America 1.034 40
Potential represented as SG per pound per gallon.
Hops
Amount Name Form Alpha IBU Boil Time
-----------------------------------------------------------------------------
15.00 g. Columbus Pellet 15.00 26.2 60 min.
20.00 g. Centennial Pellet 10.50 8.9 10 min.
10.00 g. Willamette Pellet 5.00 2.1 10 min.
40.00 g. Centennial Pellet 10.50 2.1 1 min.
20.00 g. Willamette Pellet 5.00 0.5 1 min.
40.00 g. Centennial Pellet 10.50 0.0 Dry Hop
15.00 g. Willamette Pellet 5.00 0.0 Dry Hop
Yeast
-----
White Labs WLP002 English Ale
Water Profile
-------------
Profile: Longmont
Profile known for:
Calcium(Ca): 0.0 ppm
Magnesium(Mg): 0.0 ppm
Sodium(Na): 11.0 ppm
Sulfate(SO4): 3.0 ppm
Chloride(Cl): 2.0 ppm
biCarbonate(HCO3): 12.2 ppm
pH: 6.60
Mash Schedule
-------------
Mash Name:
Total Grain Lbs: 11.38
Total Water Qts: 16.49 - Before Additional Infusions
Total Water Gal: 4.12 - Before Additional Infusions
Tun Thermal Mass: 0.20
Grain Temp: 68.00 F
Step Rest Start Stop Heat Infuse Infuse Infuse
Step Name Time Time Temp Temp Type Temp Amount Ratio
---------------------------------------------------------------------------------
sacc 5 60 151 151 Infuse 168 16.49 1.45
Total Water Qts: 16.49 - After Additional Infusions
Total Water Gal: 4.12 - After Additional Infusions
Total Mash Volume Gal: 5.03 - After Additional Infusions
All temperature measurements are degrees Fahrenheit.
All infusion amounts are in Quarts.
All infusion ratios are Quarts/Lbs.
Notes
-----
.5tsp CaSO4 and .25tsp CaCl2 in mash
Mashed in High and then low (156 then
148 then 151ish took about 10 min to correct)
Mash pH ~5.2
.5tsp CaSO4
in Boil
Pitched active 2L starter
Complete fermentation in 3 days
dry hopped after 3 days
Let sit on dry hops 7 days swirling every other day.


{{Infobox prepared food | name = Saang mein | image = | caption = | alternate_name = | country = Hong Kong | region = Hong Kong | creator = | course = | type = Chinese noodles | served = Hot | main_ingredient = Wheat flour, tapioca flour, salt, potassium carbonate, water | variations = | calories = | other = }} {{Chinese|t=生麵|s=生面|j=saang1 min6 |p=shēngmiàn|l=raw noodle}}
Saang mein is a type of Chinese noodle found in Hong Kong. It is often available in overseas Chinatowns.
Contents |
It is made of wheat flour, tapioca flour, salt, potassium carbonate, and water.<ref>Saang mein noodle packaging from Hong Kong.</ref>
Saang mein can be cooked quickly similarly to ramen noodles. It is known for a more smooth and soapy texture. It can be eaten plain or with additional sesame oil. Vegetables such as kai-lan can be added. The noodle does have a wheat taste. It is served hot.
{{reflist}}
{{Hong Kong cuisine}} {{Cantonese cuisine}} {{Noodle}}
{{China-cuisine-stub}}


Loading
×
Item Copied!Now, click anywhere in the whiteboard to paste the item.
×
Board Cannot be Found. You will now be redirected to the dashboard page!
×
Click and drag the conatiner to clip content!
Matisse does not support shift selection use rectangle select


David Pemsel resigns as Premier League chief executive before starting role
Pemsel had been due to take up the position in February.
David Pemsel has resigned as the Premier League’s incoming chief executive following “media disclosures” about his private life.
Pemsel was due to start work in February but has now withdrawn from the role following allegations in a newspaper concerning text messages sent to a former colleague.
Richard Masters, who had been due to revert to his post as managing director, will continue as interim chief executive.
A statement from the Premier League read: “Following media disclosures earlier this week and discussions with David Pemsel, the Premier League has today accepted David’s resignation and he will no longer be joining as chief executive. No further comment will be made at this stage.”
Pemsel’s resignation has left the Premier League looking for its third boss in little more than a year, first choice Susanna Dinnage having decided to remain at media organisation Discovery.
It was only last month that the organisation announced Pemsel would join from the Guardian Media Group. It had hoped his strong broadcasting background, having also served as marketing director at ITV before moving to the Guardian, would help it continue to thrive in a changing media environment.
Chelsea chairman Bruce Buck, who was involved in the recruitment process, at the time praised the 51-year-old’s “straightforward style and personal integrity”.
When he was appointed, Pemsel, a Chelsea fan who was credited with transforming the fortunes of the Guardian and returning the group to profit in its news business for the first time in 20 years in 2019, had described himself as “thrilled” and “excited” to be joining the Premier League.
He said he was “honoured to take the helm of such an influential and prestigious organisation”.
The Premier League’s long-serving executive chairman Richard Scudamore, who drove its huge commercial success over the last 20 years, helping secure a series of lucrative domestic and overseas television deals, announced his intention to stand down as long ago as June 2018.
However, after two ill-fated appointments, the position remains embarrassingly vacant.
Dinnage, the global president of the Animal Planet channel, was the first chosen candidate last November following a global headhunting process. She stepped down less than two months later citing a change of heart, opting to return to her old post.
BBC Studios chief executive Tim Davie was in January also reported to have turned down the opportunity.
Pemsel will also not be continuing in his role at the Guardian Media Group, who confirmed the appointment of Anna Bateson as interim chief executive.
A spokesperson said: “We would like to express our gratitude to David for his leadership during an extremely important period for the organisation.”


Sinatra
A DSL for quickly creating web applications in Ruby.
Nancy
Lightweight low ceremony web application framework
get "/sayhello/{name}" do
"Hello " + {name}
end
public class HomeModule : NancyModule
{
public HomeModule()
{
Get[″/sayhello/{name}″] =
input => return ″Hello ″ + input.Name;
}
}
I believe many of us here are somewhat familiar with Sinatra ruby. What you see here is a simple Sinatra app. Run this in ruby and you have a working website. Nancy is a simple web application framework for .NET. Here you see a simple Nancy app. There is additional structure because of the static typing of C# but overall similar to Sinatra.
Nancy supports most of the rout matching that Sinatra does. Such as regular expressions, optional, default values, constraints such as integer, date time, min/max, and customized such as email.
Tweet App
Using ScriptCS
scriptcs -install ScriptCs.Nancy;
'Require<NancyPack>().Get("/",_=>"Hi").Host();'|Out-File s.x;
scriptcs s.x #dropsmike @NancyFx @scriptcsnet
Most of the time writing a Nancy app would look like what you just saw. A Visual Studio project with that NancyModule in place. However with the creation of ScriptCS it can get smaller in some uses. Briefly, ScriptCS is a scripting environment for C# and it also has a REPL environment. What you see is an entire web application in Nancy. Installing the dependencies, creating the application file, and running it. All fitting within a tweet with enough room for shout outs to Nancy and ScriptCS.
Runs just about anywhere
Uses its own Request/Response objects. Not dependent on ASP.NET
OWIN
Self Host
ASP.NET
Nginx, RaspberryPi ...
Nancy is self contained in that it doesn't depend on ASP.NET like MVC does. It can be run in many different types of hosts such as OWIN, ASP.NET and others. You can even self host it in an executable or on Linux in Mono. There is also documentation on the Nancy site to run it on RaspberryPi or Nginx.
WCF
Ewwww.
Note, WCF NOT inspired by Ruby. Because Ruby wouldn't do that.
S. D. H. P.
It Just Works
Easily Customizable
Low Ceremony
Low Friction
Super Duper Happy Path
The SDHP is an idea created in the Nancy framework that makes the development process much simpler from a .NET perspective. Most of what the SDHP does is similar to things done in Ruby. So what is the SDHP? It's the Super Duper Happy Path. This is a happy path that most of us would give up coffee for. The rest of us…drink tea.
If your class needs a dependency just define it and use it. Nancy uses dependency injection (TinyIOC by default) for all your modules and other classes. Don't want TinyIoC put in your own. Most of the well known .NET IoC projects already have Nugets ready for you to use.
Content Negotiation
Done automatically or controll it yourself
Get["/"] = p => return "Hello Jupiter!";
Get["/"] = parameters => {
return Negotiate
.WithModel(new RatPack {FirstName = "Nancy "})
.WithMediaRangeModel("text/html",
new RatPack {FirstName = "Nancy for html"})
.WithView("negotiatedview")
.WithHeader("X-Custom", "SomeValue");
};
Like in Sinatra, Nancy does content negotiation out of the box. Just pass back the data and Nancy will process it into an html page, json, or xml response depending on the requests Accept header. You can also add custom ones easily. Control the negotiation yourself if you want with the Negotiate property.
Easily Customizable
Custom Model Binding
public class CustomModelBinder
: Nancy.ModelBinding.IModelBinder
{ . . . }
Because of the SDHP customizing is very easy. Just define the class and Nancy will pick up most customizations automatically. Custom model binding for instance.
Easily Customizable
Custom View Engine
public class CustomViewEngine
: Nancy.ViewEngines.IViewEngine
{ . . . }
Super Simple
Razor
NDjango
Nustache
Spark
DotLiquid
Veil
Parrot
NHaml
HandlebarsJs
Markdown
Or custom view engines. Nancy comes with the Super Simple view engine by default. There are several NuGet packages with other view engines available for use.
Testability
Test the whole Nancy pipeline quickly with the Browser object.
public void Should_return_status_ok_when_route_exists()
{
var bootstrapper = new DefaultNancyBootstrapper();
var browser = new Browser(bootstrapper,
defaults: to => to.Accept(″application/json″));
var result = browser.Get(″/″,
with => { with.HttpRequest(); } );
Assert.Equal(HttpStatusCode.OK, result.StatusCode);
}
Its testability is easily one of the best features of Nancy. Because it's not dependent on ASP.NET, exercising the entire nancy pipeline including any custom model binders, request/response pipeline customizations etc. is a breeze. The Browser object allows you to easily test your modules individually or verify the Nancy setup entirely.
The Browser object also allows you to verify your response output be it JSON, XML, or HTML without having to go through an actual browser.
Diagnostics
Information (== PHPINFO)
Static Configuration
Request Tracing
Interactive Diagnostics (customizable)
Nancy comes with a diagnostics module built in. I'll just touh on one interesting part of it the Interactive Diagnostics. You can create custom diagnostic objects with functionality to operate upon your app. You could have the ability to view a list of files in a data directory or remove some of the files for example. Nancy handles the input form generation for you to make it very easy to add runtime diagnostic operations to your site.
!the_beginning
teapotcoder.com
@davidroberts63
twitter, github, bitbucket, jabbr, IRC
NancyFx.org
That's all I have to talk about Nancy right now. There is a lot more too it and plenty of documentation to go with it. You can see that Ruby is having a very good influence on .NET with Nancy, OWIN (the Rack for .NET) and C# scripting with ScriptCS. So take a look to see that .NET is headed in a great direction.


Daterange picker example
Simple picker
Picker with min and max date
Picker with custom format
Dates:
{{date}}
{{date2}}


An accessible webtool for use by everyone in the Best Practice & Impact Division of the Office for National Statistics.
SHEL is intended to capture significant meetings with stakeholders to demonstrate our impact across government organisations and to highlight potential weak points where our impact may need strengthening.
Please consult the accompanying guidance document should you need any help in completing the log. And avoid adding any contact information in to the SHEL form.


A | |
| Avar [Bogue] | Animated variables. |
B | |
| Bogue | Alias for |
| Bogue | General purpose GUI (Graphical user interface) library for Ocaml. |
| Box [Bogue] | Box widget. |
| Button [Bogue] | Button widget with text or icon. |
C | |
| Check [Bogue] | Checkbox widget. |
D | |
| Draw [Bogue] | Low-level graphics and colors. |
I | |
| Image [Bogue] | Image widget. |
L | |
| Label [Bogue] | One-line text widget. |
| Layout [Bogue] | The main, all-purpose graphics container. |
| Long_list [Bogue] | Handle large lists by not displaying all elements at once. |
M | |
| Main [Bogue] | Control the workflow of the GUI mainloop. |
| Menu [Bogue] | Various types of menus. |
| Mixer [Bogue] | Basic audio mixer for sound effects. |
| Mouse [Bogue] | Mouse and touchscreen information. |
P | |
| Popup [Bogue] | Put layouts on top of others. |
| Print [Bogue] | Convert Bogue objects to strings for debugging. |
R | |
| Radiolist [Bogue] | Check list with a single choice. |
S | |
| Sdl_area [Bogue] | SDL Area widget. |
| Select [Bogue] | Drop-down select list. |
| Selection [Bogue] | Unions of ranges of integers |
| Slider [Bogue] | Slider widget. |
| Snapshot [Bogue] | Create an image from a Layout. |
| Space [Bogue] | Adjust various spacing and sizes of layouts. |
| Style [Bogue] | Line and box styles. |
| Sync [Bogue] | Synchronized execution queue. |
T | |
| Table [Bogue] | Tables with sortable columns and selectable rows. |
| Tabs [Bogue] | Switch between layouts using Tabs. |
| Text_display [Bogue] | Multi-line text display widget. |
| Text_input [Bogue] | One-line text-input widget. |
| Theme [Bogue] | Theme variables. |
| Time [Bogue] | Time in msec. |
| Timeout [Bogue] | Delayed actions. |
| Trigger [Bogue] | Dealing with events. |
| Tvar [Bogue] | Transform variables |
U | |
| Update [Bogue] | Updating widgets |
| Utils [Bogue] | Utilities. |
V | |
| Var [Bogue] | Global variables with mutex. |
W | |
| Widget [Bogue] | Creating widgets and giving life to them |
| Window [Bogue] | Windows |


--- layout: post title: What is Important? tags: - Articles - General Photography - Lighting status: publish type: post published: true meta: _edit_lock: "1232687981" _edit_last: "2" dsq_thread_id: "370594612" --- Interesting question. What is important - photographically. I guess if you make your livelihood from images, all of those that make money are pretty darn important. Even so... If you ask yourself the question "what images are important" as I have asked myself countless times while making images, while editing images, while being really bored and philosophical, and now amazingly enough, asked the same question by a reader that thinks that I might have the answer. I really don't have the answer to that question. I have an opinion. I have an opinion on anyone that thinks that they do have the answer as well. Long storyÂ converted to a short story - I guess I think that the image at the top is pretty important - if you were me. Here is what I mean. This tiny little bundle of energy, intellect, and future has gone through way more difficult surgeries than I ever hope anyone of you will face and she just get's on with it. In the background is my Dad. I am the uncle. I have daughters of my own. It's pretty important to me. To you it's just another image with okay lighting, not quite exactly right choice of lens, crappy background, and the shutter speed a bit too slow but to me it is way way more important. So I guess if I had to answer the question as asked my priorities would be...


LoadJSON()
语法
Result = LoadJSON(#JSON, FileName$ [, Flags])概要
Parse JSON data from a file. The contents of the file are expected to be encoded in UTF-8 format. Files with another character encoding cannot be read by this command. The JSONValue() function can be used to access the contained JSON value(s) after parsing.
参数
#JSON A number to identify the new JSON. #PB_Any 可以用来自动生成这个编码. FileName$ The name of the file containing the JSON data. Flags (可选) If set to #PB_JSON_NoCase, the JSON data will be parsed case insensitive. The default is to be case sensitive.
返回值
Nonzero if the JSON data was parsed correctly, zero otherwise. If #PB_Any was used for the #JSON parameter then the generated number is returned on success.
备注
In case of an error, the JSONErrorMessage(), JSONErrorLine() and JSONErrorPosition() functions can be used to get more information about the error.
JSON is a case sensitive data format. However, in some situations, such as deserializing structures with ExtractJSONStructure() or similar commands it may be useful to treat JSON objects as case insensitive. The #PB_JSON_NoCase flag causes all member related functions to treat keys in this object as case insensitive.
参阅
CreateJSON(), CatchJSON(), ParseJSON(), JSONValue(), FreeJSON(), JSONErrorMessage(), JSONErrorLine(), JSONErrorPosition(), SaveJSON()
已支持操作系统
所有


Naan Bread
A curry serves best with naan that is unleavened bread. Traditionally made in ‘Tandoor or clay oven' but at home, we will be making it in the oven and/or on the stovetop. Naan is not eaten solely but acts as assortments with meat, veggies, or egg items.
- ⏲ Prep time: 90 min
- 🍳 Cook time: 30 min
- 🍽 Servings: 4
Ingredients
- All-purpose flour 3 cups
- Active dry yeast 1 tbsp
- Sugar 2 tbsp
- Warm Milk 1 cup
- Butter melted 2 tbsp
- Oil - little to grease
Directions
- Put the yeast and sugar to warm milk in a large mixing bowl and stir well. Leave it for 3-5 minutes.
- Put the flour and salt into a large mixing bowl and whisk to combine. Sprinkle additional flour as needed to keep the dough from sticking to the sides.
- Once the dough is soft and ready, apply oil on it and cover it with a soft cloth. Rest it for 2–3 hours.
- Knead the dough again, sprinkle all-purpose flour, and knead until smooth.
- Divide dough into 4 equal pieces. Form pieces into balls.
- Now transfer the naan to the foiled baking tray and bake in preheated at 180 C for 30-35 minutes.
- After baking, brush the top with butter and cut it into four pieces and serve. Enjoy!
Contribution
Recipe tags:
indian
bread
fasting


Your application name is required.
Your callback url is required.
ClientId: {{ client.clientId }}
ClientSecret:
Delete
Update


2017 AUVSI SUAS Competition Day 3
Hi everyone,
Flight day is here! We left the hotel and arrived on site at around 7am. We were not sure what time we would be flying so we made sure we were there first thing in the morning. When we got there, we saw that our flight time would be happnening later during the day.
This gave us even more time to make some more last minute preparations for the flight. It had gotten pretty windy during the day, so we modified the flight plan to compensate for wind speeds. We also triple inspected the airframe assembly and fully charged the battery again, just to be extra sure.
There was some downtime between us finishing the setup preparations and our flight time, so we decided to talk to some other teams and watch some other flights. There were a couple flights that had crashed, and luckily that wasn’t the case for us.
Once our flight time came, we loaded our equipment for the flight onto the cart and were shipped off towards the flight area. When we arrived at the pits, we were given 20 minutes to set up our equipment and be ready to take-off. Once we had linked into the interoperability server, we then received the locations of the stationary flight obstacles and saw that our flight plan had us fly through 2 of them. We then quickly modified our flight plan to try to avoid them where we could.
Plane Setup
After that, with the use of our handy-dandy safety and flight checklists, we finished the set-up well within the time given. We then gave our mission briefing to the judges, led by our very own fantastic team leader and co-president, Sebastian, where he described our systems, mission plan, and member roles to the judges before we flew.
The ground-station we were using at the flight area looked directly into the flight zone towards the direction of the launch, keeping our little Jownsey and the field team in sight.
Field Team
Once all members of the flight line took their positions, Sebastian initiated the check in sequence. “Imaging station is ready” said Cindy breaking the suspense, “auto-pilot is ready to go, engaging take off sequence” Sebastian said as the fierce humming of the propeller reached the ground-station. With two delicate hops forward, Andrew threw Jownsey with gentle elegance. Autonomous take off was a success.
From this point, Jownsey was far out of the ground stations field of view and would be monitored and directed from the ground control station. Jownsey circled the skies at an altitude of 120 meters above sea level in preparation to tackle his first task. Once sufficient altitude was reached, Jownsey cruised at a speed of 15 m/s northbound to capture the initial way-points, which surrounded a stationary obstacle. Jownsey skillfully swooped around the obstacle in a U-shape, capturing all the waypoints and avoiding the obstacle completely.
All was well and quiet until the GPS signal began to flutter. Suddenly, the GPS indicator on the ground control station flashed into a bright red, signaling that Jownsey has lost connection to the GPS, thus rendering him completely blind to his current position. If the connection couldn’t be regained, Rijesh would have been forced to manually take control of Jownsey, putting a halt to our mission. Luckily, lights flashed back to green after a few moments, and Jownsey resumes his original course.
Ground Station
As we neared the end of our search, the camera feed to the imaging station cut off. A connection within the onboard camera had been severed, but conveniently we obtained all the photos we needed. Jownsey was then rerouted back towards the north as it initiated its south-bound landing sequence.
Covering around half the field, Jownsey descended gradually to around 15 meters above ground level. The elevation reading on the Ground Control Station suddenly indicated that we were 15 meters below the target elevation. At the same moment, Rijesh called in from the field. “Uuhh, is this supposed to be happening? I’m going to attempt to land it manually.” Due to a miniscule error in the autopilot system, Jownsey diverted from the landing path at the last minute. However, with a timely manual take over, Jownsey landed safely with but a small bruise.
After we recovered Jownsey and brought him back to the ground station, Cindy quickly finished processing the images and we started packing everything away. We managed to end our mission with good time, finishing at 41 minutes exactly. After this the judges gave us their thoughts and feedback on our performance during the flight test. They congratulated and praised us all around, but mainly they complemented us on our team communication and our amazing safety protocols.
Take a step into the eyes of Jownsey below with these lovely images taken by Jownsey during the competition flight:
Star-shaped object.
Red semicircle, and what we think is the emergency target on the right side of the image, on the runway.
Some nice broccoli trees, and another target.
A better shot of what we think is the emergent target.
Rijesh, Andrew and Dat can be seen on the bottom right on the runway here(They’re the little dots).
The results of our flight will be coming out this evening, so stay tuned for updates!
Dat and Jackie


termex.core.extractor
Class NounPhraseExtractor_openNLP
java.lang.Object
termex.core.extractor.BasicExtractor
termex.core.extractor.NounPhraseExtractor_openNLP
public class NounPhraseExtractor_openNLP
- extends BasicExtractor
Nounphrase extractor implemented with OpenNLP tools. It applies certain heuristics to clean a candidate noun phrase and
return it to the normalised root. These heuristics include:
-Stopwords will be trimmed from the head and tails of a phrase. E.g, "the cat on the mat" becomes "cat on the mat".
-phrases containing "or" "and" will be split, e.g., "Tom and Jerry" becomes "tom" "jerry"
-must have letters
-must have at least two characters
-characters that do not match the pattern [a-zA-Z\-] are replaced with whitespaces.
-may or may not have digits, this is set by the property file
-must contain no more than N words, this is set by the property file
- Author:
- jyfeather88
|
Method Summary |
java.util.Map<java.lang.String,java.util.Set<java.lang.String>> |
extract(Corpus c)
|
java.util.Map<java.lang.String,java.util.Set<java.lang.String>> |
extract(Document d)
|
java.util.Map<java.lang.String,java.util.Set<java.lang.String>> |
extract(java.lang.String content)
|
| Methods inherited from class java.lang.Object |
equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
NounPhraseExtractor_openNLP
public NounPhraseExtractor_openNLP(StopList stop,
Normalizer normaliser)
throws java.io.IOException
- Throws:
java.io.IOException
extract
public java.util.Map<java.lang.String,java.util.Set<java.lang.String>> extract(Corpus c)
throws java.lang.Exception
- Specified by:
extract
in class BasicExtractor
- Throws:
java.lang.Exception
extract
public java.util.Map<java.lang.String,java.util.Set<java.lang.String>> extract(Document d)
throws java.lang.Exception
- Specified by:
extract
in class BasicExtractor
- Throws:
java.lang.Exception
extract
public java.util.Map<java.lang.String,java.util.Set<java.lang.String>> extract(java.lang.String content)
throws java.lang.Exception
- Specified by:
extract
in class BasicExtractor
- Throws:
java.lang.Exception


Two-way binding between ng-select model and ng-select-option values. Click on images to change the selection. Modify the selection to see the image reaction.
ng-select
ng-select-option
selection:


On 4 February 2015, the National Health and Family Planning Commission (NHFPC) of China notified WHO of 83 additional laboratory-confirmed cases of human infection with avian influenza A(H7N9) virus. Onset dates ranged from 20 December 2014 to 27 January 2015. Below is a breakdown of the 83 cases included in this notification by epidemiological week of symptom onset:
Cases ranged in age from 1 to 88 years with a median age of 56 years. Of the 83 cases, there were 19 deaths reported, ranged in age from 7 to 78 years with a mean age of 50 years. 60 of these 83 cases were male. The majority (78 cases, 93%) reported exposure to live poultry or live poultry markets; the exposure history of 4 cases is unknown.
Three family clusters were reported, each comprised of 2 cases; all had exposure to live poultry or live poultry markets. Cases were reported from 8 provinces: Fujian (30), Guangdong (30), Jiangsu (7), Jiangxi (1), Shandong (1), Shanghai (2), Xinjiang (1), and Zhejiang (11).
WHO, in close collaboration with China, is monitoring the epidemiological situation and conducting further risk assessment based on the latest information.
Further sporadic human cases of avian influenza A(H7N9) infection are expected in affected and possibly neighbouring areas. Should human cases from affected areas travel internationally, their infection may be detected in another country during or after arrival. If this were to occur, community level spread is considered unlikely as the virus does not appear to have the ability to transmit easily among humans.
WHO advises that travellers to countries with known outbreaks of avian influenza should avoid poultry farms, or contact with animals in live bird markets, or entering areas where poultry may be slaughtered, or contact with any surfaces that appear to be contaminated with faeces from poultry or other animals. Travellers should also wash their hands often with soap and water. Travellers should follow good food safety and good food hygiene practices.
WHO does not advise special screening at points of entry with regard to this event, nor does it currently recommend any travel or trade restrictions. As always, a diagnosis of infection with an avian influenza virus should be considered in individuals who develop severe acute respiratory symptoms while travelling or soon after returning from an area where avian influenza is a concern.
WHO encourages countries to continue strengthening influenza surveillance, including surveillance for severe acute respiratory infections (SARI) and to carefully review any unusual patterns, in order to ensure reporting of human infections under the IHR (2005), and continue national health preparedness actions.


I have had a bit of a wild ride of experience in various television roles over the past decade, often in the back-of-house where all the mess happens, and before beautifully presented people show up at 5 o'clock to deliver you the day's news in dulcet tones. Live television does not have the luxury of time, and so I was often faced with tough decisions of where priorities lie in any given moment. Which client do I prioritise? What channel has a larger audience? Which channel has the audience most affected by my next decision? And so on, hour by hour, minute by minute.
There were many tough moments where I knew I had to make a call that ultimately meant not everyone got what they wanted, sometimes accesibility was compromised because of sheer lack of resources. So, how do you make a decision with a 10-second clock ticking down on your screen? I like to think about equity over equality when it comes to these decisions. I do my best to work in a way that results in those needing the most access, those who would suffer the most from not having access, to having priority to that information. However, sometimes we are all put in tough situations when business income is on the line, and we could talk about the ethics of that for decades.
I spent half of my upbringing in Liverpool, England, and the second-half in Whanganui-a-Tara, Aotearoa. I now live in Sydney, Australia, with my partner and very large cat. My heart very much has three homes, with each land contributing to my character. At the core of my heart, Queer is also a very important identity in terms my gender, sexuality, and community. It frames how I relate and interact with broader society, and how I communicate with people in my personal and professional lives.
"Queer not as being about who you’re having sex with (that can be a dimension of it); but queer as being about the self that is at odds with everything around it and has to invent and create and find a place to speak and to thrive and to live.” - bell hooks
Beginning this course has been a big eye-opener into how I learn, what kind of environments I need to work well, and what causes me to lose focus. I have begun putting into practice some methods I have researched after, learning about neuroplasticity in our pre-foundations coursework, and I look forward to delving into this deeper as we go on.
Keeping to set schedules has been a struggle so far. I tend to work in small stints and then one longer one in the evenings, which is fine working from home but not so much in a nine-to-five job. Thankfully, I adjust easy to office hours when I am in the company of other people, and it is good to have some hustle and bustle around as a reminder to take a break.
Most importantly, I've found drawing out code into maps or trees makes a huge amount of difference to me understanding what needs to be implemented. Without visual materials, looking at code can be like deciphering Russian cursive. As a result, I have been drawing and scribbling away a lot to make sense of all this new information. It has been taking longer than I'd hoped, but I'm retaining much more and gaining a better overall understanding of each section if I don't rush myself. Overall, I have probably saved time by not needing to re-read sections over and over.


Storage
Table of Contents:
CloudDB
The CloudDB
component is a Non-visible component that allows you to store data on a Internet
connected database server (using Redis software). This allows the users of your App to share
data with each other. By default data will be stored in a server maintained by MIT, however you
can setup and run your own server. Set the RedisServer
property and
RedisPort
property to access your own server.
Properties
- ProjectID
- Gets the ProjectID for this CloudDB project.
- RedisPort
- The Redis Server port to use. Defaults to 6381
- RedisServer
- The Redis Server to use to store data. A setting of “DEFAULT” means that the MIT server will be used.
- Token
- This field contains the authentication token used to login to the backed Redis server. For the “DEFAULT” server, do not edit this value, the system will fill it in for you. A system administrator may also provide a special value to you which can be used to share data between multiple projects from multiple people. If using your own Redis server, set a password in the server’s config and enter it here.
- UseSSL
- Set to true to use SSL to talk to CloudDB/Redis server. This should be set to True for the “DEFAULT” server.
Events
- CloudDBError(message)
- Indicates that an error occurred while communicating with the CloudDB Redis server.
- DataChanged(tag,value)
- Indicates that the data in the CloudDB project has changed. Launches an event with the
tag
that has been updated and thevalue
it now has. - FirstRemoved(value)
- Event triggered by the
RemoveFirstFromList
function. The argumentvalue
is the object that was the first in the list, and which is now removed. - GotValue(tag,value)
- Indicates that a
GetValue
request has succeeded. - TagList(value)
- Event triggered when we have received the list of known tags. Run in response to a call to the
GetTagList
function. - UpdateDone(tag,operation)
- Indicates that operations that store data to CloudDB have completed.
Methods
- AppendValueToList(tag,itemToAdd)
- Append a value to the end of a list atomically. If two devices use this function simultaneously, both will be appended and no data lost.
- ClearTag(tag)
- Remove the tag from CloudDB.
- CloudConnected()
- Returns
true
if we are on the network and will likely be able to connect to theCloudDB
server. - GetTagList()
- Asks
CloudDB
to retrieve all the tags belonging to this project. The resulting list is returned in the eventTagList
. - GetValue(tag,valueIfTagNotThere)
GetValue
asksCloudDB
to get the value stored under the given tag. It will pass the result to theGotValue
will be given.- RemoveFirstFromList(tag)
- Obtain the first element of a list and atomically remove it. If two devices use this function
simultaneously, one will get the first element and the the other will get the second element,
or an error if there is no available element. When the element is available, the
FirstRemoved
event will be triggered. - StoreValue(tag,valueToStore)
- Asks
CloudDB
to store the givenvalue
under the giventag
.
DataFile
Component for DataFile
Properties
- ColumnNames
- Retrieve the column names of the currently loaded Source file. For CSV files, this will return a List of entries in the first row. For JSON files, this will return a List of keys in the JSON object.
- Columns
- Retrieve a List of columns of the currently loaded Source file.
- DefaultScope
- Specifies the default scope for files accessed using the File component. The App scope should work for most apps. Legacy mode can be used for apps that predate the newer constraints in Android on app file access.
- Rows
- Retrieve a List of rows of the currently loaded Source file.
- SourceFile
- Sets the source file to parse data from, and then parses the
file asynchronously. The results are stored in the
Columns
,Rows
andColumnNames
properties. The expected formatting of the file is either the CSV or JSON format.
Events
None
Methods
- ReadFile(fileName)
- Indicates source file to load data from. The expected format of the contents of the file
are either CSV or JSON. Prefix the
fileName
with/
to read from a specific file on the SD card (for example,/myFile.txt
will read the file/sdcard/myFile.txt
). To read assets packaged with an application (also works for the Companion) start thefileName
with//
(two slashes). If afileName
does not start with a slash, it will be read from the application’s private storage (for packaged apps) and from/sdcard/AppInventor/data
for the Companion.
File
Non-visible component for storing and retrieving files. Use this component to write or read files on the device.
The exact location where external files are placed is a function of the value of the
Scope
property, whether the app is running in the Companion or compiled,
and which version of Android the app is running on.
Because newer versions of Android require files be stored in app-specific directories, the
DefaultScope
is set to App
. If you are using an older version of Android and need access to
the legacy public storage, change the DefaultScope
property to Legacy
. You can also change
the Scope
using the blocks.
Below we briefly describe each scope type:
- App: Files will be read from and written to app-specific storage on Android 2.2 and higher. On earlier versions of Android, files will be written to legacy storage.
- Asset: Files will be read from the app assets. It is an error to attempt to write to app assets as they are contained in read-only storage.
- Cache: Files will be read from and written to the app’s cache directory. Cache is useful for temporary files that can be recreated as it allows the user to clear temporary files to get back storage space.
- Legacy: Files will be read from and written to the file system using the App Inventor rules
prior to release nb187. That is, file names starting with a single
/
will be read from and written to the root of the external storage directory, e.g.,/sdcard/
. Legacy functionality will not work on Android 11 or later. - Private: Files will be read from and written to the app’s private directory. Use this scope to store information that shouldn’t be visible to other applications, such as file management apps.
- Shared: Files will be read from and written to the device’s shared media directories, such
as
Pictures
.
Note 1: In Legacy mode, file names can take one of three forms:
- Private files have no leading
/
and are written to app private storage (e.g., “file.txt”) - External files have a single leading
/
and are written to public storage (e.g., “/file.txt”) - Bundled app assets have two leading
//
and can only be read (e.g., “//file.txt”)
Note 2: In all scopes, a file name beginning with two slashes (//
) will be interpreted as an
asset name.
Properties
- DefaultScope
- Specifies the default scope for files accessed using the File component. The App scope should work for most apps. Legacy mode can be used for apps that predate the newer constraints in Android on app file access.
- ReadPermission
- A designer-only property that can be used to enable read access to file storage outside of the app-specific directories.
- Scope
- Indicates the current scope for operations such as ReadFrom and SaveFile.
- WritePermission
- A designer-only property that can be used to enable write access to file storage outside of the app-specific directories.
Events
- AfterFileSaved(fileName)
- Event indicating that the contents of the file have been written.
- GotText(text)
- Event indicating that the contents from the file have been read.
Methods
- AppendToFile(text,fileName)
- Appends text to the end of a file. Creates the file if it does not already exist. See the help
text under
SaveFile
for information about where files are written. On success, theAfterFileSaved
event will run. - CopyFile(fromScope,fromFileName,toScope,toFileName)
- Copy the contents from the first file to the second file.
- Delete(fileName)
- Deletes a file from storage. Prefix the
fileName
with/
to delete a specific file in the SD card (for example,/myFile.txt
will delete the file/sdcard/myFile.txt
). If thefileName
does not begin with a/
, then the file located in the program’s private storage will be deleted. Starting thefileName
with//
is an error because asset files cannot be deleted. - Exists(scope,path)
- Tests whether the path exists in the given scope.
- IsDirectory(scope,path)
- Tests whether the path named in the given scope is a directory.
- ListDirectory(scope,directoryName)
- Get a list of files and directories in the given directory.
- MakeDirectory(scope,directoryName)
- Create a new directory for storing files. The semantics of this method are such that it will return true if the directory exists at its completion. This can mean that the directory already existed prior to the call.
- MakeFullPath(scope,path)
- Converts the scope and path into a single string for other components.
- MoveFile(fromScope,fromFileName,toScope,toFileName)
- Move a file from one location to another.
- ReadFrom(fileName)
- Reads text from a file in storage. Prefix the
fileName
with/
to read from a specific file on the SD card (for example,/myFile.txt
will read the file/sdcard/myFile.txt
). To read assets packaged with an application (also works for the Companion) start thefileName
with//
(two slashes). If afileName
does not start with a slash, it will be read from the application’s private storage (for packaged apps) and from/sdcard/AppInventor/data
for the Companion. - RemoveDirectory(scope,directoryName,recursive)
- Remove a directory from the file system. If recursive is true, then everything is removed. If recursive is false, only the directory is removed and only if it is empty.
- SaveFile(text,fileName)
- Saves text to a file. If the
fileName
begins with a slash (/
) the file is written to the sdcard (for example, writing to/myFile.txt
will write the file to/sdcard/myFile.txt
). If thefileName
does not start with a slash, it will be written in the program’s private data directory where it will not be accessible to other programs on the phone. There is a special exception for the AI Companion where these files are written to/sdcard/AppInventor/data
to facilitate debugging.Note that this block will overwrite a file if it already exists. If you want to add content to an existing file use the
AppendToFile
method.
Spreadsheet
Spreadsheet is a non-visible component for storing and receiving data from a Google Sheets document using the Google Sheets API.
In order to utilize this component, one must first have a Google Developer Account. Then, one must create a new project under that Google Developer Account, enable the Google Sheets API on that project, and finally create a Service Account for the Sheets API.
Instructions on how to create the Service Account, as well as where to find other relevant information for using the Google Sheets Component, can be found here.
Row and column numbers are 1-indexed.
Properties
- ApplicationName
- The name of your application, used when making API calls.
- CredentialsJson
- The JSON File with credentials for the Service Account
- SpreadsheetID
- The ID for the Google Sheets file you want to edit. You can find the spreadsheetID in the URL of the Google Sheets file.
Events
- ErrorOccurred(errorMessage)
- Triggered whenever an API call encounters an error. Details about the error are in
errorMessage
. - FinishedAddCol(columnNumber)
- The callback event for the
AddCol
block, called once the values on the table have been updated. Additionally, this returns the column number for the new column. - FinishedAddRow(rowNumber)
- The callback event for the
AddRow
block, called once the values on the table have been updated. Additionally, this returns the row number for the new row. - FinishedClearRange()
- The callback event for the
ClearRange
block, called once the values on the table have been updated. - FinishedRemoveCol()
- The callback event for the
RemoveCol
block, called once the values on the table have been updated. - FinishedRemoveRow()
- The callback event for the
RemoveRow
block, called once the values on the table have been updated. - FinishedWriteCell()
- The callback event for the
WriteCell
block, called once the values on the table have been updated. - FinishedWriteCol()
- The callback event for the
WriteCol
block, called once the values on the table have been updated. - FinishedWriteRange()
- The callback event for the
WriteRange
block, called once the values on the table have been updated. - FinishedWriteRow()
- The callback event for the
WriteRow
block, called once the values on the table have been updated. - GotCellData(cellData)
- The callback event for the
ReadCell
block. ThecellData
is the text value in the cell. - GotColData(colDataList)
- The callback event for the
ReadCol
block. ThecolDataList
is a list of text cell-values in order of increasing row number. - GotFilterResult(return_rows,return_data)
- The callbeck event for the
ReadWithQuery
block. Theresponse
is a list of rows, where each row satisfies the query. - GotRangeData(rangeData)
- The callback event for the
ReadRange
block. TherangeData
is a list of rows, where the dimensions are the same as the rangeReference. - GotRowData(rowDataList)
- The callback event for the
ReadRow
block. TherowDataList
is a list of text cell-values in order of increasing column number. - GotSheetData(sheetData)
- The callback event for the
ReadSheet
block. ThesheetData
is a list of rows.
Methods
- AddCol(sheetName,data)
- Given a list of values as
data
, appends the values to the next empty column of the sheet. It will always start from the top row and continue downwards. Once complete, it triggers theFinishedAddCol
callback event. - AddRow(sheetName,data)
- Given a list of values as
data
, appends the values to the next empty row of the sheet. It will always start from the left most column and continue to the right. Once complete, it triggers theFinishedAddRow
callback event. Additionally, this returns the row number for the new row. - ClearRange(sheetName,rangeReference)
- Empties the cells in the given range. Once complete, this block triggers
the
FinishedClearRange
callback event. - GetCellReference(row,col)
- Converts the integer representation of rows and columns to A1-Notation used in Google Sheets for a single cell. For example, row 1 and col 2 corresponds to the string "B1".
- GetRangeReference(row1,col1,row2,col2)
- Converts the integer representation of rows and columns for the corners of the range to A1-Notation used in Google Sheets. For example, selecting the range from row 1, col 2 to row 3, col 4 corresponds to the string “B1:D3”.
- ReadCell(sheetName,cellReference)
- On the page with the provided sheetName, reads the cell at the given
cellReference and triggers the
GotCellData
callback event. The cellReference can be either a text block with A1-Notation, or the result of thegetCellReference
block. - ReadCol(sheetName,colNumber)
- On the page with the provided sheetName, reads the column at the given
colNumber and triggers the
GotColData
callback event. - ReadRange(sheetName,rangeReference)
- On the page with the provided sheetName, reads the cells at the given
rangeReference and triggers the
GotRangeData
callback event. The rangeReference can be either a text block with A1-Notation, or the result of thegetRangeReference
block. - ReadRow(sheetName,rowNumber)
- On the page with the provided sheetName, reads the row at the given
rowNumber and triggers the
GotRowData
callback event. - ReadSheet(sheetName)
- Reads the entire Google Sheets document and triggers the
GotSheetData
callback event. - ReadWithExactFilter(sheetName,colID,value)
- Filters a Google Sheet for rows where the given column number matches the provided value.
- ReadWithPartialFilter(sheetName,colID,value)
- Filters a Google Sheet for rows where the given column number contains the provided value string.
- RemoveCol(sheetName,colNumber)
- Deletes the column with the given column number from the table. This does
not clear the column, but removes it entirely. The sheet’s grid id can be
found at the end of the url of the Google Sheets document, right after the
“gid=”. Once complete, it triggers the
FinishedRemoveCol
callback event. - RemoveRow(sheetName,rowNumber)
- Deletes the row with the given row number (1-indexed) from the table. This
does not clear the row, but removes it entirely. The sheet’s grid id can be
found at the end of the url of the Google Sheets document, right after the
“gid=”. Once complete, it triggers the
FinishedRemoveRow
callback event. - WriteCell(sheetName,cellReference,data)
- Given text or a number as
data
, writes the value to the cell. It will override any existing data in the cell with the one provided. Once complete, it triggers theFinishedWriteCell
callback event. - WriteCol(sheetName,colNumber,data)
- Given a list of values as
data
, writes the values to the column with the given column number, overriding existing values from top down. (Note: It will not erase the entire column.) Once complete, it triggers theFinishedWriteCol
callback event. - WriteRange(sheetName,rangeReference,data)
- Given list of lists as
data
, writes the values to cells in the range. The number of rows and columns in the range must match the dimensions of your data. This method will override existing data in the range. Once complete, it triggers theFinishedWriteRange
callback event. - WriteRow(sheetName,rowNumber,data)
- Given a list of values as
data
, writes the values to the row with the given row number, overriding existing values from left to right. (Note: It will not erase the entire row.) Once complete, it triggers theFinishedWriteRow
callback event.
TinyDB
TinyDB
is a non-visible component that stores data for an app.
Apps created with App Inventor are initialized each time they run. This means that if an app
sets the value of a variable and the user then quits the app, the value of that variable will
not be remembered the next time the app is run. In contrast, TinyDB is a persistent data store
for the app. The data stored in a TinyDB
will be available each time the app is run. An
example might be a game that saves the high score and retrieves it each time the game is played.
Data items consist of tags and values. To store a data item, you specify the tag it should be stored under. The tag must be a text block, giving the data a name. Subsequently, you can retrieve the data that was stored under a given tag.
You cannot use the TinyDB
to pass data between two different apps on the phone, although you
can use the TinyDB
to share data between the different screens of a multi-screen app.
When you are developing apps using the AI Companion, all the apps using that Companion will
share the same TinyDB
. That sharing will disappear once the apps are packaged and installed on
the phone. During development you should be careful to clear the Companion app’s data each time
you start working on a new app.
Properties
- Namespace
- Namespace for storing data.
Events
None
Methods
- ClearAll()
- Clear the entire data store.
- ClearTag(tag)
- Clear the entry with the given
tag
. - GetTags()
- Return a list of all the tags in the data store.
- GetValue(tag,valueIfTagNotThere)
- Retrieve the value stored under the given
tag
. If there’s no such tag, then returnvalueIfTagNotThere
. - StoreValue(tag,valueToStore)
- Store the given
valueToStore
under the giventag
. The storage persists on the phone when the app is restarted.
TinyWebDB
The TinyWebDB
component communicates with a Web service to store
and retrieve information. Although this component is usable, it is
very limited and meant primarily as a demonstration for people who
would like to create their own components that talk to the Web.
The accompanying Web service is at
(http://tinywebdb.appinventor.mit.edu). The component has methods to
store a value under a tag and to
retrieve the value associated with
the tag. The interpretation of what “store” and “retrieve” means
is up to the Web service. In this implementation, all tags and
values are strings (text). This restriction may be relaxed in
future versions.
Properties
- ServiceURL
- Specifies the URL of the Web service. The default value is the demo service running on App Engine.
Events
- GotValue(tagFromWebDB,valueFromWebDB)
- Indicates that a
GetValue
server request has succeeded. - ValueStored()
- Event indicating that a
StoreValue
server request has succeeded. - WebServiceError(message)
- Indicates that the communication with the Web service signaled an error.
Methods
- GetValue(tag)
GetValue
asks the Web service to get the value stored under the giventag
. It is up to the Web service what to return if there is no value stored under thetag
. This component just accepts whatever is returned. TheGotValue
event will be run on completion.- StoreValue(tag,valueToStore)
- Sends a request to the Web service to store the given
valueToStore
under the giventag
. TheValueStored
event will be run on completion.


Ask a Question
Don't see a question in the App? Submit it here and we'll work on getting it answered.

Thanks for your question! We'll let you know when we add it to the app.
Home
BFFs
About
Gallery
Ask


I posses basic IT skills in the workforce. I am currently completing my education in the IT field and am looking for a coop experience.
Oversee staff members during lessons, teach swimming lessons, guarding a variety of swims and teaching aquafit.
Flyer delivery to houses.
GPA: 3.63
Outside of school I enjoy spending my free time rock climbing and geocaching.
When forced indoors, I enjoy watching movies or reading a good book.


ADCOIN
Make sure you have the backup of your wallet keys before you delete your wallet.Are u sure your want to delete ?
Detail of transaction data
Enter amount of coins you want to receive
QR code generated successfully. Share the QR code with others to receive ADCOINS
Previous Hash: {{ data.previous_hash }}
Proof of Work: {{ data.proof}}
Timestamp: {{ data.timestamp}}
Transactions:


Invocation matchers control how a mock object matches and verifies incoming invocations against expectations and stubbed behaviour. The jMock API is a convenient syntactic sugar for specifying how matchers are added to a mock object. Sometimes the convenient API does not allow you to specify matching rules precisely or flexibly enough. In these cases you will need to write your own invocation matcher classes. This article will show you how to do just that.
A mock object contains a list of expectations (and stubs, but we can consider a stub to be a degerate form of expectation and jMock uses the same type of object to implement both). When a mock object receives an invocation it searches for an expectation to process the invocation, starting with the most recently specified expectation and working backwards until it finds match. Each expectation contains matching rules that control which invocations it matches. An expectation matches an invocation if all of its matching rules match the invocation. The jMock API provides a concise, descriptive syntax for adding expectations to a mock and adding matching rules to expectations.
An matching rule is an object that implements the
InvocationMatcher
interface. It has the following
responsiblities:
matches
method).invoked
method).verify
method from the Verifiable
interface).describeTo
method from the
SelfDescribing
interface).hasDescription
method).In most cases, you will want to define a new matching rule that does
change state when an invocation occurs. Also, you should always provide a
description for your matching rule, so the hasDescription
method should always return true
. This common behaviour is
already implemented in the abstract
StatelessInvocationMatcher
class. You can therefore define a
new matching rule by extending StatelessInvocationMatcher
and
defining the matches
and describeTo
methods.
Suppose we want to stub all Java Bean property getters to return some
default results. Returning default results is performed by a
DefaultResultStub
. But how do we match property getter
methods? We need to write a custom InvocationMatcher
that
only matches invocations of bean property getter methods. Here's what a
test will look like that uses such a custom matcher:
InvocationMatcher beanPropertyGetters = new BeanPropertyGetterMatcher(); DefaultResultStub returnDefaultValue = new DefaultResultStub(); Mock mock = ... public void testListChildren() { ... mockPerson.stubs().match(beanPropertyGetters).will(returnDefaultValue); ... }
We can write the BeanPropertyGetterMatcher
class by
extending StatelessInvocationMatcher
:
public class BeanPropertyGetterMatcher extends StatelessInvocationMatcher { ... }
We now need to write the matches
method to return whether
the invocation is the getter method of a Java Bean property, using the
Java Beans API. The method will use Bean introspection to list the
property descriptors of the class that defines the invoked method. It then
searches the list of property descriptors for a descriptor with a getter
method that is the same as the invoked method.
public boolean matches(Invocation invocation) { Class beanClass = invocation.invokedMethod.getDeclaringClass(); try { BeanInfo beanInfo = Introspector.getBeanInfo(beanClass); PropertyDescriptor[] properties = beanInfo.getPropertyDescriptors(); for( int i = 0; i < properties.length; i++ ) { if( invocation.invokedMethod.equals( properties[i].getReadMethod() ) ) return true; } return false; } catch( IntrospectionException ex ) { throw new AssertionFailedError("could not introspect bean class" + beanClass + ": " + ex.getMessage() ); } }
Finally we must write the describeTo
method to generate a
description of what our new class matches. The description will be
included in the description of any expectation that uses the matcher,
which itself will be included in error messages when tests fail. Our new
class matches any bean property getter, so that's what our description
will be:
public StringBuffer describeTo(StringBuffer buffer) { return buffer.append("any bean property getter"); }
The entire matcher class is shown below:
public class BeanPropertyGetterMatcher extends StatelessInvocationMatcher { public boolean matches(Invocation invocation) { Class beanClass = invocation.invokedMethod.getDeclaringClass(); try { BeanInfo beanInfo = Introspector.getBeanInfo(beanClass); PropertyDescriptor[] properties = beanInfo.getPropertyDescriptors(); for( int i = 0; i < properties.length; i++ ) { if( invocation.invokedMethod.equals( properties[i].getReadMethod() ) ) return true; } return false; } catch( IntrospectionException ex ) { throw new AssertionFailedError("could not introspect bean class" + beanClass + ": " + ex.getMessage() ); } } public StringBuffer describeTo(StringBuffer buffer) { return buffer.append("any bean property getter"); } }


A Secure offline password generator for humans, no dependencies, readable passwords, touch keyboard friendly.
Continuous
Randomize options
Generate Copy


Hello I hope you enjoy using Succinct Barebones! Remember: The web is accessible by default, let's stop breaking it!


Welcome to the Ruby Ramblings and Misadventures of Shirley F. Grigsby.
I've spent the last two days trying to repopulate my autumn-leaves picture in the first box.
The difference between ul and ol is ol uses numbers.
| Week | Week | Week | First | Second | Third |
|---|


real time
`Prev `__
R
`Next `__
--------------
**real time**
1. [techspeak] adj. Describes an application which requires a program to
respond to stimuli within some small upper limit of response time
(typically milli- or microseconds). Process control at a chemical plant
is the `*canonical* <../C/canonical.html>`__ example. Such applications
often require special operating systems (because everything else must
take a back seat to response time) and speed-tuned hardware.
2. adv. In jargon, refers to doing something while people are watching
or waiting. “I asked her how to find the calling procedure's program
counter on the stack and she came up with an algorithm in real time.”
--------------
+----------------------------------+----------------------------+------------------------------+
| `Prev `__ | `Up <../R.html>`__ | `Next `__ |
+----------------------------------+----------------------------+------------------------------+
| Real Soon Now | `Home <../index.html>`__ | real user |
+----------------------------------+----------------------------+------------------------------+


Google Inc. was founded in 1998 by Sergey Brin and Larry Page to make it easier to find high-quality information on the web. The company is based on three years of research in web search and data mining done by the founders in the Stanford University Computer Science Department. Google Inc.'s headquarters are located in scenic downtown Palo Alto, California.
Google Inc. is not at present a publicly traded company, and we are currently unable to speculate on whether or when our privately-held status might change.
10^100 (a gigantic number) is a googol, but we liked the spelling "Google" better. We picked the name "Google" because our goal is to make huge quantities of information available to everyone. And it sounds cool and has only six letters.
| Business development |<EMAIL_ADDRESS>|
| For Job seekers |<EMAIL_ADDRESS>|
| For the press, or to notify us of new stories mentioning Google |<EMAIL_ADDRESS>|
| For general information (but first, please see our help and "Why use Google?" pages) |<EMAIL_ADDRESS>|
| For suggestions and comments about the website |<EMAIL_ADDRESS>|
| For general suggestions and comments |<EMAIL_ADDRESS>|
| To add, move, or reindex a URL | URL form |
| Problems with the crawler, googlebot, or to remove a URL (but first, please see our crawler FAQ ) |<EMAIL_ADDRESS>|
Copyright ©1999 Google Inc.


{% extends 'urbarium/base.html' %} {% block title%}Governing Bodies | {% endblock title%} {% block content %}Work in Progress{% endblock content %}


@* introductoryContent Template File *@ @(param: Any)
Knoldus strongly believes in strongly sharing knowledge. We conduct knowledge sessions every week. Enthusiasts outside Knoldus who would like to contribute or attend are most welcome. Just drop a mail on our official mail, and enjoy the Scala sessions with generous snacks and drinks.


| DOSE: |
repeated |
IV |
Cocaine |
(powder / crystals) |
Even tho I've been using cocaine for years, I've always had a love/hate relationship with it. In some ways, I love it. It gives a great rush if your into that sorta thing. But it always lets you down, kinda chasing that first rush. Well tonight was no different, except this is maybe the 7th or even the 6th time that I've IVed it.
 I don't sniff anything, with the possible exception of K, and thats because I don't do it enough to have much of a tolerance. Plus, muscle popping just does not sound like fun. But enough of this.
 This is not tolerance either; I was in jail for 4 years, and found it the same boring drug as when I was 18 years old. Traditionally I smoke it, as its the rush I'm after, and rock is easy to find around my way. I even know how to re-rock it, although I don't think it does much. But smoking it is instant skitz and besides, the high isn't that special. Which leads me to my current love/hate of the needle.
Well, I've been banging heroin for years, and that is nothing special. No real rush, just a warmth and then the normal dope feeling. So when the opportunity came up to shoot powder, I was scared but I decided to go for it. I started with a quarter T or a .25 gram sack which will run you about $10. I didn't know how good it was supposed to be so I put 40 units of water on it and lo and behold got like 53 back, which means its good, or so I'd been told. I put about 25 units back it, better safe then sorry. I'm scared of dying from cocaine/heart attack.
So, I shot it. And nothing. Still nothing. And then I realized I missed the shot and my whole arm got numb. Well, its gotta be good if all my nerves are aenastized. So even tho I think I hit some of it and its nothing special, I decide to give it another try. This time I add a little more coke to the 25 units, maybe a quarter of a .25 gram bag. and add about 15 more units. This time I make sure I'm in, and steadily but slowly plunge it in. I'm still new even tho I've done probably an ounce of powder in the 6 or 7 times I've done cocaine, usually a quarter gram every 20 minutes until the bag's done.
  I've found that to not be true, although it does hit me a little faster than dope. I just think that coke has more rush to it and therefore, I feel it 'sooner'. I always smell the llello once it's mixed with water, because that smell will soon permeate my mouth and everything I do in about 30 seconds.
 I start to feel my lungs breathing off this acetone.  But the wah-wah's are there, and eventually, if I do a big enough shot, my vision will be impaired.  And I can feel it bouncing out of my chest.
And just like that it's over. I come down within 5 minutes, with after effects vanished in under an hour. It's quite compulsive, because it's extremely good feeling, and of course I want to repeat the feeling. And I can actually, the first three shots for sure. After that I'm playing with diminishing returns for sure. All in all, not really my bag of tea. But once I do a shot, it's curtains. I'm doing it all.
Experience Reports are the writings and opinions of the individual authors who submit them.
Some of the activities described are dangerous and/or illegal and none are recommended by Erowid.


|
Pueblo West Metropolitan District Board Proclaims
Amateur Radio Week
June 8, 2010
Amateur Radio received a boost in the community on
June 8 when
the Pueblo West Metropolitan District Board of Directors (left)
presented a Proclamation to President Jim McConnell (right) of the
Pueblo West Amateur Radio Club. Board Chairman Mike French made the
presentation proclaiming the week of June 21-27 as Amateur Radio Week
in Pueblo West.
The Proclamation reads:
WHEREAS, the Community of Pueblo West has more
than 60 licensed Amateur Radio operators who have demonstrated their
value in public assistance by providing emergency radio
communications, and
WHEREAS, these Amateur Radio operators donate
these services free of charge to the Community, in the interest of
the citizens of our Community and our Nation; and
WHEREAS, these Amateur Radio operators are on
alert for any emergency, local or world-wide, and practice their
skills during the American Radio Relay League's Field Day exercise, and
WHEREAS, this year's national Amateur Radio
Field Day will take place on June 26-27, 2010
NOW, THEREFORE, WE, the Pueblo West Metropolitan
District Board of Directors by virtue of authority vested by us,
do hereby proclaim the week of June 21-27, 2010 as Amateur Radio Week
in recognition of this important emergency preparedness exercise, and
call upon all citizens to pay tribute to the Amateur Radio operators
of our Community.
IN WITNESS WHEREOF, I have hereunto set my hand
and caused the Great Seal of the Pueblo West Metropolitan District to
be affixed, on this the 8th Day of June, in the Year Two Thousand and Ten.
MIKE FRENCH, Chairman |
Cheers Plaza, 334 S. McCulloch Blvd.
Pueblo West Amateur Radio Club successfully presented
its first Field Day exercise on June 26 & 27 in Pueblo West.
Twelve licensed club members, one non-licensed member, and two
licensed guests contributed to the successful event.
Those who attended were Bill Ewing (WA0KAQ), Jane
Ewing (KA0USA), Andy Lloyd (ND0P), David Ewing (KC0RNI - guest
operator), Ralph Schuster (KA0RER), David Yeater (unlicensed member),
Bill Fortune Jr. (W0NHF), Bill Fortune III (KB0RPD), Ed Force (NI5R),
Kirk Kelley (KD0LDH), Neal Tew (KD0MBL), Ty Luck (KG6WSI), Dennis
Watson (KB0YLK - guest operator), Jim McConnell (NE0DA), and Dan
Broadbooks (NG0T).
Two stations were set up, and both
used solar panels to charge batteries to run the stations. NE0DA's
motor home used two 75-watt solar panels mounted on the roof. It also
featured a propane generator to run the air conditioner and keep the
unit cool.
Station 1, owned by NE0DA, was used for the SSB and CW
modes. The rig was an IC-706 hooked to a vertical for 40-10 meters.
This station made 119 CW and 26 SSB contacts. Dan
(NG0T), who enjoys and is very proficient in CW contesting, was
responsible for all of this station's CW contacts. He showed why CW
is a preferred mode for low power FD contesting, bringing in 1,190
points for his effort. The 26 SSB contacts supplied another 130
points for a total of 1,320 points.
Solar powered Station 2, owned by WA0KAQ and KA0USA
set up in their trailer, used a generator donated by Pueblo West
Rental Center to run the air conditioner. The station was used
primarily more for teaching members how to operate PSK31 than as a
contest station. It consisted of a Yaesu FT-897D transceiver, and
MFJ-1279M Deluxe Sound Card Interface, an MFJ-945E mobile antenna
turner, and a homebrew jumpered Inverted "V" antenna cut
for 40, 20 and 10 meters. At least 9 different
operators used this station, the majority of them never having used
the mode before. All of them made at least one contact, and the rest
had several contacts each.
David Ewing (left), KC0RNI, son of WA0KAQ &
KA0USA, upgraded his license to General last month in anticipation of
our Field Day. He came from Westminster to join us, and operated
PSK31 for the first time. In short order, he was soon instructing
others on how to use the mode and the FLdigi software. Ed (right),
NI5R, was one of the operators who will soon be using the mode from
their homes.
Station 2 accounted for 78 PSK31 contacts by a variety
of members as they learned the new mode, and 14 CW contacts made in
the early morning hours by WA0KAQ, for a total of 920 points.
Through no fault of our own, we were unable to check
into the Central Colorado Traffic Net on Saturday evening to send a
radiogram to the Colorado Section Communications Manager or to send
additional messages for bonus points. The net meets on the Colorado
Connection repeater system, and the transmit link from Colorado
Springs to Denver is unusable.
The unofficial results show our claimed score to be
2,240 points, plus 950 bonus points, for a total of 3,190 points.
The breakdown by band is as follows:
|
Band |
CW |
Digital |
SSB |
|
40 meters |
14 |
65 |
0 |
|
20 meters |
76 |
9 |
22 |
|
15 meters |
37 |
2 |
1 |
|
10 meters |
6 |
2 |
3 |
Field Day also has an educational aspect as well as
the contesting side. KA0USA put together a nice information table
where visitors could learn about amateur radio and about our club. A
dozen companies supplied catalogs, flyers and other information about
their products, and information from the ARRL was also available.
Visitors also found free iced tea, ice water, lemonade and cookies to
take their minds off the hot weather on Saturday.
Member
David Yeater framed the Pueblo West Metropolitan District Board's
proclamation that proclaimed the last week in June as Amateur Radio
Week in Pueblo West, and the club's new charter as an ARRL Affiliated
Club. Both were interesting display pieces on the table.
Our local newspaper's lack of publication for
publicity for the event hurt us, but we did have some visitors. This
was due mainly to being located near S. McCulloch Blvd. and them
seeing our signs as they drove by. Of note, one ham who had lived
here for two years and didn't know there was a club in Pueblo West
stopped to get information. He noted he was ready to sell his
equipment on eBay, but now he may be joining our club.
Though
no longer a requirement for a ham license, Morse code still holds
the fascination of many newcomers. Even young children find it to be
a fun challenge to learn it. At right, Paul, KB0JIT, shows 6-year-old
Benji Lloyd how to spell B-E-N-J-I using a keyer.
Due to sunless conditions on Saturday afternoon
following a brief period of lightning, the three 60-watt solar panels
did not produce enough current to run Station 2 through the entire
night. About 5:00 a.m. the battery voltage was dropping to about 11.3
volts on transmit, so it was decided to change the radio's power
source to a bank of four 18 Ah batteries. The batteries powered the
laptop computer and radio for the remaining 7 hours.
No Field Day or other ham event would be complete
without a ham to man the talk in station. Bill, W0NHF, our oldest and
longest licensed
member, was there to handle that task this year. He set up his
station in the motor home using battery power in case anyone needed
information or directions to get to the event.
Was the event a success? Did it meet the organizer's
expectations? Definitely! Everyone seems to have had a good
experience at Field Day, the first such event for the majority of the
members. The members worked together as a team in everything they
did, and whatever was needed they unselfishly supplied. They were
ready for new experiences, and no one seemed to leave disappointed.
With one event under its belt, so to speak, next
years' Field Day Committee will have something to build on and a
chance to make it even more of a success than this year's exercise was. |