コグノスケ


2016年 2月 3日

仕事の価値

大阪市営バス 信託失敗…債権674億円放棄し民営化へ - 毎日新聞を読んで。

記事に「交通局の運転手に比べて大阪シティバスは人件費が 1人当たり 300万円程度安く…」とあって驚きました。人件費の半分 = 従業員年収とざっくり考えれば 150万円くらいでしょう。

つまり、仕事の内容は同じだけど、仕事の価値は 150万円低く評価されたわけですから、なかなかショッキングです。

自分の仕事は、自分の年収に釣り合っているだろうか…。

メモ: 技術系の話は Facebook から転記しておくことにした。

編集者: すずき(更新: 2016年 2月 4日 01:44)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2016年 2月 4日

サクラエディタの最新版で困ったこと

サクラエディタ 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 行目付近に、下記のような処理があり、

CEditView::SmartIndent_CPP() メソッド

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 をコメントアウトしたところ、ご機嫌に動いています。

これ、みんな困ってないのかな?俺だけ??

編集者: すずき(更新: 2016年 2月 4日 01:45)

コメント一覧

  • 通りすがり 
    スマートインデントの不具合でifやwhile内に書く括弧"("でも落ちるケースが出ていたのですが、8/13に出た2.3.1.0で直りました。コードを見ると色々修正されているようです。 
    (2016年08月26日 16:43:01)
  • すずき 
    >通りすがりさん
    ご教授いただいてありがとうございます。
    早速使って見ます。 
    (2016年08月31日 10:36:27)
open/close この記事にコメントする



2016年 2月 13日

あえて Cookie をブロックしてみる

SNS などの Web サービスでは不可欠の存在となった Cookie ですが、Cookie をブロックしても正常にサービスを使えるんだろうか?と気になったので、やってみました。

ブラウザは SeaMonkey です。メニューの Edit - Preferences の画面から、左のツリービューを Privacy & Security - Cookies と辿り、Block cookies オプションを選んで OK を押します。この設定によって、明示的に許可されたサイト以外は Cookie をブロックします。

Cookie を全てブロックすると SNS などのログインは一切出来なくなります。この状態から、どのドメインの Cookie を受け入れればサービスが使えるようになるか?を見てみたいと思います。

Twitter と Facebook

一番シンプルなパターンです。

Twitter であればドメイン twitter.com の、Facebook であればドメイン www.facebook.com の Cookie を許可すればサービスが使えます。

やり方は、メニューから Tools - Cookie Manager - Allow Cookies from This Website(以降、Cookie 許可と呼ぶ)を選んで、リロードです。

mixi

ちょっとハマりましたが、これもシンプルです。

ドメイン mixi.jp の Cookie を許可するだけだと Redirect Loop というエラーが出てログインできませんので、併せて Session Cookie を許可すればサービスが使えます。

やり方は、メニューから Tools - Cookie Manager - Allow Session Cookies from This Website(以降、Session Cookie 許可と呼ぶ)を選んでリロードです。

Amazon, GitHub

これらは mixi と同様です。

Amazon はドメイン www.amazon.co.jp の、GitHub は github.com の Cookie と Session Cookie を許可すればサービスが使えます。

ニコニコ動画と仲間達

ちょっと変わっていて、サービスごとに細かく制御できます。

ニコニコ動画はサービスごとに、

  • ログイン: account.nicovideo.jp
  • 動画: www.nicovideo.jp
  • 静画: seiga.nicovideo.jp
  • 生放送: live.nicovideo.jp

のようにドメインが異なっています。ログイン用にドメイン account.nicovideo.jp の Cookie 許可は必須となりますが、それ以外は許可するも許可しないも自由です。

従って、動画にログインしたい(Cookie を許可)が、静画にはログインしたくない(Cookie をブロック)など、器用な制御ができます。そんなことして何か意味があるのかまではわかりませんが…。

SlideShare

え?Cookie 使ってたの?という意外なサービスです。

