Have you ever thought about the main purpose of Visual Basic for Applications?
For purposes of this VBA tutorial, the key term within the above statement is "data". If the main purpose of Visual Basic for Applications is to manipulate data, having a good understanding of what are the different VBA data types is essential for mastering VBA.
In this particular post, I don't cover the topic of variable declaration in detail. This is covered in this blog post about variable declaration.
Data is generally stored in the computer's memory. If you have a basic understanding of computers, you're probably familiar with how this works.
Some data is stored in objects.
Other data is stored in variables.
An object is what is manipulated by Visual Basic for Applications.
Some examples of objects are Excel workbooks, worksheets, cell ranges and cells.
A variable is a storage location paired with a name. You generally use variables to represent a particular value. In other words, variables act as placeholders for values.
You can create variables in Visual Basic for Applications by declaring them. You determine the name and characteristics of any variable you create. One of the characteristics that you can determine is the VBA data type.
VBA data types determine the way in which data is stored in the memory.
There are several VBA data types. These data types have different nominal allocation requirements. This means that different types use a different amount of bytes.
In general, choose the data type that uses the smallest number of bytes but can still handle all the data you want to store (…).
The reason for this is that there is an inverse relation between execution speed and the amount of bytes used by the relevant data. In other words, the more bytes your data uses, the slower your VBA application runs.
As this makes it clear, in order to be able to make appropriate decisions about the VBA data types that you want to use, you must understand the basic characteristics of each of the main types. Mastering this topic is very important, particularly as you start creating and developing more complex VBA applications. The main reason for this is that inadequate choices of VBA data types can result in slower execution of those applications and, in general, an inefficient use of the memory.
Programming languages are usually classified as strongly typed or weakly typed.
Strongly typed languages usually require that you define the data type for every variable that you use. Visual Basic for Applications isn't one of these languages. Therefore, VBA is able to handle the details related to data types automatically.
More precisely, if you don't declare the VBA data type for a particular variable, Visual Basic for Applications uses the default type. The default VBA data type is called Variant, and I explain it below.
Should you allow Visual Basic for Applications to automatically set the VBA data types for the variables you use?
Generally, no. You should get used to declaring the VBA data types of the variables you create always.
However, the answer to the question isn't as straightforward as the statement above may make it seem.
As I mentioned above, inappropriate choices of VBA data types can result in problems down the road, including slower application execution. More precisely, if you always rely on the default Variant data type, you'll likely start noticing that your VBA applications run relatively slow and require more memory than necessary. I explain the reason for this below.
Therefore, if you're committed to becoming a powerful VBA user, you must have a good grasp of VBA data types and, when required, be able to choose the most appropriate one.
So, should you always deal with VBA data types yourself?
Despite the above, Microsoft explains how using the Variant data type allows you to handle data more flexibly.
How noticeable are the issues of slower execution and inefficient memory use generally depends on the size and complexity of the relevant VBA application. Therefore, in small applications or applications that don't use many variables, allowing Visual Basic for Applications to handle the VBA data types directly shouldn't generate big issues.
However, when you're working with big and/or complex applications, letting VBA deal with data types automatically isn't very advisable. In these cases, you want to conserve as much memory as possible. A good knowledge of VBA data types is essential in achieving an efficient use of memory when developing VBA applications.
Letting VBA handle data types may seem like an easy way out – but remember that you sacrifice speed and memory.
In addition to the above, as explained in Mastering VBA for Microsoft Office 2013, not declaring the variables makes your VBA code harder to read and debug.
There are additional reasons to always declare your variables when working with Visual Basic for Applications. Let's take a look at 2 further reasons, explained by Walkenbach in Excel 2013 Power Programming with VBA and Excel VBA Programming for Dummies.
According to Mastering VBA for Microsoft Office 2013, one of the disadvantages of using the Variant VBA data type is that VBA can misinterpret the data sub-type that you intended. This can lead to "rather obscure bugs".
Let's take a look at a very simple example, involving strings and numbers, to illustrate this point.
Take a look at the following piece of very simple VBA code.
This Excel VBA Data Types Tutorial is accompanied by an Excel workbook containing the data and macros I use (including the Variant_Concatenation macro above). You can get immediate free access to this example workbook by subscribing to the Power Spreadsheets Newsletter.
"ExVar = "1"" assigns 1 to the variable ExVar. Since ExVar hasn't been declared, it is of the Variant VBA data type.
"ExVar = ExVar + ExVar + ExVar" performs an operation. The + operator is applied to the variable ExVar.
"MsgBox ExVar" displays a dialog box with the expression that is currently stored by the variable ExVar.
The question is, what is the value displayed in the message that appears within the dialog box at the end of the Variant_Concatenation macro?
At first glance, it may appear that the dialog box should display the number 3. After all, the second line seems to be adding ExVar three times, and ExVar has previously been assigned 1. 1 + 1 + 1 = 3, right?
111? Where's the 3 that we were expecting?
If you're familiar with VBA, you may have noticed some of the issues that the piece of VBA code that appears above has. Note how, when assigning 1 to the variable ExVar, the number 1 is enclosed in quotation marks ("").
This means that the number 1 is actually a string instead of a number. When you're working with variables that contain strings and you use the + operator, Visual Basic for Applications concatenates all the strings.
Therefore, if "1" is a string, "1 + 1 + 1" is not equal to 3. The correct answer, in that case, is the one that appears in the dialog box above: 111.
Microsoft explains this particular characteristic of the Variant VBA data type by stating that, when a Variant variable contains digits, the interpretation depends on the context. Therefore, depending on such context, those digits may be interpreted as either a string (as in the example above) or the actual value.
This particular problem is not caused exclusively by the use of the Variant VBA data type. The assignment of the variable could've probably been better structured. Nonetheless, this is a further reason to avoid relying on the Variant data type always.
If you still want to rely on the Variant VBA data type, there are ways to determine the VBA data sub-type of any Variant variable. I show how you can apply these methods to the Variant_Concatenation macro in a section below.
Let's take a look at the following piece of VBA code. The purpose of this macro is to delete blank rows in Excel. Notice how the variable iCounter is properly declared.
If it knows exactly to what particular word (this applies to variables, reserved words or functions) you're referring to, it completes the entry.
If it isn't sure about what word you're referring to, it displays a list of possible words from which you can select.
We all forget things sometimes.
Therefore, it's not surprising that, from time to time and despite our best efforts to the contrary, we forget to determine the VBA data type of a variable. Additionally, since Visual Basic for Applications is able to handle VBA data types automatically, you may not even notice this happening.
Fortunately, you can force yourself to declare all the variables that you use. To do this, you simply need to use the Option Explicit statement.
When enabled, the Option Explicit statement requires that you explicitly define all the variables in the VBA module where that particular statement appears.
How do you enable the Option Explicit statement?
Easy, simply type "Option Explicit" at the top (before any other code) of the relevant VBA module. You only need to do this once per module. However, you'll need to include the statement in any separate modules to which you want the Option Explicit option to apply.
If you want to take it a step further, you can have the Visual Basic Editor automatically insert the Option Explicit statement at the beginning of any future VBA modules. You can do this by customizing the code settings of the VBE in order to enable the Require Variable Declaration option. I explain how to do this in this VBE tutorial.
If the Option Explicit statement is enabled, you'll simply not be able to run VBA code that contains undeclared variables.
Enabling the Option Explicit statement has an additional advantage: it helps you to spot typos or misspellings that, otherwise, might have been difficult to see. Let's see how this works in practice by checking a macro that deletes empty rows.
For this example, I'll use the macro whose VBA code appears in the image below, named Delete_Empty_Rows_2. I explain this macro in detail (and show how it works in practice) in this post.
In this particular macro, 2 variables are declared at the beginning: aRow and BlankRows. Both variables are of the Range VBA data type.
Now, let's focus on the BlankRows variable. The image below shows how this particular variable is used several times in this particular Sub procedure.
Imagine that, while typing the VBA code, a typo somehow manages to squeeze in (just one). Instead of typing "BlankRows" (the appropriate name), you type "BlamkRows" (similar, but not the same).
As you may imagine, such typos may be difficult to spot in some situations. If you don't notice the mistake, the macro may not work as originally intended.
However, if you have enabled the Option Explicit statement, Visual Basic for Applications displays a prominent warning. Take a look at the screenshot below and notice how easy is to notice that "BlankRows" is misspelled.
Variant is the default VBA data type. In other words, this is the data type that Visual Basic for Applications uses when you don't determine the type yourself at the moment of declaring a variable. You can, however, also declare a Variant variable explicitly.
In Excel VBA Programming for Dummies, John Walkenbach likens the Variant VBA data type with a chameleon. In other words, data that is of the Variant type "changes type depending on what you do with it." This allows you to work with data more flexibly.
This sounds great! Who wouldn't want this?
Not having to worry about VBA data types sounds great in theory but isn't as simple in practice. Variant is, as a general rule, not the most efficient data type. This inefficiency is caused, funnily enough, by its chameleon-like characteristics.
More precisely, in order for Variant to behave like a chameleon and change of type depending on the context, Visual Basic for Applications must carry out certain checks for determining like which type should Variant behave. As you can imagine, carrying out these checks repeatedly requires more time and memory.
And this is one of the reasons why I generally suggest that you get used to declaring the VBA data type of your variables and use other VBA data types different from Variant. When you do this, Visual Basic for Applications doesn't need to be constantly carrying checks (as it does with Variant). This usually results in faster, snappier and better VBA applications, and more efficient memory management.
Variant's ability to handle different types of VBA data isn't absolute. In particular, Variant variables can't contain fixed-length string data.
I explain what fixed-length string data is below. In that same section, I also explain the String data type, which is the one you'll have to use in such cases.
Value #1: Empty, meaning that no value has been assigned to the variable. You can see an example of this below.
Value #2: Error, which is used for purposes of indicating errors in the relevant procedure.
Value #3: Nothing, which you can use when disassociating a variable from an object it was previously associated to.
Value #4: Null, which indicates that the variable contains no valid data.
The Byte VBA data type is the one that requires less memory: only 1 byte.
Variables whose VBA data type is Byte can be used to store numbers between 0 and 255.
If you've ever studied Boolean algebra, you may remember that the states of the variables are TRUE and FALSE.
When converting a Boolean variable to a numeric VBA data type, TRUE becomes –1 and FALSE becomes 0.
Boolean variables require 2 bytes of memory.
As you'd expect, the Currency VBA data type is generally used in connection with monetary matters. However, as I explain below, you can use it for other purposes as well.
The Currency VBA data type is exact. The Single and Double data types that I explain below are rounded.
15 digits to the left side of the decimal point.
4 digits to the right side of the decimal point.
As a consequence of the above, this data type allows for a range of values between -922,337,203,685,477.5808 and 922,337,203,685,477.5807.
Due to the fact that the Currency VBA data type is exact and these variables give fixed-point numbers, Currency is particularly useful for monetary calculations or fixed-point calculations where accuracy is very important.
The Currency data type takes up 8 bytes of memory.
This is another VBA data type whose name is self-explanatory.
Indeed, you won't be surprised to confirm that Date variables can be used to store values that represent dates, times or both.
However, if you've been working with Excel for a while, you may have noticed that the way Excel and Visual Basic for Applications work with numbers isn't necessarily the easiest to understand. Therefore, I provide a short introduction to this topic below.
Floating-point is a way of representing numbers. Under this formula, a number is represented in an approximate way to a certain number of significant digits. This is then scaled using an exponent.
However, the most critical point to understand is that the reason why this formula is called "floating-point" is due to the fact that the decimal point "floats".
Computers can also store numbers as fixed-point numbers. You can see an example of this in the Currency VBA data type explained above. In the case of fixed-point numbers, the decimal points doesn't "float". It remains fixed in a certain location and, therefore, the number has always a fixed number of digits after or before the decimal point.
Working with floating-point numbers, generally, demands more computational resources. Therefore, the suggestion made in Mastering VBA for Microsoft Office 2013 is to use fixed-point numbers "whenever practical".
Now that you have a basic understanding of floating-point and fixed-point numbers, let's take a closer look at what the Date VBA data type can do.
Dates between January 1, 100 and December 31, 9999.
Times between midnight (00:00:00) and 23:59:59.
The date appears to the left of the decimal point.
The time appears to the right of the decimal point.
Negative integers are dates before December 30, 1899.
Date VBA variables require 8 bytes of memory.
Decimal is one of VBA's numeric data types.
More precisely, the Decimal VBA data type can be used to store integers scaled by a power of 10. This scaling factor varies depending on how many digits there are to the right side of the decimal point. The maximum number of these digits that a Decimal variable can hold is 28.
If there are no decimal places at all: +/-79,228,162,514,264,337,593,543,950,335.
With the maximum number of decimal places (28), the largest value is +/-7.9228162514264337593543950335 and the smallest (excluding 0) is +/-0.0000000000000000000000000001.
In other words, the Decimal VBA data type gives you the largest amount of digits in order to represent a particular number. Therefore, it's more appropriate for cases where you are performing calculations with large numbers that need to be very precise and can't be subject to rounding errors.
The precision of the Decimal data type, comes at a cost in the form of a large memory requirement. The Decimal VBA data type requires 12 bytes, which is larger than the other numeric data types.
As explained by Microsoft, you can't declare the Decimal VBA data type directly (just as you do with the other data types). Strictly speaking, Decimal is a sub-type of Variant. Therefore, in order to use Decimal, you must the CDec conversion function.
The Double VBA data type is one of the non-integral numeric data types. This means that, just as decimal, it can be used to hold both integers and fractions.
For negative numbers: -1.79769313486231E308 to -4.94065645841247E-324.
For positive numbers: 4.94065645841247E-324 to 1.79769313486232E308.
I provide a brief introduction to floating-point numbers above. You may however be wondering, why is this type of VBA data called double?
"Double" stands for "double-precision floating-point". This makes reference to the number format which determines how the computer handles the number. There is also a Single VBA data type (explained below).
Double VBA variables require 8 bytes of memory.
You can use the Integer VBA data type for storing integers between -32,768 to 32,767.
Integer variables only require 2 bytes. Due to its low memory requirements, the Integer VBA data type is usually the most efficient and better performing option for purposes of storing integers that fall within its range.
Usually contain a finite set of unique natural numbers. Each of these numbers has a particular meaning.
Are commonly used for purposes of selecting among different options.
"Long" makes reference to "Long Integer". As implied by its name, you can use the Long VBA data type for storing integer values that are within a "longer" range than the range of the Integer data type.
More precisely, by using the Long VBA data type you can store numbers between -2,147,483,648 and 2,147,483,647. If this range is still not enough for your purposes, you may want to use the Double VBA data type.
Long variables require 4 bytes of memory. As you'd expect, this is more than Integer variables (2), but less than Double variables (8).
You can use the Object VBA data type for purposes of storing addresses that refer to objects. In general, Object variables are a convenient way to refer to objects.
Variables of the Object type take up 4 bytes of memory.
I anticipated the existence of the Single VBA data type when introducing the Double type above. "Single" refers to "single-precision floating-point", the number format that determines how the computer handles the number.
For negative values: -3.402823E38 to -1.401298E-45.
For positive values: 1.401298E-45 to 3.402823E38.
Single variables require 4 bytes, half of those required by the Double VBA data type (8).
For purposes of programming, a string is generally defined as a sequence of characters that represents the characters themselves (not a numeric value or other similar thing). Within Visual Basic for Applications, the String VBA data type is generally used to store text. However, this doesn't mean that you should only use letters within String variables. In addition to letters, String variables can contain numbers, spaces, punctuation and special characters.
There are 2 different kinds of Strings. The amount of characters and memory required varies depending on the type.
Variable-length String variables can contain anything from 0 up to approximately 2 billion characters. They take up 10 bytes of memory plus the memory that is required for the string itself.
Fixed-length String variables can contain between 1 and approximately 64,000 characters. These particular String variables require the amount of memory required by the string.
According to Mastering VBA for Microsoft Office 2013, fixed-length String variables "are rarely used in most programming". The main exception is when managing databases where a rule specifying a maximum string length applies.
If the data assigned is shorter, VBA adds trailing spaces in order to reach the fixed length.
If the assigned data is longer, Visual Basic for Applications truncates the data after the fixed length is reached. For these purposes, characters are counted from left to right.
For example, if you assign the string "Tutorial" to a fixed-length String variable with a length of 3 characters, Visual Basic for Applications only stores "Tut".
The above sections explain the most common VBA data types. From time to time, you may encounter some other data types, such as the ones I briefly introduce below.
The LongLong VBA data type is only valid on 64-bit platforms. This makes reference to how your computer is handling information.
According to tech website TweakTown, 92.8% of new Windows computers utilize 64-bit operating systems. You can find more information about the 32-bit and 64-bit versions of Windows here, including how to check which version your computer is running.
You can use the LongLong VBA data type to store numbers between -9,223,372,036,854,775,808 and 9,223,372,036,854,775,807.
LongLong variables require 8 bytes of memory.
LongPtr isn't (strictly speaking) a VBA data type. More precisely, the way LongPtr behaves depends on which platform is the relevant procedure running.
In 32-bit platforms, LongPtr becomes Long.
In 64-bit platforms, LongPtr becomes LongLong.
Both the range of values that can be stored using a LongPtr variable and the memory requirements vary accordingly.
As explained by Microsoft, one of the main uses of LongPtr is for pointers and handlers.
Visual Basic for Applications allows you to create your own VBA data types. As you'd expect, these data types are known as user-defined data types.
User-defined data types that have been defined previously.
The number of bytes required by a particular user-defined VBA data type depends on its elements.
The range of each of those elements is the one that applies to the relevant data type.
I may explain further details of user-defined VBA data types in future VBA tutorials. Please make sure to enter your email address below if you want to join the Power Spreadsheets Newsletter and be notified whenever I publish new material.
How do I decide which VBA data type to use for a particular variable?
Which VBA data type(s) is(are) able to handle the data that you want to store?
Out of the VBA data type(s) that can handle the data you want to store, which data type uses the smallest number of bytes?
If the relevant variable will only contain logical values (TRUE and FALSE), use the Boolean VBA data type.
If the variable will always contain a string, use the String VBA data type.
If the variable will contain an integer use either the Integer or the Long VBA data type. The choice between Integer and Long depends on how big the relevant numbers are.
If the variable you're declaring may contain fractions, use the Single or Double VBA data types. The decision to choose one or the other depends on the range of values the variable may store.
If you'll be using the variable in operations where you can't have rounding errors (you require no-rounding fractions), use the Currency or Decimal VBA data types. As in the previous cases, the exact choice of variable depends on the size of the exact numbers you'll be storing.
You'll notice that, in several of the above cases, which data type you should use depends on the range of values that you want the variable to be able to handle. Learning how to choose the appropriate VBA data type (considering factors such as the range) is critical and, as computers become more powerful and VBA develops, there may be further changes to the available data types.
For example, loop counters used to be declared using the Integer VBA data type, which can't be larger than 32,767. Recent versions of Microsoft Excel can have 1,048,576 rows. This clearly exceeds the range that Integer variables can handle. Therefore, a more appropriate choice is using the Long VBA data type.
As you practice with Visual Basic for Applications, you'll start becoming better and more comfortable deciding which VBA data type to use.
Remember that the Variant VBA data type behaves like a chameleon. Variant changes its sub-type depending on what particular action you're carrying out with it.
Despite the downsides of relying on the Variant VBA data type that I have explained throughout this VBA tutorial, Variant can be quite helpful for purposes of testing a particular variable and determining what is the most appropriate data type to use.
Let's take a look at 3 ways you can do this. In all examples, I use the Variant_Concatenation macro that I used above to illustrate how the Variant data type may result in possible misinterpretations of your intended VBA data type.
This Excel VBA Data Types Tutorial is accompanied by an Excel workbook containing the data and macros I use. You can get immediate free access to this example workbook by subscribing to the Power Spreadsheets Newsletter.
I may cover the topic of debugging in future VBA tutorials. In this section I simply show you how to use the Locals Window and the Step Into command for purposes of determining which particular data type to use.
You can do this in the following 6 simple steps, as explained in Mastering VBA for Microsoft Office 2013.
For purposes of this process, the Locals Window of the Visual Basic Editor must be visible. This window displays all the variables in the relevant procedure, as well as their values.
You can usually see the Locals Window at the bottom of the VBE.
If you can't see the Locals Window in your VBE, you can ask the Visual Basic Editor to display it by clicking on "Locals Window" within the View menu.
You can step into a procedure by using the "F8" keyboard shortcut or by choosing "Step Into" in the Debug menu of the Visual Basic Editor.
Once you've stepped into the procedure, the Visual Basic Editor takes you to the first line of code in the macro.
Every time you click the Step into command or the "F8" keyboard shortcut, the Visual Basic Editor executes a line of code and steps into the next. Do this for purposes of stepping through the VBA Sub procedure and finding out what is the Variant VBA sub-type that Visual Basic for Applications automatically assigns to the relevant variable.
Notice how, initially, the ExVar variable contains the special value Empty. This means that the variable hasn't been initialized.
In the following screenshot you can see how the ExVar variable is of the String sub-type just one step later.
Bear in mind that just because a variable of the Variant VBA data type is behaving in a certain way, it doesn't mean that this is the most appropriate data type to use. Remember that one of the possible downsides of using this particular data type is that the Visual Basic Editor may misinterpret your intended VBA data type.
Step a couple of times into the procedure following the steps I described above. Your purpose is to determine that the variable is being assigned the same VBA data sub-type in a consistent manner. Once you've determined that this is the case, you can proceed to the step #5.
Once you've determined that the relevant variable is behaving appropriately and that it is being assigned the same data sub-type in a consistent manner, declare the variable using the VBA data type you've found.
Once you've determined the VBA data type that you consider appropriate for the variable, test your VBA code in order to make sure that the data type is the right one.
Visual Basic for Applications allows you to determine the VBA data type of a variable by using the TypeName function. When applied, the TypeName function returns a string displaying the VBA data sub-type information of a particular Variant variable.
Let's see how you can apply the TypeName function to the Variant_Concatenation macro.
"MsgBox" makes reference to the MsgBox function.
"varname" is the Variant variable whose VBA data sub-type you want to find out (in this case ExVar).
You already know that, since the ExVar variable isn't declared, its VBA data type is Variant. Additionally, based on the previous section where we used the Step Into command for purposes of testing the variable, you know that the ExVar variable is not initialized at first (is Empty) and, after the assignment is made, it behaves like a string variable.
The first message box to appear returns Empty, as expected.
The second and third message boxes confirm that (now) the ExVar variable is of the String VBA data sub-type.
You can also use the VarType function for purposes of finding out the VBA data type of a particular variable.
12: Variant. This particular value is only used with arrays.
36: Variant containing user-defined types.
The syntax of VarType is also very similar to that of TypeName. More precisely, the syntax of VarType is "VarType (varname)", where "varname" is the Variant variable whose VBA data sub-type you want to find.
Therefore, I simply create a new macro called "Variant_Concatenation_VarType". The VBA code is almost the same as that in the previous example (Variant_Concatenation_TypeName). The only difference is that, instead of using TypeName, I use VarType.
You probably expect that, when the Variant_Concatenation_VarType macro is executed, the first message box returns the value that corresponds to Empty, while the second and third message boxes display the value corresponding to String.
The first message box to be displayed returns the number 0. This corresponds to Empty.
The second and third message boxes display the number 8. This number makes reference to strings.
The main purpose of Visual Basic for Applications is to manipulate data. Therefore, in order to master VBA and macros, you must have a good understanding of what are the different VBA data types.
As with most aspects of Visual Basic for Applications, the more you practice, the better you'll become. Therefore, make sure you start using the knowledge about VBA data types that you've gained by reading this post in your day-to-day activities.


