I am a senior at Loyola University. I am finishing a Bachelors degree in both Management and Information Technology. I am aiming to graduate by May 2018. My original background is in Computer Science, but I ended up not liking it much. As I grew older, I decided to start moving away from computer science and into Management. But figured I should complete the IT degree as well.
I am a huge tech-fan. The type that will be up early enough to preorder a new phone (this year included.) I also love cars. Attached is a picture of some of the cars in my family. We have 5 total. It's an expensive hobby. But considering it's something that I use everyday, I think its a worthwhile investment. All of the cars in my family are manual transmission.
I also love my two baby girls - Hazel and Winsey. Hazel is 5 years old, Winsey is 2 years old. Winsey however, is the larger of the two. First picture is when Winsey was 2 weeks old, followed by a recent picture.


"x" "1" "KIM,IS, AND BJELDANES,LF, SYNTHESES AND MUTAGENICITY OF FUSARIN C RINGANALOGS, J. AGRIC. FOOD CHEM. 40(9):1625-1630, 1992"


Scheme in JavaScript: Demo Employing Dojo
Change Log
(26 June 2009)
Features
Read the License
Download jsScheme
Result:
Log:
log input
log results
trace
result & time
JIT compile
Symbols:
work environment
core environment


@(user: Merchant)(form: Form[Application.Category]) @main("Custom Analytics", user) { I would like to see the number of likes in the following category: @helper.form(routes.Application.getLikesByCategory) {
@flash.get("categoryLikes")


User
public struct User : Decodable
Document for this field will be update soon 😍😍😍
-
Document for this field will be update soon 😍😍😍
Declaration
Swift
public let id: String
-
Document for this field will be update soon 😍😍😍
Declaration
Swift
public let updatedAt: String?
-
Document for this field will be update soon 😍😍😍
Declaration
Swift
public let username: String?
-
Document for this field will be update soon 😍😍😍
Declaration
Swift
public let name: String?
-
Document for this field will be update soon 😍😍😍
Declaration
Swift
public let firstName: String?
-
Document for this field will be update soon 😍😍😍
Declaration
Swift
public let lastName: String?
-
Document for this field will be update soon 😍😍😍
Declaration
Swift
public let twitterUserName: String?
-
Document for this field will be update soon 😍😍😍
Declaration
Swift
public let portfolio: String?
-
Document for this field will be update soon 😍😍😍
Declaration
Swift
public let bio: String?
-
Document for this field will be update soon 😍😍😍
Declaration
Swift
public let location: String?
-
Document for this field will be update soon 😍😍😍
Declaration
Swift
public let profileImage: UserProfileSource
-
Document for this field will be update soon 😍😍😍
Declaration
Swift
public var accessToken: AccessToken?
-
Declaration
Swift
public init(from decoder: Decoder) throws


I'd like to see more hardcore DICE servers, such as the normal servers ... There are too many private servers and it is sometimes impossible to find one with standard rules ... Please try to provide ... thanks and sorry for my bad English.
BrainFooLong
Administrator
BBLog can nothing do for you, goto EA Support Forum.
Greetz


Home hope Lombard surges into Sun City lead
Sun City - South Africa's Zander Lombard stormed into the lead with a seven-under-par 65 in the second round of the Nedbank Golf Challenge at the Gary Player Country Club on Friday.
LEADERBOARD | Nedbank Golf Challenge - Round 2
The powerfully-built 24-year-old from Pretoria, with a two-round total of 11-under-par 133, surged past fellow countryman Louis Oosthuizen, who was unable to repeat the heroics of his first-round 63.
Oosthuizen trailed Lombard by two shots after a making three birdies and three bogeys in an even-par round of 72.
Belgium's Thomas Detry was third, two strokes further adrift, after an adventurous round of 71 which included five penalty shots.
Tommy Fleetwood of England and Marcus Kinhult of Sweden shared fourth place on six-under, both making second successive 69s.
"It's a tough course," said Fleetwood.
"Anything can happen."
Lombard dropped a shot on the first hole but then played flawless golf, making six birdies and an eagle on the par-five 10th when he holed a putt from the fringe.
"The nerves were out there the first few holes but I settled in quite quickly," he said.
"My caddie and I tried to make birdie on every hole. It was my mindset, really positive."
Lombard started the week in 76th place on the European Tour's Race to Dubai and was an outsider to qualify for next week's Tour championship in Dubai, which is reserved for the top 50 players on the order of merit.
But if he can hold on and win the $2.5-million first prize he will leap to 13th in the standings.
"I'm trying not to think about that," said Lombard of the possibility of a huge payday. But he said he was keen to qualify for Dubai.
"It's the pinnacle of the year and you want to play it."
Detry briefly held the lead at 10-under par when he birdied the par-three 12th hole.
He earlier had to take three off the tee on the third hole when he drove the ball deep into bushes and took a penalty drop after another wayward drive on the eighth. He escaped with bogey on both occasions.
But a third errant drive on 17 proved more costly.
The tee shot requires a long carry over water and Detry pulled his drive into the lake and needed to play three off the tee for the second time in his round.
It could have been five off the tee but his second drive, which was seemingly headed for more disaster, hit a windsock pole on the edge of the water and bounced into play. He made a double-bogey six.
Detry made five birdies and an eagle but had four bogeys and a double bogey.
While Lombard was scorching around the longest course on the European Tour, there were struggles for his playing partners, defending champion Lee Westwood and home favourite Ernie Els.
The two veterans, who started the day alongside Lombard in joint fourth place, both dropped down the leaderboard.
Westwood dropped shots on both the par-fives on the first nine and struggled to a one-over 73, while Els had a nightmare stretch, dropping seven shots in four holes from the fourth, twice driving into thick bush as well as duffing a chip and missing a short putt.
He took 43 shots to the turn on the way to a nine-over-par 81.
Kalle Samooja of Sweden made an albatross two on the par-five 10th, his first hole of the day. It was the fifth albatross of the season on the European Tour, achieved with a four-iron from 235 yards.
He briefly appeared on the leaderboard, making 31 on his first nine but faded with 40 on the second nine for a 71.
Leading scores after the second round of the European Tour's Nedbank Golf Challenge on Friday at the par-72 Gary Player Country Club in Sun City (RSA unless noted):
133 - Zander Lombard 68-65
135 - Louis Oosthuizen 63-72
137 - Thomas Detry (BEL) 66-71
138 - Tommy Fleetwood (ENG) 69-69, Marcus Kinhult (SWE) 69-69
139 - Joachim B Hansen (DEN) 69-70, Aaron Rai (ENG) 70-69, Jason Scrivener (AUS) 69-70
140 - Nacho Elvira (ESP) 70-70, Matthew Fitzpatrick (ENG) 71-69, Mikko Korhonen (FIN) 70-70, Guido Migliozzi (ITA) 67-73, Alvaro Quiros (ESP) 70-70, Paul Waring (ENG) 69-71, Bernd Wiesberger (AUT) 71-69


In this project, you'll use generative adversarial networks to generate new images of faces.
You'll be using two datasets in this project:
Since the celebA dataset is complex and you're doing GANs in a project for the first time, we want you to test your neural network on MNIST before CelebA. Running the GANs on MNIST will allow you to see how well your model trains sooner.
If you're using FloydHub, set data_dir
to "/input" and use the FloydHub data ID "R5KrjnANiKVhLWAkpXhNBe".
#data_dir = './data'
# FloydHub - Use with data ID "R5KrjnANiKVhLWAkpXhNBe"
data_dir = '/input'
"""
DON'T MODIFY ANYTHING IN THIS CELL
"""
import helper
helper.download_extract('mnist', data_dir)
helper.download_extract('celeba', data_dir)
show_n_images = 25
"""
DON'T MODIFY ANYTHING IN THIS CELL
"""
%matplotlib inline
import os
from glob import glob
from matplotlib import pyplot
mnist_images = helper.get_batch(glob(os.path.join(data_dir, 'mnist/*.jpg'))[:show_n_images], 28, 28, 'L')
pyplot.imshow(helper.images_square_grid(mnist_images, 'L'), cmap='gray')
The CelebFaces Attributes Dataset (CelebA) dataset contains over 200,000 celebrity images with annotations. Since you're going to be generating faces, you won't need the annotations. You can view the first number of examples by changing show_n_images
.
show_n_images = 25
"""
DON'T MODIFY ANYTHING IN THIS CELL
"""
mnist_images = helper.get_batch(glob(os.path.join(data_dir, 'img_align_celeba/*.jpg'))[:show_n_images], 28, 28, 'RGB')
pyplot.imshow(helper.images_square_grid(mnist_images, 'RGB'))
Since the project's main focus is on building the GANs, we'll preprocess the data for you. The values of the MNIST and CelebA dataset will be in the range of -0.5 to 0.5 of 28x28 dimensional images. The CelebA images will be cropped to remove parts of the image that don't include a face, then resized down to 28x28.

You'll build the components necessary to build a GANs by implementing the following functions below:
model_inputs
discriminator
generator
model_loss
model_opt
train
This will check to make sure you have the correct version of TensorFlow and access to a GPU
"""
DON'T MODIFY ANYTHING IN THIS CELL
"""
from distutils.version import LooseVersion
import warnings
import tensorflow as tf
# Check TensorFlow Version
assert LooseVersion(tf.__version__) >= LooseVersion('1.0'), 'Please use TensorFlow version 1.0 or newer. You are using {}'.format(tf.__version__)
print('TensorFlow Version: {}'.format(tf.__version__))
# Check for a GPU
if not tf.test.gpu_device_name():
warnings.warn('No GPU found. Please use a GPU to train your neural network.')
else:
print('Default GPU Device: {}'.format(tf.test.gpu_device_name()))
Implement the model_inputs
function to create TF Placeholders for the Neural Network. It should create the following placeholders:
image_width
, image_height
, and image_channels
.z_dim
.Return the placeholders in the following the tuple (tensor of real input images, tensor of z data)
import problem_unittests as tests
def model_inputs(image_width, image_height, image_channels, z_dim):
"""
Create the model inputs
:param image_width: The input image width
:param image_height: The input image height
:param image_channels: The number of image channels
:param z_dim: The dimension of Z
:return: Tuple of (tensor of real input images, tensor of z data, learning rate)
"""
# TODO: Implement Function
inputs_real = tf.placeholder(tf.float32, (None, image_width, image_height, image_channels), name='input_real')
inputs_z = tf.placeholder(tf.float32, (None, z_dim), name='input_z')
learn_rate = tf.placeholder(tf.float32, name='learning_rate')
return inputs_real, inputs_z, learn_rate
"""
DON'T MODIFY ANYTHING IN THIS CELL THAT IS BELOW THIS LINE
"""
tests.test_model_inputs(model_inputs)
Implement discriminator
to create a discriminator neural network that discriminates on images
. This function should be able to reuse the variabes in the neural network. Use tf.variable_scope
with a scope name of "discriminator" to allow the variables to be reused. The function should return a tuple of (tensor output of the generator, tensor logits of the generator).
def discriminator(images, reuse=False):
"""
Create the discriminator network
:param image: Tensor of input image(s)
:param reuse: Boolean if the weights should be reused
:return: Tuple of (tensor output of the discriminator, tensor logits of the discriminator)
"""
# TODO: Implement Function
alpha=0.2
stddev=0.02
with tf.variable_scope('discriminator', reuse=reuse):
layer_1 = tf.layers.conv2d(images, 32, 5, 2, padding='same', kernel_initializer=tf.random_normal_initializer(stddev=stddev))
layer_1 = tf.maximum(alpha * layer_1, layer_1)
layer_2 = tf.layers.conv2d(layer_1, 64, 5, 2, padding='same', kernel_initializer=tf.random_normal_initializer(stddev=stddev))
layer_2 = tf.layers.batch_normalization(layer_2, training=True)
layer_2 = tf.maximum(alpha * layer_2, layer_2)
layer_3 = tf.layers.conv2d(layer_2, 128, 5, 2, padding='same', kernel_initializer=tf.random_normal_initializer(stddev=stddev))
layer_3 = tf.layers.batch_normalization(layer_3, training=True)
layer_3 = tf.maximum(alpha * layer_3, layer_3)
layer_4 = tf.layers.conv2d(layer_3, 256, 5, 2, padding='same', kernel_initializer=tf.random_normal_initializer(stddev=stddev))
layer_4 = tf.layers.batch_normalization(layer_4, training=True)
layer_4 = tf.maximum(alpha * layer_4, layer_4)
flattened = tf.reshape(layer_4, (-1, 2*2*256))
logits = tf.layers.dense(flattened, 1, kernel_initializer=tf.random_normal_initializer(stddev=stddev))
output = tf.sigmoid(logits)
return output, logits
"""
DON'T MODIFY ANYTHING IN THIS CELL THAT IS BELOW THIS LINE
"""
tests.test_discriminator(discriminator, tf)
Implement generator
to generate an image using z
. This function should be able to reuse the variabes in the neural network. Use tf.variable_scope
with a scope name of "generator" to allow the variables to be reused. The function should return the generated 28 x 28 x out_channel_dim
images.
def generator(z, out_channel_dim, is_train=True):
"""
Create the generator network
:param z: Input z
:param out_channel_dim: The number of channels in the output image
:param is_train: Boolean if generator is being used for training
:return: The tensor output of the generator
"""
# TODO: Implement Function
alpha=0.2
stddev=0.02
with tf.variable_scope('generator', reuse=not is_train):
layer_1 = tf.layers.dense(z, 4 * 4 * 512)
layer_1 = tf.reshape(layer_1, (-1, 4, 4, 512))
layer_1 = tf.layers.batch_normalization(layer_1, training=is_train)
layer_1 = tf.maximum(alpha * layer_1, layer_1)
layer_2 = tf.layers.conv2d_transpose(layer_1, 128, 4, 1, padding='valid', kernel_initializer=tf.random_normal_initializer(stddev=stddev))
layer_2 = tf.layers.batch_normalization(layer_2, training=is_train)
layer_2 = tf.maximum(alpha * layer_2, layer_2)
layer_3 = tf.layers.conv2d_transpose(layer_2, 64, 5, 2, padding='same', kernel_initializer=tf.random_normal_initializer(stddev=stddev))
layer_3 = tf.layers.batch_normalization(layer_3, training=is_train)
layer_3 = tf.maximum(alpha * layer_3, layer_3)
layer_4 = tf.layers.conv2d_transpose(layer_3, 32, 5, 2, padding='same',kernel_initializer=tf.random_normal_initializer(stddev=stddev))
layer_4 = tf.layers.batch_normalization(layer_4, training=is_train)
layer_4 = tf.maximum(alpha * layer_4, layer_4)
logits = tf.layers.conv2d_transpose(layer_4, out_channel_dim, 3, 1, padding='same', kernel_initializer=tf.random_normal_initializer(stddev=stddev))
output = tf.tanh(logits)
return output
"""
DON'T MODIFY ANYTHING IN THIS CELL THAT IS BELOW THIS LINE
"""
tests.test_generator(generator, tf)
Implement model_loss
to build the GANs for training and calculate the loss. The function should return a tuple of (discriminator loss, generator loss). Use the following functions you implemented:
discriminator(images, reuse=False)
generator(z, out_channel_dim, is_train=True)
def model_loss(input_real, input_z, out_channel_dim):
"""
Get the loss for the discriminator and generator
:param input_real: Images from the real dataset
:param input_z: Z input
:param out_channel_dim: The number of channels in the output image
:return: A tuple of (discriminator loss, generator loss)
"""
# TODO: Implement Function
g_model = generator(input_z, out_channel_dim)
d_model_real, d_logits_real = discriminator(input_real)
d_model_fake, d_logits_fake = discriminator(g_model, reuse=True)
d_loss_real = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=d_logits_real, labels=tf.ones_like(d_logits_real) * 0.9))
d_loss_fake = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=d_logits_fake, labels=tf.zeros_like(d_logits_fake)))
d_loss = d_loss_real + d_loss_fake
g_loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=d_logits_fake, labels=tf.ones_like(d_logits_fake)))
return d_loss, g_loss
"""
DON'T MODIFY ANYTHING IN THIS CELL THAT IS BELOW THIS LINE
"""
tests.test_model_loss(model_loss)
Implement model_opt
to create the optimization operations for the GANs. Use tf.trainable_variables
to get all the trainable variables. Filter the variables with names that are in the discriminator and generator scope names. The function should return a tuple of (discriminator training operation, generator training operation).
def model_opt(d_loss, g_loss, learning_rate, beta1):
"""
Get optimization operations
:param d_loss: Discriminator loss Tensor
:param g_loss: Generator loss Tensor
:param learning_rate: Learning Rate Placeholder
:param beta1: The exponential decay rate for the 1st moment in the optimizer
:return: A tuple of (discriminator training operation, generator training operation)
"""
# TODO: Implement Function
t_vars = tf.trainable_variables()
d_vars = [var for var in t_vars if var.name.startswith('discriminator')]
g_vars = [var for var in t_vars if var.name.startswith('generator')]
update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
gen_updates = [op for op in update_ops if op.name.startswith('generator')]
with tf.control_dependencies(gen_updates):
d_train_ops = tf.train.AdamOptimizer(learning_rate, beta1=beta1).minimize(d_loss, var_list=d_vars)
g_train_ops = tf.train.AdamOptimizer(learning_rate, beta1=beta1).minimize(g_loss, var_list=g_vars)
return d_train_ops, g_train_ops
"""
DON'T MODIFY ANYTHING IN THIS CELL THAT IS BELOW THIS LINE
"""
tests.test_model_opt(model_opt, tf)
"""
DON'T MODIFY ANYTHING IN THIS CELL
"""
import numpy as np
def show_generator_output(sess, n_images, input_z, out_channel_dim, image_mode):
"""
Show example output for the generator
:param sess: TensorFlow session
:param n_images: Number of Images to display
:param input_z: Input Z Tensor
:param out_channel_dim: The number of channels in the output image
:param image_mode: The mode to use for images ("RGB" or "L")
"""
cmap = None if image_mode == 'RGB' else 'gray'
z_dim = input_z.get_shape().as_list()[-1]
example_z = np.random.uniform(-1, 1, size=[n_images, z_dim])
samples = sess.run(
generator(input_z, out_channel_dim, False),
feed_dict={input_z: example_z})
images_grid = helper.images_square_grid(samples, image_mode)
pyplot.imshow(images_grid, cmap=cmap)
pyplot.show()
Implement train
to build and train the GANs. Use the following functions you implemented:
model_inputs(image_width, image_height, image_channels, z_dim)
model_loss(input_real, input_z, out_channel_dim)
model_opt(d_loss, g_loss, learning_rate, beta1)
Use the show_generator_output
to show generator
output while you train. Running show_generator_output
for every batch will drastically increase training time and increase the size of the notebook. It's recommended to print the generator
output every 100 batches.
def train(epoch_count, batch_size, z_dim, learning_rate, beta1, get_batches, data_shape, data_image_mode):
"""
Train the GAN
:param epoch_count: Number of epochs
:param batch_size: Batch Size
:param z_dim: Z dimension
:param learning_rate: Learning Rate
:param beta1: The exponential decay rate for the 1st moment in the optimizer
:param get_batches: Function to get batches
:param data_shape: Shape of the data
:param data_image_mode: The image mode to use for images ("RGB" or "L")
"""
# TODO: Build Model
_, image_width, image_height, image_channels = data_shape
input_real, input_z, in_learning_rate = model_inputs(image_width, image_height, image_channels, z_dim)
dis_loss, gen_loss = model_loss(input_real, input_z, image_channels)
dis_ops, gen_ops = model_opt(dis_loss, gen_loss, learning_rate, beta1)
steps = 0
print_every = 10
show_every = 100
saver = tf.train.Saver()
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for epoch_i in range(epoch_count):
for batch_images in get_batches(batch_size):
steps += 1
batch_images *= 2
batch_z = np.random.uniform(-1, 1, size=(batch_size, z_dim))
_ = sess.run(dis_ops, feed_dict={ input_real: batch_images, input_z: batch_z, in_learning_rate: learning_rate })
_ = sess.run(gen_ops, feed_dict={ input_z: batch_z, in_learning_rate: learning_rate })
if steps % print_every == 0:
dis_loss_train = dis_loss.eval({
input_z: batch_z,
input_real: batch_images
})
gen_loss_train = gen_loss.eval({
input_z: batch_z
})
print("Epoch {}/{}...".format(epoch_i+1, epoch_count),
"Discriminator Loss: {:.4f}...".format(dis_loss_train),
"Generator Loss: {:.4f}".format(gen_loss_train))
if steps % show_every == 0:
show_generator_output(sess, 25, input_z, image_channels, data_image_mode)
Test your GANs architecture on MNIST. After 2 epochs, the GANs should be able to generate images that look like handwritten digits. Make sure the loss of the generator is lower than the loss of the discriminator or close to 0.
batch_size = 64
z_dim = 128
learning_rate = .001
beta1 = .5
"""
DON'T MODIFY ANYTHING IN THIS CELL THAT IS BELOW THIS LINE
"""
epochs = 2
mnist_dataset = helper.Dataset('mnist', glob(os.path.join(data_dir, 'mnist/*.jpg')))
with tf.Graph().as_default():
train(epochs, batch_size, z_dim, learning_rate, beta1, mnist_dataset.get_batches,
mnist_dataset.shape, mnist_dataset.image_mode)
Run your GANs on CelebA. It will take around 20 minutes on the average GPU to run one epoch. You can run the whole epoch or stop when it starts to generate realistic faces.
batch_size = 64
z_dim = 100
learning_rate = .0001
beta1 = .5
"""
DON'T MODIFY ANYTHING IN THIS CELL THAT IS BELOW THIS LINE
"""
epochs = 1
celeba_dataset = helper.Dataset('celeba', glob(os.path.join(data_dir, 'img_align_celeba/*.jpg')))
with tf.Graph().as_default():
train(epochs, batch_size, z_dim, learning_rate, beta1, celeba_dataset.get_batches,
celeba_dataset.shape, celeba_dataset.image_mode)
When submitting this project, make sure to run all the cells before saving the notebook. Save the notebook file as "dlnd_face_generation.ipynb" and save it as a HTML file under "File" -> "Download as". Include the "helper.py" and "problem_unittests.py" files in your submission.


