2016年5月19日木曜日

Ubuntu14.04で、extra-cmake-modulesを使いたい & apt-getできないパッケージの探し方

Ubuntu14.04を使ってて、githubからfcitx-qt5を落として使おうと思ったんだけど、cmakeをかけると、こんなエラーが出た。
CMake Error at CMakeLists.txt:8 (find_package):
  Could not find a package configuration file provided by "ECM" (requested
  version 1.4.0) with any of the following names:

    ECMConfig.cmake
    ecm-config.cmake
{なんじゃ、このECMってのは? しゃーない入れるか。}
と調べると、 extra-cmake-modules というもののよう。
これを使うと、どうも CMakeLists.txt が書きやすくなるものらしく、最近cmakeの際に、ECMを必要とするプロジェクトが増えている様子。 例によって、
sudo apt-get install extra-cmake-modules
してみたが、
E: パッケージ extra-cmake-modules が見つかりません
と怒られた。
{えーっ。ないのかー。探すか・・・}
Ubuntuだと、このECMっちゅうのは、14.10からの導入らしく14.04の標準リポジトリには、存在しない。 しかも、Ubuntu14.04 extra-cmake-modules ECM apt-get とかのキーワードをいろいろ組み合わせてググってもパッとしない。
結局、見つかったんだけど、それがここ。一見、14.04用ないじゃん・・・ ってなるけど、わかりにくく下の方に、
Other versions of ‘extra-cmake-modules’ in untrusted archives.
てあるので、そこ開いてTrusty(14.04のこと。わかりにくいから数字にしてくれ・・・)を叩くと、非公式リポジトリの説明ページに飛ぶから、そこの情報に従い、
sudo add-apt-repository ppa:ubuntu-sdk-team/staging
で、リポジトリ追加して後は、お決まりの
sudo apt-get update
sudo apt-get install extra-cmake-modules
で、無事ECM追加できて、cmakeもあっさり通った。
今回お世話になった、パッケージ情報がたくさんある launchpad.net なんだけど、Ubuntuのパッケージを探すときには、注意点があって、トップページにある検索窓に、パッケージ名(例:extra-cmake-modules)を打ち込んでも、結果のExact matchesには、ソースパッケージの情報しかでてこない。(お目当てのモノは、下のずらーーーっの中に埋没している。)
なので、Ubuntuパッケージのページの検索窓を使う。こっちは、Exact matchesにちゃんと実行できるパッケージが出るので、そのから探すと速いです。

2016年4月26日火曜日

Django (1.9) で、PyMySqlのDictCursorを使う方法。

対象

Djangoから、DBに接続してデータをごにょごにょやりたいんだけど、ORMが嫌いで
「Viva! SQL」 な人。

やりたいこと

Djangoのconnectionsを使うと、SELECT文の結果カーソルがtupleになってしまいフィールド順序でのアクセスになってしまうので、こんな風に
{'name': 'Taro Yamada', 'age': 25}
Dictionaryで結果がほしい。

やったこと (簡潔編)

ORM使わないなら、Djangoのconnectionsいらないから、自分でconnectする。
参考URL: YoheiM.NET

やったこと (だらだら編)

Djangoで、settings.pyにDBを以下のusersのように追加して、(docs.djangoproject.jpより引用)
DATABASES = {
    'default': {
        'NAME': 'app_data',
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'USER': 'postgres_user',
        'PASSWORD': 's3krit'
    },
    'users': {
        'NAME': 'user_data',
        'ENGINE': 'django.db.backends.mysql',
        'USER': 'mysql_user',
        'PASSWORD': 'priv4te'
    }
}
で、データがほしいところで
from django.db import connections

conn = connections["users"]
cur = conn.cursor()
cur.execute("SELECT * FROM persons WHERE id = %s", 100)
row = cur.fetchone()
print(row)
てな感じで、書くとprintされるのが、以下みたいな感じ
(100, "Taro Yamada", 25, 1, True)
{えーっ。tupleですかー? これじゃ、templateにrowを渡した時に、{{ row.1 }} な感じで読み取らないといけないから、わけわかめじゃんよー・・・。俺は、class Person を作りたくないんだってば }
どうやら調べると、DictCursorなるものを使えば、rowがtupleでなく
{'id': 100, 'name': 'Taro Yamada', 'age': 25, 以下略}
のようにdictionaryで取れるらしい。(参照: stackoverflow) 押忍。じゃあ、そこに
connection.cursor(pymysql.cursors.DictCursor)
なんて記述が、あったからさっきの上のコードをこんなふうに変更してみたところ
--- cur = con.cursor()
+++ cur = con.cursor(pymysql.cursors.DictCursor)
こんなエラーが
    cur = connections['users'].cursor(pymysql.cursors.DictCursor)
