Kamuycikap - SentenceDataBase

日々の勉強の記録を気分で書き綴るブログ

RaspberryPiにRedmineをインストール(チケットファイル添付対応)

Raspberry PiにRedmine

RaspberryPiをweb公開にしたものの・・・・何に使おうか。。。

(*´∀`)ノ 「RedMineで自分wikiにしよう」

ということで様々調査したところ先人の方々の情報を発見。
参考にさせていただいたサイトはこちら。

Raspberry PI に Redmine インストール(1) - Wind Messer
Raspberry PI に Redmine インストール(2) - Wind Messer

チケットにファイルを添付しようとするとInternal Errorになる

参考にさせて頂いて無事にRedmineをインストールできました。
ただ、使っているうちに問題発生。
ファイルを添付しようとするとInternal Errorになります。
何かしらのファイルについてパーミッション設定ができていないかだろうと思って調べてみたら、RaspberryPiでの設定は見つけられず。
同じような問題について、Debian等のディストリビュージョンで解決した人はいる模様。
当然ですがRedmine本家のQ&Aやインストールの項を調べましたが、詳しいことは書かれておらず。

アレコレ調べて試した結果なんとか解決出来たのでブログ化です!!
以下の手順は、Redmine本家と参考サイトの情報をもとに書いたものなので、他のブログと被る部分が多々あるのですが、まぁ、、、、、
許してください。
それに、これが正しい方法なのかもわからないですし、何かしらのヒントになればと思います。

<<構築手順 目次>>

  1. ApacheMySQLのインストール
  2. libapache2-mod-passengerのインストール
  3. Redmineのインストール
  4. redmine-mysqlのインストール
  5. Webブラウザでアクセスできるようにする設定
  6. セッションストア秘密鍵を生成
  7. "production"環境用のデータベース設定
  8. Redmine用データベースの作成
  9. Apacheデフォルトホストの設定
  10. チケットの添付ファイル用ディレクトリ作成
  11. パーミッションの設定
  12. Apacheの再起動
  13. Redmineの起動
  14. 管理ユーザーを変更する(redmine操作)
  15. 認証を必須にしてログインしないと閲覧できないように設定

ApacheMySQLのインストール

事前にインストールしていたので特に何もしてないです。
RaspberryPiに「Apache2」「PHP5」「MySQL」「phpAdmin」をインストール - Kamuycikap - SentenceDataBase

なので、必然的にRedmineで利用するDBはMySQLに決定。

libapache2-mod-passengerのインストール

ApacheRedmineを動かすときに必要なモジュール。

sudo apt-get install libapache2-mod-passenger

Redmineのインストール

以下のコマンド実行。

sudo apt-get install redmine

インストールの途中で下記のコマンド実行を促されますが結局実行はしていません。

dpkg-reconfigure -plow redmine

redmine-mysqlのインストール

redmineMySQLを利用するためのプログラムを導入。
これもコマンド一発。

sudo apt-get install redmine-mysql

Webブラウザでアクセスできるようにする設定

ApacheのDocumentRootにRedmineを作成。
シンボリックリンクを貼ることで実現します。

cd /var/www
sudo ln -s /usr/share/redmine/public redmine

セッションストア秘密鍵を生成

これもコマンドで作成。

cd /usr/share/redmine
sudo rake generate_session_store

"production"環境用のデータベース設定

これはつまり、Redmaineが利用するMySQLのユーザー接続情報ですね。
テンプレートをコピーしそれを編集します。
最近、エディタはnanoを使っています。

sudo cp -p /usr/share/redmine/templates/database.yml.template /etc/redmine/default/database.yml
sudo nano /etc/redmine/default/database.yml

こちらが編集結果。

production:
  adapter: mysql
  database: redmine
  host: localhost
  port: 3306
  username: redmine
  password: password
  encoding: utf8

Redmine用データベースの作成

編集した設定にあわせてデータベースを作成します。

mysql -u root -p
> create database redmine;
> create user 'redmine'@'localhost' identified by 'password'
> grant all privileges on redmine.* to 'redmine'@'localhost';
> exit
sudo RAILS_ENV=production rake db:migrate
sudo RAILS_ENV=production rake redmine:load_default_data

Apacheデフォルトホストの設定

Redmineのlocation

sudo nano /etc/apache2/sites-available/default

追加する部分はこちら
※ 「+」で記載の部分が追加したところ。当然ながら実際には「+」は書かない。

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

+       # add for redmine
+      <Location "/redmine">
+               RailsBaseURI /redmine
+       </Location>

        ErrorLog ${APACHE_LOG_DIR}/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

チケットの添付ファイル用ディレクトリ作成

チケットに添付するファイル情報を保存するディレクトリを作成。

sudo  mkdir -p /var/lib/redmine/default/files/

パーミッションの設定

以下のとおりにグループとユーザーを設定。

 sudo chown -R www-data:www-data /var/lib/redmine/default/files
 sudo chown -R www-data:www-data /usr/share/redmine

Apacheの再起動

 sudo /etc/init.d/apache2 restart

Redmineの起動

ここまでの設定ができていれば、公開URLの後ろに/redmineをつけるだけで起動するはず。

http://www.hogehoge.ne.jp/redmine

管理ユーザーを変更する(redmine操作)

Redmineの初期ユーザーIDとパスワードは「admin」「admin」。。。
これは速攻で変更しなければなりません。
ログイン後、画面左上にあるリンクをたどり

「管理」→「ユーザ」と進んでパスワードを変更します。

詳しい設定方法は・・・・まぁ、他のサイトに任せます。

認証を必須にしてログインしないと閲覧できないように設定

ログインしてない状況でチケットを閲覧できないように設定。
参考にしたのはこちらのサイト。
ログインしているユーザーのみ情報を閲覧可能にする — Redmine.JP


優良アダルトサイト紹介の最終形態!!MaxInfo

yasnippetでコーディングスピードを向上!!

Emacsのコーディングでスピードアップ(yasnippet)

コーディングのスピードをアップさせるためスニペットを導入。
コードの塊をポコっと挿入できます。
素晴らしいのは、各メジャーモードでスニペットを自動的に分けて管理してくれること。

EmacsLispモードで書いてる時にひらめいたスニペットをおもむろに追加。
自動的にEmacsLispモードに紐付けられた形でスニペットが保存される。
ホント素晴らしい。

さらに、挿入したスニペットのカーソル制御までできるのがVeryGoooood!!!

目次

  1. ダウンロード
  2. init.elに設定
  3. 使ってみる

ダウンロード

ここに置いてあります。GitHub
https://github.com/capitaomorte/yasnippet
git使えるならcloneコマンドで落とせますね。
git使えなくても、yasnippet.elをload-pathが通っているディレクトリに保存すればOK。

init.elに設定

自分用のスニペットを保存する場所と、それ以外のスニペットを保存する場所を分けて設定。
また、他のメジャーモードやマイナーモードと併用することが考えられるので、キーバインドも変更。

(when (require 'yasnippet nil t)
  (setq yas-snippet-dirs
        '("~/.emacs.d/mode_dat/yasnippet/mySnippets" 
          "~/.emacs.d/mode_dat/yasnippet/snippets"))
  (define-key yas-minor-mode-map (kbd "C-c s i") 'yas-insert-snippet)     ;; 既存スニペットを挿入する
  (define-key yas-minor-mode-map (kbd "C-c s n") 'yas-new-snippet)        ;; 新規スニペットを作成するバッファを用意する
  (define-key yas-minor-mode-map (kbd "C-c s v") 'yas-visit-snippet-file) ;; 既存スニペットを閲覧・編集する
  (yas-global-mode t))

使ってみる

早速使ってみます。

まずはバッファの作成

バッファ作成の方法・・・まぁ、特に特別なことはなく、htmlファイルやらC言語ファイルやら開けば、それに対応したモードに自動的になるはずです。

スニペット作成

init.elで指定したキーバインドで作成します。

C-c s n

ですね。
すると、*new snippet*バッファが開きます。

# -*- mode: snippet; require-final-newline: nil -*-
# name: 
# key: 
# binding: direct-keybinding
# --

name:とkey:の部分に呼び出したいスニペットの名前を書きます。
「# --」以降にスニペットを書きます。
EmacsLispで使うスニペットを例にすると、、、こんなかんじです。

# -*- mode: snippet; require-final-newline: nil -*-
# name: _defcond
# key: _defcond
# binding: direct-keybinding
# --
(defun $1 ($2)
  (cond
   ($0)))

$0,$1,$2はスニペット配置後のカーソルの位置。
$0は最終的にカーソルが移動する所。

TABで指定した場所にカーソルが移動します。

$0~$Xを省略した場合は、カーソルは末尾に行きます。
また、TAB移動は途中でハイライトの外に位置に移動するか、C-gで解除できます。

作成したスニペットの挿入
C-c s i

ですね。

すると、過去に作ったスニペットの一覧が表示されます。
C-p,C-nで選択してEnterキーを叩いてもよし。
直接スニペット名を入力してEnterキーを叩くもよし。

これで挿入されます。

ちょっと高度なスニペットの作り方

こんなふうに書くと、初期値を表示することが出来ます。

# -*- mode: snippet; require-final-newline: nil -*-
# name: _defcond
# key: _defcond
# binding: direct-keybinding
# --
(defun ${1:FunctionName} (${2:Parameter})
  (cond
   ($0)))


HTMLのコーディングとかで威力を発揮するんですが、入れ子もOKです。

# -*- mode: snippet; require-final-newline: nil -*-
# name: _section
# key: _section
# binding: direct-keybinding
# --
<section${1: id="${2:id_name}"}${3: class="${4:class_name}"}>
  $0
</section>
スニペットの編集

init.elに指定したディレクトリにスニペットファイルがあるのでソレを直接修正してもいいですが、

C-c s v

このコマンドでスニペットの再編集が可能です。
コマンド実行すると、一覧で過去に登録したスニペットが表示されるので、カーソルキーで選ぶかスニペット名を入力するかで選択できます。

C#でクラスとか変数とかアレコレ命名する時のルール

命名規則とか忘れちゃう

というか、気にした時に

・・・(・∀・i)タラー・・・どうだっけ???

ってなっちゃうのでここにメモしておきます。
MSDN命名規則にきちんと書いてあります。

名前に関するガイドライン

Identifier Case
class Pascal [AppDomain]
列挙型 Pascal ErrorLevel
列挙値 Pascal FatalError
イベント Pascal ValueChanged
例外クラス Pascal WebException
読み取り専用の静的フィールド Pascal RedValue
Interface Pascal IDisposable
方法 Pascal ToString
Namespace Pascal System.Drawing
パラメーター Camel <型名>
コントロール名 Camel dataGridView1
プロパティ Pascal BackColor

優良アダルトサイト紹介の最終形態!!MaxInfo

RaspberryPiをSlackのBOTにしてみた

RaspberryPiにPHPでSlackのBOTを作ってみた

一部で流行っているチャットツールSlackってのがあります。
チャットワーク等のツールと同類のものですが、他のクラウドサービスとの親和性とか使いやすいインターフェイスとか色んな所で褒められているツールらしいです。

私も試しに使っています。
たしかに分かりやすい。
基本英語ですが、中学英語の記憶をたよりに雰囲気でなんとかなっています。

このSlackには、他のWebサービスクラウドサービスと連携を取るためのAPIが多数用意されていて、その中の一つを使ってBOTを作ろうと試みます。
BOTはRaspberryPiに仕込みます。
なぜわざわざRaspberryPiに仕込むのかと言いますと。

(*´∀`)ノ「電気つけて!温度は?湿度は?」

