arveltのソフトウェア技術メモ

Arvelt's software technology memo

「UNIXという考え方」を読んだ

古典的名著だが読んでいなかったので読んでみた。

 

主に以下の内容が書いてある。
1. スモール・イズ・ビューティフル
2. 1つのプログラムには1つのことをうまくやらせる
3. できるだけ早く試作する
4. 効率より移植性を優先する
5. 数値データはASCIIフラットファイルに保存する
6. ソフトウェアを梃子として使う
7. シェルスクリプトによって梃子の効果と移植性を高める
8. 過度の対話的インターフェースを避ける
9. すべてのプログラムをフィルタとして設計する

 

一番有名な1角プログラムには1つのことをうまくやらせる、などは今読んでも納得がいくし、逆に今はあまり関係ないかという思うような話もある。個人的にはすべてのプログラムをフィルタとして設計するというのはなるほどと思わされた。独自技術症候群、のちに車輪の再発明はするななどと言い直される概念ももうこの当時あったのだと思った。
今読んでも新しい発見があり面白かった。

 

 

2022年の振り返り

2022年の振り返り書いてなかったのでもう2月ですが書きます。

続けること

  • ピアノ演奏の動画を上げたい話、弾きたい曲を動画レベルになるまで仕上げるのは難しい。1つもあげてないけど練習はたまにしていてあとは時間をどれだけかけられるかの話。
  • 去年の夏に自律神経をやってしまいかなり大変な目にあった。それ以後健康のために起きたら散歩をしたりしているので続けるようにしたい。これ以後かなり体弱ったことを感じていて健康維持のためにしっかりコストをかけないといけないということを実感している。

問題だったこと

  • イラスト書きたいと言って結局書いてない。
  • モバイルアプリの勉強。新しいOSの変更とかはさすがにしってないとしんどかった。一応仕事でも触っているので・・・。情報追いかけるくらいはしっかりしておきたい。

