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

自分の素質がわからない人は、自分の狂気がどこにあるのか探すべき

僕はプログラマーは自分に向いてる仕事の一つだと考えています。理由は、一日中プログラミングできるからです。 悩みやしなければいけないことがあった時、プログラミングをすると落ち着きます。プログラミングが精神療法になっています。ずっとパソコンの前に座って、ずっとプログラミングできます。彼女がいなければ、仕事かプログラミングと結婚がしたいです。

これに近いことを今朝、知り合いに話したら若干引かれちゃった気がしました ^^

この時、自分はもしかしたら、程度はどうであれこの分野で「狂っている」のかもしれないと思いました。他人には狂気に見えるかもしれませんが、自分にとっては好きなことをしているだけなのでおかしいなと思いません。

狂気は他人と比較して気づくものであり、他人とは違うところだと思います。自分の狂気がどこにあるか突き止め、そこを尖らせていくことで、熊谷さんでおっしゃった群像の感覚につながっていくのではないかと。

誰しも一度は「自分に向いていることはなんだろう」と考えたことはあると思います。その際、自分の中に潜む「狂気」をヒントに辿っていくこともいいかもしれないと思いました。

シェル初心者がはじめてシェルにこだわる。Macでfish環境構築。

シェルにこだわってみようと思いました。fishを使うことにしました。 導入手順といいなと思ったものをまとめておきます。何かの参考になればなと思います。OSXです。

できあがった環境

Before(イメージ) f:id:shutoo:20161117115614p:plain Bash + Terminal.app

After f:id:shutoo:20161117115536p:plain fish + tmux + Terminal.app

fishになった経緯

バイトの昼の1時間にシェルの環境構築してみようと決めました。 自分はずっとデフォルトのBash環境を使っていて、ゼロから環境つくっていくと時間がかかりそうだと思い、ネット上にある他人の環境をパクっていいなともったものを掻い摘む形をとることしました。(dotfilesで検索するといっぱいでました) ですが、気がついたらbashzshがlsを使えない程度に壊れた(パスの問題ではありませんでした)ので、逃げるようにfishになりました。実際触るといい感じでした。

fishの特徴

良い所は特に設定などをしなくても入力補完などが予め搭載されていることです。

公式HPでは以下のような特徴を上げています f:id:shutoo:20161117115718p:plain

要は特に設定しなくてもグラフィカルで高機能な補完もあるよってことです。 注意点は、bashzshのところどころコマンドの記述形式が違うところがあります。

&& で実行系 Bash, zsh

brew update && brew upgrade

fishの場合 ;and でつなげます

brew update; and brew upgrade

参考 Zsh から Fish にした。

インストール

brew install fish

ついでに、さらにfishを便利にするoh-my-fishも追加

curl -L https://github.com/oh-my-fish/oh-my-fish/raw/master/bin/install | fish

fishをデフォルトのシェルに設定

fishの場所確認

$ which fish
/usr/local/bin/fish <- コピー
sudo vi /etc/shells

編集

# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.

/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/usr/local/bin/fish <- 貼り付け

デフォルトに設定

chsh -s /usr/local/bin/fish

tmux

という端末多重化ソフトウェアも入れてみました これについてはまだ勉強中です。 tmuxを使い始めたので基本的な機能の使い方とかを整理してみた

Solarized を使うことにしました。

f:id:shutoo:20161117115846p:plain

コントラストが小さく目にやさしいように設計されているみたいです。 ダウンロード時の注意点としては、公式HPから直接ではなく、git cloneすることです。 Mac Terminal のカラー設定をSolarized にする

全体的な参考

さいつよのターミナル環境を構築しよう

目の前にある穴を どうにかしたい 落っこちる前に

Linuxの背後にある精神 - リーナス・トーバルズ

Linux、Gitの開発者であるリーナス・トーバルズさんのTEDです。大雑把ですが、共感したところを拾ってきました。IT業界の退社時間をどうにかしたい感はあります。

テスラ対エジソンというのは テクノロジー分野では 言い古された感がありますが テスラはビジョンを持った科学者 すごいアイデア・マンとして見られていて みんなテスラが大好きです。 その名を会社名にしている 人たちもいます。

-

もう一方のエジソンは もっと凡俗で 悪く言われることが多いです。 そして彼の 最も有名な 言葉というのが あの 「天才とは1%のひらめきと99%の努力」です。 私はエジソンの側なんです。 みんなは あまり 好きでないかもしれませんが 2人を比べたとき テスラは近頃の人の 心を掴んでいますが 実際に世界を変えたのは どちらでしょう? エジソンは いい奴では なかったかもしれません いろいろやっています。 そんなに知的でなく ビジョナリーでは ないかもしれません。 でも私はテスラよりは エジソンに近いと思います。

-

この2日間TEDにいて 少し居心地が悪く 感じていました ビジョンの話が たくさんされていますが 私はビジョナリーではありません。 5カ年計画なんて 持っていません。 私はエンジニアです。 歩き回っては雲を見つめ 星を見上げ 「あそこに行きたいものだ」と言う人々と 一緒にいるのは まったく問題ありません。 でも 私の方は 地面を見ていて 目の前にある穴を どうにかしたいと思っています 落っこちる前に 私はそういう人間なんです。

他社の失敗理由から成功を生み出す

lineblog.me

けんすうさんのこの記事、ブログサービスの本質について深く分析されていて、感服しております。 LINEはネットワークを持っている強みを、うまく使いこなしていますよね。

この記事で僕がとても勉強になったのは、

Mediumがうまくいかなかった「いい書き手しか集まらない」ということにならないように、LINE BLOGの一般バージョンでは、誰でも気軽にかけるというところにフォーカスしているのですね。

