CentOS7.7に Tracを導入したときのメモ

Trac関連

pipで全部入るので楽。ただ pipコマンドがデフォルトでは入っていなかったかも

pipのインストール方法 - Qiita

  sudo pip install Jinja2
  sudo pip install Trac
  sudo pip install babel
  sudo pip install Genshi

あと apacheと連携させるために mod_wsgiをインストールする。

  sudo yum install mod_wsgi

Trac環境用意

/var/www/trac 以下にTracのプロジェクトを置くことにする。

最初に実験用のプロジェクト SandboxProjectを作ってみる。

mkdir -p /var/www/trac
cd /var/www/trac
trac-admin SandboxProject initenv
chown -R apache.apache /var/www/trac

*1

run_trac.wsgi作成

/var/www/trac/run_trac.wsgiを作成

import os

os.environ['TRAC_ENV_PARENT_DIR'] = '/var/www/trac'
os.environ['PYTHON_EGG_CACHE'] = '/var/www/trac/eggs'

import trac.web.main
application = trac.web.main.dispatch_request

chownで apacheにしてパーミッションを 755に変更する。

chown apache.apache run_trac.wsgi
chmod 755 run_trac.wsgi

apache設定

/etc/httpd/conf.d/trac.confを作成

LoadModule wsgi_module modules/mod_wsgi.so

WSGIScriptAlias /trac /var/www/trac/run_trac.wsgi

<Directory /var/www/trac>
    WSGIApplicationGroup %{GLOBAL}
    Order deny,allow
    Allow from all
</Directory>

とりあえずこれで apacheを再起動すれば最低限は動く。

sudo service httpd restart

Tracに認証を追加

adminアカウントを用意する。

cd /var/www/trac/SandboxProject
htdigest -c .htdigest trac_user admin
<adminの新規パスワード>
cd /var/www/trac/SandboxProject
sudo -u apache trac-admin . permission add admin TRAC_ADMIN

/etc/httpd/conf.d/trac.conf に以下を追加して httpdを再起動

<Location "/trac/SandboxProject/login">
  AuthType Digest
  AuthUserFile /var/www/trac/SandboxProject/.htdigest
  AuthName "trac_user"
  require valid-user
</Location>

*1:initenvで svnリポジトリの場所を聞かれなくなっているが、後から設定できるのだろうか?

Swift4で Web APIから JSONデータをもらいオブジェクト化する

Random User Generator | HomeAPIを叩き、JSON形式で帰ってきたレスポンスを Swiftの構造体に収めるサンプル。 Playgroundで動作確認。

import Foundation

struct RandomUserResult : Codable {
    var results : [User]
    var info : Info

    struct User : Codable {
        var gender : String
        var name : Name
        var location : Location
        var email : String
        var login : Login
        var dob : Dob
        var registered : Registered
        var phone : String
        var cell : String
        var id : Id
        var picture : Picture
        var nat : String

        struct Name : Codable {
            var title : String
            var first : String
            var last : String
        }

        struct Location : Codable {
            var street : Street
            var city: String
            var state: String
            var country : String
            var postcode: Int
            var coordinates : Coordinates
            var timezone : Timezone

            struct Street : Codable {
                var number : Int
                var name : String
            }

            struct Coordinates : Codable {
                var latitude: String
                var longitude: String
            }

            struct Timezone : Codable {
                var offset: String
                var description: String
            }
        }


        struct Login : Codable {
            var uuid : String
            var username : String
            var password : String
            var salt : String
            var md5 : String
            var sha1 : String
            var sha256 : String
        }

        struct Dob : Codable {
            var date : String
            var age : Int
        }

        struct Registered : Codable {
            var date : String
            var age : Int
        }

        struct Id : Codable {
            var name : String
            var value : String
        }

        struct Picture : Codable {
            var large : String
            var medium : String
            var thumbnail : String
        }
    }
    
    struct Info :Codable {
        var seed : String
        var results: Int
        var page : Int
        var version : String
    }
}



let apiurl = URL(string: "https://randomuser.me/api/")!

var request = URLRequest(url: apiurl)
request.addValue("json", forHTTPHeaderField: "dataType")
URLSession.shared.dataTask(with: request) {data, response, err in
       if (err == nil) {
        print ("(゚∀゚) API通信成功")
        let jsonStr = String(data: data!, encoding: .utf8)!
        
        do {
            let result : RandomUserResult = try JSONDecoder().decode(RandomUserResult.self, from: jsonStr.data(using: .utf8)!)
            print (result)
        } catch {
            print (error.localizedDescription)
        }

       } else {
        print ("(´・ω・`) API通信失敗")
       }
       }.resume()

VPSを乗っ取られる

備忘録。

さくらのVPSの rootが取られた。 調べると /root以下に pythonの実行環境が置かれなにかスクリプトが動いており、 cronで定期的に情報を取得していた。

 

取り急ぎそれらのファイルをすべて消し、 $HOMEのバックアップを取る。といっても IRCのログくらいだが

その後OSをクリーンインストールし、 sshのポートを変更、認証方法の厳格化を行う。

以下のサイトが参考になった。

dogmap.jp

ViewPagerのドットインジケータ

ViewPagerのインジケータをドットで表現。

github.com

これは簡単に導入できた。

 

以下は未評価だけど導入が簡単そうなもの。あとで試す

github.com

 

github.com

組み込みLinuxデバイスドライバの作り方

読みたい Qiita記事。9回目以降の内容が少し興味ある

メモ: キー割り当て変更

Windows Updateしたらレジストリを初期化された。もとに戻すのに余計な時間を使わされたので今後のためにメモを残す。

CAPS LOCK (0x3A)      -> LEFT CTRL (0x1D)
LEFT CTRL (0x1D)      -> LEFT WINDOWS (0xE05B)
LEFT WINDOWS (0xE05B) -> LEFT ALT (0x38)

00 00 00 00  00 00 00 00
04 00 00 00  1D 00 3A 00
5B E0 1D 00  38 00 5B E0
00 00 00 00

Windows10で行ったが、HKEY_CURRENT_USER\Keyboard Layoutでは有効にならなかった。 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layoutの Scancode Map を変更すること。

Android Architecture Components

便利そうなのは分かった。RxJavaのような非同期処理を書くにはどうすればよいかはまだよく見えていない。