OpenNH

日常のひとこま(自分用のメモとかあれこれ)

tensorflow2.0 c++ apiをcmakeで利用する(Ubuntu18.04)

1. 目次

  • 1. 目次
  • 2. はじめに
  • 3. 環境
  • 4. bazel version 0.26.1 のインストール
  • 5. tensorflow 2.0.0 をソースからビルド
  • 6. パスを通していく
    • 6.1. 共有ライブラリのコピー
    • 6.2. ヘッダファイルの抽出
    • 6.3. FindTensorflow.cmakeの作成
  • 7. サンプルをcmakeで動かす
    • 7.1. モデルのダウンロード
    • 7.2. 下準備
    • 7.3. サンプルの実行


2. はじめに

tensorflowをpythonで利用するのは情報もたくさんあるしpipで簡単に導入できるのに、C++で利用したいとなったときに全然まとまった記事がなかったので苦労しました。知識ある人はササッとできてしまうのかもしれませんが、私みたいな素人がtensorflow c++ apiを導入しようとすると一苦労です。というか実際なかなかうまく入らずめちゃ大変でした。

Ubuntu18.04でtensorflow2.0 c++ apiを導入するためのメモを残しておきます。
新たにtensorflowをc++で利用したいって人の助けになればと思います。


3. 環境

OS Ubuntu 18.04
GPU Geforce GTX 960
CUDA ver.10.2
cuDNN ver.7.6
bazel ver. 0.26.1
tensorflow ver. 2.0.0


続きを読む

Redmineからslackにメンション通知する機能追加してみた

1. 目次

  • 1. 目次
  • 2. はじめに
  • 3. 対応できていること
    • 3.1. 注意点
  • 4. redmine-slackプラグインのインストール
    • 4.1. インストール方法
    • 4.2. Redmine起動でエラーが出た場合
      • 4.2.1. エラー内容の確認
      • 4.2.2. 解決方法
  • 5. メンション拡張機能の追加
    • 5.1. Slack APIトークンの取得
    • 5.2. Gemのインストール
    • 5.3. ソースの修正
  • 6. おわりに
    • 6.1. 参考記事


2. はじめに

Redmineからslackへの通知をしてくれる便利なプラグイン、”redmine-slack”の機能を拡張してみました。

@sciyoshiさんによって提供されているプラグインはとても便利です。ですが、基本的にslackはチームで利用しているので、誰あてのチケット通知なのかわからないと全通知を見なくはならなくなります。それは、めんどくさいし時間のむだ。

つまり、Redmineで作成したチケットの担当者にメンションで通知ができたらもっと便利になる!
ということでソースを修正してみました。


3. 対応できていること

* 以下にでてくる<#channel>は利用者がredmineの通知を登録しているslackのチャンネルのことです。

  • チケット作成通知

    • 担当者がいる場合、担当者に対してメンション付きで<#channel>に通知
    • 担当者がいない場合、メンションなしで<#channel>に通知
  • チケット更新通知

    • 担当者と更新者が異なる場合、担当者に対してメンション付きで<#channel>に通知
    • 担当者と更新者が同一の場合、メンションなしで<#channel>に通知
  • wiki作成・更新通知

    • 作成および更新時に、メンションなしで<#channel>に通知

イメージとしては、以下の感じです。

f:id:FounderLeis:20200106202226p:plain

3.1. 注意点

  • slackのユーザー名(フルネーム)とredmineのユーザー名(ログインID)を統一して利用してください。
    例)
    • slack user ID : asuka.saito
    • redmine login ID : asuka.saito

理由としては、redmineのユーザー名(ログインID)を利用して、slackのユーザー名(フルネーム)に紐づくslackのユーザーIDを取得しているためです。


続きを読む

Ubuntu18.04でのメインエディタをVSCodeに変えてみた

1. 目次

  • 1. 目次
  • 2. はじめに
  • 3. VScodeのインストール
  • 4. VScodeのアンインストール
  • 5. 追加した拡張機能
  • 6. ローカルファイルから拡張機能の追加
  • 7. 参考サイト