text:
Edgar Allan Poe battled depression but it's unlikely that he killed himself
A linguistic analysis of his writing offers a new look at the poet's mysterious death
By Virginia Streva
PhillyVoice Contributor
Mysteries Edgar Allan Poe
Courtesy/Library of Congress
Edgar Allan Poe died on Oct. 7, 1849, not long after 'The Raven' author was found delirious. But Poe's death likely was not suicide, as some have theorized, according to a study by linguistics experts who analyzed his writing.
Edgar Allan Poe died on October 7, 1849, just days after being found delirious, lying in a ditch and wearing someone else's clothes.
The poet's mysterious death has captivated people ever since. Various theories about his death have been offered, ranging from syphilis to alcohol poisoning. Without medical records or an autopsy report, it's hard to know exactly what happened to "The Raven" writer, but one researcher is trying to rule out one theory — suicide.
Dr. Ryan Boyd at Lancaster University in England analyzed more than 300 personal letters from the author, as well as 49 poems and 63 short stories. He compared the linguistic cues in his writing to that of language patterns consistent with patients who exhibit depression and suicidal thoughts.
U.S. Supreme Court will hear Archdiocese of Philadelphia's appeal in foster care case against city
SEPTA service changes mark end of skip-stop service on Market-Frankford Line
Two Philly schools reopen following asbestos cleanup
Poe, who spent time living in Philadelphia, allegedly had attempted suicide a year before his death by taking four doses of a common opioid, laudanum. He also struggled heavily with alcoholism prior to his death. Charles Baudelaire, a contemporary poet who translated Poe's work into French, claimed his death was "a suicide prepared for a long time."
Despite his personal issues and the darkness in his literary work, Poe did leave suicidal cues in his writing, Boyd found. Previous research has shown that people who are depressed and suicidal tend to have a particular language pattern – and that was missing from Poe's work.
Still, Poe's writing did reveal bouts of severe depression. It peaked at various times, including 1849 – the year he died – and in 1843 and 1845, which, oddly enough, were his two most successful years as a writer. He also suffered greatly following the death of his wife, Virginia Clemm, in 1847.
Boyd found that Poe's personal letters revealed this depressive language. Yet, his short stories and poetry lacked it – except for "The Lighthouse," which was incomplete at the time of his death.
"My hunch is that he was indeed spiraling into a depression toward the end of his life, but that he didn't kill himself," Boyd said.
The days leading up to his death are just as mysterious as the causation.
On Sept. 27, 1849, Poe reportedly left Richmond, Virginia to travel to Philadelphia, where he lived with his wife and her mother, Maria Clemm, from 1838 to 1844. But he never made it to Philly.
Instead, Poe was found delirious outside of an Irish pub in Baltimore, Maryland on Oct. 3. His clothes were inconsistent with his usual style. He was taken to a hospital where he died two days later.
His reported last words: "Lord, help my poor soul."
Follow Virginia & PhillyVoice on Twitter: @vastreva | @thePhillyVoice
Add Virginia's RSS feed to your feed reader
Virginia Streva
Read more Mysteries Edgar Allan Poe Philadelphia Linguistics Authors Poetry Baltimore Depression Suicide
Chaddsford Winery hosting wine and chocolate parings
Pennsylvania child care workers eligible to receive $600 pandemic relief grants

