Hatena::ブログ(Diary)

はてなの鴨澤 Twitter

2016-03-14

netatalk3 on FreeBSD 10.2-RELEASE-p13

備忘録

現状:

繋がった。旧サーバーから引き継いだTime Machineバックアップにちゃんと繋がったので一安心。

やったこと:

# /usr/local/etc/rc.d/dbus start
# /usr/local/etc/rc.d/avahi start
# /usr/local/etc/rc.d/avahi-daemon start
# /usr/local/etc/rc.d/avahi-dnsconfd start
# afpd -d -F /usr/local/etc/afp.conf
  • 接続できなかったのでafpdを止めて以下のコマンドを使って起動したら接続できた。
# /usr/local/etc/rc.d/netatalk start

参考:

FreeBSD10 で netatalk3 を使って TimeMachine サーバにする|FreeBSD|@OMAKASE
全般的に。
  • 「以下のパッケージもインストールする」のdatabases/py-bsddb、databases/py-gdbm、databases/py-sqlite3、x11-toolkits/py-tkinterは入れなくても動いた。
  • /etc/pam.confを作ることになってるけど、/etc/pam.d/があったので、この中にnetatalkというファイルを作り、次のようにした:
auth    required        pam_unix.so     try_first_pass
account required        pam_unix.so     try_first_pass
session required        pam_permit.so


FreeBSD で netatalk 3.1 – 不定期な記録
afp.confのファイルパーミッションとかを。その他もいろいろ示唆的でよかった。

過去:

macから「サーバ”xxxxx”への接続で問題が起きました。 サーバ上に共有が存在しません。共有名を確認してから、やり直してください。」が出る。

サーバ側のログ(x.x.x.xはipアドレス、xxxxはユーザ名):

