Shortest flight paths
If we want to fly from Urbana, USA to Delhi, India, which path should we follow? The locations of the two cities are:
| Latitude | Longitude | |
| Urbana | $\phi = 40^\circ 6' 35'' \rm N$ | $\lambda = 88^\circ 12' 15'' \rm W$ |
| Delhi | $\phi = 28^\circ 36' 36'' \rm N$ | $\lambda = 77^\circ 13' 48'' \rm E$ |
Geographic coordinates are typically given in spherical coordinates, but without the radius and with the angles given in degrees, minutes, and seconds, with the latitude first, and the direction given as North/South or East/West rather than positive/negative. Also note that latitude is the elevation angle up from the equator, whereas spherical coordinates often use the inclination angle down from the polar axis.
Plotting the city locations on a map of the Earth gives the figure below.
Show:
Map of the Earth in an equirectangular projection, showing two possible flight paths from Urbana, USA to Delhi, India.
To get an idea of what it looks like to fly along a great circle path, we can view the crew movies taken from the ISS. The movies taken at night are especially evocative, such as this montage by Michael König.
Technically the ISS is not following a great circle path around the Earth, because the Earth is rotating underneath it. However, because the speed of the ISS is much higher than the Earth's rotational velocity (90 min versus 24 h period), these paths are close to being great circles.
Shortest paths on the sphere
Finding the shortest distance between two points on the sphere is not a simple calculation given their latitude and longitude. As proved below, the shortest path on the sphere is always a great circle, which is the intersection of the sphere with a plane through the origin. The shortest distance calculation thus reduces to finding the angle between the vectors $\vec{OA}$ and $\vec{OB}$, which can be easily done by finding their dot product after changing them to rectangular coordinates.
| Click and drag to rotate. | ||
| Show: | Earth transparency: % | |
| City A: | Latitude: | $\phi_1 = $ ° |
| Longitude: | $\lambda_1 = $ ° | |
| City B: | Latitude: | $\phi_1 = $ ° |
| Longitude: | $\lambda_1 = $ ° |
There are many different map projections that draw the surface of the spherical Earth on a two-dimensional map. Because the sphere is curved, a map projection cannot preserve both areas and angles simultaneously, leading to different trade-offs in choosing an appropriate projection for a given purpose. Some common projections are shown below.
Equirectangular. \[ x = \lambda, \quad y = \phi \]
Mercator: cylindrical, conformal (angle-preserving). \[ x = \lambda, \quad y = \log\left(\tan\Big(\frac{\pi}{4} + \frac{\phi}{2}\Big)\right) \]
Hobo-Dyer: cylindrical, area-preserving. \[ x = \lambda, \quad y = \frac{\sin\phi}{\cos^2(37.5^\circ)} \]
Winkel tripel: non-cylindrical, compromise. \[\begin{aligned}\small x &= \frac{1}{2} \left(\lambda \cos\phi_1 + \frac{2\cos\phi\sin\frac{\lambda}{2}}{{\rm sinc}\,\alpha}\right) \\ y &= \frac{1}{2} \left(\phi + \frac{\sin\phi}{{\rm sinc}\,\alpha}\right) \\ \alpha &= \arccos\Big(\cos\phi \cos\frac{\lambda}{2}\Big) \\ \phi_1 &= \arccos\frac{2}{\pi} \end{aligned}\]
You might also be interested in what your choice of map projection says about your personality.
Proof that great circles are shortest paths
Given any two points $A$ and $B$ on the surface of the Earth, we choose coordinate axes and use spherical coordinates so that $A$ is at $(r = r_0$, $\theta = 0$, $\phi = \pi - \phi_0)$ and $B$ is at $(r = r_0$, $\theta = 0$, $\phi = \pi + \phi_0)$. Here $r_0$ is the radius of the Earth and $0 \le \phi_0 \le \pi/2$. The total angle between $\vec{OA}$ and $\vec{OB}$ is $\Delta\phi = 2\phi_0$, so the great-circle distance between $A$ and $B$ is $r_0 \Delta\phi$. We will now prove that this is the smallest possible distance.
Consider any path from $A$ to $B$ on the Earth's surface. Suppose we travel along this path, starting at $A$ at time $t = 0$ and ending at $B$ at time $t = 1$. Then the position vector at time $t$ is given by $\vec{r}(t)$ with spherical coordinates $r_0$, $\theta(t)$, $\phi(t)$ and rectangular coordinates $x(t), y(t), z(t)$.
The length $L$ of our path can be computed by integrating the speed from the start time to the end time:
\[ L = \int_0^1 \| \dot{\vec{r}} \| \, dt = \int_0^1 \sqrt{\dot{x}^2 + \dot{y}^2 + \dot{z}^2} \, dt. \]
To switch from rectangular to spherical coordinates we use the conversion:
\[\begin{aligned} x &= r \cos\theta \sin\phi \\ y &= r \sin\theta \sin\phi \\ z &= r \cos\phi. \end{aligned}\]
Differentiating these expressions and substituting (or using the spherical velocity expression) gives the path length expression:
\[ L = \int_0^1 r_0 \sqrt{\dot{\phi}^2 + \dot{\theta}^2 \sin^2\phi} \, dt \ge \int_0^1 r_0 |\dot{\phi}| \, dt \ge r_0 \Delta \phi. \]
Here we have used the fact that $\dot{\theta}^2 \sin^2\phi \ge 0$ to see that $L$ must be at least as big as the great-circle distance $r_0 \Delta \phi$. Thus the great-circle distance is the minimum path length between $A$ and $B$ on the surface of the sphere.
All the calculations on this page have assumed a spherical model of the Earth, given by \[x^2 + y^2 + z^2 = R^2,\] where the radius of the Earth is $R = 6371\rm\ km$.
Because it spins with a period of about 24 hours, the Earth bulges outwards so the center is further from the equator than from the poles. A shape that better approximates the true Earth is thus an ellipsoid, given by: \[ \left(\frac{x}{R_{\rm xy}}\right)^2 + \left(\frac{y}{R_{\rm xy}}\right)^2 + \left(\frac{z}{R_{\rm z}}\right)^2 = 1, \] where $R_{\rm xy} = 6378\rm\ km$ and $R_{\rm z} = 6357\rm\ km$.
Computing shortest path distances on ellipsoids turns out to be much harder than shortest paths on spheres. One set of equations for doing this are known as Vincenty's formulae.
There is no single best ellipsoid that fits the Earth. Instead there are many different ellipsoids in use, each of which fit the Earth better near different countries (e.g., NAD 83 for North America and WGS 84 for GPS world-wide). When even more accuracy is needed, such as for satellite orbit modeling, then true geoid models are used, with spherical harmonic expansions determined from satellite gravity measurements.