redpajama_set_name: RedPajamaCommonCrawl


text:
State Assembly 73 Adam Roberts
Website: adamrobertsnyc.com
Social media: @adamrobertsnyc adamfornyc
Have you ever worked in, or had another affiliation with, the Real Estate industry? Yes
I work in architecture, a subset of real estate. Our state's problems with real estate, particularly the housing crisis, originate from poor land-use policies. We need well-intentioned people with real estate expertise to solve these problems.
Everyone has a right to housing. A safe and good quality home is essential to maintaining a decent standard of living. We have seen that the lack of housing has had severely detrimental implications for our state, New Yorkers further from their jobs, recreation, families, and friends. This in turn has decreased the quality of life for countless New Yorkers, and for the most vulnerable has driven them into poverty and mental illness.
Housing justice is the most critical part of my role at the American Institute of Architects (AIA) New York. I represent New York's architects employed at affordable housing firms and housing agencies which design our city's desperately needed housing. Recently, I led the organization's successful efforts to introduce fire safety legislation after the Twin Parks fire, rezone SoHo/NoHo to allow for affordable housing, and incorporate safety-requirements into the proposed legalization of ADUs.
The most pressing housing issue in New York is the lack of housing. High demand for housing has sent prices skyrocketing due to a lack of supply. We need more housing of all typologies: market-rate, affordable, and supportive. Market-rate is needed for middle and upper-income households, affordable for those who have lower incomes, and supportive for those suffering from mental illness and addiction. A combination of discriminatory land use policies and lack of will from elected officials has prevented the state from building enough of each of these typologies. To address the housing crisis, I will support the legalization of ADUs, retrofitting class B and C office buildings into housing, upzoning of areas near transit (transit oriented development), NYCHA's housing trust, eliminating parking minimums, and ending single-family zoning. In my district, I will personally champion proposed housing. Not only will I fight for these, but I already have been doing so at AIA New York.
Yes, I believe housing is a human right. Currently, the state has no obligation to provide housing to New Yorkers, while the city's requirement is only to provide shelter. We need our state and local governments to see safe and good quality housing as an entitlement. To end commodification, the state must remove exclusionary zoning laws and properly fund public housing. I promise to not only speak in favor of these in the Assembly, but act on them. We need elected officials who will have the courage to challenge those who seek to stop affordable and supportive housing in their neighborhoods.
I would support the right to counsel in eviction proceedings (S6678/A7570). Everyone should have a right to a fair eviction proceeding. This right can always be exercised with proper legal counsel. New York City's right to counsel has been very successful and illustrates that the program, with proper funding, can be implemented statewide. We already provide public defenders in criminal proceedings, so there is a clear precedent for the right to counsel in serious legal proceedings.
No, public housing should be public. Its purpose is to be operated for the benefit of its tenants without any profit motive by its owners. This relationship changes when public housing is privatized, as has been seen throughout the country.
We must create a sustainable source of funding for NYCHA and allow it to use that funding efficiently. The housing trust is the only model which can feasibly do this for NYCHA in the next few years. It would provide NYCHA with access to billions and enable it to use better procurement methods, all while not privatizing the agency. Without immediate funding, political pressure will continue to build to privatize NYCHA. The housing trust is the only realistic means of stopping this.
I would advocate for proper funding for local building departments, particularly NYC DOB. The scale of harassment we see in NYC occurs because DOB lacks the resources to properly enforce basic safety laws. Comparatively small amounts of funding for DOB inspectors and plan examiners would severely curtail the ability of landlords to harass tenants. Working in architecture, I see the bad actors in my field who harass tenants are only able to do so because of a lack of DOB oversight.
The state must properly fund the Emergency Rental Assistance Program (ERAP). While it was reliant on federal funding, the state must make up for the lack of funding to continue the program. Otherwise, we will continue to see a rise in evictions. This will cost the state far more in the long-term than properly funding the program by making those evicted more reliant on state services.
A more focused version of Good Cause which would overcome the political opposition witnessed this year. Much of the lack of support from those who in concept support Good Cause came from the idea that everyone, even the wealthiest, would have their rents protected. We can also increase support including pegging rent increases to inflation and allowing for increases greater than inflation increases in higher-value units.
Yes, I support the right of tenants to purchase the homes in which they live. This occurred in my district on a larger scale in the 1980s during the creation of co-ops. Co-ops proved to be incredibly beneficial, providing much-needed equity for residents and providing them with protections during the skyrocketing rental prices of the 1990s and 2000s. I will strongly encourage more homeownership in my district and throughout the state.
RGB Freezes Rents for Six MonthsState Assembly 65 Alana Sivin


