May & June 2022 Fundraising Workshop Dates Now Released

2022-03-15 Thread NFP Workshops


NFP WORKSHOPS

Workshops are held online via Zoom  10.00 to 12.30  Each workshop costs £95.00

BOOKINGS

Our website contains booking links for all workshops. 
Google nfp workshops to visit our website and book your place.

BID WRITING  

Monday 21 March 2022 - Monday 4 April 2022 - Monday 25 April 2022
Monday 09 May 2022 - Monday 23 May 2022 - Monday 06 June 2022
Monday 20 June 2022

Do you know the most common reasons for rejection? Are you gathering the right 
evidence? Are you making 
the right arguments? Are you using the right terminology? Are your numbers 
right? Are you learning from 
rejections? Are you assembling the right documents? Do you know how to create a 
clear and concise 
standard funding bid? Are you communicating with people or just excluding them? 
Do you know your own 
organisation well enough? Are you thinking through your projects carefully 
enough? Do you know enough 
about your competitors? Are you answering the questions funders will ask 
themselves about your 
application? Are you submitting applications correctly?

TRUST FUNDRAISING

Tuesday 22 March 2022 - Tuesday 26 April 2022 - Tuesday 24 May 2022
Tuesday 21 June 2022

Are you applying to the right trusts? Are you applying to enough trusts? Are 
you asking for the right amount 
of money? Are you applying in the right ways? Are your projects the most 
fundable projects? Are you carrying 
out trust fundraising in a professional way? Are you delegating enough work? 
Are you highly productive or 
just very busy? Are you looking for trusts in all the right places? How do you 
compare with your competitors 
for funding? Is the rest of your fundraising hampering your bids to trusts? Do 
you understand what trusts are 
ideally looking for?

GRANT MAKING TRUSTS
 
Our online database has details of more than 34,000 trusts, foundations and 
charities that make grants to 
organisations. The site allows users to quickly find a wide range of new 
potential funders including regional, 
lower profile and newer trusts plus charities that make grants to organisations 
as well as running activities 
themselves. A 1 year subscription to the database costs £95.00 per user.

Google nfp workshops to visit our website, find more details and subscribe.

RECRUITING AND MANAGING VOLUNTEERS  

Tuesday 05 April 2022 - Tuesday 10 May 2022 - Tuesday 07 June 2022

Where do you find volunteers? How do you find the right volunteers? How do you 
attract volunteers? How 
do you run volunteer recruitment events? How do you interview volunteers? How 
do you train volunteers? 
How do you motivate volunteers? How do you involve volunteers? How do you 
recognise volunteers? How do 
you recognise problems with volunteers? How do you learn from volunteer 
problems? How do you retain 
volunteers? How do you manage volunteers? What about volunteers and your own 
staff? What about 
younger, older and employee volunteers? 

INTRODUCTION TO FUNDRAISING 

Wednesday 11 May 2022

The workshop is for people who wish to move into fundraising, have just started 
in fundraising or have 
responsibilities for fundraisers. We examine each of the different areas of 
fundraising - public donors, major 
donors, legacies, trusts and corporates. We explain how the different areas fit 
together and support each 
other to create a balanced fundraising effort. We look at how much investment 
each area of fundraising 
requires, what returns to expect and how long it is likely to take to achieve 
those returns. We examine what 
the rest of your organisation could be doing to help make your fundraising more 
successful.

LEGACY FUNDRAISING 

Wednesday 23 March 2022 - Wednesday 25 May 2022

Why do people make legacy gifts? What are the ethical issues? What are the 
regulations? What are the tax 
issues? What are the statistics? What are the trends? How can we integrate 
legacy fundraising into our other 
fundraising? What are the sources for research? How should we set a budget? How 
should we evaluate our 
results? How should we forecast likely income? Should we use consultants? How 
should we build a case for 
support? What media and marketing channels should we use? What about in memory 
giving? How should 
we setup our admin systems? What are the common problems & pitfalls?

MAJOR DONOR FUNDRAISING  

Wednesday 06 April 2022 - Wednesday 08 June 2022

Major Donor Characteristics, Motivations and Requirements. Researching and 
Screening Major Donors. 
Encouraging, Involving and Retaining Major Donors. Building Relationships with 
Major Donors. Major Donor 
Events and Activities. Setting Up Major Donor Clubs. Asking For Major Gifts. 
Looking After and Reporting 
Back to Major Donors. Delivering on Major Donor Expectations. Showing Your 
Appreciation to Major Donors. 
Fundraising Budgets and Committees.   

