[Git][noosfero/noosfero][master] 3 commits: scheduler: defer off-request work

Bráulio Bhavamitra braulio at eita.org.br
Tue Jul 21 18:58:54 BRT 2015


I've clicked merge accidentally! I have pushed -f the original master
branch.

On Tue, Jul 21, 2015 at 6:57 PM, Bráulio Bhavamitra <gitlab at gitlab.com>
wrote:

>  Bráulio Bhavamitra pushed to branch master at Noosfero / noosfero
> <https://gitlab.com/noosfero/noosfero> Commits:
>
>    - *cd9c0b07
>    <https://gitlab.com/noosfero/noosfero/commit/cd9c0b0740f69da6696731a5ab38d61a9e09b514>*
>    by Braulio Bhavamitra *at 2015-07-21T18:54:38Z*
>
>    scheduler: defer off-request work
>
>     - *4aee1457
>    <https://gitlab.com/noosfero/noosfero/commit/4aee14572c1191fa09a890f0550756603d9cbb92>*
>    by Braulio Bhavamitra *at 2015-07-21T18:54:59Z*
>
>    Add analytics plugin
>
>     - *71f53f04
>    <https://gitlab.com/noosfero/noosfero/commit/71f53f042084b44ff8848630df439630c282e0cc>*
>    by Bráulio Bhavamitra *at 2015-07-21T21:57:34Z*
>
>    Merge branch 'analytics-plugin' into 'master'
>
>    Analytics plugin
>
>    See merge request !632
>
>
> 15 changed files:
>
>    -  + config/initializers/unicorn.rb  <#14eb29f7bea8475e_diff-0>
>    -  + lib/noosfero/scheduler/defer.rb  <#14eb29f7bea8475e_diff-1>
>    -  +
>    plugins/analytics/controllers/profile/analytics_plugin/time_on_page_controller.rb
>     <#14eb29f7bea8475e_diff-2>
>    -  +
>    plugins/analytics/db/migrate/20150715001149_init_analytics_plugin.rb
>    <#14eb29f7bea8475e_diff-3>
>    -  + plugins/analytics/lib/analytics_plugin.rb
>    <#14eb29f7bea8475e_diff-4>
>    -  + plugins/analytics/lib/analytics_plugin/base.rb
>    <#14eb29f7bea8475e_diff-5>
>    -  + plugins/analytics/lib/ext/profile.rb  <#14eb29f7bea8475e_diff-6>
>    -  + plugins/analytics/locales/en.yml  <#14eb29f7bea8475e_diff-7>
>    -  + plugins/analytics/locales/pt.yml  <#14eb29f7bea8475e_diff-8>
>    -  + plugins/analytics/models/analytics_plugin/page_view.rb
>    <#14eb29f7bea8475e_diff-9>
>    -  + plugins/analytics/models/analytics_plugin/visit.rb
>    <#14eb29f7bea8475e_diff-10>
>    -  + plugins/analytics/po/pt/analytics.po  <#14eb29f7bea8475e_diff-11>
>    -  + plugins/analytics/public/javascripts/analytics.js
>    <#14eb29f7bea8475e_diff-12>
>    -  +
>    plugins/analytics/test/functional/content_viewer_controller_test.rb
>    <#14eb29f7bea8475e_diff-13>
>    -  + plugins/analytics/views/analytics_plugin/_body_ending.html.slim
>    <#14eb29f7bea8475e_diff-14>
>
> Changes:
>  * config/initializers/unicorn.rb *
> <https://gitlab.com/noosfero/noosfero/compare/c2f481ce9fe658a3d62fc8db6fd83ac9272366f8...71f53f042084b44ff8848630df439630c282e0cc#diff-0>
> ------------------------------
>
> --- /dev/null+++ b/config/initializers/unicorn.rb@@ -0,0 +1,8 @@+require_dependency 'scheduler/defer'
> +
> +if defined? Unicorn
> +  ObjectSpace.each_object Unicorn::HttpServer do |s|
> +    s.extend Scheduler::Defer::Unicorn
> +  end
> +end
> +
>
>
>   * lib/noosfero/scheduler/defer.rb *
> <https://gitlab.com/noosfero/noosfero/compare/c2f481ce9fe658a3d62fc8db6fd83ac9272366f8...71f53f042084b44ff8848630df439630c282e0cc#diff-1>
> ------------------------------
>
> --- /dev/null+++ b/lib/noosfero/scheduler/defer.rb@@ -0,0 +1,95 @@+# based on https://github.com/discourse/discourse/blob/master/lib/scheduler/defer.rb
> +
> +module Scheduler
> +  module Deferrable
> +    def initialize
> +      # FIXME: do some other way when not using Unicorn
> +      @async = (not Rails.env.test?) and defined? Unicorn
> +      @queue = Queue.new
> +      @mutex = Mutex.new
> +      @paused = false
> +      @thread = nil
> +    end
> +
> +    def pause
> +      stop!
> +      @paused = true
> +    end
> +
> +    def resume
> +      @paused = false
> +    end
> +
> +    # for test
> +    def async= val
> +      @async = val
> +    end
> +
> +    def later desc = nil, &blk
> +      if @async
> +        start_thread unless (@thread && @thread.alive?) || @paused
> +        @queue << [blk, desc]
> +      else
> +        blk.call
> +      end
> +    end
> +
> +    def stop!
> +      @thread.kill if @thread and @thread.alive?
> +      @thread = nil
> +    end
> +
> +    # test only
> +    def stopped?
> +      !(@thread and @thread.alive?)
> +    end
> +
> +    def do_all_work
> +      while !@queue.empty?
> +        do_work _non_block=true
> +      end
> +    end
> +
> +    private
> +
> +    def start_thread
> +      @mutex.synchronize do
> +        return if @thread && @thread.alive?
> +        @thread = Thread.new do
> +          while true
> +            do_work
> +          end
> +        end
> +        @thread.priority = -2
> +      end
> +    end
> +
> +    # using non_block to match Ruby #deq
> +    def do_work non_block=false
> +      job, desc = @queue.deq non_block
> +      begin
> +        job.call
> +      rescue => ex
> +        ExceptionNotifier.notify_exception ex, message: "Running deferred code '#{desc}'"
> +      end
> +    rescue => ex
> +      ExceptionNotifier.notify_exception ex, message: "Processing deferred code queue"
> +    end
> +  end
> +
> +  class Defer
> +
> +    module Unicorn
> +      def process_client client
> +        ::Scheduler::Defer.pause
> +        super client
> +        ::Scheduler::Defer.do_all_work
> +        ::Scheduler::Defer.resume
> +      end
> +    end
> +
> +    extend Deferrable
> +    initialize
> +  end
> +
> +end
>
>
>   *
> plugins/analytics/controllers/profile/analytics_plugin/time_on_page_controller.rb
> *
> <https://gitlab.com/noosfero/noosfero/compare/c2f481ce9fe658a3d62fc8db6fd83ac9272366f8...71f53f042084b44ff8848630df439630c282e0cc#diff-2>
> ------------------------------
>
> --- /dev/null+++ b/plugins/analytics/controllers/profile/analytics_plugin/time_on_page_controller.rb@@ -0,0 +1,30 @@+class AnalyticsPlugin::TimeOnPageController < ProfileController
> +
> +  before_filter :skip_page_view
> +
> +  def page_load
> +    # to avoid concurrency problems with the original deferred request, also defer this
> +    Scheduler::Defer.later do
> +      page_view = profile.page_views.where(request_id: params[:id]).first
> +      page_view.request = request
> +      page_view.page_load!
> +    end
> +
> +    render nothing: true
> +  end
> +
> +  def report
> +    page_view = profile.page_views.where(request_id: params[:id]).first
> +    page_view.request = request
> +    page_view.increase_time_on_page!
> +
> +    render nothing: true
> +  end
> +
> +  protected
> +
> +  def skip_page_view
> +    @analytics_skip_page_view = true
> +  end
> +
> +end
>
>
>   * plugins/analytics/db/migrate/20150715001149_init_analytics_plugin.rb *
> <https://gitlab.com/noosfero/noosfero/compare/c2f481ce9fe658a3d62fc8db6fd83ac9272366f8...71f53f042084b44ff8848630df439630c282e0cc#diff-3>
> ------------------------------
>
> --- /dev/null+++ b/plugins/analytics/db/migrate/20150715001149_init_analytics_plugin.rb@@ -0,0 +1,47 @@+class InitAnalyticsPlugin < ActiveRecord::Migration
> +
> +  def up
> +    create_table :analytics_plugin_visits do |t|
> +      t.integer :profile_id
> +    end
> +
> +    create_table :analytics_plugin_page_views do |t|
> +      t.string :type
> +      t.integer :visit_id
> +      t.integer :track_id
> +      t.integer :referer_page_view_id
> +      t.string :request_id
> +
> +      t.integer :user_id
> +      t.integer :session_id
> +      t.integer :profile_id
> +
> +      t.text :url
> +      t.text :referer_url
> +
> +      t.text :user_agent
> +      t.string :remote_ip
> +
> +      t.datetime :request_started_at
> +      t.datetime :request_finished_at
> +      t.datetime :page_loaded_at
> +      t.integer :time_on_page, default: 0
> +
> +      t.text :data, default: {}.to_yaml
> +    end
> +    add_index :analytics_plugin_page_views, :request_id
> +    add_index :analytics_plugin_page_views, :referer_page_view_id
> +
> +    add_index :analytics_plugin_page_views, :user_id
> +    add_index :analytics_plugin_page_views, :session_id
> +    add_index :analytics_plugin_page_views, :profile_id
> +    add_index :analytics_plugin_page_views, :url
> +    add_index :analytics_plugin_page_views, [:user_id, :session_id, :profile_id, :url], name: :analytics_plugin_referer_find
> +  end
> +
> +  def down
> +    drop_table :analytics_plugin_visits
> +    drop_table :analytics_plugin_page_views
> +  end
> +
> +end
>
>
>   * plugins/analytics/lib/analytics_plugin.rb *
> <https://gitlab.com/noosfero/noosfero/compare/c2f481ce9fe658a3d62fc8db6fd83ac9272366f8...71f53f042084b44ff8848630df439630c282e0cc#diff-4>
> ------------------------------
>
> --- /dev/null+++ b/plugins/analytics/lib/analytics_plugin.rb@@ -0,0 +1,15 @@+module AnalyticsPlugin
> +
> +  TimeOnPageUpdateInterval = 2.minutes * 1000
> +
> +  extend Noosfero::Plugin::ParentMethods
> +
> +  def self.plugin_name
> +    I18n.t'analytics_plugin.lib.plugin.name'
> +  end
> +
> +  def self.plugin_description
> +    I18n.t'analytics_plugin.lib.plugin.description'
> +  end
> +
> +end
>
>
>   * plugins/analytics/lib/analytics_plugin/base.rb *
> <https://gitlab.com/noosfero/noosfero/compare/c2f481ce9fe658a3d62fc8db6fd83ac9272366f8...71f53f042084b44ff8848630df439630c282e0cc#diff-5>
> ------------------------------
>
> --- /dev/null+++ b/plugins/analytics/lib/analytics_plugin/base.rb@@ -0,0 +1,43 @@+
> +class AnalyticsPlugin::Base < Noosfero::Plugin
> +
> +  def body_ending
> +    return unless profile and profile.analytics_enabled?
> +    lambda do
> +      render 'analytics_plugin/body_ending'
> +    end
> +  end
> +
> +  def js_files
> +    ['analytics'].map{ |j| "javascripts/#{j}" }
> +  end
> +
> +  def application_controller_filters
> +    [{
> +      type: 'around_filter', options: {}, block: -> &block do
> +        request_started_at = Time.now
> +        block.call
> +        request_finished_at = Time.now
> +
> +        return if @analytics_skip_page_view
> +        return unless profile and profile.analytics_enabled?
> +
> +        Scheduler::Defer.later 'analytics: register page view' do
> +          page_view = profile.page_views.build request: request, profile_id: profile,
> +            request_started_at: request_started_at, request_finished_at: request_finished_at
> +
> +          unless profile.analytics_anonymous?
> +            # FIXME: use session.id in Rails 4
> +            session_id = Marshal.load(Base64.decode64 request['_session_id'])['session_id'] rescue nil
> +            #session_id = request.session_options[:id]
> +            page_view.user = user
> +            page_view.session_id = session_id
> +          end
> +
> +          page_view.save!
> +        end
> +      end,
> +    }]
> +  end
> +
> +end
>
>
>   * plugins/analytics/lib/ext/profile.rb *
> <https://gitlab.com/noosfero/noosfero/compare/c2f481ce9fe658a3d62fc8db6fd83ac9272366f8...71f53f042084b44ff8848630df439630c282e0cc#diff-6>
> ------------------------------
>
> --- /dev/null+++ b/plugins/analytics/lib/ext/profile.rb@@ -0,0 +1,30 @@+require_dependency 'profile'
> +require_dependency 'community'
> +
> +([Profile] + Profile.descendants).each do |subclass|
> +subclass.class_eval do
> +
> +  has_many :visits, foreign_key: :profile_id, class_name: 'AnalyticsPlugin::Visit'
> +  has_many :page_views, foreign_key: :profile_id, class_name: 'AnalyticsPlugin::PageView'
> +
> +end
> +end
> +
> +class Profile
> +
> +  def analytics_settings attrs = {}
> +    @analytics_settings ||= Noosfero::Plugin::Settings.new self, AnalyticsPlugin, attrs
> +    attrs.each{ |a, v| @analytics_settings.send "#{a}=", v }
> +    @analytics_settings
> +  end
> +  alias_method :analytics_settings=, :analytics_settings
> +
> +  def analytics_enabled?
> +    self.analytics_settings.enabled
> +  end
> +
> +  def analytics_anonymous?
> +    self.analytics_settings.anonymous
> +  end
> +
> +end
>
>
>   * plugins/analytics/locales/en.yml *
> <https://gitlab.com/noosfero/noosfero/compare/c2f481ce9fe658a3d62fc8db6fd83ac9272366f8...71f53f042084b44ff8848630df439630c282e0cc#diff-7>
> ------------------------------
>
> --- /dev/null+++ b/plugins/analytics/locales/en.yml@@ -0,0 +1,11 @@+
> +en: &en
> +  analytics_plugin:
> +    lib:
> +      plugin:
> +        name: 'Access tracking'
> +        description: 'Register the access of selected profiles'
> +
> +en-US:
> +  <<: *en
> +
>
>
>   * plugins/analytics/locales/pt.yml *
> <https://gitlab.com/noosfero/noosfero/compare/c2f481ce9fe658a3d62fc8db6fd83ac9272366f8...71f53f042084b44ff8848630df439630c282e0cc#diff-8>
> ------------------------------
>
> --- /dev/null+++ b/plugins/analytics/locales/pt.yml@@ -0,0 +1,10 @@+
> +pt: &pt
> +  analytics_plugin:
> +    lib:
> +      plugin:
> +        name: 'Rastreio de accesso'
> +        description: 'Registra o acesso de perfis selecionados'
> +
> +pt-BR:
> +  <<: *pt
>
>
>   * plugins/analytics/models/analytics_plugin/page_view.rb *
> <https://gitlab.com/noosfero/noosfero/compare/c2f481ce9fe658a3d62fc8db6fd83ac9272366f8...71f53f042084b44ff8848630df439630c282e0cc#diff-9>
> ------------------------------
>
> --- /dev/null+++ b/plugins/analytics/models/analytics_plugin/page_view.rb@@ -0,0 +1,67 @@+class AnalyticsPlugin::PageView < ActiveRecord::Base
> +
> +  serialize :data
> +
> +  attr_accessible *self.column_names
> +  attr_accessible :user, :profile
> +
> +  attr_accessor :request
> +  attr_accessible :request
> +
> +  acts_as_having_settings field: :options
> +
> +  belongs_to :visit, class_name: 'AnalyticsPlugin::Visit'
> +  belongs_to :referer_page_view, class_name: 'AnalyticsPlugin::PageView'
> +
> +  belongs_to :user, class_name: 'Person'
> +  belongs_to :session, primary_key: :session_id, foreign_key: :session_id, class_name: 'Session'
> +  belongs_to :profile
> +
> +  validates_presence_of :visit
> +  validates_presence_of :request, on: :create
> +  validates_presence_of :url
> +
> +  before_validation :extract_request_data, on: :create
> +  before_validation :fill_referer_page_view, on: :create
> +  before_validation :fill_visit, on: :create
> +
> +  def request_duration
> +    self.request_finished_at - self.request_started_at
> +  end
> +
> +  def page_load!
> +    self.page_loaded_at = Time.now
> +    self.update_column :page_loaded_at, self.page_loaded_at
> +  end
> +
> +  def increase_time_on_page!
> +    now = Time.now
> +    initial_time = self.page_loaded_at || self.request_finished_at
> +    return unless now > initial_time
> +
> +    self.time_on_page = now - initial_time
> +    self.update_column :time_on_page, self.time_on_page
> +  end
> +
> +  protected
> +
> +  def extract_request_data
> +    self.url = self.request.url.sub /\/+$/, ''
> +    self.referer_url = self.request.referer
> +    self.user_agent = self.request.headers['User-Agent']
> +    self.request_id = self.request.env['action_dispatch.request_id']
> +    self.remote_ip = self.request.remote_ip
> +  end
> +
> +  def fill_referer_page_view
> +    self.referer_page_view = AnalyticsPlugin::PageView.order('request_started_at DESC').
> +      where(url: self.referer_url, session_id: self.session_id, user_id: self.user_id, profile_id: self.profile_id).first if self.referer_url.present?
> +  end
> +
> +  def fill_visit
> +    self.visit = self.referer_page_view.visit if self.referer_page_view
> +    self.visit ||= AnalyticsPlugin::Visit.new profile: profile
> +  end
> +
> +end
> +
>
>
>   * plugins/analytics/models/analytics_plugin/visit.rb *
> <https://gitlab.com/noosfero/noosfero/compare/c2f481ce9fe658a3d62fc8db6fd83ac9272366f8...71f53f042084b44ff8848630df439630c282e0cc#diff-10>
> ------------------------------
>
> --- /dev/null+++ b/plugins/analytics/models/analytics_plugin/visit.rb@@ -0,0 +1,11 @@+class AnalyticsPlugin::Visit < ActiveRecord::Base
> +
> +  attr_accessible *self.column_names
> +  attr_accessible :profile
> +
> +  default_scope -> { includes :page_views }
> +
> +  belongs_to :profile
> +  has_many :page_views, class_name: 'AnalyticsPlugin::PageView', dependent: :destroy
> +
> +end
>
>
>   * plugins/analytics/po/pt/analytics.po *
> <https://gitlab.com/noosfero/noosfero/compare/c2f481ce9fe658a3d62fc8db6fd83ac9272366f8...71f53f042084b44ff8848630df439630c282e0cc#diff-11>
> ------------------------------
>
> --- /dev/null+++ b/plugins/analytics/po/pt/analytics.po@@ -0,0 +1,29 @@+# translation of analytic.po to portuguese
> +# Krishnamurti Lelis Lima Vieira Nunes <krishna at colivre.coop.br>, 2007.
> +# noosfero - Brazilian Portuguese translation
> +# Copyright (C) 2007,
> +# Forum Brasileiro de Economia Solidaria <http://www.fbes.org.br/>
> +# Copyright (C) 2007,
> +# Ynternet.org Foundation <http://www.ynternet.org/>
> +# This file is distributed under the same license as noosfero itself.
> +# Joenio Costa <joenio at colivre.coop.br>, 2008.
> +#
> +#
> +msgid ""
> +msgstr ""
> +"Project-Id-Version: 1.0-690-gcb6e853\n"
> +"POT-Creation-Date: 2015-03-05 12:10-0300\n"
> +"PO-Revision-Date: 2015-07-21 09:23-0300\n"
> +"Last-Translator: Michal Čihař <michal at cihar.com>\n"
> +"Language-Team: Portuguese <https://hosted.weblate.org/projects/noosfero"
> +"/plugin-solr/pt/>\n"
> +"Language: pt\n"
> +"MIME-Version: 1.0\n"
> +"Content-Type: text/plain; charset=UTF-8\n"
> +"Content-Transfer-Encoding: 8bit\n"
> +"Plural-Forms: nplurals=2; plural=n != 1;\n"
> +"X-Generator: Weblate 2.3-dev\n"
> +
> +msgid "Select the set of communities and users to track"
> +msgstr "Seleciona o conjunto de comunidades e usuários para rastrear"
> +
>
>
>   * plugins/analytics/public/javascripts/analytics.js *
> <https://gitlab.com/noosfero/noosfero/compare/c2f481ce9fe658a3d62fc8db6fd83ac9272366f8...71f53f042084b44ff8848630df439630c282e0cc#diff-12>
> ------------------------------
>
> --- /dev/null+++ b/plugins/analytics/public/javascripts/analytics.js@@ -0,0 +1,39 @@+analytics = {
> +  requestId: '',
> +
> +  timeOnPage: {
> +    updateInterval: 0,
> +    baseUrl: '',
> +
> +    report: function() {
> +      $.ajax(analytics.timeOnPage.baseUrl+'/report', {
> +        type: 'POST', data: {id: analytics.requestId},
> +        success: function(data) {
> +
> +          analytics.timeOnPage.poll()
> +        },
> +      })
> +    },
> +
> +    poll: function() {
> +      if (analytics.timeOnPage.updateInterval)
> +        setTimeout(analytics.timeOnPage.report, analytics.timeOnPage.updateInterval)
> +    },
> +  },
> +
> +  init: function() {
> +    analytics.timeOnPage.poll()
> +  },
> +
> +  pageLoad: function() {
> +    $.ajax(analytics.timeOnPage.baseUrl+'/page_load', {
> +      type: 'POST', data: {id: analytics.requestId},
> +      success: function(data) {
> +      },
> +    });
> +  }
> +
> +};
> +
> +$(document).ready(analytics.pageLoad)
> +
>
>
>   * plugins/analytics/test/functional/content_viewer_controller_test.rb *
> <https://gitlab.com/noosfero/noosfero/compare/c2f481ce9fe658a3d62fc8db6fd83ac9272366f8...71f53f042084b44ff8848630df439630c282e0cc#diff-13>
> ------------------------------
>
> --- /dev/null+++ b/plugins/analytics/test/functional/content_viewer_controller_test.rb@@ -0,0 +1,48 @@+require 'test_helper'
> +require 'content_viewer_controller'
> +
> +class ContentViewerControllerTest < ActionController::TestCase
> +
> +  def setup
> +    @controller = ContentViewerController.new
> +    @request    = ActionController::TestRequest.new
> +    @response   = ActionController::TestResponse.new
> +
> +    @environment = Environment.default
> +    @environment.enabled_plugins += ['AnalyticsPlugin']
> +    @environment.save!
> +
> +    @user = create_user('testinguser').person
> +    login_as @user.identifier
> +
> +    @community = build Community, identifier: 'testcomm', name: 'test'
> +    @community.analytics_settings.enabled = true
> +    @community.analytics_settings.anonymous = false
> +    @community.save!
> +    @community.add_member @user
> +  end
> +
> +  should 'register page view correctly' do
> +    @request.env['HTTP_REFERER'] = 'http://google.com'
> +    first_url = 'http://test.host'
> +    get :view_page, profile: @community.identifier, page: []
> +    assert_equal 1, @community.page_views.count
> +    assert_equal 1, @community.visits.count
> +
> +    first_page_view = @community.page_views.order(:id).first
> +    assert_equal @request.referer, first_page_view.referer_url
> +
> +    @request.env['HTTP_REFERER'] = first_url
> +    get :view_page, profile: @community.identifier, page: @community.articles.last.path.split('/')
> +    assert_equal 2, @community.page_views.count
> +    assert_equal 1, @community.visits.count
> +
> +    second_page_view = @community.page_views.order(:id).last
> +    assert_equal first_page_view, second_page_view.referer_page_view
> +
> +    assert_equal @user, second_page_view.user
> +
> +    assert second_page_view.request_duration > 0 and second_page_view.request_duration < 1
> +  end
> +
> +end
>
>
>   * plugins/analytics/views/analytics_plugin/_body_ending.html.slim *
> <https://gitlab.com/noosfero/noosfero/compare/c2f481ce9fe658a3d62fc8db6fd83ac9272366f8...71f53f042084b44ff8848630df439630c282e0cc#diff-14>
> ------------------------------
>
> --- /dev/null+++ b/plugins/analytics/views/analytics_plugin/_body_ending.html.slim@@ -0,0 +1,6 @@+javascript:
> +  analytics.timeOnPage.baseUrl = #{url_for(controller: 'analytics_plugin/time_on_page').to_json}
> +  analytics.timeOnPage.updateInterval = #{AnalyticsPlugin::TimeOnPageUpdateInterval.to_json}
> +  analytics.requestId = #{request.env['action_dispatch.request_id'].to_json}
> +  analytics.init()
> +
>
>
>> View it on GitLab
> <https://gitlab.com/noosfero/noosfero/compare/c2f481ce9fe658a3d62fc8db6fd83ac9272366f8...71f53f042084b44ff8848630df439630c282e0cc>
>
> _______________________________________________
> Noosfero-dev mailing list
> Noosfero-dev at listas.softwarelivre.org
> http://listas.softwarelivre.org/cgi-bin/mailman/listinfo/noosfero-dev
>
>