text:
How Will The Rise Of The Machines Change The Future Of Chess?
November 20, 2018 By Clay Waters
The World Chess Championship is currently happening in London. What will the future of this ancient game look like as tech speeds up?
Chess Grandmaster Garry Kasparov Says Putin Is A Poker Player
December 11, 2015 By The Federalist Staff
Kasparov explains Putin's propaganda and the vacuum U.S. foreign policy has created in the world.
Can Putin Be Kept in Check?
November 20, 2015 By Tom Nichols
In Garry Kasparov's book, Winter is Coming, the Chess grandmaster lashes out at the West for enabling the rise of Vladimir Putin. Is his anger Justified?


text:
#ifdef __cplusplus
extern "C" {
#endif

extern int drcSetupSerial (const int pinBase, const int numPins, const char *device, const int baud) ;

#ifdef __cplusplus
}
#endif

redpajama_set_name: RedPajamaGithub


Since 1935, the Fur Rendezvous winter festival has been an important part of Anchorage's history. This year the festival takes place Feb. 23 to March 4, 2018, in downtown Anchorage.
Known locally as Fur Rondy, the event has been going strong for more than 80 years. It started as a three-day sporting event arranged to coincide with the return of miners and trappers loaded down with the profits of a winter's worth of work. The original event featured skiing, hockey, basketball, boxing and a children's sled dog race down Fourth Avenue.
Explore over 50,000 free online courses, books, learning tracks, videos, exercises, and much more as part of your self-development journey.
Read the August 2017 edition of the virtual Force Development Center newsletter to learn about on-demand, self-paced learning resources available to Air Force civilians, officers, and enlisted members without charge.
NO PER DIEM FOR ANNUAL TRAINING (AT): Normally you receive per diem when you travel for TDY. However, when you perform AT and government quarters and government mess (meals) are available at the TDY location, you will not receive the meals and incidental expense (M&IE) portion of per diem during the AT days. You will be reimbursed for the lodging expense.
SATO FEE: The fee charged by the Scheduled Airline Ticket Office (SATO) is reimbursable and should be claimed on travel vouchers. The SATO fee claim must be supported by either a receipt (usually written on the SATO itinerary) or a lost receipt form. This supporting document must be included with travel vouchers even though the amount is less than $75.
TRAVEL DAYS ON ORDERS: When you perform active duty that involves TDY travel your order, AF Form 938, must reflect the correct number of authorized travel days in block 11. If the order shows more or less days than you actually used during the TDY, the order must be amended before the final tour certification and travel voucher are done. Orders must include all amendments when submitted for military pay and travel pay. You will receive pay and allowances for the duty days and travel days.
"Due to provider availability PHA/ Labs/Immunizations will be open Saturday only from 0800-1000 and 1300-1500 with a potential flex hour prior to lunch depending on number of appointments booked.
Dental will be open Saturday from 0830-1130 and 1230-1500. If you have not already done so stop by immunizations and get your flu shot Saturday.
prescription to either Active Duty optometry on Friday or drop off a copy at the AMDF."
If you are not using these benefits for your degree you are paying too much! Details can be found on myPers at Credit-by-Exam Programs - College Level Examination Program / DANTES Subject Standardized Tests, or by signing into myPers and following the tuition assistance link for more details.
Please contact Ms. Dearman at 551-4714 or 907-244-8556 with questions or concerns.
Please contact Mr. David Nickell at 551-4755, your unit Security Manager or the AFOSI at 552-2256 if you need further guidance.


