2022年9月30日金曜日

ブレードランナーのエンディングと南極物語のメインテーマがそっくりな件

ブレードランナー2049を見よう思って旧ブレードランナーを復習のために見てみた。
amazonのレンタルストリーミングで見たんですけど、たったの100円でレンタルできて、超お得でした。貸し借りにTSUTAYAに行くより圧倒的に楽ですし。
まあ、それはともかく、 ブレードランナーを見た後、しばらく旧版のEDテーマが頭にこびりついていてたんですけど、頭のなかで再生しているうちにだんだん南極物語のテーマに変化してしまって。
{あれ? なんかこの2曲似てないか?}
と思って、youtubeってみたら、こんな感じ
一方の、南極物語はこんな感じっすね。
やっぱり似てる。
似てる、聞けば聞くほど色んな所が似てる気がしてよく見てみたら、 なんと
同じ人が作ってるじゃねーかよ。これ!
両方共、ギリシャの音楽家ヴァンゲリスの作品。かなり有名で、他にも炎のランナーなんかも手がけている人らしい。
最後に炎のランナーのテーマ曲も置いておきます。

2022年9月11日日曜日

blogger: カスタムドメインでhttps対応する方法


bloggerでカスタムドメインを使っていてちょいと手間取ったのでメモをのこしておきます。

bloggerの設定に「HTTPS の使用」という項目があったのでONにしたのだけれど、ステータスが「不明」になってしまうので困っている状況でした。

手順

  • DNS設定でCAAレコード追加
    • サブドメインなしのドメイン全体
    • フラグ: 0
    • tag: issue
  • blogger設定から「HTTPS の使用」をオンにする
    • ステータスが「使用可能」になる
    • ならないときはDNSが浸透していないので待つ
  • Let’s Encryptの設定
    • なし!
    • ここポイント。過去にLet'sEncrypt利用して自分のサーバーに証明書いれたことがある、かつ、DNSのCAAレコードについて理解していないと、何か設定は?とか証明書ファイルは?とか疑問に思うところだが、何もしなくていい。
    • CAAレコードを適切に設定してあれば、googleとletsencryptの間でよろしくやってくれる。
  • 注意点

    上記設定した後でもhttpsでブログに接続しようとすると

    chrome:  「切断されました」みたいなエラー
    firefox: PR_END_OF_FILE_ERROR エラー

    とエラーになるが、しばらく待ったら接続できるようになった。

    自分はこの間に、どこか間違ったか?とか、まだやること足りないのか?とかなり慌てたが、待てば解決した。

    もしかすると、Let’s Encryptが参照しているDNSまでCAAレコードの追加が浸透していなかっただけかもしれない。

参考にしたページ

2021年12月12日日曜日

iPadのBluetoothキーボードでかな入力をつらぬく方法(かなチートシート)

私は、バリバリのかな入力派である。
というかローマ字入力がうまくできないのである。

先日iPadを入手したので、持っていたBluetoothキーボード(Logicool K480)を接続したのだが、「壊れて出ない文字がある」ならぬ「壊れてなくても出ない文字がある」状態だった。 
具体的にいうと「ろ」を押しても「ろ」が出力されず無反応だったり、「む」を押しても「へ」が出力される。

 どういうことかと言うとiPadでは、BluetoothキーボードをUS配列と認識するとのこと。(参考サイト)
「まじか」
これは、どうにもならんらしく、持っているK480のキートップにも

⇦のように、灰色の丸の中にわざわざiPadに接続した場合は、この文字が入力されますという表示がある。
(写真は叩くと拡大します。)

しかしだ!
かなについては、どのキーを押すとどの文字が出るという表示はないのだ!

かな入力派は少数民族なため、迫害されているのかもしれないが、そこまでキートップに表示するとごちゃごちゃしすぎて、なんのこっちゃわからんようになるのも確かなので仕方ない。

そもそも、全かなを入力できるかもわからなかったが、テキトーにポチポチ押していたらどうやら全部入力できたので、ここに対応表を載せておく。

自分のキーボードは、Logicool K480だが、もしかすると他のキーボードでもいけるかもしれないので、ダメもとでチャレンジしてみるといいかもしれない。
出したい文字 押すキー
゜(半濁点)
゜(半濁点)
ー(伸ばし棒) Shift+゜(半濁点)
Shift+け
Shift+へ
Shift+゛(濁点)
最初はゲンナリしたが、使っていると案外すぐに慣れて問題なくやっている。
なお、!や?は、発見できなかったので漢字変換ユーザー辞書に追加してしのぐことにした。 例: 読み「め」⇨変換「?」とか