TypeError: cursor() takes 1 positional argument but 2 were given
{むきーっ!! }
どうやら、connections[‘users’]でとれるconnectionと、上記stackoverflowサンプルのconnectionは、別物らしい。
そりゃそうじゃよな。
具体的には、前者が ‘django.db.backends.mysql.base.DatabaseWrapper’
で、後者が ‘pymysql.connections.Connection’
さらに調べると、別のstackoverflowで、
「djangoに、DictCursorなんて、なぁぃですね~↑」(No there is no such support for DictCursor in django.)
{なにーっ!! }
さらに、その回答の解決案がびみょ~~な感じ。
でも、考えてみるとDictCursorを使いたいって時点で、djangoのORM無視してSQL投げたいってことなんだから、自分でconnectすればいいじゃんか。 ← 早く気がつけ。
幸い、親切な人が素晴らしい解説を書いている(YoheiM.NET)ように、使い方は簡単。
ただ、DB接続設定は、settings.pyに残しておきたいのと、データを使う側でのコードを簡潔にしたいので、最終的に以下のようになった。
まず、settings.py に、connectionまで定義してしまってアプリ全体で使い回す。
import pymysql.cursors

USERS_DB = pymysql.connect(
    host='localhost',
    user='db_user',
    password='db_pass',
    db='users',
    charset='utf8',
    cursorclass=pymysql.cursors.DictCursor)
最後の一行が、ポイント。 settings.pyってpythonファイルだから、こんなものも置けるんだ・・・
DBにアクセスしたい方では、
from django.conf import settings

conn = settings.USERS_DB  # ←これ便利
cur = con.cursor()
cur.execute("SELECT * FROM persons WHERE id = %s", 100)
row = cur.fetchone()
print(row)
これで、 {'id': 100, 'name': 'Taro Yamada', 'age': 25, 以下略} が、めでたくprintされる。
ついでに書くと、templateに渡すところでは、↑のrowを利用して、views.py で
render(request, 'users.html', {'person': row})
なふうに、簡単に渡して、template側では、
{{ person.name }}
とか
{{ person.age }}
みたいに、見てすぐにわかるように呼び出せるようになった。

でも、django.db.backends.mysql.base.DatabaseWrapperと pymysql.connections.Connectionのようにオブジェクト自体が異なっていても、executeの書き方やfetchoneで呼ぶところなど、共通だからほとんどコード変更の必要が無いのって、pythonからのDBアクセス方法がPEP 249で規定されてるからなんだよね。
pythonって文法が好きになれないんだけど(俺が好きなのはscala)、取り巻く環境がいろいろと整ってるから結局使っちゃうのよ。

長いところ、最後までお読みいただきありがとうございました。

2015年10月8日木曜日

gflagsとglog(Google logging)を windows 用にVisualStudio2015でビルドした

ググっても出てこなかった(or古い情報で使えなかった)ので、メモ。
当方の環境はvs2015, windows10

cmake

とにかくcmakeが必要。 入っていない場合は、ココから入れる。

glog

github から落とすと(2015-10-08 時点) 、google-glog.sln がいるがこいつがくせ者。vs2015で開くときにconvertしてもビルド時に失敗する。
なので、付属のslnは使わずにcmakeで作りましょう。

gflags

こいつも同じ。github にあるChangeLog.txt に 「Renamed google-gflags.sln to gflags.sln」なんて記述があったから、一生懸命探してしまったがそんなファイルはない。
なので、cmakeでslnを作って下さい。

2015年3月2日月曜日

eclipse使ってて、突然gitのcommitができなくなった

状況

eclipse(Luna)使ってるんだけど、ある日突然、gitのcommitができなくなった。
commitしようとすると、

'committing changes' has encountered a problem.
An internal error occurred

なんてエラーがダイアログBoxに出て、commitできない。そのDialog Boxに付いている”Details”ボタンを押しても

An internal error occurred
Exception caught during execution of commit command

しか書いてなくて、わけわからなかった。

ネットで調べたら、ここ に書いてある方法で解決したんだけど、下の方にちょこっと書いてあって見つけにくかったのでメモを残します。

解決法

.gitの中にある、 index.lock を削除する。

自分のケースでは、これだけであっさり解決しました。

2014年10月25日土曜日

漢字プリント 簡易作成ページ

漢字の練習をしたいとき(させたいとき)に一度間違えた漢字だけを集めて練習をしたいようなときがある。
そんなときに、間違えた問題だけを集めたプリントがあると便利なのだが、自分で作るとなると形を整えるのが結構面倒。

てなわけで、間違えた問題をテキストで取っておいて貼り付けるとそこそこ整形するようなものを作ってみました。
印刷用画面生成ボタンを押して表示された画面をブラウザの印刷機能で印刷してください。A4縦だと収まりがいいです。
動作確認は、chrome,safariで行っています。詳しい使い方は、ボタンの下を見てね。

  

各行に漢字の問題を
  漢字の(問題,もんだい)を作る。
