AkamaiのBilling Center API では、95/5 Mbpsという単位のデータが取得できる。
95/5 Mbps というのは、特定の期間の平均Mbpsを5分間隔でサンプルしたものをソートした時の95パーセンタイルの値ということらしい。
なぜこのような数字が使われるのかというと、単純にピークのトラフィックを基準にして課金されると利用者側にとってつらいという問題があるからだ。 インターネットのトラフィックは往々にしてスパイクが発生するので、それだと普段はほとんど帯域を使わないのに一瞬のアクセス急増があっただけでコストが大きく増大してしまう。
そこで、あるISPが95/5 Mbpsで課金するようにしたところ市場で支持を得たため、これが一般的な課金形式として広まったらしい。
gitlabもCentOSとUbuntuにはパッケージが提供されるようになったので、大分インストールが簡単になりました。
とはいえ、このパッケージはgitlab専用のマシンにインストールすることを前提にしているのか、小規模プロジェクトのために軽く使いたいよう場合ではつらいデフォルト設定となっています。安いvpsとかだと確実にメモリ不足でまともに動きません。
以下はとりあえずプライベートgitリポジトリが欲しいだけのような人のためのgitlabの設定の紹介です。
https://www.gitlab.com/downloads/
ここからgitlabのパッケージをダウンロードします。 omnibus-ruby でつくられた全部入りパッケージなのでインストールでのコンフリクトは発生しないはずですが、既に稼動中のサービス(apache等)のことはあまり考慮されてないので使用するポートについては個別対応が必要です。
特に以下は注意が必要です。
ここでは、apacheが稼動しているubuntuにインストールします。
普通にインストールします。
$ sudo dpkg -i gitlab_6.6.4-omnibus-1.ubuntu.12.04_amd64.deb $ sudo gitlab-ctl reconfigure
ちなみにgitユーザが既に存在しているとこけるので消しておきます
$ sudo userdel -r git
gitlabの設定は /etc/gitlab/gitlab.rb に設定をかいて、chefで設定します。
$ cat /etc/gitlab/gitlab.rb external_url "http://gitlab.example.com:8081" unicorn["worker_processes"] = 1 postgresql["shared_buffers"] = "128MB" postgresql["effective_cache_size"] = "32MB"
とりあえずpostgresqlがメモリを大量に食うので適当に減らします。
unicornもメモリ食いがちなので1プロセスにします。
external_url
にポートも含めたURLをかきます。apacheが80番で起動してるとnginxが起動できないので適当にはずします。ちなみに8080はデフォルトだとgitlabのunicornがつかっています。
このあたりは環境に応じて適当に設定してください。
gitlab-ctl reconfigure
すると設定が反映されます。
その他の設定できる項目は /opt/gitlab/embedded/cookbooks/gitlab
以下のcookbook
をみるといいです。
80番で起動しているapacheがいる場合はnginxにproxyします。
<VirtualHost *:80> ServerName gitlab.example.com DocumentRoot /opt/gitlab/embedded/service/gitlab-rails/public CustomLog /var/log/apache2/gitlab_access.log combined ErrorLog /var/log/apache2/gitlab_error.log ErrorDocument 502 /502.html <Directory "/opt/gitlab/embedded/service/gitlab-rails/public"> Options FollowSymLinks </Directory> <Proxy *> AddDefaultCharset off Order deny,allow Allow from all </Proxy> ProxyVia On ProxyPreserveHost On ProxyRequests Off ProxyPass /assets/ ! ProxyPass /uploads/ ! ProxyPass / http://localhost:8081/ retry=1 ProxyPassReverse / http://localhost:8081/ </VirtualHost>
以上ができたらapache再起動して、 http://gitlab.example.com にアクセスしてみてうまく表示できれば完了です。
]]>
https://github.com/mojombo/toml
Tom's Obvious, Minimal Language (TOML) とはgithubの中の人が提案している設定ファイルのためのミニ言語で、以下のような特徴があります。
例えば、YAMLを設定ファイルに使っているシステムは多いですが、YAMLの仕様書は80ページもあり正しく使うのは意外と大変です。1
またJSONはカッコやダブルクオートの割合が多すぎますし、コメントも使えません。2
TOMLをつかえばそのようなストレスはありません。
TOMLの書き方は本家のドキュメント をみてもらえばすぐわかると思います。
TOMLのライブラリは各種言語に対応したものが既にたくさんあります。 言語によっては複数の実装が存在するものもありますが、とりあえずはgithub上でのstarの数が一番多いものから試すといいと思います。
わざわざ説明するほどの内容でもないですが、ここでは一応rubyでの使い方を紹介します。
gem install toml
でインストールして、以下のようにするだけです。YAMLの場合と大体同じですね。
require 'toml' TOML.load("thing = 9") # => {"thing" => 9} TOML.load_file("my_file.toml") # => {"whatever" => "keys"}
M-x list-packages
からインストールできます。TOMLという設定ファイルのための新しいフォーマットを紹介しました。 設定ファイルにYAMLやJSONつかってるひとはTOMLに移行すると幸せになれるかもしれません。
仕様を正確に実装したYAMLパーサはほとんど存在しないとかいう話もちらほら ↩
概要を以下にメモ
cat
になっている内容を任意のシェルスクリプトにする参考: http://superuser.com/questions/45740/fast-user-switching-apple-menu/46308#46308
何回やってもpostfixの設定の仕方を覚えられないので、今更ながら最低限のプロトコルを理解するためにtelnetからsmtpでメールを送信してみようと思い立ちました。
以下は自分のgmailアドレスにtelnetでメールしてみたときの個人的な手順メモです。
普通のメールアドレスの@以下はドメイン名になっている場合がほとんどですが、DNSのAレコードに登録されているのはホスト名なのでメールサービスを提供しているホスト名を調べる必要があります。そのときに使うのがMXレコードで、nslookupでも以下のようにして調べることができます。
% nslookup -type=mx gmail.com Server: 192.168.1.1 Address: 192.168.1.1#53 Non-authoritative answer: gmail.com mail exchanger = 5 gmail-smtp-in.l.google.com. gmail.com mail exchanger = 10 alt1.gmail-smtp-in.l.google.com. gmail.com mail exchanger = 20 alt2.gmail-smtp-in.l.google.com. gmail.com mail exchanger = 30 alt3.gmail-smtp-in.l.google.com. gmail.com mail exchanger = 40 alt4.gmail-smtp-in.l.google.com. Authoritative answers can be found from:
複数のホストが優先度をつけて登録されているので、この場合は gmail-smtp-in.l.google.com を使えばいいということになるみたいです。
smtpはテキストベースのプロトコルなのでtelnetからそのままサーバとやりとりできます。 smtpプロトコルの詳細は省略しますが、最低限必要なコマンドは以下の5つだけ。
% telnet gmail-smtp-in.l.google.com 25 Trying 173.194.79.26... Connected to gmail-smtp-in.l.google.com. Escape character is '^]'. 220 mx.google.com ESMTP k8si26817952pax.291 - gsmtp HELO 250 mx.google.com at your service MAIL FROM:<username@yourhostname> 250 2.1.0 OK k8si26817952pax.291 - gsmtp RCPT TO:<[email protected]> 250 2.1.5 OK k8si26817952pax.291 - gsmtp DATA 354 Go ahead k8si26817952pax.291 - gsmtp Subject: xxx From: yyy To: zzz . 250 2.0.0 OK 1361347877 k8si26817952pax.291 - gsmtp QUIT 221 2.0.0 closing connection k8si26817952pax.291 - gsmtp Connection closed by foreign host.
gmail上でメールがきているか確認します。DATA部分を適当に書くとスパム判定されてしまいますが一応届くはず。
上記は直接gmailのsmtpサーバで送信しましたが、mailコマンドからローカルのpostfix経由で送るにはpostfixを適切に設定する必要があります。
MAIL FROMのドメイン部分を省略した場合は、myoriginの値になった
MAIL FROMで使われるのはmyoriginの値になるようなので、送信だけでよいのであればmyoriginのIPが送信元のグローバルIPに一致するように設定しさえすればよいということですかね。
ちなみに、debianのaptからpostfixを「ローカルのみ」の設定でインストールしてしまうと、デフォルトのmain.cfにリレーしない設定になっているので、main.cfを以下のようにコメントアウト。
# default_transport = error # relay_transport = error
あと、sakura vpsのお試し期間中はメール送信できない仕様なので、sakura vpsで試す際は注意。
]]>Favorite Linux Commands(http://clippy.in/b/YJLM9W) で紹介されてたコマンドのうち知らなかったものをメモ。
入力されたコマンドを指定されたタイミングで実行するようにスケジュールする。 cronに登録するほどでもない単発のコマンドを実行したいときとかにつかう。 時間の指定には現在の時刻からの経過時間や絶対時間の他にteatimeやmidnightといった文字列もつかえる。 ちなみにteatimeは午後4時。 出力先を指定しなければコマンドの出力はcronと同じようにメールにとぶ。$TTYにリダイレクトしてやればコマンドを実行した端末に表示させることもできる。
例
echo "echo おやつの時間です > $TTY"| at teatime echo "echo はろー > $TTY" | at now + 3 minute
tracerouteとpingをあわせたようなもの。tracerouteより表示がみやすい。 ネットワークのどこで時間がかかってるのか一目でわかる。
例
mtr mojavy.com
入力テキストをいい感じのカラム表示にフォーマットしてくれる。 縦に長い出力するコマンドとか、そのままだと出力がみづらいときとかにつかう。
例
gem list | column mount | column -t grep -v '^#' /etc/apt/sources.list | column -t
端末をリセットする。 うっかりバイナリファイルをcatとかしてしまって端末が壊れてしまった場合に端末を閉じずに復帰できる。
ssh経由でリモートのファイルシステムをマウントできる。
例
sshfs name@server:/path/to/dir /path/to/mount/point fusermount -u /path/to/mount/point # unmount
以下はコマンド自体の機能ではないけど覚えておくと便利かもしれないもの
ifconfig.meというサイトがある。自分のグローバルIPがわかる。
dnsクエリでwikipediaのエントリーがみれる。
例
$ dig +short txt banana.wp.dg.cx "Banana is the common name for herbaceous plants of the genus Musa and for the fruit they produce. It is one of the oldest cultivated plants. They are native to tropical South and Southeast Asia, and are likely to have been first domesticated in Papua New " "Guinea. Today, they are cultivated throughout the tropics. They are grown in at least 107 countries, primarily for their... http://en.wikipedia.org/wiki/Banana"
The Web engineer's online toolboxというまとめ記事が便利そうだったので、実際に試しつつ抄訳してみました。(一部のコメントと体裁は変えています。)
httpリクエストを保存するエンドポイントを作ってくれる。
Create a RequestBin のボタンをクリックするとURLが表示されるので、そこをHTTPクライアントからたたくとRequestBin側にリクエスト内容が記録される。 ソースも公開されてるのでローカルで立ちあげることもできる。
githubのwebhookのhelpも参考にどうぞ。
httpリクエストを実行してくれる。パーマリンクも作ってくれるので、POSTリクエストもコピペで他の人と共有できる。
HTTPリクエスト側でレスポンスのHTTP status codeやレスポンスやリダイレクト、cookieなどを制御できる。HTTPクライアントのテストに便利。
HTTPのリソースをチェックしてくれる。問題を検出したら改善案のサジェストもしてくれる。
webhookを簡単に作るためのAPIを提供している。現在はまだベータっぽい。
ウェブページをスクレイピングしてJSON API化してくれる。 CSSセレクタかxpathに名前をつけて設定するだけでよしなにやってくれる。
前述のREDbotはHTTPをチェックしてくれるけど、こちらはHTMLドキュメントがW3Cに準拠してるかをバリデートしてくれる。
こちらはRSSとATOMフィードをバリデートしてくれる。
リンクを再帰的にたどって、重複やリンク切れをチェックしてくれる。
ウェブサイトのモニタリングサービス。定期的にpingして、問題があった場合はメール通知してくれる。
ウェブページのロード時間を計測、解析してくれる。リクエストを実行するサーバは米国しかないので国内だとちょっと使いづらい。 類似サービスのWeb page testならTokyoが選べる。
HTTP tracking toolsで生成されたHTTP Archive (HAR)形式のログをビジュアライズしてくれる。
クロスドメインでjsを実行できるようにヘッダを追加してレスポンスしてくれるプロキシ。
ブラウザ上で動くインタラクティブなクロスブラウザ。メジャーなブラウザは大体サポートされている。 動作は重いけど表示確認くらいになら無料のままでも使えそう。
WebSocketをテストできるエコーサーバ。
ウェブサービスからとってきたデータをSQLっぽい言語で整形できる。
ウェブサービスをGUIでマッシュアップできる。
良い感じのREST APIドキュメントをインタラクティブなインスペクタをつかってジェネレートできる。まだベータ。
これまでandroidアプリを開発しててはまったことがたまってきたのでまとめておきます。順不同です。 その2はまたねたがたまってきたらたぶんそのうち。
Viewをフェードアウトして親Viewからremoveする、というような動作をしたい場合に、普通にonAnimationEndの中でremoveViewとかするとNullPointerExceptionでおちます。onAnimationEndの中でViewの階層構造を操作するような処理をしてはだめらしいです。回避するには、Handlerをつかってタイミングをずらしてやるとよいです。
AnimationさせるViewには親Viewが存在している必要があります。WindowManagerはViewではないので、WindowManagerにaddViewしたViewをアニメーションさせたい場合は空のRelativeLayoutとかにaddViewしてから、RelativeLayoutのほうをWindowManagerにaddViewしてやる必要があります。
WindowManagerにもaddViewできますが、通常のViewとは挙動が違います。
回転やキーボード表示のタイミングでもonCreateがよばれます。AndroidManifest.xmlでconfigChangesを設定することで回避できます。
popupWindowのsetWidth, setHeightは次回以降の表示サイズしか変えられません。既に表示しているポップアップウィンドウのサイズはそのままです。invalidateしても無駄です。
コネクションプールとkeepaliveがらみで問題が発生する場合があるみたいです。SDKのバージョンとウェブサーバ側の設定も影響します。
System.setProperty("http.keepAlive", "false")
で回避はできるようです。これに遭遇したときは、org.apache.http.impl.client.DefaultHttpClientの方を使うことにしたので詳細は追ってません。
httpsでリクエストを投げると、ウェブサーバ側の負荷が高いわけでもネットワークが細いわけでもないのに、返ってくるまでなぜか数秒かかる場合があります。こちらもkeepaliveがらみの問題っぽいです。これもウェブサーバ側の設定が影響します。 試した限りでは以下のような状況でした。
ここ( http://hc.apache.org/httpclient-3.x/sslguide.html ) のKnown limitations and problemsをみるとそれっぽい既知の問題があるようですが、根が深そうだったので詳細は追ってません。
なぜかeclipseでAndroid pluginが動かなくなるときがありました。詳細をメモるのを忘れてしまいましたが、以下の手順で直ったような気がします。
通常ビューのスケールとWebViewのスケールは別です。setScaleで調整する必要があります。 これはたぶんiOSでも同様かと。
android.jar内のコードはdalvikvmの外で実行することはできません。問答無用でタイトルの例外が飛びます。 エラーメッセージはもうちょいなんとかならなかったのか。
参考
リソースIDを列挙しているRパッケージはjarにそのまま入れることはできますが、そのリソースIDは不正なものとなります。 ライブラリにリソースを含めたい場合は、ソースも含めたプロジェクトをまるごと配布するしかないようです。
ごく小さなアイコン画像だけとかであればバイナリデータをソース中に埋め込んでしまう、というのも手です。 iOSならBundleという仕組みがあります。
androidでもmavenは使えますが、androidのmavenプロジェクトは通常の方法(mvn eclipse:eclipse)ではeclipseにインポートできません。 以下のファイルを手動でつくってみたらとりあえずいけました。
<?xml version="1.0" encoding="UTF-8"?> <classpath> <classpathentry kind="src" path="src/main/java"/> <classpathentry kind="src" path="gen"/> <classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/> <classpathentry kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/> <classpathentry kind="output" path="bin/classes"/> </classpath>
<?xml version="1.0" encoding="UTF-8"?> <projectDescription> <name>project-name</name> <comment></comment> <projects> </projects> <buildSpec> <buildCommand> <name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name> <arguments> </arguments> </buildCommand> <buildCommand> <name>com.android.ide.eclipse.adt.PreCompilerBuilder</name> <arguments> </arguments> </buildCommand> <buildCommand> <name>org.eclipse.jdt.core.javabuilder</name> <arguments> </arguments> </buildCommand> <buildCommand> <name>com.android.ide.eclipse.adt.ApkBuilder</name> <arguments> </arguments> </buildCommand> </buildSpec> <natures> <nature>com.android.ide.eclipse.adt.AndroidNature</nature> <nature>org.eclipse.jdt.core.javanature</nature> </natures> </projectDescription>
# Project target. target=android-10 # if it is a library # android.library=true
まあ、なんというか、Androidはいろいろ残念ですね。
iOSはこういう仕様なのかバグなのかよくわからないようなものが少ないし、OSバージョンの入れ換わりが早くて対応バージョンも少なくて済む分、個人的な体感ではandroidアプリの工数はiOSの3割増しという感じ。
]]>Ubuntu 12.04 で日本語フォントのはいったpdfを開くと、日本語の部分が空白になって以下のようなエラーログが表示されてしまっていた。
Error (13373): No font in show/space Error (13412): No font in show/space Error (13497): No font in show/space Error (13515): No font in show Error (13555): No font in show/space Error (13572): No font in show Error (13607): No font in show/space Error: Missing language pack for 'Adobe-Japan1' mapping Error: Missing language pack for 'Adobe-Japan1' mapping Error: Missing language pack for 'Adobe-Japan1' mapping Error: Missing language pack for 'Adobe-Japan1' mapping Error: Missing language pack for 'Adobe-Japan1' mapping Error: Missing language pack for 'Adobe-Japan1' mapping Error: Missing language pack for 'Adobe-Japan1' mapping Error: Unknown font tag 'C0_0' Error (231): No font in show Error: Unknown font tag 'C0_1'
pdfビューワはDocument Viewerでもokularでも同様だった。
そこで、このあたりを参考に、
sudo apt-get install poppler-data
としたらちゃんと表示されるようになった。
]]>redmineからとぶメールのヘッダにはX-Redmine-Issue-AuthorとかX-Redmine-Issue-Assigneeとかついているのでフィルタが簡単にできます。
いままでgmailでフィルタリングしてたので気付かなかった。。
メールクライアントはgmailのウェブアプリで十分だと思ってましたが、メーラはデスクトップアプリのほうが便利ですね。
]]>