SSブログ
プログラミング ブログトップ
前の10件 | 次の10件

Cassandra 3.9 をさわってみる [プログラミング]

まず java8 をインストールする
あと python という名前のコマンドで python2.7 がインストールされている必要がある

binary tarball file を使うことにする
http://cassandra.apache.org/doc/latest/getting_started/installing.html#installation-from-binary-tarball-files
cassandra の最新が 3.9 のようなので apache-cassandra-3.9-bin.tar.gz をダウンロードしてきて
$ tar zxvf apache-cassandra-3.9-bin.tar.gz
で展開。
展開したディレクトリの中の bin ディレクトリにパスを通す。
自分の場合は、
export PATH="$PATH:$HOME/apache-cassandra-3.9/bin"
みたいな感じにした。

これで
$ cassandra
でサーバー実行
$ cqlsh
でコマンドシェル実行できた
$ cqlsh
Connected to Test Cluster at 127.0.0.1:9042.
[cqlsh 5.0.1 | Cassandra 3.9 | CQL spec 3.4.2 | Native protocol v4]
Use HELP for help.
cqlsh>

使い方は↓ここら辺が参考になった
http://symfoware.blog68.fc2.com/blog-entry-1917.html

以下、自分が実行した例
cqlsh> create keyspace sample WITH replication = {'class': 'SimpleStrategy', 'replication_factor' : 1};
cqlsh> DESCRIBE keyspaces;

system_schema  system_auth  system  sample  system_distributed  system_traces

cqlsh> use sample;
cqlsh:sample> create table test (
          ...     id int,
          ...     s text,
          ...     primary key(id)
          ... );
cqlsh:sample> describe tables;

test

cqlsh:sample> INSERT INTO test (id, s) VALUES (1, 'test1');
cqlsh:sample> INSERT INTO test (id, s) VALUES (2, 'test2');
cqlsh:sample> SELECT * FROM test;

 id | s
----+-------
  1 | test1
  2 | test2

(2 rows)
cqlsh:sample>



(追記)

cqlsh は、 python 製の pip でインストールできるコマンドなので
ダウンロードした tarball の じゃなくても

sudo pip install cqlsh

でインストールできる。

macOS Sierra の場合
$ sudo easy_install -U six
で、システムの python 2.7 の six をアップグレードしないとダメかも


この /usr/local/bin/cqlsh にインストールされるコマンドを実行しても良い・・・はずなのだが

$ cqlsh
Connection error: ('Unable to connect to any servers', {'127.0.0.1': ProtocolError("cql_version '3.3.1' is not supported by remote (w/ native protocol). Supported versions: [u'3.4.2']",)})

エラーで接続できない。クライアントの要求する CQL バージョンの方を
サーバーが受け付けられないということらしい

$ cqlsh --cqlversion=3.4.2

って指定するとエラーにならないんだけどいいのかな?

~/.cassandra/cqlshrc に
[cql]
version = 3.4.2

と書いても同じらしい
コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

MongoDB にユーザー追加してユーザ認証 [プログラミング]

データーベース test_nmongo に管理者権限を持ったユーザー alice (パスワード secret)を追加

$ mongo
$ use test_nmongo

db.createUser(
{
user: "alice",
pwd: "secret",
roles:
[
{
role: "userAdmin",
db: "test_nmongo"
}
]
}
)

role には普通は "readWrite" とか "read" とか指定するみたい
https://docs.mongodb.com/manual/tutorial/enable-authentication/#create-additional-users-as-needed-for-your-deployment


ユーザー alice でログインしてみる

[mongo shell から接続する場合]

mongo -u "alice" -p "secret" --authenticationDatabase "test_nmongo"

[mongo shell で接続してから認証する場合]

mongo
> use test_nmongo
switched to db test_nmongo
> db.auth("alice", "secret")
1
>

うーんと、できてるっぽいけど、これでいいのかな・・・
コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

MongoDB の SSL 設定 [プログラミング]

ここらへん↓を参考に作業
https://docs.mongodb.com/manual/tutorial/configure-ssl/
https://github.com/retorillo/mongodb-example/blob/master/README-ja.md
http://www.utali.io/entry/2016/11/04/113830

http://nakagami.blog.so-net.ne.jp/2016-12-07
の時に Ubuntu16.04 にインストールした MongoDB3.2 で /etc/mongod.conf に設定ファイルがあることを前提に・・・

# cd /etc/ssl
# openssl req -newkey rsa:2048 -new -x509 -days 365 -nodes -out mongodb-cert.crt -keyout mongodb-cert.key
(色々入力。この時、Common Name は、検証されるので接続される IP アドレスのホスト名を入れる)
# cat mongodb-cert.key mongodb-cert.crt > mongodb.pem

