CentOS7 on Vagrantでの時刻設定
CentOS7からはntpdではなく、chronyを使用するように推奨されている。
インストールして、デーモンとして常駐させるように設定する。
$ sudo yum install -y chrony
$ sudo systemctl enable chronyd
$ sudo systemctl status chronyd
chronyd.service - NTP client/server
Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled)
Active: inactive (dead)
“/etc/chrony.conf”の参照するサーバを日本のNTPサーバに設定する。
server ntp.nict.jp iburst
server ntp1.jst.mfeed.ad.jp iburst
server ntp2.jst.mfeed.ad.jp iburst
server ntp3.jst.mfeed.ad.jp iburst
chronyを起動する。
$ sudo systemctl start chronyd
chronyの状態を確認する。
$ chronyc cources
210 Number of sources = 4
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^* ntp-b2.nict.go.jp 1 6 37 38 -1471ns[-3530us] +/- 3053us
^- ntp1.jst.mfeed.ad.jp 2 6 37 37 -922us[ -922us] +/- 12ms
^- ntp2.jst.mfeed.ad.jp 2 6 37 38 -1038us[-4557us] +/- 35ms
^- ntp3.jst.mfeed.ad.jp 2 6 37 38 +2003us[+2003us] +/- 16ms
さらに詳細な情報を得たい場合は、-vオプションをつける。
210 Number of sources = 4
.-- Source mode '^' = server, '=' = peer, '#' = local clock.
/ .- Source state '*' = current synced, '+' = combined , '-' = not combined,
| / '?' = unreachable, 'x' = time may be in error, '~' = time too variable.
|| .- xxxx [ yyyy ] +/- zzzz
|| / xxxx = adjusted offset,
|| Log2(Polling interval) -. | yyyy = measured offset,
|| \ | zzzz = estimated error.
|| | |
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^* ntp-b2.nict.go.jp 1 6 77 22 +275us[ +681us] +/- 3850us
^- ntp1.jst.mfeed.ad.jp 2 6 77 21 -1044us[-1044us] +/- 44ms
^- ntp2.jst.mfeed.ad.jp 2 6 77 22 -914us[ -508us] +/- 37ms
^- ntp3.jst.mfeed.ad.jp 2 6 77 22 -466us[ -62us] +/- 12ms
他には、トラッキング情報を確認したりなど。
$ chronyc tracking
$ chronyc sourcestats
UTCになっている場合
日本人なので、JST(日本標準時)で時刻を確認したいので変更します。
CentOS7からは、”timedatectl”で確認、設定ができます。(“/etc/localtime”などを直接編集しません)
# 確認
$ timedatectl
# timezoneの確認(一覧)
$ timedatectl list-timezones
# timezoneの設定
$ sudo timedatectl set-timezone Asia/Tokyo
これで”date”コマンドが、JSTで表示されます。
Vagrantを使用している場合
Vagrantはデフォルトでホストと時間を同期してくれます。ホストの時間がずれていると時間は永遠にありません。
ホストの時刻があっている場合は問題無いです。
ホストの時間がずれている場合は同期をやめるように設定しましょう。
config.vm.provider :virtualbox do |vb|
vb.customize ["setextradata", :id, "VBoxInternal/Devices/VMMDev/0/Config/GetHostTimeDisabled", 1]
end
のっぴきならない事情でホストの時刻がずれている場合は、こうしないとダメですね。
Heroku Buttonで始めるメモアプリ MemoMemo 作りました
φ(..)
Heroku Buttonをボチッとするだけで始められるプライベートなメモアプリMemoMemoを作りました。
主に自分のために作りました。
SocketIOでさくさく検索できるのでWikiとかよりストレスないです(当社比)
Basic認証で、プライベートに使えます。
気になったこととかを何も考えずガンガン書きまくって、公開できそうなものはあとで検索して、ブログとかQiitaとかに公開したりして使ってます。
Deploy to Heroku
ここ にある上のボタンを押して、ユーザーとパスワードを入力してデプロイできます。
- ユーザー名は変更できませんが、ミスったらまたデプロイすればいいんです、お手軽ですね Heroku。
- パスワードはログイン後変更した方がいいですね。
- DBバックエンドはHerokuのClearDB(Ignite)を使っています。50MBですが、テキストデータしかないので数年使えそうです。
Screenshot - Edit
- reStructuredTextとMarkdown(GFM)を使ってエディットできます
- editボタンでいくらでも編集可能です
- 画像はアップロードできません、外部のリンクを使用します
- editボタンの横にあるdeleteボタンで消えます
- 見出しに付く ✘ がかわいいです ✘╹◡╹✘ かわいい
Screenshot - Search
SocketIOでさくさく検索します。
- タイトルで検索。タグや日付で候補を絞ることもできます、便利
- 普通の検索。タイトル、全文、タグで検索できます、わりと便利
- タグ一覧検索、便利
- タグクラウトによるマウスオーバーの難しい検索、楽しい
- 件数の多い場合も、インフニットスクロールになっているので次から次へと読み込んでいきます、便利
さいごに
MemoMemoははじめて作ったWebアプリだったりします。(作りはじめたのは結構前)
きっとバグでいっぱいです。
そのうち、Publish機能つけてブログみたいな使い方もできるようになるかもしれません。
HerokuにデプロイするとBasic認証(http)なので、安全ではありません。機密情報をのせてはいけません。あくまで自分のプライベートにとどめておきましょう。
HerokuにデプロイするとBasic認証(http)なので、安全ではありません。機密情報をのせてはいけません。あくまで自分のプライベートにとどめておきましょう。
気になった方は、ぜひ “Deploy to Heroku” Button!
小さいプロジェクトでCIしてますか?
ポエムです。
ぼくはプログラマな仕事をしていて、受け持ってるプロジェクトはメンバ一人という小さいプロジェクトです。
この話は、ある日CIをしようと思った話です。
Contents
CIと言っても何がしたい?
何がしたい?ではなく。何がほしいか?な気がします。
CIと言っても何がほしい?
安心感です。
プログラマにこれが不足してくると、つらみをどんどん感じるようになります。
安心感を得るために必要な材料は人によって異なると思います。ぼくの欲しい安心感は
- メモリーリークしてない
- ビルドが通り、warningもない
- Doxygenがエラーはいてない
- メイン機能のテストが通っている
言語や案件によって様々な安心感があると思いますので、ここはきっと人それぞれです。
ふと周りを見るとCIしている現場はあまり多くありません。なぜでしょうか?
何でCIしてないの?
CI => テスト書かないと!という感じがあるのが原因な感じがしています(個人的な意見)
TDDもはじめから導入されているプロジェクトでない限り、始めづらいし、あとからつけるのもツライし...という感じになりテストがない=>CIもしないみたいな感じがあるような気がします(個人的な意見)
CIするには、テストを書かないとーってなってあとまわしな感じがあります(ぼくもそう思い時がある)
しかし、自分はただただ安心感を求めていることに気づいたので、まずテストコードを書いてということは、負担になってしまうのでやめました。
毎回GitでCommitやPushの度に、ビルドが通るか、主要な機能のテストが通るか、メモリーリークがないかをチェックするだけで、安心感が得られるのでそれだけなら頑張れる感じがしました。
さぁ、CI!
さぁ、CIということで有名なJenkinsさんを試してみようと思うのは、割りと一般的な人のやり口だと思います。
そして、Jenkinsを導入しようとちょっといじってみたのですが、ウッ...!っとなってしまいました。
Jenkinsを使うとなると、ユーザ作ってセキュリティの設定をして、Gitプロジェクトの登録方法を調べ、GitLab連携のこと調べ、鍵交換して、なんかエラーはいていて、任意のコマンドを実行させるには...Slackとかへの通知は......アッ...アッ...
とツライ...しか考えられなくなりました。
そして、Jenkinsはぼくの中でオワコンとなってしまいました。
Jenkins割りとクソなので、Jenkinsらいくな軽量ツール作ると、メシウマ感ある。
— (Y◡Y) .。oO (シャッチクゥ) (@yymm6666) 2014, 11月 20
ジャバアレルギー持ちなのでそれも影響したのではないかと思っています。
一歩引いてJenkinsを見てみるとぼくがしたかったのは
- ビルドコマンドやメモリリークチェックツールの実装(スクリプトを叩く)
- 通知と履歴閲覧
- Git連携(CommitやPostでJenkinsにテストを走らせる)
もともと小規模なプロジェクトで、やらせたいことは大したことはない気がしました。
「コマンドを実行して、DBに保存し、通知する」
だけなので、なんか作れそうな気がしますし、作ってたほうが楽しいです。
Git-Hook-DrivenなCIツールを作った
というわけで、要件(コマンドを実行、DBに保存、通知)を満たしているツールを作ってみました。
CLIのクライアント・サーバアプリです。GolangとPythonで書きました。Jenkinsでググると軍人が何人か出てくるので軍人の名前にしました。
手間をかけずに作ることも重要だったので、超軽量な感じです。
Git-Hook-Driven
Jenkinsを設定していて、GitLabなどのホスティングサービスとの連携(web hook)の設定がめんどうでした。
さらに、今回の場合わざわざテストサーバにテストをしてもらう必要はありません。望んている内容は同じ環境内でテストしても問題ないし、テストサーバたてるのもかなり面倒です。
そして、Commitしたらテスト、Pushしたらテストというサイクルをプロジェクトのライフサイクルに組み込めればいいと考えました。
ということで、Git Hookにビルドスクリプトを仕込みます。
ビルドが時間のかかる処理の場合は、”exec <command> &”にしてバックグラウンドで処理するようにしました。
具体的には、.git/hook/post-commitに以下の内容を追加しました。
ex. post-commit
#!/bin/sh
echo "CI!!"
exec client.py "cd ~/path/to/project && ./buildscript" &
実行すると、
% git cm "test commit"
CI!!
[master 8456393] test commit
1 file changed, 1 deletion(-)
となって、バックグラウンドでビルドなどが走ります。
クライアント・サーバ
クライアント(Python)がコマンドの実行結果をJsonでPostして、サーバ(Golang)がRedisにそのJsonを保存するだけの簡単アプリです。
MacOSXとUbuntuのNotifier(teminal-notifier, notify-send)で通知をしてくれるようにもなってます。
クライアントはGit Hookに仕込んで、お好みのタイミングで使えるように設計しました。
Note
問題点はいろいろありますが...
- 履歴をまともに見れない
- なんか色々まだ雑
- 自分しか使っていないのでドキュメントもないもない
とりあえずこれで、ぼくのプロジェクトは、変なコードを仕込んだらコミットの度に怒られるようになり、良い緊張感で仕事できるようになりました。
仕事の息抜きにこのアプリを改良したりと楽しいこと(Golang書いたりPython書いたり)できるので、モチベーションも保たれ作業効率がUPすることは間違いないでしょう。
まとめ
安心感と心の平和のために、本当に必要な物は何か、一般的な情報(Jenkinsとか)から離れて考えてみることはいいことな気がしました。
本当に必要としているものは、そんな大それたことではなくて、シェルスクリプトとか既存の技術をちょっと組み合わせるだけで済んでしまうようなことかもしれません。
ポエムとは何かよくわかってませんが、ポエムでした。
RustでWebsocket
これは Rust Language Advent Calendar 2014 の第12日目となります。
RustでWebsocketで遊ぶ話です(遊ぶだけです)
Rustの環境を作る
まず、Rustは時間がなかったので rust playpen でしか遊んだことなかったので環境を作ります。
$ curl -s https://static.rust-lang.org/rustup.sh | sudo sh
MacとLinuxであればこのコマンドでインストール。Cargoも一緒にインストールされる(便利)
そして、vimrcに
NeoBundle 'wting/rust.vim'
を追記して、:NeoBundleInstallします。
RustでWebsocketするには
“rust websocket”でGoogle, GitHubで検索すると、2014.12.12現在以下の5つがあるみたい。
- ☆25 : ehsanul/rust-ws
- ☆3 : cyderize/rust-websocket
- ☆6 : nathansizemore/rustic-io
- ☆0 : jaredwy/socket.rust
- ☆0 : kstep/rust-websocket
時間もないので一つだけ試してみます。
簡単なChatを作る(ただechoしてるだけ)
動かしてみた感じ↓
サーバ側
ブラウザ側
コード(Server)
extern crate time;
extern crate http;
extern crate ws;
use http::server::{Config, Server, Request, ResponseWriter};
use std::io::net::ip::{SocketAddr, Ipv4Addr};
use http::headers::content_type::MediaType;
use ws::server::WebSocketServer;
use ws::message::{Message, TextOp, Text, BinaryOp, Binary};
#[deriving(Clone)]
struct EchoServer;
impl Server for EchoServer {
fn get_config(&self) -> Config {
Config { bind_address: SocketAddr { ip: Ipv4Addr(127, 0, 0, 1), port: 8000 } }
}
fn handle_request(&self, r: Request, w: &mut ResponseWriter) {
w.write(b"<h1>rust-ws chat sample</h1>").unwrap();
}
}
impl WebSocketServer for EchoServer {
fn handle_ws_connect(&self, receiver: Receiver<Box<Message>>, sender: Sender<Box<Message>>) {
spawn(proc() {
loop {
let message = receiver.recv();
let (payload, opcode) = match message.payload {
Text(p) => (Text(p), TextOp),
Binary(p) => (Binary(p), BinaryOp),
_ => unimplemented!(),
};
let echo_message = box Message {
payload: payload,
opcode: opcode,
};
println!("{}", echo_message);
sender.send(echo_message);
}
});
}
}
fn main() {
EchoServer.ws_serve_forever();
}
さいごに
とりあえず、rust-wsだけですが、ほかも試そうとしたりしました。(が、エラー出たりして動かなかったのもある)
Clientもほしかったのですが、実装されていたrust-websocketは、サンプルがうまく動かなかった。。rust-wsもClient実装予定なので期待。
(というか、自分で実装したほうがためになりそう。。時間があれば、、)
まとめると、Rust関連ツールは今まさに開発中でおもしろさあるということです。
明日の担当予定は、 @rail44 さんです。
プログラミング言語の友達化
もう社会人4年目だということに気付き残念感でなんとも言えない気持ちなので、自分の知るプログラミング言語を友達(知り合い)化した。
- C: 幼なじみ(腐れ縁)(でも割と仲良し)
- C++: 自分より優れている、もう勝手にやってくれって思うけど尊敬する友達
- C#: 年齢が近い会社の同僚
- Java: 近くにたくさんいる2,3回話はしたことあるかもだけど友達とも言えないような人たち
- Python: 大学で出会った気の合う友達、社会人の今も仲良し
- Ruby: 同じ学校だけど違うグループにいるので話はするけど、そんなに関わりのないイケメン(サッカー部とかバスケ部のイメージ)
- Perl: 会社の上司(けっこう年上)、あまり話したことはない系
- Go: 最近出会ったすごい好きというわけでもないけど、別に嫌いでもない友達
- Rust: 運命的な出会い(良いか悪いかは不明)
- Javascript: 中学の時の同級生で、20代になった今は何をしているんだろう的な友達
- AltJS: 高校の時一緒だった部活のメンバー。今も仲いいやつも入れば、連絡とってない人もいる。いろんな仕事をしている人がいる、無職もいたりいなかったり
- 関数型一般: これからの人生で出会って仲良しになるかもしれない人々
- VB, Cobol: 割と近くにいるけど関わりたくない人たち
- ObjC, Swift: 這いよる影
ちょっと盛ってる+意味不明な部分もあるけど気にしない。
ちなみに今のぼくはCer(Python好き)
Tinkererのテーマを自作した話
せっかくの自分のブログなので、テーマはオリジナルがいい + Tinkererいいね->Sphinxいいねなのでやってみました。
Contents
Themeの作り方
Tinkererのルートディレクトリに_theme/my_themeを掘ります。
(my_themeはこれから自作するテーマ名なのでどんな名前でもいい)
あとは、conf.pyに
html_theme = "my_theme"
を書き込む。
my_themeの構成は
/my_theme
/static
*.css
*.js
layout.html
page.html
<sidebar_plugin>.html
theme.conf
layout.html => ブログのレイアウト全般
page.html => 各ページのレイアウト
<sidebar_plugin>.html => サイドバーに埋め込むモジュール
cssやjsなどはstatic以下に配置します。
レイアウトの変更
layout.htmlを編集していきますが、このHTMLファイルはJinja2で書かれています。
TinkererはJinja2テンプレートエンジンを多用してあるので、Jinja2を知らない場合は以下で少し勉強します。
Welcome to Jinja2 — Jinja2 2.7.2 documentation
Tinkererのテーマはブログ用にカスタムされたHTML5 Boilerplateを継承しています(Jinja2カスタム)
なので自作のテーマを作成する際も、このboilerplateを継承して作成していきます。
継承はこんな感じ。
{%- extends "boilerplate/layout.html" -%}
TinkererのboilerplateはGitHubで確認できます。
tinkerer/tinkerer/themes/boilerplate at master · vladris/tinkerer
この中のlayout.htmlを見ると、上のほうから
- 変数定義
- マクロ定義
- HTMLテンプレート
の構成になっています。
この中のHTMLテンプレートの部分にあるblockを選択して自分用にカスタマイズしていきます。 (詳しくはカスタマイズ例)
レイアウトを編集する前に、継承元やCSSの設定などをtheme.confに記述しておきます。
[theme]
inherit = boilerplate
stylesheet = my_theme.css
pygments_style = native
[options]
accent_color = #3C9EEA
Pygmentsの部分は、static内にpygments.cssがあればそちらが優先される設定です。
optionsはテンプレートエンジン内で使える変数を定義できます。
カスタマイズ例: Social Buttons
ソーシャルボタンをTinkererに追加する記事はたくさんあるので参考にさせていただきながら付けます。
- Tinkererで作ったブログにソーシャルボタンを追加する — 鉄馬の工具箱
- Tinkerer にソーシャルボタン追加 — yukimemi’s blog
- Tinkererブログにソーシャルボタンを設置する — nidenaノート
- ソーシャルボタンを設置した — 犬とキャラバン
ソーシャルボタンを付けたpage.htmlのサンプル。
{%- extends "layout.html" -%}
{%- block body -%}
{{ super() }}
<div class="social-btn">
<div class="social-container">
<!-- Twitter button -->
</div>
<div class="social-container">
<!-- Hatena button -->
</div>
<div class="social-container">
<!-- Google+ button -->
</div>
<div class="social-container">
<!-- Facebook button -->
</div>
</div>
{%- endblock -%}
レイアウトを調整したかったのでそれぞれのアイコンをdivに入れています。(divの中身は参考記事を参照)
{{ super() }}はJinja2の関数で元々(boilerplate内に)書いてある内容をそこに展開する関数です。
カスタマイズ例: Sidebar
ディレクトリ構成のところで<sidebar_plugin>.htmlと書いたファイルでカスタマイズしていきます。
この例ではTagCloudをくるくる回るやつにしてみます。
cloud_tags.htmlというファイルを作成します。
<div class="widget">
<h1>{{ text_tags_cloud }}</h1>
</div>
はじめからあったtags_cloud.htmlを参考に作っていきます。
そのまえに、conf.pyにcloud_tags.htmlを指定します。
html_sidebars = {
"**": ["recent.html", "searchbox.html", "cloud_tags.html"]
}
くるくる回るやつのいうのは、WordPressにあるくるくる回るFlashのプラグイン。
のJSの実装がGitHubに転がっていたので改造して使用してみます。
{%- set fontsize_min = 1 -%}
{%- set fontsize_max = 100 -%}
<div class="widget">
<h1>{{ text_tags_cloud }}</h1>
<script>
var tags = [];
{%- set count_min = 1 %}
{%- set count_max = tags.values()|sort|last %}
{%- for tag, x in tags|dictsort %}
{%- set size = (fontsize_max-fontsize_min)*(x-count_min)/(count_max-count_min or 1) + fontsize_min %}
tags.push(new Tag("{{ tag }}", {{ size|int }}, "{{ pathto('tags/' + taglinks[tag]) }}"));
{%- endfor %}
var tagCloud = new TagCloud(tags, 500, 500);
</script>
<div id="tagCloud"></div>
<script type="text/javascript">
tagCloud.Distribute(document.getElementById("tagCloud")).Animate();
</script>
</div>
かなり強引ですがこの際あまり気にしないでおきます。
ちなみにこのくるくる回るやつは下のほうで見れます。
Chromeだとスクロールが深いとでめっちゃぐるぐるまわります。
(Firefoxではとりあえず大丈夫)
Tinkererとあんまり関係ないこと
このブログテーマの自分なりのアレンジポイント。
Kudos
HackerNewsを眺めているとわりとよく見かける Svbtle 。
このブログにKudosボタンが設置されていて羨ましかった。
シンプルでフリーなKudosがGitHubにあったのでそちらを使えば自分専用Kudosを配置できる。
Codepenにサンプルが上がっているので参考して作ってみた。
CSSはGitHubにあるCSSを使用します。(ついでにJSも読み込みます)
<link rel="stylesheet" href="kudosplease-min.css">
<script src="kudosplease-min.js"></script>
<!-- 好きなところにKudosボタンを配置-->
<div class="kudos" data-amount="0" data-url="domain.tld/my-awesome-article"></div>
data-urlに指定したURLごとにKudosの数が保存されるので各ページに配置する場合にはページのURL等を使用するようにします。
Tinkerだと、domain.hoge/{{ pagename }}{{ file_suffix }}を使うといい。
あとは、JavascriptでKudosを作成します。
new KudosPlease({
el : '.kudos',
duration : 1500,
persistent : true,
status : {
alpha: '',
beta: '',
gamma: 'fontawesome-thumbs-up'
}
});
elにはHTMLで作成するdivのクラス名を、persistentにはkudosされた状態を保持するか否かを指定します。
statusにはアイコンを指定します。
- alpha, beta: Kudosされる前(同じのを指定する)
- gamma : Kudos後
デフォルトではFontAwesomeアイコンが使えません。
GitHubのscssのソースを参考に書けば良いのですが、TinkererにはデフォルトでFontAwesomeが読み込まれているのでコンフリクトします。
めんどうですが、直接使うアイコンだけ指定してあげます。
/*
* Use FontAwesome from Tinkerer
*/
@font-face {
font-family: 'FontAwesome';
font-style: normal;
font-weight: normal;
src: url('fontawesome-webfont.eot');
src: url('fontawesome-webfont.eot?#iefix') format('eot'),
url('fontawesome-webfont.woff') format('woff'),
url('fontawesome-webfont.ttf') format('truetype'),
url('fontawesome-webfont.svg#FontAwesomeRegular') format('svg');
}
/* 使うアイコンだけここに書く */
.fontawesome-cloud:before{content:"\f0c2"}
.fontawesome-thumbs-up:before{content:"\f087"}
[class*="fontawesome-"]:before {
font-family: 'FontAwesome';
}
というわけでKudosください。
Admonition - reStructuredText
reStructuredTextにはAdmonitionというディレクティブがあります。
これのCSSが定義されてなくてかわいそうなケースが多いので定義してあげます。
Hint
Hint書く
Important
何か重要なコト書く
Note
Noteが一番使いやすい?
Attention
というかブログに使いづらい?(Admonition)
Caution
この中のフォントだけおかしい感じにした。
Error
Use a google font <Coming Soon>( Google Fonts ).
Warning
WarningとCaution似てる(同じ)
多分便利に使えると思う(きっと)
UbuntuでUnityを使えるようになるまで with Wine
UbuntuでUnity(ゲームのほう)を動かすのに嵌ったのでメモ(主にWineで)
Wineで嵌りどころが多いのは今日に始まったことではないので、めげずに頑張りました。
バージョン情報
- Ubuntu 13.10 (Desktop)
- Unity 4.3.4
嵌まりポイントと共にインストール手順を。
新しいWineを使う
apt-get install wineで入るwineではdotnet20のインストールの時点でコケます。
Ubuntu13.10のapt-get install wineで入るwineは1.4(たしか)。
新しいUnity(4.3とか)を入れたい場合はwine1.7が必要。( wine - Can’t install dotnet - Ask Ubuntu )
wine - Can’t install dotnet - Ask Ubuntu
上記のURLにしたがって1.7をインストール。
$ sudo apt-get remove wine
$ sudo add-apt-repository ppa:ubuntu-wine/ppa
$ sudo apt-get update && sudo apt-get install wine1.7
Unityは32bit版で使う
シェルの設定ファイル(bashrc, zshrcなど)に32bit設定の変数を書いておく。
// WINEPREFIXは任意パス(自分はwine32にしている)
export WINEPREFIX=$HOME/wine32
export WINEARCH=win32
その後、winecfgコマンドを使うと、コンフィグ画面表示前にWINEPREFIXの場所にもろもろのファイルが生成される。
Unityに必要なパッケージをwinetricksを使ってインストール
guiでやりたい場合は以下のコマンドで開くGUIからインストールする。
winetricks --gui
Wineの公式に必要なパッケージについて記載があるので参考にする。
winetricksでインストール。
$ winetricks tahoma
$ winetricks d3dx9
$ winetricks dotnet20
$ winetricks corefonts
($ winetricks dotnet40)
($ winetricks forcemono)
()はoptional。
Unity(Windows版)インストーラーをダウンロードしてインストール
ここからダウンロードしてwineでインストール。
$ cd <ダウンロード先>
$ wine Unity****.exe
インストールするとデスクトップにアイコンができる。
起動するとエラー
このエラーでググると、この動画( How to install Unity3D 4 on Linux - YouTube )を見て解決している人がいた。
なにやらレジストリに’ProductID’というファイル(?)があります。(初期状態では存在しない)
追加してみます。
- $ winetricks –gui
- ‘Select the default wineprefix’を選択
- ‘Run regedit’を選択
- 右側のツリーで’HKEY_LOCAL_MASHINE>Software>Microsoft>Windows NT>CurrentVersion’を選択
- ここで右クリック、メニューの’新規>文字列値’を選択
- 名前を’ProductID’に変更
そうするとUnityが起動するようになりました。
新規プロジェクトがパスが不正だとかで作れない
一番はじめに出てくる新規作成画面で作成しようとすると、’specified path is valid unity’とエラーが発生します。
何故かどうやっても作成できません。
以下のリンクのDiscussionでは、
Unity: Downloading and Installing | Unity Cookie
Note
Hi, I’ve installed unity in wine as I am a linux user. When I make a new project I make a folder for it but I get an error: Specified path is not valid(should be a name of an nonexisting or empty directory)
Is this wine being unreliable or is there something wrong with what I am doing?
> Hi there- that’s a good question, I may just have to try it myself. It would be great to have Unity usable in Linux!
> For now, I would try a few trial-and-error fixes…first create the directory, then the project, create the directory via the “new project” dialogue, etc. It probably just Wine being a little finicky.
>> sorry, I should clarify what I said, I get the error when I make the directory in the new project dialogue. When I make it outside of the dialogue box I can’t create the project. :(
諦めて、既存のプロジェクトをWindowsのUnityからコピーしてきて起動しましょう。
既存のプロジェクト起動
やっと起動しました。
その後の嵌まりポイントがあるのかは未だ知りませんがUbuntu-WineでもUnityいけるようです。
“ubuntu unity”でググったときは、UIのほうばかり出てきてgameのほうを探してるときはかなりウザいですね。
他のバージョンでは試してませんが、現在の最新バージョン(多分)での検証でした。
FlaskでPusherを使う
FlaskでPusher使ってみたのでメモ。
Contents
登録してApp作成
Pusher | HTML5 WebSocket Powered Realtime Messaging Service
Signup。
管理画面にログインできるようになるので、New appをクリックして新しいappを作成。
とりあえず使ってみる
前に必要なモジュールを入れる。
$ mkvirtualenv Pusher_Sample
$ pip install pusher flask
App Keysにコード例があるので参考にする。
手っ取り早く、以下のコードを実行するとApp Keysのページでalertするみたいなのでpythonインタプリタからコピペで実行してみます。
import pusher
p = pusher.Pusher(
app_id='<id>',
key='<key>',
secret='<secret key>'
)
p['test_channel'].trigger('my_event', {'message': 'hello world'})
hello worldが出てくるはずです。
Debug Consoleから詳しい様子を確認できます。
試しに作ってみたやつ
((((((((((っ・ω・)っ ブ-ンをクリックすると、AjaxでPostして((((((((((っ・ωΣ[柱]ガコッ! をPusherに投げます。
Pusherになにか来たらevent1でalertするだけ。
静的なサイトにしか見えませんが、その後ろではただalertを出すためだけにPusherが働いています。
# -*- encoding: utf-8 -*-
from flask import Flask, render_template, redirect, url_for, request
import pusher
app = Flask(__name__)
app.config.from_pyfile("app.cfg")
p = pusher.Pusher(
app_id = app.config["ID"],
key = app.config["KEY"],
secret = app.config["SECRET"]
)
@app.route('/')
def index():
return render_template('index.html')
@app.route('/pusher', methods=["POST"])
def pusher():
if request.method == 'POST':
p['channel1'].trigger('event1', {'message': "((((((((((っ・ωΣ[柱]ガコッ!"})
return 'ok'
if __name__ == '__main__':
app.debug = True
app.run()
Javascriptはこんな感じ。
var pusher = new Pusher('<key>');
var channel = pusher.subscribe('channel1');
channel.bind('event1', function(data) {
alert(data.message);
});
$('#push').click( function(){
$.ajax({
type: "POST",
url: "{{ url_for('pusher') }}",
contentType: 'application/json',
success: function(data) {
console.log(data);
}
});
});
嵌ったこととか
Timestamp expired: Given timestamp (2013-06-17T15:39:38Z) not within 600s of server time (2013-06-17T17:09:21Z)
Pusherサーバと時間がずれているとダメみたい。
手元のサーバーの時間を合わせる。
$ sudo date MMddhhmmyyyy
もし合わなくて'sudo: timestamp too far in the future:'と言われたら
$ sudo -K
$ sudo date MMddhhmmyyyy
頑張って合わせたが、なんか日本の時間とはずいぶんずれたような気がしたがあまり気にしない。
おまけ - Herokuにデプロイ
手順。
1. Herokuの準備
適当なAppを追加して、Add-onにPusherのSandbox(無料版)を追加します。
gitのクローン先をコピペしてremoteに追加。
$ git remote add heroku git@heroku.com:<app name>
Pusher Add-onをクリックすると、Heroku in Pusherな管理画面が出てくる。
herokuのほうを使う。
3. HerokuのPusherを使う準備
HerokuのPusherを使う場合、Pythonのコードを書き換える必要がある。
Pusherのprivate keyを晒すわけにはいかないので、Herokuの環境変数に持たせる。
その影響で、アプリのPusherのオブジェクトを生成している部分を書き換える必要がある。
- app.config.from_pyfile("app.cfg")
- p = pusher.Pusher(
- app_id = app.config["ID"],
- key = app.config["KEY"],
- secret = app.config["SECRET"]
- )
+ p = pusher.pusher_from_url()
※参考 : pusher/pusher_client_python
pusher_from_urlは引数なしだと環境変数PUSHER_URLを参照しているので、Herokuに環境変数PUSHER_URLを追加する。
$ heroku config:app PUSHER_URL="http://<key>:<private key>@api.pusherapp.com/apps/<id>" --app <your app name>
URLはHeroku-Pusher管理画面のApp keysのRubyのexampleにあった。
C言語プロジェクトテンプレート作ってみた for Linux
仕事でC言語のプロジェクトを1-2monthでくるくる回していて、なんだかいろいろ便利したかったのでプロジェクトテンプレート作ってみた。
目的
- ノンストレスTDD
- ビルドを簡単にする(Python使う)
- メモリリーク検出(mtrace使用)
- プロジェクト開始時の設定を最小限にする
- たくさんあるプロジェクトの管理(同じ構成だと管理が便利)
- リリースに必要なファイル以外はtest/以下にあるのでごちゃごちゃしない
※ただし、これは 自分 の便利のために作られています。
※あくまで俺俺仕様です。
どんなプロジェクトに適用するの
自分のプロジェクトはライブラリになるソースを作成する作業。
実際にやることは、とある構造体とそれに関係する関数を実装するというものなので、プロジェクトの最終生成物は以下のようになる。
ProjectName/
Module1.h
Module1.c
Module2.h
Module2.c
Util.h
Util.c
これらのモジュールは主に何かしらの計算をしてくれる機能をもっている。
1つ1つのプロジェクトはそんなに大きくない(4~10ファイル程度)。
リリースのサイクルは以下。
- 仕様書・関数仕様Get
- 設計
- 実装
- 単体テスト
- 結合テスト(希望する計算結果との比較)
ということで、単体テストと結合テストのビルドがさくさくと出来るのがいい。
使い方
- yymm/C_Proj_Template のsrcフォルダをローカルに配置して名前を今から作るプロジェクト名に変えます。
- そのフォルダに必要なモジュールファイル(*.h, *.c)を作成します。
- Makefileに作成したモジュールをOBJSに書き込みます(../モジュール名.o)
- test/test.cにテストを書き込みます。(void Test_関数名(CuTest* tc))
- test/jointest.cにmain関数の中に結合テストのコードを書く。
- ./build.py unittestで単体テスト
- ./build.py or ./build.py jointestで結合テスト
Note
必要に応じてMakefile内のLDLIBSやINCLUDEDに必要なものを追加する。
UnitTestフレームワーク : CuTestの使い方
CuTest.hとCuTest.cからなるとても軽量なフレームワークです。ライセンスは`The zlib/libpng License (Zlib) | Open Source Initiative <http://opensource.org/licenses/zlib-license.html>`_ 。
使い方は以下。
- 適当なファイルにテストケース(Testで始まる)を書く。
- 同封のmake-tests.shを実行する。
- 生成されたソースコードとともにビルドする。
同封のShell Scriptはテストケースからmain関数を含むソースコードを生成しているだけなので、その他のスクリプト言語でも書ける。
このプロジェクトテンプレートでは、Pythonで書いたビルドスクリプト内で自動生成している。
定義してあるAsset関数は最小限のみ。
void CuAssert(CuTest* tc, char* message, int condition);
void CuAssertTrue(CuTest* tc, int condition);
void CuAssertStrEquals(CuTest* tc, char* expected, char* actual);
void CuAssertIntEquals(CuTest* tc, int expected, int actual);
void CuAssertPtrEquals(CuTest* tc, void* expected, void* actual);
void CuAssertPtrNotNull(CuTest* tc, void* pointer);
doubleのAssertや、ベクトル、マトリックスのAssertとか欲しいものがある場合には、C言語がかける場合は直接ソースコードに追加したりするといい。
CI Tools for Python
CIツールといえばJenkinsが有名。ですが、個人的なアプリのCIにはGithubやBitbucketと連携できるTravis CIやdrone.ioを使うとイケてるメンズ気分を味わえます。
という訳で、Travis CIとdrone.ioを使ってみようという話です。
- 個人的な利用なので無料枠のみの話です。
- Pythonのテストツールについての話はしません。自分はpy.test派ですので、py.testを使います。
Travis CI
Travis CI: Building a Python Project
Githubと連携してテストを実行してくれます。
自分はhgを愛用しているのですが、先日Gitを強要される世界から開放されたのでGithubのみでもなんのそのです。( gitが手になじまない人へhg-gitのススメ âneocomplcache_start_auto_complete) MemoBlog )
使い方は簡単です。
- Githubのアカウントでログイン。
- 右上の自分アイコンをクリック。
- 表示されるリポジトリ一覧からCIしたいリポジトリを片っ端からonにする。
しかし、面倒な点が.travis.ymlです。わざわざ設定ファイルを書いてリポジトリに追加しないとなりません。
設定ファイルの書き方はドキュメントにしっかり書かれています。
ちなみにPythonの設定ファイルはこんな感じになります。
language: python
python:
- "2.6"
- "2.7"
# command to install dependencies
install:
- "pip install . --use-mirrors"
- "pip install -r requirements.txt --use-mirrors"
# command to run tests
script: nosetests
ドキュメントによれば、pypyも使えるようです。
テストの結果はアイコンで出力されているのでREADNEにでも貼り付けます。
B .. image:: error.png :target: https://travis-ci.org/yymm/run_code
drone.io
Continuous Integration · drone.io
こっちはGithub、Bitbucket、Google Codeと連携できます。すげー。
Bitbucketのプライベートリポジトリを使いたい場合は、$25払うか、諦めてパブリックにしましょう。
こちらも使い方は簡単。
- GithubかBitbucketかGoogleアカウントでログイン。
- 右上のNew Projectから指定のリポジトリを選ぶ。
- 選ぶと言語も選べるので選ぶ。
- Build Scriptがこれでいいのか聞かれるのでお好みで書き換える。(自分はデフォルトでも大丈夫だった。)
Travis CIと違って設定ファイルをわざわざ作らなくていいというイケメンぶり。
選択できる言語も自分が使う分には困らなそう。PHPとPython, Ruby, HaskellがBeta版なのが気になるけど。
もちろんテストの結果はバッチで出力されます。こっちはflatな感じです。
drone.ioの良いところ
- UIがわかりやすい、Japaneseでもさくさく
- 環境変数の設定がらくらく
- 実行結果のコマンドラインが見える(Travis CIでは結果しかわからない)
- デプロイ自動化が出来る!!
drone.ioでherokuにデプロイ
Heroku, AppEngine, dotCloud, SSH, Amazon S3でデプロイが可能。
Herokuからデプロイする方法。
- herokuでnew appする。
- Application Git URLとBranchを要求されるのでherokuを見てコピペ。
- Show Deployments Keyで公開鍵を見れるので、Accountの設定にあるSSH Keyに追加する。
- Buildするとherokuへのデプロイも自動でやってくれる。