Composites (brokkr.composites
)¶
Summary¶
Tools for composite laminates.
All calculations are performed by using classical laminate theory (CLT) under the following assumptions:
- Lamina are generally orthotropic.
- Lamina properties and values are assumed to be in the lamina coordinate system (i.e. 12-plane).
- Lamina angles (
Lamina.theta
) are in degrees, measured from the laminate x-axis to the lamina 1-axis. - The laminate z-direction is upward, away from the bottom surface.
- Reported strain values are in engineering strain.
- All loads and moments are running values supplied as force or moment per unit width.
- Unit systems are consistent (i.e. SI, US, or Imperial).
- Equations and symbol conventions are per NASA-RP-1351 [4] and Jones [5].
References
| [4] | Nettles, A.T., “Basic Mechanics of Laminated Composite Plates”, NASA Marshall Space Flight Center, Alabama, NASA-RP-1351, October 1994 |
| [5] | Jones, Robert M. “Mechanics Of Composite Materials”, Taylor & Francis, Inc., 1999 |
Module Contents¶
-
class
brokkr.composites.
Lamina
(t, E1, E2, nu12, G12, a11, a22, b11, b22, F1=1, F2=1, F12=1, ftype='strain')¶ Bases:
object
An individual lamina.
The
Lamina
class exists for material property assignment. To consider loading, thermal effects, or deflection, see thePly
andLaminate
classes.-
E1, E2, G12
elastic moduli in the lamina 1-, 2-, and 12-directions
Type: float
-
a11, a22
coefficients of thermal expansion (CTE) in the lamina 1- and 2- directions
Type: float
-
b11, b22
coefficients of hygroscopic expansion (CTE) in the lamina 1- and 3- directions
Type: float
-
F1, F2, F12
lamina strengths in each direction
Type: float
-
ftype
¶ lamina strength type
Type: {‘strain’, ‘stress’}
-
is_fully_defined
¶ Check if lamina is fully defined with proper attr data types.
-
-
class
brokkr.composites.
Ply
(*args, **kwargs)¶ Bases:
brokkr.composites._lamina.Lamina
A Ply for use in a Laminate.
Extended
Lamina
. While theLamina
class exists for defining material properties, thePly
class is intended to extend its functionality further for considering loading and thermal effects.Ply
instances may exist on their own, but they are intended to function as constituent items of aLaminate
.Attribute TypesNot all attributes of are able to be directly modified. Attributes are divided into ‘base’ and ‘calculated’ values categories and are prescribed by the class attributes__baseattr__
and__calcattr__
, respectively. Base attributes may be set freely, while calculated attributes are ‘locked’ and updated based on the values of base attributes.AssumptionsThe following assumptions apply to all Ply objects:- Ply z, zk, and zk1 are all measured assuming that positive is upward, TOWARD the top surface of the laminate.
- Theta is in degrees, measured from the laminate x-axis to the lamina 1- axis.
-
t, E1, E2, nu12, G12, a11, a22, b11, F1, F2, F12, ftype
See
Lamina
attribute definitions
-
Q
¶ Ply stiffness matrix in the Ply coordinate system
Type: 3x1 numpy.ndarray
-
Qbar
¶ Ply stiffness matrix in the Laminate coordinate system
Type: 3x1 numpy.ndarray
-
T
¶ Ply transformation matrix
Type: 3x1 numpy.ndarray
-
Tinv
¶ Inverse of the Ply transformation matrix
Type: 3x1 numpy.ndarray
-
e_m, e_t, e_h
Ply strains due to mechanical, thermal, and hygroscopic loading
Type: 3x1 numpy.ndarray
-
s_m, s_t, s_h
Ply stresses due to mechanical, thermal, and hygroscopic loading
Type: 3x1 numpy.ndarray
-
failure_theory
¶ The failure theory for calculating the failure index
Type: {‘strain’, ‘stress’, ‘Tsai-Hill’}
-
static
calc_failure_index
(theory, F1, F2, F12)¶ Calculate the failure index for a given failure theory.
Parameters: - theory ({'strain', 'stress', 'Tsai-Hill'}) – failure theory for which to calculate a failure index
- F2, F12 (F1,) – strengths of the material
Returns: The failure index
Return type: Notes
A ply is considered to fail if the failure index for an applied load is equal to or greater than one. Failure indicies for each failure theory are calculated according to the following equations per the BJSFM User Manual [6].
Max strain (
theory='strain'
):\[\mathrm{FI} = \mathrm{min} \left( \frac{\varepsilon_1}{F_1},\quad \frac{\varepsilon_2}{F_2},\quad \frac{\gamma_{12}}{F_{12}} \right)\]Max stress (
theory='stress'
):\[\mathrm{FI} = \mathrm{min} \left( \frac{\sigma_1}{F_1} = 1,\quad \frac{\sigma_2}{F_2} = 1,\quad \frac{\tau_{12}}{F_{12}} \right)\]Tsai-Hill (
theory='Tsai-Hill'
):\[\mathrm{FI} = \left( \frac{\sigma_1}{F_1} \right)^{2} + \left( \frac{\sigma_2}{F_2} \right)^{2} + \left( \frac{\tau_{12}}{F_{12}} \right)^{2} - \frac{\sigma_1 \sigma_2}{F_1^2}\]Note
Modified Tsai-Wu and Hoffman criteria are not supported as they require separate strength values for tension and compression
References
[6] Ogonowski, J.M, Effect of Variances and Manufacturing Tolerances on the Design Strength and Life of Mechanically Fastened Composite Joints, Volume 3 - Bolted Joint Stress Field Model (BJSFM) Computer Program User’s Manual, McDonnell Aircraft Company, AFWAL-TR-81-3041 VOLUME 3, pp. 8-9, 15 April 1981
-
e
¶ Total strain.
-
classmethod
from_lamina
(lamina, laminate, theta)¶ Create a new Ply object from a Lamina object.
Parameters: Returns: Return type: Ply
object
-
margin
¶ The margin of safety.
-
s
¶ Total stress.
-
zk
¶ The vertical location of the lamina’s top plane.
-
zk1
¶ The vertical location of the lamina’s bottom plane.
-
class
brokkr.composites.
Laminate
(*args, **kwargs)¶ Bases:
dict
A composite laminate made up of multiple orthotropic lamina objects.
Laminate
instances containPly
instances and used for calculating the effects on individual lamina in a laminate stackup. All calculations adhere to classical laminate theory (CLT).Parameters: *plies (Lamina, Ply, or string) – lamina or plies that make up the laminate ordered from the bottom surface to the top surface. In creating the Laminate, either a sequence of objects or a file path to a CSV file containing all the appropriate data can be supplied. -
N_m, N_t, N_h
mechanical, thermal, and hygroscopic running loads
Type: 3x1 numpy.array_like
-
M_m, M_t, M_h
mechanical, thermal, and hygroscopic running moments
Type: 3x1 numpy.array_like
-
Ex, Ey, Gxy
effective laminate moduli
Type: float
-
e_0m, e_0t, e_0h
laminate midplane strain due to mechanical, thermal, and hygroscopic loading
Type: 3x1 numpy.array_like
-
k_0m, k_0t, k_0h
laminate midplane curvature due to mechanical, thermal, and hygroscopic loading
Type: numpy.array_like
-
ABD
¶ The laminate ABD matrix.
-
append
(new_ply)¶ Add a new ply to the Laminate.
Parameters: new_ply (Lamina or Ply) – the ply to be added to the laminate Notes
Added plies are assumed to be placed on TOP SURFACE of existing laminate.
-
check_ply
(obj)¶ Check if object is a Ply or Lamina object.
Parameters: obj (any) – the object to be type checked Returns: the original Ply or converted Lamina object Return type: Ply Raises: TypeError
– if obj is neither a Ply or Lamina object
-
e_0
¶ Total midplane strain.
-
flip
()¶ Flip the stacking sequence of the Lamina.
-
from_csv
(inputFile, append=False)¶ Determine laminate properties from input CSV file.
Parameters: - inputFile (string) – file path to CSV file
- append (bool, optional) – flag indicating whether to clear the laminate before adding plies
from the input file; default is
False
Notes
The CSV is assumed to have the plies listed in ascending order (i.e. the bottom ply is listed first) and must have the following headers:
Header Description t
thickness theta
angle of ply relative to laminate E1
modulus in lamina 1-direction E2
modulus in lamina 2-direction nu12
Poisson’s ratio G12
shear modulus a11
coeff. of thermal expansion in 1-direction a22
coeff. of thermal expansion in 2-direction b11
coeff. of hygroscopic expansion in 1-direction b22
coeff. of hygroscopic expansion in 1-direction
-
is_balanced
¶ Return if True if laminate is balanced.
-
is_symmetric
¶ Return if True if laminate is symmetric.
-
k_0
¶ Total laminate curvature.
-
layup
¶ Laminate layup.
-
pop
(key, renumber=True, as_lamina=False)¶ Remove item from Laminate and return Ply.
Parameters: Returns: Ply – Description of returned object.
Return type:
-


