Engineering and technology notes
How to populate an LDAP server with users and groups via phpLDAPadmin
Creating Organizational Units
LDAP breaks everything into very specific pieces, and we’re going to focus on two of those pieces: people and groups. Because we’re creating fairly generic Organizational Units (OUs), we’ll use the Generic Organizational Unit Template. To get there, log into phpLDAPadmin, click to expand your server listing (in my example it’s dc=monkeypantz,dc=net) and then click Create New Entry Here (Figure A).
Figure A

Creating a new entry with phpLDAPadmin.
In the right pane (Figure B), select Generic: Organizational Unit.
Figure B

Selecting from the many available objects on the LDAP server.
Let’s first create an OU named “groups”. In the next window type groups and click Create Object. Commit the group by clicking Commit in the next window (Figure C).
Figure C

Committing your changes to LDAP.
You’ll see a new entry in the left pane called ou=groups (Figure D).
Figure D

Our new OU ready to be used.
Let’s create a new OU named “users”. Walk through the same process as above, though name the OU “users” instead of “groups”. You’ll see “ou=groups” and “ou=users” in the left pane.
Creating groups
Now that we have an OU created for groups, we can add the necessary groups. Let’s create groups for “admin”, “developers”, and “users”. Here’s how.
- Click the groups OU in the left pane.
- In the resulting window, click Create Child Entry (Figure E).
- Click Generic: Posix Group.
- Type admin into the group text area.
- Click Create Object.
- Click Commit.
- Repeat the process for “developers” and “users”.
Figure E

Creating a new group under the groups OU.
Creating users
Now that we have our groups created, we want to create users. To do this, follow these steps.
- Click ou=users from the left pane.
- In the resulting window, click Create A Child Entry.
- Select Generic: User Account.
- Fill out the required information- note that Common Name must be unique (Figure F).
- Click Create Object.
- Click Commit.
- Repeat this process until you have added your necessary users added.
Figure F

Creating a new user.
Adding users to groups
To add a user to a group, you must know the user’s UID (named User ID in the user creation window). To find a UID go to ou=users | View X child (where X is the number of users) and then locate the user to be added and make note of their associated UID. Once you have that UID, let’s add that user to the developers group. Here’s how.
- Expand ou=groups.
- Click the developers group.
- Click Add New Attribute.
- From the drop-down, select memberUID.
- Enter the UID for the user in the memberUID section (Figure G).
- Click Update Object.
Figure G

