社内公募制度における上司の拒否権
「ソニー 失われた20年」に社内募集では上司に拒否権があると言及されていました。
この拒否権、思うところもあるので少し書いておきます。
制度内容
社内公募制度とは、社内人材募集に応募し、異動先との面接で合格すれば異動ができます。一般に、現在の職場の上司に拒否権はなく、応募の秘密も守られるとされています。私の会社にも上述のルールで制度が存在します。
職場の上司には拒否権がある
私の会社でも表向きは上司に拒否権はないとされていますが、実際はあります。
そして拒否権がある以上、実際に行使されることはあります。
拒否権の行使は分かる
実際にあった話です。
異動希望者が面接で手応えがあったにも関わらず不合格の通知を受けました。せめて落ちた理由を知りたくて異動先に直接問い合わせたところ、「合格通知は出したはずですが」という回答をもらいました。拒否権が行使されたわけです。その後、上司との人間関係が急速に悪化したことは言うまでもありません。
もし落ちたら直接問い合わせてみるのも手ですが、人間、知らないほうがいいこともあります。
またこんな話もあります。
部下の公募合格を知った上司は、部下に拒否権を明かしたうえで現在の職場に留まってもらえないか話し合いを持ちかけました。結局、部下は異動することになりましたが、話し合いで解決しようとする姿勢は間違ってはいないと思います。
拒否権の無言の行使は諸刃の剣ですね。
それでも社内公募制度には意義がある
職場が自分に合っていない人や、新しい挑戦をしたい人には、十分意義のある制度だと思います。大事なのは自分の意思と覚悟なのですから。
【書評】ソニー 失われた20年
- 作者: 原田節雄
- 出版社/メーカー: さくら舎
- 発売日: 2012/09/04
- メディア: 単行本(ソフトカバー)
- 購入: 2人 クリック: 28回
- この商品を含むブログ (1件) を見る
ソニーの栄枯盛衰を中から見た筆者が、凋落のはじまった出井体制以降を様々な視点から批評するという内容です。愚痴・悪口のような文章にもソニーを思う気持ちがあり、筆者のソニーへの憎愛が感じられる。社員1人の主観ではありますが、メーカーの凋落を知るにはいい本です。
私もメーカーの端くれの人間、業界全体が斜陽にいるなかいくつか共感する部分もあります。
組織の中心は人である
ソニーの凋落はトップの愚策が招いたと断言されています。確かにきっかけはそこでしょう。しかしそれを増幅させたのは他ならぬソニーの社員、”人”です。
私がこれまで会社で出会った管理職の多くは制度・ルール・文化を以って人をマネージメントしようとしていました。秩序は必要です。しかし本人の主体性を窄めてはならない。ここのバランス感覚がどうにも制度・ルール・文化に偏っているのです。組織の中心は人であることを常に考える必要があります。制度・ルール・文化は人が変化・創造するものです。先にあるものではありません。
技術の軽視
これまた多くの管理職は、押しも並べて開発の現場に疎い。我々はマネージメントする立場だ、君も早くマネージメントを覚えたまえという態度。外注をコントロールできるのは外注より技術に詳しい人だけです。でないと、納品物の”質”をどうやって担保するのでしょうか。今のところ、ぎりぎり子会社がそれを担っています。しかし子会社も外注を使って自分たちで手を動かさないわけですから、技術の空洞化は止まらないのです。
私はまだ開発の現場に明るいほうです。具体的な”質”の問題を指摘すると、最近はなかなかそういう人がいなくてとても助かるよ、と言ったりします。助かるよとか言う前に自ら学んでなんとかしようと思わなかったのでしょうか。または自分よりできる後進の育成をしてこなかったのでしょうか。問題から目を背けているか、そもそも問題と思っていないのか、私にはわかりません。
人材育成の不備
いつだって学びは自分自身でやるものです。主体性を以ってPDCAをまわしながら成長するべきなのに、高額な一回こっきりの研修で済まそうとしています。伸びる人は継続して努力する人です。努力の方法や方向はなんであれ、会社はそれを応援しなければ、どちらも成長しません。
管理職は”自分を超える”後進を育成することを考えてください。自分と同じレベルがゴールでは進歩がありません。保身のために育成を怠ると、会社が凋落し、自身の給料を下げることになります。
政治の重要性
日本のメーカーがコンシューマ向け事業から撤退し、インフラなどのB2Bビジネスを中心に据えています。企業向けの大きな仕事や、とりわけ公的市場となると”政治”がものをいいます。技術だけでは生き残れない。ここは私がまだまだ未熟なところです。
諦めない
この世にユートピアはありません。あるのは常に問題と向き合う自分です。諦めるにはまだ早い。
Xcode や iOS SDKをアップデート後にやること
Xcode や iOS SDKをアップデートすると、既存のプロジェクトのビルドでエラーが出ることがある。
エラーの例)
redefinition of module 'Compression'
redefinition of module 'Darwin'
could not build Objective-C module 'CoreFoundation'
これはキャッシュやビルドしたオブジェクトが残っていることが原因。
キャッシュ削除
$ rm -rf ~/Library/Developer/Xcode/DerivedData/* $ rm -rf "$(getconf DARWIN_USER_CACHE_DIR)/org.llvm.clang/ModuleCache" $ rm -rf ~/Library/Caches/com.apple.dt.Xcode
Clean
Xcodeでプロジェクト開いたら、Shift + Command + K でCleanする。
Project Euler
Project Eulerおもしろいですね! はまっちゃって最近ずっとやってます。
言語はScalaで。去年勉強したHaskellの知見をScalaに取り入れてみるって目的もあります。
Project Eulerの各設問の掲示板には各々実装例載せてたりするんですが、だいたいCかPythonかJava、たまにHaskell。Scalaは皆無、残念だ。
J言語の実装例は変態すぎてついていけません。
RPiClock
Raspberry Piで動く目覚まし時計
3年位前に構想したけど、長いことほったらかしていたRaspberry Pi目覚まし時計。とりあえず使えるところまで来たので公開。
github.com
特徴は休日/祝日鳴らない設定ができるのと(これ便利なので自分的に重要)、目覚ましの音にiTunes Storeの試聴音源に流すこと(自分で自分にAdvertisement!)。アラーム設定はブラウザでできる。
まだやり残してるのは時計表示の作成。IV-9っていうフィラメントで光る7セグを使うつもりだけど、まだ回路図を引いただけで部品も買ってない。そこはこれからやるんで、できたら公開します。あと目覚まし止める方法もないのでスイッチ作らねば。
アラーム設定画面。
セリアで買った木箱2つで隠す。
開けると放り込んであるだけw
なんで作ったの?
iPhoneに換えてからも前に使っていたガラケーを目覚まし時計としてずっと使ってきた。なぜか。それは休日/祝日鳴らない設定が便利なのと、iPhoneの目覚まし時計をいくつか試したがどれもこれも微妙だったから(3,4年前時点での話ね。今は知らない。)。ガラケーもそのうち壊れるだろうし、通信もできないので時刻もずれる。そのうち祝日の法律が変わり休みなのにアラームが鳴って、朝から不機嫌になりかねない。
最初はiPhoneアプリを作ろうかとiOS SDKとか調べてたら、いろいろ制約があって難しいらしい。その後、ふと手に入れたRaspberry Piで作ろうと思ったものの、電子回路とかワカンネー。とりあえず電子回路のお勉強してたら横道に逸れてPIC触ったりして、そのうちやる気がなくなってずっとほったらかしていたのだった。
ガラケーどうなったかって? 今もアラーム鳴り続けてますよ!(壊れる気配なし)
swift 2.2 in docker on Linux
今日もDockerです。最近はまってます。
今回はdockerでswift 2.2の環境をLinux上で整えます。みんなもきっとserver-side swiftとかしたいよね!
はじめに
Appleの公約どおりswiftがOSSで公開されました。
swift.org
Linuxでも動かせますがUbuntuを想定しているようです。Dockerであればディストリビューションに依らず開発・実行もできますし、swiftのバージョンごとに環境を作っておくこともできます。便利ですね。
前準備
Dockerfile
そのまま貼っておきます。大した内容ではありません。
なお、一部ファイルのread権限が不足してるためchmod -R +r /usr/lib/swiftを実行してます。
Dockerfile
FROM ubuntu:15.10 LABEL Description="swift compile environment" RUN apt-get update && apt-get install -y wget clang libicu-dev libpython2.7-dev libxml2 ENV SWIFT_VERSION swift-2.2-SNAPSHOT-2015-12-22-a ENV SWIFT_PLATFORM ${SWIFT_VERSION}-ubuntu15.10 ENV SIWFT_URL https://swift.org/builds/ubuntu1510/${SWIFT_VERSION}/${SWIFT_PLATFORM}.tar.gz RUN wget -q ${SIWFT_URL} ${SIWFT_URL}.sig RUN gpg --keyserver hkp://pool.sks-keyservers.net \ --recv-keys \ '7463 A81A 4B2E EA1B 551F FBCF D441 C977 412B 37AD' \ '1BE1 E29A 084C B305 F397 D62A 9F59 7F4D 21A5 6D5F' RUN gpg --verify ${SWIFT_PLATFORM}.tar.gz.sig && tar xzf ${SWIFT_PLATFORM}.tar.gz RUN cp -pr ${SWIFT_PLATFORM}/* / && rm -rf ${SWIFT_PLATFORM}* && \ chmod -R +r /usr/lib/swift RUN mkdir /project WORKDIR /project
swift実行ヘルパー
dockerコンテナ上で実行できるけど、毎回docker runするとstoppedコンテナで溢れかえるし、docker execもなんだか煩わしい。
そこで、ヘルパースクリプトを用意しました。
追記:docker run --rmのことを忘れていた。。。まぁいいや。
コンテナがない場合は作成してから、与えられた引数でdocker execを起動してくれます。もしコンテナがstopしていてもstartしてくれますので、要はコンテナの状態管理は気にしなくていいです。
container-exec
#!/bin/sh CID_FILE=.cid function container_not_exist() { if docker inspect `cat $CID_FILE` > /dev/null; then return 1 fi return 0 } function docker_run() { docker run -d -ti -u=`id -u`:`id -g` --cidfile=\"$CID_FILE\" -v `pwd`:/project swift:2.2 bash } if [ $# -lt 1 ]; then echo Usage: $0 command ... exit 0 fi if [ ! -e $CID_FILE ]; then docker_run elif container_not_exist; then rm -f $CID_FILE docker_run fi CID=`cat $CID_FILE` RUNNING=`docker inspect --format="{{ .State.Running }}" $CID` if [ $RUNNING = 'false' ]; then docker restart $CID fi docker exec -ti $CID $@
Dockerイメージ作成
上述のDockerfileとcontainer-execを用意しておく。
$ ls Dockerfile container-exec* $ docker build -t swift:2.2 ./ ...(略 $ docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE swift 2.2 b44d46edd478 3 hours ago 1.337 GB ubuntu 15.10 2804d41e7f10 2 weeks ago 133.5 MB
REPL
まずはREPLから起動してみましょう。
$ ./container-exec swift Welcome to Swift version 2.2-dev (LLVM 3ebdbb2c7e, Clang f66c5bb67b, Swift 17fe37d715). Type :help for assistance. 1> 1+1 $R0: Int = 2 2> var foo = "foo" foo: String = "foo" 3> var bar = "bar" bar: String = "bar" 4> foo + bar $R1: String = "foobar" 5> import Foundation 6> import Glibc 7> srandom(UInt32(NSDate().timeIntervalSince1970)) 8> random() $R2: Int = 684624134 9> random() $R3: Int = 379490731 10> random() $R4: Int = 522347634 11>
実行ファイル作成
実行ファイルをビルドしてみましょう。
$ mkdir sources $ cat <<EOF > sources/main.swift import Foundation print("Hello, world!") EOF $ cat <<EOF > Package.swift import PackageDescription let package = Package( name: "HelloWorld" ) EOF $ ./container-exec swift build Compiling Swift Module 'HelloWorld' (1 sources) Linking Executable: .build/debug/HelloWorld $ ./container-exec .build/debug/HelloWorld Hello, world! $
以上!!!
Pulseaudio in docker
CentOS7 上でdockerを使ってpulseaudioを起動してみた。
環境
Centos7 でdockerとdocker-composeをインストールしておく。alsa関連もインストールされてることを確認。
$ yum list installed | grep alsa alsa-firmware.noarch 1.0.28-2.el7 @anaconda alsa-lib.x86_64 1.0.28-2.el7 @anaconda alsa-plugins-pulseaudio.x86_64 1.0.27-3.el7 @base alsa-tools-firmware.x86_64 1.0.28-2.el7 @base alsa-utils.x86_64 1.0.28-4.el7 @base
今回の環境のサウンドカードはこちら。
$ cat /proc/asound/cards 0 [HDMI ]: HDA-Intel - HDA Intel HDMI HDA Intel HDMI at 0xf7234000 irq 54 1 [PCH ]: HDA-Intel - HDA Intel PCH HDA Intel PCH at 0xf7230000 irq 53
PCHで音がなることを確認。
# cat <<EOF > ~/.asoundrc pcm.!default { type hw card 1 } ctl.!default { type hw card 1 } EOF # play sample.wav
docker
とくに解説はなし。
$ mkdir -p docker/pulseaudio $ cd docker $ $ cat <<EOF > pulseaudio/Dockerfile FROM centos:7 RUN yum -y install \ alsa-utils \ pulseaudio \ pulseaudio-libs \ pulseaudio-utils RUN useradd pulseaudio RUN usermod -aG audio,pulse,pulse-access pulseaudio USER pulseaudio ENTRYPOINT [ "pulseaudio" ] CMD [ "--log-level=4", "--log-target=stderr", "-v" ] EOF $ $ cat <<EOF > pulseaudio/asound.conf pcm.!default { type hw card 1 } ctl.!default { type hw card 1 } EOF $ $ cat <<EOF > pulseaudio/clinet.conf autospawn = no daemon-binary = /bin/true EOF $ $ cat <<EOF > pulseaudio/daemon.conf exit-idle-time = -1 flat-volumes = yes EOF $ $ cat <<EOF > pulseaudio/default.pa # Replace the *entire* content of this file with these few lines and # read the comments .fail # Set tsched=0 here if you experience glitchy playback. This will # revert back to interrupt-based scheduling and should fix it. # # Replace the device= part if you want pulse to use a specific device # such as "dmix" and "dsnoop" so it doesn't lock an hw: device. # INPUT/RECORD load-module module-alsa-source device="default" tsched=1 # OUTPUT/PLAYBACK load-module module-alsa-sink device="default" tsched=1 # Accept clients -- very important load-module module-native-protocol-unix load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1;192.168.0.0/24;10.0.0.0/8;172.0.0.0/8 auth-anonymous=1 .nofail .ifexists module-x11-publish.so # Publish to X11 so the clients know how to connect to Pulse. Will # clear itself on unload. load-module module-x11-publish .endif EOF $ $ cat <<EOF > docker-compose.yml pulseaudio: build: pulseaudio container_name: pulseaudio command: pulseaudio -vvv --log-target=stderr volumes: - /etc/localtime:/etc/localtime:ro - /var/run/dbus:/var/run/dbus - /etc/machine-id:/etc/machine-id:ro - ./pulseaudio/asound.conf:/etc/asound.conf - ./pulseaudio/default.pa:/etc/pulse/default.pa - ./pulseaudio/client.conf:/etc/pulse/client.conf - ./pulseaudio/daemon.conf:/etc/pulse/daemon.conf ports: - "4713:4713" devices: - /dev/snd:/dev/snd environment: - HOME:/home/pulseaudio working_dir: /home/pulseaudio EOF
docker起動
$ docker-compose up -d pulseaudio
鳴らす
pulseaudio経由で音がなることを確認。
# su - # yum install pulseaudio-utils # exit $ paplay -v -s localhost sample.wav