Best known for his semi-improvised cinematic representations of dysfunctional families and personal relationships trapped in the oppressive web of British class society, director and screenwriter Mike Leigh seemed like an unlikely candidate for a film based on the career of Gilbert and Sullivan. The surprise is that he not only has produced one of the greatest entertainment biographies of all time, one that is faithful to the effervescent quality of Gilbert and Sullivan's light operas, he has also managed to tell the story of the frustration and suffering that went on behind the scenes. In doing so, he remains faithful to the humanitarian spirit that defined his earlier work.
"Topsy-Turvy" proceeds from the time in G&S's career when critics have begun to detect a loss of creativity. Opening with the debut of "Princess Ida", we see librettist Sir William Gilbert (Jim Broadbent) in a rage over a review stating that the new work merely repeats well-worn themes that have already appeared in their work over the past 25 years. However, composer Sir Arthur Sullivan (Allan Corduner) agrees completely with the negative review and announces his refusal to collaborate with Gilbert until he has had the chance to compose a serious opera based on a lofty theme rather than another entertainment.
This coincidentally is the aspiration of film-maker John L. Sullivan in Preston Sturges's screwball comedy "Sullivan's Travels", who is tired of making comedies. This Sullivan wants to break free of contractual ties to a Hollywood film studio in order to make a film about the plight of the common man during the depths of the depression, while the other Sullivan wants to be more like Verdi or Wagner. (Sullivan did manage to create one serious opera--Ivanhoe--which remains justly neglected.) D'Oyly Carte (Ron Cook), under whom Gilbert and Sullivan are obliged to contractually, has the same attitude toward Arthur Sullivan that the film moguls have in "Sullivan's Travels": why rock the boat. Not only does the tried and true please the people, it also generates revenue. In essence, this is the primary source of dramatic tension in "Topsy-Turvy", namely the conflict between art and commerce.
Ever the hard-headed realist, Gilbert is depicted phoning the theater box-office each morning after a performance in order to record the receipts into a ledger book in his library. (One of the film's merits is its attention to period detail. The phone is an unwieldy contraption which forces people on either end to begin and end each exchange with, "I am speaking now. Can you hear me." It has been argued, by the way, that the period of the most rapid technological change in human history is exactly the period depicted in "Topsy-Turvy", when telephones, telegraphs, steamships and electrical lights were first being introduced.)
This cash nexus is reflected not only between the clash between Gilbert and Sullivan, but also in the manner in which the repertory company in the Savoy Theater struggled for a sense of dignity and accomplishment when management regarded them merely as wage labor.
In one of the most powerful scenes of the film, the principal male actor-singers meet with impresario D'Oyly Carte for a salary review. James Grossmith (Martin Savage) is told that he is to receive a 7.5 percent review, which is not only less than he expected, but undermines his sense of self-worth as an artist. Anybody who has ever been subject to a performance review in a corporation, upon which salary increases are based, will appreciate how demeaning this experience can be. Performing for Grossmith is as daunting a task as it is for modern-day performers and he resorts to the same crutch favored by many a rock star, the heroin needle. On the evening of the first performance of "The Mikado," Grossmith is shown in his dressing-room plunging a needle into a scarred arm just five minutes before the opening curtain.
The females also have it tough. Leonora Braham (Shirley Henderson), the Savoy's ingénue, is not only an alcoholic, she can't seem to find a unmarried man who will take an interest in her. As soon as she mentions that she has a young son from a previous marriage, they shun her. When co-star Jessie Bond (Dorothy Atkinson) suggests that she sing at recitals in the home of London's wealthy, so as to meet eligible bachelors, Braham complains about the class prejudices that she finds there. Meanwhile, Bond performs on and offstage flirtatiously night after night, despite a festering leg wound which she gamely has fresh bandages applied to each day.
Despite the pain and frustrations of people from top to bottom of the chain involved in producing these light-hearted operettas, when they mount the stage we and the audience are left with sheer pleasure. This is one of the great accomplishments of Leigh's film. It ranks with Ingmar Bergman's filming of an onstage performance of Mozart's "The Magic Flute." What gives Leigh's filming of G&S's classic ensemble pieces even more power is its unstinting but compassionate portrayal of the cast's vulnerabilities.
Louis Proyect The Marxism List is at: http://www.marxmail.org
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


NOVEMBER 9 The Dedication of the Lateran Basilica
The
Lateran Basilica is the cathedral of
In
the basilica itself, the Mass of the Common of the Dedication of a Church is
used.
ENTRANCE ANTIPHON
I saw the
holy city, a new Jerusalem, coming down out of heaven from God, prepared as a
bride adorned for her husband.
Or:
Behold Godís
dwelling with the human race. He will dwell with them and they will be his
people, and God himself with them will be their God.
The GLORIA is said. (English, Latin)
COLLECT
O God, who from
living and chosen stones prepare an eternal dwelling for your majesty, increase
in your Church the spirit of grace you have bestowed, so that by new growth
your faithful people may build up the heavenly Jerusalem. Through our Lord
Jesus Christ, your Son, who lives and reigns with you in the unity of the Holy
Spirit, one God, for ever and ever.
Or:
O God, who
were pleased to call your Church the Bride, grant that the people that serves
your name may revere you, love you and follow you, and may be led by you to
attain your promises in heaven. Through our Lord Jesus Christ, your Son, who
lives and reigns with you in the unity of the Holy Spirit, one God, for ever
and ever.
The
PROFESSION OF FAITH (Creed) is
said. (English, Latin)
PRAYER OVER THE OFFERINGS
Accept, we pray, O Lord, the offering made here, and grant that by it those who seek your favour may receive in this place the power of the Sacraments and the answer to their prayers. Through Christ our Lord.
COMMUNION ANTIPHON
Be built up like living stones, into a spiritual house, a holy priesthood.
PRAYER AFTER COMMUNION
O God, who
chose to foreshadow for us the heavenly Jerusalem through the sign of your
Church on earth, grant, we pray, that, by our partaking of this Sacrament, we
may be made the temple of your grace and may enter the dwelling place of your
glory. Through Christ our Lord.


Setup
The setup
function is used to prepare your game before it's
first run. This could include placing enemies, filling up health/lives
of the player and resetting the score. The setup function is executed at
the start of every game after loading.
The main difference between setting variable starting values in the
global initializers versus setting them in the
setup
function is that the setup function is re-run
whenever the custom MicroCanvas method reset
is called by
the code. This allows you to reset the game state (and effectively start
a new game) without too much hassle (e.g. after the player has lost all
lives, or has been defeated).


Parse HTTP X-Forwarded-For header
This is a Node.js module available through the
npm registry. Installation is done using the
npm install
command:
$ npm install forwarded
var forwarded = require('forwarded')
var addresses = forwarded(req)
Parse the X-Forwarded-For
header from the request. Returns an array
of the addresses, including the socket address for the req
, in reverse
order (i.e. index 0
is the socket address and the last index is the
furthest address, typically the end-user).
$ npm test


WITNESS LIST Jurisprudence Committee April 23, 2001 - 1:30P HB 62 FOR: Herman, Guy Judge Presiding (Self and Judges of the Statutory Probate Courts of Texas), Austin, TX Registering, but not testifying: For: McDonald, Carol Association Executive (Independent Colleges and Universities of Texas, Inc.), Austin, TX HB 898 FOR: Herman, Guy Judge Presiding (Self and Judges of the Statutory Probate Courts of Texas), Austin, TX Rothermel, John Title Insurance (Stewart Title) Registering, but not testifying: For: Lee, Randy M. Sr. Vice President, Governmental Affairs (Stewart Title Guaranty Co.) HB 899 Registering, but not testifying: On: Baldwin, Howard Deputy Atty General For Child Support (Office of the Attorney General), Austin, TX HB 1132 FOR: Jones, Jerry Attorney (Texas Academy of Probate Lawyer), Austin, TX Registering, but not testifying: For: Herman, Guy Presiding Judge (Self and Judges of the Statutory Probate Courts of Texas), Austin, TX HB 2275 Registering, but not testifying: On: Baldwin, Howard Deputy Atty General for Child Support (Office of the Attorney General), Austin, TX HB 2428 FOR: Krampitz, Tom (Texas CASA, Inc.) SB 548 ON: Givens, Kevin Supervisor ALR Appellate Section (Texas Department of Public Safety) SB 1434 Registering, but not testifying: For: Langley, J.D. 85th District Court (Judges in Brazos County) SB 1436 FOR: Jackson, Jim Dallas County Commissioner (Dallas County Commissioners Court), Dallas, TX Jenevein, Bob Judge (Dallas County Judiciary), Dallas, TX Price, John Wiley Dallas County Commissioner (Dallas County Commissioners Court) Registering, but not testifying: On: Bethke, James D. Attorney/Special Counsel OCA (Office of Court Administration) Henry, Rene (Office of Court Administration), Austin, TX SB 1719 FOR: Buchanan, Michael Manufacturing Eng. (DMDA) Colton, Colleen Executive Director (Self), Fort Worth, TX Diano, Chip (Self) Ferchill, Pat Judge, Probate Ct. #2, Texas (Self), Fort Worth, TX Fields, Steven D. Court Commissioner/Attorney (Self), Fort Worth, TX Harris, Lauralee Executive Director (Mental Health Association of Tarrant County), Fort Worth, TX Kiser, M.D., Sanford Physician (Texas Society of Psychiatric Physicians), Dallas, TX Powell, Charles Volunteer (Self), Arlington, TX Shorter, Arlene Social Worker, Probate Court (Self), Fort Worth, TX Swinney, James Consultant (Texas Depressing and Manic Depressing Association), Grapevine, TX AGAINST: Braggeman, Barbara Gaurdian-mom (self and son, Tommy) Breeding, Ph.D., John Psyhologist (Self and World Association of Electroshock Survivors) Dolan, Dr. Moira Terese Physician (Self), Austin, TX Hallagain, Mike Texas Mental Health Consumers (Texas Mental Health Consumers) Hearon, Genevieve Executive Director, Capacity for Justice (Self) Herman, Guy Judge, Probate Court of Travis (Self) Kern, Diana (Self) Marshall, Susan Policy Analyst (The Arc of Texas), Austin, TX McPhail, Jennifer (ADAPT) Mitchell, Beth Attorney (Advocacy, Inc.) Pilgrim, Judy Citizen (Consumers), Brashear, TX Polley, Earl Chairman (Texas Mental Health Consumers, Inc.), Brashear, TX Wisdom, Marie B. President and CEO (Advocates for Nursing Home Reform) ON: Burwell, Gladys Judge - Galveston County (Probate Court), Galveston, TX Hazen, Sheila (DMDA) Herman, Guy Presiding Judge (Statutory Probate Court Judges), Austin, TX Registering, but not testifying: For: Bush, John R. Executive Director (Texas Society of Psychiatric Physicians), Austin, TX Hill, Ann T. Program Director of Guardianship (Self), Fort Worth, TX Lovelace, Joe Advocacy Chair (National Alliance for the Mentally Ill of Texas), Dripping Springs, TX Against: Borel, Dennis (Coalition of Texans with Disabilities), Austin, TX Carter, Candice State Leg Rep (AARP) Denton, Ann (Self), Austin, TX Fecher, R.Ph., Lauren Pharmacist - Medical Director (Citizen's Commission on Human Rights), Austin, TX Ferris, Beth Retired (Texas Advocates for Nursing Home Residents), Austin, TX Greebon, Karen (ADAPT of Texas) Johnson, Bill (ADAPT) McMurrough, Amy Publicist (Self), Austin, TX Metcalf, Rand (ADAPT of Texas) Metz, Albert Sparky Advocate (ADAPT) Prough, Andrew Deputy Director (Citizens Commission of Human Rights), Austin, TX Tompleton, J.J. Advocate (ADAPT) Wilson, Laura Ann Antique Dealer/Rancher (myself), Midland, TX On: Anderson, Kathleen Director (HHSC Guardianship Alliance/ Guardian Advisory Board), Austin, TX Lopez, Chris Attorney (Texas Department Mental Health and Mental Retardation), Austin, TX Providing written testimony: Against: Thormann, Richard Attorney (Self), Austin, TX On: McPherson, Kim Public Policy Specialist (The Mental Health Association in Texas), Austin, TX


Due: {{ viewItem.due_date }}
Assigned To: {{ userNames[viewItem.assignee] }}
Category: {{ categories[viewItem.category] }}
Current Column: {{ viewItem.laneName }}
{{ attachment.name }} Uploaded by {{ userNames[attachment.user_id] }} on {{ attachment.date }} Deleting...
Posted Edited by {{ userNames[comment.user_id] }} on {{ comment.date }}
{{ activity.comment }}
{{ activity.date }}
Comments
Posted Edited by {{ userNames[comment.user_id] }} on {{ comment.date }}


A C D E F G H I J L M P R S U
All Classes All Packages
All Classes All Packages
All Classes All Packages
U
- update(long, Menu) - Method in interface com.lambdaschool.restaurants.services.MenuService
-
Replaces the menu dish and price based on the given primary key
- update(long, Menu) - Method in class com.lambdaschool.restaurants.services.MenuServiceImpl
- update(long, Payment) - Method in interface com.lambdaschool.restaurants.services.PaymentService
-
Updates the name of the given payment
- update(long, Payment) - Method in class com.lambdaschool.restaurants.services.PaymentServiceImpl
- update(Restaurant, long) - Method in interface com.lambdaschool.restaurants.services.RestaurantService
-
Updates the provided fields in the restaurant record referenced by the primary key.
- update(Restaurant, long) - Method in class com.lambdaschool.restaurants.services.RestaurantServiceImpl
- updatePaymentName(String, long, String) - Method in interface com.lambdaschool.restaurants.repos.PaymentRepository
-
Updates the name of the payment based on the given payment id.
- updateRestaurant(Restaurant, long) - Method in class com.lambdaschool.restaurants.controllers.RestaurantController
-
Given a complete Restaurant Object Given the restaurant id, primary key, is in the restaurant table, replace the restaurant record, restaurant payment combinations and menu items records.
- UserAuditing - Class in com.lambdaschool.restaurants.services
-
Spring Boot needs to know what username to use for the auditing fields CreatedBy and ModifiedBy For now, a default name will be used
- UserAuditing() - Constructor for class com.lambdaschool.restaurants.services.UserAuditing
All Classes All Packages


{% extends "candidate/candidate_portal.html" %} {% load bootstrap3 %} {% block page_title %}Our Revolution - Candidate Dashboard{% endblock %} {% block content %} {{ block.super }}
This page is for candidates to manage their questionnaires.
To access your candidate questionnaire, make sure you sign in with the same email address that the local group nomination was sent to.
{% if applications %}| Application | Status | |
|---|---|---|
| {{app}} | {{app.questionnaire.get_status_display}} | {% if app.questionnaire.status == 'complete' %} View {% else %} Edit {% endif %} |
You have not received any candidate questionnaires.
{% endif %}Questions? Let us know at info@ourrevolution.com


Although matchers are normally used to specify acceptable parameter values, they can also be used to specify acceptable objects or methods in an expectation, using an API syntax similar to that of jMock 1. To do so, use a matcher where you would normally refer to a mock object directly in the invocation count clause. Then chain clauses together to define the expected invocation. The following clauses are supported:
method(m) |
A method matching the Matcher m is expected. |
method(r) |
A method with a name that matches the regular expression r is expected. |
with(m1, m2, ... mn) |
The parameters must match matchers m1 to mn. |
withNoArguments() |
There must be no parameters |
An expectation of this form can be followed by ordering constraints (sequences and states) and actions (e.g. returning values or throwing exceptions) like a normal, literal expectation.
To allow invocations of any bean property getter on any mock object:
allowing (any(Object.class)).method("get.*").withNoArguments();
Allow a method to be called once on any one of a collection of mock objects:
oneOf (anyOf(same(o1),same(o2),same(o3))).method("doSomething");


**Face Off** Reviewed by Jeff Walters
A couple of months ago, when I first downloaded the Face/Off trailer from the Net, my initial reaction was a fourteen carrot gold 'yawn'. Followed swiftly by a press of my computers delete key, not wanting to waste six or seven megabytes of precious space on this piss-poor trailer. Then I started reading the first wave of reviews from the U.S.....unique...excellent....must-see. Well, I thought still skeptical, I suppose I might as well go see it when it gets here. 'Here', of course, was still three months away.
I'll admit, when I trotted off to see this film, the only John Woo movie I had seen before was the fairly enjoyable but highly forgetable Broken Arrow. I'd heard good things about his previous work with movies like Hard Boiled, but his films were definitely not on my must-see list. That, let me tell you, has changed completely. I knew this fact only five minutes into the film, after the brilliantly shot and acted opening sequence where Sean Archer loses his son blew me off my feet.
The acting throughout the film is staggeringly good for an action flick. Seriously. I've never been a big John Travolta fan, but he, like Cage, perfectly suited his role in the movie.....sorry, make that 'roles' in the movie. Even Travolta's great performance, however, paled in comparison to Cage's character portrayals. My favourite Cage scene was definitely when he was crashed out in compardre Dietrich Hassler's hideout.  he mutters coldly.
Now don't go thinking from the previous comments about brilliant acting that this is a drama focused movie - it's not. That's what really makes this movie unique. It's an action movie with brilliantly portrayed characters.....not a common mix at all. Suspension of disbelief is paramount in this movie though.....that's the only way to overlook the fact that Travolta and Cage fire around 5671 rounds at each other....and never hit.
Several action scenes are just so well choreographed that they just make wish that you could press 'rewind' and watch it over again. The part where Archer and Troy have a stand off on either side of a double-sided mirror is just plain brilliant.
Whilst Cage's and Travolta's performances would be enough alone to sustain most movies, the lesser characters are just as intriguing. Joan Allen, who usually sticks to the straight drama movies, plays her part perfectly as Archer's long suffering wife. I like the fact that her character didn't end up toting a gun at the end of the movie...it would have wrecked her potrayal. Gina Gershon was surprising to say the least as Castor Troy's mistreated girlfriend.....make that *one of* Castor Troy's mistreated girlfriends. Other movies would have used her character as just window dressing...a sex object, but instead her character is very strong and independent. Dominique Swain, who plays Archer's daughter, also does a nice job, though her character is not as explored as much as Allen's or Gershon's.
Faults? Well...there were some I have to say. First, the movie's ending, whilst being very good overall, was a bit too drawn out for it's own good. After the two combatants begin duelling again after the final boat crash you can't help but think - "Geez, are you guys nuclear powered or what?". There were certain bits that weren't handled properly, like where Archer appears safe and sound on solid ground after jumping off the converted oil platform/prison - more explanation here would have been nice.
Overall, this movie was not perfect. But I thought it was about as close as an action movie has ever came to perfect. Many critics have claimed that this movie will change the way action movies are made.....I certainly hope so.
4 1/2 stars out of 5
The review above was posted to the
rec.arts.movies.reviews newsgroup (de.rec.film.kritiken for German reviews).
The Internet Movie Database accepts no responsibility for the contents of the
review and has no editorial control. Unless stated otherwise, the copyright
belongs to the author.
Please direct comments/criticisms of the review to relevant newsgroups.
Broken URLs inthe reviews are the responsibility of the author.
The formatting of the review is likely to differ from the original due
to ASCII to HTML conversion.
Related links: index of all rec.arts.movies.reviews reviews


--- layout: page title: About permalink: /about/ slug: about ---
Hardware lover and for a long time travelling through the mysteries of microprocessors and microcontrollers, now enjoying the backstage of the www world :) Currently hacking @locaweb on Emailmarketing and SMTP teams.