/etc/mongod.conf の
net:
  port: 27017
  bindIp: 127.0.0.1

こうなっていたのを↑こう↓変更
net:
  port: 27017
  ssl:
    mode: requireSSL
    PEMKeyFile: /etc/ssl/mongodb.pem


んで、 mongo shell からは

mongo --ssl --sslCAFile=/etc/ssl/mongodb-cert.crt

でアクセス。
--sslCAFile=/etc/ssl/mongodb-cert.crt の指定がないとエラーになる
なるほどー

WARNING出るけど
mongo --ssl --sslAllowInvalidCertificates
でも接続できた
コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

Pure Python の Yet another mongodb driver [プログラミング]

この記事は MongoDB アドベントカレンダー 2016 http://qiita.com/advent-calendar/2016/mongodb の 8日目のエントリーです

ここ数年、趣味で pure Python の RDBMS のデーターベースドライバーを書いていて、今年の PyCon JP でそのことについて話すことができました
https://gist.github.com/nakagami/bfbe98d62377f3f4554121ab161ae8c9

書けそうなデーターベースのドライバはあらかた書いてしまったので、NoSQL なデータベースのドライバということで MongoDB の pure Python のドライバーを書きました。

https://github.com/nakagami/nmongo

Python3.4 以降で
$ pip install nmongo
でインストールできます。

mongo shell のメソッドに似たインターフェースになっています
https://github.com/nakagami/nmongo#example
管理系のメソッドはありませんが、アプリケーションを書くための一通りの機能はあるつもりです。
GridFS にアクセスする機能はないです。

内部的には、db.runCommand() を実行するメソッドがあって、 各メソッドは、そのメソッドを呼ぶような形になっています。
MongoDB 3.2 で、 command に色々追加されたので使えるようになった感じです。

MongoDB には pymongo というドライバーがあり、(残念ながら)nmongo は、それを超えるメリットが発見できないんですが、使ってみて不具合報告、改善提案などしていただけるとありがたいです。
とりあえず次は TLS 接続ができるようにしたいなぁ、と思っている今日この頃です。
コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

MongoDB をローカル環境にインストールしてみた [プログラミング]

この記事は MongoDB アドベントカレンダー 2016 http://qiita.com/advent-calendar/2016/mongodb の賑やかしエントリーです

MongoDB は仕事で使ったことないのですが、触っておきたいと思い、自分のローカル環境にインストールした時のメモと感想です。

MongoDB の公式で Ubuntu16.04 + MongoDB 3.4 での手順が書かれていますが
https://docs.mongodb.com/manual/tutorial/install-mongodb-on-ubuntu/
どこをどう間違っているのかインストールできませんでした。

気を取り直して、Ubuntu16.04 + MongoDB 3.2 は、DigitalOcean のドキュメントの通りに実行したらインストールできました
https://www.digitalocean.com/community/tutorials/how-to-install-mongodb-on-ubuntu-16-04
そのうち DigitalOcean に Ubuntu16.04 + MongoDB 3.4 のページもできるのでしょう。

macports は MongoDB 3.4 の port が既に存在しているので
$ sudo port install mongodb @3.4.0
で macOS Sierra にインストールできました
ついこのあいだまで mongodb 3.2 の port があったのですが、MacPorts の mongodb は 3.2 → 3.4 と最新の stable バージョンに更新されていって、並存しないようです。
(PostgreSQL はいろんなバージョンの port があるのに・・・)

以前に port で mongodb 3.2 をインストールしていて、それを削除してから 3.4 をインストールしたのですが decimal128 のデータを登録しようとしたところ
Cannot use decimal BSON type when the featureCompatibilityVersion is 3.2.
See http://dochub.mongodb.org/core/3.4-feature-compatibility .
とエラーが出てしまいました。
データーベースのデータが残っていたからだと思います。

mongo shell で
> db.adminCommand({setFeatureCompatibilityVersion: "3.4"})
{ "ok" : 1 }

としたところ、エラーは出なくなりました。

プログラマー視点で ReleaseNote を見ると
http://qiita.com/kabao/items/19c590d99e724efcf73b
Mongo3.4 で追加された機能は
- Decimal型
- Collation(照合順序)およびCase-Insensitiveインデックス
- 読み取り専用ビュー
くらいで、決定的な違いは Decimal型を使えるようになったという点くらいだと思います。
プログラマー視点では、今回のバージョンの機能追加はおとなしめかな、と感じました。

(2017-04-03 追記)
Windows 10 にインストールするのは https://garafu.blogspot.jp/2016/12/install-mongodb.html ここらへんが参考になりそう
コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

気がつくと複雑になってしまうコード [プログラミング]

いま、僕は複雑なコードに苦しめられている。主なところは

