ごまなつ Blog

楽しく働ける世界を目指して

A Swift Tourをやったメモ

少しスマホアプリに興味が出てきたので、Swiftを触ってみようと思いました。とりあえず最初にA Swift Tourをやってみたのでその感想です。

A Swift Tourで何が学べる?

Swiftの基本文法が分かります。サイトからダウンロードできるPraygroundで実行結果を確認しながら学ぶことができます。

軽くまとめ

動的型付け。変数宣言は var a=42; 定数は let a=42; 型を指定したいときは let a: Double=70; と後ろに型を明示する。

キャストは String(a) 。型を前に書いてキャストしたい変数を()で囲む。

文字内変数展開は "I have (apples) apple."。()で展開したい変数を囲む。文字列を”””(ダブルクォート3つで囲むことでも宣言できる。

配列を var shoppingList = ["catfish", "water","tulips"]で宣言できる。動きはリスト。辞書は

var occupations = [
    "Malcolm" : "Captain" ,
    "Kaylee" : "Mechanic" ,
]

空を作りたいなら let emptyArray=String let , emptyDictionary=[String:float]

型情報が推測できるならshoppingList = []  occupations = [:]

for文はlet individualScores = [ 75 , 43 , 103 , 87 , 12 ] for score in individualScores {}という形。これ、foreach文だよね・・・。

if文はよくある形。nilを許すとvar optionalString : String ? = "Hello"という形にする。nilを使った二項演算子は( nickName ?? fullName )

swiich文もある。switch vegetable{} ()はいらない。

複数の辞書に対するfor文はfor ( kind , numbers ) in interestingNumbers {}

while文もある。()はいらない。do-whileではなくrepeat-while。

for i in 0 ..< 4 {}と、..<を使えばインデックスの範囲を作成できる。

関数の宣言と呼び出し方は

func greet(person : Stirng, day : String)->String{ 
   return "Hello  \ ( person ) , today is  \ ( day ) ."
}
 greet ( person : "Bob" , day : "Tuesday" )

関数の宣言に変数名と型名が必要かつ、呼び出しにも必要。返り値の方は関数宣言の最後に->を伴って書く。

タプルがあり、タプルを関数で使うときは

func calculateStatistics ( scores : [ Int ]) -> ( min : Int , max : Int , sum : Int ) {
    return ( min , max , sum )
}
 let statistics = calculateStatistics ( scores : [ 5 , 3 , 100 , 3 , 9 ])
 print ( statistics . sum )

関数をネストできる。

 func returnFifteen () -> Int {
    var y = 10
    func add () {
        y += 5
    }
    add ()
    return y
}
 returnFifteen ()

関数は型なので、関数を返り値、引数に用いることができる。

map関数がある。

numbers . map ({ ( number : Int ) -> Int in
    let result = 3 * number
    return result
})

let mappedNumbers = numbers . map ({ number in 3 * number })
 print ( mappedNumbers )

 let sortedNumbers = numbers . sorted { $0 > $1 }
 print ( sortedNumbers )

クラスがある。

class NamedShape {
    var numberOfSides : Int = 0
    var name : String

    init ( name : String ) {
        self . name = name
    }

    func simpleDescription () -> String {
        return "A shape with  \ ( numberOfSides )  sides."
    }
}

initは、インスタンスの作成時に呼ばれる関数。 サブクラスの例は

class Square : NamedShape {
    var sideLength : Double

    init ( sideLength : Double , name : String ) {
        self . sideLength = sideLength
        super . init ( name : name )
        numberOfSides = 4
    }

    func area () -> Double {
        return sideLength * sideLength
    }

    override func simpleDescription () -> String {
        return "A square with sides of length  \ ( sideLength ) ."
    }
}
 let test = Square ( sideLength : 5.2 , name : "my test square" )
 test . area ()
 test . simpleDescription ()

getterとsetterを含むこともできる。

列挙体enum、構造体structもある。メソッドを関連付けられる。

protocol(いまいちわからなかった。クラスのようなもの?)

例外処理は、try-catchではなくdo-catch。

let printerSuccess = try ? send ( job : 1884 , toPrinter : "Mergenthaler" )
let printerFailure = try ? send ( job : 1885 , toPrinter : "Never Has Toner" )

という方法も。二項演算子と理解。

defer{ 何かの処理 }を関数内に書いておくと、どこに書いていてもその関数の最後に実行され、エラーをthrowしても実行される。

ジェネリックもある。

 func makeArray < Item >( repeating item : Item , numberOfTimes : Int ) -> [ Item ] {
    var result = [ Item ]()
    for _ in 0 ..< numberOfTimes {
        result . append ( item )
    }
    return result
}
 makeArray ( repeating : "knock" , numberOfTimes : 4 )

次にやること

FoodTrackerというiOSアプリ作成チュートリアルがあるので、それをやろうと思います。

【C#】WritePrivateProfileStringでハマった

WritePrivateProfileStringは、Windowsapi関数でiniファイルを扱う関数の一つです。他には、

  • GetPrivateProfileInt (iniファイルから数値を読みとる)
  • WritePrivateProfileString (iniファイルに文字列を書き込む)
  • GetPrivateProfileSectionNames (iniファイル中のすべてのセクション名を列挙する)
  • GetPrivateProfileSection (iniファイル中の指定されたセクション中のすべてキーと値のペアを列挙する)

といったものがあります。

iniファイルの形式

iniファイルの形式は、以下のようになります。

[section1]
key1 = hoge
key2 = huga
[section2]
length = 3
max = 255

つまり、

[セクション名]
データ1=値1
データ2=値2

といったセクションを並べていくファイル形式です。このファイルに対して、最初に述べた関数を用いることで、セクション名や、任意のセクションのデータを取得・書き込みができます。

陥った状況

WritePrivateProfileStringは、書き込みしようとしたデータのセクションとデータ名があった場合は上書き、無い場合は新規に書くというものです。しかし、

[section1]
key1 = hoge
key2 = huga
[section2]
length = 3
max = 255

に対してsection1のkey1をhogehogeに上書きしようとすると、

[section1]
value1 = hoge
value2 = huga
[section2]
length = 3
max = 255
[section1]
value1 = hogehoge

というように一番上のセクションが認識されないという状況になりました。

そもそも使用を推奨されていなかった

この関数は、16 ビット Windows ベースのアプリケーションとの互換性を保つ目的でのみ提供されています。つまり、使用は推奨されておらず、メンテナンスも行われていません。調べてたどり着くページも古いものばかりでした。

json形式に変更

json形式に変更することにしました。C#ではjsonのシリアライザとデシリアライザが用意されているのでうまく扱えます。

使っている関数が現在のバージョンでサポートされているか、調べることが重要だと感じました。

エンジニアのためのコーチング体験型勉強会Vol.1に参加してきました

7/25に開催された、エンジニアのためのコーチング体験型勉強会Vol.1に参加してきました。 coaching.connpass.com

今回の趣旨

1on1は必要だといわれていますが、受ける側が必要だと感じていないことがあります。なぜこうなってしまうのでしょうか。それは、1on1は目標を達成するための手段であって、することだけに意味があるわけではないからです。また、1on1は技術なので、技術が足りていないのかもしれません。学べば良い1on1をすることができます。しかし、

1on1の技術を学ぶ場がありません。

業務で行うなら、失敗をすると後が大変です。失敗が許されません。今回は、実験の場だと全員が認識したうえで実践するので失敗しても問題ありません。そのトレーニングとしてこの勉強会を開催した、とのことです。

やったこと

  • チェックイン
  • ルール説明
  • 実践
  • 振り返り

チェックイン

最初のチェックインでは、3人一組でグループ分けを行い、自己紹介と今の自分の気持ちと状態を話しました。気持ちと状態は抽象的なので、各人によって話すことが異なり良い質問だと思いました。緊張がほぐれました。

ルール説明

ルール説明と、コーチングで意識することを知りました。 グランドルールは

  • ここは実験の場。失敗する場
  • 守秘義務(あとでこんな人がいた、と言わない)
  • 正しい人、間違っている人はいない

このルールを守ることで、安心して自分の考えたことを試せる環境を作ることができたと思います。最初は、失敗します。ですがだんだんできるようになっていきます。しかし、最初の失敗できる場がないです。今回の場は、失敗できる場でした。

目指すことは、コーチングで動きをもたらすことでした。何で動きをもたらすかというと、問いで動きをもたらします。そして、相手が内面から動き出すようにします。

コーチングのために鍛えることは

  • 好奇心
  • 拡大質問
  • 認知(「あなたは~な人なんですね」など)

コーチは好奇心を持って拡大質問し、クライアント自身の探求の様を傾聴します。 はい・いいえで答えられない開かれた質問、相手が持っている・秘めているものを知る質問を勇気をもって無邪気に質問します。 認知は、自分の直感を信じます。相手の鏡になり、相手の本来ある姿・特性やあり方・深いところを伝えます。当てにいかなくていいです。

承認と認知は異なります。承認は正当かどうかの価値判断が入ります。認知は認めるのみです。

コーチングは、自分にも使えます。

”People are naturally creative, resourceful, and whole.” 人はもともと才知に溢れ、欠けるところのない存在である。 NCRWともいわれます。

実践

3人一組で、コーチ、クライアント、オブザーバーを1回ずつ担当しました。コーチングを実践した後、コーチからひと言、クライアントからひと言、オブザーバーからひと言でした。チェックシートは、

  • 好奇心
  • 拡大質問
  • 認知
  • 良かった点
  • より良くなるとしたらどのような点か

全体での振り返り

  • 認知で、あなたは~な人なんですね、と言われるといい表情になる。自分が気づけていないことに気づくため
  • オブザーバーがいることがとても良かった。コーチとクライアントだけの振り返りでは気づけない点、例えばコーチングをしている中で気づかなかった表情の変化や、質問の有効性などをオブザーバーが教えてくれた

感想

実際にコーチングをやってみる機会はなかなかないので、このような機会が貴重な経験になりました。年上の方にコーチングしましたからね......。自分がコーチングで心がけたことは、

  • なるべく話を遮らない。考えるそぶりや口の動きを見て、動いたら待って話を聞く。動かなければ質問。
  • 相手が話していることをすべて理解しようとしなくてもいい。相手は自分で考えて話している

ということです。会社内で1on1を行うと決まった最初の関係構築段階では雑談で、趣味などについて傾聴して、ある程度関係ができたら仕事や自身の成長のための方策を気づかせるというのが何となくイメージできました。雑談では、質問を行って考えていることや実行していることを聞きます。相手が話してくれます。方策を考える方では、自分自身で答えを見つけることが重要なので、難しいけれど相手がじっくり考えている間待つことを心がけていきたいと思います。

次回があればぜひ参加したいです。普段行っている人は手法を業務で生かすために、行っていない人はコーチングが良いものだと気づく良い経験になると思います。私は後者ですが、良い経験になりました。

コーチングが必要ない、という人について

私の考えでは、自分で課題を設定できている人や上司と話すことに抵抗感がある人が必要ないといっているのではないかと考えています。また、頻度が高すぎて、話すことがないという声も聞いたことがあります。しっかりとしたコーチングをやり、たまに雑談があるというのが良いのではないかと思います。メンバーが求めたときが一番いいと思いますが、メンバーは言い出しにくいことがあるので定期的な実施が現実的ですかね。

無限LT会 #2 【まだLT事前に作ってんの!?】に参加してきました

oysters.connpass.com 参加してきました。

他人のLTを聞きながら自分のLTを作る

他人のLTを聞きながら自分のLTを作る、事前にLTスライドを準備しない、こんなことが許される会があるのでしょうか?あります。それが無限LTです。

自分のLT

speakerdeck.com 音ゲーマーのやっていることはPDCAだと言いたかった。それだけ。

speakerdeck.com ら抜き言葉について考えていることを言いました。サ変では「られる」にならないので、そもそも「ら」が入っていることがイレギュラーという主張もあります。

speakerdeck.com 運動しようと思って周りを走って膝を壊す人をよく聞くので、陸上競技経験者として長距離を走る時の注意点をいくつか挙げました。

個人的お気に入りLT

speakerdeck.com

面白Tシャツ、自分も着てみようかなという気持ちにさせてくれました。Tシャツは簡単に印刷できるようなので、面白いものを思いついたら自分で印刷を頼むのもいいかもしれないですね。

今回の形式

今回は、

  • 事前に自己紹介と1回目のLTスライドを用意
  • 自己紹介の際に自分の持ってきたLTのネタを示して、投票して多かったものを2回目、3回目で発表(前日からのスライド準備は禁止、その場で作る。内容は事前準備可)
  • LTが1巡したら、休憩とスライド作成時間を兼ねた黙々タイムがある

という形式でした。LTを聞きながら、内容に関してツイートしつつ自分のスライドを作る。大変ですね。ですが、これが楽しい部分です。作成のために使える時間、発表時間に合わせて、その状態にあった質のスライドを作成する能力をつけていきたいですね。

感想

エンジニアが集まっているため実用的な内容が評価高いですが、テーマが限定されていないLT会ですので私は趣味の話をしていきたいです。ずっと実用的な話だと疲れますし、聞き流してもよい内容だと休憩になると考えています。実用的な話から趣味、ネタ、興味深い内容、面白い話まで、いろいろな話が聞ける会であってほしいなと考えています。

【C#】ヒアドキュメント(逐語的文字列リテラル:@””)の使い方

ヒアドキュメントとは、\や”などの特殊文字エスケープシーケンスを必要とせず、改行を含むことができる文字列の記述法です。C#においては、文字列でヒアドキュメントができますが、「逐語的文字列リテラル」「ヒアストリング」「@-quoted string」と呼ばれています。

ファイルパスでよく使われます。\がファイルパスに使われているからです。

記述法

文字列リテラルの前に@をつけるだけです。

通常の文字列では、\を表示するためにはエスケープシーケンスの\をつける必要があります。

string filepath = "C:\\hoge\\hogehoge"

先頭に@をつけると、この書き方で宣言できます。

string filepath = @"C:\hoge\hogehoge"

改行を含んだ文字列は

string mail = "○○様\n○○です\nお世話になっております。"

string mail = "○○様
               ○○です
               お世話になっております。"

と書けます。 改行に関しての注意点は、インデントのための空白も文字列に含まれてしまう点です。ですので、空白を取り除くメソッドを作ってそれに読ませるか、改行後の文字列を左詰めで書いてください。

改行を文字列に含むことができるのは、SQL文に役立ちます。SQL文を文字列で宣言するとき、

string sql="SELECT * FROM hogeTABLE";
sql+= "WHERE hoge =A AND hogehoge=B";
sql+="ORDER BY ASC;";

のように+=で文字列をつなげていたり、

string sql=new StringBuilder();
sql.Append("SELECT ");
sql.Append("          * ");
sql.Append( "FROM ");
sql.Append("          hogeTABLE");
sql.Append("WHERE ") ;
sql.Append("hoge =A AND hogehoge=B");
sql.Append("ORDER BY ASC;");

のようにAppendでつなげたりしますが、

string sql=@"SELECT * FROM hogeTABLE WHERE hoge =A AND hogehoge=B ORDER BY ASC;"

のように1行で書くことができます。

まとめ

文字列リテラルの前に@をつけると\や”などの特殊文字エスケープシーケンスを必要とせず、改行を含むことができる文字列になる。ファイルパスやSQL文で便利。

.NET フォームアプリ ListViewに編集不能な項目を表示したい

.NETのフォームアプリにおいて、ListViewの中に編集不能な項目を表示する必要がありました。具体的には、ListViewに表示した項目でチェックボックスが入っているものに対してのみ操作をする状況で、その中に編集不能な項目を表示する必要がありました。ListViewには、1つの項目に対するEnabledプロパティがありません。どうやって実現したかの記録です。

結論

変更イベントが起きたら、変更前の状態に強制的に設定する。

private void listView_ItemChecked(object sender, ItemCheckedEventArgs e)
        {
            if (listView.Items[0].Checked == false)
            {
                listView.Items[0].Checked = true;
            }
        }

        private void listView_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (listView.Items[0].Selected == true)
            {
                listView.Items[0].Selected = false;
            }
        }