徹底解説Visual Studio Code

徹底解説Visual Studio Code


2. はじめに

Atomを使ってきたけど、markdownからhtmlに変換がうまくできなかったり、コードを書く際に予測補完が微妙に使いづらい部分があったのでメインのエディタを変えようと思い、VScodeを導入してみました。VScodeのインストールから追加した拡張機能などをメモとして残しておきます。

環境: Ubuntu18.04


3. VScodeのインストール

VScode (Visual Studio Code) は、マイクロソフトにより開発されたソースコードエディタで、WindowsLinuxmacOS上で動作します。これまで利用してきたAtom同様、拡張機能を追加することで使いやすくカスタマイズすることができます。ちょっと使ってみてAtomより全然使いやすいですね〜。

まず、下記リンクからUbuntu用の.debファイルをダウンロードします。

ダウンロード先(default):
~/Download/code_1.41.1-1576681836_amd64.deb

ターミナルからaptでインストール

$ cd ~/Download

$ sudo apt install ./code_1.41.1-1576681836_amd64.deb

# インストールできたか確認
$ code --version
1.41.1
26076a4de974ead31f97692a0d32f90d735645c0
x64
続きを読む

WSLでapt upgradeやapt installでエラーが出た場合の対処

目次

はじめに

WSL(Windows Subsystem for Linux)でUbuntu 18.04 LTSを利用しているのですが、apt upgradeやapt install ~を実行する際に、”apt --fix-broken install”と表示されるエラーに悩まされました。

Ubuntuにおいて、
$ sudo apt update
$ sudo apt upgrade
$ sudo apt install ~
は、息をするのと同じくらいよく使われるコマンドだと思います。しかし、WSLで利用しているとエラーが生じることがよくあるようで、質問サイトなどでもよく見かけました。

その対処方法を紹介します。

エラーの内容

例えば 'sudo apt upgrade' コマンドにおいて、

$ sudo apt upgrade  
---(略)---  
You might want to run 'apt --fix-broken install' to correct these.  
---(略)---  

と出た場合、素直に'apt --fix-broken install'コマンドを打ちます。しかし、またエラーが出て実行できないかと思います。

$ sudo apt --fix-broken install  
---(略)---  
Errors were encountered while processing:  
   /%何らかのパス%/'filename'.deb

とエラーが出た場合の対処になります。

”apt --fix-broken install”でのエラー

上述した'apt --fix-broken install'でエラーがでた.debファイルを"sudo dpkg --force-all -i ~"で強制的に無視することで対処することができました。そして、再度"sudo apt upgrade"を実行するとアップグレードが完了するはずです。

$ sudo dpkg --force-all -i /%何らかのパス%/'filename'.deb

$ sudo apt upgrade

$ sudo apt update # 確認のため
---(略)---  
All packages are up to date.

最後に"apt update”を実行して”All packages are up to date.”と表示されれば問題なくすべて更新されています。

  

Bezier曲線をC++, Python, Juliaで書いてみた

目次

はじめに

ベジエ曲線を題材にして、C++Python、Juliaでそれぞれのコードの書き方の違いをメモしておくための記事です。自分用のメモなのでコードの書き方などおかしなところがあるかもしないので、その時は指摘していただけると幸いです。

ベジエ曲線とは

ベジェ曲線(ベジェきょくせん、Bézier Curve)またはベジエ曲線とは、N 個の制御点から得られる N − 1 次曲線である。フランスの自動車メーカー、シトロエン社のド・カステリョ(英語版) とルノー社のピエール・ベジェにより独立に考案された。ド・カステリョの方が先んじていたが、その論文が公知とならなかったためベジェの名が冠されている[1]。コンピューター上で滑らかな曲線を描くのに2次ベジェ曲線 (Quadratic Bézier curve) や3次ベジェ曲線 (Cubic Bézier curve) などが広く利用されている。
出典:「ベジェ曲線 - Wikipedia

C++

// "Bezier_curves.cpp"
// @Fumihachi

