Pokazywanie postów oznaczonych etykietą Hello world. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą Hello world. Pokaż wszystkie posty

19 czerwca 2016

MathJax - Hello World

Test MathJax do zapisywania formuł matematycznych.
Niech \(f\) będzie funkcją ciągła zdefiniowaną dla \( a \leq x \leq b \). Przedział \( [a, b] \) będzie podzielony \( n \) podprzedziałów o równej długości wynoszącej \( \Delta x = \frac{(b - a)}{n} \), tak że \(x_{0} = a \), a \( x_{n} = b \), będącymi końcami tych podprzedziałów i niech \( x_{1}^*, x_{2}^*,... , x_{n}^* \) będą dowolnymi punktami próbkującymi w tych przedziałach, \( x_{i}^* \in [x_{i-1}, x_{i}] \). Wówczas całkę oznaczoną z funkcji \( f \) w przedziale od \( a \) do \( b \) oznaczamy i definiujemy jako:
$$ \int_{a}^{b} f(x) dx = \lim_{n\to\infty} f(x)\sum_{i=1}^{n} f(x_{i}^*) \Delta x $$

23 lipca 2015

Budowanie aplikacji NaCl (NativeClient) w przeglądarce

Podjąłem próbę zbudowania przykładowej aplikacji NaCl w przeglądarce, ale muszę się przyznać, że odniosłem porażkę. Może w przyszłości jeszcze się tym zajmę. Do pracy zachęcił mnie filmik:


Ale w kilku miejscach jest on nieaktualny, dlatego warto równolegle śledzić odświeżoną wersję dokumentacji:
Kilka problemów, które mi się przytrafiły.
  • Przy pierwszym odpaleniu, konsola zawisała podczas ściągania pakietów. Pomogło zamknięci i ponowne odpalenie, za każdym razem kolejne pakiety się instalowały i konsola zawisała na jakimś następnym. Trzeba było kontynuować, dopóki nie pokazał się prompt bash-a.
  • Uruchomienie programu natychmiast zamykało konsolę. Rozwiązaniem okazało się wyłącznie "Native Client GDB-based debugging".
  • Po odpaleniu dema, aplikacja wyświetlała w przeglądarce status: "Status: ERROR [NaCl module load failed: Nexe crashed during startup]". Niestety tego nie udało mi się już pokonać.

25 stycznia 2014

[CERN] ROOT library - instalacja

Pierwsze podejście do biblioteki ROOT tworzonej przez CERN, z myślą o fizykach. Opowiadał o niej Vassil Vassilev na konferencji C++Now, kiedyś już podsyłałem linka: Interactive, Introspected C++ at CERN. Niestety nie znalazłem paczki, z której mógłbym sobie to zainstalować więc pozostała metoda ręcznej kompilacji. ROOT oferuje kilka ścieżek, na razie wybrałem najbardziej leniwą. Celem, jest odpalenie najprostszego przykładu. Linki:
Konfiguracja wymogła na mnie doinstalowania dwóch paczek: libxpm-dev oraz libxft-dev. Dla około 400 MB kodu, kompilacja trwała jakieś 3.5 godziny. Budowanie:
$ git clone http://root.cern.ch/git/root.git
$ cd root
$ ./configure
$ make

   ============================================================
   ===                ROOT BUILD SUCCESSFUL.                ===
   === Run 'source bin/thisroot.[c]sh' before starting ROOT ===
   ============================================================

# Następnie trzeba wykonać skrypt, który ustawi ścieżki do 
# plików wykonywalnych (PATH) i biblioteki (LD_LIBRARY_PATH)
$ source ./bin/thisroot.sh
Teraz zostajemy zachęceni do wykonania komendy "root", która uruchamia interpreter cling-a.
cling C/C++ Interpreter: type .? for help.
root [0] printf("Hello World!\n");
Hello World!
root [1] 

21 grudnia 2013

[C++14] Hello world

