登山のすすめ

 キャンプはお好きですか?僕は好きです。登山も好きです。クライミングも好きです。今回は登山をしたいと思っているキャンパーに向けて(キャンプあんまり関係ないかも…)登山の始め方や面白さを書いていきます。キャンプをすでにしている人は道具の使い方や取捨選択について経験がありますので登山にも応用できると思います。

どのような登山をするか?

 登山にも色々あります。日帰り登山、泊まりがけの登山、小屋泊まりの登山、テント泊の登山等があります。やりたい登山によって道具も変わってきますので、何をしたいのかを決めてしまいましょう。もちろんステップアップして難易度を上げていくのもいいですね。楽しみましょう。

登山の面白さ

自然に身一つで挑む。自分が小っちゃい存在と知る、孤独感を味わえる(一人の場合)、頂上についたときの達成感、危険に挑んでいるという冒険心とその時の高度感、稜線を縦走している時のスキップしたくなるような高揚感などがあります。ご自身で行ってみて面白さを体験して下さい!

冒険心で言えば奥穂~西穂間をテントを担いで歩いたときは馬の背あたりでここで死ぬのかと思いました。無事ゴールに到着したときの脱力感はパないです。

登山道具

 キャンプと登山の道具は似ています。しかし、登山は基本的には道具をザックにいれて身一つで担いでピークを目指します。重要になってくるのはかさばらないこと、そして何より重さです。場合に寄りますが、例えば車でキャンプに行く場合と違って持って行く物をかなり厳選する必要があります。ただ、キャンプで使っていた物を流用することももちろんできます。その場合は小さくまとまって軽い物を選ぶとよいです。何を持って行くかは本当に自由ですが、最低限持って行かないと行けないものは必ず持って行きましょう。

選ぶポイント (特に重要な物)

登山靴

 登山のためには登山靴を用意しましょう。スニーカーなどはNGです。登山をするための一番重要なものです。登山靴でないと未舗装の道を歩くとすぐに足が痛くなったりします。なので堅いソールの物が多いです。また、登山靴はトレールランニングなどを除き、大体がハイカットになっています。もし石などを踏んでも捻挫しにくくなっています。

 登山靴の選び方ですが、ジャンル毎に種類があります。トレッキングのための靴、3,000m級の山を登る用の靴、厳冬期用の靴(これはかなり特殊)などがあります。専門店に行ってどのような登山をしたいかを相談して決めるのがよいでしょう。登山靴は自身含めた全ての重量を受けてくれる、命を預けるものなので、慎重に慎重を重ねて選びましょう。行動中に足が痛くて動けなくなったら大変です。お店によっては足を計測して適切な靴を選んでくれるところもあるみたいなので、オススメです。大体当たりをつけたら店内で30分ぐらい履いて歩いたりして見極めましょう。

 私は足も蒸れるので、ゴアテックスの登山靴を使っています。

ザック

 物を運ぶためにはザック(リュック)が必要です。登山の種類によって使い分けます。日帰りだと30L、小屋泊は40L、テント泊は60L~ぐらいでしょうか。ザックにも色々あり、テント等が上からでは無く下から取り出せるようになっているものもあります。機能を重視するか軽さを重視するか等で選びましょう。私は軽量でシンプル、伸びる素材の60Lのザックを使っているので、日帰りからテント泊までこれ1つを使っています。(雪山テント泊を除く)

 雨でザックが濡れると中の物も濡れてしまいます。その対策にザックによりますがザックカバーを買いましょう。雨が降ったらザックカバーをかけます。私はザックの中の全荷物を登山用の防水の袋にいれているのでザックカバーは使っていません。

レインウェア

 ゴアテックス(相当)のレインウェアにしましょう!!!!!!!!!!!!!!!!
登山中に雨が降ったらレインウェアを着ながら行動します。雨が降っても歩くのです。登山は汗をかきます。寒くても汗をかきます。もしビニールのレインコートを着て登山をしたら内側には水滴が付くほどです。それによって体が冷えて行動ができなくなります。そこでゴアテックスなどの素材を使ったレインウェアにしましょう。僕はmont-bellのをずっと使っています。

地図

 登山中に道を間違えると遭難します。登山道によっては本当に道がわからなくなります。道に印がついていると思いきや道しるべの印ではなく、別の印だったため遭難したとかもあります。それを防止する1つが地図です。また、登山用の地図には所要時間も書いてあるので参考にしましょう。ただし、読み方がわからなければ意味が無いので学びましょう。

コンパス

 コンパスで方角を確認して地図を見ます。遭難防止だけではなく、地図にある周りの景色を確認出来ますので登山が楽しくなります。

 コンパスは磁北を差します。真北をさしているわけではありません。(磁北偏差)
正確に地図を見るときは磁北線を地図に引いてからコンパスを使う必要があります。通常ここまでやる必要はないかもしれません。

 登山用の服を用意しましょう。行動用の服と休憩用の防寒具があればいいです。行動用はとにかく汗がすぐ乾くものです。登山の種類によって変わってきますので、登山専門店で相談して下さい。ヒートテックは絶対に止めて下さい。