Deadpool is a hilarious Marvel antihero, and if you're dressing up as him for Halloween then you'll need his Deadpool Toy Weapon Kit! This is a set of 5 items: 2 toy ninja swords, a black holster for them that goes on your back, and 2 sais, or triple-bladed ninja knives. This is his trademark arsenal, so if you're aiming to be a believable Deadpool at the party you've got to include this set!


Through the Office of the Child and Youth Advocate, Legal Representation for Children and Youth (LRCY) provides lawyers for children and youth in child intervention matters.
Who may be eligible for a LRCY appointed lawyer?
There is an application or appeal concerning them under the Enhancement Act or PSECA.
They wish to apply for an order under the Protection Against Family Violence Act.
Their child is subject to an application under the Enhancement Act.
A young person with Permanent Guardianship may be eligible for a lawyer for other reasons. Check out LRCY policy for further details.
Will LRCY provide a lawyer for a young person for every matter?
No, LRCY will carefully review the request for a lawyer and make a decision based on a number of variables. For example, a lawyer may not be appointed if everyone agrees to the court application and the other parties do not have a lawyer, or if the young person does not want a lawyer.
Will LRCY provide a lawyer for a custody or criminal matter?
No. However, Legal Aid Alberta may.
Does the young person have to pay for this service?
No, there are no user fees.
Why is it important for a young person to have a lawyer?
Young people should have a voice in proceedings affecting them. As well, a lawyer will ensure that a young person's legal interests are considered by the Court.
Will the Judge do what the young person wants?
No, it is the Judge's job to make the decision that he or she feels is in the young person's best interest. So, while this may not be what the young person wants, the law says the young person's views must be taken into account.
Can the young person say "no" to having a lawyer?
If the young person is 12 years of age or older, LRCY will speak to the young person to ensure he or she agrees before a lawyer is appointed, except in situations where the court has ordered it. If the court has ordered it, then it is mandatory that a lawyer be appointed.
How many legal appointments does LRCY make?
LRCY makes between 1,200 – 1,300 legal appointments each year, representing approximately 2,000 children and youth.


text:
Q: change datetime.weekday( ) to "MON" I want the today variable to be whatever day of the week's x,y coordinates are.
using datetime.weekday returns a 0 which I can't assign to a coordinate.
I could use 7 if statements but that seems excessive. Is there better way?
MON = (340, 431)
TUE = (529, 432)
WED = (721, 436)
THUR = (912, 436)
FRI = (1107, 435)
SAT = (1293, 436)
SUN = (1484, 434)

dow = dt.today().weekday() #get day of week

if dow == 0:
    today = MON
if dow == 1:
    today = TUE

pyautogui.click(today) #if today is monday the x,y coordinates of (340, 431) will be here
time.sleep(1)

A: Create an array with the coordinates and use dow as it's index:
coords = [(340, 431),(529, 432),(721, 436),(912, 436),(1107, 435),(1293, 436),(1484, 434)]

dow = dt.today().weekday()

today = coords[dow] # note that the first day of the week may not be monday

pyautogui.click(today)

redpajama_set_name: RedPajamaStackExchange


"Excellent condition Profil! Spacious interior! Ready to cruise!"
Rare Italian pedigree for sale, ready to go for her new owner.
Beautiful Italian made Profile Marine yacht 50' ft Express Cruiser sports boat.
Beautiful Italian hull made with American made electronics and engines power boat express cruiser.
Completely restored and renovated, fast and beautiful powered by twin Detroit diesel engines 8V92 420HP each known for their reliability and strength.
Engines were completely overhauled three years ago.
Over $65K spent for the engine overhaul.
Beautiful new interior carpets and designers style galley.
Dual AC/Heater on the main dining room and owner's stateroom.
Two interior refrigerators and exterior freezer and also additional icemaker.
Electric windlass with stainless steel anchor.
Steering is Hydraulic with manganese bronze twin spade rudders.
650 gallons diesel double fuel tank.
The boat features new red canvas custom made and designed enclosure with polycarbonate glasses which maintain their clarity and stretchiness at all times making it distinct from the crowd.
The stateroom is V-Berth style with stylish flat screen TV.
It features an additional crew quarter on the stern.
Spacious bathroom head with separate shower.
Interior carpets have been renovated to match the Italian stylish dining room.
Raymarine electronics with GPS plotter, Radar, depth finder and auxiliary Garmin fish finder.
ONAN 8KW kilowatt gen Electric generator.
This boat is a head turner, and it is like a Ferrari/F15 fighter on water.
Great summer boat with acres of sun lounging, relaxing and cruising space on board. Huge salon for entertaining with entertainment systems and comfort galore.
After a little fluff and buff, she'll be ready to go! Bottom paint in good condition and new zincs installed throughout. Engines and generator look to be in good shape, and all cushions were in good condition.
In order to see all 145 photos and more, please quickly create an account. It just takes a second and you will have unlimited access to view information for this listing and ALL others on the website.
In order to see all 145 photos, download a brochure, and more, please quickly create an account. It just takes a second and you will have unlimited access to view information for this listing and ALL others on the website.
Roger can be reached directly at (978) 317-0027. Call us today and you'll find out just how much we love our job!
† Engine hours were last recorded on 4/2/2017, and may not reflect the most recent readings. Please contact us if you would like up-to-date information.
Advertisement published and maintained by Roger Boisvert.
In order to see all 145 photos, download a brochure, and more, please quickly create an account. It just takes a second and you will have unlimited access to view information for this listing and ALL others on the website. If you don't use social media, click here to register with your email.


Shengzhou Sanshun Garment Co., Ltd.
Shengzhou Sanshun Garment Co., Ltd. is an export company specializing in producing down and feather filled products and bedding sets. After many years of development, our company has established Daifu brand, which is well known in costume, garment and bedclothes markets. We have a whole set of advanced production equipment for down products, a standard clothing production line and a complete set of down product testing facilities. Our company insists on the tenet of "first-class management, first-class quality and first-class service". We take "good faith" as business philosophy, and completely implement quality management systems in production process. Our products have a good sale in Japan, the USA and European countries.
Company ReviewsShengzhou Sanshun Garment Co., Ltd.
Jianko Used Clothes Recycling CO.,LTD.
Kunshan Yongrong Chemistry Material Co., Ltd.
Shenzhen China Silk Enterprise Ltd.
Nantong Jinlong Fashion Sand Washing Co., Ltd.
Shanghai Flying Dragon Accessories Co., Ltd.
Suzhou Bohang Sports Co., Ltd.
Nanchang Rainbow Garments Co., Ltd.