Kompilacja z ficzerami dla C++14. Niestety dla clang-3.4 wymagało to trochę zachodu, ale w końcu się udało. Przed kompilacją trzeba było doinstalować "libc++-dev - LLVM C++ Standard library (development files)".
sudo apt-cache search libc
sudo apt-get install libc++-dev
Następnym krokiem była edycja pliku cstdio. Jak przeczytałem pod tym linkiem, ::gets najwyraźniej zostało usunięte ze standardu, a ja przy próbie kompilacje otrzymywałem następujący error:
/usr/include/c++/v1/cstdio:156:9: error: no member named 'gets' in the global namespace
using ::gets;
      ~~^
1 error generated.
Sama poprawka jaką należy wprowadzić do /usr/include/c++/v1/cstdio, czyli otoczyć gets defajnsem:
#if !_ISOC11_SOURCE
using ::gets;
#endif
Kompilacja wygląda następująco:
$ clang++ -std=c++1y -stdlib=libc++ main.cpp
I kod, na którym testowałem
#include <iostream>

using namespace std;

auto fun() {
    return "Hello world";
}

int main() {
    cout << fun() << endl;
    return 0;
}

12 listopada 2013

include-what-you-use, podejście drugie

W sierpniu include-what-you-use doczekał się aktualizacji, a ja postanowiłem podjąć kolejną próbę kompilacji tego narzędzia. Wszystko wykonałem jak za ostatnim razem. Tym razem zaczęło działać! Dodatkowo zapisałem zmiany w llvm/tools/clang/tools/CMakeLists.txt ...
add_subdirectory(diagtool)
add_subdirectory(driver)
add_subdirectory(include-what-you-use)
if(CLANG_ENABLE_REWRITER)
  add_subdirectory(clang-format)
endif()

if(CLANG_ENABLE_ARCMT)
  add_subdirectory(libclang)
  add_subdirectory(c-index-test)
  add_subdirectory(arcmt-test)
  add_subdirectory(c-arcmt-test)
endif()
if(CLANG_ENABLE_STATIC_ANALYZER)
  add_subdirectory(clang-check)
endif()

# We support checking out the clang-tools-extra repository into the 'extra' ...
add_llvm_external_project(clang-tools-extra extra)
... oraz llvm/tools/clang/tools/Makefile
CLANG_LEVEL := ..

include $(CLANG_LEVEL)/../../Makefile.config

DIRS := include-what-you-use
PARALLEL_DIRS := driver diagtool

ifeq ($(ENABLE_CLANG_REWRITER),1)
  PARALLEL_DIRS += clang-format
endif

ifeq ($(ENABLE_CLANG_STATIC_ANALYZER), 1)
  PARALLEL_DIRS += clang-check
endif

ifeq ($(ENABLE_CLANG_ARCMT), 1)
  DIRS += libclang c-index-test c-arcmt-test
  PARALLEL_DIRS += arcmt-test
endif

# Recurse into the extra repository of tools if present.
OPTIONAL_PARALLEL_DIRS := extra

ifeq ($(BUILD_CLANG_ONLY),YES)
  DIRS := libclang c-index-test include-what-you-use
  PARALLEL_DIRS := driver
  OPTIONAL_PARALLEL_DIRS :=
endif

include $(CLANG_LEVEL)/Makefile
Poniżej plik, z którym eksperymentowałem.
#include <iostream>
#include <cstring>
#include <stdio.h>
#include <boost/optional.hpp>

using namespace std;