Cookie をブロックすると、プレゼンテーションの表紙だけは見ることが出来ますが、他のスライドが表示できません。ドメイン www.slideshare.net の Cookie を許可すると、表紙以外のスライドも表示できるようになります。

TSUTAYA DISCAS

単純な設定では使えませんでした。

まず Cookie をブロックした状態でアクセスすると、エラー TA-20-1319「認証のための Cookie が有効になっておりません。」が出て、ドメイン ssl.tsite.jp の Cookie を許可せよと言われます。

勧めに従って許可しても、ひたすらエラー TA-90-1001「申し訳ございません。時間をおいて再度アクセスしてください。」が出るだけで、どうしたら良いのかわかりません。困ったね…。

所感

TSUTAYA DISCAS は良くわからず残念でしたが、大抵のサービスは Cookie をブロックしちゃっても結構使えるんだなー、と感心しました。メジャーな Web サービスって、良く出来ていますね。

SlideShare のような意外な発見があって面白いので、もうしばらくやってみようと思います。

編集者: すずき(更新: 2016年 2月 15日 00:16)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2016年 2月 14日

Linux デバイスドライバの probe が呼ばれるまで

Linux はバスにデバイスを追加すると、ドライバの probe() というコールバックが呼ばれますが、こいつがどこから呼ばれているのか?のメモです。

結論から言うと「たくさんありすぎて全部は分からない」ですが、後で調べるときの取っ掛かりになると信じて、とりあえず 2つの経路をメモしておきます。

ドライバとデバイスの例

来年の自分が「何言ってんのお前??」と言っている気がしたので、例を挙げておきます。platform_bus を例に取りますと、下記のようにデバイスドライバを登録します。

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 という名前になるようです。

platform_bus にデバイスを追加する

#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 ドライバをカーネルモジュールでロードする場合を考えると、ごく普通の状況ですよね。

経路その 1 - デバイス追加がトリガ

ドライバを登録してからデバイスを追加する場合と「思われる」経路の一例です。ちゃんと呼び出しの条件を追っていないので、条件が間違っているかもしれません。

- 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() が内部で呼んでいます。

経路その 2 - ドライバ追加がトリガ

デバイスを追加してからドライバを登録する場合の経路と思われる一例です。ちゃんと呼び出しの条件を追っていないので、条件が間違っているかもしれません。

- __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() を呼び出す系はありそうですが、今のところ良くわかってません。あの手この手で動かしているんだなー、と思いました。

編集者: すずき(更新: 2016年 2月 19日 01:12)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2016年 2月 19日

Linux platform bus デバイスドライバ

適当に書いたままにしていた Linux platform bus デバイスドライバのサンプルコード(2016年 2月 14日の日記参照)をちゃんと書き直しました。

ついでに Makefile も足してビルドできる状態にして GitHub に置きました。後で自分で使うときに便利なはず。

編集者: すずき(更新: 2016年 2月 19日 23:09)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2016年 2月 28日

ALSA SoC audio card device driver のサンプルを書いた

目次: ALSA - まとめリンク

以前から気になっていたものの、調べずに放置していた ALSA の SoC Audio についてサンプルを書いてみました。ついでに GitHub に置きました。

何もしない骨組みのドライバを書いただけですが、かなり複雑でした。コードを見ただけで「ああ、そういうことね!」って理解できる人が居たら尊敬します。師匠と崇めたいです。

取っ掛かりは難しい分、恩恵も大きいです。SoC にありがちだった問題(ボードによって SoC と DAC の組み合わせが変わる問題)にエレガントに対応しており、同じような処理をするドライバを何度も書かずに済みます。素晴らしいです。

やっとボンヤリとわかってきた程度で理解が怪しいですが、次回以降、解説を書いてみようと思います。

編集者: すずき(更新: 2022年 5月 22日 15:21)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



こんてんつ

open/close wiki
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 2019年
open/close 2020年
open/close 2021年
open/close 2022年
open/close 2023年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報