using Plots
using Polynomials
using LinearAlgebra,SparseArrays
using DataFrames
include("FNC.jl")
We create two vectors for data about the population of China. The first has the years of census data, the other has the numbers of millions of people.
year = 1980:10:2010
pop = [984.736, 1148.364, 1263.638, 1330.141];
It's convenient to measure time in years since 1980. We use .-
to subtract a scalar from a vector elementwise.
t = year .- 1980
y = pop;
Now we have four data points $(t_1,y_1),\dots,(t_4,y_4)$, so $n=4$ and we seek an interpolating cubic polynomial. We construct the associated Vandermonde matrix:
V = [ t[i]^j for i=1:4, j=0:3 ]
To solve for the vector of polynomial coefficients, we use a backslash:
c = V \ y
The algorithms used by the backslash operator are the main topic of this chapter. For now, observe that the coefficients of the cubic polynomial vary over several orders of magnitude, which is typical in this context. By our definitions, these coefficients are given in ascending order of power in $t$.
We can use the resulting polynomial to estimate the population of China in 2005:
p = Poly(c) # construct a polynomial
p(2005-1980) # apply the 1980 time shift
The official figure is 1297.8, so our result is not bad.
We can visualize the interpolation process. First, we plot the data as points. We'll shift the $t$ variable back to actual years.
scatter(1980 .+ t,y,label="actual",
legend=:topleft,xlabel="year",ylabel="population (millions)",title="Population of China")
We want to superimpose a plot of the polynomial. We do that by evaluating it at a lot of points in the interval. Note the use of plot!
to add to the current plot, rather than replacing it.
tt = LinRange(0,30,300) # 300 times from 1980 to 2010
plot!(1980 .+ tt,p(tt),label="interpolant")
Let's redo it, this time continuing the curve outside of the original date range.
scatter(1980 .+ t,y,label="actual",
legend=:topleft,xlabel="year",ylabel="population (millions)",title="Population of China")
tt = LinRange(-10,50,300)
plot!(1980 .+ tt,p(tt),label="interpolant")
While the interpolation is plausible, the extrapolation to the future is highly questionable! As a rule, extrapolation more than a short distance beyond the original interval is not reliable.
Square brackets are used to enclose elements of a matrix or vector. Use spaces for horizontal concatenation, and semicolons or new lines to indicate vertical concatenation.
A = [ 1 2 3 4 5; 50 40 30 20 10
pi sqrt(2) exp(1) (1+sqrt(5))/2 log(3) ]
m,n = size(A)
A vector is not quite the same thing as a matrix. It has only one dimension, not two. Separate its elements by commas.
x = [ 3, 3, 0, 1, 0 ]
size(x)
For many purposes, though, an $n$-vector in Julia is a lot like an $n\times 1$ column vector.
size( [3;3;0;1;0] )
Concatenated elements within brackets may be matrices for a block representation, as long as all the block sizes are compatible.
AA = [ A; A ]
B = [ zeros(3,2) ones(3,1) ]
The dot-quote .'
transposes a matrix. A single quote '
on its own performs the hermitian (transpose and complex conjugation). For a real matrix, the two operations are the same.
A'
If x
is simply a vector, then its transpose has a row shape.
x'
There are many convenient shorthand ways of building vectors and matrices other than entering all of their entries directly or in a loop. To get a vector with evenly spaced entries between two endpoints, you have two options.
y = 1:4 # start:stop
z = ( 0:3:12 )' # start:step:stop
(Technically, y
above is not a vector but a range. It behaves identically in most circumstances.)
s = LinRange(-1,1,5)
Accessing an element is done by giving one (for a vector) or two index values in square brackets. The keyword end
as an index refers to the last position in the corresponding dimension.
a = A[2,end-1]
x[2]
The indices can be vectors or ranges, in which case a block of the matrix is accessed.
A[1:2,end-2:end] # first two rows, last three columns
If a dimension has only the index :
(a colon), then it refers to all the entries in that dimension of the matrix.
A[:,1:2:end] # all of the odd columns
The matrix and vector senses of addition, subtraction, scalar multiplication, multiplication, and power are all handled by the usual symbols. If matrix sizes are such that the operation is not defined, an error message will result.
B = diagm( 0=>[-1,0,-5] ) # create a diagonal matrix
BA = B*A # matrix product
A*B
causes an error.
A*B
A square matrix raised to an integer power is the same as repeated matrix multiplication.
B^3 # same as B*B*B
In many cases, one instead wants to treat a matrix or vector as a mere array and simply apply a single operation to each element of it. For multiplication, division, and power, the corresponding operators start with a dot.
C = -A;
A*C
would be an error.
elementwise = A.*C
The two operands of a dot operator have to have the same size—unless one is a scalar, in which case it is expanded or "broadcast" to be the same size as the other operand.
xtotwo = x.^2
twotox = 2.0.^x
Most of the mathematical functions, such as cos, sin, log, exp and sqrt, expect scalars as operands. However, you can broadcast any function across a vector or array by using a special dot syntax.
println(cos.(pi*x)); # vectorize a single function
<EMAIL_ADDRESS>cos(pi*x)); # vectorize an entire expression
For a square matrix $A$, the command A\b
is mathematically equivalent to $A^{-1}b$. This command is not part of the core Julia, though, so it has to be explicitly loaded before the first use in a session.
A = [1 0 -1; 2 2 1; -1 -3 0]
b = [1,2,3]
x = A\b
One way to check the answer is to compute a quantity known as the residual. It is (hopefully) close to machine precision, scaled by the size of the entries of the data.
residual = b - A*x
If the matrix $A$ is singular, you may get an error ("exception" in Julia-speak).
A = [0 1; 0 0]
b = [1,-1]
x = A\b
It's not exactly user-friendly here. Moreover, detecting singularity is a lot like checking whether two floating point numbers are exactly equal: because of roundoff, it could be missed. We're headed toward a more robust way to fully describe the situation.
It's easy to get just the lower triangular part of any matrix using the tril
command.
A = rand(1.:9.,5,5)
L = tril(A)
We'll set up and solve a linear system with this matrix.
b = ones(5)
x = FNC.forwardsub(L,b)
It's not clear what the error in this answer is. However, the residual, while not zero, is comparable to $\varepsilon_\text{mach}$ in size.
b - L*x
Next we'll engineer a problem to which we know the exact answer.
alpha = 0.3;
beta = 2.2;
U = diagm(0=>ones(5),1=>[-1,-1,-1,-1])
U[1,[4,5]] = [ alpha-beta, beta ]
U
x_exact = ones(5)
b = [alpha,0,0,0,1]
x = FNC.backsub(U,b)
err = x - x_exact
Everything seems OK here. But another example, with a different value for $\beta$, is more troubling.
alpha = 0.3;
beta = 1e12;
U = diagm(0=>ones(5),1=>[-1,-1,-1,-1])
U[1,[4,5]] = [ alpha-beta, beta ]
b = [alpha,0,0,0,1]
x = FNC.backsub(U,b)
err = x - x_exact
It's not so good to get four digits of accuracy after starting with sixteen! But the source of the error is not hard to track down. Solving for $x_1$ performs $(\alpha-\beta)+\beta$ in the first row.
We create a 4-by-4 linear system with the matrix
A = [
2 0 4 3
-4 5 -7 -10
1 15 2 -4.5
-2 0 2 -13
];
and with the right-hand side
b = [ 4, 9, 29, 40 ];
We define an augmented matrix by tacking $b$ on the end as a new column.
S = [A b]
The goal is to introduce zeros into the lower triangle of this matrix. By using only elementary row operations, we ensure that the matrix $S$ always represents a linear system that is equivalent to the original. We proceed from left to right and top to bottom. The first step is to put a zero in the (2,1) location using a multiple of row 1:
@show mult21 = S[2,1]/S[1,1];
S[2,:] -= mult21*S[1,:]; # -= means "subtract the following from"
S
We repeat the process for the (3,1) and (4,1) entries.
@show mult31 = S[3,1]/S[1,1];
S[3,:] -= mult31*S[1,:];
@show mult41 = S[4,1]/S[1,1];
S[4,:] -= mult41*S[1,:];
S
The first column has the zero structure we want. To avoid interfering with that, we no longer add multiples of row 1 to anything. Instead, to handle column 2, we use multiples of row 2. We'll also exploit the highly repetitive nature of the operations to write them as a loop.
for i = 3:4
mult = S[i,2]/S[2,2]
S[i,:] -= mult*S[2,:]
end
S
We finish out the triangularization with a zero in the (4,3) place. It's a little silly to use a loop for just one iteration, but the point is to establish a pattern.
for i = 4
mult = S[i,3]/S[3,3]
S[i,:] -= mult*S[3,:]
end
S
Recall that $S$ is an augmented matrix: it represents the system $Ux=z$, where
U = S[:,1:4]
z = S[:,5]
The solutions to this system are identical to those of the original system, but this one can be solved by backward substitution.
x = FNC.backsub(U,z)
b - A*x
We revisit the previous example using algebra to express the row operations on $A$.
A = [2 0 4 3 ; -4 5 -7 -10 ; 1 15 2 -4.5 ; -2 0 2 -13];
We use the identity and its columns heavily.
I = diagm(0=>ones(4))
The first step is to put a zero in the (2,1) location using a multiple of row 1:
mult21 = A[2,1]/A[1,1]
L21 = I - mult21*I[:,2]*I[:,1]'
A = L21*A
We repeat the process for the (3,1) and (4,1) entries.
mult31 = A[3,1]/A[1,1];
L31 = I - mult31*I[:,3]*I[:,1]';
A = L31*A;
mult41 = A[4,1]/A[1,1];
L41 = I - mult41*I[:,4]*I[:,1]';
A = L41*A
And so on, following the pattern as before.
A = [2 0 4 3; -4 5 -7 -10; 1 15 2 -4.5; -2 0 2 -13];
L,U = FNC.lufact(A)
LtimesU = L*U
It's best to compare two floating-point quantities by taking their difference.
A - LtimesU
(Usually we can expect "zero" only up to machine precision. However, all the exact numbers in this example are also floating-point numbers.)
To solve a linear system, we no longer need the matrix $A$.
b = [4,9,29,40]
z = FNC.forwardsub(L,b)
x = FNC.backsub(U,z)
b - A*x
n = 6
A = randn(n,n)
x = ones(n)
y = zeros(n)
for i = 1:n
for j = 1:n
y[i] = y[i] + A[i,j]*x[j] # 2 flops
end
end
Each of the loops implies a summation of flops. The total flop count for this algorithm is [ \sum{i=1}^n \sum{j=1}^n 2 = \sum_{i=1}^n 2n = 2n^2. ] Since the matrix $A$ has $n^2$ elements, all of which have to be involved in the product, it seems unlikely that we could get a flop count that is smaller than $O(n^2)$.
Let's run an experiment with the built-in matrix-vector multiplication. We assume that flops dominate the computation time and thus measure elapsed time.
n = 400:400:4000
t = zeros(size(n))
for (i,n) in enumerate(n)
A = randn(n,n)
x = randn(n)
t[i] = @elapsed for j = 1:10; A*x; end
end
The reason for doing multiple repetitions at each value of $n$ is to avoid having times so short that the resolution of the timer is a factor.
DataFrame(size=n,time=t)
Let's repeat the experiment of the previous example for more, and larger, values of $n$.
n = 400:200:6000
t = zeros(size(n))
for (i,n) in enumerate(n)
A = randn(n,n)
x = randn(n)
t[i] = @elapsed for j = 1:10; A*x; end
end
Plotting the time as a function of $n$ on log-log scales is equivalent to plotting the logs of the variables, but is formatted more neatly.
plot(n,t,m=:o,
xaxis=(:log10,"\$n\$"),yaxis=(:log10,"elapsed time (sec)"),
title="Timing of matrix-vector multiplications",label="data",leg=false)
You can see that while the full story is complicated, the graph is trending to a straight line of positive slope. For comparison, we can plot a line that represents $O(n^2)$ growth exactly. (All such lines have slope equal to 2.)
plot!(n,(n/n[end]).^2*t[end],l=:dash,
label="\$O(n^3)\$",legend=:topleft)
We'll test the conclusion of $O(n^3)$ flops experimentally, using the built-in lu
function instead of the purely instructive lufact
.
n = 200:100:2400
t = zeros(size(n))
for (i,n) in enumerate(n)
A = randn(n,n)
t[i] = @elapsed for j = 1:6; lu(A); end
end
We plot the timings on a log-log graph and compare it to $O(n^3)$. The result could vary significantly from machine to machine.
plot(n,t,m=:o,
xaxis=(:log10,"\$n\$"),yaxis=(:log10,"elapsed time"),label="data")
plot!(n,(n/n[end]).^3*t[end],l=:dash,
label="\$O(n^3)\$")
Here is the previously solved system.
A = [2 0 4 3; -4 5 -7 -10; 1 15 2 -4.5; -2 0 2 -13];
b = [4,9,29,40];
It has a perfectly good solution, obtainable through LU factorization.
L,U = FNC.lufact(A)
x = FNC.backsub( U, FNC.forwardsub(L,b) )
If we swap the second and fourth equations, nothing essential is changed, and Julia still finds the solution.
A[[2,4],:] = A[[4,2],:]
b[[2,4]] = b[[4,2]]
x = A\b
However, LU factorization fails.
L,U = FNC.lufact(A)
L
Here is the system that "broke" LU factorization for us.
A = [2 0 4 3; -4 5 -7 -10; 1 15 2 -4.5; -2 0 2 -13];
b = [4,9,29,40];
When we use the lu
function (from LinearAlgebra
) with three outputs, we get the elements of the PLU factorization.
L,U,p = lu(A);
L
U
p
As you see above, the p
return is a vector permutation of 1:n
, rather than the permutation matrix P
. We can recover the latter as follows:
I = diagm(0=>ones(4))
P = I[p,:]
However, this is rarely necessary in practice (and the vector requires a lot less storage). We can the linear system, for example, using only p
.
x = FNC.backsub( U, FNC.forwardsub(L,b[p,:]) )
If you call lu
with just one output, it is a "factorization object". You can access the individual parts of it using a dot syntax.
fact = lu(A)
fact.L
The factorization object can be used efficiently to solve linear systems by the backslash.
x = fact\b
The idea here is that if you have to solve many different linear systems for the same matrix, you can perform the computationally expensive factorization just once, and repeat only the much faster triangular solves for the different right-hand sides.
In Julia the standard LinearAlgebra
package has a norm
command for vector norms.
x = [2,-3,1,-1]
twonorm = norm(x) # or norm(x,2)
infnorm = norm(x,Inf)
onenorm = norm(x,1)
A = [ 2 0; 1 -1 ]
In Julia one uses norm
for vector norms and opnorm
for induced matrix norms. The default matrix norm is the 2-norm.
twonorm = opnorm(A)
(A potential snag is that norm
does work on a matrix but treats it like a vector of stacked columns, giving a different result.)
You can get the 1-norm as well.
onenorm = opnorm(A,1)
The 1-norm is equivalent to
maximum( sum(abs.(A),dims=1) ) # sum down the rows (1st matrix dimension)
Similarly, we can get the $\infty$-norm and check our formula for it.
infnorm = opnorm(A,Inf)
maximum( sum(abs.(A),dims=2) ) # sum across columns (2nd matrix dimension)
Here we illustrate the geometric interpretation of the 2-norm. First, we will sample a lot of vectors on the unit circle in $\mathbb{R}^2$.
theta = 2*pi*(0:1/600:1)
x = @. [ cos(theta) sin(theta) ]' # 601 unit columns
plot(x[1,:],x[2,:],aspect_ratio=1,layout=(1,2),subplot=1,
title="Unit circle",leg=:none,xlabel="\$x_1\$",ylabel="\$x_2\$")
We can apply A
to every column of x
simply by using a matrix multiplication.
Ax = A*x;
We superimpose the image of the unit circle with the circle whose radius is $\|A\|_2$, and display the plots side by side.
plot!(Ax[1,:],Ax[2,:],subplot=2,aspect_ratio=1,
title="Image under map",leg=:none,xlabel="\$x_1\$",ylabel="\$x_2\$")
plot!(twonorm*x[1,:],twonorm*x[2,:],subplot=2,l=:dash)
Julia has a function cond
to compute matrix condition numbers. By default, the 2-norm is used. As an example, the family of Hilbert matrices is famously badly conditioned. Here is the $7\times 7$ case.
A = [ 1/(i+j) for i=1:7, j=1:7 ]
kappa = cond(A)
Next we engineer a linear system problem to which we know the exact answer.
x_exact = 1.:7.
b = A*x_exact
Now we perturb the data randomly with a vector of norm $10^{-12}$.
dA = randn(size(A)); dA = 1e-12*(dA/norm(dA));
db = randn(size(b)); db = 1e-12*(db/norm(db));
We solve the perturbed problem using built-in pivoted LU and see how the solution was changed.
x = (A+dA) \ (b+db);
dx = x - x_exact;
Here is the relative error in the solution.
rel_error = norm(dx) / norm(x_exact)
And here are upper bounds predicted using the condition number of the original matrix.
@show b_bound = kappa * 1e-12/norm(b);
@show A_bound = kappa * 1e-12/norm(A);
Even if we don't make any manual perturbations to the data, machine epsilon does when we solve the linear system numerically.
x = A\b;
@show rel_error = norm(x - x_exact) / norm(x_exact);
@show rounding_bound = kappa*eps();
Because $\kappa\approx 10^8$, it's possible to lose 8 digits of accuracy in the process of passing from $A$ and $b$ to $x$. That's independent of the algorithm; it's inevitable once the data are expressed in double precision.
Larger Hilbert matrices are even more poorly conditioned.
A = [ 1/(i+j) for i=1:14, j=1:14 ];
kappa = cond(A)
Before we compute the solution, note that $\kappa$ exceeds 1/eps()
. In principle we therefore might end up with an answer that is completely wrong (i.e., a relative error greater than 100%).
rounding_bound = kappa*eps()
x_exact = 1.:14.;
b = A*x_exact;
x = A\b;
We got an answer. But in fact the error does exceed 100%.
relative_error = norm(x_exact - x) / norm(x_exact)
Here is a matrix with both lower and upper bandwidth equal to one. Such a matrix is called tridiagonal.
A = [ 2 -1 0 0 0 0
4 2 -1 0 0 0
0 3 0 -1 0 0
0 0 2 2 -1 0
0 0 0 1 1 -1
0 0 0 0 0 2 ]
We can extract the elements on any diagonal using the diag
command. The "main" or central diagonal is numbered zero, above and to the right of that is positive, and below and to the left is negative.
diag_main = diag(A,0)
diag_plusone = diag(A,1)
diag_minusone = diag(A,-1)
We can also put whatever numbers we like onto any diagonal with the diagm
command.
A = A + diagm(2=>[pi,8,6,7])
L,U = FNC.lufact(A)
L
U
Observe above that the lower and upper bandwidths of $A$ are preserved in the $L$ and $U$ results.
We'll use a large banded matrix to observe the speedup possible in LU factorization. We'll also need to load in a (standard) package for sparse matrices.
If we use an ordinary "dense" matrix, then there's no way to exploit a banded structure such as tridiagonality.
n = 10000
A = diagm(0=>1:n,1=>n-1:-1:1,-1=>ones(n-1))
@time lu(A);
If instead we construct a proper "sparse" matrix, though, the speedup can be dramatic.
A = spdiagm(0=>1:n,1=>n-1:-1:1,-1=>ones(n-1))
@time lu(A);
We begin with a symmetric $A$.
A = [ 2 4 4 2
4 5 8 -5
4 8 6 2
2 -5 2 -26 ];
Carrying out our usual elimination in the first column leads us to
L1 = diagm(0=>ones(4))
L1[2:4,1] = [-2,-2,-1]
A1 = L1*A
But now let's note that if we transpose this result, we have the same first column as before! So we could apply again and then transpose back.
A2 = (L1*A1')'
Using transpose identities, this is just
A2 = A1*L1'
Now you can see how we proceed down and to the right, eliminating in a column and then symmetrically in the corresponding row.
L2 = diagm(0=>ones(4))
L2[3:4,2] = [0,-3]
A3 = L2*A2*L2'
Finally, we arrive at a diagonal matrix.
L3 = diagm(0=>ones(4))
L3[4,3] = -1
D = L3*A3*L3'
A randomly chosen matrix is extremely unlikely to be symmetric. However, there is a simple way to symmetrize one.
A = rand(1.:9.,4,4)
B = A + A'
Similarly, a random symmetric matrix is unlikely to be positive definite. The Cholesky algorithm always detects a non-PD matrix by quitting with an error.
cholesky(B)
It's not hard to manufacture an SPD matrix to try out the Cholesky factorization.
B = A'*A
cf = cholesky(B)
What's returned is a "factorization object." (This allows it to be used efficiently in various contexts.) Another step is required to extract the factor as a matrix.
R = Matrix(cf.U)
norm(R'*R - B)


LayoutIterProtocol
public protocol LayoutIterProtocol
The LayoutIterProtocol
protocol exposes the methods and properties of an underlying PangoLayoutIter
instance.
The default implementation of these can be found in the protocol extension below.
For a concrete class that implements these methods and properties, see LayoutIter
.
Alternatively, use LayoutIterRef
as a lighweight, unowned
reference if you already have an instance you just want to use.
A PangoLayoutIter
structure can be used to
iterate over the visual extents of a PangoLayout
.
The PangoLayoutIter
structure is opaque, and
has no user-visible fields.
-
Untyped pointer to the underlying
PangoLayoutIter
instance.Declaration
Swift
var ptr: UnsafeMutableRawPointer { get }
-
layout_iter_ptr
Default implementationTyped pointer to the underlying
PangoLayoutIter
instance.Default Implementation
Return the stored, untyped pointer as a typed pointer to the
PangoLayoutIter
instance.Declaration
Swift
var layout_iter_ptr: UnsafeMutablePointer<PangoLayoutIter> { get }
-
atLastLine()
Extension methodDetermines whether
iter
is on the last line of the layout.Declaration
Swift
func atLastLine() -> Bool
-
copy()
Extension methodCopies a
PangoLayoutIter
.Declaration
Swift
func copy() -> UnsafeMutablePointer<PangoLayoutIter>!
-
free()
Extension methodFrees an iterator that’s no longer in use.
Declaration
Swift
func free()
-
getBaseline()
Extension methodGets the Y position of the current line’s baseline, in layout coordinates (origin at top left of the entire layout).
Declaration
Swift
func getBaseline() -> CInt
-
getCharExtents(logicalRect:)
Extension methodGets the extents of the current character, in layout coordinates (origin is the top left of the entire layout). Only logical extents can sensibly be obtained for characters; ink extents make sense only down to the level of clusters.
Declaration
Swift
func getCharExtents(logicalRect logical_rect: RectangleProtocol)
-
getClusterExtents(inkRect:logicalRect:)
Extension methodGets the extents of the current cluster, in layout coordinates (origin is the top left of the entire layout).
Declaration
Swift
func getClusterExtents(inkRect ink_rect: RectangleProtocol, logicalRect logical_rect: RectangleProtocol)
-
getIndex()
Extension methodGets the current byte index. Note that iterating forward by char moves in visual order, not logical order, so indexes may not be sequential. Also, the index may be equal to the length of the text in the layout, if on the
nil
run (seepango_layout_iter_get_run()
).Declaration
Swift
func getIndex() -> CInt
-
getLayout()
Extension methodGets the layout associated with a
PangoLayoutIter
.Declaration
Swift
func getLayout() -> UnsafeMutablePointer<PangoLayout>!
-
getLayoutExtents(inkRect:logicalRect:)
Extension methodObtains the extents of the
PangoLayout
being iterated over.ink_rect
orlogical_rect
can benil
if you aren’t interested in them.Declaration
Swift
func getLayoutExtents(inkRect ink_rect: RectangleProtocol, logicalRect logical_rect: RectangleProtocol)
-
getLine()
Extension methodGets the current line.
Use the faster
pango_layout_iter_get_line_readonly()
if you do not plan to modify the contents of the line (glyphs, glyph widths, etc.).Declaration
Swift
func getLine() -> UnsafeMutablePointer<PangoLayoutLine>!
-
getLineExtents(inkRect:logicalRect:)
Extension methodObtains the extents of the current line.
ink_rect
orlogical_rect
can benil
if you aren’t interested in them. Extents are in layout coordinates (origin is the top-left corner of the entirePangoLayout
). Thus the extents returned by this function will be the same width/height but not at the same x/y as the extents returned frompango_layout_line_get_extents()
.Declaration
Swift
func getLineExtents(inkRect ink_rect: RectangleProtocol, logicalRect logical_rect: RectangleProtocol)
-
getLineReadonly()
Extension methodGets the current line for read-only access.
This is a faster alternative to
pango_layout_iter_get_line()
, but the user is not expected to modify the contents of the line (glyphs, glyph widths, etc.).Declaration
Swift
func getLineReadonly() -> UnsafeMutablePointer<PangoLayoutLine>!
-
getLineYrange(y0_:y1_:)
Extension methodDivides the vertical space in the
PangoLayout
being iterated over between the lines in the layout, and returns the space belonging to the current line. A line’s range includes the line’s logical extents, plus half of the spacing above and below the line, ifpango_layout_set_spacing()
has been called to set layout spacing. The Y positions are in layout coordinates (origin at top left of the entire layout).Note: Since 1.44, Pango uses line heights for placing lines, and there may be gaps between the ranges returned by this function.
Declaration
Swift
func getLineYrange(y0_: UnsafeMutablePointer<CInt>, y1_: UnsafeMutablePointer<CInt>)
-
getRun()
Extension methodGets the current run. When iterating by run, at the end of each line, there’s a position with a
nil
run, so this function can returnnil
. Thenil
run at the end of each line ensures that all lines have at least one run, even lines consisting of only a newline.Use the faster
pango_layout_iter_get_run_readonly()
if you do not plan to modify the contents of the run (glyphs, glyph widths, etc.).Declaration
Swift
func getRun() -> UnsafeMutablePointer<PangoLayoutRun>!
-
getRunExtents(inkRect:logicalRect:)
Extension methodGets the extents of the current run in layout coordinates (origin is the top left of the entire layout).
Declaration
Swift
func getRunExtents(inkRect ink_rect: RectangleProtocol, logicalRect logical_rect: RectangleProtocol)
-
getRunReadonly()
Extension methodGets the current run. When iterating by run, at the end of each line, there’s a position with a
nil
run, so this function can returnnil
. Thenil
run at the end of each line ensures that all lines have at least one run, even lines consisting of only a newline.This is a faster alternative to
pango_layout_iter_get_run()
, but the user is not expected to modify the contents of the run (glyphs, glyph widths, etc.).Declaration
Swift
func getRunReadonly() -> UnsafeMutablePointer<PangoLayoutRun>!
-
nextChar()
Extension methodMoves
iter
forward to the next character in visual order. Ifiter
was already at the end of the layout, returnsfalse
.Declaration
Swift
func nextChar() -> Bool
-
nextCluster()
Extension methodMoves
iter
forward to the next cluster in visual order. Ifiter
was already at the end of the layout, returnsfalse
.Declaration
Swift
func nextCluster() -> Bool
-
nextLine()
Extension methodMoves
iter
forward to the start of the next line. Ifiter
is already on the last line, returnsfalse
.Declaration
Swift
func nextLine() -> Bool
-
nextRun()
Extension methodMoves
iter
forward to the next run in visual order. Ifiter
was already at the end of the layout, returnsfalse
.Declaration
Swift
func nextRun() -> Bool
-
baseline
Extension methodGets the Y position of the current line’s baseline, in layout coordinates (origin at top left of the entire layout).
Declaration
Swift
var baseline: CInt { get }
-
index
Extension methodGets the current byte index. Note that iterating forward by char moves in visual order, not logical order, so indexes may not be sequential. Also, the index may be equal to the length of the text in the layout, if on the
nil
run (seepango_layout_iter_get_run()
).Declaration
Swift
var index: CInt { get }
-
layout
Extension methodGets the layout associated with a
PangoLayoutIter
.Declaration
Swift
var layout: UnsafeMutablePointer<PangoLayout>! { get }
-
line
Extension methodGets the current line.
Use the faster
pango_layout_iter_get_line_readonly()
if you do not plan to modify the contents of the line (glyphs, glyph widths, etc.).Declaration
Swift
var line: UnsafeMutablePointer<PangoLayoutLine>! { get }
-
lineReadonly
Extension methodGets the current line for read-only access.
This is a faster alternative to
pango_layout_iter_get_line()
, but the user is not expected to modify the contents of the line (glyphs, glyph widths, etc.).Declaration
Swift
var lineReadonly: UnsafeMutablePointer<PangoLayoutLine>! { get }
-
run
Extension methodGets the current run. When iterating by run, at the end of each line, there’s a position with a
nil
run, so this function can returnnil
. Thenil
run at the end of each line ensures that all lines have at least one run, even lines consisting of only a newline.Use the faster
pango_layout_iter_get_run_readonly()
if you do not plan to modify the contents of the run (glyphs, glyph widths, etc.).Declaration
Swift
var run: UnsafeMutablePointer<PangoLayoutRun>! { get }
-
runReadonly
Extension methodGets the current run. When iterating by run, at the end of each line, there’s a position with a
nil
run, so this function can returnnil
. Thenil
run at the end of each line ensures that all lines have at least one run, even lines consisting of only a newline.This is a faster alternative to
pango_layout_iter_get_run()
, but the user is not expected to modify the contents of the run (glyphs, glyph widths, etc.).Declaration
Swift
var runReadonly: UnsafeMutablePointer<PangoLayoutRun>! { get }


BREAKING BBC confirms general election TV debates - including Corbyn clash with Johnson
Jeremy Corbyn and Boris Johnson will face off in a two-way clash on Friday 6 December
by Dan Bloom, https://www.facebook.com/mirrordanbloomThe BBC has confirmed a string of TV debates for the general election - including a showdown clash between Jeremy Corbyn and Boris Johnson .
Chiefs unveiled the schedule today after ITV and Sky News confirmed TV debates in the countdown to the December 12 poll.
The ITV debate on November 19 - between just Mr Corbyn and Mr Johnson - had enraged Lib Dems whose leader Jo Swinson accused the network of sexism.
But the BBC has also opted for a two-way debate between the PM and Leader of the Opposition. It will be held on Friday 6 December and come live from Southampton.
As well as that event, there will be a seven-way podium debate between leaders of the seven biggest parties on Friday 29 November.
This breaking news story is being updated.


|
VirtualSCADA
1.0
VirtualSCADA Senior Design Project
|
Additional Inherited Members | |
| Protected Attributes inherited from ObjectBehavior | |
| $object | |
Definition at line 8 of file IdenticalValueTokenSpec.php.
| it_generates_proper_string_representation_for_array | ( | ) |
Definition at line 129 of file IdenticalValueTokenSpec.php.
| it_generates_proper_string_representation_for_boolean_false | ( | ) |
Definition at line 111 of file IdenticalValueTokenSpec.php.
| it_generates_proper_string_representation_for_boolean_true | ( | ) |
Definition at line 105 of file IdenticalValueTokenSpec.php.
| it_generates_proper_string_representation_for_double | ( | ) |
Definition at line 99 of file IdenticalValueTokenSpec.php.
| it_generates_proper_string_representation_for_empty_array | ( | ) |
Definition at line 123 of file IdenticalValueTokenSpec.php.
| it_generates_proper_string_representation_for_integer | ( | ) |
Definition at line 81 of file IdenticalValueTokenSpec.php.
| it_generates_proper_string_representation_for_null | ( | ) |
Definition at line 117 of file IdenticalValueTokenSpec.php.
| it_generates_proper_string_representation_for_object | ( | $object | ) |
Definition at line 142 of file IdenticalValueTokenSpec.php.
| it_generates_proper_string_representation_for_resource | ( | ) |
Definition at line 135 of file IdenticalValueTokenSpec.php.
| it_generates_proper_string_representation_for_string | ( | ) |
Definition at line 87 of file IdenticalValueTokenSpec.php.
| it_generates_single_line_representation_for_multiline_string | ( | ) |
Definition at line 93 of file IdenticalValueTokenSpec.php.
| it_is_initializable | ( | ) |
Definition at line 15 of file IdenticalValueTokenSpec.php.
| it_is_not_last | ( | ) |
Definition at line 76 of file IdenticalValueTokenSpec.php.
| it_scores_11_if_array_value_is_identical_to_argument | ( | ) |
Definition at line 44 of file IdenticalValueTokenSpec.php.
| it_scores_11_if_boolean_value_is_identical_to_argument | ( | ) |
Definition at line 26 of file IdenticalValueTokenSpec.php.
| it_scores_11_if_float_value_is_identical_to_argument | ( | ) |
Definition at line 38 of file IdenticalValueTokenSpec.php.
| it_scores_11_if_integer_value_is_identical_to_argument | ( | ) |
Definition at line 32 of file IdenticalValueTokenSpec.php.
| it_scores_11_if_object_value_is_identical_to_argument | ( | ) |
Definition at line 50 of file IdenticalValueTokenSpec.php.
| it_scores_11_if_string_value_is_identical_to_argument | ( | ) |
Definition at line 20 of file IdenticalValueTokenSpec.php.
| it_scores_false_if_integer_value_is_not_identical_to_boolean_argument | ( | ) |
Definition at line 70 of file IdenticalValueTokenSpec.php.
| it_scores_false_if_object_value_is_not_the_same_instance_than_argument | ( | ) |
Definition at line 64 of file IdenticalValueTokenSpec.php.
| it_scores_false_if_value_is_not_identical_to_argument | ( | ) |
Definition at line 58 of file IdenticalValueTokenSpec.php.
| let | ( | ) |
Definition at line 10 of file IdenticalValueTokenSpec.php.


MBToolbox Reference
The Mockingbird Toolbox includes the following tools, which are compatible with all four Apple platforms—iOS, macOS, tvOS and watchOS—except where noted otherwise:
Battery & Power Monitoring
The MBBatteryMonitor
class (iOS only) reports the device’s power status and battery level, and also posts events through the NSNotificationCenter
when these values change.
Network Monitoring
The MBNetworkMonitor
class (iOS, macOS, tvOS) provides details about the current status of the network, including:
- Whether the device currently has network connectivity
- Whether the device is currently connected via wifi
On iOS, the class also provides carrier information, such as:
- Whether the device has an associated cellular carrier account
- Whether the device is currently connected through a cellular carrier
- The type of the current cellular connection, if any (eg. GPRS, Edge, HSDPA, LTE, etc.)
The MBNetworkMonitor
can also be configured to post NSNotificationCenter
events as network status changes occur.
Caching
Mockingbird Toolbox provides a simple but extensible caching architecture.
The base of this architecture is provided by MBThreadsafeCache
, which implements a basic memory cache that can be safely shared across threads.
The MBThreadsafeCache
does not implement an expiration policy. Instead, cache instances can be configured to purge themselves in response to memory warnings.
The MBFilesystemCache
is a subclass of MBThreadsafeCache
that adds a filesystem backing store to the memory cache.
The storage behavior of an MBFilesystemCache
instance can be customized through the use of an MBFilesystemCacheDelegate
. Delegates can be used to override serialization and deserialization of cache objects, and for controlling whether or not a given object is stored in the memory or filesystem component of the cache.
The MBFilesystemCache
implements an age-based expiration mechanism, but the class also provides ample hooks for subclasses to supply alternate implementations.
Concurrency & Threading
The MBConcurrentReadWriteCoordinator
class uses Grand Central Dispatch to provide an efficient mechanism for enforcing orderly read/write access to a shared resource. The coordinator ensures that concurrent access to the shared resource follows consistent rules.
The MBThreadLocalStorage
class provides an interface for safely sharing thread-local storage among unrelated units of code.
To prevent key clashes between different code using thread-local storage, values are accessed by specifying the requesting Class
. Classes can store multiple values by providing an additional key string for each value.
The MBThreadLocalStorage
class also provides methods that allow treating thread-local storage as a lock-free cache. Objects that are expensive to create, such as NSDateFormatter
instances, can be cached in thread-local storage without incurring the locking overhead required by a shared object cache like MBThreadsafeCache
.
Regular Expressions
To simplify working with regular expressions on iOS, macOS, tvOS and watchOS, the Mockingbird Toolbox provides an NSString
class extension and an NSMutableString
class extension to help create, manipulate, and execute regular expressions.
These extensions make use of the MBRegexCache
singleton for caching regular expressions, which can be expensive to create.
Message Digests
The MBMessageDigest
class provides a high-level API for generating MD5 and SHA-1 secure one-way hashes (also known as message digests). Message digests can be created from strings, NSData
instances, byte arrays, and files.
Class extensions for NSString
and NSData
are also provided to simplify creating message digests from existing objects.
Network Activity Indicator
The network activity indicator appearing in an iOS device’s status bar is a shared resource the use of which needs to be coordinated if you have, say, multiple network operations running simultaneously on several threads.
The Toolbox provides the MBNetworkIndicator
class class (iOS only) to coordinate use of the status bar’s network activity indicator.
Colors
The Toolbox contains a UIColor
class extension for iOS and tvOS that:
- Determines whether a color is opaque
- Determines whether a color is light or dark (depending on its brightness value)
- Can create an appropriate highlight color for a given color
- Can create a new color by adjusting an existing color’s brightness
The MBColorTools.h
header file defines a set of macro functions for creating UIColor
and CGColorRef
instances from individual 8-bit RGB and RGBA components, as well as from RGB and RGBA hexadecimal values.
Images
The Toolbox contains a UIImage
class extension compatible with iOS and tvOS that adds methods for scaling images, as well as a UIView
class extension for capturing the contents of a view as a UIImage
, CIImage
or CGImageRef
.
Bitmaps
The MBBitmapPixelPlane
class represents a plane of pixels that can be accessed individually, regardless of the underlying pixel format. This allows direct extraction and manipulation of pixel data within a bitmap.
Empty MBBitmapPixelPlane
instances can be created directly and populated manually. Instances can also be created using a source UIImage
, CGImage
or a bitmap-based CGContextRef
.
You can use MBBitmapPixelPlane
on iOS, macOS and tvOS.
Runtime Services
Certain services available at runtime are expensive to leave enabled for the duration of an application’s lifetime.
For example, just having the UIDevice
’s batteryMonitoringEnabled
property always set to YES
can cause additional battery drain, because an app that would otherwise remain suspended in the background will instead be periodically activated to process UIDeviceBatteryLevelDidChangeNotification
and UIDeviceBatteryStateDidChangeNotification
event notifications.
The best practice for such services is to leave them disabled until they’re needed, and then to disable them immediately once they’re needed no longer.
If multiple units of code need access to these services, some mechanism is needed to coordinate when these services should be enabled and disabled.
The MBServiceManager
class is designed for such cases.
Classes that provide interfaces for shared services adopt the MBService
protocol, and clients that need access to that service coordinate by attaching to and detaching from that service through the MBServiceManager
.
The MBBatteryMonitor
and MBNetworkMonitor
classes are implemented as services in order to minimize their impact on the user’s device.
Rounded Rectangles
The MBRoundedRectTools
class provides a set of tools for handling rounded rectangles, including methods to help size corner radii based on rectangle size, and methods for creating CGPathRef
s that can be used to draw rounded rectangles.
String Formatting
Mockingbird Toolbox provides an NSString
class extension with methods to indent the individual lines within a string using a single tab, multiple tabs, or an arbitrary prefix string.
The static inline C function MBForceString()
takes an id
as a parameter and is guaranteed to return a non-nil
NSString
.
The static inline C function MBTrimString()
takes an id
as a parameter and is guaranteed to return a non-nil
NSString
with no leading or trailing whitespace or newline characters.
The MBFieldListFormatter
class can be used to create lists of fields that are displayed in an easy-to-read format when rendered in a monospaced font.
String Measurement
For iOS and tvOS, there’s also a UIFont
class extension that provides a simple API for performing common text measurement tasks.
…and more
There’s even more to Mockingbird Toolbox, but we want to leave you with at least a few treats to find on your own!
Discover more in the API documentation below, and also in the freely-available Mockingbird Toolbox source code.
Class References
- MBBatteryMonitor
- MBBatteryState
- MBBitmapPixelPlane
- MBCacheReadQueue
- MBCacheWriteOperation
- MBCacheWriteQueue
- MBConcurrentReadWriteCoordinator
- MBEvents
- MBFieldListFormatter
- MBFileDeleteOperation
- MBFileReadOperation
- MBFileWriteOperation
- MBFilesystemCache
- MBFilesystemOperationQueue
- MBFormattedDescriptionObject
- MBMessageDigest
- MBModuleBase
- MBModuleLog
- MBNetworkIndicator
- MBNetworkMonitor
- MBOperationQueue
- MBRegexCache
- MBRoundedRectTools
- MBServiceManager
- MBThreadLocalStorage
- MBThreadsafeCache
Protocol References
- MBFileReadOperationDelegate
- MBFilesystemCacheDelegate
- MBFormattedDescription
- MBInstanceVendor
- MBModule
- MBModuleLogRecorder
- MBService
- MBSingleton
Constant References
Category References
- MBFilesystemCache(ForSubclassEyesOnly)
- MBThreadsafeCache(ForSubclassEyesOnly)
- NSData(MBMessageDigest)
- NSData(MBStringConversion)
- NSError(MBToolbox)
- NSMutableString(MBRegex)
- NSString(MBIndentation)
- NSString(MBMessageDigest)
- NSString(MBRegex)
- UIColor(MBToolbox)
- UIFont(MBStringSizing)
- UIImage(MBImageScaling)
- UIView(MBSnapshotImage)


Description
Matches every build. Unconditionally.
Use cases
Allow to perform action for every build from the history.
Warning!
Use this action wisely because recovering deleted build might be impossible.


Password Visibility - Multiple Fields Enter your current password and new password below. Current Password New Password Show passwords Log In


Event Location:
CTU Colorado Springs
4435 North Chestnut Street
Colorado Springs, Colorado
Abstract:
As the most prolific inventor in American history, Thomas Edison was a master of “Best Practices!” Edison’s creations were not just novel and commercially successful, but many launched entire new industries including electric light and power, sound recording, motion pictures and industrial cement and concrete manufacture. At the heart of Edison’s remarkable record of innovation was his categorization of the innovation process into “competencies,” or bundles of skills supporting the achievement of success in a particular area of endeavor. In this session, we will look at ways that we can use many of these broad success secrets to bring powerful tools and strategies to the recurring implementation of business intelligence.
Speaker(s): William E Pearson III,
Abstract:
Microsoft has changed its Business Intelligence strategy in the last few years from an IT centric approach with SQL Server Reporting Services and SQL Server Analysis Services to an end-user ad-hoc approach with Power BI. Initially the Power BI tools were all separate add-ons to Excel 2010+ that you had to know where to get them and install/activate them individually. Now with new Power BI product announcements and Power BI Desktop, the full vision of these once separate tools is becoming more clear and cohesive as an end-user ad-hoc analysis and reporting tool. In this demo heavy session you will see how Power BI is now a much more complete solution and how it can change how you deliver analysis and reporting to anyone in your company. Demos will include using Power BI Desktop to pull in data from multiple sources and repeatable transformations to clean usable data and build interactive reports and dashboards.
Speaker(s): Steve Wake,
Abstract:
Dimensional modeling is arguably one of the most important fundamentals of business intelligence. It is still relevant even as new technologies like PowerPivot and SSAS Tabular Models are becoming more popular. Correctly modeling your organization's data not only protects the most important asset your company has but ensures that your data mart or data warehouse will be responsive and capable of accommodating emerging requirements. This session provides a deeper dive into the art of dimensional modeling. We will look at the different types of fact tables and dimension tables, how and when to use them. We will also some approaches to creating rich hierarchies that make reporting a snap. Finally we will cover physical design choices.This case study and demo based session promises to be very interactive and engaging, bring your toughest Dimensional Modeling quandaries.
Speaker(s): Jason Horner,
Abstract:
Foreign Keys are the ultimate Catch-22; you need them for data integrity, but they just kill insert, update, and delete performance. In this session we will describe the concept of Foreign Keys and how they maintain data integrity. You will learn their syntax for creating, deleting, disabling, and re-enabling. You will also learn the possible effects of disabling and re-enabling Foreign Keys for data modification. We will also examine the two most important Foreign Key attributes: is_not_trusted and is_disabled and their effect on query performance. All of these characteristics will be demo'ed with many script examples. After attending this session you will 1. Comprehend the pro and cons of Foreign Keys in a real world production environment 2. Understand the consequences of disabling and re-enabling Foreign Keys for data modification 3. Be able to better assess best approach for Foreign Key maintenance
Speaker(s): Mike Byrd,
Abstract:
Are you concerned about moving to cloud, because of the safety of your data ? Organizations choose to go with the platform services of Azure using SQL Databases or they go with the Infrastructure services of Azure using virtual machines, in both cases security of your data is vital. This demo driven session will give you all the information you need to know about the security implementations available in SQL Databases in Azure and SQL Server. The session will cover the following topics with demos. Introduction to cloud adaptation of the organizations, - how enterprises adopt to the cloud and how startups are moving to the cloud. SQL relational store options in Azure. Security features of SQL Databases Cloud demanded security features of SQL Servers Using Azure Key Vault to secure data in SQL Server
Speaker(s): Vijayakumar Thurupathan,
Abstract:
One of the most exciting new features of SQL Server 2016 is the integration of the R statistical programming language into the platform with the brand-new SQL Server R Services. In this introductory session we'll briefly introduce the R language and then look at how to install and administer SQL Server R Services. We'll start to demonstrate the power of R by showing you how to create and run simple R scripts from within T-SQL. We'll then discuss some of the powerful open source packages that are available to aid your data analyses. Finally, we'll go through some examples of how to use R to integrate data analytical methods in real-world situations, and wow your customers with the power of statistics!
Speaker(s): Chris Hyde,
Abstract:
Do your organization's reports consist mostly of giant tables of data? Perhaps you have gotten as far as adding KPI indicators or conditional highlighting to the tables. Although tables of data presented as reports are commonly found in many organizations, they may be doing you and your users a disservice. You should optimize your data viz just as you optimize your databases. Reports are a user interface that must be purposefully designed to help users achieve their goal of making informed decisions. In this session, we'll review requirements gathering and data viz best practices and apply those concepts to the use of Microsoft reporting tools such as Excel, Power View, and Reporting Services. You'll leave with guidance on how to take boring, unreadable tables of data and turn them into useful and visually appealing reports.
Speaker(s): Meagan Longoria,
Abstract:
Data Science is an ever increasing topic in the Data Analytics space and the R language is at the center of most conversations. R is an open source statistical language that is rapidly gaining popularity due to a robust set of machine learning functionality and a never-ending set of R packages that are used to increase functionality of the core R language. The R language is run as a desktop application and was not built with performance and scale required to accommodate Big Data. Revolution Analytics, a wholly owned subsidiary of Microsoft, has solved the performance and scaling issues of a desktop application by creating a more robust enterprise architecture. SQL Server 2016 brings the power of R and Revolution Analytics into the industry leading relational database. This session will demo the functionality and power of using R within SQL Server.
Speaker(s): Reeves Smith,
Abstract:
Pop quiz DBA: Your developers are running rampant in production. Logic, reason, and threats have all failed. You're on the edge. What do you do?  Hint: You attend Revenge: The SQL! This session will show you how to "correct" all those bad practices. Everyone logging in as sa? Running huge cursors? Using SELECT * and ad-hoc SQL? Stop them dead, without actually killing them. Ever dropped a table, or database, or WHERE clause? You can prevent that! And if you’re tired of folks ignoring your naming conventions, make them behave with Unicode…and take your revenge! Revenge: The SQL! is fun and educational and may even have some practical use, but you’ll want to attend simply to indulge your Dark Side. Revenge: The SQL! assumes no liability and is not available in all 50 states. Do not taunt Revenge: The SQL! or Happy Fun Ball.
Speaker(s): Rob Volk,
Abstract:
The time has come -- you’ve lived with your legacy Customer Relationship Management/Enterprise Resource Planning systems since you joined the company, but they’re not cutting it anymore. A decision is made to move to a new vendor, a new platform, a new CRM/ERP software package, and you’ve been tapped to be part of the project team. Your job will be to make sure that the data collected in the old systems is successfully and accurately ported to the new systems. Really? What do you have to look forward to? What’s it going to be like? How are you going to do this? Will you port all of the data from the legacy system to the new one, or just some? How will that work? Join Michelle Poolet as she walks you through lessons learned from the many platform migrations that she’s been part of. As a data architect, Michelle has special insight into these massively complex projects, which she’d like to share with you.
Speaker(s): Michelle Poolet,
Abstract:
The practice of Data Science has arrived and as data professionals we're on the forefront of this change. The data we collect can now be used in new and exciting ways, providing more value than ever before. To get started in this field, a number of tools and methodologies must be employed to help you achieve predictive analytics success with your data. In this session the predictive analytics process will be covered from start to finish, providing a practical understanding of what it takes to develop your own predictive models. The session includes an overview of definitions, concepts and terminology, successful applications of predictive analytics, and how predictive analytics fits into a BI environment.
Speaker(s): Carlos Bossy,
Abstract:
Let’s face it. You can effectively do many IT jobs related to SQL Server without knowing the internals of how SQL Server works. Many great developers, DBAs, and designers get their day-to-day work completed on time and with reasonable quality while never really knowing what’s happening behind the scenes. But if you want to take your skills to the next level, it’s critical to know SQL Server’s internal processes and architecture. This session will answer questions like: - What are the various areas of memory inside of SQL Server? - How are queries handled behind the scenes? - What does SQL Server do with procedural code, like functions, procedures, and triggers? - What happens during checkpoints? Lazywrites? - How are IOs handled with regards to transaction logs and database? - What happens when transaction logs and databases grow or shrinks? This fast paced session will take you through many aspects of the internal operations of SQL Server and, for those topics we don’t
Speaker(s): Kevin Kline,
Abstract:
Have you built a SQL Server Availability Group only to be suddenly surprised by all the gotchas and hurdles that pop up? Are you struggling with keeping your Availability Group running smoothly without a lot of management on your part? This session will cover what happens after you have created an Availability Group and how to manage it. We will review tips, tricks, and patterns for handling all the considerations that running this popular high availability solution. After this session, you will be prepared for managing your Availability Groups and how you can streamline that management to make your availability strategy more robust.
Speaker(s): Michael Fal,
Abstract:
Learning how to detect, diagnose and resolve performance problems in SQL Server is tough. Often, years are spent learning how to use the tools and techniques that help you detect when a problem is occurring, diagnose the root-cause of the problem, and then resolve the problem. In this session, attendees will see demonstrations of the tools and techniques which make difficult troubleshooting scenarios much faster and easier, including: • XEvents, Profiler/Traces, and PerfMon • Using Dynamic Management Views (DMVs) • Advanced Diagnostics Using Wait Stats • Reading SQL Server execution plan Every DBA needs to know how to keep their SQL Server in tip-top condition, and you’ll need skills the covered in this session to do it.
Speaker(s): Kevin Kline,
Abstract:
Don’t you LOVE it when changes are made to your databases without notice!? Those AWESOME “Object doesn't exist” messages, sudden performance problems, failed audits and other unexpected errors can be soooo much fun! Time to put an end to these unreported changes and get real-time notice as they occur, via emails, reports, or even Source Control. Learn to use Event Notifications, a native SQL Server feature, along with some production-ready code. to become the Overlord your users need.
Speaker(s): Michael Bourgon,
Abstract:
The Internet of Things (IoT) is a hot topic, but what is it, how do we use it, and how do we analyze it? This presentation is an overview of IoT that explores IoT industry trends and introduces you to the IoT Azure toolset specifically HBase, Storm and Spark.
Speaker(s): Jeff Renz,
Abstract:
Is your brain mush from too much technical content, but you just need a break before the next session or the raffle? Come share your IT war stories with the group and laugh for an hour. This open panel session is guaranteed to at least get a chuckle as we all relax and share our experiences.
Speaker(s): David Klee,
Abstract:
Your databases may not be terabyte-sized yet, but they're probably growing every day. We'll look at lessons learned from working with multi-terabyte, very large databases (VLDBs) in the real world. Topics include storage layout decisions, unique tuning challenges, HA/DR implications, and database restores, along with shoehorning backups, re- indexing and DBCC checks into itty-bitty maintenance windows. As a bonus, many of the techniques also apply to smaller databases and consolidated servers that run hundreds of databases.
Speaker(s): Eric Peterson,
Abstract:
Mention SQL Server performance to any DBA, and the impulse is to dive headfirst into the database and queries. However, if the infrastructure underneath the data is your performance bottleneck, the time spent tuning at the database layer is usually in vain. Server hardware, operating system parameters, storage, interconnects, and networking will all be discussed in depth in terms that DBAs can relate to. Practical architecture guidelines and troubleshooting techniques will be presented so you can analyze your environments and see if your performance bottlenecks are where you think they are.
Speaker(s): David Klee,
Abstract:
In this session, you'll learn how to quickly build an Access Web App, tour the online development environment and see a real, live working app in action. We'll discuss app distribution and deploying updates and demonstrate add-in features like Power BI Tiles and Bing Maps. And lastly, you'll learn the pros/cons of Access Web Apps and hybrid solutions in a corporate environment as well as how to extend the data to mobile phones tablets. Presented by Andy Tabisz, Microsoft MVP, WorkSmart Database Masters.
Speaker(s): Andy Tabisz,
Abstract:
Tips and Tricks and Painful lessons learned as I have ventured into the world of Hadoop, JSon and Hive. Our data has made the move from a relational database to a JSon structure, and reporting across the entire enterprise of data has changed. We have introduced Hadoop batch processing to our ETL processes to collect and process data from various locations, depositing them in various other locations. Along the way, various brick walls were surmounted. We will discuss some of these brick walls. Some of the oddities encountered in this journey. and hopefully prepare you for a similar trip, without all the pain we suffered.
Speaker(s): TJay Belt,
Abstract:
You've heard of IQ (and you're is probably high) and EQ (Emotional Quotient), but have you heard of DQ ( Data Quotient). Your DQ is your skill or ability to "smell" good data, excellent data patterns, and great queries. In this session we'll look at several examples of good, bad, and ugly data and you'll grade your DQ. Fun, educational, and potentially full of brag-rights.
Speaker(s): Paul Nielsen,
Abstract:
Are you looking to understand what IaaS or PaaS really mean? Perhaps you are not sure of virtual, high available relational or NoSQL databases. Get started with the basics of managed services and platforms for running databases on AWS. Hear how to use managed relational databases such as MS SQL Server with minimal administration. Also discover other cloud options such as managed NoSQL or scaling your own instances with resizable elastic compute cloud. Take home an introduction from in-memory cache to petabyte-scale data warehouse databases in the Amazon cloud.
 What do you need to know? This session will cover this topic from first-hand experience.
Speaker(s): Amy Herold,
Abstract:
Analysis Services Tabular is an in memory analytics engine introduced in SQL Server 2012. It has shown to be a quick and effective way to transform your organization with modern analytics. Join Phillip and learn how easy it is to create a tabular solution and provide valuable insight into your organization's data. This is a demo heavy session and you should be able walk away knowing how to create your own tabular model.
Speaker(s): Phillip Labry,
Abstract:
Like Frankenstein's Monster (or our teenagers) things get released into the wild and behave differently than planned - database usage patterns are no different. Join Tim as he reviews what to look for when tweaking your index strategy: poor clustering key decisions, underutilized indexes, covering indexes gone wrong, overlooked heaps and fill factor failures are just a few of the blunders to be identified. A working knowledge of Dynamic Management Objects, indexing internals, and eagerness to experiment with metadata is a prerequisite!
Speaker(s): Tim Ford,
Abstract:
Survivability of data should be the #1 priority for any database administrator. Corruption can happen to any database at any time. How soon corruption is detected and a quick response is key to minimize lost data and recovery in a timely manner. Have a plan ready when it happens, as this is one time you don’t want to “learn on the job”. In addition to daily and monthly maintenance that should be performed, other topics discussed will include e-mail notification when data becomes corrupt and Service Level Agreements.
Speaker(s): Andre DuBois,
Abstract:
Inherited an older than dirt SQL box? Can't upgrade? Not everyone can have shiny new Enterprise Edition servers, so what high availability or disaster recovery options are available for us mere mortals? In this course I'll go over the HA/DR options that are available for the different versions of SQL, and I'll even give you a real-world example of using a 'listener' before there were Availability Groups!
 Then this may be for you! Table Partitioning 101 will make an introduction to table partitioning through the GUI and a code based approach. The session will be a discussion about how to make it work and will include: creating partitioned tables, partition schemes, left vs. right facing partition functions and how to do a basic switch operation. A small deep dive about how to find out which partition your data is in and what exactly does it mean for an index to be “aligned” will also be discussed.
Speaker(s): Robert Smith,
This is a list of speakers from the XML Guidebook records. The details and URLs were valid at the time of the event.
LinkedIn: http://www.linkedin.com/in/jasonhorner
Contact: http://blog.jasonhorner.com
Hi, my name is Jason I'm a practice lead at Redapt. I spend most of my day helping clients solve business problems mostly in the Data and Advanced Analytics spaces. Sometimes this involves various and sundry cloud technologies including Azure Data Factory, Azure SQL Data Warehouse, Azure Data Lake Store, Azure Databricks, HDInsight and Azure SQL Database. I'm fluent in several languages including: SQL, C#, Python, and PowerShell. I'm a Microsoft Certified Master of SQL Server (MCM) and have been recognized for my technical excellence and evangelism efforts by Microsoft by being awarded the Most Valuable Professional (MVP) for the last 5+ years. In my off hours I like to snowboard, karaoke, ride roller coasters, and play arcade games
LinkedIn: https://www.linkedin.com/in/timothyford
Contact: http://thesqlagentman.com
Tim Ford is a Data Professional, Author and Community Leader whose technical passions lie in creative solutions for managing and presenting data. He#39;s been a healthcare DBA since 2000 and leads SQL Agent Man Consultancy and SQL Cruise. He takes 25 students and leaders in the SQL Community and places them on cruise ships for technical and professional development training without the distractions of the office and internet twice a year on SQL Cruises (www.sqlcruise.com). Currently Tim serves on the Board of Directors for PASS and is passionate about taking fellow Data Professionals to the next level in their careers. He enjoys telling stories with data.
LinkedIn: https://www.linkedin.com/in/paulnielsensql
Contact: http://www.tejontech.com/blog
Paul is the founder of Tejon Technologies, inc, a software company offering a configurable, object/relational graph database solution built on the enterprise power of Microsoft SQL Server. Previously, Paul wrote the SQL Server Bible series, edited the MVP Deep Dives Vol 1 book, presented seminars in database design, and developed SQL Server courseware for Microsoft Learning. He was a Data Platform MVP from 2004 - 2016. IN the Startup Community he serves on the board of Peak Startup and is the chair of the annual Colorado Springs Startup Week.
LinkedIn: http://www.linkedin.com/in/b5lurker
Contact: http://blog.wakebi.com
Steve Wake is currently the Principal BI Developer at Brown and Caldwell and has experience in consulting, advertising, media, manufacturing, retail, charities, telecommunications and financial services organizations using the full on-premises Microsoft BI stack. Recent experience with the Azure services: Analysis Services, Logic Apps, Data Factory, Databricks, Snowflake and Power BI. Steve is also very involved in the SQL community, speaking at events around the world.
LinkedIn: https://www.linkedin.com/pub/alaina-donofrio/9/581/418
Started my career as a Lead Technical Trainer, and eventually followed my love of administration to SQL Server. I#39;ve had the pleasure of working on SQL Server 2000 through 2014, and taken many certification tests so I have a lot of letters: MCDBA, MCTS, MCITP. My main focuses are on HA/DR, administration and security.
LinkedIn: https://www.linkedin.com/e/fpf/252170891
Contact: https://mvp.support.microsoft.com/profile=02C5CD07-7511-4151-A678-3A4A3451F85E
Bill Pearson created Island Technologies Inc. in 1997, and has developed a large and diverse customer base since. Bill#39;s background as a CPA, Internal Auditor, Management Accountant, and SQL Server MVP (BI) enables him to provide value to clients as a liaison between Accounting / Finance and Information Services. Bill has implemented enterprise business intelligence systems over the years for many Fortune 500 companies and focuses his practice upon the integrated Microsoft Business Intelligence
LinkedIn: http://www.linkedin.com/in/kekline/
Contact: http://blogs.sentryone.com/author/kevinkline
Kevin Kline is a database and industry expert serving as Principal Program Manager at SentryOne, the industry leading SQL Server database tools vendor. A Microsoft SQL Server MVP since 2003, he is a founder and former president of PASS. Kevin is an author of many books, blogger, columnist, and popular international speaker. Kevin’s best known book is the best-selling SQL in a Nutshell and contributes monthly to Database Trends Applications magazine. He tweets at @kekline and blogs at http://Blogs.SQLSentry.com/Author/KevinKline.
LinkedIn: http://www.linkedin.com/pub/mike-byrd/1/aa0/bbb
Contact: http://logicalread.solarwinds.com/?s=byrd, www.TSQLMentoring.com and SQLServerCentral.com
Former rocket scientist and USAF Fighter Pilot -- now a SQL Server geek (24 years)! Past opportunities include free-lance technical writer for PC Magazine, Senior Software Manager for government sponsored munitions effectiveness committee, and insurance company CTO. Currently senior database engineer consultant for several Austin companies. Presenter at many SQL Saturdays over last 6 years in United States, Europe, and Australia. Specialize in SQL Server performance tuning; database (OLTP OLAP) architecture; trouble-shooting; teaching TSQL (Basic through Advanced). Video presentations (for local SQL Server user groups or SQL Saturdays) can be found at http://usergroup.tv/videos/category/speaker/mike-byrd
LinkedIn: https://www.linkedin.com/pub/christopher-wolff/11/a07/458
Contact: http://sqlred.blogspot.com/
Chris Wolff has been a developer, report writer, and an admin in Microsoft and SQL Server Space since SQL Server 2000 in industries such as telecommunications, green energy, money transfers, and online accounting. He has been an active member of the Denver SQL User Group since 2011 and enjoys learning new things about computers. His interests includes video games, movies, and enjoying time with his wife and 2 kids.
LinkedIn: http://www.linkedin.com/in/aherold
Contact: http://www.sqlkitten.com/
Amy Herold is currently a Premier Field Engineer with Microsoft, specializing in APS. Prior to this, she was a Sr. Database Administrator, focusing on PowerShell and automation. She is also currently the Director of Programs for the North Texas SQL Server User Group (NTSSUG). She frequently speaks at SQL Saturday and user group events across the United States and has also participated in numerous Women in Technology sessions as a panelist. Amy currently blogs at sqlkitten.com.
Contact: http://phillip.labry.com
Phillip Labry is a Senior BI Consultant and Trainer with over 20 years experience in SQL Server and over 30 in IT. He has been lucky enough to work on data projects spanning telecom, banking, retail, law enforcement, health care, insurance, financial services and energy sectors. As a national consultant he provides training and builds solutions utilizing the full MS BI stack. He is an active member of the Madison, WI PASS chapter and speaks at events in the USA and Canada.
Placeholder for sponsor sessions.
LinkedIn: http://www.linkedin.com/in/davidaklee
Contact: http://davidklee.net
David Klee is a Microsoft Data Platform MVP and VMware vExpert with a lifelong passion for technology. David spends his days focusing on the convergence of data and infrastructure as the Founder of Heraflux Technologies. His areas of expertise include cloud, virtualization, performance, and business continuity. David speaks at a number of national and regional technology related events, including PASS Summit, VMware VMworld, SQLBits, SQL Saturday events, and many SQL Server User Groups.
LinkedIn: http://www.linkedin.com/in/tjaybelt/
Contact: http://tjaybelt.blogspot.com
TJay Belt is an outdoorsman at heart who enjoys riding dirtbikes, waterskiing, boating, playing racquetball and spending time with his family. When he can't be out playing, TJay loves to tinker with databases. TJay has been an IT professional for over a decade and a half. Currently serving as a Senior Database Administrator with Imagine Learning. TJay has progressed through several roles in his database career including developer, data guy, database developer, database analyst and DBA.
LinkedIn: http://www.linkedin.com/in/meaganlongoria/
Contact: http://datasavvy.me
Meagan Longoria is a business intelligence consultant with Denny Cherry Associates, and lives in Denver, Colorado. She is a Microsoft Data Platform MVP. Meagan spends a lot of time thinking about how to use data integration, DAX, and data visualization techniques to make data useful for people. She enjoys sharing her knowledge and experiences at conferences and user group meetings, as well as through her blog (DataSavvy.me).
Placeholder for sponsor sessions.
Contact: http://MtnDBA.wordpress.com
Andre has been in the IT industry for over 25 years in various positions with the majority working as database administrator, designer and programmer. His experience has been in the financial, travel and education industries.
LinkedIn: https://www.linkedin.com/in/gabevilla
Contact: https://extofer.wordpress.com/
Gabriel is a skilled leader, architect, and technical expert focusing primarily on Microsoft technologies and is passionate about open-source technologies for integration, automation, and development. Gabriel’s versatility extends from systems, data and development and leverages hybrid/SaaS/Cloud integration, proven software engineering platforms, and best-of-breed data management and business intelligence solutions. Originally from El Paso, Texas, Gabriel lives in Colorado Springs with his wife and kids, where he is an Architect for RevGen Partners, volunteers in the tech community and enjoys the Colorado outdoors.
LinkedIn: http://www.linkedin.com/in/reevessmithiii/
Contact: http://reevessmith.wordpress.com
Reeves Smith, owner and principal architect of Macer Consulting, is passionate about applying data technologies that empower organizations. Reeves wields his knowledge and experience to lead, design, architect, and teach, working with both data center and business project teams. He approaches every project by first understanding the organization’s business challenges, and then developing a unique approach that targets those business needs accurately and effectively. Reeves Smith has more than 20 years of experience working on the SQL Server stack. He is a Microsoft Data Platform MVP and Microsoft Certified Master, and regularly delivers technical presentations at international, regional, and local conferences and user groups.
LinkedIn: http://www.linkedin.com/in/andytabisz
Contact: http://www.worksmartdb.com/blog/
Andy Tabisz is a Microsoft MVP and owner of WorkSmart Database Masters based in Grand Rapids, MI. WorkSmart provides custom database and mobile solutions for small to mid-sized corporations using Access, SQL/Azure, ASP.NET, SharePoint, Power BI, Excel and integration with many technologies. Through rapid application development, WorkSmart empowers organizations to work smarter and make better decisions by automating workflow, alerts and reporting capabilities.
LinkedIn: http://www.linkedin.com/in/davidaklee
Contact: http://davidklee.net
David Klee is a Microsoft Data Platform MVP and VMware vExpert with a lifelong passion for technology. David spends his days focusing on the convergence of data and infrastructure as the Founder of Heraflux Technologies. His areas of expertise include cloud, virtualization, performance, and business continuity. David speaks at a number of national and regional technology related events, including PASS Summit, VMware VMworld, SQLBits, SQL Saturday events, and many SQL Server User Groups.
LinkedIn: http://www.linkedin.com/in/michaelbourgon
Contact: http://thebakingdba.blogspot.com
Michael Bourgon started his IT career by performing tech support and managing Sybase databases on Unix starting in 1995, before moving to SQL Server 7... continuing all the way to SQL Server 2017. His focus on automation has led him to such diverse topics as Service Broker, WMI, Table Partitioning, Shell scripting, In-Memory Tables, and Powershell. He's currently a senior DBA with a large healthcare company, dealing with millions of transactions of day and managing hundreds of servers. In his spare time he rides a bicycle, reads science fiction, blogs about SQL Server and Baking, and tries to raise his daughter to be a geek, too.
LinkedIn: http://www.linkedin.com/in/kekline/
Contact: http://blogs.sentryone.com/author/kevinkline
Kevin Kline is a database and industry expert serving as Principal Program Manager at SentryOne, the industry leading SQL Server database tools vendor. A Microsoft SQL Server MVP since 2003, he is a founder and former president of PASS. Kevin is an author of many books, blogger, columnist, and popular international speaker. Kevin’s best known book is the best-selling SQL in a Nutshell and contributes monthly to Database Trends Applications magazine. He tweets at @kekline and blogs at http://Blogs.SQLSentry.com/Author/KevinKline.
LinkedIn: https://www.linkedin.com/in/chris-hyde-3803706
Chris Hyde is a Microsoft Data Platform MVP and Microsoft Certified Trainer based in Albuquerque, New Mexico. He works as an independent SQL Server BI and DBA consultant, and is the leader of the Albuquerque PASS local user group. He is also part of the Friends of Redgate program and was a member of the Idera ACE class of 2018. He loves loud music and cricket, but usually not at the same time.
LinkedIn: http://lk.linkedin.com/in/thuru/
Contact: http://www.thuru.net
Thuru is a versatile technical person who has diversified experience in many areas of Information Technology for 6 years. Cloud computing, security, software development, business intelligence and databases are his most preferred technology areas. He is a frequent speaker in Sri Lanka .NET forum and Sri Lanka SQL Server Universe user groups. Thuru is the founder of Colombo Cloud Meet Up where he often talks about various cloud computing topics. Also he is a Microsoft MVP for Microsoft Azure.
Eric Peterson is a consultant specializing in database architecture with experience in demanding Fortune 100 company environments. He has a Computer Science degree complemented with an MBA, which meshes well with his jobs integrating business information with the systems that process it. He has worked with SQL Server since its inception and was an instructor of SQL courses at a national technical training company. He also speaks are regional SQLSaturday events.
LinkedIn: https://www.linkedin.com/in/michaelfal/
Contact: http://mikefal.net
Mike is a specialist in data management technologies. As a community advocate, public speaker, and blogger, Mike is a practicing thought leader for data and automation. He is passionate about DevOps and data, building platforms to optimize, protect, and use data efficiently. Since 1999, Mike has been working in the database field, focusing primarily on SQL Server and specializes in automating data solutions to improve the reliability and efficiency of his environments. He has been caught playing trombone in public on more than one occasion.
LinkedIn: http://www.linkedin.com/in/davidaklee
Contact: http://davidklee.net
David Klee is a Microsoft Data Platform MVP and VMware vExpert with a lifelong passion for technology. David spends his days focusing on the convergence of data and infrastructure as the Founder of Heraflux Technologies. His areas of expertise include cloud, virtualization, performance, and business continuity. David speaks at a number of national and regional technology related events, including PASS Summit, VMware VMworld, SQLBits, SQL Saturday events, and many SQL Server User Groups.
Placeholder for sponsor sessions.
LinkedIn: http://www.linkedin.com/pub/jeff-renz/29/82a/aa4
Contact: http://www.revgen.com
Jeff Renz is a Senior Architect at RevGen Partners, currently working as the design architect and implementation lead on several projects for a Fortune Top 50 company. Jeff has worked with SQL Server and BI for 15+ years and has 10 years’ experience with data warehouse design and implementation. In addition to consulting, he is joining the University of Denver adjunct faculty and is expected to begin teaching in the ICT program starting in June. He received his bachelor’s degree in Computer Science, his master’s degree in Operations Research from Colorado School of Mines, and will be graduating from the Harvard Business Analytics Program in December.
Peter Selin is the Global Architect for X-IO Storage with over 14 years with X-IO, and 28 years in the industry. With experience beginning with mini-super computers and super-computing through Prime Computer and Silicon Graphics, Peter has a diverse background in the high tech industry giving him a unique vision into customers application of the technologies they acquire and how they implement them.
LinkedIn: https://www.linkedin.com/pub/robert-smith/30/b26/74a
I#39;m a happy, go-lucky type of guy who#39;s addicted to learning why and how things work, perpetually seeking answers to life#39;s questions and searching for meaning in the journey.
LinkedIn: https://www.linkedin.com/in/michellepoolet
Contact: http://mountvernondatasystems.com/blog.html
Michelle Poolet, MCIS and Zachman Certified Enterprise Architect(tm), has been working with Microsoft SQL Server(tm) since version 6.0. She has authored many articles for SQLMag(tm). She created and delivered classes in Database Design, Theory amp; Programming at University of Denver. A founder of Mount Vernon Data Systems, Michelle is currently focusing on SQL Server database administration, OLTP engine performance/tuning, database architecture, and data modeling.
LinkedIn: http://www.linkedin/in/carlosbossy
Contact: http://www.carlosbossy.com
Carlos Bossy (MCTS, MCP BI, CBIP) is a data and cloud analytics architect with 25 years of experience in software and database development. As a principal of Datalere, Carlos focuses on developing BI, Data Science, and Advanced Analytics solutions, including modeling data warehouses and delivering predictive models, integration, and visualization. He has developed warehouses and BI solutions for a variety of industries and state agencies, including health insurance, solar energy, foster care, telecom, and manufacturing.
LinkedIn: https://www.linkedin.com/in/rob-volk-134ba81
Contact: http://weblogs.sqlteam.com/robv/
Rob Volk is a SQL Server DBA in the Metro Atlanta area since 2001. He also moderates and answers the forums on SQLTeam.com. While an old-time cranky DBA, he no longer considers quot;business intelligencequot; an oxymoron or quot;the cloudquot; as merely atmospheric moisture, and is delightedly dipping his toes into both of these new oceans, and loves to do things in new and and unusual ways.
The following is a list of sponsors that helped fund the event.


| 18608 |
INTERNET |
<init> |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 18609 |
INTERNET |
<init> |
activity |
Unknown |
Unknown |
Unknown |
onItemClick |
| 18610 |
INTERNET |
<init> |
activity |
onResume |
Unknown |
Unknown |
Unknown |
| 18611 |
INTERNET |
openConnection |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 18612 |
INTERNET |
openConnection |
activity |
onResume |
Unknown |
Unknown |
Unknown |
| 18613 |
INTERNET |
openConnection |
activity |
Unknown |
Unknown |
Unknown |
onBackPressed |
| 18614 |
INTERNET |
openConnection |
activity |
onResume |
Unknown |
Unknown |
Unknown |
| 18615 |
INTERNET |
openConnection |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 18616 |
INTERNET |
openConnection |
activity |
onResume |
Unknown |
Unknown |
Unknown |
| 18617 |
INTERNET |
openConnection |
activity |
Unknown |
Unknown |
Unknown |
onBackPressed |
| 18618 |
ACCESS_WIFI_STATE |
getConnectionInfo |
activity |
onCreate |
Unknown |
android.intent.action.MAIN |
Unknown |
| 18619 |
ACCESS_WIFI_STATE |
getConnectionInfo |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 18620 |
READ_PHONE_STATE |
getDeviceId |
activity |
onCreate |
Unknown |
android.intent.action.MAIN |
Unknown |
| 18621 |
READ_PHONE_STATE |
getDeviceId |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 18622 |
INTERNET |
openConnection |
activity |
onCreate |
Unknown |
android.intent.action.MAIN |
Unknown |
| 18623 |
INTERNET |
openConnection |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 18624 |
INTERNET |
openConnection |
activity |
onCreate |
Unknown |
android.intent.action.MAIN |
Unknown |
| 18625 |
INTERNET |
openConnection |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 18626 |
ACCESS_NETWORK_STATE |
getActiveNetworkInfo |
activity |
Unknown |
Unknown |
Unknown |
onBackPressed |
| 18627 |
ACCESS_NETWORK_STATE |
getActiveNetworkInfo |
activity |
onResume |
Unknown |
Unknown |
Unknown |
| 18628 |
INTERNET |
<init> |
activity |
onCreate |
Unknown |
android.intent.action.MAIN |
Unknown |
| 18629 |
INTERNET |
openConnection |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 18630 |
INTERNET |
openConnection |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 18631 |
INTERNET |
openConnection |
activity |
onResume |
Unknown |
Unknown |
Unknown |
| 18632 |
INTERNET |
openConnection |
activity |
Unknown |
Unknown |
Unknown |
onBackPressed |
| 18633 |
INTERNET |
openConnection |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 18634 |
INTERNET |
openConnection |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 18635 |
INTERNET |
openConnection |
activity |
onResume |
Unknown |
Unknown |
Unknown |
| 18636 |
INTERNET |
openConnection |
activity |
Unknown |
Unknown |
Unknown |
onBackPressed |
| 18637 |
INTERNET |
openConnection |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 18638 |
INTERNET |
openConnection |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 18639 |
INTERNET |
openConnection |
activity |
onResume |
Unknown |
Unknown |
Unknown |
| 18640 |
INTERNET |
openConnection |
activity |
Unknown |
Unknown |
Unknown |
onBackPressed |
| 18641 |
ACCESS_WIFI_STATE |
getConnectionInfo |
activity |
onCreate |
Unknown |
android.intent.action.MAIN |
Unknown |
| 18642 |
ACCESS_WIFI_STATE |
getConnectionInfo |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 18643 |
READ_PHONE_STATE |
getDeviceId |
activity |
onCreate |
Unknown |
android.intent.action.MAIN |
Unknown |
| 18644 |
READ_PHONE_STATE |
getDeviceId |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 18645 |
INTERNET |
<init> |
activity |
onResume |
Unknown |
Unknown |
Unknown |
| 18646 |
INTERNET |
<init> |
activity |
Unknown |
Unknown |
Unknown |
onBackPressed |
| 18647 |
INTERNET |
openConnection |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 18648 |
INTERNET |
openConnection |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 18649 |
INTERNET |
openConnection |
activity |
onResume |
Unknown |
Unknown |
Unknown |
| 18650 |
INTERNET |
openConnection |
activity |
Unknown |
Unknown |
Unknown |
onBackPressed |
| 39364 |
INTERNET |
<init> |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 39365 |
INTERNET |
<init> |
activity |
Unknown |
Unknown |
Unknown |
onItemClick |
| 39366 |
INTERNET |
<init> |
activity |
onResume |
Unknown |
Unknown |
Unknown |
| 39367 |
INTERNET |
openConnection |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 39368 |
INTERNET |
openConnection |
activity |
onResume |
Unknown |
Unknown |
Unknown |
| 39369 |
INTERNET |
openConnection |
activity |
Unknown |
Unknown |
Unknown |
onBackPressed |
| 39370 |
INTERNET |
openConnection |
activity |
onResume |
Unknown |
Unknown |
Unknown |
| 39371 |
INTERNET |
openConnection |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 39372 |
INTERNET |
openConnection |
activity |
onResume |
Unknown |
Unknown |
Unknown |
| 39373 |
INTERNET |
openConnection |
activity |
Unknown |
Unknown |
Unknown |
onBackPressed |
| 39374 |
ACCESS_WIFI_STATE |
getConnectionInfo |
activity |
onCreate |
Unknown |
android.intent.action.MAIN |
Unknown |
| 39375 |
ACCESS_WIFI_STATE |
getConnectionInfo |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 39376 |
READ_PHONE_STATE |
getDeviceId |
activity |
onCreate |
Unknown |
android.intent.action.MAIN |
Unknown |
| 39377 |
READ_PHONE_STATE |
getDeviceId |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 39378 |
INTERNET |
openConnection |
activity |
onCreate |
Unknown |
android.intent.action.MAIN |
Unknown |
| 39379 |
INTERNET |
openConnection |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 39380 |
INTERNET |
openConnection |
activity |
onCreate |
Unknown |
android.intent.action.MAIN |
Unknown |
| 39381 |
INTERNET |
openConnection |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 39382 |
ACCESS_NETWORK_STATE |
getActiveNetworkInfo |
activity |
Unknown |
Unknown |
Unknown |
onBackPressed |
| 39383 |
ACCESS_NETWORK_STATE |
getActiveNetworkInfo |
activity |
onResume |
Unknown |
Unknown |
Unknown |
| 39384 |
INTERNET |
<init> |
activity |
onCreate |
Unknown |
android.intent.action.MAIN |
Unknown |
| 39385 |
INTERNET |
openConnection |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 39386 |
INTERNET |
openConnection |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 39387 |
INTERNET |
openConnection |
activity |
onResume |
Unknown |
Unknown |
Unknown |
| 39388 |
INTERNET |
openConnection |
activity |
Unknown |
Unknown |
Unknown |
onBackPressed |
| 39389 |
INTERNET |
openConnection |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 39390 |
INTERNET |
openConnection |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 39391 |
INTERNET |
openConnection |
activity |
onResume |
Unknown |
Unknown |
Unknown |
| 39392 |
INTERNET |
openConnection |
activity |
Unknown |
Unknown |
Unknown |
onBackPressed |
| 39393 |
INTERNET |
openConnection |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 39394 |
INTERNET |
openConnection |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 39395 |
INTERNET |
openConnection |
activity |
onResume |
Unknown |
Unknown |
Unknown |
| 39396 |
INTERNET |
openConnection |
activity |
Unknown |
Unknown |
Unknown |
onBackPressed |
| 39397 |
ACCESS_WIFI_STATE |
getConnectionInfo |
activity |
onCreate |
Unknown |
android.intent.action.MAIN |
Unknown |
| 39398 |
ACCESS_WIFI_STATE |
getConnectionInfo |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 39399 |
READ_PHONE_STATE |
getDeviceId |
activity |
onCreate |
Unknown |
android.intent.action.MAIN |
Unknown |
| 39400 |
READ_PHONE_STATE |
getDeviceId |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 39401 |
INTERNET |
<init> |
activity |
onResume |
Unknown |
Unknown |
Unknown |
| 39402 |
INTERNET |
<init> |
activity |
Unknown |
Unknown |
Unknown |
onBackPressed |
| 39403 |
INTERNET |
openConnection |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 39404 |
INTERNET |
openConnection |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 39405 |
INTERNET |
openConnection |
activity |
onResume |
Unknown |
Unknown |
Unknown |
| 39406 |
INTERNET |
openConnection |
activity |
Unknown |
Unknown |
Unknown |
onBackPressed |
| 63926 |
INTERNET |
<init> |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 63927 |
INTERNET |
<init> |
activity |
Unknown |
Unknown |
Unknown |
onItemClick |
| 63928 |
INTERNET |
<init> |
activity |
onResume |
Unknown |
Unknown |
Unknown |
| 63929 |
INTERNET |
openConnection |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 63930 |
INTERNET |
openConnection |
activity |
onResume |
Unknown |
Unknown |
Unknown |
| 63931 |
INTERNET |
openConnection |
activity |
Unknown |
Unknown |
Unknown |
onBackPressed |
| 63932 |
INTERNET |
openConnection |
activity |
onResume |
Unknown |
Unknown |
Unknown |
| 63933 |
INTERNET |
openConnection |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 63934 |
INTERNET |
openConnection |
activity |
onResume |
Unknown |
Unknown |
Unknown |
| 63935 |
INTERNET |
openConnection |
activity |
Unknown |
Unknown |
Unknown |
onBackPressed |
| 63936 |
ACCESS_WIFI_STATE |
getConnectionInfo |
activity |
onCreate |
Unknown |
android.intent.action.MAIN |
Unknown |
| 63937 |
ACCESS_WIFI_STATE |
getConnectionInfo |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 63938 |
READ_PHONE_STATE |
getDeviceId |
activity |
onCreate |
Unknown |
android.intent.action.MAIN |
Unknown |
| 63939 |
READ_PHONE_STATE |
getDeviceId |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 63940 |
INTERNET |
openConnection |
activity |
onCreate |
Unknown |
android.intent.action.MAIN |
Unknown |
| 63941 |
INTERNET |
openConnection |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 63942 |
INTERNET |
openConnection |
activity |
onCreate |
Unknown |
android.intent.action.MAIN |
Unknown |
| 63943 |
INTERNET |
openConnection |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 63944 |
ACCESS_NETWORK_STATE |
getActiveNetworkInfo |
activity |
Unknown |
Unknown |
Unknown |
onBackPressed |
| 63945 |
ACCESS_NETWORK_STATE |
getActiveNetworkInfo |
activity |
onResume |
Unknown |
Unknown |
Unknown |
| 63946 |
INTERNET |
<init> |
activity |
onCreate |
Unknown |
android.intent.action.MAIN |
Unknown |
| 63947 |
INTERNET |
openConnection |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 63948 |
INTERNET |
openConnection |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 63949 |
INTERNET |
openConnection |
activity |
onResume |
Unknown |
Unknown |
Unknown |
| 63950 |
INTERNET |
openConnection |
activity |
Unknown |
Unknown |
Unknown |
onBackPressed |
| 63951 |
INTERNET |
openConnection |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 63952 |
INTERNET |
openConnection |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 63953 |
INTERNET |
openConnection |
activity |
onResume |
Unknown |
Unknown |
Unknown |
| 63954 |
INTERNET |
openConnection |
activity |
Unknown |
Unknown |
Unknown |
onBackPressed |
| 63955 |
INTERNET |
openConnection |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 63956 |
INTERNET |
openConnection |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 63957 |
INTERNET |
openConnection |
activity |
onResume |
Unknown |
Unknown |
Unknown |
| 63958 |
INTERNET |
openConnection |
activity |
Unknown |
Unknown |
Unknown |
onBackPressed |
| 63959 |
ACCESS_WIFI_STATE |
getConnectionInfo |
activity |
onCreate |
Unknown |
android.intent.action.MAIN |
Unknown |
| 63960 |
ACCESS_WIFI_STATE |
getConnectionInfo |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 63961 |
READ_PHONE_STATE |
getDeviceId |
activity |
onCreate |
Unknown |
android.intent.action.MAIN |
Unknown |
| 63962 |
READ_PHONE_STATE |
getDeviceId |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 63963 |
INTERNET |
<init> |
activity |
onResume |
Unknown |
Unknown |
Unknown |
| 63964 |
INTERNET |
<init> |
activity |
Unknown |
Unknown |
Unknown |
onBackPressed |
| 63965 |
INTERNET |
openConnection |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 63966 |
INTERNET |
openConnection |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 63967 |
INTERNET |
openConnection |
activity |
onResume |
Unknown |
Unknown |
Unknown |
| 63968 |
INTERNET |
openConnection |
activity |
Unknown |
Unknown |
Unknown |
onBackPressed |
| 80876 |
INTERNET |
<init> |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 80877 |
INTERNET |
<init> |
activity |
Unknown |
Unknown |
Unknown |
onItemClick |
| 80878 |
INTERNET |
<init> |
activity |
onResume |
Unknown |
Unknown |
Unknown |
| 80879 |
INTERNET |
openConnection |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 80880 |
INTERNET |
openConnection |
activity |
onResume |
Unknown |
Unknown |
Unknown |
| 80881 |
INTERNET |
openConnection |
activity |
Unknown |
Unknown |
Unknown |
onBackPressed |
| 80882 |
INTERNET |
openConnection |
activity |
onResume |
Unknown |
Unknown |
Unknown |
| 80883 |
INTERNET |
openConnection |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 80884 |
INTERNET |
openConnection |
activity |
onResume |
Unknown |
Unknown |
Unknown |
| 80885 |
INTERNET |
openConnection |
activity |
Unknown |
Unknown |
Unknown |
onBackPressed |
| 80886 |
ACCESS_WIFI_STATE |
getConnectionInfo |
activity |
onCreate |
Unknown |
android.intent.action.MAIN |
Unknown |
| 80887 |
ACCESS_WIFI_STATE |
getConnectionInfo |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 80888 |
READ_PHONE_STATE |
getDeviceId |
activity |
onCreate |
Unknown |
android.intent.action.MAIN |
Unknown |
| 80889 |
READ_PHONE_STATE |
getDeviceId |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 80890 |
INTERNET |
openConnection |
activity |
onCreate |
Unknown |
android.intent.action.MAIN |
Unknown |
| 80891 |
INTERNET |
openConnection |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 80892 |
INTERNET |
openConnection |
activity |
onCreate |
Unknown |
android.intent.action.MAIN |
Unknown |
| 80893 |
INTERNET |
openConnection |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 80894 |
ACCESS_NETWORK_STATE |
getActiveNetworkInfo |
activity |
Unknown |
Unknown |
Unknown |
onBackPressed |
| 80895 |
ACCESS_NETWORK_STATE |
getActiveNetworkInfo |
activity |
onResume |
Unknown |
Unknown |
Unknown |
| 80896 |
INTERNET |
<init> |
activity |
onCreate |
Unknown |
android.intent.action.MAIN |
Unknown |
| 80897 |
INTERNET |
openConnection |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 80898 |
INTERNET |
openConnection |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 80899 |
INTERNET |
openConnection |
activity |
onResume |
Unknown |
Unknown |
Unknown |
| 80900 |
INTERNET |
openConnection |
activity |
Unknown |
Unknown |
Unknown |
onBackPressed |
| 80901 |
INTERNET |
openConnection |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 80902 |
INTERNET |
openConnection |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 80903 |
INTERNET |
openConnection |
activity |
onResume |
Unknown |
Unknown |
Unknown |
| 80904 |
INTERNET |
openConnection |
activity |
Unknown |
Unknown |
Unknown |
onBackPressed |
| 80905 |
INTERNET |
openConnection |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 80906 |
INTERNET |
openConnection |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 80907 |
INTERNET |
openConnection |
activity |
onResume |
Unknown |
Unknown |
Unknown |
| 80908 |
INTERNET |
openConnection |
activity |
Unknown |
Unknown |
Unknown |
onBackPressed |
| 80909 |
ACCESS_WIFI_STATE |
getConnectionInfo |
activity |
onCreate |
Unknown |
android.intent.action.MAIN |
Unknown |
| 80910 |
ACCESS_WIFI_STATE |
getConnectionInfo |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 80911 |
READ_PHONE_STATE |
getDeviceId |
activity |
onCreate |
Unknown |
android.intent.action.MAIN |
Unknown |
| 80912 |
READ_PHONE_STATE |
getDeviceId |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 80913 |
INTERNET |
<init> |
activity |
onResume |
Unknown |
Unknown |
Unknown |
| 80914 |
INTERNET |
<init> |
activity |
Unknown |
Unknown |
Unknown |
onBackPressed |
| 80915 |
INTERNET |
openConnection |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 80916 |
INTERNET |
openConnection |
activity |
onCreate |
Unknown |
Unknown |
Unknown |
| 80917 |
INTERNET |
openConnection |
activity |
onResume |
Unknown |
Unknown |
Unknown |
| 80918 |
INTERNET |
openConnection |
activity |
Unknown |
Unknown |
Unknown |
onBackPressed |


[% page.title = "Perl 5.8.4 Release Announcement" %]
The Perl 5 developer team is pleased to announce the Perl Release 5.8.4, the fourth maintenance release of Perl 5.8. The CPAN ftp multiplexor will pick a mirror close to you:
bz2 : ftp://ftp.cpan.org/pub/CPAN/src/5.0/perl-5.8.4.tar.bz2 (9598489 bytes)
gz : ftp://ftp.cpan.org/pub/CPAN/src/5.0/perl-5.8.4.tar.gz (12094233
bytes)
Or you can choose your own from one of the 243 CPAN mirrors worldwide.
md5sums for the tarballs:
3eb135afd0114f4e1acdd4ad6b8fd947 perl-5.8.4.tar.bz2
912050a9cb6b0f415b76ba56052fb4cf perl-5.8.4.tar.gz
5.8.4 is a maintenance release for perl 5.8, incorporating various minor
bugfixes and optimisations. This release updates Perl to the Unicode Character Database, Version 4.0.1, and fixes some minor errors in Perl's UTF8 handling. It provides optimisations for Unicode case conversion functions, map
and sort
, and on most platforms now provides protection against memory wrapping attacks.
Please see the
perldelta for the full details.
Please report bugs using the perlbug utility. If the build or regression tests fail, make nok
. If the build fails to early to run this, please mail perlbug at perl.org directly.
This is a source code release, not a binary release. You will need a C development environment to build the sources. Binary releases will be made available by various vendors.
5.8.5 is planed for release in July 2004, concentrating on bug fixing and stability, and will be followed by further 5.8.x releases.
To build and install Perl, and to find out how to report problems, please read the INSTALL file, and any relevant README.platform file.
As specified in the licenses for Perl (see the files named Artistic or Copying), THIS PACKAGE IS PROVIDED WITH ABSOLUTELY NO WARRANTY.
As always, you should conduct an appropriate level of testing before using any new product in your production environment.
The "perldelta", which describes the most important changes for this release is available in the source distribution, or at:
http://search.cpan.org/~nwclark/perl-5.8.4/pod/perl584delta.pod
If you missed the Perl 5.8.3 announcement:
http://dev.perl.org/perl5/news/2004/perl-5.8.3.html
You can find much more about Perl at:
-- Nicholas Clark, on behalf of the Perl5 Porters 2004-04-23


Jeremiah 51:60
So Jeremiah wrote in a book all the evil that should come upon Babylon, even all these words that are written against Babylon.