2018年7月30日月曜日

bloggerで特定ラベルの投稿一覧を出す version 2

自分の以前のブログ記事「bloggerで特定ラベルの投稿一覧を出す」で方法を紹介して、このブログでもそれを使ってました。
それを見て、私のscriptを使ってくださる方もいらっしゃるようで、あるヘビーなブロガーの方に、ひとつのラベルに記事がたくさんあると全部表示されない、と教えていただいた。
調べてみると、150本以上記事のあるラベルを表示させようとすると、それ以上表示できない様子。
たくさん記事をアップしないと発見できない現象で、うちのブログは、記事数が少ないので発見できていなかった。
blogger APIでとれるfeedの最大数が原因だったんですけど、ただ、もともと最大150だったわけではなく、元々500だったのが2015年の末頃に減らされたらしいとのこと。

今見たら、私の元記事は、2012年でした。結構前なのね・・・
というわけで、いい機会なので同一ラベル記事150本超の場合にも対応して、version 2にしたので、記事をアップしました。

使い方は、Blogger の管理画面「ページ」から新しいページを作りhtml編集モードにして

<div id="entry_list_by_label"><script src="https://cdn.rawgit.com/choniwaniwani/wasure/92f7a895/toc/bloggerFeeds.2.js"></script>
<script>load_entry_list("ラベル名称");</script></div>
を貼り付けて、ラベル名称を書き換えるだけです。
こんな感じの同一ラベル記事をまとめたページを作成します。

ラベル名称は、そのまんまラベルの名前です。日本語でもOKでした。
で、このタグ貼付部分より前や後に普通に文章入れてもOKです。

タグ内部に入れてもいいので、レイアウトは多少カスタマイズできます。リンクのaタグには'linkHref'という名前の未使用classも入っているので、cssでカスタマイズも可。


以下、javascriptのコードに興味ある方向けの内容です。

なお、codeは、githubにおいてありますので、javascriptいじれる方は、勝手にコピって改造して使ってもOKです。
コード内で、feedを呼ぶところは、これなんだろうという感じですが、詳しいパラメータの解説は、こちらにあります。
ただし、この中には、bloggerでは使えないパラメータもあります。(やってみないとわからない。)

あと、今回bloggerのhtml編集画面の変な仕様というかバグを見つけたのですが、bloggerは、全角の記号をすべて勝手にescapeしてしまうようです。 それなので、たとえば、javascriptの文字列の中でも・(中黒)があると&#12539;になってしまいます。
全角なんだからほっといてほしいですほんとに。それで、最初ラベル名に中黒が入っていると動かないという謎の現象が発生していました。

2018年2月8日木曜日

cygwinのアップデートがやたら遅くて時間がかかる。(解決)

タイトルのとおりだが、cygwinのアップデートがやたら遅くて完璧に頭に来てた。
何時間も待っているが、autorebaseとやらがいつになっても終わらない。
インストールウィンドウを見ると、0p_000_autorebase.dash と表示されたまま固まっている。HDDは、ガリガリ止まらない。