Mar 14 15:38:31.621074 afpd[38719] {dsi_tcp.c:241} (info:DSI): AFP/TCP session from x.x.x.x:54447
Mar 14 15:38:31.624242 afpd[38482] {main.c:151} (info:AFPDaemon): child[38719]: done
Mar 14 15:38:31.690958 afpd[38720] {dsi_tcp.c:241} (info:DSI): AFP/TCP session from x.x.x.x:54448
Mar 14 15:38:31.692346 afpd[38720] {uams_dhx2_pam.c:329} (info:UAMS): DHX2 login: xxxx
Mar 14 15:38:31.727305 afpd[38720] {uams_dhx2_pam.c:214} (info:UAMS): PAM DHX2: PAM Success
Mar 14 15:38:31.729145 afpd[38720] {uams_dhx2_pam.c:709} (info:UAMS): DHX2: PAM Auth OK!
Mar 14 15:38:31.729222 afpd[38720] {auth.c:236} (note:AFPDaemon): Login by xxxx (AFP3.4)
Mar 14 15:38:35.100606 afpd[38720] {cnid_dbd.c:160} (error:CNID): getfd: connect CNID server localhost: Connection refused
Mar 14 15:38:35.101066 afpd[38720] {cnid_dbd.c:160} (error:CNID): getfd: connect CNID server localhost: Connection refused
Mar 14 15:38:35.101547 afpd[38720] {cnid_dbd.c:176} (error:CNID): tsock_getfd: no suitable network config from CNID server (localhost:4700): Unknown error: 32767
Mar 14 15:38:35.102622 afpd[38720] {cnid_dbd.c:152} (error:CNID): getfd: getsockopt says: Connection refused
Mar 14 15:38:35.102895 afpd[38720] {cnid_dbd.c:160} (error:CNID): getfd: connect CNID server localhost: Connection refused
Mar 14 15:38:35.103026 afpd[38720] {cnid_dbd.c:176} (error:CNID): tsock_getfd: no suitable network config from CNID server (localhost:4700): Connection refused
Mar 14 15:38:35.103128 afpd[38720] {cnid_dbd.c:407} (error:CNID): transmit: connection refused (volume xxxx's home)
Mar 14 15:38:35.103337 afpd[38720] {volume.c:857} (error:AFPDaemon): afp_openvol(/home/xxxx): Fatal error: Unable to get stamp value from CNID backend
Mar 14 15:39:40.631764 afpd[38720] {auth.c:835} (note:AFPDaemon): AFP logout by xxxx
Mar 14 15:39:40.632498 afpd[38720] {dsi_stream.c:504} (error:DSI): dsi_stream_read: len:0, unexpected EOF
Mar 14 15:39:40.632658 afpd[38720] {afp_dsi.c:517} (note:AFPDaemon): afp_over_dsi: client logged out, terminating DSI session
Mar 14 15:39:40.633198 afpd[38720] {afp_dsi.c:108} (note:AFPDaemon): AFP statistics: 0.65 KB read, 0.55 KB written
Mar 14 15:39:40.633276 afpd[38720] {dircache.c:615} (info:AFPDaemon): dircache statistics: entries: 0, lookups: 0, hits: 0, misses: 0, added: 0, removed: 0, expunged: 0, evicted: 0
Mar 14 15:39:40.635542 afpd[38482] {main.c:151} (info:AFPDaemon): child[38720]: done

再起動すれば繋がる、という話があるけどまだ再起動してない。

↓(update) afpdの再起動

<未解決>FreeBSD with Netatalk3ではまる - FreeBSDいちゃらぶ日記を参考に"afpd -d -F /usr/local/etc/afp.conf" でafpdを起動してたんだけど、こいつを止めて

# /usr/local/etc/rc.d/netatalk start

としたら接続成功。サーバ側ログ:

Mar 14 15:49:14.617975 afpd[38778] {dsi_tcp.c:241} (info:DSI): AFP/TCP session from x.x.x.x:54656
Mar 14 15:49:14.621114 afpd[38771] {main.c:151} (info:AFPDaemon): child[38778]: done
Mar 14 15:49:15.014611 afpd[38779] {dsi_tcp.c:241} (info:DSI): AFP/TCP session from x.x.x.x:54657
Mar 14 15:49:15.016669 afpd[38779] {uams_dhx2_pam.c:329} (info:UAMS): DHX2 login: xxxx
Mar 14 15:49:15.053005 afpd[38779] {uams_dhx2_pam.c:214} (info:UAMS): PAM DHX2: PAM Success
Mar 14 15:49:15.054865 afpd[38779] {uams_dhx2_pam.c:709} (info:UAMS): DHX2: PAM Auth OK!
Mar 14 15:49:15.054942 afpd[38779] {auth.c:236} (note:AFPDaemon): Login by xxxx (AFP3.4)
Mar 14 15:49:15.897419 afpd[38781] {dsi_tcp.c:241} (info:DSI): AFP/TCP session from x.x.x.x:54658
Mar 14 15:49:15.901445 afpd[38771] {main.c:151} (info:AFPDaemon): child[38781]: done
Mar 14 15:49:15.935422 afpd[38782] {dsi_tcp.c:241} (info:DSI): AFP/TCP session from x.x.x.x:54659
Mar 14 15:49:15.939814 afpd[38771] {main.c:151} (info:AFPDaemon): child[38782]: done
Mar 14 15:50:09.714009 afpd[38785] {dsi_tcp.c:241} (info:DSI): AFP/TCP session from x.x.x.x:54662
Mar 14 15:50:09.717024 afpd[38771] {main.c:151} (info:AFPDaemon): child[38785]: done
Mar 14 15:50:09.721605 afpd[38786] {dsi_tcp.c:241} (info:DSI): AFP/TCP session from x.x.x.x:54663
Mar 14 15:50:09.724419 afpd[38771] {main.c:151} (info:AFPDaemon): child[38786]: done

ようやく解決っぽい。

libhoge.laを排除する

9.1Rくらいのシステムから引き継いだpkgなんかがあったりして無駄な苦労が絶えないうちのサーバ

FreeBSD10 で netatalk3 を使って TimeMachine サーバにする

を参考にnetatalk3を入れなおそうとしてたら止まりました。

libtool:   error: cannot find the library '/usr/local/lib/libiconv.la' or unhandled argument '/usr/local/lib/libiconv.la'
Makefile:575: ターゲット 'afpd' のレシピで失敗しました
gmake[6]: *** [afpd] エラー 1
・
・
Stop.
make: stopped in /usr/ports/net/netatalk3
root@heliopora:/usr/ports/net/netatalk3 # 

libiconv.laが無い、またはその引数がおかしくてlibtoolがエラー。エラーメッセージをそのままぐーぐるさまに突っ込んだところ、libiconv.laをコンパイルしなおしてコピればいいという情報もあったけど、freebsd.orgのフォーラムに、"consolekit fails to compile | The FreeBSD Forums "というスレッドがあって、最後のところにこんなコメントが:

/usr/ports/UPDATING:

20140909:
  AFFECTS: users seeing build errors about missing *.la files
  AUTHOR: tijl@FreeBSD.org

  We are in the process of adjusting or, if possible, removing libtool archives
  (*.la files) from all ports because they can otherwise cause overlinking
  between packages.  This is the problem where in the dependency chain A->B->C
  an extra link is added from A to C even if A does not use C directly.  This
  makes some updates to port C expensive because then both A and B have to be
  rebuilt instead of just B.

  This is mostly behind the scenes work that you won't notice.  In fact most
  ports have already been converted.  You may however run into build errors
  about missing *.la files if a port update in the past went wrong and left
  behind *.la files with references to other *.la files that are no longer
  there.  In this case, please run the following command:

  find /usr/local/lib -name '*.la' | xargs grep -l 'libfoo\.la' | xargs pkg which
  (Replace libfoo\.la with the *.la file that is missing.)

  This command will print a list of *.la files that refer to the missing *.la
  file and what package they belong to.  First, where it says "not found in the
  datatbase", remove the *.la file.  After removing all such files, where it
  says "installed by package X", rebuild X.  Eventually the list printed by
  that command will be empty and the build error should be gone.

これでした。.laファイル(libtool archive)は依存解決で損だから廃止だよ、解決法はこちら。という内容です。

手順はこんな感じ:

  1. 問題のlibiconv.laを参照してる他の.laファイルを洗い出す。コマンドは find /usr/local/lib -name '*.la' | xargs grep -l 'libfoo\.la' | xargs pkg which です。(libfoo\.laは問題の.laファイル、今回ならlibiconv.laに置き換える)
  2. 出てきたXX.laについて、"was not found in the database"ならそのまま消す。
  3. 消し終わったら"installed by package X"のXをビルドし直す。
  4. ビルドエラーは消える。

とのことなので、さっそく実行。

find /usr/local/lib -name '*.la' | xargs grep -l 'libiconv\.la' | xargs pkg which
/usr/local/lib/libcdio.la was not found in the database
・
・
/usr/local/lib/librpmbuild.la was installed by package rpm-3.0.6_15
・
・
/usr/local/lib/gtk-2.0/2.10.0/printbackends/libprintbackend-cups.la was not found in the database
/usr/local/lib/gtk-2.0/2.10.0/engines/libpixmap.la was not found in the database

20個くらい見つかった"was not found in..."の.laファイルは全部削除。

"was installed by package..."であるところのrpm-3.0.6_15は最新のportsに無いので再ビルドできず、試しにpkg removeしてみると:

#	pkg remove rpm-3.0.6_15
Checking integrity... done (0 conflicting)
Deinstallation has been requested for the following 1 packages (of 0 packages in the universe):

Installed packages to be REMOVED:
	rpm-3.0.6_15

The operation will free 3 MiB.

Proceed with deinstalling packages? [y/N]: y
[1/1] Deinstalling rpm-3.0.6_15...
[1/1] Deleting files for rpm-3.0.6_15: 100%

依存するパッケージは無いようなので、もうそのまま削除。

なんかさらに問題が爆発したらどうしよう、と思いながらnetatalk3のディレクトリに戻ってmake install cleanしたところ、コンパイルもサクッと通ってあっというまに解決!

なんかすげースッキリしました。

2016-02-23

ブッ壊れたFreeBSDシステムを復旧

freebsd-updateしてカーネルが入れ替わってリブートして、まではちゃんとできてたのに、次にリブートしたらシステムドライブ(USBメモリ)のrootファイルシステムどころかパーティション情報まで消滅してて入れなおしてる。これは作業ログ。

インストール

FreeBSD-10.2-RELEASE-amd64-memstick.img

普通に「全部入り」でインストールしたけど、最小構成で入れてZFS(5台のRAID-Z)が復旧してからソースとかポートを入れればよかった。

  • todo: postfixが入ってないのをどうにかすること。

PPP

pppoeでルータにしてるので、これが復活しないと家のネットから外に出ていけない。

普通につながっただけですばらしい気分になった。

  • todo: ファイヤウオールの設定

WiFiアクセスポイント

いろいろあってちびファイをアクセスポイントにしている。

外に持ちだした時にもそのまま使えるように、Freebsdマシンをdhcpサーバにしてたらしく、WAN側のIPアドレスが取れず繋がらなかった。固定IPアドレスとか設定して解決。当初アドレスの打ち間違いで繋がらず、なんかdhcpの呪いかなにかかと思った。

zfsの復活

zfsはいろいろ賢いから自動で復帰してくれると思ったけどそうはいかなかった。

http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1281671767 を見て

# zpool import

# zpool import tank

で復活。

# zfs list

で見てみたら、マウントポイントが設定されてるやつはそのままマウントされてた。

マウントされてないやつはあらためて

# zfs set mountpoint=/usr/local tank/local

てな具合で設定してマウント。ここらは http://docs.oracle.com/cd/E19253-01/819-6260/6n89n6cii/index.html とかを参考に。

/usr以下などのインストール済みシステムファイルを踏み潰さないようにzfsのマウントポイントをうごかすのは

# zfs set mountpoint=none tank/usr

などとする。

電源管理

CPU

インストール時にpowerdを動かすようにしたら普通に動いた。

ただし sysctl -a dev.cpu.0.freq で800MHzまでしか落ちない。sysctl -a dev.cpu.0.freq_levels で確認しても1300/4406 1100/3550 800/2356の3段階しかなかった。

HDD

サーバを止めてたときにすばらしく静かだった。HDDの音がわりにうるさいことに気づいた。

camcontrol idle ada0 -t 600

camcontrol idle ada1 -t 600

camcontrol idle ada2 -t 600

camcontrol idle ada3 -t 600

camcontrol idle ada4 -t 600

とやったけど、zfsを動かしたら定期的にアクセスするのであんまり意味はないもよう。

  • todo: もうちょっと意味の有りそうな設定をさがす。

その他

死んだUSBメモリはそのまま持ってるけど、どうにかならないかしら。

2015-10-15 Unicodeでは濁点や半濁点を別扱いしてることがあるので結合した このエントリーを含むブックマーク このエントリーのブックマークコメント

PDFをテキストに変換して使うことがときどきあります。

今日処理してたPDF電子書籍の中に、テキストデータは持っているのに、なんかしらんけど検索がうまくかからないことが多い、という変なファイルがありました。ぜんぜん検索できないならまだわかるんだけど、できる検索語とできない検索語があるかんじ。

pdftotextでテキストファイルにしてみたところ、なんとこのテキストファイルが同じように検索できたりできなかったりする。さすがにちょっと不思議。

で、「が」という文字が入ってると検索がかからないのに気がついたので、「が」だけ切り出したテキストファイルを作り、ほかに普通のエディタで「が」だけ入力したテキストファイルを作って、PythonUnicodeコードポイントを見てみました。ga.txtが検索のかからないもの、ga2.txtがかかるものです。



>>> for line in open('ga.txt'):
...  line.decode('utf-8')
... 
u'\u304b\u3099'
>>> for line in open('ga2.txt'):
...  line.decode('utf-8')
... 
u'\u304c'

2文字です。

これ、普通にcat ga2.txtとやると1文字の「が」しか出てこないし、テキストエディタで見ても1文字だし、コピペしようと選択するときも1文字としてしか選べない。でも2文字のコードポイントを持っています。

ちょっと調べてみると、Unicodeには合成文字というシステムがあり、濁点付き、半濁点付きの文字(たとえば「が」)を表現するのに「が」1文字のコードポイントで表現してもいいし(U+304C)、「か(U+304B)」+「濁点(U+3099)」で表現してもいい、ということになっているのです。

検索置換してくれよう。と思ったんですが、普通にキーボードから日本語入力システムで入力できる「濁点」や「半濁点」では、こうした合成文字は入力できません。

それではこの合成文字を生成するのはどうしたらいいでしょう。Pythonではユニコードのコードポイントをそのまま入力してやれば文字列が生成できるので、これを使います。

また、「chr(コードポイントの数値表現)」で文字を生成できます。1文字で表現する濁点つきの文字は元の文字のコード+1、や半濁点つきの文字は+2のコードポイントに存在するので、人間は最初の「かきくけこ…」だけ入力し、あとはできるだけコンピュータまかせで生成してやれば間違いが少ないので、そんな感じで変換辞書を作ってやります。

Pythonのコマンドインタープリタを起動して辞書を初期化してから、先に半濁点付きの部分を作ってやります。

$ python3.4
Python 3.4.2 (v3.4.2:ab2c023a9432, Oct  5 2014, 20:42:22) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 
>>> repdict=dict()
>>> for tap in [(c +'\u309a' , chr(ord(c)+2)) for c in u'はひふへほハヒフヘホ']:
...   repdict.update({tap[0]:tap[1]})
... 
>>> repdict
{'パ': 'パ', 'プ': 'プ', 'ぴ': 'ぴ', 'ポ': 'ポ', 'ピ': 'ピ', 'ぷ': 'ぷ', 'ぽ': 'ぽ', 'ぱ': 'ぱ', 'ぺ': 'ぺ', 'は': '゚', 'ペ': 'ペ'}
>>> 

最初にrepdict=dict()で空の辞書を作ります。

for tap in [(c +'\u309a' , chr(ord(c)+2)) for c in u'はひふへほハヒフヘホ']:

の部分はうしろから読みます。まず

「はひふへほハヒフヘホ」

という文字列を1文字ずつ取ってcに代入します。

このcを使って2種類の文字を生成し、カッコでまとめておきます。

2つの文字とは「c +'\u309a'」と「chr(ord(c)+2)」です。

「c +'\u309a'」はcに入ってる文字そのものと半濁点('\u309a')を足した合成文字です。

「chr(ord(c)+2)」はord(c)でcのコードポイントを数値にして、それに2を足すことで半濁点付きの文字を1文字で表現したものを指定してます。

この処理を各文字についておこなってリスト(でまとめた形式)にしているので、この行の内の部分は

[('ぱ', 'ぱ'), ('ぴ', 'ぴ'), ('ぷ', 'ぷ'), ('ぺ', 'ぺ'), ('ぽ', 'ぽ'), ('パ', 'パ'), ('ピ', 'ピ'), ('プ', 'プ'), ('ペ', 'ペ'), ('ポ', 'ポ')]

というデータを作ります。

このリストの各タプルをまたループで処理します。「for (変数) in (シーケンス型):」でシーケンス型データ(リストやタプル)の1要素ずつを「変数」に取って処理するので、まず変数tapに最初のタプル「('ぱ', 'ぱ')」を取り、ようやく2行目に行きます。

repdict.update({tap[0]:tap[1]})

これは変換辞書repdictに新しい項目を追加するものです。

tapの1番目の要素(tap[0])をキーに、2番目の要素(tap[1])を値とした項目を追加しています。

for tap in []:のループなので、この処理をリストの各タプルについておこなっています。

最後にrepdictと入力して、中味を確かめてるわけです。

同様の処理を「かきくけこ…」と濁点についてもおこないます。

>>> for tap in [(chr(ord(c)) +'\u3099' , chr(ord(c)+1)) for c in u'かきくけこさしすせそたちつてとはひふへほカキクケコサシスセソタチツテトハヒフヘホ']:
...   repdict.update({tap[0]:tap[1]})
... 
>>> repdict
{'ヂ': 'ヂ', 'グ': 'グ', 'ボ': 'ボ', 'ぎ': 'ぎ', 'ず': 'ず', 'プ': 'プ', 'デ': 'デ', 'パ': 'パ', 'ゼ': 'ゼ', 'ぴ': 'ぴ', 'ぞ': 'ぞ', 'ブ': 'ブ', 'ギ': 'ギ', 'だ': 'だ', 'バ': 'バ', 'ぽ': 'ぽ', 'ズ': 'ズ', 'ぷ': 'ぷ', 'ポ': 'ポ', 'じ': 'じ', 'ぢ': 'ぢ', 'べ': 'べ', 'ぱ': 'ぱ', 'ジ': 'ジ', 'ザ': 'ザ', 'び': 'び', 'げ': 'げ', 'が': 'が', 'ビ': 'ビ', 'ベ': 'ベ', 'ぶ': 'ぶ', 'ば': 'ば', 'ざ': 'ざ', 'ペ': 'ペ', 'ぼ': 'ぼ', 'ヅ': 'ヅ', 'ゲ': 'ゲ', 'ぺ': 'ぺ', 'ガ': 'ガ', 'ゴ': 'ゴ', 'ゾ': 'ゾ', 'ピ': 'ピ', 'で': 'で', 'ぜ': 'ぜ', 'ぐ': 'ぐ', 'ド': 'ド', 'ど': 'ど', 'ダ': 'ダ', 'づ': 'づ', 'ご': 'ご'}

だいぶゴチャゴチャして、ほんとにちゃんと全部の要素が入ってるか心配なので確かめてみます。

>>> sorted(repdict.keys())
['が', 'ぎ', 'ぐ', 'げ', 'ご', 'ざ', 'じ', 'ず', 'ぜ', 'ぞ', 'だ', 'ぢ', 'づ', 'で', 'ど', 'ば', 'ぱ', 'び', 'ぴ', 'ぶ', 'ぷ', 'べ', 'ぺ', 'ぼ', 'ぽ', 'ガ', 'ギ', 'グ', 'ゲ', 'ゴ', 'ザ', 'ジ', 'ズ', 'ゼ', 'ゾ', 'ダ', 'ヂ', 'ヅ', 'デ', 'ド', 'バ', 'パ', 'ビ', 'ピ', 'ブ', 'プ', 'ベ', 'ペ', 'ボ', 'ポ']
>>> 

sorted(シーケンス型)は、ソート可能なシーケンス型をソートした結果を別のリストに入れて返す関数です。

これに食わせてるrepdict.keys()は、ディクショナリ型(辞書型)がソート不能なので、キーだけ取り出したリストを作っている、ということです。


--------


まあこんな感じで用意しておいた変換辞書を使って、実際に2文字な「がぎぐ…」を1文字の「がぎぐ…」に置換するとしましょう。

普通こういう処理をするには文字列string型のtranslate()というメソッドを使うと便利なんですが、translate()は1文字を1文字に置き換える処理しかしてくれないので、元が2文字の今回は不適です。

まずはファイルを読み込みます。

>>> f=open('対象テキストファイル名')
>>> contents=f.read()
>>> f.close()

これで元ファイルの内容はcontentsに格納されました。

さて変換。ちょっと遅い処理になるけど、変換辞書のキーごとに元テキストをスキャンして置き換えていきます。

とか書くと長そうだけど、ループさせるので2行で書けます。

>>> for key in repdict.keys():
...   contents=contents.replace(key, repdict.get(key))
... 
>>>

文字列.replace(元, 新)」は「文字列」の中の「元」を「新」に置き換えるメソッドです。

「辞書.get(キー)」はキーの項目の内容を呼び出すメソッドですから、repdictのキー(たとえば2文字版の「が」)ごとに検索をかけて、見つかったらそのキーの値(1文字版の「が」)に置き換える処理です。これを「がぎぐげご…」について繰り返したら終了です。人間がやったら死んじゃうけど、コンピュータなら一瞬です。

最後に置き換え済の内容をファイルに書き出します。本当にちゃんと変換できてるか心配だし、わけのわからない処理をしちゃっていても後戻りできるように別のファイルに書き出します。

>>> w=open('書きだすファイル名', 'w')
>>> w.write(contents)
>>> w.close()

これで変換前のファイルと変換後のファイルが存在してる状態になっててるはず。

Pythonを終了し、

$ diff 対象テキストファイル 書きだすファイル名

とか、

$ grep 'が' 書きだすファイル名

とかやって心ゆくまで確かめたら作業は終了です。

(コードの解説はPythonをやりはじめたばかりの人、およびリハビリ中の人向けに書きました)

(もっと標準的な方法も存在してるようです http://tech.albert2005.co.jp/blog/2014/11/21/mco-normalize/

2015-08-05 科学の祭典沖縄大会 2015年1日目 このエントリーを含むブックマーク このエントリーのブックマークコメント

今年も参加しています。題目は

「はじめてのハンダ付け - うなり鉛筆をつくろう」

です。


うなり鉛筆というのはdrawdioのことで、去年基板を起こしたのが山ほどあるので使っています。今年は部品と基板に直径3mmのシールを貼り、さらに簡単に作れるようにしました。


http://farm1.staticflickr.com/415/20164958058_341259258b_c.jpg

アルバム


楽しそうでしょ!!


小学生以上を対象にしたら低学年の子ばかり来て、えらいことになりました。慣れてる人なら10分くらいのキットですが、555を逆に入れる子などが続出。ニッパでもいで予備部品を無理やり装着、などのエクストリームなハンダ付けを体験してもらってしまいました。


1回1時間としていましたが、ぜんぜん無理。二日目は1回2時間にします。


ちょう簡単なLEDバッジをつくるコーナーは、沖縄ハッカースペース木曜こども開放によく来る中学生のりんほさんにお願いしました。

https://farm1.staticflickr.com/318/20344474942_50307da632_c.jpg

彼が本当にすばらしく、ものすごく助かりました!


二日目(8月7日)もあります。時間は10:00〜16:30、場所は沖縄県中頭郡北谷町のちゃたんニライセンター(googleマップ)です。


きてね〜。

2015-06-25 深センMakerツアーに行ってきたよ このエントリーを含むブックマーク このエントリーのブックマークコメント

高須正和さんの主催する「ニコ技シンセ深圳観察会」に行って来ました。


この会は深センのMaker支援企業Seeed Studioの協力を得て、バスを借りきって勃興する中国のMakerムーブメントの現状を実際に見て、その文脈や影響その他を理解するツアーです。


第一回は昨年8月に、第二回は12月におこなわれ、特に初回は野尻抱介さんや山形浩生さんも参加されて素晴らしいレポートを残されていますが、自分が知ったときには切れたパスポートの取得がどうしても間に合わずに参加できないタイミングだったため涙をのんだといういわくがあります。


第一回に参加できなかったのがあまりに悔しくて第二回には行きませんでしたが、今回三回目のツアーをMaker Faire Shenzhenにタイミングを合わせて開催するというお知らせがあったので、やはり行くべきだと思い一週間ほど中国を訪れました。


一番いいスコップをくれ - Seeed Studio


ツアーの最初はSeeed Studio。まずは本社におけるビジョンやビジネスの解説です。ここは深センメイカーフェアを勝手に主催し続けてきた(今年は政府予算が入るので深センハッカースペースが主催となった)という実績が指すとおり、何かを作りたい人をサポートすることをなりわいとする会社です。


f:id:kamosawa:20150622110458j:image


本社は数カ月前に引っ越してきたという、ソフトウェア産業センターのビルの1フロアを占める非常に現代的なオフィスです。


f:id:kamosawa:20150622110236j:image:w400

f:id:kamosawa:20150622110330j:image:w400

f:id:kamosawa:20150622110037j:image:w240


オフィスの後、旧オフィス兼工場も見学しましたが、こちらも興味深いものでした。


f:id:kamosawa:20150622114742j:image:w400

f:id:kamosawa:20150622121642j:image

f:id:kamosawa:20150622121540j:image


この会社の(社長のEric Panの)考えるビジョンは、Makerビジネスのサポートであるようです。そのことはプレゼンテーションのスライドにある”メイカービジネスピラミッド”という表現にあらわれているようにおもいます。


f:id:kamosawa:20150622101419j:image


人数にしても作り出すモノの個数にしても、「漠然と作りたいと思うこと」から「大量生産のビジネス」までの間には、指数関数的な数の違いがあります。そして0.1個(プロトタイプ)を作る段階からサポートする何かを、たとえばArduino携帯電話通信機能を組み込んだボードなどを作ることにより、この会社では提供しようとしているわけです。100個作る人なら基板製造のサービスが使えるでしょうし、1000個作るなら生産や販売もしてくれるし、さらにたくさん量産するなら周囲の工場を紹介してくれもします。


このようなサポートを受けられれば、試作と改良、販売とバージョンアップは個人でも非常に楽なものになります。自分の作ったものをビジネスにしたいなら、部品の大量供給から組み立て、箱の印刷までのサプライチェーンの揃った深センを使えば、恐ろしいほど製品開発速度が上げられるし、そうした高速プロトタイピングをサポートする体制を、ここでは提供しているわけです。


ただ思うに、この会社の特異な点は、そうしたビジネスのサポートプラットフォームを拡充していくうちに、自分のためだけに作っている人をサポートするシステムも作り上げてしまっているところです。


それはどういうことかというと、たとえばわれわれは自分で適当に組んだ回路をKiCadなどの基板CADでプリント基板に起こして中国に発注するということをやる際、部品ライブラリデータに困ることがよくあります。555タイマICからトランジスタ1個、抵抗1本にしても部品の外形にはバリエーションがいろいろあり、どのデータを使うのが適切なのかよくわからなかったりするので、わざわざ自分で起こすこともよくあるほどです。


ところがこの会社ではオープンパーツライブラリと称し、よく使われる数万種類の部品について工場に常時在庫でストックした上で、それらの部品ライブラリファイルを提供しています。少量生産に特化した工場を持っているので、線幅などの設定ファイルも出してますし、実装を含めてお願いすることもできます。


f:id:kamosawa:20150622120415j:image:w400

f:id:kamosawa:20150622121020j:image:w400

f:id:kamosawa:20150622121114j:image:w400


それだけでなく、筐体の選定を助けてもらったり、最終製品の販売の依頼まで可能です。ワンストップでお願いしなければいけないわけでもなく、必要な支援だけを受けることができます。


中国では納入された部品が信用できないこともよくあるようですが(後に訪問したJENESISでは「付き合いの長いところで2割」と聞きました)、実際に量産してテストするところまでやってくれるので、こういったことも心配する必要がありません。


自分のために作っている人は成果物の完成度を上げて販売することにそれほど興味がないことが多いし、本業ではないビジネスに時間や注意力を割いていられない人も少なくありません。


それでもプリント基板に起こすのは「製作が簡単になるから」「きれいになるから」「その方が結局安くつくから」です。


これらはすなわち、きちんと設計しておこなう量産のメリットでもあるわけですが、数が必要でない場合にはしばしば


最初にかける手間 > 1個手作りする手間


となり、特に「楽」にはならないわけです。ところがこの全行程を安く楽にやれる環境が作られてしまった。自分も何か量産して売ってみる方が楽しいのではないか、と思わされるものがあります。1000個くらいなら邪魔にもなりません。


実際ツアーに参加していた中には、4日ほど前に発注した基板の受け取り方法に「工場受け取り」を選び、ツアーのときに受け取って、見せてくれた方もいました。凝った形にカットされ、オリジナルのロゴを入れ込んだ小さな変換基板が20個。


f:id:kamosawa:20150622124137j:image:w200f:id:kamosawa:20150622125628j:image:w200


これで約1000円とのこと。桁が違います。


ロゴなどは手持ちのファイルを使い、設計にかかった時間は10分くらいですよ、とのこと。これは…オレも作るしか無いぞ?! という雰囲気が流れました。表面実装用のステンシルも1000円くらいといいます。


深センでの製造業は、実はピークを過ぎました。賃金はどんどん上がり、きれいなマンションが立ち並び、70〜80平米ほどの分譲で7千万から8千万、ちょっと広いと1億円を超えるとのこと。東京なみです。工場はどんどん賃金の安い奥地や外国に流れています。


しかし強烈なサプライチェーンはまだ生きており、30年で数万人から1500万人まで増えた人口から生まれる知的集積も存在しています。深セン政府はそれらを活かしてMaker起業支援で食ってやろうと腹を決めました。メイカーフェア深センが市のメイカーウィークの一部になったのはその流れを受けてのことですし、新しいMaker支援インキュベータ団地も建設中です。エリック・パンはこうしたビジョンの提供者であり、政策の中心にいると言っても良いでしょう。


ゴールドラッシュで一番儲かったのは"mining the miners(鉱夫を採掘する)"をやった人たち、つまり金掘りたちにスコップや缶詰やジーンズや交通手段や金融的なサポートを売った人たちだといいます(詳しくは野口悠紀雄アメリカ型成功者の物語―ゴールドラッシュとシリコンバレー 』などを参照。おもしろいです)。


支援を受けて集まってくるハードウェアスタートアップたちは、いわばゴールドラッシュの鉱夫たちであり、Seeedは彼らに「スコップを売る」商売をする気まんまんです。同業他社が居ないうちから全速力で走ってきて、すでにこれだけの支援体制を作り上げています。


深センのメリットを活かして本気でハードウェアスタートアップをやりたいなら、現地に住む必要はあるでしょう。数日で実装までしてもらい、実際に使ってみる、世の中に出してみる、そのフィードバックを受けてすぐに改良する、といったループを最高速度で回すならそれが必要です。


しかしそのために作られたサポート体制を、われわれは日本に居ながらにして、ぬるま湯につかりながら楽しく受けることができます。自分で起業する人もしない人も、Makerであればこのメリットを享受できます。使わない手はないでしょう。


自分もここ数年で作った中で一番気に入っている自動消灯読書灯を1000個ほど生産しようかなと思ってます。あとSeeedの株買いたい。