Adding a user to a group.
After you add the first user, adding subsequent users is much simpler. If you click the group name (under ou=groups in the left pane), you can click Modify Group Members (under memberUID) and then add the users from a list.
Source: How to populate an LDAP server with users and groups via phpLDAPadmin – TechRepublic
CSS Selectors Reference
CSS Selectors
In CSS, selectors are patterns used to select the element(s) you want to style.
Use our CSS Selector Tester to demonstrate the different selectors.
| Selector | Example | Example description |
|---|---|---|
| .class | .intro | Selects all elements with class=”intro” |
| .class1.class2 | .name1.name2 | Selects all elements with both name1 and name2 set within its class attribute |
| .class1 .class2 | .name1 .name2 | Selects all elements with name2 that is a descendant of an element with name1 |
| #id | #firstname | Selects the element with id=”firstname” |
| * | * | Selects all elements |
| element | p | Selects all <p> elements |
| element.class | p.intro | Selects all <p> elements with class=”intro” |
| element,element | div, p | Selects all <div> elements and all <p> elements |
| element element | div p | Selects all <p> elements inside <div> elements |
| element>element | div > p | Selects all <p> elements where the parent is a <div> element |
| element+element | div + p | Selects all <p> elements that are placed immediately after <div> elements |
| element1~element2 | p ~ ul | Selects every <ul> element that are preceded by a <p> element |
| [attribute] | [target] | Selects all elements with a target attribute |
| [attribute=value] | [target=_blank] | Selects all elements with target=”_blank” |
| [attribute~=value] | [title~=flower] | Selects all elements with a title attribute containing the word “flower” |
| [attribute|=value] | [lang|=en] | Selects all elements with a lang attribute value starting with “en” |
| [attribute^=value] | a[href^=”https”] | Selects every <a> element whose href attribute value begins with “https” |
| [attribute$=value] | a[href$=”.pdf”] | Selects every <a> element whose href attribute value ends with “.pdf” |
| [attribute*=value] | a[href*=”w3schools”] | Selects every <a> element whose href attribute value contains the substring “w3schools” |
| :active | a:active | Selects the active link |
| ::after | p::after | Insert something after the content of each <p> element |
| ::before | p::before | Insert something before the content of each <p> element |
| :checked | input:checked | Selects every checked <input> element |
| :default | input:default | Selects the default <input> element |
| :disabled | input:disabled | Selects every disabled <input> element |
| :empty | p:empty | Selects every <p> element that has no children (including text nodes) |
| :enabled | input:enabled | Selects every enabled <input> element |
| :first-child | p:first-child | Selects every <p> element that is the first child of its parent |
| ::first-letter | p::first-letter | Selects the first letter of every <p> element |
| ::first-line | p::first-line | Selects the first line of every <p> element |
| :first-of-type | p:first-of-type | Selects every <p> element that is the first <p> element of its parent |
| :focus | input:focus | Selects the input element which has focus |
| :hover | a:hover | Selects links on mouse over |
| :in-range | input:in-range | Selects input elements with a value within a specified range |
| :indeterminate | input:indeterminate | Selects input elements that are in an indeterminate state |
| :invalid | input:invalid | Selects all input elements with an invalid value |
| :lang(language) | p:lang(it) | Selects every <p> element with a lang attribute equal to “it” (Italian) |
| :last-child | p:last-child | Selects every <p> element that is the last child of its parent |
| :last-of-type | p:last-of-type | Selects every <p> element that is the last <p> element of its parent |
| :link | a:link | Selects all unvisited links |
| :not(selector) | :not(p) | Selects every element that is not a <p> element |
| :nth-child(n) | p:nth-child(2) | Selects every <p> element that is the second child of its parent |
| :nth-last-child(n) | p:nth-last-child(2) | Selects every <p> element that is the second child of its parent, counting from the last child |
| :nth-last-of-type(n) | p:nth-last-of-type(2) | Selects every <p> element that is the second <p> element of its parent, counting from the last child |
| :nth-of-type(n) | p:nth-of-type(2) | Selects every <p> element that is the second <p> element of its parent |
| :only-of-type | p:only-of-type | Selects every <p> element that is the only <p> element of its parent |
| :only-child | p:only-child | Selects every <p> element that is the only child of its parent |
| :optional | input:optional | Selects input elements with no “required” attribute |
| :out-of-range | input:out-of-range | Selects input elements with a value outside a specified range |
| ::placeholder | input::placeholder | Selects input elements with the “placeholder” attribute specified |
| :read-only | input:read-only | Selects input elements with the “readonly” attribute specified |
| :read-write | input:read-write | Selects input elements with the “readonly” attribute NOT specified |
| :required | input:required | Selects input elements with the “required” attribute specified |
| :root | :root | Selects the document’s root element |
| ::selection | ::selection | Selects the portion of an element that is selected by a user |
| :target | #news:target | Selects the current active #news element (clicked on a URL containing that anchor name) |
| :valid | input:valid | Selects all input elements with a valid value |
| :visited | a:visited | Selects all visited links |
Source: CSS Selectors Reference
Twenty Twenty Theme – How to Edit Footer Copyright Text
Microsoft HoloLens 2 is now available: This is what its AR does
Transmission Apache proxy setup
First enable the proxy modules in Apache:
sudo a2enmod proxy sudo a2enmod proxy_http sudo /etc/init.d/apache2 restart
Then you will have to edit /etc/apache2/mods-available/proxy.conf file. But before that backup your proxy.conf file:
cd /etc/apache2/mods-available sudo mv proxy.conf proxy.conf.default
Now create a new file called proxy.conf using your favorite text editor and add the following lines to it:
<ifmodule mod_proxy.c>
#turning ProxyRequests on and allowing proxying from all may allow
#spammers to use your proxy to send email.
ProxyRequests Off
<proxy *>
AddDefaultCharset off
Order Allow,Deny
Allow from all
</proxy>
ProxyPass /transmission http://localhost:9091/transmission
ProxyPassReverse /transmission http://localhost:9091/transmission
# Line below is optional
Redirect permanent /transmission https://myserver.com/transmission/web/
# Enable/disable the handling of HTTP/1.1 "Via:" headers.
# ("Full" adds the server version; "Block" removes all outgoing Via: headers)
# Set to one of: Off | On | Full | Block
ProxyVia On
</ifmodule>
Source: Transmission Apache proxy setup
Mixed content (HTTP & HTTPS) while loading app (Nextcloud) · Issue #56 · strukturag/nextcloud-spreedme
RequestHeader set X-Forwarded-Proto ‘https’
NextCloud won’t load any mixed content – support – Nextcloud community
Hi, I’m the author and also a proxy user like yourself. That guide doesn’t cover use behind a proxy, so here’s what you need to ensure is in your config.php file:
'overwrite.cli.url' => 'https://cloud.myserver.com',
'overwriteprotocol' => 'https',
This forces NC to use HTTPS despite not being configured that way.
What you’re experiencing there is totally normal behaviour as you’re proxying from an SSL connection to plain HTTP. Nextcloud will as such respond in plain HTTP unless you tell it otherwise.
Be aware, if you access internally via IP over HTTP, this will either a) give you SSL errors or b) not work at all (443 is not configured by default, so it may refuse to connect when it forces, due to that setting, the connection from http:// to https://)
Source: NextCloud won’t load any mixed content – support – Nextcloud community
Fixing “mixed content” errors when using a proxy
‘overwritecondaddr’ => ‘^555\\.555\\.555\\.555$’,
Source: Fixing “mixed content” errors when using a proxy – howto – Nextcloud community