などと話しかけることにより、BOT(RapsberryPi)が接続されているセンサーの値やら家電の電源制御やらをやってくれるって話です。
※センサー値取得及び荷電制御は後日掲載予定

前提条件
  • RapsberryPiがインターネット上に公開されていること
  • RaspberryPiでWebサーバーが動作/起動されていること
  • RaspberryPiでPHP5が動作していること
  • Slackのアカウントを持っていること
  • PHPのコードの書き方について自分で調べられるか知っていること

<<目次>>

  • PHPファイルを作成
  • RaspberryPiにPHPコードを配置
  • OutgoingWebHooksをSlackに導入する
  • 実際にメッセージをSlackで投稿してみる
  • 話しかけるユーザーによって動作を変化させる

PHPファイルを作成

何も考えず、このファイルを用意する。
ファイル名は、test.phpとか好きなのを適当に。

<?php
echo '{"text":"はろー!"}';  
?>

RaspberryPiにPHPコードを配置

RaspberryPiに上記で作成したphpファイルを配置する。
配置するのは、WebサーバーのDocumentRootに。

OutgoingWebHooksをSlackに導入する

導入ページにアクセスし、「Outgoing WebHooks」を選択。
指示に従って設定するだけです。

  • Channel     → TriggerWords(打ち込んだ単語)を拾うチャンネルを指定。
  • TriggerWords   → 反応させたい単語を登録。複数登録するときはカンマ区切りで(「hello」とか「オン」とかの単語)
  • URL       → RaspberryPiに配置したphpファイルを指定(例: http://www.foo.bar/test.php)
  • Token      → 変更しない
  • DescriptiveLabel → 空欄でもいい
  • CustmizeName   → 好きなのに変える
  • CustomizeIcon   → 変えたい場合は適当に変える(雰囲気出るので変えるのをオススメ)

設定できたら、「Save Settings」ボタンをクリック!!

実際にメッセージをSlackで投稿してみる

Outgoing WebHooksの設定にある「Channel」で指定したチャンネルにメッセージを投稿します。
投稿する文字列の中に、TriggerWordsで指定した単語を混ぜて投稿すると

はろー!

が返ってくるはずです。

話しかけるユーザーによって動作を変化させる

APIの説明はここにあります。(英語)
$_POSTで受け取れる情報の中に、「user_id」、「user_name」の項目があるので、メッセージを投稿した人を識別して処理を行うことができそう。

こんな感じのソースで判別できました。
このサンプルでは、「hello」と「world」ってTriggerWordsを指定していると仮定しています。

<?php
$token = $_POST['token'];
$team_id = $_POST['team_id'];
$channel_id = $_POST['channel_id'];
$timestamp = $_POST['timestamp'];
$user_id = $_POST['user_id'];
$user_name = $_POST['user_name'];
$text = $_POST['text'];
$trigger_word = $_POST['trigger_word'];

if (strcmp($user_id,'ここに反応させたいユーザーのIDを記述') == 0) {

    if(preg_match('/hello/',$text)) {
        echo '{"text":"はろーだぜ!"}';  
    }else{
        if (preg_match('/world/',$text)) {
            echo '{"text":"わーるどだぜ!"}';  
        }
    }
} else {
    echo '{"text":"お前の話はつまらん!!"}';  
}

?>
user_idってどうやって調べる??

って所ですが、Slackの画面上の何処に記載されているのかわからなかったので

$user_id = $_POST['user_id'];
echo '{"text":"user_id = '.$user_id.'"}';  

ってコード書いて調べてみました。


優良アダルトサイト紹介の最終形態!!MaxInfo

RaspberryPiにインターネット経由でファイルを転送する方法 for Windows

Web公開したRaspberryPiにファイル転送する

Webに公開したRaspberryPiにどうやってファイルを転送するか。
転送するファイルはphpファイルだったりpythonファイルだったり。

FTPサーバーをインストールしてアレコレというのを考えましたが、ルーターの設定で新しいポートを開けるのもどうかなと。。。。
なのでちょっと調べてみました。

SFTPと言うのがあるらしい

という情報を発見。(*゚Д゚*)ェ…
SSH File Transfer Protocol」というらしいです。
開けているSSHのポート番号でアクセスしてファイルの転送が可能らしい。

(*´∀`)ノ 「天下のWindowsさんなら、SFTP対応のクライアントがあるだろう!」

と安易に考えて調べたらありました。

WinSCP

ってアプリです。
ポート番号とURL、ログインユーザーIDとパスワードを指定するだけでOKです。
簡単にファイル転送できてしまいました。
   ↓
WinSCP Download
ここにアクセスして、「Installation package」を選択するだけ。
インストールも利用も日本語でイケます。

ちなみにLinuxですと「FileZilla」で同様のことが可能ですね



優良アダルトサイト紹介の最終形態!!MaxInfo

RaspberryPiに「Apache2」「PHP5」「MySQL」「phpAdmin」をインストール

RaspberryPiに「Apache2」「PHP5」「MySQL」「phpAdmin」をインストール

RaspberryPiをインターネットに公開してみました。
せっかく公開したので遊んでみようと思います。
そのためのツールとして
RaspberryPiにApache2、PHP5、MySQLをインストールしてみます。

到着点として

  • インストールするだけで特に設定は行わない
  • とりあえず標準のWebページが表示されるところまで
  • MySQLはインストールするだけで、DB作成とかユーザー作成とかは行わない

本当に入れるだけのメモ。
そっから先は後日行う。

前提条件

インターネット経由であれローカルであれ、SSHなどでログインしてコマンド叩ける状態であること。

<<目次>>
  1. RaspberryPiのアップデート
  2. Apache2のインストール
  3. Apache2の動作確認
  4. PHP5のインストール
  5. PHP5の動作確認
  6. PHP5-mysqlのインストール
  7. MySQLのインストール
  8. phpMyAdminのインストール
  9. phpMyAdminの確認

RaspberryPiのアップデート

セットアップ失敗しちゃいやなので、アップグレードしときます。

$ sudo apt-get update

Apache2のインストール

apt-getでインストール。
コマンド叩いたら待つだけです。

$ sudo apt-get install apache2

Apache2の動作確認

コンソールでifconfig叩いて自分のIPアドレスを確認し、ブラウザアクセスしてみる。

$ sudo ifconfig

上記コマンドで表示される「inetアドレス...」と表示されている部分で確認。

ブラウザで確認したIPアドレスにアクセスしてみる
※例はローカルIPアドレスの場合

http://XXX.XXX.XXX.XXX

うまくイケば、「It Works!」なページが表示されるはず。
ちなみに、

DocumentRootは「cat /etc/apache2/sites-available/default」に記載されており、標準では「/var/www」になっている模様。

PHP5のインストール

$ sudo apt-get install php5

これも待つだけ。

PHP5の動作確認

index.htmlをphpファイルとしてコピー

$ cd /var/www/
$ sudo cp ./index.html ./index_php.php

ブラウザで指定して「I work!」が表示されれば動作している

http://XXX.XXX.XXX.XXX/index_php.php

もうひとつの方法。
nano等のエディタ使って下記の内容でphpinfo.phpファイルを作成します。
ファイルの作成場所は、index.htmlと同じディレクトリ。

<?php
  phpinfo();
?>

作成したらブラウザでアクセスしてみます。

http://XXX.XXX.XXX.XXX/phpinfo.php

すると、動作しているならPHPの情報がズラッと表示されるはずです。

PHP5-mysqlのインストール

コマンド叩くだけ

$ sudo apt-get install php5-mysql

MySQLのインストール

これもコマンド叩きます。
※rootのパスワードとか聞かれたかもしれませんが・・・そこはお好みで。

$ sudo apt-get install mysql-server

phpMyAdminのインストール

このコマンド叩きます。
途中でユーザーとかパスワードとか聞かれます。
そのあたりはお好みで。

$ sudo apt-get install phpmyadmin

こんなの聞かれました。
apache2を選択しました。

選択方法 → スペースバー叩いたら「*」がマークされます
自動再設定をする web サーバ:
 [] apache2
 [] lighttpd

phpMyAdminの確認

まず、設定ファイルを書き換えます

$ vi /etc/apache2/apache2.conf

内容は下記の通り、一番下に追加します。

Include /etc/phpmyadmin/apache.conf

そして、apache2を再起動します。

$ sudo /etc/init.d/apache2 restart

再起動後、ブラウザで下記のURLにアクセス!!

http://XXX.XXX.XXX.XXX/phpmyadmin/

ログイン画面が表示されたらOKです。


優良アダルトサイト紹介の最終形態!!MaxInfo

かなりの高機能!! シリアルポートエミュレータ for Windows

シリアル通信の開発環境 for Windows7

Windows8.1とかでも動作するのかな?
そこは未検証です。

久しぶりにWindows7C#を使ったシリアル通信のソフトを書かなければならなくなりました。
最近のPCにはD-Subのコネクタなんて実装されていません。
なので、

・擬似的にCOMポートを作れる(複数作りたい)
・擬似的に作ったCOMポートに、自作アプリからデータを送信したら何らかの形で閲覧できる
・擬似的に作ったCOMポートから自作アプリにデータを送信できる
・擬似的に作ったCOMポートから、実際にPC存在するCOMポートへデータを流せる

書けがキリがないですが、まぁ、上記に書いてあることができれば当面は問題なさそうです。
んで、調べてみたら・・・・ものすんごいのがありました。
これが無料で使えるとは驚きです。

こちら

Virtual Serial Ports Emulator

こちらのアプリで全て解決。
英語のアプリですが、直感的なアイコンと分かりやすい単語のメニューなのでなんとかなります。

  • Virtual device: connector
  • Virtual device: data splitter
  • Virtual device: pair
  • Mapper device
  • User mode device: TcpServer
  • User mode device: TcpClient
  • User mode device: Serial Redirector
  • User mode device: UDP Manager
  • User mode device: Bridge
  • Python scripting system
  • x86 and x86_64 processor architecture support
  • VSPE API (C/C++ header and static library) for native language developers
  • VSPE API Python bindings for Python developers
  • Embedded HTTP server
  • Data monitoring

無料なのは32bit板のみ

です。
64bit版は有料ですが、32bit版で何も問題なく使えています。

これはいい。


優良アダルトサイト紹介の最終形態!!MaxInfo