Alumni Strategy Team started working in August 2016. The goal of the team has been to define Alumni Strategy for the next years in order to raise the involvement of our Alumni, both the of the current Alumni, as well as of the future generations.
Every EESTEC-er that becomes an Alumni surely misses traveling to events and hanging out with other EESTEC-ers. The best proof of this is a large number of Alumni that attended Alumni Congress in Belgrade in April 2016. That’s why we decided that main efforts will be focused on the Alumni Congress that will be organized during Spring Congress in Ljubljana.
By the beginning of 2017, Alumni Relations Team had started working on those goals. We got the huge support from Ljubljana’s Alumni: Peter Ušeničnik, LC Ljubljana Alumni Section president, and Borut Čeh, LC Ljubljana Alumni. As Alumni Relations Coordinator, I would like to tell them one more time – thank you!
After exchanging many emails in order to define some crucial goals of ALC (ALumni Congress), we had one meeting with SCOC (Spring Congress Organizing Committee), in which we defined the 2 session topics. In one of the sessions, we will discuss the involvement and structure of Alumni community, as well as the way of improving the next Alumni Congress(es).
In order to get Alumni applications for ALC, Alumni Relations Team has been making the strategy for PR (Public Relations). Our main guiding principle has been to share with the Alumni facts, articles or photos that they would like to see or be reminded off. That’s why, for the past few months, we have been collecting materials which we could share with the Alumni via the mailing list or on Alumni Facebook page. I must admit it hasn’t been easy to get some materials from Alumni themselves since they are all busy adult people now, who don’t have so much free time anymore. That’s why I would like to thank one more time to the Alumni who sacrificed their free time in order to write an article or find some forgotten photos.
We were able to get 3 “founder” stories – stories that are written by founders of certain LCs. One of those stories is already published on this blog: HOW EVERYTHING STARTED - LC GLIWICE
The Alumni Congress itself will take place from 21 to 23 of April. Friday will be arrival day with Alumni party in the evening, in a well-known club in Ljubljana. It is an opportunity for all the Alumni to meet their old friends and have as much fun as when they were active EESTEC-ers.
On Saturday afternoon, Alumni will be invited to lunch, after which Alumni sessions will be held in a relaxed environment of one Ljubljana’s restaurants. As Saturday is also the first day of Spring Congress, the Opening Ceremony will be held on Saturday evening. After that, both active and Alumni members will be able to party together. It will be a unique opportunity to see many EESTEC generations in one place, which will all one day finish their studies and become Alumni, too.
At the end, I can say, as an alumnus myself, that I’m proud and happy to be part of the organisation of this event. I can’t wait to be there!