listView.Items[0]はListViewの1つ目の項目です。チェックが入っている状態をキープしたいので、チェックボックスの値が変更されたイベントが起こったときチェックが外されているとチェックを入れます。 選択された状態にもならないように、選択項目が変更されたイベントが起こったとき選択された状態だと選択を外します。

無理やりではありますが、単純に考えるとこの方法が分かりやすいですし直感的だと思います。

2日連続マウスについて登壇してきました

マウスについて2日連続の勉強会で登壇してきました。「鍵盤のお伴に注目する」は時間の関係で短めに、「あなたの知らないマウスの世界」は私がマウスについて話したかったことの完全版です。

こちらは参加者の方々に、前に立って話しました。 willgate.connpass.com

マウスの持ち方と自分の好きなマウス・マウスパッドを紹介する内容でした。マウスの持ち方については知らなかったとの声があり、紹介してよかったなと思いました。前に立って話すとやはり緊張しますね……。

反省点

  • 自己紹介や前置きに時間をかけすぎたことで、終盤がほぼ話せませんでした。こだわりのマウス・マウスパッドの話をしたかったのですが……。
  • 話したいことは多くあるので、時間内に収まるように話さない内容を決めたり、時間をかけない部分を予め決めておくようにしようと思いました。

こちらは参加者が少人数だったこともあり、一つの机で座談会のようにして行いました。 supporterzcolab.com