#include <iostream>
#include <random>

#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/line_descriptor.hpp>

// OpecCVのライブラリの読み込み
#ifdef _DEBUG
#pragma comment(lib,"opencv_core330d.lib")
#pragma comment(lib,"opencv_highgui330d.lib")
#pragma comment(lib,"opencv_line_descriptor330d.lib")
#pragma comment(lib,"opencv_imgproc330d.lib")
#else
#pragma comment(lib,"opencv_core330.lib")
#pragma comment(lib,"opencv_highgui330.lib")
#pragma comment(lib,"opencv_line_descriptor330.lib")
#pragma comment(lib,"opencv_imgproc330.lib")
#endif

#define N_CTRL 4  // 制御点の個数
#define RANDAM 0  // 1->制御点をランダムに生成

// 二項係数nCrの計算
int comb(int n, int r)
{
    int num = n - r + 1, x = 1;

    if (n == r) 
        return 1;
    else if (n < r) 
        std::cout << "Error : please set n >= r" << std::endl;

    for (int i = 1; i <= r; i++)
        x = x*num++ / i;

    return x;
}

// Bernstein係数
float bernstein(int n, int i, float t)
{
    int k = 0;
    float a = 1.0f, b = 1.0f;

    for (k = 0; k < i; k++)
        a *= t;

    for (k = 0; k < n-i; k++) 
        b *= 1 - t;

    return float(comb(n, i)) * a * b;
}

// Bezier curve の算出
cv::Point2f bezier_curve(int n, float t, float *px, float *py)
{
    float x = 0.0f, y = 0.0f, B = 0.0f;

    for (int i = 0; i <= n; i++) {
        B  = bernstein(n, i, t);
        x += B * px[i];
        y += B * py[i];
    }

    return cv::Point2f(x,y);
}

int main(void)
{
    // 制御点の指定
    float px[N_CTRL] = { 0.605222, 0.697092, 2.45667, 5.75014 };
    float py[N_CTRL] = { 0.983481, 4.994620, 2.51148, 8.39767 };

    // ランダムに制御点を生成
#if RANDAM
    std::cout << "Use randam control points." << std::endl;
    std::random_device rnd;
    for (int i = 0; i < N_CTRL; ++i) {
        px[i] = 10.0f * float(rnd()) / std::random_device::max();
        py[i] = 10.0f * float(rnd()) / std::random_device::max();
        std::cout << "[x, y] = " << px[i] << ", " << py[i] << std::endl;
    }
#else
    std::cout << "Use default control points." << std::endl;
    for (int i = 0; i < N_CTRL; ++i)
        std::cout << "[x, y] = " << px[i] << ", " << py[i] << std::endl;
#endif // RANDAM


    // Bezier曲線
    std::vector<cv::Point2f> p;
    for (float t = 0; t <= 1.0; t += 0.01)
        p.push_back(bezier_curve(3, t, px, py));

    // openCVでグラフを描画
    float scale = 50.0;
    float margin = 10.0;

    cv::Mat img(cv::Size(500, 500), CV_8UC3, cv::Scalar(255, 255, 255));

    for (int i = 0; i < 4; i++) 
        cv::circle(img, 
            cv::Point2f(
                px[i] * scale + margin, 
                img.size().height-py[i] * scale - margin), 
            10, cv::Scalar(0, 0, 255));

    for (int i = 0; i < p.size()-1; i++) {
        cv::Point2f p0 = cv::Point2f(
            p[i].x*scale + margin, 
            img.size().height - p[i].y*scale - margin);
        cv::Point2f p1 = cv::Point2f(
            p[i+1].x*scale + margin, 
            img.size().height - p[i+1].y*scale - margin);
        cv::line(img, p0, p1, cv::Scalar(255, 0, 0));
    }

    cv::imshow("image", img);
    cv::waitKey(-1);
}

f:id:FounderLeis:20190902235538p:plain:w400
Bezier curve (cpp)

Python

# "Bezier_curves.py"
# @Fumihachi

import matplotlib.pyplot as plt
import numpy as np
from numpy.random import *
from scipy.special import comb