Test!
Testing scroll bars and interactive div resizing
Progress Report - Click Here to Hide/Show
♣ Description: This is an HTML file that serves as a place to practice formatting two adjacent div's. The left div only contains text and constitutes 70% of the window width. The right div contains a table and constitutes 25% of the window width. The challenge is to maintain the shape of the table (within the right div) as well as the its width proportional to the left div as the window is being resized. ♣ Learned &/or Implemented: Adding a scoll function into the table would allow the shape of the table to be maintained as the window is being resized. To do this, overflow: auto was added to the styling of the div that contains the table (.tableTest). The next function that was added was an event function that registered when the window was being resized and prints "Window Has Been Resized" message in the console log. To implement this, a jQuery function was created that to watch for a window resizing event. ♣ Lots of useful info found on stackoverflow.com! Elements that work: – Adding scroll bar into single div: shown on the right. – Message appears in console log informing user that a window resizing event has occured. Elements in progress: – Formatting the text area to look nice.


About This Page
This page contains a collection of all the repos I’ve added to Github or would like to add in the near future. The majority of the repos exist as a result of me playing around with code based on a specific need for a website or based on concepts / tutorials seen online (see attributions on specific repos). If there are any questions, please feel free to contact me on any of the sites below or if there are any issues with any of the individual repos, please feel free to create an issue on their respective page. I hope you enjoy!


|
GrPPI
0.3.1
Generic and Reusable Parallel Pattern Interface
|
GrPPI is an open source generic and reusable parallel pattern programming interface developed at University Carlos III of Madrid. Basically, GrPPI accommodates a layer between developers and existing parallel programming frameworks targeted to multi-core processors, such as ISO C++ Threads, OpenMP , Intel TBB, and FastFlow. To achieve this goal, the interface leverages modern C++ features, meta-programming concepts, and generic programming to act as switch between those frameworks.
Furthermore, its compact design facilitates the development of parallel applications, hiding away the complexity behind the use of concurrency mechanisms. The parallel patterns supported by GrPPI are targeted for both stream processing and data-intensive applications and can be composed among them to match more complex constructions. In a nutshell, GrPPI advocates for a usable, simple, generic, and high-level parallel pattern interface, allowing users to implement parallel applications without having a deep understanding of today's parallel programming frameworks and third-party interfaces.
Currently, GrPPI supports the following patterns:
Additionally, streaming patterns allow the use of multi-context execution, aiming to allow the combination of multiple back-ends for the execution of a single pipeline.
See the install and compile notes.
Please cite this publication in any work using our library:
The GrPPI library has been partially supported by:


Functional Geometry
This work is based on the Functional Geometry paper by Peter Henderson, the most recent version of this document is from 2002, the original version is from 1982. In this paper Peter Henderson deconstructs the M.C. Escher’s woodcut Square Limit using an algebra of pictures.
Peter Henderson also mentions that this idea can be applied to many more complex domains such as music or animation.


Inheritance diagram for Bp::BpInterconnect::BpExternalCommand:
Public Member Functions | |
| virtual void | ResetAndInit (const string &command_with_arguments, int frameworkId) |
| virtual BpCommandOptionsBase * | GetParser ()=0 |
| gets the parser object for predefined command (implemented in sub-classes) | |
| virtual exec_status | Execute (bp_output_cb_t *outputCb, uvm_ml_time_unit timeUnit, double timeValue)=0 |
| virtual void | TraceExecute (int frameworkId) |
| virtual void | TraceResult (exec_status result) |
| virtual void | SetDefaultsAll ()=0 |
| resets flag values to defaults before starting to parse new command line | |
| virtual bool | SetTheOption (int optIndex)=0 |
| virtual bool | SetOptionArgument (int optIndex, const char *argumentPtr)=0 |
| API called by parser to pass per-option result with argument. | |
| virtual bool | MissedArgumentError (int optIndex, const char *argumentPtr)=0 |
| virtual bool | QueryOptionsConsistency ()=0 |
Definition at line 1554 of file bp_interconnect.h.
| virtual exec_status Bp::BpInterconnect::BpExternalCommand::Execute | ( | bp_output_cb_t * | outputCb, | |
| uvm_ml_time_unit | timeUnit, | |||
| double | timeValue | |||
| ) | [pure virtual] |
interface of the method to either broadcast the command to all the frameworks (for internal commands) or to execute it directly (for internal commands)
| frameworkId | - the framework the command was originated from (-1 - interactively) | |
| command_with_arguments | - full command-line (without uvm_ml(_) prefix) | |
| outputCb | - additional stream to print output to | |
| timeUnit | - current simulation time units enum (TIME_UNIT_UNDEFINED if the framework does not have an ability to advance time) | |
| timeValue | - numeric value of current simulation time scaled according to timeUnit |
Implements Bp::BpInterconnect::BpPredefinedCommand.
Implemented in Bp::BpInterconnect::BpCommandTraceRegister.
| virtual bool Bp::BpInterconnect::BpExternalCommand::QueryOptionsConsistency | ( | ) | [pure virtual] |
parse post-processing: check for errors (i.e. mandatory flags and/or arguments that were not supplied); also checking for contradicting flags and appends missed (implied) default parameter/value
Implements Bp::BpInterconnect::BpPredefinedCommand.
Implemented in Bp::BpInterconnect::BpCommandTraceRegister.
| virtual bool Bp::BpInterconnect::BpExternalCommand::SetTheOption | ( | int | optIndex | ) | [pure virtual] |
API called by parser to pass per-option result with no argument
Implements Bp::BpInterconnect::BpPredefinedCommand.
Implemented in Bp::BpInterconnect::BpCommandTraceRegister.


The project was about Creating a Fashion and design for people to shop online using Angular
The project was about creating a gallary to store images
.python
.Django
Angular
.Flask
.Html
.css
Went to AIC ZION a christian based church where i did my primary education level there
Later on joined highschool in AIC ZION Secondary School
currently Iam in moringa school.
where am doing software development at core level
MORINGA SCHOOL.
Looking forward to be the best developer and to give back to the community by encouraging youths to to take part in this particular course
Also would like to empower youths through my skills
Email<EMAIL_ADDRESS>phone number:+254714067125
Location:NAIROBI/KENYA


