大阪市営バス 信託失敗…債権674億円放棄し民営化へ - 毎日新聞を読んで。
記事に「交通局の運転手に比べて大阪シティバスは人件費が1人当たり300万円程度安く…」とあって驚きました。人件費の半分 = 従業員年収とざっくり考えれば150万円くらいでしょう。
つまり、仕事の内容は同じだけど、仕事の価値は150万円低く評価されたわけですから、なかなかショッキングです。
自分の仕事は、自分の年収に釣り合っているだろうか…。
メモ: 技術系の話はFacebookから転記しておくことにした。
サクラエディタ2.3.0がバグっていて、C/C++ が書きづらく困っています……。
適当にファイルを作って、ファイル名をa.c(C/C++ スタイルのスマートインデントが有効になるなら何でも良い)にして開いて、ダブルスラッシュの前に何か文字を入れて改行すると100%Runtime Errorが発生してエディタがクラッシュします。
例を挙げると、
a//
と打ちこんで、行頭でEnterを押して改行すると100% 落ちます。
ただし、ダブルスラッシュが行頭の場合だけは落ちません。またサクラエディタ2.0.4.0では発生しません。
コードを見たらsakura_core/types/CType_Cpp.cppのCEditView::SmartIndent_CPP() メソッド1427行目付近に、下記のような処理があり、
for( int n = 0; n < nLineLen2; n++ ){
switch( nMode ){
case 0:
if( m_pTypeData->m_bIndentCppStringIgnore && L'"' == pLine2[n] ){
...
}else if( m_pTypeData->m_bIndentCppCommentIgnore && n + 1 < nLineLen2 && '/' == pLine2[n] && '/' == pLine2[n+1] ){
SCommentBlock block = { n, nLineLen2 - 1 };
arrCommentBlock.push_back(block);
n = k; ★★★この行がnを0に戻してしまう ★★★
}
break;
...
常にk = 0なのとn = kという行のせいで、nがずっと0に戻されるため、外側のfor文がいつまでも終わらず、arrCommentBlockというベクタのような何かに、無限に要素を追加し続けた挙げ句、死んでしまうようです。
この処理でnを巻き戻す意味も、変数kの意味もイマイチわかりませんが、ざっくりn = kをコメントアウトしたところ、ご機嫌に動いています。
これ、みんな困ってないのかな?俺だけ??
SNSなどのWebサービスでは不可欠の存在となったCookieですが、Cookieをブロックしても正常にサービスを使えるんだろうか?と気になったので、やってみました。
ブラウザはSeaMonkeyです。メニューのEdit - Preferencesの画面から、左のツリービューをPrivacy & Security - Cookiesと辿り、Block cookiesオプションを選んでOKを押します。この設定によって、明示的に許可されたサイト以外はCookieをブロックします。
Cookieを全てブロックするとSNSなどのログインは一切出来なくなります。この状態から、どのドメインのCookieを受け入れればサービスが使えるようになるか?を見てみたいと思います。
一番シンプルなパターンです。
Twitterであればドメインtwitter.comの、Facebookであればドメインwww.facebook.comのCookieを許可すればサービスが使えます。
やり方は、メニューからTools - Cookie Manager - Allow Cookies from This Website(以降、Cookie許可と呼ぶ)を選んで、リロードです。
ちょっとハマりましたが、これもシンプルです。
ドメインmixi.jpのCookieを許可するだけだとRedirect Loopというエラーが出てログインできませんので、併せてSession Cookieを許可すればサービスが使えます。
やり方は、メニューからTools - Cookie Manager - Allow Session Cookies from This Website(以降、Session Cookie許可と呼ぶ)を選んでリロードです。
これらはmixiと同様です。
Amazonはドメインwww.amazon.co.jpの、GitHubはgithub.comのCookieとSession Cookieを許可すればサービスが使えます。
ちょっと変わっていて、サービスごとに細かく制御できます。
ニコニコ動画はサービスごとに、
のようにドメインが異なっています。ログイン用にドメインaccount.nicovideo.jpのCookie許可は必須となりますが、それ以外は許可するも許可しないも自由です。
従って、動画にログインしたい(Cookieを許可)が、静画にはログインしたくない(Cookieをブロック)など、器用な制御ができます。そんなことして何か意味があるのかまではわかりませんが…。
え?Cookie使ってたの?という意外なサービスです。
Cookieをブロックすると、プレゼンテーションの表紙だけは見ることが出来ますが、他のスライドが表示できません。ドメインwww.slideshare.netのCookieを許可すると、表紙以外のスライドも表示できるようになります。
単純な設定では使えませんでした。
まずCookieをブロックした状態でアクセスすると、エラーTA-20-1319「認証のためのCookieが有効になっておりません。」が出て、ドメインssl.tsite.jpのCookieを許可せよと言われます。
勧めに従って許可しても、ひたすらエラーTA-90-1001「申し訳ございません。時間をおいて再度アクセスしてください。」が出るだけで、どうしたら良いのかわかりません。困ったね…。
TSUTAYA DISCASは良くわからず残念でしたが、大抵のサービスはCookieをブロックしちゃっても結構使えるんだなー、と感心しました。メジャーなWebサービスって、良く出来ていますね。
SlideShareのような意外な発見があって面白いので、もうしばらくやってみようと思います。
目次: Linux
Linuxはバスにデバイスを追加すると、ドライバのprobe() というコールバックが呼ばれますが、こいつがどこから呼ばれているのか?のメモです。
結論から言うと「たくさんありすぎて全部は分からない」ですが、後で調べるときの取っ掛かりになると信じて、とりあえず2つの経路をメモしておきます。
来年の自分が「何言ってんのお前??」と言っている気がしたので、例を挙げておきます。platform_busを例に取りますと、下記のようにデバイスドライバを登録します。
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/platform_device.h>
static int sample_platform_probe(struct platform_device *pdev)
{
return 0;
}
static int sample_platform_remove(struct platform_device *pdev)
{
return 0;
}
static struct platform_driver hogehoge_driver = {
.probe = hogehoge_probe,
.remove = hogehoge_remove,
.driver = {
.name = "hogehoge"
},
};
module_platform_driver(hogehoge_driver);
このドライバに対して、下記のようにデバイスを追加します。platform_busの場合、デバイス名は "ドライバ名.ID番号" つまりhogehoge.0という名前になるようです。
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/platform_device.h>
static struct platform_device *pdev = NULL;
static int __init hogehoge_device_init(void)
{
int ret;
pdev = platform_device_alloc("hogehoge", 0);
if (pdev == NULL) {
//error
return -ENOMEM;
}
ret = platform_device_add(pdev);
if (ret != 0) {
//error
platform_device_put(pdev);
return -ENOMEM;
}
return 0;
}
static void __exit hogehoge_device_exit(void)
{
platform_device_del(pdev);
}
module_init(hogehoge_device_init);
module_exit(hogehoge_device_exit);
ドライバの登録とデバイスの追加はどちらが先でも構いません。
ドライバを登録してからデバイスを追加するか、その逆、デバイスを追加してからドライバを登録すれば、デバイスドライバのprobe() コールバック、つまりhogehoge_probe() が呼ばれます。
ぱっと見、デバイス追加が先で、ドライバ登録が後の場合をケアする必然性があるのか?疑問を感じるかもしれませんが、USBデバイスが既に筐体に接続されていて、USBドライバをカーネルモジュールでロードする場合を考えると、ごく普通の状況ですよね。
ドライバを登録してからデバイスを追加する場合と「思われる」経路の一例です。ちゃんと呼び出しの条件を追っていないので、条件が間違っているかもしれません。
- platform_device_add() - device_add() - bus_probe_device() - device_initial_probe() - __device_attach() - __device_attach_driver() - driver_probe_device() - really_probe() - drv->probe()
デバイス追加の際に呼ばれるdevice_add() が契機になるようです。platform_busの場合はplatform_device_add() が内部で呼んでいます。
デバイスを追加してからドライバを登録する場合の経路と思われる一例です。ちゃんと呼び出しの条件を追っていないので、条件が間違っているかもしれません。
- __platform_driver_register() - driver_register() - bus_add_driver() - driver_attach() - __driver_attach() - driver_probe_device() - really_probe() - drv->probe()
ドライバ追加の際に呼ばれるdriver_register() が契機になるようです。先ほどの例だとmodule_platform_driver() マクロが勝手に呼んでくれます。
他にもdevice_attach() 時に __device_attach_async_helper() なる関数をワークキューにぶっ込んで非同期でデバイスを検知する系、bind_store() で手動でデバイスを検知する系がありそうです。
他にもprobe() を呼び出す系はありそうですが、今のところ良くわかってません。あの手この手で動かしているんだなー、と思いました。
適当に書いたままにしていたLinux platform busデバイスドライバのサンプルコード(2016年2月14日の日記参照)をちゃんと書き直しました。
ついでにMakefileも足してビルドできる状態にして GitHub に置きました。後で自分で使うときに便利なはず。
目次: ALSA
以前から気になっていたものの、調べずに放置していたALSAのSoC Audioについてサンプルを書いてみました。ついでに GitHub に置きました。
何もしない骨組みのドライバを書いただけですが、かなり複雑でした。コードを見ただけで「ああ、そういうことね!」って理解できる人が居たら尊敬します。師匠と崇めたいです。
取っ掛かりは難しい分、恩恵も大きいです。SoCにありがちだった問題(ボードによってSoCとDACの組み合わせが変わる問題)にエレガントに対応しており、同じような処理をするドライバを何度も書かずに済みます。素晴らしいです。
やっとボンヤリとわかってきた程度で理解が怪しいですが、次回以降、解説を書いてみようと思います。