のように書きます。実際は、ここで書くのではなく、どこかのテキストファイルにでもまとめておきます。
()の中はカンマ区切りで前半が正解の漢字、後半に読みがなを入れておきます。
送り仮名まで問題にしたいときは、上の例の3行目のように送り仮名まで含めて書いてください。

また、問題文の難しい文字に読みがなを付けたいときは、上の例の2行目のように
  (*真相,しんそう)を(究明,きゅうめい)する。
漢字の前に*を付けてください。このように指定すると問題ではなくただのふりがなとして作成します。

このページを作成するにあたって、freefielderさんの縦書きhtml作成用javascript(h2v.js)を使用しました。すごく便利なscriptです。ありがとうございました。

2014年9月15日月曜日

ディズニー ツムツムにはまった

今日は、本当にどうでもいい話なんだけど(いつもどうでもいいんだけど)、最近ディズニーツムツムにはまっている( orた?)。
自分がツムツムをやるときは、手を使わずに必ず棒を使うようにしている。
こんなやつ、
このスタイラスは、su-penのフタがびよ~~~んとのびるバネで出来ている伝説のモデルで、残念ながら現在生産終了。su-penは、保護フィルム越しの反応が、何本か試した中で一番良かったので愛用している。
こういう棒を使うと、棒なだけあってちょっと指を動かしただけで、先端が大きく動くので高速にプレイできてやりやすいので、ゲームでは手放せなくなっていて、うちではこいつは「ツム棒」と呼ばれている。
で、この間、この棒を忘れて外出してしまい、移動時間にツムツムをやろうと思って、

{げ、ツム棒忘れたぜ・・・}

とあせったが、まあしょうがないので指でやってみた。
ほんでもって、いつものペースで指で限界プレイしたら、指がマジ暑い。 もちろん摩擦で・・・

{なんじゃこりゃ!これ、炎のコマじゃねえの?俺はゲームセンターあらしか・・・}

ツムツムを指でマジプレイしてる人って指紋なくなるんじゃね↑ と心配になりました。

2014年7月3日木曜日

PlayFramework 2.3.1 with Scala 2.11.1 へプロジェクトをアップグレードした時のメモ

最近、ScalaもPlayもいろいろアップデートしていて速くなったとか(Scala)、速くなったとか(Play)言っているから、
{まあ、入れてみるか}
とやってみたら、以前のプロジェクト(Play2.2.x with Scala2.10.x)をアップグレードしようとした時いろいろややこしかったので、別のプロジェクトをやるときに絶対忘れそうなのでメモっておく。

まず、新しいPlayとScalaを公式ページでdownloadしようとすると、activatorなるものをインストールするように誘導された。
{activatorってなんじゃい}
完全に浦島太郎状態。どうやら、Scala, Play, Akkaやらサンプルやらwebエディターやらwebデバッガーやらセットになっていて、これ入れれば全部OKみたいなものらしい。
しかもplayコマンドとかsbtコマンドとか、全部 activator コマンドでやれということらしい。
で、activatorインストール後、今までのPlayのprojectフォルダに行って、
activator compile
とかいきなりやったけど、エラーの山。
{ま、そりゃそうだよな。しかたないか。}
なので、projectのファイルを色々変更した。

まず、project/plugin.sbt のplayのバージョンを以下のように変更
addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.3.1")
次に、project/build.propertiesのsbtバージョンを以下のように変更
sbt.version=0.13.5
そんで、project/Build.scalaをこのサイトのSbt sampleを参考にこんな感じ変えてみた。
import sbt._
import Keys._

object ApplicationBuild extends Build {

  val appName         = "xxxxx"
  val appVersion      = "1.0-SNAPSHOT"

  val main = Project(appName, file(".")).enablePlugins(play.PlayScala).settings(
    version := appVersion,
    scalaVersion := "2.11.1",
    libraryDependencies := {
   CrossVersion.partialVersion(scalaVersion.value) match {
     // if scala 2.11+ is used, add dependency on scala-xml module
     case Some((2, scalaMajor)) if scalaMajor >= 11 =>
       libraryDependencies.value ++ Seq(
         "org.scala-lang.modules" %% "scala-xml" % "1.0.1",
         "org.scala-lang.modules" %% "scala-parser-combinators" % "1.0.1",
         "org.scala-lang.modules" %% "scala-swing" % "1.0.1",
         "com.github.scala-incubator.io" %% "scala-io-file" % "0.4.3-1")
     case _ =>
       // or just libraryDependencies.value if you don't depend on scala-swing
       libraryDependencies.value :+ "org.scala-lang" % "scala-swing" % scalaVersion.value
   }
 },   
 scalacOptions += "-feature"
  )

}
参考ページのコードに追加したのは、scalaxのscala-io-fileの部分、モジュール名とかバージョンとかわからなかったけど、MVNRepositorysというサイトから持ってきた。このサイトは知らなかったけど、こういうときはメチャメチャ便利なところ。

これでとりあえず動くようになった。