A glossary of Japanese Mahjong terms. Contains most of the terminologies listed in this doc as well as the common yaku you might encounter. No local yaku because those suck.
| Name | Definition |
|---|---|
| Hanchan | mahjong match consisting of 2 table rotations. Called the South Round in MJS. |
| Tonpuusen | the same but with only 1 rotation. East Round. |
| Honba | added counters everytime when a non-east player DOESN’T win the round. Increments value of hand by 300. Symbolized by 100 point tenbo. |
| Kyoku | round counter. Uses japanese numerals. So:
With the south round, switch Ton with Nan. |
| Orasu | All Last, the final round (S4) |
| Renchan | dealer repeat |
| Oya | dealer |
| Ryuukyoku | terminal draw, happens when tiles run out and nobody wins by last discard |
| Kamicha | player before you (on your left) |
| Shimocha | player after you (on your right) |
| Toimen | player opposite of you |
| Ari | rule is respected |
| Nashi | rule is not respected |
| Atozuke | rule allowing you to win if your yaku is dependent on only one of your multiple outs. For example, yakuless hand with shanpon wait for 9m and Hatsu can win on Hatsu discard. Gets fucked by wrong draw often. |
| Kuitan | open tanyao (nashi = no open tanyao, ari = open tanyao allowed) |
| Kuikae | ability to swap calls, for example, call chi on 5 for 34 and discard 2. Not allowed on MJS. |
| Nashi Nashi | old ruleset in which there are no akadora, and tanyao can be only closed yaku. Also atozuke nashi according to these sources: 1 2 3 4 5 |
| Ii | 1 |
| Ryan | 2 |
| San | 3 |
| Suu | 4 |
| Uu | 5 |
| Rou | 6 |
| Chii | 7 |
| Paa | 8 |
| Kyuu/Chuu | 9 |
| Pinzu, Souzu, Manzu (or Wanzu) | suits (pins, bamboos and cracks respectively). |
| Shanten | Number of tiles required to reach tenpai (0 shanten). So, for example, ryanshanten requires two tiles to reach tenpai. |
| Ukeire | tile acceptance. Pool of tiles that decrease shanten count. |
| Ton | East wind |
| Nan |
South wind |
| Xia |
West wind |
| Pei |
North Wind |
| Chun |
Red Dragon |
| Haku |
White Dragon |
| Hatsu | Green Dragon |
| Haipai | initial hand of 13/14 tiles. |
| Mentsu | meld of three. Four mentsu and pair makes winning hand |
| Shuntsu | sequence, for example 123 |
| Taatsu | two tiles that make up mentsu after adding one more tile, ex: 46 |
| Koutsu | Triplet |
| Minkou (commonly refered to as just Pon) | open triplet |
| Ankou | closed triplet |
| Kan | quad |
| Ankan | closed kan |
| Shouminkan | lesser Kan, upgraded from minkou |
| Daiminkan | Kan called directly from hand. |
| Spicy houteihai | the last tile of the game. Very dangerous. |
| Tsumo | act of drawing a tile. |
| Giri | act of discarding a tile |
| Tedashi | discarding a tile from hand |
| Tsumogiri | discarding just drawn tile |
| Shonpai | live tile |
| Yaochuu | terminals and honors |
| Agari | Broad term referring to winning on particular tiles. |
| Takame | higher payoff. Refers to win while in multiple wait, where one tile produces more value. Common examples: chanta, sanshoku |
| Yasume | lower payoff. Opposite of takame. |
| Machi | wait |
| Tanki | wait for single tile for pair. Only kind of wait allowed in chiitoitsu. |
| Shanpon | double pair wait, for completion of triplet |
| Kanchan | middle wait, in case of 46 sequence, wait is on 5. |
| Penchan | end wait, 12 waiting on 3 or 89 waiting on 7. |
| Ryanmen | double sided wait, for example 45 waiting on 3 or 6. Basis of omotesuji. |
| Omotesuji | groups of tiles separated by 3. So 1,4,7 ; 2,5,8; 3,6,9 |
| Urasuji | tiles adjacent to omotesuji. So for 5 urasuji is else 1,4 or 6,9. |
| Betaori | act of folding your hand to avoid dealing in. Focuses on dealing safe tiles. |
| Genbutsu | safe tile. |
| Kabe | method of defense focused on checking if there are valid ways to form specific ryanmen waits remaining in the game. |
| Ryankan | not a wait per se, but one of iishanten constructs. Usually something like 468, when entering tenpai allows you to make suji-trapped kanchan wait, so dealing 4 and waiting for 7. |
| Sanmenchan | three sided wait, something like 23456 waiting for 1,4,7. |
| Nobetan | double tanki wait, for example 2345 waiting for 2 and 5. Does not enable pinfu. |
| Sanmentan | triple tanki wait: 1234567 waiting for 1,4,7. |
| Entotsu | ryanmen+shanpon wait. For example, 45666 + RR waits for 3,6 and R. |
| Ryantan | ryanmen+tanki, for example 4555 waiting for 3,4,6. |
| Kantan | kanchan+tanki, 3555 waiting for 3 and 4. |
| Aryanmen | 4566 waiting for 3 and 6. |
| Harabote | worst wait. 4556 waiting for 5. |
| Hadaka tanki | tanki wait after 4 calls. Makes your yaku completely transparent and renders you defenseless. |
| Jigoku tanki | waiting for tanki honor tile while two of them are visible (in pond or as dora indicator). Absolutely based. |
| Karaten | empty tenpai, tenpai with no possible way of winning. |
| Nomi | act of having only a single yaku (mostly referred to Riichi Nomi, but might also be used for tanyao), without any visible dora. |
| Damaten | closed hand tenpai without calling riichi, especially effective in 4:30 area. |
| Mentanpin | short for Riichi Pinfu Tanyao. Bread and butter of mahjong. |
| Menhon - menzen honitsu | closed honitsu |
| Oyaman | mangan by oya, 12k points |
| Oyahane | haneman by oya, 18k points |
| Jikaze | seat wind |
| Bakaze | round wind |
| Otakaze | neutral wind |
| Oikake riichi | pursuit riichi, calling riichi just after another player, usually on a tile safe against him, to fish out potential ippatsu + additional riichi stick. |
| Sashikomi | dealing with intent, rather dumb idea when playing with akadoras |
| Yakitori | state of not having any wins after the end of hanchan. |
| Tenpai | Ready Hand |
| Menzenchin | Closed Hand |
| Riichi | Ready hand - This is the only yaku, by which players have the option to declare or not. Otherwise, hands may possibly win without it, if it remains closed with other valid yaku. 1 Han |
| Tanyao | All Simples - No honors or (terminal) are used. 1 Han |
| Menzenchin tsumo | Fully Concealed Hand - Drawing the winning tile with a closed hand. 1 Han |
| Yakuhai | Seat Wind/Prevalent Wind/Dragon - Specific collection of any dragon, seat wind, or round wind tiles. 1 Han |
| Pinfu | No-points hand - Every tile group must be a sequence plusone non-yakuhai pair. The potential winning tiles must be tiles from both sides of a sequence (ryanmen wait). 1 Han |
| Iipeikou | Pure Double Sequence - This yaku uses two-identical sequences. 1 Han |
| Chankan | Robbing a Kan - Winning with a tile used for an added kan by another player. When you have a Tenpai for Thirteen Orphans, you can call on a closed Kan. 1 Han |
| Rinshan kaihou | After a Kan - Drawing a winning tile after a kan call. 1 Han |
| Haitei raoyue | Under the Sea - Winning with the last tile draw. 1 Han |
| Houtei raoyui | Under the River - Winning off of the last possible discarded tile for the hand. 1 Han |
| Ippatsu | One-shot - Win a hand within 1 turn after declaring Riichi, in addition draws/discards must not be interrupted by tile calls during that turn. 1 Han |
| Double riichi | Double-ready - Declare Riichi with your starting hand before any tiles are called. 2 Han |
| Sanshoku Doukou | Triple Triplets - Needs three identically numbered triplets across the three suits. 2 Han |
| Sankantsu | Three Quads - Requires three quads, which are considered as triplets plus one extra. 2 Han |
| Toitoi | All Triplets - Every tile group is a triplet. 2 Han |
| Sanankou | Three Concealed Triplets - Three closed triplets. 2 Han |
| Shousangen | Little Three Dragons - Win a hand with two triplets out of the three Dragon Tiles, plus a pair of the third dragon tile. 2 Han |
| Honroutou | All Terminals and Honors - Only honor and terminal groups. 2 Han |
| Chiitoi | Seven Pairs - Win a hand with seven different pairs. "Best Yaku" |
| Chanta | Half Outside Hand - Every tile group with an honor or terminal. 2 Han Closed/1 Han Open. |
| Ittsuu | Pure Straight - A complete string of 1-9 tile naturally use sequences of the same suit. 2 Han Closed/1 Han Open. |
| Sanshoku doujun | Mixed Triple Sequence - this yaku uses three identically numbered sequences across the three suits. 2 Han Closed/1 Han Open. |
| Ryanpeikou | Twice Pure Double Sequence - this yaku uses two-identical sequences two times. 3 Han. |
| Junchan | Fully Outside Hand - Every tile group with a terminal. Also known as the cutest yaku. 3 Han Closed/2 Han Open. |
| Honitsu | Half Flush - Honor tiles with one suit. 3 Han Closed/2 Han Open. |
| Chinitsu | Full Flush - All tiles are the same suit. 6 Han Closed/5 Han Open. |
| Nagashi Mangan | Mangan at Draw - Win a game with all your discarded tiles being Terminal Tiles and no one has called them. |
| Kazoe Yakuman | A yakuman composed of regular yaku that accumulates into 13 han. Pretty based, unless it's some disgusting dora 12 bullshit. |
| Tenhou | Blessing of Heaven - Win a hand as a dealer in the first turn with the first draw. |
| Chiihou | Blessing of Earth - Win a hand as a non-dealer in the first turn before any tiles are called |
| Daisangen | Big Three Dragons - Win a hand with three triplets or quads of all the three Dragon Tiles. Can be opened |
| Suuankou | Four Concealed Triplets - Win a hand with four closed Triplets. A tanki wait for Suuankou is considered a Double Yakuman. |
| Tsuuiisou | All Honors - Win a hand that consists entirely of honor tiles. |
| Ryuuiisou | All Green - This hand consists of any four tile groups and a pair that consists of only 2, 3, 4, 6, 8 of souzu and/or the green dragon tiles. Literally, this hand is composed of "all green" painted tiles |
| Chinroutou | All Terminals - every tile is a terminal, or 1's or 9's. No other tile type are used: no simples (2-8) or honors. |
| Kokushi musou | Thirteen Orphans - it requires of one of each terminal tile from each suit and one of each of the honor tiles. The 14th tile must be a duplicate of any terminal or honor tile. A 13-wait kokushi (waiting for any terminal/honor) is considered a Double Yakuman. |
| Shousuushi | Four Little Winds - A yakuman hand that requires three groups winds, and a pair of the last wind. |
| Daisuushi | Four Big Winds - a yakuman hand that requires groups of all four winds. Double Yakuman. |
| Suukantsu | Four Quads - A yakuman in where the hand has collected kan four times. |
| Chuuren poutou | Nine Gates - A yakuman hand that contains the 13-tile pattern 1-1-1-2-3-4-5-6-7-8-9-9-9 of the same suit, plus any one more tile from the suit. A 13 sided wait True Nine Gates is worth Double Yakuman. The goal of every Mahjong Player, as achieving this yakuman immediately gets you killed. |


