読者です 読者をやめる 読者になる 読者になる

Pseudo Engineer

ソフトウェアの話とか書いてくよ

社内公募制度における上司の拒否権

ソニー 失われた20年」に社内募集では上司に拒否権があると言及されていました。
この拒否権、思うところもあるので少し書いておきます。

制度内容

社内公募制度とは、社内人材募集に応募し、異動先との面接で合格すれば異動ができます。一般に、現在の職場の上司に拒否権はなく、応募の秘密も守られるとされています。私の会社にも上述のルールで制度が存在します。

職場の上司には拒否権がある

私の会社でも表向きは上司に拒否権はないとされていますが、実際はあります。
そして拒否権がある以上、実際に行使されることはあります。

拒否権の行使は分かる

実際にあった話です。
異動希望者が面接で手応えがあったにも関わらず不合格の通知を受けました。せめて落ちた理由を知りたくて異動先に直接問い合わせたところ、「合格通知は出したはずですが」という回答をもらいました。拒否権が行使されたわけです。その後、上司との人間関係が急速に悪化したことは言うまでもありません。

もし落ちたら直接問い合わせてみるのも手ですが、人間、知らないほうがいいこともあります。

またこんな話もあります。
部下の公募合格を知った上司は、部下に拒否権を明かしたうえで現在の職場に留まってもらえないか話し合いを持ちかけました。結局、部下は異動することになりましたが、話し合いで解決しようとする姿勢は間違ってはいないと思います。

拒否権の無言の行使は諸刃の剣ですね。

それでも社内公募制度には意義がある

職場が自分に合っていない人や、新しい挑戦をしたい人には、十分意義のある制度だと思います。大事なのは自分の意思と覚悟なのですから。

【書評】ソニー 失われた20年

ソニー 失われた20年 内側から見た無能と希望

ソニー 失われた20年 内側から見た無能と希望

ソニーの栄枯盛衰を中から見た筆者が、凋落のはじまった出井体制以降を様々な視点から批評するという内容です。愚痴・悪口のような文章にもソニーを思う気持ちがあり、筆者のソニーへの憎愛が感じられる。社員1人の主観ではありますが、メーカーの凋落を知るにはいい本です。
私もメーカーの端くれの人間、業界全体が斜陽にいるなかいくつか共感する部分もあります。

組織の中心は人である

ソニーの凋落はトップの愚策が招いたと断言されています。確かにきっかけはそこでしょう。しかしそれを増幅させたのは他ならぬソニーの社員、”人”です。
私がこれまで会社で出会った管理職の多くは制度・ルール・文化を以って人をマネージメントしようとしていました。秩序は必要です。しかし本人の主体性を窄めてはならない。ここのバランス感覚がどうにも制度・ルール・文化に偏っているのです。組織の中心は人であることを常に考える必要があります。制度・ルール・文化は人が変化・創造するものです。先にあるものではありません。

技術の軽視

これまた多くの管理職は、押しも並べて開発の現場に疎い。我々はマネージメントする立場だ、君も早くマネージメントを覚えたまえという態度。外注をコントロールできるのは外注より技術に詳しい人だけです。でないと、納品物の”質”をどうやって担保するのでしょうか。今のところ、ぎりぎり子会社がそれを担っています。しかし子会社も外注を使って自分たちで手を動かさないわけですから、技術の空洞化は止まらないのです。
私はまだ開発の現場に明るいほうです。具体的な”質”の問題を指摘すると、最近はなかなかそういう人がいなくてとても助かるよ、と言ったりします。助かるよとか言う前に自ら学んでなんとかしようと思わなかったのでしょうか。または自分よりできる後進の育成をしてこなかったのでしょうか。問題から目を背けているか、そもそも問題と思っていないのか、私にはわかりません。

人材育成の不備

いつだって学びは自分自身でやるものです。主体性を以ってPDCAをまわしながら成長するべきなのに、高額な一回こっきりの研修で済まそうとしています。伸びる人は継続して努力する人です。努力の方法や方向はなんであれ、会社はそれを応援しなければ、どちらも成長しません。
管理職は”自分を超える”後進を育成することを考えてください。自分と同じレベルがゴールでは進歩がありません。保身のために育成を怠ると、会社が凋落し、自身の給料を下げることになります。

政治の重要性

日本のメーカーがコンシューマ向け事業から撤退し、インフラなどのB2Bビジネスを中心に据えています。企業向けの大きな仕事や、とりわけ公的市場となると”政治”がものをいいます。技術だけでは生き残れない。ここは私がまだまだ未熟なところです。

諦めない

この世にユートピアはありません。あるのは常に問題と向き合う自分です。諦めるにはまだ早い。

Xcode や iOS SDKをアップデート後にやること

XcodeiOS 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かPythonJava、たまにHaskellScalaは皆無、残念だ。
J言語の実装例は変態すぎてついていけません。

projecteuler.net

RPiClock

Raspberry Piで動く目覚まし時計

3年位前に構想したけど、長いことほったらかしていたRaspberry Pi目覚まし時計。とりあえず使えるところまで来たので公開。
github.com

特徴は休日/祝日鳴らない設定ができるのと(これ便利なので自分的に重要)、目覚ましの音にiTunes Storeの試聴音源に流すこと(自分で自分にAdvertisement!)。アラーム設定はブラウザでできる。

まだやり残してるのは時計表示の作成。IV-9っていうフィラメントで光る7セグを使うつもりだけど、まだ回路図を引いただけで部品も買ってない。そこはこれからやるんで、できたら公開します。あと目覚まし止める方法もないのでスイッチ作らねば。

アラーム設定画面。
f:id:jetBeaver:20160127213644p:plain


セリアで買った木箱2つで隠す。
f:id:jetBeaver:20160127212755j:plain

開けると放り込んであるだけw
f:id:jetBeaver:20160127212810j:plain

なんで作ったの?

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の公約どおりswiftOSSで公開されました。
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