ぐぐってみると、この問題で、怒ってるっぽい人は結構いるようだが 、我慢するかなんか難しい対応をしてるひととかいたけど、中に
原因はRapportというウィルス対策ソフトについてくるTrusteer エンドポイント保護というソフトが悪さをしていたようです。Rapportは三菱UFJ銀行のお勧めで無料ウィルス対策ソフトとしてインストールしたのですが、それが災いしていたようです。やはりタダより高いものは無いですね。
(引用元:http://soukitaisyoku-kigyou.blog.so-net.ne.jp/2016-11-08)
というのがあり、「あっ」と思い、norton360の「設定->ウイルス対策->自動保護」をオフにしたら今までのがウソのようにスイスイ進むようになった。

タダどころか天下のノートン先生でもこれでした。ちょっと遅くなる程度でなく、何十倍もじかんがかかるとかなんだかなぁ。


Ubuntu16.04のカーネルアップデート(to 4.13)でNVidia driverが認識しなくなった(解決)

Ubuntu16.04で、
sudo apt dist-upgrade
したら、 NVidia driverを認識しなくなった。
nvidia-smi を実行しても、
NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running. 
という、連れない返事・・・

driverは、aptで入れていて、パッケージ名は、「nvidia-387」
どうやら、ソイツが、kernel4.13に対応していないらしい

↑のリンク記事だと、kernel4.10に戻して動かしていたが、
sudo apt install nvidia-
まで、打ち込んだところでtabキーを押してみると、候補の中に「nvidia-390」 がいたので、
sudo apt install "nvidia-*390*"
で、入れてみた。自動で387もアンインストールされるようだ。かしこいなぁ。
その後、再起動して無事認識しました。

2017年11月15日水曜日

Ubuntu16でnouveauドライバをアンインストールする。

Ubuntu16のマシンからnouveauドライバをアンインストールしたときの記録です。
 Ubuntu16のマシンにNVidiaのグラボを挿してNVidiaのドライバを入れたのですが、少し動作が不安定なので、nouveauドライバを抜いて様子を見ようとしたのが動機です。
なお作業は、sshでコンソールログインして行っいました。
 
NVidiaのドライバを入れた後に、lsmodをすると、
mxm_wmi                16384  1 nouveau
video                  40960  1 nouveau
i2c_algo_bit           16384  1 nouveau
ttm                    98304  1 nouveau
drm_kms_helper        155648  2 nouveau,nvidia_drm
な感じで、 nouveauドライバが入りまくっている。こいつらを消したい。
cudaは動くので、NVidiaのドライバが入っていることは確実。

まず、/etc/modprobe.d/blacklist-nouveau.conf を作成し中身を
blacklist nouveau
blacklist lbm-nouveau
options nouveau modeset=0
alias nouveau off
alias lbm-nouveau off 
としました。次に、dpkg -l | grep nouveau で見つけたあやしいやつを削除
sudo apt purge xserver-xorg-video-nouveau
 その後、
update-initramfs -u
これで再起動したら、lsmodしても綺麗サッパリnouveauが見えなくなりました。

2017年11月10日金曜日

ラズパイ3&バスパワースピーカーのノイズ退治(3.5mmジャック使用)

Raspberry pi3とバスパワースピーカーと3.5mmオーディオジャックの組み合わせで「強烈な」バックグラウンドノイズがのっていたのを解決した一例としてアップしておきます。

高音質にする、とかいう話ではなく、連続的な耐えられないノイズが発生していたのでそれを取った話です。

3.5mmオーディオジャック関連のノイズでは、ネットで
いろいろあったけど、ググっても見ないパターンでハマりました。

自分の場合↓の図のように接続していました。
これで、「ズビズビズビ、ピキーピピ、ズズビビ」のような、いかれたノイズが鳴り続けていました。どうやらこれは、電源系のノイズだったらしく次のようにつなぎ替えたらノイズが治まりました。
 バスパワースピーカーの電源を、別のACアダプタから取るのがポイントで、「ラズパイから電源を取らなきゃいんじゃね」と2個口以上あるUSBポートから、ラズパイとスピーカーの電源をとってしまうとノイズは消えませんでした。
 自分の場合は、ACアダプタ2つだとかさばるので、コイツを使って省スペースにしました。
この場合、一つの機器からラズパイとスピーカーの電源をとっていますが、片方がUSBポートで、もう片方が100Vに別のACアダプタをつないだものなのでOKでした。
つまり、ラズパイのオーディオジャックととバスパワーのスピーカーを使う場合、両方の機器の電源が一つの5Vの系にあるとノイズが発生するようです。

2017年11月9日木曜日

javascriptで簡単なカリー化関数を作った(ES6版)

最近、scalaからjavascriptに不本意ながら引っ越してきました。初めは嫌々ながらだったんですけど、ES6になってめっちゃ書きやすくなってるんですね。知りませんでした。
そんなわけで今回は、カリー化の仕組みがjavascriptの標準になさそうだったので、簡単にカリー化したいと思って調べてみると。 結構良さそうなのが、ありました。(Qiita: JavaScript でカリー化)
そのまま使っても良かったんですけど、僕はjavascriptでは、できるだけthisを使わないようにしているので、リンクの記事のcontextがいらないのと、その場合の空の括弧()がいらないので、上の記事のコードを参考に改造しました。
あと、他の言語から来ると、関数宣言の括弧の中にない引数をargumentsを使って取るのは気持ち悪いので、ES6の可変長引数を使ってこんな風にしてみました。
Function.prototype.curry = function (...args) {
  let func = this;
  function partial(...args) {
    return (args.length >= func.length)
      ? func.apply(null, args)
      : function(...ret_args) {
          return partial.apply(null, [...args, ...ret_args]);
        }
  }
  return partial.apply(this, args);
};
とりあえず、こんな感じにして動作確認
function sum1(a, b, c) {
  return a + b + c;
}
let sum2 = ((a, b, c) => a + b + c).curry()

console.log(sum1.curry(4, 5, 6))  // <- 6
console.log(sum1.curry(4)(5)(6))  // <- 15
console.log(sum2(10)(11)(12))  // <- 33
これでいいんだけど、あまりビルトインのprototypeを勝手に拡張すんな!としつこくMDN(ココココ)に書いてあるので、僕は潔癖でないのでそういうの嫌なんだけど、まあ後でcurryメソッドとか正式に追加されたらそれはそれで嫌なので、ただの関数版も作ってみた。
scalaのimplicit conversionが懐かしいぜ・・・
function curry(fn) {
  return function partial(...args) {
    return (args.length >= fn.length)
      ? fn.apply(null, args)
      : function(...ret_args) {
          return partial.apply(null, [...args, ...ret_args]);
        }
  }
};
こっちの使い方はこんな感じ
let sum3 = curry((a, b, c) => a + b + c)

// sum1は、上のを使いまわし
console.log(curry(sum1)(4, 5)(6))  // <- 15
console.log(curry(sum1)(1)(2)(3))  // <- 6
console.log(sum3(20)(21)(22))  // <- 63
console.log(sum3(2)(4, 6))  // <- 12
まあ、難しいこと考えなければこれで良いような気がします。
関数版は、憎たらしいthisも使わないですんでるし。
昔、10年くらい前には、
{javascriptって何でもfunctionで出来てて意味わかんねー} 
とかって思ってたんすけど、その基本設計と最近のES5,ES6と続く言語の拡張により俄然、モダンな書き方ができる言語に変化してきてるんですね。

2017年2月27日月曜日

Ubuntu Classic Server 16.04 on Raspberry Pi3 で固定IPに変更

タイトル通りの単純な話のはずだったんだけど、なかなかうまくいかなかったので、エントリアップ。
最初に、ありがちな/etc/network/interfacesの最後に
    # eth0設定
    auto eth0
    iface eth0 inet static
      address 172.20.XX.XX
      network 172.20.0.0
      netmask 255.255.0.0
      broadcast 172.20.255.255
      gateway 172.20.YY.YY
な感じで、追加したんだけど、起動してみたら確かに、指定したアドレスのIPを持ってたんだけど、それとは「別に」DHCPでもアドレスを取得していてそっちでもアクセスできちゃう。

さらに気持ち悪いことに、ifconfigをやってみると、なぜかDHCPで取ってきたアドレスだけ表示されて、↑で指定したアドレスが見えない。
{なんじゃろなー・・・}
と思い /etc/network/interfaces を見てみると、
    source /etc/network/interfaces.d/*.cfg
てな行があったので、
{こいつか}
と探すと、/etc/network/interfaces.d/50-cloud-init.cfgがいた、このページを見た感じ、これ変えりゃ行けるっぽかったので、このファイルに設定を移して、rebootすると、指定アドレスでなくDHCPになっている。

{オレなんかミスったか?} 
/etc/network/interfaces.d/50-cloud-init.cfg を見ると編集前の状態に戻っている。
{はっーー!? なんじゃそりゃ?} 
もう一回やったが、全く同じ現象・・・
どうやら、cloud-initさんとやらが起動時に勝手に書き換えちゃってくれているらしい。

ちょっと調べると、ビンゴなタイトル「how to set static ip in ubuntu 16.04 on raspberry pi 3 (cloud-init)?」のページがあったんだけど、回答はついてなくて、コメントで
「sudo apt remove cloud-init やったら動いたょ」
「えーっ。cloud-init使う方法ないの?」
みたいなやりとりがあって微妙。

他にもIP変えようとして、苦労して解決したけどcloud-initへの怒り丸出しなページ も発見、しかし、うちのケースには役に立たずがっかり。

{うー。ちゃんとしたドキュメント見つからないなーー。}
とさまよっていると、RedHatのユーザー向けページに「cloud-init に関する FAQ」 なんてやつを発見。結構丁寧に書いてあるが、↑で最初に書いたような設定を、meta-data ファイルに書けとの司令。

{うーむ、meta-data ファイルって何・・? っていうか、どこ・・?}
公式 見ても、ググっても何か埒あかないので、頭来て、
sudo find / 2>/dev/null | grep meta-data
で、ルートから探してやったら、
    /var/lib/cloud/seed/nocloud-net/meta-data 
{なんすかそこは? 見つかんないよそれは・・・}
で、その見つけたファイルに
network-interfaces: |
  auto lo
  iface lo inet loopback

  auto eth0
    iface eth0 inet static
    address 172.20.XX.XX
    network 172.20.0.0
    netmask 255.255.0.0
    broadcast 172.20.255.255
    gateway 172.20.YY.YY
bootcmd:
  - ifdown eth0
  - ifup eth0
って追加したらやっとまともに動きました。

動きはしたんですが、 /etc/network/interfaces.d/50-cloud-init.cfg はdhcpのままなんすよね。/etcをgrepしても、↑で指定したアドレスを含むファイルは無いようだし、cloud-init 全然理解してないです。

2017年1月18日水曜日

c++で、scala風ifをやりたい

scalaをしばらくやっていると、c++を書いた時にifが値を返さないのでトサカにくることがある。

三項演算子とラムダ式を使えばもちろんできるんだけど、超絶汚くなる。けど、マクロにしたら案外すっきりしたので、記事アップ。
// scala風if
#define IF(COND) (COND)?[&](){
#define ELSE ;}():[&](){
#define ENDIF ;}()
#define IFRES return
こんな感じ。c++11以降ね。使うときは、
// scala風if sample1
    const int i = 5;
    const auto s = IF(i == 4) {
        cout << "case true" << endl;
        IFRES "if true!";
    } ELSE {
        cout << "case false" << endl;
        IFRES "if false!";
    } ENDIF;

    cout << s << endl;
そこそこ見やすい。ENDIFが必要なのは勘弁してね。
c++は、中括弧の最後の値が中括弧全体の値にならないので、IFの戻り値にしたい値にIFRESを付けてね。
IFRESは、ただのreturnなんだけど、直にreturnって書くと関数全体のreturnに見えてしまい、わけわからなくなるので、このキーワードを使います。
逆に言うと、IFやELSEの中から関数の外へ直接return出来ないので、あしからず。returnしたい人は、別にifの戻り値が欲しいわけじゃないので普通のifを使ってください。

あと、ENDIFマクロの最後にセミコロンをあえて含めずに、使うときにセミコロンをつけるようにしたのは、コンストラクタの初期化子でも使いやすくしたかったから。

IFとかELSEの後がブロックでなくてもOK。
// scala風if sample2
    const int i = 5;
    const auto s = IF(i == 4) IFRES "if true!"
                   ELSE IFRES "if false!"
                   ENDIF;
    cout << s << endl;

2016年10月20日木曜日

opencv2系をgcc6でコンパイルしたらエラーになった

opencv2.4.13をubuntu16.10環境(gcc6)でコンパイルしたらこんなエラーが出て止まった。
In file included from /usr/include/c++/6/bits/stl_algo.h:59:0,
                 from /usr/include/c++/6/algorithm:62,
                 from /opencv-3.1.0/modules/core/include/opencv2/core/base.hpp:53,
                 from /opencv-3.1.0/modules/core/include/opencv2/core.hpp:54,
                 from /opencv-3.1.0/modules/core/include/opencv2/core/utility.hpp:52,
                 from /opencv-3.1.0/build/modules/core/precomp.hpp:49:
/usr/include/c++/6/cstdlib:75:25: fatal error: stdlib.h: そのようなファイルやディレクトリはありません
 #include_next <stdlib.h>
{stdlib.hがありませんって、そんなわけねーだろ!}
一瞬、あせったけど、cmakeで
-D ENABLE_PRECOMPILED_HEADERS=OFF
付けとけば、とりあえずOKっぽい。
opencvの方がおいおいgcc6対応すると思うけど、今のところこれで切り抜けられそうです。

2016年10月6日木曜日

docker buildしたときに、Dockerfileがシンボリックリンクだと失敗する。

タイトルのまんまなんだけど、docker buildしたときに、Dockerfileがシンボリックリンクだと失敗する。こんなエラーね。
% docker build -t image-name:tag-name .

unable to prepare context: The Dockerfile () must be within the build context (.)
そんなときは、リダイレクトでぶち込むととりあえず動きます。
% docker build -t image-name:tag-name - < Dockerfile
pathのところがハイフンになっている所に注意です。

追記
しかし、上の方法だとADDやCOPYでのファイルのコピーができません。
{ムキーッ。動かないし、あわてて上のエントリだしちまって、アホ丸出しだぜ。}
でこんなふうにやってみた。
# -f で相対パス指定 -> ダメ
%  docker build -t image-name:tag-name -f ../another-dir/Dockerfile .
unable to prepare context: The Dockerfile ({.の絶対パス/Dockerfile}) must be within the build context (.)

# -f で絶対パス指定 -> ダメ
%  docker build -t image-name:tag-name -f /xxx/another-dir/Dockerfile .
unable to prepare context: The Dockerfile ({.の絶対パス/Dockerfile}) must be within the build context (.)

# zsh使ってるのでプロセス置換 -> ダメ
% docker build -t image-name:tag-name -f <(cat Dockerfile) .
unable to prepare context: unable to evaluate symlinks in Dockerfile path: lstat /proc/29179/fd/pipe:[1290842]: no such file or directory   
{う~む。かなり、頑固だなあ。}
dockerは、どうしてもcontext dirにDockerfileの実体がないと動いてくれないらしい。
しかたないので、簡単な build.shを↓のように書いてみた。
#!/bin/bash

if [ $# -ne 1 ]; then
  echo "usage: build.sh tag_name" 1>&2
  exit 1
fi

rsync symlinkしてたDir/Dockerfile Dockerfile
docker build -t image-name:$1 .
動いたよ。

しかし、ここでもしやと思い、build context dirの外を向いているsymlinkをDockerfileのCOPYで、コピーしようとしてみたら、こんなエラーが
lstat symlinkの名前: no such file or directory
{docker buildは、徹底的にsymlinkが嫌いなようだ。今回は敗北感が大きいな・・・}
とにかく、dockerさんは、dockerfileやCOPYしたいファイルの「実体」があるところでbuildしてくださいといいたいのだろう。

そして、dockerfileの変更はsymlinkで同期させるのでなく、build可能な、contextディレクトリをgit等で管理するのが作法だぞということなのかもしれない。

仕方ない、従いますよdockerさん。ここまで、読んでくれた方、もしいらしたらごめんなさい。dockerfileをsymlinkにするのはやめたほうがいいと思います。

2016年6月10日金曜日

Ubuntu14のGUIをリモートコントロールしたいならX2Goだ!

自分は、最近Ubuntuを気に入って使ってるんだけど、リモートでGUIを動かす機会が多い。

いままで、vncserverかNoMachineを使ってたんだけど、最近見つけたX2Goがよくて、激しくおすすめしたいので、記事にしてみた。

普通、第一選択肢になることが多いのがvncserverを立てての接続なんだけど、これだと結構、日本語入力でハマることが多い。
自分の場合、Ubuntuが何台かあって(違う人がセッティングしてたりする)、自分が作業するときは、いつもこの設定をするんだけど、なぜか毎回違うところでハマる。

うまくいってるマシンから ~/.vnc/xstartup をコピッて来ても、他のマシンでは動かなかったり(足りないmoduleが無いわけじゃなくても動かん)、fcitxを使ってると日本語入力できないことが多かったり(動くマシンもある)。さっぱりわからん。

NoMachineの場合、日本語入力の問題は出ないのだけど、無料版だとディスプレイに表示されている画面のコントロールになってしまい、やってることが丸見えなだけでなく、そこに誰かいたら簡単に乗っ取られてしまうので危なっかしい。

で、今回もvncserverの設定をしてて、うまくいかなかくてキレてたところたまたまみつけたのが、X2Go
親切な解説はココ。とくに設定しなくても、あっさり日本語入力できて感激。

UbuntuのリモートGUI操作で、日本語入力に困ってる方は一度使ってみるといいと思います。

xfce4のターミナルでtabキーでコマンド補完が効かない時の対処

xfce4を使ったら、ターミナル内でコマンド補完が効かなくて困った。
shift+tabやctrl+iでは、コマンド補完が効く状態。

対処方法は、
https://www.starnet.com/xwin32kb/tab-key-not-working-when-using-xfce-desktop/にあったんだけど、日本語化してる場合の設定箇所をメモ。

アプリケーションメニュー -> 設定 -> ウィンドウマネージャー -> keyboardタブ -> 同じアプリケーションのウィンドウの切り替え 設定をクリア
で、tab補完復活しました。

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です。ありがとうございました。