MongoDBで検索したドキュメントのフィールドを別のフィールドで更新する方法

MongoDBにおいて検索したドキュメントのフィールド値を、そのドキュメントの別のフィールドで置き換えたい場合、少し工夫が必要になります。 例えば、usersコレクションのあるドキュメントの"id"フィールドを"_id"の値で置き換えたい場合、以下のようにします。

// _idをidにコピー
db.users.find({}).forEach(
     function(e){
          e.id = e._id; 
         db.users.update({_id:e.id}, e);
});

JavaScriptで検索したドキュメント群に対してforEachで処理していきます。 少し面倒ですが、MongoDBはJavaScriptを実行できるので問題なく置き換え可能です。 もっとスマートなやり方がありそうですが、stackoverflowで検索してもこの方法しか出てこなかったので諦めました。他のやり方がありましたら是非教えていただきたいです。

研究室にSlack導入したお話

f:id:toricoro:20150328221238p:plain研究室に今流行りのSlackを導入してみましたのでログ残します。

導入に至るまでの経緯

私の研究室では、これまでメールで連絡を取り合っていました。 しかし、すべての情報をメーリングリストに流していた為、重要な情報と不必要な情報が混在しており、重要な情報が埋もれてしまっていました。 例えば、ミーティングの欠席連絡とミーティングの議事録が同じタイミングで流れるといった状況でした。

もう一つの問題として、データの受け渡しの際に利用するツールを統一していなかったため、 まずどのツールを使うのかを決めないといけないという手間がありました。 ファイルサーバを経由するのか、Skypeで送るのか、はたまた、TwitterのDMでLINEでメールで... この非常に面倒なプロセスを経て、ようやくデータを送信が可能になるといったことが常態化していました。

上記のような問題を改善するために、コミュニケーションツールの導入を私が、提案しました。年度の代わり時期ということもあり、特に反対意見もなく、まあ使ってみようかってことになりました。

Slackとは

f:id:toricoro:20150328211446p:plain Slackは社内やサークルなどのチーム向けコミュニケーションサービスです。 美しいUIを持ち、Skype, HipChat, Yammerなど他のサービスより使いやすいと評判になっています。 多くの企業で導入され、ユーザー数も順調に増加しているようです。

なぜSlackか

他のツールとの比較をして選択した訳ではありませんが、以下のような特徴からSlackに決定しました。まず、UIの美しさです。新しいサービスを利用するならかっこいい方がいいよねってことで、綺麗なUIを持つものにしようと考えていました。Slackは日本語化されていないことを除けば非常に美麗で理解しやすいUIを持っています。また、Slackは外部サービスとの連携も魅力的でした。 GithubやHubot等と簡単に連携できることが大きかったです。最後に、すでに流行ってる点です。 多くの企業で利用されているので日本語ドキュメントも豊富ですし、何より流行ってるツールなので今後も拡張されていく可能性があります。以上のような理由からSlackを選択しました。

使い方

書かなくてもわかるぐらいシンプル。 f:id:toricoro:20150328221238p:plain 細かい機能については、他の方のドキュメントを御参照下さい。

メリット

書きやすい

私たちのような世代は、メールの習慣がなくなりつつあります。 メールを利用したことがなくLINEかTwitterで連絡を取り合うことが常識になっている人が今後配属される可能性もあります。 そのため、メールの利用にハードルを感じ、研究室内のコミュニケーションがとどこおるかもしれません。 Slackはスマホからでも手軽にTwitterやLINEのような感覚で投稿できるので、コミュニケーションの活性化が期待できます。誰かが研究室に来なくなったときも生存確認しやすいですし、雑談の延長から研究の議論に発展する可能性もありそうです。

botと遊べる!

f:id:toricoro:20150328214236p:plain 私の研究室のアイドルはmikuさんなのでbotもmikuさんにしました。 これはHubotと連携してできる機能なのですが、mikuさんに時間やロボット三原則を教えてもらえます。 男ばっかりの研究室にアイドルが降臨しました。研究が捗るね!

家電と連携

f:id:toricoro:20150328215002p:plain 私の研究室では、家電の操作に関する研究を行っていますので、Hubotと連携させてmikuさんに家電を動かしてもらえるようにしました。 詳細は別のエントリで書こうと思います(未定)。

まとめ

まだ導入して2日目なので、今後は、どのように運用していくかをミーティングで決めていくことになりそうです。 また、導入しただけですのでチーム内での利用の促進を図ろうと思います。 飲み会の通知をSlackで徹底すれば利用してもらえるのかな? 研究室ならではの運用方法の知見があればぜひ教えていただきたいです。 チャネルの切り方とか、研究室にあった面白い使い方を探していく予定です。

JavaScriptのオブジェクトプロパティ

JSのオブジェクトプロパティにアクセスする方法は2種類あります。
ドット演算子を用いる方法とブラケットを用いる方法です。

オブジェクト名.プロパティ名 
オブジェクト名[プロパティ名]

ドット演算子を使うケースが多いと思われますが、ドット演算子を用いることができない場合が有ります。
それは、以下のようにプロパティ名が数字の場合です。

オブジェクト.123 // エラー

この場合はブラケットを用いてプロパティを指定しましょう。

オブジェクト[123] // OK

なんか配列みたいですね...

git巻き戻しかた

gitでファイルを変更後、その内容が気に食わなかった場合に戻す方法

 git checkout .

これで直前のコミットまで巻き戻せます。 他にgit stashというコマンドもあるみたいですが、使い方がよくわからないので今度調べます。 なんだよ変更をこっそりしまっておきたい場合って...

herokuでつまづいた

git push heroku masterするときにcommitしてないと反映されませんよ!
それだけです。git pushだから当たり前なのだけどこれに気づくのに結構時間がかかったので...

viエラー「E437: terminal capability "cm" required」

対処法

.bashrcに下記を追加

 export TERM=vt100

参考

windowsからubuntuマシンにRDP

環境

  • Ubuntu14.04

XRDP

xrdp はオープンソースで開発されている Remote Desktop Protocol のサーバソフトウェア
MicrosoftリモートデスクトップクライアントでLinux接続できるLinuxターミナルサーバを提供する

インストール

 $ sudo apt-get install xrdp

参考

LXDE

LXDE (Lightweight X11 Desktop Environment) はUNIXおよびLinuxBSDのようなPOSIXプラットフォーム上で動作する、GPL下で配布されるオープンソースのデスクトップ環境

UbuntuのUnityデスクトップ環境はxrdpでサポートされていないみたいなのでこちらを利用する

インストール

 $ sudo apt-get install lxde
 $ echo lxsession -s LXDE -e LXDE > ~/.xsession
 $ sudo service xrdp restart

参考

キー配列変更

このままではキー配列が英語配列になっているので日本語キーボードの場合使えないので変更する

$ cd /etc/xrdp
$ (cd /tmp; wget http://w.vmeta.jp/temp/km-0411.ini)
$ sudo cp /tmp/km-0411.ini .
$ sudo ln -s km-0411.ini km-e0200411.ini
$ sudo ln -s km-0411.ini km-e0010411.ini
$ sudo /etc/init.d/xrdp restart

日本語入力になっていてコマンドが打てない場合はGUIから入力を半角英数字にする

参考

*キー配列について - 日本xrdpユーザ会

ディレクトリ名を英語にする

日本語Ubuntuのディレクトリ名がデフォルトでは「デスクトップ」などの日本語になっている
これを英語に戻す

 $ LANG=C xdg-user-dirs-gtk-update

参考