Rubyの2次元ハッシュの定義
本当にタダのメモ
hash = Hash.new{|h,k| h[k] = {} } # 以下のように値を代入できる hash["a"]["b"] = 1 # 上記とは別に、以下のように、存在しなければ、都度、ハッシュを定義してもよい # if文でチェックする必要がないので、シンプルに書ける hash["a"] ||= {}
参考記事
エンジニアとして世界の最前線で働く選択肢、を読んで
シリコンバレーで働く日本人エンジニアの就活事情に興味があったので。
エンジニアとして世界の最前線で働く選択肢 ?渡米・面接・転職・キャリアアップ・レイオフ対策までの実践ガイド
- 作者: 竜盛博
- 出版社/メーカー: 技術評論社
- 発売日: 2015/10/08
- メディア: Kindle版
- この商品を含むブログ (4件) を見る
タメになった話
- 就労ビザについて
- 米国で外国人として生きるということ
- デメリット面にもフォーカスした実直な内容だと思う
- エンジニアとして雇用の流動性はあるが、シリコンバレーでも50才を超えると、転職は難しくなる
- エンジニアのキャリアのトップはフェローで、マネジメントはバイス・プレジデントだが、フェローの方が狭き門であり、一般的にはシリコンバレーでもエンジニアからマネジメントに移行する人が多い
- 年齢と共に技術習得が難しくなるから
- 面接に対する心構えやコーディング対策
- 面接を受ける立場、面接官としての立場からのアドバイス
- 1問だけ例題がある
- 会社事情による解雇(レイオフ)は悲観的になることはない
- 著者の経験による具体的な話が参考になる
psycopg2.OperationalError: asynchronous connection attempt underway
pythonで並列処理 - pandazx's blog というブログを以前、書いたが、 並列処理の中でPostgreSQLにSELECTを投げる処理をした時に以下のエラーが発生した。
psycopg2.OperationalError: asynchronous connection attempt underway
このエラーは並列処理前にDBに対してコネクションを作成しておき、 並列処理の中でそれを使いまわした際に発生する。
解決策としては、並列処理の各処理の中でコネクションを作成すればよい。
接続処理を1回にしようとしたのだが、ダメらしい。
Ubuntu14.04にVNCリモートログインで動画再生できない
まず、Ubuntuは標準では、著作権の問題でコーデックがないため、mp4などの動画が再生できない。 そのため、コーデックをインストールする。
sudo apt-get install ubuntu-restricted-extras
これでローカルからログインすれば再生できる。 しかし、まだ、VNCでリモートログインした状態からは再生できなかった。
これは標準の動画再生プレイヤーの問題のようで、VLC media playerを使えば再生できる。
sudo apt-get update sudo apt-get install vlc browser-plugin-vlc
CentOS7にPostgresql9とPostGISをインストール
今更な内容だが、作業ログとして残す。
前提
OS: Centos 7
インストール
sudo yum install epel-release sudo yum install -y proj proj-devel proj-epsg sudo yum --enablerepo=epel install gdal sudo yum install postgis # 順番が前後するが、以下でPostgresql Serverをインストール sudo yum install postgresql-server # DB初期化 sudo postgresql-setup initdb # サーバ起動時の自動起動 systemctl enable postgresql
CentOS 7 なので、起動停止にはsystemctl を使う
sudo systemctl start postgresql sudo systemctl status postgresql sudo systemctl stop postgresql
参考にしたサイト:CentOS 7にPostgreSQL最新版をインストール - 働きたくないゆとりの備忘録
ログイン
次に、ログインできなかったので、以下を参考に対応。
peer認証の関係でpsqlログインできない時の対処法 - Qiita
まず、postgresユーザのパスワード設定
sudo su postgres -c 'psql --username=postgres' ALTER USER postgres with encrypted password 'your_password';
次に、アクセス権の設定を変更
/var/lib/pgsql/data/pg_hba.conf の
host all all ::1/128 ident
を
host all all ::1/128 md5
に変更して、Postgresql を再起動
psql -U postgres -h localhost -W でログイン
他サーバからのログイン
デフォルトでは、localhost からしかログインできない。
/var/lib/pgsql/data/postgresql.conf の
listen_addresses = '*' ←に変更 port 5432 ←コメント解除
Postgresql を再起動
psql -U postgres -h xxx.xxx.xxx.xxx -W でログイン
PostGISの動作確認
create database test; \connect test create extension postgis; select PostGIS_full_version();
これでバージョンが表示されればOK
参考:CentOSにPostGISをyumでインストール(CentOS7.2, PostgreSQL9.5, PostGIS2.2) - Qiita
pythonで並列処理
python2.7で実装した際のメモ。
実装イメージ
- csvファイルの行ごとに重たい処理をするので、行ごとに並列処理したい
- 行の先頭列にはIDがあり、IDをキーに並列処理の結果を受け取って、出力したい
- csv上、IDには重複があるが、同一IDは2回処理したくない
- 各プロセスで共通して参照するデータがある。このデータはIDをキーに参照
- csvのどこまで処理が進んだか進捗を見たい
以下のサイトを参考にした。
メモ: multiprocessingを使うまで(Part 2) – Momentum
まずは、上記サイトのmultiprocess_with_instance_method.py をありがたくimportする。
from multiprocessing import Pool, Manager import multiprocess_with_instance_method
以下のようにして並列処理できる
def process(i, line, list, common_result): # lineを元にした処理 print "i=" + str(i) # 進捗を出力 cols = line.rstrip().split(",") id = cols[0] if common_result.has_key(id) == False: # 同一IDは一回のみ処理 common_result[id] = heavy_func(list[id]) return cols[1] def heavy_func(data): # 重たい処理 return data # 各プロセスの処理結果を代入する変数。各プロセスで共通参照される common_result = Manager().dict() # 各プロセスの中で参照するデータ list = {"1":"a", "2":"b", "3":"c"} #lines = open(csv_file, "r").readlines() lines = [] lines.append("1,aaa") lines.append("2,bbb") lines.append("3,ccc") p = Pool(3) result = [p.apply_async(process, args=(i, line, list, common_result)) for i, line in enumerate(lines)] p.close() p.join() # output for id, val in common_result.items(): print id + "," + val # process()でreturnした結果をresultで受け取って出力してもよい print [r.get(timeout=1) for r in result]
ちなみに、進捗を出力しても、python test.py > log & のように実行すると、バッファリングされてしまい、すぐにはファイルに出力されない。 この場合は python -u test.py > log & とすれば、すぐに出力される。
注意
並列処理するプロセスで参照するデータサイズが大きいと 並列処理のためのオーバーヘッドが大きくて、逆に遅くなるので注意。
KBレベルならいいが、100MBレベルだと厳しい。 その場合、参照データはDBにおいて、SQLでアクセスした方がよい。