001/* 002 * Licensed to the Apache Software Foundation (ASF) under one 003 * or more contributor license agreements. See the NOTICE file 004 * distributed with this work for additional information 005 * regarding copyright ownership. The ASF licenses this file 006 * to you under the Apache License, Version 2.0 (the 007 * "License"); you may not use this file except in compliance 008 * with the License. You may obtain a copy of the License at 009 * 010 * http://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, 013 * software distributed under the License is distributed on an 014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 015 * KIND, either express or implied. See the License for the 016 * specific language governing permissions and limitations 017 * under the License. 018 */ 019package org.apache.shiro.authc.credential; 020 021import org.apache.shiro.authc.AuthenticationInfo; 022import org.apache.shiro.authc.AuthenticationToken; 023import org.apache.shiro.authc.SaltedAuthenticationInfo; 024import org.apache.shiro.codec.Base64; 025import org.apache.shiro.codec.Hex; 026import org.apache.shiro.crypto.hash.AbstractHash; 027import org.apache.shiro.crypto.hash.Hash; 028import org.apache.shiro.crypto.hash.SimpleHash; 029import org.apache.shiro.util.StringUtils; 030 031/** 032 * A {@code HashedCredentialMatcher} provides support for hashing of supplied {@code AuthenticationToken} credentials 033 * before being compared to those in the {@code AuthenticationInfo} from the data store. 034 *
 035 * Credential hashing is one of the most common security techniques when safeguarding a user's private credentials 036 * (passwords, keys, etc). Most developers never want to store their users' credentials in plain form, viewable by 037 * anyone, so they often hash the users' credentials before they are saved in the data store. 038 *
 039 * This class (and its subclasses) function as follows: 040 *
 041 *
Hash the {@code AuthenticationToken} credentials supplied by the user during their login.
 042 *
Compare this hashed value directly with the {@code AuthenticationInfo} credentials stored in the system 043 * (the stored account credentials are expected to already be in hashed form).
 044 *
If these two values are {@link #equals(Object, Object) equal}, the submitted credentials match, otherwise 045 * they do not.
 046 *
 047 *
Salting and Multiple Hash Iterations
 048 * Because simple hashing is usually not good enough for secure applications, this class also supports 'salting' 049 * and multiple hash iterations. Please read this excellent 050 * Hashing Java article to learn about 051 * salting and multiple iterations and why you might want to use them. (Note of sections 5 052 * "Why add salt?" and 6 "Hardening against the attacker's attack"). We should also note here that all of 053 * Shiro's Hash implementations (for example, {@link org.apache.shiro.crypto.hash.Md5Hash Md5Hash}, 054 * {@link org.apache.shiro.crypto.hash.Sha1Hash Sha1Hash}, etc) support salting and multiple hash iterations via 055 * overloaded constructors. 056 *
Real World Case Study
 057 * In April 2010, some public Atlassian Jira and Confluence 058 * installations (Apache Software Foundation, Codehaus, etc) were the target of account attacks and user accounts 059 * were compromised. The reason? Jira and Confluence at the time did not salt user passwords and attackers were 060 * able to use dictionary attacks to compromise user accounts (Atlassian has since 061 *  062 * fixed the problem of course). 063 *
 064 * The lesson? 065 *
 066 * ALWAYS, ALWAYS, ALWAYS SALT USER PASSWORDS! 067 *
 068 *
Salting
 069 * Prior to Shiro 1.1, salts could be obtained based on the end-user submitted 070 * {@link AuthenticationToken AuthenticationToken} via the now-deprecated 071 * {@link #getSalt(org.apache.shiro.authc.AuthenticationToken) getSalt(AuthenticationToken)} method. This however 072 * could constitute a security hole since ideally salts should never be obtained based on what a user can submit. 073 * User-submitted salt mechanisms are much more susceptible to dictionary attacks and SHOULD NOT be 074 * used in secure systems. Instead salts should ideally be a secure randomly-generated number that is generated when 075 * the user account is created. The secure number should never be disseminated to the user and always kept private 076 * by the application. 077 *
Shiro 1.1
 078 * As of Shiro 1.1, it is expected that any salt used to hash the submitted credentials will be obtained from the 079 * stored account information (represented as an {@link AuthenticationInfo AuthenticationInfo} instance). This is much 080 * more secure because the salt value remains private to the application (Shiro will never store this value). 081 *
 082 * To enable this, {@code Realm}s should return {@link SaltedAuthenticationInfo SaltedAuthenticationInfo} instances 083 * during authentication. {@code HashedCredentialsMatcher} implementations will then use the provided 084 * {@link org.apache.shiro.authc.SaltedAuthenticationInfo#getCredentialsSalt credentialsSalt} for hashing. To avoid 085 * security risks, 086 * it is highly recommended that any existing {@code Realm} implementations that support hashed credentials are 087 * updated to return {@link SaltedAuthenticationInfo SaltedAuthenticationInfo} instances as soon as possible. 088 *
Shiro 1.0 Backwards Compatibility
 089 * Because of the identified security risk, {@code Realm} implementations that support credentials hashing should 090 * be updated to return {@link SaltedAuthenticationInfo SaltedAuthenticationInfo} instances as 091 * soon as possible. 092 *
 093 * If this is not possible for some reason, this class will retain 1.0 backwards-compatible behavior of obtaining 094 * the salt via the now-deprecated {@link #getSalt(AuthenticationToken) getSalt(AuthenticationToken)} method. This 095 * method will only be invoked if a {@code Realm} does not return 096 * {@link SaltedAuthenticationInfo SaltedAutenticationInfo} instances and {@link #isHashSalted() hashSalted} is 097 * {@code true}. 098 * But please note that the {@link #isHashSalted() hashSalted} property and the 099 * {@link #getSalt(AuthenticationToken) getSalt(AuthenticationToken)} methods will be removed before the Shiro 2.0 100 * release. 101 *
Multiple Hash Iterations
 102 * If you hash your users' credentials multiple times before persisting to the data store, you will also need to 103 * set this class's {@link #setHashIterations(int) hashIterations} property. See the 104 * Hashing Java article's 105 *  106 * "Hardening against the attacker's attack" section to learn more about why you might want to use 107 * multiple hash iterations. 108 *
MD5 & SHA-1 Notice
 109 * MD5 and 110 * SHA-1 algorithms are now known to be vulnerable to 111 * compromise and/or collisions (read the linked pages for more). While most applications are ok with either of these 112 * two, if your application mandates high security, use the SHA-256 (or higher) hashing algorithms and their 113 * supporting {@code CredentialsMatcher} implementations. 114 * 115 * @see org.apache.shiro.crypto.hash.Md5Hash 116 * @see org.apache.shiro.crypto.hash.Sha1Hash 117 * @see org.apache.shiro.crypto.hash.Sha256Hash 118 * @since 0.9 119 */ 120public class HashedCredentialsMatcher extends SimpleCredentialsMatcher { 121 122 /** 123 * @since 1.1 124 */ 125 private String hashAlgorithm; 126 private int hashIterations; 127 private boolean hashSalted; 128 private boolean storedCredentialsHexEncoded; 129 130 /** 131 * JavaBeans-compatible no-arg constructor intended for use in IoC/Dependency Injection environments. If you 132 * use this constructor, you MUST also additionally set the 133 * {@link #setHashAlgorithmName(String) hashAlgorithmName} property. 134 */ 135 public HashedCredentialsMatcher() { 136 this.hashAlgorithm = null; 137 this.hashSalted = false; 138 this.hashIterations = 1; 139 this.storedCredentialsHexEncoded = true; //false means Base64-encoded 140 } 141 142 /** 143 * Creates an instance using the specified {@link #getHashAlgorithmName() hashAlgorithmName} to hash submitted 144 * credentials. 145 * @param hashAlgorithmName the {@code Hash} {@link org.apache.shiro.crypto.hash.Hash#getAlgorithmName() algorithmName} 146 * to use when performing hashes for credentials matching. 147 * @since 1.1 148 */ 149 public HashedCredentialsMatcher(String hashAlgorithmName) { 150 this(); 151 if (!StringUtils.hasText(hashAlgorithmName) ) { 152 throw new IllegalArgumentException("hashAlgorithmName cannot be null or empty."); 153 } 154 this.hashAlgorithm = hashAlgorithmName; 155 } 156 157 /** 158 * Returns the {@code Hash} {@link org.apache.shiro.crypto.hash.Hash#getAlgorithmName() algorithmName} to use 159 * when performing hashes for credentials matching. 160 * 161 * @return the {@code Hash} {@link org.apache.shiro.crypto.hash.Hash#getAlgorithmName() algorithmName} to use 162 * when performing hashes for credentials matching. 163 * @since 1.1 164 */ 165 public String getHashAlgorithmName() { 166 return hashAlgorithm; 167 } 168 169 /** 170 * Sets the {@code Hash} {@link org.apache.shiro.crypto.hash.Hash#getAlgorithmName() algorithmName} to use 171 * when performing hashes for credentials matching. 172 * 173 * @param hashAlgorithmName the {@code Hash} {@link org.apache.shiro.crypto.hash.Hash#getAlgorithmName() algorithmName} 174 * to use when performing hashes for credentials matching. 175 * @since 1.1 176 */ 177 public void setHashAlgorithmName(String hashAlgorithmName) { 178 this.hashAlgorithm = hashAlgorithmName; 179 } 180 181 /** 182 * Returns {@code true} if the system's stored credential hash is Hex encoded, {@code false} if it 183 * is Base64 encoded. 184 *
 185 * Default value is {@code true} for convenience - all of Shiro's {@link Hash Hash#toString()} 186 * implementations return Hex encoded values by default, making this class's use with those implementations 187 * easier. 188 * 189 * @return {@code true} if the system's stored credential hash is Hex encoded, {@code false} if it 190 * is Base64 encoded. Default is {@code true} 191 */ 192 public boolean isStoredCredentialsHexEncoded() { 193 return storedCredentialsHexEncoded; 194 } 195 196 /** 197 * Sets the indicator if this system's stored credential hash is Hex encoded or not. 198 *
 199 * A value of {@code true} will cause this class to decode the system credential from Hex, a 200 * value of {@code false} will cause this class to decode the system credential from Base64. 201 *
 202 * Unless overridden via this method, the default value is {@code true} for convenience - all of Shiro's 203 * {@link Hash Hash#toString()} implementations return Hex encoded values by default, making this class's use with 204 * those implementations easier. 205 * 206 * @param storedCredentialsHexEncoded the indicator if this system's stored credential hash is Hex 207 * encoded or not ('not' automatically implying it is Base64 encoded). 208 */ 209 public void setStoredCredentialsHexEncoded(boolean storedCredentialsHexEncoded) { 210 this.storedCredentialsHexEncoded = storedCredentialsHexEncoded; 211 } 212 213 /** 214 * Returns {@code true} if a submitted {@code AuthenticationToken}'s credentials should be salted when hashing, 215 * {@code false} if it should not be salted. 216 *
 217 * If enabled, the salt used will be obtained via the {@link #getSalt(AuthenticationToken) getSalt} method. 218 *
 219 * The default value is {@code false}. 220 * 221 * @return {@code true} if a submitted {@code AuthenticationToken}'s credentials should be salted when hashing, 222 * {@code false} if it should not be salted. 223 * @deprecated since Shiro 1.1. Hash salting is now expected to be based on if the {@link AuthenticationInfo} 224 * returned from the {@code Realm} is a {@link SaltedAuthenticationInfo} instance and its 225 * {@link org.apache.shiro.authc.SaltedAuthenticationInfo#getCredentialsSalt() getCredentialsSalt()} method returns a non-null value. 226 * This method and the 1.0 behavior still exists for backwards compatibility if the {@code Realm} does not return 227 * {@code SaltedAuthenticationInfo} instances, but it is highly recommended that {@code Realm} implementations 228 * that support hashed credentials start returning {@link SaltedAuthenticationInfo SaltedAuthenticationInfo} 229 * instances as soon as possible. 230 *
 231 * This is because salts should always be obtained from the stored account information and 232 * never be interpreted based on user/Subject-entered data. User-entered data is easier to compromise for 233 * attackers, whereas account-unique (and secure randomly-generated) salts never disseminated to the end-user 234 * are almost impossible to break. This method will be removed in Shiro 2.0. 235 */ 236 @Deprecated 237 public boolean isHashSalted() { 238 return hashSalted; 239 } 240 241 /** 242 * Sets whether or not to salt a submitted {@code AuthenticationToken}'s credentials when hashing. 243 *
 244 * If enabled, the salt used will be obtained via the {@link #getSalt(org.apache.shiro.authc.AuthenticationToken) getCredentialsSalt} method. 245 *
 246 * The default value is {@code false}. 247 * 248 * @param hashSalted whether or not to salt a submitted {@code AuthenticationToken}'s credentials when hashing. 249 * @deprecated since Shiro 1.1. Hash salting is now expected to be based on if the {@link AuthenticationInfo} 250 * returned from the {@code Realm} is a {@link SaltedAuthenticationInfo} instance and its 251 * {@link org.apache.shiro.authc.SaltedAuthenticationInfo#getCredentialsSalt() getCredentialsSalt()} method returns a non-null value. 252 * This method and the 1.0 behavior still exists for backwards compatibility if the {@code Realm} does not return 253 * {@code SaltedAuthenticationInfo} instances, but it is highly recommended that {@code Realm} implementations 254 * that support hashed credentials start returning {@link SaltedAuthenticationInfo SaltedAuthenticationInfo} 255 * instances as soon as possible. 256 *
 257 * This is because salts should always be obtained from the stored account information and 258 * never be interpreted based on user/Subject-entered data. User-entered data is easier to compromise for 259 * attackers, whereas account-unique (and secure randomly-generated) salts never disseminated to the end-user 260 * are almost impossible to break. This method will be removed in Shiro 2.0. 261 */ 262 @Deprecated 263 public void setHashSalted(boolean hashSalted) { 264 this.hashSalted = hashSalted; 265 } 266 267 /** 268 * Returns the number of times a submitted {@code AuthenticationToken}'s credentials will be hashed before 269 * comparing to the credentials stored in the system. 270 *
 271 * Unless overridden, the default value is {@code 1}, meaning a normal hash execution will occur. 272 * 273 * @return the number of times a submitted {@code AuthenticationToken}'s credentials will be hashed before 274 * comparing to the credentials stored in the system. 275 */ 276 public int getHashIterations() { 277 return hashIterations; 278 } 279 280 /** 281 * Sets the number of times a submitted {@code AuthenticationToken}'s credentials will be hashed before comparing 282 * to the credentials stored in the system. 283 *
 284 * Unless overridden, the default value is {@code 1}, meaning a normal single hash execution will occur. 285 *
 286 * If this argument is less than 1 (i.e. 0 or negative), the default value of 1 is applied. There must always be 287 * at least 1 hash iteration (otherwise there would be no hash). 288 * 289 * @param hashIterations the number of times to hash a submitted {@code AuthenticationToken}'s credentials. 290 */ 291 public void setHashIterations(int hashIterations) { 292 if (hashIterations < 1) { 293 this.hashIterations = 1; 294 } else { 295 this.hashIterations = hashIterations; 296 } 297 } 298 299 /** 300 * Returns a salt value used to hash the token's credentials. 301 *
 302 * This default implementation merely returns {@code token.getPrincipal()}, effectively using the user's 303 * identity (username, user id, etc) as the salt, a most common technique. If you wish to provide the 304 * authentication token's salt another way, you may override this method. 305 * 306 * @param token the AuthenticationToken submitted during the authentication attempt. 307 * @return a salt value to use to hash the authentication token's credentials. 308 * @deprecated since Shiro 1.1. Hash salting is now expected to be based on if the {@link AuthenticationInfo} 309 * returned from the {@code Realm} is a {@link SaltedAuthenticationInfo} instance and its 310 * {@link org.apache.shiro.authc.SaltedAuthenticationInfo#getCredentialsSalt() getCredentialsSalt()} method returns a non-null value. 311 * This method and the 1.0 behavior still exists for backwards compatibility if the {@code Realm} does not return 312 * {@code SaltedAuthenticationInfo} instances, but it is highly recommended that {@code Realm} implementations 313 * that support hashed credentials start returning {@link SaltedAuthenticationInfo SaltedAuthenticationInfo} 314 * instances as soon as possible.
 315 * This is because salts should always be obtained from the stored account information and 316 * never be interpreted based on user/Subject-entered data. User-entered data is easier to compromise for 317 * attackers, whereas account-unique (and secure randomly-generated) salts never disseminated to the end-user 318 * are almost impossible to break. This method will be removed in Shiro 2.0. 319 */ 320 @Deprecated 321 protected Object getSalt(AuthenticationToken token) { 322 return token.getPrincipal(); 323 } 324 325 /** 326 * Returns a {@link Hash Hash} instance representing the already-hashed AuthenticationInfo credentials stored in the system. 327 *
 328 * This method reconstructs a {@link Hash Hash} instance based on a {@code info.getCredentials} call, 329 * but it does not hash that value - it is expected that method call will return an already-hashed value. 330 *
 331 * This implementation's reconstruction effort functions as follows: 332 *
 333 *
Convert {@code account.getCredentials()} to a byte array via the {@link #toBytes toBytes} method. 334 *
If {@code account.getCredentials()} was originally a String or char[] before {@code toBytes} was 335 * called, check for encoding: 336 *
If {@link #storedCredentialsHexEncoded storedCredentialsHexEncoded}, Hex decode that byte array, otherwise 337 * Base64 decode the byte array
 338 *
Set the byte[] array directly on the {@code Hash} implementation and return it.
 339 *
 340 * 341 * @param info the AuthenticationInfo from which to retrieve the credentials which assumed to be in already-hashed form. 342 * @return a {@link Hash Hash} instance representing the given AuthenticationInfo's stored credentials. 343 */ 344 protected Object getCredentials(AuthenticationInfo info) { 345 Object credentials = info.getCredentials(); 346 347 byte[] storedBytes = toBytes(credentials); 348 349 if (credentials instanceof String || credentials instanceof char[]) { 350 //account.credentials were a char[] or String, so 351 //we need to do text decoding first: 352 if (isStoredCredentialsHexEncoded()) { 353 storedBytes = Hex.decode(storedBytes); 354 } else { 355 storedBytes = Base64.decode(storedBytes); 356 } 357 } 358 AbstractHash hash = newHashInstance(); 359 hash.setBytes(storedBytes); 360 return hash; 361 } 362 363 /** 364 * This implementation first hashes the {@code token}'s credentials, potentially using a 365 * {@code salt} if the {@code info} argument is a 366 * {@link org.apache.shiro.authc.SaltedAuthenticationInfo SaltedAuthenticationInfo}. It then compares the hash 367 * against the {@code AuthenticationInfo}'s 368 * {@link #getCredentials(org.apache.shiro.authc.AuthenticationInfo) already-hashed credentials}. This method 369 * returns {@code true} if those two values are {@link #equals(Object, Object) equal}, {@code false} otherwise. 370 * 371 * @param token the {@code AuthenticationToken} submitted during the authentication attempt. 372 * @param info the {@code AuthenticationInfo} stored in the system matching the token principal 373 * @return {@code true} if the provided token credentials hash match to the stored account credentials hash, 374 * {@code false} otherwise 375 * @since 1.1 376 */ 377 @Override 378 public boolean doCredentialsMatch(AuthenticationToken token, AuthenticationInfo info) { 379 Object tokenHashedCredentials = hashProvidedCredentials(token, info); 380 Object accountCredentials = getCredentials(info); 381 return equals(tokenHashedCredentials, accountCredentials); 382 } 383 384 /** 385 * Hash the provided {@code token}'s credentials using the salt stored with the account if the 386 * {@code info} instance is an {@code instanceof} {@link SaltedAuthenticationInfo SaltedAuthenticationInfo} (see 387 * the class-level JavaDoc for why this is the preferred approach). 388 *
 389 * If the {@code info} instance is not 390 * an {@code instanceof} {@code SaltedAuthenticationInfo}, the logic will fall back to Shiro 1.0 391 * backwards-compatible logic: it will first check to see {@link #isHashSalted() isHashSalted} and if so, will try 392 * to acquire the salt from {@link #getSalt(AuthenticationToken) getSalt(AuthenticationToken)}. See the class-level 393 * JavaDoc for why this is not recommended. This 'fallback' logic exists only for backwards-compatibility. 394 * {@code Realm}s should be updated as soon as possible to return {@code SaltedAuthenticationInfo} instances 395 * if account credentials salting is enabled (highly recommended for password-based systems). 396 * 397 * @param token the submitted authentication token from which its credentials will be hashed 398 * @param info the stored account data, potentially used to acquire a salt 399 * @return the token credentials hash 400 * @since 1.1 401 */ 402 protected Object hashProvidedCredentials(AuthenticationToken token, AuthenticationInfo info) { 403 Object salt = null; 404 if (info instanceof SaltedAuthenticationInfo) { 405 salt = ((SaltedAuthenticationInfo) info).getCredentialsSalt(); 406 } else { 407 //retain 1.0 backwards compatibility: 408 if (isHashSalted()) { 409 salt = getSalt(token); 410 } 411 } 412 return hashProvidedCredentials(token.getCredentials(), salt, getHashIterations()); 413 } 414 415 /** 416 * Returns the {@link #getHashAlgorithmName() hashAlgorithmName} property, but will throw an 417 * {@link IllegalStateException} if it has not been set. 418 * 419 * @return the required {@link #getHashAlgorithmName() hashAlgorithmName} property 420 * @throws IllegalStateException if the property has not been set prior to calling this method. 421 * @since 1.1 422 */ 423 private String assertHashAlgorithmName() throws IllegalStateException { 424 String hashAlgorithmName = getHashAlgorithmName(); 425 if (hashAlgorithmName == null) { 426 String msg = "Required 'hashAlgorithmName' property has not been set. This is required to execute " + 427 "the hashing algorithm."; 428 throw new IllegalStateException(msg); 429 } 430 return hashAlgorithmName; 431 } 432 433 /** 434 * Hashes the provided credentials a total of {@code hashIterations} times, using the given salt. The hash 435 * implementation/algorithm used is based on the {@link #getHashAlgorithmName() hashAlgorithmName} property. 436 * 437 * @param credentials the submitted authentication token's credentials to hash 438 * @param salt the value to salt the hash, or {@code null} if a salt will not be used. 439 * @param hashIterations the number of times to hash the credentials. At least one hash will always occur though, 440 * even if this argument is 0 or negative. 441 * @return the hashed value of the provided credentials, according to the specified salt and hash iterations. 442 */ 443 protected Hash hashProvidedCredentials(Object credentials, Object salt, int hashIterations) { 444 String hashAlgorithmName = assertHashAlgorithmName(); 445 return new SimpleHash(hashAlgorithmName, credentials, salt, hashIterations); 446 } 447 448 /** 449 * Returns a new, uninitialized instance, without its byte array set. Used as a utility method in the 450 * {@link SimpleCredentialsMatcher#getCredentials(org.apache.shiro.authc.AuthenticationInfo) getCredentials(AuthenticationInfo)} implementation. 451 * 452 * @return a new, uninitialized instance, without its byte array set. 453 */ 454 protected AbstractHash newHashInstance() { 455 String hashAlgorithmName = assertHashAlgorithmName(); 456 return new SimpleHash(hashAlgorithmName); 457 } 458 459}


This defines a basic renderer for use with antigallery. All callbacks mandatory unless stated otherwise.
Classes
constructor()
(Optional) You can get creative here with your own constructor, but ours will just take a div id.
container()
(Optional) Convinience function for returning a jquery object of the container div.
select(sel)
(Optional) Convinience function for returning a jquery selector scoped to a container.
thumbIndexName()
The name of the data element that holds the thumb index (how configurable is that?!).
thumbSetIndexName()
The name of the data element that holds the thumbset index.
renderThumbs(thumbs, direction)
Takes an array of thumb urls (paged by paginatedThreshold), and pagination direction, expects to be drawn with an index.
renderNavForPages(length)
Takes a length, its up to you to draw the numbers and link them, uses thumbSetIndexName to find the index.
setActiveThumb(index)
Takes the index of the currently displayed image, used for styling the active thumb.
setActivePage(index)
Takes the index of the currently displayed page, used for styling the active page.
renderMainImage(image)
Takes a full image url, called on page load, during prev/next, and when a thumb is clicked.
nextButton()
Needs to return a scoped selector to that gallerys next button.
previousButton()
Needs to return a scoped selector to that gallerys previous button.
nextPageButton()
Needs to return a scoped selector to that gallerys next thumbset button.
previousPageButton()
Needs to return a scoped selector to that gallerys previous thumbset button.
thumbElement()
Needs to return a scoped selector to all of the thumb img elements for the gallery.
mainImage()
Needs to return a scoped selector of the main image.
pageElement()
Needs to return a scoped selector to all of the direct page link elements for the gallery.


--- ---
I had similar problems once and did an extra check on Canvas.ClipRect in the Paint procedure. When updating the component when only parts of the component needed to be redrawn, I used:
{ ... } var R: TRect; begin if FValue <> NewValue then begin FValue := NewValue; R := GetClientRect; InflateRect(R, - 1, - 1); InvalidateRect(Handle, @R, not (csOpaque in ControlStyle)); end; end;
Now I could check for this rectangle in the Paint procedure. When the ClipRect was not the same as I expected it to be (eg caused by a form being moved which covered it partly or completely before the move) a full redraw was needed and performed.
{ ... } with Canvas do if (((ClipRect.Right - ClipRect.Left) <> (Width - 2)) and ((ClipRect.Bottom - ClipRect.Top) <> (Height - 2))) then DoDrawAll := True else {only update what needs to be updated.} { ... }
When a full redraw was not required the rest of the paint routine knew what to update by other means and only updated these parts.
The component in which I used this was a descendent of TCustomPanel. I'm not sure if ClipRect is setup the same for a TGraphicControl but I guess so.
Tip by Pieter Zijlstra
Thank you very much Pieter, it works! This is how I implemented it for the time being: In WM_WINDOWPOSCHANGED I assign a private field fTestRect like you do, but with
fTestRect := BoundsRect; InflateRect(fTestRect,- 1,- 1);
Then I can override TControl.Repaint, it's natural for a user to call repaint on an animation step:
{ ... } if fUseRegions then if assigned(parent) then InvalidateRect(parent.handle, @fTestRect, False) else inherited else inherited; { ... }
fUseRegions is the flag the user can set to use those update regions for speedup. Then in Paint, I do as you do, and only really use the update regions if Canvas.ClipRect is the analogue of fTestRect. I can't see a slowdown. Of course, chances are that a window pops up on the control which has exactly the dimensions of fTestRect, but I think that chance is rather slim.
Tip by Renate Schaaf


Hello, world!
This is a template for an OpenFin application.
Current version:
Click here to open a window
download pdf file
download zip file
amazon
IFrame Test


The database import driver is designed to receive current data from a third-party database, as well as write information to a third-party database using telecontrol commands. This driver is included in the Rapid SCADA installation package and does not require separate installation. The driver library file is KpDbImport.dll.
Each device that uses the database import driver contains one request for receiving data and a set of commands for changing data. There can be one or more devices importing data on a one communication line.
Configuring the database import driver is performed using the device properties form. To open this form, find the corresponding device in the Communicator settings, right-click on the device node and choose the Properties menu item.
The Database page allows to specify the database type and the parameters of the database connection. If non-standard connection parameters are needed, it is possbile to edit the connection string directly.
The Data Retrieval page specifies the SQL query to retrieve current data from the database. The driver automatically creates device tags based on the list of requested table columns. If a request has a complex syntax, enter the number of tags manually.
The telecontrol commands supported by the device are defined on the Commands page. Commands provide information transfer from Rapid SCADA to the database. SQL query of a command may include the variables cmdVal and cmdNum which contain the value and number of the command. For most DBMS variables in the query need the prefix @, whereas : (colon) is usually used for Oracle.
A command having the number 0 is a default command. If the number of the command sent is not found in the list of the device commands, the default command is executed.


Tesla driver falls to death from ramp in New Taipei after crash
The driver fell over the ramp after being helped out from the wreckage of the destroyed car
by Taiwan NewsTesla driver falls to death from ramp in New Taipei after car crash. (CNA photo)
TAIPEI (Taiwan News) — A Tesla driver on a test-drive fell to his death from a highway ramp shortly after a crash on Sunday afternoon, leaving two passengers being treated at a hospital.
The 23-year-old driver, surnamed Hua, embarked on a test-drive in the afternoon with a 22-year-old Tesla salesman, and a South Korean female passenger, aged 24. The car crashed into a highway ramp in transition from the Sun Yat-sen Freeway (or National freeway 1) to National freeway 3, in New Taipei City's Xizhi District, before hitting the highway fence.
After being helped out of the wrecked car by another vehicle’s driver, Hua fell over the fence and into a park about 16 meters below the ramp, reports quoted the salesman and another witness saying. Hua was believed to have died before the ambulance arrived.
Traffic at the scene of the car accident was back to normal by 3 p.m. Police are still investigating the case.


Edit User
Registrant email is required.
Registrant affiliation is required.
Registrant team name is required.


A Little Bit About Myself
My name is Jared. I am a web developer based out of Eugene, Oregon. I am passionate about implementing thoughtful and impactful web design using elegant coding strategies and modern web technologies.
While working in the industry, I have collaborated with designers and developers to transition web designs into functioning websites and ecommerce storefronts for reputable brands such as Coconut Bliss, Everyday Bliss, National Extinguisher Service, and The Bread Stop. In addition to writing code, my role as a web developer included optimizing and preparing images for web projects using Adobe Photoshop, Bridge, and Illustrator. I have also maintained websites across various platforms including Squarespace, Americommerce, and ExpressionEngine. My work in this area involved implementing changes to websites to meet client needs, quickly and efficiently resolving bugs, and posting new blogs and announcements.
When working on personal projects, I use a number of tools and technologies to develop content for the web including HTML, CSS (LESS / SCSS), JavaScript, React, Redux, GatsbyJS, Material UI, Bootstrap, and Photoshop. I’m always working on new and interesting projects - stop by jaredparrish.com to see more of my work!
Or find me on my main website at jaredparrish.com


Ecuador - Profile
Facts
- For cruising sailors Ecuador's main attraction lies several hundred miles offshore in its Archipiélago de Colón, commonly known as the Galapagos Islands . As they form a separate entity and cruising regulations also differ from mainland Ecuador, the Galapagos are described separately in the South Pacific section.
- Due to the prevailing winds and currents, the Ecuadorian coast is best cruised from south to north, which most yachts visiting Ecuador rarely do, as usually they sail from the north after having transited the Panama Canal.
- A good intermediate landfall is the coastal city of Salinas, specifically Puerto Lucia Yacht Club, on the westernmost point of mainland Ecuador. It justifies breaking the passage from Panama to Galapagos into two shorter legs of about 550 miles each, as it allows yachts to navigate in fair winds and currents. In addition, it allows owners to leave their boat secure in the marina and explore the interior. Salinas is a practical port to clear customs and arrange for the boat to be worked on or cared for while traveling inland. The Puerto Lucia Yacht Club has a 50-ton travelift, floating docks and strong buoys for Med-style mooring to a wall. Diesel and water are available dockside. An excellent fresh produce and seafood open market, grocery store and hardware stores are a short distance away. This is also a good place to leave for the Galapagos Islands .
- The coast is arid and there are few natural harbours with the notable exception of the estuary of the River Guayas. The Guayaquil Yacht Club welcomes visiting yachts and is convenient for provisioning in Guayquil although marine facilities are limited.
- The US dollar is now the official currency. Local prices are quite low for both provisions and fuel. Water is sometimes scarce along the coast.
- The usual procedure for yachts wanting to visit just one port in the Galalpagos is to obtain outward clearance for the Marquesas (or another offshore destination) and not to mention the intended stop in Galapagos to the officials.
Security
It is advisable not to travel within 15 miles of the border with Colombia. See the UK FCO website for the latest advice.
The usual safety and security precautions should be taken, especially when anchoring alone or in isolated places. Cases of armed robbery are increasing and petty crime is common.
Noonsite has not received reports of any particular problems or dangers, although extra care should be taken when near the Colombian boarder. However, there are a number of places inland where it is not advisable to visit.
You should not climb the Tungurahua or Reventador volcanoes due to renewed volcanic activity.
Updated January 2016
Weather
Although lying on the equator, the climate of Ecuador is very pleasant, which makes the coast of Ecuador very attractive to leave the boat between seasons. Temperatures along the coast show little variation between seasons and the period between May and November is usually dry. The winds are mostly light southerlies. The climate in the interior is more varied and temperatures vary greatly with altitude. Weather conditions can be strongly influenced by the El Niño phenomenon.
Ecuador Weather Forecast
Sailing Advisory Panama to Galapagos
For links to free global weather information, forecast services and extreme weather information see the Noonsite Weather Page
Main Ports


PageSpeed Configuration
Enabling the Module
PageSpeed contains an "output filter" plus several content handlers.
Note: The location of the configuration file is dependent both on the Linux distribution on which PageSpeed is installed and on whether you're using PageSpeed with Apache or Nginx.
In Apache the configuration file
is pagespeed.conf
and will be in either:
Debian/Ubuntu: /etc/apache2/mods-available/ CentOS/Fedora: /etc/httpd/conf.d/In Nginx the configuration typically should go in your
nginx.conf
which for source installs defaults to being in:
/usr/local/nginx/conf/
In Apache PageSpeed is enabled automatically when you install the module while
in Nginx you need to add several lines to your nginx.conf
. In
every server
block where PageSpeed is enabled add:
pagespeed on; # Needs to exist and be writable by nginx. Use tmpfs for best performance. pagespeed FileCachePath /var/ngx_pagespeed_cache; # Ensure requests for pagespeed optimized resources go to the pagespeed handler # and no extraneous headers get set. location ~ "\.pagespeed\.([a-z]\.)?[a-z]{2}\.[^.]{10}\.[^.]+" { add_header "" ""; } location ~ "^/pagespeed_static/" { } location ~ "^/ngx_pagespeed_beacon$" { }See the Admin Page documentation for instructions on how to configure handlers to provide visibility and control into PageSpeed's operation.
Turning the module on and off
Setting the module on
To turn PageSpeed on, just set:
- Apache:
ModPagespeed on
- Nginx:
pagespeed on;
Setting the module to standby
PageSpeed has a standby mode where by default it won't make changes to your site but it will process two kinds of PageSpeed-specific requests:
Requests with PageSpeed query parameters. These allow you to have PageSpeed off in your main configuration, but manually make requests to see how your site would look under various combinations of filters and options.
Requests for
.pagespeed.
resources. When PageSpeed is running it creates various kinds of optimized resources, and gives them names containing.pagespeed.
. If you turned PageSpeed fully off then lingering requests to these resorces would fail. In standby mode these requests are still served as if PageSpeed were enabled.
In versions 1.12 and earlier only mod_pagespeed supported standby mode, via
the off
setting:
- Apache:
ModPagespeed off
In versions <IP_ADDRESS> and later, both mod_pagespeed and ngx_pagespeed
support standby
:
- Apache:
ModPagespeed standby
- Nginx:
pagespeed standby;
Setting the module fully off
To turn PageSpeed fully off, set:- Apache:
ModPagespeed unplugged
- Nginx:
pagespeed unplugged;
Warning: do not set ngx_pagespeed
to unplugged
in <IP_ADDRESS> and earlier. That will result in
crashes. With those versions, use off
instead
of unplugged
.
The on
, off
, and (in <IP_ADDRESS> and
later) standby
values can be used in
.htaccess
files,
<Directory>
scopes, query parameters
, and
headers
. The unplugged
value can only be used in the
top-level Apache configuration and in virtual hosts. Note that
ModPagespeed on
in a virtual host can override a top-level
ModPagespeed unplugged
directive.
Apache-Specific Configuration
Setting up the Output Filter
The output filter is used to parse, optimize, and re-serialize HTML content that is generated elsewhere in the Apache server.
# Direct Apache to send all HTML output to the mod_pagespeed output handler. AddOutputFilterByType MOD_PAGESPEED_OUTPUT_FILTER text/html
Note: mod_pagespeed automatically enables
mod_deflate
for compression.
Support for Apache 2.4.x
mod_pagespeed
is compatible with Apache 2.2.x and Apache 2.4.x
series, versions 2.4.2 and newer. Please note that Apache 2.4.1 has a bug that
may cause stability problems in combination with mod_pagespeed
,
so use with 2.4.1 is strongly discouraged.
As Apache 2.4 is not API compatible with 2.2, support for it is provided
via a separate module binary, mod_pagespeed_ap24.so
instead of the
usual mod_pagespeed.so
. The configuration provided in our binary
packages will normally load the right module version automatically. However,
if you upgrade the CentOS packages from an earlier version, the needed
configuration change may not get applied on top of a user-customized
pagespeed.conf
, so you may need to adjust the
LoadModule
line manually.
Source builds with mod_pagespeed
-provided Apache headers will
build both 2.2.x and 2.4.x binaries as well, and you will need to add a
LoadModule
line matching the server version in use, or use
a pattern similar to:
<IfModule !mod_version.c> LoadModule version_module /usr/lib/apache2/modules/mod_version.so </IfModule> <IfVersion < 2.4> LoadModule pagespeed_module /usr/lib/apache2/modules/mod_pagespeed.so </IfVersion> <IfVersion >= 2.4.2> LoadModule pagespeed_module /usr/lib/apache2/modules/mod_pagespeed_ap24.so </IfVersion>to auto-detect. Builds against system Apache headers will only be compatible with that version family, and will always produce a single module named
mod_pagespeed.so
.
Honoring Content-Security-Policy Headers
As of <IP_ADDRESS> PageSpeed is able to adapt its optimizations according to any Content Security Policies specified in the response headers. In this release you need to opt-in into this feature, future releases may turn it on by default.
- Apache:
ModPagespeedHonorCsp on
- Nginx:
pagespeed HonorCsp on;
Respecting Vary Headers
In order to maximize the number of resources that PageSpeed can rewrite, by
default the module does not respect Vary: User-Agent
and
other Vary
headers on resource files, such as JavaScript and css
files. By disregarding the Vary
headers, PageSpeed is able to keep
the size of the cache down. PageSpeed will always respect Vary:
Accept-Encoding
, regardless of this setting. PageSpeed will
also always respect Vary
headers on HTML
files, regardless of this setting.
If a site has resources that legitimately vary on User-Agent
, or
on some other attribute, then in order to preserve that behavior, you must
add
- Apache:
ModPagespeedRespectVary on
- Nginx:
pagespeed RespectVary on;
to your configuration file.
Please note that turning on this option will disable optimization of any
resources with Vary
headers, apart from
Vary: Accept-Encoding
.
Honoring no-transform Cache-Control Headers
By default, PageSpeed does not rewrite resources that have
Cache-Control: no-transform
set in the Response Header. This is
true for all types of resources, such as JavaScript, images, CSS etc. By
respecting Cache-Control: no-transform
headers, PageSpeed cannot
optimize resources that could otherwise be rewritten.
To optimize resources irrespective of Cache-Control: no-transform
headers, you must add
- Apache:
ModPagespeedDisableRewriteOnNoTransform off
- Nginx:
pagespeed DisableRewriteOnNoTransform off;
to your configuration file.
Please note that PageSpeed will always respect
Cache-Control: no-transform
headers on HTML
files
irrespective of the setting. And also, PageSpeed will always retain the
Cache-Control: no-transform
headers on the resource irrespective of
the setting so that the downstream cache control mechanisms do not get affected.
Lower-casing HTML element and attribute names
HTML is case-insensitive, whereas XML and XHTML are not. Web performance Best Practices suggest using lowercase keywords, and PageSpeed can safely make that transformation in HTML documents.
In general, PageSpeed knows whether a document is HTML or not
via Content-Type
tags in HTTP headers, and DOCTYPE
.
However, many web sites have Content-Type: text/html
for resources
that are actually XML documents.
If PageSpeed lowercases keywords in XML pages, it can break the consumers of such pages, such as Flash. To be conservative and avoid breaking such pages, PageSpeed does not lowercase HTML element and attribute names by default. However, you can sometimes achieve a modest improvement in the size of compressed HTML by enabling this feature with:
- Apache:
ModPagespeedLowercaseHtmlNames on
- Nginx:
pagespeed LowercaseHtmlNames on;
These directives can be used in location-specific configuration sections.
Risks
This switch is only risky in the presence of XML files that are
incorrectly served with Content-type: text/html
.
Lower-casing XML element and attribute may affect whatever software is
reading the XML.
Preserving HTML caching headers
By default, PageSpeed serves all HTML with
Cache-Control: no-cache, max-age=0
because the transformations
made to the page may not be cacheable for extended periods of time.
If you want to force PageSpeed to leave the original HTML caching headers you can add:
- Apache:
ModPagespeedModifyCachingHeaders off
- Nginx:
pagespeed ModifyCachingHeaders off;
Note: We do not suggest you turn this option off. It breaks PageSpeed's caching assumptions and can lead to unoptimized HTML being served from a proxy caches set up in front of the server. If you do turn it off, we suggest that you do not set long caching headers to HTML or users may receive stale or unoptimized content.
Specifying the value for the PageSpeed header
By default, PageSpeed adds an header, X-Mod-Pagespeed
in
Apache, X-Page-Speed
in Nginx, with the version of PageSpeed
being used. The format of this header is:
[Major].[Minor].[Branch].[Point]-[Commit]
For example:
<IP_ADDRESS>-4448
We update these following this schedule:
- Major Version
- Incremented when we make very large changes.
- Minor Version
- Incremented for each release since the last major version
- Branch Number
- Incremented for every release. Always increasing.
- Point Number
- Incremented each time we build a new release candidate or patch release, resets on each minor release.
- Commit Number
- Incremented each time we accept a commit to the PSOL trunk. Always increasing.
All servers running a given release will have the same value for this header
by default. If you would like to change the value reported, you can use
the XHeaderValue
directive to specify what to use instead:
- Apache:
ModPagespeedXHeaderValue "Powered By mod_pagespeed"
- Nginx:
pagespeed XHeaderValue "Powered By ngx_pagespeed";
Note: You cannot suppress the injection of this header. This is because it is used to prevent infinite loops and unnecessary rewrites when PageSpeed fetches resources from an origin that also uses PageSpeed.
Location-Specific Configuration
With an .htaccess
file (Apache), <Directory>
scope (Apache), or location
block (Nginx) you can control most of
the PageSpeed directives. Note, however, that the
file-matching is only relevant to the HTML file, and not to any of the resources
referenced from the HTML file. To restrict resources by directory, you must use
the PageSpeed Allow
and Disallow
directives, using full paths or
wildcards in those directives.
Warning: Resources and the HTML files that reference them must have the same options. If they differ you may see poor performance and inconsistent application of options.
In Apache, the advantage of .htaccess
is that it can be used in
environments where the site administrator does not have access to the server
configuration. However, there is a significant per-request overhead from
processing .htaccess
files.
See The Apache
HTTP Server Documentation:
Note: You should avoid using .htaccess
files
completely if you have access to the httpd main server config file. Using
.htaccess
files slows down your Apache server. Any directive
that you can include in a .htaccess
file is better set in a
<Directory>
block, as
it will have the same effect with better performance.
Virtual hosts are generally a better way of configuring multiple sites on the same server.
 Options can be overridden
per host, including the ability the limit which hosts PageSpeed runs on.
Note:
When using Apache, it used to be possible to set InheritVHostConfig
to "off" to stop global configuration from propagating to VHosts. However,
enabling InheritVHostConfig
makes PageSpeed options behave like
other Apache options and has been the recommended configuration since 2012. The
option has now been deprecated and will be forced to "on" in the next major
PageSpeed release.
- Apache:
ModPagespeed On ModPagespeedInheritVHostConfig on ModPagespeedFileCachePath "/var/cache/mod_pagespeed/" ModPagespeedEnableFilters combine_css,combine_javascript # Direct Apache to send all HTML output to the mod_pagespeed # output handler.  This wastes bytes and can cause problems for sites that sit behind HTTPS terminators.
With PreserveUrlRelativity on
, PageSpeed will keep URLs the way
they were found. Some examples:
| Original URL | Rewritten URL |
|---|---|
foo/bar.png |
foo/bar.png.pagespeed.ic.Hash.png |
/bar.png |
/bar.png.pagespeed.ic.Hash.png |
//example.com/bar.png |
//example.com/bar.png.pagespeed.ic.Hash.png |
http://example.com/bar.png |
http://example.com/bar.png.pagespeed.ic.Hash.png |
To enable this option, add:
- Apache:
ModPagespeedPreserveUrlRelativity on
- Nginx:
pagespeed PreserveUrlRelativity on;
to your configuration file.
Note: This option will be enabled by default in future versions of PageSpeed and eventually the option will be removed entirely.
Configuring the location of static assets
Several filters, including defer_javascript and
lazyload_images, require external
resources that must be loaded from somewhere. Before <IP_ADDRESS>,
mod_pagespeed would load these files from /mod_pagespeed_static
while ngx_pagespeed would load them from /ngx_pagespeed_static
.
In <IP_ADDRESS> the default was changed to /pagespeed_static
for
both platforms and a directive was added to make the path configurable:
- Apache:
ModPagespeedStaticAssetPrefix /custom/static/
- Nginx:
pagespeed StaticAssetPrefix /custom/static/;
Configuring headers for optimized resources
When creating optimized .pagespeed.
resources, PageSpeed
generates headers that are correct for most users. However, some users
require additional headers. For instance if you're
using CORS
and you want to have PageSpeed set Access-Control-Allow-Origin:
http://www.example.com
headers on the resources it creates, you can
set:
- Apache:
ModPagespeedAddResourceHeader "Access-Control-Allow-Origin" "http://www.example.com"
- Nginx:
pagespeed AddResourceHeader "Access-Control-Allow-Origin" "http://www.example.com";
If you have multiple headers you want inserted you can include
an AddResourceHeader
directive for each one.
List outstanding urls on error
When debugging fetching, it can be useful to know how things are failing. If
you enable ListOutstandingUrlsOnError
then PageSpeed will report
a message in the error log at level "error"
for every URL fetch
in flight when the HTTP stack encounters a system error, e.g. "Connection
Refused". To enable this feature, set:
- Apache:
ModPagespeedListOutstandingUrlsOnError on
- Nginx:
pagespeed ListOutstandingUrlsOnError on;
Using PageSpeed as a reverse proxy
Typically, PageSpeed is used on an Apache or Nginx server that is already serving its own content. However, PageSpeed can be used with Nginx or Apache as a proxy for another server.
With Apache and mod_pagespeed, mod_proxy can be used to configure Apache as a reverse proxy.
With Nginx and ngx_pagespeed, proxy_pass can be used to configure Nginx as a reverse proxy.


Urdu Basic generated from template. This keyboard layout is designed for Urdu. It includes an on screen keyboard which can be viewed by clicking on the Keyman icon and selecting the On Screen Keyboard menu item. The keyboard layout follows the Windows 10 Urdu layout.
© 2008-2019 SIL International


Green Planet
All is well in GreenPlanet
Red Planet
Nothing to report in RedPlanet
Blue Planet
All systems A-Ok in BluePlanet


|
Scintillator
v0.0.1 at 1b5c195
Documentation specific to the C++-based scinsynth
|
#include <Instance.hpp>
Public Member Functions | |
| Instance (bool enableValidation) | |
| bool | create () |
| void | destroy () |
| VkInstance | get () |
Private Attributes | |
| bool | m_enableValidation |
| VkInstance | m_instance |
| VkDebugUtilsMessengerEXT | m_debugMessenger |
The Vulkan Instance, VkInstance, is the primary access to the Vulkan API. This class encapsulates the instance, manages creation and destruction. It also currently handles the validation layer setup and logging.
| bool scin::vk::Instance::create | ( | ) |
Attempts to create a Vulkan Instance, and set up Validation Layers, if configured.
| void scin::vk::Instance::destroy | ( | ) |
Destroys the Vulkan Instance.


Baillie Gifford Prize won by biography of Jack the Ripper victims
A biography of the victims of Jack the Ripper has won a major literary award.
Hallie Rubenhold’s The Five has been awarded the Baillie Gifford Prize for Non-Fiction, organisers announced on Tuesday.
The British historian takes home £50,00 for winning the award, with chair of judges and editor of The Times Literary Supplement Stig Abell describing The Five as “brilliantly written and “brilliantly researched”.
He added: “It’s a great story and it’s a great moral act, reclaiming the voice of these women.”
Rubenhold’s book examines the lives of the five women – Mary Ann “Polly” Nichols, Annie Chapman, Elizabeth Stride, Catherine Eddowes and Mary Jane Kelly – considered the “canonical” victims of the serial killer.
Rubenhold said she wanted to untangle the “web of assumptions, rumour and unfounded speculation” surrounding the women, who were all murdered by in London in 1888.
She found there was no evidence that three of the women were sex workers, despite the widely held belief the ripper targeted prostitutes.
“These were ordinary people, like you and I, who happened to fall upon hard times,” the winning author said.
“There’s so much in their stories that we can take away that tells us about how we live today: everything from homelessness to addiction to domestic violence. And people become victims because society doesn’t care about them.”
Rubenhold is the seventh woman to win the Baillie Gifford Prize, formerly the Samuel Johnson Prize, since it began in 1999.
The other shortlisted books were Casey Cep’s Furious Hours: Murder, Fraud, And The Last Trial Of Harper Lee, Laura Cumming’s On Chapel Sands, William Feaver’s The Lives Of Lucian Freud: Youth, Julia Lovell’s Maoism: A Global History and Azadeh Moaveni’s Guest House For Young Widows.


{% comment %} ------------------------------------------ Dependencies This template depends on: include.startYear // Int. Four digit year include.timelineHeight // Int. Pixel count include.col1Title include.col1Events: [ // Array of objects with the following fields. Can use _data/foo.yml or front matter to specify { name: String to: Date from: Date description: String? } ] {% endcomment %} {% comment %} ------------------------------------------ Calculate an array of years for display -- {% endcomment %} {% assign endYear = site.time | date: '%Y' %} {% assign yearString = "" %} {% for y in (include.startYear..endYear) %} {% assign yearString = yearString | append: y | append: ',' %} {% endfor %} {% assign years = yearString | split: ',' | reverse %} {% comment %} ------------------------------------------ Calculate pixel sizes for quantities of time use a float to get non-rounded output from `divided_by`: https://shopify.github.io/liquid/filters/divided_by/ {% endcomment %} {% assign yearCountAsFloat = years.size | times: 1.0 %} {% comment %} {% endcomment %} {% assign yearHeight = include.timelineHeight | divided_by: yearCountAsFloat %} {% assign monthHeight = yearHeight | divided_by: 12.0 %}


Parents of children who have disabilities, or medical conditions that sometimes requure emergency support Frequently need to consider the college search problem from a different angle. The need to consider all colleges that are one flight away from the parents home city. This way, they can have the comfort of knowing that they can quickly fly to the college town for support Or they can quickly have the child fly back to the parents city for support. Realistically, this should be limited to those flights where you can get news of an emergenancy for the majority of the day, but still find a flight to the city the same day. (i.e. it is obvious that even tho you can get a direct flight from LA to NY, they are not convenient to reach in the same day, because all of the flights leave before noon. Another way to put this challenge. "I want to send my type I diabetic child to a college where if I find out that he has b een hospitalized at 11:30 am, I can be in the hospital with him that night"


--- layout: page title: "Contact" description: "A Teamwork makes a dream work." header-img: "img/contact.jpg" ---
Billions of websites and you are here ?
It's a sign of fate, contact me.
No really, if we share the same interests, let's get in touch !


-
Malware: A Look Into Fake Cryptoware
Ransomware has been picking up what seems to be a lot of attention within the past couple of months, with some adversaries even getting payment from some corporations. During my normal routines I’ve come across a fair amount of variants from Cryptowall, Teslacrypt, Locky, etc. I can now say that I’ve had a chance to look at fake ransomware, and honestly, I have a hard time determining if it’s an amazing idea or just so basic that adversaries lacking experience are able to pull it off. …
-
WMI: Queries For Incident Response
Windows Management Instrumentation, WMI, is a very powerful tool when it comes to doing incident response or general investigations related to Windows events. …
-
Netsh: Native Windows Packet Capture
At some point, you may find yourself in the same shoes I was in and think to yourself “Is it possible to acquire a packet capture on a Windows machine using native tools?”. It’s not very common that the average end-user is going to have items like Tshark or Tcpdump installed on their box to work with from the command line. So, if you aren’t collecting the neccessary packets through a centralized aggregater and would like to have minimal disturbence on the target machine, what can you do? …
-
JavaScript: Deobfuscate With Just A Print Function
As an incident responder who deals with a lot of exploit kit related events, packet captures are invaluable. If you’re in the same boat, I hope you have pcaps for what triggered the alert, as well as some time on your hands to follow the trail back to the original source and start breaking down what occurred. It’s not uncommon for there to be multiple redirects to the exploit kit landing page, and once the source of the activity is located, you’ll probably be greeted with some nice obfuscated code. …
-
Python: Wireless Sniffing With Scapy
Before we dive into it, I’d first like to take a momemnt to make sure whomever follows this tutorial has the correct components installed. I will be performing this on an Ubuntu system, but really, any platform should be able to be used, you’ll just have to follow the recommended intallation steps for your operating system. …


Full Stack Web Developer leveraging business management skills to ensure efficiency in mobile-first design and innovative web development.
My education background consists of Bachelor’s degree in Business Management from South Ural State University in Russia, Master’s degree in Professional Marketing Communication from Clark University in Massachusetts, and a certificate in Full Stack Development from Georgia Tech University with hands-on experience in JavaScript, Responsive Web Design, Node.js as well as C#.
Over five years of international experience in hospitality management has prepared me for open and clear communication to benefit teamwork and promote customer-focused perspectives on user’s interaction with websites and software platforms. Additionally, two years in social media assistant role has equipped me with a solid understanding of content management and marketing initiatives proven by received Rising Star Award recognizing significant company’s growth influenced by an excellent social media strategy.
With my passion for programming challenges coupled with a commitment to ensuring business success I am positioned well to contribute to the growth of a fast-paced, quality-driven tech team in order to build better experiences on the web.


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <dumbnet.h>
#include <uthash/uthash.h>
Go to the source code of this file.
Data Structures | |
| struct | _node |
| struct | _ip_node |
Functions | |
| char * | truncation (char *, int) |
| Truncate the given char ip. | |
| char * | black_marker (char *, int) |
| Black marker, anonymize the entire field or just part of it. | |
| void | swap (char *, int, int) |
| char * | random_permutation () |
| struct ip_table * | new_table () |
| struct addr * | ipv4_coherently_anon (struct addr ip, struct node *) |
| struct addr * | ipv4_black_marker (struct addr, int) |
| struct addr * | ipv4_field_rotation (struct addr, int) |
| unsigned long int | new_unique_ip (struct node *head) |
| struct node * | new_ip_list () |
| void | put_on_top (struct node *head, struct node *current, struct node *last) |
| unsigned int * | loganon_black_marker (unsigned int ip, int octet_number) |
| Anonymize the entire field or just part of it. | |
| struct ip_node * | loganon_hash_table () |
| Creates new hash table. This is the handler for all ip_anon anonymization functions. | |
| int | add_to_hash (unsigned long int key, unsigned long int newValue) |
| struct ip_node * | loganon_new_hash_node (struct ip_node *, unsigned long int key, unsigned long int newValue, struct ip_node *) |
| Return a new hash node or the node foundend in hash table. | |
| unsigned long int | loganon_ipv4_hash_anon (struct ip_node *hash_table, unsigned long int old_ip) |
| Return a new random ip, or an already used ip on anonymization proccess. | |
| void | loganon_destruct_hash (struct ip_node *hash_table) |
| Free all memory ocupied by hash table. |
| int add_to_hash | ( | unsigned long int | key, | |
| unsigned long int | newValue | |||
| ) |
| char* black_marker | ( | char * | ip, | |
| int | octet_number | |||
| ) |
Black marker, anonymize the entire field or just part of it.
| Ip | in string format | |
| number | of octets |
| struct addr* ipv4_black_marker | ( | struct | addr, | |
| int | ||||
| ) | [read] |
| struct addr* ipv4_coherently_anon | ( | struct addr | ip, | |
| struct node * | ||||
| ) | [read] |
| struct addr* ipv4_field_rotation | ( | struct | addr, | |
| int | ||||
| ) | [read] |
| unsigned int* loganon_black_marker | ( | unsigned int | ip, | |
| int | octet_number | |||
| ) |
Anonymize the entire field or just part of it.
| unsigned | int ip - Ip for black mark | |
| octet_number | - Number of octets to mark |
| void loganon_destruct_hash | ( | struct ip_node * | hash_table | ) |
Free all memory ocupied by hash table.
| The | hash_table head node |
| struct ip_node* loganon_hash_table | ( | ) | [read] |
Creates new hash table. This is the handler for all ip_anon anonymization functions.
| unsigned long int loganon_ipv4_hash_anon | ( | struct ip_node * | hash_table, | |
| unsigned long int | ind | |||
| ) |
Return a new random ip, or an already used ip on anonymization proccess.
| A | utHash table, network format ip |
| struct ip_node* loganon_new_hash_node | ( | struct ip_node * | , | |
| unsigned long int | key, | |||
| unsigned long int | newValue, | |||
| struct ip_node * | ||||
| ) | [read] |
Return a new hash node or the node foundend in hash table.
| struct node* new_ip_list | ( | ) | [read] |
| struct ip_table* new_table | ( | ) | [read] |
| unsigned long int new_unique_ip | ( | struct node * | head | ) |
| void put_on_top | ( | struct node * | head, | |
| struct node * | current, | |||
| struct node * | last | |||
| ) |
| char* random_permutation | ( | ) |
| void swap | ( | char * | , | |
| int | , | |||
| int | ||||
| ) |
| char* truncation | ( | char * | ip, | |
| int | newLen | |||
| ) |
Truncate the given char ip.
| ip | in string format | |
| the | new len of string |


The goal of this lab is to make the robot to follow the line and traverse in a figure 8. The robot is controlled using the reading from line sensor in order to make decisions regarding following lines and turning. We first created a simpler iteration that followed straight lines, and after a successful implementation we modified the code so the robot could follow turns, and ultimately traverse the figure 8.
 Two line sensors are in the middle and two line sensors are on the outer side. For this part, we only need the middle ones for controlling the robot. The middle line sensors are on top of a white tape for following the straight line and making corrections. If either of them detects a value above the white tape threshold value, it means that the the robot is leaning towards one side. In this situation, the robot will make a slight correction by slowing one of the servo by how much the robot is out of bound. The magnitude of how much the robot is out of bound is determined by the difference between the right middle sensor and the left middle sensor.
This piece of code is placed in the function go_straight() for future use.
The robot traverses the 8 by making a total of 8 turns, 4 left and 4 right. In the very beginning of the program, we wait for one second to start the program and have the robot go straight. Then it will loop in the turns forever. This part is demonstrated in the main function. The delay function is added for buffering, it is not a timing constraint for robot control.
while(i <4){ move(left); i++; } while(i < 8){ move(right); i++; if (i == 7){ i = 0; } }
The move method takes in one parameter, direction of type int. If the robot is requested to turn, the robot will begin to turn and stops turning only when both middle sensors detects a white line. However, we can only implement this stop detection method after the middle two sensors are off the white line. This is implemented by forcing the robot to turn without stop detection for th first 0.3 seconds. This delay time is experimentally determined. It is possible to further improve the accuracy of this by first setting a while loop for an off-white line detection, which allows the robot to turn no matter how wide the white tape is, how narrow the angle is or how fast the robot goes. However, this would be unnecessary for this milestone because the white taped line is always the same width and the turn degree is wide enough for a timing approximation.
if (direction != forward){ left_servo.write(servo_turn_value[direction]); right_servo.write(servo_turn_value[direction]); delay(300); //force turn over line while(1){ read_pid(); if (left_pid_val < WHITE && right_pid_val < WHITE){ break; //found white line } } //end while, done turning }
Once the robot is done turning, it will start to go in a straight line until it finds the next intersection. The finding intersection condition is used as the while loop condition, which breaks when both of the outer sensors are out of the dark area. After it finds the intersection, it goes on to execute the next function in the main loop.
//look for intersection while(1){ read_turn(); if (left_turn_val < WHITE && right_turn_val < WHITE){ break; //both turn sensors are on white line } go_straight(); delay(50); }//close while; found intersection
void loop() { Serial.println("hi"); move(left); delay(50); move(left); delay(50); move(left); delay(50); move(left); delay(50); move(right); delay(50); move(right); delay(50); move(right); delay(50); move(right); delay(50); }
The move method takes in one parameter, direction of type int. Our original design was that if the robot is requested to turn, the robot will begin to turn and stops turning only when both middle sensors detects a white line. However, we ran out of analog sensors. When trying to set up the digital lines sensors, we figured they have different responses (50 for white and 130 for black; 1800 for white and 2700 for black). One of the error range was too small. While it can still be implemented, I am not as confident in using a sensor with such a small detecting range.
From there I resovled to a different method: using only two line sensors that are just right by the edge of the line. When both sensors detect a white, that means it encounters a horizontla line and therefore should make a turn.
//look for intersection while(1){ Serial.println("looking"); read_turn(); if (left_turn_val < WHITE && right_turn_val < WHITE){ i = 0; Serial.println("found intersection"); while(i < 30){ go_straight(); i++; } Serial.println("delay"); break; //both turn sensors are on white line } go_straight(); delay(10); }//close while; found intersection
However, since we don't have the middle sensors to detect when the robot is on the white line again, we wouldn't know when to stop. To solve this, we don't make the robot turn immediately. Instead, the robot will travel a little bit further straght after it detects a white by using a counter for delaying. The delay function could not be used because the robot need to still be doing straight line correction. Then, the robot will begin to turn. For each direction, the respective inner sensor will detect a dark first and then the white line the robot needs to be on, and then after it go over the line the robot can travel straight again with straght line correction.
while(analogRead(right_turn) > WHITE); while(analogRead(right_turn) < WHITE); Serial.println("done turn left");
The Milestone 1 Work Distribution is as follows:
- On 9/7, Joyce, Nathalia, Priya, and Vini worked on in lab rebuild the robot.
- On 9/10, Joyce, Nathalia, and Vini worked on rebuilding the robot and started the code.
- On 9/10, Nathalia went to open office hours and finished rebuilding the robot.
- On 9/14, Joyce, Nathalia, Priya, and Vini worked on in lab to complete the milestone.
- Joyce completed the final finish of the figure 8 using line sensor and turning capabilities.
The Lab Report Work Distribution is as follows:
- Joyce: Introduction and Code Explanations
- Priya: Code Section Write Up Drafts
- Nathalia: Pictures and Videos
The website work distribution is as follows:
- Nathalia: Website Milestone 1 Set Up and Maintenance


DataNucleus Access Platform is an open source java persistence system, fully implementing and fully-compliant with all JDO, JPA, Jakarta specifications. It supports persistence to many types of datastores including RDBMS, ODBMS, XML, Excel/ODF, JSON, BigTable. This project is DataNucleus "core" providing the persistence framework used by all DataNucleus sub-projects (plugins). It includes transaction handling, logging, and management of datastores, together with the basis for JDOQL/JPQL querying.
Support for this persistence layer is provided by way of a free support on groups.io / Gitter or via Commercial Support from DataNucleus.


maxWidth
breakWords
WordWrap.Builder.insertHyphens(boolean)
stringWidth
Writer
Copyright © 2018. All rights reserved.


10 Things that you might want to try eating
Rust, Tennis ball fuzz and Castor oil????
Written by Erarrat
fingernails are a great source of
keratin
vitamin B, C, and K
and also increases your fertility rate by 20%
Click here to read more!


Turkish
Madonna in a Fur Coat:
This romantic novel is considered the exception to Ali’s otherwise Socialist-Realist fiction, though the criticism of Raif’s relatives’ shallow greed may reflect a Marxist outlook. The word efendi, which means master, lord, or sir, and can also refer to rural land or urban factory owners (Raif’s father, the elder Efendi, is both) has elitist connotations that fit Raif’s class origin as well as his refined taste and sensibilities. And yet he endures verbal abuse at home and at work with humility continuing a pattern that began in childhood. Genre : Novel
A Mind at Peace:
The novel begins in Istanbul the morning of the declaration of World War II and ends with the same announcement, framing the story while we learn about several characters whose lives are marked by events that test their existence and define what it is to be human. A Mind at Peace centers on the life of a man named Mümtaz whose life is surrounded by these characters in a deeply moving portrait as he grows from a child to a young man. Genre : Fiction


A set of functions for two-dimensional sociometric status determination with rating scales. For each person assessed, SSrat computes probability distributions of the total scores for ‘Sympathy’ (S), ‘Antipathy’ (A), social ‘Preference’ (P) and social ‘Impact’ (I), and applies a set of criteria for sociometric status categorization.
| Version: | 1.1 |
| Depends: | plyr, sna |
| Published: | 2018-04-03 |
| Author: | Hans Landsheer |
| Maintainer: | Hans Landsheer <j.a.landsheer at uu.nl> |
| License: | GPL-2 |
| NeedsCompilation: | no |
| CRAN checks: | SSrat results |
| Reference manual: | SSrat.pdf |
| Package source: | SSrat_1.1.tar.gz |
| Windows binaries: | r-devel: SSrat_1.1.zip, r-release: SSrat_1.1.zip, r-oldrel: SSrat_1.1.zip |
| OS X binaries: | r-release: SSrat_1.1.tgz, r-oldrel: SSrat_1.1.tgz |
| Old sources: | SSrat archive |
Please use the canonical form https://CRAN.R-project.org/package=SSrat to link to this page.


At ANSi, we believe businesses should not be run on guesses and that is why we provide data and analyses for micro, small, medium, corporate and government enterprises for making business and financial decisions. Our team comprises of experienced and competent professionals with energy, enthusiasm and courage to lead and deliver quality services to our clients at all times. We are committed to leaving marks of honour and integrity on every project and venture we undertake.
We understand the challenges face by entrepreneurs in kick-starting businesses and we have developed industry specific services to serve as springboard for start-ups.
Innovation is the bedrock of success in every organisation. At ANSi, we offer numerous unequivocal business services that stands our clients out in their industries.
"This is fantastic! Thanks so much guys!"
"Oh! Great. Such a good business idea."
"Thanks so much for making these free resources available to us!"


2020 DSDH Syllabus and Assignments
Assignments by week number (lesson number).
Lesson 1: Data Science in Healthcare
View Lecture 1: Data Science in Healthcare
Post to Discussion Board: Describe the similarities and differences between Artificial Intelligence, Machine Learning, and Analytics. Use each term in a sentence.
Reading:
- Required: Healthcare Analytics Made Simple, Chapter 1 “Introduction to Healthcare Analytics”
- Suggested: Natural Language Processing in Action, Chapter 1 “Packets of Thought (NLP Overview)”
- Suggested: Jupyter Notebook Tutorial by Karlijn Willems: bit.ly/ucsd-jup
Lesson 2: Spreadsheet Data Science
View Lecture 2: Spreadsheet Data Science
Post to Discussion Board: Give one example of a machine learning model type and the kind of problem it might be used for (hint: p. 53, 54 and 57 describe 3 model types).
Reading:
- Required: Healthcare Analytics Made Simple, Chapter 3 “Machine Learning Foundations”
- Suggested: The Book of Why: The New Science of Cause and Effect – Chapter 3 “From Evidence to Causes”
- Suggested: Simple Linear Regression by Jason Brownlee: bit.ly/ucsd-sheet
Lesson 3: Statistics & Privacy
View Lecture 3: Statistics & Privacy
Post to Discussion Board:
Reading
- Required: Introduction to Healthcare Analytics, Chapter 3 “Machine Learning Foundations”
- Required: Veritasium YouTube Explanation of Bayes Rule using Common Sense: bit.ly/ucsd-bayes
- Suggested: Natural Language Processing in Action, Chapter 2 “Build Your Vocabulary (tokenization)”
- Suggested: Statistical Thinking in Python, DataCamp tutorial: bit.ly/ucsd-eda
Lesson 4: Clinical Data Science & Machine Learning
View Lecture 4: Clinical Data Science & Machine Learning
Post to Discussion Board: Share the challenges you had in building a machine learning model to predict diabetes prediction models. Can you think of any ways to improve its accuracy?
Reading:
- Required: Introduction to Healthcare Analytics, Chapter 7: “Making Predictive Models in Healthcare”
- Suggested: “AI outperforms doctors diagnosing breast cancer,”" BBC News: bit.ly/ucsd-bc
- Suggested: Natural Language Processing in Action, Chapter 3 “Math with Words (TF-IDF vectors)”
Lesson 5: Deep Learning & Computer Vision
View Lecture 5: Deep Learning & Computer Vision
Post to Discussion Board: Which features were most helpful when creating a deep learning model on the deep learning playground? How many total neurons and layers did you need to achieve high accuracy on the spiral classification problem? If you used more features were you able to reduce the number of neurons required to fit to the spiral data well?
Reading:
- Required:Introduction to Healthcare Analytics, Chapter 9: “The Future – Healthcare and Emerging Technologies”
- Suggested: Natural Language Processing in Action, Lane et al – Chapter 5 “Baby Steps with Neural Networks”
- Suggested: “Artificial intelligence in healthcare: past, present and future” Jiang et al: (bit.ly/ucsd-ai-survey)[https://bit.ly/ucsd-ai-survey]
- Suggested: View 8 minutes of Thinking Tools, 56:44 to 1:04:00 by Daniel Dennet
Lesson 6: Natural Language Processing
View Lecture 6: Natural Language Processing
Post to ucsd.qary.me: Ask TA Bot 5 questions about Data Science, Machine Learning, Python, or Digital Health: ucsd.qary.me. Try to think of questions that a healthcare practitioner would have and questions that cannot be answered using a search engine like Duck Duck Go.
Quiz: Describe some unstructured datasets you’ve seen that Natural Language Processing could help with.
Reading:
- Required: NLP & Healthcare: Understanding the Language of Medicine
- Suggested: Natural Language Processing in Action by Lane et al – Chapter 7 “Getting words in order with convolutional neural networks (CNNs)”
- Suggested: Natural Language Processing in Action by Lane et al – Chapter 8 “Loopy (recurrent) neural networks (RNNs)”
View Lecture 7: Bioinformatics & Genomics
Post to Discussion Board:
Reading & Viewing:
- Required: Biopython Tutorial and Cookbook Chapter 1: Introduction
- Required: Biopython Tutorial and Cookbook Chapter 2: Quick Start
- Suggested: View “Introduction to Genetics and Genomics” by Chris Keown
- Intuition Pumps and Other Tools for Thinking by Daniel Dennet p. 185-217 (pumps 33-37 Tools about Evolution)
- en.wikipedia.org/wiki/Darwin’s Dangerous Idea by Daniel Dennet, summarized on Wikipedia
Lesson 8: Assistive Technology, Ethics
View Lecture 8: Assistive Technology, Ethics
Post to Discussion Board:
Reading:
- Suggested: The Book of Why: The New Science of Cause and Effect – Chapter 7 “Beyond Adjustment”
Lesson 9: Healthcare Systems Modeling
View Lecture 9: Healthcare Systems Modeling
Post to Discussion Board:
Exercise 9: Predict excess readmission rate
Reading:
- Suggested: Data Science for Healthcare: Methodologies and Applications – p. 347-365 “Leveraging Financial Analytics..”
- Suggested: “Modeling Organizational Deerminant of Hospital Mortality”, Al-Haider and Wan 1991, bit.ly/ucsd-hosp1991
- Suggested: Biomedical Informatics, Shortliffe et al – Ch 12 “EHR”
Lesson 10: Public Health & Epidemiology
View Lecture 10: Public Health & Epidemiology
Post to Discussion Board:
Reading:
- Suggested: The Book of Why: The New Science of Cause and Effect – Chapter 5 “The Smoke-Filled Debate”
- Suggested: Biomedical Informatics, Shortliffe – Ch 15 “Pub Health”


Thanks for checking out my portfolio
Find Out MoreI am a Web Developer professional who thrives in creative and collaborative team environments. I am always looking to learn new technologies my passion is finding and providing business solutions through digital media.
Outside coding I enjoy spending time with my wife and tackling new home projects, automotive projects, and freelance video production.
I am always looking for new challenges and ways to improve and ways to expand my skillset.
PortfolioI look forward to discussing opportunities with you. Text, Call, or Email anytime.


Giant Boo
| Fighting Style | ||
| When Dieing Do they run | no | |
| Ranged Attack | no | |
| AOE Area of Attack | no | |
| Spawns lesser monsters | yes |
Giant Boo Pronounced g-eye-ant boo
Boos are large flowers that walk around on their small roots. The pistil of the flower is the
Boo's body, and the petals frame the base like a little tutu. Their arms are the long stamens that hang high over
their bodies. What looks like a fly trap on the top of the pistil, is really the Boo's mouth. They look like
zombie plants if you look close enough and vary colors from yellow and red, to yellow and green.
Locating Giant Boo
Boos can be found in the swamps of Central Darkon 3 near the Altar of Billposter.
| Giant Boo |
Available
that involve this masquerpet
Anesthetic Needs
Required Level : 72~77 Required Job : Second Class/Master Objective : Kill Boo and collect 50 Boopoisons Location : Arians south of Altar of Billposter
| Boopoison 50x |
Reward : 20% exp at level 72 and 216,000 Penya
Giant Boo Statistics
| Name | lvl | HP | Def | Mdef | Exp | Atk | Ele |
| Giant Boo | 77 | 564,573 | 101 | 112 | 239,109 | 1,568~1,650 |
Note: Atk stat comes from kFlyff and may differ from our version.
Drops
Boopoison Icecream Cake Food item for recovering HP. Meat Salad Food item for recovering HP. Eighth Refresher Food item for recovering MP. VitalDrink 800 Food item for recovering MP. Sunstone Enchanting item for General upgrading. Penya In game currency. Katria/Kanarin Set pieces Oska/Okas Set pieces Ropang/Roshel Set pieces Myuran/Myurian Set pieces Alext/Ales Set pieces Pact/Paxt Set pieces Einy/Akan Set pieces Warpon/Warspon Set pieces
Trivia


Recruitment
The recruitment component of PASS seeks to promote awareness of access to higher education. PASS aims to spread knowledge and share experiences by encouraging our future leaders to pursue higher education.
The recruitment component of PASS seeks to promote awareness of access to higher education. PASS aims to spread knowledge and share experiences by encouraging our future leaders to pursue higher education.


August 28th, 2019 - Lab 1 / first class
This is a warm up lab that will help set the stage for the platforms we'll use for the rest of the semester.
- Create a Slack account and join two slack channels
- IST 402
- Slack Invite
- We'll use this as the primary working space / link sharing / communication space for the course
- ELMS: Learning Network -
Slack Invite
- Me and my band of nuts are available to you. If you want to get more involved in this space beyond what we'll experience in class or have questions about the education or web industry, the door is always open
- There's developers and educational professionals from multiple universities there, IST and otherwise.
- Think up a brand / identity / persona for your online identity as an IT professional
- What does your brand feel like?
- Great Explainer? Hero's Journey? Future CIO?
- Pick a name that you can attempt to use across "all platforms"
- Domain name, Github, Twitter, LinkedIn, YouTube
- Note: You MAY want to divorce this from your real persona / personal accounts. Everyone does it differently in industry; many merge, there are risks associated with that. I fragment on YouTube but generally keep all mine unified.
- Because we haven't started a blog yet (but let's get in the swing of doing a write up and a video), write up a paragraph describing your brand in Word/Docs
- Register this account on Github, Twitter, LinkedIn, YouTube
- Be sure to set the username to be the same across them
- Create a Playlist on YouTube called "Clarissa explains it all", replacing Clarissa with your persona
- Create a screencast that's 3 - 5 minutes long that includes the following:
- Pick a screencasting solution from the Screencasting resources area
- introducing your channel from a technology professional context
- Showing your favorite tech blog / anything you've read and enjoy learning from online currently. Talk about an article on the blog while it's being shown in order to practice the explainer concept.
- End with what piece of technology you'd like to learn more about how it works from the topics in the survey
- Post a link to this video on your social accounts (Twitter / LinkedIn) with some setup to try and draw people to it using 3 hashtags.
- Use the IST402 Slack directly
and upload your Word/Doc file to the channel named #lab-1-brand-management.
Make sure to include a link to your YouTube Channel and Video post in the bottom of your "blog" post
- Extra if you'd like
- If you @btopro on twitter I'll RT to increase reach
- @EdTechJoker is an account that will post into the "Socialmedia" channel in our slack channel. You're welcome to use this for social reach / to try it out as well


Smooth Journey: Flight selection UX
Problem
As a frequent flier, I’ve purchased flights from many different airlines — all with a different user experience ranging from frustrating to fantastic. To make it more complicated, I often switch from mobile to desktop and so forth when researching flight details. Different UIs have frustrated me and I wanted a fluid web experience as
most people who book travel on mobile book through web.
Research
To better understand the flight booking process, I conducted competitor analysis with 5 airlines (WOW Air, Norwegian, Delta, Virgin, and Porter) and 3 flight booking websites (Google Flights, Kayak, Skyscanner). I went through the process of booking flights looking for pain points in the process and areas for improvement.
An example of a common flight booking UI
Through my research, I learned of the importance of information and relevant information to users.  I also learned about the importance of buttons like drop down menus, radio buttons, and optimal button designs for user experience. Consistent design and familiar interaction patterns help create a more efficient and enjoyable experience! Combining some of the best elements of different airline websites I used, I created my own responsive web flight selection process.
Design
My priority in creating this design was minimizing cognitive load for users. I narrowed down relevant information after consulting with users to what is displayed on the screen now. Users expressed that their informational priorities were dates, flight times (including layover times), and prices.
Booking departure and returning flight
Typography is central to the design of this website because it is predominately text-based. I went with the Lato family of fonts in black for their visual clarity, and modern curvature. I also used Material Design icons to convey and reiterate important concepts like departure and landing times.
I used negative space as a contrast to colour in order to demonstrate relevant information like flight times. Colour was used to denote things of secondary importance such as pre-selected information and buttons. Tempered hues of blue were used as a way to create a friendly yet professional personality through colour.
Confirmation for departure and returning flights
Reflection
This was my first project in looking at visual identity and clarity through responsive web UX. Aiming for pixel perfection isn’t just an artist’s job — it’s how designers can help users understand the journey through a product. Try out the
interactive prototype for yourself!
Thank you for reading!


About Me
I work as a decision scientist at Musigma Inc., the world's largest pure-play analytics company. I studied computer science and engineering at Vel Tech Institute of Science and Technology, where I received my bachelors degree.
Analytics Projects
Research Papers
Certifications
Awards
Overview
Summary
Decision Scientist with 1+ years of experience designing and developing analytical and statistical solutions for Fotune 500 clients - Starting from defining the problem to delivering the final consumption framework.
Education
Bachelor of Technology
2015 - 2019
Veltech Dr. RR & SR Technical University, Chennai
Majored in Computer Science and Engineering. GPA 9.26/10.00
Data Structures and Algorithms Specialization
Senior Secondary Certification
2011 - 2014
City Montessori School, Lucknow, India
Indian Certificate of Secondary Education(ICSE)
XII - 86% | X - 92%
Professional Experience
Decision Scientist
July 2019 - Present
Mu Sigma Inc., Bangalore, India
- Understanding client’s business requirements to define problems; create end-to-end data driven solutions, generate insights and present it to the Business & Analytics teams of customers
- Implemented advanced predictive models(Regression & Classification) using Python/Py Spark for analysis, SQL for data management; PowerBI /Tableau for dash boarding
- Designing optimization techniques and building solutions for $12M+ portfolio
- Deploy and track machine learning models in a production enviroment
Projects
As a decision scientist, I have worked on some of the highly statsitical and impactful modeling projects. A few of them are briefly outlined below.
Merchandising Planning and Optimization
Russian Petcare Manufacturer
- Increased merchandizing efficiency by creating optimized merch visit plans to maximize sales uplift and ROI
- Clustered stores based on various factors and estimated the impact of visits after isolating the effect of seasonality and promotions
- Identified the most optimal plan for 40k outlets given a certain budget and maximizing either NSV or ROI based on business requirement
- Built a reporting and optimization tool using PowerApps and PowerBI which allows user to build optimized merchandising plans, report results and execute the plan on the field.
- Impact of ~3% incremental sales uplift(+$6.2MM) and sales force expenditure reduced by 24%($0.5MM) – and savings of 960 hours/quarter effort
Marketing Mix Model and Prioritization Engine
Energy Bar Manufacturer
- Created a marketing mix/driver model for attribution of sales uplift to different marketing levers like price promotions, social media, TV advertisements, In-Store sampling, features and displays with MAPE less than 20% using ElasticNet regression
- Designed an optimizer to create the best marketing plan which takes into account the investement associated with each promotion channel and provides recommended investement across each channel to maximize ROI over the limited budget available for promotions
- Built a prioritization engine which recommends the stores and regions sales reps need to focus on for maximum uplifts, reducing $390k in in-store sampling investments and increasing sales uplift by 7%
Commercial MARIO Reporting
Russian CPG Manufacturer
- Built and automated the creation of business data mart – which was the single source of data to upsurge reporting of SAP Atlas based reporting metrics for all manufacturing plants across Russia
- Implemented a data quality management layer to the harmonized data source to improve the quality and scope of data driven decisions; that was subsequently leveraged to refresh 20+ dashboards relying on SAP Atlas data - resulting in 80% man-hours savings
- Designed and developed user friendly flexible and interactive PowerBI Dashboards to track and assess the performance of supplier contracts across Vendors/Materials/Plants
Machine Learning Research
I have been fortunate enough to publish multiple research papers. Some of them are highlighted below.
Optimizing Stock market prediction using LSTM networks
This paper proposes using a LSTM and auto-encoder based deep learning model to predict stock market price. The idea is to forecast stock prices and allocate stocks to maximize the profit within the risk factor range of the stock buyers and sellers. A YouTube video with a detailed explanation and presentation can be found here.
Social Media Data Analysis: Twitter Sentimental Analysis
This paper talks about sentiment analysis of tweets on the Barcelona terror attacks and observe, examine and analyze how people criticize a situation either by expressing their aggression against terrorist or supporting the victims. The tool used is R - a statistical modeling program.
Feature Selection Effects on Classification Algorithms
This paper compares the effect of Feature selection on various Classification algorithms. The vitality and vulnerability of K Nearest Neighbor, Naive Bayes and Support Vector Machines is examined. Guidelines to perform feature selection on categorical dataset is also explained laconically.
Ganesh Kalyanasundaram
Strategic Consultant
Sonal Singh I can recommend as a person with great proficiency and deep experience of solutions. Sonal is a self motivated and wise person but also an inspiring perfectionist. Creative strategist with great interpersonal skills. She is an honest team player. If you ever need someone to deliver under pressure, no slip-ups, just results, Sonal is your go-to person!
Syed Misbah
Data Scientist
Sonal is a rare combination of brains and diligence. Smart, dedicated and has a highly analytical bent of mind. Approaches every problem with crystal clear clarity. Sonal has been a pivotal member of some of the biggest analytical projects in Mu Sigma. Her background as a machine learning researcher gives her an added advantage.
Shubham Lahoti
Decision Scientist
Sonal is a very dedicated and hard working person, who aims at perfection in whatever she does. She has a great ability to grasp and understand critical concepts quickly and apply them in solving business problems. Apart from her problem solving skills, she has got a great oratory prowess, which helps her put her thoughts across very clearly. Having worked with her in a project for a brief period of time, I have closely seen her multitasking, yet excelling at whatever she does, which is a rare quality. I would highly recommend Sonal
And a little bit about me!
Here are a few things that you might be interested to know about me.
MBTI
My Myers-Briggs Type Indicator(MBTI) is ISTJ [Introverted Sensing Thinking Judging]. The favorite people I supposedly share my personality type with are Queen Elizabeth, Warren Buffet and Satyajit Ray.
Quora
I write on Quora whenever I feel like I have something new to add, usually about India, life, code and education. Although I am not usually active these days because of work pressure.
Kathak
I am a trained Kathak dancer and have been on it since the age of 4. Kathak originated within temples as a storytelling device for portraying the epic tales contained within the scriptures. Poetry was combined with rhythmic movement to aid in the worshipful storytelling.
Foodie
I am an avid foodie - and love to cook food, rather than just eating it :P
I can cook pan-asian, Indian and continental cuisines. My favorite dish has to be a tie between hot steamed chicken momos and biryani.
Contact Me
Want to reach out to me? Contact me using the form below
Social Profiles
Email Me
<EMAIL_ADDRESS>Call Me
+91##########


I'm A Celebrity: Kate Garraway reveals female campmates 'blocked the cameras' as they showered
They were 'nervous' and 'embarrassed'
by Paul HironsKate Garraway had a brilliant competition on I'm A Celebrity, narrowly missing out on reaching the final at the last hurdle.
Opening up about her time in the jungle, Good Morning Britain presenter Kate, 52, has revealed that she and fellow female campmates 'blocked the cameras' when it came to shower time.
Read more: I'm A Celebrity viewers ask why reunions with loved ones was cut in final
The Mirror reports that Kate said the women in the camp were nervous and embarrassed by the prospect of having to shower in their bikinis in front of the nation.
So much so that they all made a pact 'block off' the cameras for each other when they showered.
"You think, 'I'm never going in that shower, it's too embarrassing'," she said.
"But it is the only way to wash."
It wasn't until that they realised that they were "really, really, really smelly" that the ladies of the camp decided to take a shower.
Instead, Kate took inspiration from fellow campmate Caitlin Jenner.
"You think 'if she's brave enough to shower then, you know, then we'll all get in'"
"There's nowhere to hide," she added.
Read more: I'm A Celebrity: Roman Kemp breaks down watching message from mum and dad
During the series, it was reported that the female campmates - including Kate, Nadine Coyle and eventual winner Jacqueline Jossa - had 'refused to do a Myleene'.
Ex-contestant Myleene, 41, stripped down to her bikini in the 2006 series, which produced an iconic shower image.
The Sun reported that they were 'reluctant to be seen showering'.
Leave us a comment on our Facebook page @EntertainmentDailyFix and let us know what you think of this story.


Home
Meals
Breakfast
Lunch
Dinner
Dietary Restrictions
Vegetarian
Vegan
Pescatarian
Share Recipe
Meals
Breakfast
Previous
Next
Lunch
Previous
Next
Dinner
Previous
Next


This is Another creation by "Let Me Do It". This is another web template that i have made, i hope you
like it. If any of you people have MSN Messenger please add my in your contact list, i love making
friends all over the world. My email address is<EMAIL_ADDRESS>And those who don't have MSN Messenger can e-mail me their comments about this template. I would
love to hear from you all. E-mail me if you need any HTML Help, i'll see if i can help you....
The empty space on the bottom left of this page is for Banners, Search Engine and Mailing List (Un)Subscription.
You can use it anyway you like.
Copyright © 2000, YourSite.com