Coding instructions for PROTEST
Please accept (green check or "a" all sentences that describe a protest event
as described in the CAMEO manual. Reject (red X or "x") all sentences that do
not have a protest according to the instructions below.
All civilian demonstrations and other collective actions carried out as protests against the target actor not otherwise specified.
Dissent collectively, publicly show negative feelings or opinions; rally, gather to protest a policy, action, or actor(s).
Protest by refusing to eat until certain demands are met
Strike; Refuse to work or cooperate until demands for leadership/policy change are met.
Protest by blocking entry and/or exit into building or area
Protest violently, riot. Protest forcefully, in a potentially destructive manner


Any theorem which states that under certain conditions, a particular kind of mapping must have a fixed point.
Eg: Any contraction mapping has a unique fixed point.


Collapse of I-5 Bridge in Washington Shows the Need to Improve Infrastructure
4 min read
The Interstate 5 bridge over the Skagit River in Washington state collapsed last week causing no deaths, but the collapse injured at least three people. It is clear that the officials responsible for maintaining the bridge did not have the funding needed to keep the bridge system in good repair. This incident showcases the need for a massive, Works Progress Administration style push to repair our infrastructure.
Before I go into what needs to be done with our infrastructure, let's first review what happened in Washington .As reported by KOMO.News, a local television station, a Washington Department of Transportation spokesperson was not aware when the bridge was last inspected. Furthermore, the Federal Highway Administration classified the bridge as "functionally obsolete" because it had an outdated design that does not meet current standards for new bridge construction. From KOMO,
Bart Treece with WDOT was unsure when the bridge was last inspected.
"All of our bridges in the area are pretty old," he said.
The bridge is not considered structurally deficient but is listed as being "functionally obsolete" - a category meaning that their design is outdated, such as having narrow shoulders are low clearance underneath, according to a database compiled by the Federal Highway Administration.
There were other issues with the bridge and many others in the state.A 1992 federal report recommended that the I-5 bridge be replaced at a cost of 8.3 million dollars. http:/
The bridge, built in 1955, has a sufficiency rating of 57.4 out of 100, according to federal records. That is well below the statewide average rating of 80, according to an Associated Press analysis of federal data, but 759 bridges in the state have a lower sufficiency score.
The fact that the I-5 Bridge and many like it have not received needed maintenance shows the need for new investment in infrastructure. The government needs to commit over 120 billion dollars to fix our bridges. Budgets for future road repairs need to be increased by 8 billion dollars per year. Despite the clear facts, politicians have done just the opposite. As the graph I open my blog post with shows, spending on infrastructure has actually decreased during the ongoing recession.
To supplement and complete infrastructure investment the federal government should enact a Works Progress Administration style jobs push. The government should pledge to hire anyone willing and able to work at minimum wage and put those hired to work on public projects, including infrastructure improvements.This program should continue even after unemployment is lowered to regular levels. A major push on infrastructure will create many jobs and many workers will be hired to complete the construction work. The current high level of unemployment shows that there is much surplus economic capacity able to be put to work.
In a depressed economy the United States government can increase spending without the need for increased taxation or other ill effects. The deficit is not a limiting factor for government investment. A country with its own, floating, non-convertable (a currency where the issuer does not pledge to convert currency for a commodity on demand) currency is not constrained in its government spending by absolute debt or deficit levels. The only constraints on spending are the effects that the spending has on inflation, unemployment, demand and other economic outcomes.
Any complaints that the debt would be increased by infrastructure improvements are not grounds to let our roads and bridges rot. There are many needed infrastructure improvements. The government should start on them as soon as possible.
#associatedpress #federalhighwayadministration #old #old #seattletimes #uncategorized #worksprogressadministration


This code can only be applied to full price items and be valid within a month. It has been sent to
your email box(the one you have registered with) and your code list, please check later.
We will announce the 5 super winners on March 16th , and Lisa will contact the winners to help you
redeem the prizes.
If you come across with any problems when visiting Choies.com, please follow the 2 steps below:
Step 1. Take the screenshot of the problem page
Step 2. Send the screenshot with the detailed problem description to<EMAIL_ADDRESS>And you will be offered amazing gifts according to the problems you submit.


I’m doing this course, to transition to Python 3 mainly. But, I’m already discovering why it’s so well regarded, and that I have much to learn!
I really like there function design recipe, it goes like this:
- Write some examples of what you want your function to do:
>>> some_function(arg) some_result >>> some_function(arg2) some_other_result
- Write the type contract:
(parameter types) -> return type # e.g. (number, number) ->int
- Write the function header, with meaningful names:
python def meaningful_func_name(meaningful_param_names):
- Write the description. Explain what is returned, and mention parameters explicitly.
- Write the body of the function (the actual code).
- Test using the examples written in point 1.
Points 1, 2 and 4 become the docstring for the function, which can be called using help(function_name). The final function might look something like this:


As a Technical Writer at C&H, I worked with engineers, supervisors, and SME's to create training manuals for new hires.
Below is an excerpt from a training manual in the Bulk Products department. It was created using MS Word so the documentation could be updated by future users as processes evolved.


PhET Test
PhET Dev (HTML)
PhET Dev (Java/Flash)
PhETMarks
Automated Tests
Scenery Unit Tests
Pull All
Refresh Perennial
Common Repositories
All repositories
Out-of-date repositories
Simulation Repositories
All repositories
Out-of-date repositories


ansible.plugins.test package¶
Submodules¶
ansible.plugins.test.core module¶
-
ansible.plugins.test.core.
regex
(value='', pattern='', ignorecase=False, multiline=False, match_type='search')[source]¶ Expose re as a boolean filter using the search method by default. This is likely only useful for search and match which already have their own filters.
-
ansible.plugins.test.core.
match
(value, pattern='', ignorecase=False, multiline=False)[source]¶ Perform a re.match returning a boolean


/usr/bin/whoami ?
Luis Montes
@MONTESLU
❤
Google Pixel 4 XL
- Snapdragon 855 CPU
- 2.5 million x the RAM
- 128 GB storage
- Multiple browsers!
- Progressive Web Apps!
Apple iPhone 11 Pro Max Ultra Extreme
- Apple A13 Bionic (7 nm+) Hexacore !
- 1.7 million x the RAM
- 512 GB storage!
- Mobile Safari
- pRoGrEsSiVe WeB aPpS
why bother with PWA/offline?
Lie-Fi 📶
navigator.onLine = true
PWA to the rescue?
- ✅Works offline
- ✅No app stores!
- 🤔Peer comunications?
- 🤔File sharing?
Peer to Peer - ask
const scanner = navigator.peers.scan();
scanner.on('peer-found', async (peer) => {
const connection = await peer.connect();
connection.send('waddup!');
});
Peer to Peer - accept
navigator.peers.on('peer-request', async (peer) => {
const connection = await peer.acceptDialog();
connection.send('hey!');
});
simple right?
Web Bluetooth
- Since Chrome 56 stable!
- Stable on MS Edge since Wednesday.
- 🤔 p2p ?
Web NFC
- Partial implementation in chrome.
- 🤔 p2p ?
Peer to Peer - over NFC
const reader = new NDEFReader();
const writer = new NDEFWriter();
Web USB ?
LoRa...
- ✅766 km, record
- ✅More bandwith
- ✅in IoT conf badges
- 🤔From the web?
- PWA (react)
- xterm.js
- Node serial shim (noopkat)
- LoRa hardware + esp32
Web Assembly
getUserMedia({video: true})
📷
- PWA (react)
- File access (FileReader.readAsDataURL(...))
- QR generation (canvas)
- webworker QR detection...
Web RTC
W3C Working Group - 23 July 2015
BeakerBrowser.com
with datPeers API


About Me
Hello! I'm Elvish Walters
- UI/UX Designer
- Photographer
- Developer
It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout.The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using 'Content here, content here', making it look like readable English.


Funeral services start for Massachusetts firefighter
by EndPlayWORCESTER, Mass. (AP) - Mourners have filled a Massachusetts church for the funeral of a fire lieutenant who died after saving two colleagues.
Funeral services for Worcester Fire Lt. Jason Menard started Monday at St. John's Catholic Church in Worcester. They will be followed by a private burial service.
While hundreds of Worcester firefighters filled the church, hundreds more from departments across the region lined the streets near the church.
Menard died Wednesday after he and his crew went into a city home to look for a baby reportedly trapped on the third floor. He helped two colleagues escape but was unable to get out himself.
The 39-year-old Menard left behind a wife and three children.
A fund for Menard's children has been set up at the Worcester Fire Department Credit Union.


FATIMA CODY STANFORD
Fatima Cody Stanford, MD, MPH, MPA is an Instructor of Medicine and Pediatrics at Harvard Medical School. At MGH, she is an obesity medicine physician for children, adolescents, and adults, Affiliated Faculty at the Mongan Institute of Health Policy, and Associate at the Disparities Solution Center. She is a Diplomate of the American Board of Obesity Medicine and a Fellow of the Obesity Society.
Dr. Stanford received her BS and MPH from Emory University, MD from the Medical College of Georgia School of Medicine, and her MPA from the Harvard University Kennedy School of Government where she was a Zuckerman Fellow. Upon completion of her MPH, she received the Gold Congressional Award. Dr. Stanford has completed a medicine and media internship at the Discovery Channel, and authored a US MLE Step 1 medical review text. An American Medical Association (AMA) Foundation Leadership Award recipient in 2005, AMA Paul Ambrose Award for national leadership among resident physicians in 2009, she was selected for the AMA Inspirational Physician Award in 2015.
Dr. Stanford completed her internal medicine and pediatrics residency at the University of South Carolina School of Medicine/Palmetto Health. The American College of Physicians selected her as the 2013 recipient of the Joseph E. Johnson Leadership Award. In 2014, she was selected for the Certificate of Excellence in Tutoring for her instruction in the Harvard Medical School Health Policy New Pathway Course.


--- layout: post title: "Combining free monads in F#" description: "An example of how to compose free monads in F#." date: 2017-07-31 12:30 UTC tags: [Software Design, F#, Functional Programming] --- {% include JB/setup %}
{{ page.description }}
This article is an instalment in a series of articles about modelling long-running interactions with pure, functional code. In the previous article, you saw how to combine a pure command-line API with an HTTP-client API in Haskell. In this article, you'll see how to translate the Haskell proof of concept to F#.
You've already seen how to model command-line interactions as pure code in a previous article. You can define interactions with the online restaurant reservation HTTP API in the same way. First, define some types required for input and output to the API:
type Slot = { Date : DateTimeOffset; SeatsLeft : int } type Reservation = { Date : DateTimeOffset Name : string Email : string Quantity : int }
The Slot
type contains information about how many available seats are left on a particular date. The Reservation
type contains the information required in order to make a reservation. It's the same Reservation
F# record type you saw in a previous article, but now it's moved here.
The online restaurant reservation HTTP API may afford more functionality than you need, but there's no reason to model more instructions than required:
type ReservationsApiInstruction<'a> = | GetSlots of (DateTimeOffset * (Slot list -> 'a)) | PostReservation of Reservation * 'a
This instruction set models two interactions. The GetSlots
case models an instruction to request, from the HTTP API, the slots for a particular date. The PostReservation
case models an instruction to make a POST HTTP request with a Reservation
, thereby making a reservation.
While Haskell can automatically make this type a Functor
, in F# you have to write the code yourself:
// ('a -> 'b) -> ReservationsApiInstruction<'a> // -> ReservationsApiInstruction<'b> let private mapI f = function | GetSlots (x, next) -> GetSlots (x, next >> f) | PostReservation (x, next) -> PostReservation (x, next |> f)
This turns ReservationsApiInstruction<'a>
into a functor, which is, however, not the ultimate goal. The final objective is to enable syntactic sugar, so that you can write pure ReservationsApiInstruction<'a>
Abstract Syntax Trees (ASTs) in standard F# syntax. In order to fulfil that ambition, you need a computation expression builder, and to create one of those, you need a monad.
You can turn ReservationsApiInstruction<'a>
into a monad using the free monad recipe that you've already seen. Creating a free monad, however, involves adding another type that will become both monad and functor, so I deliberately make mapI
private in order to prevent confusion. This is also the reason I didn't name the function map
: you'll need that name for a different type. The I in mapI
stands for instruction.
The mapI
function pattern-matches on the (implicit) ReservationsApiInstruction
argument. In the GetSlots
case, it returns a new GetSlots
value, but composes the next
continuation with f
. In the PostReservation
case, it returns a new PostReservation
value, but pipes next
to f
. The reason for the difference is that PostReservation
is degenerate: next
isn't a function, but a value.
Now that ReservationsApiInstruction<'a>
is a functor, you can create a free monad from it. The first step is to introduce a new type for the monad:
type ReservationsApiProgram<'a> = | Free of ReservationsApiInstruction<ReservationsApiProgram<'a>> | Pure of 'a
This is a recursive type that enables you to assemble ASTs that ultimately can return a value. The Pure
case enables you to return a value, while the Free
case lets you describe what should happen next.
Using mapI
, you can make a monad out of ReservationsApiProgram<'a>
by adding a bind
function:
// ('a -> ReservationsApiProgram<'b>) -> ReservationsApiProgram<'a> // -> ReservationsApiProgram<'b> let rec bind f = function | Free instruction -> instruction |> mapI (bind f) |> Free | Pure x -> f x
If you refer back to the bind
implementation for CommandLineProgram<'a>
, you'll see that it's the exact same code. In Haskell, creating a free monad from a functor is automatic. In F#, it's boilerplate.
Likewise, you can make ReservationsApiProgram<'a>
a functor:
// ('a -> 'b) -> ReservationsApiProgram<'a> -> ReservationsApiProgram<'b> let map f = bind (f >> Pure)
Again, this is the same code as in the CommandLine
module. You can copy and paste it. It is, however, not the same function, because the types are different.
Finally, to round off the reservations HTTP client API, you can supply functions that lift instructions to programs:
// DateTimeOffset -> ReservationsApiProgram<Slot list> let getSlots date = Free (GetSlots (date, Pure)) // Reservation -> ReservationsApiProgram<unit> let postReservation r = Free (PostReservation (r, Pure ()))
That's everything you need to create a small computation expression builder:
type ReservationsApiBuilder () = member this.Bind (x, f) = ReservationsApi.bind f x member this.Return x = Pure x member this.ReturnFrom x = x member this.Zero () = Pure ()
Create an instance of the ReservationsApiBuilder
class in order to use reservationsApi
computation expressions:
let reservationsApi = ReservationsApiBuilder ()
This, in total, defines a pure API for interacting with the online restaurant reservation system, including all the syntactic sugar you'll need to stay sane. As usual, some boilerplate code is required, but I'm not too worried about its maintenance overhead, as it's unlikely to change much, once you've added it. If you've followed the recipe, the API obeys the category, functor, and monad laws, so it's not something you've invented; it's an instance of a universal abstraction.
The addition of the above ReservationsApi
module is only a step towards the overall goal, which is to write a command-line wizard you can use to make reservations against the online API. In order to do so, you must combine the two monads CommandLineProgram<'a>
and ReservationsApiProgram<'a>
. In Haskell, you get that combination for free via the built-in generic FreeT
type, which enables you to stack monads. In F#, you have to explicitly declare the type:
type CommandLineReservationsApiT<'a> = | Run of CommandLineProgram<ReservationsApiProgram<'a>>
This is a single-case discriminated union that stacks ReservationsApiProgram
and CommandLineProgram
. In this incarnation, it defines a single case called Run
. The reason for this is that it enables you to follow the free monad recipe without having to do much thinking. Later, you'll see that it's possible to simplify the type.
The naming is inspired by Haskell. This type is a piece of the puzzle corresponding to Haskell's FreeT
type. The T in FreeT
stands for transformer, because FreeT
is actually something called a monad transformer. That's not terribly important in an F# context, but that's the reason I also tagged on the T in CommandLineReservationsApiT<'a>
.
FreeT
is actually only a 'wrapper' around another monad. In order to extract the contained monad, you can use a function called runFreeT
. That's the reason I called the F# case Run
.
You can easily make your stack of monads a functor:
// ('a -> 'b) -> CommandLineProgram<ReservationsApiProgram<'a>> // -> CommandLineProgram<ReservationsApiProgram<'b>> let private mapStack f x = commandLine { let! x' = x return ReservationsApi.map f x' }
The mapStack
function uses the commandLine
computation expression to access the ReservationsApiProgram
contained within the CommandLineProgram
. Thanks to the let!
binding, x'
is a ReservationsApiProgram<'a>
value. You can use ReservationsApi.map
to map x'
with f
.
It's now trivial to make CommandLineReservationsApiT<'a>
a functor as well:
// ('a -> 'b) -> CommandLineReservationsApiT<'a> // -> CommandLineReservationsApiT<'b> let private mapT f (Run p) = mapStack f p |> Run
The mapT
function simply pattern-matches the monad stack out of the Run
case, calls mapStack
, and pipes the return value into another Run
case.
By now, it's should be fairly clear that we're following the same recipe as before. You have a functor; make a monad out of it. First, define a type for the monad:
type CommandLineReservationsApiProgram<'a> = | Free of CommandLineReservationsApiT<CommandLineReservationsApiProgram<'a>> | Pure of 'a
Then add a bind
function:
// ('a -> CommandLineReservationsApiProgram<'b>) // -> CommandLineReservationsApiProgram<'a> // -> CommandLineReservationsApiProgram<'b> let rec bind f = function | Free instruction -> instruction |> mapT (bind f) |> Free | Pure x -> f x
This is almost the same code as the above bind
function for ReservationsApi
. The only difference is that the underlying map function is named mapT
instead of mapI
. The types involved, however, are different.
You can also add a map
function:
// ('a -> 'b) -> (CommandLineReservationsApiProgram<'a> // -> CommandLineReservationsApiProgram<'b>) let map f = bind (f >> Pure)
This is another copy-and-paste job. Such repeatable. Wow.
When you create a monad stack, you need a way to lift values from each of the constituent monads up to the combined monad. In Haskell, this is done with the lift
and liftF
functions, but in F#, you must explicitly add such functions:
// CommandLineProgram<ReservationsApiProgram<'a>> // -> CommandLineReservationsApiProgram<'a> let private wrap x = x |> Run |> mapT Pure |> Free // CommandLineProgram<'a> -> CommandLineReservationsApiProgram<'a> let liftCL x = wrap <| CommandLine.map ReservationsApiProgram.Pure x // ReservationsApiProgram<'a> -> CommandLineReservationsApiProgram<'a> let liftRA x = wrap <| CommandLineProgram.Pure x
The private wrap
function takes the underlying 'naked' monad stack (CommandLineProgram<ReservationsApiProgram<'a>>
) and turns it into a CommandLineReservationsApiProgram<'a>
value. It first wraps x
in Run
, which turns x
into a CommandLineReservationsApiT<'a>
value. By piping that value into mapT Pure
, you get a CommandLineReservationsApiT<CommandLineReservationsApiProgram<'a>>
value that you can finally pipe into Free
in order to produce a CommandLineReservationsApiProgram<'a>
value. Phew!
The liftCL
function lifts a CommandLineProgram
(CL) to CommandLineReservationsApiProgram
by first using CommandLine.map
to lift x
to a CommandLineProgram<ReservationsApiProgram<'a>>
value. It then pipes that value to wrap
.
Likewise, the liftRA
function lifts a ReservationsApiProgram
(RA) to CommandLineReservationsApiProgram
. It simply elevates x
to a CommandLineProgram
value by using CommandLineProgram.Pure
. Subsequently, it pipes that value to wrap
.
In both of these functions, I used the slightly unusual backwards pipe operator <|
. The reason for that is that it emphasises the similarity between liftCL
and liftRA
. This is easier to see if you remove the type comments:
let liftCL x = wrap <| CommandLine.map ReservationsApiProgram.Pure x let liftRA x = wrap <| CommandLineProgram.Pure x
This is how I normally write my F# code. I only add the type comments for the benefit of you, dear reader. Normally, when you have an IDE, you can always inspect the types using the built-in tools.
Using the backwards pipe operator makes it immediately clear that both functions depend in the wrap
function. This would have been muddied by use of the normal forward pipe operator:
let liftCL x = CommandLine.map ReservationsApiProgram.Pure x |> wrap let liftRA x = CommandLineProgram.Pure x |> wrap
The behaviour is the same, but now wrap
doesn't align, making it harder to discover the kinship between the two functions. My use of the backward pipe operator is motivated by readability concerns.
Following the free monad recipe, now create a computation expression builder:
type CommandLineReservationsApiBuilder () = member this.Bind (x, f) = CommandLineReservationsApi.bind f x member this.Return x = Pure x member this.ReturnFrom x = x member this.Zero () = Pure ()
Finally, create an instance of the class:
let commandLineReservationsApi = CommandLineReservationsApiBuilder ()
Putting the commandLineReservationsApi
value in a module will enable you to use it for computation expressions whenever you open that module. I normally put it in a module with the [<AutoOpen>]
attribute so that it automatically becomes available as soon as I open the containing namespace.
While there can be good reasons to introduce single-case discriminated unions in your F# code, they're isomorphic with their contained type. (This means that there's a lossless conversion between the union type and the contained type, in both directions.) Following the free monad recipe, I introduced CommandLineReservationsApiT
as a discriminated union, but since it's a single-case union, you can refactor it to its contained type.
If you delete the CommandLineReservationsApiT
type, you'll first have to change the definition of the program type to this:
type CommandLineReservationsApiProgram<'a> = | Free of CommandLineProgram<ReservationsApiProgram<CommandLineReservationsApiProgram<'a>>> | Pure of 'a
You simply replace CommandLineReservationsApiT<_>
with CommandLineProgram<ReservationsApiProgram<_>>
, effectively promoting the type contained in the Run
case to be the container in the Free
case.
Once CommandLineReservationsApiT
is gone, you'll also need to delete the mapT
function, and amend bind
:
// ('a -> CommandLineReservationsApiProgram<'b>) // -> CommandLineReservationsApiProgram<'a> // -> CommandLineReservationsApiProgram<'b> let rec bind f = function | Free instruction -> instruction |> mapStack (bind f) |> Free | Pure x -> f x
Likewise, you must also adjust the wrap
function:
let private wrap x = x |> mapStack Pure |> Free
The rest of the above code stays the same.
In Haskell, you get combinations of monads for free via the FreeT
type, whereas in F#, you have to work for it. Once you have the combination in monadic form as well, you can write programs with that combination. Here's the wizard that collects your data and attempts to make a restaurant reservation on your behalf:
// CommandLineReservationsApiProgram<unit> let tryReserve = commandLineReservationsApi { let! count = liftCL readQuantity let! date = liftCL readDate let! availableSeats = ReservationsApi.getSlots date |> ReservationsApi.map (List.sumBy (fun slot -> slot.SeatsLeft)) |> liftRA if availableSeats < count then do! sprintf "Only %i remaining seats." availableSeats |> CommandLine.writeLine |> liftCL else let! name = liftCL readName let! email = liftCL readEmail do! { Date = date; Name = name; Email = email; Quantity = count } |> ReservationsApi.postReservation |> liftRA }
Notice that tryReserve
is a value, and not a function. It's a pure value that contains an AST - a small program that describes the impure interactions that you'd like to take place. It's defined entirely within a commandLineReservationsApi
computation expression.
It starts by using the readQuantity
and readDate
program values you saw in the previous F# article. Both of these values are CommandLineProgram
values, so you have to use liftCL
to lift them to CommandLineReservationsApiProgram
values - only then can you let!
bind them to an int
and a DateTimeOffset
, respectively. This is just like the use of lift
in the previous article's Haskell example.
Once the program has collected the desired date
from the user, it calls ReservationsApi.getSlots
and calculates the sum over all the returned SeatsLeft
labels. The ReservationsApi.getSlots
function returns a ReservationsApiProgram<Slot list>
, the ReservationsApi.map
turns it into a ReservationsApiProgram<int>
value that you must liftRA
in order to be able to let!
bind it to an int
value. Let me stress once again: the program actually doesn't do any of that; it constructs an AST with instructions to that effect.
If it turns out that there's too few seats left, the program writes that on the command line and exits. Otherwise, it continues to collect the user's name and email address. That's all the data required to create a Reservation
record and pipe it to ReservationsApi.postReservation
.
The tryReserve
wizard is a pure value. It contains an AST that can be interpreted in such a way that impure operations happen. You've already seen the CommandLineProgram
interpreter in a previous article, so I'm not going to repeat it here. I'll only note that I renamed it to interpretCommandLine
because I want to use the name interpret
for the combined interpreter.
The interpreter for ReservationsApiProgram
values is similar to the CommandLineProgram
interpreter:
// ReservationsApiProgram<'a> -> 'a let rec interpretReservationsApi = function | ReservationsApiProgram.Pure x -> x | ReservationsApiProgram.Free (GetSlots (d, next)) -> ReservationHttpClient.getSlots d |> Async.RunSynchronously |> next |> interpretReservationsApi | ReservationsApiProgram.Free (PostReservation (r, next)) -> ReservationHttpClient.postReservation r |> Async.RunSynchronously next |> interpretReservationsApi
The interpretReservationsApi
function pattern-matches on its (implicit) ReservationsApiProgram
argument, and performs the appropriate actions according to each instruction. In all Free
cases, it delegates to implementations defined in a ReservationHttpClient
module. The code in that module isn't shown here, but you can see it in the GitHub repository that accompanies this article.
You can combine the two 'leaf' interpreters in an interpreter of CommandLineReservationsApiProgram
values:
// CommandLineReservationsApiProgram<'a> -> 'a let rec interpret = function | CommandLineReservationsApiProgram.Pure x -> x | CommandLineReservationsApiProgram.Free p -> p |> interpretCommandLine |> interpretReservationsApi |> interpret
As usual, in the Pure
case, it simply returns the contained value. In the Free
case, p
is a CommandLineProgram<ReservationsApiProgram<CommandLineReservationsApiProgram<'a>>>
. Since it's a CommandLineProgram
value, you can interpret it with interpretCommandLine
, which returns a ReservationsApiProgram<CommandLineReservationsApiProgram<'a>>
. Since that's a ReservationsApiProgram
, you can pipe it to interpretReservationsApi
, which then returns a CommandLineReservationsApiProgram<'a>
. An interpreter exists for that type as well, namely the interpret
function itself, so recursively invoke it again. In other words, interpret
will keep recursing until it hits a Pure
case.
Everything is now in place so that you can execute your program. This is the program's entry point:
[<EntryPoint>] let main _ = interpret Wizard.tryReserve 0 // return an integer exit code
When you run it, you'll be able to have an interaction like this:
Please enter number of diners: 4 Please enter your desired date: 2017-11-25 Please enter your name: Mark Seemann Please enter your email address<EMAIL_ADDRESS>OK
If you want to run this code sample yourself, you're going to need an appropriate HTTP API with which you can interact. I hosted the API on my local machine, and afterwards verified that the record was, indeed, written in the reservations database.
As expected, you can combine free monads in F#, although it requires more boilerplate code than in Haskell.
Next: F# free monad recipe.


