May & June 2022 Fundraising Workshop Dates Now Released
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
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
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`
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
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
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
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
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
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
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
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