Mr. McKinnon repre-sented Weymouth on Beacon Hill.
As the state Legislature sped toward adjournment a few days before Christmas in 1982, Senator Allan R. McKinnon stood to give his colleagues a lump of coal — and a few more lumps, besides.
Mr. McKinnon, who was 88 when he died Jan. 26, was criticizing lawmakers for approving with little or no debate a bunch of amendments, some of which benefitted the politically connected. It's not uncommon for lawmakers everywhere to do the same thing late at night, late in the year, or just before the holidays.
Standing up to take to task colleagues on your own side of the aisle is far less common. And though Mr. McKinnon would ascend to a powerful post five years later when he became Massachusetts Turnpike Authority chairman, his brief speech that December day in 1982 derailed the aspirations he had for rising as a Weymouth senator in a chamber then led by William Bulger.
"The clubs, the boys, were going to be taken care of, regardless of whether they'd served well," Mr. McKinnon said in a 2004 Globe interview, as he spoke of the comments that led to his fall from the Democrats' inner circle.
Mr. McKinnon was "fundamentally decent," said former governor Michael S. Dukakis, who appointed him Turnpike Authority chairman in 1987.
"He cared deeply about his constituents, his state, and what he was doing," Dukakis added.
A history teacher turned lawmaker, Mr. McKinnon initially kept teaching government part time while serving in the Senate, to supplement his legislative pay.
He was on the Weymouth Board of Assessors when he decided to run for Senate in 1970. Elected that fall, he served for 14 years and then was deputy secretary in the state Department of Transportation for two years before Dukakis appointed him authority chairman, a post Mr. McKinnon held until 1996.
Among Mr. McKinnon's legislative accomplishments was helping to secure initial state financing for the commuter boat service to the South Shore. As Senate chairman of the joint insurance committee, he opposed towering rate increases and played a key role in auto insurance reorganization legislation that took effect in 1984.
Mr. McKinnon also was a committed death penalty opponent in the Senate, a position that inevitably drew criticism.
"Talk show hosts were fanning the flames," he said in the 2004 interview.
Born in 1930, Allan R. McKinnon grew up in Weymouth, the youngest of nine siblings, half of whom were from his father's earlier marriage.
His parents were Susan Farrar and Joseph McKinnon. Mr. McKinnon was a boy when his father died.
Those who met Mr. McKinnon later as a public official knew him "as an articulate man. He was a fantastic speaker," said his daughter Kerin of Mattapoisett.
That wasn't always so. Mr. McKinnon's brother Warren of Hull said that "one of the interesting things about him was that he was scared to death of making speeches" as a youth, even though he was president of his senior class in high school.
"He said, 'I almost joined the Army to avoid speaking at my high school graduation. I was that terrified,' " Kerin recalled.
Mr. McKinnon got over his fear of public speaking and graduated with a bachelor's degree from Tufts University and a master's from Bridgewater State College.
In 1958, he married Anne McLaughlin, whom he had met in high school. She was the force behind her husband's political success, their daughters said.
Mr. McKinnon had taught history and government in the Weymouth and Holbrook school systems and later taught night classes at what was then Quincy Junior College.
In the Legislature, he delighted in parking his Honda Civic next to the fancier cars of some Senate colleagues. Mr. McKinnon's idea of a campaign fund-raiser was a "steak bake" with a low admission charge so everyone could attend. He loved parties and get-togethers of all kinds.
"He was the first to get down on the floor to play with the dogs. He loved puppies and kids and singing songs," said his daughter Megan Mc-Kinnon Cormier of Medford, who added he insisted that the reception at The Lantana in Randolph, after his funeral Mass, be a joyous, crowded affair.
Dukakis recalled that one morning as Mr. McKinnon was driving to a meeting in Springfield, he pulled over, got out of his car, and penciled the time and date on a piece of trash he spotted in the median. When the trash still there on his late afternoon drive home, Mr. McKinnon called Turnpike supervisors to find out why unsightly garbage was allowed to linger so long.
After Mr. McKinnon retired in 1996, he and his wife moved from Weymouth to a smaller residence in Rockland. Mrs. McKinnon died in 2001.
In the years that followed, Mr. McKinnon and Jaquelin Taylor of Pocasset became a couple. They dated once in high school before beginning their romances with the woman and man each married. After they were both widowed, they became companions again.
In addition to his daughters, brother, and companion, Mr. McKinnon leaves a son, Sean of Braintree; Bob O'Brien of Mattapoisett, who grew up in the McKinnons' home after his own parents died; and seven grandchildren.
A funeral Mass will be said at 10 a.m. Feb. 23 in St. Francis Church in Weymouth.
Over the years, "we always were hearing about all the things my dad was doing for everyone else," Megan said, though Mr. McKinnon avoided publicity for his good deeds, professional or personal.
"I've had a good life. I've done things I've enjoyed doing. I think we did a certain amount of good things," he told the Globe in 2004.
Bryan Marquard can be reached at bryan.marquard @globe.com. Follow him on Twitter @BryanMarquard.


Storing and sharing your business files is no longer only about Disaster Recovery. It's about Disaster Avoidance. And more than that, there are now strict compliance regulations regarding customer and client records to be met as well.
With GDPR on the horizon businesses can't afford to risk up to 4% of turnover in fines.
Forteon Drive converges connectivity and cloud to bring complete, enterprise class file storage and sharing to your business, designed with security as priority yet without sacrificing ease of use and accessibility.
Store your files in the Cloud, share with colleagues and access them from any device.
Instant access to your company files from the desktop client, smartphone app or simply over a secure webpage.
Anywhere, Anytime. No matter the device, your business will always be connected and synchronised.
Forteon Drive not only meets, but exceeds many compliance benchmarks for data storage. 100% of your data is centrally stored within our fully monitored Cloud Infrastructure, UK guaranteed and located in our purpose built data centre.
Many other mainstream file storage providers use various servers around the world, meaning their users simply cannot guarantee where their data is located.
Access does not have to be at the expense of security.
Your data is as secure as ever, with individual and group permissions to set what can be viewed, edited or shared plus private encryption keys and full administrator control to remote wipe data and delete users.
Forteon Drive grows with your company – no upper restrictions on users, storage space or data transfer.
Your Cloud Drive can cater to whatever size business you have and meet whatever level of requirements you need.
Along with always monitoring our solutions to ensure optimal performance and uptime, our team is on-hand to answer any of your queries.


Feline bone cancer is a common variety of feline cancer. Typically, bone cancer in cats is treated with a combination of chemotherapy and surgery. However, before instituting a cancer treatment program or a regimen of chemotherapy drugs, it is helpful to understand the effects and symptoms of feline bone cancer.
Most types of feline bone cancer result in the growth of a tumor on one or more bones, as well as the weakening or disintegration of bone tissue. The disease is aggressive but treatable if detected early enough. Typically, feline bone cancer is not as often fatal as canine bone cancer.
If your cat displays any of these symptoms for an extended period of time and without apparent reason, have him examined by a veterinarian. A typical bone cancer screening test will include a complete physical exam as well as blood work and x-rays.
Chemotherapy is rarely used as a sole treatment option for cats with feline bone cancer. Your veterinarian will likely prescribe some form of surgery as well. In some cases, amputation of an affected limb may be necessary. Radiation is used to treat cancer that has not metastasized and will often be a second step in a feline bone cancer treatment program.
Chemotherapy is used to slow the spread of cancer once it has metastasized to another part of your cat's body. It is a painful and exhausting procedure, and chemotherapy side effects are wide-ranging and serious. Some of the common side effects of feline chemotherapy treatment include diarrhea, vomiting, loss of appetite and loss of bone mass.
A feline chemotherapy treatment typically lasts for 10 to 15 weeks. During the treatment, your cat will receive numerous intravenous injections of chemicals designed to isolate and kill cancerous cells. Side effects may occur immediately and may be present for several months after treatment has concluded.
Typically, veterinarians prescribe pain medication along with chemotherapy treatment, as the program may leave your cat weak and sore. The side effects of may also be treated with a variety of medicines, depending upon their severity.
Chemotherapy is a viable treatment method for feline bone cancer for cats with certain types of tumors and an otherwise healthy medical history. If your cat suffers from feline bone cancer, consult with a veterinarian about potential treatment options, including chemotherapy. Owners able to recognize and treat the illness quickly help their cats to lead longer and healthier lives, free of cancer.