最後に

 夏山登山の場合、私の登山スタイルはウルトラライトと決めています。いかに軽く軽くして荷物も少なく快適に登山をしてテン場では美味しいご飯を作って食べて快適に過ごすがモットーです!
 各人で十人十色の登山があります。ピークハントを目的にした登山、はたまたピークを目的にしない登山もあります。あなたに合った素敵な登山を楽しんで下さい!

明日はTatsuya Yagiさんです。

Pythonのマングリングについて

Pythonのマングリングとは?

Pythonではクラス内に __で始まり、 __ で終わらない名前をマングリングします。
マングリングとは例えば

class T:
   def foo(self):
     self.__bar = "bar"
     print(self.__bar)
     print(self._T__bar)

T().foo()

としたときに、barが2回出力されます。Pythonではクラス内で定義された __barを特別扱いして self._T__bar とすることでprivateメンバ変数に見せかける仕組みのようです。もちろんクラス内からは self.__bar でアクセス出来ます。

ルールは簡単。__ がついて __ で終わらない変数を _クラス名__変数名 にするだけです。

マングリングの闇

import編

さて、上の例だとselfの変数にマングリングが行われましたが、実はマングリングはクラス内で定義されたもの 全て に対して行われます。

$ ls | grep test
__test2
_T__test1

というディレクトリがあった場合、

class T:
   import __test1
   import __test2

を実行すると

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in T
ImportError: No module named '_T__test2'

こうなるわけです。
import __test1 はマングリングされて _T__test1 名前空間パッケージを見に行くため正常にimportされます。
import __test2 はマングリングされて _T__test2 を見に行きますが、__test2 は見ないため ImportError となります。
これバグではとちょっと思ったり…

import __test1 を逆アセンブルします。

  3           8 LOAD_CONST               1 (0)
             10 LOAD_CONST               2 (None)
             12 IMPORT_NAME              3 (_T__test1)
             14 STORE_NAME               3 (_T__test1)
             16 LOAD_CONST               2 (None)
             18 RETURN_VALUE

つまり、 import __test1 はコンパイル時に import _T__test1 にされるのです。

exec編

class Foo:
    def __init__(self):
        exec("self.__foo = 2")
    def bar(self):
        print(self.__foo)

Foo().bar()

を実行すると

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 5, in bar
AttributeError: 'Foo' object has no attribute '_Foo__foo'

となるわけです。つまり exec はマングリングされないんですね。マングリングはスクリプトのコンパイル時に行われるので exec だとマングリングされません。

クラススコープについて

import ですでにやりましたが、クラススコープの識別子も変換しないと、メソッドから参照できなくなるのでとにかく変換します。

class A:
  import sys as __sys
  print(__sys)
  print(_A__sys)
  def f(self):
    print(self.__sys)
     print(self._A__sys)

A().f()

<module 'sys' (built-in)>
<module 'sys' (built-in)>
<module 'sys' (built-in)>
<module 'sys' (built-in)>

となります。

何でもかんでも変換する

マングリングに例外はありません。識別子は全部変換されます。

class A:
  def x(self):
    __y = 100
    print(dir())

A().x()

['_A__y', 'self']

となります。

class A:
   def f(self):
      import sys
      sys.__omg = 100

A().f()

import sys

sys._A__omg
100

もはや意味がわかりませんね。

global編

当然globalもです。

class A:
  global __x
  __x = 100

_A__x

100

oh…

引数編

class A:
  def f(self):
    def a(__arg):
      print(dir())
      a(1)

A().f()

['_A__arg']