Preparation time
less than 30 mins
Cooking time
30 mins to 1 hour
Serves
Serves 4
Dietary
This recipe has a wonderfully retro feel about it, and it’s none the worse for that. The delicious savoury flavours, and the beautifully crisp choux pastry, will always go down a storm.
Preheat your oven to 200C/400F/Gas 6 and line a baking tray with baking parchment.
To make the choux buns, put the butter, salt and 300ml/10fl oz water into a large saucepan. Heat gently until the butter has melted, then bring to the boil. Immediately remove from the heat and tip in the flour and thyme. Beat with a wooden spoon to form a smooth ball of dough that should leave the sides of the pan.
Now vigorously beat the eggs into the hot dough, a little at a time. This takes some elbow grease! As you add the egg, the dough will become stiff and glossy. Stop adding the egg if the dough starts to become loose – but you should use up all or most of it.
Put the dough in four large blobs, each about 10cm/4in across, on the prepared baking tray. (Alternatively, you can pipe the choux onto the tray.) Sprinkle the parmesan over the dough.
Bake for 30 minutes in the centre of the oven until well risen and golden-brown. Then move to the bottom shelf for a further 10 minutes to ensure the centres are cooked. The buns should be crisp and dry.
Remove from the oven and split one side of each bun to allow the steam to escape. Put on a wire rack to cool.
For the filling, melt the butter with the oil in a large frying pan. Add the shallot and gently fry for a few minutes until soft but not coloured. Add the mushrooms, garlic and thyme. Cook for around 10 minutes over a high heat, stirring often, until the mushrooms are reduced in volume by about half, are buttery and soft and their liquid has evaporated.
Add the sherry and crème fraîche and simmer for around 10 minutes until the sauce has reduced.
Stir in the lemon juice and parsley and season with salt and plenty of black pepper.
Cut each choux bun fully in half, fill with the warm mushroom mixture and serve.


Please wait a moment while a personalized Syncthing container is prepared for you.
Error: {{ controller.error }}