という他社の失敗から成功を生み出そうとするところです。 いつも成功事例ばかりに目が言ってたのですが、失敗事例からも成功は生み出せるよなと

仕事量から成長しようとするラットレース

ラットレース(英語:rat race)とは、働いても、働いても、一向に資産が貯まらない状態のことである。 働いても、働いても、一向に資産が貯まらない様子が、回し車の中で、クルクル回っているネズミに似ていることから定義されていると、ロバート・キヨサキが自著「金持ち父さん 貧乏父さん」の中で語っている。

同じような受注案件を何度もこなすことでどれほど成長できているのでしょうか。 バグ対応に費やした時間、ライバル達は本を読んで新しいことを実践しているのでしょうか。そちらのほうが多くのことを会社に還元できそうな気もします。もちろんやるべきことはやります。ただラットレースにハマっているように思えるのです。

スキル不足のせいで時間がかかっている分、ライバルたちはどんどん先に行ってると思います。
スキルアップ→業務時間短縮→勉強時間確保→勉強→スキルアップ→・・・
スキルアップは自分のため、会社のために絶対必要なこと。
課題こなしたらまた次の課題がくるので、業務時間短縮できたら次の業務をねじ込まれるのが現状。
本当はもっとプログラミングの勉強したい。デザインの勉強したい。スキル定着させたい。
やればいいじゃんとおもうだろうけど、やらせてもらえる現状じゃないかなって思ってる。
勉強する暇あったら少しでも多く課題こなして一銭でも多く稼いでこいみたいな。

ラットレースの対義語として「ファーストトラック」というものがあります。これは、足踏みしているラット達を尻目に、横の高速道路を早いスピードで疾走している様子が、資産が資産を生み続ける様子によく似ていることから名付けられています。
会社にとって技術力が資産だとすれば、技術力を上げるほどより技術力を生み出すことでき、より速いスピードで疾走できるのではないかと思います。

では、どうやって技術力を向上させるか。
それはチームを一度「技術力向上」という課題にフォーカスさせ、仕事量を減らし、技術力を上げるための時間や環境を確保させてもよいのではないかと思います。
あとは、チーム内で技術力を上げる施策を試し、答えを見つけれるのではないかなと。

文字列からクラスのインスタンスを生成・メソッドを実行

NSClassFromStringで文字列からインスタンスの生成・メソッドの実行が行えます。
Swift3で文字列からクラスのインスタンスを生成する場合は以下のようになります。

@objc(Foo) // Objective-C側で利用可能にすることが必要
class Foo: NSObject {
  func bar() {
    print("DEKITA")
  }
}

let type: NSObject.Type = NSClassFromString(controllerName + "Controller") as! NSObject.Type
let foo: Foo = type.init() as! Foo // インスタンスを生成
foo.bar() // "DEKITA"

文字列からメソッドはSelectorで

let selector: Selector = NSSelectorFromString("bar")
foo.perform(selector)

値を返す場合はtakeUnretainedValueでキャストできます。仕組みはまだ理解していません。

let selector: Selector = NSSelectorFromString("getString")
foo.perform(selector).takeUnretainedValue() as! String
雑感

@objcいちいち宣言しないといけないのめんどいなあ
自動化できないものか

PerfectでサーバーサイドSwift

公式ドキュメントを参考に、Perfectを軽く触ってみたのでメモ

perfect.org

環境はOS X
まずは適当なプロジェクトフォルダを作成

mkdir MyAwesomeProject
cd MyAwesomeProject

Gitリポジトリを作成

git init
touch README.html
git add README.html
git commit -m "Initial commit"

カレントディレクトリにPackage.swiftを作成
これはAppleが公開しているSwift Package Managerというライブラリ管理ツールを利用して、Perfectのライブラリをダウンロードするためのファイル。

import PackageDescription
 
let package = Package(
    name: "MyAwesomeProject",
    dependencies: [
        .Package(
        url: "https://github.com/PerfectlySoft/Perfect-HTTPServer.git", 
        majorVersion: 2, minor: 0
        )
    ]
)

github.com

swift buildを行なうと依存ライブラリが一気にダウンロードされる。結構時間がかかるので一旦後回し。
mkdir SourcesでSourcesディレクトリを作成し、以下にmain.swiftを作成。Sources/main.swiftとなっているはずです。

import PerfectLib
import PerfectHTTP
import PerfectHTTPServer
 
// Create HTTP server.
let server = HTTPServer()
 
// Register your own routes and handlers
var routes = Routes()
routes.add(method: .get, uri: "/", handler: {
        request, response in
        response.setHeader(.contentType, value: "text/html")
        response.appendBody(string: "<html><title>Hello, world!</title><body>Hello, world!</body></html>")
        response.completed()
    }
)
 
// Add the routes to the server.
server.addRoutes(routes)
 
// Set a listen port of 8181
server.serverPort = 8181
 
do {
    // Launch the HTTP server.
    try server.start()
} catch PerfectError.networkError(let err, let msg) {
    print("Network error thrown: \(err) \(msg)")
}

main.swift はswiftのメイン関数のようなものです。関数ではなくファイルがそのまま実行されます。 また、iOS開発ではAppDeleteから実行されますが、あれは@UIApplicationMainディレクティブを記述しているためです。

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

戻ります。ここで、以下を実行。

swift build
.build/debug/MyAwesomeProject

http://localhost:8181/ にサーバーが立ち上がりました。
Xcodeを使いたい場合。以下のコマンドを実行すると、Xcodeプロジェクトを作成できます。

swift package generate-xcodeproj

Schemeはコンソールがアイコンのものを指定すると、ビルドできます。