def bernstein(n, i, t):
    return comb(n, i) * t ** i * (1 - t) ** (n - i)


def bezier_curve(n, t, p):
    return np.dot([bernstein(n, i, t) for i in range(n + 1)], p)


# 制御点をランダムに生成
N = 4  # Number of control points
L = 10  # Max range of X, Y
p = rand(N, 2) * L  # Create control points
p = p[p[:, 0].argsort(), :]  # Sort to x-axis
print(p)

# Calculate
x = np.array([bezier_curve(N - 1, t, p) for t in np.linspace(0, 1, 100)])

# Draw
plt.plot(p[:, 0], p[:, 1], marker='o')
plt.plot(x[:, 0], x[:, 1])
plt.title('Bezier curve')
plt.xlabel('X')
plt.ylabel('Y')
plt.grid('on')
plt.show()

f:id:FounderLeis:20190902235841p:plain:w400
Bezier curve (python)

Julia

# "Bezier_curves.jl"
# @Fumihachi

using PyPlot
using LinearAlgebra

function bernstein(n, i, t)
    return binomial(n, i) * t^i * (1-t)^(n-i)
end

function bezier_curve(n, t, p)
    x = [dot([bernstein(n, i, t) for i = 0:n], p[:,1]) dot([bernstein(n, i, t) for i = 0:n], p[:,2])];
    return x
end

# Create control points at random
N = 4;
L = 10;
p = rand(N, 2) * L;
p = p[sortperm(p[:,1]), :]

# Calculate
nt  = 100
x   = Array{Float64,2}(undef, nt+1, 2)
for k = 1:nt+1
    x[k,:] = bezier_curve(N - 1, (k-1)/100, p)
end

# Draw
plot(p[:,1], p[:,2], marker="o")
plot(x[:,1], x[:,2])
title("Bezier curve")
xlabel("X")
ylabel("Y")
grid("on")
show()

f:id:FounderLeis:20190903000107p:plain:w400
Bezier curve (julia)

C++で任意行数のテキストデータ読み込み

やさしいC++ 第4版 (「やさしい」シリーズ)

やさしいC++ 第4版 (「やさしい」シリーズ)

目次

  • 目次
  • はじめに
  • 任意行数のテキスト読み込み
    • サンプル入力
    • サンプルコード
    • サンプル出力
  • コメントアウト付きテキストの読み込み
  • 最後に

はじめに

テキストファイルに記述された任意の行数の情報をプログラム上で読み取る必要があったので、その際のコードをメモしておきます。VisualStudio2015で動作確認済みです。

特筆すべきことはなく、他にテキスト読み込みのコードを載せている方々と異なるのは、テキスト情報の行数が変わった場合に対応できるよう、格納する型をstd::vector<std::string>としてあるくらいかと思います。

続きを読む

Windows8.1からWindows10へアップグレード【2019年3月版】

久しく使用していなかったWindows8.1のLet's noteをWindows10に今更ながらアップグレードすることしたのでそのメモです。

目次

  • 目次
  • 環境
  • Window10アップグレードツールのダウンロード
  • Window10へアップグレード
  • Intelグラフィックカードが対応していないと言われた場合の対処
    • 対処1 : Intel HD 4000 Graphics Driver For Windows 10
    • 対処2:インテル® HD グラフィックス 4000 用のドライバダウンロード
  • 再度Window10へアップグレード


環境

PC:Panasonic Let's note CF-AX2
OS : Windows8.1 Pro → Windows10 Pro


Window10アップグレードツールのダウンロード

Windows10にアップグレードするためのツールをMicrosoftの公式ページからダウンロードします。以下のリンクから、「ツールを今すぐダウンロード」をクリックしダウンロードできます。
https://www.microsoft.com/ja-jp/software-download/windows10
f:id:FounderLeis:20190317225721p:plain


Window10へアップグレード

以下のようなファイルがダウンロードされるはずなので、実行します。
f:id:FounderLeis:20190317230551p:plain

続きを読む