mojavy.com

pthreadの取り消しポイント(cancellation point)についてのメモ

March 18, 2014 at 09:41 PM | categories: unix, programming |

cancellation pointsとは、スレッドのキャンセル種別がdeferredのときに、そこに到達したときにはじめて実際にそのスレッドのキャンセル要求が処理されるような関数のこと。

POSIX.1では、基本的にはブロックするような関数がcancellation pointsであることが要求されている。

参考



gitlab 6.6.4 CE のゆるふわセットアップ

March 11, 2014 at 02:08 AM | categories: chef, git, tips, gitlab |

gitlabもCentOSとUbuntuにはパッケージが提供されるようになったので、大分インストールが簡単になりました。

とはいえ、このパッケージはgitlab専用のマシンにインストールすることを前提にしているのか、小規模プロジェクトのために軽く使いたいよう場合ではつらいデフォルト設定となっています。安いvpsとかだと確実にメモリ不足でまともに動きません。

以下はとりあえずプライベートgitリポジトリが欲しいだけのような人のためのgitlabの設定の紹介です。

準備

https://www.gitlab.com/downloads/

ここからgitlabのパッケージをダウンロードします。 omnibus-ruby でつくられた全部入りパッケージなのでインストールでのコンフリクトは発生しないはずですが、既に稼動中のサービス(apache等)のことはあまり考慮されてないので使用するポートについては個別対応が必要です。

特に以下は注意が必要です。

  • nginx
  • redis
  • postgresql

ここでは、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の設定

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をみるといいです。

webサーバの設定

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 にアクセスしてみてうまく表示できれば完了です。



自炊した書籍のpdfのコントラストを3clickくらいで上げる方法 on Mac OS X

March 07, 2014 at 12:09 AM | categories: osx, mac |

preview app

スキャンしたpdf書籍だと、自炊業者にやってもらったとしても、どうしても文字が薄くなってしまいます。 業者によっては補正オプションがついてたりもしますが、preview.appのexport機能を使えば簡単にコントラストをあげられます。

メニューバー > ファイル > 書き出す > Quartzフィルタ > Lightness Decrease

で適当なところに保存。

menu menu2

以下は実行前後のサンプル。これだけだとわかりにくいかもしれないけど、文字がぎっしりしたページだとコントラストが高い方が断然読みやすい。

before after

大きいファイルサイズのpdfだとそれなりに時間(数分くらい)はかかるので注意。

参考: http://osxdaily.com/2011/10/24/increase-the-contrast-of-a-pdf-to-sharpen-darken-text/



chefを使うのを我慢したほうがいいとき

March 07, 2014 at 12:09 AM | categories: chef |

chefを使いはじめるとあらゆるもののセットアップをchefレシピ書かずにやるのが気持ち悪くなってしまうけど、chefでやらないほうがいいものって結構あると思う。

  • redmine
  • gitlab
  • 小規模なシステムのzabbixのマスター
  • etc...

この手のものは、実際に使いはじめると多少は手作業での運用が必要になるので、誰かがつくったcookbookでいれてしまうよりかは手作業でいれてある程度どこになにがあるか把握しておいたほうがやりやすい。

自前でレシピ書いてもいいけど、当面は1台あれば十分なのであれば単なる二度手間でしかないのでセットアップ手順をメモに残す程度で十分。1

ある程度運用経験があってとりあえずすぐに動く環境を作りたい、という場合のみ出来合いのcookbookをそのまま使えばいいと思う。

などということを、1ヶ月くらいかけていろいろcookbook書いたあげく心が折れたときに感じた。


  1. まめにredmineみたいなものをアップデートしたいような人もたぶんあんまりいない 



malloc+memsetとcallocの違いについて

March 05, 2014 at 09:25 PM | categories: os, programming |

malloccallocの違いは、表面的には引数の数とcallocは確保した領域を0で初期化するという点くらいですが、以下のコードを大きなnで実行すると、今時のOSだとmalloc + memsetのほうが大幅に遅くなる可能性があります。

void *p = malloc(n * sizeof(type));
memset(p, 0, n * sizeof(type));
void *p = calloc(n, sizeof(type));

カーネルはセキュリティ上の理由からメモリを0で初期化してからユーザプロセスに渡します。

しかし、仮想メモリをサポートしたシステムでは、実際にそのメモリに書き込みが発生するまでカーネルはread onlyな領域を複数プロセスで共有させることができるため、既に初期化してあるページであればこの処理を省略できる場合があります。

brkで拡張した領域は0で初期化されているので、callocは新規確保した領域は初期化を省略することができ、結果的にcallocを実行したタイミングでは初期化が実際にはほとんど発生しない、ということがありえます。

一方memsetの場合は実際にメモリへの書込みが発生する上、ページの共有もできなくなるためswapする可能性もあります。



ちなみに、(カーネルではなく)calloc自身が0初期化する処理と、memsetの処理は微妙に違います。 なぜなら、memsetは対象の領域がアラインされているかどうかについての情報なしに処理する必要があるので、境界部分は1byteずつやるしかありません。

じゃあmemsetのほうが遅いのかというと、コンパイラによってはアラインされていることを推測できる場合もあったり、callocはライブラリ関数なので移植性のために最適化しにくかったりするので、結局のところ微妙です。

参考: http://stackoverflow.com/questions/2688466/why-mallocmemset-is-slower-than-calloc



About Me

pic
mojavy

Recent posts






Categories



Badges