- 安直に例外投げすぎ問題
- リストの内包表記使いすぎ問題
- define 使いすぎ問題

例外は要するに大域ジャンプなので後で例外が起きた(起こした)ところの値を受け取りたくて苦労している。
python は例外を投げてもメモリリークしないけど、いっそのこと golang ならこんな苦労をしなくても済んだのかもと思う。

リストの内包表記使いすぎ問題は
def func_ab(values_list):
    def _set_ab(v):
        v.a = 'A'
        v.b = global_func_b(v.b)
    [_set_ab(v) for v in values_list]

↑こんなのがあって
def func_ab(values_list):
    for v in values_list:
        v.a = 'A'
        v.b = global_func_b(v.b)

↑これでよくない?と

define 使いすぎ問題は、C言語でいうところの
#define ONE 1
みたいなやつ。
一回しか使わないエラーメッセージみたいなのを一箇所に集めて
error_log(SOMETHING_WRONG_SITUATION)
みたいにしてるのも仲間かと。
エラーログの文字列から処理を探すのが大変。
そりゃ世の中にはメッセージカタログ使っているものもあるけど、時と場合によるだろうと思う。
そして define使いすぎの場面のほうが、使うべきなのに使ってない場合より多いのでは。

そういえば、随分昔の話 Visutal C++ で、ものすごく Fat な文字列クラスがあって、あれもひどかった。
ちょっと便利系のいろいろ機能(メソッド)が足されているけど、ちゃんとドキュメント化されてなくて、ところどころ不具合もあった。
文字列の後ろから特定の文字が何文字目かにあるか探すメソッドは、2 byte 文字の 2 byte 目問題に
当たっていたので、明らかに不具合があって、指摘したのだが書いた人は
「実績があるから」
といって聞き入れてくれなかった。

こういう複雑コードを書く人は経験を積んだら普通に書けるようになるんだろうか?
直らないものなのだろうか?
それとも経験を積んだ結果なんだろうか?
define 使いすぎ問題は、自分にも覚えがある
Fat な文字列クラスの人は、ベテランだったけど、あれが経験を積んだ結果なのか昔からずっとそうなのかは知らない
コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

書かれるコードが難しすぎる [プログラミング]

世の中には、わかりやすいプログラムとは何か?と考える間も無く粗雑なコードのコピペの連鎖で作られているプログラムがあることは知っている。
幸いにも最近はそういう拙くてひどいコードを見ることはない。

ただ、頑張ってちゃんと書こうと思うあまりに一見して良さそうに見えて、とてもわかりづらくなっているものに出会うことはある。

リストの内包表記や lambda、 map、 reduce を多用しているのは
「それ、ループのがわかりやすくない?」
と思うし、
「デザインパターン言いたいだけやろ!」
って思う細切れになって見通し悪くなってるだけのもある。
雰囲気は(そういう名前ついてるし)なんとかっていうパターンなんだけどいざ機能を修正しようとするときにどこをどう直していいかわからない。
Python はリストや辞書やセットの表現力が高いから、過剰にオブジェクトの継承や委譲に頼った書き方しないほうがわかりやすくない?
もちろんクラスの継承や委譲のもすることはあるんだろうけど。

やたら generator を使っているが、処理のどこかでリストに評価されてしまっているので「それ、リストで返したほうがよくない?」と思うことのほうが、「うまく使ってるねー」って思うことより多いかも。

デコレーターを使っていることで、こっそり実行されてたり副作用があったりしてわかり難い不具合を発生させたりすることもある。ちょっと便利機能をデコレーターで実装するのはやめてもらいたい。
作りの悪いのは「(副作用があるので)書く順番が決まっています」みたいなものもあって、地雷になってる。デコレーターを作るのは頭がよくてセンスの良いフレームワーク開発者だけにしてもらいたい。

Django でいうと、一例として、やたら select_related や values_list() を使っていてモデルでのアクセスを台無しにしてるのもある。
パフォーマンスがよくなると思ってだと思うけど、
「読みづれーだろ。計測したのか?必要なのか?」
・・・なんか、動いてしまっているのに、 values_list() 使わないように書き直してって(僕は)言いづらいけど、直す時に大変になる。
きっと、どこかのブログの解説で、「こういう風に書いたほうがパフォーマンスがよくなる」みたいなのを読んだんだろうなぁ。

Python で書くと、ある程度誰でも同じようなコードになって読みやすい、って言われるけど、人は、ありとあらゆるコーディングテクニックを使いたくなるものらしく、意外とそうでもないな、と最近思う。