Georgian Lussier, a Wallingford resident, will be traveling to Portland Maine Oct 22nd to accept the Alliance for Community Media Rika Welsh Award given to community television producers who are successfully empowering the community they have chosen to serve; achieving the goal of creating make-a-difference community television.
The committee said "We picked Georgian for the impact her program "MidLife Matters" has on her guests, their causes and the community at-large". With a mix of wisdom and wit, she discovers stories which are shared in conversation as TV. Georgian's story is representative of those she uncovers about aging well. Like her guest she is between age 40 and 75. Her adventure in cultivating impactful stories began in midlife. She is significantly involved in the program production. Each 30 minutes segment requires an equivalent number of hours to produce from guest identification, prep, scheduling, outlining, studio work and then video editing.
The executive director at the station where MidLife Matters is produced says "I have had the privilege to meet all Georgian's guests and hear first-hand how the experience of discovering their own story was unexpectedly transforming.
Georgian has produced her show "MidLife Matters" for the past 3 and half years. It has included a variety of journey stories as well as specific content about various topics such as women's health, employment, loss, addiction, care giving, continuing education, veterans, and so much more. She has made connections with all her guests and has helped to get their messages out to the community.
Culling from her experiences she has written 5 Ways to Grow after 5O available on Amazon. She is also a workshop presenter developing a program called Advice to Your Younger Self: Celebrate Your Story which provides insight for turning adversity into advocacy, finding your inside voice and networking.
Georgian is a Human Resource professional committed to helping women get the most out of midlife personally and professionally. Programs can be seen on WPAA-TV in Wallingford and on YouTube.


Modern Living Room Furniture Sets Published by at January 29, 2018 at 4:13 am.There is 41 images on the post of Modern Living Room Furniture Sets. To find Living Room Decoration Design Ideas on Uncategorized category. See more Modern Living Room Furniture Sets on Uncategorized Topics.
Here we have 41 beautiful design ideas of Modern Living Room Furniture Sets. We hope you enjoyed it and if you would like to see the high images resolution, simply click on the pictures and you will be redirected to extra large page Modern Living Room Furniture Sets. Then you still have a great day for new fresh inspiration today. don't forget to tell / spread design ideas from our website to your friends, relatives or families near you so they also feel the same with you.


On the Saturday morning in Hunstanton I had to take a walk to the shops, so used the walk as an opportunity to find the two caches in the town.
The first one was hidden in the fork of a tree on a green overlooking the sea, fortunately there was a convenient bench to sit on and look at the view while signing the log.
This cache was hidden in a car park, in a hole in the wall, probably a very busy place in the summer, but in the first week of November it was deserted.
In the afternoon I had an hour or two to spare, so I went out for a drive around the local villages to get some more of the local caches. The first was at a church in the old part of the town, the church is probably a busy place on Sunday morning, but on a Saturday afternoon the only people around were ducks on the duckpond by the wall covered in ivy in which the cache was hidden.
A cache at the village of Heacham named for the Norfolk Lavender Farm that is just outside the village. The cache is magnetic and hidden on a road sign.


text:
National field hockey championships visit UVic
Take in the championship game at 3 p.m. Sunday at the university
Colin Gall
The University of Victoria women's field hockey team competes in the 41st CIS-FHC field hockey championship, hosted here at home at the UVic turf.
Play began yesterday (Thursday, Nov. 5) with UVic taking on the University of Toronto. Play continues Friday, Nov. 6 when the Vikes face the University of British Columbia at 4 p.m., before UVic plays its final round-robin game against Guelph on Saturday, Nov. 7 at 12:30 p.m. The bronze medal game goes Sunday, Nov. 8 at 12:30 p.m., with the championship final at 3 p.m. For the full schedule, see en.cis-sic.ca
The UVic women's rugby team continues play this week at the 2015 Canadian Inter-university Sport women's rugby championship. The tournament, hosted by Queen's University in Kingston, Ont., kicked off on Thursday, Nov. 5, with UVic facing Concordia at 5 p.m. (EST). The Vikes are fighting for a spot in one of the two semi-final games, and hopefully on to the gold-medal final Sunday, Nov. 8 at 3 p.m. EST. Catch the action live on CIS-SIC.tv.
The Victoria Cougars play their only Vancouver Island Junior hockey game this week on Thursday, Oct. 12 when they host the Kerry Park Islanders at Archie Browning Arena. The puck drops at 7 p.m. – don't miss the chance to cheer on your team!
Victoria women's field hockey continues Sunday, Nov. 8 when the Patriots A team plays the Mariners at 9 a.m. at the UVic field.
On Wednesday, Nov. 11 the Blue Jays A team plays the Sailors at 6:30 p.m., also at UVic.
Division 1 rugby play has the UVic Norsemen playing James Bay Athletics Association Saturday, Nov. 7. Kick-off is at 2:45 p.m. at James Bay's Macdonald Park. Oak Bay's Castaway Wanderers 1 team is also in action Saturday, Nov. 7, welcoming Westshore 1 to Windsor Park at 1 p.m.
In Lower Island Women's Premier Soccer play, the Castaways Highlanders face Saanich Fusion at Tyndall field Saturday at 8 p.m.
Camosun Chargers are hard at it with the men's volleyball team hosting two home games this week. The local squad hosts the Douglas College Royals at PISE at 3 p.m. Saturday, Nov. 7. The following Friday, Nov. 13, the Chargers play the University of Fraser Valley Cascades at PISE, also at 3 p.m.
The Chargers women's volleyball team also play two at home this week, taking on Douglas College Saturday, Nov. 7 at 1 p.m. at PISE. On Friday, Nov. 13, the Chargers face the Cascades at 6 p.m., following the men's game at PISE.
And looking ahead to spring, registration for the 2016 Victoria Minor Ball Hockey Association season has opened. Registration closes on Jan. 1; visit vmbh.ca for details.
Colin Gall is a local athlete and Grade 11 student at Mt. Doug high school. Send your sports events to jocktalk@telus.net
T-Men's comeback falls short in Victoria
Ski & Board Film Fest shows Eversince


text:
Q: ArrayList Items inside of ArrayList Gets Repeated I'm making a GUI that stores the products (ArrayList) and the product items(ArrayList) of each product. However when I save, the Arraylist Items are changed and the recently saved item is getting repeated through out the whole ArrayList.
I expected the output to be (on second save):
[[1, TEST1, TEST1, TEST1, TEST1, TEST1, 2021-02-27], [2, TEST2, TEST2, TEST2, TEST2, TEST2, 2021-02-27]]

but instead it was:
[[2, TEST2, TEST2, TEST2, TEST2, TEST2, 2021-02-27], [2, TEST2, TEST2, TEST2, TEST2, TEST2, 2021-02-27]]

Is there something I'm missing? Any help would be appreciated.
My Code:
package prog2exer1;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.swing.table.DefaultTableModel;
import java.util.ArrayList;

public class Products extends javax.swing.JFrame {

          Date currentDate = new Date();
          DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
          String strDate = dateFormat.format(currentDate);
          ArrayList<ArrayList<String>> contentItems = new ArrayList();
          ArrayList<String> contents = new ArrayList();
          int id = 1;