Get started with Spin
Spin is a development tool for creating VR and AR JavaScript experiences for Windows PCs, Windows Mixed Reality headsets and the HoloLens. You can create VR experiences in minutes using Spin and Visual Studio Code.Setup
-
Download spin
Spin is a command line utility. Download it from http://holojs.azurewebsites.net/spin-make/spin.zip and extract it somewhere on your computer.
Or from a command line:powershell Invoke-WebRequest -Uri http://holojs.azurewebsites.net/spin-make/spin.zip -OutFile spin.zip
powershell Expand-Archive -Path spin.zip -DestinationPath .\Note: While not required, you can add Spin to your PATH environment variable to make invoking it easier. The following examples assume Spin is in the PATH. -
Install Visual Studio Code
Create a Spin app from a ThreeJs template
-
"spin new"
Open a command prompt and run:spin new --path .\first-app --threeA new directory is created for the app and a new Visual Studio Code window is opened in the app's directory. -
F5 in Visual Studio Code
In Visual Studio Code, press F5 (Debug -> Start Debugging) to run the app. If a VR headset is connected the app will run in immersive mode, otherwise it will run in a 2D window.
Note:
In the absence of a VR headset, you can use the Windows Mixed Reality simulator to view the app in
immersive mode.
Refer to this link for more information: https://docs.microsoft.com/en-us/windows/mixed-reality/using-the-windows-mixed-reality-simulator
Edit, test and debug with Visual Studio Code
-
Open the app
'spin new' automatically opens the newly created app in Visual Studio Code. For existing projects, you simply do "File -> Open Folder" in Visual Studio Code. -
Run the app
Press F5. The app will start in the VR headset or on the desktop. Spin automatically created a debug configuration (.vscode/launch.json) when the app was created. -
Debugger control
Use the standard debugger controll buttons to pause, continue, step, etc:
-
Breakpoints
To set a breakpoint in a running file, you must first open it from the list of loaded scripts. The loaded scripts list is located in the lower side of the debugger panel (Ctrl + Shift + D)
The list contains all scripts that make the app work, including internal scripts, WebGL framework scripts, etc. Your app's script is app.js
The app's render function is a good place to put a breakpoint on if you are debugging the animation:
Note: Adding breakpoints in files from the Explorer panel is not supported yet. As a workaround, insert a temporary "debugger;" instruction above the line you want to break on.Note: Sometimes breakpoints cannot be set and the app will appear hung. There will be error messages in the "Debug console" panel and the "faulty" breakpoints appear grayed out:
The solution is to remove the faulty breakpoints and restart debugging. -
Add and remove content
To add content, copy new files to the app's directory and list their relative paths in the app's JSON file:- Add to the "scripts" array if adding a script file to be executed. Scripts are executed in the order stored in the array.
- Add to the "resources" array if adding a resource file that will be loaded by scripts at runtime.
To remove content, delete files from the directory and remove their entries from the app's JSON file.
Sharing Spin apps
- Use the Spin View app from the Microsoft Store to view Spin apps on other devices or the HoloLens.
-
Distribute the Spin app
-
As a file
Create a XRSX file for the app using Spin Make and share it with others:spin.exe publish --source [path_to_app_json] --destination [path_to_xrsx_file]Note: The package is just a zip file.The app will start in Spin View when opened on the desktop or the HoloLens. -
Web hosted
Upload the app's directory to your website. Create a HTML file with a link to the app's JSON file using the xrs protocol handler, like this: xrs:http://holojs.azurewebsites.net/v8/vr-cubes.json. These links open in Spin View automatically.
To make things easier on the HoloLens, encode the URL (without the xrs: prefix) in a QR code and place it on your web page. Then run Spin View on the HoloLens, gaze to this QR code and say "scan". There are example QR codes on the app samples page
-


