Maksym Prokopov
Personal blog powered by a passion for technology.

Chrome Command Palette in Dev Tools

05.10.2025

I was today years old when I learned about Cmd + Shift + p command palette in Google Chrome.

Why you might need it?

To enable dark mode emulation!

Adding PDF previews to ActionText with ActiveStorage

15.09.2025

Rails is a great framework, once you stop thinking in Java patterns and embraice DHH way of writing web apps.

Interestingly, Basecamp uses exactly the same ActiveStorage implementation, but shows full-size and download links alone with the PDF attachment. But if you only follow the guide, it’s hard to implement by your own without some gotchas.

These gotchas I want to capture here in this how-to article. It assumes reader followed official guide and stuck with PDF thumbnails preview implementation.

PDF Previews

For download and view full-size links, standard template should be improved.

Create views/active_storage/preview/_blob.html.erb

<figure class="attachment attachment--<%= blob.representable? ? "preview" : "file" %> attachment--<%= blob.filename.extension %>">
  <% if blob.representable? %>
  <%= image_tag blob.representation(resize_to_limit: local_assigns[:in_gallery] ? [ 800, 600 ] : [ 1024, 768 ]) %>
  <% end %>

  <figcaption class="attachment__caption">
    <% if caption = blob.try(:caption) %>
    <%= caption %>
    <% else %>
    <span class="attachment__name"><%= blob.filename %></span>
    <span class="attachment__size"><%= number_to_human_size blob.byte_size %></span>
    <span class="attachment__attribute attachment__attribute--download">
      <%= link_to 'View full-size', rails_blob_path(blob), target: '_blank' %>
    </span>
    <span class="attachment__attribute attachment__attribute--download">
      <%= link_to 'Download', rails_blob_path(blob, disposition: "attachment"), target: '_blank' %>
    </span>
    <% end %>
  </figcaption>
</figure>

Dockerfile

Official documentation mentions Poppler project as a dependency.

So, don’t forget to install poppler-utils in Dockerfile

RUN apt-get update --fix-missing -qq && apt-get install -y build-essential nodejs libcurl4 git-core \
    libxml2-dev libmariadb-dev imagemagick libyaml-dev poppler-utils

For macOS it’s as simple as brew install poppler

ApplicationController

in application controller include SetCurrent concern, to enable local disk support.

  include ActiveStorage::SetCurrent

During the deployment, if you use Amazon S3, it’s important to set CORS policy, otherwise the preview will fail

Mailer Previews

In mailer preview, the helper rails_blob_path can’t be found, so let’s address it with the full path

Rails.application.routes.url_helpers.rails_blob_path(blob)

End snippet is

<figure class="attachment attachment--<%= blob.representable? ? "preview" : "file" %> attachment--<%= blob.filename.extension %>">
    <% if blob.representable? %>
        <%= image_tag blob.representation(resize_to_limit: local_assigns[:in_gallery] ? [ 800, 600 ] : [ 1024, 768 ]).processed.url %>
  <% end %>

  <figcaption class="attachment__caption">
    <% if caption = blob.try(:caption) %>
      <%= caption %>
    <% else %>
      <span class="attachment__name"><%= blob.filename %></span>
      <span class="attachment__size"><%= number_to_human_size blob.byte_size %></span>
      <span class="attachment__attribute attachment__attribute--download">
          <%= link_to 'View full-size', Rails.application.routes.url_helpers.rails_blob_path(blob) %>
      </span>
      <span class="attachment__attribute attachment__attribute--download">
          <%= link_to 'Download', Rails.application.routes.url_helpers.rails_blob_path(blob, disposition: "attachment") %>
      </span>
    <% end %>
  </figcaption>
</figure>

CORS configuration

[
    {
        "AllowedHeaders": [
            "Origin",
            "Content-Type",
            "Content-MD5",
            "Content-Disposition"
        ],
        "AllowedMethods": [
            "PUT"
        ],
        "AllowedOrigins": [
            "*.it-premium.internal"
        ],
        "ExposeHeaders": [
            "Access-Control-Allow-Origin"
        ]
    }
]

Stop writing data migrations

15.09.2025

As many of us, I was writing data migrations as a part of database schema migrations.

Why that’s a bad practice, and what’s the better way to do this.

  1. Your data migration typically comes along with changes to schema. Do you have the data migration together with schema migration?
  2. If your data processing fails in the middle of migration, what’s the way to resume it?
  3. Do you ever need it again? I.e. does it make sense to keep this migration in migrations history?

If you tick at least two checks, congrats, you don’t have to keep data migrations with schema migrations. Just write a script, execute it and throw away!

Example for Rails migration

The task is to add rich texts replacing some plain text fields.

Migration from the plain text fields to rich text fields with ActiveText. How?

  1. Create a migration to add action_text_rich_texts table.
  2. Create a migration to rename old column containing plain text to the field prefixed with old_
  3. Write a rake task to convert the data from old column to the new place.
  4. Write a migration to remove old content after everything went smooth

Steps 1-2-3 are done within a single new PR. Once the schema is in the new state, rake tasks can be executed for data movement.

The subsequent PR just tears down old fields and voila.

Vanilla Rails is Enough

06.09.2025

Argh, some things I should have learned earlier!

One of these is this brilliant blog post Vanilla Rails is plenty couldn’t have bigger influence on me. Believe me or not, I wrote Rails wrong since 2007 🤦‍♂️.

Here is the list of gems i’m ditching out of my Rails projects.

- knockout-rails
- paloma
- simple-form
- rails-timeago
- carrierwave
- resque
- resque-web
- resque-scheduler
-- we are here --
- devise
- haml
- factory-bot
- rspec
- bower-rails
- sprockets
- google-visualr
- recurring-select
- select2-rails
- pundit

adding a few

- solid_queue
- mission-control_jobs
- local-time

Get GitHub Teams CLI Snippet

17.07.2025

GitHub CLI is a nice way to query GitHub API locally

gh api orgs/<org>/teams | jq '.[] | {name,slug}'

Travel Time and Date in Rails Console

28.06.2025

Usage

include ActiveSupport::Testing::TimeHelpers

travel_to 2.days.ago

Legacy Rails project and modern Assets Pipeline

22.05.2025

One of the projects I’ve started a long-long time ago still powers the business. It was quite a journey starting from Rails 2, than Rails 3 and so on up until currently Rails 7 with plans to bump to Rails 8.

The project has live updates with Server Sent Events and a sidecar microservice to keep the connections and push updates. Quite similar to what DHH have done with ActiveCable, but based on different stack.

Here is a list of technologies, thanks to browser backward compatibility, still works:

  • KnockoutJS framework (outdated)
  • JQuery (outdated)
  • Metro CSS 2 (outdated)
  • Coffeescript (outdated)
  • HAML (discouraged to use)
  • Paloma (outdated)
  • Lot’s of jQuery plugins: continuousCalendar,dataTables, timeago, moment, gritter, pivotTable

The Javascript and SCSS got bundled together using sprockets gem.

It’s definitely time to move on.

But, rewriting the whole project would have been a mistake! https://www.joelonsoftware.com/2000/04/06/things-you-should-never-do-part-i/

The current state of the art in Rails community and in version 8 is

  • Stimulus
  • Turbo (provides frames on steroids)
  • Importmap, no more bundling for assets!
  • Propshaft instead of sprockets.

The scale of the problem with the transition towards the new stack without major rewrite was clear after the whole was spent trying to play legacy stuff like jQuery nicely with importmap.

Woah! Somebody should have told me, there is fundamental incompatibility with ES6 modules style and legacy “no style” Javascript.

Long story short, the proper combination is to ADD importmap gem to the existing codebase, WITHOUT trying to convert all existing scripts in one shot.

Only after adding importmap + stimulus + turbo it’s time to refactor small pieces one-by-one, carefully removing the old Javascript code.

It worth noting, you might have to rename existing application.js to app.js to avoid clashes in importmaps vs sprockets. Other significant aspect, is to turn off Turbo for the entire site and enable it only on certain pieces.

import { Application } from "@hotwired/stimulus"
import "@hotwired/turbo-rails"

// gradually enable turbo
Turbo.session.drive = false

and activate somewhere

<div data-turbo="true">
...
</div>

So far, the difference in complexity is huge! The same functionality is by far easier to do with turbo-stream elements coming from backend, than juggling data with calls to a separate API Engine (!) with JSON output.

The rewrite is still in progress, but the foot is definitely in the door.

Other gotchas

turbo-frame vs turbo-stream

The difficulty is, the both tags intendend to replace parts of the page dynamically, but it’s not immediately clear what tag to use when.

Here is my rule of thumb.

Use turbo-frame for updating single parts and splitting a parts of a page into deferred loading.

Use turbo-stream to update parts of the page from ActiveCable or when you need to updates several parts of the page at the same time.

Nice use case, you could add the whole controller template as “turbo-stream” type. In this example it’s a contents of show.turvbo-stream.erb file

<%= turbo_stream.update :employeeDetails do %>
    <%= render 'employee', employee: @employee %>
<% end %>

<%= turbo_stream.update :clientDetails do %>
    <%= render 'client', client: @client %>
<% end %>

<%= turbo_stream.update :lastEmployeeTickets do %>
    <div class="new_ticket-header"><%= t 'Last5EmployeeTickets' %></div>
    <%= render 'tickets', tickets: @employee_tickets %>
<% end %>

<%= turbo_stream.update :lastClientTickets do %>
    <div class="new_ticket-header"><%= t 'OpenClientTickets', name: @client.name %></div>
    <%= render 'tickets', tickets: @client_open_tickets %>
<% end %>

<%= turbo_stream.update :subscribers do %>
    <%= render 'subscribers', subscribers: @subscribers %>
<% end %>

Most valuable experience on how to connect and use Stimulus was from reading https://once.com/writebook source code.

Hosting for Static Assets

05.04.2025

I lived on GitHub Pages for static hosting for a long time. For example, this blog been hosted as https://mprokopov.github.io for years, just with the custom domain https://prokopov.me

But last week I finally moved everything to CloudFlare Pages and quite happy about it!

The major driver for the change was a hassle of management github-pages. It’s either your have to keep everything in a separate branch, with the name like github-pages, or have to use completly different repository. I chose the latter, and for a long time kept using two repositories, one with Hugo sources, second with rendered HTML. It was a bit painful to manage two git repositories in the same working tree, hugo build renders the website to the public folder. In addition, the repository with HTML should be public.

Options for free or almost free static hosting

AWS S3

Another option for static hosting is AWS S3, but the problem, it’s very inefficient without having AWS CloudFront in front of S3, slow and costly. Adding AWS CloudFront adds to burden of infra management.

Google Firebase Hosting

One more option is a Google Firebase Hosting, that includes free hosting. It’s nice, but the downside, setting up authentication for gcloud is a hassle.

CloudFlare Pages

Last week I decided to check what’s going on with CloudFlare, and it turns out they have a very generous offer on CloudFront Pages. Setting up GitHub Actions was as easy as adding this snippet

    - name: Deploy to CloudFlare
      uses: cloudflare/wrangler-action@v3
      with:
        apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
        accountId: <account-id>
        command: pages deploy . --project-name=<project-name>
        workingDirectory: public

And it works like a charm!

As the follow-up, Cloudflare Pages support even better integration with GitHub via GitHub App and allows to have a dedicated previews, which is for content with approval workflows is a very nice addition!

Terraform with CloudFlare

Nice part about infrastructure as a code, now it’s repeatable! I can add a new hosting just by adding a new terragrunt module in no time.

Example of terraform module. Also, DNS entry should be changed to CloudFlare provided CNAME for the website.

resource "cloudflare_pages_project" "main" {
  name = var.project_name
  account_id = var.account_id
  production_branch = var.production_branch
}

resource "cloudflare_pages_domain" "main" {
  account_id = var.account_id
  project_name = var.project_name
  domain = var.domain

  depends_on = [
    cloudflare_pages_project.main
  ]
}

Summary

It was a good decision!

  • I deleted two repositories with static assets from GitHub, decreasing the carbon footprint 🤣
  • Removed complexity of managing two git repositories instead of one
  • Automated provisioning of the Cloud Flare Pages project with Terraform.

Ghostty Remap Cmd to Control under macOS

02.04.2025

We all love the fast software. Ghostty is crazy fast.

What I use with my macos keyboard comes from Emacs. Namely, Cmd + <modifier> instead of Control + <modifier> for navigation in shell. Jump to a beginning of line, Cmd + a , to the end of line Cmd + e

Why?

  1. Because my macOS keyboard doesn’t have TWO Ctrl keys on both sides.
  2. Try to compare ctrl-a vs cmd-a yourself 😀

Here is an example of a config extracted from this discussion.

keybind = cmd+a=text:\x01
keybind = cmd+b=text:\x02
keybind = cmd+c=text:\x03
keybind = cmd+d=text:\x04
keybind = cmd+e=text:\x05
keybind = cmd+f=text:\x06
keybind = cmd+g=text:\x07
keybind = cmd+h=text:\x08
keybind = cmd+i=text:\x09
keybind = cmd+j=text:\x0A
keybind = cmd+k=text:\x0B
keybind = cmd+l=text:\x0C
keybind = cmd+m=text:\x0D
keybind = cmd+n=text:\x0E
keybind = cmd+o=text:\x0F
keybind = cmd+p=text:\x10
keybind = cmd+q=text:\x11
keybind = cmd+r=text:\x12
keybind = cmd+s=text:\x13
# Cmd+t creates a new tab in ghostty
# keybind = cmd+t=text:\x14
keybind = cmd+u=text:\x15
# I'm using cmd+y with paste from macos
# keybind = cmd+v=text:\x16
keybind = cmd+w=text:\x17
keybind = cmd+x=text:\x18
keybind = cmd+y=text:\x19
keybind = cmd+z=text:\x1A
theme = AtomOneLight

It’s much better than using Karabiner Elements, as it doesn’t hijack your Cmd+Tab combination from OS.

In case anyone wonders why you might want to remap modifier keys, here’s the reason: Historically, PCs followed traditional Unix terminals in making the Control keys significant for frequent UI interaction. The first Macintoshes didn’t even have Control keys! It was added later, primarily for uncommon modifiers, secondary mouse clicks, and compatibility. Macs, instead, use the Command ⌘ key for most shortcuts, mirroring the functionality of Ctrl on PCs (e.g., Save is Ctrl+S on PC and Command-S on Mac). As a result, the frequently used Command keys have a prominent location on Mac-only keyboards, just as Control keys are central on PC and Unix keyboards.

On Windows, you’ll stay on the Control keys for all shortcuts, and your Terminal emulator will just work. On Mac, you’ll be using the Command keys for all OS shortcuts, and then in Terminal emulators you must switch to Control instead. This is a little uncomfortable on Apple keyboards since Control is off to one side, but you can manage. Globally remapping Caps Lock to Control is common for seasoned Mac users. 😊 However, these differences can be especially awkward for users switching regularly or transitioning between Mac and Windows, since you’ll have to fight your muscle memory to perform common operations. When using external (“mechanical”) keyboards, this becomes even more of a problem, especially ergonomic keyboards where certain keys are much easier to reach than others.

For me, this creates the perfect storm. I work professionally across Mac, Windows, and Linux, and I rely on fancy ergonomic keyboards to keep my hands from hurting. iTerm2’s functionality to remap the modifiers only in the Terminal window is crucial, allowing me to have consistent OS and Terminal shortcuts, and work comfortably, despite platform differences.

Trigger Jenkins job on EC2 termination event

24.03.2025

Example of the Python code to catch EC2 termination signal and ping Jenkins to run termination job. Useful to execute graceful shutdown if you’re using EC2 spot instaces.

You will need Jenkins Generic Webhook plugin.

import json
import boto3
import urllib3
import os

JENKINS_JOB_TOKEN =  os.environ.get('JENKINS_TOKEN')
JENKINS_URL =  os.environ.get('JENKINS_URL')

def invoke_jenkins(target):
    http = urllib3.PoolManager()
    return http.request('POST', f"{JENKINS_URL}/generic-webhook-trigger/invoke?instance={target}", headers={'Authorization': f"Bearer {JENKINS_JOB_TOKEN}"})

def find_target(instance_id):
    ec2 = boto3.client("ec2")
    tags = ec2.describe_tags(Filters=[{'Name': 'resource-id', 'Values': [instance_id]}])

    for tag in tags['Tags']:
     if tag['Key'] == "Name":
        return tag['Value']

def lambda_handler(event, context):
    instance_id = event["detail"]["instance-id"]

    target = find_target(instance_id)

    if not target:
        return {
            'statusCode': 422,
            'body': f"target for {instance_id} not found"
        }

    print(f"Jenkins termination job called for instance: {instance_id} target {target}")

    resp = invoke_jenkins(target)

    print(f"Jenkins response status {resp.status}")
    print(f"Jenkins decoded response")
    print(resp.data.decode('utf-8'))

    return {
        'statusCode': resp.status,
        'body': json.dumps(resp.data.decode('utf-8'))
    }

HashiCorp Nomad reschedule a Job

22.03.2025

HashiCorp Nomad Job

It’s often the job increases retry counter, but there is no time to waste after the root cause of failing job being removed.

Here is the way to enforce re-run of the job. Unfortunately, I couldn’t find any means to achieve the same from the UI

nomad job eval -force-reschedule rundeck

On interpreter and dependenencies management problem

02.03.2025

The problem

The problem of interpreter and dependency management is quite common, but also challenging.

  1. Appliations sometimes are written using interpreted languages. Examples: brew in Ruby, ansible in Python.
  2. Software development. For instance, mainstream AI development requires Python.

In order to run they always need two things:

  • Interpreter
  • Dependencies

This boils down to the following problems. How to download and keep interpreters of different versions? How to download, keep and manage dependencies? How to include or not to include the interpreter and dependencies into a distribution?

Combined problems represent a “reproducible build” problem, which is, simply speaking, “works on my machine” statement when something went wrong.

Interpreter management

Here is the idea of using a PATH variable. When you enter a command to the shell, it checks every directory in PATH variable, this means you can manipulate it, and add the directory containing the interpreter to the PATH dynamically. Want ruby version 3.3.3? No problem, download, build, add to the PATH and use it. It’s common practice to automate PATH management, for example rbenv checks for the file .ruby-version in the folder, and automatically adjusts PATH to include the proper directory with the corresponding interpreter.

It makes a bit more complicated if you use IDEs, they typically offer some built-in support for PATH management that may differ. Just keep in mind, PATH in shell and PATH in your editor depends on how you run the application.

Dependency management

Historically, dependency management was a separate problem from interpreter management. Though, some tools often try to target both cases.

For the interpreted language it means also solving a sub-problem of transient dependencies.

Why is the dependency management a problem at all? Just download the source of a library, copy it to somewhere so your app should find it when runs. Done.

The trade-off is typically is either to reuse the same dependencies, or to keep a copy. And the second big issue is how to update those. Keeping in mind, different libraries can depend on the same sources but different (maybe incompatible) versions.

Example of duplication, you may have heard about size of node_modules folder? pnpm tries to address this problem. Flip, Maven with Java ecosystem puts dependencies to .m2 folder and reuses them as much as possible.

Distribution management

Size is used to be the major trade-off here. But with the time and hardware evolution the direction has changed.

The hardware grows in capacity, storage and also networks became fast and capable. It’s often that the distribution includes entire Chrome browser and all dependencies packed together. For all platforms.

Vagrant influence

Before docker gained it’s popularity, using virtual machines for isolation also during the development was a common thing. Among the downsides can be named heavy resource requirements, slowness and difficulties with managing changes.

Docker influence

Interesting enough, but docker itself solves a problem of isolation. This means, you don’t need to support different versions of interpreters and libraries in the same system.

Docker image should contain only one version of interpreter and only one set of dependencies.

Though, with the raise of the idea of using docker container for developement, I often see tools for interpreter management also being a part of the docker image. Such as in devcontainers.

Nix influence

Another attempt to solve the problem of a “reproducible build” for all languages and dependencies in one shot is Nix or NixOS.

Nix represents a tools with own configuration language and packages for majority of languages and packages. Often associated with certain complexity, but highly worthy for investing efforts.


Python

  • pip
  • venv
  • pipenv
  • uv
  • conda

Ruby

  • rvm
  • rbenv
  • chruby
  • bundler

Java

  • maven
  • gradle

Clojure

  • leininghen
  • deps.edn

Node

  • nvm
  • npm
  • yarn
  • pnpm
  • bun

PHP

  • composer

Go

  • go mod

Generalised solutions

  • asdf
  • Nix

GitHub Markdown preview with Grip and UV

01.03.2025

It’s common task to prepare README.me, but how to check the preview?

If you use uv, the fastest way is to use grip like this

Use this oneliner in the folder with markdown and open browser with http://localhost:6419 address

uv run --with grip -m grip

which is the same as

uv tool run grip

or even shorter

uvx grip

How to Use Model Control Protocol with Claude AI to work with your private data

23.02.2025

Learn how to access and work with your private data using Large Language Models with Model Control Protocol.

Cloud Cost Management aka FinOps

06.02.2025

Cloud Cost Management, or FinOps is tricky. Imagine Team A started consuming much more resources and the management just starts seeing hair-pulling consequences at the end of the month in AWS bill.

How to react fast and prevent unnecessary cost? Or become very restrictive by blocking spinning up a new resources w/o explicit management approval, this can slow down and progress and also can be catastrophic for the company.

What to do?

Introduce FinOps process, namely, start attributing cloud costs for every resources to a cost center, which is typically a team or department.

Use infrastructure as a code and try to avoid any manual manipulations from the console.

Automate infrastructure as a code repository with tools like InfraCost, that will give you cost estimation on the new resources to simplify decision making and/or budgeting.

Use cost anomaly detection provided by the cloud vendor to react on cost changes quickly with investigation.

Make costs information visible and accessible by creating dashboards and using certain third-party applications for this purpose.

And let the cost control be with you.

Ordinary day in a Life of DevOps

10.01.2025
  • Bumped Backstage dependencies with migration to the new backend system.
  • Okta authentication (with wildcard sign-in)
  • Building a roadmap for an engineering team
  • Troubleshooting Unifi WiFi connectivity issues for the network with 12 access points and 200+ roaming clients.

Hardware

  • Bought Meta Quest 3 Games: Underdogs, Assassin Creed Nexus, Batman Arkham.

Playground

  • Model Control Protocol Server for the own ledger system
  • Developed several Python modules with UV package manager.
  • Tested V0 generation.
  • Tested NextJS docker container.
  • Tested blog with NextJS and Strapi.
  • Played with Svelte and SvelteKit.

What makes Starlink so remarkable?

28.12.2024

Using sattelites for internet communications is not a genuinely new idea. Number of companies provided such services before Starlink.

starlink sattelite

But the key difference between previous generation solutions is the latency.

The problem is, 600ms for a signal to travel almost 35700km to a sattelite and back is a lot. No gaming or realtime communication is feasible with such a delay.

The only way to decrease the lattency is to position sattelites at lower altitude. This is why Starlink sattelites fly between 340km and 1200km above the surface. Giving us incredible 30ms latency even in remotest regions of Earth.

Though, there are lots of challenges to overcome. To be able to cover same ground area, much more sattelites are needed. Also, the average lifespan of the sattelites drops to 5-7 years vs 15-20 years for “normal” sattelites because of much harder conditions. This means sattelite production and delivery to the orbit should be very good from the unit economics perspective.

This is where reusable rockets and Space X comes into play. As well as experience with cost effective mass-production on Tesla factories. 🏭

Also, transit and termination of the traffic requires state-of-art dynamic routing and effective inter-sattelite communications.

The project itself is a true miracle, providing humanity with unseen capabilities.

2024 Tech in Review

22.12.2024

2024 was definitely a year of AI

  • ChatGPT
  • Claude

models are top-notch and I found myself using them a lot.

Editors

IMHO, the editors w/o tight AI integration will fade away at some point.

Cursor is an editor with most notable integration with AI API, allows to have nice interactions with code suggestions from LLM.

Another notable example is NeoVIM. This year I’ve invested a lot into making baby steps with nvim. Probably, the easiest way to start is by using NVChad, a curated set of plugins. I used to use vim a lot back in the days with Ruby on Rails development and I liked the experience back then. NeoVIM makes integration of a lot of tools a breeze with LUA. It was interesting to discover Clojure dialect of LUA - Fennel. Fennel can be used to write extensions for NeoVIM as well. DHH is moved away from macOS to Linux and his new tech stack includes NeoVIM with curated configs gathered in a tool “Omakub”. I clearly see this trend to build platform-like utilities. For example, once - is a command line tool used to deliver updates to the standalone applications, like WriteBook.

Moldable Development

Both things intended to create a tools for developer to streamline the process.

Notably, both languages powering the technologies: Lisp and SmallTalk are not much in use by the industry.

Self-hosted tools.

Writebook - self-hosted free replacement for Confluence from 37 Signals. Yet, not adopted widely.

Emacs with vim keybindings and without

This year I’ve conducted an experiment switching doom Emacs to normal Emacs keybindings using Cmd instead of Ctrl button

Diagrams as a code

  • Structurizr
  • Mermaid

It’s still hard to use mermaid diagrams as a code with Obsidian.

Obsidian vs LogSeq

Obsidian clearly wins with the ease of working with UI. Great mobile application makes it standing out.

This year I started paying for LogSeq, since it has issues with offloading org files and therefore, search and all this stuff.

Obsidian somehow knows how to overcome these limits.

Deployment and container orchestration

Hashicorp Nomad is still my favourite for container orchestration. This year I played with service mesh by Consul Connect with CNI integration.

I’m still not very convinced if it’s worth the hassle in my case. It adds complexity for sure, but also adds a layer of security and observability.

Cable Management

07.12.2024

Cable Management is an interesting topic for me, as my passion towards tech gadgets encourages spending some money during black friday on something fascinating. Typically, it’s one of the “next one more thing”.

Creating a distraction free space is crucial for creativity. Cluttered space creates tention, hindering the productivity. It’s so important to keep the place nicely organized!

Here is a couple of cable management solutions I tried at my home.

Magnetic cable organizer by Anker

  • Magnetic pieces attached to the cables
  • Magnetic plank sticked to the surface

Dissadvantages:

  • Depends on the size of the cable, the attached part can slide over to another end, making the use complicated

Non-magnetic cable organizer by noname

  • Doesn’t require anything extra

Cable ties for binding together

  • Simple
  • Just works
  • You likely need more of these

Cable ties for storage

  • Good for storing cables organized
  • Perfect for packaging for travel

What helps you to stay organized and unclutter the space?

Digitalisation in action

06.12.2024

Jokes aside, how to properly deprecate a technology?

One of the greatest talks from Rich Hickey was about making changes to software systems. Search for it with “Spec-ulation” keyword in Youtube.

Long story short, you may break or not break the system by removing something like class or function or by changing a function signature (read: parameters), changing in this context means you remove the old function with the same name and add a new one with different parameters.

The problem here, you don’t know what may call your functions. If you find the way to do this analysis, it reveals a way to safely drop unneeded parts of the code without risk of breaking the system. Which is typically very hard to achieve.

Another way to completely avoid this problem, is to accrete the code instead of removing, i.e. only by adding a new stuff without removing old. For example, you have function with the name callApi, just add a new function callApi2.

The world is little bit more complicated, and we face exactly this problem in different contexts all the time. What you see in the pic is just yet another example, in reality it’s still a problem with no simple solution.

Should a code be readable by human?

05.12.2024

Little known fact about SmallTalk programming language.

The code written in SmallTalk should be able to be read aloud and it should make sense to a human.

This principle was championed by Alan Kay, along with the Smalltalk development team at Xerox PARC, during the 1970s.

The emphasis on human readability aligns with the vision of “programming as communication between humans and machines” rather than just issuing commands to computers. Alan Kay believed that programming languages should be clear, expressive, and close to natural human thought processes.

What do you think, was it a good idea?

Hashicorp Waypoint

11.10.2024

Waypoint is a tool by Hashicorp to manage builds, artifacts and deployments.

It has a CLI interface and also a nice UI and uses HCL instead of YAML for configuration and templating.

Introduction

It might not be needed if you have something like GitHub Actions and may felt redundant, but actually it's a kind of missing piece for having a good UI for CI/CD pipelines, as it gives a handy tool for a developer to streamline build/deploy/release process.

I'm personally a big fan of Hashicorp products, like Terraform, Consul, Vault, Vagrant, Nomad and Packer. Not a big surprise, that they decided to tackle the build process as well and create a smooth developer experience by wrapping everything from build to release into one handy utility. The whole idea is close to the GitHub CLI with private GitHub Runner on your machine + ArgoCD CLI, all in one package with nice UI.

Prerequisites

You certainly will need a waypoint.hcl to start.

waypoint init

Builds and Articats

I.e. you can see a list of artifacts and trigger a build process of the new artifact right on your machine. The artifact is pushed to the artifact storage after the build is complete. It's typically some sort of docker registry, AWS ECR is also a supported option.

Starting a build is as easy as executing

waypoint build

waypoint-build.png

After the build is complete, you can see one in the list of the builds

waypoint-build-ui.png

Deployment

The deployment is an act of bringing your artifact to the target environment. It's run by the same simple command.

waypoint deploy

waypoint-deploy.png

Release

The release for a website means switching from the old version to the new version of the deployed artifact and it can be done in a different ways. Typically switching to the new artifact is done with the help of the change in the load balancer configuration, that simply starts routing the traffic to the newly deployed artifact.

Sometimes it's a part of the deployment process, sometimes it's a part of the promotion step.

waypoint release

waypoint-release.png

Observe

The UI give a nice ability to observe resources (running artifacts on the target environment), inspect logs and connect to the container shell to interact with the application.

waypoint-project.png

Summary

This would look like a missing piece of any software release lifecycle with the good CLI interface as well as the UI. Though, I found the deployment of the server part to the Nomad cluster quite challenging.

P.S.

Unfortunately, after the aquisition of Hashicorp by IBM the community version of this wonderful product has been killed and only cloud one in HCP is available, but now it's a very different product.

RIP Waypoint on Jan 8, 2024 https://github.com/hashicorp/waypoint/

Deployment process with Hashicorp Nomad

14.07.2024

As, probably, many of you, I did a long journey from manual FTP sync, to semi-automated tools like Capistrano, then manually managed docker deployments, then anisble managed docker containers and finally, met the orchestration system of choice - Hashicorp Nomad.

TLDR: Kubernetes is too heavy for my moderate needs. Hashicorp Nomad strikes the right balance between features and maintenance complexity.

At some point in time I felt a need for better container orchestration system that I could run by myself in Hetzner. Funny enough, DHH and Co. came to the same conclusion, but implemented in a different way. They developed completely own version of ansible on steroids named Kamal. This has right for existence, but imho has own flaws, like manual nodes management for fault tolerance and challenge to keep versions of deployed artifacts in sync. The push based deployment always suffers from this. People were trying to solve this issues already for quite a long time by using systems like Chef of Puppet.

The modern world is all about containers. But what options do we have for orchestration? Kubernetes. Apache Mesos. Docker Swarm. Every option requires quite extensive knowledge just to maintain it.

This is what happens when I merge to the main branch.

github-deployment-flow.png
GitHub Deployment Flow

And my workflow looks like this

  docker:
    needs: version
    uses: ./.github/workflows/build.yml
    with:
      tag: ${{ needs.version.outputs.version }}

  deploy-staging:
    needs: [version, docker]
    uses: ./.github/workflows/deploy.yml
    with:
      tag: ${{ needs.version.outputs.version }}
      environment: staging

  deploy-production:
    needs: [version, docker, deploy-staging]
    uses: ./.github/workflows/deploy.yml
    with:
      tag: ${{ needs.version.outputs.version }}
      environment: production

Deploy to Hashicorp Nomad snippet

name: Deploy
on:
  workflow_call:
    inputs:
      tag:
        required: true
        default: ${{ github.sha }}
        type: string
      environment:
        required: true
        default: staging
        type: string
jobs:
  deploy:
    runs-on: self-hosted
    environment: ${{inputs.environment}}
    concurrency: ${{inputs.environment}}
    steps:
      - name: Deploy with Nomad
        env:
          REGISTRY: <registry>.dkr.ecr.eu-central-1.amazonaws.com
          REPOSITORY: <myapp>
          IMAGE_TAG: ${{ inputs.tag }}
        run: |
          nomad run -var='version=${{ inputs.tag }}' deployment/${{ inputs.environment }}.nomad.hcl          

This is it! I fond of simplicity and power of the HCL language for the configuration. It also integrated with Hashicorp Vault out of the box, so my secrets provisioning looks like this.

{{- with secret "instances/data/adminka/database" }}
DATABASE_URL="mysql2://{{ .Data.data.username }}:{{ .Data.data.password }}@{{ .Data.data.host }}/{{ .Data.data.name }}"
{{- end }}

Service discovery with Hashicorp Consul is just built-in! It lives in the same HCL config file.

{{ range service "production.prometheus-adminka-exporter" }}
PROMETHEUS_EXPORTER_ENABLE=true

PROMETHEUS_EXPORTER_HOST={{ .Address }}
PROMETHEUS_EXPORTER_PORT={{ .Port }}
{{ end }}

For my ephemeral environments I have the HCL configuration that also brings me mysql and redis containers. When the application starts, init container is responsible for creation of DB schema and populating the ephemeral database with sample data using seeds screept.

nomad2.png

The whole deployment to ephemeral environment I've just described takes 44s. Less than a minute to setup: MySQL 8, Redis, Sphinx Search and populate with the sample data (every run with new data!). After the PR is closed, the ephemeral environment is gone as well.

nomad1.png

nomad3.png
Nomad topology management

What makes Hashicorp Nomad so powerful?

  • Easy to start. It's really just a single binary!
  • Integration with Hashicorp Consul for service discovery
  • Integration with Hashicorp Vault for secrets management
  • Traefik is excellent option for load balancing integrated through Consul
  • HCL configuration language is what powers Terraform. Way better than YAML!
  • It's not only for Docker containers, same concepts to deploy and run bare Java jars.

P.S. One of the thing I discovered to be particulary challenging is to spin up containers with restiq for backups, the nodes with necessary volumes can be full, therefore the container just can't be spined up. For now monitoring somehow saves , but a good solution yet to be found.

Sustainable Ruby on Rails in 2024

30.06.2024

Rubu on Rails development changes a lot every year and sometimes it's not easy to keep up with the changes.

I've recently bought Sustainable Rails Book and it's hard to overestimate how valuable is it for me.

Here are couple of thoughts after reading first chapters.

  • Invest in developer friendly application bootstrap process. Running bin/setup and bin/dev should be enough to run on the new blank developer machine.
  • Move business logic out of fat controllers and fat models. Extract it and move to Service Objects. Fan-in and fan-out is a fancy metrics to estimate how object relate to each other. Simply speaking the most referred dependencies should be simple enough and thoroughly tested.
  • Keep routing.rb as canonical as possible. Avoid nesting routes whenever the resources don't represent tight coupling. Rely on resources instead of custom crafter routes. Tip: use :only [:create] to reduce the scope.

CI/CD process

Dare to add, invest heavily in CI/CD process, with modern GitHub offering it's just way easier then maintaining own on-prem solution.

At the moment I've shifted from own Drone.io and Jenkins to GitHub Actions and self-hosted runner for Continuous Integration and to Hashicorp Nomad for Continuous Deployment.

I'll try to carve up time to describe a bit more the process of deployment.

Security

I've added the following gems:

  • brakeman
  • bundle-audit

And enjoy output of the audit.

brakeman.png
Brakeman
bundler-audit.png
Bundler Audit

Local setup

My setup is quite complicated, Rails application requires:

  • MySQL server
  • Redis
  • Resque + Resque Web UI
  • Sphinx with Thinking Sphinx gem for full-text search
  • Custom built server for server sent events (something similar to Action Cable)

bin/dev uses Procfile to bring up web server workers, search daemon and Resque UI.

bin/setup creates blank database and populates with seeds, so the app is ready to run after this step.

Devcontainers

I've also tested devcontainers and they work quite good with VSCode.

Unfortunately for Emacs I found several downsides, namely

  • It's hard to integrate with rubocop
  • Hard to jump into container, as it requires PATH setup, and eshell doesn't shine here
  • chruby that I use instead of rbenv doesn't work

I also admit, VSCode brings some extra nifties not available or hard to implement in Emacs, like GitHub Actions integration.

devcontainers-vscode.png
VSCode with devcontainers
devcontainers-orbstack.png
Orbstack with devcontainers

It's hard to switch fully from Emacs to VSCode and I keep using both for different use cases.

IDEs

I'm mostly using Emacs, but VSCode recently is on the table as well. Both have their strong sides.

Emacs

Git in Emacs - Magit still bringe unbeatable git experience. org-mode is a thing, almost jupyther labs for the supported languages.

emacs-magit.png

VSCode

Though, VSCode integration with GitHub Actions and LSP with Rubocop and Ruby makes development more joyful.

  • Devcontainer support is a small miracle.
  • Command pallete mimics Meta-X functionality from Emacs.
githubactions-vscode.png

Emacs For Beginners

10.05.2024

The article provides overview of facts why Emacs is so different but also so powerful comparing to other editors. It gives a good starting point for the reader to understand the fundamentals and start own journey to effective work.

The way of learning is painful, but rewarding. The essense of Emacs is to codify your specific repetitive tasks so that eventually you realize, the editor contains a lot of customizations speeding up your daily routines, as no other editor does.

I do the following things in Emacs:

  • Coding in following languages: Ruby (Ruby on Rails), Python, Clojure, Javascript, TypeScript
  • Writing Terraform and Nomad configuration with HCL
  • Blogging in Hugo and deploying to production
  • Using Kubernetes via TUI
  • Writing diary
  • Book keeping
  • Planning my life/projects/tasks

First of all, Emacs is a runtime environment with a set of named functions you can call any time. Use Meta-x key combination to spawn a list of “interactive” functions. There are more functions, but only those who marked as interactive supposed to be in this list.

Functions are written in a dialect of Lisp, so called emacs-lisp. If you want one sentence definition of lisp, here it is. First argument in a brackets is a function name, the rest is its arguments. Example

(+ 1 2)

In this example + is a function name, 1 and 2 are the arguments. The output is 3. Yeah, this is it. Emacs can execute a freshly written function on the fly.

Every time you hit a keystroke in Emacs you call a function. Even for a cursor movement. There is an easy way to find what function is bound to a keystroke by using C-h k followed by the keystroke. Remarkable feature is a documentation for any function is only C-h f away. This makes Emacs exploration a breeze.

An opened file is called a buffer. Depending on the file type, Emacs loads automatically a set of functions and key bindings to those functions. This is called a mode. Also how the content of the buffer is highlighted is defined in the “mode”. A set of functions, syntax highlighting and keybindings is called a major mode.

Whenever you switch between buffers, Emacs also switches the major mode depending on the selected buffer.

There are different modes for different purposes. Sometimes you want to share the same functionality across different types of buffers, so what you typically have in opened buffer is a mixture of different “modes”. A set of shared functions with keybindings is called a minor mode.

A package is a way to distribute such modes. Other editors call this a “plug-in”. There are repositories for the packages, such as MELPA. In case you want to install a new package, hit Meta-X and call the function list-packages-list.

Despite you can install packages and change settings manually, among the best practices is to keep Emacs configuration as a code. This is why you might find many “dotemacs“ repositories with configuration of other users in internet. It’s always a great source of insights of how other people use Emacs.

Typically users start their journey with popular packages and a standard or community-driven configuration, but with the time they recognize own repetitive tasks and create their own functions and assign them own keybindings. In this way they end up having an editor naturally fitting their workflows, saving significant amount of time every day.

Though, the learning curve is quite steep and there are good reasons for this. Emacs lisp is not so popular as Javascript or Python. The naming is always hard and is a something that is not easy to change over time. Other editors don’t use the same terminology as packages, buffers, modes, frames and windows. The syntax highlighting using regexps is a quite outdated technology nowadays. Even regexp library has a very special syntax from what users got used to. Another big issue is a combination of packages can be fragile, it’s a very common case when a package after update can break functionality of other packages.

Even key modifiers are named differently from other editors: Meta, Hyper, Super. My personal take on default keybindings - they’re aweful and RSI prone. Once you realize the Control key supposed to be a key closest to the spacebar, as it was designed for Space Cadet keyboards (it had also Meta, Hyper and Super keys), it became obvious how to make Emacs usage much more wrist friendly. Just do the same on your keyboard, map the control key to whatever key you have closest to the spacebar, in my case it’s cmd on mac keyboard.

Summary

In essence Emacs is an editing environment with set of functions, variables, syntax highlighting and keybindings.

Bare Emacs is not so feature reach, but packages ecosystem provides a good foundation for any type of everyday tasks and some of those are unmatched in another editors.

The real power comes after user learns enough fundamentals to start customizing Emacs to perform repetitive tasks faster.

Though, the learning curve can be steep for different reasons and it’s strongly advised to change default keybindings to improve ergonomic.

Ansible Use Cases

27.03.2024

While Ansible is a great tool for certain use cases, such as building new AMIs when used with Packer, it has some downsides. These become apparent when using it for container orchestration (which I have witnessed at scale) or keeping the configuration of a set of nodes in sync.

Another significant, though not dramatic, downside is related to Python version and dependency management. This adds extra complexity that I would prefer to avoid in a system management tool.

Compliance as a Code

27.03.2024

Recently, I stumbled upon a concept that sounded new to me: Compliance as a Code.

The core idea is to “embed compliance policies into the code that can be repeated and tested automatically.” But what does it mean in practice?

For example, consider PCI DSS, which requires measures to secure credit card information to ensure compliance. Tools like Terraform, Ansible, and others should contain the code for encryption, access control, and data obfuscation. Additionally, before deployment, automated tests in the CI/CD pipeline should validate that the application meets PCI DSS requirements.

Palettro - VSCode like command palette in any macOS application

26.03.2024

Short video with overview of Palettro, small utility that brings VSCode like navigation to any macOS application to boost your productivity.

SRE Simplified - Error Budget

25.03.2024

SRE Simplified : Error Budget concept.

The concept of Error Budget is useful for setting up alerts of different severity. This video explains in extremely simplified manner how it works.

SRE Simplified - Service Level Agreement

17.03.2024

The next issue of SRE Simplified is about Service Level Agreement.

Service Level Agreement is an agreement between service supplier and a customer about what the target quality of the service is and what are the consequences if the promise is broken.

But the challenge here is to eastablish monitoring and alerting.

This video provides very simplified example of an SLA for the company that produces apples.

Document Title

SRE Simplified - Introduction

10.03.2024

What are the SRE concepts, like Service Level Agreement and Reliability?

The challenge is to explain it in simplified manner, without deep discussions on different monitoring strategies.

In this first video I tried to just to scratch the surface.

Wireguard VPN Overview

02.02.2024

WireGuard is a relatively new protocol. It claims to be greatly simplified and faster comparing to alternatives, it uses UDP as primary transport and encapsulates encrypted traffic from IP layer. Let's investigate if it's true!

Some differences help to stand out of other VPN solutions:

  • Routing as a part of Peer configuration
  • QR code for simplified configuration using camera on mobile devices. iPhone, iPad and other things, you'll love it!
  • Site-to-site or client-to-server connections are not very different from the configuration perspective
  • Supports DNS as part of configuration for Peer
  • Easy to implement routing for all traffic or for only for selected networks

I was able to connect Mikrotik, FrtizBox 6690, macos, iPad and iPhone using WireGuard with little efforts.

Concepts

Virtual Network Interface. Peers configuration. Private key.

Peers configuration

WireGuard uses the table of peers of the folliwing structure

Routed network per peer

It can be even just a single host, or the whole subnet

Public key of the peer

The peer is either single client or router for the subnet

Private key

You don't distribute this part. Private key is used to decrypt traffic that was encrypted using public key. Therefore we put public key as a part of configuration to every distributable peer config.

Configuration

In order to understand how to create config, let's try to understand what happends on the interface.

What happends on server

  1. Virtual network interface of the server (wireguard) accepts a packet for routing.
  2. It checks if the destination for packet is among Peers section of config.
  3. If the peer is defined, the packet is encrypted using peer public key and sent to remote address of the client.
  4. To accept the packet the client should be connected to server. For this client uses "Endpoint" section of the config. It contains IP and Port of the server.

What happends on client

  1. Client received the packet on its virtual interface.
  2. The packet is encrypted using public key of this client, so it tries to decrypt it using own private key.
  3. If succeeds, continues with routing, i.e. sends to other destinations packet designated to connected subnet.

What is required for config

So it becomes apparent what to do.

  • We need to exchange public keys for server and client.

Configuration for client should contain server public key. Configuration for server should contain client public key.

  • Address of client subnet should be specified on server in the peer section.
  • Client should contain Endpoint - IP:Port of the server

Mikrotik

Mikrotik is supported from version 7 of RouterOS.

./mikrotik.png

Fritzbox 6699

./fritzbox.png

How to suppress alerts in Prometheus for non-working hours

24.01.2024

When it comes to the topic how Prometheus and Alertmanager work together and how to restrict alert notification to fire only on working hours, typicall solution is to apply workaround to avaluated alert rule expession like this

and ON() (hour() < 19 and hour() > 8) and ON() (day_of_week() > 0 and day_of_week() < 6)

The full example of such rule is the following

  - alert: DummyWorkhoursAlert
    expr: 1 and ON() (hour() < 19 and hour() > 8) and ON() (day_of_week() > 0 and day_of_week() < 6)
    for: 5m
    annotations:
      identifier: "{{ $labels.exporter }}/{{ $labels.queue }}"
      summary: "Buyerportal: Dummy alert for working hours {{ $labels.queue }}"
      description: "* don't do anything, dummy alert *"

But the proper solution is to apply mute_time_intervals, as per example below

time_intervals:
  - name: offhours
    time_intervals:
    # Monday to Friday 18:00-8:00
    - weekdays: ['monday:friday']
      times:
      - start_time: '16:00'
        end_time: '23:59'
      - start_time: '00:00'
        end_time: '08:00'
      location: "Europe/Berlin"
    - weekdays: ['saturday', 'sunday']
      location: "Europe/Berlin"

route:
  receiver: slack-monitoring
  group_interval: 5m
  repeat_interval: 24h
  routes:
    - matchers:
        - team = buyers
        - severity = 24x7
      receiver: slack-team-buyers
    - matchers:
        - team = buyers
        - severity = workhours
      mute_time_intervals:
        - offhours
      receiver: slack-team-buyers

And the rule starts having extra label "severity": workhours

  - alert: DummyWorkhoursAlert
    expr: 1
    for: 5m
    annotations:
      identifier: "{{ $labels.exporter }}/{{ $labels.queue }}"
      summary: "Buyerportal: Dummy alert for working hours {{ $labels.queue }}"
      description: "* don't do anything, dummy alert *"
    labels:
      severity: workhours
      team: buyers

Blogging using Emacs with org-mode and Hugo

17.01.2024

I use org-mode extensively with org-roam for keeping my knowledge and journals together and working as my brain dump destination. This blog serves kinda the same purpose, so why not to combine these things under Emacs umbrella?

Blogging from Emacs boils down to two options.

TLDR; Hugo can render org file natively, but support of features is quite limited, or use org as source that rendered to markdown. The latter brings issues of content syncing from origin to end result.

screenshot-org-hugo.png

Write posts as org files

I faced the issue of not being able to render index.org as a section from folder. Apart from this all works. Front matter example is

#+title: My Title
#+date: 2023-01-19
#+slug: my-slug
#+tags[]: howto, emacs, hugo
#+draft: true

Adding properties section in front of org file breaks front matter.

:PROPERTIES:
:ID:       00c94cae-b64a-4cdf-81d1-248b2a42b7b7
:END:
#+title: My Title
#+date: 2023-01-19
#+slug: my-slug
#+tags[]: howto, emacs, hugo
This example not going to work and break date parsing

Export org files to markdown

ox-hugo transforms org file to markdown, which, in turn got natively rendered by Hugo.

But this intruduces another problem of keeping everything in sync AKA having "single source of truth".

What are the benefits of using org files?

These are not many, but significant for me. One of the examples is so called Literate programming. The idea is the same as in jupyter notebook, but right inside your editor.

Literate programming

I can execute code right in the middle of the text.

literate.png
Screenshot
2+2
This is the ruby code
4
Result of execution
(+ 2 2)
Clojure code
4
Evaluation of the Clojure code

References

Using Org Mode in Hugo describes how "native" rendering by Hugo works.

My blogging setup with Emacs and Org Mode · Andrey Listopadov example of blog management using export to markdown technique.

Outro

At the end feel free to mix and match. You can use both formats, just write one post in Org and another in Markdown.

Install Ruby 3.1.4 on macOS

29.08.2023

In case ruby can’t find OpenSSL 3 headers, use this way.

brew install ruby-install
ruby-install ruby 3.1.4 -- --with-openssl-dir=$(brew --prefix openssl)

CloudFlare Tunnel Terraform

15.07.2023

How to provision CloudFlare tunnel using Terraform

CloudFlare Tunnel can be useful to use reliable alternative to ngrok when you need to expose your application running locally to the outside world.

The following example exposes my application locally running on port 3000 to the Internet on the hostname https://app.prokopov.me

Prerequisites

How does it work?

  1. cloudflared CLI is an agent running locally and connected to CloudFlare cloud.
  2. DNS record of type CNAME is created, pointing to the CloudFlare cloud.
  3. CloudFlare does the routing magic!

Terraform part

resource "cloudflare_tunnel" "main" {
  account_id = "777414c2d4e87234087ebac4685e7df6"
  name       = "tunnel-to-app"
  secret     = random_id.main.b64_std
}

resource "cloudflare_tunnel_config" "main" {
  account_id = "777414c2d4e87234087ebac4685e7df6"
  tunnel_id  = cloudflare_tunnel.main.id

  config {
    warp_routing {
      enabled = true
    }
    ingress_rule {
      hostname = "app.prokopov.me"
      service  = "http://localhost:3000"
    }
    ingress_rule {
      service = "http_status:404"
    }
  }
}

resource "cloudflare_record" "main" {
  value   = "${cloudflare_tunnel.main.id}.cfargotunnel.com"
  proxied = true
  name    = "app"
  type    = "CNAME"
  zone_id = cloudflare_zone.main.id
}

Local tunnel part

  1. Find generated token for resource cloudflare_tunnel.main
TOKEN=$(terraform show -json | jq -r '.values.root_module.resources[] | select(.address=="cloudflare_tunnel.main").values.tunnel_token')
  1. Use token
cloudflared tunnel run --token=${TOKEN} tunnel-to-app

Mikrotik Terraform

03.04.2023

It is in general very good idea to manage infra configuration as a code. Unfortunately, Mirkotik terrafrom support is basic, as OSS driven.

Nevertheless, I appreciate author for effors.

Here is an example how to use it with Hashicorp Vault.

Commands

export VAULT_ADDR=http://vault_address:8200
export VAULT_TOKEN=<token>
terraform init
terraform plan

Example

main.tf

provider "vault" {}

data "vault_generic_secret" "main" {
  path = "common/mikrotik/nexus-home"
}

provider "mikrotik" {
  host           = data.vault_generic_secret.main.data["address"]  # Or set MIKROTIK_HOST environment variable
  username       = data.vault_generic_secret.main.data["username"] # Or set MIKROTIK_USER environment variable
  password       = data.vault_generic_secret.main.data["password"] # Or set MIKROTIK_PASSWORD environment variable
  tls            = false                                           # Or set MIKROTIK_TLS environment variable
  ca_certificate = "/path/to/ca/certificate.pem"                   # Or set MIKROTIK_CA_CERTIFICATE environment variable
  insecure       = true                                            # Or set MIKROTIK_INSECURE environment variable
}

// /ip address
// :put [find where address="192.168.88.1/24"]
// *1

// terraform import mikrotik_ip_address.lan '*1'
resource "mikrotik_ip_address" "lan" {
  address   = "192.168.88.1/24"
  comment   = "LAN Network"
  interface = "ether2"
}

// uncomment on release https://github.com/ddelnano/terraform-provider-mikrotik
# resource "mikrotik_firewall_filter_rule" "https" {
#   action             = "accept"
#   chain              = "forward"
#   comment            = "Web access to local HTTP server"
#   connection_state   = ["new"]
#   dst_port           = "443"
#   in_interface       = "ether1"
#   in_interface_list  = "local_lan"
#   out_interface_list = "ether3"
#   protocol           = "tcp"
# }

terraform.tf

terraform {
  required_providers {
    mikrotik = {
      source  = "ddelnano/mikrotik"
      version = "0.10.0"
    }
  }
}

Group Greeting

17.03.2023

There are lots of options to greet collegue or close ones with cards.

This one was recommended by one of the coworkers.

Group Greeting Cards

The things impressed me recently

24.02.2023

Impressive things and points of interest

Self-Improvement

https://theholisticpsychologist.com/ - mental self-healing of issues from the Past

Technologies assessment

https://www.nomadproject.io/ - K8s is not only one option for container orchestration. Looks good!

https://www.boundaryproject.io/ - Remote access management from Hashicorp

https://www.ambient.run/ - WebAssembly Game engine targeting browsers

https://www.playstation.com/de-de/ps-vr2/ - New Sony VR2 headset.

Technology adoption

https://docs.docker.com/build/buildkit/ Docker buildkit and it’s advanced caching techniques.

Coffee

How to Fix DeLonghi Grinder issues https://www.youtube.com/watch?v=f5m071Lk0JY&t=16s

Other

https://www.tolls.eu/ - Single app for all tolls payment across Europe.

Why is IT support so hard

18.09.2022

As the IT support business we want to keep our users happy, they need to use the software with no interruptions. Though the share of the incidents in the tickets is still 30% no matter what.

So why is IT support is so hard these days? Why do we still have the incidents despite all the progress IT industry did so far?

Long story short this is because of the software complexity, that causes incidents and security issues.

Let’s discuss here why do we still have incidents, and what to do to decrease their likelihood and improve our users happiness.

Planning is hard

Normally IT department has two types of work - planned and unplanned. Planned are mostly projects and requests for changes.

Unplanned work consists of incidents. An incident with big impact sucks out resources. Unplanned work disrupts work rythm, increases anxiety and leads to burnouts.

So unplanned work should be avoided as much as possible.

Incident impacts planned work

Definition of the incident is when something doesn’t work as expected, i.e. either it doesn’t work what was inteded to work, or it works with degraded quiality.

Normally incoming incident has more high priority than planned work, therefore it affects the schedule of the planned work.

So why do we still have incidents?

For a number of reasons with the leading one. Growing complexity.

Increased application state complexity

Combinatoric burst of the system state complexity. “Reboot your system” - this means to recreate the application state from scratch. This is because right now your system is in the state that wasn’t foreseen by the application developers.

If you have lots of applications set on the system for support, there is no way to ensure all applications will collaborate nicely since they share the same system components and no one conducted testing for such cases.

You are a tester.

Increased software complexity

Increased software complexity leads to incidents.

In order to be competitive on the market vendors forced to add new features. Large codebases lead to the little understanding of the all parts of the application and their interconnections. Increased complexity, in turn, leads to bugs.

Applications use shared system resources

Docker tries to address this issue and isolate all parts of the system from applications, but there is no such thing as docker for UI rich applications so far.

This is why we have raise of the Chromium based web applications pretending to be native (Slack, etc.). Which is greate waste of resources and fallback from progress industry made so far.

Viruses exploit this concept in a hard way.

Security issues

Software industry demand for workforce is huge. So we have a big wave of newcomers with no or little experience.

Normally PRs are reviewed by senior developers, but sometimes I personally witnessed cases when PR from junior developer for whatever reasons was approved by another junior developer. And here we go, bad code landed the base with possibly new security hole.

Cost cutting and outsourcing also normally do not increase the quality of the software they produce. Moreover this effect present even in critical things, remember Boeing issues with 787?

Windows 7 or Windows XP still exist, and they don’t receive security updates.

Unstable environment

Networks are unreliable, think about WiFi in a crowded space. Disks have limited lifespan. Batteries loose capacity.

What to do?

Split planned work and unplanned work to the separate teams. If not possible, then develop on-call schedule with rotation. This aspecially effective for small teams.

Reduce amount of supported applications on the user workstation.

Prefer running web applications over native applications. Use Gmail, not Microsoft Outlook.

Prefer running applications using terminal access, Citrix, etc.

Harden security measures. Use the rule of thumb to provide as less access to the sytems as needed. Perform security audits from time to time.

Provide users with standardized hardware and software.

Perform automates security updates.

Things I Learned

15.08.2022

Things I Learned

Git push with force from the command line

git push --force origin master
git push -f origin master
git push origin +master

Make your git life a bit easier

git config --global push.autoSetupRemote true

Check DNS from the inside of docker container

This is super useful when you don’t have neither dig nor nslookup utilities inside your docker container.

getent hosts google.com

Emacs, apple keyboard, and RSI

07.06.2022

Recently I’ve started investigation on the most effective shortcuts for Emacs. Already for a long time I’ve been using Caps Lock remapped to Esc when pressed alone, and Ctrl-Key when pressed with any other key.

I didn’t use Emacs with native bindings for a long time, because of wrist related issues, which immediately appeared after using pinky for pressing long chords which normally included Ctrl-C combination. This is why I used Spacemacs and later Doom Emacs as the configuration of choice.

And this worked relatively good, I used the same bindings for Vim in terminal, and no RSI since pinky wasn’t overloaded with long presses. But something were not so good, I needed to keep a context in the head and using special modes like eshell or repl weren’t fun because of context switch losses.

So I’ve started reading the book Mastering Emacs, which I definitely recommend, I decided to give a try to alternative solutions for Emacs keybindings.

First of which were using interesting combinations for the keychords like pressing J+K equals to Control and pressing F+D equals to control. The idea was to reduce pressure on pinky by moving control to the “home” row. This worked to some extent. Long combinations with Ctrl, like “C-c C-o C-r” needed to have very uncomfortable key sequences. Apart from this constant typos where annoying, when you switched keys too fast. So I dropped this option and started looking for new ways.

I realised, that Ctrl should not be pressed by pinky, it should be just convenient enough to reach. Then I saw old design of the Space Kadet keyboard, and it had Control right near the Space key.

Space Cadet keyboard

Whan I swapped Command and Control keys, man, that was real enlightenment, literally everything started being comfortable. Look, Ctrl-x-s is just a single row. Ctrl-c feels natural, because you literally use mighty thumb and index fingers. Movement with Ctrl-a, Ctrl-e, Ctrl-n and Ctrl-p just started having much more sence and convenience. Most of the Emacs combinations with Ctrl-C and Ctrl-X are sane now.

It comes as a bonus using readline compatible utilities in terminal.

I really think swapping Caps Lock and Control is a BAD advice that did enourmous harm for neglecting Emacs than anything else. Either Windows based keyboards having Alt, or Mac based keyboards having Command, should be swapped with Control at least in Emacs and other readline applications. Do this right now using Karabiner Elements free application for MacOS and never experience any RSI.

Using Karabiner Elements you can make this change only for the several applications, like Emacs and iTerm, and not the system-wide.

Update:

In order to remap command to control you don’t event need Karabiner Element, just map command to control using the following snippet

(setq ns-modifier-command 'control)

In iTerm it’s also easy to do, open

Preferences -> Keys -> Remap modifiers

and change the settings. One more trick is how to switch between apps from iTerm using Cmd+Tab when it’s remapped?

Here is how to do this https://gitlab.com/gnachman/iterm2/-/issues/6394

You can add exceptions to keyboard remapping, but it’s not very intuitive. Add a key mapping to Prefs > Keys. First, select the action Do Not Remap Modifiers. Then set the shortcut to Cmd-Tab (by pressing the physical cmd key plus tab).

RSI stands for repetitive stain injury https://www.nhs.uk/conditions/repetitive-strain-injury-rsi/

SRE concepts

07.11.2021

Update: I added several key things recently after started implementing SRE concepts in Billie.

Site Reliability Engineering makes sense only if you bothered with Reliability. It doesn’t bring you much value if the most significant thing at current stage is delivering new features, say in recently founded startup this is probably not a good time to start with SRE.

SRE is a way to balance between the product Stability (Reliability) and Changes you’re going to make to the product, as changes are the most frequent root cause of the bad events. The core concept is when your changes breaking your product too much, you probably need to stop delivering these to the production and focus on stability. In order to switch the focus timely, you need to establish and track stability metrics. Also you need to define steps you going to take when stability promise to users about to be broken.

Let me share my thought after completing this superuseful SRE Course.

You need to make several steps to consider SRE path.

  1. Think what makes user unhappy using your services.
  2. Decide on metrics that reflects user happiness and start gathering it.
  3. Create plans on how to maintain the service level target and policies describing what you going to do when situation become dangerous to achieving your availability targets.
  4. Create plans for improve these metrics.
  5. Act, measure, reflect, improve.

Little bit clarity on abbreviations those used by google guys.

SLA - service level agreement. This is the service perception boundary you shouldn’t cross. When user considers your service as bad, you didn’t match his expectations, so either you didn’t set proper expectations or you breached your promise on the service quality.

SLO - service level objectives. Same as SLA, but this is only internal promise and compass to meet user expectations, and this is a bit more tight because we don’t want to dissapoint user by breaching SLA.

SLI - service level indicator shows how you meet user expectation in some point in time. Normally this is ratio of good events to all valid events in some period of time.

How these relate to each other? Let me describe this in this little mantra.

We measure SLIs, which shouldn’t breach SLOs not to disappoint users by breaking SLAs.

How much does it cost to change driving license in Germany?

02.11.2021

I moved to Germany from Ukraine in March 2020, so I was able to use my driving license only for half a year. So I applied to driving courses in Emmendingen instead of ones in Freiburg as they have russian speaking teachers and it was a bit less tricky to get an appointment there.

Anyway, it took me more than a year (probably w/o Corona it would be a bit faster) to get my new shiny German driver license.

Here is my costs breakdown:

  • 20-Nov-12 25.00 EUR Registration fee
  • 20-Dec-22 150.00 EUR Contract with Driving school + driving school app access
  • 21-Apr-08 65.00 EUR First aid course
  • 21-Apr-08 55.00 EUR Translate my Ukrainian driving license at ADAC
  • 21-Jul-01 43.90 EUR State fee to issue new driving license
  • 21-Sep-23 80.00 EUR Theory exam at TÜV
  • 21-Oct-29 80.00 EUR Theory exam at TÜV (I failed my first attempt)
  • 21-Nov-22 63.33 EUR Driving lesson
  • 21-Dec-01 63.33 EUR Driving lesson
  • 21-Dec-02 120 EUR TÜV exam fee
  • 21-Dec-02 120 EUR Driving school exam fee

Total: 865.56 EUR

What would I do differently to speed up if I knew everything in advance?

  1. Get contract with driving school as soon as possible. This is a must to apply for a driving license at authorities.
  2. Eyes test and driver license translation in parallel.
  3. First aid course in parallel.
  4. Good mobile app for theory training is crucial. The app I used sucked.
  5. Sometimes it’s better to check German original. Example: Kraftfahrzeuge is not the same as translated “транспортные средства”, as this doesn’t include, for example, bicycle.

2021 week 29

17.07.2021

Oxid API coding days - settings management solution

23.04.2021

Recently Oxid has presented the GraphQL API support and announced a hackathon-like event.

This experience was really refreshing and interesting. Having tight timeframe and some task in hand it was challenging to distribute efforts and get in sync with participants.

Our team had to deliver unified settings management solution like Google Chrome or Firefox has for numerous different things.

The implementation was quite straightforward: implement GraphQL endpoints to expose settings as a query and filter everything on frontend side. Also mutation endpoint to be provided by the API.

Backend Repository

Frontend Repository

I was responsible for the frontend part and used React with GraphQL-hooks library. For the styling I have chosen famous material-ui library.

Most of my frustration was related to not working basic hooks in React! And it turned out to be React 17 problem, so after downgrading to React 16 everything started working smooth. The second hard part was to call mutations with parameters that were rendered on server! This concept was not clear from the beginning as this was my first experience with graphql implementation.

settings

More interesting discoveries for me were two services which I was not aware of.

https://Miro.com - Tool for managing drafts and tasks around the product for the rapid prototyping.

https://workadventu.re/ - A game-like environment for the conferences when you can join different rooms and participate in meetings. Very interesting experience. Also available as a source code https://github.com/thecodingmachine/workadventure.

At the end we had delivered what was announced, apart from login to admin.

Late binding

13.04.2021

Late binding is a very precious idea.

Example:

Say, you have a docker image someone decided to use for the development. One created a huge bundle with all tools, bells, and whistles.

As time passes and you try to use it and then you miserably fail. Dependencies don’t met requirements anymore, most of the tools are outdated and should be bumped to newer version, initial SQL data has been changed and etc.

Configs are hidden and manipulated in docker image, composer.json is outside and you end up starring at this pile of crap.

How to avoid this?

Here is the recipe.

Use so called the unix way by splitting tools apart and combine again into some custom pipeline. Think about makefile, or shell script that assembles required steps together.

Divide things into composable steps and make binding of everything together as late as possible.

Say in the example above you should split single docker image into a bunch of smaller ones, preferrably official, i.e. supported by someone else. The benefits follow: no need to rebuild the whole thing every time, no need to have huge depencencies in one place: python, rust, dev libs, you name it.

This is quite common principle you actually can and probably should apply everywhere.

Example:

Java and modules classpath. Spring framework and dependency injection. Using old plain Makefile allows you to explicitly specify depencencies.

https://en.wikipedia.org/wiki/Late_binding

Linkedin, what are you doing? Stop it!

08.04.2021

Recently I’ve checked this website and styling became really aweful. After my digging it turned out one little busty thing was doing the crap.

Official Linkedin badge! Overrides default link styling!

<script type='text/javascript' src='https://platform.linkedin.com/badges/js/profile.js' async defer ></script>

The easiest way to turn it off is to change type=‘text/javascript’ to just ’text’.

You have also been decreasing my lighthouse score. Bye-bye little nasty thing.

On Datomic dark sides

07.04.2021

I love datomic. Datalog is a definitely something noteworthy and even if you never going to use it in your projects, still it is worth getting your hands dirty. Despite all Datomic bright sides, there are some thoughts bothering me since I started using it more extensively in my pet project.

Here they are:

Confusion on datomic peer and client libraries differences

I used to use datomic-pro api in my project and wanted to catch “anomaly exceptions” from Pedestal error handlers. That was not an easy task. It simply didn’t work in the manner I expected from the datomic code examples.

If you try to execute

(d/transact conn {:tx-data [[:this "does not" :make "sense"]]})

using peer library you’ll get

1. Caused by datomic.impl.Exceptions$IllegalArgumentExceptionInfo
   :db.error/not-a-data-function Unable to resolve data function: :this
   {:cognitect.anomalies/category :cognitect.anomalies/incorrect,
    :cognitect.anomalies/message "Unable to resolve data function: :this",
    :db/error :db.error/not-a-data-function}
                 error.clj:  167  datomic.error/deserialize-exception
                 error.clj:  160  datomic.error/deserialize-exception
                  peer.clj:  379  datomic.peer.Connection/notify_error
             connector.clj:  155  datomic.connector/fn
             connector.clj:  153  datomic.connector/fn
              MultiFn.java:  234  clojure.lang.MultiFn/invoke
             connector.clj:  180  datomic.connector/create-hornet-notifier/fn/fn/fn/fn
             connector.clj:  175  datomic.connector/create-hornet-notifier/fn/fn/fn
             connector.clj:  173  datomic.connector/create-hornet-notifier/fn/fn
                  core.clj: 2030  clojure.core/binding-conveyor-fn/fn
                  AFn.java:   18  clojure.lang.AFn/call
           FutureTask.java:  266  java.util.concurrent.FutureTask/run
   ThreadPoolExecutor.java: 1149  java.util.concurrent.ThreadPoolExecutor/runWorker
   ThreadPoolExecutor.java:  624  java.util.concurrent.ThreadPoolExecutor$Worker/run
               Thread.java:  748  java.lang.Thread/run
(ex-data *e)

#:clojure.error{:phase :print-eval-result}

And this is what you get from datomic client api library using peer. So exceptions here are actually wrapped in ex-data info.

1. Unhandled clojure.lang.ExceptionInfo
   Unable to resolve data function: :this
   {:cognitect.anomalies/category :cognitect.anomalies/incorrect,
    :cognitect.anomalies/message "Unable to resolve data function: :this",
    :db/error :db.error/not-a-data-function,
    :dbs
    [{:database-id "datomic:dev://localhost:4334/login",
      :t 1016,
      :next-t 1017,
      :history false}]}
                 async.clj:   58  datomic.client.api.async/ares
                 async.clj:   54  datomic.client.api.async/ares
                  sync.clj:  104  datomic.client.api.sync/eval11528/fn
             protocols.clj:   72  datomic.client.api.protocols/fn/G
                   api.clj:  200  datomic.client.api/transact
                   api.clj:  183  datomic.client.api/transact
                      REPL:  816  stock-login.service/eval35091
                      REPL:  816  stock-login.service/eval35091
             Compiler.java: 7181  clojure.lang.Compiler/eval
             Compiler.java: 7136  clojure.lang.Compiler/eval
                  core.clj: 3202  clojure.core/eval
                  core.clj: 3198  clojure.core/eval
    interruptible_eval.clj:   87  nrepl.middleware.interruptible-eval/evaluate/fn/fn
                  AFn.java:  152  clojure.lang.AFn/applyToHelper
                  AFn.java:  144  clojure.lang.AFn/applyTo
                  core.clj:  667  clojure.core/apply
                  core.clj: 1977  clojure.core/with-bindings*
                  core.clj: 1977  clojure.core/with-bindings*
               RestFn.java:  425  clojure.lang.RestFn/invoke
    interruptible_eval.clj:   87  nrepl.middleware.interruptible-eval/evaluate/fn
                  main.clj:  437  clojure.main/repl/read-eval-print/fn
                  main.clj:  437  clojure.main/repl/read-eval-print
                  main.clj:  458  clojure.main/repl/fn
                  main.clj:  458  clojure.main/repl
                  main.clj:  368  clojure.main/repl
               RestFn.java:  137  clojure.lang.RestFn/applyTo
                  core.clj:  667  clojure.core/apply
                  core.clj:  662  clojure.core/apply
                regrow.clj:   20  refactor-nrepl.ns.slam.hound.regrow/wrap-clojure-repl/fn
               RestFn.java: 1523  clojure.lang.RestFn/invoke
    interruptible_eval.clj:   84  nrepl.middleware.interruptible-eval/evaluate
    interruptible_eval.clj:   56  nrepl.middleware.interruptible-eval/evaluate
    interruptible_eval.clj:  152  nrepl.middleware.interruptible-eval/interruptible-eval/fn/fn
                  AFn.java:   22  clojure.lang.AFn/run
               session.clj:  202  nrepl.middleware.session/session-exec/main-loop/fn
               session.clj:  201  nrepl.middleware.session/session-exec/main-loop
                  AFn.java:   22  clojure.lang.AFn/run
               Thread.java:  748  java.lang.Thread/run

here is ex-data of the exception. This is much more analysable!

(ex-data *e)
{:cognitect.anomalies/category :cognitect.anomalies/incorrect,
 :cognitect.anomalies/message "Unable to resolve data function: :this",
 :db/error :db.error/not-a-data-function,
 :dbs
 [{:database-id "datomic:dev://localhost:4334/login",
   :t 1016,
   :next-t 1017,
   :history false}]}

Okay, so I need to use client library. That increases the complexity by having to have application server in form of running peer. I understand that was totally required by datomic cloud implementation, but is it really required for me now?

Here is an excerpt on the datomic client library rationale.

Datomic’s peer library puts database query in your own application process. This provides several benefits, but at the price of a heavier dependency (both in code and in memory requirements) than a traditional client.

A smaller footprint is useful in environments that have operational limitations, or where processes are small or short-lived. The new Datomic client API addresses this need. Lightweight clients connect to Peer Servers, which are peers that run in a separate address space.

Existing peers are unchanged, and you can mix and match peer and client applications as you see fit within the same Datomic install. Clients and peers are described in detail in the new clients and peers section of the docs.

Source: https://blog.datomic.com/2016/11/datomic-update-client-api-unlimited.html

Feature parity between datomic peer api and datomic client api library

I found the following discrepancies:

  • d/squiid is not supported, use (java.util.UUID/randomUUID) instead
  • d/touch is not supported, use d/pull with ‘[*]
  • only find-rel is supported within :find clause! Say I can’t execute [?e …] anymore

So I’m really in doubts if the investments to moving to client libary worth all the hassle in my case.

Some more tough usecases for me

“Rollback” transaction.

There is no easy way to rollback transaction, but there is some opportunity instead. The recommended way to do this is following. Search datomic history for required txs, select all entities that was affected by tx and “reverse” them by adding fourth :add parameter to complement value.

Hard to pick proper abstractions

Well, I spent a lot of time reading official sources and other people’s code. Most prominent of these, namely: mbrainz importer examples, vase sources. First, I have to admit that I have no idea how people can produce something like mbrainz async importer by themselves. TBH, I can hardly understand what’s going on there and how could I come up with the same implementation.

Some people doing Datomic.Entity passing as function return values, some just raw values from the d/q.

What worked well for me is to return raw entity ids from the find functions, then when required I’m able to execute pull function against returned values.

The same goes to db/ident that one tries to use as enums. Aspecially within tests you constantly trying to use :db/ident with example values to easiely reference in test checks, but at the same time your function for the prod data will return just :db/id. Example of what I use in tests

{:db/ident :my-test-account
 :account/id (d/squiid)
 :account/balance 10}

so you can use just (d/entity db :my-test-account). But this is not the case for the code that will probably return :db/id instead.

I’ve found a useful snippet to address this problem

(defprotocol Eid
  (e [_]))

(extend-protocol Eid
  java.lang.Long
  (e [n] n)

  clojure.lang.Keyword
  (e [n] n)

  datomic.Entity
  (e [ent] (:db/id ent)))

I also created the following function to flatten returned from the pull expression nested db/ident.

(defn flatten-ident [coll]
  (clojure.walk/postwalk
   (fn [item] (get item :db/ident item)) coll))

Testing

Some good examples on datomic boilerplate for testing I have found in vase repository and adopted like this

(def ^:dynamic *current-db-connection* nil)
(def ^:dynamic *current-db-uri* nil)

(defn new-database
  "This generates a new, empty Datomic database for use within unit tests."
  [txes]
  (let [uri  (str "datomic:mem://test" (UUID/randomUUID))
        _    (d/create-database uri)
        conn (d/connect uri)]
    (->> (read-string (slurp "schema.edn"))
         (d/transact conn)
         deref)
    (doseq [t txes]
      @(d/transact conn t))
    {:uri uri
     :connection conn}))

(defmacro with-database
  "Executes all requests in the body with the same database."
  [txes & body]
  `(let [dbm# (new-database ~txes)]
     (binding [*current-db-uri* (:uri dbm#)
               *current-db-connection* (:connection dbm#)]
       ~@body)))

I found using with-database macro with txs is much more convenient and such as having better data locality then using fixtures.

Specs and generative testing

I feel like it should naturally fall into the spec paradigm and it should be really piece of cake to generate data for testing. But in my case I didn’t succeed with this. I couldn’t even grasp how to generate simple albums-players relation using spec/gen.

Examples are still hard to understand and follow.

Pagination and limit.

Despite datomic client support of :offset and :limit there is recommended way to do such a thing using index-pull. That requires more efforts to comprehend simple tasks.

Pull functions

Well, I faced a good amount of WTF’s to try to understand how db functions work. Simple example with xform.

The fn is either a fully qualified function allowed under the :xforms key in resources/datomic/extensions.edn, or one of the following built-ins:

Documentation was so succint, so I spent quite good amount of time to find at least one example of extensions.edn and where to keep it. So it should be located at /resources/datomic/extensions.edn with such a content

{:xforms [mynamespace/xform]}

then you should have xform function in your namespace

(namespace mynamespace)
(defn xform [x] (str "xformed: " x))

I was thinking about usecase when you need some translations, say I keep my currency amounts in cents and want to translate to float using currency minor unit. I didn’t manage to do this with xforms.

Diagram tooling

There are not so many diagramming tools to use with Datomic at the moment. Here is the list of known ones to me

Both were not working for me using instructions from respective READMEs.

Here is my example repo with some issues fixed for datomic pro.

Not clear when to use db.cardinality/many

So documentation says you don’t have to decide when to use many or one relation between entities, as they automatically accessible using underscore notation.

That is not 100% true. If you decide to generate sample data using generators, most probably using db.cardinality/many will be a better choice for you.

Summary

I know, the reason for my frustration is that technology is relatively new, not so many great examples on how to use it and best practices are a bit fuzzy. But most probably the root cause is my lack of experience. The amount of novelty coming with such a technology is overhelming for me. Almost literally every step required efforts to google around, how other people tend to use it. The simplicty you get gives you much power, but at the same time great responsibility on decisions you make. I had to rewrite couple of times significant part of the backend to verify ideas and what decisions turned to be the best.

Probably, it will work better for you then it was for me, so don’t give up.

Smalltalk and its descedants

27.03.2021

The Smalltalk is an extraordinary language. Firstly, this is a mother of all OOP family languages. Secondly, Java was invented as alternative for payed (sic!) programming language Smalltalk, and if IBM won the race with Microsoft a that time, things might end up very differently and Smalltalk could still be a hype.

Initially I’ve been exposed to Ruby, but only with Smalltalk I finally grasp lot’s of ideas in Ruby, so as the roots of the syntax.

No public properties

Smalltalk doesn’t have public properties at all. Though it does have getters and setters with quite the same name as the field itself. So you don’t write anything like setName, getName.

Thus you don’t have any of issues with decisions like: should I declare this variable as private, or more fancy, protected? Everything is just private, that’s it. Other objects can’t have any access to the internals apart from what is available with methods .Smalltalk even doesn’t have a syntax to access the property variable. That’s simple.

Assume you have a class Human.

call getter name value of Human

Human name.

call setter name with value

Human name: "The one".

No positional arguments for functions.

There is no such thing as positional arguments for the methods. Either one argument or named many. Nothing else. Super easy.

Function 1

Human take: "The second".

Function 2

Human take: "The second" flag: True.

This can’t be implemented clearly with Java. You will have to have a single function that takes flag with default value. So then you forced to check it later in the code.

Lisp has this property by having different bodies for different sets of arguments for the same function.

common approach to default values: initialized in getter

history
	^ history ifNil: [ history := OrderedCollection new ]

See this ifNil: method? It accepts the block, which is namely anonymous function and executes it when the target object is nil. ^ is just a return.

Every object contains ifNil method, so this getter pattern allows concise object initialization.

No if statement

Well, this is true. What you should use instead is the ifTrue: ifFalse: method with arguments one for positive, second for negative predicate and they accept anonymous functions. Everything is an object, right? so boolean operation produces Boolean object that has ifTrue: ifFalse: method that accept code blocks.

predicate ifTrue: [do this] ifFalse: [do that]

Subsequent call feature

Smalltalk has a very concise syntax, but for returning the object it provides ; operator. This enables to chain calls to the same object in a very straightforward manner.

Example for Java

new Apple() 
.method1()
.method2()

Why is there a separate syntax in Java for constructor? I don’t know. Smalltalk just calls constructor method with the same syntax as normal function call.

The same example for Smalltalk

Apple new method1; method2;

Since main thing in the language is calling methods from objects, you don’t need to have much syntax. Same concept applies to Forth language.

Anonymous functions

[ block ] - this is syntax for a piece of code

[ :anArgument | block ]

so now you can use anArgument value right in the block. Do you recognise vertical pipes argument from Ruby? This is it.

Skinny funcitons

Indeed, mostly functions in Smalltalk are really small and concise. The good reason for that is the IDE is a part of language image, this changes programmer experience dramatically. IDE is full of functionality like generate scaffold getters, setters, best in breed refactoring capabilities.

Pharo

Along with outstanding IDE support the concise function bodies is a consequense of small language footprint. No verbosity required, no types needed to be specified, funcition calls don’t ever require brackets.

Unit testing

I think unit testing that is done in Smalltalk still delivers the best experience possible.

Pharo testing

Pressing on the green dot you can re-run test.

Pharo testing

What a brilliant idea to have only assert as the test method!

Example:

testClassifyIncident
	|anIncident aState|
	aState:= ticket status.
	anIncident := ticket classifyAs: Incident service: service.
	self assert: anIncident class equals: Incident.
	self assert: anIncident status class equals: ClassifiedTicketState. 
	self assert: (ticket history includes: aState).
	self assert: anIncident service equals: service.
	self assert: anIncident agreement equals: agreement

Look at this example above! An expression is almost in plain English, almost AppleScript ;)

Less boilerplate

I have chosen the Pharo as a tool for thought, because it doesn’t require any boilerplate to start thinking on domain and experiment with entities. The REPL is awesome and allows to dig and to feel the data.

Virtual machine

Smalltalk pioneered system layer abstraction before Java. You always run your program in form of image using thin virtual machine layer.

Pure OOP object based web frameworks

I think it is really interesting how Seaside web framework works using pure objects with NO templates. This is quite interesting idea to build web interfaces.

Summary

Smalltalk is a language from the past that is still worth learning.

  1. The best in breed IDE.
  2. Consice syntax. No if statements!
  3. Pure OOP. Everything is an object and methods are messages.
  4. Convenient unit testing.
  5. Virtual machine. You can run Smalltalk on ARM CPUs, even on Raspberry PI.

org-roam ideas

04.03.2021

I love talking about ideas. org-roam has quite simple idea for organizing your knowledge. I didn’t believe it works when I gave it a try.

The essense of the Zettelkasten method is following:

  1. Keep your notes split apart in one single folder.
  2. Insert tags and backlinks to group notes together.

That’s it!

What is so special about this? Let’s say I started moving all things from my backlog pile into separate small notes and I started to breath again! You know you probably have this cemetry of links you will never open and articles you will never read. I have such pile as well, links in browser in “favorites”, pile of links in org backlog file.

The only problem is when to read them or should I read it at all?

Org-roam gives an answer to this. Whenever you work on something, create a card, put your link there and forget. Once you decide to work on the topic, it will be easy to find! The system fives all bunch of tools like “grep” to find the term you’re looking for. Use tags to filter out the cards you need if the topic is too wide.

Well. So far so good, this seems to work for me so far. I hope it works for you too.

Disable Chrome browser confirmation to open external protocol with org-protocol

02.02.2021

I recently added org-capture chrome extension to my toolbelt. Unfortunalely chrome annoys me by asking if I want to open this protocol link every time.

Here is the simple way to fix this.

Execute this in the shell

defaults write com.google.Chrome URLAllowlist -array-add -string 'org-protocol://*'

check chrome://policy url that it contains proper settings for org-protocol

Chrome policy

Emacs literate programming and SQL

08.01.2021

I’m really crying of how finally emacs can be used for the literate programming and for some testing.

For restclient, this creates POST request with json data structure in request body.

  #+begin_src restclient
    POST http://muster.test/index.php?cl=ping
    Content-Type: application/json


    {
    "essentialtech": true,
    "googleadwords": false,
    "googleanalytics": false,
    "googlemaps": true,
    "gtmbasedtech": false,
    "terminland": true,
    "userlike": true
    }
#+end_src

#+RESULTS:
#+BEGIN_SRC js
{
  "message": "success"
}
// POST http://muster.test/index.php?cl=ping
// HTTP/1.1 200 OK
// Date: Tue, 09 Feb 2021 13:45:07 GMT
// Server: Apache/2.4.46 (Unix) OpenSSL/1.1.1i
// X-Powered-By: PHP/7.1.33
// Expires: Thu, 19 Nov 1981 08:52:00 GMT
// Cache-Control: no-store, no-cache, must-revalidate
// Pragma: no-cache
// Set-Cookie: language=0; path=/; HttpOnly
// Set-Cookie: sid=0fvjai2h5h2pso52p4vq9e5309; path=/; HttpOnly
// Keep-Alive: timeout=5, max=100
// Connection: Keep-Alive
// Transfer-Encoding: chunked
// Content-Type: application/json;
// Request duration: 0.269261s
#+END_SRC

This executes SQL statement and checks what the previous command has been executed!

#+begin_src  sql :engine mysql :dbhost 127.0.0.1 :dbuser muster :dbpassword muster :database muster-development
select val, attribute, count(*)
from oxps_user_consent_pings 
where attribute='googleanalytics' and time > '2021-01-01'
group by val
#+end_src

#+RESULTS:
| val   | attribute       | count(*) |
|-------|-----------------|----------|
| false | googleanalytics |        2 |
| true  | googleanalytics |        2 |

useful git wip

07.01.2021

Useful Git WIP alias command

add this to the .gitconfig

[alias]
  wip = for-each-ref --sort='authordate:iso8601' --format=' %(color:green)%(authordate:relative)%09%(color:white)%(refname:short)' refs/heads
  

and enjoy git wip sorting branches by most recent

Source: https://carolynvanslyck.com/blog/2020/12/git-wip/

Книги о здоровье

06.01.2021

Вот небольшой список книг и ресурсов, которые настоятельно рекомендую для погружения в обширную тему здоровья.

  1. Очаровательный кишечник. Джулия Эндерс
  2. Нейрофитнес Рахул Джандиал
  3. Сахар, соль и жир. Майкл Мосс
  4. Блог Бесчастнова Павла aka Stelazin

Gitlab limit parallel pipeline execution

24.12.2020

In brief - use the resource_group directive.

Example:

stages:
  - build

jobA:
  resource_group: jobA
  stage: build
  script: 
    - echo HelloA

jobB: 
  stage: build
  script:
    - echo HelloB

There are some useful patterns for Resource Group.

resource_group: $CI_ENVIRONMENT_NAME … Limit per environment

resource_group: $CI_JOB_NAME … Limit per job

resource_group: $CI_COMMIT_REF_NAME:$CI_JOB_NAME … Limit per job per branch

resource_group: $CI_COMMIT_REF_NAME:$CI_ENVIRONMENT_NAME … Limit per environment per branch (e.g. review apps)

Source Gitlab issue 15536

2020 week 49 links

07.12.2020

Magit has nice integration with Github and Gitlab!

09.10.2020

Just read this article from magit author about integration. https://emacsair.me/2018/12/19/forge-0.1/

Since now you can enjoy making PRs and MRs right from your lovely editor!

Keep it simple, stupid

11.07.2020

Simplicity is an underappreciated property.

In order to dynamically edit content people tend to introduce a lot of complexity by using powerful CMS systems, databases, search engines etc. Moreover, you’ll need to spend significant efforts on maintenance, high availability, for all this stuff.

What if you can just use Markdown and provide a short training course to people? What if you can use Hugo and Github Actions pipelines or similar for publishing?

Literally everything becomes more simple, thus more robust. What power can you gain by using simple text based format like this? Countless amount of tools for editing, processing and automation. Think about this.

2020 week 28

09.07.2020

This week I’ve saved the following links:

Smalltalk online course done

09.07.2020

I’m always happy to gain a new knowledge, so this time I was putting efforts into Pharo programming course and voila, enjoyed it challenges and got a Certificate of accomplishment.

Interesting take on time from the Go perspective

19.06.2020

I found really interesting how the time is specified in Go language stdlib.

From https://golang.org/pkg/time/

To define your own format, write down what the reference time would look like formatted your way; see the values of constants like ANSIC, StampMicro or Kitchen for examples. The model is to demonstrate what the reference time looks like so that the Format and Parse methods can apply the same transformation to a general time value.

Namely, you write an example of time date, not just “dd-MM-yyyy” but real date and time using numbers as values.

Here is go example:

01/02 03:04:05PM '06 -0700
Mon Jan 2 15:04:05 MST 2006

if we want to print output similar to dd-MM-yyyy we’d specify just

02 Jan 2006

Quite smart and unusual.

2020 week 24

18.06.2020

2020 week 23

10.06.2020

Setting up a PHP development environment with Apache2 and php-fpm on macOS Catalina

09.06.2020

At the moment using Docker for development on macOS © has its own flaws, and in case you need good performance, there is a more or less complicated way to set up a local development environment with native apache2 and php-fpm stack.

Keep in mind, PHP 7.3 comes with macOS Catalina preinstalled, so you might not need to install PHP separately.

Prerequisites

Installation

  1. Install PHP brew install [email protected]
  2. Install apache brew install apache2

At this point, you’ll have PHP v7.4 installed in /usr/local/opt/[email protected]/

In case you need to keep several PHP versions, it can be done using ENV vars in .zshrc

PHP_VERSION=7.4
export PATH="/usr/local/opt/php@${PHP_VERSION}/bin:/usr/local/opt/php@${PHP_VERSION}/sbin:$PATH"  
export LDFLAGS="-L/usr/local/opt/php@${PHP_VERSION}/lib"  
export CPPFLAGS="-I/usr/local/opt/php@${PHP_VERSION}/include"

PHP-FPM setup

Locate /usr/local/etc/php/7.4/php-fpm.d/www.conf and edit it to include environment variables. I also rebound default port 9000 to 9009 not to have conflicts with XDEBUG

clear_env = no 
listen = 127.0.0.1:9009

Apache setup

Locate /usr/local/etc/httpd/extra/httpd-vhosts.conf and edit it according to your project folder, here is my example


Listen 80  
<FilesMatch \\.php$> 
  SetHandler "proxy:fcgi://127.0.0.1:9009"  
</FilesMatch>
<VirtualHost *:80>  
        ServerAdmin webmaster@localhost  
        ServerName obo.local  
        DocumentRoot /Users/mprokopov/oxid/project/source  
        ErrorLog /Users/mprokopov/oxid/project/source/error.log  
        CustomLog /Users/mprokopov/oxid/project/source/access.log combined  
</VirtualHost>
<Directory "/Users/mprokopov/oxid/*/source">  
    Options Indexes FollowSymLinks  
    AllowOverride All
    Require all granted  
</Directory>

Project setup

For some reason php-fpm doesn’t play well with _ENV variables, so I had to change them to use getenv() function instead, like on the example below

config.inc.php of the project

$dbName = getenv('DB_NAME')  
$dbUser = getenv('DB_USER')  
...

Party time

When you decide to work on the project, go to the source folder of the project and run the command

DB_NAME=dbname DB_PASS=pass DB_USER=user php-fpm

and navigate in the browser to http://localhost address. It should work.

You can also save some efforts on typing and get env variables from the .env file by running eval $(cat .env) php-fpm instead.

Bonus: XDEBUG

In case you need XDEBUG, you can install it with command

1 pecl install xdebug

and edit /usr/local/etc/php/7.4/php.ini to include the following settings

zend\_extension="xdebug.so"  
xdebug.remote\_enable=on  
xdebug.remote\_host=127.0.0.1  
xdebug.remote\_handler=dbgp  
xdebug.idekey=geben  
xdebug.remote\_autostart=On  
xdebug.profiler\_enable\_trigger = 1  
xdebug.profiler\_enable=  
xdebug.profiler\_output\_dir = tmp  
xdebug.profiler\_output\_name = "callgrind.out.%p"

Awesome video using REPL with Pharo on Raspberry Pi

02.06.2020

Totally awesome video of remote REPL with interaction on the Raspberry Pi device.

If you want to know more about Pharo and Smalltalk, I encourage you to complete this the free Pharo course.

Переезжая на Hugo

01.06.2020

Первая запись в wordpress блоге датируется декабрем 2009. Видимо в это время мне стало понятно, что поддерживать контент-менеджмент в написанном на Parser 3 сайте nexus.org.ua стало накладно и я сделал выбор в пользу популярного движка блогов wordpress. Надо признать, под влиянием medium он сильно прибавил в юзабилити и редактировать посты стало в нем одно удовольствие.

Как видите на 2009 год я считал, что поднять mysql и запустить php было очень хорошей идеей. Все это так, пока ты не становишься старше и не принимаешь решение, что поддержкой wordpress ты заниматься не хочешь, потому что:

  1. Нужно следить за сертификатами от letsencrypt.
  2. Обновлять php.
  3. Обновлять wordpress, который хаканый-перехаканый неоднократно.
  4. Следить за состоянием mysql
  5. В 2010 году все это контейнеризировалось, но все же. Сложности добавилось с приходом докера. Как теперь безопасно обновлять имаджи и какие именно использовать?
  6. Следить за сетью в докере и связностью с контейнерами nginx и letsencrypt.
  7. Думать о бекапах базы mysql, думать о бекапах картинок к статьям.

В какой-то момент не хочется заниматься поддержкой всех этих технологий, а хочется просто писать в блог.

Чем старше становишься, тем больше ценишь простоту, в которой, как известно, гениальная истина.

Так на арене появился Hugo, отчасти еще и потому, что совпал с моей возрастающей заинтересованностью программированием на Go.

Вот мой новый стек:

  1. Hugo
  2. Disqus
  3. GitHub

К слову это не первый подход к выбору движка. Сначала мне понравилась идея с Perun, написанный на clojure модуль для системы сборки boot, которая позволяет функционально расширить его еще и до статического генератора сайтов. Присматривался на Jekyll, который, как известно на Ruby, а Ruby это наше все.

Сначала я сделал перепроектирование https://it-premium.com.ua на Hugo вместо RoR, и сразу понял, это - то что нужно! Во-первых статика это то, во что так или иначе переходит каждый сайт когда его рендером занимается браузер. Быстрее чем статический сайт сделать нельзя, хотя многие пытаются, используя Javascript-based фреймворки на подобие Gatsby.

Hugo поддерживает не только markdown, но и различные продвинутые сценарии, так в странице “Путешествую” список стран и мест находится в YAML файле и включается из Markdown при помощи custom tag. На каждой странице список друзей также стал формироваться из отдельного YAML. Кстати, уже никто не обменивается ссылками как раньше?

мой trips.yaml файл, рендер которого вы можете увидеть здесь

- date: 2020
  place: Испания, Барселона
  comment: увы и ах, из-за короны-19 отменена :(

- date: 2019-2020
  place: Норвегия, Аскер
  duration: 2 недели

- date: 2019
  place: Германия, Фрайбург
  duration: 3 дня

- date: 2019
  place: Австрия, Вена, 1 месяц
  duration: 1 месяц

- date: 2019
  place: Турция, пригород Анталии 1 неделя
  duration: 2 недели

- date: 2019
  place: Германия, Берлин
  duration: 3 дня

- date: 2019
  place: Сицилия, гастротур
  duration: 6 дней

- date: 2018-2019
  place: Таиланд, о. Самуи
  duration: полгода

- date: 2018
  place: Италия (Тоскана), гастротур
  duration: 6 дней

- date: 2018
  place: Финляндия (Юваскюля, Хельсинки)
  duration: 3 дня

- date: 2018
  place: Германия, Гамбург
  duration: 3 дня

- date: 2017
  place: Германия, Маннгейм, Штуттгарт
  duration: 1 месяц

- date: 2016
  place: Египет (Хургада), Турция (Стамбул)

- date: 2013-2014
  place: Тайланд (Бангкок, Айютайя, Паттайя) [Камбоджа (Сиам-Реап, Сиануквиль, Баттамбанг, Кампот, Пном-Пень)][1]

- date: 2012
  place: Малайзия (Куала-Лумпур, о. Тиоман) Филиппины (о. Боракай, о. Палаван (Ель-Нидо, Пуерто-Принсесса)) Индонезия (о. Сулавеси, Тогеанские о-ва (о. Маленге, о. Бомба), Тана-Тораджа (Рантепао + окрестности), Макассар, о. Бали)

- date: 2011
  place: Сингапур Вьетнам (Хошимин, Ханой, Хью, ) Индонезия (о. Бали, о. Ломбок, о. Ява (плато Диенг, Джогджакарта, вулкан Иджен)

- date: 2010
  place: Индонезия (о. Ява (вулкан Бромо) о. Бали)

- date: 2009
  place: Тайланд (Бангкок, о. Чанг)

- date: 2008
  place: Египет (Шарм-Ель-Шейх, Каир (пирамидки))

а рендерит его вот такой простой кусочек в layouts/shortcodes/travel.html

<ul>
{{ range $.Site.Data.travel }}
    <li>
        {{.date}} {{.place}} {{.duration}} {{.comment}}
    </li>
{{ end }}
</ul>

Все линки для навигации сверху берутся из соответствующих мета-полей в файлах в каталоге content/pages. Достаточно просто создать там новый файл с содержимым и он автоматически появится в меню!

My pages list as files

Для миграции всего контента с блога wordpress я воспользовался соответствуюей утилитой.

Остался вопрос с комментариями, и он также решается при помощи известного disqus. Дорогой читатель, подскажи, если знаешь engine получше.

Мне нравится эта элегантная простота, скорость рендера и общее удовольствие от процесса, а редактировать Markdown можно любым из редакторов по вкусу. Мой выбор - emacs.

P.S Так как мой выбор - emacs, то я могу публиковать заметки прямо в формате org-mode!

2020 week 22

31.05.2020

В еженедельном формате я буду публиковать ссылки, которые мне пригодились, в первую очередь чтобы разгребать все, что попадает в мой backlog, но также и делиться с читателями.

Также мне очень нравится подход, которому я научился у американцев, считать неделями. В году ведь всего 52 недели и каждая пронумерована, так довольно прикольно индексировать.

Про редакторы и IDE

31.05.2020

Я люблю время от времени тыкать палочкой в различные редакторы и пробовать их в своей работе.

Сейчас появилось очень много интересных и быстрых штук типа Sublime, Atom, LightTable. Ребята из Jetbrains создают отличные (но медленные и прожорливые) IDE типа WebStorm, RubyMine, PyCharm.

2020 week 21

24.05.2020

Ruby and Smalltalk

24.05.2020

Ruby has so much inspiration from the Smalltalk!

Here are my findings:

  • Inspect method actually opens an inspector for the object in Smalltalk, Ruby just tries to show object’s guts
  • collect, select are methods for collections from the Smalltalk
  • do for collection in Smalltalk is the same what’s in Ruby each
  • block parameter in «pipes» in Ruby is very similar to Smalltalk
  • super is calling the superclass parent method
  • initialize is a constructor name for the class in Smalltalk
  • keywords concept has slightly different syntax, but the meaning is the same
  • « method
  • Ruby object.send method = Smaltalk object perform: method
  • the self keyword means the same in Smalltalk and Ruby

How to increase Kubernetes PVC size for AWS EBS

12.05.2020

It’s quite simple to increase PVC size since K8s 1.11

kubectl describe pvc and find your storage class.

Name: jenkins
Namespace: jenkins
StorageClass: jenkins-gp2
Status: Bound
Volume: pvc-473e3dbf-b759-11e9-9cbc-02a7fb0b6cca
Labels: app.kubernetes.io/component=jenkins-master
app.kubernetes.io/instance=jenkins
app.kubernetes.io/managed-by=Tiller
app.kubernetes.io/name=jenkins
helm.sh/chart=jenkins-1.3.6
Annotations: pv.kubernetes.io/bind-completed: yes
pv.kubernetes.io/bound-by-controller: yes
volume.beta.kubernetes.io/storage-provisioner: kubernetes.io/aws-ebs
Finalizers: [kubernetes.io/pvc-protection]
Capacity: 16Gi
Access Modes: RWO
VolumeMode: Filesystem
Mounted By: jenkins-6b5c9bcbbb-gr2l5
Events:

kubectl edit storageclass jenkins-gp2 add the following to your storage class

allowVolumeExpansion: true

kubectl edit pvc jenkins

Change PVC size

Name: jenkins
Namespace: jenkins
StorageClass: jenkins-gp2
Status: Bound
Volume: pvc-473e3dbf-b759-11e9-9cbc-02a7fb0b6cca
Labels: app.kubernetes.io/component=jenkins-master
app.kubernetes.io/instance=jenkins
app.kubernetes.io/managed-by=Tiller
app.kubernetes.io/name=jenkins
helm.sh/chart=jenkins-1.3.6
Annotations: pv.kubernetes.io/bind-completed: yes
pv.kubernetes.io/bound-by-controller: yes
volume.beta.kubernetes.io/storage-provisioner: kubernetes.io/aws-ebs
Finalizers: [kubernetes.io/pvc-protection]
Capacity: 16Gi <======= this was 8Gi
Access Modes: RWO
VolumeMode: Filesystem
Mounted By: jenkins-6b5c9bcbbb-gr2l5
Events:

Delete pod which is using this PVC

kubectl delete pod jenkins-34252353-2f4gh

After the pod is recreated you’ll see the new size for your PVC!

My new modern web site stack

12.04.2020

In the age of Kubernetes and all this fancy stuff, I decided to make something really simple and as static as possible. The modern, cutting-edge tech stack.

This is a story about https://it-premium.com.ua reincarnation featured with responsiveness and saving all the functionality it had before. Though it wasn’t a simple, but very interesting journey.

Here are the specs I wanted to preserve:

  • Multilanguage support, due to Ukrainian language law enforcement we had to introduce one more supported language among English and Russian
  • PDF dynamic generation based on what user was chosen
  • Dynamic tariff calculations with dependencies on the services of user’s choice
  • Easy data management. It shouldn’t be hard to fix some figures by someone else.
  • Easy localization management.

The old stack

At first, it was a Ruby on Rails 4.2 application and it used the following gems:

  • coffee-sass + compass, as we ordered the design and layout from the third-party and they used sass
  • jquery, yeah, modals, transitions
  • knockout-js, yeah top-notch and all the hotness that time
  • Paloma (OMG), look ma, no hands and javascript vars from the backend to frontend!
  • delayed job, needed for queued PDF generation in the background
  • delayed_job_active_record + daemons
  • prawn for PDF creation
  • slim-rails, HTML markup even slimmer then HAML!
  • gibbon, this is for talking to the Mailchimp API

I had three distinct layouts and page internals for each language. At some point, they diverged quite significantly. Entropy law, you know.

All this was containerized into two docker containers, — first app and second background worker, and all were running on the quite ordinary docker host. Do you probably see a lot of moving parts, complex JSON wiring with Paloma and orchestration issues?

The modern, but intermediate stack

My first quick-and-dirty attempt for a rewrite was performed using the same plane Knockout JS, but for the website itself, I decided to give a try for Hugo, the golang based static blog engine generator.

The dynamic PDF generation task is a definitely good target for delayed processing by serverless technologies. So AWS lambda was a good pick for that. AWS supports lots of different languages nowadays, but I stopped on using NodeJS 10 with libraries for SendGrid API and Pdfmake. It turned out to support different localizations for PDFs I ought to get language string from params.

Hugo was a great choice. The multilanguage support, easy YAML, JSON data manipulation. Moreover, because of its static nature we can fully embrace static hosting solutions like AWS S3 or the Github. Hugo supports natively the deployment to AWS S3, but when I started testing it turned out to be quite slow and not really suitable for static website hosting. Most probably it required the AWS CloudFront before, but I decided to give Github a try with static hosting and it really worked perfectly.

The latest stack

Everything seemed perfect except KnockoutJS. Yeah, it still works, but you know, this two-way binding and using all these data-bind attributes wasn’t cool enough. Putting the vars from HTML into window.variable to pass this a parameter to the Javascript. Something was wrong with this.

I started playing with plain React and setting up the environment from this article. You know what? It was too much for me to set up all this stuff in 2020. So I gave my old friend ClojureScript a try.

shadow-clj with reagent, http-cljs libraries. That’s it, nothing else. re-frame is also a good thing, but I didn’t have too much state management here.

Conclusion

This was really-really enjoying and satisfying programming experience with the confidence of “doing the right things in the right way”. The released main.js takes about 482Kb, which is fine. All my .cljs files are 331 CLOC and probably can be less.

Hugo allows keeping things simple and static. It has multilanguage support, JSON generation from my YAML data files.

Github hosts my website for free and gives a free SSL certificate. AWS Lambda costs are far from being noticeable. Yet all the architecture is robust and doesn’t require any management efforts from my side. Github Actions made website publishing easy and other people actually fix the contents right from the repository. I’m very satisfied with the decisions I made.

My recent tasks

03.03.2020
  • Create a Jenkins job for mobile application internal share to the Google Play Store
  • Create a Jenkins job for mobile application automated release to the Google Play Store
  • Restore Jenkins jobs for the COBOL build with Oracle 11.2 and Sybase 15.5 on the Solaris Sparc, AIX and HP-UX machines
  • Debug a performance issue in the distributed power management software.
  • Create helm script for the product deployment to the Central K8S cluster into staging and prod namespaces and talk to DynamoDB and put assets to the S3
  • Setup Prometheus + Grafana for the performance monitoring
  • Setup gradle builds for Java Spring and NodeJS
  • Extend XenServer with two new HDDs for a capacity and much more.

Applescript instantly open Zoom link from the iCal calendar

26.02.2020

This is really my little timesaver because you know, a lot of meetings happen when you work remotely.
Works best with Alfred 4 using mapped hotkey.

tell application "Calendar"
	tell calendar "[email protected]"
		set itemLocation to location of first event where its start date ≤ (current date) + 10 * minutes and end date ≥ (current date)
		if itemLocation contains "zoom.us" then tell application "Finder" to open location itemLocation
	end tell
end tell

Applescript instantly open Zoom link from the iCal calendar

02.02.2020

This is really my little timesaver because you know, a lot of meetings happen when you work remotely.

Works best with Alfred 4 using mapped hotkey.

tell application "Calendar"
	tell calendar "[email protected]"
		set itemLocation to location of first event where its start date  (current date) + 10 * minutes and end date  (current date)
		if itemLocation contains "zoom.us" then tell application "Finder" to open location itemLocation
	end tell
end tell

The bad thing about Rails is that by default it suggests using own messy design patterns like fat…

15.09.2019

The bad thing about Rails is that by default it suggests using own messy design patterns like fat models. I mean all these callbacks in AR, observers and everything that is good for a simple blog but fails for a big application.

You have to use a very little part of Rails to apply DDD concepts.

Два древних языка, которые нужно изучить программисту

01.08.2019

Почему нужно проинвестировать время в изучение двух древних языков Lisp и SmallTalk?

Я уверен, что это сделает вас на шаг ближе к стадиям развития специалист и эксперт.

Nikita Prokopov сделал отличный talk о стадиях компетентности программиста. Идея в том, что каждый программист на своем пути развития проходит пять стадий развития:

  • Новичек
  • Продвинутый
  • Компетентный
  • Специалист
  • Эксперт

Никита ближе к концу доклада на примере собственного опыта сравнивает два языка: Java и Clojure и выдвигает предположение о том, что Java хорош для новичков, а Clojure это глоток свежего воздуха для уставших опытных программистов.

Интересно отзывается о Java создатель SmallTalk, легендарный Alan Kay, – «Java монополизировала термин Объектно-Ориентированный и совершенно зря«.

Идеи заложенные SmallTalk сильно опередили свое время, а своевременность это решаюший фактор для успеха. Вы только подумайте, в конце 70х SmallTalk изобрел концепции:

Концепция виртуальной машины, и это до JVM. Платформонезависимый код. Программа на SmallTalk распространяется как Image со всеми объектами и сохраненным состоянием, аналог Docker имаджей. Объектно-Ориентированный подход в его чистом виде, классы, объекты, методы. IDE как часть runtime среды. Такой IDE нет до сих пор ни у одного из известных мне языков программирования. Refactoring через IDE. Test Driven Development, подход которое впоследствии сделает более популярным DHH, создатель Ruby on Rails. Реализации TDD удобнее, чем SmallTalk я не встречал. Transcript – REPL, то есть интерактивную консоль, песочницу, аналог irb из ruby. Анонимные функции — блоки. Идеи SmallTalk были адаптированы в последствии в Java, Ruby, Objective C и массе других более коммерчески успешных языков программирования, но все они отличаются.

Трагедия SmallTalk – это маркетинговый провал, целая индустрия могла пойти другим направлением и быть лучше, чем сейчас.

Я уверен, что по-настоящему выдающиеся языки содержат правильные фундаментальные концепции, минимум синтаксиса и максимум гибкости и эффективности. Такими языками несомненно являются Lisp и SmallTalk.

Два древних языка, которые нужно изучить программисту

08.01.2019

Почему нужно проинвестировать время в изучение двух древних языков Lisp и SmallTalk?

Я уверен, что это сделает вас на шаг ближе к стадиям развития специалист и эксперт.

Nikita Prokopov сделал отличный talk о стадиях компетентности программиста. Идея в том, что каждый программист на своем пути развития проходит пять стадий развития:

  • Новичек
  • Продвинутый
  • Компетентный
  • Специалист
  • Эксперт

Никита ближе к концу доклада на примере собственного опыта сравнивает два языка: Java и Clojure и выдвигает предположение о том, что Java хорош для новичков, а Clojure это глоток свежего воздуха для уставших опытных программистов.

Интересно отзывается о Java создатель SmallTalk, легендарный Alan Kay, – «Java монополизировала термин Объектно-Ориентированный и совершенно зря«.

Идеи заложенные SmallTalk сильно опередили свое время, а своевременность это решаюший фактор для успеха. Вы только подумайте, в конце 70х SmallTalk изобрел концепции:

  • Концепция виртуальной машины, и это до JVM. Платформонезависимый код.
  • Программа на SmallTalk распространяется как Image со всеми объектами и сохраненным состоянием, аналог Docker имаджей.
  • Объектно-Ориентированный подход в его чистом виде, классы, объекты, методы.
  • IDE как часть runtime среды. Такой IDE нет до сих пор ни у одного из известных мне языков программирования.
  • Refactoring через IDE.
  • Test Driven Development, подход которое впоследствии сделает более популярным DHH, создатель Ruby on Rails. Реализации TDD удобнее, чем SmallTalk я не встречал.
  • Transcript – REPL, то есть интерактивную консоль, песочницу, аналог irb из ruby.
  • Анонимные функции — блоки.

Идеи SmallTalk были адаптированы в последствии в Java, Ruby, Objective C и массе других более коммерчески успешных языков программирования, но все они отличаются.

Трагедия SmallTalk – это маркетинговый провал, целая индустрия могла пойти другим направлением и быть лучше, чем сейчас.

 

Я уверен, что по-настоящему выдающиеся языки содержат правильные фундаментальные концепции, минимум синтаксиса и максимум гибкости и эффективности. Такими языками несомненно являются Lisp и SmallTalk.

How to improve ruby code with dup and tap methods

06.06.2018

Here is a piece of my old code, but it’s definitely could be improved.

def to_params
  h = ticket_params
    h[:activity] = extract_activity if extract_activity
    h[:event] = extract_event if extract_event
    h.delete(:state_event)
    h.delete(:activities_attributes)
  h
end

As you can see here, ‘h’ variable name is quite uncommunicative. Could it be refactored?

Let’s see, h=ticket_params. We call this because we don’t want to modify ticket_params. Is there any method which creates a copy?

It turns out we have dup method which creates a copy of an object, this is exactly what we wanted. Then, we have tap method, which allows us to dive in object internals and return then itself. Here is whole new piece of code after refactoring.

def to_params
  ticket_params.dup.tap do |params|
    params[:activity] = extract_activity if extract_activity
    params[:event] = extract_event if extract_event
    params.delete(:state_event)
    params.delete(:activities_attributes)
  end
end

Much better now and we do not have any redundant variable!

Введение в Prolog

29.05.2018

Хочу такой туториал, с которым все понятно, куда коней запрягать. А его нет. Напишу тогда свой.

Итак, Пролог это не обычный язык программирования. Самый лучший пример использования это решение логической задачи типа

5 разных человек в 5 разных домах разного цвета, курят 5 разных марок сигарет, выращивают 5 разных видов животных, пьют 5 разных видов напитков. Вопрос: кто выращивает рыбок?

Подсказки:

  • Норвежец живет в первом доме.
  • Англичанин живет в красном доме.
  • Зеленый дом находится левее белого.
  • Датчанин пьет чай.
  • Тот, кто курит Rothmans, живет рядом с тем, кто
  • выращивает кошек.
  • Тот, кто живет в желтом доме, курит Dunhill.
  • Немец курит Marlboro.
  • Тот, кто живет в центре, пьет молоко.
  • Сосед того, кто курит Rothmans, пьет воду.
  • Тот, кто курит Pall Mall, выращивает птиц.
  • Швед выращивает собак.
  • Норвежец живет рядом с синим домом.
  • Тот, кто выращивает лошадей, живет в синем доме.
  • Тот, кто курит Philip Morris, пьет пиво.
  • В зеленом доме пьют кофе.

Для решения задач такого типа очень подходит Prolog.
Язык оперирует всего тремя понятиями, это Факт (Fact), Правило (Rule) и Запрос (Query).

Факт.

Как выглядит факт? Простое утверждение, без условий.

Пример: Норвежец живет в первом доме.

Правило.

Правило это когда в выражении есть неизвестное и его нужно вычислить. 
Пример: Зеленый дом находится левее белого.

Так как неизвестно, где находится белый дом, это утверждение нужно вычислить. Это и есть правило.

Запрос.

Пример: Кто выращивает рыбок?

Здесь все понятно, система должна найти ответ на запрос используя факты и правила.

Написание программы на прологе и есть нахождение ответа на запрос используя для этого правила и факты. Создание таких правил и фактов и есть написание программы.

Где еще используется Prolog? В языке запросов Datalog в Datomic и Cascalog на Hadoop.

Пожалуй, самым точным определением будет слово «осознанность».

27.05.2018

Пожалуй, самым точным определением будет слово «осознанность». Нон-конформизм это тоже своего рода крайность, так как бывает сопротивление ради сопротивления, особенно в пубертатном возрасте. Уметь оценивать и признавать противоположную точку зрения, вот что по-настоящему ценно.

Некоторые мои знакомые приходят к осознанности разными путями, кто-то через стремные духовные практики, кто-то через упражнения с ножом или бритвой.

Но всегда осознанность означает правильно настроенный жизненный компас.

Brief introduction to the Kubernetes.

26.05.2018

Kubernetes is a winner in docker cloud orchestration, so let’s get a brief introduction in what it is and what kind of problems it solves.

Kubernetes is a set of tools designed to solve a problem of deployment of your lovely tailor-made application to a cloud. It does not matter which cloud you choose, AWS, Azure or Google, or even IBM, because Kubernetes provides you with a set of tools which are platform independent.

For almost every application you need to talk to a database, to store some assets, to get requests and make responses to users with a useful content. So, basically you need to have a ‘storage’ for storing files, a ‘network’ to get requests and make responses to users and a ‘computing power with memory’ to run your application. All of this is quite simple if you run your application on a single computer (node), you have local storage on an HDD, i.e. a filesystem, you have a CPU and memory to run your application and a single network interface to talk to users and other services like external database or api. Suddenly you decide to deploy your application to some cloud provider and users start using your application on a huge scale and then you decide to scale your application across cloud nodes.

This is still not that moment when you need Kubernetes, because you can use cloud provided facilities like Amazon S3 for storage, Amazon RDS for automatically scaled databases and more Amazon EC2 instances to run your applications.

Wait, why do we need Kubernetes then? Well, every quite complex application has it’s own technological stack and different unique Continue Integration and Continue Deployment processes. So, if you work for a large enterprise which in turn has a lot of such custom made applications, there will be one day when the enterprise decides to make unification of rollout and upgrade processes to reduce costs and create special forces, which are responsible for deployment and maintenance. We start calling them DevOps.

Here is that moment, when everything becomes more and more complicated.

These guys have already started dreaming about better abstractions for unification of application deployment and invented a concept of Docker. The Docker is about having everything application needs to run in one ‘container’ which can be stored and transferred over a network. Nevertheless every nifty feature comes at its price. For the luxury of having platform independent movable containers we pay the price with much larger application size and extra build step. Both are very time and resource consuming.

Okay, now we have a bunch of containers, cool. How should we monitor all of them and restart when they fail? Moreover we also run containers across different servers and docker does not give us a way of how one part of our application in one container should connect across network and talk to a part of application in another container. There is nothing more than cleaning up failed docker containers and stalled images manually or in semi-automated, controlled by human, way.

And there was a blood. A lot of different third-party solutions and even Docker themselves were trying to compete and provide better tools for solving these problems. And finally more and more people started considering Kubernetes by Google as preferred solution.

Let me briefly describe a concepts of Kubernetes.

  • minikube is an utility to get your home-made cluster up and running as a virtual machine on your single computer
  • kubectl is an utility to control every operation on a cluster, which is up by running minikube.
  • In Deployment you specify information about which docker image to download and run, and what volumes and ports this particular container will use. Deployment will spawn Pods.
  • Basically Pod is a running container, you can just delete running Pod and new one will be created automatically. You can specify in Deployment how many exactly the same containers you need to spawn.
  • You need to create Service in two cases. First, when you want provide DNS name for your container, for example, redis. This will allow other containers to discover and connect to redis by name resolution. Second, when you want to make your application visible from outside of your cloud, i.e. ‘publish’ application for users.
  • You should use Persistence Volume Claim if you have data in your application which should survive across container deletions. Usually database container will store it’s data in such volumes. Otherwise say ‘Hasta la vista’ to all the data in your live containers, because they are intended to be ephemeral, easily killed and spawned again when necessary.
  • Another nice concept in Kubernetes is a Secret. This is spatial place and API to store your credentials and settings. You can refer to them in Deployment, when you need, for example, to supply database password in one of environment variables.

If you still have intention to try deployment to Kubernetes cluster, start playing with minikube and investigate this nice example of deployment Wordpress + MySql https://kubernetes.io/docs/tutorials/stateful-application/mysql-wordpress-persistent-volume/

Originally published at blog.it-premium.com.ua.

Согласен по всем пунктам!

28.03.2018

Согласен по всем пунктам!

Я для себя выделил ещё один признак, это умение проводить собственные размышления над проблемой, особенно если они противоположны общепринятой точке зрения. И, конечно, умение вести дискуссию пользуясь логическими построениями, вместо «ойнувсе».

Noteworthy Clojure projects

18.01.2018

Recently I again dived deeply into Clojure development with my Bank Statements — ERP sync tool and started to investigate what’s new in Clojure world. It appears a lot of great things happend in 2017!

Every of following tools drops my jaw down. Here is my list:

  • Lightmod and Nightcode really great editors for Clojure/Clojurescript beginners. Zach Oakes included useful examples to jump into Clojure development train.
  • Dynadoc, documentation exploration tool which makes your work with documentation more effective and interactive.
  • Dirac is a Clojurescript REPL right in your Chrome browser!
  • Vase a rapid declarative Pedestal and Datomic based microservice development tool by guys from Cognician.
  • Boot build tool became very popular because of custom and modular build workflow. When you feel yourself limited by Leiningen, give Boot a try. It suites even for blog publishing!

Did you find anything noteworthy for your Clojure development? Please, comment.

Вещи в веб-деве, которые меня действительно впечатлили

16.01.2018

Lightmod и Nightcode редактор с подсветкой синтаксиса, где Clojure и ClojureScript работают из коробки и есть несколько хороших примеров кода прямо в той же коробке.

Удивительно, какие вещи может сделать один человек. Проекты также содержат интерактивный REPL прямо на странице ClojureScriptа. Впрочем, это лучше показать.

ClojureScript REPL right in your Google Chrome Dirac. Лучше всего за себя скажет сам скриншот Dirac. Отличная поддержка ClojureScript прямо в вашем браузере!

В этом же контексте имеет смысл посмотреть на paren-soup онлайн редактор для Clojurescript.

AnyBar for boot

Приятное уведомление небольшой иконкой в тулбаре, все ли тесты прошли ок или не все.

 

Про Boot. Сейчас у нас помимо Leininghen у нас есть и Clojure CLI tools и Boot. Так как я сам из мира Ruby on Rails, то Boot это что-то, что совмещает в себе rake, rails, capistrano, rspec и guard  в одном флаконе, если вы понимаете, о чем я.

 

На текущий момент tooling для Clojure/ClojureScript становится настолько простым и мощным, что даже не знаю, с чем это можно сравнить. Я очень рад жить в такое интересное время.

И, наконец, Vase. Быстрый способ разработать на удобном и расширяемом DSL различные микросервисы с JSON. Драматически ускоряет разработку.

Про редакторы и IDE

10.01.2018

Я люблю время от времени тыкать палочкой в различные редакторы и пробовать их в своей работе.

Сейчас появилось очень много интересных и быстрых штук типа Sublime, Atom, LightTable. Ребята из Jetbrains создают отличные (но медленные и прожорливые) IDE типа WebStorm, RubyMine, PyCharm.

Также небезынтересно было посмотреть, что и как используют сейчас в качестве редактора другие программисты https://github.com/A/code-screenshots.

И, конечно, незабвенные Vim и Emacs. Уверен, что постигнуть нужно оба редактора. Первый, обязательно, за дружелюбность к пальцам, которая перерастает при помощи двигательной памяти в такую производительность управления текстом, которую очень непросто достигнуть конкурентам. И, кстати, именно поэтому практически все вышеперечисленные редакторы предлагают режим эмуляции Vim. Включая Emacs. И, кстати, о Emacs.

Постигнуть всю глубину глубин Emacs нужно (можно) только после того, как проходишь программистскую стадию изучения Lisp. Именно тогда начинаешь осознавать, почему вот уже 40 лет (!) этот комбайн бороздит просторы программистских компьютеров. Да потому что сделать интеграцию редактора с любыми современными инструментами, включая те, которые еще не разработали, очень легко. Например, что работает у меня сейчас в Emacs?

Управление Docker. Прямо не выходя из редактора можно управлять контейнерами, имиджами. Ссыль:https://github.com/Silex/docker.el

Интеграция с Redmine. При помощи хоткеев я очень быстро могу вставлять Issues в текст прямо из Redmine!
https://www.youtube.com/watch?v=Qhl3JRO7xp0
Ссыль: https://github.com/gongo/org-redmine

Интеграция с Trello. Хоткеем создавать/редактировать/удалять карточку в списках на доске. Управлять досками.
Ссыль: https://github.com/org-trello/org-trello

Работа в slack.
Ссыль: https://github.com/yuya373/emacs-slack

И вот поэтому каждому уважающему себя программисту в обязательном порядке нужно прочитать одну из самых читаемых статей на YCombinator про Lisp http://www.defmacro.org/ramblings/lisp.html и начать наслаждаться преимуществами IDE, которые заложены в редактор на уровне архитектуры.

Моноколесо Ninebot One S2: Ремонт прокола камеры своими руками

01.11.2017

Однажды ехал вечером домой и не заметил достаточно глубокую яму. После обследовал колесо: включается-выключается, крутится, но шина спущена. Взял в руки потерпевшего и понес 🙂 Насмотрелся видео с разбором колеса до хорошего доступа к шине, также посмотрел видео, где кто-то умудрился заклеить колесо не разбирая. Но у меня не настолько хороши навыки гинеколога, чтобы повторить подобную процедуру.

Что понадобилось мне для ремонта: шестигранники, маленький чтобы открутить небольшой винт снизу педали, побольше для раскрутки основных винтов, которые держат крышку и еще чуть больше, чтобы открутить педали. Хорошая крестовая отвертка. Плоская железка или кусок крепкого пластика, чтобы поддеть шину для разбортировки. Также потребуется велосипедный набор для ремонта камер, в него входит наждак для зачистки поверхности резины, резиновый клей и заплатки.

 

Для доступа к камере прийдется полностью снять:

  • две боковые крышки,
  • две защитные накладки на светодиодные ленты,
  • аккумулятор
  • и полностью крышку с одной стороны.

 

Вся работа заняла около 1-1,5 часа, а в следующий раз, думаю уйдет на всю процедуру не более 30-40 минут.

 

Со снятой полностью крышкой.

Впечатления от внутренностей после разборки и сборки:

  • Качество деталей на хорошем уровне, нет откровенно плохого пластика с заусенцами. Можно менять местами левые и правые педали, боковухи, накладки и все встанет на место.
  • Гидроизоляция выполнена тоже хорошо, под дождем ездить совершенно не страшно. Но опускать в воду на уровень ниже педалей я бы точно не стал.
  • Далеко не на всех винтах была защитная краска. Примерно в половине откручиваемых болтов, там где должна была быть, так что, возможно, сборкой моего колеса занимался немного ленивый китаец.

 

 

На этой фотографии видна моя заплатка на камере снизу.

Если вы решили сами повторить этот опыт, то посмотрите пока это видео, а в следующий раз я попробую записать свое.

Quick fix for rubygems SSL error

24.10.2017

In case you get

ERROR: SSL verification error at depth 2: certificate has expired (10) 
ERROR: Certificate /C=BE/O=GlobalSign nv-sa/OU=Root CA/CN=GlobalSign Root CA expired at 2014–01–28T12:00:00Z 
ERROR: SSL verification error at depth 2: certificate has expired (10) 
ERROR: Certificate /C=BE/O=GlobalSign nv-sa/OU=Root CA/CN=GlobalSign Root CA expired at 2014–01–28T12:00:00Z 
ERROR: SSL verification error at depth 2: certificate has expired (10) 
ERROR: Certificate /C=BE/O=GlobalSign nv-sa/OU=Root CA/CN=GlobalSign Root CA expired at 2014–01–28T12:00:00Z 
ERROR: Could not find a valid gem ‘cocoapods’ (>= 0), here is why: 
 Unable to download data from https://rubygems.org/ — SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (https://api.rubygems.org/specs.4.8.gz
ERROR: SSL verification error at depth 2: certificate has expired (10) 
ERROR: Certificate /C=BE/O=GlobalSign nv-sa/OU=Root CA/CN=GlobalSign Root CA expired at 2014–01–28T12:00:00Z

Do this to fix:

brew postinstall openssl

cp -f /usr/local/etc/openssl/cert.pem /etc/openssl/cert.pem

Compare Postgres speed within Docker and without

07.09.2017

I decided to compare if there will be significant differences between dockerized and non-dockerized Postgres.

Here is my test environment:

  • rails 5 application with rich test suite, about 628 examples,
  • macOS Sierra 10.12.6,
  • Docker 17.06.0-ce-mac19.

I use Postgres docker version alpine 9.6 which is 37,7Mb and raw Postgres 9.6 with GUI for Mac which is 379Mb.

Rails run locally, database.yml connects to the localhost postgres with pool 5 using gem pg (0.21.0).

Here is my docker-compose config

db:
image: postgres:alpine
ports:
- 5432:5432
adminer:
image: adminer
ports:
- 8080:8080
links:
- db

With docker
Finished in 46.86 seconds (files took 17.77 seconds to load)
628 examples, 0 failures

Without docker, 
Finished in 31.35 seconds (files took 8.38 seconds to load)
628 examples, 0 failures

And again withDocker
Finished in 41.64 seconds (files took 8.24 seconds to load)
628 examples, 0 failures

And again without Docker
Finished in 31.53 seconds (files took 8.01 seconds to load)
628 examples, 0 failure

And again with Docker
Finished in 41.77 seconds (files took 8.51 seconds to load)
628 examples, 0 failures

So its 41,5 seconds for Docker version and 31,53 seconds without Docker in average.
This is 24% difference in particular rails rspec case, which is quite significant as for comparison and IMHO is not so significant for the testing loop.

At least this is a price you pay for the container portability and convenience.

Gitlab: continuous delivery setup for Clojure/Java with Docker

05.09.2017

Recently I was doing a microservice with Server Sent Events and Pedestal in Clojure and I though it should be a good idea to implement automatic build and deployment to docker registry container. I already have Gitlab installed and started to play around.

Long story short, here my .gitlab-ci.yml which took me a couple of days to figure out what is the “artifact” in Gitlab and how is it suppose to survive between artifact builds and docker builds.

My current setup has two stages, java build and then docker build. At the first stage we use clojure:lein-2.7.1-alpine, which is quite small, to build jar file from the sources. Then we try to assemble docker container and reuse artifact from the previous build. I was lucky enough to discover that artifact could be saved with help of “cache” option in YML file which preserves folder in “path” for the next build.

So here is the working Gitlab CI configuration which builds JAR as artifact and uploads to the Pipeline page and then creates docker container and publishes it to the internal Gitlab registry.

stages:

  • jar

  • docker

cache:

paths:

- target

jar:

image: clojure:lein-2.7.1-alpine

stage: jar

script:

- lein deps

- lein uberjar

artifacts:

paths:

  - target/it-service-sse-0.0.1-SNAPSHOT-standalone.jar

expire\_in: 1 week

build-master:

stage: docker

image: docker:latest

services:

- docker:dind

script:

- docker login -u "$CI\_REGISTRY\_USER" -p "$CI\_REGISTRY\_PASSWORD" $CI\_REGISTRY

- docker build --pull -t "$CI\_REGISTRY\_IMAGE" .

- docker push "$CI\_REGISTRY\_IMAGE"

I hope this will save you a couple of days for debug.

Happy Continuous Delivery!

Fully automated docker mysql database backup from remote host

17.08.2017

The main idea is to have fully automated docker database backup from low end D-Link NAS DNS-320. I believe, that host, which hosts backups should be responsible for doing whole backup process, not the web-servers, which nowadays designed to be ephemeral.

Solution design is following:

  1. My backup box will copy backup.sh script to the remote coreos-03 host.
  2. Then remote host copies backup.sh script into database container.
  3. Backup box executes docker command «docker exec itservice_db_1 backup.sh» on coreos-03 host, which, in turn, executes mysqlbackup. SQL dump is captured directly from command output and then gzipped.
  4. Rsnapshot saves folder with gzipped SQL dump and rotates old backup folders as necessary.

So, we will need only

Here is my working implementation:

script backup.sh

#!/bin/bash ## env vars are already in docker container 
/usr/bin/mysqldump -u$MYSQL_USER -p$MYSQL_PASSWORD $MYSQL_DATABASE

script backup-coreos-itservice.sh

/ffp/bin/scp /ffp/home/root/backup.sh core@coreos-03:/home/core/itservice/backup.sh 
/usr/sbin/ssh -C core@coreos-03 "docker cp /home/core/itservice/backup.sh itservice_db_1:/usr/local/bin/backup.sh" 
/usr/sbin/ssh -C core@coreos-03 "docker exec itservice_db_1 /usr/local/bin/backup.sh" > latest.sql 
/opt/bin/tar czf itservice-sql-dump.tar.gz latest.sql --remove-files

rsnapshot.conf

backup_script	/mnt/HD/HD_a2/ffp/home/root/backup-coreos-itservice.sh	coreos-03/itservice_db_1

crontab

0 */4 * * * rsnapshot hourly 30 3 * * * rsnapshot daily 0 3 * * 1 rsnapshot weekly 30 2 1 * * rsnapshot monthly

Keep in mind, that you will need to generate ssh keys for your backup box and add it to authorized_keys on coreos-03 host, but this is out of scope this article.

Originally published at blog.it-premium.com.ua.

Ansible Containers

15.08.2017

Long story short. Ansible decided to create separate orchestration tool for the managing application containers, which is obviously a mainstream now. And this is straightforward next step after development tools for server state management like Ansible.

ansible/ansible-container
_ansible-container - Ansible Container is a tool to build Docker images and orchestrate containers using only Ansible…_github.com

But I was really disappointed with Ansible 2.3, because docker_service module is still broken. I tried all possible combinations of docker, docker-py and docker-compose python modules for ansible on remote host with CoreOS and all of combinations failed with different weird errors like “Dockerfile could not be found” and so on. After all the day trying hard to tackle that issues I gave up and wrote simple “docker-compose up” ansible command :(

And this time I decided to give an ansible-container a try. And … ta da … it fails right away from the start.

Starting Docker build of Ansible Container Conductor image (please be patient)…

Failed with

ERROR Unknown exception
Traceback (most recent call last):  
File “/Library/Python/2.7/site-packages/container/cli.py”, line 268, in \_\_call\_\_  
getattr(core, u’hostcmd\_{}’.format(args.subcommand))(\*\*vars(args))  
File “/Library/Python/2.7/site-packages/container/\_\_init\_\_.py”, line 28, in \_\_wrapped\_\_  
return fn(\*args, \*\*kwargs)  
File “/Library/Python/2.7/site-packages/container/core.py”, line 150, in hostcmd\_build  
cache=kwargs\[‘cache’\]  
File “/Library/Python/2.7/site-packages/container/docker/engine.py”, line 82, in \_\_wrapped\_\_  
return fn(self, \*args, \*\*kwargs)  
File “/Library/Python/2.7/site-packages/container/\_\_init\_\_.py”, line 28, in \_\_wrapped\_\_  
return fn(\*args, \*\*kwargs)  
File “/Library/Python/2.7/site-packages/container/docker/engine.py”, line 744, in build\_conductor\_image  
nocache=not cache)  
File “/Library/Python/2.7/site-packages/docker/models/images.py”, line 172, in build  
raise BuildError(event.get(‘error’) or event)  
BuildError: The command ‘/bin/sh -c python /get-pip.py && mkdir -p /etc/ansible/roles /\_ansible/src && cd /usr/local/bin && tar -xz — strip-components=1 -f /tmp/docker.tgz’ returned a non-zero code: 2

So, we will wait for the product to become more stable to give a try one more time. Because I can not understand where to go with this weird errors.

One more leaking abstraction.

О красоте кода

11.08.2017

Когда программист программирует, он начинает разбивать код на модули только потому, что имеет ограничение в своем неокортексе на количество одновременных элементов в памяти. А я ведь когда-то писал на ассемблере, и легкой прогулкой это никак нельзя было назвать, в основном из-за простыней однообразного кода, в котором было легко потеряться.

Из этого ограничения появились концепции ООП. Но с ООП тоже беда. Увеличивается количество уровней абстракции. И тогда в большом проекте удержать всю идею в голове становится невозможно. Функционального подхода к разработке это тоже касается, но в меньшей мере. В Clojure, например, гораздо более выразительно и логично можно бить код на куски.

Для этого есть:

1. Конечно, функции.

2. Неймспейсы.

— —

3. Неймспейсы (читай файлы) легко и непринужденно раскладываются по каталогам.

Таким образом добиться стройности приложения можно ставя себе такие же ограничения как и у нашего неокортекса.

- Не более 7 строк на функцию.

- Не более 7 функций в неймспейсе (модуле).

- Не более 7 модулей в каталоге.

И это сделать легче, чем кажется. В какой-то момент это становится привычкой и второй натурой.

Кстати, если вы дочитали до этого места и вам все еще интересно узнать про Clojure, 2 сентября в Rails Reactor мы делаем Clojure Workshop https://paper.dropbox.com/doc/Kyiv-Clojure-Workshop-3-2.09.17-HLAuCpI8GjWHUtI9ScRy1 приходите.

А вот чем помочь ООП даже не знаю. Господь, жги :)

Deployment of Clojure app to a production with Docker

03.08.2017

Clojure deployment to a production itself not a very complicated task, but with the Docker it becomes more flexible solution. You can deploy your app to the Amazon EC2 or even to Amazon EC2 Container Service just in minutes! In this example we have Ring web server listening on 3000 port an some public resources, like bootstrap css and js in resources/public folder, and application-specific settings in resources/settings folder.

Caution: your Ring web server should be configured to listen on 0.0.0.0 address in order to play nicely with docker.

First, assume we will deploy to the production compiled app as an executable uberjar file. So, you should make sure that your application can be compiled with command

lein uberjar

this will produce the new JAR file in the target folder, like following target/clojure-workshop-0.1.0-SNAPSHOT-standalone.jar.

Check that your executable is running

java -jar target/clojure-workshop-0.1.0-SNAPSHOT-standalone.jar

this should run your Clojure application. Keep in mind, that the entrypoint in your application is specified in project.clj file. In the clojure-workshop.core you should have private “main” function defined.

:main clojure-workshop.core

In case all above is okay, you can proceed with the Dockerfile creation.

Creation of the docker container

FROM java:8-alpine
RUN mkdir -p /app /app/resources
WORKDIR /app
COPY target/uberjar/*-standalone.jar .
COPY resources/public resources/public
CMD java -jar clojure-workshop-0.1.0-SNAPSHOT-standalone.jar
EXPOSE 3000

Then build and tag your image

docker build -t mprokopov/clojure-workshop .

And try to launch

docker run -p 3000:3000 mprokopov/clojure-workshop

In case you did everything right you can enjoy your app response in browser http://localhost:3000. Keep in mind, that the docker assigns different internal network addresses for running containers, so you should configure your Ring web server to listen on the ‘0.0.0.0’ address.

Deployment to the production

Then your task is to deploy to the production. Let’s say you have a docker repository, for instance, in the Dockerhub. Push your image there.

docker push mprokopov/clojure-workshop

Spin off your virtual server instance and login to your remote server via ssh, ensure you have docker instance running with ‘docker ps’, if not, install docker service. Then we can continue

docker pull mprokopov/clojure-workshop

If you decide to have nice looking docker-composer.yaml, this could be your example how to create one:

services:
srv:
build: .
image: mprokopov/clojure-workshop
volumes:
- ./resources/settings:/app/resources/settings
ports:
- 3000:3000
restart: always

See that settings volume? In this way you can store your sensitive or permanent data outside of the ephemeral container to survive between container spin-offs.

docker-compose up -d

If you need nginx-proxy before your container you can enjoy jwilder/nginx-proxy container, then your docker-compose should include VIRTUAL_HOST env variable.

services:
srv:
build: .
image: mprokopov/clojure-workshop
environment:
VIRTUAL_HOST=mydomain.com
volumes:
- ./resources/settings:/app/resources/settings
ports:
- 3000:3000
restart: always

After this you can open http://mydomain.com and enjoy your Clojure application in production with nginx-proxy.

Что почистить на вашем Mac?

28.07.2017

То, что раньше делал прекрасный Daisy Disk, сейчас вполне неплохо выполняет встроенная в Mac OS Sierra утилита.

Разработка фронтенда на веб катится не туда.

22.07.2017

«Спасибо скажем мы Аллаху,
за то, что он наполнил мир глупцами,
Иначе не увидели бы мы мудрецов»

Омар Хайям.

Потребовалось мне на днях запилить динамический веб на стеке React + Redux. Полез посмотреть, чем нынче пользуется уважаемая общественность. Оказывается, стандартно используют Javascript ES-2015, он же ES6. Чтобы запустить это счастье нужно, следите за руками: туго перевязанная упаковка с npm + nodejs, Webpack, Babel. npm доставит вам различные пакаджи, библиотеки типа react, redux, webpack нужен для динамической сборки и предкомпиляции приложения, babel позволит вам писать код на модных стандартах джаваскрипта не особо заботясь о совместимости с предыдущими браузерами.

Ну ок, хорошо, webpack позволяет динамически пересобирать модули с зависимостями при изменении кода и автоматически подгружает/перегружает код в браузере.

Теперь про боль.

Окунулся по локоть в Джаваскрипт. Синтаксис. Сахар. Синтаксический сахар. Больше сахара. Еще больше сахара. Ожирение.

Я вот сейчас даже статью с Хабра процитирую про новый синтаксис для вызова функций.

○ p1 => expr отлично подходит, если параметр один;

○ p1 => expr имеет неявный оператор return для выражения expr;

○ чтобы неявно вернуть объект, нужно обернуть его в круглые скобки () => ({ foo: ‘bar’ }), иначе получите ошибку;

○ круглые скобки необходимы, когда у вас 0, 2 или больше параметров () => expr or (p1, p2) => expr;

○ фигурные скобки в правой части представляют блок кода, в котором может содержаться несколько инструкций () => {};

○ при использовании такого синтаксиса неявного return нет, его нужно писать () => { return ‘foo’ }.

Что? Что это было?

После чего, конечно, начинают появляться статьи из серии «Почему я все еще использую слово function вместо модного синтаксиса». И это естественно, потому что еще после Perl люди поняли, что злоупотребление уличной магией в разработке до добра не доводит. Но, похоже, уже подросло новое поколение программистов, которым нужно заново пройтись по тем же граблям.

Или вот в описании Redux, говорят, в редьюсерах не используйте функции, изменяющие состояние, генерите новые значения. Иммутабельность делайте. Но все равно остается прекрасная возможность выстрелить себе в ногу.

Мой ответ такой: потому что Javascript идет не туда. Потому что асинхронность + мутабельный стейт = проблемы. Именно с этим пытается бороться React. Но React это библиотека, а не язык. Библиотека может только упрашивать и рекомендовать, но не заставлять.

Так получилось, что я довольно сильно два года назад погрузился в Clojure и ClojureScript. Вот про что мне сегодня хочется рассказать, так это про то приятное ощущение, когда понимаешь, что люди очень сильно думали, чтобы сделать правильно и красиво.

Все, о чем могли мечтать большевики, в Clojure/ClojureScript есть – структуры данных иммутабельные по-умолчанию, синтаксис языка НЕ ИЗМЕНЯЕТСЯ, просто потому что незачем это делать, есть прекрасный интероп с Java/Javascript, что открывает обширные возможности использования достояния человечества в виде maven, npm инфраструктуры, при чем активно поощряется использование библиотеки Google Closure, а это, я вам скажу, наверное более правильный путь сохранять совместимость со старыми браузерами, чем Babel. Плюс из коробки отличная минификация через вычисление и отрезание неиспользуемых участков кода при сборке большого js. Все вот эти modular-css пытаются решить проблему code as data и data as code, всунуть в JS возможность использовать CSS как код, при том, что для любого lisp, которым является также и Clojure это нативное свойство языка. Модульность и разделение кода на куски в Clojure вообще сделана гениально: namespace + имя сущности однозначно адресует нужную сущность. Про clojure.spec я вообще промолчу, недооцененная многими библиотека, которая решает фундаментальную проблему несовместимости зависимостей. Что такое правильный подход: основу языка оставлять по-максимуму без изменений, а новые фишки добавлять через библиотеки, так как это сделали, например, с core.async для добавления coroutines как в go. И правильно, если это будут использовать 2% пользователей, то зачем это догружать остальным 98%?

В общем, жаль, что коммьюнити не так активно делает маркетинг Clojure/ClojureScript и в целом порог для входа остается очень и очень высоким для среднего разработчика с одной стороны из-за недостаточного количества примеров, которые бы давали быстрый результат, а с другой стороны понимание функционального подхода требует определенных умственных усилий. Нужна новая кровь в такие проекты. Чтобы начать послушайте бесплатные онлайн курсы по Clojure. Может и понравится, %username%.

Про Docker и Ruby on Rails sprockets and precompiled assets

11.07.2017

Рельсы идут не тем путем.

По-хорошему монолит на рельсах нужно дробить, а то получается 1С:Бухгалтерия, со всеми включенными галочками по-умолчанию. В данном случае умолчания в рельсах слишком greedy.

Взять вот sprockets. Его задача вообще один раз запуститься, минифицировать css и js, и замолчать навеки. При этом он требует кучу разнообразных зависимостей типа execjs, nodejs или v8 от гугла в качестве движка минификации.

Но что делает фреймворк? Sprockets включают в Gemfile, он грузится вместе с полезным кодом, занимает кучу места, мешается под ногами и заставляет программиста танцевать с бубном вокруг задач связанных с деплоем!

Как было бы делать правильно? Минификацию JS и CSS отрезать и делать ее опциональной, отдельной утилитой, если хотите, в составе рельс. Такой же как и rake. Назвать ее minirake и дать набор ключей для запуска. Но! У нас по всему фреймворку нужно протянуть новые названия файлов, которые генерятся при минификации! Потому что как же нам еще разделить код и данные? Короче, считаю это ошибкой дизайна, когда оптимизация НАВЯЗАНА разработчику, то есть для 99% сайтов она будет делаться ПРЕЖДЕВРЕМЕННО.

Тоже самое можно сказать и про turbolinks. Во-первых очень мало народу понимает как оно в реальности работает, соответственно каких косяков ожидать. Это та же самая, мать ее, premature optimization. Всегда гораздо сложнее упрощать что-то сложное, чем добавлять и ускорять по мере необходимости.

Поэтому когда мы логичным образом переходим на деплой рельсового приложения докером, встречаемся лицом к лицу с этими неоптимальными вещами. Идеальный случай — отдельным контейнером разово запускать минификатор, он отработал свое, закрылся и все, до следующего раза. Но нет, в рельсах все приколочено гвоздями к потолку.

И вот здесь детальнее, о чем я имею в виду https://blog.red-badger.com/blog/2016/06/22/docker-and-assets-and-rails-oh-my

Музей Мерседес-Бенц в Штуттгарте

01.06.2017

Музей Мерседес-Бенц в Штутгарте произвел на меня неизгладимое впечатление. Легко можно потратить на его посещение целый день и даже этого будет мало. Пожалуй, начну с развенчания некоторых мифов.  У нас в сознании Мерседес-Бенц представляется одной торговой маркой, но дело в том, что Мерседес был только одной из марок автомобилей компании Даймлер, а компания Карла Бенца была основным конкурентом Даймлер вплоть до объединения в 1926г. Впрочем, все по порядку.

До 1885, в основном использовались паровые двигатели, их устанавливали на огромные станки и поезда, но они были слишком громоздкими для использования в небольших средствах передвижения. Поэтому изобретение бензинового двигателя из-за его компактных размеров дало развитие персональному транспорту.

Первым автомобилем считается трехколесная повозка с двигателем Карла Бенца, которую он сделал в 1885г. примерно в то же время инженеры Готтлиб Даймлер и Вильгельм Майбах создали бензиновый мотоцикл.

Первый бензиновый мотоцикл

Примечательно то, что Даймлер и Бенц никогда не были знакомы, хотя их производства были всего в 90 километрах друг от друга. Даймлер стремился моторизировать все возможные конструкции для передвижения по земле, по воде и по воздуху: бензиновые моторы были установлены на автомобиль, лодку и воздушный шар. Затем эта концепция нашла свое отражение в трехконечной звезде на логотипе компании. Карл Бенц же решил сконцентрироваться на усовершенствовании самого двигателя, и применил оппозитную компоновку, которая значительно улучшала характеристики двигателя. Два цилиндра в двигателях Даймлера располагались в виде буквы V. Чуть позже Даймлер и его главный инженер Майбах изобретают карбюратор.

Первый двигатель для воздушного шара

Первая самодвижущаяся карета Даймлера

Трехколесная самоходка Бенца с первым бензиновым двигателем

моторизованная вагонетка

моторизованная конка

На первых вариантах моторизованых повозок компоновка сидений была не такая, как в современных аналогах. Одним из удачных размещений считалось по 2 пассажира спереди лицом к водителю и один пассажир сбоку от водителя на заднем сидении, как на каретах. Затем пассажирское сидение переехало в том же виде назад, спиной к спине водителя и пассажиры перестали преграждать обзор шоферу. И уже дальнейшим развитием положения пассажиров стало современное размещение за спиной у водителя, лицом по ходу движения.

В Германии появление автомобилей встретили, как водится у консервативных немцев, довольно прохладно и спрос не был большим. Другое дело Франция, где от автомобилей пришли в восторг, это стало модным и покупали их охотно. Франция стала основным рынком сбыта для немецких автомобилей.

Исторический факт: в 1909 стали вводиться первые ограничения по скорости движения в Германии. Разрешалось ехать со скоростью не выше 10 миль в час, то есть со средней скоростью движения лошади.

 

Бытует заблуждение, что «Мерседес» это имя дочери Карла Бенца, но это не так. Мерседес это имя дочери Эмиля Элинека, французского предпринимателя, который попросил создать для него специальный автомобиль с улучшенными скоростными характеристиками для участия в гонках. Впоследствии этот автомобиль завоевал много побед и заслуженно стал самым желаемым автомобилем в линейке Даймлера. Это был замечательный маркетинговый ход, все хотели купить именно Мерседес Даймлера и продажи автомобилей Бенца стали стремительно падать.

Первыми бензоколонками стали отели, где автопутешественники останавливались на ночь, и заправка автомобиля была одним из сервисов отеля, только спустя определенное время автоколонки стали отдельным бизнесом.

Исторический факт: в журнале, выпускаемом женской ассоциацией автомобилистов в 1906г. рекомендовалось использовать женское зеркальце для наблюдения за автомобилями, которые приближаются сзади. До этого зеркал на автомобилях не было.

После проигрыша Германии в первой мировой войне экономика стала драматически ухудшаться, и кредиторы стали давить на автогигантов, что бы они объединили усилия. Так в 1926г. произошло объединение двух конкурентов в одну компанию с названием «Мерседес Бенц».

объединение компаний Даймлер и Бенц

плакат символизирующий объединение Даймлер и Бенц

Исторический факт: в первых самоходных повозках руль был по центру, затем стал смещаться немного левее, чтобы было лучше видно край дороги, а после того, как количество автомобилей стало значительным, переехал вправо, чтобы водителю было удобнее уклоняться от встречного трафика. Первые щетки на лобовое стекло были эдакими щетками с ручкой, которую водитель должен был приводить в действие руками.

После прихода Гитлера к власти компания получает хорошие госзаказы на производство двигателей для самолетов и тяжелой техники, выделяются государственные средства на мотоспорт.

После того, как быстрой победы у немцев не получилось, призыв в армию забирает большую часть мужчин сотрудников компании на фронт и к станкам становятся женщины, а затем и пленные. В годы войны 50% работающих в компании были forced labour employees. Продукция компании стала на 100% армейской, производить и продавать личные автомобили было запрещено. Ближе к концу войны союзники разбомбили завод Мерседес практически полностью.

Восстановлению завода из руин способствовал тот факт, что автомобили Мерседес, которых было произведено к этому времени очень много охотно использовали союзники, и завод стал предоставлять услуги по ремонту и понемногу выпускать запчасти. Компания сосредоточилась на открытии новых заводов за пределами Германии, так один из первых зарубежных заводов был построен в Аргентине.

Компания охотно и много участвовала в гонках, а наработки и удачные идеи из спортивных автомобилей переходили в серийный выпуск.

Так, знаменитая компоновка «крыло чайки» появилась в результате того, что облегченная рама кузова проходила слишком высоко для традиционной двери и пришлось придумать другой способ открывания для дверей.

этот экземпляр так и не успел поучаствовать в гонках

 

Первые подушки безопасности и ABS был изобретен в Mersedes Benz, также как и проведены первые в мире креш-тесты.

На текущий момент у компании есть все модели с современными техническими достижениями: на топливных ячейках и электромобили. Как только рынок будет для их выпуска достаточный, думаю производство быстро станет масштабным.

 

Организован музей настолько здорово, что настоятельно рекомендую поехать в Штуттгарт и увидеть все своими глазами.

Как я запускал интернет-магазин. Часть 4. Переезд.

22.03.2017

В прошлом посте я рассказывал о косяках Opencart, сегодня хочу рассказать о том, как мы переехали на новый движок интернет-магазина Хорошоп.

Самое важное в интернет-магазине это, конечно, удобство для посетителя и дизайн. И здесь у Хорошоп все очень хорошо, поскольку вы не занимаетесь выбором «шкурки» и кастомизацией миллиона параметров как это происходит с Опенкартом, а получаете готовую работу с уникальным дизайном, который везде хорош и складен, в том числе и на мобильных платформах. Мы заказали дизайн «как у Truper» и с первой попытки получили результат, который ни разу не хотелось исправить! А это дорогого стоит.

Второе по важности качество, это удобство заказа и оплаты, возможность выполнить заказ «в один клик»™. И здесь Хорошоп был хорош, интеграция с всевозможными инструментами, такими как Liqpay для оплаты через Приват24, интеграция с API Новой Почты, которая позволяет делать экспресс-накладную (!) и интеграция с смс-сервисом. Все это очень и очень позитивно сказывается на воронке продаж и конверсии.

Третье, аналитика. Интеграция с Google Analytics и Yandex.Metrika работают просто отлично, с пошаговой конверсией, через dataLayer

 

 

Четвертое, управление товаром. Отлично продуманная навигация, удобный парсинг прайса из XLS, все это в сильно лучшую сторону отличает Хорошоп от Opencart. Гибкая фильтрация каталога, там где нужно удобное обновление информации без перезагрузки страницы. Например, установка новой цены на товар может выполняться прямо в таблице товара, как в екселе!

Пакетная загрузка картинок. По-моему про эту фичу следует рассказывать на каждом шагу. Достаточно назвать фотографию товара, переименовать ее название в артикул товара и загрузить через пакетную загрузку. На картинку автоматически наложится watermark, картинка прикрепится к нужному товару и на все про все уйдет минимум времени.

Подрезюмирую. По-моему желание сэкономить затраты на старте и пройти всю боль, отрицание и принятие настройки и интеграции модулей и тем оформления Opencart следует каждому начинающему интернет-предпринимателю. Иначе как он сможет сразу оценить все то, что изначально сделано правильно и хорошо и все то, на что НЕ ПОТРАТИТСЯ уйма времени и сил и будет работать сразу как надо из коробки в хорошем продукте, в таком как Хорошоп.

P.S. При переезде старые ссылки, если об этом не позаботиться специально, перестанут работать и поэтому могут просесть и таки просядут позиции сайта по важным поисковым запроса. Хорошоп здесь показывает себя хорошо, так как позволяет устанавливать те же ссылки на товар, что и были на старом сайте.

Отличные иллюстрации работы известных алгоритмов

15.02.2017

Приятные и понятные анимации иллюстрирующие работу алгоритмов Quicksort, Binary Search, BFS.

https://illustrated-algorithms.now.sh/

Вот я и стал коммитить в Clojure опенсорц

30.12.2016

Я уже как-то признавался в любви языку программирования Clojure, но все руки не доходили до чего-то более-менее серьезного. Всем интересующимся программистам рекомендую почитать Out of the tar pit про растущую сложность создания и поддержки современных программ, и как с этим бороться.

Разработка на Clojure не похожа на легкую прогулку. Сначала открываешь для себя концепции функционального программирования, начинаешь любить рекурсию, абсолютно под другим углом разворачиваешь мозг и только работая над реальным кодом начинаешь постигать все вот это вот дао функциональщины, принципы разделения и организации кода в неймспейсы, трудности дебага, прелести REPLа.

LightTable, конечно, редактор с характером, но, пожалуй, лучшее из того что есть на сегодняшний день для интерактивной разработки, почитайте и посмотрите видео у Никиты Прокопова про это. Да-да, не смотря на весь мой опыт с Vim, Emacs, Spacemacs.

Из сложностей, которые поджидают за углом малоопытного кложуриста, я бы отметил понимание работы протоколов, defrecord, макросов и интероп с Java. Нужно довольно четко понимать, когда уместно использование всего этого, а когда нет. Разобраться со всем этим помогут хорошие книги. Обратной стороной начальной сложности являются в перспективе более краткие и выразительные программы, которые легко и приятно дополнять и расширять.

И вот, работая над Clojure прототипом JSON API нашей админки я незаметно для себя стал контрибьютором в Open Source, чему, конечно, очень рад.

Вот моя первая clojure библиотека для работы с бизнес-временем при расчетах различных SLA. Значительно более элегантное функциональное и гибкое решение, нежели то, которое я запилил когда-то на Ruby. Тестирование в Clojure делается во много раз приятнее, чем рельсовым rspec. Гораздо меньше фрикций на подготовку тестового окружения, да и при желании написание тестов можно проводить прямо в редакторе в том же файле что и само код при интерактивной разработке! А затем переместить все тесты в отдельный выделенный для этого неймспейс.

Собственно вот линк на мою первую библиотеку https://github.com/mprokopov/business-time. Пришлось окунуться в недружелюбный мир Java и разобраться с могучей joda-time и почему у всех реализаций joda-time для clojure отсутствуют то тут то там обертки (wrappers) методов для объектов типа Duration и многого другого.

Также закоммитил pull-request в Korma для лечения JDBC MySQL timezone issues, про наличие которых вообще не подозревал, пока не стал разбираться с business time.

https://github.com/korma/Korma/pull/374. Вообще Korma это такой почти рельсовый ORM, который выглядит очень удобно для работы с SQL при помощи абстракций, так близких всем рельсовикам. Но что действительно хочется попробовать это мигрировать от MySQL/Postgres в сторону Datomic. Datomic выглядит той самой «серебрянной пулей» баз данных, которая обладает просто таки уникальными свойствами.

Для разработки JSON API есть подход от использования самого «ничего», то есть голого Compojure, так и более высокоуровневые Liberator и Pedestal, которые уже больше похожи на фреймворки, нежели библиотеки. Кстати, с Clojure очень хорошо доходит разница между библиотеками и фреймворками, но следует все же помнить, что с большей мощью приходит и большая ответственность.

Делать open source мир вокруг себя богаче легко и приятно, присоединяйтесь, друзья!

Why docker for Rails development sucks

04.11.2016

I’ve been excited about docker idea for everything, from production to development. It’s definitely ok for production, continuous integration and deployment rollouts, but sucks for development and here is why.

Development process should be as fast and responsive as possible. Responsiveness and robust feedback are critical for development. REPL should give results immediate, because human waiting for computer is really sucks!

And when you right in the middle of development process and feedback is slow because of docker this is not what makes you happy, it’s stopping your read-evaluate-print loop and adding distraction factors to your workflow.

You can argue that dockerized development platform has benefits to be quickly redistributed for new devs and to be consistent with production environment. And definitely you’re right.

Tradeoff is following: on one hand is same environment as in production and quick up with necessary pars of app, and on another is slow feedback, spatially when running your tests.

It’s up to you to decide what’s more important for your team.

What I’m going to try is to make simple plain RoR development as usual without docker, to have speedy tests, responsive environment, and after making new features just push my git repo, then dedicated box should make new staging release and deploy it to staging server.

Дайджест находок вебмастера 2016-10-27

27.10.2016

Полезно иногда заглядывать в исходники интересных сайтов, вот некоторые из моих находок.

Такой же вебвизор как и в Яндекс Метрике. Бесплатный чуть более чем полностью. https://www.smartlook.com/

%d1%81%d0%ba%d1%80%d0%b8%d0%bd%d1%88%d0%be%d1%82-2016-10-27-13-31-42

Наблюдать за пользователями сайта realtime? Да еще и кликать за них мышью? Да, такое возможно.

https://peekin.io/ Сам сервис хоть и бесплатен, но в стадии alpha.

Stay tuned.

Блеск и нищета OpenCart как движка для интернет-магазина

13.10.2016

Это продолжение серии статей «Как я запускал интернет-магазин«. Часть 1 (Аналитика спроса перед запуском). Часть 2 (Выбор движка для интернет-магазина).

opencart1-500x500

А еще я в некотором роде разработчик. Для меня HTML, CSS, JS не пустые аббревиатуры, в 1999 году я сделал первый PHP+MySQL сайт за деньги. Сейчас у меня другое занятие, которое приносит деньги, но хотелось окунуться в чудесный мир e-commerce за небольшие деньги и сжатые сроки. По опросам знакомых веб-студий я сошелся на мнении, что нужно ставить OpenCart. Модулей ведь много, на все случаи жизни практически. Да и в базе движок выглядит достаточно приличным. И мой давний приятель, у которого довольно раскрученный магазин с хорошим трафиком, сказал «только Opencart есть движок с православно правильной архитектурой».

Ну, думаю, буду экономить свое дорогое время разработчика, буду покупать модули, это же дешевле стоимости часов разработчика. Забегая вперед, в итоге пришлось мне тратить ОЧЕНЬ МНОГО своего времени разработчика после установки модулей чтобы их просто подружить друг с другом да и просто устранить проблемы, не говоря уже о том, что многие модули работают мягко говоря не так, как ожидалось. А некоторые модули вообще оказались несовместимыми друг с другом 🙁 .

Итак, закатал я рукава и полез по колено в OpenCart, думал, всего-то, установить пару модулей и вперед к вершинам электронной коммерции и маркетинга.

Первым делом нужно выбрать нужную шкурку. Ну ок, магазин ведь ручного инструмента, поэтому поехали искать по ключевому слову «Tools». И вот она, черная тема в зеленой палитре на вьетнамском сайте. Купил за $25. Ставлю. И сразу же — оппа! Оказалось, что при достаточно большом описании категории оно неправильно позиционируется и текст прячется под фиксированным размером «бокса» ну и много всего по мелочи. Ушел редактировать стили темы, разбираться что где хранится, какова структура. Так что «сели и поехали» это скорее всего не про нас.

Открытие №1. Выяснилось, что модули любят ПЕРЕЗАТИРАТЬ код движка. Это значит, однажды установив подобный модуль вы лишитесь совместимости с новыми версиями OpenCart. Для решения этой проблемы придумали систему VQMOD или же ее реинкарнацию OPMOD, механизм, который стал частью Opencart. Суть ее в том, чтобы описывать изменения кода в специальном формате в файле XML, который потом достаточно загрузить через FTP или встроенный механизм загрузки и у вас будет установленный модуль. То есть сам функционал модуля описывается текстом, который нужно найти через Regexp в исходном файле и кодом, который нужно добавить или заменить в нужном месте. Таким образом выполняется эдакая прекомпиляция модулей в итоговый файл, который затем хранится где-то в кеше. Нужно ли говорить, c какой болью выходит отладка модуля? А взаимодействие одного модуля с другим?

Впрочем, вы и так не сможете без крови и соплей переехать на новую версию OpenCart потому что разработчики НЕ ЗАБОТЯТСЯ ОБ ОБРАТНОЙ СОВМЕСТИМОСТИ. То есть так и сказали, релиз OpenCart 2.2 не используйте, что-то он вышел у нас слишком сырым.

Открытие №2. Модулей ОЧЕНЬ много, и из модулей нужно уметь ВЫБИРАТЬ, потому что количество модулей только интеграции с Новой Почтой много-много. Вот, например, простыня статьи с выбором из ШЕСТИ модулей которые делают примерно одно и то же. Так я приобрел модуль Microformats Pro, функционал которого в последствии был продублирован функционалом модуля CompleteSEO. И теперь мне не очень понятно, не случится ли что-то с поисковой выдачей, если я выключу модуль Microformats Pro и перейду на поддержку микроформатов через CompleteSEO и полная ли в CompleteSEO поддержка этих самых микроформатов.

Открытие №3. Разнообразная (хорошая и не очень) техподдержка модулей.

Я купил модуль для интеграции с Google Tag Manager, который сразу же (!) не смог установиться на Opencart 2.1.0.1. Индус-разработчик по началу никак не реагировал на запросы, и только после запроса на возврат денег сразу же отписался и признал проблему с установкой, выпустил обновление.

Ведь у Opencart Store нет механизма попробовать модуль перед использованием, то есть я должен его купить и после этого, если возникнут какие-то проблемы, требовать возврата денег.

Открытие №4. Модули бывают несовместимыми.

Например, есть модуль, который собирает все шаги заказа на одной странице, чтобы не проводить покупателя через 6 страниц-шагов проведения заказа на одной странице и выполняет сам заказ при помощи AJAX. И это правильно и хорошо, но делает модуль Google Tag Manager чуть менее чем полностью бесполезным, поскольку перестает считать сумму заказа в аналитике Google Analytics через механизм dataLayer, поскольку сам механизм заказа стал работать по-другому. И здесь без программиста тоже уже никак не обойтись.

Открытие №5. К работе с SSL готов? Не совсем.

Скорее всего вы слышали, что сайты с SSL гугл любит больше, чем сайты без поддержки SSL, да и в Opencart это должно поддерживаться «одной галкой», но нет, не все так просто. Механизм админки перестает корректно работать с заказами, поскольку он делает AJAX запрос к API из HTTPS на HTTP, а это уже небезопасная операция, что также отобрало на отладку порядочно моего времени.

Мультимагазин. Хм. У нас есть отдельная категория товаров, таких как уровни и нивелиры, и хорошей идеей было запустить интернет-магазин отдельно, с отдельным дизайном. И да, сделать это оказалось просто и легко, с той же «шкуркой», по тем же правилам обработки заказов и единой базой клиентов. Но вот незадача, нет способа прикрутить Google Analytics к отдельному магазину. Да, вот так.

Фильтры. Это такая штука, которая нужна, пожалуй, каждому магазину. Это когда помимо категорий товары хорошо бы показывать «для мужчин», «для женщин», «для детей», «для строителей», «для детей строителей» и так далее. Очень полезно с точки зрения удобства использования. Внутренним функционалом OpenCart они представлены не очень хорошо, и следует использовать сторонний плагин типа MegaFilter. Но к этому плагину мне делать подход пока страшно O_o.

Резюме. Не смотря на то, что в базовой поставке Opencart достаточно неплох, я все еще не представляю, как быть с обновлениями версий движка магазина и что делать с несовместимостью модулей и как влиять на поставщиков модулей и их качество. Использовать OpenCart как есть, без каких-либо модулей не представляется возможным. Мы же хотим и различные оплаты принимать и доставки и гибко управлять SEO настройками, а это неизбежно потребует от нас влезания в ад модулей и поиска ответов на различных форумах и группах вконтакта.

Я много раз хотел переписать магазин на Ruby on Rails, с которым у меня много давней дружбы, но я вовремя каждый раз себя останавливал, я очень хорошо понимаю, что такое ввязаться в собственную разработку. Если я не собираюсь торговать интернет-магазинами, то не нужно делать еще один движок, как бы ни чесались руки.

Сейчас присматриваюсь к одной платформе для интернет-магазинов, о которой расскажу попозже, возможно, все перечисленные мной проблемы отпадут сами собой. Будем посмотреть.

Блеск и нищета OpenCart как движка для интернет-магазина

13.10.2016

Блеск и нищета OpenCart как движка для интернет-магазина

13/10/2016

Это продолжение серии статей «Как я запускал интернет-магазин«. Часть 1 (Аналитика спроса перед запуском). Часть 2 (Выбор движка для интернет-магазина).

А еще я в некотором роде разработчик. Для меня HTML, CSS, JS не пустые аббревиатуры, в 1999 году я сделал первый PHP+MySQL сайт за деньги. Сейчас у меня другое занятие, которое приносит деньги, но хотелось окунуться в чудесный мир e-commerce за небольшие деньги и сжатые сроки. По опросам знакомых веб-студий я сошелся на мнении, что нужно ставить OpenCart. Модулей ведь много, на все случаи жизни практически. Да и в базе движок выглядит достаточно приличным. И мой давний приятель, у которого довольно раскрученный магазин с хорошим трафиком, сказал «только Opencart есть движок с православно правильной архитектурой».

Ну, думаю, буду экономить свое дорогое время разработчика, буду покупать модули, это же дешевле стоимости часов разработчика. Забегая вперед, в итоге пришлось мне тратить ОЧЕНЬ МНОГО своего времени разработчика после установки модулей чтобы их просто подружить друг с другом да и просто устранить проблемы, не говоря уже о том, что многие модули работают мягко говоря не так, как ожидалось. А некоторые модули вообще оказались несовместимыми друг с другом 🙁 .

Итак, закатал я рукава и полез по колено в OpenCart, думал, всего-то, установить пару модулей и вперед к вершинам электронной коммерции и маркетинга.

Первым делом нужно выбрать нужную шкурку. Ну ок, магазин ведь ручного инструмента, поэтому поехали искать по ключевому слову «Tools». И вот она, черная тема в зеленой палитре на вьетнамском сайте. Купил за $25. Ставлю. И сразу же — оппа! Оказалось, что при достаточно большом описании категории оно неправильно позиционируется и текст прячется под фиксированным размером «бокса» ну и много всего по мелочи. Ушел редактировать стили темы, разбираться что где хранится, какова структура. Так что «сели и поехали» это скорее всего не про нас.

Открытие №1. Выяснилось, что модули любят ПЕРЕЗАТИРАТЬ код движка. Это значит, однажды установив подобный модуль вы лишитесь совместимости с новыми версиями OpenCart. Для решения этой проблемы придумали систему VQMOD или же ее реинкарнацию OPMOD, механизм, который стал частью Opencart. Суть ее в том, чтобы описывать изменения кода в специальном формате в файле XML, который потом достаточно загрузить через FTP или встроенный механизм загрузки и у вас будет установленный модуль. То есть сам функционал модуля описывается текстом, который нужно найти через Regexp в исходном файле и кодом, который нужно добавить или заменить в нужном месте. Таким образом выполняется эдакая прекомпиляция модулей в итоговый файл, который затем хранится где-то в кеше. Нужно ли говорить, c какой болью выходит отладка модуля? А взаимодействие одного модуля с другим?

Впрочем, вы и так не сможете без крови и соплей переехать на новую версию OpenCart потому что разработчики НЕ ЗАБОТЯТСЯ ОБ ОБРАТНОЙ СОВМЕСТИМОСТИ. То есть так и сказали, релиз OpenCart 2.2 не используйте, что-то он вышел у нас слишком сырым.

Открытие №2. Модулей ОЧЕНЬ много, и из модулей нужно уметь ВЫБИРАТЬ, потому что количество модулей только интеграции с Новой Почтой много-много. Вот, например, простыня статьи с выбором из ШЕСТИ модулей которые делают примерно одно и то же. Так я приобрел модуль Microformats Pro, функционал которого в последствии был продублирован функционалом модуля CompleteSEO. И теперь мне не очень понятно, не случится ли что-то с поисковой выдачей, если я выключу модуль Microformats Pro и перейду на поддержку микроформатов через CompleteSEO и полная ли в CompleteSEO поддержка этих самых микроформатов.

Открытие №3. Разнообразная (хорошая и не очень) техподдержка модулей.
 Я купил модуль для интеграции с Google Tag Manager, который сразу же (!) не смог установиться на Opencart 2.1.0.1. Индус-разработчик по началу никак не реагировал на запросы, и только после запроса на возврат денег сразу же отписался и признал проблему с установкой, выпустил обновление.

Ведь у Opencart Store нет механизма попробовать модуль перед использованием, то есть я должен его купить и после этого, если возникнут какие-то проблемы, требовать возврата денег.

Открытие №4. Модули бывают несовместимыми.
 Например, есть модуль, который собирает все шаги заказа на одной странице, чтобы не проводить покупателя через 6 страниц-шагов проведения заказа на одной странице и выполняет сам заказ при помощи AJAX. И это правильно и хорошо, но делает модуль Google Tag Manager чуть менее чем полностью бесполезным, поскольку перестает считать сумму заказа в аналитике Google Analytics через механизм dataLayer, поскольку сам механизм заказа стал работать по-другому. И здесь без программиста тоже уже никак не обойтись.

Открытие №5. К работе с SSL готов? Не совсем.
 Скорее всего вы слышали, что сайты с SSL гугл любит больше, чем сайты без поддержки SSL, да и в Opencart это должно поддерживаться «одной галкой», но нет, не все так просто. Механизм админки перестает корректно работать с заказами, поскольку он делает AJAX запрос к API из HTTPS на HTTP, а это уже небезопасная операция, что также отобрало на отладку порядочно моего времени.

Мультимагазин. Хм. У нас есть отдельная категория товаров, таких как уровни и нивелиры, и хорошей идеей было запустить интернет-магазин отдельно, с отдельным дизайном. И да, сделать это оказалось просто и легко, с той же «шкуркой», по тем же правилам обработки заказов и единой базой клиентов. Но вот незадача, нет способа прикрутить Google Analytics к отдельному магазину. Да, вот так.

Фильтры. Это такая штука, которая нужна, пожалуй, каждому магазину. Это когда помимо категорий товары хорошо бы показывать «для мужчин», «для женщин», «для детей», «для строителей», «для детей строителей» и так далее. Очень полезно с точки зрения удобства использования. Внутренним функционалом OpenCart они представлены не очень хорошо, и следует использовать сторонний плагин типа MegaFilter. Но к этому плагину мне делать подход пока страшно O_o.

Резюме. Не смотря на то, что в базовой поставке Opencart достаточно неплох, я все еще не представляю, как быть с обновлениями версий движка магазина и что делать с несовместимостью модулей и как влиять на поставщиков модулей и их качество. Использовать OpenCart как есть, без каких-либо модулей не представляется возможным. Мы же хотим и различные оплаты принимать и доставки и гибко управлять SEO настройками, а это неизбежно потребует от нас влезания в ад модулей и поиска ответов на различных форумах и группах вконтакта.

Я много раз хотел переписать магазин на Ruby on Rails, с которым у меня много давней дружбы, но я вовремя каждый раз себя останавливал, я очень хорошо понимаю, что такое ввязаться в собственную разработку. Если я не собираюсь торговать интернет-магазинами, то не нужно делать еще один движок, как бы ни чесались руки.

Сейчас присматриваюсь к одной платформе для интернет-магазинов, о которой расскажу попозже, возможно, все перечисленные мной проблемы отпадут сами собой. Будем посмотреть.

Originally published at nexusnotes.ru on October 13, 2016.

Дайджест моих находок

20.09.2016

Некоторые концепции, которые я нахожу, находят во мне такой внутренний восторг, что я просто не могу о них не рассказать. Поехали.

 

Фреймворк Grid Style Sheets — https://gridstylesheets.org/ или Constraints Cascaded Style Sheets.

Это не очередной bootstrap, это способ сделать хороший динамичный лейаут через JS + CSS используя идеи верстки с ограничениями (я не знаю как лучше перевести constraints layout). Использует алгоритм Cassowary для управления органичениями (constraints) при вычислении лейаута, тот же самый что и Apple в Cocoa верстке. Позволяет делать фантастические вещи, в том числе и очень респонсив верстку. Возможно, это то, каким должен быть CSS в будущем.

 

Язык ELM — http://elm-lang.org/.

Язык, который тесно связан с фреймворком, компилируемый в Javascript диалект Хаскеля. Я бы его рассматривал как альтернативу AngularJS, так как его область применения – только фронтенд. На него обязательно стоит посмотреть уже хотя бы потому, что он служит примером хорошей расширяемой архитектуры веб-приложений с функциональным подходом.

 

Playlist from ClojureTRE 2016 conference. Отметитил для себя отличные выступления Никиты Прокопова про Rum и Девида Нолана про ClojureScript.

 

Книгу, которую рекомендует как обязательную к прочтению Рич Хики How To Solve it и его PDF copy. И, конечно, не могу не порекомендовать его знаменитый доклад Hammok Driven Development. Если кратко изложить суть, то она будет следующей: прежде чем что-то кодить отойдите в сторону, подумайте, решите проблему сначала в голове. Решение проблем это навык, и как любой навык его можно и нужно качать так же как мы качаем мышцу.

Parinfer — великолепный способ indent + paredit в одном флаконе. Очень удобно для разработки Clojure(Script) приложений, выравнивание будет автоматически устанавливать нужные скобочки. Для суперленивых. Есть плагины для всех популярных редакторов.

TODO: прочитать Tools for thought.

APFS доступен в macOS Sierra

11.08.2016

APFS действительно новая файловая система от Apple вобравшая в себя лучшие черты ZFS.

Но в дисковой утилите вы его не найдете, только через командную строку diskutil

diskutil apfs list

WARNING: You are using a pre-release version of the Apple File System called

APFS which is meant for evaluation and development purposes only.

Files stored on APFS volumes may not be accessible in future releases

of macOS.  You should back up all of your data before using APFS and

regularly back up data while using APFS, including before upgrading

to future releases of macOS.

You can pass the «-IHaveBeenWarnedThatAPFSIsPreReleaseAndThatIMayLoseData»

option between the «APFS» verb and the APFS sub-verb to bypass this message.

Proceed? (y/N) y

No APFS Containers

 

Подробнее здесь.

Как я запускал интернет-магазин. Часть 2. Выбор движка интернет-магазина.

29.07.2016

Часть 2. Выбор движка для нашего интернет-магазина.

В части 1 я рассказал про аналитику рыночной ниши и ее потенциал для заработка. И сразу же возникает технический вопрос, что будем использовать, а не написать ли свой интернет-магазин? Не смотря на то, что я сам разработчик, но тратить время на разработку своего велосипеда с нуля, при всех преимуществах, пока не стал. Решил обойтись малой кровью и попробовать использовать то, что уже есть на рынке. Про некоторых популярных я сегодня вам расскажу.

Популярные претенденты:

  • Opencart
  • CS Cart
  • Magento
  • PrestaShop
  • еще один выбор можно условно считать вариацией на тему интернет-магазина это плагин для WordPress под названием wooCommerce

У меня были такие критерии для выбора:

  • бесплатный движок
  • рекомендации друзей
  • наличие доступных программистов с компетенцией
  • часовой рейт доступных программистов с такой компетенцией
  • наличие доступных «шкурок» — тем для магазина
  • большая база плагинов — расширений
  • активная разработка

По опросам друзей лидировал Opencart, затем CS Cart и Magento. Opencart богат недорогими расширениями-модулями, в тоже время ценник на модули и на рейт программиста для Magento сильно выше. Ну а CS Cart, по отзывам, уже содержит в базе большинство функционала, который для opencart и magento поставляется в виде плагинов.

К Opencart куплена шкурка-тема, пришлось ее немного доработать для исправления глюков.

Какие плагины необходимо устанавливать в обязательном порядке? Выделю следующие:

  • CompleteSEO — даст возможность гибко управлять мета-информацией для успешной раскрутки. Указывать URL которые содержать ключевые слова, H1, meta title, meta keywords и description, а также добавит schema разметку для поисковиков, чтобы красиво отображать названия и цену прямо в результатах поиска.Скриншот 2016-07-29 14.54.56
  • DKACart позволит просматривать брошенные корзиныСкриншот 2016-07-29 14.56.05
  • uLogin для простой авторизации покупателей через соцсетиСкриншот 2016-07-29 14.57.30
  • google Tag Manager для запуска различных счетчиков и метрик, также для отправки информации о покупках в Google AnalyticsСкриншот 2016-07-29 15.02.02
  • модуль доставки перевозчиком Новая Почта
  • модуль доставки перевозчиком DeliveryСкриншот 2016-07-29 15.02.29

Поскольку по-умолчанию страница оформления заказа в Opencart работает в 5 этапов также пришлось применить скрипт оптимизации оформления заказа, сборка всех полей заказа на одну страницу.

Скриншот 2016-07-29 15.03.33

Для повышения безопасности и благотворного влияния на поисковики был подключен SSL сертификат от Startssl. И настроил перенаправление с http на https версию сайта.

Скриншот 2016-07-29 15.04.31

 

Итого мои впечатления от выбора: Opencart позволяет быстро «взлететь» и специалистов-разработчиков на рынке очень много, поэтому можно их «перебрать» и найти годного специалиста по критерию цена/качество. В целом для меня как для разработчика покопаться в Opencart и его плагинах оказалось опытом довольно интересным, но малоприятным. Все потому, что разработчики Opencart решили применить такое себе кунг-фу VQMOD для того, что бы код движка был неизменным и его можно было «патчить» без изменения. Идея хорошая, но реализация в виде XML файла, который содержит строки для regexp поиска и замены кода кусками … мягко говоря не очень.

В следующей части я расскажу про инструменты аналитики и продвижения интернет-магазина: Google Tag Manager, Google Analytics, Yandex.Metrika + Webvisor, Google Search Console и Yandex.Webmaster.

 

Читайте продолжение: Часть 3. Блеск и нищета Opencart.

Обзор Xiaomi Roidme 2s

25.07.2016

Для непосвященных FM-трансмиттер это устройство, которое передает аудио сигнал на FM частоте, которую вы можете словить в вашем автомобиле. Таким образом вы можете проигрывать любимые мелодии со смартфона используя аудиосистему автомобиля без необходимости использовать какие-либо провода.

FM-трансмиттерами я пробовал пользоваться и раньше. Для iPhone 4 у меня был Griffin iTrip, который я бы не сказал, что хорошо работал, да еще и адски быстро садил батарею, да и требовал быть подключенным к непосредственно телефону. Roidme же предлагает еще и подпитывать ваш телефон, имея два (!) разъема зарядки по 2A, что, конечно же, не может не оценить ваша вторая половина, когда сможет одновременно заряжать и свой и ваш смартфон.

Выполнен Roidme в превосходном корпусе из качественного пластика, металлическая часть с хромированным покрытием выглядит тоже очень презентабельно. Вставив в прикуриватель я не без удивления обнаружил, что крышку пепельницы можно закрыть и трансмиттера не будет видно вовсе!

После запуска двигателя Roidme займет предустановленную FM частоту о чем оповестит вас звуковым сигналом, а также цветом индикатора разъема. В Roidme 2S цвета, которыми будет мигать устройство настраиваются прямо из приложения.

IMG_2148

Различие Roidme от Roidme 2s внешне только в наличии дырочки микрофона. Roidme 2s также имеет возможность работы как fands free используя встроенный микрофон, однако, на моем опыте это не очень хорошая идея, поскольку качество звука оставляло желать лучшего. Оно и понятно, расстояние до источника звука (меня) довольно приличное и таких помех как шум от двигателя предостаточно.

IMG_2149

Rodime и Roidme 2s абсолютно идентичны сбоку, но отличаются внутренностями.IMG_2150

С RoidMe я столкнулся с неприятной особенностью, что нельзя его настроить из iPhone. Для изменения частоты с дефолтной 94,6 на более свободную пришлось использовать Android.

IMG_2151 IMG_2152

 

В качестве бонуса ваш Roidme способен мониторить вольтаж аккумулятора в автомобиле в состоянии работы и в выключенном.

IMG_2153

 

Краткий вывод: Roidme радует превосходным качеством сигнала, однозначно рекомендую к приобретению. Нет ничего лучше за эти деньги.

Tern — умный autocomplete для Javascript в различных редакторах

22.07.2016

Просто посмотрите на демо, и все станет понятно без слов.Скриншот 2016-07-22 12.03.08

http://ternjs.net/doc/demo/#simple

Как я запускал интернет-магазин. Часть 1. Анализ спроса и потенциальной прибыли.

22.07.2016

При запуске интернет-магазина, помимо самой идеи, появляется множество различных задач, и подводных камней. Я поделюсь моим концентрированным опытом по запуску нашего интернет-магазина.

Стратегия интернет-магазина.

С чего начинается запуск? Обычное дело, когда есть идея, которая нравится ее автору, но как протестировать ее на жизнеспособность? Как понять, сколько будет вообще потенциальных продаж, какова прибыль и через какое время?

Потенциальный спрос на товары и его динамика.

Как узнать количество продаж товара в той же Розетке? Конечно, они не поделятся статистикой, а есть ли другой способ? Оказывается есть.

Для этого есть такая гипотеза: 1% от количества всех поисковых запросов заканчиваются покупкой. Как посчитать количество поисковых запросов? Есть ответ — статистика поисковых запросов в популярных сервисах.

Категорий много, вручную набивать будет долго. Используем ParseHub для получения списка всех категорий с сайта оптового поставщика.

Скриншот 2016-07-22 16.28.04

Тестируем категории в планировщике ключевых слова в Google Adwords и получаем детальный отчет по ключевым словам категорий ручного инструмента за два года. .

Скриншот 2016-07-22 16.19.38

Также видно, кто откуда приходят покупатели и в каких пропорциях. Киев делает 30,8% всех покупок по отношению к Украине.

Скриншот 2016-07-22 16.35.09

Динамика спроса по товарным категориям

И динамику спроса по каждой товарной категории.

Скриншот 2016-07-22 16.37.30

Из таких графиков становится понятно, как действовать с акциями, так, например, видно, что на лопаты повышается спрос в ноябре и январе, следовательно нужно разрабатывать акции по лопатам в ноябре и январе, а ближе к июлю переключаться на другие товары, например, на полив.

В среднем в наших товарных категориях около 60000 поисковых запросов в месяц. Тренд по поисковым запросам через сервисы планировщик ключевых слова в Google Adwords и Yandex Wordstat показывает, что запросы по данным категориям растут примерно на 15% в год. Это значит приблизительно 600 потенциальных покупок ручного инструмента всего в Украине в среднем за месяц, в следующем 2017 году потенциально будет 690 покупок, в 2018 будет 793, а в 2019 будет 912, если динамика в 15% останется неизменной. Если мы претендуем выйти к 2019 году на объем треть рынка продажи ручного инструмента в месяц, то это будет примерно 304 покупки в месяц. А понимание этого факта нам дает возможность посчитать приблизительную прибыль.

Какая будет прибыль через три года?

Допустим в 2019 мы захватили треть рынка. Какая будет прибыль?

При марже на уровне 25% и среднем чеке в 300грн/мес у нас будет объем продаж 114000грн/мес., следовательно, валовая прибыль 28500грн/мес. Поехали от обратного, решим небольшое уравнение и построим линейную зависимость (хотя, конечно, правильнее было бы нелинейную).

Скриншот 2016-07-22 15.58.01

Ну ок, уже становится понятно, на что рассчитывать в перспективе и что не нужно иметь большую расходную часть на самом старте. Таким образом мы будем самостоятельно принимать заказы по телефону не нанимая сторонние сервисы и не делать доставку по городу используя курьеров, а доставлять исключительно перевозчиками Новая Почта, Деливери с оплатой доставки покупателем. Подключать колл-центр и организовывать службы доставки будем тогда, когда прибыль будет перекрывать эти расходы. Кстати, мы даже можем приблизительно посчитать, когда это произойдет.

Итак, потенциальные цифры по прибыли понятны, сезонность спроса в целом тоже.

UPDATE: Часть 2. Выбор движка интернет-магазина.

Много про Docker, CoreOS, Ansible и Xen

15.07.2016

Завел отдельный блог по тематике контейнеризации про Docker, Ansible, Xen, CoreOS : http://blog.it-premium.com.ua

Прошу любить и жаловать. И читать. И комментировать.

Видео и слайды мастер-класса про ИТ для бизнеса

08.07.2016
  • как правильно излагать мысли от сисадмина директору и наоборот?
  • какие ИТ вопросы правильно задавать и кому?
  • где можно и нужно экономить на ИТ, а где не стоит
  • безопасность
  • мониторинг

Чистый концентрат моего опыта управлением ИТ с точки зрения бизнеса и аутсорсинга ИТ-процессов.

Об этом и другом я рассказал на небольшом мастер-классе. Спасибо «Клубу деловых людей» за предоставленную возможность и Саше Пузько за помощь в съемке.

Слайды

[slideshare id=63841245&doc=2016-03-22-160708104224]

Видео

Редактор мечты или как, наконец, холивар Emacs или Vim завершился.

06.06.2016

Если уж быть совсем-совсем кратким, то встречайте Spacemacs. Это такой настроенный Emacs с клавиатурными сочетаниями от Vim.

Иногда я снимаю шапочку управленца IT-Premium и одеваю другую свою шапочку из фольги и становлюсь программистом. У каждого программиста, мой дорогой читатель, есть второй инструмент по важности после головы – это редактор кода.

Spacemacs

Каким должен быть хороший редактор для кода? Удобным, быстрым, с подсказками и свистелками? Но, конечно же, самый хороший инструмент это тот, которым ты умеешь пользоваться. Я тот самый парень, который все время пробует новые и новые инструменты, например:

  • Sublime Text
  • Emacs
  • Vim
  • Light Table
  • Atom
  • RubyMine

С каждым из этих инструментов я провел довольно долго времени и, думаю, что понимаю их плюсы и минусы.

Sublime Text мне очень нравится за скорость работы, она просто потрясающая! Очень быстрый переход fuzzy search по названию файла, множество интересных пакетов, таких как Git Gutter. Хорошо продуманный редактор.

RubyMine это, конечно же, полноценная IDE. Умное дополнение при наборе текста, доступ к записям базы данных и тому подобные фишки. Мощно и хорошо, но довольно долго загружается из-за Java и обладает повышенными требованиями к расходу памяти.

LightTable, безусловно, должен быть в вашем списке редакторов для ознакомления. Пожалуй, это видео и этот пост о редакторе LightTable стоят тысячи слов. Интерактивная разработка с просмотром результатов выполнения кода, который ты только что набрал захватывает дух. Интересный факт — редактор написан на молодом ClojureScript, который, в свою очередь преобразовывается в Javascript и запускается через Electron.

Vim драматически увеличивает скорость набора и редактирования текста. Но качественный скачок в скорости набора произойдет после запоминания комбинаций на уровне мышечной (пальцевой) памяти. Редактор очень быстро запускается и достаточно хорошо расширяется всевозможными плагинами (например, Rails). Но писать свои плагины для расширения функциональности лично для eменя оказалось нелегким испытанием. Еще одно достоинство vim — он есть в каждом дистрибутиве Linux и часто в качестве редактора по-умолчанию.

Вся мощь Emacs мне стала понятна только после моего увлечения Clojure, а значит и лиспом, а значит и функциональным программированием. Именно отсутствие опыта работы и понимания лиспа читателем, скорее всего и есть той причиной, которая отпугивает потенциального пользователя от Emacs. Ведь отличительная его особенность – в создании комфортной среды для разработки через собственную настройку и дополнение полезным функционалом, таким, например, как управление docker контейнерами.  Сколько задач, столько и вариантов конфигурации. Однако, что меня очень удручало при работе с Emacs это клавиатурные сочетания, которые приняты по-умолчанию в редакторе. Беда в том, что подавляющее большинство сочетаний используют Ctrl, даже банальная команда, открыть файл — Ctrl X+Ctrl F активно задействует один палец-мизинец, который приходится неестественным образом выворачивать. Поэтому первая рекомендация для emacsеров это заменить Ctrl на Caps Lock. Но даже перевод Ctrl на Caps Lock не очень спасает ситуацию и я время от времени стал чувствовать боль в кисти в районе мизинца, или как это называют по-научному RSI. Многие для уменьшения болей стали переназначать клавиатурные сочетания на более дружелюбные из Vim. Так появились многие пакеты, включая и популярный evil. После довольно продолжительного использования evil стало понятно, что прийдется у многих пакетов переназначать клавиатурные сочетания вручную. Оказалось, что такими же задачами оказалось озабочено достаточно много энтузиастов, которые и создали Spacemacs. По-сути это все те же плагины, но с клавиатурными сочетаниями близкими к Vim, активация которых начинается с пробела, отсюда и название.  Интересен также принцип добавления и распространения конфигурации – ваши сделанные настройки желательно добавить в pull request чтобы их рассмотрели на предмет включения в основной дистрибутив spacemacs. Так происходит накопление настроек, которые делают коллеги и количество переходит в качество.

Успешно использую Spacemacs сам и другим рекомендую.

Редактор мечты или как, наконец, холивар Emacs или Vim завершился.

06.06.2016

Если уж быть совсем-совсем кратким, то встречайте Spacemacs. Это такой настроенный Emacs с клавиатурными сочетаниями от Vim.

Иногда я снимаю шапочку управленца IT-Premium и одеваю другую свою шапочку из фольги и становлюсь программистом. У каждого программиста, мой дорогой читатель, есть второй инструмент по важности после головы — это редактор кода.

Каким должен быть хороший редактор для кода? Удобным, быстрым, с подсказками и свистелками? Но, конечно же, самый хороший инструмент это тот, которым ты умеешь пользоваться. Я тот самый парень, который все время пробует новые и новые инструменты, например:

  • Sublime Text
  • Emacs
  • Vim
  • Light Table
  • Atom
  • RubyMine

С каждым из этих инструментов я провел довольно долго времени и, думаю, что понимаю их плюсы и минусы.

Sublime Text мне очень нравится за скорость работы, она просто потрясающая! Очень быстрый переход fuzzy search по названию файла, множество интересных пакетов, таких как Git Gutter. Хорошо продуманный редактор.

RubyMine это, конечно же, полноценная IDE. Умное дополнение при наборе текста, доступ к записям базы данных и тому подобные фишки. Мощно и хорошо, но довольно долго загружается из-за Java и обладает повышенными требованиями к расходу памяти.

LightTable, безусловно, должен быть в вашем списке редакторов для ознакомления. Пожалуй, это видео и этот пост о редакторе LightTable стоят тысячи слов. Интерактивная разработка с просмотром результатов выполнения кода, который ты только что набрал захватывает дух. Интересный факт — редактор написан на молодом ClojureScript, который, в свою очередь преобразовывается в Javascript и запускается через Electron.

Vim драматически увеличивает скорость набора и редактирования текста. Но качественный скачок в скорости набора произойдет после запоминания комбинаций на уровне мышечной (пальцевой) памяти. Редактор очень быстро запускается и достаточно хорошо расширяется всевозможными плагинами (например, Rails). Но писать свои плагины для расширения функциональности лично для eменя оказалось нелегким испытанием. Еще одно достоинство vim — он есть в каждом дистрибутиве Linux и часто в качестве редактора по-умолчанию.

Вся мощь Emacs мне стала понятна только после моего увлечения Clojure, а значит и лиспом, а значит и функциональным программированием. Именно отсутствие опыта работы и понимания лиспа читателем, скорее всего и есть той причиной, которая отпугивает потенциального пользователя от Emacs. Ведь отличительная особенность Emacs — в создании комфортной среды для разработки через собственную настройку и дополнение полезным функционалом, таким, например, как управление docker контейнерами. Сколько задач, столько и вариантов конфигурации. Однако, что меня очень удручало при работе с Emacs, это клавиатурные сочетания, которые приняты по-умолчанию в редакторе. Беда в том, что подавляющее большинство сочетаний используют Ctrl, даже банальная команда, открыть файл — Ctrl X+Ctrl F активно задействует один палец-мизинец, который приходится неестественным образом выворачивать. Поэтому первая рекомендация для emacsеров это заменить Ctrl на Caps Lock. Но даже перевод Ctrl на Caps Lock не очень спасает ситуацию и я время от времени стал чувствовать боль в кисти в районе мизинца, или как это называют по-научному RSI. Многие для уменьшения болей стали переназначать клавиатурные сочетания на более дружелюбные из Vim. Так появились многие пакеты, включая и популярный evil. После довольно продолжительного использования evil стало понятно, что прийдется у многих пакетов переназначать клавиатурные сочетания вручную. К счастью оказалось, что такими же задачами оказалось озабочено достаточно много энтузиастов, которые и создали Spacemacs. По-сути это все те же плагины, но с клавиатурными сочетаниями близкими к Vim, активация которых начинается с пробела, отсюда и название Spacemacs. Интересен также принцип добавления и распространения конфигурации — ваши сделанные настройки желательно добавить в pull request чтобы их рассмотрели на предмет включения в основной дистрибутив spacemacs. Так происходит накопление настроек, которые делают другие авторы и со временем количество переходит в качество.

Успешно использую Spacemacs сам и другим рекомендую.

Originally published at nexusnotes.ru on June 6, 2016.

I discovered much faster way to speed up docker image creation.

29.04.2016

I discovered much faster way to speed up docker image creation.

Just use bundle package and all current gems will be copied into vendor/cache. When bundle install runs it discovers cached gems and runs much-much faster.

Прикольные очки с подсветкой

22.04.2016

Идеально удобные очки при работе болгаркой в особо темных местах!

3IuS_hhIi3b-500x500

Подсветка встроенная прямо на дужки очков.

Очень хорошо пишете, легко читается.

06.02.2016

Очень хорошо пишете, легко читается.

Я для себя очень и очень полезным нашел редактор Emacs. Похоже, что для вас он может стать хорошим другом, поскольку обладает невероятной способностью к кастомизации, имеет собственное переключение раскладок, org-mode для Emacs даст фору любому дневнику/планировщику. К тому же очень комфортно использовать формулы и спецзнаки через LaTeX.

Однозначно стоит потраченного на изучение времени.

Про мой тайм-менеджмент

29.12.2015

У меня была большая проблема с управлением временем, обещаниями и сроками. Как водится, в школе управление временем не преподавали, а родители не привили нужные навыки.

Так что первый инструмент для решения проблемы, который я начал использовать для управления задачами был Pocket PC и подход GTD (Getting Things Done) с очередями задач, контекстами и всем таким по инструкции Васи Кислого (http://www.time-mngmnt.narod.ru). Продуктивность и эффективность страшно выросла, мозг разгрузился и общее состояние стало значительно лучше. Но возникло ощущение бега белки в колесе, выполняешь 5 задач, на их место приходят новые 5, и снова, и снова.

Затем я перепробовал большую кучу различного софта в поисках идеального инструмента, в основном для мобильных платформ Things, OmniFocus, Firetask, TaskPaper, TheHitList http://nexusnotes.ru/…/…/omnifocus-vs-thigs-vs-firetask-gtd/. Автор софта MyLifeOrganized даже подарил лицензию в 2008 за мою статью http://nexus.org.ua/weblog/message/846/.

Внезапно я прочел Getting Results Agile Way http://nexusnotes.ru/…/01/taskpaper-getting-results-agile-…/. Автор методики перенес лучшие Agile практики из разработки софта на повседневную жизнь и в итоге создал одну из самых эффективных методик!

Я до сих пор считаю Evernote + Getting Results Agile Way наиболее клевой системой для упорядочивания жизненного хаоса с временем, целями и обещаниями.

А что же сейчас? Я словил себя на мысли, что на сегодняшний практически не использую никакого инструментария, почти всегда прихожу вовремя, держу обещания (и стараюсь ничего не обещать). Как так выходит, что мне инструментарий/софт больше мне не нужен?

Все просто, если исчезла проблема, то и инструмент уже не нужен. Сейчас я в состоянии открытого сознания, спокойствия по поводу каких-то незавершенных дел или проектов, знаю, что нужно делать завтра и через месяц и через год.

Чего и вам желаю, дорогие мои друзья.

Про Укрзализныцю и билеты.

28.12.2015

 

Довелось мне две недели назад покупать ЖД билеты через Приват24. Почему-то на один и тот же поезд, но на разные дни выдали в одном случае код, который нужно поменять на билеты, в другом случае сам билет, который можно распечатать.

Кодов у меня оказалось два, а билетов должно было быть четыре: 3+1 на разные поезда. Так уж получилось, что я думал о чем-то своем и получил в кассе по своим кодам только 3 билета вместо 4.

Вчера с оказией решил свой один билет дополучить. И тут началось самое интересное. По коду распечатать билет можно ТОЛЬКО ОДИН раз. Да. По счастливой случайности мой билет оказался забытым в той кассе, в которой я пробовал по коду распечатать. Но, какой выход будет у меня если я по какой-то причине этот билет утерял? Никакого.

Одна из работников вокзала шепотом доверила военную тайну, что все проводники получают распечатки билетов, проданных через интернет, соответственно можно попробовать просочиться на свое место в вагоне при помощи одного паспорта.

В связи с чем у меня вопрос к Укрзализныце. Если у вас и так все билеты именные и сверяются с паспортом, тогда зачем вы вообще билеты бумажные продаете и проверяете? Сделайте как в авиакомпаниях, билет полностью электронный, предъявил паспорт, проводник посмотрел по спискам, сказал «Ок, проходите» и все! Исчезнут очереди на обмен электронных билетов, стресс у пассажиров и все такое. Если выйти за рамки понятия «билет», то это просто один из способов валидировать потребителя и его купленное в вагоне место. Один из способов. Паспорт УЖЕ валидирует вас однозначно. Паспорта при покупке билетов ввели для того, что бы бороться с перекупщиками билетов. Сейчас вы, читатели ФБ, когда последний раз покупали какой-либо бумажный билет у кого-то с рук? Нонсенс. Но требования паспортов остались. Для чего? А ни для чего, просто потому что так уже сложилось исторически.

Действительность меняется, способы передачи информации и технологии меняются. Понять, как и что изменить в процессах к лучшему очень просто, поезжайте в Голландию и посмотрите, как там работает продажа билетов на поезда. Там вообще проблема живого человека найти, связанного с продажей билетов. Все что можно автоматизированно, ручного труда, а, значит, и ошибок связанных с этим минимум.

Почему изменений в Укрзализныце не будет в ближайшее время? Да потому что это монополия, а монополия это зло. При монополии вам не нужно бороться за качество услуг, за каждого покупателя. Все равно потребитель будет «жрать печенье», просто потому что другого нет.

Пост, в котором я признаюсь в любви Devcards, Figwheel и ClojureScript

27.12.2015

Этот пост рекомендуется пропустить всем непрограммистам.

Свой путь веб-разработчика я начал в 1999г. Это был PHP 3.0.3 + MySQL. С тех пор я попробовал довольно много инструментария для разработки, Parser 2 от студии Лебедева, а на Parser 3 до сих пор работает мой старый сайт http://nexus.org.ua/. С 2006г началась интрига с Ruby on Rails, который набрал популярности благодаря свежему на то время подходу convention over configuration. И это было круто, куча чужих уже готовых к употреблению кусков кода в виде ruby gems, которые легко подключались. Изумительный менеджер зависимостей bundler. Из известных продуктов на RoR это Redmine, который используется много кем для управления проектами, Gitlab – свободный аналог github. На RoR написалось мной довольно много проектов, более 20 по-моему. Самый крупный — наша «админка», система управления тикетами, которая дописывается и в настоящее время. Но вот наступило время активного оживления фронтенда через джаваскрипт. Я успел поэкспериментировать со многими, в основном, Javascript based штуками. Здесь я описал свой опыт работы с Angular JS, Knockout JS. Завел интрижку с Meteor, ошалев от возможностей программирования сервер-сайд и клиент-сайд на одном языке, а заодно набрался опыта работы с MongoDB и в целом познакомился c NoSQL движением. И все это было интересно и хорошо, пока я в этом году для расширения кругозора не начал изучать Clojure и ClojureScript. Как сказал один мой приятель «любишь ты разные brainfuckи».

Ощущения от функциональщины и Lispа мне сложно сравнить с каким-либо опытом пережитым ранее. Эмоции, пожалуй, как у Колумба, который открывает Америку. Язык, который создавался автором с мыслями о проблемах проектирования и архитектуры современных приложений, и разнообразные сложности, с которыми сталкивается разработчик, такими как многопоточность, CSI и всем таким. Рекомендую на досуге послушать автора Rich Hickey. Концепция базы данных Datomic вообще разорвала мозг новыми возможностями. Очень рекомендую для изучения Datomic и языка запросов Datalog этот ресурс.

Для понимания программистами, какие проблемы скорости и удобства разработки теперь можно решать для фронтенда на ClojureScript, нужно посмотреть вот это видео. В нем про live reload и о концепции data cards в веб-разработке. Да и вообще чувак веселый 🙂

Теги, которые повлияли на меня как на разработчика в 2015 особенно сильно: Clojure/ClojureScript, Datomic/Datalog/Datascript, figwheel, datacards, Rum/ReactJS, Om/Next, Meteor, MongoDB, Docker.

О том, каким будет web в ближайшем будущем стоит почитать у моего однофамильца Никиты Прокопова. Очень правильно пишет.

Уверен, 2016 год будет не менее захватывающим.

Чат на вашем вебсайте с интеграцией в slack за 15 минут

02.11.2015

Так не хочется устанавливать еще одно ПО на компьютер (типа приватовского SiteHeart), а чат для вебсайта хочется. Мы же используем уже Slack для внутренних коммуникаций, который прекрасно интегрируется со всем и вся. Можно ли его использовать для наших целей? 10 минут на гугл и вуаля, вот он сервис Chatlio, который делает то, что нам нужно. Да еще и на тестовый период в 30 дней бесплатно. Думаю, за 30 дней мы сможем понять, добавляет ли это пользы процессу продаж.

Благодаря Google Tag Manager не пришлось даже изменять код сайта. Добавил в новую версию контейнера код, выданный сервисом Chatlio и опубликовал.

И вуаля, чат на сайте за 15 минут!
Еще 15 минут на локализацию строк на русский.

Ну а сегодня чатом воспользовался настоящий посетитель сайта и задавал релевантные вопросы.

Выглядит сам процесс так:

  1. Создается новый канал и туда отправляется сообщение от посетителя (на самом деле от бота, который мы подлкючаем в слак).
  2. Уведомление о событии пуляется в канал, в нашем случае sales-and-marketing.
  3. Самый быстрый из нас подключается в нужный канал, здесь видно, что название канала #z-kiev-ua-4. И пишет ответ.
  4. При необходимости можно в канал добавлять менеджеров по продажам или инженеров для квалифицированного ответа.
  5. После обработки сообщений просто архивируем канал и покидаем его.

Итого, за $50 в месяц у вас на сайте полноценный чат поддержки со всеми слаковскими удобствами!

В следующий раз расскажу о замечательном инструменте Google Tag Manager, с помощью которого нам удалось увидеть сложную воронку продаж для посетителей сайта-одностраничника (посчитать на калькуляторе услуги, отправить предолжение на почту).

Originally published at it-premium.livejournal.com on November 2, 2015.

OS X El Capitan GM Candidate

10.09.2015

 

Сегодня пришло предложение установить beta версию OS X El Capitan. Интересным оказался способ, с помощью которого производится установка.

На сайте Apple Beta Program после регистрации выдается специальный Redeem Code, который при вводе в приложение (автоматически) App Store запускает закачку OS X El Capitan.

Скриншот 2015-09-10 15.16.09

Предлагаемый к загрузке образ это GM Candindate, а именно Gold Master, тот образ, который скорее всего будет распространяться в качестве готового к употреблению для конечного пользователя.

Скриншот 2015-09-10 15.08.16

Платить или нет, когда вирус зашифровал данные?

29.04.2015

Что я узнал из работы с Rails assets pipeline и Javascript. KnockoutJS vs AngularJS.

30.10.2014

Задумал я оживить нашу систему обработки заявок так, чтобы в realtime подгружались новые обращения, инциденты обновляли SLA и возникали визуальные уведомления при протухании тикетов.

Rails замечательно работает со статикой, лучше всех, пожалуй. Но то, что предлагается использовать для «оживления» страниц подходит только для очень небольшого круга задач. 

vs

Чаще всего Ajax Polling делается через запрос jQuery и подстановку темплейта с рендерингом из JS шаблона. Мне очень нравится писать шаблоны на HAML, и использовать Coffeescript.

Но, к сожалению, браузер не умеет рендерить HAML шаблоны, а изучать/выбирать новый template-язык не хотелось. 

Именно поэтому в поле моего зрения попали движки, которые умеют использовать существующую разметку: AngularJS и KnockoutJS. Вот их я и стал изучать.

Создал две экспериментальные ветки feature в git и стал пробовать Knockout.

Knockout оказался очень хорошим фреймворком для two-way databinding. Классно лег на coffeescript, и HAML. Вот пример вьюконтроллера:

class UnassignedTicketsViewModel extends TicketWithSLAViewModel
  constructor: ->
    super
    @api = ‘/api/tickets/unassigned’

вот HAML партиал. Кстати, это в 4м HAML появилась возможность писать аттрибуты в круглых скобках.

    %td.avatar
      %img.cycle.userpic(data-bind = «attr:{src:avatar.nano.url}, visible: state !== ‘classified’»)
    %td.id_column
      %a(data-bind = «attr:{ href: url }, css: {‘fg-red’: is_major}»)
        %i.icon-fire(data-bind = ‘visible: is_major’)
        %i(data-bind = ‘css: icon()’)
        %span(data-bind = ‘text: id’)
        %i.icon-bus(data-bind = ‘visible: is_outdoor’)
    %td(data-bind = ‘text: author’)

Вот какие выводы у меня появились после использования Knockout с рельсами

  • очень хорошо писать и наследовать классы на Coffescript.
  • MVVM объектно-ориентированная концепция с моделями
  • неявная работа с текущим значением в итераторах foreach
  • удобный дебаггер для Chrome 

Параллельно я вел исследования с AngularJS. Прошел офигительный интерактивный туториал https://www.codeschool.com/courses/shaping-up-with-angular-js

И написал polling тикетов через $resource. И пришел к таким выводам:

  • Angular это очень мощный фреймворк, как Rails для статики.
  • Angular стоит использовать только если вы делаете Single Page Application. В противном случае как из пушки по воробьям.
  • У Angular своя концепция MVC, но нет как такового понятия модели.
  • Angular в целом не особо объектноориентирован и не очень хорошо ложится на Coffeescript.
  • Rails лучше модифицировать для отдачи шаблонов по запросу вот таким gem https://github.com/pitr/angular-rails-templates, что позволяет использовать HAML для их написания

И в том и в другом случае было необходимо разработать правильную отдачу JSON объектов при поллинге. Мне нужно было включать ассоциативные поля в модели, поэтому довольно скоро от Model.as_json я перешел к использованию https://github.com/rails-api/active_model_serializers, но поскольку разработчики не смогли придумать кеширование, да и отдачу url_for, пришлось перейти на jbuilder, на котором и остановился. json!.cache отлично сокращает запросы к базе и время рендера.

Для отдачи JSON решил сделать API через отдельные контроллеры и наймспейс ‘/api/ как у Раяна Бейтса

И все было хорошо, пока я не стал думать, как же для разных страниц мне использовать разные биндинги для KnockoutJS и при этом чувствовать себя хорошо. Самый простой и «лобовой» способ это убрать require_tree . из application.js и добавить include_javascript_tag params[:controller] в лейаут. Но здесь то и зарыт главный косяк. Assets pipeline, который склеивает все css и js в один файл будет кидать ексепшены, поскольку не скомпилирует .js для каждого контроллера. И выхода здесь два:

  1. включить компиляцию assets для продакшена.
  2. использовать gem paloma

Более православным мне показался второй путь, поскольку использует assets pipeline и делает всю магию на клиенте. Также позволяет передавать из контрроллера в JS различные параметры. Это же умеет делать gem gon, но если можно гем не использовать, то лучше его не использовать.

Также, мне очень понравился подход с подключением jquery библиотек и используемого мной metro-ui-css фреймворка через интеграцию с bower. В моем случае сделал подключение gem ‘rails-bower’, в Bowerfile записал asset ‘metro-ui-css’, rake bower:install и вуаля, в  /vendor/assets/bower_components загруженные с зависимостями jquery и другие модули. Очень удобно.

Итоги. 

Я остановился на использовании KnockoutJS для моей задачи, и доволен этим фактом, много jQuery кода заменил более компактным и объектно-ориентированным кодом для Knockout. А AngularJS, думаю, стоит использовать вообще отдельным приложением вместе с Node.js, а Rails в качестве исключительно JSON бекенда, что тоже для Rails было бы унизительным.

Удовольствие от математики?

23.06.2014

Не могу не поделиться книгой «Удовольствие от X», которую начал читать вчера и довольно тяжело было от нее  оторваться!

х-big

Книга заставит вас посмотреть на математические задачи с другой, практической стороны, шаг за шагом побудит интерес к уже изученным и новым темам. Как бы мне хотелось, чтобы учителя математики читали уроки подобно изложению предмета в этой книге!

Для возбуждения интереса расскажу о нескольких находках из книги. Вот задача: кран с горячей водой наполняет ванну за час, кран с холодной водой наполняет ванну за полчаса. За какое время наполнят ванну оба крана?

Подумайте.

Чаще всего люди почему-то дают неправильный ответ «за 45 минут». На самом деле ответ другой.

Путей решения у задачи может быть несколько. Первый, через дроби, узнаем какое количество ванны заполняется за минуту, 1/30 и 1/60 ванны соответственно, 1/30*x + 1/60*x=1 (целая ванна), умножаем обе части равенства на 60, 2x+x = 60, 3x = 60, x=20 минут.

Но существует более наглядное и красивое решение. Вот оно.

Сколько раздельных ванн заполнят краны, если они будут лить целый час? Горячий кран заполнит одну ванну, а холодный за это время две. Вместе они заполнят за час три ванны. Соответственно чтобы узнать, за сколько будет наполнена одна ванна, делим час на 3. Получаем 20 минут.

Гораздо красивее и нагляднее? Я думаю да 🙂

Вторая история связана с устным нахождением квадрата чисел до 50. Оказывается, довольно просто посчитать квадрат числа, недалекого от 50 используя формулу 2500 — 100*x + x^2, где x — разница между 50 и искомым числом. Найдем устно квадрат 48. 2500 — 100*2 + 4, это 2304. Или 47, 50 минус 47 это 3. Считаем в уме 2500-300 = 2200, добавляем 3 в квадрате, получаем 2209. Круто?

Буду рад, если после прочтения этой книги у вас появится приятное чувство любопытства.

Учет персональных финансов

14.05.2014

 

 

Как понять, куда уходят деньги и начать двигаться к богатству?

С первым вопросом попробую помочь наброском в стиле «скетчноутинг». А по второму вопросу напишу подробный пост.

 

2014-05-14 - учет

 

 

Tips and tricks for Mac OS. Part 3.

08.05.2014

Сегодняшняя фича будет особенно полезна для обладателей нескольких мониторов, а также всех тех, кто любит оптимизировать ежедневные простые задачи, такие как манипулирование окнами приложений с клавиатуры.

Screen Shot 2014-05-08 at 13.50.56

Приложение SizeUp поможет моментально с клавиатуры развернуть окно на весь экран, либо изменить размер на 70% монитора и прижать вправо/влево. Часто при жонглировании окнами я перебрасываю приложения на левый или правый монитор простыми нажатиями горячих клавиш.

Screen Shot 2014-05-08 at 13.48.22

 

 

Можно настроить разделение экрана на области, в которых мы будем «размещать» приложения.Screen Shot 2014-05-08 at 13.56.51

Приложение имеет функцию безоконного запуска и, таким образом, не занимает драгоценное место в трее. И, конечно, вы можете переназначать горячие клавиши.

Примерно таким же функционалом обладает приложение Moom. Так что у вас есть выбор! Такие приложения драматически повышают удобство и производительность работы.

А какие малоизвестные штуки для повышения эффективности работы на Mac OS знаете вы?

Mac tips and tricks. Part 2.

28.04.2014

Продолжаем серию трюков для Mac, о которых не все знают.

Очень быстро можно найти определение, перевести слово с другого языка если сделать тап тремя пальцами по слову, либо нажать Option-D на выделенном слове. Выглядит это так:

Screen Shot 2014-04-28 at 13.17.16

Для этого установите галку «lookup» в настройках трекпада.Screen Shot 2014-04-28 at 13.19.26

Работает практически в любом приложении (текстовые редакторы, браузеры, просмотрщики).

 

Если вы хотите быстро драг-н-дропнуть файл с рабочего стола, то для меня оказался полезным такой воркфлоу:

  1. Курсор мыши в правый нижний угол откроет залежи Рабочего стола.
  2. Цепляем мышью файл.
  3. Пятерней по тачпаду делаем жест «сведение пальцев в щепоть»
  4. Дропаем файл куда следует.

Для того, чтобы работал п.1 делаем настройку Mission Control -> Hot Corners как показано на скриншоте.Screen Shot 2014-04-28 at 13.26.28И третий на сегодня трюк: приложение CheatSheet. Если вы такой же любитель клавиатуры как и я, то большую часть часто повторяемых действий вы стараетесь делать не отрывая пальцев от клавиатуры. А узнать клавиатурные сокращения незнакомой программы и поможет наше небольшое приложение CheatSheet. Приложение запускается и работает в фоне. Для того, чтобы узнать клавиатурные сокращения у текущего приложения – нажмите и подержите несколько секунд клавишу Cmd. Появится вот такое прелесное окно с сокращениями.

Screen Shot 2014-04-28 at 13.32.57

 

 

Мои любимые mac tips and tricks

25.04.2014

Начинаю серию постов про трюки для Mac OS, которые облегчают жизнь:

С зажатой кнопкой Option и кликом по иконке WiFi мы можем увидеть расширенную информацию о беспроводном подключении.

Screen Shot 2014-04-25 at 14.25.22

 

Для того, чтобы меньше болели глаза вечером очень рекомендую установить бесплатную утилиту F.lux

Screen Shot 2014-04-25 at 14.28.10

Вечером она автоматически переведет баланс белого в менее яркий путем понижения температуры цвета, что благоприятнее скажется на усталости глаз при просмотре фильмов/чтении. Проверено на себе — работает!

В трее клик на флаг клавиатуры -> show character viewer и вы сможете вставлять в текст прикольные штуки типа этой ☃ это был снеговик

Screen Shot 2014-04-25 at 14.32.33

 

Stay tuned!

Chef recipe for nginx passenger install (ubuntu, debian) from repository

03.04.2014

Here is my part of chef recipe for installing nginx + passenger 4.x module. This recipe depends on ‘nginx’, ‘apt’ recipes.

package ‘apt-transport-https’.

package ‘ca-certificates’

apt_repository «nginx-passenger» do

uri «https://oss-binaries.phusionpassenger.com/apt/passenger»

distribution node[‘lsb’][‘codename’]

components [«main»]

keyserver «keyserver.ubuntu.com»

key «561F9B9CAC40B2F7»

end

include_recipe ‘apt’ ## this will do apt-get update

package ‘nginx-extras’

package ‘passenger’

This will add repository, sign key and install passenger from phusion apt repository.

Дизайн Сайт значение. Customer is the king.

21.03.2014

Люби друзи. Позвольте вас отвлечь от политических баталий и приковать внимание к идее, которой я нашел дополнительное подтверждение совершенно недавно.

Screen Shot 2014-03-21 at 11.19.23

Если вы думаете, что стоит сделать красивый и суперэргономичный сайт и продажи взлетят, то вы заблуждаетесь. Вот пример интернет-мазагина из Днепропетровска с дизайном в стиле конца 90х, но на котором я сделал уже третий заказ за последний месяц. Что именно привело меня туда и почему я остался довольным покупателем не смотря на отсутствие на сайте авторизации пользователей, и других дизайнерских изысков?

  1. Цены.
  2. Отзывы.
  3. Общение и консультации в процессе подтверждения заказа.

Хороший пункт 3 даже подвиг меня к предоплате, чего я обычно не делаю.

После совершения первой покупки я вернулся и сделал новый заказ, но теперь критерии для меня шли в другой последовательности.

  1. Цена.
  2. Скорость выполнения заказа (предыдущий товар в Киеве я получил на следующий день (!) после заказа и оплаты).
  3. Общение и консультации. Исчерпывающий e-mail с номерами деклараций и всем таким (но с таким же дизайном как и сайт).
  4. Отзывы.

Такой дизайн дарит ощущение теплой ламповости. Это как читать приклеенные объявления, написанные от руки, а не напечатанные на принтере, если вы понимаете о чем я. В такой интернет-магазин хочется прийти и заказать еще раз, посоветовать друзьям потому что заказа был выполнен, как говорят англичане, hassle free (без хлопот).

Когда мы начинали в конце 2007 наши ИТ услуги в IT-Premium подход к каждой проблеме пользователя был индивидуальным. Каждый из нас был и жрец и жнец и на дуде игрец, как Артем из интернет-магазина выше. По мере роста нами нанимались сотрудники и им делегировались какие-то дела и обязанности. Все дело в том, что мотивация сотрудников была иной, нежели у нас тогда. И, местами, даже при выполнении обязательств по времени реакции и времени решения, периодически ситуации возникали спорные, требующие подчистки кармы.

Незримый капитал любой компании – это позитивное отношение клиентов и их хороший опыт взаимодействия с вами. Конкуренция заставляет наращивать  этот незримый капитал. Рекомендую почитать историю Zappos. Отсутствие конкуренции (монополия) тут же сказывается на обратном, достаточно вспомнить услуги госорганов.

Основная мысль этого опуса проста: покажите, что вам не все равно, покажите заинтересованность и участие, проникнитесь проблемой клиента и помогите ее решить и клиенты к вам потянутся.

Customer is the king.

Готовое устройство для взлома WiFi? Есть такое.

13.02.2014

Используя уязвимость с настройкой WPS при помощи данного устройства у атакующего появляется возможность получить WPA/WPA2 пароли для подключения к WiFi.

Screen Shot 2014-02-13 at 11.22.24Ну а для тех, кто умеет готовить Линукс есть опен-сорц версия продукта.

Страшно?

 

 

Наша политота

13.02.2014

Сегодня я начинаю писать необычный пост. Хочу выложить все кусочки нашего политического паззла, которые мне известны и попробовать их выложить аккуратно плиточкой для получения более целостной картины политического мира.

Также мы попробуем ответить на вечные вопросы русской интеллигенции: что происходит, кто виноват и что делать.

Что именно происходит в Украине?

Экономика.

Экономика Украины в жопе, это видно из отрицательного баланса принятого бюджета на 2014 год. 15 млрд заимствований будет достаточно для перекрытия бюджетной дыры ровно на два года. Методы оздоровления экономики связаны с политически непопулярными решениями. Тарифы на газ для населения отличаются в 5 раз от тарифов для предприятий. Тарифы на электроэнергию хотя и дифференцированы, но тоже отличаются раза в 3-4 от производственных. Зарплаты не в госструктурах все также выдаются в конвертах. Население и предприятия очень неохотно платят налоги и при первом удобном случае их «оптимизируют». Олигархия старается выводить средства из страны на счета швейцарских/европейских банков и в оффшоры, ибо так безопаснее. Происходят попытки воплотить некоторые грандиозные инфраструктурные проекты.

Политика и законодательная власть.

Президент самостоятельно расширил свои полномочия путем изменения Конституции. В Верховной Раде, главном законодательном органе, большинство составляет олигархия из Партии Регионов. Президент не пользуется правом «вето», поскольку парламентское большинство и так составляет его Партия, а значит, там принимают законы, которые заведомо обсуждаются и одобряются «батей». В Верховную Раду попадают по партийным спискам, которые, как вы могли бы догадаться, формируются по денежно-родственному принципу. То есть кто больше денег занес в партию, и кто какой родственник/односельчанин для «бати», тот и прошел в депутаты по спискам. А ведь этим людям нужно принимать решения, которые влияют на судьбы людей и страны, то есть быть лучшими из лучших и самыми достойными из достойных.

Судебная власть.

Суды берут взятки. Суды принимают решения под давлением сверху. Для подтверждения этой мысли достаточно почитать заголовки газет, где высокопоставленные участники, например, ДТП становятся вдруг пострадавшими или свидетелями. Работа законодательной власти и исполнительной сводится на нет, если по принятым Радой законам человек преступивший закон пойман исполнительной властью и передан судебной, а та его выпустит как неуиновного.

Исполнительная власть.

Кабинет министров, который ответственен за оперативное управление страной, назначается все тем же Президентом. Сама по себе государственная структура управления громоздка и неэффективна, в основном из-за проблем вертикальных коммуникаций. Милиция продажна и чаще служит интересам властьимущих и реже интересам «пересичных громадян». Должности в госструктурах покупные. Суть покупки высокой должности – отбить инвестиции через крупные взятки.

**Кто виноват? **

Неэффективная экономика Украины должна рассматриваться на микро и макроуровнях. Доходы страны на макроуровне – налоговые поступления от производственной деятельности активной части населения, и различные зарубежные инвестиционные проекты. Расходы страны – пенсионные выплаты, содержание государственного аппарата, армии, государственные проекты, здравохранение и так далее. На текущий момент власть не только пытается нарастить поступления доходов за счет увеличения всевозможных налогов,  но и сокращает расходы на социальные статьи и в тоже время увеличивает расходы на содержание себя, а именно, государственного аппарата. На микроуровне – производственник пытается не платить налоги, поскольку этим он увеличивает свою прибыль и думает, что дает меньше средств на несправедливое перераспределение. Чиновник развивает бюрократический аппарат, который помогает ему направлять государственные финансовые потоки на собственное благополучие. Пенсионер еще больше страдает от того, что социальная сфера становится объектом сокращения расходов, а инфляция никуда не исчезает. Инфляция образования, ТВ и сокращение расходов на образовательную сферу отнимают у молодежи (особенно сельской) способность критически мыслить, поддавать сомнению и проверке получаемую информацию.

Что делать?

Для начала необходимо изучить исторический опыт стран, которые выбрались из еще большей экономической жопы: это послевоенная Германия, послевоенная Япония, Сингапур и Китай.

К власти должен прийти политик, способный на жесткие антикоррупционные меры, в том числе и к своему окружению. Ли Кван Ю тому живой пример, как можно из отсталой страны Сингапур сделать оазис будущего. Его родственникам даже приходилось спасаться бегством от антикоррупционных репрессий в Китай.

Везде, где это можно, заменить бюрократический аппарат новейшими информационными технологиями. Получение нужной бумажки должно быть заменено получением электронного документа не вставая с рабочего места. Для этого необходимо инвестировать в сельскую инфраструктуру для тотального доступа в Интернет. Мне кажется, что это уже перестало быть проблемой для Украины. Проблема обучаемости технологиям старшего поколения, простите мой цинизм, решится сама собой со временим.

Вообще у демократии существует серьезный недостаток. Выборы голосованием ставят у руля страны не тех людей, у которых развиты необходимые навыки и правильная жизненная позиция, а тех кого чаще видели по телевизору. Кроме того, голос преступника и голос священника на выборах равнозначны. Пока что люди не изобрели механизм проведения «справедливых» выборов.

Обязательная публичность и механизмы контроля качества принимаемых решений властью. Такой себе крауд-контрол. Классно бы было, если , например, приняли какой-то хреновый законопроект, кто-то привлек к нему внимание общественности и электронным голосованием платежеспособного населения решение бы отменялось.

Судебные реформы должны быть проведены в самую первую очередь: на ключевых позициях должны быть профессионалы с оплатой и системой, которая бы исключала подкуп.

Исполнительная, законодательная и судебная власти должны быть по-настоящему разделены и также иметь механизмы общественного контроля.

Как видите, здесь не прозвучало ни одного модного поличического слова «евроинтеграция» или «таможенный союз», поскольку настоящие причины политического кризиса лежат в другой плоскости, нежели геополитические взаимоотношения Украины и соседей.

Невероятные украинские Dakh Daughters

12.02.2014

Дамы и господа, позвольте представить вам коллектив Dakh Daughters. По-моему это прекрасно.

Получил большое удовольствие от просмотра.

Об экономической теории

05.02.2014

Существует теорема благосостояния.  Благодаря этой теореме, в частности, можно математически описать для Украины последствия для экономики при евроинтеграции.

Парето-оптимальное состояние рынка — ситуация, когда нельзя улучшить положение любого участника экономического процесса, одновременно не снижая благосостояния как минимум одного из остальных.

Пример:

В России считается справедливым, что пенсионеры должны иметь возможность передвигаться достаточно свободно по территории страны, используя общественный транспорт (в том числе в рамках одного населённого пункта), поэтому долгое время он оставался де-факто бесплатным для пенсионеров. Но многие пенсионеры (например, живущие в сельской местности) не пользовались транспортом вообще. А другие (преимущественно в крупных городах) использовали общественный транспорт для поездок в дешёвый магазин на другом конце города, где они могли купить хлеб на 10 коп. дешевле, при этом стоимость их проезда для государства могла превышать 50 рублей. Как видно, бесплатный проезд был, с одной стороны, несправедлив к сельским пенсионерам, а с другой — крайне неэффективен для городских (экономия 10 копеек обходится в 10—50 рублей). Поэтому была предложена концепция монетизации льгот, по которой всем пенсионерам выдаётся одинаковая сумма денег, которой должно хватить на покупку карточки для проезда в общественном транспорте в большинстве городов (за исключением 10-15 самых крупных и дорогих). Таким образом, пенсионеры, получив средства на руки, могут потратить их с большей пользой.

Сама концепция была абсолютно правильна с точки зрения экономической науки, но была реализована достаточно плохо, что даже привело к массовым народным выступлениям.

Так что лично я хочу технократию в Украине.

Крутые презентации о воздействии наркотиков

04.02.2014

image

Не могу не поделиться завораживающими презентациями о действии наркотических средств, где, как водится, многое объясняют. Особенно занятно про алкоголь.

Воздействие наркотиков на работу мозга.

Воздействие наркотиков на тело.

Голландцы молодцы, действительно круто сделано.

Также пытливому читателю будет небезынтересно прочесть у Стелазина про каннабис.

Книги, которые были прочитаны в сентябре — декабре 2013

08.01.2014

Вот книги, которые я прочел в рамках саморазвития. Следует отметить, что в освоении этой пищи для ума очень помогли гаджет «Kindle Paperwhite», который мне подарили сотрудники на день рождения, а также Роман Зайцев, Сергей Щербина и Роман Богданов, которые помогли рекомендациями.
2014-01-08 - designs

  1. Как люди думают. Д. Чернышев
Книга создана скорее как сборник занятных фактов.  Читать интересно, но структура книги несколько скомкана, от этого не всегда удается уловить и понять основную мысль.
  1. Брать или отдавать? Новый взгляд на психологию отношений. Адам Грант.
Одна из тех книг, которая объясняет одну единственную мысль, но с большим количеством примеров. Бескорыстно отдавать &#8212; это весьма круто. Рекомендую.
  1. Как мы принимаем решения. Джона Лерер.
Настоятельно рекомендую эту книгу всем думающим людям. Исследование, основанное на анализе массы экспериментов приводит читателя к познанию процесса принятия решений, что, несомненно, улучшает сами принимаемые решения. По большому счету две системы – дофаминовая, управляющая эмоциями и рациональная – управляемая префронтальной корой головного мозга участвуют в принятии решений, об особенностях работы которых вы узнаете из книги.
  1. Найти идею. Введение в теорию решения изобретательских задач. Г. Альтшуллер
Неожиданно качественная теория подхода к решению нестандартных задач. Не смотря на то, что книга выпущена относительно давно, но может быть чрезвычайно полезной, поскольку формулирует понятие идеального конечного результата и алгоритм разрешения нестандартных задач. Но не думайте, что задачи становятся от этого тривиальными. После прочтения вы сможете находить неожиданные и красивые решения задачам, а также оценивать полученные решения 🙂
  1. Сила воли. Как развить и укрепить. Келли Макгонигал
Одна из тех книг, которые необходимо читать в паре с &#171;Как мы принимаем решения&#187;, поскольку очень много исследований перекликаются и дополняют друг-друга из этих двух книг. По прочтению книги гораздо легче подходить к выполнению рутинных или непосильных задач. Рекомендую.
  1. Женщина. Учебник для мужчин. Олег Новоселов
Пожалуй, не смотря на некоторый шовинизм, эту книгу стоит прочесть каждому мужчине, начиная с пубертатного периода, для понимания пружинок и механизмов, которые движут женщинами. Как водится, это многое объясняет в необъяснимом женском поведении. Рекомендуется к прочтению каждому мужчине.
  1. Китайское исследование. Колин Кэмпбелл & Томас Кэмпбелл
Библия вегетарианца. Ни больше ни меньше. На меня эта книга повлияла достаточно сильно в пользу употребления растительных продуктов и отказа от еды животного происхождения. С такой диетой чувствую себя явно лучше.
  1. Я не умею худеть. Пьер Дюкан
За пропаганду этой книги Артемию Лебедеву нужно вынести строгий выговор. Данная диета, основанная на употреблении невероятного количества белковой пищи, способна нанести серьезный вред здоровью. Всячески НЕ рекомендую следовать советам, изложенным в книге.

Начаты и пока неокончены:

  1. Дом, в котором … Мариам Петросян
Аллегория, которую спустя 80 страниц я так и не смог разгадать. Вероятно, вернусь к книге позже.
  1. Я такой как все. Олег Тиньков
Олег Тиньков очень любит себя похвалить и похвастать. Именно поэтому он такой как все 😉

 

 

Кому бесплатный американский VPN?

29.11.2013

Это может быть интересно нашим русским друзьям с заблокированными добрыми органами сайтами, или для тех, кто использует сервисы, ориентированные только на американский рынок, такие как http://turntable.fm.

Прошу любить и жаловать http://www.getusvpn.com

Что нами движет в любви? Биохимия процессов.

08.10.2013

На днях открыл для себя настолько интересный блог Стелазина, что застрял за чтением поста про любовь и отправился спать сильно позднее обычного. Дальше я начну сыпать цитатами, которые мне показались наиболее интересными.

Крайне интересны процессы, связанные с любовью мужчины к женщине, родительской, материнской (окситоцин). Вот уж не думал, что и это можно объяснить.

Кроме того, на ранних стадиях романической влюбленности достоверно растет фактор роста нейронов (NGF). Фактор роста нейронов,- ключевой нейротрофин, участвует в механизмах синаптической пластичности и образовании связей между нейрональными комплексами, важен в процессах научения, важен в формировании социальной иерархии по шкале доминантные/субмиссивные особи. NGF растет на ранних стадиях романической любви, затем возвращается к норме, причем его концентрация коррелирует с интенсивностью любовного переживания и вовлеченностью человека в происходящее. Окситоцин и вазопрессин связаны с влечением и развитием прочных социальных связей. Значительное количество окситоцина выбрасывается во время оргазма (для обоих полов). Кроме того, у женщин концентрация окситоцина повышается во время родов, что частично облегчает этот болезненный процесс (что все равно неприятно, но без окситоцина было бы гораздо хуже). Еще окситоцин повышен во время грудного вскармливания, и создает базис для материнской любви. Вазопрессин важен для мужчин в плане социального поведения, в частности,- агрессии в отношении других мужчин.

Помимо противотревожного и обезболивающего действия, окситоцин поэтически называют «гомоном правды», потому что он способен обострять чувство справедливости (у людей, про мышей не знаю). Кроме того, окситоцин подавляет естественную настороженность и недоверие к чужакам (неофобию), что может быть важно на ранних стадиях романтической любви. В то же время, вазопрессин у самцов обостряет внутривидовую агрессию и конкуренцию с другими самцами (что опять же, может быть важно на ранних стадиях романтической любви).

При этом, инсула это корковый контроль, а непосредственно сексуальное возбуждение обеспечивают D1-дофаминовые рецепторы паравентрикулярных ядер гипоталамуса. Эти гипоталамические области активируются при романтических переживаниях, равно как и при простом сексуальном влечении, но не активны при переживаниях родительской любви,- судя по всему, эротическую составляющую организуют именно они.

Что тут важно понимать? У человека существует одна система вознаграждения на все случаи жизни. У нас нет поощрительных структур отдельно для секса, отдельно для покушать, отдельно для развести бандерлогов на 4й срок. Это все общая схема. Какие мы удовольствия получаем на выходе,- это уже зависит от внутреннего баланса, от интенсивности и смещения равновесия к разным отделам, от вовлеченности дополнительных структур и прочая. Но общий принцип един.

Очевидно, что любовное переживание,- это сложная многоуровневая конструкция, куда входит самые разные структуры, от высших отделов лобной коры до рептильного ствола мозга.

Reward system делает мотивацию из всего, ей без разницы. Можно на пищевом поведении, можно на социальной иерархии, можно на поисковом поведении. В каких-то пределах эти комплексы мотиваций могут сосуществовать, при ярко выраженной интенсивности они начинают конкурировать и вытеснять друг друга, потому как мощности системы не безграничны. Это общее правило для всех людей. Из чего именно конкретный отдельный человек сделает себе сверхпоощрение,- дело десятое. Это может быть власть, или творчество, или деньги, или слава, или воспитание детей, или химические вещества, или что угодно. Или любовь.

Так что биохимия, как водится, многое объясняет. Горячо рекомендую к прочтению источник.

 

Конспект по лекциям ТРИЗ

03.10.2013

Пока болею и лежу дома нашлось время на изучение теории изобретательских задач. Оказалось, что можно и нужно подходить к решению «нерешаемых» творческих задач системно. О чем и рассказал Артем Горбунов на лекции в студии Лебедева.

ТРИЗ предлагает методику решения всяческих нерешаемых штук, которые обычному человеку в качестве решения не приходят или приходят очень редко. То есть простой способ стать гениальным изобретателем 🙂

Сегодня я не поленился и потратил 5 часов на изучение 4 видео-лекций по ТРИЗ. Небольшой конспект усвоенного привожу ниже.

  • Важно сформулировать задачу в терминах ТРИЗ абстрагируясь в нужной мере от терминов.
    • Если _\_, то ___\_, но ____
  • Метод проб и ошибок — слишком нехороший, много ресурсов тратит впустую, часто не приводит к цели.
  • Для формулировки задачи необходимо и критически важно выявить техническое противоречие (ТП). Или даже несколько противоречий.
  • Существуют методы оперирования с элементами системы, их 50. Дробление, Вынесение, Местное улучшение качества, Ассиметрия и так далее.
  • Анализируется пример с диспетчером и очередями на примере гугла. Прикольно. Мне кажется это кореллирует с нашей задачей распределения заявок.
  • Существуют таблицы Альтшуллера, по которым можно выявить пути решения. В столбиках то __ в строках но ________, на пересечении — номера методов, которые следует попробовать применить для решения задачи. То и но — как раз противоречие. Увеличить скорость/Уменьшить вес — как раз одно из таких.
  • Для поиска решения противоречий есть более общие таблицы (до 10 пунктов), их меньше, есть таблицы для технических систем, их (пунктов) гораздо больше (около 50 пунктов).
  • ТРИЗ не гарантирует получение результата.
  • ТРИЗ позволяет убрать психологическую инерцию, которая заводит решение задачи не в том направлении.
  • ТРИЗ направляет мыслительную деятельность в нужное русло формируя идеальное конечное решение (ИКР)
  • ИКР = сумма хорошего функционала / ( сумма плохого фукнционала + сумма ресурсов, необходимых затратить на изменение)
  • Идеальное решение — когда системы нет, а конечный полезный результат есть. К этому надо стремиться.
  • Сам автор убрал таблицы из алгоритма решения изобретательских задач.
  • Красивое решение задачи «как дать пользователю софт оперирующий массивом данных, который находится в публичном доступе, и не вводить специальные пароли, и при этом обеспечить работу автора и валидных пользователей». Решение задачи — изменять сами данные , используя при их первоначальном вводе, скажем, имя валидного пользователя и тем самым преобразуя исходные данные в валидные. По-моему я такую защиту видел в Abbyy Finereader и Lingvo.
  • Решений задачи может быть очень много, самое лучшее это то, которое наиболее близко к идеальному результату. А идеальный результат оперирует затратами, полезным функционалом и вредными эффектами. Тоже, конечно, все относительно.
  • Существует три формулировки противоречий:
    • Функциональная
    • Ресурсная
    • Свойств
  • Ключевое слово: система САМА, свойство САМО, объект САМ устраняет противоречие.
  • Противоречия можно решать:
    • во времени
    • в пространстве
    • в системе- в надсистеме
      • в сравнении
      • на микроуровне
      • физико-химические фазовые переходы
    • холодное-горячее может быть на разных концах, а может быть через время
    • велосипедная цепь — звоно жесткое, сама цепь — гибкая
  • Лев САМ не закрывает пасть, в тот момент, когда дрессировщик всовывает голову.
    • элементы системы в оперативном пространстве — зубы, губы, небо
    • что можно изменить? Зубы — нет, губы — да.
  • Решение — надеть льву губу на зубы чтобы он не заглотнул голову дрессировщика.
  • Моно-Дуо-Поли системы, и качественно другой скачок — развитие систем.

Amazon Kindle Paperwhite: для тех, кто любит читать

02.10.2013

Благодаря сотрудникам на ДР у меня появился Amazon Kindle Paperwhite, пару слов о котором я и хотел бы сказать.

До приобретения девайса у меня был опыт чтения только с iPad 2, в целом, довольно хороший. Минус активного излучения девайсом света при чтении — довольно ощутимая утомляемость для глаз, и iBooks почему-то довольно активно жрал батарею.

technical._V376689304_

 

Для чего может быть полезен Amazon Kindle при наличии  iPad? Конечно, исключительно для чтения. Но давайте посмотрим, чем он выигрывает?

Я бы отдельно отметил такие плюсы:

  • тонкий дизайн, по размеру как раз помещается в руку (и в карман куртки),
  • черно-белый дисплей (это я отношу к плюсам),
  • приятный на ощупь «прорезиненый» пластик,
  • длительное время работы от батареи, производитель обещает несколько недель без подзарядки,
  • и, конечно же, e-ink технология дисплея, которая использует отраженный свет, а не излучает активно в глаз 🙂
  • возможность чтения ночью обеспечивает подсветка дисплея
  • WiFi для синхронизации с аккантом в amazon и закачки книг, очень удобно

Из относительных минусов:

  • формат книг, поддерживаемых киндлом сводится к поддержке одного единственного MOBI, что заставляет меня производить конвертацию книг из iPad формата ePub в формат MOBI

Теперь о заправке киндла книгами.

Самым удобным способом заправки киндла книгами я нашел использование софта Calibre (русская локализация выглядит ужасно) с настройкой конвертации в MOBI и отправки почтой прямо на почтовый адрес моего девайса. У меня сейчас это делается одной кнопкой из тулбара приложения. В моем случае отправленный книжный аттач на [email protected] заставит мой девайс при синхронизации по WiFi скачать книгу приаттаченную в письмо. В целом это довольно удобный способ зарядки девайса книгами.

Для пополнения книжного запаса активно используется Флибуста, которую я по случаю для себя открыл.

В сухом остатке: девайс для чтения книг хороший, годный. Удобно читать не только при ярком солнечном свете, но и ночью.

P.S. Книги, которые я вчера залил для чтения, и которые вам могут быть небезынтересны:

  • Мариам Петросян, Дом, в котором…
  • Нассим Николас Талеб, Чёрный лебедь. Под знаком непредсказуемости
  • Джим Коллинз, От хорошего к великому. Почему одни компании совершают прорыв, а другие нет…
  • Колин Кэмпбелл & Томас Кэмпбелл, Китайское исследование

Легкий способ перестать обижаться

27.09.2013

obida_31

Вас пробуют задеть, обидеть? Вам говорят нехорошие слова? Вас так и распирает ответить и нагрубить? Как правильно поступить в такой ситуации?

Для того, что бы ваша реакция была иной, нежели ответ на хамство хамством, подумайте о следующих вещях:

  • важно ли для меня мнение этого человека?
  • хочу ли я продолжать общение с этим человеком?
  • нужно ли мне будет взаимодейстовать с этим человеком в будущем?

Если хотя бы на один из этих вопросов будет утвердительный, то попробуйте вычленить конструктивную критику и перевести разговор в конструктивное русло. В споре оба человека будут стараться донести исключительно свою мысль как правильную до оппонента, повторяя ее снова и снова. Зная этот факт довольно легко прекратить спор перешедший в ссору.

Если на все вопросы ответ отрицательный, то все становится проще. Взвесьте ценность этого мнения для вас и вопрос – обижаться, или нет, отпадет сам собой.

Построение бизнес-процессов ИТ-компании. Финал.

24.09.2013

Все, схема готова.

Добавлены новые потребности, изменены продукты.

Об этом и другом вы можете прочесть в оригинале записи.

Построение бизнес-процессов ИТ-компании, итерация вторая. Почти финиш.

19.09.2013

В этот раз мы узнали как же в действительности происходит выявление «кубиков» основных, вспомогательных и управляющих бизнес-процессов.

В основных процессах появился еще один кубик, которого не было раньше.

Об этом и многом другом вы можете прочесть в блоге Livejournal IT-Premium.

Основные процессы

Построение бизнес-процессов для ИТ-компании.

16.09.2013

Для тех, кто еще не запасся попкорном, настоятельно рекомендую это сделать, поскольку сегодня мы начали реалити-шоу по описанию карты бизнес-процессов компании ИТ-аутсорсера с Романом Зайцевым, автором ресурса «Управлеиние бизнес-процессами и системное мышление«.

Сегодня состоялась первая итерация, которую я описал в нашем блоге IT-Premium.

P.S. Картинка исключительно для привлечения внимания.

Почему диета Дюкана это не то, что нужно?

11.09.2013

Некоторое время назад я поддался на провокации г-на Лебедева и стал пропагандировать диету Дюкана пока не пообщался с докторами. Оказывается, можно спровоцировать ряд серьезных заболеваний типа «подагра», которые могут возникнуть в результате отложения пуриновых оснований, которые являются результатом распада белковой пищи. Таким образом очень просто можно заработать суставную боль и другие неожиданные симтомы.

Всем, кто хочет нормализовать вес лучше использовать полноценное питание по диете «Три кулака», суть которой в сбалансированности поступаемой пищи по типам микроэлементов.

 

Также настоятельно рекомендую прочесть книгу «Китайское исследование» Колина Кемпбелла.

Сейчас я в качестве эксперимента построил питание именно по рекомендациям этой книги.

Диета три кулака

Если отвалилась Java на Mac OS

14.08.2013

В случае, если приложение типа Aris Express не работает на Mac OS из-за java следует выполнить следующее:

Возвращаем к жизни управление настройками Java http://dl.dropbox.com/u/23516883/JavaEssentials.pkg

А также не забываем выполнить уличную магию в терминале:

sudo ln -sf /System/Library/Frameworks/JavaVM.framework/Commands/javaws /usr/bin/javaws

Voila!

Хозяйке Mac на заметку: как узнать, куда делось место на диске?

08.08.2013

Владельцы даже особо больших дисков зачастую задумываются, куда же делось место? Так, на моем fusion drive ™ в суммарные 616Гб уже 500Гб чем-то занято. Наглядно увидеть и проанализировать, куда же делось место с удобным отображением поможет программа Daisy Disk.

Daisy Disk

Для Windows есть бесплатный аналог OverDisk. А также небезынтересна утилита SequoiaView.

 

UPDATE: Приятель Pumpkin Head подсказал бесплатную утилиту Disk Inventory, которая в несколько другом виде, но тоже наглядно отображает содержимое диска.

 

Жизненный анекдот

07.08.2013

Мужчина в возрасте приходит в отдел кадров фирмы. Кадровик:

— К сожалению, вы нам не подходите. Нам нужны люди молодые, амбициозные, способные творчески расти!

Мужчина:

— И всё–таки запишите мой телефон. Когда выяснится, что у вас все творчески растут, а работать некому — позвоните.

Новое оформление блога

06.08.2013

Все течет, все меняется.

Когда-то тебе нравились одни штуки, проходит некоторое время, и тебе уже нравятся другие. Мы меняемся, а вместе с нами и мировосприятие.

Так и с этим блогом. Для чего «рюшечки» и красивое «журнальное» и скеуоморфное оформление блога, если люди сюда приходят почитать?

Поэтому встречайте другую крайность — Content is the King. Иными словами суровый минимализм.

Как вам?

 

Хозяйке Mac на заметку: перевод и толкование слова

06.08.2013

А знаете ли вы, что Mac способен быстро и удобно дать перевод или объяснение слову, которое вы встретили в тексте?

 

Для этого существует комбинация Cmd + Ctrl + D. Наведите курсор мышки на слово, с которым хотите разобраться. Жмите комбинацию клавиш. Если у вас подключен словарь, то увидите определение или перевод данного слова.

Подсказка выглядит следующим образом:


2013-08-06 at 21.38

Как подключить словари Lingvo вы можете узнать из этой статьи.

 

 

Лайфхак: как правильно сложить рубашку

01.08.2013

Какие приложения я использую на Mac?

25.07.2013

Используется активно или почти каждый день

  • TaskPaper система управления задачами, синхронизируется с iPhone/iPad
  • Transmit — передача файлов по FTP, SFTP, SSH
  • iSoftPhone — клиент SIP телефонии
  • TweetBot — твиттер клиент, синхронизируется с iPhone/iPad
  • Sparrow — почтовый клиент (gmail)
  • Radium — радио в трее
  • DayOne — дневник (перешел на него после Memories)
  • Movist2, VLC — просмотр видео
  • iBank — управление персональными финансами, синхронизируется с iPhone
  • IA Writer — написание текста в Markdown разметке
  • CoRD — microsoft remote desktop
  • Alarms Express — простая и быстрая напоминалка с уведомлением (чайник выключить)
  • Cloud, Glui — быстрое расшаривание файла, изображения
  • Keycard — блокировка Mac при помощи Bluetooth телефона

Автоматизация работы

  • Keyboard Maestro — хоткеи на запуск приложений, запуск AppleScript, управление TaskPaper
  • Hazel — автоматическая маркировка цветом файлов, екшены на файлы, автоматизация обработки файлов
  • Moom — менеджмент окон
  • Flux — автоматическое управление яркостью монитора (температурой белого) в зависимости от времени суток. После установки проги перестали болеть глаза.
  • 1Password — менеджмент паролей, синхронизация с iPhone/iPad
  • iStat Menus — красивые графики загрузки и температуры в статусбаре

Облачные сервисы, которые не нуждаются в представлении

  • Skype
  • Dropbox
  • Evernote

Разное интересное

  • Essential Anatomy — анатомия человека в 3D
  • TheBrain — выгрузка памяти из мозга во внешнее хранилище, карты памяти

Ушли на покой

  • Reeder — перестал синкать RSS с Google Reader
  • TheHitList — пришла замена в виде TaskPaper, о чем я написал — ранее, к тому же его разработка прекратилась

Друзья, это далеко не полный список, и я буду благодарен, если вы поделитесь какими приложениями вы пользуетесь в своей каждодневной работе.

Что почитать?

22.07.2013

В свете беспомощности правительства в плане экономических реформ решил почитать, а как было в других, более успешных странах в менее удачных стартовых условиях?

И вот, оказалось, какой опыт современной истории следует изучить.

Опыт Германии: экономическое чудо

Сингапур и его первый премьер-министр

Как бы мне хотелось, что бы у руля оказался кто-то из парней похожих на этих.

IKEA в Украине

10.07.2013

Просматриваю как-то статьи и обнаруживаю, что IKEA уже предпринимала попытки быть в Украине.

IKEA Шведский мебельный гигант пять лет прилагал героические усилия,

чтобы закрепиться на украинском рынке. В 2005 году основатель компании

Ингвар Кампрад презентовал украинским чиновникам масштабный

инвестплан, который предполагал строительство крупнейшего в Восточной

Европе торгового центра «Мега». Однако из-за сложностей с выделением

земельного участка и коррупции при выдаче разрешительных документов

эти планы так и не были реализованы. В 2010 году IKEA продала все

украинские активы — два деревоперерабатывающих завода и мебельную

фабрику. Официальная причина — неблагоприятные условия для ведения

бизнеса.

Источник http://focus.ua/economy/274855/

Беда-печаль. Это из той же серии, почему я до сих пор не могу пользоваться 3G от лайфа в своем айфоне.

Татуировки — зло

17.06.2013

Вот такая простая мысль пронзила сознание пять минут назад.

Татуировки — зло.

Почему? Да потому, что человеку свойственно изменяться, и то, что актуально и злободневно для него сегодня, запросто может не быть столь существенным завтра. И рисунки на различных частях тела будут безмолвным напоминанием о былых предпочтениях.

Жить каждый день как новый, с новыми мыслями. Вот что важно.

Улучшаем работу с TaskPaper при помощи Keyboard Maestro

03.06.2013

Спешу поделиться, мои дорогие обладатели Task Paper и компьютера с системой Mac OS, своим опытом улучшения взаимодействия человека и программы управления задачами TaskPaper.

Как я уже описывал ранее в своей системе Getting Results Agile Way для TaskPaper, есть определенный список файлов с задачами.

  • 2013
  • Backlog
  • Week 2013-04-01
  • папка Personal Projects
  • папка Work Projects
  • папка Archive
  • Commitments
  • Calendar
  • Покупки

и самый важный и часто используемый файл это Week 2013-XX-YY (XX-месяц, YY — день)

Я очень большой поклонник «оттачивания пилы», то есть доведения остроты инструментов, которые я использую каждый день, до состояния бритвы. И что мне так нравится в Mac, это возможность кастомизации всего и вся при помощи AppleScript и назначения горячих клавиш.

Какие горячие клавиши я настроил в своем Keyboard Maestro для TaskPaper?

  • Cmd+1 — откроет текущую неделю Скачать
  • Cmd+Alt+1 — откроет следующую неделю Скачать
  • Cmd+2 — откроет файл Calendar Скачать
  • Cmd+3 — откроет файл Backlog Скачать
  • Cmd+4 — откроет проект Project 1, которым я занимаюсь в основное свое рабочее время

Когда я нахожусь в файле Week 2013-XX-YY, то у меня работают еще и такие горячие клавиши:

  • Alt+Down — переход на следующий день (отфильтровывает проект-день) Скачать
  • Alt+Up — переход на предыдущий день Скачать
  • Cmd+Alt+Ctrl+Down — добавить к текущему дню следующий (просмотр сразу двух дней, например сегодня и завтра)

Также, когда я нахожусь в файле Week 2013-XX-YY у меня срабатывают триггеры на определенные словосочетания, так, например, при наборе слова «shd» у меня создается новый комментарий Скачать

«========== should =========»,

при наборе «cld» создается новый комментарий Скачать

«============ could ============»

которым я отделяю три задачи, которые хорошо бы и три задачи которые надо бы.

Если мне необходимо переместить прошедшую неделю в архив, то я запускаю Alfred.app и ввожу «Task», где первым пунктом выпадает сама программа TaskPaper, а вторым папка TaskPaper в Dropbox. Таким образом я быстро открываю папку и перемещаю прошедшую неделю драг-н-дропом мыши в архив.

Анекдот

14.05.2013

— Ало, это Internation World SMM digital group?
— (шепотом) Да
— А почему шепотом?
— Я на математике.

Про цели

07.05.2013

Маленькая цель -> Промежуточная цель -> Большая Цель -> Миссия -> Смысл жизни

Так должна выглядеть цепочка целеполагания у психически и физически здорового взрослого человека.

Оградить от ошибок

28.03.2013

Часто мамы уберегают своих малышей от совершения поступков, которые называют ошибками.

Однако ошибки — это способ познания мира и иногда нет другого способа узнать истину, как попробовать совершить поступок. Человек попробовал что-то сделать, не получилось и в следующий раз он будет избегать повторения ошибочного пути.

Но мамы твердят: «Не бегай, упадешь!», «Не лазь на это дерево, ветка обломается!».

Уберите ошибки из жизни человека и он мало чему научится. Зато этот же человек научится бояться совершать поступки! Нужно ли уберегать близкого человека от совершения ошибок? Да, но только если вы сможете дать возможность пережить эту же ошибку в облегченном варианте, как прививку от оспы. Человек должен переболеть оспой в легкой форме в детстве, что бы приобрести иммунитет на будущее. Или донести мысль таким образом, что бы человек принял полностью самостоятельное решение.

Самое важное – это умение извлекать уроки из ошибок, а не опускать руки. В конце каждой недели, подводя итоги, основные сделанные и несделанные задачи я анализирую на предмет уроков. Пожалуй, это одно из самых значительных действий, которые приближают к нужному результату.

Извлечение уроков,– это именно то, что делает человека умнее и сильнее. Правильно извлекать уроки – штука критически важная.

О сравнении и истории

25.03.2013

Человек обучается тогда, когда начинает сравнивать. Белое с черным, хорошее с плохим. А для того, что бы было с чем сравнивать, необходимо приобрести опыт или «первоначальную установку».

Помните, из детства? Кроха сын пришел к отцу и спросила кроха, – «Что такое хорошо и что такое плохо?».

То, насколько мир белый или черный предлагается человеку узнать из опыта родителей и опыта сверстников на улице. До определенного возраста, пока маленький человек не обладает необходимым опытом для собственного сравнения, это формирует идентичное мировосприятие у людей, сгруппированных по территориальному и этническому признаку, которые называют себя «народ», «страна».

Мировосприятие отдельного народа формирует история и современные события глобального и локального масштаба. Так, у граждан СССР было восприятие народов «братскими», у современных России и Украины сейчас восприятие друг-друга продиктовано более свежими событиями с 1991г по наши дни, и является чуть менее «братским». У негров воспоминания связаны с рабовладельческим строем.

Когда человек получает возможность самостоятельно передвигаться по миру и начинает познавать и сравнивать более другие места и народы, изучать их историю, тогда его кругозор расширяется и он начинает сравнивать события и вещи на основании своего нового опыта и делать собственные удивительные открытия.

Например, что СМИ – это часть политики, и что нужно очень сильно отфильтровывать новости-факты от вольной трактовки этих же новостей. Ведь для понимания поведения людей необходимо знать их историю. У каждого народа есть своя история и у отдельного человека есть своя история. Историей отдельного человека занимается наука психология. Именно поэтому знание истории как человека так и народа дает представление о его субъективном белом и черном, о хорошем и плохом.

То, что в нашем школьном образовании называют историей, не что иное как попытка отбить охоту знать вообще что такое история.

Для чего нужно вообще запоминание дат? В детстве я абсолютно этого не понимал. Ну какой смысл мне от знания конкретной даты, скажем, Куликовской битвы?

Уже сейчас, по прошествии многих лет, знание дат позволяет мне сопоставлять различные события в мире и складывать их в один паззл, который многое объясняет. И именно это открытие делает сейчас историю для меня такой интересной.

А что делает интересной историю для тебя, %username%?

Невероятно круто сделано «внутренний ребенок»

19.03.2013

Фотопроект «Внутренний ребенок»

Очень круто сделано.

О заблуждениях людских

18.03.2013

В фасебуке некто в профилем «Я в шоке» прикрепил такую фотографию: enter image description here

И написал такую подпись:

У землян нет денег, чтобы доставить воду в засушливые районы Земли, но

есть деньги, чтобы искать воду на Марсе. После этого стоит задаться

вопросом: Есть ли на Земле разум?

Чем, конечено же, и вызвал волну репостов.

Рискну высказать непопулярную мысль. Друзья мои, то, что написано в подписи называется «манипулирование сознанием на контрастах». Казалось бы, две совершенно разные темы связанные одним общим словом, даже не понятием, а словом! И какой шикарный вывод.

С водой действительно есть определенные проблемы в некоторых из африканских стран. И знаете что? Большинство из этих проблем вполне решаемы, но негры сами не хотят прикладывать усилий для решения. Население африканского племени может тратить кучу времени на поход за водой 10-15км до источника пресной воды, создавая огромные очереди. Но первый акведук был изобретен еще египтянами, и с тех пор успешно используется всеми теми, кому это было действительно нужно.

Еще раз, проблема Африканских племен в самих африканских племенах, где мужчины не хотят работать и обустраивать быт.

Проблема поиска воды на Марсе из совершенно другой плоскости. Из той, где человечество пробует раздвинуть рамки текущих знаний и заглянуть в будущее, заглянуть в прошлое. Достижения в этой области станут достоянием всего человечества. Оцените только названия марсоходов: Curiosity, Opportunity, Spirit. Да они же сами за себя говорят! Говорят о человеческом желании любопытства и познания, о важности расширения границ наших знаний.

Без жажды к познанию человечество все еще долбило бы орехи каменными топорами.

Поэтому, дорогие мои, давайте не сравнивать теплое с мягким.

Психологическо-стрессовое

16.03.2013

Недавно для книги я писал главу о человеческом стрессе, при чем захотелось дойти «до самой сути», а именно, какие биохимические процессы протекают в человеке, который находится в состоянии стресса.

И знаете что? Очень многое можно объяснить биохимией, например, лобные доли головного могза (которые отвечают за логику и сознательные решения) начинают меньше участвовать, и больше вовлекается эмоциональная часть мозга. Происходит сильный гормональный вброс. Повышенный инсулин заставляет интенсивнее расходовать запасенную энергию (которую впоследствии нужно как-то восполнить, например, шоколадными батончиками). Энергообеспечение организма перестраивается, температура повышается, как и нагрузка на печень.

И мне кажется, что и обратные процессы имеют место быть. При недостатке энергетического питания организма (глюкозы) организму приходится переходить на липидное питание за счет аминокислот, и организм протестует против такого нерационального расхода строительных материалов запуском ответной реакции.

/uploads/2013/03/prefrontalstress.png

Сейчас я открою Америку 😉 Какой напрашивается вывод? Да очень простой, чем меньше стресса в жизни, – тем лучше здоровье. И, если вы стоите перед принятием решения, с одной стороны которого деньги, а с другой – нервы, подумайте о таком выборе как о выборе между деньгами и вашим здоровьем.

Ну и да, до 30 лет ваши потенциальные проблемы со здоровьем нивелируются молодостью (читай новизной) организма.

Для чего я выуживаю всю эту медицинскую хрень, спросите вы? Да потому что только через полное понимание процессов можно изменять собственные привычки и жизнь к лучшему.

Путен и Янукович

14.03.2013

Посмотрев прекрасный ютубовский ролик под названием Оскар уходит Дмитрию Киселеву, где одного героя ролика опускают, а другого очень даже наоборот, что является прекрасным примером розжига международной вражды, который через СМИ внедряется под корочку сознания российского обывателя.

Ведь происходящее показывается на первом (!) канале страны. К моему большому сожалению российские власти, а это именно оттуда спускается настолько гениальная мысль, высказывать прямое неуважение к вялому, но все же гостю, совершенно забывают про элементарный этикет.

Позиция Януковича весьма незавидна, ведь он далеко не Леонид Макарович, что бы «лавировать миж краплыночками» и не Леонид Данилович. Красноречие Януковича действительно вызывает сожаление, ибо этот навык для политика должен быть отточен как нельзя более круто (посмотрите, для сравнения, на выступления Барака Обамы). Политическая позиция тоже непроста, потому как нужно слегка выторговать кредитов у Евросоюза для поддержания штанов и попытаться снизить расходы на газ от российских товарищей, для поддержания их же. Требование Евросоюза навести порядок в судебной системе это не просто «вказивка», а это то, как минимум с чего бы начал я, будь я президентом. Европейцы знают, о чем говорят, из трех властей законодательной, исполнительной и судебной все усилия первых двух могут быть сведены на нет в третьей, и именно с нее нужно начинать. В реформах судебной и исполнительной власти стоит брать пример с Грузии, где американские деньги были не просто пущены по ветру, а действительно стали базой для проведения многих важных реформ.

В любом случае, Януковичу, при всех его недостатках, стоило попытаться поехать и поныть на счет цены на газ, и он поехал и поныл. Было бы хуже, если бы даже попыток не сделал. А так попробовал, не дали, поехал домой.

Но то, что происходит по российскому ТВ напоминает смех и улюлюкание старшеклассника, который плюнул в спину более слабого товарища, с которым они вместе когда-то дружили. Это не демонстрирует силу, а вызывает лишь омерзительное чувство брезгливости к низкому уровню качества российских «новостей».

И если бы я был россиянином, то вряд ли испытывал бы гордость за такой слив помоев в эфире первого канала родной страны.

Зритель будет вознагражден за терпение в самом конце

13.03.2013

Один из прекраснейших шедевров короткометражного кино.

Про сайты

13.03.2013

Так уж получилось, что первый свой сайт за деньги я разработал в 1999г. Это был каталог стройматериалов где-то на 30000 позиций. Первый свой сексуальный опыт разработчика я получил на свежевышедшем PHP 3.0.3, MySQL.

За этот проект я получил первый свой гонорар, а также защитил его в качестве бакалаврской работы (за что получил 4 балла, ибо мало кто придавал такую значимость вебу в 99г).

Успел я поработать в известной на то время веб-студии [DOM.COM], где приобрел дополнительно навыки системного администрирования и ухода за хостингом, доменами сайтов.

Тернии, через которые мне пришлость пройти в вебе: Perl, PHP (автор модуля XSLT для PHP помогал мне скомпилить его на моем хостинг-сервере), Parser 2, Parser 3, и, наконец, Ruby on Rails.

Но постойте, этот пост не про меня (как вы могли ошибочно подумать), все вышеперечисленное просто должно добавить экспертного веса моим словам, которыми я собираюсь поделиться ниже.

Что такое вебсайт для компании?

Вебсайт компании прежде всего знак миру о том, что вот, есть такая компания, ее сердце все еще бьется (год в копирайте в футере соответствует текущему). Вебсайт для компании это как одежда для человека, а по одежде производят первичную идентификацию на соответствие собственному уровню.

Неряшливый вебсайт с хорошим содержимым чаще всего будет говорить о неверном выборе разработчиков (с целью сэкономить на старте бизнеса). Но если посетитель сможет найти то, что искал и проникнуться уважением к тексту, то огрехи оформления значительно нивелируются. Яркий этому пример craigslist, если вы понимаете, о чем я. Его дизайн не менялся, пожалуй, с 90х, но это не очень мешает ему выполнять свои функции.

Другое дело, если и оформление в стиле «жах» и тексты оставляют желать лучшего. Тогда возникает вопрос «о чем это вообще» и незамедлительное желание уйти и не вернуться.

Технологии в наше динамичное время стремительно меняются, пожалуй, еще быстрее, чем мода в одежде. Поэтому вовремя несделанный редизайн сайта делает его устаревшим в глазах новых посетителей.

Значение вебсайта с начала 2000х и до сегодняшнего дня изменилось вместе с числом людей, получивших доступ к Интернет. Разработчиков для веб стало очень и очень много, что понятно, ибо спрос диктует предложение.

И в качестве заключения бонус-вопрос:

Чем будет отличаться для вас сайт за 500грн и сайт за несколько тыс $?

Пожалуй, за несколько тыс $ (в Украине) вы будете взаимодействовать с людьми, которые за много лет наступили на большинство грабель и очень правильно понимают слово «Дизайн» и получите решение вашей проблемы, а не бесполезный кусок говна, спроектированный самим, не разбирающимся в деталях сайтостроения, заказчиком.

P.S. Иногда я думаю, что заниматься веб-разработкой за деньги для меня было бы занятием намного более выгодным текущего.

8 марта

10.03.2013

Иногда мне очень хочется, что бы люди придавали свой смысл прочитанному (вот в этом и есть сила слова), особенно в связи с событиями.

Спасибо Роберту Рождественскому за это стихотворение.

Красивая женщина – это профессия.
И если она до сих пор не устроена,
ее осуждают и каждая версия
имеет своих безусловных сторонников.
Ей, с самого детства вскормленной не баснями,
остаться одною а, значит, бессильною,
намного страшнее, намного опаснее,
чем если б она не считалась красивою.
Пусть вдоволь листают романы прошедшие,
пусть бредят дурнушки заезжими принцами.
А в редкой профессии сказочной женщины
есть навыки, тайны, и строгие принципы.
Идет она молча по улице трепетной,
сидит как на троне с друзьями заклятыми.
Приходится жить – ежедневно расстрелянной
намеками, слухами, вздохами, взглядами.
Подругам она улыбается весело.
Подруги ответят и тут же обидятся…
Красивая женщина – это профессия,
А всё остальное – сплошное любительство!

© Роберт Рождественский

Мысли о Дизайне

08.03.2013

541533_423559324402019_1765410077_nЛюбi друзi, дружите с ангийским языком, это не только расширит ваш кругозор, но и позволит читать такие статьи как эта: https://www.gov.uk/designprinciples, в которой описаны 10 рекомендаций при Дизайне.

В целом под Дизайном у меня возникает следующее определение: «Дизайн, это когда создавая вещь, думали обо мне. Как я буду ее [вещь] использовать, почему, и как, мне должно быть легко с ней взаимодействовать?», а отнюдь не «красочные пятна в нужном порядке», каким это мнение распространено среди обывателей.

Именно поэтому, когда я не понимаю суть разработки до конца, либо что-то интуитивно меня смущает (обычно это говорит о сложности), то просто не делаю разработку до тех пор, пока у меня не будет в голове аккуратно сложенного паззла. Мозг, он ведь такой, он работает в бекграунде в подсознании над моей задачей, и когда все готово — выдает ответ.

Научиться этим пользоваться – очень полезный навык. Однако опасность, которая вас может подстерегать на этом пути, это жесткие сроки, которые может (и должен) установить по задаче/разработке заказчик, в том случае, если заказчик не вы.

И это может отнять у вас возможность «положить задачу в бекграунд» и вы можете начать генерить «быдлокод» или «компромиссное решение».

Если заказчик вы, то продукт получается прекрасным ровно до момента исчезновения мотивации (ответа на вопрос «зачем»). Именно поэтому Open Source продукция зачастую имеет довольно короткий жизненный цикл, и тогда нужно передавать дело в руки других людей, которые подобную мотивацию только начинают приобретать.

Феномен Open Source работает по причине того, что человек, который кодит open source, в пирамиде Маслоу удовлетворяет потребность более высшего порядка.

Вот такой вот удивительный мир.

В рамках апгрейда жизни

07.03.2013

611Nc1aUuUL._AA160_ Я начал писать книгу, и пока что дал ей рабочее название «Как стать директором». В книге я собираюсь поделиться опытом становления другой Личностью, бесстрессового управления множеством дел, владением дао правильных финансов, правильными делегированием обязанностей, лидерством, и навыками проведения презентаций и публичных выступлений.

За последние полгода для меня довольно много вещей обрели иной смысл и жизнь открыла свою другую сторону, светлую.

Для того, что бы стать на новую ступеньку развития мне пришлось достаточно много поработать над собой: и в первую очередь научиться управлять страхом, быть честным с самим собой и уметь распределять мои усилия и моей команды правильно. В управлении страхом мне очень помогла книга The Flinch, важность которой для развития человека оценил такой гигант как Amazon и проспонсировал ее распространение сделав ее бесплатной для всех

Для тех, кто не очень дружит с английским я рекомендую курс Игоря Туника «Управление страхом»

Не могу это прятать :) Правда о дизайне вашего продукта

28.01.2013
A9 7yQLCYAAwDXY jpg large

Сага о Приватбанке

27.01.2013

Судя по всему, руководство субъекта приняло стратегическое решение о захвате рынка технологическим и маркетинговым путем.

Поэтому нельзя не заметить, что из сверхуебанского Приват24 перерос в то, с чем уже можно работать без ощущения брезгливости. И Liqpay хорошая вещь, и магазин товаров и услуг внутри клиент-банка приват24 тоже, в общем-то уже большого отторжения не вызывает. И скайп внедрили по всем отделениям (и удобно и связь даром), и линукс убунту (дешево). И даже скопировали штатовский стартап Square, только вместо штатовских 2,75% поставили 3,5%, видимо за трудности при копировании, либо из-за лицензионных отчислений, либо из жадности. Но это много, поэтому продукт, скорее всего, не рулит у потребителя (однако ж нишу заняли).

Видимо потому, что программистов УЖЕ взяли хороших, а не студентов за еду, наладили agile цикл деплоя новых фич, и поэтому по ИТ функционалу банк сейчас впереди планеты всей. Видимо в цикл разработки теперь попали и acceptance тестирование, поэтому откровенной лажи с базовыми вещами все меньше и меньше.

Но омерзительная хитрожопость приватбанка вызывает у меня чувство священного негодования. Именно поэтому появился этот мой пост, который, я надеюсь, убережет доверчивых потребителей от коварных лап ростовщиков.

Сегодня хотелось бы поговорить о хитрожопости, с которой субъект порабощает мир.

Ну, начнем издалека, немного о кредитных картах. Они появились в конце 70x и вошли в экономику США как средство безналичного расчета для потребителей и заодно как средство для наполнения кровью экономики — деньгами из кредитов, что дало нехилый прирост американской экономике. На сегодня есть два вида карт: дебитовая, с которой нельзя уйти в минус, и кредитная, которая позволяет очень легко залезть в кредит и сделать покупку с минусом денег на счету.

Большинство наших сограждан не имеют базового финансового образования, и то, что представляют из себя их финансовые знания — знания их родителей с советским прошлым, то есть почти никаких. В этом советском прошлом нормальным считалось «занять у соседа до получки», «перекрыться до зарплаты». И это на то время работало хорошо.

На сегодняшний день реальность такова, что «занять до получки» легче морально и проще простого у банка или кредитной спилки. А еще легче, без включения мозга, поддаться импульсивной покупке и, пользуясь кредитной картой, вогнать себя незаметно в долги.

Вроде бы и у соседа и у банка «занять в долг», но разница, в действительности, очень велика. Эта разница — ростовщический процент или процент по кредиту.

«И предприятия берут кредиты, и все у них хорошо!» можете сказать вы, и будете по-своему правы. Разница между пересичным громадяныном и предприятием в том, что предприятие имеет финансовое образование и контроль над финансами (вкладывая в активы) и выплачивая кредит С ПРИБЫЛИ, а пересичный громадянин вкладывает в пассив, по сути, просто начиная работать частично на банк за свой телевизор с большой диагональю. Отсюда и цель у ростовщических банков — выдать БОЛЬШЕ именно кредитных, а не дебитных карт, и сделать получение кредита МАКСИМАЛЬНО ПРОСТЫМ, идеально, если в один клик и не вставая со стула или незаметно, при совершении импульсивной покупки.

Таким образом у нашего субъекта есть цель захватить вселенную Украину путем обеспечения всех и каждого поразительным количеством кредитных карточек. Вот так и родилась на свет «Карта Универсальная», она же карта кредитная, она же ключ-доступ к счету, она же — замена паспорту, ваша идентификация.

Прикрываясь «удобством использования карты» для авторизации настоящая цель банка — ваш «импульсивный» кредит с покупок.

Желание банка натюхать именно кредитных карт настолько велико, что даже если у меня уже есть дебитовая карта приватбанка Visa Classic, но это ни кого не волнует и я не могу ее использовать для идентификации и открытия новых счетов (не смотря даже на фотографию на самой карте), я ОБЯЗАН иметь именно кредитную карту универсальную. При платежах по Украине с моей карты Visa Classic также не взымается 1% при платежах по Украине, в отличие от универсальной карты, и это банк, видимо, не устраивает. Поэтому карты Visa Classic уже перестали выпускаться банком (не смотря на то, что у других банков с этим все ок).

Сотрудники Приватбанка получают сверху план по реализации кредитных карт, получая определенное поощрение при достижении и перевыполнении этого плана.

И вот какие еще «заморочки» придумал субъект для реализации своего коварного плана.

Натюхивание кредиток через зарплатный проект.

Всегда для получения заработной платы бралась специальная чековая книжка, заполнялась нужной суммой из платежной ведомости и вы спокойно забирали деньги из банка для выдачи заработной платы всем сотрудникам.

Теперь в Приватбанке НЕЛЬЗЯ получить наличность на заработную плату в такой форме. Вместо этого я ВЫНУЖДЕН открыть для каждого сотрудника отдельный зарплатный счет, активация которого, как вы могли бы догадаться, происходит ТОЛЬКО при наличии у сотрудника карты универсальная. Понимаете, что происходит?

Таким нехитрым способом ВЫНУЖДАЮТ каждого сотрудника нашей компании открывать персональную кредитную карту в Приватбанке.

Лихо? Ага, еще как.

Но это еще не все, вот пару примеров того, как вас подстегивают открывать кредитки.

Не взымание комиссионного платежа 5грн при наличии карты «Универсальная»

Простой, как двери механизм, понятный даже недалекому соотечественнику. Меньше платить, не платить 5грн комиссии при совершении платежа — нужно лишь открыть кредитную карту. Это так просто.

Помощь сотрудников банка при платежах при наличии очереди в кассу.

Если вы стоите в очереди в отделении субъекта, то сотрудники ненавязчиво будут предлагать помочь оплатить счет БЕЗ очереди, но только при наличии кредитной карты «универсальная». У вас еще нет карты? Ах, открыть ее для вас — сущие пустяки.

И такая стратегия приносит свои плоды, вам должно быть ЛЕГКО получить кредитку, поэтому банк протягивает щупальца и ставит свои точки рядом с теми местами, где вы живете, работаете.

Еще одним свидетельством свинства является блокирование платежей в адрес Аваль-Райффайзен. Так, я не могу перевести средства с моей приватовской карты на карту visa classic, карте открытой в Авале.

Отвратительным примером недобросовестной конкуренции может послужить закрытие доступа к совершению платежей через отличный со всех сторон сервис portmone.com.ua со счетов приватбанка.

Вы могли бы подумать, что я против банков? Нет, я не против, банки играют ту же роль в экономике, что и кровеносные сосуды в организме человека. При этом выполняют роль паразитирующую на человеческих слабостях, и те из банков, которые эту роль выполняют лучше всего – в топе моего списка по мерзости целей существования.

Ведь каждая компания и каждый организм живет зачем-то, я, например, живу, что бы приносить пользу себе и людям, и ценности банковского паразитирования лично мне не близки, вот о чем была эта статья.

Дорогие люди, берегите себя, обучайте себя и воспитывайте себя, и будет все хорошо.

P.S. Если вы достаточно любопытны, то попробуйте узнать самостоятельно, чем отличается механизм гашения кредита в Украине от механизма гашения кредита в Евросоюзе, я обещаю, вы будете очень удивлены.

Мой TaskPaper и Getting Results Agile Way

19.01.2013

Если бы меня попросили охарактеризовать TaskPaper одной фразой, то, пожалуй, этой фразой стала бы «гениальная простота», поскольку то, что делает TaskPaper, на первый взгляд кажется простым текстовым редактором. Однако, погодите, не все так просто! И мне кажется, что я врядли изменю TaskPaper после моего увлечения такими штуками как Things, OmniFocus и TheHitList.

Самый базовый функционал сводится к следующему, у нас, в зависимости от разметки, текст может стать одним из трех элементов: задачей, заметкой и проектом.

Простой текст обычно выделяется серым и это просто текст. Что бы текст сделать задачей достаточно добавить «-» и пробел перед текстом. Это очень естественно, человек именно так обычно отмечает задачи в своем списке покупок. После нажатия Enter вы автоматически получите добавление — и пробела перед задачей, что экономит время. В конце задачи можно написать теги. Тег это тоже простой текст, перед которым находится знак @. Встроенные теги в TaskPaper это @today и @done. Когда мы клацаем по минусу возле задачи, она становится выполненной, получает тег @done и становится зачеркнутой. Все как в реальной жизни 😉


Если мы хотим сгруппировать задачи и показать, что это проект, то после текста добавим «:». Это автоматически сделает из текста проект и выделит его более жирным шрифтом. Tab на задаче сдвинет ее в подпроект, Shift-Tab в обратную сторону.

Теперь пару слов о функционале TaskPaper.

TaskPaper из коробки позволяет делать отбор по проекту Cmd+L, отбор по тегу Cmd+Shift+L, «умный» поиск Cmd+Shift+F, закрыть/открыть задачу Cmd+D. Казалось бы, ничего особенного? И да и нет!

Сейчас я покажу свой обычный workflow за основу которого взята методика Getting Results Agile Way и сетап ее автора для Evernote

Сам каталог TaskPaper находится в ~/Dropbox/TaskPaper, что позволяет комфортно работать с мобильными версиями TaskPaper.

В нем находятся каталоги:

  • Archive
  • Work Projects
  • Personal Projects

и файлы

  • Backlog
  • Week 2013-01-21
  • Покупки
  • Checklists
  • Hotspots
  • Calendar
  • 2013

Пожалуй, файл 2013 один из самых важных. Это план на год. Верхние три строчки — три самые важные задачи на 2013 год. Далее проекты по месяцам.

Планы на год 2013

Самые часто используемые документы – Calendar и Week 2013-01-21. В первом файле хранятся задачи или события привязанные к определенным датам, сгруппированные в дни-подпроекты формата 2013-MM-DD и в месяца формата 2013-MM.

Calendar

Это позволяет мне одним взглядом окинуть завтрашний и сегодняшний дни/недели и помочь распланировать мой день. Задача из текущего дня перемещается в следующий документ с названием «Week 2013-01-21». Этот документ является моим компасом на неделю/текущий день. Название для документа выбирается исходя из даты понедельника и включает в себя семь проектов-дней. В начале документа находится три задачи — это задачи, которые хотелось бы выполнить за эту неделю. Каждый день-проект содержит обычно до 9 задач ранжированных по важности: choose to (некоторые здесь используют must), should, chould. То есть три задачи я определяю как те, которые ДОЛЖЕН сделать, три — которые НАДО БЫ сделать и три ХОРОШО БЫ сделать. Это важное отличие от классического GTD, поскольку каждый ваш день — новые задачи, они не тянут за собой старые невыполненные задачи, и не перегружают ваш мозг своим количеством.

Week

Обычно я открываю именно эти два файла и раскладываю их на рабочем столе рядом плиткой (лучше всего на отдельном мониторе). Когда неделя подходит к концу и начинается новая, я завожу новый файл «Week 2013-01-21», и если у меня уже есть планы на эту неделю, то внесу их вверх этого файла. И когда наступает понедельник, и я планирую то, что хотел бы сделать за неделю, учитываю их. Также я переношу файл «Week 2013-01-14» в папку Archive. Файлы в папке Archive помогают мне сделать пятничную рефлексию и оценить мои результаты за неделю. Теперь, обычно, они меня впечатляют и вдохновляют. Когда я работаю с недельным файлом, мне становиться очень просто сконцентрироваться: достаточно нажать cmd+l и перейти в задачи для сегодняшнего дня! Также я автоматизировал немного этот процесс и добавил хоткеи для быстрого перехода к следующему или предыдущему дню. Итак, пройдемся вкратце по остальным файлам в папке TaskPaper.

Покупки — обычный список всех покупок от аптеки до ebay. Если покупка в магазине, ставлю тег @магазин, если покупка на ebay — соответственно. Также в этом файле находится мой wishlist, то есть те штуки, которые «неплохо бы когда-нибудь», в том числе и новый автомобиль 🙂 Классно, что wishlist попадается на глаза время от времени. Когда я захожу в магазин, достаю мобильный клиент TaskPaper и открываю этот файл. Часто что-то да и вспомнится. Backlog это аналог Inbox из классического GTD. Содержит в себе Work и Personal проекты, куда добавляются сырые, необработаные идеи. Время от времени я выуживаю оттуда идею, обрабатываю и планирую задачи по ней на день/неделю/месяц. Если это явно идея-проект на 100 миллионов, то завожу отдельный файл-проект в нужном каталоге (Work Projects, Personal Projects).

Checklists содержит в себе чеклисты-процедуры для пошаговых задач, в которых нужно полуавтоматически выполнять ряд действий. Типовая запись здесь — мои шаги для закрытия месяца в 1C, если вы понимаете, о чем я.

Hotspots Это понятие из Getting Results Agile Way, то есть сетка-компас направлений моего развития. Не могу сказать, что очень активно использую этот документ. Но если мне нужно понять, чего в жизни не хватает, а чего с избытком, я открываю и смотрю в этот документ.

Каталоги Work Projects и Personal Projects содержат по одному документу на каждый проект. Ничего особенного, но, пожалуй задержу минуту внимания на документе-проекте разработки одного веб-приложения.

Внутри документа есть такие «разделы» — Сырые идеи — Требуется дизайн — Требуется разработка — Доставка пользователям — Архив (выполнено)

Каждая моя идея, если она проходит мой внутренний отдел контроля, оформляется из идеи в «историю» попадает в раздел «Требуется дизайн».

После того как мне окончательно понятно, как будет выглядеть реализованная идея, какой будет у нее workflow, я перемещаю ее в раздел «Требуется разработка».

В этом разделе я добавляю тег для задачи, который характеризует усилия на ее разработку, обычно это @effort_1, @effort_2, @effort_4 и так далее до @effort_8. Иногда я пачкой делаю мелкие задачи, иногда одну большую планирую на целый день, смотря насколько это вписывается в мой график по остальным планам на день.

Выполненная задача переходит в раздел «Доставка пользователям» (в теории ее должен делать CI сервер). В общем доставляем пользователям, рассказываем пользователям о появлении новой фичи и собираем от них фидбек. После этого я делаю Cmd+D на задаче, затем Cmd+Shift+D и все зачеркнутые задачи отправляются в архив.

Для роста самомотивации рекомендуется иногда смотреть в Архив 🙂

В конце статьи не могу удержаться от того, что бы не дать пару советов о самомотивации и прокрастинации(глядя на хабр чувствуется, что это популярная тема).

  1. 80% действий и 20% планирования, а не наоборот. Сначала начните делать, а мотивация подоспеет как аппетит во время еды. Не ждите вдохновения, just do it.
  2. Мотивация это ответ на вопрос «Зачем я это делаю». Если нет четкого ответа на этот вопрос,– ждите прокрастинацию.
  3. Не перегружайте себя задачами, используйте правило трех. С задачами как с едой: не наваливай полную тарелку еды, съешь немного и попроси добавки, если не хватает.

Помни, Люк,выполненная задача повышает мотивацию.

Update: Читайте продолжение темы «Улучшение Taskpaper при помощи Keyboard Maestro»

Хозяйке на заметку: как снять магнитную метку при помощи магнита

13.01.2013

 

Для того что бы снять магнитную метку, которую обычно супермаркет вешает на вещи и может забыть снять, нужно обзавестись сильным магнитом.

Removed tag

Обычно такой магнит можно раздобыть в старом ненужном жестком диске.

002004

И применить как на картинке.

 

011013

 

За наводку и картинки спасибо этому парню

Омнифокус 1.x скачать бесплатно

12.01.2013

Омнифокус объявил беспрецендентную акцию. Для подогрева интереса к OmniFocus 2 открыл лицензию на версию 1.

License Owner: Waiting for OmniFocus 2 
License Key: KXKN-ZJDB-EJCX-LZHW-CFBF-QFC 

http://www.omnigroup.com/blog/entry/anticipating-omnifocus-2

Скриптинг на AppleScript

11.01.2013

AppleScript на поверку оказался довольно милым скриптовым движком, очень желавшим быть похожим на обычный человеческий язык.

Типовой скрипт выглядит как

tell  application «TaskPaper»

  tell  front document

   get name of selected entry

  end tell

end tell

 

данная конструкция покажет строку, на которой сейчас стоит курсор в приложении. И все бы классно, да вот, за такой простотой иногда скрывается неудобство. Например, в моей довольно простой задаче была потребность получить дату у текущего проекта, прибавить один день и перескочить на следующий проект.  Так вот, в AppleScript работа с датой довольно нетривиальная. Сейчас покажу две функции, и вы поймете почему.

on getDateFromText(dateText)

set vDate to null

set AppleScript‘s text item delimiters to {«-«}

if (count of text item of dateText) is 3 then

set vYear to text item 1 of dateText

set vMonth to text item 2 of dateText

set vDay to text item 3 of dateText

if (vYear > 1000) and (vMonth > 0 and vMonth < 13) and (vDay > 0 and vDay < 32) then

set vDate to current date

set year of vDate to (vYear as integer)

set month of vDate to vMonth as integer

set day of vDate to vDay as integer

set time of vDate to 0

end if

end if

return vDate

end getDateFromText

 

 

on getTextFromDate(vDate)

set dText to ((year of vDate) as text) & «-«

set dayText to (month of vDate as number) as text

if length of dayText is 1 then

set dayText to «0» & dayText

end if

set dText to dText & dayText & «-«

set dayText to (day of vDate as number) as text

if length of dayText is 1 then

set dayText to «0» & dayText

end if

return dText & dayText

end getTextFromDate

 

они делают именно то, о чем их название, зато как круто (код на ruby был бы в одну строку)!

Для чего нужно увлечение AppleScript? В самом частом случае – интеграция приложений с определенным, нужным только вам функционалом. Мне, например, потребовалось в TaskPaper (так как я уже полностью освоил его для Getting Results Agile Way), вести в одном файле, в котором помещается вся неделя, дела на каждый день, где каждый день – проект с называнием типа «2013-01-10» для 10 января. И обычно я фильтрую задачи на сегодня по текущей дате Cmd-L, но бывает довольно часто надо что-то перебросить на следующий день, или на предыдущий. И тогда я беру и фильтрую по 2013-01-11.

Теперь у меня появилось время и желание, дошли руки и я автоматизировал это процесс через Keyboard Maestro + AppleScript для TaskPaper. По нажатию Option+Up и Optoin+Down происходит инкремент или декремент даты 2013-01-10 и в строку поиска пуляется «project=2013-01-11», что фильтрует задачи на следующий день. 

Также заскриптил, что Cmd+Option+Down добавляет к фильтру и этот и следующий день, что вообще удобнее некуда. С AppleScript можно делать очень мощные штуки.

Страшно удобно, всем рекомендую. 

 

Куча AppleScript для TaskPaper 

Штуки, про которые хотелось бы написать прямо сейчас

08.01.2013

Особо хочется написать обзоры следующих штук, владельцем которых я стал недавно:

Из софта:

  • Hazel
  • Kayboard Maestro
  • Task Paper (OS X, iOS) -> мой основной GTD инструмент
  • MacVim + Janus
  • TheBrain
  • Apple FinalCut X
  • iBank

Из гаджетов:

  • USB2DVI конвертер DisplayLink для подключения дополнительного дисплея ($36)
  • о пользе двух и более мониторов на рабочем месте
  • X-Mini KAI bluetooth speaker ($51)

Из книг:

  • Getting Results Agile Way -> my-life-changing-thing
  • The Flinch
  • Алексей Каптерев «Мастерство презентации»

Я бы написал пару слов о каждом из инструментов, и, возможно, однажды это сделаю.

Мне довольно тяжело писать ради самого себя, поэтому если кого-то из читателей интересует один из вышеперечисленных предметов, прошу оставить комментарий, на который я буду стараться ответить.

Спасибо, что читаете мой блог.

Ссылка дня для увлекающихся ITIL: Free ITIL Training

17.09.2012

Не смотря на то, что все курсы на английском, достаточно много материала, включая ментальные карты здесь 

Впечатления от посещения семинара по ITIL от Мук и HP

09.08.2012

Cходил сегодня на ITIL семинар, очень понравилось!

Тренинг проводили в режиме симуляции HP Race to Results Simulation http://h10076.www1.hp.com/education/simulation.htm
Суть в следующем:
Игроки разбивались на команды:
1. Formula drivers (customers).
2. Service Desk,
3. Technical Stuff,
4. IT Director,
5. SEO (Financial)
Сервисы представляли собой компоненты Формулы 1: Fuel supply, Air cooling, Brakes, Engine и так далее.
Проводилась симуляция гонки, на протяжении которой возникали инциденты в данных системах, наличие инцидента уменьшало среднюю скорость в гонке.
Инцидент передавался в сервис деск, который раскодировал информацию о машине, гонке и затронутой системе в код приложения и передавал в Tech stuff, которые по спец картам пытались найти решение инцидента (по спец книжечке задачки на логику, на IQ). Можно было купить workaround, который дейстововал две минуты гонки, либо за дорого (в несколько раз), решение проблемы у вендора(ведущего), решение ребуса. Это решение ребуса можно было применять при новых инцидентах (если их правильно категоризировать).
Также был момент по внедрению новых сервисов, когда нужно было измененные и новые сервисы, расчитанные на определенные суммы (бюджет был ограничен),  проработать со всеми командами, что бы знали как их категоризировать и обрабатывать.
Первую симуляцию запустили и начался хаос и броуновское движение, попытались на месте придумывать формы для записи инцидентов и процессы по категоризации, но получалось довольно плохо и гонку мы проиграли. После анализа ошибок и кофе-брейка распределились по специализациям, разработали новые формы для инцидентов, улучшили, как могли, процессы, и по итогам новой симуляции выиграли гонку.
Так за короткое время мы успели познать суть сервисного подхода, и управления.
За что огромное спасибо компании Мук и HP за предоставленную возможность.
вот небольшое видео работы tech stuff с картой CMDB

How to fix ICQ HTML tags in iMessage

26.07.2012

This post is not actual any more, so here is another solution:

 

Go to  ~/Library/Preferences/

Open com.apple.iChat.AIM.plist

Change ForceICQPlainText to true

Save, put read-only attribute on file

Logoff/logon. Enjoy.

Хозяйке на заметку: как добавить в iTunes плейлист «последние добавленные»

30.04.2012

С одним из обновлений ушел удобный смарт-плейлист «последние добавленные», но, к счастью, восстановить его задача несложная.

 

Добавляем смарт-альбом как на скриншоте ниже и вуаля!

Снимок экрана 2012 04 30 в 11 08 13

Хозяйке на заметку: как определить поддержку процессором технологий виртуализации в FreeBSD и Linux

10.04.2012

Когда мы покупаем б/у сервер для виртуализации необходимо проверить Intel процессоры на предмет поддержки VTi

Для FreeBSD:

grep —color VMX /var/run/dmesg.boot

Для Linux

grep —color vmx /proc/cpuinfo

Просматривая резюме, ловим прекрасное

11.03.2012

Так как у нас на http://it-premium.com.ua снова открылась вакансия, разместили мы ее на work.ua и начали ловить кайф резюме.

Честно, я не совсем понимаю логику поциента, который пишет следующее, напоминаю, на вакансию рукастого системного администратора.

Додаткові відомості
Робота з ПЗ: MS Windows 98-7, MS Office, 1C, Internet Explorer, АБС В2, Far, Kerio WinRoute;

Ну вы себе представляете, насколько системному администратору необходимо владеть навыками работы с Windows 98, и, OMG, Internet Explorer наравне с 1C?

Господа, не пишите никогда резюме ТАК. Пишите лучше так.

Большущим бонусом будет указание вашего профиля на Facebook/Linkedin. И совсем хорошо, если вы ведете блог, обязательно его укажите.

Функция резюме такая же как и хорошего маркетингового case-study. Хорошее резюме продает, продает работодателю ваши навыки, помогает пройти первичные фильтры у HRов. Напишите так, что бы ваше резюме выделялось среди остальных, используйте принцип маркетинга differ or die, напишите историю о том, как с вашей помощью компания, где вы работали/работаете получила новые инструменты для ведения бизнеса (одинески там всякие) или же улучшила ситуацию с бекапами (их до вас не было совсем, и вот, теперь бекапы есть и работают). Для хорошего резюме очень хорошо бывает понимать суть бизнеса, какое для бизнеса value создает ИТ, но это уже числа и функции другого порядка, порядка ИТ директора.

Но ведь плох тот админ, который не стремится стать ИТ директором, верно?

Цвета в терминале Mac OS X Lion

07.03.2012

Лично для меня крайне удобным решением для терминала является iTerm2. Однажды, очень захотелось сделать его цветастым. Для получения расцветки необходимо добавить в ~/.bash_profile строку

export CLICOLOR=1

По наводке @snupt была найдена и установлена тема Solarized Dark, из-за которой, однако была практически отключена полупрозрачность из-за которой текст читался значительно хуже.

Снимок экрана 2012 03 07 в 12 52 31

 

Также Solarized Dark можно (и нужно) использовать с редакторами Textmate и Sublime Text 2.

Снимок экрана 2012 03 07 в 12 54 12

Sublime Text 2 Solarized Dark theme

Снимок экрана 2012 03 07 в 12 54 27

Что бы добавить цветастости к выводу git достаточно сделать следующее:

git config --global color.branch auto
git config --global color.diff auto
git config --global color.interactive auto
git config --global color.status auto

Как сменить пароль пользователя в терминале Windows?

27.02.2012

Оказывается, что Alt+Ctrl+End

Концепт windows desktop

27.02.2012

По мотивам источника: http://www.theverge.com/2012/2/24/2822891/windows-desktop-ui-concept

 

А ведь Windows мог бы быть и таким:

 

Desktopoy Explorer1o

Потрясающие вещи появляются в мире

22.02.2012

Иногда ваш покорный слуга не успевает следить за изменениями в окружающем мире, в особенности в нашем мире ИТ.

Из сегодняшних новостей, которые бы хотелось отметить особо — очень интересный переработанный дизайн FreePBX. Похоже у проекта появился дизайнер, что для open source не характерно, и поднял планку юзабилити вдвое.

freebpxfreebpx

И второе открытие за сегодня произошло через твиттер. Очень крутая веб-морда для gmail на HTML5. Открывая в safari на iPad от родного приложения не отличить.

Так и чувствуется, что будущее где-то совсем рядом.

 

Классический кейс-стади на примере одинесочной УНФ

19.02.2012

Такой шикарный, с точки зрения маркетинга, кейс-стади и у себя в блоге не зазорно разместить. Сам продукт, как я уже высказывался в нашем корпоративном IT-Premium блоге, чертовски хорош и аналогов практически не имеет. Но то, что нет разделения по доступу, и что к зарплатам может иметь доступ глазами любой кладовщик, – удручает. Ну и еще один баг — у номенклатуры типа «услуга» нет себестоимости, однако есть у типа «работа», но это уже глубокая специфика.

 

Практически как Visio онлайн

18.02.2012

Обнаружился на днях прекрасный и, что немаловажно, бесплатный онлайн-инструмент для рисования разного рода диаграмм, майндмапов и брейнстормов http://www.diagram.ly/

Хорошая библиотека как для Business Process Modeling, так и для описания компьютерных схем и прочих вещей. Пятая точка мне подсказывает, что сам проект, вероятно, не долго останется бесплатным и будет монетизироваться. Такие вещи показывают чуть более чем явно движение от desktop apps to cloud apps.

Вот схема, которую я создал за пару минут в diagram.ly.

Schema

Мой доклад на хабравстрече о цифровой телефонии

17.02.2012

Мой доклад о цифровой телефонии на базе asterisk на хабравстрече в Киеве

Мой доклад на прошлой хабравстрече

11.02.2012

На прошлой хабраконференции записали также и мой доклад об «ИТ аутсорсинге с поправкой на отечественного потребителя», однако видео, в виду слишком темного помещения и отсутствия дополнительного света вырезали, осталось только аудио.

Следующий мой доклад будет о цифровой телефонии на базе asterisk, на этот раз с видео.

Lightpack, интересное изобретение

06.02.2012

http://code.google.com/p/lightpack/wiki/WorkingBasis утверждается, что создание ambient света позади монитора уменьшает утомляемость глаз и способствует отдохновению.

 

У кого-то из читателей есть интересные мысли на этот счет, которыми хотелось бы поделиться?

 

Lightpack 5 from Atarity on Vimeo.

Чудесная настройка OpenVPN

04.02.2012

Два дня я вынашивал мысли о failover vpn, и даже пользовался экзотической схемой с получением внешнего IP через PPTP от одного хорошего провайдера но тот ограничивал скорость на уровне 1Mbit по туннелю, и пришлось думать иную схему.

И вот чудо, чудо!  Получилось организовать настоящий failover bridged VPN!

Итак, дано:

  1. Мой офис,  у которого два канала, один оптика, другой бекапный ADSL.
  2. Я с ноутбуком, который может быть где угодно, когда угодно и в любом состоянии.
  3. Свой сервер на colocation в гермозоне с подключением в интернет на 1Gbit, UA-IX и все такое, как положено.

Требуется:

Иметь доступ ко внутренней сети офиса при любых обстоятельствах (читай — отвалился канал), и пользоваться ее благами как то Timemachine бекап, терминальные серверы, файлошары.

Решение:

Если краткто, то это OpenVPN в режиме tap на сервере с честным IP (в моем случае это был даже windows 2008 сервер), Mikrotik 750G в режиме клиента OVPN в режиме ethernet, Viscosity (Tunnelblick) на моем Mac в режиме tap.

Как это работает?

Сервер с честным IP будем считать самой надежной точкой в сети и будем подключаться к нему, конфигурируем его с директивой server-bridge X.X.X.240 255.255.255.0 X.X.X.241 X.X.X.243 (эти адреса мы будем выдавать клиентам). Генерим дополнительно два сертификата, один для меня, другой для офиса.

Настраиваем mikrotik, добавляем openvpn client, загружаем сертификаты и убеждаемся в работоспособности туннеля. Собираем локальные интерфейсы в бридж, добавляем в этот же бридж ovpn client интерфейс.

Настраиваем viscosity на маке как клиент openvpn к серверу с честным ip без особых хитростей.

 

Тестируем, как только два подключения (одно из офисного роутера, другое от меня) к openvpn поднимутся, пинги пойдут.

В качестве упражнения выдернем шнурок основного канала из роутера, через минуту соединение снова поднимается и пинги идут, но уже потолще, подлиннее 🙂

 

Вышел новый fun_plug 0.7

03.02.2012

Для счасливых обладателей девайсов типа D-Link DNS-320, D-Link DNS-323 есть хорошая новость, вышел новый fun_plug 0.7 пропустив версию 0.6

http://www.inreto.de/dns323/fun-plug/

Также для ARM и OARM энтузиасты собрали следующие пакеты

— midnight commander 4.8.1
— glib-2 (needed for mc)
— htop 1.0
— screen 4.0.3
— iftop 1.0 pre 2
— nmap 5.51
— transmission 2.42
— libevent 2.0.16 (needed for transmission)
— mldonkey 3.1.0
— nano 2.2.6
— proftpd 1.3.4a

Которые можно скачать здесь.

В нашей нелегкой работе dns-320 лично у меня используется исключительно как хранилище для бекапов low-end уровня + Timemachine для моего mac + качалка торрентов.

Однако, после 1,5 лет активного использования я гораздо больше склоняюсь к выводу, что вместо DNS-320 гораздо эффективнее будет использовать что-то собранное на Intel Atom c полноценным линуксом. Главным образом мои претензии направлены в сторону производительности дисковой подсистемы (в пике 10Mb/sec), и в низкой скорости процессора (задержки при обращении к AFP шарам, transmission попросту отваливается) + сложность в установке сторонних пакетов, где слишком много приходится выпиливать лобзиком.

Явная ниша для использования таких девайсов — неприхотливые домашние бекапы, не более. При заточке девайса под другие задачи неизбежно возникает нагрузка на процессор и кулеры девайса совершенно перестают быть тихими.

Новая тема wordpress для nexusnotes.ru

23.01.2012

Очень понравилась тема «Молескин» у http://www.artemy.com.ua и, пользуясь случаем, установил себе такую же.

Самый правильный редирект 301

19.01.2012

Если вы мигрируете сайт на новый домен, и не хотите потерять SEO позиций, то важно сделать идеологически правильный редирект.

Делается он так:

Options +FollowSymLinks   
RewriteEngine on   
RewriteCond %{HTTP_HOST} !^newdomain\.com   
RewriteRule ^(.*)$ http://www.newdomain.com/$1 [R=301,L]

Это можно прописать прямо в vhost секции для сайта, и даже не создавать домашние каталоги.

Что оставит работающими и старые ссылки на материалы, и переучит поисковики на новые URL.

Секрет успеха

09.01.2012

Инфографика, опубликованная здесь, показывает, какие расхождения в мнениях относительно успеха у бедных людей, среднего достатка и богатых.

5738961

Выбор электробритвы

20.12.2011

Хорошие статьи буду по-немногу вытягивать наверх.

Обзор электробритвы Philips (можно применить ко всем электробритвам Philips)

Philips hq 7290$1

http://nexus.org.ua/weblog/message/613/

 

Обзор электробритвы Brown

Pulsonic2 thumb

http://nexus.org.ua/weblog/message/840/

Трагедия ИТ аутсорсинга малого бизнеса

08.12.2011

Самая большая трагедия ИТ аутсорсинга для малого бизнеса заключается в том, что у малого бизнеса денег нет.

Если, например, произошел сбой с принтером, то это парализует работу ВСЕГО малого предприятия, им уже нельзя выписывать накладные и отгружать товар, поскольку этот принтер ЕДИНСТВЕННЫЙ.

И именно поэтому банальный тикет связанный с печатью становится СТРАШНО КРИТИЧЕСКИМ с самыми жесткими сроками по SLA и НЕВЕРОЯТНОЙ важности.

Вот что печалит.

Учет техники на предприятии

07.12.2011

Вот, не смотря на интерфейс, разработанный, очевидно, программистом без участия дизайнера, сам по себе комплекс вполне заслуживает быть рассмотренным в качестве системы учета техники на предприятии.

 

Очевидные плюсы кандидата: понятность и простота использовавания, бесплатность и русифицированность.

По большому счету программа делает действия аналогичные Everest Audit (сейчас AiDA), но при этом не просит денег.

http://checkcfg.narod.ru/

Softsh

К слову, open source аналог данного комплекса, на который стоит посмотреть http://www.ocsinventory-ng.org/en/about/features/ocsng-glpi.html

Но с веб-интерфейсом там та же беда, что и у большинства open source продуктов, – дизайн выполенный программистом, как говорит г-н Умпутун, нарисованный чужими для хищников.

UPDATE: а вот простой и функциональный аналог AIDA с открытым кодом Aspia.

 

Открываются курсы по обучению IP PBX Asterisk

29.11.2011

 

Снимок экрана 2011 11 29 в 11 40 20

Цифровая телефония – это перспективное, нужное и важное направление развития системного администратора. Аналоговые АТС медленно, но верно отмирают.

Будь на острие прогресса!

Увелич компетенции на 30%!

Записывайся на курсы по обучению работе с цифровой АТС Asterisk, где ты не только получишь знания нового уровня, но и познакомишься с единомышленниками.

Еще раз (последний) о TP-Link TP-WR1043ND

08.11.2011

В прошлый раз я писал о TP-WR1042ND, заставляя его работать как NAS, торрент-клиент и вообще. Так вот, на сегодняшний день имею четкое убеждение и готов сообщить, что не стоит этого делать. В принципе, выпиливая из dd-wrt поддержку AFP, TimeMachine, SMB протоколов, заставить его работать с внешним USB-HDD удалось, однако результаты тестирования весьма удручают.

Images

Так, при работе торрент-клиента transmission, процессорного времени и производительности дисковой подсистемы уже не хватает для полноценной работы остальных пользовательских приложений, и демоны afpd, smbd просто отваливаются (что неприятно).

Снимок экрана 2011 11 08 в 14 34 13

Скорось работы HDD обескураживает, оставаясь на уровне 3,3Mb/sec в пике нагрузки. Timemachine по wifi, в этом случае будет работать вечно, так и не достигнув экстаза.

В целом девайс, обладая 802.11n и 1Gbit интерфейсами, пропускную способность в 1Gbit не обеспечивает, попутно периодически отваливая wifi.

Итого, рекомендовать TP-WR1043ND можно за его главное достоинство — цену. Однако, если вы цените время/деньги/функционал, то имеет смысл подобрать чуть более православный девайс. Вместо китайской ручки-фонарика лучше приобрести отдельно ручку и отдельно фонарик, это же выражение в полной мере относится и к TP-WR1043ND, поэтому сам роутер у меня остался выполнять функции роутера, а NAS был приобретен  D-Link DNS-320.

What is life?

16.10.2011

Не мог пройти мимо просто так, и утянул к себе:

 

Life’s a test….. do you pass?
At age 4, success is…not peeing in your pants. 

At age 12, success is…having friends. 

At age 16, success is…having a driver’s license. 

At age 20, success is…having sex. 

At age 35, success is…having money. 

At age 50, success is…having money. 

At age 60, success is…having sex. 

At age 70, success is…having a driver’s license. 

At age 75, success is…having friends. 

At age 90, success is…not peeing in your pants.

Source: http://www.urbandictionary.com/define.php?term=life

Хозяйке Mac OS на заметку: автоматическое обновление DDNS

30.08.2011

Если у вас тот самый случай, когда DDNS может сыграть важную роль в обнаружении собственного ноутбука, то довольно просто можно создать свой демон регистрации в DDNS.

Все довольно доступно изложено здесь

Добавить ICQ в iChat в Mac OS X Lion

24.08.2011

Весь процесс описан здесь:

http://macdaily.me/howto/how-to-set-icq-in-ichat/

 

от себя добавлю, теперь в iChat появилось то, о чем так долго мечтали большевики — поиск по контактам Cmd+F

Хозяйке Mac OS на заметку: очистка DNS кеша

18.08.2011

dscacheutil -flushcache

Заметки по Mac OS X (iOS) Lion

07.07.2011

Пришла пора собирать заметки и лайфхаки, поскольку с установкой Lion их стало накапливаться неприлично много.

  1. Как убрать бесполезную иконку синхронизации из панели верхнего меню системы?

— зажмите cmd и утяните ее с панели

  1. Убрать/добавить виртуальный рабочий стол (aka spaces) — перейти в Mission Control, нажать option — появится крестик на на рабочем столе, можно будет удалить.

Вообще, принцип работы с spaces изменился, можно перетаскивать приложения мышью из space в space. Лучше увидеть пример использования на видео.

 

Обязательное к использованию Free приложение для синхронизации картинок контактов адресной книги из Facebook.

С учетом отображения картинок к контактам в новом Mail все становится довольно красивым.

 

Из неожиданного в Lion: если менять фотку контакту в Address Book, то фотки будут подобраны из iPhoto faces. I’m shoked!

продам майно

01.07.2011

список майна на продажу

coverradio.fm

21.06.2011

Обнаружил прекрасное радио — сам слушаю и другим советую.

Прямая ссылка на поток: http://clck.ru/FCnA (это можно подключить прямо в Raduim)

Переключение раскладки клавиатуры в Mac при помощи Caps Lock (aka Мефодица by Lebedev)

21.06.2011

В молодости ваш покорный имел радость готовить FreeBSD и Linux, в котором переключение раскладки по Caps Lock было функцией нативной. Для windows тоже был хак от Марка Руссиновича.

Необходимость в данной манипуляции возникла по мере изучения редактора для трушных юниксоидов — Emacs, комбинации клавиш которого были все завязаны на клавишу Control, расположена которая была не в очень удобном месте. Как выяснилось, на то были свои исторические причины. И подавляющее большинство пользователей Emacs тут же меняли местами control и caps lock.

Долго я раздумавал, с какой стороны подойти к этой задаче в mac os, пока не наткнулся на заметку в стиле вопрос-ответ в уютной у Артемия. В его ответе прилагается ссылка на архив с Мефодица.bundle

http://www.tema.ru/jjj/mefoditsa.zip

файл необходимо после распаковки положить в /Library/Keyboard Layouts/ и в настройках языка выбрать «Мефодица». Выйти из учетной записи и снова войти.

Теперь можно переключать раскладки клавиатуры по caps lock, при чем индикатор будет сигнализировать о выбранном языке. Горит led — русский, не горит — английский.

Из замеченных особенностей — перемаплены цифровые клавиши на верхний регистр, например для точки и запятой необходимо нажать просто 6 или 7, если необходимо набрать цифры — делайте при помощи shift. Не менее интересно будет ознакомиться в Ководстве у Артемия и с историей проблемы русских знаков препинания при наборе.

Бандл использует свой механизм переключения, так что command + space можно отключить от переключения раскладок насовсем и использовать с удобством, например, в quicksilver.

UPDATE: Я привык и втянулся! Знаки препинания в нижнем регистре для русского языка это очень-очень правильно. Обнаружен огорчающй баг с iTerm2, но это, думаю, претензии к iTerm2.

Language switch caps

MAC OS X Leopard и баг с PPPoE через tagged VLAN 802.1Q

20.06.2011

Достаточно, как казалось бы, обыкновенный сетап, подключение модемов через свитч с поддержкой 802.1Q, tagged VLAN создаваемый Mac OS X. Однако, PPPoE сессия через VLAN интерфейсы не поднимается (что вполне работает в Windows и Linux).

Но обо всем по порядку.

Есть модем от datagroup без PPPeE, статический IP, настроенный через tagged VLAN. И все работает, только вот медленно и канал довольно нестабильный.

Клиент подключается через Укртелеком, покупая ADSL модем. Подключение через PPPoE. Создаем новый tagged VLAN, настраиваем свитч, подключаем модем, настраиваем его в режим бриджа. И вот здесь начинается самое интересное.

PPPoE коннект попросту не проходит.

Сдуваем пыль с tcpdump и прослушиваем броадкасты:

tcpdump -n -e -i vlan2 ether host ff:ff:ff:ff:ff:ff

их нет!

tcpdump -n -e  ether host ff:ff:ff:ff:ff:ff

а теперь есть, но идут они через другой интерфейc.

Для того что бы выбрать интерфейс, с которого будут исходить PPPoE PADI пакеты необходимо создать PPPoE правым кликом на интерфейсе,

pppoe

Однако в нашем случае фокус в том, что при выборе интерфейсов vlan и клик на «создать службу PPPoE» ни к чему не приводят. При этом с физическими интерфейсами работает исключительно гладко.

Даже запуск вручную не приводит к позитивным результатам

pppd plugin PPPoE.ppp device vlan0 noauth defaultroute user username password pw

Описание бага на английском. Решения нет.

https://discussions.apple.com/thread/1706103?start=0&tstart=0

Теоретические выкладки про PPPoE

http://subnets.ru/blog/?p=308

P.S. пришлось настраивать модем в режим роутера и делать к серверу DMZ, что считаю решением не самым лучшим.

P.P.S. как workaround возможна настройка без VLAN на полностью физическом интерфейсе, а локальную сеть завернуть в tagged vlan. Однако данное решение сопряжено с другого рода сложностями.

Zabbix freebsd program counter not available for this architecture

20.06.2011

После обновления Zabbix на FreeBSD до 1.8.5 стал получать сообщения вроде этого:

Zabbix freebsd program counter not available for this architecture

и заббикс перестал стартовать.

 

Все дело оказалось в старой библиотеке net-snmp, которую необходимо обновить до 5.5, и уже затем пересобрать zabbix.

 

 

portupgrade net-snmp
cd /usr/ports/net-mgmt/zabbix-server
make deinstall
make reinstall

 

 

Как говорят наши пиндосские товарищи, works like a charm

 

Удаленная установка PAP2T

08.06.2011

Изначально адаптер идет без начальных установок и с выключенными веб-сервером и DHCP. 

Включить DHCP и веб-сервер нужно через телефон.

Вход в голосовое меню: ****
Включение/отключение DHCP: 101 —> 1 включение; 2 выключение;
Проверка IP адреса: 110
Установка статического IP адреса: 111
Проверка маски: 120
Установка маски: 121
Проверка шлюза: 130
Включение/отключение web-сервера: 7932 –> 1 включение; 2 выключение;
Сброс всех настроек: 73738Pap2t 2 36114

О пользе двух и более мониторов

27.05.2011

Если вы гик, или дизайнер, программист и проводите много времени за компьютером, то вам просто необходимо использовать два и более монитора на рабочем месте.

Workspace

Вот несколько типовых примеров:

Разработчик.

  • на одном мониторе код CSS на другом мгновенный результат в окне браузера (так работает приложение CSSEdit для Mac)
  • на одном мониторе текстовый редактор (IDE), на втором — хелп по функциям, скринкаст и так далее.

Дизайнер

  • Aperture, LightRoom на одном мониторе thumbnails, на втором full view

Ну и в целом, с двумя мониторами можно условно разделить работу на  «основное» на одном мониторе и «социальное» типа skype, icq, e-mail, jabber и так далее на другом мониторе.

Очень полезно бывает открыть на второй монитор Remote Desktop в windows машину, или же окно с VMWare Fusion.

Так что ценность многомониторных конфигураций в работе трудно переоценить.

 

Если вы знаете хорошие примеры, когда без нескольких мониторов сложно обойтись — отпишитесь, пожалуйста, в комментариях.

 

Аналитика входящих звонков на наш коллцентр

20.05.2011

На досуге интересно стало проанализировать статистику по входящим звонкам на наш коллцентр.

Сказано-сделано, дописал за сегодня фильтры и группировку статистики по звонкам, и вуаля.
На графиках видно, что мы работаем с 9 до 18 пять дней в неделю. В остальное время звонки могут редиректиться на мобильные.

Количество входящих звонков за апрель 865.

Можно сделать вывод, что основная нагрузка на колл-центр приходится на время с 10 до 11, видимо после первой чашки кофе сотрудники начинают включать компьютеры. Наиболее загруженный день — вторник.

chart1 chart2 chart3

Обзор зарядки La Crosse BC9009

16.05.2011

«Благодаря» говняным аккумуляторам GODP 3000mAh, которые на деле оказались 800mAh я приобрел весьма неплохое зарядное устройство La Crosse BC9009, которое является прямым аналогом модели La Crosse 900.

1635523

Преимущества использования такой зарядки после недели эксплуатации становятся более чем очевидными:

  • возможность выбора режимов зарядки для каждого заряжаемого аккумулятора отдельно
  • индикация напряжения, тока, емкости для каждого аккумулятора отдельно на ЖК экранчике
  • возможность задать различные токи зарядки от 200mA до 1800мА без боязни спалить аккумуляторы — сработает термометр и отключит зарядку при перегреве
  • режим восстановления аккумуляторов — много циклов зарядки-разрядки до тех пор, пока не будет потери емкости (но не более 15 циклов).
  • режим тестирования реальной емкости аккумуляторов — полная разрядка + полная зарядка.
  • наличие сумки и переходников на типоразмеры C и D
  • зарядка AA и AAA аккумуляторов (которые, кстати, поставляются в комплекте к зарядному устройству)
  • после полной зарядки аккумулятора поддержание его «капельным» подзарядом

Так что в целом данное устройство, не смотря на цену, можно только рекомендовать.

Если бы водителей принимали на работу так же, как программистов

08.05.2011

Если бы водителей принимали на работу так же, как программистов, то выглядело это примерно так.

__
Вакансия: водитель.

Требования: профессиональные навыки в управлении легковыми и грузовыми автомобилями, троллейбусами, трамваями, поездами метрополитена и фуникулера, экскаваторами и бульдозерами, спецмашинами на гусеничном ходу, боевыми машинами пехоты и современными легкими/средними танками, находящимисяна вооружении стран СНГ и НАТО.
Навыки раллийного и экстремального вождения обязательны. Опыт управления болидами «Формулы-1» — приветствуется. Знания и опыт ремонта поршневых и роторных двигателей, автоматических и ручных трансмиссий, систем зажигания, антиблокировочных систем, навигационных систем и автомобильных аудиосистем ведущих поизводителей — обязательны. Опыт проведения кузовных и окрасочных работ — приветствуется. Претенденты должны иметь сертификаты Mercedes, BMW, а также справки об участии в крупных международных ралли не более чем двухлетней давности.
Зарплата: 1500-2500 рублей, определяется по результатам собеседования.

Источник неизвестен, найдено здесь.

Про аккумуляторы AA GODP 3000mAh

08.05.2011

Кетайцы такие кетайцы, пока остальное человечество в форм-фактор батарейки АА пытается засунуть 2500mAh, кетайские собратья давно уже освоили выпуск аккумуляторов на 3000mAh, и это при весе одной батарейки меньшей на половину, чем у брендовых конкурентов.

Imgres

Решил пошерстить интернеты на предмет отзывов и мнений, и не ошибся в предположениях.

Зато из топика обнаружил интересную зарядку Lacrosse BC-700, умеющую показывать фактическую емкость аккумулятора, что чрезвычайер полезно.

1635522

http://cgi.ebay.com/Crosse-BC-700-BC700-Alpha-Battery-Charger-Lacrosse-/200580841651?pt=LH_DefaultDomain_0&hash=item2eb38cc0b3#ht_947wt_907

Сбросить забытый пароль для sa на MSSQL 2000

05.05.2011

Бывают в жизни ситуации, когда пароль от sa для MS SQL забыт, либо установлен неизвестным одмином, а доступ все же есть, но через доменный аккаунт.

Не отчаивайтесь, сбросить пароль можно довольно простым действием, зайти в Query Analyzer и запустить

 

sp_password @new = ‘will_never_forget_again’, @loginame = ‘sa’

 

и будет вам великое счастье.

IP over DNS

04.05.2011

Вот что обнаружено в прошивке dd-wrt на маршрутизаторе TP-Link TL-WR1043ND (IP over DNS Tunneling)

ip over dns tunneling

А это значит, что легким движением мыши вы можете включить аццкий функционал, позволяющий обходить авторизацию многих платных хотспотов в отелях, и использовать wifi бесплатно, как описано здесь http://xgu.ru/wiki/DNS-tunneling и здесь http://theapplegeek.ru/archives/283

(updated) Про беспроводной маршрутизатор TP-LINK (802.11n) TL-WR1043ND

29.04.2011

История началась с желания увеличить емкость внешнего накопителя на моем старом добром ASUS wl500gP, который трудился в качестве router + torrent + samba + afp + avahi уже не первый год.Подключен был к нему SSD PQI S525 на 64Gb. И все было относительно хорошо. Абсолютно бесшумный. Надежный. 2 порта USB. Кастомной прошивкой из роутера можно выпилить практически все что угодно.

 

Из минусов сейчас уже могу отметить следующие:

1. довольно скромные скоростные показатели USB в среднем до 8-10Мбит (1-1,2Мб/сек), и это не смотря на поддержку USB 2.0

2. питания по USB не хватает для обеспечения бесперебойной работы HDD (отваливается). Хотя возможно это фича seagate spindown.

 

Так вот, после клонирования SSD на новый накопитель USB-HDD Seagate 2,5″ 500Gb я был расстроен поведением роутера. Мой USB-HDD постоянно отваливался.

После совещаний с @brj по критерию цена/качество выбор был остановлен на TP-Link TL-WR1043ND.

Tl wr1043nd 3

В общем могу два слова уже сказать. Сразу же без проблем прошился на самую свежую dd-wrt, однако выпилить transmission с полпинка пока так и не удалость.

 

Текущие итоги:

 

1. За такую цену девайс как роутер 802.11n — идеально. Есть один тонкий момент, для работы 802.11n ОБЯЗАТЕЛЬНО нужно включить TKIP+AES в качестве механизма авторизации WPA2, иначе вы получите только 802.11g.

2. dd-wrt взлетает сразу и без бубна.

3. Торренты и вообще optware пакеты на него довольно сложно изобразить в виду MIPS архитектуры (почти все пакеты заточены под MIPSEL). Но доводка роутера возможна таки большим и длинным напильником.

4. Упрощенная Samba работает «искаропки».

5. Скорость по USB ожидалась несколько большая. Пока я зафиксировал 3-3,5Mb в сек., что уже лучше чем у Asus wl500gP, но все еще далеко от нормального NAS.

6. Питания от роутера по USB хватает для работы USB-HDD Seagate 2,5″ на 500Gb.

 

Замер скорости по Украине с ноутбука по wifi 802.11n (законнектился на 130Мбит).

 

1273451434.png

А здесь исчерпывающе про девайс для энтузиастов.

UPDATE:

мной проверено: реализация TimeMachine на данном девайсе возможна, однако, лучше этого не делать. Бекап если и будет завершен, то суток через двое. И даже если все пройдет гладко, то AFP (в реализации netatalk) сойдет с ума при попытке открыть каталог TimeMachine по причине бесчисленного количества файлов в базе.

Отдача трафика через transmission работает более-менее гладко, но при скачивании больших по размеру торрентов может притормозить весь девайс путем повышенной нагрузки на USB-HDD, и тогда практически все команды исполняются с затыками в 5-10 сек.

Получен позитивный опыт работы через Transmission Remote GUI, который в целом прекрасен, если б не его шрифты.

Итоговые итоги:

В качестве роутера 802.11n девайс за свою цену более чем адекватен. Быстрый NAS из него сделать не получится, однако USB-HDD Seagate 500Gb 2,5″ у меня он держит без дополнительного питания, в сеть отдавая 3-4Мб/сек, что не фонтан, но скачать торрентом и посмотреть какое-то видео 720p вполне достаточно.

 

Снимок экрана 2011 05 01 в 20 45 30

Полезные шорткаты для Mac

28.04.2011

Mac

  1. Открыть папку с программами: Shift-Command-A

  2. Сделать скриншот: Shift-Command-4

  3. Переместить в Корзину: Command-Delete

  4. Очистить Корзину: Shift-Command-Delete

  5. Удалить одно слово слева от курсора: Option-Delete

  6. Проверка орфографии: Command-:

  7. Найти слова с ошибками: Command-;

  8. Сохранить: Command-S

  9. Сохранить как: Shift-Command-S

  10. Распечатать: Command-P

  11. Свернуть рабочее окно: Command-M; Свернуть все окна: Option-Command-M

  12. Закрыть рабочее окно: Command-W; Закрыть все окна: Option-Command-W

  13. Завершить принудительно зависшее окно или программу: Option-Command-Esc

  14. Закрыть все приложения (с сохранением всех изменений в ваших документах) и перезагрузка:Control-Command-Eject

  15. Режим сна: Option-Command-Eject

via Lifehacker

Про государственные говносайты

26.04.2011

Как правило, государственные сайты всегда представляли собой кусок неудобоваримого говна, что и понятно, учитывая кем и как ставилось техническое задание, а также кем оно исполнялось и кем принималось.

А бывает ли так, что 10лет назад сайт выглядел гораздо лучше, чем сегодня?

Вот сайт киевского института автоматизации систем в строительстве, где в 1999 я начинал свою трудовую карьеру:

Ниже сайт образца 2000 года, выполнен дизайнерами провайдера Elvisti, который в то время находился на территории института.

http://replay.web.archive.org/20001028014829/http://ndiasb.kiev.ua/

ndiasb2000

Сайт образца 2011 года, выполнен … дизайнерами института?

http://ndiasb.kiev.ua

ndiasb2011.png

Сайт 2000 года выглядит намного более привлекательным и свежим, не правда ли?

UPDATED: Запуск виртуальной машины в VMWare Fusion автоматически при старте системы (в background не работает)

21.04.2011

Частым сценарием использования в Mac Server является запуск Windows экземпляра в виртуальном окружении используя VMWare Fusion.

Но бывает неудобной после перезагрузки (особенно если она связана с перезагрузкой по питанию) необходимость вручную стартовать виртуальную машину.

Можно ли настроить автоматический запуск boot time?

Оказывается, можно, и не так уж сложно.

В Mac OS есть отличный механизм автозапуска демонов и агентов boot time, а также перезапуска оных в случае чего — launchctl (читаем маны).

Для нашего случая необходимо создать следующий скрипт, назовем его /Library/Application Support/VMware Fusion/boot-vm.sh

#!/bin/bash
while [! -e /var/run/vmnet-bridge-vmnet.pid]; do  
sleep 1
done 
"/Library/Application Support/VMware Fusion/vmrun" start "/Users/admins/Documents/Virtual Machines.localized/Windows XP Professional.vmwarevm/Windows XP Professional.vmx"

где после start — путь вашей виртуальной машины.

 

для boot-vm.sh добавим аттрибуты запуска:

chmod +x boot-vm.sh

и создадим следующий файл  /Library/LaunchDaemons/com.vmware.launchd.fusion-server.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>        
<key>Label</key>        
<string>com.vmware.launchd.fusion-server</string>        <key>ProgramArguments</key>        
<array>                
<string>/Library/Application Support/VMware Fusion/boot-vm.sh</string>        </array>        
<key>RunAtLoad</key>        
<true/>        
<key>ExitTimeOut</key>        
<integer>0</integer>        
<key>LaunchOnlyOnce</key>        
<true/>        
<key>UserName</key>        
<string>admins</string>
</dict>
</plist>

теперь должно взлетать

 

проверить, что «все правильно сделал» (с) можно командой

launchctl load com.vmware.launchd.fusion-server.plist

должно взлететь.

подробнее на сайте vmware

UPDATE:

в бекграунде vmware fusion не работает, без логона у вас не получится запустить vmware 3 (это работало только для vmware 2

Linux: миграция с одного hdd на второй ext3 с увеличением объема

20.04.2011

Пришлось на asus wl500gP мигрировать с SSD на 64Gb на USB-HDD 500Gb.

Как водится в интернетах была использована команда

dd if=/dev/sdb of=/dev/sdc

которая и сдублировала посекторно весь диск.

Фокус в том, что и сам диск 500ка стал виден как 64Гб 🙂 Гугление вокруг да около не возымело должного эффекта и решение простыми средствами (fdisk, parted) и resize2ext мне показалось стремным.

И вот был обнаружен gparted, который по факту оказался ничем иным как свободной версией известного PQMagic, по крайней мере по функционалу точно такой же.

Легким движением мышки и диск из 64 превратился обратно в 500 и нужная партиция была раздвинута на нужный полный размер.

Gparted 1 small

Кстати, gparted являет собой загрузочный ISO, который вполне хорошо отработал в VMWare Fusion под Mac.

Ruby on Rails хозяйке на заметку: менеджер локальных сайтов Pow

12.04.2011

Чрезвычайно удобной оказалась возможность работы с несколькими сайтами на базе RoR (по факту на Rack), которую предоставляет утилита Pow.

Вкратце, если у вас достаточно много сайтов разработке, утилита предоставляет хук в DNS зону dev и позволяет обращаться к вашим сайтам по url вида http://myapp.dev , http://myapp2.dev, а также добавляет правило в фаерволе, которое заворачивает обращения к self с порта 80 на внутренний порт утилиты.

Сам Pow состоит из двух частей — DNS responder и проксирующего web server. Реализовано все счастье на Node.js.

Очень интересна реализация зоны .dev, в mac os в каталоге /etc/resolver/ добавляется файл dev такого вида:

nameserver 127.0.0.1 port 20560

что перенаправляет все обращения xxx.dev на соответствующее приложение

 

Утилита поддерживает работу с RVM, что позволяет упражняться с различными версиями руби.

Для поддержки в rails 2 через Pow можно воспользоваться таким хаком, создаем в корне приложениея config.ru, где прописываем

Деинсталляция также проста:

curl get.pow.cx/uninstall.sh | sh
# Rails.root/config.ru
require "./config/environment"
run ActionController::Dispatcher.new

Утилита что-то наподобие denwer для php.

 

Mac OS X transparent squid ipfw bugfix

11.04.2011

Сам прозрачный прокси включается проще простого, в squid.conf добавляем:

http_port 3128 transparent

и в ipfw добавляем следующее правило заворачивающее с 80го порта на внутренний:

ipfw add 1050 fwd 127.0.0.1:3128 tcp from 192.168.1.0/24 to not 192.168.1.0/24 80

 

Однако, оказалось, на 10.6 не работает ipfw fwd правило для прозрачного прокси.

 

Непродолжительное гугление помогло выявить вот такой багфикс:

sudo sysctl -w net.inet.ip.scopedroute = 0

или еще лучше прописать в /etc/sysctl.conf

net.inet.ip.scopedroute = 0 и перезагрузить сервер.

 

Основная проблема GTD

04.03.2011

Основная проблема всех без исключения систем GTD в том, что человек, будучи в усталом состоянии перестает фиксировать задачи/мысли/выполнение.

И в этом состоит большая трагедия всех, даже самых лучших, GTD систем.

Just do it! Вот вам и все GTD.

Вся правда об операторе мобильного интернета Freshtel

28.02.2011

В продолжение к топику о выборе оператора беспроводного (мобильного) интернета в Киеве.

Решили однажды наши клиенты открыть второй офис в Киеве районе Осокорков. А Осокорки это такой район, где находяться генеральские дачи, места парковки различных яхт и прочие аттрибуты тех, кто залез повыше.

А вот хоть какого-нибудь кабельного интернета там как не было, так и нет, однако лакомая территория не стоит бесхозной, а покрывается всякими wimax/wifi и иными беспроводными провайдерами типа Альтрернет и Фрештел (дочка Альтернет).

Итак, вводные данные: 1 офис на Осокорках, второй в 10-15 км от этого злачного места, но с более-менее годным интернетом. Необходимо завязать данные объекты VPNом. Изначально техничная задумка была в виде «подключим их модем в бридж» и построим самый кошерный EoI (ethernet over ip) туннель, и все клиентские устройства будут вообще в одной подсетке.

Предварительный звонок в «фрештел» суппорт с вопросом «а работает ли ваш модем в режиме бриджа» получил в ответ уверения «Конечно наш модем работает в режиме бриджа». За сим и был отправлен заказчик оформлять контрактное подключение с покупкой роутера-модема-вайфая.

Сколько обычно времени занимает подключение роутера и конфигурирование VPN? Ну 30 минут, в особо сложных случаях до часа.

Какие эмоции можно было испытать от часовых попыток найти в модеме режим работы «бридж» и ответа суппорта провайдера «а в бридже не работает, потому что это наша сеть не умеет»?! Ну ладно, думаем, раз так, и раз ip динамический поднимем-ка мы PPTP сервер-клиент и зароутим сети туда. Однако, PPTP протокол попросту не проходит! Не поверили своим глазам, включили модем напрямую к ноутбуку — точно не проходит. По итогу наших экзорцисов можно заключить следующее:

  1. Фрештел модем-роутер не работает в режиме бриджа.

  2. Фрештел суппорт 2й линии не знает собственного оборудования.

  3. При оформлении контракта специалист Фрештел сделал ошибку в MAC адресе оборудования вследствие чего было потеряно еще 2 часа времени что бы понять, почему же IP плавает. Ошибка не была исправлена в тот же день (вечер).

  4. По-умолчанию по неизвестной науке причине для динамических IP у Фрештел блокируется все что может блокироваться (PPTP трафик, RDP трафик, другое).

  5. Никакой возможности связаться со специалистом 2й линии техподдержки у клиента нет, все общение через первую линию поддержки + через менеджера если у вас контракт. Это значит, что при каждом звонке вы будете заново проходить все процедуры телефонной авторизации по 1й линии техподдержки.

«Я хуею, дорогая редакция», —  пишет нам пятилетняя Маша из детского садика «№38».

Почему Omnifocus лучше чем Things и Firetask?

18.02.2011

Во всем многообразии GTD систем хочется еще раз отметить лидеров отрасли для Mac:

Цели и задачи

Под целью будем понимать работу в режиме «автопилота», когда обращаясь к записям мы будем видеть тот список дел, которым действительно подходит заниматься в данное время в данном месте, и не быть перегруженными «неподходящими» задачами и проектами.

427757 254877334588276 224365987639411 562554 2011888291 n

Критика Things.

Кто не знает Things? Things знают все.

 

К минусу Things отнесу работу с фильтрами, а именно — для того, что бы открыть «контекст-тег» в котором сейчас нужно работать прийдется лицезреть всю простыню задач и напрягаться пытаясь попасть по нужному фильтру в горизонтальном меню (не заставляйте меня выбирать более чем из 5-6 пунктов!).

Второе неудобство Things мне видится в работе с проектами. Нет способа быстро закинуть задачу к неактивному проекту.

Также управлять большим количеством активных проектов становится неудобно без иерархического представления.

Третьим неудобстом отмечу отсутствие синхронизации через cloud/webdav. Нет вайфая — нет синхронизации.

Критика Firetask

По началу я был покорен подходом Firetask к проектам и некоторыми необычными, но полезными фичами.

 

Так Firetask имеет особое третье состояние задачи «в работе», которое обозначается волнообразной линией. То есть задача пройдет состояние «новая» — «в работе» — «завершена», а это отличается от обычного «новая» — «завершена». Второй находкой является представление «Сегодня», которое выведет жестко привязанные к срокам на сегодня-завтра задачи и несколько следующих задач без срока.

Дополнительный кайф работе придает возможность использования специального быстрого ввода параметров через знаки @ и # и даты. Где @ задает проект, а # задает контекст или контактное лицо.

Удобство страницы проектов в выводе сразу же «следующей задачи» в списке проектов, если задача без сроков.

Неудобство состоит в управлении задачами в Inbox, которое осуществляется только через окно «Инспектора», drag-n-drop не работает, cloud sync не работает. Остальные недостатки те же что и у Things, отсутсвие синхронизации по webdav и так далее.

firetask

Критика  OmniFocus

OmniFocus не смотя на кажущуюся монструозность, лишен многих недостатков Things, и в гораздо большей степени приспособлен к повседневной работе. Ниже я постараюсь отметить вещи, которые отличают OmniFocus в лучшую сторону.

 

Первое, — динамический контекстный выбор проекта к задаче очень облегчает работу и экономит время, эта фича работает также и в окне быстрого добавления. Возможность задавать время через «tod», «tom», «fri», «26» делает работу чуть менее чем полностью комфортной.

Второе, — сложно переоценить удобство функционала «Перспектива». При помощи перспектив можно одним кликом выполнять такие вещи как отбор «Задач, которые нужно выполнить в офисе», «Задачи, которые нужно поручить/проверить» и так далее. Другими словами перспектива это не что иное как сохраненный под удобным названием фильтр ваших записей.

Третье — не могу нарадоваться синхронизации мобильной и десктопной версии через webdav, что с одной стороны избавляет вас от волнений за хранение данных «где-то там в облаке», а с другой предоставляет контроль и гибкость и не привязанность к wifi (к слову подобной функциональностью обладает и iBank). Из преимуществ также можно выделить интеграцию с календарем. У меня, например, с календарем синхронизируются задачи из контекста «поездки», поскольку поездка, как правило, явление запланированное на определенное время.

Также в отличие от Things OmniFocus позволяет добавлять в задачи медиа-инфо, например, можно за рулем автомобиля записать звуковую заметку-задачу в inbox.

В мобильной версии OmniFocus есть привязка контекстов к GPS координатам, что позволяет легко прочесть список покупок находясь в нужном магазине.

Вложенные иерархически проекты и контексты позволяют быстро сортировать связанные по смыслу проекты и задачи.

К неудобству я бы отметил скудную настройку повторяющихся задач и не очень удобный способ задавать время start и due.

Также было бы просто великолепно иметь быструю горячую клавишу на перемещение сроков задачи на +1 день. Возможно эта задача решалась бы при помощи AppleScript и Automator, но пока не припекало.

Критика TheHitList

Этот продукт мог бы стать лучше всех, если бы продолжил развитие, а не застыл в бете без клиента под iPhone.

 

Рекомендую как минимум посмотреть, даже в бете было реализовано много достойных идей.

Разные штучки

К разным штучкам можно отнести Alarms Express , эдакий ремайндер, который позволяет в забавном и удобном виде делать напоминалки об определенной задаче (например звонке) одним драг-н-дропом.

 

Для того, что бы не беспокоиться по поводу сохранности данных OmniFocus имеет смысл размещать его базу в папке Dropbox.

Если вам нужен не полноценный GTD-монстр, а удобный список задач обратите внимание на бесплатный wunderlist.

Полезно и наглядно: как завязывать галстук

16.02.2011

Инструментарий верстальщика

13.02.2011

Иногда попадаются прямо-таки «золотые» ссылки для веб-верстальщика, здесь я их и постараюсь собрать вместе:

http://wordmark.it — быстро подобрать шрифт для надписи из имеющихся у вас

http://lamb.cc/typograph/ — типографика, подброрка стиля и ритма текста, заголовков

http://jsfiddle.net/hCVyG/ — отладка jQuery, HTML, CSS, Javascript

http://sprites.in/ — инструмент для работы со спрайтами

http://spriteme.org/ — еще один инструмент для работы со спрайтами

http://csssprites.org/ и еще один

http://shamansir.github.com/JavaScript-Garden/ — заковыристые темы Javascript

http://kuler.adobe.com — подбор цветовой гаммы, что хорошо — можно выбрать из готовых

http://css-tricks.com/the-css-box-model/ — фантастически хорошие советы по css

Как исключить папки при поиске в Alfred?

29.01.2011

Многие из вас знают, любят и пользуют лончер Alfred, который с выходом App Store для Mac стал еще более популярным. Не смотря на сверхвысокую скорость работы и приятный интерфейс, настроек для исключения определенных каталогов и файлов я не нашел, однако, способ все равно есть.

Оказывается Alfred использует базу spotlight, а у spotlight есть такая настройка.

Заходите в Системные настройки->Spotlight и добавляйте для исключения каталоги и файлы как показано на скриншоте ниже.

Must have приложения для Mac

22.01.2011

Попался мне в руки iMac 27″ на несколько дней для установки … Windows. Видимо владелец совсем не разобрался с работой на маке, поскольку мак был пуст и гол как сокол.

И решил я погонять его в привычной для меня обстановке с привычными приложениями. Ведь устоялся уже определенный набор приложений, без которых работа на Mac для меня уже не мыслима.

Список этих приложений привожу ниже.

1Password — менеджер паролей, стоит ставить сразу в связке с Dropbox и устанавливать расширение для Google Chrome

Growl — ненавязчивое уведомление от приложений всплывающими всплывалками

iStat menus — отображение в трее жизненных показателей мака

Dropbox — синхронизация файлов между несколькими компьютерами

Perian — проигрывание в Quicktime плеере видео в неизвестных маку кодировках

Alfred — замена Quicksilver, быстрый запуск приложений command+space

Cord — мультитабный RDP клиент

iTerm2 — замена стандартному терминалу с блекджеком и дамами

Radium — миниатюрное радио в трее

Google Chrome — браузер по вкусу

Skype — самизнаетечто

Sparrow — mail клиент для GMail

uTorrent — торрент-клиент

OmniFocus — GTD органайзер

Transmit — ftp, sftp, amazon S3, webdav файловый менеджер

Apple iLife — iPhoto, iMovie и прочие развлечения

Apple iWorks — Numbers, Pages, Keynote — пакет офисных программ от Apple

Textmate — мощный программерский редактор

Home brew и через brew install устанавливаем

git

mtr

rails

Commandlinefu : домашняя страница юниксоида

17.01.2011

Порой бывает комментарий ценнее самой статьи, так, например, на просторах Хабра был найден линк на прекрасный сайт:

http://www.commandlinefu.com/commands/browse

Из прекрасного: если вы забыли набрать sudo перед выполнением команды, не беда, выполните sudo !!

и вместо !! подставится предыдущая строка.

Или вот, например, закрыли вам весь доступ фаерволами, из сервисов один DNS остался, так вот, можете вполне воспользоваться википедией

dig +short txt .wp.dg.cx

где — ключевое слово, на которое вы ищете статью.

GTD, как работать?

10.01.2011

По этим двум схемам вполне легко можно разобраться со своими делами по системе GTD

Синхронизация Omnifocus с собственным хранилищем

10.01.2011

Не то что бы совсем cloud-sync, но OmniFocus помимо стандартной Bonjour синхронизации по WiFi умеет еще и синхронизироваться через MobileMe, а, ежели вы имеете собственное хранилище, например, VPS или VDS, или попросту не доверяете сторонним лицам свою сексуальную информацию из OmniFocus, то есть еще и опция синхронизации по WebDAV.

Для настройки WebDAV для Apache 2.2 достаточно подгрузить модуль mod_dav

httpd.conf:

LoadModule dav_module libexec/apache22/mod_dav.so
LoadModule dav_fs_module libexec/apache22/mod_dav_fs.so
DavLockDB "/tmp/DavLock"
Alias /uploads "/usr/local/uploads"

Dav On
Order Allow,Deny
Allow from all
AuthType Digest
AuthName DAV-upload
AuthUserFile "/usr/local/user.passwd"
AuthDigestProvider file

DavLockDB "/tmp/DavLock"
Alias /uploads "/usr/local/uploads"
<Directory "/usr/local/uploads">
    Dav On
Order Allow,Deny    Allow from all
AuthType Digest    AuthName DAV-upload
 AuthUserFile "/usr/local/user.passwd"
 AuthDigestProvider file
<LimitExcept GET OPTIONS>
 require user admin


</LimitExcept>
</Directory>

После чего создаем /usr/local/uploads и даем на него права на запись для пользователя, от которого у нас работает веб-сервер.

запускаем

htdigest -c /usr/local/user.passwd DAV-upload admin

чем создаем файл user.passwd с пользователем admin и назначаем ему пароль

Все, теперь передергиваем апач:

apachectl restart

и пробуем что-нибудь загрузить по web-dav: http://yourserver.com/uploads/ (можно использовать Transmit.app)

и настраиваем в OmniFocus синхронизацию в Advanced:

и аналогично настраиваем в iPhone

Все, на этом настройка синхронизации завершена.

В качестве домашнего задания можно порекомендовать обязательную настройку https для синхронизации.

Apple Magic Trackpad, мой опыт использования

06.01.2011

Повелся на статью Macpages и перед новым годом приобрел apple trackpad, об опыте использования которого и спешу рассказать.

Во-первых использование magic trackpad это уже определенный разрыв шаблона после 20ти летнего использования манипулятора типа «мышь». Во-вторых преимущество трекпада, которое было широко разрекламировано — мультижесты, обернулось по началу большим минусом. После подключения девайса и тестирования  немедленно появилось желание расширить возможности трекпада путем установки JITouch, который позволяет использовать мультижесты для открытия-закрытия вкладок в приложениях, перехода между вкладками и другие интересные жесты. После полудня использования в первый же день довольно сильно разболелась кисть.

Следующим выловленным багом оказалось плохое срабатывание обыкновенного клика. После недели мучений выяснилось, что баг был связан с тем самым JITouch! Удалив JITouch болевые ощущения ушли и трекпад прочно вошел в мою повседневную жизнь.

В моем случае помимо трекпада еще и отдельная клавиатура (из-за проблем с охлаждением ноутбука),   сам трекпад размещается непосредственно справа от нее, и в целом, такое расположение очень удобно.

Так что всем рекомендую хотя бы попробовать, ведь по ощущениям это не то же самое что и встроенный в ноутбук трекпад.

iTerm2 для Mac

05.01.2011

По наводке г-на Бобука из твиттера была выужена ссылка на iTerm2 в alpha (хотя по-моему можно уже даже из беты переводить в релиз кандидат).

Вкратце, iTerm2 является наследником iTerm, который, по-видимому, перестал бурно развиваться. В общем, iTerm2 подхватил выпавшее из рук iTerm знамя лучшего софта для доступа к терминалам.

Из фич iTerm2 особо хочется отметить:

  • очень удобная навигация по закладкам (у меня более 19 хостов) с поддержкой тегов. Это очень удобно, когда можно протегировать девайсы определенной организации, по типу (cisco, freebsd, linux)
  • split screen режим
  • потрясающая скорость работы
  • автокомплит
  • поддержка табов
  • правильно видный курсор
  • поддержка Growl

и многое другое

люто рекомендуется к использованию.

Введение  и обсуждение в google groups.

Хозяйке FreeBSD на заметку: переворачивание логов exim

03.01.2011

Данный совсем простой метод подходит не только для логов exim, но и любых других логов, которые необходимо переворачивать либо по размеру, либо по расписанию.

данные две строки


/var/log/exim/mainlog      mailnull:mailnull             640  7     *    @T00  JN
/var/log/exim/rejectlog     mailnull:mailnull             640  7     *    @T00  JN
добавленные  в файл /etc/newsyslog.conf решают проблему ежедневного переворачивания логов от почтовой системы exim

Блоги аццких админов

17.12.2010

Известные мне хорошие блоги:

http://www.hilik.org.ua

http://www.sergeysl.ru (вот такого, однако, не одобряю совсем)

http://lissyara.ru

http://www.muff.kiev.ua/

и само собой http://brj.pp.ru/wiki

буду благодарен, если читатель поможет продолжить список

Лайфхак в shell: быстрое перемещение по каталогам

12.12.2010

UPD: добавлено видео процесса.

Для тех, кто способен пальцами гвозди гнуть, а именно, яростных программеров и юниксовых сисадминов будет небезынтересным эффективный способ передвижения по каталогам. Не открою большой тайны, если скажу, что наиболее популярным каталогом при работе с FreeBSD у меня является /usr/local/etc/. Это значит я наберу cd /u  tab /l tab /e tab [enter], а именно 13 нажатий клавиш .

А можно быстрее? Оказывается можно!

Небольшой скрипт, который мы можем взять с  github, и без труда проинсталлировать в системе, и вуаля.

Автоматически фиксируются те каталоги, куда вы чаще всего заходите и становятся доступными по шорткату «j».

В моем примере я всего лишь набрал «j u enter» и сразу оказался в нужном каталоге! С командой j также вполне себе работает автокомплит.

Исходники: http://wiki.github.com/joelthelion/autojump/

 

Под Mac ставится одной строкой: brew install autojump (если у вас установлен brew)

Enjoy.

Пальма первенства среди сайтов по приложениям для iPhone

30.11.2010

http://apptrackr.org/ теперь подхватил выпавшее из appulo.us знамя обменника линками на ломаные приложения из AppStore.

Приятный вебдванольный интерфейс, скорость работы, огромная база, все это делает сайт лидером в своей пиратской области.

Перестал работать ICQ в iChat?

19.11.2010

В свете событий приобретения ICQ отечественными производителями есть мнение, что началась борьба с альтернативными клиентами ICQ. Если борьба таки действительно будет иметь место рискую предположить, что от его использования большинство будет отходить в сторону jabber и skype (который уже сейчас убивает всех функционалом с групповыми видеоконференциями).

В настройках айчата на первой вкладке учетной записи AIM с логином ICQ снимите галку с включения записи, далее идите в настройки сервера и в поле сервер при отжатом SSL введите 64.12.202.116 (переключитесь на другую вкладку для сохранения), далее вернитесь к настройкам и включите SSL, в поле сервера опять введите 64.12.202.116, сохраните также изменения.

Вернитесь к настройкам, снимите чекбокс с SSL.

сей пост почерпнут из http://community.livejournal.com/ru_mac/16407839.html

О неистощимости фантазии в области обмана

14.10.2010

Сегодня был застигнут врасплох нажав на обычный, казалось бы, ролик youtobe.

Похоже на интерфейс youtube? Да как две капли.

Но не тут-то было, вместо проигрывания ролика произошел переход по гиперссылке на сайт рекламодателя.

Таким обманутым ваш покорный не чувствовал себя с 2000г., когда  увели мой честный icq семизнак путем подсовывания для ввода пароля сайта похожего на генерального прокурора icq 🙂

Что чаще всего ломается у пользователей?

21.09.2010

Пытливый читатель, вероятно, догадался о том, чем занимается автор в свободное от отдыха время, так вот,

интересную статистику на днях снял с тикетовки,

статистика отражает в процентном соотношении количество инцидентов по той или иной услуге и является четырехмесячным срезом.

Так что, вопреки мнению, что чаще всего у пользователей возникают проблемы с печатью не совсем верны 🙂

Про линуксы. Необычный максвитч … с линуксов :)

08.09.2010

Кроха сын пришел к отцу, и спросила кроха:

— Папа, линукс — это хорошо?

— Да, сынок, неплохо.

Знакомство с линуксами я завел в далеком 95-96г, это были Slackware 2.x и Redhat 4.x. Не понять сегодняшней молодежи то ощущение, когда ты перед командной строкой, и совсем без интернетов (а у кого они тогда были?). Ощущения острые, как и чего делать даже спросить было не у кого. И все же после пересборок и подпиливания то тут, то там ядра, понравился линукс тем, что mp3 файлы на моей dx4 100 проигрывал не заикаясь, чего не мог добиться друг моего детства windows 95 от подруги моего же детства DOS 6.22. Оболочка Window Maker добавила ощущений новизны происходящего, напомню, в те лихие девяностые мало кто колупал линуксы по-взрослому.

Ослабил либидо к линуксу первый мой soft-модем под названием US Robotics Winmodem 14400, который совсем ни к какую не заводился в линуксе. А интернетов очень хотелось. Ну, стало быть, поигрался и отложил в долгий ящик

Ящик открылся пару лет назад и linux главным образом всплыл при разработке rails приложений и был поюзан нещадно сначала через Vim, затем изменив vimу c Emacsом в неожиданных позициях.

Ах да, про свитч 🙂

Началось все с того, что в Ubuntu я поставил обои от MacOS. Понравилось. Затем прикрутил Dock апплетами к gnome. Понравилось. Подпилил надфилем шрифты и стал использовать Calibra. Потом сделал Pidgin похожим на iChat. И в целом сделал очень похожим на MacOS. В конце концов прочел статью buy those fucking mac.

А потом, думаю, чего это я?

И купил Macbook.

Таймаут набора номера SIP Linksys PAP2T и SPA3102 dialplan

26.08.2010
asores wrote:
У меня когда набираешь внутренний номер с аналогов. телефона через PAP2T в asterisk, с момента набора послендней цифры номера и получением сигнала вызова возникает пауза 5-7 сек….

Подкорректируйте диалплан, и укажите там паузу в конце — SX, где X — время в секундах, через которое начнётся набор номера. Если известна длина номера — можно сделать S0 в конце и набор начнётся сразу, как вы накликаете указанное в диалплане кол-во циферок. Описывать подробнее не вижу смысла, т.к. при поиске в инете, выдаётся, например, это: http://www.sipnet.ru/faq/

Как настроить dial plan на PAP2?
 

Пример: (*xx|<:8495>[1–79]xxxxxxS0|<8,:8>[34589]xx[1–79]xxxxxxS0|<8,10:810>[1–9]xxxxx.|<0,:>xxxxxxxS0)

Вызов по SIP ID осуществляется через “0”, 7-значные Московские номера в коде 495 набираются «как есть», междугородние номера набираются через “8”, международные — через «8 10".

Комментарии по отдельным составляющим этого примера:

  • *xx — позволяет набирать коды быстрого набора, например *01
  • <:8495>[1–79]xxxxxxS0 — к 7-значным номерам, не начинающимся на 8, добавляется 8495
  • <8,:8>[34589]xx[1–79]xxxxxxS0 — 8 и гудок, 3-значный код города, 7-значный номер телефона, проверка на допустимые цифры в начале кода и номера
  • <8,10:810>[1–9]xxxxx. — 8, гудок, 10, хотя бы 6 цифр; в конце нет S0, т.е. нет принудительного окончания набора после ввода определенного количества цифр, набор начнётся либо по таймауту либо по нажатию клавиши # в конце номера
  • <0,:>xxxxxxxS0 — 0, гудок, 7-значный SIP ID

Things, OmniFocus и прочие GTD

16.08.2010

Почему работают GTD системы?

Почему не работают GTD системы?

Почему Things завоевывает больше пользователей простотой и дизайном, нежели OmniFocus функциональностью?

Как пользователь со стажем обеих систем (а также The Hit List, MyLifeOrganized) имею что сказать.

OmniFocus заставляет таки почувствовать себя белкой в колесе жизни. Продуктивность растет, сильно растет и часто и помногу. И вот уже вырастает до таких пределов, когда человек начинает себя чувствовать автоматом по выполнению задач и проектов и говорит себе «стоп, хватит, выходной». OF очень помогает сконцентрироваться на выполнении следующих по контекстам задач.

Things не обладает вышеобозначеным недостатком, ибо сводит концепцию GTD к конструированию списка дел именно «на сегодня». Однако Things имеет несколько неоднозначную концепцию тегов/контекстов/area. Для себя я принял следующую договоренность: теги — контексты (читать, писать, офис, дома, назначить, проверить, покупки) т.е. действия и места. Areas — служат для группировки задач, которые не имеют выраженного профита и выполняются регулярно, например, оплата аренды, коммунальные платежи и так далее. Проекты — это все задачи, которые имеют более одного действия,  активными следует держать не более определенного разумного максимума, которые для меня составляет около 10, все остальные проекты пуляем в неактивные.

Почему GTD системы не работают или работают неэффективно?

Основная ошибка пользователей GTD систем — неверное занесение/распределение задач. Хитом распространенных ошибок, в данном случае, выступает ошибка занесения проекта как задачи. Проект — задача, которая состоит из нескольких задач. Залог успеха — разделение на атомарные подзадачи, которые можно выполнить, перепоручить, проверить. Не менее важным является создание quick-list задач на следующий день (список  today).

Также присутствует очень распостраненный баг — ваш мозг не может автоматически синхронизироваться через cloud-сервис с менеджером задач типа Things или OF. Всегда у вас будет операция загрузки-выгрузки задач из мозга в органайзер и обратно. Невыгруженная задача теряется и засоряет уголки мозга, сегодня вы не забыли записать, а завтра забыли. Если ваша работа связана с компьютером, а смартфон вы никогда не выпускаете из рук, то буфер в мозгу, в котором вы временно размещаете невыполенные задачи, почти не переполняется. Зато стоит накопить определенное количество «невыгруженных» в органайзер задач, как они тут же начинают теряться и забываться. Но мозг,- это забавная штука, он забывает весьма плохо, скорее всего задача затаиться в потайном уголке и будет периодически о себе напоминать в самое неудобное время, например, перед сном 🙂

Близкий к идеальному органайзер должен обладать следующим функционалом:

  1. Мгновенно записать голосовую заметку и пульнуть ее в inbox (представьте себя в этот момент за рулем автомобиля).

  2. Видеть список дел «Today» на welcome screen не запуская приложение. Совсем идеальный вариант — отображение задач на welcome screen исходя из геотега, то есть ближайшие контексты для выполнения отображались бы первыми.

  3. Автоматически синхронизировать задачи/проекты с cloud сервисом, дабы избавиться от необходимости выгрузки задач из девайса в десктоп/ноутбук через wifi/usb шнурок.

  4. Делать принудительный review задач и проектов раз в неделю-месяц-год.

Можно предположить, что различные hipster pda и бумажные версии доставляют еще и путем психомоторики. Однако, на моей практике это далеко не так, и вот почему. Записанные задачи нужно мало того что отмечать выполненными, но и группировать по проектам и по датам, и те задачи, что были не выполнены, прийдется переписывать снова и снова до получения необходимого эффекта.

Нужно ли использовать менеджер задач в повседневной жизни? Безусловно.

Сложно ли использовать менеджер задач в повседневной жизни? Сложно, ибо связано с приобретением новых привычек (внесение задач, проектов, аналитика).

Есть ли ощутимый профит в ведении задач? Конечно, во-первых, вы не забываете о планировании и контроля за выполнением делегированных задач, во-вторых у вас есть богатый материал для аналитики и воздействия на себя.

Помните о побочном эффекте от применения GTD систем : относительная скорость жизни увеличивается.

UPDATE: в продолжение темы статья почему omnifocus лучше чем things хотя сейчас The Hit List ожил и стал активно развиваться.

Позитивный топик о Mac soft.

29.07.2010

Вот так просто, голосованием большинства определяется лучший софт для Mac из серии must have.

Спасибо ctrld за ссылку.

Новые грани сайта :)

23.07.2010

Создал 3 раздела, которые буду пополнять самым полезным в мире чтивом, фильмами и музыкой.

Интересны в первую очередь вещи, которые не являются попкорном для мозга, но развивающие и оставляющее долгое послевкусие задумчивости над бытием.

Проebay

15.07.2010

Купил я как-то через мегаполезный сервис ebay шнур для зарядки iPhone. Китайский такой, за 3-4 бакса включая доставку.

И вот незадача, приехавший шнурок попросту не подходил к разъему!

Ну, как водится, поставил неудовлетворительную оценку заказа в графе «описание товара».  Поставил и забыл. А китайский продавец увидел, и не забыл. И вот, учитесь, парни, как нужно с кастомерами переписываться.

Hi, friend, i am sorry for trouble, we are honest seller, i think maybe the

item is not good, but we really want to do our best service for you all the

time, we have left nice feedback for you, i think if you agree to remove

the feedback to us, i can refund you money, i know the money is not important,

but we really want to let you know, we want to fix the problem for you by

this way, we just want to do much and let you feel better, please help us.

thanks

You left for me this statement: I agree to remove the neutral feedback of

item

Вот я и рад был бы помочь со сменой оценки на более позитивную, однако ебей не дает это делать для покупок сроком позже чем 60 дней.

Но оценки на ebay таки невозбранно рулят 🙂

Про диеты

05.07.2010

Сидячая работа? Большой процент подкожного жира? Сопишь завязывая шнурки?

Тогда эта диета для тебя. Почему?

Потому что достаточно просто ее соблюдать, не нужно перенапрягаться выбором когда и что правильно есть.

Все достаточно просто и понятно, и позитивный результат не заставит себя долго ждать.

Также не могу не порекомендовать эту книгу для правильного отношения к себе и тому, что ты ешь.

Про юзабилити

30.06.2010

Как известно, человек не воспринимает число объектов более 6-7 одновременно,

так настоящей pain-in-the-ass становится работа с раздутыми менюшками (привет microsoft office 97-2003), особенный кариес мозга вызывают различного рода treeview. Так появился интерфейс ribbon в Microsoft Office 2007.

А вот как к этой проблеме подходят инженеры эпл. Иконки в iPhone расположены в 5 столбцов и 4 ряда.

В таком меню элементы сгруппированы и разделены не более чем по 5, что явно улучшает user expirience.

В Windows Mobile устройствах настолько невменяемое выпадающее меню, что пользоваться им не тянет совершенно.

А на мой взгляд идеальный интерфейс, это нечто с одной большой красной кнопкой 🙂

Life’s life

28.06.2010

Рыдалъ. Programmers only.

25.06.2010

Прошивко 4.0

23.06.2010

Уже, как говориться, боян, но не могу не поделиться положительными эмоциями от прошивки iphone 4.0

Итак, самые яркие моменты в прошивке 4.0 (для 3G не работают бекграунд, мультитаскинг)

  1. работает анлок 🙂
  2. папки
  3. mail для всех ящиков
  4. через iTunes можно двигать иконки
  5. через iTunes можно сливать-заливать книги в Stanza

и вот, прекрасное:

Пожелаем раскруток )

22.06.2010

Жене моей, Юле Прокоповой, пожелаем большой раскрутки на поприще свадебной фотографии.

Спасибо скажу всякому, кто упомянет добрым словом. А то и Guinnes вышлю DHLем 🙂

Удивительных людей псто

04.06.2010

Уличный Drum’n’Bass

Потрясающая игра на … стаканах

Баянист

Удобный Google, использование клавиатуры для перемещения

31.05.2010

Если вы настоящий гик (а я думаю, если читаете мой блог, то вы явно гик), то несомненно стараетесь оптимизировать все для эффективной работы. И вряд ли на сегодняшний день мы можем найти более часто используемый инструмент, нежели поиск от Google.

А знаете ли вы, что в Labs можно включить режим перемещения по поиску при помощи шорткатов?

j — вверх по ссылке

k- вниз по ссылке

/ — перейти в строку поиска

Enter — открыть ссылку

Быстро? Очень быстро.

Для того, что бы включить это счастье необходимо зайти в Google Labs и активировать Keyboard shortcuts.

Из прекрасного: драже для ароматизации кала

26.05.2010

Украинская парфюмерная компания Bezstuzhev & Donskoy изготавливающая эксклюзивные ароматы, сделала прорыв в мире ароматов, а именно создала драже для ароматизации кала у человека.

Способы применения и дозы:
Внутрь по 1 драже за 5 мин., до дефекации как взрослым так и детям. Драже начинает своё действие через 5 мин., после приёма и держит своё ароматическое свойство около 2-х часов.

Источник:

http://marmelad-card.com.ua/more/696.htm

особенно радует e-mail указанный на странице производителя 🙂

О браузерах

20.05.2010

IE как-то мной недолюбливался еще со времен Netscape, и всю эту юношескую неприязнь удалось пронести через года и предпочтение отдавать этим нашим фаерфоксам обвешанным внушительным списком плагинов.

Однако, с приобретением мака стало понятно, что не фаерфоксом единым жив человек. Много с тех пор браузеров появлялось, однако…

Сафари. На текущий момент one and only браузер. Но ведь странно, пользую практически из коробки, минимум финтифлюшек, и все нравится! Только плагин Glims вот научил сафари сохранять сессии, и вот, что еще нужно для жизни?

Ну вот взять, к примеру, Оперу. Быстро? Быстро. Бывает коряво? Еще как бывает. Помнится, опера не справлялась со сложными жаваскриптовыми вещами, в связи с чем и была отправлена на покой.

Или вот Хром. Поставил буквально вчера, начитавшись как круто и быстро в хроме теперь. Поставил, 5 минут поигрался, поставил пару экстеншенов и понял, что без интеграции с 1Password теперь жизни точка нет. А так вполне себе браузер. Под винду юзал бы его везде, да. Строка адреса, которая является и строкой же поиска — очень позитивное решение.

А фаерфокс, фаерфокс-то какой! Оказалось, по сравнению с Сафари качество рендера одинаковое, однако грузится дольше. На сегодняшний день как-то даже не ощущаю потребности в плагинах. Если посудить, то это для меня сегодня бекапный браузер, когда веб-морды маршрутизаторов как-то нехорошо POST отрабатывают в safari. В венде зачем плагины нужны? Ну, обязательно, mouse gestures какие-то, а если в маке это все из коробки и в большинстве приложений (три пальца по торчпаду влево, три пальца по торчпаду вправо, меджик маус, опять-таки), то необходимость в таких плаганах просто отпадает.

Цытрегс

05.05.2010

Цытрегс, однако, дубовый.

Для инсталляции Citrix Xen App 5 потребовалось установить JRE 1.5.06, Visual J# 2.0 redistributable, Microsoft Framework 2.0.

И со всем этим барахлом оно должно взлететь?

А, ну и сервер лицензий на апаче 🙂

Настраивая сбоку Citrix Secure Gateway получил порцию незабываемых ощущений.

Коучи-хуйоучи (мотивационные тренеры)

22.04.2010

сцылко тыц: http://www.latansky.com/trainings/bts

Фраза «Успех доступен всем — каждый человек может создать для себя такую жизнь, которую он может себе представить!» вынесенная в заглавие сайта суперкоуча на самом то на деле и выражает всю суть разводняка. Рассказы о мотивации и есть самый разводняк. В книге «как заработать миллион» написано, что нужно написать и продать книгу с названием «как заработать миллион» 🙂

Тем не менее фраза абсолютно верна и точна. Дело в том, что человек сам как кузнец, так и пиздец своему счастью. Вся проблема людей с низкой мотивацией как раз и состоит в том, что другую жизнь они себе не представляют.

Предыдущий мой пост был как раз об этом.

Итак:

  1. Мы получаем ровно то, о чем усиленно думаем.
  2. Государство через СМИ и реклама направляют наши мысли в русло потребления.
  3. Государство через СМИ и реклама управляя нашими мыслями управляют нашими действиями.

Из этих простых постулатов становится совершенно ясным назначение культа телевидения. Особенно это заметно в штатах, где количество развлекательных передач с непременной рекламой не идут ни в какое сравнение с количеством передач действительно расширяющих кругозор.

Из этого можно сделать выводы:

  1. Мы биомасса? Да, мы — управляемая биомасса.
  2. Счаслив ли человек приобретая то, в гонке за что он участвует?
  3. Что есть «успех»? Нет, действительно, что есть «успех» для вас лично?
  4. Шура, сколько денег вам нужно для полного счастья? (с) Золотой теленок

И еще одно, если вы себе говорите «это слишком сложно», «вряд ли мы потянем», «у нас нет на это средств», будьте уверены, так оно и случится.

UPDATE: а вот тут все правильно написано: http://habrahabr.ru/blogs/arbeit/94648/#habracut

А вы нашли смысл в жизни? :)

10.04.2010

Переполняясь чувствами пишу эти строки, ибо искра мысли насколько таинственна, настолько же и материальна. Иногда к человекам приходят различные «кризисы среднего возраста» и мысли типа «тварь я дрожащая, или право имею?» и «хочу ли я, могу ли я и надо ли?». Тогда человекам хочется встретить, наверное, понимание всей глубины наших глубин в глазах и головах окружающих, ан нет. Потому что всем похуй.

К чему я клоню? Вот к этому вот, горячо рекомендую послушать для расширения сознания.

Да, это Френки! Спасибо ему за это удивительное чувство, которое приходит во время прослушивания.

Англо-русские словари в Mac. Lingvo 12 En-Ru/Ru-En и словарь синонимов.

07.04.2010

UPDATE: обновил ссылку на rutracker.

Вот оно, нерафинированное счастье. Знаете ли вы, что в Mac встроены прекрасные словари вызываемые по хоткею cmd+ctrl+d?

А знаете ли вы, что английские словари, которые идут в поставке к Mac можно пополнить русскими словарями на базе Lingvo?

Lingvo 12 En-Ru/Ru-En и словарь синонимов.

Как бы вот: http://rutracker.org/forum/viewtopic.php?t=601894

Распаковать и положить в папку /Library/Dictionaries.

high availability http load balancer

25.03.2010

На просторах интернетов был найден software http load balancer для распределения нагрузки на web-front.

По многообещающим страницам сайта можно предположить, что модуль способен выдержать распределение http запросов с нагрузкой в десятки тысяч запросов в секунду.

Впечатляющих результатов достиг Chris Knight:

200 Terabytes Served in 81 Days = 2.47TB per day!

Про фотки

20.03.2010

Фотки. В основном фотки бывают унылые и безжизненные. В некоторых даже бывает сюжет. В иных можно увидеть двойной смысл и зеленых человечков в капюшонах. А бывают красивые, выразительные и вызывающие эмоции.

Сегодня посетив выставку World Press Photo Award 2009 увидел и поразился. Ну да. Война и все такое. Жесть всегда привлекала людей как мух на мед, поэтому 90% фото на выставке про жесть.

А вот бороздя архивы лепры, наткнулся на потс с лепроюзерами, и так был впечатлен одним фото, что тут же захотел утянуть к себе в блог.

Вот она, ниже. Нет, серьезно, меня как прожженного циника фотки не торкают. А тут торкнула. Встречайте.

Управление Active Directory: групповые операции над аттрибутами

11.03.2010

Для тех, кто любит и умеет готовить AD не секрет, что работа со свойствами пользователей в больших количествах занятие трудоемкое.

Какие-то свойства профиля можно задать групповой операцией,  а какие-то нет.

Нелегкий труд ADмина призвана облегчить сия утилита.

Вопрос про отказоустойчивость сервисов, например, FTP

04.03.2010

интересный вопрос мне задали сегодня

вот есть публичный FTP, скажем даже два FTP сервера на разных площадках хостинг-провайдера.

Как организовать доступность сервиса в случае падения одного из серверов?

DNS? А вообще бывает такой «пингующий» DNS, который будет исключать IP сервиса из резолва, если тот не «живой»?

Нагуглил, меж тем, вот такой девайс

за $10 000.

Но с поправкой на нашу суровую реальность смотрим на более бюджетные вещи 🙂

Забавный баг Mac+Cisco

27.02.2010

Любопытный баг тут обнаружился случайно.

Внезапно на Maке взбесился процесс launchd отъедая 100% ресурсов.

Закатав рукава запускаем Console, где обнаруживаем такие строки:

27.02.10 17:07:14 com.apple.launchd[1] (com.apple.tftpd[28030]) Exited with exit code: 1

в абсолютно неимоверном количестве.

Теряясь в догадках запустил tftpserverd (что тут же успокоило launchd), и стал пробовать мысленно связать этот полтергейтс с происходящим вокруг до тех пор, пока взглядом не уперся в лежащую рядом cisco 871.

Осенившая мысль подсказала, что cisco свои конфиги пытается получить как раз по tftp! Так вот, оказывается, кто дергал мой tftpd!

Тут и сказочке ескейп, а тем кто слушал, F1 😉

Тошнотег в ассортименте.

26.02.2010

Налетаем, разбираем:

http://gadgets-shop.com.ua/product_865.html

SONIC NAUSEA — Ультразвуковой тошнотик (ультразвуковой отпугиватель) для людей — это маленькое электронное устройство, которое может вызвать у людей, находяшихся с ним в одном помещении дискомфорт. Устройство воспроизводит уникальную комбинацию ультравысокочастотных звуковых волн, которая приводит через некоторое время к тошноте у человека. Он так же  может вызвать головные боли, интенсивное раздражение, потение, неустойчивость, тошноту, или даже рвоту. Благодаря уникальным особенностям звуковой волны — очень трудно локализовать его местонахождение, что делает его ещё более скрытным. Достаточно его соединить с батареей типа «Крона» и он начнём издавать противный ультравысокочастотный звук, от которого хочется убежать подальше. Положите прибор где-ли в к компане в незаметном месте и вскоре покиньте помещение. Это отличное устройство для шуток над друзьями или сотрудниками или для мести обидчикам. Для более продолжительной работы устройства — Вы можете использовать 6 батареек типа «АА», установив их в держатель батареек (продаются на рынках и в магазинах электротоваров). Используйте данный прибор разумно и с аккуратностью.

Тюнингованый УАЗ! Звезда в шоке!

25.02.2010

http://auto.ria.ua/megaphoto/auto-2247217.html#photoId_7448999

Вот ведь с душой подошли люди к вопросу тюнинга УАЗа! И ведь всего $10K, а сколько стараний и труда вложено.

http://auto.ria.ua/auto_uaz_2247217.html

Двигатель 2.8I, 150л.с. ФОРД (он же и в тех.паспорте), 5ст КПП ФОРД, полный тюнинг, 100% утеплен и обесшумлен, дисковые тормоза всех колес, гидроусилитель, сигнализация, ц/з, люк с регулировкой в двух направлениях, кожаный салон и обшивка дверей, потолок алькантара, подогрев передних сидений, мультируль обшитый кожей, эл.зеркала, неоновая подсветка (порогов, салона, приборов, ручек открывания замков, подножек), 2 бака, 2 эл.бензонасоса (на каждый бак), сейф для ружья, дополнительный свет, литые диски, резина почти новая БФ Гудрич, глушители нержавейка, панель индивидуально изготовлена под данный автомобиль (обтянута кожей), салон выполнен для нормальной комфортной езды, музыка SONY с МР-3 и д/у (6 динамиков), эл.антена, тонирован, + очень много другого. Подвеска УАЗ + добавлены амортизаторы. ТО-2011. Снят с учета. Режимы езды на выбор: задний привод, полный привод, полный привод с понижением.

Visor bundle. Консоль для Mac в стиле quake.

17.02.2010

Здравствуйте, дорогие мои, присаживайтесь поудобнее, в этой статье мы рассмотрим «плюшку» для удобства работы в консоли Mac, которая выезжает «как в Quake»

Для инсталляции скачиваем пакет  http://visor.binaryage.com/

и устанавливаем.

Запускаем Terminal.app, заходим в настройки Cmd+, кстати, этот шорткат работает для любых приложений на Маке.

устанавливаем активационный шорткат, для меня удобным показался option+~

закрываем настройки, нажимаем option+~ и смотрим на выехавшую консоль размером в треть экрана. В консоли поддерживаются табы, cmd+t откроет новую вкладку.

option+~ и консоль скрывается со слайдом вверх. Enjoy!

Пять клевых фич Мака

09.02.2010

Оригинал:

http://www.silvermac.com/2006/cool-things-you-can-do-on-mac/

  1. Словарь ctrl+cmd+D при выделенном слове
  2. Инверсия цвета ctrl+cmd+option + 8
  3. Медленное сворачивание приложения shift + клик на желтой кнопке
  4. Быстрое сохранение clipboard (Evernote like), выделяем текст и тащим мышью на рабочий стол 🙂
  5. Скриншоты cmd+shift+3, cmd+shift+4, Space — сохранение в png как рабочего стола, так и вырезки фрагмента отдельного окна

От себя добавлю пару шорткатов:

  1. переход между табами safari — cmd+shift+[ таб влево cmd+shift+] таб вправо
  2. ctrl+space  — вызов spotlite
  3. cmd+shift+n в finder — создание каталога
  4. cmd+shift+G  в finder — быстрый переход к каталогу (работает tab-completion).
  5. lock screen — Ctrl+Shift+Eject

Сервис поиска mp3

04.02.2010

Потрясающий сервис поиска музыки в формате mp3, вполне себе можно скачать, все что найдено.

<tagoo.ru>

открыть/закрыть open relay Exchange 2007

03.02.2010

было дело, открыл однажды open relay на Exchange для внутренних нужд,

и вот на днях этот сервер стал публичным, а open relay, о ужас, остался!

Закрыть его было делом таким же непростым как и открыть, поэтому записываю, дабы не забыть:

[

]2

UPDATE:

хозяйке на заметку: лучший сервис тестирования почтового сервера на предмет корректной настройки DNS/SMTP и наличия в спамлистах.

обновление лучшей SIP звонилки для Mac — iSoftPhone

01.02.2010

Продукты для Mac с каждым новым днем становятся все лучше и лучше, так, обновление лучшей звонилки всех времени и народов iSoftPhone принесло неподдельную радость от использования.

Источником бурной радости явилось добавление кнопки выбора альтернативного вывода звука, теперь я могу вполне пользоваться bluetooth гарнитурой исключительно тогда, когда это нужно!

Новый дизайн стал еще более привлекательным.

isoftphone

Появилась поддержка DND режима одной кнопкой, а интеграция с маковской Address Book заставляет забыть о ручном наборе телефона.

При звонке отображается фотка из контактов!

Всячески рекомендуется маководами к повседневному использованию.

Как работать эффективно?

30.01.2010
Эффективная работа означает в первую очередь эффективное использование рабочего (и не рабочего) времении, как своего, так и чужого. Как понять, что ваше время используется эффективно, и как понять, что вы в данный момент занимаетесь именно теми вещами, которыми следует заниматься? Автор перепробовал на собственной шкуре большинство GTD методик, пробовал вести в наладоннике Pocket Loox под Windows Mobile 2003, пробовал вести сугубо на десктопе, пробовал связку десктоп-наладонник, пробовал GTD системы для iPhone, пробовал запись на диктофон, пробовал бумажные носители. На первом этапе это все помогало, но лишь временно. Нет такой системы (кроме OmniFocus), которой бы я успешно пользовался на протяжении долгого времени. Безусловно, все эти GTD необходимо попробовать, я бы даже сказал, что до них необходимо дозреть.
В первую очередь необходимо помнить, что все незаконченные дела, которые находятся постоянно в голове отнимают вашу жизненную энергию. Любые, даже самые мелкие будут всплывать и напоминать о себе в самые неподходящие моменты. Например, вы вспоминаете, что необходимо было что-то взять дома уже на полдороги от этого самого дома, или же вспоминаете про незаконченный отчет будучи уже дома, готовясь ко сну.
Даже сложно представить произведенный эффект от одного только выписывания абсолютно всех дел на лист-другой бумаги, получая освобождение мозга для новых идей. Иногда кажется, что мозг имеет определенную емкость «RAM», где хранятся ваши мысли, задачи, дела. И эту RAM можно отсвопить на обыкновенный лист бумаги, тем самым освобождая голову для новых, свежих мыслей. Возможно вы так и не вернетесь, ко многому, что было выписано на бумаге, не волнуйтесь, это нормально, некоторые задачи, как это ни странно, не нуждаются в выполнении вообще! После такой процедуры можно провести немного времени для того, что бы выделить среди всех дел действительно важные и отсеять менее важные. Более важные дела требуют планирования, т.к. они необходимы для осуществления САМЫХ ВАЖНЫХ В ЖИЗНИ вещей, и они должны быть сделаны в определенные разумные сроки. Остальные дела можно распределить на требующие больших временных затрат и на не требующие. Те дела, которые особых временных затрат не требуют можно выполнить прямо сейчас. Должно полегчать 🙂
Проблема номер один — хаос из мыслей в голове и неумение выделить среди них более важные и второстепенные дела. Отсюда проблема правильного распределения жизненной энергии. В наиболее продуктивное время вы можете заниматься второстепенными делами (которые, как вам кажется, должны быть сделаны в первую очередь), а затем, когда уже под вечер ваших сил хватает только на то, что бы передвинуть бренное тело с одного места на другое вы вдруг ловите себя на мысли, что большая куча других важных дел осталась нетронутой.

Хозяйке на заметку: корректная настройка DNS записей для сервера jabber

20.01.2010

Сталкивались ли вы с проблемами отправки сообщений [Jabber с Google Hosted services](http://googletalk.blogspot.com/2006/01/xmpp-federation.html) на аккаунт вне вашего домена?

Если вы хотите, что бы ваш jabber сервер был доступен для общения и с другими доменами интернета (что называется «федерация»), будьте добры настроить DNS записи для вашего домена, как показано на примере ниже:

_xmpp-client._tcp 900 IN SRV 5 0 5222 jabber.example.com.

_xmpp-server._tcp 900 IN SRV 5 0 5269 jabber.example.com.

_jabber._tcp 900 IN SRV 5 0 5269 jabber.example.com.

Если вы используете службы google hosted для вашего домена, что бы корректно общаться со всеми в google talk (jabber) вам необходимо прописать следующие настройки:

_xmpp-server._tcp. IN SRV 5 0 5269 xmpp-server.l.google.com.

_xmpp-server._tcp. IN SRV 20 0 5269 xmpp-server1.l.google.com.

_xmpp-server._tcp. IN SRV 20 0 5269 xmpp-server2.l.google.com.

_xmpp-server._tcp. IN SRV 20 0 5269 xmpp-server3.l.google.com.

_xmpp-server._tcp. IN SRV 20 0 5269 xmpp-server4.l.google.com.

_jabber._tcp. IN SRV 5 0 5269 xmpp-server.l.google.com.

_jabber._tcp. IN SRV 20 0 5269 xmpp-server1.l.google.com.

_jabber._tcp. IN SRV 20 0 5269 xmpp-server2.l.google.com.

_jabber._tcp. IN SRV 20 0 5269 xmpp-server3.l.google.com.

_jabber._tcp. IN SRV 20 0 5269 xmpp-server4.l.google.com.

iChat ICQ without HTML tags now. Chax is in beta now. Finally.

18.01.2010

То, о чем так долго мечтали большевики, свершилось! Скажи, «Аминь», на!

Не прошло и сто лет, как iChat, благодаря особой примочке «Chax» научился слать сообщения без HTML тегов камрадам все еще использующим ICQ.

Chax возмужал и вырос из alpha и стал betой, с чем всех нас и поздравляю. Adium же  пока отложим в дальний пыльный ящик, пока пусть полежит до лучших времен.

iPhone tethering — делаем из iPhone модем

15.01.2010

Получилось в оживить функционал Internet tethering, режим модема на iPhone. Говорят, что прошивки >3.0 уже не обладают этим функционалом, не знаю, — не проверял. Если у вас есть возможность проверить на свежей прошивке (сейчас 3.1.2), просьба отписать в комментариях.

IMG_0494.PNG

С настройкой все достаточно просто, например, для оператора для Life 🙂 запускаем на телефоне Safari, открываем адрес http://help.benm.at и заполняем настройки AP, username и password. В нашем случае только в поле AP вписываем internet, username и password оставляем пустыми, жмем submit и, после подтверждения, устанавливаем настройки на телефоне.

После чего заходим в Settings->Network (Настройки->Сеть) появляется tethering (режим модема), его то и включаем.

Спариваем iphone с маком и наслаждаемся инетом по блютусу.

IMG_0493.PNG IMG_0496.PNG IMG_0495.PNG

Для тех, кому интересны детали. iPhone:

  1. Становится dhcp сервером.
  2. Начинает предоставлять сетевое соединение по USB или по bluetooth.
  3. Работает в режиме NAT.

Лучше всего соединяться по bluetooth после того, как зайдем в настройки и включим режим модема. Телефон спросит, хочу ли я включить bluetooth, если нажму «включить», все пройдет корректно и вы увидите синюю строку «режим модема», как показано на скриншотах.

iPhone в режиме модема работает одинаково хорошо, как с Mac, так и с Windows.

Аналогичным функционалом обладает приложение из Cydia: PDANet.

Mac, Windows и ultravnc

14.01.2010

Знаете ли вы, что в Mac уже встроены средства удаленного доступа, как для вызова удаленного хоста, так и предоставления доступа с удаленного хоста?

Для удаленного подключения нам пригодится бесплатный пакет UltraVNC, который мы установим на windows хосте. Думаю, у читателя не возникнет особых проблем с установкой.

Теперь из Mac вполне спокойно можно подключаться к хосту windows с ultravnc просто набрав в Safari в строке адреса следующую сроку:

vnc2win

понятно, что IP должен быть указан того хоста, к которому вы собираетесь подключиться.

Запустится приложение «общий доступ»

Vncsharing

и вы будете иметь контроль над мышкой и клавиатурой удаленной машины.

Работает и обратная процедура. Для Mac достаточно зайти в настройки «Общий доступ» и установить флаг «Общий экран»,

mac-vnc

и обязательно указать пароль в кнопке «Настройки компьютера».

mac vnc settings

Все, на windows хосте вы можете запускать vncviewer и подключаться к вашему Mac используя пароль, указанный выше.

Детальнее про удаленный доступ к Mac

Update:

Как подключиться по vnc из iPhone

интересные шорткаты для Win7

13.01.2010

698149.jpgИсключительно случайно были обнаружены прикольные шорткаты на Win7:

Win+Left и Win+Right распахнет окно и прижмет влево или вправо.

наглядный анализатор использования диска Overdisk

13.01.2010

Была недавно замечена в работе удивительно полезная утилита  Overdisk, которая весьма наглядно, круговыми диаграммами отобразит, что именно занимает дисковое пространство на сервере.

А может это видеоархив в .doc? Или mp3 запрятал пользователь промеж файлов 1Ски?

Все это поможет выявить freeware (!) программа  Overdisk

Сравнение софта под Mac и под Linux

13.01.2010

Был порадован комментарием с habrahabr.ru

Если оно говно, то это не значит что им не надо пользоваться. Землю тоже говном удобряют 🙂

Просто Mac-софт это как супермаркет. Пришёл, выбрал что надо, оплатил и кушай.

С GNU-софтом всё сложней. Вот тебе семена, распаши грядку, завези говна, перекопай, подожди годик пока перегорит, засей, расти-поливай, багов убивай. Потом собирай урожай, приготавливай и кушай.

Селяви…

http://habrahabr.ru/blogs/open_source/79378/#habracut

http://olegkrasnov.habrahabr.ru/

ускоряем работу iPhone

05.01.2010

Не так давно мой смартфон стал радовать меня меньше, чем раньше, и связано это было с производительностью. Если раньше, сразу после прошивки телефон «летал», то сейчас на некоторых приложениях он еле двигался. Особенно это заметно при работе с браузером, почтой и различными поисками (например по адресной книге).

Однако, при помощи определенных манипуляций удалось заствавить этот чудесный аппарат работать резвее.

Вкратце: избавляем телефон от поддержки ненужных языков, оставляя лишь два необходимых: ru и en и наслаждаемся результатом.

Дополнительно можно выключить автозагрузку для ненужных демонов, которых, как оказалось, было:

Для всех манипуляций нам прийдется установить OpenSSH из Cydia.

После подключения к телефону (я надеюсь все смогут найти IP, полученный Wifi адаптером телефона?) входим по login: root и password: apline.

  1. Создаем директорию для бекапа:

mkdir /private/var/stash/langBackup/

  1. cd /private/var/stash/Applications

  2. for file in `find . -type d -name «*.lproj» -not -iname «ru*.lproj» -not -iname «en*.lproj» -exec echo {} ; | sed -e ‘s/.///’`; do tar -rf /private/var/stash/langBackup/langBackup.tar ./$file ; done

чем переместим ненужные языки в архив langBackup.tar в /private/var/stash/langBackup

  1. отсекаем лишнее

for file in `find . -type d -name «*.lproj» -not -iname «ru*.lproj» -not -iname «en*.lproj» -exec echo {} ; | sed -e ‘s/.///’`; do rm -vr ./$file ; done

  1. заходим в папку стартап скриптов:

cd /System/Library/LaunchDaemons

  1. rm com.apple.Dump* удаляем ненужные демоны — 2 демона, которые делают дамп при «падениях» айфона для анализа Эпплом

  2. rm com.apple.Report* удаляем ненужные демоны — 5 демонов, которые делают отчеты о «падениях» — что было запущено, когда они произошли и т.д.

  3. reboot

Должно полегчать

[Детальнее](http://www.iphones.ru/forum/lofiversion/index.php/t45750.html)

[Еще детальнее](http://www.ipodtouchfans.com/forums/showthread.php?t=224341 «Tutorial — Speed Up Your iPhone/iPod by Removing Launch Daemons — iPod touch Fans forum»)

mod_security2 или как обезопасить свой хостинг от злодеев?

03.01.2010

![mod_security for apache](/uploads/2010/01/mod_security_for_apache.png)

В случае, если вы предоставляете услуги хостинга вам будет небесполезно знать, как быть, если сайты содержат старые версии публичных движков Joomla, ShopScript, WordPress, etc и периодически подвергаются взломам.

В таких случаях править код и обновлять версии клиентского ПО самостоятельно вы не будете по понятным причинам, да и не всегда у клиента есть возможность найти программера/фрилансера готового выполнить обновление работающего и приносящего доход, хотя и старого интернет-магазина или форума.

Может быть есть простой способ запретить обычные SQL инъекции, directory traversing и остальные распространенные методы взлома? Оказывается, такой способ есть и предоставляет его модуль apache под названием [mod_security](http://www.modsecurity.org/).

При помощи определенного набора правил, примерно как у Spamassassin, происходит тестирование вызываемого URL на предмет конструкций ../../../ и отправка в POST данных вида ‘ or 1=1

Для FreeBSD ставится довольно просто:

portinstall mod_security2

Для того, что бы довести функционирование этого модуля до ума прийдется потратить пару дней на изучение логов работы модуля и отключение ложных срабатываний (кои случаются) и обучению новым трюкам, что, в конечном счете, даст вам возможность спать спокойнее. На производительности сервера этот модуль отражается несущественно.

Отключать модуль для определенного сайта можно в секции vhosts указав

SecRuleEngine off

Применение данного средства является хорошим «пугалом», но не есть панацея. Обновляйте ваши движки чаще, и закрывайте дыры в безопасности. И да прибудет с вами сила.

Пример логов:

[04/Jan/2010:09:15:52 +0200] [www.xxxxxxxx.com.ua/sid#28efbb60][rid#29a56058][/_vti_bin/owssvr.dll][1] Access denied with code 500 (phase 2). Pattern match «.(?:c(?:o(?:nf(?:ig)?|m)|s(?:proj|r)?|dx|er|fg|md)|p(?:rinter|ass|db|ol|wd)|v(?:b(?:proj|s)?|sdisco)|a(?:s(?:ax?|cx)|xd) |d(?:bf?|at|ll|os)|i(?:d[acq]|n[ci])|ba(?:[kt]|ckup)|res(?:ources|x)|s(?:h?tm|ql|ys)|l(?:icx|nk|og)|\w{0,5}~|webinfo|ht[rw ]|xs[dx]| …» at REQUEST_BASENAME. [file «/usr/local/etc/apache22/Includes/mod_security2/modsecurity_crs_30_http_policy.conf»] [line «94»] [id «960035»] [msg «URL file extension is restricted by policy»] [severity «CRITICAL»] [tag «POLICY/EXT_RESTRICTED»]

Mobile Me

30.12.2009

Читать о тестировании MobileMe

Задумался я как-то об использовании Mobile Me сервиса, какие дает преимущества за $100 в год?

В этой статье мы попытаемся найти более бесплатные аналоги, если таковые существуют.

  1. Почта и ее синхронизация. Аналог — Gmail в режиме IMAP.

    Используя Gmail в режиме IMAP вы сможете иметь всегда актуальную копию ящика в веб-интерфейсе, на iPhone и в Mail.app. Отдельно отмечу push функционал, а именно, если его не использовать, то существенно сэкономите время жизни заряда батареи.

     <img src="/uploads/2010/01/gmail.jpeg" alt="gmail" height="117" width="117" /> 
    
  2. Подключаемый и доступный отовсюду iDisk. Сервис iDisk предоставляет собой хранилище, которое находится в сети и подключается в систему в виде диска.

Аналог &#8212; [сервис DropBox][3]. Прочтите <a href="http://wildmale.livejournal.com/168953.html" title="wildmale: Dropbox. "Ляльки" из коробки.">лучшую статью о Dropbox</a>.
	  
<img src="/uploads/2010/01/dropbox_logo_home.png" alt="Dropbox Logo Home" height="75" width="290" /></p> 
<table>
  <th>
    Плюсы
  </th>
  
  <th>
    Минусы
  </th>
  
  <tr>
    <td>
      Бесплатен
    </td>
    
    <td>
      нет
    </td>
  </tr>
</table>
  1. Галлерея фотографий из iPhoto. Аналог — Интеграция с Flickr. Конечно, постить прямо из iPhone на Flickr не так удобно как в MobileMe, однако существует абсолютно бесплатный Flickr клиент для iPhone. Кроме того, в iPhoto уже существует встроенная поддержка flickr.

    Flickr.Thumbnail
  2. Синхронизируемая адресная книга. Аналог — Gmail Address Book. Знаете ли вы, что можно вполне синхронизировать контакты с iPhone, Address Book.app с Gmail нативными для Mac OS средствами через iTunes?
    iTunes address book Gmail sync

  3. Синхронизируемый iCal. Аналог — Gmail Calendar. Здесь даже работает подобие Exchange коннектора для google calendar. В Calendar.app поддержка Google Calendar нативная.

    ical
  4. iWeb и хостинг для своего сайта. Пожалуй, такого откровенно прямого аналога и не найти. Впрочем, можно делать экспорт сайта в локальный каталог и затем выкладывать на хостинг, но это уже не так удобно как при использовании MobileMe.

    iweb
  5. Find My Phone, RemoteWipe. Аналога нет.

    Find my i Phone tab Thumb
  6. Удаленный доступ к своему Mac (Back to my Mac). Аналог — Logmein, Teamviewer. Суть — инсталлируем на свой компьютер серверную часть (утилиту) для удаленного доступа и пользуемся. В Teamviewer в бесплатной лицензии есть также фича для пересылки файлов на удаленный компьютер.

    Teamviewer
  7. Синхронизация настроек между Macами. Прямого аналога нет. Возможно rsync в полуавтоматическом режиме? Понятно, что для обычного пользователя настройка rsync из консоли — не самое простое занятие.

  8. От себя замечу возможность использоватть MobileMe для синхронизации данных между Mac и iPhone такими приложениями как OmniFocus. Безусловно, это значительно удобнее синхронизации по Wifi, так как такую синхронизацию можно производить и в мобильном режиме, не обязательно иметь одновременно оба девайса включенными в одну Wifi сеть одновременно. Прямого аналога нет.

Итого из уникальных сервисов:

  1. Публикация iWeb в один клик.
  2. Синхронизация настроек между маками.
  3. Find my Phone.
  4. RemoteWipe.
  5. Использование возможностей синхронизации third-party приложениями через MobileMe

Стоит ли весь этот сервис $100 в год?

Решать вам. Для себя пока принял решение повременить.

apachetop

29.12.2009

Набрел на забавную утилиту apachetop

Вот такой простенький, порой, бывает нужен анализатор состояния апача, вдруг атакует кто?

Снимок экрана 2009-12-10 в 18.48.14.png

D-Link DIR-320 и сетевая печать

28.12.2009

Заметку побудило написать мое удивление при настройке печати через D-Link DIR-320, а именно несвойственная такого класса устройствам безгеморройность в настройке.

Для того что бы наш Xerox 3119 корректно распознался коробочкой пришлось обновить прошивку с 1.00 до 1.10, и после этого, о чудо, принтер был роутером обнаружен и автоматически настроен.

xerox 3119 printserver

Затем, как водится, хотел добавить через network printer port с указанием IP и порта 9100, но дай-ка, думаю, посмотрю что за визард такой в админке d-link. Запускаю, появляется страница printer wizard, княпаю next,next и … загружается PrinterConfig.exe.

Запускаю, получаю сообщение о том, что принтер корректно установлен в система с нужным драйвером!

3119 windows driver

Настройка под Mac также не составила никаких проблем:

3119 printer mac setup

Вот и сказочке конец, а кто DIR-320 купил, тот молодец 🙂

Все что вы хотели знать о стиральных машинах, но боялись спросить

28.12.2009

Если вдруг так случится, что стиральная машинка не работает как надо:

грамотный блог с советами по обслуживанию стиральных машин.

Из блога вы узнаете:

  1. [почему калгон не рулит](http://repair-wash.ru/make-sense/kalgon-pravda-i-lozh «Калгон: правда и ложь — Мастер по ремонту стиральных машин»)

  2. как самому продиагностировать поломку стиральной машины

  3. [как правильно ухаживать за стиральными машинами](http://repair-wash.ru/sovety/pravilnaya-ekspluataciya-stiralnoj-mashiny «Правильная эксплуатация стиральной машины — Мастер по ремонту стиральных машин») (написал, перечитал и улыбнулся)

[http://repair-wash.ru](http://repair-wash.ru «Записки мастера по ремонту стиральных машин»)

![Dyson Washing Machine](/uploads/2009/12/dyson_washing_machine.jpg)

теперь удобно читать блог и с iPhone

27.12.2009

WordPress замечательная платформа для блоггинга не в последнюю очередь благодаря своей расширяемости плагинами и темами.

Так, благодаря плагину WPTouch теперь вполне можно читать блог и из iPhone.

Вот как это выглядит:

iphone theme Img 0523 iphone wordpress iphone wordpress theme

Cucumber говорит по-русски

26.12.2009

Для тех ребят, которые увлекаются канбанами, TDD и прочими agile системами разработки следующим шагом является приобщение к BDD.

По-сути Cucumber представляет собой интеграционные тесты при помощи webrat или других высокоуровневых библиотек для эмуляции работы браузера, открывания странц, нажимания на кнопки и кликания по ссылкам.

Теперь с cucumber жить еще проще, рассказывать по-русски можно при помощи тега

@language ru

Типичный сценарий:

# language: ru
Функционал: отчеты по времени
  Чтобы получить понятие о стоимости часа для конкретной компании
  Я как руководитель
  Хочу иметь возможность просматривать отчеты по временным затратам на каждую компанию

Предыстория:
  Допустим существует клиент, админ и сотрудник клиента

Сценарий: просмотр суммарно затраченного времени за текущий месяц
  Допустим админ авторизован
  И открывет страницу отчетов
  То видит список клиентов с затраченным временем за последний месяц
cucumber тесты по-русски

cucumber тесты по-русски

выбираем оператора мобильного интернета в Киеве

25.12.2009

UPDATE: Почему Freshtel не подходит для применения в бизнесе, исключительно «домашний» оператор.

На сегодняшний день это следующие кандидаты на скоростной интернет (остальные операторы не владеют собственными мощностями и так или иначе являются реселлерами этих 4х, поэтому их не рассматриваем):

  1. Utel 3G стандарт UMTS

плюсы: поддержка стандартными девайсами, тарифы «без протухания мегабайтов», покрытие

минусы: стоимость девайсов от Utel, качество довольно сильно зависит от местоположения относительно базовой станции, от помещения.

  1. MTC Connect стандарт CDMA EV-DO rev. A

плюсы: хорошее покрытие, устойчивый сигнал, поддержка Mac OS

минусы: нет помегабайтных тарифов

  1. PeopleNet CDMA  стандарт EV-DO rev. 0 (сейчас вроде и rev. A)

плюсы: бывает что и работает

минусы: люди и отношение компании к клиентам, суппорт, отсутствуют тарифные планы на помегабайтной основе

  1. Freshtel (дочка Alternet) стандарт WiMax

плюсы: высокая скорость, доступные тарифы

минусы: покрытие, отсутствие поддержки различных ОС (Win 7, Mac)

Freshtel на сегодня хороший вариант там, где есть покрытие.

На 24.12.09 на ул. Паньковская (между Саксаганского и Жилянской) покрытия Frestel нет, протестировать не удалось.

Подводные камни Freshtel:

  1. это не 4G, как нам вещают умные маркетологи, а связь поколения 3G. К слову, 4G — это LTE, на сегодняшний день испытания которого только в Норвегии.

  2. для того, что бы неиспользуемый трафик не считался в определенный день — нужно зайти и поставить галку именно на этот день. Забыл = заплатил.

  3. Покрытие отстой.

  4. Не работает на Mac (нет драйверов).

  5. Не работает на Windows 7 (нет драйверов).

Выбор мобильного оператора в качестве резервного канала или для казуального использования

Назовем наш выбор «мобильный интернет для самых хитрожопых»

Utel 3G с модемом от Kyivstar за 200 грн  в качестве бекапного интретнет-канала «на всякий случай».

  1. Есть тарифы без абонплаты, препейд.

  2. Без протухания неиспользованных мегабайтов.

  3. Хорошее покрытие.

  4. Универсальность доступа.

  5. На iPhone 3G работает, на Sony Erricsson и так далее на всех достаточно распространенных аппаратах. Для WiMax и EV-DO девайсы гораздо менее распространены. Можно взять модем у Kyivstar за 200 грн 🙂

Выбор оператора мобильного Интернет в качестве основного канала

На сегодня предпочтительный и скоростной оператор —  Freshtel, если есть покрытие, и МТС Коннект, если покрытия нет.

Более глубинный анализ можно почерпнуть из этих ссылок:

http://www.interstar.ua/mobile/articles/3g_utel_test_part2/

http://www.interstar.ua/mobile/articles/mts_connect_test_part2/

если важно не качество, а цена — читать этот обзор http://itc.ua/node/39826

Сервис поиска попутчиков

25.12.2009

Был некогда хороший проект e-poputka.net, о чем я уже писал однажды.

Меня даже нашел попутчик Артем, воспользовавшись этим сервисом. С ним мы проездили довольно долгое время с Борщаговки на Васильковскую, так что с уверенностью можно сказать, что проект был небесполезным, однако впоследствии почему-то завял и закрылся.

Размышляя над самой идеей пришел к выводу, что основная проблема в поддержке такого сайта есть в актуализации марштутов пользователей, то ли стирать старые маршруты после определенного времени, то ли опрашивать пользователей для обновления? Одноразовые поездки это ведь совсем другое дело.

Ну и вот, встречайте , та же идея, другая реализация: http://podvezu.com.ua/

автокомплит в Mail для Mac

24.12.2009

Знаете ли вы о полезной опции автокомплита для приложения Mail в составе MacOS?

Магические кнопки Option+Esc покажут вот такое окно автодополнения:

Autocomplete

нашлись кнопки PgUp и PgDown на клавиатуре Macbook!

24.12.2009

То, о чем так долго говорили большевики для Macbook нашлось:

  • Page Up = Fn + Up
  • Page Down = Fn + Down
  • Home = Fn + left
  • End = Fn + right

Ошибка при установке на FreeBSD zabbix 1.8

24.12.2009

zabbixЕсли при установке zabbix 1.8 на FreeBSD вы получаете сообщения вида:

freebsd logo

60622:20091223:144406.024 Can’t allocate shared memory of size 8388608 [Cannot allocate memory]

60622:20091223:144406.024 Can’t allocate shared memory for configuration cache.

знайте, все дело в системных настройках sysctl.conf

в порядке тестирования пропишите

sysctl kern.ipc.semmni=128

sysctl kern.ipc.semmns=32000

sysctl kern.ipc.semmax=32000

sysctl kern.ipc.semmsl=250

sysctl kern.ipc.shmmni=4096

sysctl kern.ipc.shmmax=2147483648

sysctl kern.ipc.shmall=2097152

или сразу в /etc/sysctl.conf, тогда потребуется перезагрузка

kern.ipc.semmni=128

kern.ipc.semmns=32000

kern.ipc.semmax=32000

kern.ipc.semmsl=250

kern.ipc.shmmni=4096

kern.ipc.shmmax=2147483648

kern.ipc.shmall=2097152

проблема должна рассосаться

про VMWare ESXi

23.12.2009

В этом посте я постарался собрать свои и чужие заметки по работе с ESXi, так как сама идея виртуализации довольно интересна.

Алексей Перестюк — боевой товарищ, с которым отучились в киевском физмате УФМЛКУ, правильное дело делает двигая в массы технологии виртуализации и железо от Onix.

Здесь его вебинар по VMWare ESXi

Подборка моих заметок о vmware с nexus.org.ua

О бекапе vmware esxi

Как в VMWare расширить диск

Виртуализация средствами VMWare

Способ миграции сервера из виртуалки на физику и обратно

(updated) VMWare сервер, контроллер домена и проблемы с синхронизацией по времени

Если VMWare образы систем очень ТОРМОЗЯТ

Ставил в production VMWare сервер

Установка ESX на Proliant ML110 G5

и на закуску практический опыт, мой подкаст совместно с brj:

  • Виртуализация средствами VMWare ESX 3.5i, опыт эксплуатации.
  • снижение Total Cost of Ownership
  • оборудование для виртуализации
  • Windows Home Server
  • Novell OES

Практическое погружение в VMWare ESX

Борьба за охлаждение Macbook

22.12.2009

Столкнулся с проблемой запотевания ладошек при работе на Macbook, глядь на температуту, а там 61C.

Активное гугление не выявило особых отклонений в температурных режимах, но не было совсем уже бесполезным, так как нашлась приятная полезняшка для Mac от Lobotomy

Итак, дамы и господа, встречаем Fan Control

Снимок экрана 2009-12-15 в 20.08.35.png

Однако, как видно, при средней загрузке все равно порядка 62C, а это довольно тепло в ладони.

Так что проблема охлаждения ладоней до сих пор остается открытой 🙂

Интересное исследование по температуре macbook aluminium:

40-50 = Normal idling

50-65 = Normal load

65-75 = Heavy load, probably want some extra fans when you get to the top of this range.

75-90 = Getting close to the danger zone, FANS NAO!

90-100 = Stop what you’re doing.

100-110 = Things start throttling down to protect themselves. Take the load off, and check the cooling system. Make sure it is installed properly

110-125 = System will make a forced shut down, and will not power back up until the temps drop off.

это я что-то забеспокоился, у меня при обычной работе температура проца порядка 60-68C, а это, оказывается, нормально

Technorati Tags:

Самый правильный скрипт очистки обменника

22.12.2009

Не секрет, что практически у каждой организации есть специальная расшаренная папка для обмена, чаще называемая «файлопомойкой».

Есть ли хороший способ уборки мусора? Что бы кто-то приезжал на мусоровозе и увозил каждый вечер кучи ненужных файлов подальше от хранилища?

Оказывается есть!

Раньше я пользовался простым, как канализационный люк, способом «убить все по расписанию в 00:00» и после пары-тройки случаев потерянных каталогов и файлов пользователи приучивались к долгосрочному хранению в обменнике с осторожностью.

На просторах хабра был выужен гораздо более гуманный и удачный способ очистки Exchange, принципы работы которого я опишу ниже:

  1. запускаясь каждый вечер скрипт перекладывает файлы и папки с датой модификации -7 дней (неделю назад) в каталог _deletion_queue_.

  2. скрипт удаляет из _deletion_queue_ каталоги и файлы старше 10 дней.

  3. можно создать каталог с именем dont_delete, который не будет очищаться совсем.

Итак, виновник поста: clear_exchange_v2s.vbs

Спасибо автору, Константину Тимохину ([email protected])

Решил попробовать эти ваши вордпрессы.

21.12.2009

Сначала у меня был очень современный (на 2005год) с развитой многомерной структурой тегов и все такое бла-бла-бла сайт http://nexus.org.ua, и был он написан на Parser 3. Затем я полностью пересел за Ruby on Rails, однако переписывать сайт не торопился. А затем желание чего либо допиливать парсером совсем завяло. Решил по-легкому попробовать себя в ЖЖ.

Пишу я себе изредка в LiveJournal, чувствую, что картинку вставить очень хочется через MarsEdit, загрузить, значится. А не получается совсем, непорядок. Думаю, а зачем мне эти все ливджорналы? Почему бы не попробовать вордпресс?

Сказано — сделано. 20 минут на поправить DNS, завести хост и хостинг в апаче, мускуль, поехали.

25 минут, и вот я уже пишу пост в MarsEdit и загружаю картинки в прекрасном оформлении Mystique

Снимок экрана 2009-12-21 в 23.08.15.png

Gitlab: continuous delivery setup for Clojure/Java with Docker

01.01.0001

Recently I was doing a https://github.com/mprokopov/it-service-sse and I though it should be a good idea to implement automatic build and deployment to docker registry container. I already have Gitlab installed and started to play around.

Long story short, here my .gitlab-ci.yml which took me a couple of days to figure out what is the “artifact” in Gitlab and how is it suppose to survive between artifact builds and docker builds.

My current setup has two stages, java build and then docker build. At the first stage we use clojure:lein-2.7.1-alpine, which is quite small, to build jar file from the sources. Then we try to assemble docker container and reuse artifact from the previous build. I was lucky enough to discover that artifact could be saved with help of “cache” option in YML file which preserves folder in “path” for the next build.

So here is the working Gitlab CI configuration which builds JAR as artifact and uploads to the Pipeline page and then creates docker container and publishes it to the internal Gitlab registry.

# Based on openjdk:8, already includes lein

# If you need to configure a database, add a `services` section here

# See https://docs.gitlab.com/ce/ci/services/postgres.html

# Make sure you configure the connection as well

#before_script:

# If you need to install any external applications, like a

# postgres client, you may want to uncomment the line below:

#- apt-get update -y

# Retrieve project dependencies

# Do this on before_script since it’ll be shared between both test and

# any production sections a user adds

#- lein deps

stages:

- jar

- docker

#test:

# script:

# If you need to run any migrations or configure the database, this

# would be the point to do it.

How to speed up ruby bundle gems fetch

01.01.0001

Short answer: use https://github.com/geminabox/geminabox for caching gems on your own host, or in your local network.

I was using bundler’s vendor/cache in docker container, but with such improvement my container size grown up to 1,2Gb very quickly.

Supply following settings to your geminabox container
RUBYGEMS_PROXY=true

https://medium.com/magnetis-backstage/how-to-cache-bundle-install-with-docker-7bed453a5800

Keycloak

01.01.0001
docker run -p 8080:8080 -e KEYCLOAK_USER=admin -e KEYCLOAK_PASSWORD=admin quay.io/keycloak/keycloak:11.0.3

Pharo testing

01.01.0001

Suprisingly, Pharo turns out to be interesting solution for managing web pages fully by the pure OO classes and objects.

Ruby tricks

01.01.0001

Use binding object to run code within other object context.
https://ruby-doc.org/core-2.2.0/Binding.html

stderr output

highlight your code and insert in presentation

https://gist.github.com/jimbojsb/1630790

Speeding up Ruby on Rails in docker

01.01.0001

Speeding up Ruby on Rails in docker

  1. Bundle package will create a cached copy, so bundler in docker will not fetch all dependencies all the time.

bundle package

  1. Create separate bundler data volume to perisist bundle between builds. Set BUNDLE_PATH to data volume. You can include this option just for development docker-compose.yml file and not to include in production.

version: “2” services: memcached: image: memcached networks: — back-tier redis: image: redis ports: [“6379”] networks: — back-tier db: image: mysql:5 volumes: — ./sql:/docker-entrypoint-initdb.d — mysql:/var/lib/mysql networks: — back-tier sse: image: mprokopov/sse build: context: sse/. command: “bundle exec rackup — host 0.0.0.0 — port 9292” environment: — RACK_ENV=production ## docker database settings in config.yml ports: — “9292:9292” links: — redis — db depends_on: — db — redis networks: — back-tier — front-tier worker: image: mprokopov/itservice_web_dev command: “bundle exec rake environment resque:work” environment: — QUEUE=* links: — db — redis depends_on: — db — redis networks: — back-tier worker-schedule: image: mprokopov/itservice_web_dev command: “bundle exec rake environment resque:scheduler” links: — db — redis depends_on: — redis networks: — back-tier search: image: mprokopov/itservice_search build: ./search volumes: — search-data:/search depends_on: — db links: — db networks: — back-tier expose: — “9306” web: ports: — “3000:3000” environment: — LETTER_OPENER=letter_opener_web — RAILS_SERVE_STATIC_FILES=true — SLACK_NOTIFICATION=false — EMAIL_NOTIFICATION=false — SLACK_WEBHOOK_CHANNEL=#events_test — STREAM_API=http://localhost:9292 depends_on: — db — redis links: — db — redis — search networks: — back-tier — front-tier volumes: — search-data:/search volumes: search-data: mysql: networks: back-tier: front-tier:

  1. Use docker-compose.override.yml for development and docker-compose.prod.yml for production builds. Create docker-compose.yml which contains common services configuration.

version: “2” services: db: environment: - MYSQL_DATABASE=itservice_development - MYSQL_USER= - MYSQL_ROOT_PASSWORD= - MYSQL_PASSWORD= sse: environment: - MYSQL_DATABASE=itservice_development - MYSQL_USER= - MYSQL_PASSWORD= - MYSQL_HOST=db - REDIS_HOST=redis - RACK_ENV=production ## docker database settings in config.yml worker: environment: - RAILS_ENV=development worker-schedule: environment: - RAILS_ENV=development search: environment: - SPHINX_ENV=development web: image: mprokopov/itservice_web_dev command: bundle exec rails s -b 0.0.0.0 -p 3000 environment: - RAILS_ENV=development - LETTER_OPENER=letter_opener_web - RAILS_SERVE_STATIC_FILES=true - SLACK_NOTIFICATION=false - EMAIL_NOTIFICATION=false - SLACK_WEBHOOK_CHANNEL=#events_test - STREAM_API=http://localhost:9292 - BUNDLE_PATH=/bundle volumes: - bundle:/bundle - ./app:/app volumes: bundle:

  1. Use docker-compose.prod.yml as docker-compose.override.yml in production, so you will save necessary keystrokes, because docker-compose will use override.yml by default.
  2. Use nginx-proxy container in production and gem unicorn/puma or thin.
     connect nginx-proxy container to frontend network like this

docker network connect itservice_front-tier nginx-proxy

It will enable to use nginx-proxy with docker-compose v2 syntax.

  1. In case you’re using CoreOS or systemd you can create container backups via custom backup service and Timer for that service.

Originally published at blog.it-premium.com.ua.

Useful Kubernetes tools and tips

01.01.0001

Unlike docker-compose sometimes kubectl provides you better tooling for docker container access.

Let me share with you my useful findings.

With port-forward, you can easily connect to pods service and debug it.

kubectl port-forward podname port

For example

kubectl port-forward sharepass-78d566f866-4dvv5 3000

kubectl port-forward sharepass-78d566f866–4dvv5 3000
Forwarding from 127.0.0.1:3000 -> 3000
Forwarding from [::1]:3000 -> 3000
Handling connection for 3000
Handling connection for 3000

This will forward port 3000 to localhost, so you can open URL http://localhost:3000 and enjoy access to your service.

Kubectx

This tool is helpful when you have a lot of k8s clusters for management.
 https://github.com/ahmetb/kubectx

Kube PS1

This tool will help you to install nice prompt with k8s cluster name and current context
 https://github.com/jonmosco/kube-ps1

Originally published at blog.it-premium.com.ua.

Why is my dev docker container so slow on macOS?

01.01.0001

TLDR: because of the networking layer and how docker volumes implemented.