<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-403000531197604014</id><updated>2025-12-28T16:55:13.883+09:00</updated><category term="Ubuntu"/><category term="MySQL"/><category term="php"/><category term="Git"/><category term="Django"/><category term="Linux"/><category term="Eclipse"/><category term="Python"/><category term="Apache"/><category term="Win"/><category term="Firefox"/><category term="Linkstation"/><category term="Zend_Framework"/><category term="javascript"/><category term="netbeans"/><category term="php Zend_Framework"/><title type='text'>Slow Starter Blog</title><subtitle type='html'>スロースターターPGの技術メモ。&lt;br&gt;&#xa;Ubuntu,Python,Django,PHP,Zend Framework,MySQL,PostgreSQLあたりのトピックが多め。</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://watnab.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/403000531197604014/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://watnab.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/403000531197604014/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>WATANABE Kiyokazu</name><uri>http://www.blogger.com/profile/11213237102096419889</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>65</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-403000531197604014.post-1923551739687619138</id><published>2013-01-26T23:14:00.001+09:00</published><updated>2013-01-26T23:14:10.394+09:00</updated><title type='text'>UbuntuへのCeleryのインストール</title><content type='html'>Ubuntu12.10にCeleryをインストール。&lt;br /&gt;
Djangoアプリのバックエンドのバッチ処理用に。&lt;br /&gt;
Cronでも十分だけど、今後を考えて。&lt;br /&gt;
&lt;br /&gt;
pipでインストール。&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;sudo pip install celery django-celery&lt;/span&gt;&lt;/blockquote&gt;
インストール中にネイティブライブラリのコンパイルにPython.hが無い、という&lt;br /&gt;
コンパイルエラーが出る場合、python-devをaptでインストールします。 &lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;sudo apt-get install python-dev&lt;/span&gt;&lt;/blockquote&gt;
settings.pyは&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;INSTALLED_APPS = (&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &#39;django.contrib.auth&#39;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &#39;django.contrib.contenttypes&#39;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &#39;django.contrib.sessions&#39;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &#39;django.contrib.sites&#39;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &#39;django.contrib.messages&#39;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &#39;django.contrib.staticfiles&#39;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &#39;django.contrib.admin&#39;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &#39;django.contrib.humanize&#39;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &#39;south&#39;,&lt;br /&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp; &#39;kombu.transport.django&#39;,&lt;br /&gt;+&amp;nbsp;&amp;nbsp;&amp;nbsp; &#39;djcelery&#39;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &#39;myapp&#39;,&lt;br /&gt;)&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;+#celery&lt;br /&gt;&lt;/span&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;+BROKER_URL = &quot;django://&quot;&lt;/span&gt;&amp;nbsp; &lt;br /&gt;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;+import djcelery&lt;br /&gt;+djcelery.setup_loader()&lt;/span&gt;&amp;nbsp; &lt;/blockquote&gt;
こんな感じで追加。&lt;br /&gt;
&lt;br /&gt;
そしてmyapp/tasks.pyを作り、&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;from celery.task.schedules import crontab&amp;nbsp; &lt;br /&gt;from celery.decorators import periodic_task&lt;br /&gt;&lt;br /&gt;@periodic_task(run_every=crontab(hour=&quot;*&quot;, minute=&quot;*&quot;, day_of_week=&quot;*&quot;))&amp;nbsp; &lt;br /&gt;def test(*args, **kwargs):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print &quot;TEST!&quot;&lt;/span&gt;&lt;/blockquote&gt;
こんなふうに書く。&lt;br /&gt;
&lt;br /&gt;
試す。&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&amp;gt;python manage.py celery worker -B&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
死ぬ。こんな感じのが出る。&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;*** glibc detected *** /usr/bin/python: munmap_chunk(): invalid pointer: 0x00007f5b9ee73fd4 ***&lt;br /&gt;======= Backtrace: =========&lt;br /&gt;/lib/x86_64-linux-gnu/libc.so.6(+0x7eb96)[0x7f5b9fe10b96]&lt;br /&gt;/usr/local/lib/python2.7/dist-packages/_billiard.so(+0x40db)[0x7f5b9eebd0db]&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&lt;i&gt;（中略）&lt;/i&gt; &lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;Traceback (most recent call last):&lt;br /&gt;&amp;nbsp; File &quot;&amp;lt;string&amp;gt;&quot;, line 1, in &amp;lt;module&amp;gt;&lt;br /&gt;&amp;nbsp; File &quot;/usr/local/lib/python2.7/dist-packages/billiard/forking.py&quot;, line 528, in main&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; self = load(from_parent)&lt;br /&gt;&amp;nbsp; File &quot;/usr/lib/python2.7/pickle.py&quot;, line 1378, in load&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return Unpickler(file).load()&lt;br /&gt;&amp;nbsp; File &quot;/usr/lib/python2.7/pickle.py&quot;, line 858, in load&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dispatch[key](self)&lt;br /&gt;&amp;nbsp; File &quot;/usr/lib/python2.7/pickle.py&quot;, line 1133, in load_reduce&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; value = func(*args)&lt;br /&gt;&amp;nbsp; File &quot;/usr/local/lib/python2.7/dist-packages/celery/app/utils.py&quot;, line 130, in _unpickle_app&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return pickler()(cls, *args)&lt;br /&gt;&amp;nbsp; File &quot;/usr/local/lib/python2.7/dist-packages/celery/app/utils.py&quot;, line 109, in __call__&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; self.prepare(app, **kwargs)&lt;br /&gt;&amp;nbsp; File &quot;/usr/local/lib/python2.7/dist-packages/celery/app/utils.py&quot;, line 113, in prepare&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; app.conf.update(kwargs[&#39;changes&#39;])&lt;br /&gt;&amp;nbsp; File &quot;/usr/local/lib/python2.7/dist-packages/kombu/utils/__init__.py&quot;, line 293, in __get__&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; value = obj.__dict__[self.__name__] = self.__get(obj)&lt;br /&gt;&amp;nbsp; File &quot;/usr/local/lib/python2.7/dist-packages/celery/app/base.py&quot;, line 473, in conf&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return self._get_config()&lt;br /&gt;&amp;nbsp; File &quot;/usr/local/lib/python2.7/dist-packages/celery/app/base.py&quot;, line 338, in _get_config&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; s = Settings({}, [self.prepare_config(self.loader.conf),&lt;br /&gt;&amp;nbsp; File &quot;/usr/local/lib/python2.7/dist-packages/kombu/utils/__init__.py&quot;, line 293, in __get__&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; value = obj.__dict__[self.__name__] = self.__get(obj)&lt;br /&gt;&amp;nbsp; File &quot;/usr/local/lib/python2.7/dist-packages/celery/app/base.py&quot;, line 485, in loader&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return get_loader_cls(self.loader_cls)(app=self)&lt;br /&gt;&amp;nbsp; File &quot;/usr/local/lib/python2.7/dist-packages/celery/loaders/__init__.py&quot;, line 23, in get_loader_cls&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return symbol_by_name(loader, LOADER_ALIASES)&lt;br /&gt;&amp;nbsp; File &quot;/usr/local/lib/python2.7/dist-packages/kombu/utils/__init__.py&quot;, line 80, in symbol_by_name&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; module = imp(module_name, package=package, **kwargs)&lt;br /&gt;&amp;nbsp; File &quot;/usr/lib/python2.7/importlib/__init__.py&quot;, line 37, in import_module&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; __import__(name)&lt;br /&gt;&amp;nbsp; File &quot;/usr/local/lib/python2.7/dist-packages/djcelery/loaders.py&quot;, line 15, in &amp;lt;module&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; from django import db&lt;br /&gt;&amp;nbsp; File &quot;/usr/local/lib/python2.7/dist-packages/django/db/__init__.py&quot;, line 11, in &amp;lt;module&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if DEFAULT_DB_ALIAS not in settings.DATABASES:&lt;br /&gt;&amp;nbsp; File &quot;/usr/local/lib/python2.7/dist-packages/django/utils/functional.py&quot;, line 184, in inner&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; self._setup()&lt;br /&gt;&amp;nbsp; File &quot;/usr/local/lib/python2.7/dist-packages/django/conf/__init__.py&quot;, line 42, in _setup&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; self._wrapped = Settings(settings_module)&lt;br /&gt;&amp;nbsp; File &quot;/usr/local/lib/python2.7/dist-packages/django/conf/__init__.py&quot;, line 95, in __init__&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; raise ImportError(&quot;Could not import settings &#39;%s&#39; (Is it on sys.path?): %s&quot; % (self.SETTINGS_MODULE, e))&lt;br /&gt;ImportError: Could not import settings &#39;myproj.settings&#39; (Is it on sys.path?): cannot import name connection&lt;/span&gt;&lt;/blockquote&gt;
ImportErrorではあるけども、その前にglibcのエラーがドバドバ出るので&lt;br /&gt;
sys.path云々ではなく拡張モジュールがおかしいんだろう。&lt;br /&gt;
&lt;br /&gt;
githubのissueを色々みたところ、&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
/usr/local/lib/python2.7/dist-packages/_billiard.so を消せ&lt;/blockquote&gt;
というのがあって、たしかにそれを消すとOKなんだけども、&lt;br /&gt;
そうすると起動時に&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;span&gt;[2013-01-26 22:46:14,897: WARNING/MainProcess] /usr/local/lib/python2.7/dist-packages/billiard/__init__.py:318: RuntimeWarning: force_execv is not supported as the billiard C extension is not installed&lt;/span&gt;&lt;/blockquote&gt;
とか出てなんかちょっと気分が悪い。&lt;br /&gt;
&lt;br /&gt;
個人的な趣味で、オプション付ける方を選ぶ。&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;&amp;gt;python manage.py celery worker -B&lt;/span&gt;&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&amp;nbsp;-------------- celery@ubuntu v3.0.13 (Chiastic Slide)&lt;br /&gt;---- **** ----- &lt;br /&gt;--- * ***&amp;nbsp; * -- [Configuration]&lt;br /&gt;-- * - **** --- . broker:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; django://localhost//&lt;br /&gt;- ** ---------- . app:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; default:0x3885090 (djcelery.loaders.DjangoLoader)&lt;br /&gt;- ** ---------- . concurrency: 2 (processes)&lt;br /&gt;- ** ---------- . events:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OFF (enable -E to monitor this worker)&lt;br /&gt;- ** ---------- &lt;br /&gt;- *** --- * --- [Queues]&lt;br /&gt;-- ******* ---- . celery:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; exchange:celery(direct) binding:celery&lt;br /&gt;--- ***** ----- &lt;br /&gt;&lt;br /&gt;[2013-01-26 22:53:13,887: WARNING/MainProcess] celery@ubuntu ready.&lt;br /&gt;[2013-01-26 22:54:04,286: WARNING/PoolWorker-2] TEST!&lt;/blockquote&gt;
動いた。&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://watnab.blogspot.com/feeds/1923551739687619138/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://watnab.blogspot.com/2013/01/ubuntucelery.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/403000531197604014/posts/default/1923551739687619138'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/403000531197604014/posts/default/1923551739687619138'/><link rel='alternate' type='text/html' href='http://watnab.blogspot.com/2013/01/ubuntucelery.html' title='UbuntuへのCeleryのインストール'/><author><name>WATANABE Kiyokazu</name><uri>http://www.blogger.com/profile/11213237102096419889</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-403000531197604014.post-5651770231861521654</id><published>2013-01-26T12:57:00.001+09:00</published><updated>2013-01-26T12:57:16.654+09:00</updated><title type='text'>djceleryをsouthと使ってschemamigrationが上手くいかない場合の対処法</title><content type='html'>Djangoのプロジェクトで、バックエンド処理にCeleryを使い始めました。&lt;br /&gt;
Southも使っています。&lt;br /&gt;
&lt;br /&gt;
celeryとdjango-celeryはpipでインストールしました。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
settings.pyはこんな感じです。&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
INSTALLED_APPS = (&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &#39;django.contrib.auth&#39;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &#39;django.contrib.contenttypes&#39;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &#39;django.contrib.sessions&#39;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &#39;django.contrib.sites&#39;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &#39;django.contrib.messages&#39;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &#39;django.contrib.staticfiles&#39;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &#39;django.contrib.admin&#39;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &#39;django.contrib.humanize&#39;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &#39;south&#39;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &quot;kombu.transport.django&quot;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &#39;djcelery&#39;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &#39;myapp&#39;,&lt;br /&gt;)&lt;/blockquote&gt;
動かすにはdjcelery用のテーブルを作る必要があります。&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
manage.py schemamigration djcelery --init&lt;/blockquote&gt;
しかし、pipでインストールした事により、djceleryは&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
/usr/local/lib/python2.7/dist-packages/djcelery&lt;/blockquote&gt;
にインストールされるので、ユーザ権限でmigrationディレクトリが作成できません。&lt;br /&gt;
&lt;br /&gt;
回避策は、それらサードパーティーのアプリをsouthの管理下から外すことです。&lt;br /&gt;
settings.pyに以下を書き足します。&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
SOUTH_MIGRATION_MODULES = {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &#39;django&#39;: &#39;ignore&#39;,&amp;nbsp;&amp;nbsp;&amp;nbsp; #kombu.transport.djangoのこと&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &#39;djcelery&#39;: &#39;ignore&#39;,&lt;br /&gt;}&lt;/blockquote&gt;
あとは普通にmanage.py syncdbでOK。&lt;br /&gt;
&lt;br /&gt;
kombu.transport.django が &quot;django&quot; になるのは若干気になるのだけど。&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://watnab.blogspot.com/feeds/5651770231861521654/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://watnab.blogspot.com/2013/01/djcelerysouthschemamigration.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/403000531197604014/posts/default/5651770231861521654'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/403000531197604014/posts/default/5651770231861521654'/><link rel='alternate' type='text/html' href='http://watnab.blogspot.com/2013/01/djcelerysouthschemamigration.html' title='djceleryをsouthと使ってschemamigrationが上手くいかない場合の対処法'/><author><name>WATANABE Kiyokazu</name><uri>http://www.blogger.com/profile/11213237102096419889</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-403000531197604014.post-5736981638188563636</id><published>2012-10-31T13:32:00.002+09:00</published><updated>2012-10-31T14:00:27.835+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Linux"/><category scheme="http://www.blogger.com/atom/ns#" term="Ubuntu"/><title type='text'>xmodmapでvimっぽくカーソル動かせるようにした</title><content type='html'>左手マウスのおすすめ &lt;br /&gt;
&lt;a href=&quot;http://www.biwa.ne.jp/~chiro/kannkyou/mausu.htm&quot;&gt;http://www.biwa.ne.jp/~chiro/kannkyou/mausu.htm&lt;/a&gt;&lt;br /&gt;
これを見て、試してみました。&lt;br /&gt;
&lt;br /&gt;
気付いたことは&lt;br /&gt;
・左手は案外不器用で、軽いマウスだとなかなかポインタが定まらない&lt;br /&gt;
・これまでCtrlキーを常にインレンジにおさめていた左手が動くことで&lt;br /&gt;
　ショートカットキーを案外打ち損ねる&lt;br /&gt;
・右手をあまり動かさないようになると、思ったよりカーソルやPage Up/Down，Home/Endが&lt;br /&gt;
　遠く感じるようになる&lt;br /&gt;
&lt;br /&gt;
特に最後のが結構意外で、結構右手首を小指側にぐっと曲げるような動きになってしまいます。&lt;br /&gt;
&lt;br /&gt;
私はデスクのできる限り奥にモニタとキーボードを置き、 &lt;br /&gt;
デスクの上に両肘をがっちりついてタイピングするのですが、&lt;br /&gt;
これまではマウスを動かすため右腕は頻繁に肘を浮かさざるを得ず、&lt;br /&gt;
そのためカーソルなどへも特に気にせず手を動かしていました。&lt;br /&gt;
ですが、右手の動きが減ると今度はそこが気になり、&lt;br /&gt;
しばらくすると少し右手首が痛くなってきてしまいました。&lt;br /&gt;
&lt;br /&gt;
カーソルをvimっぽくhjklあたりで動かせればいいのにな…と思い、&lt;br /&gt;
xmodmapを書いてみました。&lt;br /&gt;
&lt;br /&gt;
CapsLockを押しながらhjklでカーソル、&lt;br /&gt;
y/bをHome/End、u/nをPageUp/Downにしてみました。&lt;br /&gt;
間違って押すと鬱陶しいCapsLockも殺せて一石二鳥。&lt;br /&gt;
&lt;br /&gt;
ついでに勢い余ってgにBackSpace，スペースバーにEnterまで割り当ててみたものが以下。&lt;br /&gt;
&lt;br /&gt;
~/.Xmodmap&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;clear Lock&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;remove Control = Mode_switch&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;keycode 66 = Mode_switch&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;keycode 29 = y Y Home Home&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;keycode 30 = u U Prior Prior&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;keycode 42 = g G BackSpace BackSpace&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;keycode 43 = h H Left Left&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;keycode 44 = j J Down Down&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;keycode 45 = k K Up Up&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;keycode 46 = l L Right Right&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;keycode 56 = b B End End&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;keycode 57 = n N Next Next&lt;/span&gt;&lt;br /&gt;
&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;&quot;&gt;keycode 65 = space NoSymbol Return &lt;/span&gt;&lt;/blockquote&gt;
ちなみに一応書いておくと環境はUbuntu 12.10、英語キーボードです。&lt;br /&gt;
&lt;br /&gt;
慣れたら相当快適なんじゃないかという予感を感じております。&lt;br /&gt;
&lt;br /&gt;
#HHK使えばいいんじゃねとか禁止w&lt;br /&gt;
&lt;br /&gt;
ちなみにエントリの趣旨的にもはやどうでもいいことですが&lt;br /&gt;
個人的にはマウスのボタンは入れ替えない方が使いやすく感じました。</content><link rel='replies' type='application/atom+xml' href='http://watnab.blogspot.com/feeds/5736981638188563636/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://watnab.blogspot.com/2012/10/xmodmapvim.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/403000531197604014/posts/default/5736981638188563636'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/403000531197604014/posts/default/5736981638188563636'/><link rel='alternate' type='text/html' href='http://watnab.blogspot.com/2012/10/xmodmapvim.html' title='xmodmapでvimっぽくカーソル動かせるようにした'/><author><name>WATANABE Kiyokazu</name><uri>http://www.blogger.com/profile/11213237102096419889</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-403000531197604014.post-4338395855283644831</id><published>2012-10-21T00:00:00.002+09:00</published><updated>2012-10-21T00:04:01.289+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Ubuntu"/><title type='text'>Ubuntu 12.10入れた(VirtualBox編)</title><content type='html'>Ubuntu 12.10。&lt;br /&gt;
&lt;br /&gt;
というわけでまずはメインの職場の開発環境であるVirtualBox (on Win7) に&lt;br /&gt;
クリーンインストールしてみた。&lt;br /&gt;
&lt;br /&gt;
以前のバージョンまで、VirtualBoxのゲストでは3Dアクセラレータを有効にすると&lt;br /&gt;
フルスクリーンにした時に描画がフリーズしてしまうという現象が出てしまい、&lt;br /&gt;
（参照→ &lt;a href=&quot;http://www.youtube.com/watch?v=WOLv-9VwcTc&quot;&gt;http://www.youtube.com/watch?v=WOLv-9VwcTc&lt;/a&gt; ）&lt;br /&gt;
Unity 2Dでしか使えず。&lt;br /&gt;
まあその後結局 xubuntu で使っている。&lt;br /&gt;
とりあえずインストールは普通に終了。&lt;br /&gt;
その後VirtualBox Guest Additionをインストールする必要があるが、&lt;br /&gt;
VirtualBox 4.1.22に付属のGuest Additionは、&lt;br /&gt;
Ubuntu 12.10のXの方がバージョンが新しいせいかインストールに失敗。&lt;br /&gt;
&lt;br /&gt;
さてどうしようかなと思ったが、 何のことはなく&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
sudo apt-get install virtualbox-guest-additions&lt;/blockquote&gt;
でOK。&lt;br /&gt;
&lt;br /&gt;
そして問題のフルスクリーン。&lt;br /&gt;
一応フリーズはせずちゃんと動く…が。&lt;br /&gt;
重い。重いぞこれ。&lt;br /&gt;
とりあえずCompiz ConfigでFadingやAnimationを切って&lt;br /&gt;
何とかまあ許容できるかなというレスポンスになった。&lt;br /&gt;
&lt;br /&gt;
そして次にランチャー。&lt;br /&gt;
画面は出来るだけ広く使いたくてランチャーは隠れていてほしいので&lt;br /&gt;
System SettingsのAppearanceのBehaviorタブで（私は英語でインストールしているので）で &lt;br /&gt;
Auto-hide the Launcherをonにした…ら、残念なことが。&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxbr2WqO9dt2pvB571u-7ZQd48Uzhz9HRWEkNk9DbC4vLXhudiWsrP1try6QuZSMe-OUeptEChuEaRLJf2zVP_0zBofipZbVHa91eIqctmqQlusfmL7niC3Xv6sdZhzRTbfeA1SaIJJ-Dx/s1600/A5i9J10CYAAps1a.png:large.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;222&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxbr2WqO9dt2pvB571u-7ZQd48Uzhz9HRWEkNk9DbC4vLXhudiWsrP1try6QuZSMe-OUeptEChuEaRLJf2zVP_0zBofipZbVHa91eIqctmqQlusfmL7niC3Xv6sdZhzRTbfeA1SaIJJ-Dx/s1600/A5i9J10CYAAps1a.png:large.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
ランチャーが非表示になったところの壁紙の色がおかしいまでなら全然構わないのだが、&lt;br /&gt;
そこにウィンドウを持っていったら&lt;span style=&quot;color: #0000ee;&quot;&gt;その謎の帯の下に入ってしまうという残念な現象。&lt;/span&gt;&lt;br /&gt;
これは致命的。&lt;br /&gt;
&lt;br /&gt;
というわけでさっさと諦めてxubuntuにする。さようなら新Unity。&lt;br /&gt;
色々新機能付いたLensとか見るまで行かなかったよ。&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
sudo apt-get install xubuntu-desktop&lt;/blockquote&gt;
そしてXubuntuで再起動し、色々アプリをapt-get install。&lt;br /&gt;
それと私は開発用のIDEにはAptana Studio 3を使っているのでダウンロードして展開。&lt;br /&gt;
ランチャーに登録。同梱のアイコンを設定…&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdb38fB7sxdWWv1_gbUI2LAzy6Xsv6Yt5ta-hXPhg_RhELYJIK8s8DQy2wnTJFag4s0BMkoIgaIicLFr_xAvoVwOBLWafi9Jc81CRbcNY8peJZugRJuo_NoEese-A6tnDUpm1D108VhBDi/s1600/1_001_c.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhdb38fB7sxdWWv1_gbUI2LAzy6Xsv6Yt5ta-hXPhg_RhELYJIK8s8DQy2wnTJFag4s0BMkoIgaIicLFr_xAvoVwOBLWafi9Jc81CRbcNY8peJZugRJuo_NoEese-A6tnDUpm1D108VhBDi/s1600/1_001_c.png&quot; width=&quot;318&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
なんだこれ。&lt;br /&gt;
どうやらxpm形式の扱いがうまくいかなくなってる。&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
convert icon.xpm -resize 48x48 icon.png&lt;/blockquote&gt;
変換したpngを割り当てればOK。&lt;br /&gt;
&lt;br /&gt;
そして、仕事上Google Talkをよく使うため、Empathyを設定。&lt;br /&gt;
Empathyを起動し、アカウントを追加しようとしたところ、&lt;br /&gt;
こんなダイアログが表示される。&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhh1fMF8-rHK6TqTlptXGwXXE24dDuvpvf2aFmFelpYFyraUo5xkRFE3Zkpf32hn0c1bg1sOI_YoBpM5uHnaXV5XhXDx-J4Qbzgzx0G9NOPSdkCzluuAPqNSBO3v9El1o6z4z2VVaPFp4CF/s1600/System+Settings_001.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;251&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhh1fMF8-rHK6TqTlptXGwXXE24dDuvpvf2aFmFelpYFyraUo5xkRFE3Zkpf32hn0c1bg1sOI_YoBpM5uHnaXV5XhXDx-J4Qbzgzx0G9NOPSdkCzluuAPqNSBO3v9El1o6z4z2VVaPFp4CF/s1600/System+Settings_001.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
うん？&lt;br /&gt;
&lt;br /&gt;
Empathyは、今回のUbuntuの目玉の一つである「ネットワークサービスアカウントの管理」に&lt;br /&gt;
関係していたはず。&lt;br /&gt;
ここの「Personal」の並びに「Online Accounts」というのがあったはずだが、それがない。&lt;br /&gt;
kupferでOnline Accounts打ってみるとアイコンは出るが、&lt;br /&gt;
やはり同じ画面に。&lt;br /&gt;
&lt;br /&gt;
どうやらまあ要するにXubuntuだとだめ、という状態である模様。&lt;br /&gt;
ログアウトしてUbuntuで入りなおして設定したら、&lt;br /&gt;
Xubuntuの方でもEmpathyがちゃんと動いた。&lt;br /&gt;
まあ一度設定したらしばらく変更する事はないものなのでよしとする。&lt;br /&gt;
&lt;br /&gt;
というわけでUbuntuというかXubuntu12.10。&lt;br /&gt;
特に何が変わった感じはしません。&lt;br /&gt;
そりゃXubuntuだしね。&lt;br /&gt;
&lt;br /&gt;
変わったか？と思ったこととすれば、mozcの変換候補で&lt;br /&gt;
同音異議語に「用例」が出るようになってる。&lt;br /&gt;
これはありがたい。&lt;br /&gt;
&lt;br /&gt;
あとXubuntuの壁紙はグラデーションの右下に○がいくつか並んでるようなものだけど&lt;br /&gt;
これはシンプルかつスタイリッシュでいいと思う。&lt;br /&gt;
&lt;br /&gt;
以上、何かあんまり他の人の役に立たなそうなUbuntuインストール記。</content><link rel='replies' type='application/atom+xml' href='http://watnab.blogspot.com/feeds/4338395855283644831/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://watnab.blogspot.com/2012/10/ubuntu-1210virtualbox.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/403000531197604014/posts/default/4338395855283644831'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/403000531197604014/posts/default/4338395855283644831'/><link rel='alternate' type='text/html' href='http://watnab.blogspot.com/2012/10/ubuntu-1210virtualbox.html' title='Ubuntu 12.10入れた(VirtualBox編)'/><author><name>WATANABE Kiyokazu</name><uri>http://www.blogger.com/profile/11213237102096419889</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjxbr2WqO9dt2pvB571u-7ZQd48Uzhz9HRWEkNk9DbC4vLXhudiWsrP1try6QuZSMe-OUeptEChuEaRLJf2zVP_0zBofipZbVHa91eIqctmqQlusfmL7niC3Xv6sdZhzRTbfeA1SaIJJ-Dx/s72-c/A5i9J10CYAAps1a.png:large.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-403000531197604014.post-2847315283915389745</id><published>2012-09-21T01:25:00.003+09:00</published><updated>2012-09-21T01:37:50.524+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="php"/><title type='text'>PHPのarrayの入れ子を作るのに苦労して=&amp;とunsetを使って何とかした話</title><content type='html'>PHPで、&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiJ4sPYL3TaMTZ_nULwfBQMmjAkx5yrUfUt4mYc6syOS-x3G0gdtczL9pvVaWAMS9_fu0wrieRgpOk7Z86dGBl_DPoci00PZ5y_6iKjv30zzazj_fmksgmJB4j6tCD0hxW8M2H28N3GIqV/s1600/Selection_046.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;134&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiJ4sPYL3TaMTZ_nULwfBQMmjAkx5yrUfUt4mYc6syOS-x3G0gdtczL9pvVaWAMS9_fu0wrieRgpOk7Z86dGBl_DPoci00PZ5y_6iKjv30zzazj_fmksgmJB4j6tCD0hxW8M2H28N3GIqV/s320/Selection_046.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
こんな感じのDBから読んできたデータから、&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_OoXFL6Cv_P5eVPt-ZsmYqnxoUMRlqLBCaoqwh4BAjhpWOaBCie2xYACABwAHyP1fu-RD3DaarhfMC5wQm2lWhXKEy1VzkcJaLn8ODF_ru-7Y7043w6m-cnIGKFNS9yVe3Nvi5wUYPU3a/s1600/Selection_050.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;209&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_OoXFL6Cv_P5eVPt-ZsmYqnxoUMRlqLBCaoqwh4BAjhpWOaBCie2xYACABwAHyP1fu-RD3DaarhfMC5wQm2lWhXKEy1VzkcJaLn8ODF_ru-7Y7043w6m-cnIGKFNS9yVe3Nvi5wUYPU3a/s320/Selection_050.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiialBAf8lDp8cXuUQwzSyFNlepbUrlspMayuG3zeoeNyvpZW2HvipEmM8D1ddGtgZqSR0R44CVWK_FQABF56p7y9QHTpDVx3IzucirYCCC5_tJiOvkmkr82HI6NEuID463m500SaA7Gyz0/s1600/Selection_047.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;/a&gt;&lt;/div&gt;
こんな構造を作りたいなと思ったのです。&lt;br /&gt;
&lt;br /&gt;
こんな感じかな。 &lt;br /&gt;
&lt;blockquote&gt;
&lt;pre&gt;&amp;lt;?php
//ここから
function row($type,$typeName,$value1,$value2){
    return array(&quot;type&quot; =&amp;gt; $type,
                 &quot;typeName&quot; =&amp;gt; $typeName,
                 &quot;value1&quot; =&amp;gt; $value1,
                 &quot;value2&quot; =&amp;gt; $value2);
}
$rows = array(row(1,&quot;あ&quot;,&quot;ABC&quot;,&quot;DEF&quot;),
            row(1,&quot;あ&quot;,&quot;AAA&quot;,&quot;BBB&quot;),
            row(1,&quot;あ&quot;,&quot;XXX&quot;,&quot;YYY&quot;),
            row(2,&quot;い&quot;,&quot;BEEF&quot;,&quot;PORK&quot;),
            row(2,&quot;い&quot;,&quot;COFFEE&quot;,&quot;TEA&quot;),
            row(2,&quot;い&quot;,&quot;MILK&quot;,&quot;COCOA&quot;));
//ここまではサンプルデータを作っているところなので本題とは関係なし。
//データはソートはされているものとする。

$tree = array();    // $treeが最終的なルート配列オブジェクト
$prevType = null;   // Typeが変わったらこの処理をする…というためのもの
foreach($rows as $r){  //1行ずつ読む
    if($prevType !== $r[&quot;type&quot;]){ //もしTypeが変わったら
        // 変更チェック用の変数を更新し
　　　　　$prevType = $r[&quot;type&quot;];
        // 親のノードを新規作成し、$typenodeを差し替え
        $typenode = array(&quot;type&quot; =&amp;gt; $r[&quot;type&quot;],
                          &quot;typeName&quot; =&amp;gt; $r[&quot;typeName&quot;],
                          &quot;values&quot; =&amp;gt; array()); // 親のノードは子を格納する配列を持つ
        // 作った親のノードをルート配列に追加
        $tree[] = $typenode;
    }
    // 子のノードを作成
    $valuenode = array(&quot;value1&quot; =&amp;gt; $r[&quot;value1&quot;],
                        &quot;value2&quot; =&amp;gt; $r[&quot;value2&quot;]);
    // 今の時点で $typenode で親ノードが参照出来るはずで、
    // それに対して&quot;values&quot;で引ける子ノード格納用配列に、
    // 子のノードを追加
    $typenode[&quot;values&quot;][] = $valuenode;
}
&lt;/pre&gt;
&lt;/blockquote&gt;
実行してみた結果。&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIuH4yY_jw0sqFCrSs7C6gnGtMln9h7VCA6aixki2jVqPqhoucQzeaNN542RBTUiXTKu_NdNGyOWWFISpXC1LXTMbpSRZw57vJt1bzSCrhMOya85mKP5cxlFdkFk6CLXyE_3iW90GtQYvJ/s1600/Selection_048.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;132&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjIuH4yY_jw0sqFCrSs7C6gnGtMln9h7VCA6aixki2jVqPqhoucQzeaNN542RBTUiXTKu_NdNGyOWWFISpXC1LXTMbpSRZw57vJt1bzSCrhMOya85mKP5cxlFdkFk6CLXyE_3iW90GtQYvJ/s320/Selection_048.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
（ ಠ益ಠ) &lt;br /&gt;
ステップ実行してみると、&lt;br /&gt;
&lt;blockquote&gt;
&lt;pre&gt;        :
        // 作った親のノードをルート配列に追加
        $tree[] = $typenode;
    }
        :
    // 今の時点で $typenode で親ノードが参照出来るはずで、
    // それに対して&quot;values&quot;で引ける子ノード格納用配列に、
    // 子のノードを追加
    $typenode[&quot;values&quot;][] = $valuenode;
}
&lt;/pre&gt;
&lt;/blockquote&gt;
この下の方の$valuenodeを追加しているところで、&lt;br /&gt;
「$typenode」には追加されるものの、&lt;br /&gt;
「$treeからたどれる『$typenodeと同じものであるはずのもの』」&lt;br /&gt;
には追加されているように見えない。&lt;br /&gt;
&lt;blockquote&gt;
&lt;pre&gt;        $tree[] = $typenode;
&lt;/pre&gt;
&lt;/blockquote&gt;
で、$typenodeそのものがコピーされてしまっているように見える。&lt;br /&gt;
本当は違っててその後変更が発生しそうになった時にコピーされるんだろうけど。 &lt;br /&gt;
&lt;br /&gt;
なのでこうしてみた。=&amp;amp;で参照渡し的な何かになるはずと聞いて。&lt;br /&gt;
&lt;blockquote&gt;
&lt;pre&gt;        $tree[] =&amp;amp; $typenode;
&lt;/pre&gt;
&lt;/blockquote&gt;
実行してみた結果。&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-nYnNjBWExwmxaStvBOgHefyy_CA1UYkj9ln2TnO4WOgP5loOC9gch63P8YALNvP4HCsvKN7TOBxY9bfvUl2ptQU4sLPK-sAXTvgTtOI9jx04wBNU1o_vaBgyzgc0XRIkTmNiCX43Ckkt/s1600/Selection_049.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;285&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-nYnNjBWExwmxaStvBOgHefyy_CA1UYkj9ln2TnO4WOgP5loOC9gch63P8YALNvP4HCsvKN7TOBxY9bfvUl2ptQU4sLPK-sAXTvgTtOI9jx04wBNU1o_vaBgyzgc0XRIkTmNiCX43Ckkt/s320/Selection_049.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
（╬ಠ益ಠ)&lt;br /&gt;
&lt;br /&gt;
今度は、二週目の&lt;br /&gt;
&lt;blockquote&gt;
&lt;pre&gt;        // 親のノードを新規作成し、$typenodeを差し替え
        $typenode = array(&quot;type&quot; =&amp;gt; $r[&quot;type&quot;],
                          &quot;typeName&quot; =&amp;gt; $r[&quot;typeName&quot;],
                          &quot;values&quot; =&amp;gt; array()); // 親のノードは子を格納する配列を持つ
        // 作った親のノードをルート配列に追加
        $tree[] =&amp;amp; $typenode;
&lt;/pre&gt;
&lt;/blockquote&gt;
の上の方のところで「新しいノードを作って$typenodeを差し替えた」だけのつもりが、&lt;br /&gt;
既に一周目でセットした$tree[0]の要素までも差し替わってしまった。&lt;br /&gt;
&lt;br /&gt;
参照渡し…ってそこまで参照なの！？&lt;br /&gt;
これ、そもそもマインドモデルが上の図と違ってて、模式図で表せない。&lt;br /&gt;
&lt;br /&gt;
最終的にこうしたら何とかなった。
&lt;br /&gt;
&lt;blockquote&gt;
&lt;pre&gt;$tree = array();
$prevType = null;
foreach($rows as $r){
    if($prevType !== $r[&quot;type&quot;]){
        $prevType = $r[&quot;type&quot;];
        &lt;b&gt;unset($typenode);&lt;/b&gt;
        $typenode = array(&quot;type&quot; =&amp;gt; $r[&quot;type&quot;],
                          &quot;typeName&quot; =&amp;gt; $r[&quot;typeName&quot;],
                          &quot;values&quot; =&amp;gt; array());
        $tree[] =&lt;b&gt;&amp;amp;&lt;/b&gt; $typenode;
    }
    $valuenode = array(&quot;value1&quot; =&amp;gt; $r[&quot;value1&quot;],
                        &quot;value2&quot; =&amp;gt; $r[&quot;value2&quot;]);
    $typenode[&quot;values&quot;][] = $valuenode;
}
&lt;/pre&gt;
&lt;/blockquote&gt;
差し替える前にunsetをする事で、&lt;br /&gt;
$typenodeというシンボルと実体との紐付けが解放されるので、&lt;br /&gt;
あらためて作ったarrayをセットしても既存のデータ構造に影響を与えない。&lt;br /&gt;
&lt;br /&gt;
なんだこの仕様。&lt;br /&gt;
&lt;br /&gt;
array関数で新たに配列作って変数に代入する、って&lt;br /&gt;
「mallocしてそのポインタを返す」的な感覚かと思ってたら、&lt;br /&gt;
「返す先のポインタがあったら指している領域に上書きする」みたいな&lt;br /&gt;
日本語すら怪しくなるような動きもするとは。&lt;br /&gt;
理解に苦しむ。&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://watnab.blogspot.com/feeds/2847315283915389745/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://watnab.blogspot.com/2012/09/phparray.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/403000531197604014/posts/default/2847315283915389745'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/403000531197604014/posts/default/2847315283915389745'/><link rel='alternate' type='text/html' href='http://watnab.blogspot.com/2012/09/phparray.html' title='PHPのarrayの入れ子を作るのに苦労して=&amp;とunsetを使って何とかした話'/><author><name>WATANABE Kiyokazu</name><uri>http://www.blogger.com/profile/11213237102096419889</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjiJ4sPYL3TaMTZ_nULwfBQMmjAkx5yrUfUt4mYc6syOS-x3G0gdtczL9pvVaWAMS9_fu0wrieRgpOk7Z86dGBl_DPoci00PZ5y_6iKjv30zzazj_fmksgmJB4j6tCD0hxW8M2H28N3GIqV/s72-c/Selection_046.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-403000531197604014.post-6136483159256232499</id><published>2012-09-18T11:51:00.001+09:00</published><updated>2012-09-18T11:51:46.834+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="MySQL"/><category scheme="http://www.blogger.com/atom/ns#" term="Ubuntu"/><title type='text'>mroongaのデータを壊してテーブルも消せなくなったのを何とかした風</title><content type='html'>先週末ハマった件のメモ書き。&lt;br /&gt;
これで合っているかどうか保証も何も全く無いので&lt;br /&gt;
参考にする場合は自己責任で。 &lt;br /&gt;
&lt;br /&gt;
mroongaをストレージモードで使った開発中、&lt;br /&gt;
安直な設計でテーブル作って膨大なデータのinsertクエリを実行してしまった。&lt;br /&gt;
&lt;br /&gt;
全然戻ってこないのでクエリのキャンセルをしたのだがそれでも戻ってこず。&lt;br /&gt;
mysqldのrestartも実行したが戻ってこず。&lt;br /&gt;
仕方なくkill -9で抹殺。&lt;br /&gt;
&lt;br /&gt;
その後再起動し、この設計じゃダメだなと思いdrop tableしようとしたら&lt;br /&gt;
drop tableも戻ってこない。&lt;br /&gt;
&lt;br /&gt;
プロセスリストを見てみると&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
select count(*) into @discard from `information_schema`.`PARTITIONS`&lt;/blockquote&gt;
というSQLをdebian-sys-maintが実行していて全然戻ってきていない。&lt;br /&gt;
こいつがロックしている線が濃厚。 &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
当該のSQLやdebian-sys-maintでググってみると&lt;br /&gt;
「debian系のおせっかいだからスクリプトいじって黙らせちゃえよ」&lt;br /&gt;
みたいな記事が見つかるが、&lt;br /&gt;
それもなんだかイカン気がする。 &lt;br /&gt;
&lt;br /&gt;
やけくそでmysql止めて&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
/var/lib/mysql/【スキーマ名】.mrn.*&lt;/blockquote&gt;
のファイルを全消しして&lt;br /&gt;
再起動してdrop tableしてみる。&lt;br /&gt;
瞬時にdisconnected from server的なメッセージが出て、&lt;br /&gt;
mysqldのプロセスIDが変わってる。&lt;br /&gt;
悪化／（^o^）＼&lt;br /&gt;
&lt;br /&gt;
repair tableとかあがいてみる。&lt;br /&gt;
「このエンジンはリペアとかないよ」的なメッセージが出る。&lt;br /&gt;
&lt;br /&gt;
そこでふと、以前mysqlのバージョンだけ上がってmroongaプラグインが読み込めなくなって&lt;br /&gt;
mysqlの起動が出来なくなってヒイコラした時、&lt;br /&gt;
その後drop tableは普通にできたよなーという記憶が。 &lt;br /&gt;
&lt;br /&gt;
ということでUNINSTALL PLUGINして、dropしてみる。&lt;br /&gt;
…成功！&lt;br /&gt;
&lt;br /&gt; &lt;br /&gt;
あらためてINSTALL PLUGINして、テーブル作ってまともな量insert。&lt;br /&gt;
無事動作している模様。&lt;br /&gt;
&lt;br /&gt; &lt;br /&gt;
多分こうなった場合、&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;UNINSTALL PLUGIN&lt;/li&gt;
&lt;li&gt;drop table &lt;/li&gt;
&lt;li&gt;mrnファイル削除&lt;/li&gt;
&lt;li&gt;INSTALL PLUGIN&lt;/li&gt;
&lt;li&gt;create table&lt;/li&gt;
&lt;/ol&gt;
とすればいいのかなという気がしているけど&lt;br /&gt;
実はまずいのかもしれない。不明。&lt;br /&gt;
&lt;br /&gt; &lt;br /&gt;
&lt;b&gt;やってみる場合自己責任で。&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt; </content><link rel='replies' type='application/atom+xml' href='http://watnab.blogspot.com/feeds/6136483159256232499/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://watnab.blogspot.com/2012/09/mroonga.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/403000531197604014/posts/default/6136483159256232499'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/403000531197604014/posts/default/6136483159256232499'/><link rel='alternate' type='text/html' href='http://watnab.blogspot.com/2012/09/mroonga.html' title='mroongaのデータを壊してテーブルも消せなくなったのを何とかした風'/><author><name>WATANABE Kiyokazu</name><uri>http://www.blogger.com/profile/11213237102096419889</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-403000531197604014.post-1546530832452158338</id><published>2012-08-06T13:05:00.001+09:00</published><updated>2012-08-06T13:05:42.072+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Ubuntu"/><title type='text'>ubuntuでusermod -Gでやらかしてsudo出来なくなった場合</title><content type='html'>開発PCの/var/lib/mysqlの中のファイルをいちいちsudoせずに参照したくなった。&lt;br /&gt;
ubuntuのユーザ名はadmin。 &lt;br /&gt;
mysqlグループでの権限追加して、自分もmysqlグループに入ればいいだろ。&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
$ sudo chmod g+rx /var/lib/mysql &lt;br /&gt;
$ sudo usermod -G mysql admin&lt;/blockquote&gt;
ログアウトしてログイン。&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
$ cd /var/lib/mysql&lt;/blockquote&gt;
よし入れた。&lt;br /&gt;
おっと、見たいのはこの中のデータベースごとのディレクトリ内。 &lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
$ cd db1&lt;br /&gt;bash: cd: db1: Permission denied&lt;/blockquote&gt;
おおっと、データベースごとのディレクトリにも権限を足さないといけない。&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
$ sudo chmod g+rx db1&lt;br /&gt;
[sudo] password for admin:admin is not in the sudoers file.&amp;nbsp; This incident will be reported.&lt;/blockquote&gt;
？…！！　やっちまった！&lt;br /&gt;
&lt;br /&gt;
usermod -G は所属グループを上書きするので,&lt;br /&gt;
元々所属していたsudoグループから引っ剥がされてしまった！&lt;br /&gt;
もとい、引っ剥がしてしまった orz&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
まあまあ、ありがちありがち。&lt;br /&gt;
一度深呼吸して、PCをブチ切り再起動。&lt;br /&gt;
&lt;br /&gt;
grubで[recovery mode]を選択して起動し、rootシェルを選択。&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
# mount -o rw,remount /&lt;br /&gt;
# usermod -G adm,cdrom,sudo,dip,plugdev,mysql admin&lt;br /&gt;# reboot&lt;/blockquote&gt;
再起動で復活。&lt;br /&gt;
&lt;br /&gt;
後の方のusermod -G以降は、ほぼ同じ設定で立てていたVMから拾ってきたもの。&lt;br /&gt;
そういうのが無い方でやらかしてすぐだった方は&lt;br /&gt;
/etc/group- に直前の設定が残っているので&lt;br /&gt;
rootシェルで入ったあとすぐ参照して控えましょう。 &lt;br /&gt;
&lt;br /&gt;
複数回usermodやっちゃった方は南無。&lt;br /&gt;
でもとりあえずadmとsudoぐらい入っておけば何とかなるでしょう。&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://watnab.blogspot.com/feeds/1546530832452158338/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://watnab.blogspot.com/2012/08/ubuntuusermod-gsudo.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/403000531197604014/posts/default/1546530832452158338'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/403000531197604014/posts/default/1546530832452158338'/><link rel='alternate' type='text/html' href='http://watnab.blogspot.com/2012/08/ubuntuusermod-gsudo.html' title='ubuntuでusermod -Gでやらかしてsudo出来なくなった場合'/><author><name>WATANABE Kiyokazu</name><uri>http://www.blogger.com/profile/11213237102096419889</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-403000531197604014.post-7713345672433661441</id><published>2012-06-18T00:40:00.002+09:00</published><updated>2012-06-18T00:40:18.282+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Ubuntu"/><title type='text'>Wineで3Dなソフトがうまく動かないとき</title><content type='html'>普段使っているのはIntelのしょぼいグラフィックチップのPCなのだが&lt;br /&gt;
Windows用の3DなソフトをWineで動かしてみようとしたら&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
Unhandled page fault on read access&lt;/blockquote&gt;
なんていうのが出た。&lt;br /&gt;
&lt;br /&gt;
色々調べてみたところ、テクスチャの圧縮展開ライブラリ関係に問題があるらしい。&lt;br /&gt;
まあそりゃそもそもmesaドライバだしな。&lt;br /&gt;
&lt;br /&gt;
libtxc-dxtn-s2tc というのを入れると改善するかも、とのこと。&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
sudo apt-get install libtxc-dxtn-s2tc-bin libtxc-dxtn-s2tc0&lt;/blockquote&gt;
おお。魔法のようだ。&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://watnab.blogspot.com/feeds/7713345672433661441/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://watnab.blogspot.com/2012/06/wine3d.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/403000531197604014/posts/default/7713345672433661441'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/403000531197604014/posts/default/7713345672433661441'/><link rel='alternate' type='text/html' href='http://watnab.blogspot.com/2012/06/wine3d.html' title='Wineで3Dなソフトがうまく動かないとき'/><author><name>WATANABE Kiyokazu</name><uri>http://www.blogger.com/profile/11213237102096419889</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-403000531197604014.post-5623043722636396925</id><published>2012-06-17T20:35:00.000+09:00</published><updated>2012-06-17T20:35:31.770+09:00</updated><title type='text'>Win7でユーザのログインIDなどを変更する</title><content type='html'>&lt;br /&gt;
Windows 7 は基本的にユーザの表示名が使われるようになっているので&lt;br /&gt;
表示名だけ変えれば普段は気にならないが、&lt;br /&gt;
リモートデスクトップなどで繋ぐ時に混乱の元になる。&lt;br /&gt;
&lt;br /&gt;
リモートデスクトップで繋ぐ際に指定するユーザ名称を変更するには、&lt;br /&gt;
　　管理ツール→コンピューターの管理&lt;br /&gt;
&lt;div&gt;
で&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
　　コンピューターの管理→システムツール→ローカル ユーザーとグループ→ユーザー&lt;br /&gt;
&lt;div&gt;
を開き&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
　　「名前」をクリックして変更。&lt;br /&gt;
基本的にはこれでOK。&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
ただしこれだとユーザフォルダの名前が古いままで若干気持ちが悪い。&lt;/div&gt;
&lt;div&gt;
ユーザフォルダの名称を揃えるには、別な管理者アカウントでログインし、&lt;/div&gt;
&lt;div&gt;
C:\Users\の下のフォルダ名称を変更した上で、&lt;/div&gt;
&lt;div&gt;
レジストリエディタで&lt;/div&gt;
&lt;div&gt;
　　HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\ProfileList&lt;/div&gt;
&lt;br /&gt;
の下の&lt;br /&gt;　　ProfileImagePath&lt;br /&gt;の値をそれに揃えてやる事で、&lt;br /&gt;次に該当ユーザでログインした際に辻褄が合う。&lt;b style=&quot;background-color: white; font-family: &#39;Segoe UI&#39;, Arial, Verdana, Tahoma, sans-serif; font-size: 13px; line-height: 19px; text-align: left;&quot;&gt;　&lt;/b&gt;&lt;br /&gt;
この過程で、フォルダ名を変えようとして管理者アカウントでログインする時に&lt;br /&gt;
「ユーザの切り替え」をしてしまうと、元のユーザフォルダは使用中になっていて変更できないので&lt;br /&gt;
PCごと再起動する方がよい。&lt;br /&gt;
&lt;br /&gt;
また、PCを再起動して別な管理者アカウントでログインしただけなのに&lt;br /&gt;
既に使用中になっていることもある。&lt;br /&gt;
自分の場合、Windows Media Playerのサービスがアクセスしていた。&lt;br /&gt;
　管理ツール→サービス&lt;br /&gt;
を開き、&lt;br /&gt;
　Windows Media Player Network Sharing Service&lt;br /&gt;
を「停止」させたところ、フォルダ名の変更ができた。&lt;br /&gt;
&lt;br /&gt;
フォルダ操作をしようとしたときに「使用中です」となってしまう場合、&lt;br /&gt;
&lt;a href=&quot;http://www.vector.co.jp/soft/winnt/util/se492946.html&quot; target=&quot;_blank&quot;&gt;Unlocker&lt;/a&gt;&amp;nbsp;を使うと何のプログラムがロックしているのか分かって便利。&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://watnab.blogspot.com/feeds/5623043722636396925/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://watnab.blogspot.com/2012/06/win7id.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/403000531197604014/posts/default/5623043722636396925'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/403000531197604014/posts/default/5623043722636396925'/><link rel='alternate' type='text/html' href='http://watnab.blogspot.com/2012/06/win7id.html' title='Win7でユーザのログインIDなどを変更する'/><author><name>WATANABE Kiyokazu</name><uri>http://www.blogger.com/profile/11213237102096419889</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-403000531197604014.post-3293413911747470773</id><published>2012-06-14T01:08:00.001+09:00</published><updated>2012-08-06T17:16:17.545+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Apache"/><category scheme="http://www.blogger.com/atom/ns#" term="php"/><category scheme="http://www.blogger.com/atom/ns#" term="Ubuntu"/><title type='text'>ubuntuにapache-google-apps-ssoをインストール</title><content type='html'>&lt;a href=&quot;https://github.com/epotocko/apache-google-apps-sso&quot; target=&quot;_blank&quot;&gt;https://github.com/epotocko/apache-google-apps-sso&lt;/a&gt;&lt;br /&gt;
ApacheのレイヤーでGoogle Apps認証かけちゃうというもの。&lt;br /&gt;
mod_auth_memcookieというモジュールとphpを使ってる。&lt;br /&gt;
&lt;br /&gt;
まずapt関係で必要なものをゲット。&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
apt-get install memcached php5-memcache &lt;br /&gt;
apt-get install apache2-prefork-dev libmemcache-dev&lt;/blockquote&gt;
次に、mod_auth_memcookieをビルド。&lt;br /&gt;
&lt;a href=&quot;http://sourceforge.net/projects/authmemcookie/files/&quot;&gt;http://sourceforge.net/projects/authmemcookie/files/&lt;/a&gt;&lt;br /&gt;
からソースをDLし展開。&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
tar zf mod_authmemcookie_v1.0.2.tar.gz&lt;a href=&quot;http://sourceforge.net/projects/authmemcookie/files/latest/download?source=files&quot;&gt; &lt;/a&gt; &lt;br /&gt;
cd mod_authmemcookie_v1.0.2&lt;/blockquote&gt;
ubuntuの場合apxs2のインストールパスが違うので、Makefileを修正。 &lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
MY_APXS=/usr/sbin/apxs2&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;↓&lt;br /&gt;
MY_APXS=/usr/bin/apxs2&lt;/blockquote&gt;
ビルド＆インストール。&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
make&lt;br /&gt;
sudo make install &lt;/blockquote&gt;
apacheのロードスクリプトを書く。&lt;br /&gt;
/etc/apache2/mods-available/auth_memcookie.load&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
#一行で書く&lt;br /&gt;
LoadModule mod_auth_memcookie_module /usr/lib/apache2/modules/mod_auth_memcookie.so&lt;/blockquote&gt;
有効化。&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
sudo a2enmod auth_memcookie&lt;/blockquote&gt;
&lt;br /&gt;
引き続き、phpなどの設定。&lt;br /&gt;
&lt;br /&gt;
/var/www/auth ディレクトリを認証モジュール用に使い、&lt;br /&gt;
その他サイト全体を認証の対象とすることにする。 &lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://github.com/epotocko/apache-google-apps-sso&quot;&gt;https://github.com/epotocko/apache-google-apps-sso&lt;/a&gt;&lt;br /&gt;
の中のsrc/public直下のphpファイルと、src/GAppsディレクトリ自体を &lt;br /&gt;
/var/www/auth/下にコピー。 &lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
git clone https://github.com/epotocko/apache-google-apps-sso.git &lt;br /&gt;
cd &lt;a href=&quot;https://github.com/epotocko/apache-google-apps-sso&quot;&gt;apache-google-apps-sso&lt;/a&gt;/src&lt;br /&gt;
sudo mkdir /var/www/auth&lt;br /&gt;
sudo cp -rf GApps /var/www/auth/&lt;br /&gt;
sudo cp -rf public/* /var/www/auth/.&lt;/blockquote&gt;
次にphp-openid。&lt;br /&gt;
12.04ならばaptで入れたものでもOKだった。&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
apt-get install php-openid&lt;/blockquote&gt;
10.04だとバージョンが古くてうまく動かなかったので、公式から落としてきて &lt;br /&gt;
その中のAuthディレクトリを/var/www/auth/以下にコピーする。&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
git clone https://github.com/openid/php-openid.git&lt;br /&gt;
cp -rf php-openid/Auth /var/www/auth/&lt;/blockquote&gt;
ここから下は &lt;a href=&quot;https://github.com/epotocko/apache-google-apps-sso&quot;&gt;https://github.com/epotocko/apache-google-apps-sso&lt;/a&gt; の&lt;br /&gt;
公式の情報と基本的に同じ。 &lt;br /&gt;
&lt;br /&gt;
/var/www/auth/settings.phpファイルを更新。&lt;br /&gt;
コメントアウトされていない二行を編集。 &lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
GApps_Session::$BASE_URL = &#39;http://【ホスト名】/auth/&#39;; //動かすホスト名&lt;br /&gt;GApps_Session::$DOMAIN_NAME = &#39;【Google Appsドメイン名】&#39;;&lt;/blockquote&gt;
apacheの設定を書き足す。&lt;br /&gt;
default編集するなり、別ファイル作ってVirtualHostに入れるなり。&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&amp;lt;IfModule mod_auth_memcookie.c&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;Location /&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Auth_memCookie_CookieName GOOG_SESSIONID&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Auth_memCookie_Memcached_AddrPort 127.0.0.1:11211&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ErrorDocument 401 &quot;/auth/login.php&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Auth_memCookie_Authoritative on&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AuthType Cookie&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AuthName &quot;GApps Login&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/Location&amp;gt;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;LocationMatch &quot;^/(?!auth)&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Require valid-user&lt;br /&gt;
&amp;lt;/LocationMatch&amp;gt;&lt;/blockquote&gt;
apache再起動。&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
sudo /etc/init.d/apache restart&lt;/blockquote&gt;</content><link rel='replies' type='application/atom+xml' href='http://watnab.blogspot.com/feeds/3293413911747470773/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://watnab.blogspot.com/2012/06/ubuntuapache-google-apps-sso.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/403000531197604014/posts/default/3293413911747470773'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/403000531197604014/posts/default/3293413911747470773'/><link rel='alternate' type='text/html' href='http://watnab.blogspot.com/2012/06/ubuntuapache-google-apps-sso.html' title='ubuntuにapache-google-apps-ssoをインストール'/><author><name>WATANABE Kiyokazu</name><uri>http://www.blogger.com/profile/11213237102096419889</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-403000531197604014.post-7382850629066881429</id><published>2012-06-10T15:46:00.001+09:00</published><updated>2012-06-10T15:46:15.582+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Git"/><category scheme="http://www.blogger.com/atom/ns#" term="Linux"/><title type='text'>gitで名前やメールアドレスを置換する</title><content type='html'>毎回調べてしまうので自分用メモ。 &lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;pre&gt;git filter-branch --commit-filter &#39;
if [ &quot;$GIT_COMMITTER_NAME&quot; = &quot;【修正前の名前】&quot; ]; then
    GIT_AUTHOR_NAME=&quot;【修正後のAUTHORの名前】&quot;
    GIT_AUTHOR_EMAIL=&quot;【修正後のAUTHORのメールアドレス】&quot;
    GIT_COMMITTER_NAME=&quot;【修正後のCOMMITTERの名前】&quot;
    GIT_COMMITTER_EMAIL=&quot;【修正後のCOMMITTERのメールアドレス】&quot;
fi
git commit-tree &quot;$@&quot;
&#39; HEAD&lt;/pre&gt;
&lt;/blockquote&gt;</content><link rel='replies' type='application/atom+xml' href='http://watnab.blogspot.com/feeds/7382850629066881429/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://watnab.blogspot.com/2012/06/git.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/403000531197604014/posts/default/7382850629066881429'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/403000531197604014/posts/default/7382850629066881429'/><link rel='alternate' type='text/html' href='http://watnab.blogspot.com/2012/06/git.html' title='gitで名前やメールアドレスを置換する'/><author><name>WATANABE Kiyokazu</name><uri>http://www.blogger.com/profile/11213237102096419889</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-403000531197604014.post-1261213382475412453</id><published>2012-06-09T16:09:00.000+09:00</published><updated>2012-06-09T16:09:44.169+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Django"/><title type='text'>DjangoのURL namespacesのところを和訳した</title><content type='html'>&lt;br /&gt;
&lt;a href=&quot;https://docs.djangoproject.com/en/dev/topics/http/urls/#url-namespaces&quot; target=&quot;_blank&quot;&gt;https://docs.djangoproject.com/en/dev/topics/http/urls/#url-namespaces&lt;/a&gt;&lt;br /&gt;
何回流し読みしてもよく分からないので、和訳した。&lt;br /&gt;
&lt;hr /&gt;
URL namespaces&lt;br /&gt;
URL ネームスペース&lt;br /&gt;
&lt;br /&gt;
Namespaced URLs are specified using the : operator. For example, the main index page of the admin application is referenced using admin:index. This indicates a namespace of admin, and a named URL of index.&lt;br /&gt;
&lt;br /&gt;
ネームスペースに関連付けられたURLは、：演算子を使い表現されます。例えば、adminアプリケーションのメイントップページは admin:index で参照されます。これはadminネームスペースのindexと名付けられたURLを示します。&lt;br /&gt;
&lt;br /&gt;
Namespaces can also be nested. The named URL foo:bar:whiz would look for a pattern named whiz in the namespace bar that is itself defined within the top-level namespace foo.&lt;br /&gt;
&lt;br /&gt;
ネームスペースは入れ子にできます。 foo:bar:whiz というURL名は、それ自身がfooというトップレベルのネームスペース内に定義されているbarというネームスペース内のwhizと名付けられたパターンを指します。&lt;br /&gt;
&lt;br /&gt;
When given a namespaced URL (e.g. myapp:index) to resolve, Django splits the fully qualified name into parts, and then tries the following lookup:&lt;br /&gt;
&lt;br /&gt;
与えられたネームスペースに関連付けられたURL（例…myapp:index）を解読する場合、Djangoは完全記述された名称を要素単位に分割し、以下の検索を試みます。&lt;br /&gt;
&lt;br /&gt;
1. First, Django looks for a matching application namespace (in this example, myapp). This will yield a list of instances of that application.&lt;br /&gt;
&lt;br /&gt;
まず、Djangoは一致するアプリケーションネームスペースを探します（この例の場合myapp）。該当するインスタンスのリストが抽出されます。&lt;br /&gt;
&lt;br /&gt;
2. If there is a current application defined, Django finds and returns the URL resolver for that instance. The current application can be specified as an attribute on the template context - applications that expect to have multiple deployments should set the current_app attribute on any Context or RequestContext that is used to render a template.&lt;br /&gt;
&lt;br /&gt;
もしカレントアプリケーションが定義されていれば、Djangoはそのインスタンスに対するURLリゾルバを探して返します。カレントアプリケーションはテンプレートコンテキストの属性として特定されます。複数デプロイされる事が想定されているアプリケーションは、テンプレートをレンダリングする時に使われるContextおよびRequestContextにcurrent_app属性がセットされるべきです。&lt;br /&gt;
&lt;br /&gt;
3. The current application can also be specified manually as an argument to the reverse() function.&lt;br /&gt;
&lt;br /&gt;
カレントアプリケーションはreverse()関数の引数として明示的に指定も出来ます。&lt;br /&gt;
&lt;br /&gt;
4. If there is no current application. Django looks for a default application instance. The default application instance is the instance that has an instance namespace matching the application namespace (in this example, an instance of the myapp called myapp).&lt;br /&gt;
&lt;br /&gt;
もしカレントアプリケーションが指定されない場合、Djangoはデフォルトアプリケーションインスタンスを探します。デフォルトアプリケーションインスタンスとは、アプリケーションネームスペースと一致するインスタンスネームスペースを持つインスタンスです（この例の場合myapp、と呼ばれているmyappのインスタンス（訳注：namespace=&quot;myapp&quot;,app_name=&quot;myapp&quot;という事ですかね））&lt;br /&gt;
&lt;br /&gt;
5. If there is no default application instance, Django will pick the last deployed instance of the application, whatever its instance name may be.&lt;br /&gt;
&lt;br /&gt;
もしデフォルトアプリケーションインスタンスが無い場合、Djangoは最後にデプロイされたアプリケーションのインスタンスを取り上げます。そのインスタンス名（訳注：インスタンスネームスペース名？）が何であれ。&lt;br /&gt;
&lt;br /&gt;
If the provided namespace doesn&#39;t match an application namespace in step 1, Django will attempt a direct lookup of the namespace as an instance namespace.&lt;br /&gt;
&lt;br /&gt;
もし与えられたネームスペースがステップ１のアプリケーションネームスペースにマッチしない場合、Djangoはインスタンスネームスペースであるとして直接検索を試みます。&lt;br /&gt;
&lt;br /&gt;
If there are nested namespaces, these steps are repeated for each part of the namespace until only the view name is unresolved. The view name will then be resolved into a URL in the namespace that has been found.&lt;br /&gt;
&lt;br /&gt;
もしネームスペースが入れ子になっている場合、ビュー名が解決されるまでネームスペースの各要素ごとにこれらのステップが繰り返されます。ビュー名は見つかったネームスペース内のURLとして解決されます（訳注：ここ適当。ここに限らないけど）。&lt;br /&gt;
&lt;br /&gt;
To show this resolution strategy in action, consider an example of two instances of myapp: one called foo, and one called bar. myapp has a main index page with a URL named index. Using this setup, the following lookups are possible:&lt;br /&gt;
&lt;br /&gt;
この解決手順を順を追ってお見せするため、例として２つのmyappのインスタンスを考えます。片方はfoo、もう片方はbarです。myappのトップページのURLにはindexという名前がついています。この設定に基づき、以下の検索が可能です。&lt;br /&gt;
&lt;br /&gt;
・If one of the instances is current - say, if we were rendering a utility page in the instance bar - myapp:index will resolve to the index page of the instance bar.&lt;br /&gt;
&lt;br /&gt;
もしどちらかのインスタンスがカレントならば…すなわち、barインスタンスのユーティリティページをレンダリングしていた場合、myapp:indexはbarインスタンスのトップページとして解決されます。&lt;br /&gt;
&lt;br /&gt;
・If there is no current instance - say, if we were rendering a page somewhere else on the site - myapp:index will resolve to the last registered instance of myapp. Since there is no default instance, the last instance of myapp that is registered will be used. This could be foo or bar, depending on the order they are introduced into the urlpatterns of the project.&lt;br /&gt;
&lt;br /&gt;
もしカレントインスタンスが無い場合…すなわちサイト内の何か別なページをレンダリングしていた場合…myapp:indexはmyappのうち最後に登録されたインスタンスに対して解決されます。デフォルトインスタンスが無いので、登録されたmyappの内最後のインスタンスが使われます。fooでもbarでも、プロジェクトのurlpatternsに登録された順に依存します。&lt;br /&gt;
&lt;br /&gt;
・foo:index will always resolve to the index page of the instance foo.&lt;br /&gt;
&lt;br /&gt;
foo:index は常にfooインスタンスのトップページとして解決されます。&lt;br /&gt;
&lt;br /&gt;
If there was also a default instance - i.e., an instance named myapp - the following would happen:&lt;br /&gt;
&lt;br /&gt;
もしデフォルトインスタンスもあった（インスタンス名がmyappとなっていた）場合、以下のようになります。&lt;br /&gt;
&lt;br /&gt;
・If one of the instances is current - say, if we were rendering a utility page in the instance bar - myapp:index will resolve to the index page of the instance bar.&lt;br /&gt;
&lt;br /&gt;
もしどちらかのインスタンスがカレントならば…すなわち、barインスタンスのユーティリティページをレンダリングしていた場合、myapp:indexはbarインスタンスのトップページとして解決されます。&lt;br /&gt;
&lt;br /&gt;
・If there is no current instance - say, if we were rendering a page somewhere else on the site - myapp:index will resolve to the index page of the default instance.&lt;br /&gt;
&lt;br /&gt;
もしカレントインスタンスが無い場合…すなわちサイト内の何か別なページをレンダリングしていた場合…myapp:indexは、デフォルトインスタンスのトップページとして解決されます。&lt;br /&gt;
&lt;br /&gt;
・foo:index will again resolve to the index page of the instance foo.&lt;br /&gt;
&lt;br /&gt;
foo:index はこの場合もfooインスタンスのトップページとして解決されます。&lt;br /&gt;
&lt;hr /&gt;
和訳したけど正直なところイマイチピンとこない。&lt;br /&gt;
とりあえずインスタンスネームスペースの方がアプリケーションネームスペースより粒度が小さい…という解釈でいいのだろうか。&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://watnab.blogspot.com/feeds/1261213382475412453/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://watnab.blogspot.com/2012/06/djangourl-namespaces.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/403000531197604014/posts/default/1261213382475412453'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/403000531197604014/posts/default/1261213382475412453'/><link rel='alternate' type='text/html' href='http://watnab.blogspot.com/2012/06/djangourl-namespaces.html' title='DjangoのURL namespacesのところを和訳した'/><author><name>WATANABE Kiyokazu</name><uri>http://www.blogger.com/profile/11213237102096419889</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-403000531197604014.post-665537222885167413</id><published>2012-06-07T10:54:00.000+09:00</published><updated>2012-06-07T10:54:22.952+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Ubuntu"/><title type='text'>Glipperがエラーで落ちまくるのを直す</title><content type='html'>Ubuntu 12.04 preciseにしてからなぜかGlipperがエラーで落ちまくっていた。&lt;br /&gt;
&lt;br /&gt;
単に再インストールしたら直った。&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
sudo apt-get remove glipper&lt;br /&gt;
sudo apt-get autoremove&lt;br /&gt;
sudo apt-get install glipper&lt;/blockquote&gt;</content><link rel='replies' type='application/atom+xml' href='http://watnab.blogspot.com/feeds/665537222885167413/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://watnab.blogspot.com/2012/06/glipper.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/403000531197604014/posts/default/665537222885167413'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/403000531197604014/posts/default/665537222885167413'/><link rel='alternate' type='text/html' href='http://watnab.blogspot.com/2012/06/glipper.html' title='Glipperがエラーで落ちまくるのを直す'/><author><name>WATANABE Kiyokazu</name><uri>http://www.blogger.com/profile/11213237102096419889</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-403000531197604014.post-7087846761951657319</id><published>2012-06-04T17:07:00.000+09:00</published><updated>2012-06-04T17:07:14.991+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Linux"/><title type='text'>あるディレクトリ以下のファイルの拡張子の一覧を取得するワンライナー</title><content type='html'>&lt;blockquote&gt;
find -type f | sed -e &#39;s/^.*\([\.|\/].*\)$/\1/&#39; | sort | uniq&lt;/blockquote&gt;
拡張子無しの場合はファイル名を出す。ような動きになるはず。&lt;br /&gt;
&lt;br /&gt;
こういうの書くときsedよりperl使うようにしようかなー。&lt;br /&gt;
perlの正規表現の方がメジャーだし。&lt;br /&gt;
いい思い出ないけど。</content><link rel='replies' type='application/atom+xml' href='http://watnab.blogspot.com/feeds/7087846761951657319/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://watnab.blogspot.com/2012/06/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/403000531197604014/posts/default/7087846761951657319'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/403000531197604014/posts/default/7087846761951657319'/><link rel='alternate' type='text/html' href='http://watnab.blogspot.com/2012/06/blog-post.html' title='あるディレクトリ以下のファイルの拡張子の一覧を取得するワンライナー'/><author><name>WATANABE Kiyokazu</name><uri>http://www.blogger.com/profile/11213237102096419889</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-403000531197604014.post-3159382470690339911</id><published>2012-05-31T23:47:00.001+09:00</published><updated>2012-05-31T23:48:09.357+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Linux"/><category scheme="http://www.blogger.com/atom/ns#" term="Ubuntu"/><title type='text'>Vimで文字コード変更</title><content type='html'>MySQL4にEUCで入っているデータをUTF-8に変換しようとして、&lt;br /&gt;
mysqldumpでSQL出してnkfで文字コード変換した。&lt;br /&gt;
&lt;br /&gt;
それを流し込んだところ、SQLの構文エラーが出る。&lt;br /&gt;
よく見てみたところ、SQL内の文字列の終わりのクォーテーションが無い。&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
(1,2,&#39;あいうえお1かきくけ,&#39;さしすせそ&#39;)&lt;/blockquote&gt;
みたいになっている。&lt;br /&gt;
&lt;br /&gt;
nkfの変換前のデータをあらためて調べてみると、&lt;br /&gt;
その部分にマルチバイト文字の前半がゴミとして挟まっていた。&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
(1,2,&#39;あいうえお1かきくけ&lt;span style=&quot;background-color: #cccccc; font-size: 75%;&quot;&gt;ゴミ&lt;/span&gt;&#39;,&#39;さしすせそ&#39;)&lt;/blockquote&gt;
こんな感じ。&lt;br /&gt;
nkfだとそのゴミを直後のクォーテーションと絡めて消してしまうようだ。&lt;br /&gt;
&lt;br /&gt;
さほど巨大ではないSQLだったので、Vimで変換した。&lt;br /&gt;
Vimで開き、&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
:e ++enc=eucjp-ms&lt;br /&gt;
:set fileencoding=utf8&lt;br /&gt;
:wq!&lt;/blockquote&gt;
これでEUC→UTF-8に変換して保存できる。&lt;br /&gt;
&lt;br /&gt;
該当箇所のゴミは「?」になるようだ。&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
(1,2,&#39;あいうえお1かきくけ?&#39;,&#39;さしすせそ&#39;)&lt;/blockquote&gt;</content><link rel='replies' type='application/atom+xml' href='http://watnab.blogspot.com/feeds/3159382470690339911/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://watnab.blogspot.com/2012/05/vim.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/403000531197604014/posts/default/3159382470690339911'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/403000531197604014/posts/default/3159382470690339911'/><link rel='alternate' type='text/html' href='http://watnab.blogspot.com/2012/05/vim.html' title='Vimで文字コード変更'/><author><name>WATANABE Kiyokazu</name><uri>http://www.blogger.com/profile/11213237102096419889</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-403000531197604014.post-2161660223649466479</id><published>2012-05-26T21:37:00.000+09:00</published><updated>2012-05-26T21:37:03.647+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Ubuntu"/><title type='text'>virt-managerでlibvirtdに繋ぐ場合</title><content type='html'>何も考えずにlibvirtdインストールして動かして、&lt;br /&gt;
そこにvirt-managerインストールして動かして接続しようとすると&lt;br /&gt;
Not Connectedの状態になって繋がらない。&lt;br /&gt;
でもsudoで動かすと繋がる。&lt;br /&gt;
&lt;br /&gt;
そんな場合はユーザをlibvirtdグループに追加すればよい。&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
sudo usermod -a -G libvirtd 【自分のユーザ名】 &lt;/blockquote&gt;
設定したら一度ログアウトしてログインしなおす。</content><link rel='replies' type='application/atom+xml' href='http://watnab.blogspot.com/feeds/2161660223649466479/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://watnab.blogspot.com/2012/05/virt-managerlibvirtd.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/403000531197604014/posts/default/2161660223649466479'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/403000531197604014/posts/default/2161660223649466479'/><link rel='alternate' type='text/html' href='http://watnab.blogspot.com/2012/05/virt-managerlibvirtd.html' title='virt-managerでlibvirtdに繋ぐ場合'/><author><name>WATANABE Kiyokazu</name><uri>http://www.blogger.com/profile/11213237102096419889</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-403000531197604014.post-6680204509906445273</id><published>2012-05-21T15:49:00.001+09:00</published><updated>2012-05-21T15:49:58.789+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="MySQL"/><title type='text'>mysqldumpでlocalhostのポート指定</title><content type='html'>リモート環境のmysqlをsshポートフォワード経由でlocalhost:13306にマップして接続し、 &lt;br /&gt;
ローカル環境のmysqlとスキーマ等の違いを確認するためにmysqldumpを使った。&lt;br /&gt;
manを見る限り、ポート番号は -P または --port= で指定出来ると書いてある。&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
mysqldump -h localhost -P 13306 -u XXX -p XXX -d --compact XXX &amp;gt; out.sql&lt;/blockquote&gt;
そしてローカルのmysqlに対し同様に出したsqlと比較。&lt;br /&gt;
&lt;br /&gt;
奇跡の完全一致。&lt;br /&gt;
&lt;br /&gt;
そんなバカな。&lt;br /&gt;
&lt;br /&gt;
ローカルのmysqlを停止させて実行してみる。&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
mysqldump: Got error: 2002: Can&#39;t connect to local MySQL server through socket &#39;/var/run/mysqld/mysqld.sock&#39; (2) when trying to connect&lt;/blockquote&gt;
やっぱり。 &lt;br /&gt;
&lt;br /&gt;
エラーメッセージからするに、ドメインソケットを使ってるっぽい。&lt;br /&gt;
-P 指定していてもお構いなしっていうのはどっちかというとバグなんじゃないのかな。&lt;br /&gt;
&lt;br /&gt;
強制的にTCPを使用させればうまくいく。&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
mysqldump --protocol=TCP -h localhost -P 13306 -u XXX -p XXX -d --compact XXX &amp;gt; out.sql&lt;/blockquote&gt;</content><link rel='replies' type='application/atom+xml' href='http://watnab.blogspot.com/feeds/6680204509906445273/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://watnab.blogspot.com/2012/05/mysqldumplocalhost.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/403000531197604014/posts/default/6680204509906445273'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/403000531197604014/posts/default/6680204509906445273'/><link rel='alternate' type='text/html' href='http://watnab.blogspot.com/2012/05/mysqldumplocalhost.html' title='mysqldumpでlocalhostのポート指定'/><author><name>WATANABE Kiyokazu</name><uri>http://www.blogger.com/profile/11213237102096419889</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-403000531197604014.post-1817579063605635012</id><published>2012-05-03T20:13:00.002+09:00</published><updated>2012-05-03T20:13:45.647+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="MySQL"/><category scheme="http://www.blogger.com/atom/ns#" term="Ubuntu"/><title type='text'>mysql5.5のcharset指定</title><content type='html'>ubuntu 12.04のmysqlは5.5。&lt;br /&gt;
&lt;br /&gt;
DBのデフォルトの文字コードをutf8にするのに前までは&lt;br /&gt;
/etc/mysql/conf.dの下に charset.cnf とか適当な名前で &lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
[mysqld] &lt;br /&gt;
default-character-set=utf8&lt;/blockquote&gt;
と書いていたけど、5.5だとエラーになってしまう。&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
[mysqld] &lt;br /&gt;
&lt;br /&gt;
character-set-server=utf8&amp;nbsp;&lt;/blockquote&gt;
に書き換える。</content><link rel='replies' type='application/atom+xml' href='http://watnab.blogspot.com/feeds/1817579063605635012/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://watnab.blogspot.com/2012/05/mysql55charset.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/403000531197604014/posts/default/1817579063605635012'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/403000531197604014/posts/default/1817579063605635012'/><link rel='alternate' type='text/html' href='http://watnab.blogspot.com/2012/05/mysql55charset.html' title='mysql5.5のcharset指定'/><author><name>WATANABE Kiyokazu</name><uri>http://www.blogger.com/profile/11213237102096419889</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-403000531197604014.post-9218687199267513227</id><published>2012-04-28T01:43:00.002+09:00</published><updated>2012-04-28T01:44:23.902+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Ubuntu"/><title type='text'>Ubuntu 12.04入れてみていくつか</title><content type='html'>Ubuntu 12.04入れてみました。&lt;br /&gt;
ネイティブで11.10が動いているもののアップグレードと、&lt;br /&gt;
VirtualBox上にクリーンインストールと。&lt;br /&gt;
&lt;br /&gt;
気付いた点を何点か。&lt;br /&gt;
&lt;br /&gt;
まず11.10からのアップグレードの方。&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;アップグレードの場合、まずパッケージファイルをダウンロードした後に&lt;br /&gt;一つずつインストールされていきますが、&lt;br /&gt; 私の場合そのインストール中にウィンドウやランチャーなどが消え&lt;br /&gt;壁紙だけの状態になってしまいました。&lt;br /&gt;&lt;br /&gt;やむなく電源を落として再起動したところ、途中で固まってしまう状態に。&lt;br /&gt;&lt;br /&gt;解決策は、grubで古いカーネルのリカバリモードを選択して起動し、&lt;br /&gt;そこからdpkgを選択してインストールの続きを行うこと。&lt;br /&gt;設定ファイルが修正されていて、残すか上書きするかを聞いてきたりしたときは&lt;br /&gt;見づらいですが頑張って読みましょう。&amp;nbsp; &lt;/li&gt;
&lt;/ul&gt;
&amp;nbsp;　　それ以外は特になし。&lt;br /&gt;
&lt;br /&gt;
次に12.04のクリーンインストールの方。 &lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;ランチャーをAuto hideにするとうまく動作しません。&lt;br /&gt;マウスカーソルを左端に持っていっても表示されません。&lt;a href=&quot;http://ubuntuforums.org/showthread.php?t=1965991&quot;&gt;&lt;br /&gt;http://ubuntuforums.org/showthread.php?t=1965991&lt;/a&gt;&lt;br /&gt;どうやらバグのようです（ちなみに11.10からアップグレードした方は普通に大丈夫）。&lt;br /&gt;修正を待ちましょう。 &lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;&amp;nbsp;フォントの変更がデフォルトではできません。&lt;br /&gt;gnome-tweakをインストールします。&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;こっちの環境では英語キーボードを使っていて、Alt+「`」でiBusのon/off切り替えをするのですが&lt;br /&gt;デフォルトだと「同じアプリ内のウィンドウのスイッチ」として動作してしまいます。&lt;br /&gt;&lt;ol&gt;
&lt;li&gt;System Settings...から&lt;/li&gt;
&lt;li&gt;[Keyboard]-[Shortcuts]-[Navigation]と辿り、&lt;/li&gt;
&lt;li&gt;[Switch Windows of an application]がデフォルトで[Disabled]となっているのですが、&lt;br /&gt;一度それに何か適当なショートカットキーを割り当て、削除します。&lt;br /&gt;これで解決。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;開発にAptana Studio 3を使っているのですが、&lt;br /&gt;ダウンロードして展開してaptana_studio_3を起動しても&lt;br /&gt;ランチャー上で固定できません。&lt;br /&gt;解決策として、&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;margin-left: 40px;&quot;&gt;
&lt;li&gt;alacarte を起動&lt;/li&gt;
&lt;li&gt;Programmingを選択して「New Item」をクリック&lt;/li&gt;
&lt;li&gt;メニュー項目の設定をして保存する&lt;/li&gt;
&lt;li&gt;dash homeから3.で作った項目を検索し、クリックして実行する&lt;/li&gt;
&lt;li&gt;ランチャーに出てきたアイコンを固定する&lt;/li&gt;
&lt;/ol&gt;
とするのが楽。</content><link rel='replies' type='application/atom+xml' href='http://watnab.blogspot.com/feeds/9218687199267513227/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://watnab.blogspot.com/2012/04/ubuntu-1204.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/403000531197604014/posts/default/9218687199267513227'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/403000531197604014/posts/default/9218687199267513227'/><link rel='alternate' type='text/html' href='http://watnab.blogspot.com/2012/04/ubuntu-1204.html' title='Ubuntu 12.04入れてみていくつか'/><author><name>WATANABE Kiyokazu</name><uri>http://www.blogger.com/profile/11213237102096419889</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-403000531197604014.post-7560177653857103137</id><published>2012-04-28T01:08:00.001+09:00</published><updated>2012-04-28T01:44:12.642+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="MySQL"/><category scheme="http://www.blogger.com/atom/ns#" term="Ubuntu"/><title type='text'>Ubuntuにmecab+groonga+mroongaをソースからインストール</title><content type='html'>Ubuntuにmecab+groonga+mroongaをソースからインストールする。&lt;br /&gt;
&lt;br /&gt;
mroongaのサイトにある手順ではリポジトリ追加してapt-get install、で&lt;br /&gt;
それはもう簡単にインストールできたのですが&lt;br /&gt;
その後mysqlがアップデートされたらうまく動かなくなってしまったので&lt;br /&gt;
ひと通りソースからビルドしました。&lt;br /&gt;
&lt;br /&gt;
以下はバイナリやライブラリは/usr/bin/,/usr/lib/など、&lt;br /&gt;
confは/etc/に配置する手順です。&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;ビルドに必要なものをインストール&lt;br /&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;
sudo apt-get install build-essential&lt;br /&gt;
sudo apt-get install libtool &lt;br /&gt;
sudo apt-get install autoconf&lt;br /&gt;
sudo apt-get install apt-src&lt;br /&gt;
sudo apt-get install libmysqlclient-dev&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;mecabをビルドしてインストール &lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://mecab.googlecode.com/svn/trunk/mecab/doc/index.html#download&quot;&gt;http://mecab.googlecode.com/svn/trunk/mecab/doc/index.html#download&lt;/a&gt;&lt;br /&gt;ここからのリンクでソースをゲット。&lt;br /&gt;今はmecab-0.993.tar.gzでした。&lt;blockquote class=&quot;tr_bq&quot;&gt;
tar zxf mecab-0.993.tar.gz&lt;br /&gt;
cd mecab-0.993&lt;br /&gt;
./configure --prefix=/usr \&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--sysconfdir=/etc \&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--with-charset=utf8&lt;br /&gt;
make&lt;br /&gt;
sudo make install&lt;br /&gt;
sudo ldconfig&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;mecabの辞書をビルドしてインストール&lt;br /&gt;&lt;br /&gt;上のリンク先の「IPA辞書」をダウンロード。&lt;br /&gt;今はmecab-ipadic-2.7.0-20070801.tar.gzでした。&lt;br /&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;
tar zxf mecab-ipadic-2.7.0-20070801.tar.gz&lt;br /&gt;
cd mecab-ipadic-2.7.0-20070801&lt;br /&gt;
./configure --prefix=/usr \&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--sysconfdir=/etc \&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--with-charset=utf8&lt;br /&gt;
make&lt;br /&gt;
sudo make install&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;groongaをビルドしてインストール&lt;br /&gt;&lt;br /&gt;https://github.com/groonga/groonga/tags&lt;br /&gt;から、タグ振ってあるものをダウンロード。&lt;br /&gt;今回はgroonga-groonga-v2.0.1-0-g700532f.tar.gz&lt;br /&gt;というファイル名でダウンロードしました。&lt;br /&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;
tar zxf groonga-groonga-v2.0.1-0-g700532f.tar.gz&lt;br /&gt;
cd groonga-groonga-4627bd1&lt;br /&gt;
./autogen.sh&lt;br /&gt;
./configure --prefix=/usr \&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--sysconfdir=/etc \&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--with-default-encoding=utf8&lt;br /&gt;
make&lt;br /&gt;
sudo make install&lt;br /&gt;
sudo ldconfig&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;mroongaをビルドしてインストール&lt;br /&gt;&lt;br /&gt;mysqlのソースをaptでゲット。&lt;br /&gt;apt-src install mysql-server&lt;br /&gt;今回はmysql-5.1-5.1.62というディレクトリにソースが落ちました。&lt;br /&gt;&lt;br /&gt;https://github.com/mroonga/mroonga/tags&lt;br /&gt;から、タグ振ってあるものをダウンロード。&lt;br /&gt;今回はmroonga-mroonga-v2.01-0-g8378adf.tar.gz&lt;br /&gt;というファイル名でダウンロードできました。&lt;br /&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;
tar zxf mroonga-mroonga-v2.01-0-g8378adf.tar.gz&lt;br /&gt;
cd mroonga-mroonga-1bfcbe2&lt;br /&gt;
./autogen.sh&lt;br /&gt;
./configure --prefix=/usr \&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--sysconfdir=/etc \&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--with-mysql-source=$PWD/../mysql-5.1-5.1.62 \&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--with-mysql-config=/usr/bin/mysql_config \&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--with-default-parser=TokenMecab&lt;br /&gt;
make&lt;br /&gt;
sudo make install&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;apparmorの設定を変更&lt;br /&gt;&lt;br /&gt;ubuntuではmysqldの動きはapparmorで制限されていて、&lt;br /&gt;このままではMecabの辞書もgroongaの設定ファイルも参照できないので、&lt;br /&gt;アクセス出来るように設定を追加します。&lt;br /&gt;&lt;br /&gt;以下の内容のファイルを作成します。&lt;br /&gt;/etc/apparmor.d/abstractions/mysql-server-mroonga&lt;br /&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;
/usr/lib/groonga/plugins/ r,&lt;br /&gt;
/usr/lib/groonga/plugins/** rm,&lt;br /&gt;
/etc/mecabrc r,&lt;br /&gt;
/usr/lib/mecab/ r,&lt;br /&gt;
/usr/lib/mecab/** r,&lt;/blockquote&gt;
以下のファイルに、追記します。&lt;br /&gt;/etc/apparmor.d/local/usr.sbin.mysqld&lt;br /&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;
#include &amp;lt;abstractions/mysql-server-mroonga&amp;gt;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;mysqlにプラグインを登録&lt;br /&gt;&lt;br /&gt;mysqlにログイン。&lt;br /&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;
mysql -uroot -p&lt;br /&gt;
password:&lt;/blockquote&gt;
プラグイン登録。 &lt;br /&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;
mysql&amp;gt; INSTALL PLUGIN mroonga SONAME &#39;ha_mroonga.so&#39;;&lt;/blockquote&gt;
funtionの登録。&lt;br /&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;
mysql&amp;gt; CREATE FUNCTION last_insert_grn_id RETURNS INTEGER soname &#39;ha_mroonga.so&#39;;&lt;/blockquote&gt;
&lt;/li&gt;
&lt;/ol&gt;
&amp;nbsp;以上で、動くようになりました。&lt;br /&gt;
&lt;br /&gt;
この情報は2012/04/26頃の情報です。&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://watnab.blogspot.com/feeds/7560177653857103137/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://watnab.blogspot.com/2012/04/ubuntumecabgroongamroonga.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/403000531197604014/posts/default/7560177653857103137'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/403000531197604014/posts/default/7560177653857103137'/><link rel='alternate' type='text/html' href='http://watnab.blogspot.com/2012/04/ubuntumecabgroongamroonga.html' title='Ubuntuにmecab+groonga+mroongaをソースからインストール'/><author><name>WATANABE Kiyokazu</name><uri>http://www.blogger.com/profile/11213237102096419889</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-403000531197604014.post-6780258650017216909</id><published>2012-04-15T23:44:00.000+09:00</published><updated>2012-04-15T23:44:55.755+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Apache"/><category scheme="http://www.blogger.com/atom/ns#" term="Ubuntu"/><title type='text'>apacheでhttps→httpにリバースプロキシかける場合</title><content type='html'>社内で使う用に&lt;a href=&quot;http://gitlabhq.com/&quot; target=&quot;_blank&quot;&gt;gitlab&lt;/a&gt; をセットアップしようと思った。&lt;br /&gt;
&lt;a href=&quot;https://github.com/gitlabhq/gitlabhq/blob/stable/doc/installation.md&quot; target=&quot;_blank&quot;&gt;公式ドキュメント&lt;/a&gt;を参考にやってみる。&lt;br /&gt;
&lt;br /&gt;
rubyはバージョン間の互換性がアレなので、rvmを使うことにした。&lt;br /&gt;
そこまでで既にrubygemsのバージョンが古くてうまくいかないとか心が折れそうになったが、&lt;br /&gt;
ひとまずgitlab用のユーザで入るとruby1.9.2が見えるようにはなり、&lt;br /&gt;
WEBrickで起動も確認できた。&lt;br /&gt;
（そこまでのところは、変なものを書き残してしまうと逆に&lt;br /&gt;
　後世の人に対する罠になりそうなのであえて書かないｗ）&lt;br /&gt;
（あえて一点いうなら、sudo -u gitlab bundle exec rake gitlab_status のところは&lt;br /&gt;
　sudo -u gitlab bundle exec rake gitlab_status app:gitlab:status が正しい）&lt;br /&gt;
&lt;br /&gt;
そして公式ドキュメントではunixドメインソケットでunicornとnginxを繋いでいるが、&lt;br /&gt;
今回のサーバでは既にapacheが動作しているので&lt;br /&gt;
unicornをlocalhostの適当なポートで動かして&lt;br /&gt;
mod_proxyでそこにアクセスを回すことにした。&lt;br /&gt;
&lt;br /&gt;
さらに外からのアクセスはHTTPSにしようとした。
&lt;br /&gt;
&lt;blockquote&gt;
&lt;pre&gt;&amp;lt;VirtualHost _default_:443&amp;gt;
        ServerName XXX.XXX.XXX.com

        &amp;lt;Proxy *&amp;gt;
                Order deny,allow
                Allow from all
        &amp;lt;/Proxy&amp;gt;
        
        ProxyPass / http://localhost:8081/
        ProxyPassReverse / http://localhost:8081/

            :&lt;/pre&gt;
&lt;/blockquote&gt;
みたいな感じの設定を書いてみたのだが、&lt;br /&gt;
アクセスしてみるとgitlab内でリダイレクトが起きた時に&lt;br /&gt;
「http://localhost:8081/〜」に飛ばすレスポンスが帰ってきてしまった。&lt;br /&gt;
よく考えれば、gitlabの立場からすれば相手にしているのは&lt;br /&gt;
「http://localhost:8081/〜」でアクセスしてきたapacheなので当たり前。&lt;br /&gt;
&lt;br /&gt;
設定に以下を追加して、ひと通りきちんと動くようになった。
&lt;br /&gt;
&lt;blockquote&gt;
&lt;pre&gt;ProxyPreserveHost On
RequestHeader set X_FORWARDED_PROTO &#39;https&#39;&lt;/pre&gt;
&lt;/blockquote&gt;
RequestHeaderは mod_headersの機能なので、それも追加する。&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://watnab.blogspot.com/feeds/6780258650017216909/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://watnab.blogspot.com/2012/04/apachehttpshttp.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/403000531197604014/posts/default/6780258650017216909'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/403000531197604014/posts/default/6780258650017216909'/><link rel='alternate' type='text/html' href='http://watnab.blogspot.com/2012/04/apachehttpshttp.html' title='apacheでhttps→httpにリバースプロキシかける場合'/><author><name>WATANABE Kiyokazu</name><uri>http://www.blogger.com/profile/11213237102096419889</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-403000531197604014.post-3878052851901686396</id><published>2012-04-11T09:09:00.001+09:00</published><updated>2012-04-11T09:16:30.150+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Ubuntu"/><title type='text'>ubuntu oneがうまくアップロードされなくなった場合(ubuntu)</title><content type='html'>&lt;a href=&quot;http://watnab.blogspot.jp/2012/02/windowsubuntu-one.html&quot;&gt;以前のエントリ&lt;/a&gt;でUbuntu OneのWindows版クライアントが&lt;br /&gt;
うまく動作しなくなった場合の対策を書いたが、&lt;br /&gt;
Ubuntuの方もファイルがあるのにうまくアップロードされていない、という現象がたまに起きる。&lt;br /&gt;
&lt;br /&gt;
自宅で書いたサンプルコードをUbuntu Oneディレクトリ内にgit pushして、&lt;br /&gt;
翌日やる気満々で職場のPCでpullしてobjectファイルが無い、と出ると&lt;br /&gt;
かなり精神的ダメージがでかい。&lt;br /&gt;
&lt;br /&gt;
Windows版の対策と同じような処理をするのは&lt;br /&gt;
こんなシェルスクリプトでいけそう。&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;u1refresh.sh&lt;br /&gt;
&lt;pre&gt;#!/bin/bash
u1sdtool -q
rm ~/.local/share/ubuntuone/syncdaemon/tritcask/*
u1sdtool --start&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;
実行後しばらく待つと、再度同期が始まる。はず。&lt;br /&gt;
&lt;br /&gt;
ご利用は自己責任で。</content><link rel='replies' type='application/atom+xml' href='http://watnab.blogspot.com/feeds/3878052851901686396/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://watnab.blogspot.com/2012/04/ubuntu-oneubuntu.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/403000531197604014/posts/default/3878052851901686396'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/403000531197604014/posts/default/3878052851901686396'/><link rel='alternate' type='text/html' href='http://watnab.blogspot.com/2012/04/ubuntu-oneubuntu.html' title='ubuntu oneがうまくアップロードされなくなった場合(ubuntu)'/><author><name>WATANABE Kiyokazu</name><uri>http://www.blogger.com/profile/11213237102096419889</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-403000531197604014.post-4555393186894025332</id><published>2012-04-08T15:31:00.000+09:00</published><updated>2012-04-08T15:31:58.180+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Firefox"/><category scheme="http://www.blogger.com/atom/ns#" term="Ubuntu"/><title type='text'>FireFoxをTLSv1で繋がせる</title><content type='html'>FireFox11.0でhttpsで通信すると、SSLv3で接続される。&lt;br /&gt;
&lt;br /&gt;
何が問題かというと、&lt;br /&gt;
SSLサーバをVirtualHostでリバースプロキシしているところにアクセスしようとしたとき。&lt;br /&gt;
Client Helloの時にサーバ名が渡されないので、&lt;br /&gt;
アクセスしようとしているVirtualHostで設定している証明書が渡されず、&lt;br /&gt;
エラーとなってしまう。&lt;br /&gt;
ChromeだとOK。&lt;br /&gt;
&lt;br /&gt;
サーバ側の設定で何とかできないか調べたけど結局良く分からない。&lt;br /&gt;
とりあえずWorkaroundとしてはこれ。&lt;br /&gt;
&lt;a href=&quot;https://addons.mozilla.org/en-US/firefox/addon/force-tls/&quot;&gt;https://addons.mozilla.org/en-US/firefox/addon/force-tls/&lt;/a&gt;&lt;br /&gt;
Force TLSというアドオンを入れ、URLを設定する。&lt;br /&gt;
これでひとまずはエラーが出ないようになる。</content><link rel='replies' type='application/atom+xml' href='http://watnab.blogspot.com/feeds/4555393186894025332/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://watnab.blogspot.com/2012/04/firefoxtlsv1.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/403000531197604014/posts/default/4555393186894025332'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/403000531197604014/posts/default/4555393186894025332'/><link rel='alternate' type='text/html' href='http://watnab.blogspot.com/2012/04/firefoxtlsv1.html' title='FireFoxをTLSv1で繋がせる'/><author><name>WATANABE Kiyokazu</name><uri>http://www.blogger.com/profile/11213237102096419889</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-403000531197604014.post-89404773404257649</id><published>2012-04-06T16:12:00.001+09:00</published><updated>2012-04-06T17:58:11.810+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Django"/><category scheme="http://www.blogger.com/atom/ns#" term="MySQL"/><title type='text'>Django+MySQL+Cast as SIGNED INTEGERでTruncated incorrect INTEGER valueでUnicodeEncodeErrorなところから逃げ延びる</title><content type='html'>Django+MySQLで、unicodeの全角文字と数字が混じった列のdistinctな一覧を&lt;br /&gt;
【数字の昇順】→「文字順」で取得したい。&lt;br /&gt;
単純に文字順にしてしまうのは 1,10,11,2,3,4 になるのでだめなパターン。&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;https://docs.djangoproject.com/en/dev/ref/models/querysets/#distinct&quot;&gt;QuerySet APIの distinct はPostgreSQLでしかサポートされていない&lt;/a&gt;ので、&lt;br /&gt;
DBのViewを書いた。&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote&gt;&lt;pre&gt;create view app_view1 as
select distinct col1,
    case when length(col1) = 0 then 0
                when cast(col1 as UNSIGNED INTEGER) &gt; 0 then cast(col1 as UNSIGNED INTEGER)
                else 2147483647 end as sort
from table1&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;
ちなみに本題とはあまり関係ないけどModelはこんな感じ。&lt;br /&gt;
&lt;blockquote&gt;&lt;pre&gt;class View1(models.Model):
    col1 = models.CharField(max_length=10,blank=True,primary_key=True)
    sort = models.IntegerField()
    class Meta:
        app_label=&quot;app&quot;
        ordering=[&quot;sort&quot;,&quot;col1&quot;]
        managed=False&lt;/pre&gt;&lt;/blockquote&gt;文字はsortを十分に大きくしておいた上でsort昇順→col1昇順にすればいいはず。&lt;br /&gt;
&lt;br /&gt;
MySQL Workbenchからだとゴキゲンに動作する。&lt;br /&gt;
&lt;br /&gt;
実際に実行する。タイトルのような文字列を叫んで憤死する。&lt;br /&gt;
&lt;br /&gt;
原因としては、実際にはMySQL内で実行した際にcastで「Truncated incorrect INTEGER value：&#39;【文字列】&#39;」というwarningが出ており、&lt;br /&gt;
それをMySQLdbモジュールが拾おうとしてしまって、【文字列】部分がUnicodeになっているせいでUnicodeEncodeErrorになるという&lt;br /&gt;
余計な事すんなよというもの。&lt;br /&gt;
&lt;br /&gt;
何とかする方法を考える。&lt;br /&gt;
・MySQLdbをいじる（UnicodeEncodeErrorを吐かないようにする）→できればやりたくない&lt;br /&gt;
・Djangoをいじる（warningを拾わないようにする）→できればやりたくない&lt;br /&gt;
・継承で何とかする→djangoのdb backendを作れば何とか出来るんだろうができればやりたくない&lt;br /&gt;
・MySQLでWarningを出さないようにできないか→MySQL Suppress Warningとかでググる。死屍累々。&lt;br /&gt;
・あきらめてPython上で並べ替えをする→今回はいいがこんな感じので大量のデータに対してやろうとしたらどうするよ&lt;br /&gt;
&lt;br /&gt;
SQLに立ち戻る。&lt;br /&gt;
要は数字だけ以外の場合に、CASTさえしなければよい。&lt;br /&gt;
&lt;br /&gt;
MySQLにはREGEXPがあった。&lt;br /&gt;
&lt;blockquote&gt;&lt;pre&gt;create view app_view1 as
select distinct col1,
    case when length(col1) = 0 then 0
                when col1 REGEXP &#39;^[[:digit:]]+$&#39; then cast(col1 as UNSIGNED INTEGER)
                else 2147483647 end as sort
from table1&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;
何とか逃げ延びた。</content><link rel='replies' type='application/atom+xml' href='http://watnab.blogspot.com/feeds/89404773404257649/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://watnab.blogspot.com/2012/04/djangomysqlcast-as-signed.html#comment-form' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/403000531197604014/posts/default/89404773404257649'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/403000531197604014/posts/default/89404773404257649'/><link rel='alternate' type='text/html' href='http://watnab.blogspot.com/2012/04/djangomysqlcast-as-signed.html' title='Django+MySQL+Cast as SIGNED INTEGERでTruncated incorrect INTEGER valueでUnicodeEncodeErrorなところから逃げ延びる'/><author><name>WATANABE Kiyokazu</name><uri>http://www.blogger.com/profile/11213237102096419889</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-403000531197604014.post-5423105986437446227</id><published>2012-04-06T10:37:00.000+09:00</published><updated>2012-04-06T10:37:14.441+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="MySQL"/><title type='text'>MySQLでSELECT時に連番生成</title><content type='html'>OracleでいうROWNUM()みたいなやつがやりたい。&lt;br /&gt;
&lt;br /&gt;
アドホッククエリとしては、こうすればできるっちゃできる。&lt;br /&gt;
SELECT @rownum:=@rownum+1 rownum, t.* FROM (SELECT @rownum:=0) r, table1 t;&lt;br /&gt;
&lt;br /&gt;
でもこれをViewにしようとしたら、MySQLはView内でサブクエリ使えない。&lt;br /&gt;
&lt;br /&gt;
詰んだ。</content><link rel='replies' type='application/atom+xml' href='http://watnab.blogspot.com/feeds/5423105986437446227/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://watnab.blogspot.com/2012/04/mysqlselect.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/403000531197604014/posts/default/5423105986437446227'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/403000531197604014/posts/default/5423105986437446227'/><link rel='alternate' type='text/html' href='http://watnab.blogspot.com/2012/04/mysqlselect.html' title='MySQLでSELECT時に連番生成'/><author><name>WATANABE Kiyokazu</name><uri>http://www.blogger.com/profile/11213237102096419889</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>