    public Products() {
        initComponents();
        dateReceieved.setText(strDate);
        pID.setText(Integer.toString(id));
        DefaultTableModel tblmodel = (DefaultTableModel) products.getModel();
        tblmodel.setRowCount(0);
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();
        jLabel4 = new javax.swing.JLabel();
        jLabel6 = new javax.swing.JLabel();
        jLabel7 = new javax.swing.JLabel();
        jLabel8 = new javax.swing.JLabel();
        pID = new javax.swing.JTextField();
        pType = new javax.swing.JTextField();
        pDesc = new javax.swing.JTextField();
        pSupplier = new javax.swing.JTextField();
        quantityTrue = new javax.swing.JTextField();
        pCost = new javax.swing.JTextField();
        dateReceieved = new javax.swing.JTextField();
        jLabel9 = new javax.swing.JLabel();
        plusSign = new javax.swing.JLabel();
        quantityAdd = new javax.swing.JTextField();
        jPanel1 = new javax.swing.JPanel();
        jScrollPane1 = new javax.swing.JScrollPane();
        products = new javax.swing.JTable();
        jPanel2 = new javax.swing.JPanel();
        jScrollPane2 = new javax.swing.JScrollPane();
        jTable1 = new javax.swing.JTable();
        newProduct = new javax.swing.JButton();
        stockIn = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jLabel1.setText("Product ID");

        jLabel2.setText("Product Type");

        jLabel3.setText("Product Description");

        jLabel4.setText("Supplier");

        jLabel6.setText("Quantity");

        jLabel7.setText("Total Cost");

        jLabel8.setText("Date Received");

        pID.setEditable(false);

        dateReceieved.setEditable(false);

        jLabel9.setFont(new java.awt.Font("Dialog", 1, 18)); // NOI18N
        jLabel9.setText("New Products Stock-in");

        plusSign.setText("+");

        products.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null},
                {null, null, null, null, null, null}
            },
            new String [] {
                "ID", "pType", "pDesc", "Supplier", "Total Quantity", "Orders"
            }
        ));
        products.setCellSelectionEnabled(true);
        products.setFocusTraversalPolicyProvider(true);
        products.setName(""); // NOI18N
        jScrollPane1.setViewportView(products);
        products.getColumnModel().getSelectionModel().setSelectionMode(javax.swing.ListSelectionModel.SINGLE_INTERVAL_SELECTION);

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 735, Short.MAX_VALUE)
                .addContainerGap())
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup()
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 228, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(193, 193, 193))
        );

        jTable1.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null, null}
            },
            new String [] {
                "ID", "PType", "PDesc", "Supplier", "Quantity", "Cost", "Date Received", "Orders"
            }
        ));
        jScrollPane2.setViewportView(jTable1);

        javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
        jPanel2.setLayout(jPanel2Layout);
        jPanel2Layout.setHorizontalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel2Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 721, Short.MAX_VALUE)
                .addContainerGap())
        );
        jPanel2Layout.setVerticalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel2Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 411, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(16, Short.MAX_VALUE))
        );

        newProduct.setText("New Product");
        newProduct.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                newProductActionPerformed(evt);
            }
        });

        stockIn.setText("Stock In");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(27, 27, 27)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(layout.createSequentialGroup()
                                .addComponent(jLabel6)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(quantityTrue, javax.swing.GroupLayout.PREFERRED_SIZE, 82, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addGap(18, 18, 18)
                                .addComponent(plusSign, javax.swing.GroupLayout.PREFERRED_SIZE, 17, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(quantityAdd))
                            .addGroup(layout.createSequentialGroup()
                                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                    .addGroup(layout.createSequentialGroup()
                                        .addComponent(jLabel3)
                                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                        .addComponent(pDesc, javax.swing.GroupLayout.PREFERRED_SIZE, 124, javax.swing.GroupLayout.PREFERRED_SIZE))
                                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                                        .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
                                            .addComponent(jLabel7)
                                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                            .addComponent(pCost))
                                        .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
                                            .addComponent(jLabel4)
                                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                            .addComponent(pSupplier, javax.swing.GroupLayout.PREFERRED_SIZE, 119, javax.swing.GroupLayout.PREFERRED_SIZE))
                                        .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
                                            .addComponent(jLabel2)
                                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                            .addComponent(pType))
                                        .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
                                            .addComponent(jLabel1)
                                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                            .addComponent(pID, javax.swing.GroupLayout.PREFERRED_SIZE, 138, javax.swing.GroupLayout.PREFERRED_SIZE))
                                        .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
                                            .addComponent(jLabel8)
                                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                            .addComponent(dateReceieved)))
                                    .addComponent(stockIn)
                                    .addComponent(newProduct))
                                .addGap(0, 0, Short.MAX_VALUE))))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(83, 83, 83)
                        .addComponent(jLabel9)))
                .addGap(118, 118, 118)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(6, 6, 6)
                        .addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(50, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(36, 36, 36)
                .addComponent(jLabel9)
                .addGap(30, 30, 30)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(jLabel1)
                            .addComponent(pID, javax.swing.GroupLayout.PREFERRED_SIZE, 24, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(jLabel2)
                            .addComponent(pType))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(jLabel3)
                            .addComponent(pDesc))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(jLabel4)
                            .addComponent(pSupplier))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(jLabel6)
                            .addComponent(quantityTrue)
                            .addComponent(plusSign, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(quantityAdd))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(jLabel7)
                            .addComponent(pCost))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(jLabel8)
                            .addComponent(dateReceieved))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(newProduct)
                        .addGap(4, 4, 4)
                        .addComponent(stockIn)
                        .addGap(560, 560, 560))
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, 240, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))))
        );

        pack();
    }// </editor-fold>

    private void newProductActionPerformed(java.awt.event.ActionEvent evt) {
        DefaultTableModel tblmodel = (DefaultTableModel) products.getModel();

        contents.clear();

        contents.add(pID.getText());
        contents.add(pType.getText());
        contents.add(pDesc.getText());
        contents.add(pSupplier.getText());
        contents.add(quantityTrue.getText());
        contents.add(pCost.getText());
        contents.add(strDate);

        contentItems.add(contents);

        System.out.println(contents);
        System.out.println(contentItems);

        pID.setText(Integer.toString(id));
       id++;

    }

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new Products().setVisible(true);

            }
        });
    }

    // Variables declaration - do not modify
    private javax.swing.JTextField dateReceieved;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JLabel jLabel7;
    private javax.swing.JLabel jLabel8;
    private javax.swing.JLabel jLabel9;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JTable jTable1;
    private javax.swing.JButton newProduct;
    private javax.swing.JTextField pCost;
    private javax.swing.JTextField pDesc;
    private javax.swing.JTextField pID;
    private javax.swing.JTextField pSupplier;
    private javax.swing.JTextField pType;
    private javax.swing.JLabel plusSign;
    private javax.swing.JTable products;
    private javax.swing.JTextField quantityAdd;
    private javax.swing.JTextField quantityTrue;
    private javax.swing.JButton stockIn;
    // End of variables declaration

}

A: Instead of clearing contents in newProductActionPerformed create new content list:
 private void newProductActionPerformed(java.awt.event.ActionEvent evt) {
        DefaultTableModel tblmodel = (DefaultTableModel) products.getModel();

        contents.clear(); // wrong, you are using same content object...
        contents = new ArrayList();// create new object for each content


ERIE, Pennsylvania - July 14, 2017 - Architectural building products manufacturer, Kane Innovations, is pleased to announce and welcome new Texas-based hires Ken Cunningham and Timothy McGee. Ken and Timothy will oversee architectural railing installations as Project Site Superintendents in Austin and Houston, respectively; two rapidly-growing Kane Innovations territories.
Ken Cunningham, a seasoned superintendent of over 22 years, has managed a variety of projects in and around the Dallas region - from schools, churches and airports, to apartment homes, grocery stores, pharmacies and more. He's worked with a number of well-known general contracting companies - most recently UEB Builders - managing the construction of medical facilities from the ground up. Ken is OSHA 30 TX DOT Certified, has extensive environmental protection training and is fluent in Spanish. He resides near Galveston Bay, with his wife and three daughters.
Timothy McGee joins Kane Innovations as an established player in the San Antonio construction market. For over 16 years, he has championed numerous notable projects including the Lubbock County Detention Center, Laughlin Air Force Base, and the Freeman Coliseum. He holds OSHA 30 TX DOT and Corps of Engineers Quality Control certifications, and is a graduate of Tarleton State University. Timothy resides in Central Texas with this wife and two sons.
Mike Show said in a statement, "I am confident that Timothy and Ken will prove to be excellent new additions to our current group of dedicated on-site team members, by carefully managing the installation of Sterling Dula brand railing within our largest southern territories. Kane Innovations' record bookings and solid growth trajectory enables our company to continually recruit this type of highly skilled talent, which we find very exciting."


text:
EJ Montgomery returning to Kentucky for sophomore season
Photo: Regina Rickert
Posted: Wed 5:52 PM, May 29, 2019 |
Updated: Wed 6:22 PM, May 29, 2019
LEXINGTON, Ky. (WKYT) - Kentucky forward EJ Montgomery is planning on returning to Lexington for his sophomore season at Kentucky, according to a report.
ESPN's Adrian Wojnarowski was first to report Montgomery's decision as he had only hours left before the NBA Draft deadline. UK would later confirm the decision.
"BBN, I'm back. Year two," Montgomery said.
Montgomery joins Nick Richards, who announced Tuesday he would return for his junior season.
As a freshman, the 6-foot-10 Montgomery averaged 3.8 points and 4.1 rebounds per game in 37 games last season. He averaged 15 minutes per game. He was not projected to be a first-round pick.
Kentucky F EJ Montgomery will pull out of the 2019 NBA Draft and return to school for his sophomore season, source tells ESPN.
— Adrian Wojnarowski (@wojespn) May 29, 2019