大阪市営バス 信託失敗…債権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 はバスにデバイスを追加すると、ドライバの 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 の組み合わせが変わる問題)にエレガントに対応しており、同じような処理をするドライバを何度も書かずに済みます。素晴らしいです。
やっとボンヤリとわかってきた程度で理解が怪しいですが、次回以降、解説を書いてみようと思います。
管理者: Katsuhiro Suzuki(katsuhiro( a t )katsuster.net)
This is Simple Diary 1.0
Copyright(C) Katsuhiro Suzuki 2006-2021.
Powered by PHP 5.2.17.
using GD bundled (2.0.34 compatible)(png support.)