(‘A`)

最後に

マングリングの仕様について、如何だったでしょうか?こんな知識嫌がらせにしか使えないですが、もし遭遇した場合には役に立つことを願います。
私はcafebabepyの実装にこれを盛り込まないといけないので憂鬱です。。

Pythonのsuperについて

Pythonのsuperクラスについてpyhack Slackでatsuoishimotoに教えて貰いました。

superは第2引数を省略することができます。何に使うのでしょうか?

>>> class A: pass
...
>>> super(A)
<super: <class 'A'>, NULL>

これは unbound super と言います。使い方は

class A(object):
    def method(self):
        print('A')

class B(A):
    def method(self):
        print('B')
        self.__super.method()

B._B__super = super(B)

B().method()

のように使うみたいですがどんなシーンで使うのかまったく想像できません。
B._B__super = super(B) はBクラスのprivateインスタンスメンバに代入しているので超絶hackしてますね。。。

super(B).__get__(B()).method()

ならわかりやすいですね。

ではsuper(A, B)は何に使うのでしょうか?

class A:
    @classmethod
    def f(cls):
        print('A')

class B(A):
    @classmethod
    def f(cls):
        super(B, cls).f()

単純に classmethod の場合に使うようですね。
ということはsuperクラスのデスクリプタはどうなっているんでしょうか?

>>> class B(A): pass
...
>>> super(B).__init__
<method-wrapper '__init__' of super object at 0x7fc8c12e3b08>
>>> super(B, B()).__init__
<method-wrapper '__init__' of B object at 0x7fc8c13953c8>

unbound superのget()は普通のsuper()のインスタンスを返します。
bounded superは引数を無視します。

>>> super(B, B()).__get__(123).__init__
<method-wrapper '__init__' of B object at 0x7fc8c12defd0>

Python考古学ですね。

Thanks atsuoishimoto!!

Homebrewからインストールしたnodebrewの初期構築でハマったところ

Homebrew、便利ですよね。nodebrew、多分必要ですよね?
$ brew install nodebrew
しましょう。んでnodebrewでNode.jsを入れようとしたら…


$ nodebrew install-binary v6.1.0
Fetching: https://nodejs.org/dist/v6.1.0/node-v6.1.0-darwin-x64.tar.gz
Warning: Failed to create the file
Warning: /Users/xxx/.nodebrew/src/v6.1.0/node-v6.1.0-darwin-x64.tar.gz:
Warning: No such file or directory

えっ…

原因は.nodebrew/srcディレクトリがないことですね。なので
$ mkdir -p ~/.nodebrew/src

っとして


$ nodebrew install-binary v6.1.0
Fetching: https://nodejs.org/dist/v6.1.0/node-v6.1.0-darwin-x64.tar.gz
######################################################################## 100.0%
Installed successfully

はい。

GradleでただのJavaプロジェクトでもprovidedCompileを使う方法

build.gradleで
apply plugin: 'war'
等としていると、dependenciesprovidedCompileが使えますが、例えば
apply plugin: 'java'
だけだとprovidedCompileは使えません。そこで以下のようにすれば使えるようになります。


configurations {
    providedCompile
}

sourceSets {
    main.compileClasspath += configurations.providedCompile
    test.compileClasspath += configurations.providedCompile
    test.runtimeClasspath += configurations.providedCompile
}

ただし、マルチプロジェクト等でmasterに上記設定をしてサブプロジェクトで
apply plugin: 'war'
としていた場合、すでにprovidedCompileを登録しているため、エラーが発生します。
そのため、以下のようにすればエラーが無くなります。が、これでいいんだろうか?


sourceSets {
    main.compileClasspath -= configurations.providedCompile
    test.compileClasspath -= configurations.providedCompile
    test.runtimeClasspath -= configurations.providedCompile
}

configurations.remove(configurations.providedCompile)

apply plugin: 'war'

ようは初期状態に戻してあとはwarプラグインに任せましょうってことで。

MavenプロジェクトでJettyのServletTesterやHttpTesterを利用する場合

Mavenを利用していてJetty 9.3.7.v20160115でServletTesterやHttpTesterをテストに利用する場合、pom.xmlを

<dependency>
  <groupId>org.eclipse.jetty</groupId>
  <artifactId>jetty-servlet</artifactId>
  <version>9.3.7.v20160115</version>
  <scope>test</scope>
</dependency>

ではなく、

<dependency>
  <groupId>org.eclipse.jetty</groupId>
  <artifactId>jetty-servlet</artifactId>
  <version>9.3.7.v20160115</version>
  <classifier>tests</classifier>
  <scope>test</scope>
</dependency>

といったように<classifier>tests</classifier>を入れる必要があります。いれないとMavenがjetty-http:testsを落としてきてくれなく、利用できません。小一時間ハマりました。

ReadyNAS 104(多分102も)単体でGoogle Driveと同期する方法

背景

私は家のNASにReadyNAS 104を使ってます。3TBx4のRAID-5を組んでおおむね満足していたのですが、本機のみでのクラウド連携ができないといった問題があります。(ReadyNASのクラウドやDropboxはあるみたいですがバックアップ用途っぽい?)

MacでGoogle Driveアプリを使おうとしたもののSMBには対応しておらず使えず…
Insyncを使ってMacからNAS上のディレクトリを同期していました。つまりMacがサーバーになっていて常時起動状態で半年運用していました。
しかし最近たまたまネットを見ていると、Raspberry PiでNASを構築してしかもInsyncを使ってGoogle Driveを同期すると行った方法があるようです!
ReadyNASでもできないかさっそく試してみることにしました。

結論から言えば成功です。まだ細かい確認まではしていませんが、同期は行われています。
続きを読む “ReadyNAS 104(多分102も)単体でGoogle Driveと同期する方法”

株式会社ビープラウドへ遊びに行ってきました

2015/3/13に株式会社ビープラウドへ遊びに行ってきました。

Python mini hack-a-thon 雪山合宿 2015@aodag先生にビープラウドへ遊びに来ないかと誘われていましたが、2月は仕事が忙しく休みがとれませんでした。その後@aodag先生からSlackで連絡があり、いつの間にかshachiku groupが出来ていました。(名前が…)

3月に有休が何とか取れる見込みがたったので3/13に遊びに行きました。

続きを読む “株式会社ビープラウドへ遊びに行ってきました”