Go言語は、21世紀に発明されたのに、クラスもリストの内包表記もジェネリックプログラミングも例外処理もなくて、デフォルトパラメーターもキーワードパラメーターもない。最初に見た時は
「こんなんでいいの?」
って思ったけど、それでも必要な処理は意外と書けるし、むしろそういう機能がないところがいいんだろうな、と思う今日この頃。
コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

プログラムを書くのに時間がかかる [プログラミング]

なにかひらめいて、2〜3時間パソコンに向かって、そのアイディアを
コーディングしたら素晴らしい成果が現れ・・・たら、どんなにいいだろう。
1日中机に向かって、コードを読んだり考えたりしてる合間にちょっとだけ書いて、延々とデバッグしている。
1日8時間一生懸命やると、ヘトヘトだけど、がっかりするほどに1日の成果って少ない。
休みの日に仕事とは関係ないコードを書こうとすると本当に進捗は微々たるものだ。
前回どこまでやってたか忘れちゃうし、仕事でなければ飽きたらいつでもやめていいという誘惑もある。
それでいて、コードを書いた成果は他の人には見えにくて、コードが読める人にしか届かない。

みんなが年を取るに従ってコードを書かなくなるのが、最近少しわかる。だって大変なんだもん。
大変な割に、みんなすごいって言ってくれない。

なんか、新しめで流行りそうな技術についてちょっと使ってみてプレゼンするとか、後進の指導とか、そんなののほうが、みんなにすごいって言われて楽しそうな気もする。
でも、今書かなくなったらもうずっと書かない気がするので、もう少し頑張ってみようと思う。
コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

最低限の tmux キーバインド [プログラミング]

tmux について、全部は使いこなせないので、最低限のキーバインドを探る
ウィンドウを複数持てて、各ウィンドウに複数のペインをもてる。
セッションのアタッチ、デタッチができる。
・・・けど、最低限以下の3つを覚えればなんとかなるかな。

- Ctrl-b + %: ペインを左右に分割
- Ctrl-b + ": ウィンドウを上下に分割
- Ctrl-b + o: ペイン間の移動

あとは Ctrl-d でセッションを終了できる=ペインを閉じることができる、ので

(2015-10-09追記)
セッションの中断と再開

- Ctrl-b + d: セッションのデタッチ
- tmux a で起動: デタッチしているセッションのアタッチ

Silverlight はもう使わんといてくださいとのこと [プログラミング]

Microsoft からのお知らせで、もう Silverlight は obsolate になるので、速やかに使わないようにしてください、とのこと。
http://it.srad.jp/story/15/07/05/0012241/

まったくひどい話だ。
Silverlight が発表されたときには、Flash の置き換えでWindows だけじゃなくて Linux や Mac のブラウザでも動いて、.Net Framework をベースにしてて、Miscrosoft は、すごく力を入れますよ、という話だった。

これは、勉強せねばと思って本を買ってみたが、さっぱりわからない。
XAML という XMLの固まりみたいなのでレイアウトを定義するんだけど、複雑で難しくって、なぜ XML なのかもわからない。
(近い将来、XAMLを編集する GUIエディターがたくさん出るので大丈夫とか書いてあった。嫌な予感がした)

.Net Framework の新しい API と、その XAML っていうので、Flash の置き換えのアプリケーションを作れるらしんんだけど、結局、なぜ Silverlight が素晴らしいのかわからないまま途中で挫折してしまった。それなりに時間を使ったつもりだったのだが。
・・・まあいい、いつか Silverlight が本格的に使われるようになったらもう一回本を引っぱりだして読めば、そのときはしっくり来るだろう。そう思っていた。

Silverlight を使ったプロダクトって、GyaO くらいしかなかったと思うけど、GyaO も動画を配信するだけなら Silverlight を使う必要なかったわけで、僕も無駄な時間を使わされてしまったけど、 GyaO のシステム開発した人、御愁傷様と言わざる終えない。

思えば、CORBA IIOP や UML のツール(Rational Rose みたいな)を使った開発みたいなので、「これからはこれだ!」みたいなの、業界のリーダーみたいな人たちが力を入れると宣言しても、思ったよりうまくいかないことが多い。
別に、勉強が好きってわけじゃないので、思い出すだけでも悲しくなってくる。

最近思うのは、そういうのって誰か偉い人が言っているからじゃなくて、自分で使ってみた感触が大事だなってこと。
本を読むにしても、最初の1、2章で「なるほど」みたいな感触がないものは、難しく感じて、難しく感じるものは流行らない気がする。
流行を追いかけるのが大事ではないが、だれも使っていないものは、どんなに素晴らしい技術でも意味がない。

新しいものを勉強するのがおっくうになるのは、俺が悪いだけじゃないよ・・・と言いたい。

それにしても、 Silverlight はピークがなかったという意味で、ひどかったな。
コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感
前の10件 | 次の10件 プログラミング ブログトップ