Serverless Chatroom with Sentiment Analysis
More info here:
https://coderecipe.ai/architectures/34142257
Send
Messages:


Termites are small insects that organize into colonies and eat wood for the cellulose in it, causing more damage in higher frequency to United States homes per year than any other natural disasters. When termites have found their way into the walls of a home, they will eat away at the wood of walls and foundation in order to grow the tunnels of their colony while using wood as food to reproduce. An average colony of 60,000 termites can consume an entire 2x4 plank of wood in 6 months. Most termite infestations go unnoticed for months, if not years, during which termites are free to eat away at the home's most important structural components.


Welcome to the
Professional Organizer
Developed by Dr. Ansh Jain, PhD
Task Manager
Calendar
Link Manager


I am an undergraduate student studying Computer Science with a minor in GIS.I love hiking and have worked for a considerable amount of time doing conservation/ecological work as well as trail building and maintenance so am interested in conservation and cartography. Additionally, with the upcoming election, I am also very interested in election data of all kinds and how it relates to the outcomes.


{% load static %}
| Sl. No. | User ID | User |
|---|---|---|
| {{forloop.counter}} | {{usr.id}} | {{usr.user}} |
| No Users Found |
| Total Users | Total Records | Total Services |
|---|---|---|
| {{userlist|length}} | {{total_jobs}} | {{total_services}} |
| Sl. No. | User | Records | Services | Price In Rs |
|---|---|---|---|---|
| {{forloop.counter}} | {{usr.user}} | {{usr.records}} | {{usr.services}} | {{usr.price}} |
| No Users Found |


