Load Testing
Load testing is a crucial part in the final testing phase of a software product and should be done for every application where a large number of concurrent users is expected. Since there are plenty of tools available for this purpose, the main objective remains the same. It is important to recreate realistic user paths and scenarios in order to obtain meaningful results for bottleneck analysis. Most of the time it is not easy to find the layer which has the highest impact on performance since there are many components involved like network, database, application server and so forth. Therefore it requires close collaboration between software testers and developers for the sake of identifying and resolving bottlenecks in the backend and infrastructure.
We used JMeter
Apache JMeter is an open source tool which provides all necessary functionalities in order to perform a meaningful load test. Sometimes a realistic scenario means that more than 1000 concurrent users will use your application in a live situation. Therefore it is possible to run a distributed load test where multiple machines are sending simultaneous requests to a target server.
You can find more information about distributed load testing with JMeter here:
Load Test in a real project situation
On a recent project, we analysed various user paths and scenarios to identify the critical ones. As a result, we shifted our focus to two different endpoints, where we expected the highest amount of requests in a short period. Our goal was to achieve reasonable response times under constant heavy load and therefore aligned our performance goals with APDEX (Application Performance Index), which calculates the ratio between users who are above and below a certain threshold. In our project the “toleration threshold” was set to 500 ms, which resulted in an APDEX value of 0.63. ( 1 = full user satisfaction, 0 = no user satisfaction).
You can find more information about APDEX here:
As a consequence, database queries were optimised and a caching solution was implemented in the backend in order to come close to our desired performance goal. Eventually we reached an APDEX value of 0.75, which is much better but still leaves room for improvement.
Lessons learned
Once we had started multiple virtual machines to run a distributed load test, we quickly noticed that JMeter consumes a lot of machine resources to allocate 1000 users. Therefore we had to start more VM´s than planned, in order to achieve the desired number of users, which results in unexpected expenses. We tried to optimise the setup by starting load tests only in non GUI mode without any noticeable effect. JMeter is a great tool for recreating complex user paths with a lot of useful tools to create statistic reports and graphs, but for the purpose of simple measurement of response times we will do some further research to find other solutions.
One possibility is to perform HTTP benchmarking , in case there is no necessity to create dedicated user paths or scenarios which makes sense if you want to get a first impression of your endpoint´s performance.
Example of HTTP benchmarking with Apache Bench
The following example shows the report that apache bench will print into the console after firing 1000 requests with 10 virtual users to an endpoint:
ab -n 1000 -c 10 https://localhost/api/loadtest?query=test
[1] 39896
Michaels-MacBook-Pro:bin michael$ This is ApacheBench, Version 2.3 <$Revision: 1826891 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking localhost (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests
Server Software:
Server Hostname: https://localhost
Server Port: 443
SSL/TLS Protocol: TLSv1.2,ECDHE-RSA-AES256-GCM-SHA384,2048,256
TLS Server Name: https://localhost
Document Path: /api/loadtest?query=test
Document Length: 4994 bytes
Concurrency Level: 10
Time taken for tests: 19.418 seconds
Complete requests: 1000
Failed requests: 0
Total transferred: 5306000 bytes
HTML transferred: 4994000 bytes
Requests per second: 51.50 [#/sec] (mean)
Time per request: 194.177 [ms] (mean)
Time per request: 19.418 [ms] (mean, across all concurrent requests)
Transfer rate: 266.85 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 88 128 20.1 125 391
Processing: 38 63 27.7 57 383
Waiting: 35 58 27.4 52 376
Total: 137 190 37.2 182 499
Percentage of the requests served within a certain time (ms)
50% 182
66% 190
75% 196
80% 202
90% 221
95% 246
98% 317
99% 368
100% 499 (longest request)


Degree sequences#
The present module implements the DegreeSequences
class, whose instances
represent the integer sequences of length \(n\):
sage: DegreeSequences(6)
Degree sequences on 6 elements
With the object DegreeSequences(n)
, one can:
Check whether a sequence is indeed a degree sequence:
sage: DS = DegreeSequences(5) sage: [4, 3, 3, 3, 3] in DS True sage: [4, 4, 0, 0, 0] in DS False
List all the possible degree sequences of length \(n\):
sage: for seq in DegreeSequences(4): ....: print(seq) [0, 0, 0, 0] [1, 1, 0, 0] [2, 1, 1, 0] [3, 1, 1, 1] [1, 1, 1, 1] [2, 2, 1, 1] [2, 2, 2, 0] [3, 2, 2, 1] [2, 2, 2, 2] [3, 3, 2, 2] [3, 3, 3, 3]
Note
Given a degree sequence, one can obtain a graph realizing it by using
DegreeSequence()
.
For instance:
sage: ds = [3, 3, 2, 2, 2, 2, 2, 1, 1, 0]
sage: g = graphs.DegreeSequence(ds)
sage: g.degree_sequence()
[3, 3, 2, 2, 2, 2, 2, 1, 1, 0]
Definitions#
A sequence of integers \(d_1,...,d_n\) is said to be a degree sequence (or graphic sequence) if there exists a graph in which vertex \(i\) is of degree \(d_i\). It is often required to be non-increasing, i.e. that \(d_1 \geq ... \geq d_n\). Finding a graph with given degree sequence is known as graph realization problem.
An integer sequence need not necessarily be a degree sequence. Indeed, in a degree sequence of length \(n\) no integer can be larger than \(n-1\) – the degree of a vertex is at most \(n-1\) – and the sum of them is at most \(n(n-1)\).
Degree sequences are completely characterized by a result from Erdos and Gallai:
Erdos and Gallai: The sequence of integers \(d_1 \geq \cdots \geq d_n\) is a degree sequence if and only if \(\sum_i d_i\) is even and \(\forall i\)
Alternatively, a degree sequence can be defined recursively:
Havel and Hakimi: The sequence of integers \(d_1\geq ... \geq d_n\) is a degree sequence if and only if \(d_2-1,...,d_{d_1+1}-1, d_{d_1+2}, ...,d_n\) is also a degree sequence.
Or equivalently:
Havel and Hakimi (bis): If there is a realization of an integer sequence as a graph (i.e. if the sequence is a degree sequence), then it can be realized in such a way that the vertex of maximum degree \(\Delta\) is adjacent to the \(\Delta\) vertices of highest degree (except itself, of course).
Algorithms#
Checking whether a given sequence is a degree sequence
This is tested using Erdos and Gallai’s criterion. It is also checked that the given sequence is non-increasing and has length \(n\).
Iterating through the sequences of length \(n\)
From Havel and Hakimi’s recursive definition of a degree sequence, one can build an enumeration algorithm as done in [RCES1994]. It consists in trying to extend a current degree sequence on \(n\) elements into a degree sequence on \(n+1\) elements by adding a vertex of degree larger than those already present in the sequence. This can be seen as reversing the reduction operation described in Havel and Hakimi’s characterization. This operation can appear in several different ways:
Extensions of a degree sequence that do not change the value of the maximum element
If the maximum element of a given degree sequence is \(0\), then one can remove it to reduce the sequence, following Havel and Hakimi’s rule. Conversely, if the maximum element of the (current) sequence is \(0\), then one can always extend it by adding a new element of degree \(0\) to the sequence.
\[0, 0, 0 \xrightarrow{Extension} {\bf 0}, 0, 0, 0 \xrightarrow{Extension} {\bf 0}, 0, 0, ..., 0, 0, 0 \xrightarrow{Reduction} 0, 0, 0, 0 \xrightarrow{Reduction} 0, 0, 0\]If there are at least \(\Delta+1\) elements of (maximum) degree \(\Delta\) in a given degree sequence, then one can reduce it by removing a vertex of degree \(\Delta\) and decreasing the values of \(\Delta\) elements of value \(\Delta\) to \(\Delta-1\). Conversely, if the maximum element of the (current) sequence is \(d>0\), then one can add a new element of degree \(d\) to the sequence if it can be linked to \(d\) elements of (current) degree \(d-1\). Those \(d\) vertices of degree \(d-1\) hence become vertices of degree \(d\), and so \(d\) elements of degree \(d-1\) are removed from the sequence while \(d+1\) elements of degree \(d\) are added to it.
\[3, 2, 2, 2, 1 \xrightarrow{Extension} {\bf 3}, 3, (2+1), (2+1), (2+1), 1 = {\bf 3}, 3, 3, 3, 3, 1 \xrightarrow{Reduction} 3, 2, 2, 2, 1\]
Extension of a degree sequence that changes the value of the maximum element:
In the general case, i.e. when the number of elements of value \(\Delta,\Delta-1\) is small compared to \(\Delta\) (i.e. the maximum element of a given degree sequence), reducing a sequence strictly decreases the value of the maximum element. According to Havel and Hakimi’s characterization there is only one way to reduce a sequence, but reversing this operation is more complicated than in the previous cases. Indeed, the following extensions are perfectly valid according to the reduction rule.
\[\begin{split}2,1,1,0,0\xrightarrow{Extension} {\bf 3}, (2+1), (1+1), (1+1), 0, 0 = 3, 3, 2, 2, 0, 0 \xrightarrow{Reduction} 2, 1, 1, 0, 0\\ 2,1,1,0,0\xrightarrow{Extension} {\bf 3}, (2+1), (1+1), 1, (0+1), 0 = 3, 3, 2, 1, 1, 0 \xrightarrow{Reduction} 2, 1, 1, 0, 0\\ 2,1,1,0,0\xrightarrow{Extension} {\bf 3}, (2+1), 1, 1, (0+1), (0+1) = 3, 3, 1, 1, 1, 1 \xrightarrow{Reduction} 2, 1, 1, 0, 0\\ ...\end{split}\]In order to extend a current degree sequence while strictly increasing its maximum degree, it is equivalent to pick a set \(I\) of elements of the degree sequence with \(|I|>\Delta\) in such a way that the \((d_i+1)_{i\in I}\) are the \(|I|\) maximum elements of the sequence \((d_i+\genfrac{}{}{0pt}{}{1\text{ if }i\in I}{0\text{ if }i\not \in I})_{1\leq i \leq n}\), and to add to this new sequence an element of value \(|I|\). The non-increasing sequence containing the elements \(|I|\) and \((d_i+\genfrac{}{}{0pt}{}{1\text{ if }i\in I}{0\text{ if }i\not \in I})_{1\leq i \leq n}\) can be reduced to \((d_i)_{1\leq i \leq n}\) by Havel and Hakimi’s rule.
\[... 1, 1, 2, {\bf 2}, {\bf 2}, 2, 2, 3, 3, \underline{3}, {\bf 3}, {\bf 3}, {\bf 4}, {\bf 6}, ... \xrightarrow{Extension} ... 1, 1, 2, 2, 2, 3, 3, \underline{3}, {\bf 3}, {\bf 3}, {\bf 4}, {\bf 4}, {\bf 5}, {\bf 7}, ...\]The number of possible sets \(I\) having this property (i.e. the number of possible extensions of a sequence) is smaller than it seems. Indeed, by definition, if \(j\not \in I\) then for all \(i\in I\) the inequality \(d_j\leq d_i+1\) holds. Hence, each set \(I\) is entirely determined by the largest element \(d_k\) of the sequence that it does not contain (hence \(I\) contains \(\{1,...,k-1\}\)), and by the cardinalities of \(\{i\in I:d_i= d_k\}\) and \(\{i\in I:d_i= d_k-1\}\).
\[I = \{i \in I : d_i= d_k \} \cup \{i \in I : d_i= d_k-1 \} \cup \{i : d_i> d_k \}.\]The number of possible extensions is hence at most cubic, and is easily enumerated.
About the implementation#
In the actual implementation of the enumeration algorithm, the degree sequence is stored differently for reasons of efficiency.
Indeed, when enumerating all the degree sequences of length \(n\), Sage first
allocates an array seq
of \(n+1\) integers where seq[i]
is the number of
elements of value i
in the current sequence. Obviously, seq[n]=0
holds
in permanence : it is useful to allocate a larger array than necessary to
simplify the code. The seq
array is a global variable.
The recursive function enum(depth, maximum)
is the one building the list of
sequences. It builds the list of degree sequences of length \(n\) which extend
the sequence currently stored in seq[0]...seq[depth-1]
. When it is called,
maximum
must be set to the maximum value of an element in the partial
sequence seq[0]...seq[depth-1]
.
If during its run the function enum
heavily works on the content of
the seq
array, the value of seq
is the same before and after
the run of enum
.
Extending the current partial sequence
The two cases for which the maximum degree of the partial sequence does not
change are easy to detect. It is (slightly) harder to enumerate all the sets
\(I\) corresponding to possible extensions of the partial sequence. As said
previously, to each set \(I\) one can associate an integer current_box
such
that \(I\) contains all the \(i\) satisfying \(d_i>current\_box\). The variable
taken
represents the number of all such elements \(i\), so that when
enumerating all possible sets \(I\) in the algorithm we have the equality
REFERENCES:
AUTHORS:
Nathann Cohen
Warning
For the moment, iterating over all degree sequences involves building the list of them first, then iterate on this list. This is obviously bad, as it requires uselessly a lot of memory for large values of \(n\).
This should be changed. Updating the code does not require more than a couple of minutes.
- class sage.combinat.degree_sequences.DegreeSequences(n)#
Bases:
object
Degree Sequences
An instance of this class represents the degree sequences of graphs on a given number \(n\) of vertices. It can be used to list and count them, as well as to test whether a sequence is a degree sequence. For more information, please refer to the documentation of the
DegreeSequence
module.EXAMPLES:
sage: DegreeSequences(8) Degree sequences on 8 elements sage: [3,3,2,2,2,2,2,2] in DegreeSequences(8) True


|
| void | sCreate_CompCol_Matrix (SuperMatrix *A, int m, int n, int nnz, float *nzval, int *rowind, int *colptr, Stype_t stype, Dtype_t dtype, Mtype_t mtype) |
| | Supernodal LU factor related. More...
|
| |
| void | sCreate_CompRow_Matrix (SuperMatrix *A, int m, int n, int nnz, float *nzval, int *colind, int *rowptr, Stype_t stype, Dtype_t dtype, Mtype_t mtype) |
| |
| void | sCopy_CompCol_Matrix (SuperMatrix *A, SuperMatrix *B) |
| | Copy matrix A into matrix B. More...
|
| |
| void | sCreate_Dense_Matrix (SuperMatrix *X, int m, int n, float *x, int ldx, Stype_t stype, Dtype_t dtype, Mtype_t mtype) |
| |
| void | sCopy_Dense_Matrix (int M, int N, float *X, int ldx, float *Y, int ldy) |
| |
| void | sCreate_SuperNode_Matrix (SuperMatrix *L, int m, int n, int nnz, float *nzval, int *nzval_colptr, int *rowind, int *rowind_colptr, int *col_to_sup, int *sup_to_col, Stype_t stype, Dtype_t dtype, Mtype_t mtype) |
| |
| void | sCompRow_to_CompCol (int m, int n, int nnz, float *a, int *colind, int *rowptr, float **at, int **rowind, int **colptr) |
| | Convert a row compressed storage into a column compressed storage. More...
|
| |
| void | sPrint_CompCol_Matrix (char *what, SuperMatrix *A) |
| | Routines for debugging. More...
|
| |
| void | sPrint_SuperNode_Matrix (char *what, SuperMatrix *A) |
| |
| void | sPrint_Dense_Matrix (char *what, SuperMatrix *A) |
| |
| void | sprint_lu_col (char *msg, int jcol, int pivrow, int *xprune, GlobalLU_t *Glu) |
| | Diagnostic print of column "jcol" in the U/L factor. More...
|
| |
| void | scheck_tempv (int n, float *tempv) |
| | Check whether tempv[] == 0. This should be true before and after calling any numeric routines, i.e., "panel_bmod" and "column_bmod". More...
|
| |
| void | sGenXtrue (int n, int nrhs, float *x, int ldx) |
| |
| void | sFillRHS (trans_t trans, int nrhs, float *x, int ldx, SuperMatrix *A, SuperMatrix *B) |
| | Let rhs[i] = sum of i-th row of A, so the solution vector is all 1's. More...
|
| |
| void | sfill (float *a, int alen, float dval) |
| | Fills a float precision array with a given value. More...
|
| |
| void | sinf_norm_error (int nrhs, SuperMatrix *X, float *xtrue) |
| | Check the inf-norm of the error vector. More...
|
| |
| void | sPrintPerf (SuperMatrix *L, SuperMatrix *U, mem_usage_t *mem_usage, float rpg, float rcond, float *ferr, float *berr, char *equed, SuperLUStat_t *stat) |
| | Print performance of the code. More...
|
| |
| | print_float_vec (char *what, int n, float *vec) |
| |
Copyright (c) 2003, The Regents of the University of California, through Lawrence Berkeley National Laboratory (subject to receipt of any required approvals from U.S. Dept. of Energy)
All rights reserved.
The source code is distributed under BSD license, see the file License.txt at the top-level directory.
– SuperLU routine (version 3.1) –
Univ. of California Berkeley, Xerox Palo Alto Research Center,
and Lawrence Berkeley National Lab.
August 1, 2008
Copyright (c) 1994 by Xerox Corporation. All rights reserved.
THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY
EXPRESSED OR IMPLIED.
Permission is hereby granted to use or copy this program for any
purpose, provided the above notices are retained on all copies.
Permission to modify the code and to distribute modified code is
granted, provided the above notices are retained, and a notice that
the code was modified is included with the above copyright notice.


In High School I had a friend who had been reading Carlos Castaneda. Carlos wrote about the Yaqui shaman Don Juan Matus, who would access the spirit world by ingesting peyote, datura, etc... So he, inspired by Don Juan, went on one of his expeditions to find herbs and came back with a tupperware full of the spiny pods. It would be an huge understatement to say that we were unprepared for the extent of the experience.
I ate a heaping tablespoon of fresh, mature seeds. Lucy and Pollo had eaten similar amount.
90% of this was told to me by my best friend, Doogie, who witnessed my discent into madness.
Basically, what I remember, is eating the seeds around midnight, with Lucy and Pollo. It was kind of like being really drunk...except for the TOTAL lack of equilibrium, serious dryness and soreness of the mouth and throat, and some lucid hallucinations. It didn't feel enjoyable...just uncomfotable really.
I kept smoking ciggarettes that would dissapear and I talked to a friend of mine from day camp who I hadn't seen in maybe 7 years, before he dissapeared, and I realized he wasn't ever there to begin with. I vaguely remembered finding my upstairs toilet had been puked on(not in), with a dollar floating on top. I also vaguely remember cleaning it up, washing the dollar bill off and hanging it to dry. I really wasn't sure if this had happened and when I went to check it the dollar was gone and the toilet was a little too clean. Later Lucy said she vaguely remembered puking in my bathroom, but we're still not sure if it was real or not. The dollar is still missing.
Pollo, Lucy and I all got extremely fatigued and sleepy and we all went to bed.
I had a dream where I kept walking into the wall.
I was woken up the next morning by the phone ringing. Lucy and Pollo were gone. I picked up the phone.
Doogie: Tim? Tim? Are you okay?
Me: Uhm... fine. What's wrong?
Doogie: What is my name? Tell me my name!

Doogie: I'm Not! What do you remember from last night.
Me: I'm not listening to this....
Doogie: Just do me a favor and look on top of the fridge.
Me: Haha. You put my dogs food dish on top of the fridge. Good One! cockhead.

Me: Whatever, goodbye.
Doogie: I'm coming over.
I go upstairs, where my mom's house is in total disarray. I find the wall mounted phone hanging off the hook, the front door standing wide open, the table in the entryway over turned, a broken vase on the floor....and, it was Halloween, so we had this dish of candy corn....someone went through maybe 75 pieces of candy corn and bit off only the orange half. I start freaking out.
I had really thought that Doogie was just joshing me... but he never took jokes that far. So Dave comes over and helped me clean up. I found all of the pieces of the vase, broken where they lay, except for a very large section that was hidden behind the curtain on the other side of the room. Strange.
After we had cleaned things up Doogie proceeded to tell me what had happened.
He had come back over to my house maybe an hour after I had gone to bed. Apparently he found me, wearing only my boxers, frantically trying to locate something in my kitchen. Things had not been broken yet. He said my name, but I paid no attention, only continued to open and slam drawers and cabinets.
'TIM!' He shouted.
I turned around, looking at him with annoyance. 'What!?'
'What are you doing?'
'I'm looking for my Windows 95 disk.' I said this with a expression and tone of voice of someone who had just been asked what his penis was for.
I rolled my eyes and walked off toward my dinner table, stopping for a moment to hock a loogie on the wall. Doogie is very confused.
 I said, looking at the table.
'I'm not,' said Doogie.
'Not You! The candlesticks!' I said this in the same 'must I always restate the obvious' tone.
'Tim!
I try to remember
'Ummmm...John'
'No.'
'Ummmm...Jake?'
'NO! You don't even know anybody named Jake.'
'Ummmm...'
'I'm Doogie!! What the fuck!!'
'Oh yeah....Doogie.'
I spit another substantial hocker on the wallpaper.
'Tim! This is your house. Have some respect, STOP SPITTING ON THE WALLS!'
'Okay.'
I spit on the floor.
'What the fuck, Tim?'
'Hey, at least I didn't spit on the wall.'
I grab a spoon off the table and seem to be trying to smoke it. I make as if I'm lighting it with an invisible lighter and take a deep breath.
'eer.' I offer David the spoon.
'No thanks.' He takes the spoon away from me.
I walked away and grabbed my dogs food bowl and went downstairs; down to my fridge where I carefully place the dish on top.
'She doesn't need it, and I don't like her anyway,' I said, either anticipating his question or maybe just talking to myself.
I open my fridge and begin digging into the pockets of my boxers...except they didn't have pockets.
'I'm so thirsty. I don't think I have any change,' I look at Doogie.
'You don't need change, this is your house. That's your pop!'
'Okay....do you have fifty cents?'
'Sure.'
He reaches in and pulls out a Brisk Iced Tea and opens it for me. I take a single sip, set it down, pull out a fresh can, open it, take a single sip, set it down, reach for another....Doogie stops me.
'You've lost your mind, you realize...,' says Doogie.
I cackle maniacally and spit on the fridge.
I walk toward my bedroom, missing the doorway and walking squarly into the wall. David helps me. Apparently Pollo and Lucy had already left.
'Where did Lucy go, Tim?'
'She went to see the shadow people.'
Not long after this, I think, Doogie managed to get me into bed and go to sleep, then he went home. It was a school night. I'm not sure if I got back up and did those things upstairs or if Pollo and Lucy came back and did them. I guess I'll never know for certain. Lucy woke up in her bed, legs and feet muddy and scraped, with no recollection of how she got there. Pollo woke up at home too. These people didn't drive and they didn't live close to me either. Odd.
I'm probably forgetting parts... I've heard Doogie tell this story so many times, but I'm pretty sure I did other stuff too. The story gained somthing of legendary status at my highschool.
Highlights from some of my other friends stories:
-Josippi ate some, put on Working Man's Dead, and proceded to talk to Jerry Garcia all night long via his radio.
-Schloppy, sitting shotgun in a moving car, saw a dark man with a tommy gun sitting in the back seat. He bailed from the car.
-June Bug ate some before his family dinner. He was in my frend O'Dells basement smoking a bong. When he passed it, the basement and all the other people dissapeared and he was sitting at his dining room table, arm outstreched, while his family stared at him. He had to excuse himself from the table to lock himself in his bedroom.

Not recomended...unless you're a shaman
Experience Reports are the writings and opinions of the individual authors who submit them.
Some of the activities described are dangerous and/or illegal and none are recommended by Erowid.


Hit the signup button up top, fill out the info, and then you can click through the header options and see what i've done.
Love,
James
Show a list of courses that are available, and show whether each course is available to student based on permissions set by faculty.
Get information about courses, events, and opportunities.
Add courses, and add students to courses that they are authorized to take.
Submit a project proposal so that faculty can make a volunteer event for students to participate in.
- add permissions for each user type (organization, faculty member, student, administrator).
- integrate volunteer solutions object schema.
- add conditional fields for proposal form.
- add admin dashboard for agencies/organizations.


"ACCHO "sultry or sandy, a town and harbour of Phoenicia, in the tribe of Asher, but never acquired by them (Judges 1:31). It was known to the ancient Greeks and Romans by the name of Ptolemais, from Ptolemy the king of Egypt, who rebuilt it about B.C. 100. Here Paul landed on his last journey to Jerusalem (Acts 21:7). During the crusades of the Middle Ages it was called Acra; and subsequently, on account of its being occupied by the Knights Hospitallers of Jerusalem, it was called St. Jean d’Acre, or simply Acre.
"ACCHO "sultry or sandy, a town and harbour of Phoenicia, in the tribe of Asher, but never acquired by them (Judges 1:31). It was known to the ancient Greeks and Romans by the name of Ptolemais, from Ptolemy the king of Egypt, who rebuilt it about B.C. 100. Here Paul landed on his last journey to Jerusalem (Acts 21:7). During the crusades of the Middle Ages it was called Acra; and subsequently, on account of its being occupied by the Knights Hospitallers of Jerusalem, it was called St. Jean d’Acre, or simply Acre.


@(message: String) @main("Welcome to Play") {
Come and enjoy sharing and creating a better community to live in!!


Spanish Tortilla
- ⏲ Prep time: 5 min
- 🍳 Cook time: 35 min
- 🍽 Servings: 6
Ingredients
- 8 free-range eggs
- 1 kg of potatoes
- 1 white onion
- Extra virgin olive oil
Directions
- Peel, rinse and dry the potatoes.
- Cut the potatoes into thin slices. Put in a bowl, add salt to taste and stir.
- Put a nonstick frying pan on the fire and add enough olive oil to fry all the potato slices.
- Add the potato slices already salted and let them cook for approximately 20 minutes over low heat.
- While the potatoes are frying, beat the eggs in a bowl. Peel and cut the onion as finely as possible.
- Add olive oil in another frying pan and slowly fry the onion until it gets a slightly golden color.
- Drain the onion and add it to the bowl with the beaten egg.
- Remove the potatoes from the pan with a slotted spoon, draining the oil away as much as possible, and add them to the bowl with the onion and egg.
- Let the mixture rest for at least 5 minutes so all the flavors come together. Give it a very gentle stir from time to time.
- Remove the oil from the pan you used to fry the potatoes. Use the pan to cook the mixture over medium-high fire for about 5 minutes.
- Flip it over with the help of a big plate and cook the other side for another 5 minutes.
Notes
- Things like the slicing of the potato, the amount of salt and how curdled is the inner part of the tortilla depend on your own taste. Don’t be afraid to experiment!
Contribution
OctopusOnFire - Minds
Recipe tags:
spanish
potato
eggs
tortilla


Loading pretrained models¶
LBNLP provides easy access to many ready-to-use models for NLP tasks such as:
- Named entity recognition for inorganic materials (via LSTM)
- Relevance classification for materials science-related texts (via Logistic Regression)
- Suggestions for scientific journals (via Doc2Vec)
- Word2Vec embeddings for various materials-related entities
- And more!
View available models¶
View what models are currently available with print_models_info
from lbnlp.models.rolodex import print_models_info
print_models_info()
Related models and tools are packaged together in "model packages".
Model Package: 'matscholar_2020v1'
* 'ner': Named entity recognition for materials.
- More info: https://doi.org/10.1021/acs.jcim.9b00470
* 'relevance': Relevance classification with logistic regression for materials science abstracts.
- More info: None
Here, we see there are two models packaged together in the matscholar_2020v1
package. The names of the model package and the models are what we will use to load them in the following code.
Load a pretrained model (NER)¶
Model downloads and file management are done automatically. You only need to call a single load
function from the model package module
in order to load and deploy the model locally.
# Import the load function from the model package
from lbnlp.models.load.matscholar_2020v1 import load
ner_model = load("ner")
If you get a ModelReqirementError
, we recommend installing the package (with specific version) listed in the error. This is to avoid silent errors and annoying errors, as our models were generated with specific dependencies.
Our NER model is now loaded. Let's see what it can do!
doc = "CoCrPt/CoCr/carbon films were sputter-deposited on CoTaZr soft-magnetic"
"underlayers and the effects of a carbon intermediate layer on magnetic and "
"recording properties were investigated"
tags = ner_model.tag_doc(doc)
print(tags)
The tokens in the doc are annotated:
[[('CoCrPt', 'B-MAT'), ('/', 'O'), ('CoCr', 'B-MAT'), ('/', 'O'), ('carbon', 'B-MAT'),
('films', 'B-DSC'), ('were', 'O'), ('sputter', 'B-SMT'), ('-', 'I-SMT'),
('deposited', 'I-SMT'), ('on', 'O'), ('CoTaZr', 'B-MAT'), ('soft', 'B-PRO'),
('-', 'I-PRO'), ('magnetic', 'I-PRO'), ('underlayers', 'I-PRO'), ('and', 'O'),
('the', 'O'), ('effects', 'O'), ('of', 'O'), ('a', 'O'), ('carbon', 'B-MAT'),
('intermediate', 'O'), ('layer', 'B-DSC'), ('on', 'O'), ('magnetic', 'B-PRO'),
('and', 'O'), ('recording', 'B-PRO'), ('properties', 'I-PRO'), ('were', 'O'),
('investigated', 'O')]]
Load a different model (Relevance Classification)¶
Load another model from the same model package by calling load
with it's name:
from lbnlp.models.load.matscholar_2020v1 import load
clf_model = load("relevance")
Let's see how it does in determining relevance for inorganic materials science:
not_relevant = "The polymer was used for an OLED. This can also be sued for a biosensor."
relevant = "The bandgap of ZnO is 33 eV"
relevant = clf_model.classify_many([not_relevant, relevant])
print(relevant)
It correctly classifies our sentences:
[0, 1]
Adding your own trained models to LBNLP¶
1. Store your data¶
Using whatever directory structure you want, store your model(s)' data in some loadable format.
2. Upload your data as a file¶
Zip that directory and upload it to a publicly accessible URL.
3. Make an modelpkg entry¶
Make an entry for a new model package in lbnlp/models/modelpkg_metadata.json
, including all needed requirements specific to your models, citations, and descriptions.
"my_model_package_2021v2": {
"url": "https://url.to.download/your/file",
"hash": "The SHA256 hash of your zip file",
"models": {
"my_first_model": {
"requirements": ["pip-accessible-requirement==1.0.0"],
"description": "Model 1, a good description",
"citation": null
},
"my_second_model": {
"requirements": ["sklearn==0.19.1"],
"description": "Model 2, an even better model!",
"citation": null
4. Add a data loader¶
Create a new module in lbnlp.models.load
with the same name you gave your package in the metadata.
This module is where you will put the functions to load your models.
Follow the example below to make full use of the helper functions and classes:
from lbnlp.models.fetch import ModelPkgLoader
from lbnlp.models.util import model_loader_setup
# Provides an easy way to access file paths and metadata for your package
pkg = ModelPkgLoader("my_model_package_2021v2")
# Load is the required name for the loading function.
# Keep this function signature the same as shown here
# model_loader_setup provides checking and validation in the background
@model_loader_setup(pkg)
def load(model_name, ignore_requirements=False):
# This is the root of the directory of the zip file you uploaded.
base_path = pkg.structured_path
# Your code for loading your model goes here
The model loader code should only access classes and methods in lbnlp or in the requirements. Make it easy for people to load and use your model!
That's it! Congrats on adding your model to LBNLP.


Server Push Example 01
Please run 'SimpleSSEPushTest.java' to start push notification.
Received messages


--- layout: default title: Alt - Flux - Managing your state description: A library for managing data within JavaScript applications. permalink: / ---
A true flux compliant library in a very small size.
Alt comes with support for building Isomorphic JavaScript applications right out of the box.
At any point in time you can take a snapshot of the entire application state and then reload it later. This opens the door for easier debugging, hot state reloading, and more.

Feel like ditching singletons, creating instances of each store, and passing them to your view? No problem.
Although optional, Alt is meant to work with ES2015 leveraging the new constructs and syntax for something powerful.


Lambda
Wraps arbitrary expressions as a Layer
object.
Inherits From: Layer
tf.compat.v1.keras.layers.Lambda
tf.compat.v2.keras.layers.Lambda
The Lambda
layer exists so that arbitrary TensorFlow functions
can be used when constructing Sequential
and Functional API
models. Lambda
layers are best suited for simple operations or
quick experimentation. For more advanced use cases, subclassing
keras.layers.Layer
is preferred. One reason for this is that
when saving a Model, Lambda
layers are saved by serializing the
Python bytecode, whereas subclassed Layers are saved via overriding
their get_config
method and are thus more portable. Models that rely
on subclassed Layers are also often easier to visualize and reason
about.
# add a x -> x^2 layer model.add(Lambda(lambda x: x ** 2))
# add a layer that returns the concatenation # of the positive part of the input and # the opposite of the negative part def antirectifier(x): x -= K.mean(x, axis=1, keepdims=True) x = K.l2_normalize(x, axis=1) pos = K.relu(x) neg = K.relu(-x) return K.concatenate([pos, neg], axis=1) model.add(Lambda(antirectifier))
Variables can be created within a Lambda
layer. Like with
other layers, these variables will be created only once and reused
if the Lambda
layer is called on new inputs. If creating more
than one variable in a given Lambda
instance, be sure to use
a different name for each variable. Note that calling sublayers
from within a Lambda
is not supported.
Example of variable creation:
def linear_transform(x): v1 = tf.Variable(1., name='multiplier') v2 = tf.Variable(0., name='bias') return x*v1 + v2 linear_layer = Lambda(linear_transform) model.add(linear_layer) model.add(keras.layers.Dense(10, activation='relu')) model.add(linear_layer) # Reuses existing Variables
Note that creating two instances of Lambda
using the same function
will not share Variables between the two instances. Each instance of
Lambda
will create and manage its own weights.
function
: The function to be evaluated. Takes input tensor as first
argument.output_shape
: Expected output shape from function. This argument can be
inferred if not explicitly provided. Can be a tuple or function. If a
tuple, it only specifies the first dimension onward;
sample dimension is assumed either the same as the input: output_shape =
(input_shape[0], ) + output_shape
or, the input is None
and
the sample dimension is also None
: output_shape = (None, ) +
output_shape
If a function, it specifies the entire shape as a function
of the
input shape: output_shape = f(input_shape)
mask
: Either None (indicating no masking) or a callable with the same
signature as the compute_mask
layer method, or a tensor that will be
returned as output mask regardless what the input is.arguments
: Optional dictionary of keyword arguments to be passed to the
function.
Input shape: Arbitrary. Use the keyword argument input_shape (tuple of
integers, does not include the samples axis) when using this layer as the
first layer in a model.
Output shape: Specified by output_shape
argument__init__
__init__( function, output_shape=None, mask=None, arguments=None, **kwargs )


And with the most recent episode, we can begin to understand why it’s called 91 Days…
I can’t wait for it to end but I also don’t want to


22 April 2016
Search Inside Yourself discusses compassionate leadership, and how it can effect the workplace and individuals. I find leaders that I can have a friendly relationship with, to be better at their job. Even the hard conversations can be had in a frank manner, because if the built in trust that has been established. Uncompassionate leadership makes it very difficult to accept feedback from a manager, because there is no trust involved. I have experienced both in my career.
I enjoyed the Tonglen meditation. It reminded me a lot of various Star Trek episodes which touch on Vulcan mind exercises, lol! Both use the concept of breathing light in and out, which seems to make me feel good.
The SCARF model (Status, Certainty, Autonomy, Relatedness, and Fairness) echoes several moments in my career to date. As for Phase 0 of bootcamp, I don’t think it has had the chance to reflect any bits of that model, because we haven’t been working that closely yet. Perhaps this will happen in the rest of the bootcamp, but hopefully not too much.


declass
R Package for History Lab Declassification Engine APIDeclassification Engine API is provided by Columbia University History Lab.
library(httr)
library(jsonlite)
library(rvest)
## Loading required package: xml2
declass_welcome()
## [1] "Welcome to the Declassification Engine REST API"
declass_collection()
## [1] "cpdoc" "clinton" "kissinger" "statedeptcables"
## [5] "frus" "ddrs" "cabinet" "pdb"
clinton
email collection ?
declass_collection_entity("clinton")
## [1] "countries" "persons" "classifications"
clinton
emails ?By default, the function declass_entity_data
shows 25 records per page and up to 10 pages, which means 250 records in total. However, you can customize it based on what you need. Here in clinton
collection, we see that there’s a total of 200 countries. We don’t need more.
clinton_countries <- declass_entity_data("clinton", "countries")
## [1] "http://api.declassification-engine.org/declass/v0.4/entity_info/?collection=clinton&entity=countries&page_size=25&page=1"
## [1] "http://api.declassification-engine.org/declass/v0.4/entity_info/?collection=clinton&entity=countries&page_size=25&page=2"
## [1] "http://api.declassification-engine.org/declass/v0.4/entity_info/?collection=clinton&entity=countries&page_size=25&page=3"
## [1] "http://api.declassification-engine.org/declass/v0.4/entity_info/?collection=clinton&entity=countries&page_size=25&page=4"
## [1] "http://api.declassification-engine.org/declass/v0.4/entity_info/?collection=clinton&entity=countries&page_size=25&page=5"
## [1] "http://api.declassification-engine.org/declass/v0.4/entity_info/?collection=clinton&entity=countries&page_size=25&page=6"
## [1] "http://api.declassification-engine.org/declass/v0.4/entity_info/?collection=clinton&entity=countries&page_size=25&page=7"
## [1] "http://api.declassification-engine.org/declass/v0.4/entity_info/?collection=clinton&entity=countries&page_size=25&page=8"
summary(clinton_countries)
## count id name
## Min. : 1.0 Length:200 Length:200
## 1st Qu.: 19.0 Class :character Class :character
## Median : 54.5 Mode :character Mode :character
## Mean : 288.4
## 3rd Qu.: 151.0
## Max. :22719.0
It looks like the dataset is highly skewed. We could only look at countries who are mentioned above the average count.
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
d <- clinton_countries %>%
knitr::kable(d)
| name | count |
|---|---|
| United States | 22719 |
| Libya | 1918 |
| Egypt | 1719 |
| Syria | 1608 |
| Israel | 1505 |
| Russia | 1396 |
| Iran | 1345 |
| China | 1327 |
| Pakistan | 1294 |
| United Kingdom | 1245 |
| Haiti | 1209 |
| Iraq | 977 |
| France | 968 |
| Turkey | 945 |
| India | 642 |
| State of Palestine | 518 |
| Japan | 505 |
| Mexico | 456 |
| Seychelles | 445 |
| Italy | 430 |
| Tunisia | 425 |
| Yemen | 422 |
| Qatar | 383 |
| Honduras | 352 |
| Myanmar | 350 |
| Canada | 339 |
| Saudi Arabia | 328 |
| South Africa | 324 |
| Jordan | 320 |
| Cuba | 313 |
| Lebanon | 313 |
The country United States is what skewed the data. It’s not surprising to see in clinton’s email, as being the U.S. Secretary of State, she mentionted her own country the most. I will filter out the country United States, and see what other countries did Clinton mention the most in her emails.
d <- d %>%
library(ggplot2)
Here’s a small tutorial.
#install.packages("ggmap")
library(ggmap)
as.factor(d$name) %>% levels()
## [1] "Canada" "China" "Cuba"
## [4] "Egypt" "France" "Haiti"
## [7] "Honduras" "India" "Iran"
## [10] "Iraq" "Israel" "Italy"
## [13] "Japan" "Jordan" "Lebanon"
## [16] "Libya" "Mexico" "Myanmar"
## [19] "Pakistan" "Qatar" "Russia"
## [22] "Saudi Arabia" "Seychelles" "South Africa"
## [25] "State of Palestine" "Syria" "Tunisia"
## [28] "Turkey" "United Kingdom" "Yemen"
map_countries_joined <- map_countries_joined %>%
head(map_countries_joined)
## long lat group order region subregion count fill
## 1 -69.89912 12.45200 1 1 Aruba <NA> NA FALSE
## 2 -69.89571 12.42300 1 2 Aruba <NA> NA FALSE
## 3 -69.94219 12.43853 1 3 Aruba <NA> NA FALSE
## 4 -70.00415 12.50049 1 4 Aruba <NA> NA FALSE
## 5 -70.06612 12.54697 1 5 Aruba <NA> NA FALSE
## 6 -70.05088 12.59707 1 6 Aruba <NA> NA FALSE
ggplot() + geom_polygon(data = map_countries_joined, aes(x = long, y = lat, group = group, fill = fill)) +
subtitle = "Data Source: Columbia University History Lab") +
panel.grid = element_blank(),
axis.text = element_blank(),
axis.title = element_blank(),
axis.ticks = element_blank(),
legend.position = "none")


Service
public class Service
Service is a class implementing ReactiveX which wraps CoreBluetooth functions related to interaction with CBService
-
Intance of CoreBluetooth service class
Declaration
Swift
public let service: CBService
-
Peripheral to which this service belongs
Declaration
Swift
public let peripheral: Peripheral
-
True if service is primary service
Declaration
Swift
public var isPrimary: Bool
-
Service’s UUID
Declaration
Swift
public var uuid: CBUUID
-
Service’s included services
Declaration
Swift
public var includedServices: [Service]?
-
Service’s characteristics
Declaration
Swift
public var characteristics: [Characteristic]?
-
Function that triggers characteristics discovery for specified Services and identifiers. Discovery is called after subscribtion to
Observable
is made.Declaration
Swift
public func discoverCharacteristics(_ characteristicUUIDs: [CBUUID]?) -> Single<[Characteristic]>
Parameters
identifiers
Identifiers of characteristics that should be discovered. If
nil
- all of the characteristics will be discovered. If you’ll pass empty array - none of them will be discovered.Return Value
Single
that emitsnext
with array ofCharacteristic
instances, once they’re discovered. If not all requested characteristics are discovered,RxError.noElements
error is emmited. -
Undocumented
Declaration
Swift
public func discoverIncludedServices(_ includedServiceUUIDs: [CBUUID]?) -> Single<[Service]>


1. Introduction
Given a complex responsive layout, developers often require granular control over how the contents of an individual module will respond relative to the size of their parent container rather than the viewport size. This limitation conflicts with the goal of creating modular, independent components, often requiring a number of redundant CSS, complex exception cases, and workarounds, and the problem compounds itself depending on how dramatically a module adapts at each of its breakpoints.
For the purposes of this document, an element query refers not to a specific syntax or proposed method of addressing the use cases that follow, but a method of controlling styling based on the size of a containing element.
This document presents some of the use cases that “element queries” would solve, in allowing authors to define styles (chiefly, layouts) within an individual module on the basis of the size of the module itself rather than the viewport. The goal is to demonstrate, beyond a reasonable doubt, the need for a standardized method of allowing content to respond to its container’s dimensions (as opposed to the overall viewport size). This would facilitate the construction of layouts comprised of many modular, independent HTML components with a minimum of duplicated CSS and overrides specific to the modules’ parent containers.
In formulating the requirements, this document tries to be neutral—it is not predicated on any solution. The document only tries to describe the use cases and what the RICG understands, from practice, would be needed to address the use cases in the form of requirements. The RICG expects that a technical specification can be created to formally address each or all of the requirements (i.e., the solution).
2. Use Cases
This document reflects the efforts of members from the Responsive Issues Community Group (RICG), and with ongoing feedback from the designer/developer community via blog posts, informal polls, and other social media sources. The RICG’s goal for this document is to make sure that developer requirements for element queries have been captured for the purpose of standardization.
The following use cases represent common usage scenarios:
Figure 1 is an example of a relatively simple and fully self-contained module’s layout, using only a single min-width
media query to reflow content.
In this layout, this module can occupy containing elements of varying widths, governed by multiple breakpoints. In small viewports, we’ll be using a linear layout where each of our five modules occupy the full viewport — this layout is covered by the base styles outside of our media query. At higher breakpoints, these modules will be displayed side-by-side: three across, then below that two across. The three-across layout will be covered by the global styles within our viewport-based media query. Parent-specific overrides will need to be written for the two-across layout, as these modules will need to shift to their wide-format at a smaller viewport size than the ones above them.
In order to accomplish this layout, a developer would need to duplicate all of this module’s “wide layout” styles into a second viewport-based media query—set to apply at a smaller min-width than the global breakpoint styles—with all of our styles scoped to a parent container. This now means that any future edits or bug fixes to the wide-format layout styles will need to be made in multiple places, and this maintenance cost increases exponentially with each module-level breakpoint required.
Similarly, introducing a new context unlike the previous two—shown in figure 4 with the introduction of a “sidebar” on an interior page layout—means duplicating or overriding all of a module’s media queries yet again.
The module in this new sidebar context will never need to reflow to the wider layout, and as such we’re left with two options: scoping all of our modules—with the exception of the two-across layout—to a parent class, or introducing a new media query that overrides all of our wide-layout styles based on the sidebar’s parent class. Despite the relative simplicity of our module and our overall page layouts, one is left with a bloated and difficult to maintain stylesheet.
3. Requirements
The use cases give rise to the following requirements:
4. Open issues
We are tracking open issues on Github. Please help us close them!
5. Change history
A complete history of changes is available on Github.
You can also see all closed issues relating to this document.
6. Acknowledgements
A complete list of participants of the Responsive Images Community Group is available at the W3C Community Group Website.


PDF encryption.
Overview
FOP supports encryption of PDF output, thanks to Patrick C. Lankswert. This feature is commonly used to prevent unauthorized viewing, printing, editing, copying text from the document and doing annotations. It is also possible to ask the user for a password in order to view the contents. Note that there already exist third party applications which can decrypt an encrypted PDF without effort and allow the aforementioned operations, therefore the degree of protection is limited.
For further information about features and restrictions regarding PDF encryption, look at the documentation coming with Adobe Acrobat or the technical documentation on the Adobe web site.
Usage (command line)
Encryption is enabled by supplying any of the encryption related options.
An owner password is set with the -o option. This password is actually used as encryption key. Many tools for PDF processing ask for this password to disregard any restriction imposed on the PDF document.
If no owner password has been supplied but FOP was asked to apply some restrictions, a random password is used. In this case it is obviously impossiible to disregard restrictions in PDF processing tools.
A user password, supplied with the -u option, will cause the PDF display software to ask the reader for this password in order to view the contents of the document. If no user password was supplied, viewing the content is not restricted.
Further restrictions can be imposed by using the -noprint, -nocopy, -noedit and -noannotations options, which disable printing, copying text, editing in Adobe Acrobat and making annotations, respectively.
Usage (embedded)
When FOP is embedded in another Java application you need to set an options map on the renderer. These are the supported options:
| Option | Description | Values | Default |
|---|---|---|---|
| ownerPassword | The owner password | String | |
| userPassword | The user password | String | |
| allowPrint | Allows/disallows printing of the PDF | "TRUE" or "FALSE" | "TRUE" |
| allowCopyContent | Allows/disallows copy/paste of content | "TRUE" or "FALSE" | "TRUE" |
| allowEditContent | Allows/disallows editing of content | "TRUE" or "FALSE" | "TRUE" |
| allowEditAnnotations | Allows/disallows editing of annotations | "TRUE" or "FALSE" | "TRUE" |
An example to enable PDF encryption in Java code:
import org.apache.fop.pdf.PDFEncryptionParams; [..] FOUserAgent userAgent = fopFactory.newFOUserAgent(); useragent.getRendererOptions().put("encryption-params", new PDFEncryptionParams( null, "password", false, false, true, true)); Fop fop = fopFactory.newFop(MimeConstants.MIME_PDF, userAgent); [..]
The parameters for the constructor of PDFEncryptionParams are:
- userPassword: String, may be null
- ownerPassword: String, may be null
- allowPrint: true if printing is allowed
- allowCopyContent: true if copying content is allowed
- allowEditContent: true if editing content is allowed
- allowEditAnnotations: true if editing annotations is allowed
Alternatively, you can set each value separately in the Map provided by FOUserAgent.getRendererOptions() by using the following keys:
- user-password: String
- owner-password: String
- noprint: Boolean or "true"/"false"
- nocopy: Boolean or "true"/"false"
- noedit: Boolean or "true"/"false"
- noannotations: Boolean or "true"/"false"
Environment
In order to use PDF encryption, FOP has to be compiled with cryptography support. Currently, only JCE is supported. JCE is part of JDK 1.4. For earlier JDKs, it can be installed separately. The build process automatically detects JCE presence and installs PDF encryption support if possible, otherwise a stub is compiled in.
Cryptography support must also be present at run time. In particular, a provider for the RC4 cipher is needed. Unfortunately, the sample JCE provider in Sun's JDK 1.4 does not provide RC4. If you get a message saying
"Cannot find any provider supporting RC4"
then you don't have the needed infrastructure.
There are several commercial and a few Open Source packages which provide RC4. A pure Java implementation is produced by The Legion of the Bouncy Castle. Mozilla JSS is an interface to a native implementation.
Installing a crypto provider
The pure Java implementation from Bouncy Castle is easy to install.
- Download the binary distribution for your JDK version.
- Unpack the distribution. Add the jar file to your classpath. A convenient way to use the jar on Linux is to simply drop it into the FOP lib directory, it will be automatically picked up by fop.sh.
-
Open the java.security file and add
security.provider.6=org.bouncycastle.jce.provider.BouncyCastleProvider,
preferably at the end of the block defining the other crypto providers. For JDK 1.4 this is detailed on Sun's web site.
If you have any experience with Mozilla JSS or any other cryptography provider, please post it to the fop-user list.
by J.Pietschmann, Jeremias Märki
version 638396


--- layout: post title: Je t'aime… moi non plus date: 2016-07-08 13:37:21.000000000 +07:00 categories: - Thoughts - WordPress tags: - contributing - open source ---
As a plugin developer who released a few plugins on WordPress.org, I sometimes feel like the song says: "Je t'aime… moi non plus". Well, sexual content aside :p
{% youtube k3Fa4lOQfbA %}There are two questions I've been asking myself a lot lately. Dan Cameron's post "What Now? No Way? Huh?" made me feel that maybe others are asking themselves those questions too.
Disclaimer: this post is not at all a critic of the current system. I am not trying to provoke anyone in the community. I am merely trying to get answers to two selfish questions I've been asking myslef:
While this is not the only thing I've been wondering about, this post was inspired by how incentivized reviews are being handled.
My first interaction with the .org team on this matter dates back to April 2016 when I released, in all honesty, a small library, WP Review Me, where discount codes were automatically given in exchange for a review.
Otto came down hard on me very quickly in this GitHub issue: https://github.com/julien731/WP-Review-Me/issues/3
Then, there was Dan's post, to which I left a pretty lengthy comment. But then I realized there was more than just a difference of opinion, which is why I'm writing this post.
I love WordPress. I've been working with it one way or another since circa 2012. I love how flexible it is, how powerful, and how amazing the community is. I've seen some really awesome things happen, and I've met some extremely generous and open minded people.
What did I contribute to benefit from that? Mostly plugins. I have contributed a tiny fix to core a while back, and while I felt very proud, it was really nothing compared to what the real core contributors do.
So, as a plugin developer, where do I - I as in I, plugin developer, not just I, Julien Liabeuf - stand in the community?
When I see what happened to Dan (I also had a plugin taken down the same way in the past, minus the removal of reviews), I can't help be feel cheated. This situation seems extremely unfair to me. But what can I say? Do I have a say in this? Obviously no in Dan's case.
At a more global scale, what can a plugin developer say in a decision making process?
When I release a new plugin on WordPress.org, I spend hours forming the idea, planning the features, writing the code, writing documentation, supporting users... All of that for free.
If someone takes my plugin down or deletes user's reviews, it's a bit like saying "all this work you put in for free, we'll just delete a part of it".  It makes me feel like I'm nothing, that I don't have a word to say in how my own work is being used.
Should plugin authors be allowed to step in?
I understand the review team. They, too, put a lot of unpaid time in what they do. Probably more than me. From where I stand, there are two ways of envisioning things.
If I were to stop developing plugins and drop WordPress, it wouldn't change anything. If all plugin authors were doing the same, WordPress would still be here.
If WordPress was gone, though, there would obviously be no plugins. Plugins are nothing without WordPress; which mans that core / review people should definitely be the ones saying what's ok and what's not. They should be allowed to do whatever they please with plugins.
If there was no plugins, sure WordPress would still be here. It would certainly not power a quarter of the web, though. It wouldn't be as great as it is.
This means that plugin developers are a big part of WordPress' success and as such, they should be allowed to step it.
Unsurprisingly, I tend to think that plugin developers should have a say. However, the first proposition is valid as well.
There is another thing that should be considered: the amount of time and resources each contributor type puts in.
Core contributors and reviewers certainly give more of their time to the community than I do. Does it mean that their opinion should matter more than mine? Absolutely. They deserve it. But it shouldn't mean my opinion doesn't matter at all.
When I read guidelines #9 and #18 that are currently in the spotlight, I feel like someone is telling me "fuck you".
#9: [...] This includes spam, for whatever definition of spam we want to use.
This, to me translates into "You genuinely think what you did was ok?  We reserve the right to arbitrarily disable or remove any plugin for any reason whatsoever. Basically, this is our repository [...]
This, to me, translates into "Thanks for releasing your work. Now we rule. Don't complain".
These are very aggressive statements and they obviously mean that a plugin developer has no say whatsoever. Which leads me back to my original questions: who am I in the community and what are my rights?
I could summarize all the blah blah above into one simple quiz.
John spent a lot of time to release a free plugin on WP.org. The review team sees something they don't like. They suspend John's plugin and delete his reviews. John wants to discuss the decision. Which of the following answers from the review team is correct?
 Who am I in the community? What can I do/say? What should I be able to do/say? I feel a bit lost sometimes.
There is one sure thing, though. My post might sound like a critic of the review team, but it's not. Sure there are things that could be improved in the review team / authors relationship. I'd actually be glad to be part of some kind of reflexion group to try and improve how review team members and plugin authors interact.
I also want to acknowledge the amount of time the review team provides. Thanks for your work guys.
I'll now be back to tormenting myself with my existential crisis :)


Captain of {{user.properties.team.value | teamIdFilter:teams}}
Scorekeeper
Administrator
Created: {{user.created_at * 1000 | date:'longDate'}}
Last updated: {{user.updated_at * 1000 | date:'longDate'}}


Located at {{village}} ({{x}}x {{y}}y)
Located at {{x}}x {{y}}y
| Name | QL | DMG | Weight | Price |
|---|---|---|---|---|
| This merchant has no inventory | ||||
| No items found in this merchant's inventory for '{{filterQuery}}' | ||||
Get this data in JSON format: g1z5kbn4Y.json
Generated by merchant listing mod
| Loading inventory |


Fragments
Prologue
THUNDER ROLLED ACROSS A DEEP VELVET SKY as distant as the grumbling of the gods, and to the young man hidden within the sticky needles of fir and spruce, just as irrelevant. When a sheet of scattered raindrops peppered the forest floor, he knew that the time had come. For several hours now, against orders and beyond help, Askon had lain silent and still as death, the scent of conifer swirling all about him. In the darkness and driving rain, his eyes—one green and one brilliant blue—burned with reflected firelight.
Ghastly shadows danced around the bonfires some fifty yards from his hiding place. He breathed deeply. His stillness was not that of peace or calm; it was a volatile cocktail of deep-seated rage mingled with raw adolescence. Excitement, bloodlust and a hunger for control simmered below the surface. Much training, daydreaming, and ridicule had led him here, to the rain-soaked perfume of the thicket.
Two days earlier, King Codard’s son, Edward, had been captured. A boy new to manhood—like Askon himself—the prince had chosen the role of scout in his father’s army. He could have elected a life of luxury in the castle, but instead had enlisted like a commoner and thus arrived at the northwestern border-fort of Vestgæta. There, the army fought a protracted battle with creatures known as the Norill. When Askon had asked if the military unit would send a rescue party for Edward, the commanders had laughed.
“He’s as good as gone.”
“That’s what he gets for leavin’ the castle walls.”
“Fine, Askon, throw your life away trying to rescue him. See who notices.”
The jeering voices of memory made Askon’s decision for him. Honor was never easy to come by, and respect even more difficult to earn; but for someone like Askon it was near impossible. In the land of Vladvir those with even the slightest trace of elven heritage were given the title ‘Half-elf’. Askon had more trace than most. By rescuing a captured prince, Askon stood to gain glory for himself, if not his people, and he could satisfy his sense of duty. The prince had chosen to enlist, and that deserved respect.
“See who notices,” Askon muttered as the droplets rattled a drum-cadence against his deep green cloak. Beneath the hood, a tangle of brown hair dripped onto pointed ears. His face, in some ways angular and cold like those of his father’s people, had also a roundness about the cheeks and chin that more closely resembled his mother and the humans of Vladvir.
A flash of lightning tore through the clouds. Askon rocked forward anxiously, his first movement for many minutes. His breathing accelerated. A sharp crack of thunder split the monotony of the rain. On and on it boomed as though someone had murdered the sky. All around the bonfire the sinuous shadows continued their dance.
“Filth,” Askon spat as the thunder rolled away and the rain hissed in its place.
At the firelight’s furthest edges, he could see the rough-hewn cages where they kept the prisoners. A day’s worth of reconnaissance had taught him that the guards were few and distracted, the cages shoddily built, and the gates wound with twine. But the Norill were many. Like a writhing insect hive they squirmed from place to place, arms dangling low, knuckles nearly touching the ground. Shriveled animal skins and bleach-white bones served them for armor. Underneath, their gray, mottled bodies had shone with sweat. That had been while the sun still lit the blue-green valley; before the dark; before the rain; before the dance.
On it went until one by one the Norill slithered away from the dying flames. A chill wind swirled through the thicket, rattling the branches like bones, whispering through the trees like the last breath of a dying man. The once lurid flames cowered weakly in the wind, burning low; gasping tongues of fire licked out greedily.
Askon smiled. Two guards at the entrance. Those he thought he could slip past on the way in, but not on the way out. Two more straggled by the fire pit, probably drunk on whatever vile concoction they had consumed during the dance. And then the cage-guards, hopefully asleep or dozing. It didn’t matter. His chance was singular and desperate. His two-colored eyes flickered once again; this time with a wild inner light. Without so much as the snap of a broken twig, he rose from concealment and sprinted across the darkened clearing.
As he slipped through the gap several feet from the entrance gate, Askon drew his sword with his left hand. A long, curved hunting knife glimmered in his right. Somewhere in the camp there was a clatter: brief, not a threat. Then once more the rain drizzled down, pinging against a cooking pot nearby. He rounded the flimsy lean-to that abutted the spiked wall. There, sleeping heavily, its crooked mouth dangling wide, sat a Norill fighter, five feet in stature. A snort and gurgle issued from the gaping mouth, and Askon made his first mistake.
Without a thought, Askon cocked back his right arm and drove the hunting knife deep into the creature’s neck. Large moony eyes rolled in their sockets; flat, papery nostrils flared. He twisted the blade with a nauseated snarl, sickened by the Norill stench.
But the creature did not die. It shuddered violently then screeched, choked, and fell barking into the mud. Askon dove on the body, stabbing quickly: heart twice, neck once more. He stamped on the throat, and the Norill lay still, its mischief complete.
Quickly, shocked by his own ruthlessness, Askon dragged the corpse back behind the building where he had entered. He did not intend to return this way. By the time he reached Edward, the camp would be swarming like a dislodged wasp’s nest. They would have to fight their way out through the gate. Askon had not accounted for alerting the Norill so soon. Cautiously, he crept along the wall past two more buildings then back toward the smoldering fire. As he peered out from his hiding place, he saw that one of the Norill had slogged its way from the fire pit to the shack where Askon had so sloppily dispatched his first target.
Time would soon be running out; Askon bolted across the open space between the row of buildings and the embers of the bonfire. There, a reeling Norill stared stupidly into the glowing coals as the rain popped and hissed on contact. When Askon collided with the fire-watcher, he made his second mistake.
The creature was small, almost a full foot shorter than Askon, but its wobbling posture belied a sturdy balance and sure-footedness. It did not go down with the ease Askon had anticipated. They crashed into the mud together and slid half a yard before grinding to a stop. The creature was already back on its feet. A foam of spittle and mud bubbled through its pointed yellow teeth. Bewildered by darkness, surprise and likely drunkenness, it twisted and flailed, searching for its attacker.
This time, Askon did not make a mistake, nor did he relish the Norill’s death. Methodically, he fell upon the creature: a lunge, puncturing the lungs; a slash to the base of the neck; and two percussive stabs to the heart, whereupon it fell. Again, Askon dragged the body into the shadows. When he emerged, the creature that had followed the sounds of the first kill had returned. It inspected the area, appearing to look for its drinking-mate, but finding none. Stumbling slightly, it lumbered off to the south, deeper into the encampment.
Askon breathed a sigh of relief. Twice he had been lucky. Twice he had failed to follow the teachings of his childhood; the lessons of his military training. To expect survival of a third would be asking for death. Another peal of thunder boomed over the camp; the same tortured, wailing cry. Askon ran for the prisoners’ cages, capitalizing on the noise, his boots slapping over the growing slop of mud below. He pulled up short, sliding a little, but stayed on his feet.
Before him lay a long row of wooden cages. In one, Askon saw the prince’s scouting team. They were dead, probably long since, but in the darkness and rain Askon could not be sure. Piled over their corpses were their cloaks, King Codard’s bright blue stag visible on the black cloth even in the darkness. In the next two cages Askon saw something he could not later bring himself to describe. The remains had been human, but only the most gruesome details revealed them as such. He flinched and turned away. At the end of the row, a huddled form breathed slowly. It looked asleep, but something wasn’t right about the movement. It was the only cage with a living prisoner, and boasted the only guards. Circling behind, Askon approached the cell. To his surprise, the guards slept soundly, and he resisted the urge to kill them. Quietly he stepped to the rear edge of the cage.
“Edward?” he whispered.
No response.
“Prince of Vladvir? It’s Askon of Tolarenz.”
A wild-eyed face peered out from beneath the folds of its cloak. It was Edward. His dark features, in combination with the rain and the damp and the pallor of fear made him look as though he had gone mad.
“Is it so?” he gibbered.
“It is s—”
But Askon did not have time to finish. The guards had not been sleeping at all. Cold, clammy hands twisted his arm and shoulder. It seemed though that the Norill made mistakes as well, and Askon thanked the gods for it. He dropped the sword and stabbed up into the Norill’s arm, nearly driving the hunting knife into his own shoulder. Then he deftly spun the blade and stabbed the second guard in the bottom of the jaw, slicing through the windpipe on the return. Askon turned again and retrieved his fallen sword, thrusting it deep into the first guard who writhed frantically on the ground. The second was already dead, its blood mixing with the mud and rainwater.
When Askon looked up, Edward seemed to have come to his senses. He stood now, still pale but upright in the cell. Askon made several strategic cuts in the twine wrappings that secured the wooden poles. Then he gripped the rear wall.
“Take a run at it,” he ordered.
Edward backed toward the door, then gestured with his fingers: one, two…
He slammed into the backside of the cage while at the same time Askon pulled against it with all his strength. The creaking poles bent visibly and Askon heard several pieces of twine pop loose, but the cage held. Again Askon sliced at the twine in the hope that he wouldn’t be forced to saw through every strand, and again Edward sprinted, shoulder first, into the back wall of his prison. This time the poles cracked at their base while the twine twisted loose. Askon cast the remains of the cage wall aside. Edward stepped forward.
“Thank you,” he said, looking from side to side at the wreck.
Askon scowled. “I did only what I had to.”
Edward made a rasping choke of a sound; Askon wondered if it was a laugh. “I hardly think anyone ordered you down here. If I had to guess, I’d say you grew tired of them taunting you.”
Askon said nothing.
“I know of only one company in the king’s service that has both a prince and a half-elf among their ranks. I have heard their talk. However, now is hardly the time for it. May I use one of your weapons? We will need them if we are to get out alive.”
Askon looked first to his sword. Given to him by his father at his coming of age ceremony, he was sworn to honor it as an extension of himself. An elvish tradition, he could no more give the sword to Edward than he could shear off his own arm and lend it to the prince. So he flipped the hunting knife in the same effortless motion he had used when fighting the guards, this time with the hilt facing outward.
“If you lose this, you’ll wish I hadn’t saved you,” he said with a grin.


The Complete Guide To Setting Up Your Webseries Webpage, Part 3: Design and Designers
Other parts of this series : The Complete Guide to Setting Up Your Webseries Webpage
Hello and welcome to the third part in our series on creating your webseries’ webpage.  Meta, huh?)
This week, we’ll be looking at the final aspects of your website: setting up a design that will achieve the goals we set out in the first article, looking at customisations to Wordpress and Thesis that will let us do that, discussing whether to hire a designer (and how to get best value from them), and talking about how to tweak and develop your site so that it looks like it was professionally designed.
This article’s going to be going into a bit more depth than the other articles, and will be a bit more hands-on - however, it should still be skimmable.
How To Choose A Design
I’ve already written an article about this, which I’d heartily recommend reading if you get a chance. In summary, using lessons from the porn industry (which spends a lot of time and money figuring out the best way to design a site to attract visitors), I’d recommend a site with a trailer for either the entire show or the latest episode (depending on if your show is serialised) prominently visible when you arrive on the site, other episodes below that using pictures rather than text to “sell” them, a strong call to action next to the trailer at the top inviting your visitors to either subscribe or watch the full episode, a compelling description of the episode below that, and not much else on the front page.
Common tropes for a web series I wouldn’t recommend would include:
News page as the front page. New visitors can’t easily use your news, which is often full of production updates and similar things, to figure out what your show is about, and it means you’re not showcasing your best content up front.
Full episode on the front page Full episodes don’t contain the very best bits of your show, right up front. Sell your visitors on watching your show.
No textual information on the show. With no info on what they’re about to watch, many viewers won’t even click on your trailer, or won’t stay long. It’s all about persuasion.
No easy access to a subscription medium (email or RSS dedicated to the show). Twitter is great, but unless your twitter feed is very, very focussed, you’re risking losing readers who don’t like your other, non “new episode” twitters. Also, there’s a lot of noise on that channel. Go with a subscription medium, ideally push (email) and keep it clear of anything except episode updates.
For the rest of this article, I’m going to be working to produce something on the Divine Bitches mold (see the article above). So, we’ll be looking at a single column layout with a navigation menu below the logo, a teaser trailer below that, and then other episodes below that. If you don’t have a strong idea of what you want to do with your website design, I’d recommend that as a good basic approach.
Here’s the site that I set up as a test for this article: http://kamikazecookery.nfshost.com/ . It’s far from perfect yet, but it’s a good basic starting point, about where I’d expect to get to after the basic design setup I discuss below. I’ll discuss what you’d do to improve it in “So How Do I Make It Slicker?”, below.
Do You Need To Hire A Designer?
Do you need to hire a designer? Is that the only way to get a really great design?
Well, it depends on how great you want to go. A top designer will be able to produce something far nicer - and far more functional - than you’d be able to manage. People like the guys from Men With Pens (I’ve not worked with them, but I hear they have a fantastic rep) will create you an incredible design - but you’ll pay for it. Men With Pens’ design options start from $5k. Other equally good designers are a bit cheaper, but realistically you won’t come out with much change from $2k.
Now, don’t get me wrong - if you can possibly afford that, go for it. (I’m seriously considering hiring someone of that sort of status for Guerilla Showrunner right now - although it may come down to a choice between that and a new mocap suit for Strange Company). It’ll make you look a hell of a lot more credible, it will actually boost views, subscribers and business in general - Dave Navarro says his business nearly doubled after he forked out for a really slick design - and it’ll make your crew feel great into the bargain.
If you can’t - it’s worth checking out outsourcing sites, but you’ll have to put the time in to find a designer with a style that you really like. 99 Designs and Elance.com are both worth looking at. However, even here, you’ll pay more than you’d expect for a really awesome design, probably in the $1k range.
So surely it’s worth looking for some hungry student or dubious third-world outsourcer? No, not really. If you’re a reasonably visual person and you’re willing to put some time in, you’ll do a better job of coming up with a design that suits your website from the building blocks of Thesis and Wordpress than J. Random Designer will. I’ve tried hiring people on price for visual work a few times, and it’s rarely a good idea.
 But it’s far from guaranteed. Overall, if you can’t pay at least reasonably well, well, and you have some or any skill, you’re better doing it yourself.
How To Customise Wordpress To Meet Your Needs
This is where Thesis, the custom theme I recommended in the last article, really starts to shine. You could use a free Wordpress theme if you like, but you’ll end up having to heavily customise it at the code level, and some features will be tricky to implement - I believe! I’ve never tried it, and I’d have to learn quite a bit about Wordpress theme design before I did.
In general, about 80% of the tweaks we need to make can be done within Thesis’ main interface. A few of the more cunning bits will need to use custom CSS and in one case custom code, through Thesis’ “custom” section.
However, don’t be too scared by this - in 90% of the cases below, I found out what I needed to do to tweak my design by Googling “Thesis” and whatever customisation I wanted, like “Nav menu below logo”, and then simply followed the instructions that Google threw at me!
Initial Thesis Tweaks
First up, don’t forget to set your site’s title under “Site Options -> Home Page SEO”. Make sure that any keywords that people might use to find your site (“Scientific Cookery”, “Geek cooking” and similar combinations in Kamikaze Cookery’s case) are in your header, but don’t make it sound unnatural. I went for “Kamikaze Cookery - Geeks cook. With Science.”. Fill out the Meta Description too - that’s what people will see in search results for your main site.
Now, under Design Options, there are a few tweaks we need to make. Set your Columns first. Single-column layouts seem to be becoming the standard for web series, and are what the Divine Bitches site uses - in general, I’d recommend them because they present the viewer with the least visual clutter and allow you to draw the eye as easily as possible.
Width should be around 900px these days, although you can change it if you have a specific reason to.
Under “Features and Teasers”, set the number of Features to either 1 or 2 - 1 if you’re running a show where people can jump in at any point, 2 if your show is arced or there might be other reasons you’d prefer a new viewer to start at a specific episode.
The “Features” are the episodes that we’ll have showcased at the top of the page, with a trailer and a description. If we’ve got two features, we’re going to showcase two episodes on the front page - the first or best entry episode, and also the latest one, thus ensuring that both returning and new visitors can easily find what they’re looking for.
Under “Posts”, set “Display Post Excerpts”. That allows us to show a teaser for a video on the front page and the actual video on a seperate page.
Set “Feature Box” to “Do Not Use Feature Box” - it’s not a feature we need.
That’s about all we need to do for now.
Populating your show
Now, we need some content before we can start customising. Use your show’s existing episodes if you already have them - otherwise, just grab some random YouTube videos in approximately the format you expect to show (Widescreen if you’re widescreen, roughly the same style or content, etc). Obviously, you’ll have to replace those with real content before you go live, but you can use random videos to make sure your design works.
You’ll also need some** thumbnail images** from the episodes - grab them from the videos using the image editor of your choice (Pause video, Print Screen, and crop out the image).
And you’ll need at least one** trailer** for the show - either use one you’ve got already or grab a random video, either one of yours or a completely random one. You should probably cut a trailer anyway if you haven’t got one!
Now, here’s where it gets a bit tricky. You’ll want the main body of your post to JUST contain the video you’re wanting to show - use the YouTube (or whatever site you’re hosting your vids on) embed code for now, with the width set to 40 px less than the width of your site, although later on you can substitute tracking code to let you get detailed stats from your videos at a later date (or now if you feel ambitious).
IN the “Excerpt” box further down the Wordpress page, add the following code:

EMBED CODE

View full episode

EPISODE TITLE
Length: EPISODE LENGTH
EPISODE DESCRIPTION

Replace EPISODE TITLE, EPISODE LENGTH and EPISODE DESCRIPTION with the specific elements of your episode, of course. LINK TO POST should be replaced with the link to the current post - get it from the top of the Wordpress post page. EMBED CODE should be the embed code or tracking code for your trailer for the episode (or series), set to about 480 width if you’re using a 900 page width.
Finally, upload your thumbnail image using the upload tools at the top of the Wordpress Post page. Copy the address for the Medium size image (it’ll be obvious when you do it), and paste that into “Thumbnail Image”, about half-way down.
Repeat this process for every episode you have, or for 3 or 4 sample episodes if you’re just using test footage for now.
Once you’ve done that, take a look at your front page - it’ll look a bit of a mess, but the site will be starting to come together.
Tweaking The Design
This is where things start to get a bit personal. At this point, you’ll want to start playing around with and tweaking the various design options in Thesis and generally trying to make your site look as nice as possible.
Here are some suggestions for things I did to make my test site look nicer, and some tricks to make Thesis do things that aren’t initially obvious.
Fix Your Excerpts Initially, the most obvious thing about your page will be the ugly, ugly videos below the main one, cluttering up the page. Fortunately, this is easy to fix. Go to the Custom File Editor, and at the bottom of Custom.css, add
.custom .format_teaser .excerpt {display : none}
Now, go to Design Options -> Teaser Display Options, and uncheck everything except “Post Excerpt” and “Post Title”. You can drag-and-drop those two to change the order they’re in. Reload the page, and you’ll just have lovely, lovely thumbnails.Add a logo. Pretty easy, this one - resize or otherwise edit your logo (you could add whitespace using Photoshop or another editing package to make it the same width as your page if you don’t want it centered) to the width of your site, then upload it through Thesis’ “Header Image” function. Now change Design Options -> Header to not show your site title or tagline as text.
Add a nice border This is a nifty effect - in Design Options -> Fonts, Colors and More -> Body (And Content Area), select “Add a cool shadow effect to your layout”. Does exactly what it says!
Put the navigation menu below the header image For a site design like this, you’ll almost always want the menu below the logo as a way to break the page up a bit (unless you’ve included a break in the logo image itself). There’s no menu option to do this in Thesis, but it’s simple to do with custom code.Go to “Custom File Editor”, and select “Custom_Functions.php”. You’ll be presented with a text document - where it says “add your code here”, or words to that effect, add
remove_action('thesis_hook_before_header', 'thesis_nav_menu'); add_action('thesis_hook_after_header', 'thesis_nav_menu');
That’s it - your menu will now be below your logo.Hide unnecessary bits on featured posts You don’t need or want to show “Author”, number of comments (unless it’s huge), date, or various other things on your post.  Then go to Tagging, and deselect “Show Tags on Index and Archive Pages”.
Make your menu bar a solid colour I wanted a solid block of colour for my menu bar. Fortunately, this is really easy - in Custom.css in the Custom File Editor, simply add
.custom .menu {background-color: rgb(255, 102, 0)}
So, after all that, you should have something a bit like http://kamikazecookery.nfshost.com/ - not super-slick, but certainly usable.
So How Do I Make It Slicker?
After you’ve done all that and fiddled about for a while, you’ve probably got something that looks clean and acceptable, but certainly not as slick as the Divine Bitches site or anything like it.
Unless you have some serious hidden talent, you’re never going to get to the level of the slickest of the slick - after all, the top sites on the Internet are designed by people who spend their lives doing very little but obsessing on website design. I know a few of those guys, and they’re better than I’m ever going to be.
However, you don’t need to be in that top 0.1%, and as I discussed above, you probably can’t afford to be either. If you’re not in a situation where you can drop a couple of thousand bucks on your website, you can make a remarkably pretty and functional site up yourself just by taking the design you already have - which is already probably better than most non-professional efforts - and spending a day or so tweaking.
Here are a few tips for improving your design by yourself:
Get LOTS of feedback, and not just feedback from people you know. Certainly, ask for critiques and things you could do better from your friends, and from Facebook friends, and so on - but also put it out there in the harsh light of day. Ask for a crit on Web Series Network, or on IndieTalk, or on the forums for the tools you use. Find web design forums and - HUMBLY - ask for suggestions. Maybe even post somewhere like Hacker News or Reddit and ask for feedback there - it’ll be pretty harsh, but there are some very smart people out there, and often you only need one tip - “Reduce the font size”, “Put a gradient on the background” - to massively improve your site.
Play around Particularly if you’re new to webdesign, don’t be afraid to play. It’s reasonably hard to break your site permanently - try different colour schemes. Try changing border sizes. Mess around.
Read Books My number one tip for most things - read a book. Find a book on web design and read it. You’ll probably find half a dozen ideas - try them as you go. This is a great way to build up a skill too - although it ain’t fast. This is a good, free place to start.
Add some shots from the show One great way to spruce up a website is to use some graphics - and you’ve already got a great source of graphics in your show! Try using them as spacers - use a line of tiny thumbnails from the show - as background images - blurred a bit and spread out - or even use graphical elements from your titles for edges and corners. It’s amazing what you can do with a bit of time with Photoshop and some great images from the show.
Pay a great designer to do as much as you can afford You’re better off getting something from a great designer than everything from a below-average one. Find the designer you’d really like to have design your site - look at their portfolio and past work - and then ask them if they’d be willing to give you some suggestions for improving your site design, or a full critique, or even an image-based mockup you could work from. Negotiate! See what they can do for you.
I’ve never hired a designer for any of my series’ sites. At the end of the day, even if your site isn’t perfect or beautiful, if it lets people find your series and watch it, it’s doing the job you need it to do.
Next Week: Stress-Testing, Continuous Improvement, and More
Well, the good news is, if you’ve followed through that, you’re basically done! You’ve got a site, it’s perfectly capable of serving your series up to your audience, and it looks at least reasonably appealing and professional.
There are a few more things that you can and probably should do. Next week we’ll have the final, slightly shorter part of the series, where I discuss checking if your site can handle all the traffic it might suddenly get - including anything up to a mention on a site like Digg or Reddit - and how to improve things if it can’t. I’ll also discuss continuous improvement, testing, and how to keep making your site steadily better as your series grows.
But for now - you’ve got a site, or at least you know enough to make one. Woohoo!
What to do next:
_If you had any trouble with any parts of this article, or if you’ve got questions or suggestions on designing your series’ website, post them in the Comments below! _
_And if you felt you got some value out of this article, please hit the Retweet button below to share it with more people it could help! _
Read more →


CRTS
This is a test page. So what's on this page may not make any sense someone not writing CRTS code.