CORPORATE FUNDRAISING 

Wednesday 27 April 2022 - Wednesday 22 June 2022

Who are these companies? Why do they get involved? What do they like? What can 
you get from them? What 
can 

Re: Rpm version 2.4.14

2022-03-15 Thread Eli Bechavod
Thanks !!! You are the best It working !

On Tue, 15 Mar 2022 at 10:01 Aleksandar Lazic  wrote:

>
> On 15.03.22 05:36, Eli Bechavod wrote:
> > Hii guys,
> > I am looking for rpm to version 2.4.14 and didn’t found that ..
> >
> > Why on image base centos/rhel did you stop in 1.8 ? I saw that I can
> install with a makefile but it old way .. :( .
> >
> > I would to sound if you have any solutions
>
> You can create a rpm based on that repo.
> https://github.com/DBezemer/rpm-haproxy
>
> > Thanks
> > Eli
>
> Regards
> Alex
>


Re: [PATCH 0/6] 'ist'ify members of struct proxy

2022-03-15 Thread Tim Düsterhus

Willy,

On 3/15/22 08:26, Willy Tarreau wrote:

Or perhaps you could ask and include
me in Cc, at least people already know you. I'll be happy to further improve
the existing Coccinelle patches and to further 'ist'ify the codebase, but
would need some handholding to get me started.


Note that beyond changing code, one thing that would be extremely useful
would be to build up a collection of patches to detect certain classes of
bugs. I wrote some scripts that used to match improbable expressions like:

 unlikely(E) < 0

But I can't figure how to make them match anymore, or they match too much
thus for me the behavior has always been a bit random and I never know if
I can trust the absence of a match.


If you send over your existing Coccinelle files I can have a look into 
cleaning them up and then committing them.



Overall this is still a fantastic tool but it requires a significant and
sustained investment to really unleash its power. Unfortunately in a small
project like haproxy most often it takes less time to perform a few changes
by hand than to try to figure a reliable way to express what we want.



At least for the ist.cocci new cases pop up every now and then and the 
rules within that file are all very very simple. So for that the 
investment into writing the patches is worth it I believe.


I think the hard part is not so much "performing the changes by hand", 
but rather "reliably finding the places by hand". Using grep to find 
accesses of '.ptr' for an ist is going to turn up all kinds of unrelated 
stuff.


Best regards
Tim Düsterhus



[PATCH 2/4] CLEANUP: Reapply ist.cocci with `--include-headers-for-types --recursive-includes`

2022-03-15 Thread Tim Duesterhus
Previous uses of `ist.cocci` did not add `--include-headers-for-types` and
`--recursive-includes` preventing Coccinelle seeing `struct ist` members of
other structs.

Reapply the patch with proper flags to further clean up the use of the ist API.

The command used was:

spatch -sp_file dev/coccinelle/ist.cocci -in_place --include-headers 
--include-headers-for-types --recursive-includes --dir src/
---
 src/cache.c |  2 +-
 src/fcgi.c  | 12 
 src/flt_http_comp.c | 12 ++--
 src/h1.c|  6 ++
 src/h2.c|  6 +++---
 src/http_fetch.c|  2 +-
 src/http_htx.c  | 10 --
 src/log.c   |  2 +-
 src/mux_fcgi.c  | 10 +-
 src/mux_h1.c|  2 +-
 src/sink.c  |  2 +-
 src/tcpcheck.c  |  2 +-
 12 files changed, 30 insertions(+), 38 deletions(-)

diff --git a/src/cache.c b/src/cache.c
index 60f9a0ed7..0f90af984 100644
--- a/src/cache.c
+++ b/src/cache.c
@@ -626,7 +626,7 @@ cache_store_http_payload(struct stream *s, struct filter 
*filter, struct http_ms
 
info = (type << 28) + v.len;
chunk_memcat(, (char *), 
sizeof(info));
-   chunk_memcat(, v.ptr, v.len);
+   chunk_istcat(, v);
to_forward += v.len;
len -= v.len;
break;
diff --git a/src/fcgi.c b/src/fcgi.c
index 1c2543def..dcf2db219 100644
--- a/src/fcgi.c
+++ b/src/fcgi.c
@@ -197,10 +197,8 @@ size_t fcgi_decode_param(const struct buffer *in, size_t 
o, struct fcgi_param *p
if (data < nlen + vlen)
return 0;
 
-   p->n.ptr = b_peek(in, o);
-   p->n.len = nlen;
-   p->v.ptr = b_peek(in, o+nlen);
-   p->v.len = vlen;
+   p->n = ist2(b_peek(in, o), nlen);
+   p->v = ist2(b_peek(in, o + nlen), vlen);
len += nlen + vlen;
 
return len;
@@ -254,10 +252,8 @@ size_t fcgi_aligned_decode_param(const struct buffer *in, 
size_t o, struct fcgi_
if (data < nlen + vlen)
return 0;
 
-   p->n.ptr = in->area + o;
-   p->n.len = nlen;
-   p->v.ptr = in->area + o + nlen;
-   p->v.len = vlen;
+   p->n = ist2(in->area + o, nlen);
+   p->v = ist2(in->area + o + nlen, vlen);
len += nlen + vlen;
 
return len;
diff --git a/src/flt_http_comp.c b/src/flt_http_comp.c
index f2b210a67..08f684e51 100644
--- a/src/flt_http_comp.c
+++ b/src/flt_http_comp.c
@@ -400,26 +400,26 @@ select_compression_request_header(struct comp_state *st, 
struct stream *s, struc
 
qval = ctx.value.ptr + toklen;
while (1) {
-   while (qval < ctx.value.ptr + ctx.value.len && 
HTTP_IS_LWS(*qval))
+   while (qval < istend(ctx.value) && 
HTTP_IS_LWS(*qval))
qval++;
 
-   if (qval >= ctx.value.ptr + ctx.value.len || 
*qval != ';') {
+   if (qval >= istend(ctx.value) || *qval != ';') {
qval = NULL;
break;
}
qval++;
 
-   while (qval < ctx.value.ptr + ctx.value.len && 
HTTP_IS_LWS(*qval))
+   while (qval < istend(ctx.value) && 
HTTP_IS_LWS(*qval))
qval++;
 
-   if (qval >= ctx.value.ptr + ctx.value.len) {
+   if (qval >= istend(ctx.value)) {
qval = NULL;
break;
}
-   if (strncmp(qval, "q=", MIN(ctx.value.ptr + 
ctx.value.len - qval, 2)) == 0)
+   if (strncmp(qval, "q=", MIN(istend(ctx.value) - 
qval, 2)) == 0)
break;
 
-   while (qval < ctx.value.ptr + ctx.value.len && 
*qval != ';')
+   while (qval < istend(ctx.value) && *qval != ';')
qval++;
}
 
diff --git a/src/h1.c b/src/h1.c
index dd208f323..bf546b9d7 100644
--- a/src/h1.c
+++ b/src/h1.c
@@ -428,8 +428,7 @@ int h1_headers_to_hdr_list(char *start, const char *stop,
http_msg_req09_uri_e:
sl.rq.u.len = ptr - sl.rq.u.ptr;
http_msg_req09_ver:
-   sl.rq.v.ptr = ptr;
-   sl.rq.v.len = 0;
+   sl.rq.v = ist2(ptr, 0);
goto http_msg_rqline_eol;
}
state = H1_MSG_RQMETH;
@@ -659,8 +658,7 @@ int h1_headers_to_hdr_list(char *start, const char *stop,

[PATCH 0/4] Using Coccinelle the right way

2022-03-15 Thread Tim Duesterhus
Willy,

I wanted to build a simple reproducer for the "ist in struct" issue to post
on the Coccinelle list and found that it worked if all structs are defined
in the same .c file. Searching the list archives then revealed the

  --include-headers-for-types

flag which fixes the issue we're seeing.

I've fixed a bug in the ist.cocci, reapplied it on the whole tree and then
turned the bugfix into another rule and applied that one.

Best regards

Tim Duesterhus (4):
  DEV: coccinelle: Fix incorrect replacement in ist.cocci
  CLEANUP: Reapply ist.cocci with `--include-headers-for-types
--recursive-includes`
  DEV: coccinelle: Add a new pattern to ist.cocci
  CLEANUP: Reapply ist.cocci

 dev/coccinelle/ist.cocci |  6 ++
 src/cache.c  |  2 +-
 src/fcgi.c   | 12 
 src/flt_http_comp.c  | 12 ++--
 src/h1.c |  6 ++
 src/h2.c |  6 +++---
 src/http_act.c   | 15 +--
 src/http_fetch.c |  2 +-
 src/http_htx.c   | 10 --
 src/log.c|  2 +-
 src/mux_fcgi.c   | 10 +-
 src/mux_h1.c |  2 +-
 src/sink.c   |  2 +-
 src/tcpcheck.c   |  2 +-
 14 files changed, 41 insertions(+), 48 deletions(-)

-- 
2.35.1




[PATCH 3/4] DEV: coccinelle: Add a new pattern to ist.cocci

2022-03-15 Thread Tim Duesterhus
This was previously ignored in "DEV: coccinelle: Fix incorrect replacement in 
ist.cocci",
but is now properly replaced by a simple `ist()` call.
---
 dev/coccinelle/ist.cocci | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/dev/coccinelle/ist.cocci b/dev/coccinelle/ist.cocci
index ea13d39d2..acde626b0 100644
--- a/dev/coccinelle/ist.cocci
+++ b/dev/coccinelle/ist.cocci
@@ -4,8 +4,9 @@ expression p, l;
 @@
 
 (
- i.ptr = p;
- i.len = strlen(i.ptr);
+- i.ptr = p;
+- i.len = strlen(i.ptr);
++ i = ist(p);
 |
 - i.ptr = p;
 - i.len = l;
-- 
2.35.1




[PATCH 4/4] CLEANUP: Reapply ist.cocci

2022-03-15 Thread Tim Duesterhus
This makes use of the newly added:

- i.ptr = p;
- i.len = strlen(i.ptr);
+ i = ist(p);

patch.
---
 src/http_act.c | 15 +--
 1 file changed, 5 insertions(+), 10 deletions(-)

diff --git a/src/http_act.c b/src/http_act.c
index b7ec31241..133a30c6a 100644
--- a/src/http_act.c
+++ b/src/http_act.c
@@ -697,8 +697,7 @@ static enum act_parse_ret parse_http_set_status(const char 
**args, int *orig_arg
if (*args[*orig_arg] && strcmp(args[*orig_arg], "reason") == 0 &&
(*args[*orig_arg + 1] && strcmp(args[*orig_arg + 1], "if") != 0 && 
strcmp(args[*orig_arg + 1], "unless") != 0)) {
(*orig_arg)++;
-   rule->arg.http.str.ptr = strdup(args[*orig_arg]);
-   rule->arg.http.str.len = strlen(rule->arg.http.str.ptr);
+   rule->arg.http.str = ist(strdup(args[*orig_arg]));
(*orig_arg)++;
}
 
@@ -1325,8 +1324,7 @@ static enum act_parse_ret parse_http_auth(const char 
**args, int *orig_arg, stru
memprintf(err, "missing realm value.\n");
return ACT_RET_PRS_ERR;
}
-   rule->arg.http.str.ptr = strdup(args[cur_arg]);
-   rule->arg.http.str.len = strlen(rule->arg.http.str.ptr);
+   rule->arg.http.str = ist(strdup(args[cur_arg]));
cur_arg++;
}
 
@@ -1508,8 +1506,7 @@ static enum act_parse_ret parse_http_set_header(const 
char **args, int *orig_arg
}
 
 
-   rule->arg.http.str.ptr = strdup(args[cur_arg]);
-   rule->arg.http.str.len = strlen(rule->arg.http.str.ptr);
+   rule->arg.http.str = ist(strdup(args[cur_arg]));
LIST_INIT(>arg.http.fmt);
 
if (rule->from == ACT_F_HTTP_REQ) {
@@ -1617,8 +1614,7 @@ static enum act_parse_ret parse_http_replace_header(const 
char **args, int *orig
return ACT_RET_PRS_ERR;
}
 
-   rule->arg.http.str.ptr = strdup(args[cur_arg]);
-   rule->arg.http.str.len = strlen(rule->arg.http.str.ptr);
+   rule->arg.http.str = ist(strdup(args[cur_arg]));
LIST_INIT(>arg.http.fmt);
 
cur_arg++;
@@ -1721,8 +1717,7 @@ static enum act_parse_ret parse_http_del_header(const 
char **args, int *orig_arg
return ACT_RET_PRS_ERR;
}
 
-   rule->arg.http.str.ptr = strdup(args[cur_arg]);
-   rule->arg.http.str.len = strlen(rule->arg.http.str.ptr);
+   rule->arg.http.str = ist(strdup(args[cur_arg]));
px->conf.args.ctx = (rule->from == ACT_F_HTTP_REQ ? ARGC_HRQ : 
ARGC_HRS);
 
LIST_INIT(>arg.http.fmt);
-- 
2.35.1




[PATCH 1/4] DEV: coccinelle: Fix incorrect replacement in ist.cocci

2022-03-15 Thread Tim Duesterhus
We must not use `ist2()` if the value of `i.len` is derived from the value of
`i.ptr`:

i.ptr = "foo";
i.len = strlen(i.ptr);
---
 dev/coccinelle/ist.cocci | 5 +
 1 file changed, 5 insertions(+)

diff --git a/dev/coccinelle/ist.cocci b/dev/coccinelle/ist.cocci
index 4945141b2..ea13d39d2 100644
--- a/dev/coccinelle/ist.cocci
+++ b/dev/coccinelle/ist.cocci
@@ -3,9 +3,14 @@ struct ist i;
 expression p, l;
 @@
 
+(
+ i.ptr = p;
+ i.len = strlen(i.ptr);
+|
 - i.ptr = p;
 - i.len = l;
 + i = ist2(p, l);
+)
 
 @@
 @@
-- 
2.35.1




RE: HashiCorp Software Users - Across the Nation

2022-03-15 Thread Melissa Taylor


Hi,
Did you get a chance to review my email? Please let me know if you require any 
further information to take this forward/make a progress here.
I look forward to hear back from you soon.
Regards,
Melissa Taylor

From: Melissa Taylor
Sent: Thursday, March 3, 2022 5:33 AM
To: haproxy@formilux.org
Subject: HashiCorp Software Users - Across the Nation



Good Morning,

Are you looking for unlimited usage of valid and verified email List of 
"HashiCorp Software Users" for marketing?

If interested drop me a line and I will send across all details including 
counts and cost.

If yes, please respond with your requirement

I look forward to hearing from you.

Regards,
Melissa Taylor
Business List Executive



Re: Rpm version 2.4.14

2022-03-15 Thread Aleksandar Lazic



On 15.03.22 05:36, Eli Bechavod wrote:

Hii guys,
I am looking for rpm to version 2.4.14 and didn’t found that ..

Why on image base centos/rhel did you stop in 1.8 ? I saw that I can install 
with a makefile but it old way .. :( .

I would to sound if you have any solutions


You can create a rpm based on that repo.
https://github.com/DBezemer/rpm-haproxy


Thanks
Eli


Regards
Alex



Re: [PATCH 0/6] 'ist'ify members of struct proxy

2022-03-15 Thread Willy Tarreau
Hi Tim,

On Fri, Mar 11, 2022 at 09:15:48PM +0100, Tim Düsterhus wrote:
> Yeah, I've attempted to look into the Coccinelle patches in the Linux kernel
> sources, but I agree that many of those are very complex :-)
> 
> Do you happen to know where we could ask for assistance with making the
> necessary adjustments to the patches?

Not really. I'm seeing that the doc on the site was updated less than a
year ago, I should probably re-read it (I had only seen a very old one
with a bunch of examples and too few tips):

 https://coccinelle.gitlabpages.inria.fr/website/

There's also a mailing list (cocci at inria.fr) which is quite active,
but it looks like Julia is very responsive on it and I don't want to
bother her with end-user questions when she likely has more important
things to spend her time on.

> Or perhaps you could ask and include
> me in Cc, at least people already know you. I'll be happy to further improve
> the existing Coccinelle patches and to further 'ist'ify the codebase, but
> would need some handholding to get me started.

Note that beyond changing code, one thing that would be extremely useful
would be to build up a collection of patches to detect certain classes of
bugs. I wrote some scripts that used to match improbable expressions like:

unlikely(E) < 0

But I can't figure how to make them match anymore, or they match too much
thus for me the behavior has always been a bit random and I never know if
I can trust the absence of a match.

Overall this is still a fantastic tool but it requires a significant and
sustained investment to really unleash its power. Unfortunately in a small
project like haproxy most often it takes less time to perform a few changes
by hand than to try to figure a reliable way to express what we want.

Willy