int main()
{
    cout << "Hello World!" << endl;
    return 0;
}
Niestety nie udało mi się zmusić CMake, aby wygenerował dla mnie odpowiedni plik Makefile z ustawionym include-what-you-use jako kompilator.
Najpierw próbowałem ustawić CMAKE_CXX_COMPILER w CMakeLists.txt (set dla CMAKE_CXX_COMPILER musi znaleźć się przed project!). Trzeba było też wyczyścić cały projekt (został kod i CMakeLists.txt) i zrestartować QtCreator-a, żeby pojawił się jakiś efekt. CMake poskarżył się tylko, że tym się nie da kompilować.
set(CMAKE_CXX_COMPILER "~/poligon/build/Debug+Asserts/bin/include-what-you-use")
project(include_test)
cmake_minimum_required(VERSION 2.8)
aux_source_directory(. SRC_LIST)
add_executable(${PROJECT_NAME} ${SRC_LIST})
Drugie podejście z linii komend, efekt niestety taki sam.
cmake CMakeLists.txt \
  -DCMAKE_CXX_COMPILER="~/poligon/build/Debug+Asserts/bin/include-what-you-use"
Skończyło się na własnej wersji Makefile.
make -k CXX=~/poligon/build/Debug+Asserts/bin/include-what-you-use
A oto wynik.
main.cpp should add these lines:

main.cpp should remove these lines:
- #include <stdio.h>  // lines 3-3
- #include <boost/optional.hpp>  // lines 4-4
- #include <cstring>  // lines 2-2

The full include-list for main.cpp:
#include <iostream>                     // for operator<<, basic_ostream, etc
---
make: *** [main] Error 1

3 listopada 2013

[C++11] Współbieżność

Pierwsze podejście do współbieżności, wprowadzonej do biblioteki standardowej wraz z nowym standardem.
#include <thread>
#include <iostream>

void hello()
{
    std::cout << "Hello World!" << std::endl;
}

int main()
{
    std::thread t(hello);
    t.join();
    return 0;
}
Było trochę kłopotów przy próbie kompilacji (gcc - 4.7.3, clang - 3.2-1). gcc potrzebuje dodatkowej flagi w postaci pthread, natomiast clang w wersji 3.2 jeszcze nie radzi sobie z wątkami, ale i na to znalazł się sposób.
Budowanie z linii poleceń:
$ g++ -pthread --std=c++11 main.cpp
$ clang++ -pthread --std=c++11 \
     -D__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 \
     -D__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 \
     -D__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 \
     -D__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8 main.cpp
Poniżej ustawienie dla CMakeList.txt (cmake):
project(thread_hello)
cmake_minimum_required(VERSION 2.8)
aux_source_directory(. SRC_LIST)
add_executable(${PROJECT_NAME} ${SRC_LIST})
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread")

29 kwietnia 2013

Firefox addon - run calc.exe

Przydatna rzecz - wtyczka dla Firefox-a, choć praca nad nią była dość niewygodna. W planach miałem, zbudowanie czegoś podobnego do wtyczki RefControl, która kontroluje co jest wysyłane jako HTTP Referer do strony. Na razie jednak, zacząłem od czegoś prostszego. Do zbudowania wtyczki, posłużył mi Add-on builder:
Poniższy przykład nie robi nic użytecznego. Dopisuje do każdej strony "Hello world" (na jej początku), zapisuje w konsoli vendor-a, a po naciśnięciu ikony widgetu otwiera w nowej zakładce stronkę dupa.pl i uruchamia kalkulator (to jest wersja pod Windows). Poniżej przydatne linki, z dokumentacją do wykorzystanych bibliotek:
Dość często miała problemy ze zdiagnozowanie przyczyny, dlaczego wtyczka się nie "kompiluje". A gdy "kompilacja" już się powiodła, często znikała ikona mojego widget-u. Rozwiązaniem drugiego problemu, było częste zmienianie jego identyfikatora. Bez wątpienia, potrzebna jest pewna wprawa, żeby pisanie następnych mogło odbywać się sprawniej.
// The main module of the niegodziwyberu Add-on.

// Modules needed are `require`d, similar to CommonJS modules.
// In this case, creating a Widget that opens a new tab needs both the
// `widget` and the `tabs` modules.
var Widget = require("widget").Widget;
var tabs = require('tabs');
var { Cc, Ci } = require('chrome');