WITNESS LIST State Affairs Committee April 23, 2001-2:00P HB 17 For: Fulmer, Ava (Self) Lee, Michele (Self) Moore, Terrence (Self and Texas Physician Resource Council and Christian Medical Association) Parker, Allan (Texas Justice Foundation) Trotter, Richard Clayton (Self and Texas Justice Foundation) Against: Feehan, Dierdre (ACLU) Hansen, Fred (Texas Association of OB/GYN) Martinez, Jill (Self and Greater Dallas Coalition for Reproductive Freedom) McLaughlin, Kae (Texas Abortion and Reproductive Rights Action League) Riddering, Hannah (Self and Texas National Organization for Women) Romberg, Peggy (Women's Health and Family Planning Association) Registering, but not testifying: For: Belforte, Martin (Self) Braus, Nancy (Self) Daly, Richard (Texas Catholic Conference) Groendyke, Emily (Self) Kral, Joe (Texas Right to Life) Lopez, Magda (Self) Muralt, David (Citizens for Excellence in Education) Neeley, Josiah (Self) Pojman, Joseph (Greater Austin Right to Life Committee) Reave, Susan (Self) Shackelford, Kelly (Self and Free Market Foundation) Sheffield, Neil (Self) Against: Ausley, Robbie (Self) Bilbrey, Jennifer (Planned Parenthood of San Antonio and South Central Texas) Bray, Eric (Self) Clarke, Margot (Self) Felker, Laurie (Self) Flores, Lulu (Self and Texas Women's Political Caucus) French, Valerie (Self) Greer, Andrea Chilton (Self and Planned Parenthood of Houston and Southeast Texas) Harrell, William (ACLU) Henson, James (Self) Hixon, Jennifer Lee (Self) Innerarity, Dorothy (Self and Texas Federation of Business and Professional Women's Clubs) Kolter, Leslie (Self) Meerdink, Chevit (Self) Merriam, Rosemary (Self) Noble, Shannon (Self and Greater Dallas Coalition for Reproductive Freedom) Shure, Judith (Self and Greater Dallas Coalition for Reproductive Freedom) Teykl, Emily (Self) Tierney, Danielle (Planned Parenthood of the Texas Capital Region) White, Rebecca (Planned Parenthood of Houston and Southeast Texas) Worle, Christina (Self) Young, Linda (Texas Women's Political Caucus) On: Berryhill, Rebecca (Texas Department of Health) Cato, George (Texas Department of Health) HB 213 For: Moore, Terrence (Self and Texas Physicians Resource Council and Christian Medical Association) Against: Feehan, Deirdre (ACLU) Martinez, Jill (Self and Greater Dallas Coalition for Reproductive Freedom) Riddering, Hannah (Self and Texas National Organization for Women) Rigby, Jim (Self) Romberg, Peggy (Women's Health & Family Planning Association) Registering, but not testifying: For: Daly, Richard (Texas Catholic Conference) Kral, Joe (Texas Right to Life) Muralt, David (Citizens for Excellence in Education) Neeley, Josiah (Self) Pojman, Joseph (Greater Austin Right to Life Committee) Shackelford, Kelly (Self and Free Market Foundation) Trotter, Richard Clayton (Self and Texas Justice Foundation) Zook, Nathan (Self) Against: Ausley, Robbie (Self) Bilbrey, Jennifer (Planned Parenthood of San Antonio and South Central Texas) Bray, Eric (Self) Clarke, Margot (Self) Felker, Laurie (Self) Flores, Lulu (Self and Texas Women's Political Caucus) French, Valerie (Self) Greer, Andrea Chilton (Self and Planned Parenthood of Houston and Southeast Texas) Harrell, William (ACLU) Henson, James (Self) Hixon, Jennifer Lee (Self) Kolter, Leslie (Self) McLaughlin, Kae (Self and Texas Abortion and Reproductive Rights Action League) Meerdink, Chevit (Self) Merriam, Rosemary (Self) Noble, Shannon (Self and Greater Dallas Coalition for Reproductive Freedom) Shure, Judith (Self and Greater Dallas Coalition for Reproductive Freedom) Teykl, Emily (Self) Tierney, Danielle (Planned Parenthood of the Texas Capital Region) White, Rebecca (Planned Parenthood of Houston and Southeast Texas) Worle, Christina (Self) Young, Linda (Texas Women's Political Caucus) HB 509 For: Christian, Magdalena (Self) Garza, Graciela (Self) Linton, Paul (Greater Austin Right to Life Committee) Salinas, Norma Jean (Self) Against: Martinez, Jill (Self and Greater Dallas Coalition for Reproductive Freedom) McLaughlin, Kae (Texas Abortion and Reproductive Rights Action League) Riddering, Hannah (Self and Texas National Organization for Women) Romberg, Peggy (Women's Health and Family Planning Association) Registering, but not testifying: For: Adams, Cathie (Texas Eagle Forum) Armstrong, Bo (Self and Texas Eagle Forum) Armstrong, David (Self) Bahrs, Kelly (Self) Belforte, Martin (Self) Bibee, Lucinda (Self) Brocato, Tony (Self) Christian, Cleoma Ray (Self) Cravens, Peggy (Self) Dodd, Elena (Self) Dreisbach, Catherine (Self) Fritzinger, Norma Alvarado (Self) Fulmer, Ava (Self) Galbraith, Jan (Self) Gattis, Barbara (Self) Gattis, James (Self) Gerke, Peggy (Self) Groendyke, Emily (Self) Gutierrez, Lupita (Self) Hall, Berkeley Clint (Self) Hausmann, Debbie (Self) Head, Joe Bryan (Self) Hendrix, Fill (Self) Jaloway, Dan (Self) Jaquette, Shannon (Self) Kral, Joe (Texas Right to Life) Lado, Mary (Self) Lee, Michele (Self) Lehmkuhle, Belinda (Self) Lehmkuhle, Brian (Self) Lind, Rhoda (Self) Lind, Jr., Harry (Self) Macora, Margaret (Self) Maska, Christopher (Greater Austin Right to Life) McDaniel, Shannon (Self) Minuth, Mike (Self) Moore, Terrence (Self and Texas Physicians Resource Council) Muralt, David (Citizens for Excellence in Education) Muvas, Stephen (Self) Neeley, Josiah (Self) Pendleton, Kathey (Self) Pojman, Beatriz (Self) Pojman, Joseph (Greater Austin Right to Life Committee) Renne, Susan (Self) Rettberg, Jo Ann (Self) Robinson, Becky (Self) Schwartz, Ann (Self) Shackelford, Kelly (Self and Free Market Foundation) Sheffield, Neil (Self) Stike, Davida (Self) Stirton, Katie (Self) Thornton, III, Joseph (Self) Urias, Arturo (Self) Urias, Clara (Self) Vaglica, Rita (Self) Watson, Dot (Self) Watson, Max (Self) Wright, Kyleen (Self) Young, Michele (Self) Zook, Nathan (Self) Against: Ausley, Robbie (Self) Bilbrey, Jennifer (Planned Parenthood of San Antonio and South Central Texas) Bray, Eric (Self) Clarke, Margot (Self) Feehan, Deirdre (ACLU) Felker, Laurie (Self) Flores, Lulu (Self and Texas Women's Political Caucus) French, Valerie (Self) Greer, Andrea Chilton (Self and Planned Parenthood of Houston and Southeast Texas) Harrell, William (ACLU) Henson, James (Self) Hixon, Jennifer Lee (Self) Kolter, Leslie (Self) Meerdink, Chevit (Self) Merriam, Rosemary (Self) Noble, Shannon (Self and Greater Dallas Coalition for Reproductive Freedom) Shure, Judith (Self and Greater Dallas Coalition for Reproductive Freedom) Teykl, Emily (Self) Tierney, Danielle (Planned Parenthood of the Texas Capital Region) White, Rebecca (Planned Parenthood of Houston and Southeast Texas) Worle, Christina (Self) Young, Linda (Texas Women's Political Caucus) HB 583 For: Lowe, Sarah (National Day of Prayer Celebrations of Texas) Registering, but not testifying: For: Davison, Evelyn (National Day of Prayer, Central Texas Task Force) Hatton, Ruth (National Day of Prayer Celebration of Texas) Quest, Ann (National Day of Prayer Celebration of Texas) Against: Feehan, Deirdre (ACLU) Hixon, Jennifer Lee (Self) HB 686 For: Feehan, Deirdre (ACLU) Marrero, Jr., Victor Raymond (Self) Melton, Janet Hamm (Self) Miller, Whitney (Self) Registering, but not testifying: For: Crawford, R.C. (Self) HB 1140 For: Gasper, Pete (Laurie Smith Design Associates) Lancaster, David (Texas Society of Architects) Nyfeler, John (Self) On: Hendricks, Cathy (Self and Texas Board of Architectural Examiners) Registering, but not testifying: For: Roberts, Marilyn (Self) On: Hamilton, Cynthia (Texas Board of Architectural Examiners) HB 1198 For: Collett, Teresa (Self) Against: Feehan, Dierdre (ACLU) Hays, Susan (Self and Jane's Due Process) Martinez, Jill (Self and Greater Dallas Coalition for Reproductive Freedom) Riddering, Hannah (Self and Texas National Organization for Women) On: Romberg, Peggy (Women's Health and Family Planning Association) Registering, but not testifying: For: Belforte, Martin (Self) Muralt, David (Citizens for Excellence in Education) Neeley, Josiah (Self) Pojman, Joseph (Greater Austin Right to Life Committee) Sheffield, Neil (Self) Wright, Kyleen (Texans for Life Committee) Zook, Nathan (Self) Against: Ausley, Robbie (Self) Bilbrey, Jennifer (Planned Parenthood of San Antonio and South Central Texas) Clarke, Margot (Self) Felker, Laurie (Self) Flores, Lulu (Self and Texas Women's Political Caucus) French, Valerie (Self) Greer, Andrea Chilton (Planned Parenthood of Houston and Southeast Texas) Harrell, William (Self) Henson, James (Self) Hixon, Jennifer Lee (Self) Kolter, Leslie (Self) McLaughlin, Kae (Self and Texas Abortion and Reproductive Rights Action League) Meerdink, Chevit (Self) Noble, Shannon (Self and Greater Dallas Colaitin for Reproductive Freedom) Shure, Judith (Self and Greater Dallas Coalition for Reproductive Freedom) Teykl, Emily (Self) Tierney, Danielle (Planned Parenthood of the Texas Capital Region) White, Rebecca (Planned Parenthood of Houston and Southeast Texas) Worle, Christina (Self) Young, Linda (Texas Women's Political Caucus) On: Merriam, Rosemary (Self) HB 1244 For: Moore, Terrence (Self and Texas Physicians Resource Council and Christian Medical Association) Parker, Allan (Texas Justice Foundation) Renne, Susan (Self) Against: Feehan, Deirdre (ACLU) Hansen, Fred (Texas OB/GYN Association and Texas Medical Association) Martinez, Jill (Self and Greater Dallas Coalition for Reproductive Freedom) McLaughlin, Kae (Texas Abortion and Reproductive Rights Action League) Riddering, Hannah (Self and Texas National Organization for Women) Romberg, Peggy (Women's Health and Family Planning Association) Registering, but not testifying: For: Adams, Cathie (Texas Eagle Forum) Braus, Nancy (Self) Daly, Richard (Texas Catholic Conference) Fulmer, Ava (Self) Groendyke, Emily (Self) Kral, Joe (Texas Right to Life) Lee, Michele (Self) Maska, Linda (Self) Muralt, David (Citizens for Excellence in Education) Neeley, Josiah (Self) Pojman, Joseph (Greater Austin Right to Life Committee) Shackelford, Kelly (Self) Against: Ausley, Robbie (Self) Bray, Eric (Self) Clarke, Margot (Self) Felker, Laurie (Self) Flores, Lulu (Self and Texas Women's Political Caucus) French, Valerie (Self) Greer, Andrea Chilton (Self and Planned Parenthood of Houston and Southeast Texas) Harrell, William (ACLU) Hixon, Jennifer Lee (Self) Kolter, Leslie (Self) Meerdink, Chevit (Self) Merriam, Rosemary (Self) Noble, Shannon (Greater Dallas Coalition for Reproductive Freedom) Shure, Judith (Self and Greater Dallas Coalition for Reproductive Freedom) Teykl, Emily (Self) Tierney, Danielle (Planned Parenthood of the Texas Capital Region) White, Rebecca (Planned Parenthood of Houston and Southeast Texas) Young, Linda (Texas Women's Political Caucus) HB 1486 Registering, but not testifying: On: Reed, Cindy (State Auditor's Office) HB 1622 Registering, but not testifying: On: Bailey, Don (Office of Attorney General) Ballinger, Dave (Comptroller of Public Accounts) Ponder, Pamela (Comptroller of Public Accounts) Reed, Cindy (State Auditor's Office) HB 2773 Registering, but not testifying: On: Biles, Susan (Comptroller of Public Accounts) Esquivel, Eddie (Department of Information Resources) HB 2778 Registering, but not testifying: For: Allison, Jim (County Judges and Commissioners Association) Glover, Sue (Texas Association of Counties) Lee, Donald (Texas Conference of Urban Counties) Sagebiel, James (Guadalupe County) HB 2791 Registering, but not testifying: On: Lundquist, Karen (Texas Ethics Commission) HB 3065 For: Smith, Tom "Smitty" (Public Citizen) Registering, but not testifying: For: Woodford, Suzy (Self and Common Cause Texas) HB 3087 For: Littles, Paula (AFL-CIO) Riddering, Hannah (Self and Texas National Organization for Women) Spiro, Peter (Self) HB 3186 For: Pablos, Rolando (Francois Charles Operation) HB 3198 Registering, but not testifying: On: Esquivel, Eddie (Department of Information Resources) West, Cathy (Comptroller of Public Accounts) HCR 132 For: Garza de Cortes, Oralia (Our Lady of Guadalupe Catholic Church, et al.) Registering, but not testifying: For: Acevedo, Fidel (Mexcian American Democrats) Aranda, John David (Central Labor Union) Cadena, Adriana (Texas Immigrant and Refugee Coalition) Escobar, Felicia (National Council of La Raza) Flores, Rebecca (AFL-CIO) Guzman, Samuel (Texas Association of Mexican American Chambers of Commerce) Hinojosa, Tish (Self) Hinojosa, Walter (AFL-CIO) Lara, Rene (Texas Federation of Teachers) Riddering, Hannah (Self and Texas National Organization for Women) Tatum, Kyev (Texas H.C. Branch NAACP) HJR 15 Against: Baggett, Donnis (Texas Daily Newspaper Association and Texas Press Association) Registering, but not testifying: For: Ghagar, Amanda (Self) Hammon, Chris (Self) Venable, Peggy (Citizens for a Sound Economy) Against: Adams, Cathie (Texas Eagle Forum) Kral, Joe (Texas Right to Life) Maska, Christopher (Greater Austin Right to Life Committee) McGee, John (Computer Sciences Corp.) Moore, Terrence (Self) Muralt, David (Citizens for Excellence in Education) Pojman, Joseph (Greater Austin Right to Life Committee) Shackelford, Kelly (Self) Woodford, Suzy (Common Cause) On: Carey, Katherine (Office of Attorney General) HJR 23 For: Crawford, R.C. (Self) Registering, but not testifying: For: Adams, Cathie (Texas Eagle Forum) Adams, Lee (Texas Public Policy Foundation) Venable, Peggy (Citizens for a Sound Economy) Against: Lavine, Dick (Center for Public Policy Priorities) Woodford, Suzy (Common Cause Texas) HJR 107 Registering, but not testifying: For: Harrell, William (ACLU) SB 482 Registering, but not testifying: On: McLaughlin, Laure (Comptroller of Public Accounts) SB 757 Registering, but not testifying: For: Kuluicki, Dennis (State of Texas Anniversary Remembrance Day Foundation)


Tagger
Analyze and Imitate.
Tagger is a library that analyzes a body of text, and saves stylistic data in a JSON file that resembles a Stochastic Matrix that has not been normalized. This tool is useful for collecting information on a body of training data, which can then be used to generate text that roughly imitates the style of the training data.
Tagger on Github!
An example of tagger in use can be found here, where Tagger powers the text generation engine.


Smart CCTV
Plans
(current)
View Recordings
Open Camera
Close
Try Real Time (on webcam feed)
Upload Image →


Our Values
Hire the best students for any job, online.
Find talent your way
Hire in under 48 hours. Scale up or down, no strings attached. We offer flexible engagements from hourly to full-time.
Find great work
Find opportunities for every stage of your student career
Explore different ways to earn
Meet clients you’re excited to work with and take your career or business to new heights.
Happy Clients
Projects
Hours Of Support
Hard Workers
Services
Hemisphere offers a variety f services
Post a job
It's easy. Simply post a job you need completed and receive competitive bids from students within minutes.
Choose student
Whatever your needs, there will be a student to get it done: from web design, mobile app development, virtual assistants, product manufacturing, and graphic design (and a whole lot more).
Pay safely
With secure payments Hemisphere is the simplest and safest way to get work done online.
Pay for quality
Pay for work when it has been completed and you're 100% satisfied.
Browse portfolios
Find professionals you can trust by browsing their samples of previous work and reading their profile reviews.
24/7 support
We're always here to help. Our support consists of real people who are available 24/7.
Team
Our hard working team
Malek Ben Yedder
CTOVelit aut quia fugit et et. Dolorum ea voluptate vel tempore tenetur ipsa quae aut. Ipsum exercitationem iure minima enim corporis et voluptate.
Motaz Marzoui
Web DesignerQuo esse repellendus quia id. Est eum et accusantium pariatur fugit nihil minima suscipit corporis. Voluptate sed quas reiciendis animi neque sapiente.
Aymen Aouadi
Chief Executive OfficerVero omnis enim consequatur. Voluptas consectetur unde qui molestiae deserunt. Voluptates enim aut architecto porro aspernatur molestiae modi.
Khlaed El Mejbri
Rerum voluptate non adipisci animi distinctio et deserunt amet voluptas. Quia aut aliquid doloremque ut possimus ipsum officia.
Contact
Contact Us
Address
A108 Adam Street,
New York, NY 535022
Call Us
+1 5589 55488 55
+1 6678 254445 41
Email Us
<EMAIL_ADDRESS><EMAIL_ADDRESS>Open Hours
Monday - Friday
9:00AM - 05:00PM


Microverse Survey Form
The form aims to create the best student experience in Microverse
Name:
Email:
Age:
Select Months of partcipation:
Below 3 Months
Between 3-6 Months
Between 6-10 Months
DO YOU RECOMMEND MICROVERSE TO YOUR FRIENDS?
YES,Of Course
Maybe
Not sure
Please select the things you find interesting in Microverse(can be more that one)
I like the partnership learning
I like the good and intensive support offered by staff
I like the mentorship program in the school
I like that it provides opportunity for exploration
Please input your comments


|
Affordable Medical Ultrasound Training Simulator
a medical ultrasound training simulator built in Unity3D.
|
OnionLogger is a stack-based logging tool. More...
Classes | |
| class | LogLayer |
| Each LogLayer represents a new hierarchical organizational level in the log. More... | |
Public Types | |
| enum | LoggingLevels : byte { TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF } |
| The set of available LoggingLevels. More... | |
Public Member Functions | |
| OnionLogger () | |
| Create an instance of the OnionLogger class, with default settings: More... | |
| OnionLogger (string filepath) | |
| Initializes a new instance of the OnionLogger class. More... | |
| OnionLogger (string filepath, char indentChar, uint indentSize, LoggingLevels loggingLevel) | |
| Initializes a new instance of the OnionLogger class. More... | |
| void | LogTrace (string message) |
| Log a line with the TRACE logging level. | |
| void | LogInfo (string message) |
| Log a line with the INFO logging level. | |
| void | LogDebug (string message) |
| Log a line with the DEBUG logging level. | |
| void | LogWarn (string message) |
| Log a line with the WARN logging level. | |
| void | LogError (string message) |
| Log a line with the ERROR logging level. | |
| void | LogFatal (string message) |
| Log a line with the FATAL logging level. | |
| void | PushTraceLayer (string name) |
| Pushes a new LogLayer onto the stack. More... | |
| void | PushInfoLayer (string name) |
| Pushes a new LogLayer onto the stack. More... | |
| void | PushDebugLayer (string name) |
| Pushes a new LogLayer onto the stack. More... | |
| void | PushWarnLayer (string name) |
| Pushes a new LogLayer onto the stack. More... | |
| void | PushErrorLayer (string name) |
| Pushes a new LogLayer onto the stack. More... | |
| void | PushFatalLayer (string name) |
| Pushes a new LogLayer onto the stack. More... | |
| void | PopTraceLayer () |
| Pops the most recent TRACE layer off of the stack. More... | |
| void | PopDebugLayer () |
| Pops the most recent DEBUG layer off of the stack. More... | |
| void | PopInfoLayer () |
| Pops the most recent INFO layer off of the stack. More... | |
| void | PopWarnLayer () |
| Pops the most recent WARN layer off of the stack. More... | |
| void | PopErrorLayer () |
| Pops the most recent ERROR layer off of the stack. More... | |
| void | PopFatalLayer () |
| Pops the most recent FATAL layer off of the stack. More... | |
Static Public Member Functions | |
| static string | DefaultLogFilename () |
| Generates default log filename, which is a timestamp: YYYY-MM-DD-HH.MM.SS. More... | |
Public Attributes | |
| LoggingLevels | LoggingLevel |
| The logging level of an OnionLogger instance. | |
| long | FlushFrequencyInMilliseconds = 100 |
| How often to flush output to the stream (i.e. More... | |
Static Public Attributes | |
| static OnionLogger | globalLog |
| A shared OnionLogger instance that can be used between multiple classes. More... | |
Private Member Functions | |
| void | LogWithLevel (LoggingLevels level, string message) |
| Writes a line to the log with the following format: More... | |
| void | PushLayerWithLogLevel (string name, LoggingLevels level) |
| Pushes a new LogLayer onto the stack. More... | |
| void | PopLayerWithLogLevel (LoggingLevels level) |
| Pops the most recent layer off of the stack. More... | |
| string | GetCurrentIndentation () |
| Helper method to build a string for the current indentation. | |
| void | WriteLine (string s) |
| Write a string to the log file. | |
Private Attributes | |
| long | timeOfLastFlush = 0 |
| Used in conjunction with FlushFrequencyInMilliseconds to determine if the writer should flush. | |
| readonly StreamWriter | writer |
| The StreamWriter used to write to the logfile. | |
| readonly char | indentChar |
| Defines the character used for indentation. More... | |
| readonly uint | indentSize |
| The number of indentChar to use for each indentation. By default, 2. | |
| readonly string | indentationString |
| The string to use for each indentation. More... | |
| readonly Stack< LogLayer > | stack |
| The current stack of LogLayers. | |
Static Private Attributes | |
| static readonly DateTime | BEGINNING_OF_TIME = new DateTime(1970,1,1) |
OnionLogger is a stack-based logging tool.
Most logging utilities generate a monolithic block of logging statements. OnionLogger allows you to organize your logging statements hierarchally by pushing and popping layers on a stack. Each time you push a layer, your log is indented.
Individual OnionLogger instances are not thread-safe. If you require logging for multiple threads, you must create a new OnionLogger for each thread and write to separate files.
This tool is licensed under the MIT License, available here: http://opensource.org/licenses/MIT
(C) 2014 Logan M Hood
| enum OnionLogger.LoggingLevels : byte |
The set of available LoggingLevels.
In increasing order of importance, they are: TRACE< DEBUG < INFO < WARN < ERROR < FATAL
By setting the LoggingLevel of an OnionLogger, lower level log messages are suppressed. For example, a logger set to WARN will only log messages marked WARN, ERROR, or FATAL.
A logger can also be set to OFF To suppress all logging messages.
| OnionLogger.OnionLogger | ( | ) |
Create an instance of the OnionLogger class, with default settings:
| OnionLogger.OnionLogger | ( | string | filepath | ) |
Initializes a new instance of the OnionLogger class.
Uses default settings for other parameters:
| filepath | Path to the logfile. |
| OnionLogger.OnionLogger | ( | string | filepath, |
| char | indentChar, | ||
| uint | indentSize, | ||
| LoggingLevels | loggingLevel | ||
| ) |
Initializes a new instance of the OnionLogger class.
| filepath | Path to the logfile. |
| indentChar | Character used for indentation. |
| indentSize | The number of times to repeat indentChar for each indentation. |
| loggingLevel | The lowest level messages to log, where: TRACE < DEBUG < INFO < WARN < ERROR < FATAL |
|
static |
Generates default log filename, which is a timestamp: YYYY-MM-DD-HH.MM.SS.
followed by the file extension ".txt". e.g. 1991-11-17-11.22.33.txt
|
private |
Writes a line to the log with the following format:
LEVEL <indent> MESSAGE
where the spacing between LEVEL and MESSAGE is the indentation level. If the OnionLogger has a higher logging level that this message, the message is discarded.
| void OnionLogger.PopDebugLayer | ( | ) |
Pops the most recent DEBUG layer off of the stack.
This will log a message containing the name of the layer as well as time elapsed since the layer was first pushed.
| void OnionLogger.PopErrorLayer | ( | ) |
Pops the most recent ERROR layer off of the stack.
This will log a message containing the name of the layer as well as time elapsed since the layer was first pushed.
| void OnionLogger.PopFatalLayer | ( | ) |
Pops the most recent FATAL layer off of the stack.
This will log a message containing the name of the layer as well as time elapsed since the layer was first pushed.
| void OnionLogger.PopInfoLayer | ( | ) |
Pops the most recent INFO layer off of the stack.
This will log a message containing the name of the layer as well as time elapsed since the layer was first pushed.
|
private |
Pops the most recent layer off of the stack.
This will log a message containing the name of the layer as well as time elapsed since the layer was first pushed.
| void OnionLogger.PopTraceLayer | ( | ) |
Pops the most recent TRACE layer off of the stack.
This will log a message containing the name of the layer as well as time elapsed since the layer was first pushed.
| void OnionLogger.PopWarnLayer | ( | ) |
Pops the most recent WARN layer off of the stack.
This will log a message containing the name of the layer as well as time elapsed since the layer was first pushed.
| void OnionLogger.PushDebugLayer | ( | string | name | ) |
| void OnionLogger.PushErrorLayer | ( | string | name | ) |
| void OnionLogger.PushFatalLayer | ( | string | name | ) |
| void OnionLogger.PushInfoLayer | ( | string | name | ) |
|
private |
| void OnionLogger.PushTraceLayer | ( | string | name | ) |
| void OnionLogger.PushWarnLayer | ( | string | name | ) |
| long OnionLogger.FlushFrequencyInMilliseconds = 100 |
How often to flush output to the stream (i.e.
how often to write to the file). This can be set higher to decrease the frequency of disk access, since the underlying StreamWriter.flush() is a blocking method.
From my tests, high frequency writes tend to perform best with a value of around 50-100 milliseconds. This was tested on a mobile HDD, so different values may work better for SSDs or other storage media.
If this is set to 0, the logger will flush after every write. Default value is 100 milliseconds.
|
static |
A shared OnionLogger instance that can be used between multiple classes.
You will have to instantiate it first.
This is purely for convenience - under normal usage, it is probably a better practice to create your own wrapper class to hold a shared OnionLogger instance.
In particular, this should not be used in Unity because static objects are not necessarily destructed when stopping play - you may have to actually close the Unity Editor to flush everything from the file.
|
private |
The string to use for each indentation.
(i.e. "indentChar" repeated "indentSize" times)
|
private |
Defines the character used for indentation.
Generally either a space or a tab.


Cloud Vision V1 API - Module Google::Cloud::Vision::V1::Block::BlockType (v0.6.4)
Reference documentation and code samples for the Cloud Vision V1 API module Google::Cloud::Vision::V1::Block::BlockType.
Type of a block (text, image etc) as identified by OCR.
Constants
UNKNOWN
value: 0
Unknown block type.
TEXT
value: 1
Regular text block.
TABLE
value: 2
Table block.
PICTURE
value: 3
Image block.
RULER
value: 4
Horizontal/vertical line box.
BARCODE
value: 5
Barcode block.


Home
Act
LOG IN
Sara Alkhamri
User Interface Developer
@Sara-Alkhamri
Brian Melton
User Interface Developer
@ruckus777
Britt Moyers
Front End Architect
@BNMoyers
Jose Montero Jr
Front End Architect
@JoseMarioDev
Ben Feole
Backend Architect
@Zurglots


Hello everybody! I'm having difficulty figuring out why and how to post my data onto the emoncms.
I have a Raspberry Pi computer connected to the emonTX v3.4 via a serial connection.
It took me a lot of googling and two days to finally see the data coming from the emonTX via minicom.
I then started to post things on Twitter and got a recommendation from @Openenergymonitor to use emonhub to post my data onto emoncms.
I configured (almost) the emonhub, and went onto emoncms.
emoncms gave me 2 two api keys, one read only and one read and write. Which one to use in /etc/emonhub/emonhub.conf in this section?
# This reporter sends data to emonCMS
[[emonCMS_remote]]
Type = EmonHubEmoncmsReporter
[[[init_settings]]]
[[[runtimesettings]]]
url = http://emoncms.org
apikey = ????????read or write api????????
Fine, it seems emonhub is sending something to emoncms, but what is it?
Do I have to mess with the "node" data structure?
#[[99]]
[[10]]
datacode = h
datacodes = 1, h, h, h
Mistery...
And then...  What To Do with these?
Clicking around randomly I got some "node" data onto the Inputs page with wierd values. OK, something is alive.
I like English people, they are honest and always considerate. But having been raised in the Colonies and being a Perl guy I have difficulty understanding the (darn) Python lingo along with the porn(scratch that) git hub documentation ending with the .md extentions. (joke)
Long story short. Please give some instructions on how to make this bastard do something useful.
How do I make my "inputs" show up in emoncms "Inputs" section?
How do I fight the "Feeds" or should I?
My head is spinning from all the wiki stories, all asking me to do something else...
SOS
Re: Getting started with emoncms
Hello pashanoid,
Yes its the write apikey
You should not need the node decoders in this application so I would delete the entry. Are you using the "EmonHubSerialInterfacer" as I detailed on the documentation page?
You should now see data appear on the inputs page of emoncms at which point you can go on to create feeds etc via the user interface rather than the API.
Trystan
Re: Getting started with emoncms
Here's a very short Perl script to read data from the emonTx:
#!/usr/bin/perl
use warnings;
use strict;
use Device::SerialPort;
my $PortObj=Device::SerialPort->new("/dev/ttyAMA0");
$PortObj->user_msg("ON");
$PortObj->databits(8);
$PortObj->baudrate(9600);
$PortObj->parity("none");
$PortObj->stopbits(1);
$PortObj->handshake("rts");
$PortObj->read_char_time(0); # don't wait for each character
$PortObj->read_const_time(1000); # 1 second per unfulfilled "read" call
my $chars=0;
my $buffer="";
while (1) {
my ($count,$saw)=$PortObj->read(1); # will read _up to_ 255 chars
if ($count > 0) {
$chars+=$count;
$buffer.=$saw;
print $saw;
}
exit;
Re: Getting started with emoncms
I gave up on python and wrote a Perl script that writes data from the emonTX to mysql
#!/usr/bin/perl
use warnings;
use strict;
use Device::SerialPort;
use DBI;
use DBI;
my $host = 'IP ADDR or HOSTNAME';
my $db_name = "YOUR MYSQL DATABASE NAME";
my $db_user = "YOUR MYSQL DATABASE USER NAME";
my $db_pass = "YOUR MYSQL DATABASE USER PASSWORD";
my $dbh = DBI->connect("dbi:mysql:$db_name;host=$host","$db_user","$db_pass")
or die "I cannot connect to dbi:mysql:$db_name as $db_user - $DBI::errstr\n";
my $PortObj=Device::SerialPort->new("/dev/ttyAMA0");
$PortObj->user_msg("ON");
$PortObj->databits(8);
$PortObj->baudrate(9600);
$PortObj->parity("none");
$PortObj->stopbits(1);
$PortObj->handshake("rts");
$PortObj->read_char_time(0); # don't wait for each character
$PortObj->read_const_time(1000); # 1 second per unfulfilled "read" call
my $chars=0;
my $buffer="";
my ($wt1, $wt2, $wt3, $wt4, $ac1);
my $temp="";
my ($count, $saw);
$wt3=0;
$wt4=0;
while (1) {
($count,$saw)=$PortObj->read(1); # will read _up to_ 255 chars
if ($count > 0) {
$chars+=$count;
$buffer.=$saw;
#print $saw;
$temp = $buffer;
}
if ($saw =~ /\n/g){
chop $temp if ($temp =~ /\n$/);
chop $temp if ($temp =~ /\r$/);
($wt1, $wt2, $ac1) = split /\s/, $temp;
$ac1 =~ s/\D//g;
last if (!$ac1);
$ac1 = $ac1/100;
#print "temp=$temp\t";
#print "wt1=$wt1, wt2=$wt2, ac1=$ac1";
#print "\n";
#print "$wt1\t$wt2\t$ac1\n";
my $dbh = DBI->connect("dbi:mysql:dbname=$db_name","","");
$dbh->do("INSERT INTO powerlog ( kw1, kw2, kw3, kw4, voltage) VALUES (?,?,?,?,?)", undef, $wt1, $wt2, $wt3, $wt4, $ac1);
$saw = "";
$buffer ="";
$temp = "";
($wt1, $wt2, $ac1) = ("","","");
$dbh->disconnect;
}
}
exit;
Did you not see "NEW USERS, PLEASE READ - Posts held for moderation"? Your duplicate post has been deleted. RW
Re: Getting started with emoncms
hii
this is what the amonhub.log show me as error
2015-05-05 10:25:01,266 INFO Opening hub...
2015-05-05 10:25:08,420 WARNING 1 Discarded RX frame 'non-numerical content' : $
2015-05-05 10:25:08,866 WARNING 2 Discarded RX frame 'non-numerical content' : $
some help plz
thanks
Re: Getting started with emoncms
Hi. i hope you got things figured out. I have had a similar problem but I have the Emonpi with all sensor inputs built in which probably simplifies things.
Anyway, I have after much head scratching and posts on various forum threads here managed to get my data appearing in the inputs on emoncms.org and wondered if after my experiences I could assist you?
I had not done any programming since BBC BASIC at school 25 years ago so this has been quite challenging...


Application cannot find needed binary file Exiftool. This program read EXIF information from image files. You have to install it manualy.
After installation has finished, close the window and press button "NEXT" again.


I think I have worked out why so much contemporary fiction is lifeless and insipid. There are not nearly enough big novels of tormented people…


d3 layout helper for origin-destination visualizations (od-maps). Using the helper one can switch between various visualizations without and data handling. Explore the examples here: http://prjcts.sebastianmeier.eu/odmap/example/index.html
This layout helper takes care of the data handling for origin-destination visualizations. The data needs to be in the following format:
id, x, y, id_1, id_2
id_1, 1, 1, 1, 2
id_2, 1, 1, 1, 2
The first column holds the ids of all origins. x/y represent geographic coordinates. The other columns hold the origin destination data, the columns need to be have the same labels as the ids in the first column.
od = d3.layout.odmap({
//Size of the output visualization
width:550,
height:550
});
//Send the data
od.data(data);
To receive data for a certain visualization use on of the following functions: ``` var d = od.geo(od.geo()); var d = od.grid(od.grid()); var d = od.nmap(od.nmap()); var d = od.list(od.list()); var d = od.matrix(od.matrix()); var d = od.hand(od.hand());
//A little bit more specialized outputs var d = od.sankey(); var d = od.bipartite(); ``` Its easy to toggle between origin-destination and destination origin:
od.toggle();
After calling the toggle function require the data again. The nested functions allow to request different layouts for outer and inner positions:
var d = od.geo(od.hand());
Take a look at the interactive explorer: http://prjcts.sebastianmeier.eu/odmap/example/index.html
Most visualizations focus on the geographic space, but the layout also includes matrix and list views.
And additionally data preparation for the biPartite plugin and the sankey plugin.
http://prjcts.sebastianmeier.eu/odmap/example/bipartite.html
http://prjcts.sebastianmeier.eu/odmap/example/sankey.html


MCollective » Configure » Clients
This document describes MCollective client configuration in MCollective 2.0.0 and higher. Older versions may lack certain features.
Example / Index
The following is an example MCollective client config file showing all of the major groups of settings. All of the setting names styled as links can be clicked, and will take you down the page to a full description of that setting.
See below the example for a full description of the config file location and format.
# ~/.mcollective
# or
# /etc/mcollective/client.cfg
# Connector settings (required):
# -----------------------------
connector = activemq
direct_addressing = 1
# ActiveMQ connector settings:
plugin.activemq.pool.size = 1
plugin.activemq.pool.1.host = middleware.example.net
plugin.activemq.pool.1.port = 61614
plugin.activemq.pool.1.user = mcollective
plugin.activemq.pool.1.password = secret
plugin.activemq.pool.1.ssl = 1
plugin.activemq.pool.1.ssl.ca = /var/lib/puppet/ssl/certs/ca.pem
plugin.activemq.pool.1.ssl.cert = /var/lib/puppet/ssl/certs/web01.example.com.pem
plugin.activemq.pool.1.ssl.key = /var/lib/puppet/ssl/private_keys/web01.example.com.pem
plugin.activemq.pool.1.ssl.fallback = 0
# RabbitMQ connector settings:
plugin.rabbitmq.vhost = /mcollective
plugin.rabbitmq.pool.size = 1
plugin.rabbitmq.pool.1.host = middleware.example.net
plugin.rabbitmq.pool.1.port = 61613
# ... etc., similar to activemq settings
# Security plugin settings (required):
# -----------------------------------
securityprovider = ssl
# SSL plugin settings:
plugin.ssl_server_public = /Users/nick/mcollective.d/credentials/certs/mcollective-servers.pem
plugin.ssl_client_private = /Users/nick/mcollective.d/credentials/private_keys/nick-mco.pem
plugin.ssl_client_public = /Users/nick/mcollective.d/credentials/certs/nick-mco.pem
# PSK plugin settings:
plugin.psk = j9q8kx7fnuied9e
# Interface settings (optional):
# ------------------------------
# Discovery settings:
default_discovery_method = mc
# default_discovery_options = /etc/mcollective/nodes.txt
# Performance settings:
direct_addressing_threshold = 10
ttl = 60
# Miscellaneous settings:
color = 1
rpclimitmethod = first
# Subcollectives (optional):
# -----------------------------------
collectives = mcollective,uk_collective
main_collective = mcollective
# Advanced settings and platform defaults:
# -----------------------------------
logger_type = console
loglevel = warn
logfile = /var/log/mcollective.log
keeplogs = 5
max_log_size = 2097152
logfacility = user
libdir = /usr/libexec/mcollective
rpchelptemplate = /etc/mcollective/rpc-help.erb
helptemplatedir = /etc/mcollective
ssl_cipher = aes-256-cbc
The Client Config File(s)
The mco
client is usually run interactively from an admin workstation, but can also be run by scripts on a server.
These cases have different needs. In the first, the configuration and credentials should be per-user; in the second, they should be at the system level with restricted visibility of the credentials. MCollective solves this by having two locations for the client configuration:
~/.mcollective
— A.mcollective
file in the current user’s home directory. If this file exists,mco
will use it instead of the global config file./etc/mcollective/client.cfg
— A global client config file, which will be used if~/.mcollective
doesn’t exist. If you are using this file, read access to it and the external credentials it refers to should be strictly controlled, probably limited to the root user.
File Format
Each line consists of a setting, an equals sign, and a value:
# setting = value
connector = activemq
The spaces on either side of the equals sign are optional. Lines starting with a #
are comments.
Note on Boolean Values: MCollective’s config code does not have consistent handling of boolean values. Many of the core settings will accept values of
1/0
andy/n
, but will fail to handletrue/false
; additionally, each plugin can handle boolean values differently, and some of them do not properly handle they/n
values accepted by the core settings.Nearly all known plugins and core settings accept
1
and0
. Until further notice, you should always use these for all boolean settings, as no other values are universally safe.
Plugin Config Directory (Optional)
Many of MCollective’s settings are named with the format plugin.<NAME>.<SETTING_NAME>
. These settings can optionally be put in separate files, in the /etc/mcollective/plugin.d/
directory. If you are using the mco client in system-level scripts, this can let the client and the server daemon share some settings, but it isn’t particularly useful when you’re doing per-user client configuration, and there’s no equivalent plugin.d
directory in the user’s home directory.
To move a plugin.<NAME>.<SETTING_NAME>
setting to an external file, put it in /etc/mcollective/plugin.d/<NAME>.cfg
, and use only the <SETTING_NAME>
segment of the setting. So this:
# /etc/mcollective/server.cfg
plugin.puppet.splay = true
…is equivalent to:
# /etc/mcollective/plugin.d/puppet.cfg
splay = true
Note that this doesn’t work for settings like plugin.psk
, since they have no <SETTING_NAME>
segment; a setting must have at least three segments to go in a plugin.cfg file.
Best Practices
Due to the user-centric nature of client configuration and the need to keep client private keys secure and isolated, it doesn’t make as much sense to manage client config files with Puppet (or other config management software). In fact, creating a Puppet-based client configuration toolkit is likely to be a non-trivial effort.
Instead, we recommend manually distributing a partial configuration file with most of the connector settings filled out, and allowing your admin users to finish their configuration based on their own credentials. Include hints for the settings they’ll need to fill in:
plugin.ssl_client_private = <YOUR PRIVATE KEY FILE>
Required Settings
Connector Settings
connector = activemq
direct_addressing = 1
# ActiveMQ connector settings:
plugin.activemq.pool.size = 1
plugin.activemq.pool.1.host = middleware.example.net
plugin.activemq.pool.1.port = 61614
plugin.activemq.pool.1.user = mcollective
plugin.activemq.pool.1.password = secret
plugin.activemq.pool.1.ssl = 1
# When ssl == 1:
plugin.activemq.pool.1.ssl.ca = /var/lib/puppet/ssl/certs/ca.pem
plugin.activemq.pool.1.ssl.cert = /var/lib/puppet/ssl/certs/web01.example.com.pem
plugin.activemq.pool.1.ssl.key = /var/lib/puppet/ssl/private_keys/web01.example.com.pem
plugin.activemq.pool.1.ssl.fallback = 0
# RabbitMQ connector settings:
plugin.rabbitmq.vhost = /mcollective
plugin.rabbitmq.pool.size = 1
plugin.rabbitmq.pool.1.host = middleware.example.net
plugin.rabbitmq.pool.1.port = 61613
# ... etc., similar to activemq settings
MCollective always requires a connector plugin. The connector plugin is determined by the middleware you chose for your deployment. Each connector plugin will have additional settings it requires.
Shared Configuration
- All servers and clients must use the same connector plugin, and its settings must be configured compatibly.
- You must use the right connector plugin for your choice of middleware.
- The hostname and port must match what the middleware is using. The username and password must be valid login accounts on the middleware. If you are using CA-verified TLS, the certificate must be signed by the same CA the middleware is using.
connector
Which connector plugin to use. This is determined by your choice of middleware.
- Default:
activemq
- Allowed values:
activemq
,rabbitmq
, or the name of a third-party connector plugin. Note: Capitalization of plugin names doesn’t matter; MCollective normalizes it before loading the plugin.
direct_addressing
Whether your middleware supports direct point-to-point messages. This should usually be turned on, although it is off by default. The built-in activemq
and rabbitmq
connectors both support direct addressing, as does the external redis
connector. (The older stomp
connector, however, does not.)
- Default:
0
- Allowed values:
1
,0
,y
,n
— Note: Use these exact values only; do not use “true” or “false.”
ActiveMQ Connector Settings
ActiveMQ is the main middleware we recommend for MCollective. The ActiveMQ connector can use multiple servers as a failover pool; if you have only one server, just use a pool size of 1
.
Note: This is only a summary of the most commonly used ActiveMQ settings; there are about ten more settings that can be used to tune the connector’s performance. See the ActiveMQ connector documentation for more complete details.
plugin.activemq.pool.size
— How many ActiveMQ servers to attempt to use. Default: (nothing)plugin.activemq.pool.1.host
— The hostname of the first ActiveMQ server. (Note that additional servers use the same settings as the first, incrementing the number.) Default: (nothing)plugin.activemq.pool.1.port
— The Stomp port of the first ActiveMQ server. Default:61613
or6163
, depending on the MCollective version.plugin.activemq.pool.1.user
— The ActiveMQ user account to connect as. If theSTOMP_USER
environment variable is set, MCollective will use its value instead of this setting.plugin.activemq.pool.1.password
— The password for the user account being used. If theSTOMP_PASSWORD
environment variable is set, MCollective will use its value instead of this setting.plugin.activemq.pool.1.ssl
— Whether to use TLS when connecting to ActiveMQ. Default:0
; allowed:1/0
,true/false
,yes/no
plugin.activemq.pool.1.ssl.fallback
— (Whenssl == 1
) Whether to allow unverified TLS if the ca/cert/key settings aren’t set. Default:0
; allowed:1/0
,true/false
,yes/no
plugin.activemq.pool.1.ssl.ca
— (Whenssl == 1
) The CA certificate to use when verifying ActiveMQ’s certificate. Must be the fully-qualified path to a.pem
file. Default: (nothing)plugin.activemq.pool.1.ssl.cert
— (Whenssl == 1
) The certificate to present when connecting to ActiveMQ. Must be the fully-qualified path to a.pem
file. As of version 2.3.2 MCollective will also check the environment variableMCOLLECTIVE_ACTIVEMQ_POOL1_SSL_CERT
for the client’s ssl cert. Default: (nothing)plugin.activemq.pool.1.ssl.key
— (Whenssl == 1
) The private key corresponding to this node’s certificate. Must be the fully-qualified path to a.pem
file. As of version 2.3.2 MCollective will also check the environment variableMCOLLECTIVE_ACTIVEMQ_POOL1_SSL_KEY
for the client’s ssl key. Default: (nothing)
RabbitMQ Connector Settings
The RabbitMQ connector uses very similar settings to the ActiveMQ connector, with the same .pool.1.host
style of setting names.
See the RabbitMQ connector documentation for more complete details.
Security Plugin Settings
securityprovider = ssl
# SSL plugin settings:
plugin.ssl_server_public = /Users/nick/mcollective.d/credentials/certs/mcollective-servers.pem
plugin.ssl_client_private = /Users/nick/mcollective.d/credentials/private_keys/nick-mco.pem
plugin.ssl_client_public = /Users/nick/mcollective.d/credentials/certs/nick-mco.pem
# PSK plugin settings:
plugin.psk = j9q8kx7fnuied9e
MCollective always requires a security plugin. (Although they’re called security plugins, they actually handle more, including message serialization.) Each security plugin will have additional settings it requires.
Shared Configuration
All servers and clients must use the same security plugin, and its settings must be configured compatibly.
It’s possible to write new security plugins, but most people use one of the three included in MCollective:
- SSL: The best choice for most users. Provides very good security when combined with TLS on the connector plugin (see above).
- PSK: Poor security, but easy to configure; fine for proof-of-concept deployments.
- AES: Complex to configure, and carries a noticable performance cost in large networks. Only suitable for certain use cases, like where TLS on the middleware is impossible.
For a full-system look at how security works in MCollective, see Security Overview.
securityprovider
Which security plugin to use.
- Default:
psk
- Allowed values:
ssl
,psk
,aes_security
, or the name of a third-party security plugin. Note: Capitalization of plugin names doesn’t matter; MCollective normalizes it before loading the plugin.
SSL Plugin Settings
Note: This security plugin requires you to manage and distribute SSL credentials. See the SSL security plugin page for full details. In summary:
- All servers share one “server” keypair. They must all have a copy of the public key and private key.
- Every admin user must have a copy of the server public key.
- Every admin user has their own “client” keypair.
- Every server must have a copy of every authorized client public key.
All of these settings have no default, and must be set for the SSL plugin to work.
plugin.ssl_server_public
— The fully-qualified path to the server public key file, which must be in.pem
format.plugin.ssl_client_private
— The fully-qualified path to the client private key file, which must be in.pem
format.plugin.ssl_client_public
— The fully-qualified path to the client public key file, which must be in.pem
format.
The server uses different settings, which are covered in the server config reference:
plugin.ssl_server_private
plugin.ssl_server_public
plugin.ssl_client_cert_dir
PSK Plugin Settings
Note: The only credential used by this plugin is a single shared password, which all servers and admin users have a copy of.
plugin.psk
— The shared passphrase. If theMCOLLECTIVE_PSK
environment variable is set, MCollective will use its value instead of this setting.
Interface Settings
# Discovery settings:
default_discovery_method = mc
# default_discovery_options = /etc/mcollective/nodes.txt
# Performance settings:
direct_addressing_threshold = 10
ttl = 60
# Miscellaneous settings:
color = 1
rpclimitmethod = first
These settings affect the user-facing behavior of the mco
client. They generally have sensible defaults and can be ignored, but you can also modify them to match your day-to-day usage.
Discovery
The mco client always “discovers” a list of nodes before issuing requests. For broadcast requests, this is the list of expected responses to the request, and the client will stop waiting once every node has replied. For directed requests, the list is used as the list of destinations as well as the list of expected responses.
Discovery is performed with command-line filters, which can operate on identity, facts, classes, agent plugins, or custom data plugins.
The default mc
discovery method uses dummy MCollective messages; this is maximally versatile and requires no central inventory, but entails a wait for responses before mco can send the request. There are other discovery plugins available, all of which trade features for speed.
default_discovery_method
The default method to use for discovery; you can specify discovery methods per command with the --dm METHOD
option.
Discovery methods are provided by discovery plugins; run mco plugin doc
and see the “Discovery Methods” section to see a list of available discovery plugins on your system.
- Default:
mc
- Allowed values: Any installed discovery plugin
default_discovery_options
Options to pass to the discovery plugin. This acts as a default value for the --do OPTIONS
command-line flag.
Most discovery methods do not use this, and there isn’t a common format for its value; it’s parsed independently by each discovery plugin.
The only common discovery method that uses this setting is flatfile
, where it should be the filename of a list of nodes (with one node identity per line). Setting the following options:
default_discovery_method = flatfile
default_discovery_options = /etc/mcollective/nodes.txt
…is the equivalent of specifying the option --nodes /etc/mcollective/nodes.txt
(or the pair --dm flatfile --do /etc/mcollective/nodes.txt
) for every command, except those where you explicitly specify something like --dm mc
.
- Default: (nothing)
Performance
direct_addressing_threshold
If direct addressing is enabled and discovery returns few nodes — less than or equal to the value of this setting — mco
will automatically translate a broadcast request into several direct requests. This saves load on your whole infrastructure, since uninvolved servers will not have to deserialize and validate the message.
- Default:
10
- Allowed values: Any positive integer
ttl
The default TTL for requests. You can specify TTL per command with the --ttl
option.
Any server that receives a request after its TTL has expired will reject it. Since the recommend SSL security plugin signs the TTL, it cannot be altered or spoofed; this provides some protection from replay attacks.
- Default:
60
- Allowed values: Any positive integer
Miscellaneous
color
Whether to use color when displaying text on the console.
- Default:
1
on *nix systems;0
on Windows - Allowed values:
1
,0
,y
,n
— Note: Use these exact values only; do not use “true” or “false.”
rpclimitmethod
How mco
should choose which nodes to message, when using the --limit-nodes
option.
- Default:
first
- Allowed values:
first
,random
Optional Features
Subcollectives
collectives = mcollective,uk_collective
main_collective = mcollective
Subcollectives provide an alternate way of dividing up the servers in a deployment. They are mostly useful because the middleware can be made aware of them, which enables traffic flow and access restrictions. In multi-datacenter deployments, this can save bandwidth costs and give some extra security.
- See the Subcollectives and Partitioning page for more details and an example of site partitioning.
Subcollective membership is managed on the server side, by each server’s config file. A given server can join any number of collectives, and will respond to commands from any of them.
On the client side, mco will only send requests to subcollectives that are mentioned in its config file. It will default to sending requests to its main_collective
.
Shared Configuration
If you are using any additional collectives (besides the default
mcollective
collective), your middleware must be configured to permit traffic on those collectives. See the middleware deployment guide for your specific middleware to see how to do this:
collectives
A comma-separated list (spaces OK) of subcollectives mco can send requests to.
- Default:
mcollective
- Sample value:
mcollective,uk_collective
main_collective
The default collective to send requests to; requests without an explicit collective will go here. You can specify another collective on the command line with the --target
option.
- Default: (the first value of the
collectives
setting, usuallymcollective
)
Advanced Settings
These settings can generally be ignored, as appropriate values should have been set by the package you installed MCollective with.
Logging
logger_type = console
loglevel = warn
logfile = /var/log/mcollective.log
keeplogs = 5
max_log_size = 2097152
logfacility = user
By default, the mco
client logs directly to the console with a loglevel of warn
. This is generally what you want. You can get more information by setting the loglevel
to info
or debug
, and you can redirect the log to a file by changing the logger_type
.
The other log settings are mostly applicable to the server daemon, rather than the client. Some settings only apply if you are using log files, and some only apply if you are using syslog.
logger_type
How the MCollective server daemon should log. You generally want to use a file or syslog.
- Default:
file
- Allowed values:
file
,syslog
,console
loglevel
How verbosely to log.
- Default:
info
- Allowed values: In increasing order of verbosity:
fatal
,error
,warn
,info
,debug
logfile
When logger_type == file
Where the log file should be stored.
- Default: (nothing; the package’s default config file usually sets a platform-appropriate value)
- Sample value:
/var/log/mcollective.log
keeplogs
When logger_type == file
The number of log files to keep when rotating.
- Default:
5
max_log_size
When logger_type == file
Max size in bytes for log files before rotation happens.
- Default:
2097152
logfacility
When logger_type == syslog
The syslog facility to use.
- Default:
user
Platform Defaults
libdir = /usr/libexec/mcollective
rpchelptemplate = /etc/mcollective/rpc-help.erb
helptemplatedir = /etc/mcollective
ssl_cipher = aes-256-cbc
libdir
Where to look for plugins. Should be a single path or a list of paths separated by the system path separator (colon [:
] on *nix, semicolon [;
] on Windows).
By default, this setting is blank, but the package you installed MCollective with should supply a default server.cfg file with a platform-appropriate value for this setting. If server.cfg has no value for this setting, MCollective will not work.
- Default: (nothing; the package’s default config file usually sets a platform-appropriate value)
- Sample value:
/usr/libexec/mcollective:/opt/mcollective
rpchelptemplate
The path to one particular ERB template used for part of MCollective’s interactive help.
- Default: If it exists,
rpc-help.erb
in the same directory as the current config file; otherwise,/etc/mcollective/rpc-help.erb
helptemplatedir
The path to a directory containing all of MCollective’s ERB help templates.
This setting is generally only useful if you installed MCollective without a package, in which case the help templates may be stored with the source instead of installed in the /etc/mcollective
directory.
- Default: The directory containing the
rpchelptemplate
file, usually/etc/mcollective
- Allowed values: Any fully qualified path on disk
ssl_cipher
The cipher to use for encryption. This is currently only relevant if you are using the AES security plugin.
This setting should be a standard OpenSSL cipher string. See man enc
for a list.
- Default:
aes-256-cbc


Where is Bob
This game was developed in 48 hours for
Ludum Dare 48
. See
source on github
.
fullscreen
mute
refresh