High-dimensional probability
Posted: 2016-08-01 , Modified: 2016-08-04
Tags: random matrix
Posted: 2016-08-01 , Modified: 2016-08-04
Tags: random matrix
Based on Ramon von Handel’s ORF570 notes.
Themes:
Trivial bound: \[ \Var[f(X)]\le \rc4 (\sup f - \inf f)^2 \qquad \Var[f(x)] \le \E[(f(X)-\inf f)^2].\]
Tensorization gives a bound for functions of independent random variables from bounds for functions of each individual random variable.
Theorem (Tensorization of variance): \[\Var[f(X_1,\ldots, X_n)]\le \E\ba{\sumo in \Var_i f(X_1,\ldots, X_n)}\] whenever \(X_{1:n}\) are independent.
This is sharp for linear functions.
Proof. Write \[ f(X_{1:n}) - \E f(X_{1:n}) = \sumo kn \ub{\E[f(X_{1:n}|X_{1:k})] - \E[f(X_{1:n})|X_{1:k-1}]}{\De_k}. \] The \(\De_k\) form a martingale. By independence of martingale increments, \[\begin{align} \Var(f) &= \sumo kn \E[\De_k^2] \\ \E[\De_k^2] &= \E[\E[\wt \De_k |X_{1:k}]^2]\\ & \le \E[(\ub{f - \E[f|X_{1:k-1,k+1:n}]}{\wt \De_k})^2] & \text{Jensen}\\ &= \E\ba{\sumo in \Var_f f(X_1,\ldots, X_n)}. \end{align}\] Define \[\begin{align} D_i f(x) &= (\sup_z-\inf_z)(f(x_{1:i-1},z,x_{i+1:n}))\\ D_i^- f(x) &= f(x) - \inf_z(f(x_{1:i-1},z,x_{i+1:n}))\\ \end{align}\]Corollary (Bounded difference inequality): Tensorization + trivial inequality.
Example: Consider Bernoulli symmetric matrices. What is the variance of \(\la_{\max}(M) = \an{v_{\max}(M), Mv_{\max}(M)}\)? Fix \(i,j\). Let \[M^- = \amin_{\text{only }M_{ij} \text{ varies}} \la_{\max}(M).\] Then \[D_{ij}^-\la_{\max}(M) \le \an{v_{\max}(M), (M-M^-) v_{\max}(M)}\le 4|v_{\max}(M)_i||v_{\max}(M)_j|.\] Use the corollary to get \(\le 16\).
This is not sharp. (\(\sim n^{-\rc 3}\) is correct.)
Drawbacks to this method:
Inequalities in this section are roughly of the following form (Poincare inequalities): \[\Var(f) \le \E[\ve{\nb f}^2].\] “The validity of a Poincar´e inequality for a given distribution is intimately connected the convergence rate of a Markov process that admits that distribution as a stationary measure.”
A Markov process satisfies: For every bounded measurable \(f\) and \(s,t\in \R_+\), here is a bounded measurable \(P_sf\) such that \[\E[f(X_{t+s})|\{X_r\}_{r\le t}] = (P_s f)(X_t).\] \(\mu\) is stationary if \(\mu(P_tf)=\mu(f)\) for all \(t\in \R_+\), bounded measurable \(f\).
Lemma 2.7. \(\{P_t\}_{t\in \R_+}\) defines a semigroup of linear operators on \(L^p(\mu)\). It is contractive and conservative (\(P_t1=1\) \(\mu\)-a.s.).
Proof. Jensen.
The semigroup in fact acts on any \(f\in L^1(\mu)\).
Lemma 2.9. If \(\mu\) is stationary, for every \(f\), \(\Var_\mu(P_tf)\) is decreasing.
Proof. \(L^2\) contractivity and semigroup property.
The generator is \[\cal L f = \lim_{t\searrow 0} \fc{P_tf-f}t.\] The set of \(f\) where this is defined is the domain; \(\cal L:\text{Dom}(\cal L) \to L^2(\mu)\).
Warning: for Markov processes with continuous sample paths, such as Brownian motion, \(Dom(\cL)\sub L^2(\mu)\). Functional analysis is required for rigor, but results usually extend.
\(P_t\) is the solution of the Kolmogorov equation \[ \ddd{t} P_t f = P_t \cL f, \quad P_0f=f.\] The generator and semigroup commute.
A finite-state Markov process with \[ \Pj[X_{t+\de}=j|X_t=i] = \la_{ij} \de + o(\de), \quad i\ne j\] has generator equal to the transition matrix \(\La\).1
Then \(P_t=e^{t\La}\). (In the non-finite case, this makes sense as a power series.)
\(P_t\) is reversible if \(P_t\) are self-adjoint on \(L^2(\mu)\): \[\an{f,P_tg}_\mu = \an{P_tf,g}_\mu.\] Reversibility implies \[P_tf(x) =\E[f(X_t)|X_0=x] = \E[f(X_0)|X_t=x];\] i.e., the Markov process viewed backwards has the same law.
For finite state space, this is equivalent to \[\mu_i \La_{ij} = \mu_j \La_{ji},\] detailed balance.2
Definition. A Markov semigroup is ergodic if \(P_tf \to \mu f\) in \(L^2(\mu)\) as \(t\to \iy\) for every \(f\in L^2(\mu)\).
A measure \(\mu\) satisfies a Poincare inequality for a certain notion of “gradient” if and only if an ergodic Markov semigroup associated to this “gradient” converges exponentially fast to \(\mu\).
The Dirichlet form is \[\cal E(f,g) = -\an{f,\cL g}_\mu.\] Note: for complex-valued functions, we take the real part.
Theorem (Poincare inequality). Let \(P_t\) be reversible ergodic Markov semigroup with stationary measure \(\mu\). For \(c\ge 0\), TFAE:
Note \(5\Leftarrow 3\implies 1\Leftrightarrow 2\Rightarrow 4\) doesn’t require reversibility.
Example: Gaussian distribution
Note: The O-U process is the solution of the stochastic differential equation \[dX_t = -X_t \,dt + \sqrt2 \, dB_t.\] Revisit this after I learn stochastic calculus.
Tensorization using Poincare inequality:
We prove the Poincare inequality.
3In finite dimensions, if \(\mu f=0\), \[ \cE(f,f) \ge (\ub{\la_1}0-\la_2) \Var_\mu(f). \] The best constant in the Poincare inequality is the spectral gap. The spectral gap controls the exponential convergence rate. Note it’s essential that \(\La\) admits a real spectral decomposition.
Smooth \(f\) and use the Gaussian Poincare inequality.
Note we have \(\Var[f(x)]\le \E[(f(x)-f(0))^2]\le \E L^2x^2 = L^2\) but this doesn’t help us, because if we sum up derivatives along different coordinates, we overestimate \(L\) to \(Ln\) instead.Only the \(|I|=\phi, 1\) terms are significant as \(\sum_{|I|=k} p_I = Poisson(n, t, k)\).
\[\begin{align}\cL f &= \lim_{t\to 0^+} \pf{e^{-tn} \E f - \E f + \sum (1-e^{-t}) e^{-t (n-1)} \int f\, \mu_i (dx_i|x)}{t}\\ &= \sum_{i=1}^n \ub{\pa{\pa{\int f(x)\mu_i(dx_i|x)} - f(x)}}{=: - \de_if}\\ \cE (f, g) &= -\int f \cL g\,d\mu\\ &= -\int \pa{-\sumo in f\de_i g}\,d\mu\\ &= \sumo in \int \de_if\de_ig\,d\mu \end{align}\] where we used \(\int (f-\de_if)\de_ig=0\) because the first term has mean 0 and \(\de_ig\) doesn’t depend on \(x_i\).Use \(5\implies 1\) of Poincare.
Then \(\Pj(X-\E X \ge t) \le e^{-\psi^*(t)}\) for all \(t\ge 0\).
Proof. Exponentiate and Markov.
The log-moment generating function is continuous and can be investigated using calculus.
Example. Gaussian: \(\psi(\la) = \fc{\la^2\si^2}2\) and \(\psi^*(t) = \fc{t^2}{2\si^2}\) so bound of \(e^{-\fc{t^2}{2\si^2}}\).
A rv is \(\si^2\)-subgaussian if \(\psi(\la)\le \fc{\la^2\si^2}2\). Then we get tail bounds of \(e^{-\fc{t^2}{2\si^2}}\).
Lemma 3.6 (Hoeffding): If \(X\in [a,b]\) a.s., then \(X\) is \((b-a)^2/4\) subgaussian.
Proof. Interpret \(\psi''\) as a variance, get \(\psi''\le \fc{(b-a)^2}{4}\), integrate twice.
We want to show \(f\) is subgaussian with variance proxy controlled by a “square gradient” of \(f\).
The subgaussian property does not tensorize.
The proof of subgaussian inequailties can be reduced to a strengthened form of Poincare inequalities, log-Sobolev inequalities, that do tensorize.
Lemma (Azuma): Let \(\cF_k\) be a filtration, and 1. (Martingale difference) \(\De_k\) is \(\cF_k\)-measurable, \(\E[\De_k |\cF_{k-1}]=0\). 2. (Conditional subgaussian) \(\E[e^{\la \De_k}|\cF_{k-1}]\le e^{\la^2\si_k^2/2}\). Then \(\sumo kn \De_k\) is subgaussian with variance proxy \(\sumo kn \si_k^2\).
Corollary (Azuma-Hoeffding): Replace (2) by \(A_k\le \De_k\le B_k\) where \(A_k,B_k\) are \(\cF_{k-1}\)-measurable. The variance proxy is \(\rc 4 \sumo kn \ve{B_k-A_k}^2_{\iy}\). The tail bound is \(\exp\pa{-\fc{2t^2}{\sumo kn \ve{B_k-A_k}^2_{\iy}}}\).
Theorem 3.11 (McDiarmid): For \(X_{1:n}\) independent, \(f(X)\) is subgaussian with variance proxy \(\rc 4\sumo kn \ve{D_kf}_{\iy}^2\) where \[D_if(x) = (\sup_z-\inf_z)f(x_{1:i-1},z,x_{i+1:n}).\]
Proof. Use Azuma-Hoeffding on martingale differences \(\De_k =\E[f|X_{1:k}] - \E[f|X_{1:k-1}]\).
This is unsatisfactory because the variance proxy is controlled by a uniform upper bound on square gradient rather than its expectation. Something like \(\ve{\sumo kn |D_kf|^2}_{\iy}\) would be better.
The subgaussian property is equivalent to \(\la^{-1}\psi(\la)\precsim \la\), so it suffices to show \(\ddd{\la}(\la^{-1}\psi)\precsim 1\).
The entropic formulation of subgaussianity and the tensorization inequality tell us that if we prove (for some notion of \(\nb\)) \[ \Ent(e^g) \precsim \E[\ve{\nb g}^2]\] in one dimension, then in any number of dimensions, \[ \Ent(e^{\la f})\precsim \E[\ve{\nb (\la f)}^2e^{\la f}]\] so \(f\) is subgaussian with \(\max\ve{\nb f}^2\).
Example (Random Bernoulli symmetric matrices). Using \(D_{ij}^-\la_{\max(M)}\), get \[ \Pj(\la_{\max}(M) - \E\la_{\max}(M)\ge t)\le e^{-\fc{t^2}{64}}. \] We can’t use the same technique to look at the lower tail because the bound is in terms of different \(M^{(ij)}\)’s.
We have an entropic analogue of just the easy parts of the Poincare inequality equivalence.
Theorem. 1 and 2 are equivalent. 3 implies 1, 2 if \(\Ent_\mu(P_tf)\to 0\) (entropic ergodicity).
Proof.
The log-Sobolev equivalences cannot reproduce the tensorization inequality for entropy.
Theorem (Gaussian log-Sobolev). For independent Gaussian variables, \[\begin{align} \Ent[f] &\le \rc 2 \E [\nb f \cdot \nb \ln f]& (f\ge 0)\\ \Ent[e^f] & \le \rc 2 \E[\ve{\nb f}^2 e^f]. \end{align}\]As a result \(f\) is \(\si^2 = \ve{\ve{\nb f}^2}_{\iy}\) subgaussian and we get Gaussian concentration, \[\Pj[f - \E f\ge t] \le e^{-t^2/2\si^2}.\]
Proof. Recall \(\cE(f,g) = \mu(f'g')\), \((P_tf)' = e^{-t}P_t f'\). Note \(|P_t(fg)|^2 \le P_t(f^2)P_t(g^2)\) by CS (expand out). \[\begin{align} (\ln P_t f)' (P_tf)' &= e^{-2t} \fc{|P_tf|^2}{P_tf}\\ |P_t f'|^2 &\le P_t((\ln f)'f') P_t f&\text{by CS}\\ \implies \cE(\ln (P_tf), P_tf) &\le e^{-2t}\cE(\ln f, f) &\text{by }\int\\ \implies \Ent_\mu(f) &\le \cE(\ln f, f)&(3\implies 1). \end{align}\] Note several different forms of log-Sobolev, equivalent in the Gaussian case (or anytime the chain rule holds for \(\cE\)): \[\begin{align} \Ent(f) &\le \rc 2 \E[\nb f \cdot \nb \ln f] = \rc2 \cE (\ln f, f)\\ \Ent(f) &\le \rc 2 \E\pf{\ve{\nb f}^2}{f}\\ \Ent(e^f) &\le \rc 2 \E[\ve{\nb f}^2 e^f]\\ \Ent(f^2) &\le 2\E[\ve{\nb f}^2] = 2\cE(f,f)\\ \E(f^2\ln f)-\E[f^2]\ln \ve{f}_2 &\le c\ve{\nb f}_2^2. \end{align}\]Classical Sobolev inequalities are for \(\ved_q\), \(q\ge 2\) and do not tensorize.
Lemma 3.28: Log-Sobolev \(\Ent(f) \le c\cE (\ln f, f)\) implies the Poincare inequality \(\Var(f) \le 2c\cE (f,f)\).
Proof. \[ \ub{\E[\la f e^{\la f}]}{\la^2\cE(f,f) + o(\la^2)} - \ub{\E[e^{\la f}] \ln \E[e^{\la f}]}{\la \E f + \la^2(\E[f^2] + \E[f]^2)/2 + o(\la^2)} = \ub{\E[\la f e^{\la f}]}{\la \E f + \la^2 \E [f^2] + o(\la^2)} \]
Equivalent conditions for subgaussianity:
Problems
Rather than measuring the sensitivity of the function f in terms of a gradient, we will introduce a metric viewpoint that emphasizes the role of Lipschitz functions.
We can express Gaussian concentration and McDiarmid’s inequalities in terms of Lipschitz functions.
In the case of gradient bounds, the sensitivity of the function f is measured locally, while the Lipschitz property quantifies the sensitivity in a global manner.
Basic question:
For which probability measures μ on the metric space \((X, d)\) is it true that if \(X\sim \mu\), then \(f(X)\) is \(\si^2\)-subgaussian for every \(f \in Lip(\mathbb X)\)?
Wasserstein distance: For \(\mu,\nu\in \cP_1(\mathbb X)=\set{\rh}{\int d(x_0,x)\rh(dx)<\iy}\), the Wasserstein distance is \[ W_1(\mu, \nu) := \sup_{f\in Lip(\mathbb X)} \ab{\int f\,d\mu - \int f\,d\nu}.\]
Relative entropy: \(D(\nu||\mu) = \Ent_{\mu}\pa{\dd{\nu}{\mu}}\).
Theorem 4.8 (Bobkov-Gotze): Let \(\mu\in \cP_1(\mathbb X)\). TFAE for \(X\sim \mu\):
Example (Pinsker’s inequality):
Proof.
Lemma 4.10 (Gibbs variational principle) \(\log \E_{\mu} e^f = \sup_\nu [\E_\nu [f] - D(\nu||\mu)]\).
Proof. \(\log \E_\mu[e^f] - D(\nu||\wt \mu) = \E_\n [f] - D(\nu||\mu)\).
(?? “Dual convex optimization to the variational formula for entropy.”)evaluate over \(f\) to get \(W_1\), then evaluate over \(\la\).


Contributing
Releasing a new version:
- Ensure tests are passing on travis (okay for appveyor node v4 x86 to fail)
- Run
node scripts/abi_crosswalk.js
and commit any changes
- Update the changelog
- Tag a new release like:
git tag -a v0.6.34 -m "tagging v0.6.34" && git push --tags
- Run
npm publish


Create an encryption key. Don't forget it! It can't be recovered! You'll need it to decrypt your exported info.


Percentile Data Files with LMS Values
Data used to produce the United States Growth Charts smoothed percentile curves are contained in 8 Excel data files representing the 8 different growth curves for infants (weight-for-age; length-for-age, weight-for-recumbent length; head circumference-for-age) and older children (weight-for-stature; weight-for-age; stature-for-age; and BMI-for-age). The file and corresponding chart names are below. These data remain unchanged from the initial release on May 30, 2000 of the growth charts.
- WTAGEINF [XLS - 34 KB] [CSV - 12 KB]
Weight-for-age charts, birth to 36 months, LMS parameters and selected smoothed weight percentiles in kilograms, by sex and age LENAGEINF [XLS - 67 KB] [CSV - 27 KB]
Length-for-age charts, birth to 36 months, LMS parameters and selected smoothed recumbent length percentiles in centimeters, by sex and ageErrata: The selected percentile values for length for age have been updated to correspond exactly to the published LMS values. The 50th percentile values have not changed and the outer percentiles differ only at or beyond the second decimal place. There is no visibly perceptible difference in the graphs of the growth curves compared to those published in 2000. Thus, no changes to printed graphical growth charts are needed.
- WTLENINF [XLS - 46 KB] [CSV - 18 KB]
Weight-for-recumbent length charts, birth to 36 months, LMS parameters and selected smoothed weight percentiles in kilograms, by sex and recumbent length (in centimeters) - HCAGEINF [XLS - 34 KB] [CSV - 12 KB]
Head circumference-for-age charts, birth to 36 months, LMS parameters and selected smoothed head circumference percentiles in centimeters, by sex and age - WTSTAT [XLS - 39 KB] [CSV - 15 KB]
Weight-for-stature charts, LMS parameters and selected smoothed weight percentiles in kilograms, by sex and stature (in centimeters) - WTAGE [XLS - 125 KB] [CSV - 65 KB]
Weight-for-age charts, 2 to 20 years, LMS parameters and selected smoothed weight percentiles in kilograms, by sex and age - STATAGE [XLS - 125 KB] [CSV - 65 KB]
Stature-for-age charts, 2 to 20 years, LMS parameters and selected smoothed stature percentiles in centimeters, by sex and age - BMIAGE [XLS - 135 KB] [CSV - 71 KB]
BMI-for-age charts, 2 to 20 years, LMS parameters and selected smoothed BMI (kilograms/meters squared) percentiles, by sex and age
These files contain the L, M, and S parameters needed to generate exact percentiles and z-scores along with the percentile values for the 3rd, 5th, 10th, 25th, 50th, 75th, 90th, 95th, and 97th percentiles by sex (1=male; 2=female) and single month of age. The smoothed 85th percentile values are included in the BMI-for-age and weight-for-stature tables. Age is listed at the half month point for the entire month; for example, 1.5 months represents 1.0-1.99 months or 1.0 month up to but not including 2.0 months of age. The only exception is birth, which represents the point at birth. To obtain L, M, and S values at finer age or length/stature intervals interpolation could be used.
The LMS parameters are the median (M), the generalized coefficient of variation (S), and the power in the Box-Cox transformation (L). To obtain the value (X) of a given physical measurement at a particular z-score or percentile, use the following equation:
X = M (1 + LSZ)**(1/L), L ¹ 0
Or
X = M exp(SZ), L = 0
where the L, M, and S are the values from the appropriate table corresponding to the age in months of the child (** indicates an exponent, such that M(1+LSZ)**(1/L) means raising (1+LSZ) to the (1/L)th power and then multiplying the M; exp(X) is the exponentiation function, e to the power X). Z is the z-score that corresponds to the percentile. z-scores correspond exactly to percentiles, e.g., z-scores of -1.881, -1.645, -1.282, -0.674, 0, 0.674, 1.036, 1.282, 1.645, and 1.881 correspond to the 3rd, 5th, 10th, 25th, 50th, 75th, 85th, 90th, 95th, and 97th percentiles, respectively.
For example, to obtain the 5th percentile of weight-for-age for a 9-month-old male, we would look up the L, M and S values from the WTAGEINF table, which are L=-0.1600954, M=9.476500305, and S=0.11218624. For the 5th percentile, we would use Z=-1.645. Using the equation above, we calculate that the 5th percentile is 7.90 kg.
To obtain the z-score (Z) and corresponding percentile for a given measurement (X), use the following equation:
((X/M)**L) - 1
Z = -------------------------, L¹0
LS
or
Z = ln(X/M)/S ,L=0
where X is the physical measurement (e.g. weight, length, head circumference, stature or calculated BMI value) and L, M and S are the values from the appropriate table corresponding to the age in months of the child (or length/stature). (X/M)**L means raising the quantity (X/M) to the Lth power.
For example, to obtain the weight-for-age z-score of a 9-month-old male who weighs 9.7 kg, we would look up the L, M and S values from the WTAGEINF table, which are L=-0.1600954, M=9.476500305, and S=0.11218624. Using the equation above, we calculate that the z-score for this child is 0.207. This z-score corresponds to the 58th percentile.
Z-scores and corresponding percentiles can be obtained from standard normal distribution tables found in statistics text books. Standard normal tables can also be found on the internet by doing a search on a "standard normal table." In addition, many computer programs have pre-existing functions that convert Z-scores to percentiles and vice versa.
A modified LMS approach was used to develop these growth charts, to read more about the technique and the SAS NLIN procedure used to generate the parameters see:
- Box GE, Cox DR. An analysis of transformations. J Roy Stat Soc, Series B. 26:211-252, 1964.
- Cole TJ. The LMS method for constructing normalized growth standards. Eur J Clin Nutr. 44: 45-60, 1990
- Cole TJ. Fitting smoothed centile curves to reference data. J Royal Stat Soc. 151:385-418, 1988
- Kuczmarski RJ, Ogden CL, Guo, SS, et al. CDC growth charts for the United States: Methods and Development. Vital Health Stat; 11 (246) National Center for Health Statistics. 2002.
- SAS. SAS user's guide: statistics. Cary, NC: SAS Institute. 1988.
Contact Us:
- National Center for Health Statistics
3311 Toledo Rd
Hyattsville, MD 20782 - 1<PHONE_NUMBER>
- cdcinfo@cdc.gov


What is Rails?
1 November 2015
Rails is technically a package library (or in Ruby called a RubyGem) that is installed using the command-line interface (CLI). It is no ordinary Gem though. Rails is a framework for building websites. It uses programming languages like HTML, CSS, Ruby, and JavaScript to create web applications that run on webservers. It was originally created by David Heinemeier Hansson who was previously a PHP developer who decided to build Ruby on Rails using Ruby because of Rubys clean syntax. PHP was too "dirty" becuase of its frequently repetitive code and other languages like Java were too cumbersome.
So what is the difference between Rails and other frameworks? That answer lies in the speed and ease of use that developers working within the environment enjoy. Changes made to applications are immediately applied unlike the time consuming steps normally associated with web development. The framework supports MySQL, PostgreSQL, SQLite, SQL Server, DB2, and Oracle. And it is a MVC framework where all layers are provided by Rails, as opposed to reliance on other additional frameworks to achieve full MVC support. One of the great things about Rails though it the community. It is an open-source project with its distrubutions through rubyonrails.org.
Another characteristic of Rails is the emphasis on RESTful application design. REST (Representational State Transfer) is a style of software architecture based around the client-server relationship. It encourages a logical structure within applications, which means they can easily be exposed as an API.
Some of the most compelling arguments as to why Rails is a preferred framework:
- The process of programming is much faster than with other frameworks and languages.
- Rails conventions are similar so it makes it easy for developers to move between different Rails projects. This tends to cause each project to follow a similar structure and coding practice.
- Rails is good for rapid application development as the framework makes it easy to accomodate changes.
- Rails has developed a strong focus on testing, and has good testing frameworks.
Some of the downsides and potential issues with Rails
- Not all hosts can support Rails
- Java and PHP are more widely used, and there are more developers in these languages
- Performance and Scalability
Let's look at some of these potential issues.
Hosts
Rails is more resource intensive than PHP, but there are several Rails-friendly hosts such as EngineYard and Heroku. You can also host your application on a Virtual Private Server with Amazon EC2, Rackspace, or Linode.
Other languages more widely used
There are more and more Ruby developers growing every year. Ruby has a significant amount of open-source gems that can help enhance your applications.
Performant and Scalability
Rails may not be as fast as Java or C, but for the majority of applications it will be fast enough. There is even an option of giving your application the same performance characteristics as Java by using JRuby.


Charles MacKean
Unafffiliated
Civil Engineering P.E. - 12 years at current employer - Construction Quality Assurance Testing and Inspection
Bachelor of Science, Civil Engineering Professional Engineer in Colorado
80111
None
None
Letter writing to local elected officials on local matters.
I am interested in volunteering to help the people of the state get fair and neutral representation on the board. I feel that I could educate myself to be able to provide thoughtful and careful consideration of complex issues that are certain to arise. I anticipate having time available to perform the duties of the board over the next few months.
I do believe that I am able to be fair and impartial. My sympathies lie both with the people of the state to live in a fair, compassionate, and healthy community while allowing enterprises the ability to create a strong economy within reasonable and effective, but not burdensome constraints that benefit the maximum number of people. I believe in emphasizing the common ground that we all share, and working outward from that. This approach seems to work well with people I have worked with. To date, I haven't have any problem getting along with people from either end of the political spectrum.
Almost every problem that I encounter in my work, Quality Assurance Testing and Inspection of large Civil Engineering projects (pardon the capitalization) involves finding consensus and soothing raw feelings. The contractor always feels that they are doing a good job (which is generally true), and the owner always feels that the contractor is cheating them (which is sometimes true). As the person who stands in front of the field quality personnel to explain an issue and suggest a way forward, logic and reason, along with evidence and context are constant companions. This type of engineering requires a compassionate but firm approach, coupled with a firm grip of the evidence and rules. I have had a lot of practice at it over the last 25 years or so.
Male


From picking on the front porch and jamming with the family band to performing in front of thousands on a festival stage, opening for some of the biggest names in country music. Jason McNabb is a walking, talking version of the phrase “been there, done that.”
Jason continues to explore the depths with in himself to create new music and refuses to lie still and fight evolution. “If there ever comes a day where I wake up not wanting to grow as a musician, writer, performer or even a person, lock me up and throw away the key."
With more than 10 years on the road and an average of 200+ shows annually, their persistence is obvious and the fan base is growing to show it. When Nathan Dean and the Damn Band hit the road in June of 2008 to promote their first studio album “She Don’t Know”, they had no idea that the tour would never end. And so the Damn Tour was born and continues to thrive. They’ve played huge clubs in big city markets like Phoenix, Denver, Chicago and L.A., as well as tiny, intimate venues all across the nation.
Attracted to the powerful live sound and "let’s have another round" atmosphere there’s no doubt that this band is here to party and will always be the last one standing. With radio play from Arizona to Texas and all the way up into Illinois, the audience is listening and they want to come to the after party too!
2019 was the debut year for singer-songwriter, TJ Morrow. On top of releasing his debut EP album titled 'Live and Learn', he travelled the country as a member of fellow MurrayMac artist Jason McNabb’s band, sharing the stage with the likes of Billy Currington, Michael Ray, Morgan Wallen and many others. Album cuts 'Cheyenne' and 'F150 Flashback' have found recent success.
Classic 90's and early 2000's country music is a given when it comes to influences and favorites, however, if you searched his phone you'd find playlists flooded with other favorites such as AC/DC and Matchbox 20. You may notice all of these influences tied together defining TJ’s musical personality.
Country artist Scott Gray and his band Union Gray are a grassroots, rockin' country band from Denver, Colorado playing their own brand of country that mixes flavors from the red dirt of Oklahoma, down to the heart of Texas, and up to Nashville, TN.
Union Gray has been blessed to share the stage as support for great artists including Dwight Yoakam, Craig Morgan, Cody Canada, Stoney LaRue, Adam Hood, Tim Rushlow, James Otto and many more.
Union Gray has new music dropping early 2020. Stay tuned!


RETURN POLICY
Last updated December 29, 2018
Thank you for your purchase. We hope you are happy with your purchase. However, even if you are not completely satisfied with your purchase for any reason, no refunds are available.
QUESTIONS
If you have any questions concerning our return policy, please contact us at:
(847) 485-9587
matthew.pava@gmail.com


How does
OPT work? Let's explain it on short example. To decode an encrypted message you need to use a primal message or ciphring key.
Example 1 (by digits):
You have recieved a message with this content: 9 8 7 6 3 5 1 0. How can you deciphre it without knowing the key? As you can see, none of the numbers are the same as any others, and the difference between them are also random: 1, 1, 1, 3, 2, 4, 1. It's hard to point out any specific pattern, especially when the message given is that short.
How does OPT work then? While having a randomly generated key for example: 2 3 7 4 9 1 0 3 and encrypted message you can do a simple subtraction of the given values:
- 9 - 2 = 7
- 8 - 3 = 5
- 7 - 7 = 0
- 6 - 4 = 2
- 3 - 9 = 4 (If difference is negative, the choosen number is the one which position is accordingly "far" from end of sequence{1,2,...,0}, in this case it would be 6th number from end, which is 4).
- 5 - 1 = 4
- 1 - 0 = 1
- 0 - 3 = 7 (as up)
Thanks to upper countings we can observe that the primal message, which wasn't coded is: 7 5 0 2 4 4 1 7, the coding key which was used to encrypt is: 2 3 7 4 9 1 0 3, and enrypted message was: 9 8 7 6 3 5 1 0. To additionaly trammel encrypting our informationyou can add to the message additional random signs.
In the other words, having the original message - it is suffice to each of its sign to add a value from the randomly generated key-pad, to acquire the encrypted message which can only be read by the person who has the key, therefore so-called perfect cipher.
Code is one time pad.
It's like simple shift code (rot), but it uses other rotation amount for EACH CHARACTER which turns such code
from totally worthless into absolutelly unbreakable (by any analysis of the crypto text).


--- layout: post title: no title date: '2015-02-05T10:55:52+01:00' categories: - Sketches picture_url: https://film-Storyboards.tumblr.com/post/110169056556 ---


--- permalink: google9e382ac397ecad32.html sitemap: false --- google-site-verification: google9e382ac397ecad32.html


Car Sale
Center
Home
Cars
About
About Us
Blog
FAQ
Terms
Contact
Login
Menu
{% block content %} {% endblock %}


You can undo changes made locally, using . You cannot undo changes made in the cloud.
Click/tap and use the and buttons in the dialog.
Add new top-level folders by a long press on the topmost and selecting
from the pop-up menu. Enter a name for the folder, , and the folder will be created and opened.You can now use the pop-up menu on the new folder to add sub-folders and values.
Double-tap on an item name or value to bring up the menu and
orYou can use the Copy Value menu item, or simply long press on the value and use the system clip function
Enter the text you want to search for into the Search: box at the top. , then tap
Search hits will be highlit and scrolled to. You can scroll through hits using
Both keys and values are searched, and case doesn't matter.
Press and hold the right-hand
button for the folder or value you want to move, and drag it to its new home. It will be moved when you lift off.Click and enter the ISO 639-1 code for the language in Language:. The UI will change to your chosen language (if it is available!) when you close the dialog.
For help adding a language, visit the Squirrel github site.
Export a folder or value by selecting
A text version (in JSON format) will be copied to the clipboard.Text in JSON format on the clipboard can be pasted into a new folder using
So you can copy a folder, paste it into a text editor, modify it there, and then paste the result back into Squirrel.


--- type: "standard" title: "How to Flash a rom to your Android mobile" featimg: "https://i.kinja-img.com/gawker-media/image/upload/s--BV8Cm2Km--/c_fill,fl_progressive,g_north,h_358,q_80,w_636/19d50u5hyxzg9jpg.jpg" description: "how to flash or instal another version of Android (or ROM) on your android device." origin_url: "http://lifehacker.com/how-to-flash-a-rom-to-your-android-phone-30885281" social_media_msg: "How to Flash a custom or original ROM to Your Android Phone" ---
how to flash a rom for an Android mobile
A rom is like an operating system of the mobile. A custom ROM gives you new futures and a lot of control of your android mobile. .
there is a lot of diferentes versions of adroind rom and you can use the rom that you see is good for you.
There is no need that your android mobile has to be rooted to flash a custom recovery.You have only to choose the custom recovery ,download it to your pc and flash the new rom.
you can search in google and in the web sites like XDA Developers for : how to unlock the bootloader of your specific phone, which recovery you should use (usually TWRP or ClockworkMod), and how to flash it.
Your phone will be wiped while you unlock the bootloader , and without root access, you won't be able to back up very much. So, save the data you need in your computer—you will have to set up your phone from scratch just this once before continuing.
Advertisement
When you finish, continue to step two for the rest of the ROM process.
You can do a nandriod back up of your current system, to be safe and can restore your phone to his anterior good situation.if it happen something bed to the mobile system.
Also you can backup: your apps and data.using softwares like moborobo , mobogenie and others ... You can use Titanium Backup.
This just backs up the apps themselves
Note that you'll need to be rooted to use Titanium
flashing your ROM. First, you need to find the ROM you want.You can search in google or use theses links: this chart is a good place to start, as is list of the five most popular. Youca see XDA Developers forums to see what's available for your particular phone.
download the rom that you have found,using wifi and save it to your pc. It should come like ZIP file.You can download it from your computer and transfer it via USB or download it to the sd card.
To flash your ROM:
wipe your data and cache?
When you reboot, you should be in your new ROM, ready to use it! But what? There's no Play Store?
Google's apps are not open source, custom ROMs can't have Google's apps—like Gmail, Hangouts, or the Play Store—with their ROMs. That means you'll need to download and flash them separately.You ca use this link this page on RootzWiki to find out which ZIP file you need, download it to your phone, and flash it just like you did the ROM in step three.you ca use this link from this web site : www.lifehacker.com Gapps Manager in lifehacker.com is also a great app that'll help you find the right package if you're stuck, and you can download the APK from XDA Developers.
when you have flashed the latest Google Apps package, you should be done!


Basic info
first name
last name
title
Contact info
phone
address
email
About me
Social networks
Facebook link
Linkedin link
Instagram link
Website link
medium link
Google plus link
Experience
title
place
eduction date
description
title
place
eduction date
description
title
place
eduction date
description
Pro Skills
javascript level
photoshop level
HTML/CSS level
Per Skills
creativity level
hardwork level
leadership level
Education
title
place
eduction date
description
title
place
eduction date
description
title
place
eduction date
description
Hobbies
sport
reading
swimmning
programming
sleeping
Languages
Hebrew level
English level
Russian level
Italian level
Social networks


!DOCTYPE html>
Project3
Beer Deep Dive
We use Machine Learning and Big Data to help analyze your favorite beer and make suggestions for other liquid grains you may enjoy!
| Beer Name |
Beer Style |
Brewery Name |
Beer ABV |
Beer Overall Review |
Beer Taste Review |


An error occurred. Cannot present view.
{{ view.error }}
Could not connect to data server: {{ cubesService.stateText }}
Please try again and contact your administrator if the problem persists.
CubesViewer Data Visualizer


|
| typedef std::map< std::string, PaletteEntry > | spec_t |
| | Some kind of identity key for the palette, typically filename to avoid reloading. More...
|
| |
|
typedef drain::Dictionary< key_t, std::string > | dict_t |
| |
|
typedef std::map< double, PaletteEntry > | cont_t |
| |
|
typedef cont_t::key_type | key_t |
| |
|
typedef cont_t::value_type | entry_t |
| |
|
typedef drain::LookUp< typename cont_t::const_iterator > | lookup_t |
| | LOOK-UP table.
|
| |
|
|
void | reset () |
| |
|
void | addEntry (double min, double red=0.0, double green=0.0, double blue=0.0, const std::string &id="", const std::string &label="") |
| | Add one color.
|
| |
| void | load (const std::string &filename, bool flexible=false) |
| | Loads a palette from text file. More...
|
| |
| void | loadTXT (std::ifstream &ifstr) |
| | Loads a palette from text file. More...
|
| |
|
void | loadJSON (std::ifstream &ifstr) |
| | Loads a palette from text file.
|
| |
|
void | write (const std::string &filename) |
| |
|
void | exportTXT (std::ostream &ostr, char separator='\t', char separator2=0) const |
| |
|
void | exportJSON (drain::JSONtree2 &json) const |
| |
|
void | exportFMT (std::ostream &ostr, const std::string &format) const |
| |
|
void | exportSVGLegend (TreeSVG &svg, bool up=true) const |
| | Returns a legend as an SVG graphic.
|
| |
| const ChannelGeometry & | getChannels () const |
| | Creates a palette from json object. More...
|
| |
| void | refine (size_t n=0) |
| | Extend palette to contain n entries ("colors") by adding intermediate entries ("colors") More...
|
| |
|
void | updateDictionary () |
| |
|
| ImageCodeMap () |
| | Default constructor.
|
| |
|
| ImageCodeMap (std::initializer_list< entry_t > l) |
| |
|
| ImageCodeMap (const cont_t &map) |
| | Copy constructor //.
|
| |
| lookup_t & | createLookUp (const std::type_info &type, const ValueScaling &scaling) const |
| | Creates a vector of 256 or 65535 entries for fast retrieval. More...
|
| |
|
cont_t::const_iterator | retrieve (double d) const |
| |
|
cont_t::iterator | retrieve (double d) |
| |
|
|
void | update () const |
| |
|
void | importJSON (const drain::JSONtree2 &json) |
| | Creates a palette from json object.
|
| |
◆ spec_t
Some kind of identity key for the palette, typically filename to avoid reloading.
Certain intensities (before scaling with gain and offset) may require special treatment.
◆ getChannels()
Creates a palette from json object.
- Parameters
-
| json | - JSON structure combining optional metadata and compulsory entries section. |
◆ load()
| void load |
( |
const std::string & |
filename, |
|
|
bool |
flexible = false |
|
) |
| |
Loads a palette from text file.
- Parameters
-
| flexible | - if true, try also directory appended with ./palette, basename palette-<string> and extensions txt,json |
◆ loadTXT()
| void loadTXT |
( |
std::ifstream & |
ifstr | ) |
|
Loads a palette from text file.
First label in the file will be the title
◆ refine()
| void refine |
( |
size_t |
n = 0 | ) |
|
Extend palette to contain n entries ("colors") by adding intermediate entries ("colors")
Number of colors.
New number of entries.
◆ refinement
Request for future refinement, ie. refine() call upon next load().
It is upto applications to use this.
The documentation for this class was generated from the following files:
- drain/image/Palette.h
- drain/image/Palette.cpp


Example: Auto select credit card type via unobtrusive validation
This example shows how you can auto-select a credit card type - we use a hidden field, and then set a classname to show the card type. Here are a few cards you can try:
-<PHONE_NUMBER>98431 (Amex)
-<PHONE_NUMBER>105100 (Mastercard)
-<PHONE_NUMBER>111111 (Visa)


twilio.jwt package¶
Subpackages¶
Submodules¶
twilio.jwt.compat module¶
-
twilio.jwt.compat.
compare_digest
(a, b)[source]¶ PyJWT expects hmac.compare_digest to exist for all Python 3.x, however it was added in Python > 3.3 It has a fallback for Python 2.x but not for Pythons between 2.x and 3.3 Copied from: https://github.com/python/cpython/commit/6cea65555caf2716b4633827715004ab0291a282#diff-c49659257ec1b129707ce47a98adc96eL16
Returns the equivalent of ‘a == b’, but avoids content based short circuiting to reduce the vulnerability to timing attacks.
Module contents¶
-
class
twilio.jwt.
Jwt
(secret_key, issuer, subject=None, algorithm='HS256', nbf=<object object>, ttl=3600, valid_until=None)[source]¶ Bases:
object
Base class for building a Json Web Token
-
GENERATE
= <object object>¶
-
algorithm
= None¶
-
classmethod
from_jwt
(jwt, key='')[source]¶ Decode a JWT string into a Jwt object :param str jwt: JWT string :param Optional[str] key: key used to verify JWT signature, if not provided then validation
is skipped.:raises JwtDecodeError if decoding JWT fails for any reason. :return: A DecodedJwt object containing the jwt information.
-
headers
¶
-
issuer
= None¶
-
nbf
= None¶
-
payload
¶
-
secret_key
= None¶
-
subject
= None¶
-
to_jwt
(algorithm=None, ttl=None)[source]¶ Encode this JWT object into a JWT string :param str algorithm: override the algorithm used to encode the JWT :param int ttl: override the ttl configured in the constructor :rtype: str The JWT string
-
ttl
= None¶
-
valid_until
= None¶
-


Samad Farooqui
PROFILE
Sophomore at RPI looking for an internship for the summer of 2017.
Proficient time-management skills, ability to work well with others,
exceptional organizational skills, and familiarity with computer aspects
(e.g. hardware, programming). Willing to learn anything of relevance to
computer science or the field, and seeking internship to expand
knowledge of computer science and information technologies.
Willing and available to relocate in the summer of 2017, loves to
visit new places.
EDUCATION
- Rensselaer Polytechnic Institute - Troy, NY
Seeking a B.S. in Computer Science and Information Technology,
and ended with a 3.62 GPA after first year, ending up on the Dean's
Honor list. Classes currently taking include Computer Organization,
Introduction to IT, and Industrial, Linear Algebra, and Organizational
Psychology while classes taken include Data Structures, Multivariable
Calculus and Matrix Algebra, IT and Society, and Positive Psychology.
- Sayreville War Memorial High School - Parlin, NJ
Class of 2015 – Graduated ranked 19th out of 419 after obtaining high school diploma with
a GPA of 4.02, classes taken include Computer Networking and Design,
Visual Back, A.P. Calculus A.B., A.P. English 1 and 2, A.P. U.S. History
1 and 2, and A.P. Chemistry.
EXPERIENCE
- Sales Associate at Payless ShoeSource - Parlin, NJ
September 2014 - June 2015
Duties included:
- Processing shipments and organizing product.
- Communicating with customers and kids
on a regular basis.
- Using a cash register.
- Working with other associates to
improve the overall quality of the store.
- Intern at Bokara Rug Company - Secaucus, NJ
July 2013 - August 2013
Duties included:
- Filing
- Organizing and re-labeling the
entire legal cabinet.
SKILLS
- Profficient with Microsoft Office and Google Drive.
- Proficient in C++, Python, and C.
- Familiarity with Java, HTML, CSS, and Visual Basic.
- Working towards CompTIA A+ Certification.
- Fluent in English, Urdu, and Hindi.
- Acceptable Spanish spoken.
ACTIVITIES
- Public Relations Secretary of the RPI Muslim Student Association.
- Secretary of the Society of Asian Scientists and Engineers.
- Treasurer of the RPI Pakistani Student Association
- Undergraduate Computer Science mentor.
- Active RPI Boxing/MMA club member.
- Was Recording Secretary of the National Honor Society, Sayreville War
Memorial High School chapter.
- Was Vice President of the Sayreville Muslim Student Association
- Was Vice President of Students Against Destructive Decisions, Sayreville
War Memorial High School chapter.


{% extends 'base.html' %} {% block content %}
{{ group.description }}
{{group.users|count}}
Members
Case sensetive names, Once the user is added, he can not be removed
Delete '{{group.title}}' forever
Are you sure you want to delete {{group.title}}? The group will be deleted permanently.


| SoA | 0 kts |
| SoI | 0 kts |
| 0 kts | StA |
| 0 kts | StI |
| SrA | 0 kts |
| SrI | 0 kts |
| OPENING |
| OVERLEAD |
| 00000 | 00000 |
| Minimum Range | Maximum Range |
| 0000 | |
| Estimated Range |
| 000° | 000° |
| Relative Bearing | Reciprocal Bearing |
| Port Quarter | |
| Relative Position |
| 0 yds | 0 yds/min |
| Three minute rule | One minute rule |
| 0 minutes | |
| Towed array stabilization time |


| scale_colour_continuous_divergingx {colorspace} | R Documentation |
Continuous ggplot2 color scales using the color palettes generated by divergingx_hcl
.
scale_colour_continuous_divergingx(palette = "Geyser", c1 = NULL, c2 = NULL, c3 = NULL, l1 = NULL, l2 = NULL, l3 = NULL, h1 = NULL, h2 = NULL, h3 = NULL, p1 = NULL, p2 = NULL, p3 = NULL, p4 = NULL, cmax1 = NULL, cmax2 = NULL, rev = FALSE, begin = 0, end = 1, mid = 0, na.value = "grey50", guide = "colourbar", n_interp = 11, aesthetics = "colour", ...) scale_color_continuous_divergingx(palette = "Geyser", c1 = NULL, c2 = NULL, c3 = NULL, l1 = NULL, l2 = NULL, l3 = NULL, h1 = NULL, h2 = NULL, h3 = NULL, p1 = NULL, p2 = NULL, p3 = NULL, p4 = NULL, cmax1 = NULL, cmax2 = NULL, rev = FALSE, begin = 0, end = 1, mid = 0, na.value = "grey50", guide = "colourbar", n_interp = 11, aesthetics = "colour", ...) scale_fill_continuous_divergingx(..., aesthetics = "fill")
palette |
The name of the palette to be used. |
h1, h2, h3, c1, c2, c3, l1, l2, l3, p1, p2, p3, p4, cmax1, cmax2 |
Parameters to customize the scale. See |
rev |
If |
begin |
For sequential scales, number in the range of |
end |
For sequential scales, number in the range of |
mid |
For diverging scales, data value that should be mapped to the mid-point of the diverging color scale. Ignored for sequential scales. |
na.value |
Color to be used for missing data points. |
guide |
Type of legend. Use |
n_interp |
Number of discrete colors that should be used to interpolate the continuous color scale. For diverging scales, it is important to use an odd number to capture the color at the midpoint. |
aesthetics |
The ggplot2 aesthetics to which this scale should be applied. |
... |
common continuous scale parameters: 'name', 'breaks', 'labels', and 'limits'. See
|
Available CARTO palettes: ArmyRose, Earth, Fall, Geyser, TealRose, Temps, Tropic.
Available ColorBrewer.org palettes: Spectral, PuOr, RdYlGn, RdYlBu, RdGy, BrBG, PiYG, PRGn, RdBu.
If both a valid palette name and palette parameters are provided then the provided palette parameters overwrite the parameters in the named palette. This enables easy customization of named palettes.
# *** Examples for sequential CARTO scales *** # base plot library(ggplot2) gg <- ggplot(iris, aes(x = Species, y = Sepal.Width, color = Sepal.Length)) + geom_jitter(width = 0.3) + theme_minimal() # default settings gg + scale_color_continuous_divergingx() # switch palette to ArmyRose gg + scale_color_continuous_divergingx(palette = "ArmyRose") # select a range out of the entire palette gg + scale_color_continuous_divergingx(palette = "ArmyRose", begin = .2, end = .8) # volcano plot nx = 87 ny = 61 df <- data.frame(height = c(volcano), x = rep(1:nx, ny), y = rep(1:ny, each = nx)) ggplot(df, aes(x, y, fill=height)) + geom_raster() + scale_fill_continuous_divergingx(palette = "Fall", rev = TRUE) + coord_fixed(expand = FALSE) # *** Examples for diverging CARTO scales *** # adapted from stackoverflow: https://stackoverflow.com/a/20127706/4975218 # generate dataset and base plot library(ggplot2) set.seed(100) df <- data.frame(country = LETTERS, V = runif(26, -40, 40)) df$country = factor(LETTERS, LETTERS[order(df$V)]) # reorder factors gg <- ggplot(df, aes(x = country, y = V, fill = V)) + geom_bar(stat = "identity") + labs(y = "Under/over valuation in %", x = "Country") + coord_flip() + theme_minimal() # plot with diverging scale "Geyser" gg + scale_fill_continuous_divergingx(palette = "Geyser") # plot with diverging scale "ArmyRose" gg + scale_fill_continuous_divergingx(palette = "ArmyRose")


Used a smaller subset of the MNIST dataset (10k)
Trained a CNN using 80% of the data for training and 20% for validation
28x28 pixel BLACK AND WHITE picture of a number (0-9)
{{ i }} --> {{ result['proba'][i] }}


QR Bookmarklet
How to use:
- So...you're hangin' out with your friends.
- You've got your phone and you want them to see this cool article / page / post / whatever.
- Instead of a public recitation of digital poetry comprising of "ache tee tee pee...blah blah dot com"... "pound.. then go down to the bottom"... ugh.
- Hit this bookmarklet and generate a QR code that takes your friend straight to the page that you're on.
How to install (desktop):
- Drag this QR link to your bookmarks bar.
- You now have a bookmarklet! Yay! You can now click the bookmarklet to generate a QR Code for any page that you're on.
How to install (mobile):
- Click on this link (the page won't change in your browser)
- Add a bookmark for this page.
- Edit the bookmark and delete everything up to and including the "#" symbol.
- You now have a bookmarklet! Yay! You can now click the bookmarklet to share any page that you're on.
Try me:
Credits:


Career Panel @ Geeking Out Kids of Color
Yesterday I volunteered for one hour to speak at a career panel.
The panel was organized by GOKiC (Geeking Out Kids of Color) and Collective Youth.
I helped start GOKiC as a board member.
Recently, I stepped out as a board member.
It was really great to see the work of the non profit from the point of view of a volunteer.
It made me really proud to see how organized and big the organization has grown. ❤
There are some awesome people at GOKiC making a real impact on people’s lives.
Career Panel Ask
GOKiC approached me about the career panel via email.
I signed up through their website.
Soon after I was contact with some guidelines on what we could speak about during the career panel:
- Review where you’re from and how you got to where you are now
- Did you overcome challenges in education and work?
- What is it like working in your role?
- What’s one piece of advice you would give to a college student?
- and then a QA session.
What did I present?
Here it is, let me know if any of it was helpful to you: career panel presentation
If you have any questions, send me a message.
Q&A Session
Sadly the students were very quiet…
… except for one student who typed in the chat:
- “I want to be a Software Engineer at Microsoft”
I asked her about it:
- Why is that?
- Is there something we can help you with?
She mentioned how:
- She heard about software engineering as a really cool thing and how Microsoft was really awesome.
- She also said she was learning programming.
We, the panel, encouraged her and told her that she was doing the right thing (learning to code) to become a software engineer.
After the panel was done talking, I really wanted to know how I could help, so I asked her what year of college she was in or what year in high school.
She came off mute…
…and said:
- “I am in middle school”
think about it carefully…
That student in middle school was attending a panel for college kids about careers and she was seeking advice on how to become a software engineer at Microsoft.
Wait. What? Did I hear that right?
yep. I did and it made my week. ❤
I really don’t know how to end this post.
Except by saying how amazed I am by the drive of that middle school student and how GOKiC has enabled her to connect with people who perhaps were able to give advice that may help her achieve her goals.


Viewing Historical Imagery
This tutorial explains the basics of viewing historical imagery within Google Earth. You
will learn how to view historical imagery for the National Stadium in Beijing: The
largest steel structure in the world, it was built for the 2008 Summer Olympics.
By default, Google Earth displays the highest quality imagery available. You can view
historical imagery so that you can see how places have changed over time. You can view
imagery from different dates, click back and forward between the different imagery, and
play an animation of all the available imagery for a location.
The image below shows the highest quality imagery for the Beijing National Stadium, which
is what you automatically see in Google Earth:
In this exercise, you will view historical imagery for the National Stadium in Beijing.
To do this:
- Go to the Beijing National Stadium. For the purpose of this exercise, the quickest
way to do this is to enter the following latitude and longitude coordinates in the Fly To
field in the Search panel:
39 59'28.83"N 116 23'26.30"E
Press Enter. Google Earth flies to the National Stadium in Beijing.
(If you prefer, you can search for this location instead of using the coordinates
listed above. Learn more in the user guide or this tutorial).
- Click the Clock button in the toolbar. A timeline appears in the top left of
the 3D viewer, marked by small gray lines to indicate the different imagery available for
this location. You can see that the slider is automatically positioned at the far right
of the timeline, showing that you are viewing the best imagery available.
Note - You can also access the timeline by clicking View >
Historical Imagery.
-
- To go back in time, click and drag the slider to the left along the
timeline. Or, to move quickly between the different satellite images, click the Forward
or Back buttons above the slider.
- Release your mouse from the slider when the date above the timeline
indicates the following dates:
-
February 8, 2007 - You can see the stadium under construction,
with only its steel framework visible (see image below).
-
-
May 6, 2005 - You can see the stadium in its initial phase of
construction.
-
-
Oct 23, 2003 - You can see the site of the stadium, several months
before construction began in December 2003.
-
- You can use the Zoom in and Zoom out buttons to get a closer look at the timeline,
and see more easily the imagery that's available within a shorter time range.
For more examples of historical imagery, here are some ideas for where to go next:
-
Las Vegas: Fly to "The Strip, Las Vegas, NV" and check out how Las
Vegas has changed over time.
-
San Francisco: View historical imagery from as far back as 1946.
-
Berlin Hauptbahnhof: Watch the construction of Europe's largest
two-level railway station, which opened in May 2006.
Tip - Found a cool example of historical imagery? Share it with the
Google Earth Community.


AG-Studio for android games.
Here we publish our simple fun games.
(StoryMode) :
The farmer (ball) tries to get his shape and farm back and take revenge on the wizard who took his land and made him a coal ball...Help him to revenge.
(ChasingMode) : Rival your friends and run away from the giant monster to achieve the highest score you can reach.
Get entertainment and enjoy while coming across 99 levels of challenge.
Triple Gravity is a simple classic game that challenges your intuition and reaction speed in 99 levels with many obstacles.
The more you win, the more difficult it will be.
- There are several skins that you can buy with diamonds, Each skin has a different structure that is useful in some obstacles.
- There are different backgrounds and styles for levels.
- You can play end-less mode to get diamond faster and challenge your friends in the leaderboard.


4. A tour of the VERCE platform¶
In this section we will introduce the different parts of the VERCE platform, and show the models and meshes that are already loaded into the VERCE portal.
4.1 Welcome & News tabs¶
The welcome tab of the portal gives a very brief overview of the portals uses, while the news tab gives details of recent significant earthquakes. Other news such as upcoming training events, and publications related to the VERCE platform may also be shown here.
4.2 Security tab¶
We have already used many of the features available in this tab in order to upload our proxy certificate. The main security page though gives an overview of how to register for and get certificated for the platform, as covered in section 3 of this guide. The main tools you need to be aware of are the ‘MyProxy tool’ (section 3.4.1) and the ‘Certificate’ upload tab (section 3.4.3).
4.3 Forward Modelling tab¶
The ‘Forward Modelling’ tab is the main feature of the portal, and it is from here that you can setup and run full waveform simulations, and analyse the obtained output products. This section is divided in five sub-tabs that allow the user to access the different steps of the simulation and analysis procedure.
Jobs can be run from the ‘Simulation’ tab shown in figure 4.1 below. On the right hand side of this panel, the code used for the simulations can be selected from the drop down menu ‘Solvers’: so far both a code for local/regional 3D simulations - SPECFEM3D_Cartesian (Peter et al., 2011; see Section 5) – or a code for regional/global 3D simulations – SPECFEM3D_GLOBE (Tromp, Komatitsch, and Liu 2008; see section 6) – can be selected. Then, existing pre-loaded mesh and associated velocity model for different areas in the world can be selected from the drop down menus ‘Meshes’ and ‘Velocity Model’ respectively. Earthquake sources and seismic stations can be selected from the catalogues that are pre-installed into the portal under the ‘Earthquakes’ and ‘Stations’ tabs respectively. This process is described in more detail later in section 5 and 6 of this guide.
Alternatively, you can add your own mesh and velocity model using the blue link below the drop down boxes in figure 4.1. You can then add your own earthquake focal mechanisms and station locations. Details on how to create and submit a more advanced bespoke job like this are given in section 8 of this guide.
The left hand side panel shows a summary map of the area you are running your model for, currently the map view is defaulted to 3D globe. The map view can be changed by selecting a new projection from the Projections dropdown menu list. The map also shows details of existing geological maps, hazard maps, fault traces and other map layers which can be enabled/disabled through the Layers menu option. The relative weight of these can be adjusted by controlling their corresponding opacity control which can be found on the Controls dropdown menu and the associated legends can be accessed and viewed from the Legends menu.
Figure 4.1: The forward modeling interface ‘Simulation’ page.
From the ‘Download’ tab users can download observed seismograms from the EIDA data archive corresponding to a specific earthquake selected for simulations. These data cab be used in the subsequent procedure to calculate misfit with respect to synthetic seismograms. Details in section 7.
Moreover, both observed and synthetic seismograms can be processed before comparison using the features under the ‘Processing’ tab and quantitative misfit calculation can be performed in the section ‘Misfit’. All the results of simulations and analyses can be accessed from the ‘Results’ tabs. Details are reported in section 7 of this guide.
4.4 Provenance tab¶
This tab gives access to the provenance explorer GUI, which allows the methods assumptions and inputs that have lead to a given synthetic output to be easily summarized. An example of the provenance GUI is shown below (figure 4.2)
Figure 4.2: An example displayed from the Provenance Explorer GUI (taken for Atkinson et al 2016).
4.5 File Manager tab¶
The file manager tab gives a access to the files that are available to the user. The files are sorted by model run. Examples of using the functionality of this tab are given in section 7.
4.6 IRODS tab¶
The iRODS tab gives direct access to the iRODS data structure, and allows the data to be managed and potentially downloaded. Examples of using the functionality of this tab are given in section 7.
4.7 The Meshes and models already uploaded¶
Currently there are several meshes and velocity models pre-loaded for Italy, and a mesh pre-loaded for the Maule area of Central Chile. They can be used for running 3D simulations at local/regional scale with the code SPECFEM3D_Cartesion, as explained in section 5 of this guide.
The frequency to which the seismic wave-field can be simulated is controlled by the time step of the model, the spacing of grid points within the mesh and ultimately by the values of wave velocities in the corresponding model. For this reason, there is a maximum frequency (or minimum period) of waveform that a given pair of mesh and velocity model can support. This minimum period (maximum frequency) resolvable is shown below (figure 4.3) for each of the combinations mesh-wavespeed model currently available in the VERCE portal.
Other details of these meshes such as the suggested time step (suggest DT) to make each model stable, the number of points in the mesh (Num. of HEX), and the approximate time that a 1 minute simulation would take if it was run on 100 cores (CPU time) are shown in figure 4.4. The UTM zone for each of the meshes is also shown as this should be specified to run the simulation and can be useful when using the output data.
Finally figure 4.5 gives details of the velocity models that are uploaded, along with the meshes, to the VERCE portal. The minimum and maximum P-wave and S-wave velocities are given as these are required to calculate the grid spacing and time step needed to resolve a given frequency of seismic wave.
Figure 4.3: The mesh and velocity model combinations currently available through the VERCE portal, and the period to which the wave-field can be resolved in each of these mesh-model combinations.
Figure 4.4: Details of the meshes currently available through the VERCE platform.
Figure 4.5: Details of the velocity models that are currently available through the VERCE platform.


Dear Administrator of {{project}}, this email is to notify you that a new user just registered from email {{username}} with name {{name}} {{surname}}


whoami
"Aryan of House Hackm3, The First of his name, The Unpatched, Hoarder of Rainbow Tables, Cracker of Firewalls, Protector of Networks, Servers and Containers, Khal of Nothing, Domesticator of Trolls, Breaker of Chairs"
whoami 2.0
-
previously a Network Engineer at Capitol University
-
currently DevOps Systems Administrator at Innovuze Solutions Inc.
-
perpetual n00b and tinkerer of technology
-
FOSS advocate
-
... obviously a Game of Thrones fan.
-
... an audio bookworm (HP, GoT, LoTr, WoT)
Scope of this presentation
-
DevOps and Principles
-
Challenges in transitioning to a DevOps-centered organization
-
Benefits adopting fully DevOps processes
-
DevSecOps: Shift Left Paradigm
-
Demonstration of Trivy and CI/CD via GitHub Actions
-
Other tools for the DevSecOps Pipeline
-
QA and roundtable discussion
What is DevOps?
is the combination of cultural philosophies, practices, and tools that increases an organization’s ability to deliver applications
and services at high velocity: evolving and improving products at a faster pace than organizations using traditional software
development and infrastructure management processes.
DevOps Principles
for the open-minded
-
Holistic thinking: see the whole system and NOT "my little bit"
-
Iterative and Incremental: complete agility across the board
-
Automated, Repeatable and Predictable: this is a no-brainer
-
Collaborative: break the silos across all the teams
-
Continuous: Delivery, Monitoring, Testing, Planning, Feedback
Scope of Development and Operations
Challenges of organizations in adopting a DevOps culture
WARNING: potentially triggering content ahead
Tools Challenges
- Multiple tools with overlapping features increasing the learning curve
- Limited knowledge of tools posing challenge in automation
Collaboration Challenges
- Developers are not fully synchronized
- Lack of team involvement in the development process
Process Challenges
- No defined process framework detailing the different tenets in DevOps
- Unstructured approach to automation
- No central process control in the application stack and environment management
- Unstructured approach to automation
Cultural Challenges
- Lack of Transformational Leadership
- Realtime visibility of the entire lifecycle across the board
- Lack of standardization on metrics, processes, practices and organization-level control
Benefits of DevOps
for the open-minded...
-
Speed
-
Rapid Delivery
-
Reliability
-
Scale
-
Improved Collaboration
-
Security
DevSecOps Loop
Shift Left Testing
Traditionally, application testing and security was implemented during the last phases of development,
before being sent to security teams. If an application did not meet quality standards,
did not function properly, or otherwise failed to meet requirements, it would be sent back
into development for additional changes. This caused significant bottlenecks in the SDLC
and was not conducive to DevOps methodologies
Shift left testing makes it possible to identify and fix defects much earlier in the software
development lifecycle. This streamlines the development cycle, dramatically improves quality,
and enables faster progression to later stages for security analysis and deployment.
Shift Left Security
To shift security left means to implement security measures during the entire development lifecycle,
rather than at the end of the cycle. The goal of shifting security left is to design software with
security best practices built in, and to detect and fix potential security issues and vulnerabilities
as early in the development process as possible, making it easier, faster, and more affordable to address security issues.
Demonstration


Write a program that writes "Hello World!" to the screen:
Hello World!
"Hello World" is the traditional first step to learn any programming language.
Since this is the first challenge, you need all of the steps instead of only the tools.
Just follow along and make sure you see something like the pictures below.
Go to the setup section if you are unable to find the "Processing.exe". When you have started Processing, you should see something like:
Type the following text into the editor:
println("Hello World!");
And you should have something like:
Press the little triangle button in the top left of the Processing window to run your program.
If you didn't make any mistakes, a little grey window will pop up. Ignore this and look at the output of your program (circled in the picture below):
You have written and run a working program!
Now save your program for later by doing "File > Save" and creating a new directory "helloWorld", somewhere you can find it next time.
These are the programming tools that we have just used:
String
is a sequence of characters inside double quotes.println
function writes to the console.


Snowballin' is a casual game built in Unity. It plays similar to Katamari Damacy as the player rolls around picking up items with the ball. The game has two modes: time attack, where the player fights against melting by picking up items, and adventure mode, where they can explore the map trying to get the best score.


The GTK+ Input and Event Handling ModelThe GTK+ Input and Event Handling Model — GTK+ input and event handling in detail |
This chapter describes in detail how GTK+ handles input. If you are interested in what happens to translate a key press or mouse motion of the users into a change of a GTK+ widget, you should read this chapter. This knowledge will also be useful if you decide to implement your own widgets.
The most basic input devices that every computer user has interacted with are keyboards and mice; beyond these, GTK+ supports touchpads, touchscreens and more exotic input devices such as graphics tablets. Inside GTK+, every such input device is represented by a GdkDevice object.
To simplify dealing with the variability between these input devices, GTK+ has a concept of master and slave devices. The concrete physical devices that have many different characteristics (mice may have 2 or 3 or 8 buttons, keyboards have different layouts and may or may not have a separate number block, etc) are represented as slave devices. Each slave device is associated with a virtual master device. Master devices always come in pointer/keyboard pairs - you can think of such a pair as a 'seat'.
GTK+ widgets generally deal with the master devices, and thus can be used with any pointing device or keyboard.
When a user interacts with an input device (e.g. moves a mouse or presses a key on the keyboard), GTK+ receives events from the windowing system. These are typically directed at a specific window - for pointer events, the window under the pointer (grabs complicate this), for keyboard events, the window with the keyboard focus.
GDK translates these raw windowing system events into GdkEvents. Typical input events are:
| GdkEventButton |
| GdkEventMotion |
| GdkEventCrossing |
| GdkEventKey |
| GdkEventFocus |
| GdkEventTouch |
Additionally, GDK/GTK synthesizes other signals to let know whether grabs (system-wide or in-app) are taking input away:
| GdkEventGrabBroken |
| “grab-notify” |
When GTK+ is initialized, it sets up an event handler function with
gdk_event_handler_set()
, which receives all of these input events
(as well as others, for instance window management related events).
For widgets which have a GdkWindow set, events are received from the
windowing system and passed to gtk_main_do_event()
. See its documentation
for details of what it does: compression of enter/leave events,
identification of the widget receiving the event, pushing the event onto a
stack for gtk_get_current_event()
, and propagating the event to the
widget.
When a GDK backend produces an input event, it is tied to a GdkDevice and
a GdkWindow, which in turn represents a windowing system surface in the
backend. If a widget has grabbed the current input device, or all input
devices, the event is propagated to that GtkWidget. Otherwise, it is
propagated to the the GtkWidget which called gtk_widget_register_window()
on the GdkWindow receiving the event.
Grabs are implemented for each input device, and globally. A grab for a
specific input device (gtk_device_grab_add()
), is sent events in
preference to a global grab (gtk_grab_add()
). Input grabs only have effect
within the GtkWindowGroup containing the GtkWidget which registered the
event’s GdkWindow. If this GtkWidget is a child of the grab widget, the
event is propagated to the child — this is the basis for propagating
events within modal dialogs.
An event is propagated to a widget using gtk_propagate_event()
.
Propagation differs between event types: key events (GDK_KEY_PRESS
,
GDK_KEY_RELEASE
) are delivered to the top-level GtkWindow; other events
are propagated down and up the widget hierarchy in three phases (see
GtkPropagationPhase).
For key events, the top-level window’s default “key-press-event”
and “key-release-event” signal handlers handle mnemonics and
accelerators first. Other key presses are then passed to
gtk_window_propagate_key_event()
which propagates the event upwards from
the window’s current focus widget (gtk_window_get_focus()
) to the
top-level.
For other events, in the first phase (the “capture” phase) the event is
delivered to each widget from the top-most (for example, the top-level
GtkWindow or grab widget) down to the target GtkWidget.
Gestures that are
attached with GTK_PHASE_CAPTURE
get a chance to react to the event.
After the “capture” phase, the widget that was intended to be the
destination of the event will run gestures attached to it with
GTK_PHASE_TARGET
. This is known as the “target” phase, and only
happens on that widget.
Next, the “event” signal is emitted, then the appropriate signal for the event in question, for example “motion-notify-event”. Handling these signals was the primary way to handle input in GTK+ widgets before gestures were introduced. If the widget is realized, the “event-after” signal is emitted. The signals are emitted from the target widget up to the top-level, as part of the “bubble” phase.
The default handlers for the event signals send the event
to gestures that are attached with GTK_PHASE_BUBBLE
. Therefore,
gestures in the “bubble” phase are only used if the widget does
not have its own event handlers, or takes care to chain up to the
default GtkWidget handlers.
Events are not delivered to a widget which is insensitive or unmapped.
Any time during the propagation phase, a widget may indicate that a
received event was consumed and propagation should therefore be stopped.
In traditional event handlers, this is hinted by returning GDK_EVENT_STOP
.
If gestures are used, this may happen when the widget tells the gesture
to claim the event touch sequence (or the pointer events) for its own. See the
"gesture states" section below to know more of the latter.
Each widget instance has a basic event mask and another per input device, which determine the types of input event it receives. Each event mask set on a widget is added to the corresponding (basic or per-device) event mask for the widget’s GdkWindow, and all child GdkWindows.
If a widget is windowless (gtk_widget_get_has_window()
returns FALSE
) and
an application wants to receive custom events on it, it must be placed
inside a GtkEventBox to receive the events, and an appropriate event mask
must be set on the box. When implementing a widget, use a GDK_INPUT_ONLY
GdkWindow to receive the events instead.
Filtering events against event masks happens inside GdkWindow, which exposes event masks to the windowing system to reduce the number of events GDK receives from it. On receiving an event, it is filtered against the GdkWindow’s mask for the input device, if set. Otherwise, it is filtered against the GdkWindow’s basic event mask.
This means that widgets must add to the event mask for each event type
they expect to receive, using gtk_widget_set_events()
or
gtk_widget_add_events()
to preserve the existing mask. Widgets which are
aware of floating devices should use gtk_widget_set_device_events()
or
gtk_widget_add_device_events()
, and must explicitly enable the device
using gtk_widget_set_device_enabled()
. See the GdkDeviceManager
documentation for more information.
All standard widgets set the event mask for all events they expect to receive, and it is not necessary to modify this. Masks should be set when implementing a new widget.
Touch events are emitted as events of type GDK_TOUCH_BEGIN
, GDK_TOUCH_UPDATE
or
GDK_TOUCH_END
, those events contain an “event sequence” that univocally identifies
the physical touch until it is lifted from the device.
On some windowing platforms, multitouch devices perform pointer emulation, this works
by granting a “pointer emulating” hint to one of the currently interacting touch
sequences, which will be reported on every GdkEventTouch event from that sequence. By
default, if a widget didn't request touch events by setting GDK_TOUCH_MASK
on its
event mask and didn't override “touch-event”, GTK+ will transform these
“pointer emulating” events into semantically similar GdkEventButton and GdkEventMotion
events. Depending on GDK_TOUCH_MASK
being in the event mask or not, non-pointer-emulating
sequences could still trigger gestures or just get filtered out, regardless of the widget
not handling those directly.
If the widget sets GDK_TOUCH_MASK
on its event mask and doesn't chain up on
“touch-event”, only touch events will be received, and no pointer emulation
will be performed.
Grabs are a method to claim all input events from a device, they happen
either implicitly on pointer and touch devices, or explicitly. Implicit grabs
happen on user interaction, when a GdkEventButtonPress happens, all events from
then on, until after the corresponding GdkEventButtonRelease, will be reported
to the widget that got the first event. Likewise, on touch events, every
GdkEventSequence will deliver only events to the widget that received its
GDK_TOUCH_BEGIN
event.
Explicit grabs happen programatically (both activation and deactivation), and can be either system-wide (GDK grabs) or application-wide (GTK grabs). On the windowing platforms that support it, GDK grabs will prevent any interaction with any other application/window/widget than the grabbing one, whereas GTK grabs will be effective only within the application (across all its windows), still allowing for interaction with other applications.
But one important aspect of grabs is that they may potentially happen at any point somewhere else, even while the pointer/touch device is already grabbed. This makes it necessary for widgets to handle the cancellation of any ongoing interaction. Depending on whether a GTK or GDK grab is causing this, the widget will respectively receive a “grab-notify” signal, or a GdkEventGrabBroken event.
On gestures, these signals are handled automatically, causing the gesture to cancel all tracked pointer/touch events, and signal the end of recognition.
Event controllers are standalone objects that can perform specific actions upon received GdkEvents. These are tied to a GtkWidget, and can be told of the event propagation phase at which they will manage the events.
Gestures are a set of specific controllers that are prepared to handle pointer and/or touch events, each gestures implementation attempts to recognize specific actions out the received events, notifying of the state/progress accordingly to let the widget react to those. On multi-touch gestures, every interacting touch sequence will be tracked independently.
Being gestures “simple” units, it is not uncommon to tie several together to perform higher level actions, grouped gestures handle the same event sequences simultaneously, and those sequences share a same state across all grouped gestures. Some examples of grouping may be:
| A “drag” and a “swipe” gestures may want grouping. The former will report events as the dragging happens, the latter will tell the swipe X/Y velocities only after gesture has finished. |
| Grouping a “drag” gesture with a “pan” gesture will only effectively allow dragging in the panning orientation, as both gestures share state. |
| If “press” and “long press” are wanted simultaneously, those would need grouping. |
Gestures have a notion of “state” for each individual touch sequence. When events from a touch sequence are first received, the touch sequence will have “none” state, this means the touch sequence is being handled by the gesture to possibly trigger actions, but the event propagation will not be stopped.
When the gesture enters recognition, or at a later point in time, the widget may choose to claim the touch sequences (individually or as a group), hence stopping event propagation after the event is run through every gesture in that widget and propagation phase. Anytime this happens, the touch sequences are cancelled downwards the propagation chain, to let these know that no further events will be sent.
Alternatively, or at a later point in time, the widget may choose to deny the touch
sequences, thus letting those go through again in event propagation. When this happens
in the capture phase, and if there are no other claiming gestures in the widget,
a GDK_TOUCH_BEGIN
/GDK_BUTTON_PRESS
event will be emulated and
propagated downwards, in order to preserve consistency.
Grouped gestures always share the same state for a given touch sequence, so setting the state on one does transfer the state to the others. They also are mutually exclusive, within a widget there may be only one gesture group claiming a given sequence. If another gesture group claims later that same sequence, the first group will deny the sequence.


interface Sorting
Base interface to group all sorting options in the Reddit Api
requiresTimePeriod |
If this sorting option needs to be combined also with a TimePeriod, to be sent to the Api. e.g. Top / Last Month abstract val requiresTimePeriod: Boolean |
sortingStr |
raw string as seen by the Api. abstract val sortingStr: String |
CommentsSorting |
enum class CommentsSorting : Sorting |
ContributionsSorting |
enum class ContributionsSorting : Sorting |
RedditorSearchSorting |
enum class RedditorSearchSorting : Sorting |
SearchSorting |
enum class SearchSorting : Sorting |
SubmissionsSorting |
enum class SubmissionsSorting : Sorting |
SubredditSearchSorting |
enum class SubredditSearchSorting : Sorting |


{% extends "base.html" %} {% load humanize static hc_extras %} {% block title %}Notification Channels - {% site_name %}{% endblock %} {% block content %}
When a check goes up or down, {% site_name %} will send notifications to {% if chat_type == "private" %} a Telegram user {% else %} a Telegram chat {% endif %} named {{ chat_name }}. Sound good?
If your team uses Telegram, you can set up {% site_name %} to post status updates directly to an appropriate Telegram chat or user.
From your Telegram client, invite {{ bot_name }} to a group. It will get added as a member with no access to group messages.
Alternatively, if you want notifications sent to yourself directly, start a conversation with {{ bot_name }}.
Type /start
command.
If there are multiple bots in the group, type
/start@{{ bot_name }}
instead.
The bot will respond with a confirmation link.
Click or tap on the confirmation link, and {% site_name %} will open in a browser window asking you to confirm the new integration.
Confirm the integration, and it's done!


Counterfeit spice factory uncovered in Gauteng
by Algoa FMGauteng police have uncovered a counterfeit spice factory in Meyerton, as part of an operation in the Sedibeng District during which more than 600 suspects were arrested for various other crimes.
Provincial Police Commissioner, Lieutenant General Elias Mawela says on arrival at the plot on Thursday, police took in 10 foreign nationals who were immediately handed over to Immigration Officers from the Department of Home Affairs, for verification of their status in the country.
Eight were from Mozambique while two were Chinese nationals.
The operation continued on Friday when counterfeit spices worth millions of Rands were confiscated, as well as equipment and machinery suspected of being utilised for processing and packaging.
Those arrested are expected to appear in court soon.