exports.main = function() {
    // https://addons.mozilla.org/en-US/developers/docs/sdk/latest/modules/sdk/system.html#vendor
    var system = require("sdk/system");
    console.log("Console print, vendor = " + system.vendor);

    // https://addons.mozilla.org/en-US/developers/docs/sdk/latest/dev-guide/tutorials/modifying-web-pages-url.html
    // Import the page-mod API
    var pageMod = require("sdk/page-mod");

    // Create a page mod
    // It will run a script whenever a ".pl" URL is loaded
    // The script replaces the page contents with a message
    pageMod.PageMod({
        include: "*.pl",
        contentScript: 'content.document.body.innerHTML = ' +
                       '"<h1>Hello World</h1>" + content.document.body.innerHTML;'
    });

    // https://developer.mozilla.org/en-US/docs/XPCOM_Interface_Reference/nsIProcess#See_also
    // ZACZEŁO DZIAŁAĆ, PO PRZENIESIENIU TUTAJ
    // create an nsIFile for the executable
    var file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);

    // create an nsIProcess
    var process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);

    // https://addons.mozilla.org/en-US/developers/docs/sdk/latest/modules/sdk/widget.html
    new Widget({
        // Mandatory string used to identify your widget in order to
        // save its location when the user moves it in the browser.
        // This string has to be unique and must not be changed over time.
        // DA SIĘ COŚ ZROBIĆ, ŻEBY TEGO CAŁY CZAS NIE POPRAWIAĆ?
        id: "niegodziwier-widget-7",

        // A required string description of the widget used for
        // accessibility, title bars, and error reporting.
        label: "NiegodziwyBeru Widget",

        // An optional string URL to content to load into the widget.
        // This can be local content or remote content, an image or
        // web content. Widgets must have either the content property
        // or the contentURL property set.
        //
        // If the content is an image, it is automatically scaled to
        // be 16x16 pixels.
        contentURL: "http://www.mozilla.org/favicon.ico",

        // Add a function to trigger when the Widget is clicked.
        onClick: function(event) {
            // Open a new tab in the currently active window.
            tabs.open("http://dupa.pl");

            // Open calc application
            file.initWithPath("c:\\windows\\system32\\calc.exe");
            process.init(file);
            var args = [];
            process.run(false, args, args.length);
        }
    });

};

1 listopada 2012

Kompilacja kodu assemblera i łączenie z g++

Jak zmusić kompilator do wygenerowania kodu assemblera, by go zmodyfikować i ponownie użycia do kompilacji?

Magiczny ciąg komend:
Po modyfikacji kodu assemblera, generujemy object-file, z którego ponownie skorzysta g++ (linijka 2).
g++ -S main.cpp 
as main.s -o main.o
g++ main.o -o main
Nasz kod, który chcemy zobaczyć w assemblerze:
#include <stdio.h>
int main()
{
    printf("Hello world\n");
    return 0;
}
Nasza modyfikacja w kodzie assemblerze (main.s):
.file    "main.cpp"
    .section    .rodata
.LC0:
    .string    "Hello Kitty ;)"
    .text
    .globl    main
    .type    main, @function
main:
.LFB0:
    .cfi_startproc
    pushl    %ebp
    .cfi_def_cfa_offset 8
    .cfi_offset 5, -8
    movl    %esp, %ebp
    .cfi_def_cfa_register 5
    andl    $-16, %esp
    subl    $16, %esp
    movl    $.LC0, (%esp)
    call    puts
    movl    $0, %eax
    leave
    .cfi_restore 5
    .cfi_def_cfa 4, 4
    ret
    .cfi_endproc
.LFE0:
    .size    main, .-main
    .ident    "GCC: (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3"
    .section    .note.GNU-stack,"",@progbits
Wynik:
Hello Kitty ;)

28 września 2012

Zasada Pareto

http://pl.wikipedia.org/wiki/Zasada_Pareto



Drugą cześć zasady sobie dopowiedziałem. A tymczasem Hello Google Chart Tools.