挑戦すること

  • Android開発の情報をしっかり追いかける。
  • ピアノ演奏の動画を上げたい。
  • イラストを書きたい。コンテンツのインプットをする。
  • ゲームブログのほうに書いているが、(http://moekokoromoe.blog28.fc2.com/blog-entry-912.html) 去年は1つのタイトルを何百時間もやるようなことが多かった。これだけゲームに時間をかけたなら、これをなにかアウトプットできないだろうか?という気持ちがしている。動画にしたりとか・・・?
  • 読書したい。

2021年を振り返って 

あけましておめでとうそれでは2021年の振り返りです。とうとう1年に1回しかブログかかなくなってしまった。書かないってことはインプットが少ないと言うことなのでこれはよくない。

 

続けること

  • Apex Legendsダイア行きたいと言っていたが、プラチナまではいけた。500時間単位で投入しないとうまくはならなかったので今後も続けるかは少し考えたい。
  • イラスト描く。なんと1年で1枚しか描いてない。もっとかこ?
  • ピアノ演奏動画を上げたい話。あまり練習しないので同じ曲を1年練習してもいまだ仕上がっていない。大変よろしくない。
  • コーヒー豆を挽いていれるコーヒーはおいしい。それに気晴らしとして大変優れている。

問題だったこと

  • イラスト・漫画を描けていない。なんと1年で1枚。
  • モバイルアプリの勉強したい気持ちはある。気持ちだけで結局やっていない。モバイルアプリは自分で使いたいものを作って使うまでが全部一直線なのでWebサービスよりもやりやすいのでやっていきたい。
  • 3Dってみたい、動画配信やってみたい話は、やってみたいけど別にいいかなということになって落ち着いてしまった。じゃあこれはいいか。
  • コンピューターサイエンスを勉強してない話。これかれこれ10年以上前からずっと言っていてコンピューターサイエンス勉強したいワナビーみたいになってるのでそろそろ一旦諦めてもいいかという気がしている。これがわからなければ明日しにますみたいなことになったら勉強しようと思う。

挑戦すること

  • Androidやろうとしてたけどやってなかった。モバイルアプリは自分で使いたいものを作って使うまでが全部一直線なのでWebサービスよりもやりやすいのでやっていきたい。
  • もっとやらないといけないというのは、面白さのうち消費する面白さだけになっていてしまい、動く面白さ作る面白さをやれていないからだ。どんな面白いも1つだけでは結局飽きる。
  • コミケが復活したので、通常通りになったら復帰を考えてもいいと思った。あれは人の作品を見て大いにモチベーションを刺激される。何度も行くのはそのためだと言っていい。
  • とにかくあらゆるアウトプットが減ってしまいApex Legendsをプレイするだけの奴隷になっていた。アウトプットが減るのはインプットできていないからというのは経験上わかっていて、たとえば面白そうなガジェット買ったり映画を見たり本を読んだりそういうことをもっとやらないといけない。

2020年を振り返って

振り返っても結局意味ないのでKPTで記載することにします、と去年の記事に書いてあったのでそうする。

続けること

  • モバイルアプリの勉強。多分去年やれてなかった気がするのでちゃんと検め直したい。Android
  • 漫画書く。去年はコミケがなくなったため、漫画を1ページも描かずに終わってしまった。漫画描きたい。
  • イラスト書く。イラストと漫画は別物なので考え方も分ける必要があるので。
  • 新しいデバイス買ったりするやつ。こういうのやんないと感性が鈍るなって今では思う

問題だったこと

  • 漫画を書いていない。人は締め切りがないと作業をしないということがわかってしまった。ただ正直伝染病が収まるまではイベントに参加する気はない。もっと気軽なやつを書いていこうかと思っている。
  • モバイルアプリの勉強。結局できてなかったのでする。
  • 実装できる企画屋っぽいことをしてるので、テック情報を意識的に拾いに行くようにしようと思う。やっと仕事の話。最近twitter眺めるだけでテック系のサイトとか見に行かなくなってる。
  • ソフトウェア実装力、もともとないのに日に日に下がってる気がする。どうしたらいいだろう?何を勉強すればいいだろう?情報求む。
  • コンピューターサイエンスをちゃんと勉強する、まえまえからずっとやりたい言ってたんだけど結局やってない。これやったからといって私が仕事できるようになるビジョンが見えなかったのでモチベ沸かない。もっと他の部分に問題がある気がするけどわからない。多分やんないと思う。アルゴリズムとかはやってもいいかも

挑戦すること

  • 最近3D系に興味あるのでそういうのやりたい。イラストやってるからZbrushとかが相性いいかなと思っていたりする。本だけ買ったけど結局やらなかったので
  • 動画配信とかしたい。リモワでおうちの機材が充実し始めているのでそれを生かしてなんかやりたい。ゲーム実況とかかなぁ?
  • ピアノ演奏動画上げたい。むかーしからピアノやってたんだけど最近また習い直してるのね。せっかくだから記録残したい
  • 湊あくあさんの影響でAPEX始めたんだけど、ランクダイアまで行きたい。文字通りのまま。
  • 映画とかいろんなコンテンツみたい。イラストも漫画がそうなんだけど、これ描きたいわ!っていうモチベーションは、いろんな作品のインプットがないと産まれないんだよね。なので意識的にいろんなものに触れたいなと思った。一通りの話をまとめるテクニックは映画から学べるので映画をたくさん見るのがおすすめ、らしい。読者ハ読ムナ(笑) ~いかにして藤田和日郎の新人アシスタントが漫画家になったか~ にそういう事が書いてある。
  • テック情報さえちゃんと追わなくなりつつあるのでやるって話に加えて、本を読みたい。通勤時間で買った本を乱読してたけど、通勤しなくなって本マジで読まなくなってしまった。やばい。

 

1兆ドルコーチを読んだ

AppleGoogleなどのシリコンバレー企業の幹部のコーチングを担当していたビル・キャンベル。彼が関わった企業の時価総額は2兆ドルを超えると言われている。そんな人がどんなふうにコーチングをしていたかと、彼の教え子たちが綴った本。

 

コーチの教え

  • 思いやり
  • 素早く動く
  • やっちまえ

人がすべて

  • マネージャーは「支援」「敬意」「信頼」を通じて、部下が仕事で実力を発揮し成長できるように手を貸すこと
  • 旅の報告から始める。(社会情動的コミュニケーション
  • 議論するべきトップ5はなにか?
  • マネージャーの仕事は決定をくだすこと。
  • 天才とうまく付き合え。寛容であれ、だが仲間の成果を損なうならばその限りでない
  • 高い報酬は愛と敬意の証
  • 去るものに敬意を払え
  • 資料は必ず先に共有しろ

心理的安全性

  • コーチされるのに必要な資質「正直さ」「謙虚さ」「努力をいとわない姿勢」「学習する意欲」
  • 信頼とはきれいごとではない。それは「約そこを守ること」「誠意」「率直さ」「思慮深さ」のことだ。
  • フィードバックは正直に率直に早いうちに伝える。ネガティブなフィードバックは人目につかないところで与える。
  • やるべきことを指示せず、自分でたどり着けるように導く。
  • 人はありのままの人格が表出しているときに最も良い仕事をする

チームファースト

  • 問題そのものよりもチームに取り組む。誰があたっているか、適切なチームが配置されているか、成功するために必要なものを揃えたか。
  • 正しいプレイヤーを見つけること。誠実であり、グリットをもち、共感できて、チームに貢献するマインドを持っている。
  • ペアで仕事に当てる。
  • データやプロセスで解決できない最大の問題に真っ先に切り込む。
  • 正しく勝利することを目指す。不誠実さ、非協力、非献身ではいけない。
  • 敗北しているときこそ、大義に向き合い先陣に立つ。献身的な誠実さで判断をくだせ。
  • 人々の間の小さなすきま、理解やコミュニケーションのギャップを埋めていく

ビジネスに愛を持ち込む

  • 優しい組織にする。プライベートな会話は人に関心を持ち気にかけているということでもある。
  • コミュニティを作れ。生まれた絆がチームを強くする。
  • 人を助ける。時間や人脈を他人のために使う。

成功を測る尺度

  • 自分のために働いてくれた人、自分が助けた人のうちすぐれたせいかのこのこした人は何人いたか、それが成功を測るものさしとなる

 

 

 

2019年を振り返って

前年度立てた目標

  • モバイルアプリ勉強する
    • これは単純に興味あるので
  • 新しい技術をいち早く試す
  • コードリーディング
    • Web関連のコードを読んだ絶対量が少ない問題
  • 技術プラスのスキルの模索
    • 一番地続きはプロダクト方面。仕様や設計には適正がなかったので、運用とか改善の方面
  • 漫画を書く
    • 例大祭。それと夏か冬のどちらか

目標を達したか

  • モバイルアプリ勉強する
    • 実は業務でAndroidアプリに関わったので復習がてら自分でアプリの雛形を書いたりしてた
  • コードリーディング
    • 勉強のためのコードリーディングみたいなことはやっていない。Web関係のソースをプライベートでは見ていない
  • 新しい技術をいち早く試す
    • これふわっとしすぎて意味なかったかも。一応プロダクト方面の技能を身に着けようと画策しはじめた
  • 漫画を書く
    • 例大祭冬コミに出て本を出した。既刊7冊になった。継続は力…?

所感

こいつ漫画しか描いてなくない?(1年ぶり3度目
実はもう7冊も書いたことが判明していて私漫画書くの好きだったのか!って自分で気づきを得た。そういう話をするところではないはずなのだが?
あとこれ振り返れてないしこれからはKPT方式てやっていきたいと思った、来年はそれで書いてみる。いや形式はともかく内容的には記してみる。
 
続けること。
モバイルアプリの勉強、勉強というよりも自分がほしいアプリを作ることにフットワーク軽くなっていくということをやりたい。漫画書く、これは続ける。漫画書きたい。漫画楽しい。むしろ漫画で食いたい。いや絵が下手なので無理だが…。
 
問題だったこと。
勉強のためのコードリーディングとかは全然手につかないやる気も起きない意味がなかった。自分のためのアプリを作るんだみたいな取り組みの中でわからないことが起きた場合においてのみ、私は学習することができていたと思う。勉強自体が楽しいとか知ることが楽しいとかはまったくなくて、ただやりたいことをやるためだけに解いていく。仕事に備えて学ぶみたいなことも正直全然できないのもこの辺の性根に問題がありそうだと感じている。
ならば仕事とかは一端忘れて、何か作りたいものをおいてそこから学び取っていくしかないのではないだろうか、それが仕事の領域と重なったらラッキーくらいの扱い。
 
取り組んでいくこと。
そうはいっても仕事方面でもう少し成果出したい、そうしないとお給料が上がらないので。業務ではプログラミングがわかるプロダクトの人みたいな方向を模索させてもらいつつありこれはこれとして大変ありがたいので、何かしらを掴んでしまいたい。もうこの方向でだめなら全部すっぱりやめてアルバイトしながらイラストレーターでも目指したほうがマシなんじゃないかと思う。あるいはコボラーに戻るとか。
それはそれとしてドキュメントを読むときや、カンファレンスの動画を見るときに英語があまりよくわからないという現実的な問題がありこれをなんとかしたいと思っている。英語……学習……的な?
あと一応フロントの何かしらもさわりたい。これは多分趣味、だって自分のおもちゃのUIを自分で作れたら楽しいでしょ?弊社はフロントがAngularなので、Electron+Angularで自分用のUIがあるおもちゃを作ってみるとかその程度でもいいと思ってる。
あともっと本を読みたい。ここ何年か技術書で勉強しなければみたいに変に気張っていて多分読書自体が嫌になりつつ合ったと思う。私そもそもそういうんじゃないはず
 
何でもやれるようになりないなと思っていたはいいが結局何もできるようにならなかった人間は生きるのが難しい。昨今のIT業界は、成長することを強要されているみたいな雰囲気あると思っているのだが、そらまあ成長しなければ周りは勝手に伸びていっておいていかれるのはそれはそう。とはいえこの業界には普通に生きていくという概念が存在しないようで非常に生きづらく感じる。皆息苦しくないのだろうか?
 
今回から来年の目標という項目はたてないので、TRYの項目からKEEPを増やすようにできるようにしていきたい。

RecycleViewでDataBindingとLiveDataを使う

これ今はもうスタートラインレベルなのに毎回用意するのが大変なので、そろそろ一気に自動生成してくれるようにしてほしい。 これは何度も書いているので未来の私のために残す。見ながら書いて足りないものに気づいたら直す感じで  
 
Android StudioでFragment(List)を選んで生成して使用する。 MemoとMemoItemというビューの関係を関係を作るのがこの記事がゴール。使用したkotlinは 1.3.31 、 minSdkVersionは 21

f:id:arvelt:20190924183034p:plainf:id:arvelt:20190924183050p:plain

 
 
gradleでdataBindingを有効にする

android {
    dataBinding {
        enabled = true
    }
}

 
 
まずデータクラスを定義。リストの1項目を表す。Memo.kt

data class MemoItem(
    val id: String,
    val message: String
) : Serializable

 
 
ビューモデルを定義。MemoListViewModel.kt

class MemoListViewModel : ViewModel() {
    val items = MutableLiveData<List<MemoItem>>()

    fun loadItems() {
        val items = arrayListOf(
            MemoItem("1", "aaa"),
            MemoItem("2", "bbb"),
            MemoItem("3", "ccc"),
            MemoItem("4", "ddd"),
            MemoItem("5", "eee")
        )
        this.items.value = items
    }
}

 
 
リサイクルビューのXMLをLayoutタグでくくり、variableを定義。fragment_memo_list.xmlとする

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools">

    <data>
        <variable name="viewModel"type="net.arvelt.memoapp.ui.memolist.MemoListViewModel" />
    </data>

    <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/list"
            android:name="net.arvelt.memoapp.MemoListFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginLeft="16dp"
            android:layout_marginRight="16dp"
            app:layoutManager="LinearLayoutManager"
            tools:context=".ui.memolist.MemoListFragment"
            tools:listitem="@layout/fragment_memo_list_item" />
</layout>

 
 
リサイクルビューの1行分の項目のXMLをLayoutタグでくくり、variableを定義。fragment_memo_list_itemとする

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>
        <variable name="viewModel" type="net.arvelt.memoapp.model.MemoItem" />
    </data>

    <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal">

        <TextView
                android:id="@+id/itemId"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_margin="@dimen/text_margin"
                android:text="@{viewModel.id}"
                android:textAppearance="?attr/textAppearanceListItem" />

        <TextView
                android:id="@+id/content"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_margin="@dimen/text_margin"
                android:text="@{viewModel.message}"
                android:textAppearance="?attr/textAppearanceListItem" />
    </LinearLayout>

</layout>

 
 
Bindingクラスを生成させるために一度コンパイルする。アダプタークラスをデータバインディングを使用した形に置き換える。MyMemoRecyclerViewAdapter.ktとする

class MyMemoRecyclerViewAdapter(
    private var mValues: List<MemoItem>,
    private val mListener: OnListFragmentInteractionListener?
) : RecyclerView.Adapter<MyMemoRecyclerViewAdapter.ViewHolder>() {

    private val mOnClickListener: View.OnClickListener

    init {
        mOnClickListener = View.OnClickListener { v ->
            val item = v.tag as MemoItem
            mListener?.onListFragmentInteraction(item)
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val binding: FragmentMemoListItemBinding =
            DataBindingUtil.inflate(
                LayoutInflater.from(parent.context), R.layout.fragment_memo_list_item, parent, false
            )
        return ViewHolder(binding)
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val item = mValues[position]
        holder.binding.viewModel = MemoItem(item.id, item.message)
        with(holder.binding.root) {
            tag = item
            setOnClickListener(mOnClickListener)
        }
    }

    fun setData(items: List<MemoItem>) {
        this.mValues = items
    }

    override fun getItemCount(): Int = mValues.size

    inner class ViewHolder(val binding: FragmentMemoListItemBinding) : RecyclerView.ViewHolder(binding.root)
}

 
 
MemoListFragmentのOnCreateViewをDataBidingを使用した形に置き換える。 アダプターの登録をして、viewModelを監視する。 初期値がonResumeでロードされるようにする。

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {

        val binding: FragmentMemoListBinding = DataBindingUtil.inflate(
            inflater, R.layout.fragment_memo_list, container, false
        )
        binding.viewModel = ViewModelProviders.of(this).get(MemoListViewModel::class.java)
        binding.list.adapter = MyMemoRecyclerViewAdapter(arrayListOf(), listener)
        binding.viewModel!!.items.observe(this, Observer {
            val adapter = binding.list.adapter as MyMemoRecyclerViewAdapter?
            adapter?.setData(it)
        })
        this.binding = binding
        return binding.root
    }

    override fun onResume() {
        super.onResume()
        this.binding.viewModel!!.loadItems()
    }

 
 
アダプターでクリック時の処理をしているのでActivityでクリックされたときのMemoItemが取得できる。

override fun onListFragmentInteraction(item: MemoItem?) {
    // 遷移など
}