Sometimes when you are not sure what -1 or the like will result in, you may wish to set the nth bit without using -1:
number = (((number | (1 << n)) ^ (1 << n))) | (x << n);
Explanation: ((number | (1 << n)
sets the nth bit to 1 (where |
denotes bitwise OR), then with (...) ^ (1 << n)
we set the nth bit to 0, and finally with (...) | x << n)
we set the nth bit that was 0, to (bit value) x
.
This also works in golang
.
The operators && and || are short-circuiting, meaning they will not evaluate their right-hand expression if the value of the left-hand expression is enough to determine the result.
With code clarity in mind, my opinion is that using XOR in boolean checks is not typical usage for the XOR bitwise operator. From my experience, bitwise XOR in Java is typically used to implement a mask flag toggle
behavior:
flags = flags ^ MASK;
This article by Vipan Singla explains the usage case more in detail.
If you need to use bitwise XOR as in your example, comment why you use it, since it's likely to require even a bitwise literate audience to stop in their tracks to understand why you are using it.
Left bit shifting to multiply by any power of two. Right bit shifting to divide by any power of two.
x = x << 5; // Left shift
y = y >> 5; // Right shift
In C/C++ it can be written as,
#include <math.h>
x = x * pow(2, 5);
y = y / pow(2, 5);
Usually, this problem resolve with using the modulo of a number in a loop or convert a number to a string. For convert a number to a string, you may can use the function itoa, so considering the variant with the modulo of a number in a loop.
Content of a file get_digits.c
$ cat get_digits.c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
// return a length of integer
unsigned long int get_number_count_digits(long int number);
// get digits from an integer number into an array
int number_get_digits(long int number, int **digits, unsigned int *len);
// for demo features
void demo_number_get_digits(long int number);
int
main()
{
demo_number_get_digits(-9999999999999);
demo_number_get_digits(-10000000000);
demo_number_get_digits(-1000);
demo_number_get_digits(-9);
demo_number_get_digits(0);
demo_number_get_digits(9);
demo_number_get_digits(1000);
demo_number_get_digits(10000000000);
demo_number_get_digits(9999999999999);
return EXIT_SUCCESS;
}
unsigned long int
get_number_count_digits(long int number)
{
if (number < 0)
number = llabs(number);
else if (number == 0)
return 1;
if (number < 999999999999997)
return floor(log10(number)) + 1;
unsigned long int count = 0;
while (number > 0) {
++count;
number /= 10;
}
return count;
}
int
number_get_digits(long int number, int **digits, unsigned int *len)
{
number = labs(number);
// termination count digits and size of a array as well as
*len = get_number_count_digits(number);
*digits = realloc(*digits, *len * sizeof(int));
// fill up the array
unsigned int index = 0;
while (number > 0) {
(*digits)[index] = (int)(number % 10);
number /= 10;
++index;
}
// reverse the array
unsigned long int i = 0, half_len = (*len / 2);
int swap;
while (i < half_len) {
swap = (*digits)[i];
(*digits)[i] = (*digits)[*len - i - 1];
(*digits)[*len - i - 1] = swap;
++i;
}
return 0;
}
void
demo_number_get_digits(long int number)
{
int *digits;
unsigned int len;
digits = malloc(sizeof(int));
number_get_digits(number, &digits, &len);
printf("%ld --> [", number);
for (unsigned int i = 0; i < len; ++i) {
if (i == len - 1)
printf("%d", digits[i]);
else
printf("%d, ", digits[i]);
}
printf("]\n");
free(digits);
}
Demo with the GNU GCC
$~/Downloads/temp$ cc -Wall -Wextra -std=c11 -o run get_digits.c -lm
$~/Downloads/temp$ ./run
-9999999999999 --> [9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9]
-10000000000 --> [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
-1000 --> [1, 0, 0, 0]
-9 --> [9]
0 --> [0]
9 --> [9]
1000 --> [1, 0, 0, 0]
10000000000 --> [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
9999999999999 --> [9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9]
Demo with the LLVM/Clang
$~/Downloads/temp$ rm run
$~/Downloads/temp$ clang -std=c11 -Wall -Wextra get_digits.c -o run -lm
setivolkylany$~/Downloads/temp$ ./run
-9999999999999 --> [9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9]
-10000000000 --> [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
-1000 --> [1, 0, 0, 0]
-9 --> [9]
0 --> [0]
9 --> [9]
1000 --> [1, 0, 0, 0]
10000000000 --> [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
9999999999999 --> [9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9]
Testing environment
$~/Downloads/temp$ cc --version | head -n 1
cc (Debian 4.9.2-10) 4.9.2
$~/Downloads/temp$ clang --version
Debian clang version 3.5.0-10 (tags/RELEASE_350/final) (based on LLVM 3.5.0)
Target: x86_64-pc-linux-gnu
Thread model: posix
The Bitwise complement operator(~) is a unary operator.
It works as per the following methods
First it converts the given decimal number to its corresponding binary value.That is in case of 2 it first convert 2 to 0000 0010 (to 8 bit binary number).
Then it converts all the 1 in the number to 0,and all the zeros to 1;then the number will become 1111 1101.
that is the 2's complement representation of -3.
In order to find the unsigned value using complement,i.e. simply to convert 1111 1101 to decimal (=4294967293) we can simply use the %u during printing.
Anding an integer with 0xFF
leaves only the least significant byte. For example, to get the first byte in a short s
, you can write s & 0xFF
. This is typically referred to as "masking". If byte1
is either a single byte type (like uint8_t
) or is already less than 256 (and as a result is all zeroes except for the least significant byte) there is no need to mask out the higher bits, as they are already zero.
See tristopiaPatrick Schlüter's answer below when you may be working with signed types. When doing bitwise operations, I recommend working only with unsigned types.
These examples cover the three types of shifts applied to both a positive and a negative number:
// Signed left shift on 626348975
00100101010101010101001110101111 is 626348975
01001010101010101010011101011110 is 1252697950 after << 1
10010101010101010100111010111100 is -1789571396 after << 2
00101010101010101001110101111000 is 715824504 after << 3
// Signed left shift on -552270512
11011111000101010000010101010000 is -552270512
10111110001010100000101010100000 is -1104541024 after << 1
01111100010101000001010101000000 is 2085885248 after << 2
11111000101010000010101010000000 is -123196800 after << 3
// Signed right shift on 626348975
00100101010101010101001110101111 is 626348975
00010010101010101010100111010111 is 313174487 after >> 1
00001001010101010101010011101011 is 156587243 after >> 2
00000100101010101010101001110101 is 78293621 after >> 3
// Signed right shift on -552270512
11011111000101010000010101010000 is -552270512
11101111100010101000001010101000 is -276135256 after >> 1
11110111110001010100000101010100 is -138067628 after >> 2
11111011111000101010000010101010 is -69033814 after >> 3
// Unsigned right shift on 626348975
00100101010101010101001110101111 is 626348975
00010010101010101010100111010111 is 313174487 after >>> 1
00001001010101010101010011101011 is 156587243 after >>> 2
00000100101010101010101001110101 is 78293621 after >>> 3
// Unsigned right shift on -552270512
11011111000101010000010101010000 is -552270512
01101111100010101000001010101000 is 1871348392 after >>> 1
00110111110001010100000101010100 is 935674196 after >>> 2
00011011111000101010000010101010 is 467837098 after >>> 3
If you want to operate on bytes or words then you'll be better to use Python's array type instead of a string. If you are working with fixed length blocks then you may be able to use H or L format to operate on words rather than bytes, but I just used 'B' for this example:
>>> import array
>>> a1 = array.array('B', 'Hello, World!')
>>> a1
array('B', [72, 101, 108, 108, 111, 44, 32, 87, 111, 114, 108, 100, 33])
>>> a2 = array.array('B', ('secret'*3))
>>> for i in range(len(a1)):
a1[i] ^= a2[i]
>>> a1.tostring()
';\x00\x0f\x1e\nXS2\x0c\x00\t\x10R'
Masking means to keep/change/remove a desired part of information. Lets see an image-masking operation; like- this masking operation is removing any thing that is not skin-
We are doing AND operation in this example. There are also other masking operators- OR, XOR.
Bit-Masking means imposing mask over bits. Here is a bit-masking with AND-
1 1 1 0 1 1 0 1 [input] (&) 0 0 1 1 1 1 0 0 [mask] ------------------------------ 0 0 1 0 1 1 0 0 [output]
So, only the middle 4 bits (as these bits are 1
in this mask) remain.
Lets see this with XOR-
1 1 1 0 1 1 0 1 [input] (^) 0 0 1 1 1 1 0 0 [mask] ------------------------------ 1 1 0 1 0 0 0 1 [output]
Now, the middle 4 bits are flipped (1
became 0
, 0
became 1
).
So, using bit-mask we can access individual bits [examples]. Sometimes, this technique may also be used for improving performance. Take this for example-
bool isOdd(int i) {
return i%2;
}
This function tells if an integer is odd/even. We can achieve the same result with more efficiency using bit-mask-
bool isOdd(int i) {
return i&1;
}
Short Explanation: If the least significant bit of a binary number is 1
then it is odd; for 0
it will be even. So, by doing AND with 1
we are removing all other bits except for the least significant bit i.e.:
55 -> 0 0 1 1 0 1 1 1 [input] (&) 1 -> 0 0 0 0 0 0 0 1 [mask] --------------------------------------- 1 <- 0 0 0 0 0 0 0 1 [output]
Logical ||
and &&
check the right hand side only if necessary. The |
and &
check both the sides everytime.
For example:
int i = 12;
if (i == 10 & i < 9) // It will check if i == 10 and if i < 9
...
Rewrite it:
int i = 12;
if (i == 10 && i < 9) // It will check if i == 10 and stop checking afterward because i != 10
...
Another example:
int i = 12;
if (i == 12 | i > 10) // It will check if i == 12 and it will check if i > 10
...
Rewrite it:
int i = 12;
if (i == 12 || i > 10) // It will check if i == 12, it does, so it stops checking and executes what is in the if statement
...
You can use something like this
("{:0%db}"%length).format(num)
In addition to the answer of "dasblinkenlight" I think an example could help. I will only use 8 bits for a better understanding.
x & 1
produces a value that is either1
or0
, depending on the least significant bit ofx
: if the last bit is1
, the result ofx & 1
is1
; otherwise, it is0
. This is a bitwise AND operation.
This is because 1
will be represented in bits as 00000001
. Only the last bit is set to 1
. Let's assume x
is 185
which will be represented in bits as 10111001
. If you apply a bitwise AND operation on x
with 1
this will be the result:
00000001
10111001
--------
00000001
The first seven bits of the operation result will be 0
after the operation and will carry no information in this case (see Logical AND operation). Because whatever the first seven bits of the operand x
were before, after the operation they will be 0
. But the last bit of the operand 1
is 1
and it will reveal if the last bit of operand x
was 0
or 1
. So in this example the result of the bitwise AND operation will be 1
because our last bit of x
is 1
. If the last bit would have been 0
, then the result would have been also 0
, indicating that the last bit of operand x
is 0
:
00000001
10111000
--------
00000000
x >>= 1
means "setx
to itself shifted by one bit to the right". The expression evaluates to the new value ofx
after the shift
Let's pick the example from above. For x >>= 1
this would be:
10111001
--------
01011100
And for left shift x <<= 1
it would be:
10111001
--------
01110010
Please pay attention to the note of user "dasblinkenlight" in regard to shifts.
&&
and ||
are called short circuit operators. When they are used, for ||
- if the first operand evaluates to true
, then the rest of the operands are not evaluated. For &&
- if the first operand evaluates to false
, the rest of them don't get evaluated at all.
so if (a || (++x > 0))
in this example the variable x won't get incremented if a was true
.
This could also caused by mismatching brace/parenthesis.
$(TARGET}:
do_something
Just use parenthesises and you'll be fine.
Alert will block the program flow so you can just write the following.
echo ("<script LANGUAGE='JavaScript'>
window.alert('Succesfully Updated');
window.location.href='http://someplace.com';
</script>");
The division operator is /
rather than \
.
Also, the backslash has a special meaning inside a Python string. Either escape it with another backslash:
"\\ 1.5 = "`
or use a raw string
r" \ 1.5 = "
I am both a web developer and a former employee of one of the companies you mentioned. I completely understand where you're coming from. Verifying addresses seems like a simple problem to tackle, but it's very much an iceberg. I suppose one workaround to the legal constraints of the Google or Yahoo! Maps APIs is to request your users verify their addresses on a map. If I were in your shoes, though, I wouldn't go that route.
The reason address verification services are so expensive is that they require licenses and ongoing relationships with grumpy, bureaucratic postal authorities (including the Royal Mail). Unfortunately, postal authorities are the best (and often the only) sources of data against which to verify addresses, so there really isn't any other way to go about it. The bottom line is you need to weigh the cost of bad addresses (usually a question of mail volume) against the cost of the software to verify them. Irish postal data is even more rubbish than Irish postal formats (which frequently omit building numbers), so there's little you can do about those addresses.
A non-Javascript alternative that can be easily overlooked: can you use the readonly
attribute instead of the disabled
attribute? It prevents editing the text in the input, but browsers style the input differently (less likely to "grey it out")
e.g. <input readonly type="text" ...>
require 'json'
{"foo" => "bar"}.to_json
# => "{\"foo\":\"bar\"}"
import javax.swing.Action;
import javax.swing.ButtonGroup;
import javax.swing.Icon;
import javax.swing.JRadioButton;
import javax.swing.JToggleButton;
public class RadioButton extends JRadioButton {
public class RadioButtonModel extends JToggleButton.ToggleButtonModel {
public Object[] getSelectedObjects() {
if ( isSelected() ) {
return new Object[] { RadioButton.this };
} else {
return new Object[0];
}
}
public RadioButton getButton() { return RadioButton.this; }
}
public RadioButton() { super(); setModel(new RadioButtonModel()); }
public RadioButton(Action action) { super(action); setModel(new RadioButtonModel()); }
public RadioButton(Icon icon) { super(icon); setModel(new RadioButtonModel()); }
public RadioButton(String text) { super(text); setModel(new RadioButtonModel()); }
public RadioButton(Icon icon, boolean selected) { super(icon, selected); setModel(new RadioButtonModel()); }
public RadioButton(String text, boolean selected) { super(text, selected); setModel(new RadioButtonModel()); }
public RadioButton(String text, Icon icon) { super(text, icon); setModel(new RadioButtonModel()); }
public RadioButton(String text, Icon icon, boolean selected) { super(text, icon, selected); setModel(new RadioButtonModel()); }
public static void main(String[] args) {
RadioButton b1 = new RadioButton("A");
RadioButton b2 = new RadioButton("B");
ButtonGroup group = new ButtonGroup();
group.add(b1);
group.add(b2);
b2.setSelected(true);
RadioButtonModel model = (RadioButtonModel)group.getSelection();
System.out.println(model.getButton().getText());
}
}
Here is my whole code of a map activity with 4 clickable markers. Click on a marker shows an info window, and after click on info window you are going to another activity: English, German, Spanish or Italian. If you want to use OnMarkerClickListener in spite of OnInfoWindowClickListener, you just have to swap this line:
mMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener()
to this:
mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener()
this line:
public void onInfoWindowClick(Marker arg0)
to this:
public boolean onMarkerClick(Marker arg0)
and at the end of the method "onMarkerClick":
return true;
I think it may be helpful for someone ;)
package pl.pollub.translator;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.widget.Toast;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {
private GoogleMap mMap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
Toast.makeText(this, "Choose a language.", Toast.LENGTH_LONG).show();
}
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
mMap.setOnInfoWindowClickListener(new GoogleMap.OnInfoWindowClickListener()
{
@Override
public void onInfoWindowClick(Marker arg0) {
if(arg0 != null && arg0.getTitle().equals("English")){
Intent intent1 = new Intent(MapsActivity.this, English.class);
startActivity(intent1);}
if(arg0 != null && arg0.getTitle().equals("German")){
Intent intent2 = new Intent(MapsActivity.this, German.class);
startActivity(intent2);}
if(arg0 != null && arg0.getTitle().equals("Italian")){
Intent intent3 = new Intent(MapsActivity.this, Italian.class);
startActivity(intent3);}
if(arg0 != null && arg0.getTitle().equals("Spanish")){
Intent intent4 = new Intent(MapsActivity.this, Spanish.class);
startActivity(intent4);}
}
});
LatLng greatBritain = new LatLng(51.30, -0.07);
LatLng germany = new LatLng(52.3107, 13.2430);
LatLng italy = new LatLng(41.53, 12.29);
LatLng spain = new LatLng(40.25, -3.41);
mMap.addMarker(new MarkerOptions()
.position(greatBritain)
.title("English")
.snippet("Click on me:)"));
mMap.addMarker(new MarkerOptions()
.position(germany)
.title("German")
.snippet("Click on me:)"));
mMap.addMarker(new MarkerOptions()
.position(italy)
.title("Italian")
.snippet("Click on me:)"));
mMap.addMarker(new MarkerOptions()
.position(spain)
.title("Spanish")
.snippet("Click on me:)"));
mMap.moveCamera(CameraUpdateFactory.newLatLng(greatBritain));
mMap.moveCamera(CameraUpdateFactory.newLatLng(germany));
mMap.moveCamera(CameraUpdateFactory.newLatLng(italy));
mMap.moveCamera(CameraUpdateFactory.newLatLng(spain));
}
}
Here's some info from my blog on how I like to use formular1c1 outside of vba:
You’ve just finished writing a formula, copied it to the whole spreadsheet, formatted everything and you realize that you forgot to make a reference absolute: every formula needed to reference Cell B2 but now, they all reference different cells.
How are you going to do a Find/Replace on the cells, considering that one has B5, the other C12, the third D25, etc., etc.?
The easy way is to update your Reference Style to R1C1. The R1C1 reference works with relative positioning: R marks the Row, C the Column and the numbers that follow R and C are either relative positions (between [ ]) or absolute positions (no [ ]).
Examples:
What does it matter? Well, When you wrote your first formula back in the beginning of this post, B2 was the cell 4 rows above the cell you wrote it in, i.e. R[-4]C. When you copy it across and down, while the A1 reference changes, the R1C1 reference doesn’t. Throughout the whole spreadsheet, it’s R[-4]C. If you switch to R1C1 Reference Style, you can replace R[-4]C by R2C2 ($B$2) with a simple Find / Replace and be done in one fell swoop.
You should debug first, to help identify your level of XML hell. In my opinion, the first step is to add
-Djavax.xml.parsers.SAXParserFactory=com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl
-Djavax.xml.transform.TransformerFactory=com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl
-Djavax.xml.parsers.DocumentBuilderFactory=com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl
to the command line. If that works, then start excluding libraries. If not, then add
-Djaxp.debug=1
to the command-line.
To check battery percentage we use BatteryManager, the following method will return battery percentage.
Source Link
public static float getBatteryLevel(Context context, Intent intent) {
Intent batteryStatus = context.registerReceiver(null,
new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
int batteryLevel = -1;
int batteryScale = 1;
if (batteryStatus != null) {
batteryLevel = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, batteryLevel);
batteryScale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, batteryScale);
}
return batteryLevel / (float) batteryScale * 100;
}
http://jdpgrailsdev.github.io/blog/2014/09/09/spring_data_hibernate_join.html
from this link:
if you are using JPA on top of Hibernate, there is no way to set the FetchMode used by Hibernate to JOINHowever, if you are using JPA on top of Hibernate, there is no way to set the FetchMode used by Hibernate to JOIN.
The Spring Data JPA library provides a Domain Driven Design Specifications API that allows you to control the behavior of the generated query.
final long userId = 1;
final Specification<User> spec = new Specification<User>() {
@Override
public Predicate toPredicate(final Root<User> root, final
CriteriaQuery<?> query, final CriteriaBuilder cb) {
query.distinct(true);
root.fetch("permissions", JoinType.LEFT);
return cb.equal(root.get("id"), userId);
}
};
List<User> users = userRepository.findAll(spec);
In my case, This is a bug of the early version iOS13.
https://forums.developer.apple.com/thread/128435
kambala
Mar 25, 2020 12:41 AM
FYI this is fixed in 13.4 release
You can use kill-port. In firstly, kill exist port and in secondly create server and listen.
const kill = require('kill-port')
kill(port, 'tcp')
.then((d) => {
/**
* Create HTTP server.
*/
server = http.createServer(app);
server.listen(port, () => {
console.log(`api running on port:${port}`);
});
})
.catch((e) => {
console.error(e);
})
If you want an argument that might appeal to a boss: Think about what a URL is. URLs are public. People copy and paste them. They share them, they put them on advertisements. Nothing prevents someone (knowingly or not) from mailing that URL around for other people to use. If your API key is in that URL, everybody has it.
If all you want is to invoke foo
, and you prefer to propagate the exception as is (without wrapping), you can also just use Java's for
loop instead (after turning the Stream into an Iterable with some trickery):
for (A a : (Iterable<A>) as::iterator) {
a.foo();
}
This is, at least, what I do in my JUnit tests, where I don't want to go through the trouble of wrapping my checked exceptions (and in fact prefer my tests to throw the unwrapped original ones)
If you want, you can deactivate this feature in your git core config using
git config core.autocrlf false
But it would be better to just get rid of the warnings using
git config core.autocrlf true
I use rake db:reset
which drops and then recreates the database and includes your seeds.rb file.
http://guides.rubyonrails.org/migrations.html#resetting-the-database
We can also get the version by looking at the version of the hive-metastore jar file.
For example:
$ ls /usr/lib/hive/lib/ | grep metastore
hive-metastore-0.13.1.jar
I created the Path Length Checker tool for this purpose, which is a nice, free GUI app that you can use to see the path lengths of all files and directories in a given directory.
I've also written and blogged about a simple PowerShell script for getting file and directory lengths. It will output the length and path to a file, and optionally write it to the console as well. It doesn't limit to displaying files that are only over a certain length (an easy modification to make), but displays them descending by length, so it's still super easy to see which paths are over your threshold. Here it is:
$pathToScan = "C:\Some Folder" # The path to scan and the the lengths for (sub-directories will be scanned as well).
$outputFilePath = "C:\temp\PathLengths.txt" # This must be a file in a directory that exists and does not require admin rights to write to.
$writeToConsoleAsWell = $true # Writing to the console will be much slower.
# Open a new file stream (nice and fast) and write all the paths and their lengths to it.
$outputFileDirectory = Split-Path $outputFilePath -Parent
if (!(Test-Path $outputFileDirectory)) { New-Item $outputFileDirectory -ItemType Directory }
$stream = New-Object System.IO.StreamWriter($outputFilePath, $false)
Get-ChildItem -Path $pathToScan -Recurse -Force | Select-Object -Property FullName, @{Name="FullNameLength";Expression={($_.FullName.Length)}} | Sort-Object -Property FullNameLength -Descending | ForEach-Object {
$filePath = $_.FullName
$length = $_.FullNameLength
$string = "$length : $filePath"
# Write to the Console.
if ($writeToConsoleAsWell) { Write-Host $string }
#Write to the file.
$stream.WriteLine($string)
}
$stream.Close()
Extract substring between two string (excluding this two strings)
let allText = "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum";
let textBefore = "five centuries,";
let textAfter = "electronic typesetting";
var regExp = new RegExp(`(?<=${textBefore}\\s)(.+?)(?=\\s+${textAfter})`, "g");
var results = regExp.exec(allText);
if (results && results.length > 1) {
console.log(results[0]);
}
For users who find this question, you can pass photos to the instagram sharing flow (from your app to the filters screen) on iPhone using iPhone hooks: http://help.instagram.com/355896521173347 Other than that, there is currently no way in version 1 of the api.
clean and simple ES6 (Babel)
const maxValueOfY = Math.max(...arrayToSearchIn.map(o => o.y), 0);
The second parameter should ensure a default value if arrayToSearchIn
is empty.
According to your scenario, IllegalArgumentException
is the best pick, because null
is not a valid value for your property.
Datanewolf's code is ALMOST right. I had to reverse both the winding and the normals to make it work properly with the fixed pipeline. The below works correctly with cull on or off for me:
std::vector<GLfloat> vertices;
std::vector<GLfloat> normals;
std::vector<GLfloat> texcoords;
std::vector<GLushort> indices;
float const R = 1./(float)(rings-1);
float const S = 1./(float)(sectors-1);
int r, s;
vertices.resize(rings * sectors * 3);
normals.resize(rings * sectors * 3);
texcoords.resize(rings * sectors * 2);
std::vector<GLfloat>::iterator v = vertices.begin();
std::vector<GLfloat>::iterator n = normals.begin();
std::vector<GLfloat>::iterator t = texcoords.begin();
for(r = 0; r < rings; r++) for(s = 0; s < sectors; s++) {
float const y = sin( -M_PI_2 + M_PI * r * R );
float const x = cos(2*M_PI * s * S) * sin( M_PI * r * R );
float const z = sin(2*M_PI * s * S) * sin( M_PI * r * R );
*t++ = s*S;
*t++ = r*R;
*v++ = x * radius;
*v++ = y * radius;
*v++ = z * radius;
*n++ = -x;
*n++ = -y;
*n++ = -z;
}
indices.resize(rings * sectors * 4);
std::vector<GLushort>::iterator i = indices.begin();
for(r = 0; r < rings-1; r++)
for(s = 0; s < sectors-1; s++) {
/*
*i++ = r * sectors + s;
*i++ = r * sectors + (s+1);
*i++ = (r+1) * sectors + (s+1);
*i++ = (r+1) * sectors + s;
*/
*i++ = (r+1) * sectors + s;
*i++ = (r+1) * sectors + (s+1);
*i++ = r * sectors + (s+1);
*i++ = r * sectors + s;
}
Edit: There was a question on how to draw this... in my code I encapsulate these values in a G3DModel class. This is my code to setup the frame, draw the model, and end it:
void GraphicsProvider3DPriv::BeginFrame()const{
int win_width;
int win_height;// framework of choice here
glfwGetWindowSize(window, &win_width, &win_height); // retrieve window
float const win_aspect = (float)win_width / (float)win_height;
// set lighting
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_DEPTH_TEST);
GLfloat lightpos[] = {0, 0.0, 0, 0.};
glLightfv(GL_LIGHT0, GL_POSITION, lightpos);
GLfloat lmodel_ambient[] = { 0.2, 0.2, 0.2, 1.0 };
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
// set up world transform
glClearColor(0.f, 0.f, 0.f, 1.f);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT|GL_ACCUM_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45, win_aspect, 1, 10);
glMatrixMode(GL_MODELVIEW);
}
void GraphicsProvider3DPriv::DrawModel(const G3DModel* model, const Transform3D transform)const{
G3DModelPriv* privModel = (G3DModelPriv *)model;
glPushMatrix();
glLoadMatrixf(transform.GetOGLData());
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, &privModel->vertices[0]);
glNormalPointer(GL_FLOAT, 0, &privModel->normals[0]);
glTexCoordPointer(2, GL_FLOAT, 0, &privModel->texcoords[0]);
glEnable(GL_TEXTURE_2D);
//glFrontFace(GL_CCW);
glEnable(GL_CULL_FACE);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, privModel->texname);
glDrawElements(GL_QUADS, privModel->indices.size(), GL_UNSIGNED_SHORT, &privModel->indices[0]);
glPopMatrix();
glDisable(GL_TEXTURE_2D);
}
void GraphicsProvider3DPriv::EndFrame()const{
/* Swap front and back buffers */
glDisable(GL_LIGHTING);
glDisable(GL_LIGHT0);
glDisable(GL_CULL_FACE);
glfwSwapBuffers(window);
/* Poll for and process events */
glfwPollEvents();
}
I know this is extremely late, but for anyone still wondering here's an easy solution.
You could just make an array for the styles :
this.state ={
color: "#fff"
}
style={[
styles.jewelstyle, {
backgroundColor: this.state.BGcolor
}
The second will override any original background color as stated in the stylesheet. Then have a function that changes the color:
generateNewColor(){
var randomColor = '#'+Math.floor(Math.random()*16777215).toString(16);
this.setState({BGcolor: randomColor})
}
This will generate a random hex color. Then just call that function whenever and bam, new background color.
public class ImageButton extends JButton {
protected ImageButton(){
}
@Override
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
Image img = Toolkit.getDefaultToolkit().getImage("water.bmp");
g2.drawImage(img, 45, 35, this);
g2.finalize();
}
}
OR use this code
class MyButton extends JButton {
Image image;
ImageObserver imageObserver;
MyButtonl(String filename) {
super();
ImageIcon icon = new ImageIcon(filename);
image = icon.getImage();
imageObserver = icon.getImageObserver();
}
public void paint( Graphics g ) {
super.paint( g );
g.drawImage(image, 0 , 0 , getWidth() , getHeight() , imageObserver);
}
}
By combining PIPESTATUS[0]
and the result of executing the exit
command in a subshell, you can directly access the return value of your initial command:
command | tee ; ( exit ${PIPESTATUS[0]} )
Here's an example:
# the "false" shell built-in command returns 1
false | tee ; ( exit ${PIPESTATUS[0]} )
echo "return value: $?"
will give you:
return value: 1
Add the following to your build.gradle
apply plugin: 'eclipse'
and browse to the project directory
gradle eclipse
Once done, you could import the project from eclipse as simple Java Project.
git stash list
to list your stashed changes.
git stash show
to see what n
is in the below commands.
git stash apply
to apply the most recent stash.
git stash apply stash@{n}
to apply an older stash.
https://git-scm.com/book/en/v2/Git-Tools-Stashing-and-Cleaning
This is possible if the browser supports the download
property in anchor elements.
var sampleBytes = new Int8Array(4096);
var saveByteArray = (function () {
var a = document.createElement("a");
document.body.appendChild(a);
a.style = "display: none";
return function (data, name) {
var blob = new Blob(data, {type: "octet/stream"}),
url = window.URL.createObjectURL(blob);
a.href = url;
a.download = name;
a.click();
window.URL.revokeObjectURL(url);
};
}());
saveByteArray([sampleBytes], 'example.txt');
JSFiddle: http://jsfiddle.net/VB59f/2
You can try another way like that:
<div class="content">
Australia
</div>
jQuery code:
$(".content").css({
background: "#d1d1d1",
fontSize: "30px"
})
Now you can add more css property as you want.
I also got this error, but for a .h
file. The fix was to go into the file Properties
(via Solution Explorer's file popup menu) and set the file type correctly. It was set to C/C++ Compiler
instead of the correct C/C++ header
.
I realize that this is an old question, but here's a plugin to address this issue that someone might find useful.
https://github.com/madbook/jquery.wait
lets you do this:
$('#myElement').addClass('load').wait(5000).addClass('done');
The reason why you should use .wait
instead of .delay
is because not all jquery functions are supported by .delay
and that .delay
only works with animation functions. For example delay does not support .addClass
and .removeClass
Or you can use this function instead.
function sleep(milliseconds) {
var start = new Date().getTime();
for (var i = 0; i < 1e7; i++) {
if ((new Date().getTime() - start) > milliseconds){
break;
}
}
}
sleep(5000);
How about with a :before
pseudoelement:
a:before {
content: '\a';
white-space: pre;
}
Note that __file__
will give the file where this code resides, which can be imported and different from the main file being interpreted. To get the main file, the special __main__ module can be used:
import __main__ as main
print(main.__file__)
Note that __main__.__file__
works in Python 2.7 but not in 3.2, so use the import-as syntax as above to make it portable.
I'm not sure about HQL, but in JPA you just call the query's setParameter
with the parameter and collection.
Query q = entityManager.createQuery("SELECT p FROM Peron p WHERE name IN (:names)");
q.setParameter("names", names);
where names
is the collection of names you're searching for
Collection<String> names = new ArrayList<String();
names.add("Joe");
names.add("Jane");
names.add("Bob");
success
has been the traditional name of the success callback in jQuery, defined as an option in the ajax call. However, since the implementation of $.Deferreds
and more sophisticated callbacks, done
is the preferred way to implement success callbacks, as it can be called on any deferred
.
For example, success:
$.ajax({
url: '/',
success: function(data) {}
});
For example, done:
$.ajax({url: '/'}).done(function(data) {});
The nice thing about done
is that the return value of $.ajax
is now a deferred promise that can be bound to anywhere else in your application. So let's say you want to make this ajax call from a few different places. Rather than passing in your success function as an option to the function that makes this ajax call, you can just have the function return $.ajax
itself and bind your callbacks with done
, fail
, then
, or whatever. Note that always
is a callback that will run whether the request succeeds or fails. done
will only be triggered on success.
For example:
function xhr_get(url) {
return $.ajax({
url: url,
type: 'get',
dataType: 'json',
beforeSend: showLoadingImgFn
})
.always(function() {
// remove loading image maybe
})
.fail(function() {
// handle request failures
});
}
xhr_get('/index').done(function(data) {
// do stuff with index data
});
xhr_get('/id').done(function(data) {
// do stuff with id data
});
An important benefit of this in terms of maintainability is that you've wrapped your ajax mechanism in an application-specific function. If you decide you need your $.ajax
call to operate differently in the future, or you use a different ajax method, or you move away from jQuery, you only have to change the xhr_get
definition (being sure to return a promise or at least a done
method, in the case of the example above). All the other references throughout the app can remain the same.
There are many more (much cooler) things you can do with $.Deferred
, one of which is to use pipe
to trigger a failure on an error reported by the server, even when the $.ajax
request itself succeeds. For example:
function xhr_get(url) {
return $.ajax({
url: url,
type: 'get',
dataType: 'json'
})
.pipe(function(data) {
return data.responseCode != 200 ?
$.Deferred().reject( data ) :
data;
})
.fail(function(data) {
if ( data.responseCode )
console.log( data.responseCode );
});
}
xhr_get('/index').done(function(data) {
// will not run if json returned from ajax has responseCode other than 200
});
Read more about $.Deferred
here: http://api.jquery.com/category/deferred-object/
NOTE: As of jQuery 1.8, pipe
has been deprecated in favor of using then
in exactly the same way.
Here's the way I do it with argparse
(with multiple args):
parser = argparse.ArgumentParser(description='Description of your program')
parser.add_argument('-f','--foo', help='Description for foo argument', required=True)
parser.add_argument('-b','--bar', help='Description for bar argument', required=True)
args = vars(parser.parse_args())
args
will be a dictionary containing the arguments:
if args['foo'] == 'Hello':
# code here
if args['bar'] == 'World':
# code here
In your case simply add only one argument.
There's time.ParseDuration
which will happily accept negative durations, as per manual. Otherwise put, there's no need to negate a duration where you can get an exact duration in the first place.
E.g. when you need to substract an hour and a half, you can do that like so:
package main
import (
"fmt"
"time"
)
func main() {
now := time.Now()
fmt.Println("now:", now)
duration, _ := time.ParseDuration("-1.5h")
then := now.Add(duration)
fmt.Println("then:", then)
}
jQuery < 1.8
May I suggest that you use $.ajax()
instead of $.post()
as it's much more customizable.
If you are calling $.post()
, e.g., like this:
$.post( url, data, success, dataType );
You could turn it into its $.ajax()
equivalent:
$.ajax({
type: 'POST',
url: url,
data: data,
success: success,
dataType: dataType,
async:false
});
Please note the async:false
at the end of the $.ajax()
parameter object.
Here you have a full detail of the $.ajax()
parameters: jQuery.ajax() – jQuery API Documentation.
jQuery >=1.8 "async:false" deprecation notice
jQuery >=1.8 won't block the UI during the http request, so we have to use a workaround to stop user interaction as long as the request is processed. For example:
$.ajax()
, and then remove it when the AJAX .done()
callback is called.Please have a look at this answer for an example.
sys.executable is not reliable if working in an embedded python environment. My suggestions is to deduce it from
import os
os.__file__
$(function () {
$('.datetimepicker').datetimepicker(
{
format: 'Y-m-d h:m:s'
}
);
});`
You can use the function MROUND(<reference cell>, <round to multiple of digit needed>)
.
Example:
For a value A1 = 21
round to multiple of 10 it would be written as
=MROUND(A1,10)
for which Result = 20
For a value Z4 = 55.1
round to multiple of 10 it would be written as
=MROUND(Z4,10)
for which Result = 60
You may also try contenteditable
attribute onto a normal p
or div
. Not really a textarea
but it will auto-resize without script.
.divtext {
border: ridge 2px;
padding: 5px;
width: 20em;
min-height: 5em;
overflow: auto;
}
_x000D_
<div class="divtext" contentEditable>Hello World</div>
_x000D_
try this code its very simple and usefull
public boolean isMockLocationEnabled() {
boolean isMockLocation = false;
try {
//if marshmallow
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
AppOpsManager opsManager = (AppOpsManager) getApplicationContext().getSystemService(Context.APP_OPS_SERVICE);
isMockLocation = (opsManager.checkOp(AppOpsManager.OPSTR_MOCK_LOCATION, android.os.Process.myUid(), BuildConfig.APPLICATION_ID)== AppOpsManager.MODE_ALLOWED);
} else {
// in marshmallow this will always return true
isMockLocation = !android.provider.Settings.Secure.getString(getApplicationContext().getContentResolver(), "mock_location").equals("0");
}
} catch (Exception e) {
return isMockLocation;
}
return isMockLocation;
}
A small but important detail for adjusting figure size on a one-off basis (as several commenters above reported "this doesn't work for me"):
You should do plt.figure(figsize=(,)) PRIOR to defining your actual plot. For example:
This should correctly size the plot according to your specified figsize:
values = [1,1,1,2,2,3]
_ = plt.figure(figsize=(10,6))
_ = plt.hist(values,bins=3)
plt.show()
Whereas this will show the plot with the default settings, seeming to "ignore" figsize:
values = [1,1,1,2,2,3]
_ = plt.hist(values,bins=3)
_ = plt.figure(figsize=(10,6))
plt.show()
git pull
is really just a shorthand for git pull <remote> <branchname>
, in most cases it's equivalent to git pull origin master
. You will need to add another remote and pull explicitly from it. This page describes it in detail:
you can also use
$result = curl_exec($ch);
return response()->json(json_decode($result));
//
syntaxregex.test(string)
, not string.test(regex)
So
jQuery(function () {
$(".mail").keyup(function () {
var VAL = this.value;
var email = new RegExp('^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$');
if (email.test(VAL)) {
alert('Great, you entered an E-Mail-address');
}
});
});
You can use PyInstaller. It generates a build dist so you can execute it as a single "binary" file.
http://pythonhosted.org/PyInstaller/#using-pyinstaller
Python 3 has the native option of create a build dist also:
If I'm not mistaken you're looking for the FolderBrowserDialog (hence the naming):
var dialog = new System.Windows.Forms.FolderBrowserDialog();
System.Windows.Forms.DialogResult result = dialog.ShowDialog();
Also see this SO thread: Open directory dialog
If you are using local resources you can refer to them as below:
<TextBlock Text="{Binding Source={x:Static prop:Resources.PerUnitOfMeasure}}" TextWrapping="Wrap" TextAlignment="Center"/>
I had the same issue and believe that it has to do with the size of the repo (edited- or the size of a particular file) you are trying to push.
Basically I was able to create new repos and push them to github. But an existing one would not work.
The HTTP error code seems to back me up it is a 'Length Required' error. So maybe it is too large to calc or greated that the max. Who knows.
EDIT
I found that the problem may be files that are large. I had one update that would not push even though I had successful pushes up to that point. There was only one file in the commit but it happened to be 1.6M
So I added the following config change
git config http.postBuffer 524288000
To allow up to the file size 500M and then my push worked. It may have been that this was the problem initially with pushing a big repo over the http protocol.
END EDIT
the way I could get it to work (EDIT before I modified postBuffer) was to tar up my repo, copy it to a machine that can do git over ssh, and push it to github. Then when you try to do a push/pull from the original server it should work over https. (since it is a much smaller amount of data than an original push).
You still have to wrap it in an ISERROR, but you could use MATCH()
instead of VLOOKUP()
:
Returns the relative position of an item in an array that matches a specified value in a specified order. Use MATCH instead of one of the LOOKUP functions when you need the position of an item in a range instead of the item itself.
Here's a complete example, assuming you're looking for the word "key" in a range of cells:
=IF(ISERROR(MATCH("key",A5:A16,FALSE)),"missing","found")
The FALSE
is necessary to force an exact match, otherwise it will look for the closest value.
You need to create own PCH file
Add New file -> Other-> PCH file
Then add the path of this PCH file to your build setting->prefix header->path
($(SRCROOT)/filename.pch)
For Angular:
getUserPicture(userId) {
FB.api('/' + userId, {fields: 'picture.width(800).height(800)'}, function(response) {
console.log('getUserPicture',response);
});
}
There is one difference - you can't use String
without using System;
beforehand.
I had this issue today which was solved by selecting Product -> Clean. I was so confused since my code was proper. The problem started from using command-Z too many times :)
It's somewhat weird, but it seems that Webkit, at least in newest stable version of Chrome, supports Microsoft's zoom
property. The good news is that its behaviour is closer to what you want.
Unfortunately DOM clientWidth
and similar properties still return the original values as if the image was not resized.
// hack: wait a moment for img to load_x000D_
setTimeout(function() {_x000D_
var img = document.getElementsByTagName("img")[0];_x000D_
document.getElementById("c").innerHTML = "clientWidth, clientHeight = " + img.clientWidth + ", " +_x000D_
img.clientHeight;_x000D_
}, 1000);
_x000D_
img {_x000D_
zoom: 50%;_x000D_
}_x000D_
/* -- not important below -- */_x000D_
#t {_x000D_
width: 400px;_x000D_
height: 300px;_x000D_
background-color: #F88;_x000D_
}_x000D_
#s {_x000D_
width: 200px;_x000D_
height: 150px;_x000D_
background-color: #8F8;_x000D_
}
_x000D_
<img src="data:image/png;base64,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" />_x000D_
<div id="s">div with explicit size for comparison 200px by 150px</div>_x000D_
<div id="t">div with explicit size for comparison 400px by 300px</div>_x000D_
<div id="c"></div>
_x000D_
I generally find the conditional command concatenation operators much more convenient than ERRORLEVEL.
yourCommand && (
echo yourCommand was successful
) || (
echo yourCommand failed
)
There is one complication you should be aware of. The error branch will fire if the last command in the success branch raises an error.
yourCommand && (
someCommandThatMayFail
) || (
echo This will fire if yourCommand or someCommandThatMayFail raises an error
)
The fix is to insert a harmless command that is guaranteed to succeed at the end of the success branch. I like to use (call )
, which does nothing except set the ERRORLEVEL to 0. There is a corollary (call)
that does nothing except set the ERRORLEVEL to 1.
yourCommand && (
someCommandThatMayFail
(call )
) || (
echo This can only fire if yourCommand raises an error
)
See Foolproof way to check for nonzero (error) return code in windows batch file for examples of the intricacies needed when using ERRORLEVEL to detect errors.
We see this constantly, all over our app, using Crashlytics. The crash usually happens way down in platform code. A small sampling:
android.database.CursorWindow.finalize() timed out after 10 seconds
java.util.regex.Matcher.finalize() timed out after 10 seconds
android.graphics.Bitmap$BitmapFinalizer.finalize() timed out after 10 seconds
org.apache.http.impl.conn.SingleClientConnManager.finalize() timed out after 10 seconds
java.util.concurrent.ThreadPoolExecutor.finalize() timed out after 10 seconds
android.os.BinderProxy.finalize() timed out after 10 seconds
android.graphics.Path.finalize() timed out after 10 seconds
The devices on which this happens are overwhelmingly (but not exclusively) devices manufactured by Samsung. That could just mean that most of our users are using Samsung devices; alternately it could indicate a problem with Samsung devices. I'm not really sure.
I suppose this doesn't really answer your questions, but I just wanted to reinforce that this seems quite common, and is not specific to your application.
Following on from Daniel Kamil Kozar's answer, to show hours/minutes/seconds:
echo "Duration: $(($DIFF / 3600 )) hours $((($DIFF % 3600) / 60)) minutes $(($DIFF % 60)) seconds"
So the full script would be:
date1=$(date +"%s")
date2=$(date +"%s")
DIFF=$(($date2-$date1))
echo "Duration: $(($DIFF / 3600 )) hours $((($DIFF % 3600) / 60)) minutes $(($DIFF % 60)) seconds"
.gradle
and .idea
directory under your project root directory. Try to add Google Maven repository and sync project
buildscript {
repositories {
jcenter()
google()
maven {
url "https://maven.google.com"
}
}
dependencies {
classpath 'com.android.tools.build:gradle:3.1.3'
}
}
allprojects {
repositories {
google()
jcenter()
maven {
url "https://maven.google.com"
}
}
}
If you are using Android Gradle Plugin 3.1.3, you should be sure that your gradle wrapper version is 4.4. Under the root directory of your project, find gradle-wrapper.properties
and modify it as below.
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip
I recently stumbled up on the same problem. Here is the synopsis of my solution:
Basic constituent code blocks needed
The following are the required basic code blocks of your client application
What modules do you need?
Many suggested to use Python modules such as urllib2 ; however, none of the modules work-at least for this particular project.
So, here is the list of the modules you need to get. First of all, you need to download and install the latest version of suds from the following link:
pypi.python.org/pypi/suds-jurko/0.4.1.jurko.2
Additionally, you need to download and install requests and suds_requests modules from the following links respectively ( disclaimer: I am new to post in here, so I can't post more than one link for now).
pypi.python.org/pypi/requests
pypi.python.org/pypi/suds_requests/0.1
Once you successfully download and install these modules, you are good to go.
The code
Following the steps outlined earlier, the code looks like the following: Imports:
import logging
from suds.client import Client
from suds.wsse import *
from datetime import timedelta,date,datetime,tzinfo
import requests
from requests.auth import HTTPBasicAuth
import suds_requests
Session request and authentication:
username=input('Username:')
password=input('password:')
session = requests.session()
session.auth=(username, password)
Create the Client:
client = Client(WSDL_URL, faults=False, cachingpolicy=1, location=WSDL_URL, transport=suds_requests.RequestsTransport(session))
Add WS-Security Header:
...
addSecurityHeader(client,username,password)
....
def addSecurityHeader(client,username,password):
security=Security()
userNameToken=UsernameToken(username,password)
timeStampToken=Timestamp(validity=600)
security.tokens.append(userNameToken)
security.tokens.append(timeStampToken)
client.set_options(wsse=security)
Please note that this method creates the security header depicted in Fig.1. So, your implementation may vary depending on the correct security header format provided by the owner of the service you are consuming.
Consume the relevant method (or operation) :
result=client.service.methodName(Inputs)
Logging:
One of the best practices in such implementations as this one is logging to see how the communication is executed. In case there is some issue, it makes debugging easy. The following code does basic logging. However, you can log many aspects of the communication in addition to the ones depicted in the code.
logging.basicConfig(level=logging.INFO)
logging.getLogger('suds.client').setLevel(logging.DEBUG)
logging.getLogger('suds.transport').setLevel(logging.DEBUG)
Result:
Here is the result in my case. Note that the server returned HTTP 200. This is the standard success code for HTTP request-response.
(200, (collectionNodeLmp){
timestamp = 2014-12-03 00:00:00-05:00
nodeLmp[] =
(nodeLmp){
pnodeId = 35010357
name = "YADKIN"
mccValue = -0.19
mlcValue = -0.13
price = 36.46
type = "500 KV"
timestamp = 2014-12-03 01:00:00-05:00
errorCodeId = 0
},
(nodeLmp){
pnodeId = 33138769
name = "ZION 1"
mccValue = -0.18
mlcValue = -1.86
price = 34.75
type = "Aggregate"
timestamp = 2014-12-03 01:00:00-05:00
errorCodeId = 0
},
})
Simply -> they provide True/False values based on condition mostly used for querying. mostly used with delegates
consider example of list
List<Program> blabla= new List<Program>();
blabla.Add(new Program("shubham", 1));
blabla.Add(new Program("google", 3));
blabla.Add(new Program("world",5));
blabla.Add(new Program("hello", 5));
blabla.Add(new Program("bye", 2));
contains names and ages. Now say we want to find names on condition So I Will use,
Predicate<Program> test = delegate (Program p) { return p.age > 3; };
List<Program> matches = blabla.FindAll(test);
Action<Program> print = Console.WriteLine;
matches.ForEach(print);
tried to Keep it Simple!
default value is chosen at runtime based on system configuration
Have a look at the documentation page
Default Heap Size
Unless the initial and maximum heap sizes are specified on the command line, they are calculated based on the amount of memory on the machine.
Client JVM Default Initial and Maximum Heap Sizes:
The default maximum heap size is half of the physical memory up to a physical memory size of 192 megabytes (MB) and otherwise one fourth of the physical memory up to a physical memory size of 1 gigabyte (GB).
Server JVM Default Initial and Maximum Heap Sizes:
On 32-bit JVMs, the default maximum heap size can be up to 1 GB if there is 4 GB or more of physical memory. On 64-bit JVMs, the default maximum heap size can be up to 32 GB if there is 128 GB or more of physical memory
What system configuration settings influence the default value?
You can specify the initial and maximum heap sizes using the flags -Xms (initial heap size) and -Xmx (maximum heap size). If you know how much heap your application needs to work well, you can set -Xms and -Xmx to the same value
In InnoDB you have START TRANSACTION;
, which in this engine is the officialy recommended way to do transactions, instead of SET AUTOCOMMIT = 0;
(don't use SET AUTOCOMMIT = 0;
for transactions in InnoDB unless it is for optimizing read only transactions). Commit with COMMIT;
.
You might want to use SET AUTOCOMMIT = 0;
in InnoDB for testing purposes, and not precisely for transactions.
In MyISAM you do not have START TRANSACTION;
. In this engine, use SET AUTOCOMMIT = 0;
for transactions. Commit with COMMIT;
or SET AUTOCOMMIT = 1;
(Difference explained in MyISAM example commentary below). You can do transactions this way in InnoDB too.
Source: http://dev.mysql.com/doc/refman/5.6/en/glossary.html#glos_autocommit
Examples of general use transactions:
/* InnoDB */
START TRANSACTION;
INSERT INTO table_name (table_field) VALUES ('foo');
INSERT INTO table_name (table_field) VALUES ('bar');
COMMIT; /* SET AUTOCOMMIT = 1 might not set AUTOCOMMIT to its previous state */
/* MyISAM */
SET AUTOCOMMIT = 0;
INSERT INTO table_name (table_field) VALUES ('foo');
INSERT INTO table_name (table_field) VALUES ('bar');
SET AUTOCOMMIT = 1; /* COMMIT statement instead would not restore AUTOCOMMIT to 1 */
For best performance I recommend doing DataFrame.drop_duplicates
followed up aggfunc='count'
.
Others are correct that aggfunc=pd.Series.nunique
will work. This can be slow, however, if the number of index
groups you have is large (>1000).
So instead of (to quote @Javier)
df2.pivot_table('X', 'Y', 'Z', aggfunc=pd.Series.nunique)
I suggest
df2.drop_duplicates(['X', 'Y', 'Z']).pivot_table('X', 'Y', 'Z', aggfunc='count')
This works because it guarantees that every subgroup (each combination of ('Y', 'Z')
) will have unique (non-duplicate) values of 'X'
.
winrm set winrm/config/client '@{TrustedHosts="machineA,machineB"}'
JSON parsing using NSJSONSerialization
NSString* path = [[NSBundle mainBundle] pathForResource:@"data" ofType:@"json"];
//Here you can take JSON string from your URL ,I am using json file
NSString* jsonString = [[NSString alloc] initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
NSData* jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
NSError *jsonError;
NSArray *jsonDataArray = [NSJSONSerialization JSONObjectWithData:[jsonString dataUsingEncoding:NSUTF8StringEncoding] options:kNilOptions error:&jsonError];
NSLog(@"jsonDataArray: %@",jsonDataArray);
NSDictionary *jsonObject = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:&jsonError];
if(jsonObject !=nil){
// NSString *errorCode=[NSMutableString stringWithFormat:@"%@",[jsonObject objectForKey:@"response"]];
if(![[jsonObject objectForKey:@"#data"] isEqual:@""]){
NSMutableArray *array=[jsonObject objectForKey:@"#data"];
// NSLog(@"array: %@",array);
NSLog(@"array: %d",array.count);
int k = 0;
for(int z = 0; z<array.count;z++){
NSString *strfd = [NSString stringWithFormat:@"%d",k];
NSDictionary *dicr = jsonObject[@"#data"][strfd];
k=k+1;
// NSLog(@"dicr: %@",dicr);
NSLog(@"Firstname - Lastname : %@ - %@",
[NSMutableString stringWithFormat:@"%@",[dicr objectForKey:@"user_first_name"]],
[NSMutableString stringWithFormat:@"%@",[dicr objectForKey:@"user_last_name"]]);
}
}
}
You can see the Console output as below :
Firstname - Lastname : Chandra Bhusan - Pandey
Firstname - Lastname : Kalaiyarasan - Balu
Firstname - Lastname : (null) - (null)
Firstname - Lastname : Girija - S
Firstname - Lastname : Girija - S
Firstname - Lastname : (null) - (null)
Bumming off Chris's idea, another option is to use pseudo elements so you don't need to use an absolutely positioned internal element.
<style>
.square {
/* width within the parent.
can be any percentage. */
width: 100%;
}
.square:before {
content: "";
float: left;
/* essentially the aspect ratio. 100% means the
div will remain 100% as tall as it is wide, or
square in other words. */
padding-bottom: 100%;
}
/* this is a clearfix. you can use whatever
clearfix you usually use, add
overflow:hidden to the parent element,
or simply float the parent container. */
.square:after {
content: "";
display: table;
clear: both;
}
</style>
<div class="square">
<h1>Square</h1>
<p>This div will maintain its aspect ratio.</p>
</div>
I've put together a demo here: http://codepen.io/tcmulder/pen/iqnDr
EDIT:
Now, bumming off of Isaac's idea, it's easier in modern browsers to simply use vw units to force aspect ratio (although I wouldn't also use vh as he does or the aspect ratio will change based on window height).
So, this simplifies things:
<style>
.square {
/* width within the parent (could use vw instead of course) */
width: 50%;
/* set aspect ratio */
height: 50vw;
}
</style>
<div class="square">
<h1>Square</h1>
<p>This div will maintain its aspect ratio.</p>
</div>
I've put together a modified demo here: https://codepen.io/tcmulder/pen/MdojRG?editors=1100
You could also set max-height, max-width, and/or min-height, min-width if you don't want it to grow ridiculously big or small, since it's based on the browser's width now and not the container and will grow/shrink indefinitely.
Note you can also scale the content inside the element if you set the font size to a vw measurement and all the innards to em measurements, and here's a demo for that: https://codepen.io/tcmulder/pen/VBJqLV?editors=1100
For better performance in UITableView
or UICollectionView
use light weight library Smart Lazy Loading You can use this lazy loading approach if you want to load images from url Asynchronous
Smart 'Lazy Loading' in UICollectionView
or UITableView
using NSOperation
and NSOperationQueue
in iOS So in this project we can download the multiple images in any View (UICollectionView
or UITableView
) by optimising the performance of an app by using Operation
and OperationQueue
for concurrency. following are the key point of this project Smart Lazy Loading: Creating image download Service. Prioritise the downloading based on the visibility of cells.
ImageDownloadService class will create a singleton instance and have NSCache instance to cache the images that have been downloaded. We have inherited the Operation class to TOperation to mauled the functionality according to our need. I think the properties of the operation subclass are pretty clear in terms of functionality. We are monitoring operations changes of state by using KVO.
COUNTIF function will only count cells that contain numbers in your specified range.
COUNTA(range) will count all values in the list of arguments. Text entries and numbers are counted, even when they contain an empty string of length 0.
Example: Function in A7 =COUNTA(A1:A6)
Range:
A1 a
A2 b
A3 banana
A4 42
A5
A6
A7 4 -> result
Google spreadsheet function list contains a list of all available functions for future reference https://support.google.com/drive/table/25273?hl=en.
I uninstalled Java update 25, and the issue was solved.
ALTER TABLE <tablename> CHANGE COLUMN <colname> <colname> VARCHAR(65536);
You have to list the column name twice, even if you aren't changing its name.
Note that after you make this change, the data type of the column will be MEDIUMTEXT
.
Miky D is correct, the MODIFY
command can do this more concisely.
Re the MEDIUMTEXT
thing: a MySQL row can be only 65535 bytes (not counting BLOB/TEXT columns). If you try to change a column to be too large, making the total size of the row 65536 or greater, you may get an error. If you try to declare a column of VARCHAR(65536)
then it's too large even if it's the only column in that table, so MySQL automatically converts it to a MEDIUMTEXT
data type.
mysql> create table foo (str varchar(300));
mysql> alter table foo modify str varchar(65536);
mysql> show create table foo;
CREATE TABLE `foo` (
`str` mediumtext
) ENGINE=MyISAM DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
I misread your original question, you want VARCHAR(65353)
, which MySQL can do, as long as that column size summed with the other columns in the table doesn't exceed 65535.
mysql> create table foo (str1 varchar(300), str2 varchar(300));
mysql> alter table foo modify str2 varchar(65353);
ERROR 1118 (42000): Row size too large.
The maximum row size for the used table type, not counting BLOBs, is 65535.
You have to change some columns to TEXT or BLOBs
Mini snippet:
var speedtest = {};
function speedTest_start(name) { speedtest[name]= +new Date(); }
function speedTest_stop(name) { return +new Date() - speedtest[name] + (delete
speedtest[name]?0:0); }
use like:
speedTest_start("test1");
// ... some code
speedTest_stop("test1");
// returns the time duration in ms
Also more tests possible:
speedTest_start("whole");
// ... some code
speedTest_start("part");
// ... some code
speedTest_stop("part");
// returns the time duration in ms of "part"
// ... some code
speedTest_stop("whole");
// returns the time duration in ms of "whole"
My modern variant:
function blob2file(blobData) {
const fd = new FormData();
fd.set('a', blobData);
return fd.get('a');
}
Another approach is to filter using LINQ before the loop executes:
foreach ( int number in numbers.Where(n => n >= 0) )
{
// process number
}
Math.Pow()
returns double
so nice would be to write like this:
double d = Math.Pow(100.00, 3.00);
Officially, the SQL languages does not support a JOIN or FROM clause in an UPDATE statement unless it is in a subquery. Thus, the Hoyle ANSI approach would be something like
Update addresses
Set cid = (
Select c.id
From customers As c
where c.id = a.id
)
Where Exists (
Select 1
From customers As C1
Where C1.id = addresses.id
)
However many DBMSs such Postgres support the use of a FROM clause in an UPDATE statement. In many cases, you are required to include the updating table and alias it in the FROM clause however I'm not sure about Postgres:
Update addresses
Set cid = c.id
From addresses As a
Join customers As c
On c.id = a.id
As described by others, a fast and also space efficient solution is using numpy (np) with it's built-in vector manipulation capability:
1. With Numpy
x = np.array([1,2,3])
y = np.array([2,3,4])
print x+y
2. With built-ins
2.1 Lambda
list1=[1, 2, 3]
list2=[4, 5, 6]
print map(lambda x,y:x+y, list1, list2)
Notice that map() supports multiple arguments.
2.2 zip and list comprehension
list1=[1, 2, 3]
list2=[4, 5, 6]
print [x + y for x, y in zip(list1, list2)]
we can easily print the current time and date using echo
and system
variables as below.
echo %DATE% %TIME%
output example: 13-Sep-19 15:53:05.62
Maybe an example demonstrating how both methods are used will help you to understand things better. So, consider the following class:
package test;
public class Demo {
public Demo() {
System.out.println("Hi!");
}
public static void main(String[] args) throws Exception {
Class clazz = Class.forName("test.Demo");
Demo demo = (Demo) clazz.newInstance();
}
}
As explained in its javadoc, calling Class.forName(String)
returns the Class
object associated with the class or interface with the given string name i.e. it returns test.Demo.class
which is affected to the clazz
variable of type Class
.
Then, calling clazz.newInstance()
creates a new instance of the class represented by this Class
object. The class is instantiated as if by a new
expression with an empty argument list. In other words, this is here actually equivalent to a new Demo()
and returns a new instance of Demo
.
And running this Demo
class thus prints the following output:
Hi!
The big difference with the traditional new
is that newInstance
allows to instantiate a class that you don't know until runtime, making your code more dynamic.
A typical example is the JDBC API which loads, at runtime, the exact driver required to perform the work. EJBs containers, Servlet containers are other good examples: they use dynamic runtime loading to load and create components they don't know anything before the runtime.
Actually, if you want to go further, have a look at Ted Neward paper Understanding Class.forName() that I was paraphrasing in the paragraph just above.
EDIT (answering a question from the OP posted as comment): The case of JDBC drivers is a bit special. As explained in the DriverManager chapter of Getting Started with the JDBC API:
(...) A
Driver
class is loaded, and therefore automatically registered with theDriverManager
, in one of two ways:
by calling the method
Class.forName
. This explicitly loads the driver class. Since it does not depend on any external setup, this way of loading a driver is the recommended one for using theDriverManager
framework. The following code loads the classacme.db.Driver
:Class.forName("acme.db.Driver");
If
acme.db.Driver
has been written so that loading it causes an instance to be created and also callsDriverManager.registerDriver
with that instance as the parameter (as it should do), then it is in theDriverManager
's list of drivers and available for creating a connection.(...)
In both of these cases, it is the responsibility of the newly-loaded
Driver
class to register itself by callingDriverManager.registerDriver
. As mentioned, this should be done automatically when the class is loaded.
To register themselves during initialization, JDBC driver typically use a static initialization block like this:
package acme.db;
public class Driver {
static {
java.sql.DriverManager.registerDriver(new Driver());
}
...
}
Calling Class.forName("acme.db.Driver")
causes the initialization of the acme.db.Driver
class and thus the execution of the static initialization block. And Class.forName("acme.db.Driver")
will indeed "create" an instance but this is just a consequence of how (good) JDBC Driver are implemented.
As a side note, I'd mention that all this is not required anymore with JDBC 4.0(added as a default package since Java 7) and the new auto-loading feature of JDBC 4.0 drivers. See JDBC 4.0 enhancements in Java SE 6.
You have to define a PersistentVolume providing disc space to be consumed by the PersistentVolumeClaim.
When using storageClass
Kubernetes is going to enable "Dynamic Volume Provisioning" which is not working with the local file system.
storageClass
-line from the PersistentVolumeClaimAt creation of the deployment state-description it is usually known which kind (amount, speed, ...) of storage that application will need.
To make a deployment versatile you'd like to avoid a hard dependency on storage. Kubernetes' volume-abstraction allows you to provide and consume storage in a standardized way.
The PersistentVolumeClaim is used to provide a storage-constraint alongside the deployment of an application.
The PersistentVolume offers cluster-wide volume-instances ready to be consumed ("bound
"). One PersistentVolume will be bound to one claim. But since multiple instances of that claim may be run on multiple nodes, that volume may be accessed by multiple nodes.
A PersistentVolume without StorageClass is considered to be static.
"Dynamic Volume Provisioning" alongside with a StorageClass allows the cluster to provision PersistentVolumes on demand. In order to make that work, the given storage provider must support provisioning - this allows the cluster to request the provisioning of a "new" PersistentVolume when an unsatisfied PersistentVolumeClaim pops up.
In order to find how to specify things you're best advised to take a look at the API for your Kubernetes version, so the following example is build from the API-Reference of K8S 1.17:
apiVersion: v1
kind: PersistentVolume
metadata:
name: ckan-pv-home
labels:
type: local
spec:
capacity:
storage: 100Mi
hostPath:
path: "/mnt/data/ckan"
The PersistentVolumeSpec allows us to define multiple attributes.
I chose a hostPath
volume which maps a local directory as content for the volume. The capacity allows the resource scheduler to recognize this volume as applicable in terms of resource needs.
With IE6 / IE7 one can tweak the number of concurrent requests in the registry. Here's how to set it to four each.
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings]
"MaxConnectionsPerServer"=dword:00000004
"MaxConnectionsPer1_0Server"=dword:00000004
If you are using API 8 or above, you can use the readily available Patterns
class to validate email. Sample code:
public final static boolean isValidEmail(CharSequence target) {
if (target == null)
return false;
return android.util.Patterns.EMAIL_ADDRESS.matcher(target).matches();
}
By chance if you are even supporting API level less than 8, then you can simply copy the Patterns.java
file into your project and reference it. You can get the source code for Patterns.java
from this link
Replace your "Save" button with an anchor link and set the new download
attribute dynamically. Works in Chrome and Firefox:
var d = "ha";
$(this).attr("href", "data:image/png;base64,abcdefghijklmnop").attr("download", "file-" + d + ".png");
Here's a working example with the name set as the current date: http://jsfiddle.net/Qjvb3/
Here a compatibility table for download
attribute: http://caniuse.com/download
I have come across the same problem and have a cleaner solution. Instead of creating an empty data.frame
you can instead save your data as a named list. Once you have added all results to this list you convert it to a data.frame after.
For the case of adding features one at a time this works best.
mylist = list()
for(column in 1:10) mylist$column = rnorm(10)
mydf = data.frame(mylist)
For the case of adding rows one at a time this becomes tricky due to mixed types. If all types are the same it is easy.
mylist = list()
for(row in 1:10) mylist$row = rnorm(10)
mydf = data.frame(do.call(rbind, mylist))
I haven't found a simple way to add rows of mixed types. In this case, if you must do it this way, the empty data.frame is probably the best solution.
If you want the word "Hello" to print in a column that's 40 characters wide, with spaces padding the left, use the following.
char *ptr = "Hello";
printf("%40s\n", ptr);
That will give you 35 spaces, then the word "Hello". This is how you format stuff when you know how wide you want the column, but the data changes (well, it's one way you can do it).
If you know you want exactly 40 spaces then some text, just save the 40 spaces in a constant and print them. If you need to print multiple lines, either use multiple printf
statements like the one above, or do it in a loop, changing the value of ptr
each time.
If you're running cPanel/WHM, make sure that IP is whitelisted in the firewall. You will als need to add that IP to the remote SQL IP list in the cPanel account you're trying to connect to.
If the value on which the selection depends is an integer, you can use the CHOOSE function:
CHOOSE funtion in TSQL documentation
CHOOSE ( index, val_1, val_2 [, val_n ] )
Citing the documentation:
index
Is an integer expression that represents a 1-based index into the list of the items following it.
If the provided index value has a numeric data type other than int, then the value is implicitly converted to an integer. If the index value exceeds the bounds of the array of values, then CHOOSE returns null.
val_1 ... val_n
List of comma separated values of any data type.
Here is a simple 3 step ES6 implementation using function binding in the parent constructor. This is the first way the official react tutorial recommends (there is also public class fields syntax not covered here). You can find all of this information here https://reactjs.org/docs/handling-events.html
Binding Parent Functions so Children Can Call Them (And pass data up to the parent! :D )
Parent Function
handleFilterApply(filterVals){}
Parent Constructor
this.handleFilterApply = this.handleFilterApply.bind(this);
Prop Passed to Child
onApplyClick = {this.handleFilterApply}
Child Event Call
onClick = {() => {props.onApplyClick(filterVals)}
Yes, you can.
From cplusplus.com:
Because these functions are operator overloading functions, the usual way in which they are called is:
strm >> variable;
Where
strm
is the identifier of a istream object andvariable
is an object of any type supported as right parameter. It is also possible to call a succession of extraction operations as:strm >> variable1 >> variable2 >> variable3; //...
which is the same as performing successive extractions from the same object
strm
.
Just replace strm
with cin
.
The easiest way to solve the problem is to group the elements based on their value, and then pick a representative of the group if there are more than one element in the group. In LINQ, this translates to:
var query = lst.GroupBy(x => x)
.Where(g => g.Count() > 1)
.Select(y => y.Key)
.ToList();
If you want to know how many times the elements are repeated, you can use:
var query = lst.GroupBy(x => x)
.Where(g => g.Count() > 1)
.Select(y => new { Element = y.Key, Counter = y.Count() })
.ToList();
This will return a List
of an anonymous type, and each element will have the properties Element
and Counter
, to retrieve the information you need.
And lastly, if it's a dictionary you are looking for, you can use
var query = lst.GroupBy(x => x)
.Where(g => g.Count() > 1)
.ToDictionary(x => x.Key, y => y.Count());
This will return a dictionary, with your element as key, and the number of times it's repeated as value.
You could use lodash and do:
_.intersection(originalTarget, arrayToCheck).length > 0
Set intersection is done on both collections producing an array of identical elements.
I think the solution is simpler and was suggested by some developers. phpMyAdmin has an operation for this.
From phpMyAdmin, select the database you want to select. In the tabs there's one called Operations, go to the rename section. That's all.
It does, as many suggested, create a new database with the new name, dump all tables of the old database into the new database and drop the old database.
You will definitely want to start with a good web scraping framework. Later on you may decide that they are too limiting and you can put together your own stack of libraries but without a lot of scraping experience your design will be much worse than pjscrape or scrapy.
Note: I use the terms crawling and scraping basically interchangeable here. This is a copy of my answer to your Quora question, it's pretty long.
Tools
Get very familiar with either Firebug or Chrome dev tools depending on your preferred browser. This will be absolutely necessary as you browse the site you are pulling data from and map out which urls contain the data you are looking for and what data formats make up the responses.
You will need a good working knowledge of HTTP as well as HTML and will probably want to find a decent piece of man in the middle proxy software. You will need to be able to inspect HTTP requests and responses and understand how the cookies and session information and query parameters are being passed around. Fiddler (http://www.telerik.com/fiddler) and Charles Proxy (http://www.charlesproxy.com/) are popular tools. I use mitmproxy (http://mitmproxy.org/) a lot as I'm more of a keyboard guy than a mouse guy.
Some kind of console/shell/REPL type environment where you can try out various pieces of code with instant feedback will be invaluable. Reverse engineering tasks like this are a lot of trial and error so you will want a workflow that makes this easy.
Language
PHP is basically out, it's not well suited for this task and the library/framework support is poor in this area. Python (Scrapy is a great starting point) and Clojure/Clojurescript (incredibly powerful and productive but a big learning curve) are great languages for this problem. Since you would rather not learn a new language and you already know Javascript I would definitely suggest sticking with JS. I have not used pjscrape but it looks quite good from a quick read of their docs. It's well suited and implements an excellent solution to the problem I describe below.
A note on Regular expressions: DO NOT USE REGULAR EXPRESSIONS TO PARSE HTML. A lot of beginners do this because they are already familiar with regexes. It's a huge mistake, use xpath or css selectors to navigate html and only use regular expressions to extract data from actual text inside an html node. This might already be obvious to you, it becomes obvious quickly if you try it but a lot of people waste a lot of time going down this road for some reason. Don't be scared of xpath or css selectors, they are WAY easier to learn than regexes and they were designed to solve this exact problem.
Javascript-heavy sites
In the old days you just had to make an http request and parse the HTML reponse. Now you will almost certainly have to deal with sites that are a mix of standard HTML HTTP request/responses and asynchronous HTTP calls made by the javascript portion of the target site. This is where your proxy software and the network tab of firebug/devtools comes in very handy. The responses to these might be html or they might be json, in rare cases they will be xml or something else.
There are two approaches to this problem:
The low level approach:
You can figure out what ajax urls the site javascript is calling and what those responses look like and make those same requests yourself. So you might pull the html from http://example.com/foobar and extract one piece of data and then have to pull the json response from http://example.com/api/baz?foo=b... to get the other piece of data. You'll need to be aware of passing the correct cookies or session parameters. It's very rare, but occasionally some required parameters for an ajax call will be the result of some crazy calculation done in the site's javascript, reverse engineering this can be annoying.
The embedded browser approach:
Why do you need to work out what data is in html and what data comes in from an ajax call? Managing all that session and cookie data? You don't have to when you browse a site, the browser and the site javascript do that. That's the whole point.
If you just load the page into a headless browser engine like phantomjs it will load the page, run the javascript and tell you when all the ajax calls have completed. You can inject your own javascript if necessary to trigger the appropriate clicks or whatever is necessary to trigger the site javascript to load the appropriate data.
You now have two options, get it to spit out the finished html and parse it or inject some javascript into the page that does your parsing and data formatting and spits the data out (probably in json format). You can freely mix these two options as well.
Which approach is best?
That depends, you will need to be familiar and comfortable with the low level approach for sure. The embedded browser approach works for anything, it will be much easier to implement and will make some of the trickiest problems in scraping disappear. It's also quite a complex piece of machinery that you will need to understand. It's not just HTTP requests and responses, it's requests, embedded browser rendering, site javascript, injected javascript, your own code and 2-way interaction with the embedded browser process.
The embedded browser is also much slower at scale because of the rendering overhead but that will almost certainly not matter unless you are scraping a lot of different domains. Your need to rate limit your requests will make the rendering time completely negligible in the case of a single domain.
Rate Limiting/Bot behaviour
You need to be very aware of this. You need to make requests to your target domains at a reasonable rate. You need to write a well behaved bot when crawling websites, and that means respecting robots.txt and not hammering the server with requests. Mistakes or negligence here is very unethical since this can be considered a denial of service attack. The acceptable rate varies depending on who you ask, 1req/s is the max that the Google crawler runs at but you are not Google and you probably aren't as welcome as Google. Keep it as slow as reasonable. I would suggest 2-5 seconds between each page request.
Identify your requests with a user agent string that identifies your bot and have a webpage for your bot explaining it's purpose. This url goes in the agent string.
You will be easy to block if the site wants to block you. A smart engineer on their end can easily identify bots and a few minutes of work on their end can cause weeks of work changing your scraping code on your end or just make it impossible. If the relationship is antagonistic then a smart engineer at the target site can completely stymie a genius engineer writing a crawler. Scraping code is inherently fragile and this is easily exploited. Something that would provoke this response is almost certainly unethical anyway, so write a well behaved bot and don't worry about this.
Testing
Not a unit/integration test person? Too bad. You will now have to become one. Sites change frequently and you will be changing your code frequently. This is a large part of the challenge.
There are a lot of moving parts involved in scraping a modern website, good test practices will help a lot. Many of the bugs you will encounter while writing this type of code will be the type that just return corrupted data silently. Without good tests to check for regressions you will find out that you've been saving useless corrupted data to your database for a while without noticing. This project will make you very familiar with data validation (find some good libraries to use) and testing. There are not many other problems that combine requiring comprehensive tests and being very difficult to test.
The second part of your tests involve caching and change detection. While writing your code you don't want to be hammering the server for the same page over and over again for no reason. While running your unit tests you want to know if your tests are failing because you broke your code or because the website has been redesigned. Run your unit tests against a cached copy of the urls involved. A caching proxy is very useful here but tricky to configure and use properly.
You also do want to know if the site has changed. If they redesigned the site and your crawler is broken your unit tests will still pass because they are running against a cached copy! You will need either another, smaller set of integration tests that are run infrequently against the live site or good logging and error detection in your crawling code that logs the exact issues, alerts you to the problem and stops crawling. Now you can update your cache, run your unit tests and see what you need to change.
Legal Issues
The law here can be slightly dangerous if you do stupid things. If the law gets involved you are dealing with people who regularly refer to wget and curl as "hacking tools". You don't want this.
The ethical reality of the situation is that there is no difference between using browser software to request a url and look at some data and using your own software to request a url and look at some data. Google is the largest scraping company in the world and they are loved for it. Identifying your bots name in the user agent and being open about the goals and intentions of your web crawler will help here as the law understands what Google is. If you are doing anything shady, like creating fake user accounts or accessing areas of the site that you shouldn't (either "blocked" by robots.txt or because of some kind of authorization exploit) then be aware that you are doing something unethical and the law's ignorance of technology will be extraordinarily dangerous here. It's a ridiculous situation but it's a real one.
It's literally possible to try and build a new search engine on the up and up as an upstanding citizen, make a mistake or have a bug in your software and be seen as a hacker. Not something you want considering the current political reality.
Who am I to write this giant wall of text anyway?
I've written a lot of web crawling related code in my life. I've been doing web related software development for more than a decade as a consultant, employee and startup founder. The early days were writing perl crawlers/scrapers and php websites. When we were embedding hidden iframes loading csv data into webpages to do ajax before Jesse James Garrett named it ajax, before XMLHTTPRequest was an idea. Before jQuery, before json. I'm in my mid-30's, that's apparently considered ancient for this business.
I've written large scale crawling/scraping systems twice, once for a large team at a media company (in Perl) and recently for a small team as the CTO of a search engine startup (in Python/Javascript). I currently work as a consultant, mostly coding in Clojure/Clojurescript (a wonderful expert language in general and has libraries that make crawler/scraper problems a delight)
I've written successful anti-crawling software systems as well. It's remarkably easy to write nigh-unscrapable sites if you want to or to identify and sabotage bots you don't like.
I like writing crawlers, scrapers and parsers more than any other type of software. It's challenging, fun and can be used to create amazing things.
You can use RoundingMode.#UNNECESSARY if you want/accept exception thrown otherwise
new BigDecimal(value).setScale(2, RoundingMode.UNNECESSARY);
If this rounding mode is specified on an operation that yields an inexact result, an ArithmeticException is thrown.
Exception if not integer value:
java.lang.ArithmeticException: Rounding necessary
A quick answer:
mvn -fn test
Works with nested project builds.
@amitchhajer 's post works for GNU tar. If someone finds this post and needs it to work on a NON GNU
system, they can do this:
tar cvf - folderToCompress | gzip > compressFileName
To expand the archive:
zcat compressFileName | tar xvf -
This should work
return RedirectToAction("actionName", "controllerName", null);
Kotlin Users,
viewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
override fun onPageScrollStateChanged(state: Int) {
}
override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {
}
override fun onPageSelected(position: Int) {
}
})
Update 2020 for ViewPager2
viewPager.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() {
override fun onPageScrollStateChanged(state: Int) {
println(state)
}
override fun onPageScrolled(
position: Int,
positionOffset: Float,
positionOffsetPixels: Int
) {
super.onPageScrolled(position, positionOffset, positionOffsetPixels)
println(position)
}
override fun onPageSelected(position: Int) {
super.onPageSelected(position)
println(position)
}
})
There's an entire practice that says it's a bad idea to have inline functions/styles. Taking into account you already have an ID for your button, consider
JS
var myvar=15;
function init(){
document.getElementById('EditBanner').onclick=function(){EditBanner(myvar);};
}
window.onload=init;
HTML
<input id="EditBanner" type="button" value="Edit Image" />
On OSX using the current Chrome build (2/20/2020, 79.0.3945.130), you can:
Click on the 'i' info icon on the left side of address bar.
Click Site Settings
Scroll down to Insecure content
Change it from Blocked (Default)
to Allow
Reload the page and try your action again.
C++ is compiled into machine code. So you have the pre-processor, the compiler, the optimizer, and finally the assembler, all of which have to run.
Java and C# are compiled into byte-code/IL, and the Java virtual machine/.NET Framework execute (or JIT compile into machine code) prior to execution.
Python is an interpreted language that is also compiled into byte-code.
I'm sure there are other reasons for this as well, but in general, not having to compile to native machine language saves time.
I'm very late to this party, but I'd like to pitch in with yet another approach. I wrote a tiny JavaScript module called PrintElements for dynamically printing parts of a webpage.
It works by iterating through selected node elements, and for each node, it traverses up the DOM tree until the BODY element. At each level, including the initial one (which is the to-be-printed node’s level), it attaches a marker class (pe-preserve-print
) to the current node. Then attaches another marker class (pe-no-print
) to all siblings of the current node, but only if there is no pe-preserve-print
class on them. As a third act, it also attaches another class to preserved ancestor elements pe-preserve-ancestor
.
A dead-simple supplementary print-only css will hide and show respective elements. Some benefits of this approach is that all styles are preserved, it does not open a new window, there is no need to move around a lot of DOM elements, and generally it is non-invasive with your original document.
See the demo, or read the related article for further details.
A case statement should do the trick when selecting from your source table:
CASE
WHEN col1 = ' ' THEN NULL
ELSE col1
END col1
Also, one thing to note is that your LTRIM and RTRIM reduce the value from a space (' ') to blank (''). If you need to remove white space, then the case statement should be modified appropriately:
CASE
WHEN LTRIM(RTRIM(col1)) = '' THEN NULL
ELSE LTRIM(RTRIM(col1))
END col1
Floating Point Exception happens because of an unexpected infinity or NaN. You can track that using gdb, which allows you to see what is going on inside your C program while it runs. For more details: https://www.cs.swarthmore.edu/~newhall/unixhelp/howto_gdb.php
In a nutshell, these commands might be useful...
gcc -g myprog.c
gdb a.out
gdb core a.out
ddd a.out
All This Work :)
Model
public partial class ClientMessage
{
public int IdCon { get; set; }
public string Name { get; set; }
public string Email { get; set; }
}
Controller
public class TestAjaxBeginFormController : Controller{
projectNameEntities db = new projectNameEntities();
public ActionResult Index(){
return View();
}
[HttpPost]
public ActionResult GetClientMessages(ClientMessage Vm) {
var model = db.ClientMessages.Where(x => x.Name.Contains(Vm.Name));
return PartialView("_PartialView", model);
}
}
View index.cshtml
@model projectName.Models.ClientMessage
@{
Layout = null;
}
<script src="~/Scripts/jquery-1.9.1.js"></script>
<script src="~/Scripts/jquery.unobtrusive-ajax.js"></script>
<script>
//\\\\\\\ JS retrun message SucccessPost or FailPost
function SuccessMessage() {
alert("Succcess Post");
}
function FailMessage() {
alert("Fail Post");
}
</script>
<h1>Page Index</h1>
@using (Ajax.BeginForm("GetClientMessages", "TestAjaxBeginForm", null , new AjaxOptions
{
HttpMethod = "POST",
OnSuccess = "SuccessMessage",
OnFailure = "FailMessage" ,
UpdateTargetId = "resultTarget"
}, new { id = "MyNewNameId" })) // set new Id name for Form
{
@Html.AntiForgeryToken()
@Html.EditorFor(x => x.Name)
<input type="submit" value="Search" />
}
<div id="resultTarget"> </div>
View _PartialView.cshtml
@model IEnumerable<projectName.Models.ClientMessage >
<table>
@foreach (var item in Model) {
<tr>
<td>@Html.DisplayFor(modelItem => item.IdCon)</td>
<td>@Html.DisplayFor(modelItem => item.Name)</td>
<td>@Html.DisplayFor(modelItem => item.Email)</td>
</tr>
}
</table>
if you have xcopy
, you can use the /E
param, which will copy directories and subdirectories and the files within them, including maintaining the directory structure for empty directories
xcopy [source] [destination] /E
Bootstrap 3 now has Responsive tables out of the box. Hooray! :)
You can check it here: https://getbootstrap.com/docs/3.3/css/#tables-responsive
Add a <div class="table-responsive">
surrounding your table and you should be good to go:
<div class="table-responsive">
<table class="table">
...
</table>
</div>
To make it work on all layouts you can do this:
.table-responsive
{
overflow-x: auto;
}
at the lowest level, a framework is an environment, where you are given a set of tools to work with
this tools come in the form of libraries, configuration files, etc.
this so-called "environment" provides you with the basic setup (error reportings, log files, language settings, etc)...which can be modified,extended and built upon.
People actually do not need frameworks, it's just a matter of wanting to save time, and others just a matter of personal preferences.
People will justify that with a framework, you don't have to code from scratch. But those are just people confusing libraries with frameworks.
I'm not being biased here, I am actually using a framework right now.
You're probably trying to convert to a UNIX-like timestamp, which are in UTC:
yourDateTime.ToUniversalTime().Subtract(
new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)
).TotalMilliseconds
This also avoids summertime issues, since UTC doesn't have those.
maps.google.com has a navigation service which can provide you route information in KML format.
To get kml file we need to form url with start and destination locations:
public static String getUrl(double fromLat, double fromLon,
double toLat, double toLon) {// connect to map web service
StringBuffer urlString = new StringBuffer();
urlString.append("http://maps.google.com/maps?f=d&hl=en");
urlString.append("&saddr=");// from
urlString.append(Double.toString(fromLat));
urlString.append(",");
urlString.append(Double.toString(fromLon));
urlString.append("&daddr=");// to
urlString.append(Double.toString(toLat));
urlString.append(",");
urlString.append(Double.toString(toLon));
urlString.append("&ie=UTF8&0&om=0&output=kml");
return urlString.toString();
}
Next you will need to parse xml (implemented with SAXParser) and fill data structures:
public class Point {
String mName;
String mDescription;
String mIconUrl;
double mLatitude;
double mLongitude;
}
public class Road {
public String mName;
public String mDescription;
public int mColor;
public int mWidth;
public double[][] mRoute = new double[][] {};
public Point[] mPoints = new Point[] {};
}
Network connection is implemented in different ways on Android and Blackberry, so you will have to first form url:
public static String getUrl(double fromLat, double fromLon,
double toLat, double toLon)
then create connection with this url and get InputStream.
Then pass this InputStream and get parsed data structure:
public static Road getRoute(InputStream is)
Full source code RoadProvider.java
class MapPathScreen extends MainScreen {
MapControl map;
Road mRoad = new Road();
public MapPathScreen() {
double fromLat = 49.85, fromLon = 24.016667;
double toLat = 50.45, toLon = 30.523333;
String url = RoadProvider.getUrl(fromLat, fromLon, toLat, toLon);
InputStream is = getConnection(url);
mRoad = RoadProvider.getRoute(is);
map = new MapControl();
add(new LabelField(mRoad.mName));
add(new LabelField(mRoad.mDescription));
add(map);
}
protected void onUiEngineAttached(boolean attached) {
super.onUiEngineAttached(attached);
if (attached) {
map.drawPath(mRoad);
}
}
private InputStream getConnection(String url) {
HttpConnection urlConnection = null;
InputStream is = null;
try {
urlConnection = (HttpConnection) Connector.open(url);
urlConnection.setRequestMethod("GET");
is = urlConnection.openInputStream();
} catch (IOException e) {
e.printStackTrace();
}
return is;
}
}
See full code on J2MEMapRouteBlackBerryEx on Google Code
public class MapRouteActivity extends MapActivity {
LinearLayout linearLayout;
MapView mapView;
private Road mRoad;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mapView = (MapView) findViewById(R.id.mapview);
mapView.setBuiltInZoomControls(true);
new Thread() {
@Override
public void run() {
double fromLat = 49.85, fromLon = 24.016667;
double toLat = 50.45, toLon = 30.523333;
String url = RoadProvider
.getUrl(fromLat, fromLon, toLat, toLon);
InputStream is = getConnection(url);
mRoad = RoadProvider.getRoute(is);
mHandler.sendEmptyMessage(0);
}
}.start();
}
Handler mHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
TextView textView = (TextView) findViewById(R.id.description);
textView.setText(mRoad.mName + " " + mRoad.mDescription);
MapOverlay mapOverlay = new MapOverlay(mRoad, mapView);
List<Overlay> listOfOverlays = mapView.getOverlays();
listOfOverlays.clear();
listOfOverlays.add(mapOverlay);
mapView.invalidate();
};
};
private InputStream getConnection(String url) {
InputStream is = null;
try {
URLConnection conn = new URL(url).openConnection();
is = conn.getInputStream();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return is;
}
@Override
protected boolean isRouteDisplayed() {
return false;
}
}
See full code on J2MEMapRouteAndroidEx on Google Code
It's been a while since your question, but ... Have you tried setting the Audio stream type?
mp.setAudioStreamType(AudioManager.STREAM_NOTIFICATION);
It must be done before prepare.
You can use grep to get the byte-offset of the matching part of a string:
echo $str | grep -b -o str
As per your example:
[user@host ~]$ echo "The cat sat on the mat" | grep -b -o cat
4:cat
you can pipe that to awk if you just want the first part
echo $str | grep -b -o str | awk 'BEGIN {FS=":"}{print $1}'
String[] s = {"a", "x", "y"};
Arrays.sort(s, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o2.compareTo(o1);
}
});
System.out.println(Arrays.toString(s));
-> [y, x, a]
Now you have to implement the Comparator for your Person class.
Something like (for ascending order): compare(Person a, Person b) = a.id < b.id ? -1 : (a.id == b.id) ? 0 : 1
or Integer.valueOf(a.id).compareTo(Integer.valueOf(b.id))
.
To minimize confusion you should implement an ascending Comparator and convert it to a descending one with a wrapper (like this) new ReverseComparator<Person>(new PersonComparator())
.
I've experienced the same problem and now I just found my solution to this issue.
#!/usr/bin/python
import sys
import os
os.system('meld "%s" "%s"' % (sys.argv[2], sys.argv[5]))
This is the code[1] for my case. When I tried this script I received error message like :
import: command not found
I found people talks about the shebang. As you see there is the shebang in my python code above. I tried these and those trials but didn't find a good solution.
I finally tried to type the shebang my self.
#!/usr/bin/python
and removed the copied one.
And my problem solved!!!
I copied the code from the internet[1].
And I guess there had been some unseeable(?) unseen special characters in the original copied shebang statement.
I use vim, sometimes I experience similar problems.. Especially when I copied some code snippet from the internet this kind of problems happen.. Web pages have some virus special characters!! I doubt. :-)
Journeyer
PS) I copied the code in Windows 7 - host OS - into the Windows clipboard and pasted it into my vim in Ubuntu - guest OS. VM is Oracle Virtual Machine.
[1] http://nathanhoad.net/how-to-meld-for-git-diffs-in-ubuntu-hardy
The correct answer is SYSDATE().
INSERT INTO servers (
server_name, online_status, exchange, disk_space,
network_shares, date_time
)
VALUES (
'm1', 'ONLINE', 'ONLINE', '100GB', 'ONLINE', SYSDATE()
);
We can change this behavior and make NOW()
behave in the same way as SYSDATE()
by setting sysdate_is_now command line argument to True
.
Note that NOW()
(which has CURRENT_TIMESTAMP()
as an alias), differs from SYSDATE()
in a subtle way:
SYSDATE() returns the time at which it executes. This differs from the behavior for NOW(), which returns a constant time that indicates the time at which the statement began to execute. (Within a stored function or trigger, NOW() returns the time at which the function or triggering statement began to execute.)
As indicated by Erandi, it is best to create your table with the DEFAULT
clause so that the column gets populated automatically with the timestamp when you insert a new row:
date_time datetime NOT NULL DEFAULT SYSDATE()
If you want the current date in epoch format, then you can use UNIX_TIMESTAMP(). For example:
select now(3), sysdate(3), unix_timestamp();
would yield
+-------------------------+-------------------------+------------------+
| now(3) | sysdate(3) | unix_timestamp() |
+-------------------------+-------------------------+------------------+
| 2018-11-27 01:40:08.160 | 2018-11-27 01:40:08.160 | 1543282808 |
+-------------------------+-------------------------+------------------+
Related:
String someString = "" + c;
char c = someString.charAt(0);
Module
in Ruby, to a degree, corresponds to Java abstract class -- has instance methods, classes can inherit from it (via include
, Ruby guys call it a "mixin"), but has no instances. There are other minor differences, but this much information is enough to get you started.
The problem is that if you try to write a <table>
or a <tr>
or <td>
tag using JS every time you insert a new tag the browser will try to close it as it will think that there is an error on the code.
Instead of writing your table line by line, concatenate your table into a variable and insert it once created:
<script language="javascript" type="text/javascript">
<!--
var myArray = new Array();
myArray[0] = 1;
myArray[1] = 2.218;
myArray[2] = 33;
myArray[3] = 114.94;
myArray[4] = 5;
myArray[5] = 33;
myArray[6] = 114.980;
myArray[7] = 5;
var myTable= "<table><tr><td style='width: 100px; color: red;'>Col Head 1</td>";
myTable+= "<td style='width: 100px; color: red; text-align: right;'>Col Head 2</td>";
myTable+="<td style='width: 100px; color: red; text-align: right;'>Col Head 3</td></tr>";
myTable+="<tr><td style='width: 100px; '>---------------</td>";
myTable+="<td style='width: 100px; text-align: right;'>---------------</td>";
myTable+="<td style='width: 100px; text-align: right;'>---------------</td></tr>";
for (var i=0; i<8; i++) {
myTable+="<tr><td style='width: 100px;'>Number " + i + " is:</td>";
myArray[i] = myArray[i].toFixed(3);
myTable+="<td style='width: 100px; text-align: right;'>" + myArray[i] + "</td>";
myTable+="<td style='width: 100px; text-align: right;'>" + myArray[i] + "</td></tr>";
}
myTable+="</table>";
document.write( myTable);
//-->
</script>
If your code is in an external JS file, in HTML create an element with an ID where you want your table to appear:
<div id="tablePrint"> </div>
And in JS instead of document.write(myTable)
use the following code:
document.getElementById('tablePrint').innerHTML = myTable;
I had referenced this article and many others and did not find a clear cut concise response to help. I am offering my discovery, arrived at with some references from this thread, in the following:
Spring-Boot version: 1.3.5.RELEASE
Spring-Core version: 4.2.6.RELEASE
Dependency Management: Brixton.SR1
The following is the pertinent yaml excerpt:
tools:
toolList:
-
name: jira
matchUrl: http://someJiraUrl
-
name: bamboo
matchUrl: http://someBambooUrl
I created a Tools.class:
@Component
@ConfigurationProperties(prefix = "tools")
public class Tools{
private List<Tool> toolList = new ArrayList<>();
public Tools(){
//empty ctor
}
public List<Tool> getToolList(){
return toolList;
}
public void setToolList(List<Tool> tools){
this.toolList = tools;
}
}
I created a Tool.class:
@Component
public class Tool{
private String name;
private String matchUrl;
public Tool(){
//empty ctor
}
public String getName(){
return name;
}
public void setName(String name){
this.name= name;
}
public String getMatchUrl(){
return matchUrl;
}
public void setMatchUrl(String matchUrl){
this.matchUrl= matchUrl;
}
@Override
public String toString(){
StringBuffer sb = new StringBuffer();
String ls = System.lineSeparator();
sb.append(ls);
sb.append("name: " + name);
sb.append(ls);
sb.append("matchUrl: " + matchUrl);
sb.append(ls);
}
}
I used this combination in another class through @Autowired
@Component
public class SomeOtherClass{
private Logger logger = LoggerFactory.getLogger(SomeOtherClass.class);
@Autowired
private Tools tools;
/* excluded non-related code */
@PostConstruct
private void init(){
List<Tool> toolList = tools.getToolList();
if(toolList.size() > 0){
for(Tool t: toolList){
logger.info(t.toString());
}
}else{
logger.info("*****----- tool size is zero -----*****");
}
}
/* excluded non-related code */
}
And in my logs the name and matching url's were logged. This was developed on another machine and thus I had to retype all of the above so please forgive me in advance if I inadvertently mistyped.
I hope this consolidation comment is helpful to many and I thank the previous contributors to this thread!
If you don't want to wait for .NET 4.0, you could implement your own Zip
method. The following works with .NET 2.0. You can adjust the implementation depending on how you want to handle the case where the two enumerations (or lists) have different lengths; this one continues to the end of the longer enumeration, returning the default values for missing items from the shorter enumeration.
static IEnumerable<KeyValuePair<T, U>> Zip<T, U>(IEnumerable<T> first, IEnumerable<U> second)
{
IEnumerator<T> firstEnumerator = first.GetEnumerator();
IEnumerator<U> secondEnumerator = second.GetEnumerator();
while (firstEnumerator.MoveNext())
{
if (secondEnumerator.MoveNext())
{
yield return new KeyValuePair<T, U>(firstEnumerator.Current, secondEnumerator.Current);
}
else
{
yield return new KeyValuePair<T, U>(firstEnumerator.Current, default(U));
}
}
while (secondEnumerator.MoveNext())
{
yield return new KeyValuePair<T, U>(default(T), secondEnumerator.Current);
}
}
static void Test()
{
IList<string> names = new string[] { "one", "two", "three" };
IList<int> ids = new int[] { 1, 2, 3, 4 };
foreach (KeyValuePair<string, int> keyValuePair in ParallelEnumerate(names, ids))
{
Console.WriteLine(keyValuePair.Key ?? "<null>" + " - " + keyValuePair.Value.ToString());
}
}
Here is some code that will give you the general idea.
You need to create a custom ClientHttpRequestFactory
in order to trust the certificate.
It looks like this:
final ClientHttpRequestFactory clientHttpRequestFactory =
new MyCustomClientHttpRequestFactory(org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER, serverInfo);
restTemplate.setRequestFactory(clientHttpRequestFactory);
This is the implementation for MyCustomClientHttpRequestFactory
:
public class MyCustomClientHttpRequestFactory extends SimpleClientHttpRequestFactory {
private final HostnameVerifier hostNameVerifier;
private final ServerInfo serverInfo;
public MyCustomClientHttpRequestFactory (final HostnameVerifier hostNameVerifier,
final ServerInfo serverInfo) {
this.hostNameVerifier = hostNameVerifier;
this.serverInfo = serverInfo;
}
@Override
protected void prepareConnection(final HttpURLConnection connection, final String httpMethod)
throws IOException {
if (connection instanceof HttpsURLConnection) {
((HttpsURLConnection) connection).setHostnameVerifier(hostNameVerifier);
((HttpsURLConnection) connection).setSSLSocketFactory(initSSLContext()
.getSocketFactory());
}
super.prepareConnection(connection, httpMethod);
}
private SSLContext initSSLContext() {
try {
System.setProperty("https.protocols", "TLSv1");
// Set ssl trust manager. Verify against our server thumbprint
final SSLContext ctx = SSLContext.getInstance("TLSv1");
final SslThumbprintVerifier verifier = new SslThumbprintVerifier(serverInfo);
final ThumbprintTrustManager thumbPrintTrustManager =
new ThumbprintTrustManager(null, verifier);
ctx.init(null, new TrustManager[] { thumbPrintTrustManager }, null);
return ctx;
} catch (final Exception ex) {
LOGGER.error(
"An exception was thrown while trying to initialize HTTP security manager.", ex);
return null;
}
}
In this case my serverInfo
object contains the thumbprint of the server.
You need to implement the TrustManager
interface to get
the SslThumbprintVerifier
or any other method you want to verify your certificate (you can also decide to also always return true
).
The value org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER
allows all host names.
If you need to verify the host name,
you will need to implement it differently.
I'm not sure about the user and password and how you implemented it.
Often,
you need to add a header to the restTemplate
named Authorization
with a value that looks like this: Base: <encoded user+password>
.
The user+password
must be Base64
encoded.
the answer is already exist above, but I would like to add some thing.. you can specify the following in your @font-face
@font-face {
font-family: 'Name You Font';
src: url('assets/font/xxyourfontxxx.eot');
src: local('Cera Pro Medium'), local('CeraPro-Medium'),
url('assets/font/xxyourfontxxx.eot?#iefix') format('embedded-opentype'),
url('assets/font/xxyourfontxxx.woff') format('woff'),
url('assets/font/xxyourfontxxx.ttf') format('truetype');
font-weight: 500;
font-style: normal;
}
So you can just indicate your fontfamily name that you already choosed
NOTE: the font-weight and font-style depend on your .woff .ttf ... files
You're looking for ISO 8601 standard date format, so if you have GNU date (or any date command more modern than 1988) just do: $(date -I)
You are looking for collections.defaultdict
(available for Python 2.5+). This
from collections import defaultdict
my_dict = defaultdict(int)
my_dict[key] += 1
will do what you want.
For regular Python dict
s, if there is no value for a given key, you will not get None
when accessing the dict -- a KeyError
will be raised. So if you want to use a regular dict
, instead of your code you would use
if key in my_dict:
my_dict[key] += 1
else:
my_dict[key] = 1
OR operator:
<div ng-repeat="k in items">
<div ng-if="k || 'a' or k == 'b'">
<!-- SOME CONTENT -->
</div>
</div>
Even though it is simple enough to read, I hope as a developer you are use better names than 'a' 'k' 'b' etc..
For Example:
<div class="links-group" ng-repeat="group in groups" ng-show="!group.hidden">
<li ng-if="user.groups.admin || group.title == 'Home Pages'">
<!--Content-->
</li>
</div>
Another OR example
<p ng-if="group.title != 'Dispatcher News' or group.title != 'Coordinator News'" style="padding: 5px;">No links in group.</p>
AND operator (For those stumbling across this stackoverflow answer looking for an AND instead of OR condition)
<div class="links-group" ng-repeat="group in groups" ng-show="!group.hidden">
<li ng-if="user.groups.admin && group.title == 'Home Pages'">
<!--Content-->
</li>
</div>
Updated for Swift > 5
set the size:
button.frame = CGRect(x: 0, y: 0, width: 44, height: 44)
set margins:
button.imageEdgeInsets = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
I think best and easy one would be as below, just place rest of ur view in a content and footer in a separate view.
`<Container>
<Content>
<View>
Ur contents
</View>
</Content>
<View>
Footer
</View>
</Container>`
or u can use footer from native-base
`<Container>
<Content>
<View>
Ur contents
</View>
</Content>
<Footer>
Footer
</Footer>
</Container>`
There are two types of string in python: the traditional str
type and the newer unicode
type. If you type a string literal without the u
in front you get the old str
type which stores 8-bit characters, and with the u
in front you get the newer unicode
type that can store any Unicode character.
The r
doesn't change the type at all, it just changes how the string literal is interpreted. Without the r
, backslashes are treated as escape characters. With the r
, backslashes are treated as literal. Either way, the type is the same.
ur
is of course a Unicode string where backslashes are literal backslashes, not part of escape codes.
You can try to convert a Unicode string to an old string using the str()
function, but if there are any unicode characters that cannot be represented in the old string, you will get an exception. You could replace them with question marks first if you wish, but of course this would cause those characters to be unreadable. It is not recommended to use the str
type if you want to correctly handle unicode characters.
Not the right function name I think
$(document).ready(function() {
$('.datepicker').datetimepicker({
format: 'dd/mm/yyyy'
});
});
Personally I used this batch file, but it does require CygWin installed (64-bit as shown). Just associate the file type .SH with this batchfile (ExecSH.BAT in my case) and you can double-click on the .SH and it runs.
@echo off
setlocal
if not exist "%~dpn1.sh" echo Script "%~dpn1.sh" not found & goto :eof
set _CYGBIN=C:\cygwin64\bin
if not exist "%_CYGBIN%" echo Couldn't find Cygwin at "%_CYGBIN%" & goto :eof
:: Resolve ___.sh to /cygdrive based *nix path and store in %_CYGSCRIPT%
for /f "delims=" %%A in ('%_CYGBIN%\cygpath.exe "%~dpn1.sh"') do set _CYGSCRIPT=%%A
for /f "delims=" %%A in ('%_CYGBIN%\cygpath.exe "%CD%"') do set _CYGPATH=%%A
:: Throw away temporary env vars and invoke script, passing any args that were passed to us
endlocal & %_CYGBIN%\mintty.exe -e /bin/bash -l -c 'cd %_CYGPATH%; %_CYGSCRIPT% %*'
Based on this original work.
I would suggest following design :
Item Table:
Itemid, taglist1, taglist2
this will be fast and make easy saving and retrieving the data at item level.
In parallel build another table: Tags tag do not make tag unique identifier and if you run out of space in 2nd column which contains lets say 100 items create another row.
Now while searching for items for a tag it will be super fast.
Heap just guarantees that elements on higher levels are greater (for max-heap) or smaller (for min-heap) than elements on lower levels, whereas BST guarantees order (from "left" to "right"). If you want sorted elements, go with BST.
Getting name and subsetting based on Start, Contains, and Ends:
# from: https://stackoverflow.com/questions/21285380/find-column-whose-name-contains-a-specific-string
# from: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.str.contains.html
# from: https://cmdlinetips.com/2019/04/how-to-select-columns-using-prefix-suffix-of-column-names-in-pandas/
# from: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.filter.html
import pandas as pd
data = {'spike_starts': [1,2,3], 'ends_spike_starts': [4,5,6], 'ends_spike': [7,8,9], 'not': [10,11,12]}
df = pd.DataFrame(data)
print("\n")
print("----------------------------------------")
colNames_contains = df.columns[df.columns.str.contains(pat = 'spike')].tolist()
print("Contains")
print(colNames_contains)
print("\n")
print("----------------------------------------")
colNames_starts = df.columns[df.columns.str.contains(pat = '^spike')].tolist()
print("Starts")
print(colNames_starts)
print("\n")
print("----------------------------------------")
colNames_ends = df.columns[df.columns.str.contains(pat = 'spike$')].tolist()
print("Ends")
print(colNames_ends)
print("\n")
print("----------------------------------------")
df_subset_start = df.filter(regex='^spike',axis=1)
print("Starts")
print(df_subset_start)
print("\n")
print("----------------------------------------")
df_subset_contains = df.filter(regex='spike',axis=1)
print("Contains")
print(df_subset_contains)
print("\n")
print("----------------------------------------")
df_subset_ends = df.filter(regex='spike$',axis=1)
print("Ends")
print(df_subset_ends)
msbuild "C:\path to solution\project.sln"
Though this isn't a DIRECT answer to your question, I just encountered a similar problem, and thought I'd mentioned it:
I had an instance where it was instantiating a new (no doubt very inefficent) record for data.frame (a result of recursive searching) and it was giving me the same error.
I had this:
return(
data.frame(
user_id = gift$email,
sourced_from_agent_id = gift$source,
method_used = method,
given_to = gift$account,
recurring_subscription_id = NULL,
notes = notes,
stringsAsFactors = FALSE
)
)
turns out... it was the = NULL. When I switched to = NA, it worked fine. Just in case anyone else with a similar problem hits THIS post as I did.
Ubuntu 18.04 LTS
Configuration with bridged to see the server ip, and connect without "port forwarding"
VirtualBox > right click in server > settings > Network > enable adapter 2 > select "bridged" > Promiscuous mode: allow all > Check the cable connected > start server
On ubuntu server, edit sudo nano /etc/netplan/*init.yaml
file,
My sample file:
network:
ethernets:
enp0s3:
addresses: []
dhcp4: true
enp0s8:
addresses: [192.168.0.200/24]
dhcp4: no
dhcp6: no
nameservers:
addresses: [8.8.8.8, 8.8.4.4]
version: 2
Commands that will help you
nano /etc/netplan/file.yaml # file to specify the rules of network
reboot now # restart ubuntu server right now
netplan apply # do after edited *.yaml, to apply changes
ifconfig -a # show interfaces with ip, netmask, broadcast, etc...
ping google.com # to see if there is internet
Configure Static IP Addresses On Ubuntu 18.04 LTS Server - with NetPlan
For SQL 2000 I would use:
SELECT name, crdate, refdate
FROM sysobjects
WHERE type = 'P'
ORDER BY refdate desc
Server side encoding files/Images to base64String ready for client side consumption
public Optional<String> InputStreamToBase64(Optional<InputStream> inputStream) throws IOException{
if (inputStream.isPresent()) {
ByteArrayOutputStream output = new ByteArrayOutputStream();
FileCopyUtils.copy(inputStream.get(), output);
//TODO retrieve content type from file, & replace png below with it
return Optional.ofNullable("data:image/png;base64," + DatatypeConverter.printBase64Binary(output.toByteArray()));
}
return Optional.empty();
}
Server side base64 Image/File decoder
public Optional<InputStream> Base64InputStream(Optional<String> base64String)throws IOException {
if (base64String.isPresent()) {
return Optional.ofNullable(new ByteArrayInputStream(DatatypeConverter.parseBase64Binary(base64String.get())));
}
return Optional.empty();
}
If you need just update your records in energydata
based on data in temp_energydata
, assuming that temp_enerydata
doesn't contain any new records, then try this:
UPDATE e SET e.kWh = t.kWh
FROM energydata e INNER JOIN
temp_energydata t ON e.webmeterID = t.webmeterID AND
e.DateTime = t.DateTime
Here is working sqlfiddle
But if temp_energydata
contains new records and you need to insert it to energydata
preferably with one statement then you should definitely go with the answer that Bacon Bits gave.
this solution work for me ,
To revise IIS
Select Application Pools.
Clic in ASP .NET V4.0 Classic.
Select Advanced Settings.
In General, option Enable 32-Bit Applications, default is false. Select TRUE.
Refresh and check site.
Comment:
Platform: Windows Server 2012 Standart- 64Bit - IIS 8
Short answer: Put the executable file in /usr/local/bin
instead of applications. You should now be able to run commands like ngrok http 80
.
Long answer: When you type commands like ngrok
in the terminal, Macs (and other Unix OSs) look for these programs in the folders specified in your PATH
. The PATH
is a list of folders that's specified by each user. To check your path, open the terminal and type: echo $PATH
.
You'll see output that looks something like: /usr/local/bin:/usr/bin:/bin
. This is a :
separated list of folders.
So when you type ngrok
in the terminal, your Mac will look for this executable in the following folders: /usr/local/bin
, /usr/bin/
and /bin
.
Read this post if you are interested in learning about why you should prefer usr/local/bin
over other folders.
In the solution property page, check the platform of the assembly that contains "UpdatingMediaElement" and the assmeblies that contain any of the superclasses and interfaces from which "UpdatingMediaElement" subclasses or implements. It appears that the platform of all these assemblies must be "AnyCPU".
As others have pointed out, you can't cancel a forEach
loop, but here's my solution:
ary.forEach(function loop(){
if(loop.stop){ return; }
if(condition){ loop.stop = true; }
});
Of course this doesn't actually break the loop, it just prevents code execution on all the elements following the "break"
Your app is attempting to parse the undefined JSON web token. Such malfunction may occur due to the wrong usage of the local storage. Try to clear your local storage.
Example for Google Chrome:
It depends on the platform and compiler that you're using. Some compilers store directly in the code segment. Static variables are always only accessible to the current translation unit and the names are not exported thus the reason name collisions never occur.
its solved. Use nuget and search for the "ODP.NET, Managed Driver" invariant="Oracle.ManagedDataAccess.Client".
and install the package. it will resolve the issue for me.
A Window object is just what it sounds like: its a new Window
for your application. You should use it when you want to pop up an entirely new window. I don't often use more than one Window
in WPF because I prefer to put dynamic content in my main Window that changes based on user action.
A Page is a page inside your Window. It is mostly used for web-based systems like an XBAP, where you have a single browser window and different pages can be hosted in that window. It can also be used in Navigation Applications like sellmeadog said.
A UserControl is a reusable user-created control that you can add to your UI the same way you would add any other control. Usually I create a UserControl
when I want to build in some custom functionality (for example, a CalendarControl
), or when I have a large amount of related XAML code, such as a View
when using the MVVM design pattern.
When navigating between windows, you could simply create a new Window
object and show it
var NewWindow = new MyWindow();
newWindow.Show();
but like I said at the beginning of this answer, I prefer not to manage multiple windows if possible.
My preferred method of navigation is to create some dynamic content area using a ContentControl
, and populate that with a UserControl
containing whatever the current view is.
<Window x:Class="MyNamespace.MainWindow" ...>
<DockPanel>
<ContentControl x:Name="ContentArea" />
</DockPanel>
</Window>
and in your navigate event you can simply set it using
ContentArea.Content = new MyUserControl();
But if you're working with WPF, I'd highly recommend the MVVM design pattern. I have a very basic example on my blog that illustrates how you'd navigate using MVVM, using this pattern:
<Window x:Class="SimpleMVVMExample.ApplicationView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:SimpleMVVMExample"
Title="Simple MVVM Example" Height="350" Width="525">
<Window.Resources>
<DataTemplate DataType="{x:Type local:HomeViewModel}">
<local:HomeView /> <!-- This is a UserControl -->
</DataTemplate>
<DataTemplate DataType="{x:Type local:ProductsViewModel}">
<local:ProductsView /> <!-- This is a UserControl -->
</DataTemplate>
</Window.Resources>
<DockPanel>
<!-- Navigation Buttons -->
<Border DockPanel.Dock="Left" BorderBrush="Black"
BorderThickness="0,0,1,0">
<ItemsControl ItemsSource="{Binding PageViewModels}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Button Content="{Binding Name}"
Command="{Binding DataContext.ChangePageCommand,
RelativeSource={RelativeSource AncestorType={x:Type Window}}}"
CommandParameter="{Binding }"
Margin="2,5"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Border>
<!-- Content Area -->
<ContentControl Content="{Binding CurrentPageViewModel}" />
</DockPanel>
</Window>
If you have a process that already generates and returns an Image type, you can alter the bind and not have to modify any additional image creation code.
Refer to the ".Source" of the image in the binding statement.
XAML
<Image Name="imgOpenClose" Source="{Binding ImageOpenClose.Source}"/>
View Model Field
private Image _imageOpenClose;
public Image ImageOpenClose
{
get
{
return _imageOpenClose;
}
set
{
_imageOpenClose = value;
OnPropertyChanged();
}
}
I Concatenated my formula as normal but at the start I had '=
instead of =
.
Then I copy and paste as text to where I need it. Then I highlight the section saved as text and press ctrl + H to find and replace.
I replace '=
with =
and all of my functions are active.
Its a few stages but it avoids VBA.
I hope this helps,
Rob
//set height of html
$("html").css("height", screen.height);
//set width of html
$("html").css("width", screen.width);
//go to full screen mode
document.documentElement.webkitRequestFullscreen();
function listCookies() {
let cookies = document.cookie.split(';')
cookies.map((cookie, n) => console.log(`${n}:`, decodeURIComponent(cookie)))
}
function findCookie(e) {
let cookies = document.cookie.split(';')
cookies.map((cookie, n) => cookie.includes(e) && console.log(decodeURIComponent(cookie), n))
}
This is specifically for the window you're in. Tried to keep it clean and concise.
Comparing test result between Ubuntu Linux and Windows 7.
On Ubuntu
>>> start = time.time(); time.sleep(0.5); (time.time() - start)
0.5005500316619873
On Windows 7
>>> start = time.time(); time.sleep(0.5); (time.time() - start)
0.5
tightVNC 2.5.X and even pre 2.5 supports multi monitor. When you connect, you get a huge virtual monitor. However, this is also has disadvantages. UltaVNC (Tho when I tried it, was buggy in this area) allows you to connect to one huge virtual monitor or just to 1 screen at a time. (With a button to cycle through them) TightVNC also plan to support such a feature.. (When , no idea) This feature is important as if you have large multi monitors and connecting over a reasonably slow link.. The screen updates are just to slow.. Cutting down to one monitor to focus on is desirable.
I like tightVNC, but UltraVNC seems to have a few more features right now..
I have found tightVNC more solid. And that is why I have stuck with it.
I would try both. They both work well, but I imagine one would suite slightly more then the other.
If your exe takes arguments,
start MyApp.exe -arg1 -arg2
String str = arrayList.get(position);
arrayList.remove(str);
MyAdapter.this.notifyDataSetChanged();
You can enable TLS 1.2 in IIS by following these instructions. I presume this would be sufficient if you have an ASP.NET-based application that runs on top of IIS, although it looks like it does not really meet your needs.
to convert a file to its binary codes(hexadecimal representation) we say:
xxd filename #
e.g:
xxd hello.c #
to see all the contents and codes in a binary file , we could use commands like readelf
and objdump
, hexdump
,... .
for example if we want to see all the convert all the contents of a binary file(executable, shared libraries, object files) we say:
hexdump binaryfilename
e.g.
hexdump /bin/bash
but readelf is the best utility for analyzing elf(executable and linking format) files. so if we say:
readelf -a /bin/bash
all the contents in the binary file bash would be shown to us, also we could provide different flags for readelf to see all the sections and headers of an elf file separately, for example if we want to see only the elf header we say:
readelf -h /bin/bash
for reading all the segments of the file:
readelf -l /bin/bash
for reading all the sections of the file:
readelf -S /bin/sh
but again as summary , for reading a normal file like "hello.c" and a binary file like bash in path /bin/bash in linux we say:
xxd hello.c
readelf -a /bin/bash
Try this:
function add()
{
var sum = 0;
var inputs = document.getElementsByTagName("input");
for(i = 0; i <= inputs.length; i++)
{
if( inputs[i].name == 'qty'+i)
{
sum += parseInt(input[i].value);
}
}
console.log(sum)
}
This could be the easiest in my opinion:
SELECT * FROM `table` WHERE `timestamp` like concat(CURDATE(),'%');
You can use:
f.Controls[name];
Where f
is your form variable. That gives you the control with name name
.
Is there a step missing?
Yes. You need to create the directory:
mkdir ${HOME}/.ssh
Additionally, SSH requires you to set the permissions so that only you (the owner) can access anything in ~/.ssh:
% chmod 700 ~/.ssh
Should the
.ssh
dir be generated when I use thessh-keygen
command?
No. This command generates an SSH key pair but will fail if it cannot write to the required directory:
% ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/xxx/.ssh/id_rsa): /Users/tmp/does_not_exist
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
open /Users/tmp/does_not_exist failed: No such file or directory.
Saving the key failed: /Users/tmp/does_not_exist.
Once you've created your keys, you should also restrict who can read those key files to just yourself:
% chmod -R go-wrx ~/.ssh/*
Note: always try to detect the specific behavior you're trying to fix, instead of targeting it with isSafari?
As a last resort, detect Safari with this regex:
var isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);
It uses negative look-arounds and it excludes Chrome, Edge, and all Android browsers that include the Safari
name in their user agent.
val button = findViewById<Button>(R.id.button)
button.setOnClickListener {
val intent =
Intent(this@MainActivity,ThirdActivity::class.java)
intent.putExtra("key", "Kotlin")
startActivity(intent)
}
Notice that there is a difference between
set encoding
and
set fileencoding
In the first case, you'll change the output encoding that is shown in the terminal. In the second case, you'll change the output encoding of the file that is written.
How do I select by partial string from a pandas DataFrame?
This post is meant for readers who want to
isin
)...and would like to know more about what methods should be preferred over others.
(P.S.: I've seen a lot of questions on similar topics, I thought it would be good to leave this here.)
Friendly disclaimer, this is post is long.
# setup
df1 = pd.DataFrame({'col': ['foo', 'foobar', 'bar', 'baz']})
df1
col
0 foo
1 foobar
2 bar
3 baz
str.contains
can be used to perform either substring searches or regex based search. The search defaults to regex-based unless you explicitly disable it.
Here is an example of regex-based search,
# find rows in `df1` which contain "foo" followed by something
df1[df1['col'].str.contains(r'foo(?!$)')]
col
1 foobar
Sometimes regex search is not required, so specify regex=False
to disable it.
#select all rows containing "foo"
df1[df1['col'].str.contains('foo', regex=False)]
# same as df1[df1['col'].str.contains('foo')] but faster.
col
0 foo
1 foobar
Performance wise, regex search is slower than substring search:
df2 = pd.concat([df1] * 1000, ignore_index=True)
%timeit df2[df2['col'].str.contains('foo')]
%timeit df2[df2['col'].str.contains('foo', regex=False)]
6.31 ms ± 126 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
2.8 ms ± 241 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Avoid using regex-based search if you don't need it.
Addressing ValueError
s
Sometimes, performing a substring search and filtering on the result will result in
ValueError: cannot index with vector containing NA / NaN values
This is usually because of mixed data or NaNs in your object column,
s = pd.Series(['foo', 'foobar', np.nan, 'bar', 'baz', 123])
s.str.contains('foo|bar')
0 True
1 True
2 NaN
3 True
4 False
5 NaN
dtype: object
s[s.str.contains('foo|bar')]
# ---------------------------------------------------------------------------
# ValueError Traceback (most recent call last)
Anything that is not a string cannot have string methods applied on it, so the result is NaN (naturally). In this case, specify na=False
to ignore non-string data,
s.str.contains('foo|bar', na=False)
0 True
1 True
2 False
3 True
4 False
5 False
dtype: bool
How do I apply this to multiple columns at once?
The answer is in the question. Use DataFrame.apply
:
# `axis=1` tells `apply` to apply the lambda function column-wise.
df.apply(lambda col: col.str.contains('foo|bar', na=False), axis=1)
A B
0 True True
1 True False
2 False True
3 True False
4 False False
5 False False
All of the solutions below can be "applied" to multiple columns using the column-wise apply
method (which is OK in my book, as long as you don't have too many columns).
If you have a DataFrame with mixed columns and want to select only the object/string columns, take a look at select_dtypes
.
This is most easily achieved through a regex search using the regex OR pipe.
# Slightly modified example.
df4 = pd.DataFrame({'col': ['foo abc', 'foobar xyz', 'bar32', 'baz 45']})
df4
col
0 foo abc
1 foobar xyz
2 bar32
3 baz 45
df4[df4['col'].str.contains(r'foo|baz')]
col
0 foo abc
1 foobar xyz
3 baz 45
You can also create a list of terms, then join them:
terms = ['foo', 'baz']
df4[df4['col'].str.contains('|'.join(terms))]
col
0 foo abc
1 foobar xyz
3 baz 45
Sometimes, it is wise to escape your terms in case they have characters that can be interpreted as regex metacharacters. If your terms contain any of the following characters...
. ^ $ * + ? { } [ ] \ | ( )
Then, you'll need to use re.escape
to escape them:
import re
df4[df4['col'].str.contains('|'.join(map(re.escape, terms)))]
col
0 foo abc
1 foobar xyz
3 baz 45
re.escape
has the effect of escaping the special characters so they're treated literally.
re.escape(r'.foo^')
# '\\.foo\\^'
By default, the substring search searches for the specified substring/pattern regardless of whether it is full word or not. To only match full words, we will need to make use of regular expressions here—in particular, our pattern will need to specify word boundaries (\b
).
For example,
df3 = pd.DataFrame({'col': ['the sky is blue', 'bluejay by the window']})
df3
col
0 the sky is blue
1 bluejay by the window
Now consider,
df3[df3['col'].str.contains('blue')]
col
0 the sky is blue
1 bluejay by the window
v/s
df3[df3['col'].str.contains(r'\bblue\b')]
col
0 the sky is blue
Similar to the above, except we add a word boundary (\b
) to the joined pattern.
p = r'\b(?:{})\b'.format('|'.join(map(re.escape, terms)))
df4[df4['col'].str.contains(p)]
col
0 foo abc
3 baz 45
Where p
looks like this,
p
# '\\b(?:foo|baz)\\b'
Because you can! And you should! They are usually a little bit faster than string methods, because string methods are hard to vectorise and usually have loopy implementations.
Instead of,
df1[df1['col'].str.contains('foo', regex=False)]
Use the in
operator inside a list comp,
df1[['foo' in x for x in df1['col']]]
col
0 foo abc
1 foobar
Instead of,
regex_pattern = r'foo(?!$)'
df1[df1['col'].str.contains(regex_pattern)]
Use re.compile
(to cache your regex) + Pattern.search
inside a list comp,
p = re.compile(regex_pattern, flags=re.IGNORECASE)
df1[[bool(p.search(x)) for x in df1['col']]]
col
1 foobar
If "col" has NaNs, then instead of
df1[df1['col'].str.contains(regex_pattern, na=False)]
Use,
def try_search(p, x):
try:
return bool(p.search(x))
except TypeError:
return False
p = re.compile(regex_pattern)
df1[[try_search(p, x) for x in df1['col']]]
col
1 foobar
np.char.find
, np.vectorize
, DataFrame.query
.In addition to str.contains
and list comprehensions, you can also use the following alternatives.
np.char.find
Supports substring searches (read: no regex) only.
df4[np.char.find(df4['col'].values.astype(str), 'foo') > -1]
col
0 foo abc
1 foobar xyz
np.vectorize
This is a wrapper around a loop, but with lesser overhead than most pandas str
methods.
f = np.vectorize(lambda haystack, needle: needle in haystack)
f(df1['col'], 'foo')
# array([ True, True, False, False])
df1[f(df1['col'], 'foo')]
col
0 foo abc
1 foobar
Regex solutions possible:
regex_pattern = r'foo(?!$)'
p = re.compile(regex_pattern)
f = np.vectorize(lambda x: pd.notna(x) and bool(p.search(x)))
df1[f(df1['col'])]
col
1 foobar
DataFrame.query
Supports string methods through the python engine. This offers no visible performance benefits, but is nonetheless useful to know if you need to dynamically generate your queries.
df1.query('col.str.contains("foo")', engine='python')
col
0 foo
1 foobar
More information on query
and eval
family of methods can be found at Dynamic Expression Evaluation in pandas using pd.eval().
str.contains
, for its simplicity and ease handling NaNs and mixed datanp.vectorize
df.query
Big task, chances are you shouldn't reinvent the wheel rather using an existing wheel (such as paypal).
However, if you insist on continuing. Start small, you can use a credit card processing facility (Moneris, Authorize.NET) to process credit cards. Most providers have an API you can use. Be wary that you may need to use different providers depending on the card type (Discover, Visa, Amex, Mastercard) and Country (USA, Canada, UK). So build it so that you can communicate with multiple credit card processing APIs.
Security is essential if you are storing credit cards and payment details. Ensure that you are encrypting things properly.
Again, don't reinvent the wheel. You are better off using an existing provider and focussing your development attention on solving an problem that can't easily be purchase.
Hmm... Looking for better way... here it is
var onlyUrl = window.location.href.replace(window.location.search,'');
move
and del
ARE certainly the equivalents, but from a functionality standpoint they are woefully NOT equivalent. For example, you can't move both files AND folders (in a wildcard scenario) with the move
command. And the same thing applies with del
.
The preferred solution in my view is to use Win32 ports of the Linux tools, the best collection of which I have found being here.
mv
and rm
are in the CoreUtils package and they work wonderfully!
I activated the Apache module headers a2enmod headers, and the issue has been solved.
You can use the start (^
) and end ($
) of line indicators:
^[0-9]{2}$
Some language also have functions that allows you to match against an entire string, where-as you were using a find
function. Matching against the entire string will make your regex work as an alternative to the above. The above regex will also work, but the ^
and $
will be redundant.
it's answered, but it could be done with a fancy 'map/reduce' use, e.g.:
def find_key(value, dictionary):
return reduce(lambda x, y: x if x is not None else y,
map(lambda x: x[0] if x[1] == value else None,
dictionary.iteritems()))
The command build
in pipeline is there to trigger other jobs in jenkins.
The job must exist in Jenkins and can be parametrized. As for the branch, I guess you can read it from git
var obj = {
key1: 'value1',
key2: 'value2',
key3: 'value3',
key4: 'value4'
}
console.log(Object.keys(obj));
console.log(Object.keys(obj).length)
<resource>
<style name="button">
<item name="android:textSize">15dp</item>
</style>
<resource>
You can get the window height quite easily in pure CSS, using the units "vh", each corresponding to 1% of the window height. On the example below, let's begin to centralize block.foo by adding a margin-top half the size of the screen.
.foo{
margin-top: 50vh;
}
But that only works for 'window' size. With a dab of javascript, you could make it more versatile.
$(':root').css("--windowHeight", $( window ).height() );
That code will create a CSS variable named "--windowHeight" that carries the height of the window. To use it, just add the rule:
.foo{
margin-top: calc( var(--windowHeight) / 2 );
}
And why is it more versatile than simply using "vh" units? Because you can get the height of any element. Now if you want to centralize a block.foo in any container.bar, you could:
$(':root').css("--containerHeight", $( .bar ).height() );
$(':root').css("--blockHeight", $( .foo ).height() );
.foo{
margin-top: calc( var(--containerHeight) / 2 - var(--blockHeight) / 2);
}
And finally, for it to respond to changes on the window size, you could use (in this example, the container is 50% the window height):
$( window ).resize(function() {
$(':root').css("--containerHeight", $( .bar ).height()*0.5 );
});
Signed variables use one bit to flag whether they are positive or negative. Unsigned variables don't have this bit, so they can store larger numbers in the same space, but only nonnegative numbers, e.g. 0 and higher.
For more: Unsigned and Signed Integers
This is basically the same solution as @andy-wilkinson provided, but as of Spring Boot 1.0 the customize(...) method has a ConfigurableEmbeddedServletContainer parameter.
Another thing that is worth mentioning is that Tomcat only compresses content types of text/html
, text/xml
and text/plain
by default. Below is an example that supports compression of application/json
as well:
@Bean
public EmbeddedServletContainerCustomizer servletContainerCustomizer() {
return new EmbeddedServletContainerCustomizer() {
@Override
public void customize(ConfigurableEmbeddedServletContainer servletContainer) {
((TomcatEmbeddedServletContainerFactory) servletContainer).addConnectorCustomizers(
new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
AbstractHttp11Protocol httpProtocol = (AbstractHttp11Protocol) connector.getProtocolHandler();
httpProtocol.setCompression("on");
httpProtocol.setCompressionMinSize(256);
String mimeTypes = httpProtocol.getCompressableMimeTypes();
String mimeTypesWithJson = mimeTypes + "," + MediaType.APPLICATION_JSON_VALUE;
httpProtocol.setCompressableMimeTypes(mimeTypesWithJson);
}
}
);
}
};
}
HOW TO ANIMATE OPACITY WITH CSS:
this is my code:
the CSS code
.item {
height:200px;
width:200px;
background:red;
opacity:0;
transition: opacity 1s ease-in-out;
}
.item:hover {
opacity: 1;
}
code {
background: linear-gradient(to right,#fce4ed,#ffe8cc);
}
_x000D_
<div class="item">
</div>
<p><code> move mouse over top of this text</code></p>
_x000D_
function vote(){
var vote = getElementById("yourOpinion")
if(this.workWithYou):
vote += 1 };
lol
string[] fileEntries = Directory.GetFiles(directoryPath);
foreach (var file_name in fileEntries){
string fileName = file_name.Substring(directoryPath.Length + 1);
Console.WriteLine(fileName);
}
It seems that window.onerror
doesn't provide access to all possible errors. Specifically it ignores:
<img>
loading errors (response >= 400).<script>
loading errors (response >= 400).window.onerror
in an unknown way (jquery, angular, etc.).Here is the start of a script that catches many of these errors, so that you may add more robust debugging to your app during development.
(function(){
/**
* Capture error data for debugging in web console.
*/
var captures = [];
/**
* Wait until `window.onload`, so any external scripts
* you might load have a chance to set their own error handlers,
* which we don't want to override.
*/
window.addEventListener('load', onload);
/**
* Custom global function to standardize
* window.onerror so it works like you'd think.
*
* @see http://www.quirksmode.org/dom/events/error.html
*/
window.onanyerror = window.onanyerror || onanyerrorx;
/**
* Hook up all error handlers after window loads.
*/
function onload() {
handleGlobal();
handleXMLHttp();
handleImage();
handleScript();
handleEvents();
}
/**
* Handle global window events.
*/
function handleGlobal() {
var onerrorx = window.onerror;
window.addEventListener('error', onerror);
function onerror(msg, url, line, col, error) {
window.onanyerror.apply(this, arguments);
if (onerrorx) return onerrorx.apply(null, arguments);
}
}
/**
* Handle ajax request errors.
*/
function handleXMLHttp() {
var sendx = XMLHttpRequest.prototype.send;
window.XMLHttpRequest.prototype.send = function(){
handleAsync(this);
return sendx.apply(this, arguments);
};
}
/**
* Handle image errors.
*/
function handleImage() {
var ImageOriginal = window.Image;
window.Image = ImageOverride;
/**
* New `Image` constructor. Might cause some problems,
* but not sure yet. This is at least a start, and works on chrome.
*/
function ImageOverride() {
var img = new ImageOriginal;
onnext(function(){ handleAsync(img); });
return img;
}
}
/**
* Handle script errors.
*/
function handleScript() {
var HTMLScriptElementOriginal = window.HTMLScriptElement;
window.HTMLScriptElement = HTMLScriptElementOverride;
/**
* New `HTMLScriptElement` constructor.
*
* Allows us to globally override onload.
* Not ideal to override stuff, but it helps with debugging.
*/
function HTMLScriptElementOverride() {
var script = new HTMLScriptElement;
onnext(function(){ handleAsync(script); });
return script;
}
}
/**
* Handle errors in events.
*
* @see http://stackoverflow.com/questions/951791/javascript-global-error-handling/31750604#31750604
*/
function handleEvents() {
var addEventListenerx = window.EventTarget.prototype.addEventListener;
window.EventTarget.prototype.addEventListener = addEventListener;
var removeEventListenerx = window.EventTarget.prototype.removeEventListener;
window.EventTarget.prototype.removeEventListener = removeEventListener;
function addEventListener(event, handler, bubble) {
var handlerx = wrap(handler);
return addEventListenerx.call(this, event, handlerx, bubble);
}
function removeEventListener(event, handler, bubble) {
handler = handler._witherror || handler;
removeEventListenerx.call(this, event, handler, bubble);
}
function wrap(fn) {
fn._witherror = witherror;
function witherror() {
try {
fn.apply(this, arguments);
} catch(e) {
window.onanyerror.apply(this, e);
throw e;
}
}
return fn;
}
}
/**
* Handle image/ajax request errors generically.
*/
function handleAsync(obj) {
var onerrorx = obj.onerror;
obj.onerror = onerror;
var onabortx = obj.onabort;
obj.onabort = onabort;
var onloadx = obj.onload;
obj.onload = onload;
/**
* Handle `onerror`.
*/
function onerror(error) {
window.onanyerror.call(this, error);
if (onerrorx) return onerrorx.apply(this, arguments);
};
/**
* Handle `onabort`.
*/
function onabort(error) {
window.onanyerror.call(this, error);
if (onabortx) return onabortx.apply(this, arguments);
};
/**
* Handle `onload`.
*
* For images, you can get a 403 response error,
* but this isn't triggered as a global on error.
* This sort of standardizes it.
*
* "there is no way to get the HTTP status from a
* request made by an img tag in JavaScript."
* @see http://stackoverflow.com/questions/8108636/how-to-get-http-status-code-of-img-tags/8108646#8108646
*/
function onload(request) {
if (request.status && request.status >= 400) {
window.onanyerror.call(this, request);
}
if (onloadx) return onloadx.apply(this, arguments);
}
}
/**
* Generic error handler.
*
* This shows the basic implementation,
* which you could override in your app.
*/
function onanyerrorx(entity) {
var display = entity;
// ajax request
if (entity instanceof XMLHttpRequest) {
// 400: http://example.com/image.png
display = entity.status + ' ' + entity.responseURL;
} else if (entity instanceof Event) {
// global window events, or image events
var target = entity.currentTarget;
display = target;
} else {
// not sure if there are others
}
capture(entity);
console.log('[onanyerror]', display, entity);
}
/**
* Capture stuff for debugging purposes.
*
* Keep them in memory so you can reference them
* in the chrome debugger as `onanyerror0` up to `onanyerror99`.
*/
function capture(entity) {
captures.push(entity);
if (captures.length > 100) captures.unshift();
// keep the last ones around
var i = captures.length;
while (--i) {
var x = captures[i];
window['onanyerror' + i] = x;
}
}
/**
* Wait til next code execution cycle as fast as possible.
*/
function onnext(fn) {
setTimeout(fn, 0);
}
})();
It could be used like this:
window.onanyerror = function(entity){
console.log('some error', entity);
};
The full script has a default implementation that tries to print out a semi-readable "display" version of the entity/error that it receives. Can be used for inspiration for an app-specific error handler. The default implementation also keeps a reference to the last 100 error entities, so you can inspect them in the web console after they occur like:
window.onanyerror0
window.onanyerror1
...
window.onanyerror99
Note: This works by overriding methods on several browser/native constructors. This can have unintended side-effects. However, it has been useful to use during development, to figure out where errors are occurring, to send logs to services like NewRelic or Sentry during development so we can measure errors during development, and on staging so we can debug what is going on at a deeper level. It can then be turned off in production.
Hope this helps.
Using data.frame
instead of cbind
should be helpful
x <- data.frame(col1=c(10, 20), col2=c("[]", "[]"), col3=c("[[1,2]]","[[1,3]]"))
x
col1 col2 col3
1 10 [] [[1,2]]
2 20 [] [[1,3]]
sapply(x, class) # looking into x to see the class of each element
col1 col2 col3
"numeric" "factor" "factor"
As you can see elements from col1 are numeric
as you wish.
data.frame
can have variables of different class
: numeric
, factor
and character
but matrix
doesn't, once you put a character
element into a matrix all the other will become into this class no matter what clase they were before.
Be consistent and it doesn't matter which one. Also if for some reason you must interop with another program or tool using a certain DEBUG identifier it's easy to do
#ifdef THEIRDEBUG
#define MYDEBUG
#endif //and vice-versa
I can see that this question was originally posted 5 yrs ago when programmers had to work harder to get their desired results. With Visual Studio 2012 and beyond, a lazy programmer can go the Design View for the Listview properties settings, and click on Properties->Sorting, choose Ascending. There are plenty of other properties features to obtain the various results a lazy (aka smart) programmer can leverage.
I too had the same issue. Got it resolved by compiling with the latest sdk tool versions.(Play services,build tools etc). Sample build.gradle is shown below for reference.
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "23.0.1"
defaultConfig {
applicationId "com.abc.bcd"
minSdkVersion 14
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.google.android.gms:play-services:8.4.0'
compile 'com.android.support:appcompat-v7:23.0.1'
}
One of the most intuitive solutions is using Sourcetree.
You can just drag and drop files from staged and unstaged
Use this to convert OffSet to postive:
var offset = new Date().getTimezoneOffset();
console.log(offset);
this.timeOffSet = offset + (-2*offset);
console.log(this.timeOffSet);
I know the OP is asking for a CSS-only solution. But in case anyone landing here from the Magic Google ends up requiring a JavaScript solution, here's a one-liner:
capitalize = str => str[0].toUpperCase() + str.substr(1);
e.g.:
capitalize('foo bar baz'); // -> 'Foo bar baz'
Directly start the initial screen with FLAG_ACTIVITY_CLEAR_TASK and FLAG_ACTIVITY_NEW_TASK.
Well u have used Pojo Entity so u can do this. u need to get object of that and have to set data.
myList.get(3).setEmail("email");
that way u can do that. or u can set other param too.
C99 N1256 standard draft
http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf
6.5.3.4 The sizeof operator:
3 When applied to an operand that has structure or union type, the result is the total number of bytes in such an object, including internal and trailing padding.
6.7.2.1 Structure and union specifiers:
13 ... There may be unnamed padding within a structure object, but not at its beginning.
and:
15 There may be unnamed padding at the end of a structure or union.
The new C99 flexible array member feature (struct S {int is[];};
) may also affect padding:
16 As a special case, the last element of a structure with more than one named member may have an incomplete array type; this is called a flexible array member. In most situations, the flexible array member is ignored. In particular, the size of the structure is as if the flexible array member were omitted except that it may have more trailing padding than the omission would imply.
Annex J Portability Issues reiterates:
The following are unspecified: ...
- The value of padding bytes when storing values in structures or unions (6.2.6.1)
C++11 N3337 standard draft
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf
5.3.3 Sizeof:
2 When applied to a class, the result is the number of bytes in an object of that class including any padding required for placing objects of that type in an array.
9.2 Class members:
A pointer to a standard-layout struct object, suitably converted using a reinterpret_cast, points to its initial member (or if that member is a bit-field, then to the unit in which it resides) and vice versa. [ Note: There might therefore be unnamed padding within a standard-layout struct object, but not at its beginning, as necessary to achieve appropriate alignment. — end note ]
I only know enough C++ to understand the note :-)
Media Queries in style-Attributes are not possible right now. But if you have to set this dynamically via Javascript. You could insert that rule via JS aswell.
document.styleSheets[0].insertRule("@media only screen and (max-width : 300px) { span { background-image:particular_ad_small.png; } }","");
This is as if the style was there in the stylesheet. So be aware of specificity.
Reviewer the solution by this Checking the solution of this page, make the following solution I hope it works: Example:
Javascript:
var context = window.location.pathname.substring(0, window.location.pathname.indexOf("/",2));
var url =window.location.protocol+"//"+ window.location.host +context+"/bla/bla";
use this one
int number = (int) Double.parseDouble(s);