-- 
"Lute pela sua ideologia. Seja um com sua ideologia. Viva pela sua
ideologia. Morra por sua ideologia" P.R. Sarkar

EITA - Educação, Informação e Tecnologias para Autogestão
http://cirandas.net/brauliobo
http://eita.org.br

"Paramapurusha é meu pai e Parama Prakriti é minha mãe. O universo é meu
lar e todos nós somos cidadãos deste cosmo. Este universo é a imaginação da
Mente Macrocósmica, e todas as entidades estão sendo criadas, preservadas e
destruídas nas fases de extroversão e introversão do fluxo imaginativo
cósmico. No âmbito pessoal, quando uma pessoa imagina algo em sua mente,
naquele momento, essa pessoa é a única proprietária daquilo que ela
imagina, e ninguém mais. Quando um ser humano criado mentalmente caminha
por um milharal também imaginado, a pessoa imaginada não é a propriedade
desse milharal, pois ele pertence ao indivíduo que o está imaginando. Este
universo foi criado na imaginação de Brahma, a Entidade Suprema, por isso
a propriedade deste universo é de Brahma, e não dos microcosmos que também
foram criados pela imaginação de Brahma. Nenhuma propriedade deste mundo,
mutável ou imutável, pertence a um indivíduo em particular; tudo é o
patrimônio comum de todos."
Restante do texto em
http://cirandas.net/brauliobo/blog/a-problematica-de-hoje-em-dia
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://listas.softwarelivre.org/pipermail/noosfero-dev/attachments/20150721/43d368dd/attachment-0001.html>


More information about the Noosfero-dev mailing list