--- layout: post title: Fluent Interfaces in Coffeescript date: 2013-07-30 14:30:39.000000000 -05:00 categories: - Node.js tags: - coffeescript status: publish type: post published: true meta: _edit_last: '25054220' geo_public: '0' _publicize_pending: '1' _wpas_done_881585: '1' _publicize_done_external: a:1:{s:8:"facebook";a:1:{i:1471181839;b:1;}} publicize_twitter_user: adamnengland _wpas_done_881586: '1' _wpas_done_881584: '1' _wpas_skip_881585: '1' _wpas_skip_881586: '1' _wpas_skip_881584: '1' author: login: adamnengland email<EMAIL_ADDRESS>display_name: adamnengland first_name: '' last_name: '' excerpt: !ruby/object:Hpricot::Doc options: {} ---
We've all seen them - builder patterns that make object construction clean and readable.
person().named('Bob').withSpouse('Alice').bornOn('01-26-1982').build()
I used to do these all the time in Java (we called them fluent interfaces), and I just realized today that I had no idea how to do this style in Coffeescript. Well, lets remedy that.
To get started, I'm going to follow the basic pattern I've followed in Java. Since CoffeeScript provides native class functionality, its a pretty simple clone.
{% highlight coffeescript %}
class Person
named: (name) ->
@name = name
@
withSpouse: (spouse) ->
@spouse = spouse
@
bornOn: (dob) ->
@dob = dob
@
build : ->
return {
name: @name
spouse: @spouse
dob: @dob
}
console.log new Person().named('Adam').withSpouse('Rachel').build()
{% endhighlight %}
But hey, this is coffeescript. We can do better. Lets use a attribute shortcut to reduce the code length.
{% highlight coffeescript %}
class Person
named: (@name) ->
@
withSpouse: (@spouse) ->
@
bornOn: (@dob) ->
@
build : ->
return {
name: @name
spouse: @spouse
dob: @dob
}
console.log new Person().named('Adam').withSpouse('Rachel').build()
{% endhighlight %}
I suspect there may be an even cleaner way to do this, but this seems concise enough for now.
The full source code is available here: https://github.com/adamnengland/coffee-fluent-interface


Giant pandas are no longer in danger of extinction. It should be noted that the giant panda bear used to be found all over southern China, but since the 1970s the species was in danger, so campaigns were carried out to take care of them.
Giant pandas are no longer in danger of extinction. It should be noted that the giant panda bear used to be found all over southern China, but since the 1970s the species was in danger, so campaigns were carried out to take care of them.
Giant pandas are no longer in danger of extinction. It should be noted that the giant panda bear used to be found all over southern China, but since the 1970s the species was in danger, so campaigns were carried out to take care of them.
Giant pandas are no longer in danger of extinction. It should be noted that the giant panda bear used to be found all over southern China, but since the 1970s the species was in danger, so campaigns were carried out to take care of them.