こちらは、マウスの話の完全版です。マウスの種類、持ち方、選び方、マウスパッドの要素、リストレストの注意点について話しました。少人数だったため適宜質問が出てフィードバックがあり、精神的な面でかなりやりやすかったです。

反省点

  • 和気あいあいと進めすぎて、話が脱線した
  • 質問をする人が固定化していて、それ以外の人が質問しにくくなっていた

なぜマウスについて登壇しようと思ったのか

デスクワーカーでPCを使う人は、キーボードかマウスを必ず触っています。長く触れている椅子にはこだわる方が多いのに、キーボードとマウスにこだわる方は少ないです。最近では、エンジニアを中心にキーボード界隈が盛り上がっています。キーボードにこだわる方は増えましたが、マウスにこだわる方は少ないです。どちらもこだわったほうが快適なデスクワークができるので、マウスにこだわってみませんか?という提案をしたかったからです。

最後に

マウスとキーボードにこだわる話をしたので、次はモニターかな?

登壇は1回目の障壁が大きいですが、ぜひやってみてください。1回登壇すると、障壁はかなり低くなります。技術的でない登壇ができる勉強会は意外とあります。登壇に対する心理的な抵抗をなくせば、技術的なネタができれば技術的な登壇もしていけます。自分の知見を知らない人に伝えて、自分が知らない知見を教えてもらいましょう!