OmniAICreator/Qiita-1.07M huggingface dataset:
@Qiita や @Twitterでエンジニア仲間がほしい？プロフィール画像で「ジャケフォロー」はいかが？

# Qiitaでよく話す人のアイコン

謎に切れ切れのスクショ‥m(_ _)m

![image](https://user-images.githubusercontent.com/13635059/50569964-d8dd3f80-0db9-11e9-96c8-0a4d1b3a443a.png)

@tommy_aka_jps さん

![image](https://user-images.githubusercontent.com/13635059/50569966-e1357a80-0db9-11e9-9533-878115891ae6.png)

@developer-kikikaikai さん

# me

mario好き
ドット好き
インベーダーも好き

![image](https://user-images.githubusercontent.com/13635059/50569960-bba87100-0db9-11e9-94c6-d2f0c878e45a.png)

![image](https://user-images.githubusercontent.com/13635059/50569987-04145e80-0dbb-11e9-90f5-6d1931acbba4.png)


# 結果論だけど、実は趣味が合うのでは‥？と思った

- 同じものを好きな人は同じ趣味趣向、関心を持っている傾向が高いし、フィーリングも合う可能性が高い
- それを全て代弁するものは何か？プロフィール画像ですよ
- 誰をフォローする？技術分野でフォローする？Contributionsが多いユーザーをフォローする？いやジャケフォローでしょ！

# 偶然なんか信じないって？

- 偶然を信じる人の行動と信じない人の行動は異なる、すなわち行動が替わり、結果が変わる
- 茂木健一郎がいうところのセレンディピティだが、こんな言葉を出すと自己啓発チックだよね
- 技術分野がどうこうよりも気の合う人とエンジニア雑談とかしたり、未来について語るほうがずっと楽しいよhappyhackinglife :)


---

https://github.com/YumaInaura/YumaInaura/








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Web書道のWiki書道って何？ Wikipediaのおまかせ表示機能のフィルタ‥天才的アイディア。 @web_shodo

http://web-shodo.com/wikishodo.php

![image](https://user-images.githubusercontent.com/13635059/50569903-99f9ba80-0db6-11e9-94d1-99746cd267a4.png)

# なんか来た！

![image](https://user-images.githubusercontent.com/13635059/50569929-b64a2700-0db7-11e9-9ddb-15e27a40d103.png)


# なんか来た！

![image](https://user-images.githubusercontent.com/13635059/50569930-b8ac8100-0db7-11e9-997a-ea1a9dc06c16.png)


# Wikipediaのランダム表示機能とWeb書道を組み合わせているっぽい？と想像

http://ja.wikipedia.org/wiki/%E9%AB%98%E6%A9%8B%E6%95%A6%E5%8F%B2

>高橋敦史
>出典: フリー百科事典『ウィキペディア（Wikipedia）』
>ナビゲーションに移動検索に移動
>高橋 敦史（たかはし あつし、1972年7月8日 - ）は日本のアニメーション監督、アニメーション演出家。

# おまかせ表示
これこれ。
![image](https://user-images.githubusercontent.com/13635059/50569932-dda0f400-0db7-11e9-9ddf-ecd7bf194724.png)

# URLは？

ページ表示する時に、既に次のページが決定されているっぽい。

ジャンプ用のURLが存在するとかじゃなかった‥！

さーばーさいどばんざい🙌

https://ja.wikipedia.org/wiki/%E7%89%B9%E5%88%A5:%E3%81%8A%E3%81%BE%E3%81%8B%E3%81%9B%E8%A1%A8%E7%A4%BA

# 実装はscrapingとか？

未調査。

HTMLのid的に簡単に取れそうではある！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/f8bf65a2-4e84-beec-40d2-a140d00f0b3b.png)


---

https://github.com/YumaInaura/YumaInaura/

https://github.com/YumaInaura/YumaInaura/issues/116








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
脳のフラッシュメモリが少ないエンジニアはGoogleChromeのタブを爆速で閉じる

![image](https://user-images.githubusercontent.com/13635059/50569865-33c06800-0db5-11e9-8700-a08ceca1bd34.png)

# タブが5個あるともう無理

- 何かの待ち時間にどんどん閉じて爆速で整理していく
- Chromeのタブが乱雑に並ぶことによる脳のコストが半端じゃない
- ちゃんと整理して管理すれば？という話かもしれないけど、僕の脳にはそれは無理だと叫びたい

# 脳の短期記憶、チャンク数の違い

- 脳のメモリ数というか短期記憶のチャンク数には人によって幅があり、3個から7個ぐらいと言われているらしい
- これだけだと少ない違いに感じられるかも知れないが `3^3` `7^3` のように、倍々になっていくと圧倒的な違いになる
- 僕もQiitaなどに記事を書いていて 3 という数字が最強だと感じているので、短期記憶のチャンクは 3 なのかも、個人のコンディションによっても上下するらしいけど

# GoogleChromeのタブを200個管理するスーパーエンジニア

- 彼の話を前に書いたけれど、これは脳のチャンク数がそもそも多いのではないかという結論
- 短期記憶、フラッシュメモリ容量が少ないなら少ないなりに、爆速でバッファを捨てるTIPSを積み重ねれば良い！
- 人間の脳はそれぞれ多様性を持っているので、人のやり方が自分でもうまくいくとは限らない、自分の脳をハックしよう！(あれ、言い方合ってる…！？

# この記事も見出しが4個以上になると

- もう辛いから
- 次の記事をPostして切り刻みたい感じがしてくる
- 辛さを感じたら切り分けるんだ‥粒度、もう辛い‥かゆ‥


---

https://github.com/YumaInaura/YumaInaura/

https://github.com/YumaInaura/YumaInaura/issues/115








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
エンジニア・プログラマに学んでほしい速読・スローリーディング・ディープリーディング

# Inspired

[積ん読回避の勉強法 - Qiita](https://qiita.com/guitar_char/items/216d7b91dc649c278094#comment-82ac9a9f700d5cc964c0)

# 情報の取捨選択には速読がオススメ

- 僕も一時期、高校生時代に勉強して読書スピードが5倍ぐらいにはなった。
- スピードの話もそうだが、それよりも情報を取捨選択する根本的な習慣が出来たのでオススメ。
- 読むのが速すぎて理解が浅くなってしまう傾向もあるので、とりあえずキャッチするときの情報収集には特におすすめ。

![image](https://user-images.githubusercontent.com/13635059/50569739-fce85300-0db0-11e9-8524-de792f0c68f8.png)

# スローリーディング、ディープリーディング

- 速読的な情報キャッチで見つけた「これは！」と思う一文を深く考えてみる
- 1センテンスだけを読んで、あとは歩いたりしながら、頭の中でリフレインする
- 感動する文章に出会ったらYoutube動画やTwitterで動画撮影、音声を吹き込むとさらにアウトプットな感じでfeelin godd

![image](https://user-images.githubusercontent.com/13635059/50569855-b4329900-0db4-11e9-8579-8bad6da16262.png)



---

https://github.com/YumaInaura/YumaInaura/








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
エンジニアの 「積ん読回避の勉強法」は 本をWebのように読む。

[積ん読回避の勉強法 - Qiita](https://qiita.com/guitar_char/items/216d7b91dc649c278094#comment-82ac9a9f700d5cc964c0)

# 本をWebのように読む。

贅沢なやり方だが、そうしないとWebより劣る。
書籍の質が5倍高くても、10倍無駄な場所、必要ない場所を読んでいたらやばい。
つまみぐいをすれば時間対学習度の比率は高くなるが、お金対学習度の軸で考えると辛いかも。
![image](https://user-images.githubusercontent.com/13635059/50569820-bfd19000-0db3-11e9-9d05-c54117639da6.png)

![image](https://user-images.githubusercontent.com/13635059/50569817-b811eb80-0db3-11e9-8f21-343c417bdeec.png)

# 情報価値の高い「書籍」の最大の欠点は

「本」という媒体からイメージする固定概念。
頭から尻尾まで食べなければいけないというお魚固定観念。
そうではなくアメンボみたいに飛び回って、つまみぐいして良いんですよ。
![image](https://user-images.githubusercontent.com/13635059/50569809-7da84e80-0db3-11e9-8c5b-b71cc28a7374.png)

#  読書の固定概念を崩すには何の勉强をしたら良いの？

速読の勉强がオススメ。
僕も一時期、高校生時代に勉強して読書スピードが5倍ぐらいにはなった。
スピードの話もそうだが、それよりも情報を取捨選択する根本的な習慣が出来たのでオススメ。
読むのが速すぎて理解が浅くなってしまう傾向もあるので、とりあえずキャッチするときの情報収集には特におすすめ。
スローリーディング、1センテンスだけを読んで、あとは歩いたりしながら、深く考えるディープリーディングの技術もあわせて使っていくと良いと思う。

![image](https://user-images.githubusercontent.com/13635059/50569739-fce85300-0db0-11e9-8524-de792f0c68f8.png)

---

https://github.com/YumaInaura/YumaInaura/








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Androidでアプリ起動時に一度だけ処理したいときの対処法（Applicationクラスのオーバーライド）

アプリケーションの起動時に一回だけ初期化処理などをしたい場合などは下記の方法でできます。
ちなみに自分はとあるライブラリの初期化処理を複数のActivityのonCreate() で呼び出していたら、Warningが出て怒られたので下記の方法で修正しました。

# Applicationクラスを継承する

ファイル名は何でも良い。
アプリを起動したときに一度だけ処理したい場合は、``onCreate()`` をオーバーライドする。

```MyApplication.java
public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();

        // ここに初期化処理などを書く
    }
}
```

# 継承したファイルをManifestに登録する

``<application android:name>`` に作成したファイルのパスを書く。

```AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    package="(パッケージ名)"
    ....
    >
    <application
        android:name=".MyApplication"
        ....
        >
       ....
    </application>
</manifest>
```

以上で終わりです！

# 参考リンク
- [Applicationクラス - Android Developers（公式）](https://developer.android.com/reference/android/app/Application)
- [\<Application\>要素 - Android Developers（公式）](https://developer.android.com/guide/topics/manifest/application-element)
atomを使っていたら日本語入力ができなくなった＋解決策

#状況
ブラウザなどから切り替えてatomに戻ると，日本語入力ができなくなった．

具体的には，
Markdown Preview Plusとmathjax-wrapperを使って，markdownの記事を書いていた時．

#解決策
atomに戻った後IMEが無効になっていたので，
Windowsマーク + R → ctfmon.exe
からIMEを有効にすれば治った．

#原因
わからない．
@Qiita のTwitter通知。ツイート内容にアカウント名を埋め込むだけじゃダメ‥？


# アカウント名は入らない

![image](https://user-images.githubusercontent.com/13635059/50569628-4898fd80-0dad-11e9-9ec6-975c505f9097.png)


# Qiitaは ユーザーごとに Twitter のアカウントを知っているはずでは…？

- それを埋め込むだけで、Qiita内部的な通知は不要になるんじゃないだろうか。
- Qiitaの今のTwitter通知は、誰がどこでツイートしたかも分からないけれど、Twitterで完結させた方が気付きやすいんじゃないだろうか。
- Twitter利用ユーザーはどうせTwitterを使うし、そこで気づければokなんじゃないだろうか。

# 外部に委ねられるものは全て委ねる

- MediumでもPost後のTwitter連携が内部処理からTweetボタンに変更された
- はてなブログもPost後にTwitterボタンが表示される仕様
- Qiitaみたいに内部連携しているとユーザーは便利ではあるが、サービス実装側のコストは高くなりそう
- ボタン設置せず連携させる場合はIFTTTのような第三の選択肢に委ねる方法も(あれってサービス側の実装は大変だったりするんだろうか)




---

https://github.com/YumaInaura/YumaInaura/
https://github.com/YumaInaura/YumaInaura/issues/111








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
JSの日付の条件分岐について

JavaScriptで１月１日から表示する項目をDateを使って出し分けようとしたが、うまくできてなかったので、今後同じことを起こさないためのメモです。

今回のリリースで日付をDate関数をしようして条件分岐をしようとする時に注意した点は以下の２点です。
・月は0〜１１までで１か月マイナスされた数字としてしようされる。
・0埋めする必要がある。
まず、月は１〜１２月ではなく０〜１１として扱われる。
これはおそらく英語圏では１〜１２月ではなくJanuaryなどの表現が用いられるからだろう。
そして、基本的な0埋めだが、11月１１日など一桁の月日がない時に開発するとついつい忘れてしまいがちになる。
特に今回の開発は疲れが溜まっていて注意力が落ちていたのでスルーしてしまった。
今後は気をつけたい。
Qiitaで自分のContributinランキングが分かる最強システムの秘密とは‥？ RT @mogya

https://mogya.github.io/qiitaRank/

>エンジニアランキング
vQiitaのcontributions値から,日本でどのくらいのエンジニアなのかを見積もります

@mogya さん

# どんなAPI連携とか使ってるんだろう？ OAuth ？

- 手入力だよ！
- 名前取得もContribution数も手入力。
- 素晴らしさ。

![image](https://user-images.githubusercontent.com/13635059/50569526-7af52b80-0daa-11e9-8613-8e941b34c6f3.png)

# 結果

![image](https://user-images.githubusercontent.com/13635059/50569531-8fd1bf00-0daa-11e9-9d81-27a9a473d6b3.png)

# Twitter連携は？

もちろんボタン一つ置くだけ。

![image](https://user-images.githubusercontent.com/13635059/50569534-9eb87180-0daa-11e9-956c-28bb3623c217.png)

# いらすとは？

いらすとや。

# 学んだこと

- 実装コスト最小化。裏技、抜け道がないかをいつも考えたい。
- API がどうとか言わなくても実現できるシステムってあるじゃん！！！
- 何か実現したいことがあったら「とりあえず動く」を優先したい。エンジニア的発想に縛られてはいけない‥というか、それで何も実装できなくなるのがサービスってものじゃないか。

# 社会システム

- Qiitaにそもそも Oauth的 連携機能ってないんだっけ？ まあどちらにしてもTwitterにつぶやく時は自己申告だし。
- 全部自己申告でも良いんじゃないの？ そこで嘘ついてもしょーもないし。
- プログラミング的システムに任せられないところは「ソーシャル」「社会性」「善意」のシステムにまかせてみては？


---

https://github.com/YumaInaura/YumaInaura/

https://github.com/YumaInaura/YumaInaura/issues/110








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Webアプリ開発を試したいJSライブラリ

自分が試したいJSライブラリをメモ（2019）
**[howler.js](https://howlerjs.com/)**
オーディオスプライトによる制御可能 > オーディオ機能/音楽

```
var sound = new Howl({
  src:['sound.mp3']
});
sound.play();
```
play()関数など用意されている

```
var sound = new Howl({
  src:['sound.mp3'],
  autoplay:true, 
  loop:true,
  volume:0.5,
  onend: function() {
    console.log('音楽は終了しました');  
}
});
```
*[「howler.js」https://howlerjs.com/](https://howlerjs.com/)

----
**[jPList](https://www.jplist.org/)**
HTML要素を自由にソート・フィルタリングできる

```
<div 
  style="display:none"
  data-jplist-control="hidden-sort"
  data-group="sort-list"
  data-path=".name"
  data-order="asc"
  data-type="text">
</div>
```

- [examples](https://www.jplist.org/examples/nature)
- [使い方](https://www.jplist.org/documentation/getting-started)

-----
**[jKanban](http://www.riccardotartaglia.it/jkanban/)**
Trelloのようにドラッグ＆ドロップで任意のタスクを移動させながら進捗情報管理ができるWebアプリを簡単に構築

```
const defaultBoards = [

   {
       "id": "sample-board-1",
       "title": "タスク",
       "item": [
           { "title": "報告書の作成" },
           { "title": "14時から打ち合わせ" }
       ]
   },
   {
       "id": "sample-board-2",
       "title": "進行中",
       "item": [{ "title": "○○案の企画書作成" }]
   },
   {
       "id": "sample-board-3",
       "title": "完了",
       "item": [{ "title": "日報の提出" }]
   }

];
```
**[lightgallery.js](https://sachinchoolur.github.io/lightgallery.js/)**
ギャラリー系のJavaScriptライブラリ

```
<div id=”lightgallery”>

   <a href=”1枚目の画像パス”>
       <img src=”1枚目の画像パス”>
   </a>

   <a href=”2枚目の画像パス”>
       <img src=”2枚目の画像パス”>
   </a>

   <a href=”3枚目の画像パス”>
       <img src=”3枚目の画像パス”>
   </a>

</div>
```

```
lightGallery(document.getElementById('lightgallery'));
```
-----
**[Microlink](https://microlink.io/)**
普通のリンク要素をリッチな可視化ツールに変えるライブラリ


-----
**[GrapesJS](https://grapesjs.com/)**
HTMLコンテンツをドラッグ＆ドロップで組み立てるだけでWebサイトを制作できるオーサリングツール

```
<div id="gjs"></div>
```

```
var editor = grapesjs.init({

   container : '#gjs'

});
```

- [GitHub] (https://github.com/artf/grapesjs)

---
**[CMS.js](http://chrisdiana.github.io/cms.js/)**
最後にGitHubと連携したブログをJavaScriptで簡単に構築できるライブラリ

---

参照：paiza開発日誌
[簡単にJavaScriptでSPAのブログを構築して公開できるライブラリ「CMS.js」を使ってみた！]
(https://paiza.hatenablog.com/entry/2018/12/12/%E7%B0%A1%E5%8D%98%E3%81%ABJavaScript%E3%81%A7SPA%E3%81%AE%E3%83%96%E3%83%AD%E3%82%B0%E3%82%92%E6%A7%8B%E7%AF%89%E3%81%97%E3%81%A6%E5%85%AC%E9%96%8B%E3%81%A7%E3%81%8D%E3%82%8B%E3%83%A9%E3%82%A4%E3%83%96)

---

参照：paiza開発日誌
[個人でWebアプリを開発する時に便利な高機能JavaScriptライブラリ6選！](https://paiza.hatenablog.com/entry/2018/12/26/%E5%80%8B%E4%BA%BA%E3%81%A7Web%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E9%96%8B%E7%99%BA%E3%81%99%E3%82%8B%E6%99%82%E3%81%AB%E4%BE%BF%E5%88%A9%E3%81%AA%E9%AB%98%E6%A9%9F%E8%83%BDJavaScript%E3%83%A9%E3%82%A4)
Mac上でWindowsのコマンドラインアプリをビルドする

Chicken Schemeがファイルパス関係でどう動作するか確認したかったんだけど、Wineを使ううえで少しだけ手間取ったのでメモ。

Mac上で動作するWineにはいくつか種類があるようなのだが、今回は日本語に対応しているというEasyWineをインストールした。ちなみにNihonshuとゆうのはよく分からないのでインストールしてない。

これを起動するとファイルエクスプローラみたいなのが立ち上がる。ここから試しにC:\windows\system32\cmd.exeを起動してみたが、これが全くキー入力を受け付けない。なので、ConEmuというターミナルソフトをインストール。インストールは普通にFinderからインストーラのファイルを開けばEasyWineが実行してくれる。

初期状態ではフォントが可変ピッチで表示が崩れていたので、Andale Monoとゆうフォントに変更した。キー入力の反応がもたつくがそれ以外は普通に動作する。

Chicken Schemeはコンパイルにgccを使うので、一応MinGWもインストール。なぜかSourceForgeからだとインストーラがダウンロードできなかったので、OSDNの方を利用した。	

環境変数PATHの設定にはC:\windows\regedit.exeを使用した。キーの場所はHKEY_CURRENT_USER\Environment。ちなみにフォントのカスタマイズはHKEY_CURRENT_USER\Software\Wine\Fonts\Replacements。

最後蛇足だが、俺が昔作ったフリーソフトを実行してみたところ全部正常に動作した。すげーなEasyWine。

いじょう
メインフレーム / オープンシステム / クラウド 「インフラCI実践ガイド」 学習まとめ

# 試し読み

[インフラCI実践ガイド Ansible/GitLabを使ったインフラ改善サイクルの実現 立ち読み｜翔泳社の本](https://www.shoeisha.co.jp/book/preview/9784798155128)

# メインフレームとは？

「一部の」基幹システム
社会インフラ

という書き方がされている。

# オープンシステムとは？

「インターネット業務システム」という言い方がされている。

これがメインフレームの上に乗る？

# クラウド時代

ご存知の通り。

オープンシステム、メインフレームが基盤にあってクラウドが成り立つと理解した。(当たり前のことを書いてしまった)

# 20年周期で大きな変化が起きているらしい。

今はクラウド時代の中盤ぐらい？

# メインフレーム オープンシステム で Google image search

メインフレームがオープンシステムと連携しているらしき図が出てくる。

![image](https://user-images.githubusercontent.com/13635059/50569112-842dca80-0da1-11e9-926b-2b352d3ab398.png)

# 何気に試し読むでもテキスト検索できるという

![image](https://user-images.githubusercontent.com/13635059/50569151-dcfd6300-0da1-11e9-8518-3a7c282b6a7e.png)


---

https://github.com/YumaInaura/YumaInaura/

https://github.com/YumaInaura/YumaInaura/issues/108








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Pythonオブジェクトのどのメソッドが呼ばれてるか見る

MagicMock を使い、 `mock_calls` の値を確認すればいい。
例えば `len()` 関数ではオブジェクトの `__len__()` メソッドが呼ばれる：

```python
Python 3.7.2 (default, Dec 27 2018, 07:35:52)
[Clang 10.0.0 (clang-1000.11.45.5)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from unittest.mock import MagicMock
>>> m = MagicMock()
>>> len(m)
0
>>> m.mock_calls
[call.__len__()]
```

for では `__iter__()` が呼ばれる：

```python
>>> m = MagicMock()
>>> for i in m:
...     print(i)
...
>>> m.mock_calls
[call.__iter__()]
```

なお、記録されるのはメソッド呼び出しであり、属性値を読み出しただけだと記録されない。

```
>>> m = MagicMock()
>>> print(m.__doc__)

    MagicMock is a subclass of Mock with default implementations
    of most of the magic methods. You can use MagicMock without having to
    configure the magic methods yourself.

    If you use the `spec` or `spec_set` arguments then *only* magic
    methods that exist in the spec will be created.

    Attributes and the return value of a `MagicMock` will also be `MagicMocks`.

>>> m.mock_calls
[]
```
VisualStudio CodeでNode.js(Express+Pug)の開発環境を構築する

# Windows PCでVisualStudio Codeを使ってNode.jsの開発環境を構築する
　Windowsで、Node.js+Express+Pugな開発環境を構築する方法のメモです。
　Node.jsの開発方法はいろいろとありますが、ここではExpressと言うMVCフレームワークを使います。
　また、ViewにはJadeの後継(?)であるPugを使います。Pugは、htmlタグの入力を簡単にしてくれます(正確にはhtmlタグを使わない)。また、テンプレートの継承、読み込みなどができるので、Viewの管理を楽にしてくれます。

## VisualStudio Codeをインストールする
　まずは、何より、下記URLからVisualStudio Codeをダウンロードしてインストールします。
https://code.visualstudio.com/
## VisualStudio Codeを日本語化する
　必須ではありませんが、日本語の方が落ち着くと言う方は日本語化しましょう。
1.VisualStudio Codeを起動する
2.拡張機能アイコンをクリックします。
 ![image.png](https://qiita-image-store.s3.amazonaws.com/0/334727/3fbc5af7-7597-3f3c-871e-b4230ee5bef1.png)
3.Japanese Language Pack for Visual Studio Codeをインストールします。

## Gitをインストールします。
　Gitを下記URLからインストールします。
https://git-scm.com/

## Node.jsをインストールします。
　Node.jsを下記URLからインストールします。
https://nodejs.org/ja/

## VisualStudio Codeの拡張機能に以下のものをインストールします。
 ![image.png](https://qiita-image-store.s3.amazonaws.com/0/334727/3fbc5af7-7597-3f3c-871e-b4230ee5bef1.png)
- ESLint
- Node.js Modules Intellisense
- DotENV

## VisualStudio Codeでソースファイルを保存するフォルダを開きます。
　エクスプローラで、ソースファイルを保存するフォルダを作成して、VisualStudio Codeにドラッグ&ドロップします。

## Node.jsの初期セットアップを行います。
> npm init -y

## Expressをインストールします。
> npm install express --save

## Express Generatorをインストールします。
> npm install express-generator --save

## pugをインストールします。
> npm install pug --save

## Express+Pugの初期コードを生成します。
　Express Generatorの初期生成Viewはjadeになるので、--viewオプションを付けてPugにします。
> express --view=pug

## dotenvをインストールします。
> npm install dotenv --save

## nodemonをインストールします。
> npm install nodemon -g

## 依存関係にあるパッケージをインストールします。
> npm install

## dotenvを読み込みます。
app.jsを開いて、下記コードを「var logger = require('morgan');」の下に追加します。
```node.js:app.js
require('dotenv').config();
```
kerasを用いたmnist手書き数字認識の実装

```mnist_with_keras.py

from __future__ import print_function
import numpy as np
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense,Dropout,Activation
from keras.optimizers import SGD
from keras.utils import np_utils

np.random.seed(1671)#for reproducibility

#network and training
NB_EPOCH = 250
BATCH_SIZE = 128
VERBOSE = 1
NB_CLASSES = 10#number of outputs = number of digits
OPTIMIZER = SGD()#optimizer, elained later in this chapter
N_HIDDEN = 128
VALIDATION_SPLIT = 0.2#how much TRAIN is reserved for VALIDATION
DROPOUT =0.3

#data:shuffled and split between train and test sets
(X_train,y_train),(X_test,y_test) = mnist.load_data()

#X_train is 60000 rows of 28×28 values --> reshaped in 60000×784
RESHAPED = 784
#
X_train = X_train.reshape(60000,RESHAPED)
X_test = X_test.reshape(10000,RESHAPED)
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')

#normalize
X_train /= 255
X_test /= 255
print(X_train.shape[0],'train samples')
print(X_test.shape[0],'test samples')

#convert class vecctors to binary class matrices
Y_train = np_utils.to_categorical(y_train,NB_CLASSES)
Y_test = np_utils.to_categorical(y_test,NB_CLASSES)

#M_HIDDEN hidden layers
# 10 outputs
#final stage is softmax
model = Sequential()
model.add(Dense(N_HIDDEN,input_shape=(RESHAPED,)))
model.add(Activation('relu'))
model.add(Dropout(DROPOUT))
model.add(Dense(N_HIDDEN))
model.add(Activation('relu'))
model.add(Dropout(DROPOUT))
model.add(Dense(NB_CLASSES))
model.add(Activation(('softmax')))
model.summary()

model.compile(loss='categorical_crossentropy',
             optimizer = OPTIMIZER,
             metrics=['accuracy'])

callbacks=[make_tensorboard(set_dir_name='keras_MNIST_V3')]

model.fit(X_train,Y_train,
         batch_size=BATCH_SIZE,epochs=NB_EPOCH,
         callbacks=callbacks,
         verbose=VERBOSE,validation_split=VALIDATION_SPLIT)

score = model.evaluate(X_test,Y_test,verbose=VERBOSE)

print('\nTest score:',score[0])
print('Test accuracy:',score[1])
```
CGIを使ってフォームに入力した値を計算する

# CGIを使ってフォームに入力した値を計算する

## 作成した背景

自分はギターが好きなのだが、BPM毎にディレイタイムの計算をするのが面倒くさいので雑に設定をしていた。
しかし、ある程度は正確に刻みたいと思いディレイタイムを計算するプログラムを作ることにした。

## 実行結果
[こちら](http://valuepub.net/service/calc/index.html)からどうぞ！

## 仕様
HTMLのテキストボックスに入力したBPMをPOSTして、ディレイタイムの計算結果を出力する。

## 工数
Python: 2h
php: 1h
※ほとんど調査とテストに時間を使っており、実装はあまり掛かっていない。

## 実装

### 共通内容
入力フォームとなるHTMLは共通するのでここに記述する。

```html:index.html
<html>
    <head>
        <meta charset="utf-8">
        <title>BPMからディレイタイムを計算する</title>
    </head>
    <body>
        <h1>BPMからディレイタイムを計算する</h1>
        <p>
            BPMを入力して計算ボタンを押すとディレイタイムが表示されます。<br>
            付点8分音符のディレイを作りたいときにお使いください。
        </p>
        <form action="./cgi-bin/delaytimecalc.php" method="POST">
            <input type="text" name="bpm" value="" /> BPM<br>
            <input type="submit" name="submit" value="計算する"/>
        </form>
    </body>
</html>
```

### Python
XREAにアップロードしたがなぜか実行できなかった。
現在、XREAの公式サイトに問い合わせ中ではあるが、解決したら加筆する。

#### 参考情報
[XREAの仕様](https://www.xrea.com/spec/)
ファイルやディレクトリのパーミッションの設定は問題ない気がする。
拡張子を.pyではなく.cgiにせよというブログもあったのだがどれが合っているのか判断できない。
公式サービスに直接問い合わせてみる。

### PHP
こちらはXREAにアップロードして実行できたので代替案として現在稼働させている。

```php:delaytimecalc.php
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>付点8分音符のディレイタイム</title>
    </head>
    <body>
        <p>
            <?php
            print "BPMが" .$_POST['bpm']. "のときエフェクターのディレイタイムを下記の様に設定してください。";
            ?>
        </p>
        <table border="1.0">
            <tr>
                <th>音符</th>
                <th>ディレイタイム</th>
            </tr>
            <tr>
                <td>付点8分音符</td>
                <td>
                    <?php
                    $delaytime = 60 / intval($_POST['bpm']) * 0.75 * 1000;
                    print $delaytime . " ms";
                    ?>
                </td>
            </tr>
        </table>
    </body>
</html>
```

## 感想

### 今後
FLASKなどを使ってWebサービスを組んでみたい。

### 疑問点と課題
XREAでも使えるという記事もあったが、サーバをレンタルするサービスでないと使えないという逆の意見もあった。
原始的にはPythonだけでも組めそうではあるが、ライブラリを使えた方が楽そうではある。
レンタルサーバに最初から組み込まれているライブラリならば使えるが、入ってはいないライブラリは自由に使えないのでは？という疑問点から、サーバーを借りるサービスを使った方がいいのでは？という気持ちを持っている。
ただ、XREAでライブラリもインストールできるという意見とそうでない意見で分かれているので、どこが境界線なのか？
自分はどの程度で要件的には満たせそうなのか今後も探ってみたいとは思う。
ただ、現状はよく分かっていないのが正直なところ・・・。
実は公式サービスでは謳ってはいないが、仕組みを利用すればできるとかそういう裏技的なことなのだろうかなど。
※この手の問題は今後、特に敷き詰めたことをしようと考えているので解決したい。ITエンジニアはもうやらんけど経験としてね。
C言語でインベーダーゲームを作った話

#あけましておめでとうございます

~~1/1に書く記事ではないきがしますが~~去年(2018)の夏前にC言語でゲームを作った話を書こうと思います。

#環境

OS:Ubuntu 18.04
Editor:VSCode
Compiler:clang

自分はMac,Linux,Windowsも全部使う人間でどんな環境でも動くソースコードを書きたかったので特に決まった環境はなかったのですがメインはUbuntuで書いていました。

#完成形

![Peek 2019-01-01 02-42.gif](https://qiita-image-store.s3.amazonaws.com/0/265796/3cc349da-f827-6d10-d87e-ebb31445c2dd.gif)



~~しょぼい~~

##ソースコード

https://github.com/hashitaku/MyInvaderGame

##操作やルールなど

- 操作はすべてマウスで左クリックで砲台からレーザーを発射します。
- マウスを左右へ動かすことにより砲台も動きます。
- インベーダー側からも3発(変更可能)レーザーをランダムに発射してきます。
- インベーダーは左右へ動いて壁に当たると徐々に下がってきて水色のラインを超えると強制的にゲームオーバーとなります。

#作成過程

##ライブラリの基本的な使い方を調べる

外部のライブラリを使って何かをするということを全くしたことがなかったのでネットで色々検索してました。
今回使ったGLUTというライブラリはとても古いライブラリで情報は多かったので助かりました。

##実装していく

インベーダーゲームにした理由はとくにないんですが目標がそこまで高くなくて個人で制作するには良かったと思っています。
GLUTはとっても便利なライブラリで使い勝手は良かったです。

###苦労した点

- ゲーム制作の基本がなさすぎて当たり判定の実装などが全くわからなかったので効率の悪いアルゴリズムを実装してしまっているはず...(いまだにわかってない)
- インベーダーをGIMPで1ドットずつ描いたのですが、とてもつらかった
- **モチベーションの維持**

###反省点

- ヘッダファイルとソースファイルの分割が綺麗ではない(重要)
    - func.hという神ファイルにすべてを書き込むのは良くなかったと反省...
- ソースツリー皆無(CMakeするときは楽でいいです...)
- 綺麗なソースコードとは言えない

###良かった点、成長した点

- 変数名や関数名はなかなかわかりやすいのではないかと思う(わかりにくいのもあるが)
- グローバル変数を使わなければならない時があるということを知れた
- クロスプラットフォームに制作する目標を達成できた

#総合評価

学生個人で制作するレベルにしては頑張ったのではないかと思っています。


次はC++,GLFW,GLEWなんかを使ってこのゲームを書き直ししようかなと思っています
osx上でMoltenVK動かしてみる

# やってみること

- MoltenVKのビルド
- サンプルコードの実行

環境
macOS: 10.13.3
Xcode: 9.4.1

# MoltenVK

macOS/iOS上でVulkanのAPIコールをMetalのAPIコールに変換するOSS
https://github.com/KhronosGroup/MoltenVK

※ OpenGLのAPIコールをMetalのAPIコールに変換するMoltenGLというのもある。OSSではなく、別途ライセンス購入が必要(https://moltengl.com/)


# Vulkan

Windows, Linux, Androidなどに対応したマルチプラットフォームな次世代のグラフィックAPI
OpenGLと比べてGPUの性能を最大まで引き出すことができる。
https://jp.khronos.org/vulkan/

# MoltenVKのビルド

基本的には下記に書かれている通り
https://github.com/KhronosGroup/MoltenVK#installing-moltenvk

```
brew install cmake
brew install python
brew install ninja

git clone https://github.com/KhronosGroup/MoltenVK.git
cd MoltenVK
./fetchDependencies

# macOS用のパッケージビルド
make macos
# make ios (iOS用のパッケージビルド)
```

# Demoプロジェクトの実行

Demos/LunarG-VulkanSamples/ 以下にいくつかサンプル用のプロジェクトがあるので実行してみる

```
open Demos/LunarG-VulkanSamples/Hologram/Hologram.xcodeproj
open Demos/LunarG-VulkanSamples/API-Samples/API-Samples.xcodeproj
open Demos/LunarG-VulkanSamples/Cube/Cube.xcodeproj
```
<img width="1018" alt="スクリーンショット 2019-01-01 2.03.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/19855/53f58b0c-0601-78ca-9613-2a8b46bd860e.png">
<img width="775" alt="スクリーンショット 2019-01-01 2.05.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/19855/97d108bc-8a0c-47c4-aca4-9dac2502cfb3.png">
<img width="787" alt="スクリーンショット 2019-01-01 2.06.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/19855/9a3dec88-48fa-ca41-85fa-d47b8e9e3322.png">
カーソルでページネーションする activerecord-cursor 作った

# はじめに
カーソルでページネーションするという要件があり、いい感じのGemを探したが存在しなかったので自作した

# 既存のGem

- https://github.com/barkbox/cursor
- https://github.com/Kukunin/cursor_pagination

があった。 cursorはkeyがidにしか対応していなかったので使えなかった。cursor_paginationは実は実装後に発見したのだが、5年間メンテされてないっぽいのと、カーソルを生成するのにクエリを発行しているので、まぁ作ってよかったと思う
cursor_paginationは自分のよりも機能が豊富なので、検討してみても良いと思う

# activerecord-cursor

[tsuwatch/activerecord-cursor](https://github.com/tsuwatch/activerecord-cursor)

## 使い方

```ruby
Post.cursor(key: :created_at)
=> [#<Post id: 1, published: false, created_at: "2018-12-30 19:38:27", updated_at: "2018-12-30 19:38:27">]
Post.cursor(key: :created_at, start: Post.next_cursor)
=> [#<Post id: 2, published: false, created_at: "2018-12-30 19:38:28", updated_at: "2018-12-30 19:38:28">]
```

### オプション

- key
    - ソートするカラムを指定（デフォルトはid）
- reverse
    - ソート順が昇順か降順かを指定（デフォルトは昇順）
- size
    - 1ページあたりの取得件数（デフォルトは1件）
- start
    - カーソルを指定。指定したカーソル以降のレコードを取得
- stop
    - カーソルを指定。指定したカーソルより前のレコードを取得

### カーソルについて
ページネーションを実現するため、前後ページのカーソルを取得できる

```ruby
Post.next_cursor # 次のページ用カーソル
Post.prev_cursor # 前のページ用カーソル
```

取得できる値は、内部的にレコードを取得するために必要な値（`Hash`）を`to_yaml`し、`Base64.urlsafe_encode`したものになっていて、クエリストリングとして利用可能になっている。この値を`start`もしくは`stop`に渡すことで使用する

また、1回のクエリ発行でカーソルを特定することを実現している。そのため、内部的には指定された`size`から余分に+1して取得してそこから削るというような実装になっている

# さいごに
今後は、configファイルの生成やヘルパーなど気が向いたら実装していきます
ぜひ採用の検討をいただければと思います
Mac Mojaveで環境を構築した

#PayPay祭りでMBPを買ったのでその環境構築をした
初投稿です。タイトルの通り、MBAからMBPに乗り換えたので、これを機にちゃんとした開発環境を作りたいと思い一から環境構築を進めています。

## apt-getが使えない
MBAのときのことは忘れたが、ここまで何も入っていなかったっけ？？？何もできないのでとりあえず、[Java SE Development toolkit](https://www.oracle.com/technetwork/java/javase/downloads/jdk11-downloads-5066655.html)をインストールした。

### Xcodeも入っていなかったので、アプリを入れて、コマンドラインツールを入れた

### HomeBrewを入れた
```https://brew.sh/
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```
で入れた。

### Pyenvを入れた
https://dev-reco.com/402 に従ってインストールした。
その後とりあえずPython 3.7.1を入れておいた。pyenvの切り替えエラーが出たので、https://qiita.com/mckyhrs/items/94a2db3506287df0420e に従ってsource bashしておいた。

### Jupyter x Atom x Hydrgoen 環境を作った
https://gomiba.co.in/blog/archives/831

### chainerのセットアップ
apt get が使えないのでとりあえずはbrewでなんとか。
```UserWarning: Accelerate has been detected as a NumPy backend library.
vecLib, which is a part of Accelerate, is known not to work correctly with Chainer.
We recommend using other BLAS libraries such as OpenBLAS.```
と出てしまうので、[Chainerのホームページ](https://docs.chainer.org/en/stable/tips.html#mnist-example-does-not-converge-in-cpu-mode-on-mac-os-x.)に従って変更した。

## pipenv x docker x git
[の組み合わせが最強](https://qiita.com/Aruneko/items/796d7eeb61e1f36ae4a0)という記事を見つけたので、これを使ってみることにした。ちなみにこれまではpyenvだけしか使っておらず、ライブラリがグローバルな状態になってしまっていた。

### pipenvのインストール
`brew install pipenv`

###docker のインストール 
[ここ](https://hub.docker.com/editions/community/docker-ce-desktop-mac)からダウンロードした。後はドラッグ&ドロップするだけなのでとても簡単。

### pytorch
`brew install libomp`

### jupyterlab extension
まずはnode.jsを入れる必要があって、[これ](https://qiita.com/dialectic4th/items/368877009f15b6b551ff)を参考にした。
その他[これとか](https://qiita.com/kirikei/items/a1639954ce5ccaf7ac3c),[これとか](http://pynote.hatenablog.com/entry/jupyterlab-recommend-extensions),[これとか](https://qiita.com/canonrock16/items/d166c93087a4aafd2db4)を参考にしました。

####variable inspectorの使い方
なかなか書いてなくて探すのに苦労した。
`jupyter labextension install @lckr/jupyterlab_variableinspector`
でインストールは済ませた上で、
まず、Settings -> Advanced Settings Editor -> Extension Manager まで行って、User Overridesの側に
`"enabled":true`
と打つ（左側はデフォルトで変更不可）

その上で、タブに戻って右クリックをすると、
`Open Variable Inspector`というのがあるのでそれをクリックすればOK

### python ターミナルでの使用
問題が起きたので[これ](https://qiita.com/Gen6/items/78d83d117ef67e0d53c2)を参照した。

### ssh key
[このサイト](https://qiita.com/suthio/items/2760e4cff0e185fe2db9)を参考にした。


環境構築が進めば随時更新していきます。
オブジェクト指向再入門 - オブジェクト指向のこころ 1章 まとめ -

今更の投稿でごめんなさい・・・。

とあるお客様向けにグリッドの共通モジュールを開発するにあたり、
デザインパターンの重要性を改めて感じました。

そこで今回は、参考にした書籍[デザインパターンとともに学ぶオブジェクト指向のこころ](https://www.amazon.co.jp/dp/4621066048/ref=cm_sw_r_tw_dp_U_x_SqDkCbNY7XMBY)の中から、
「1章　オブジェクト指向パラダイム」をまとめます。

**オブジェクト指向とはどういう考え方なのか**、それまでの構造化プログラミングと比較しながら考えていきます。

# 忘年会の幹事業を例に考えてみる
今日は会社の忘年会！
幹事のあなたは、出席者を誘導しなければなりません。
しかも、各部署で会場が異なります。

## 構造化プログラミング的アプローチ
構造化プログラミング的アプローチで考えてみると、どのようになるでしょうか？

**- 手順 -**
1. 忘年会出席者のリストを取得する。　　
2. 取得した各出席者に対して、以下の対応をする。　　
　（ 1 ）その出席者の部署を調べる
　（ 2 ）その部署の会場を調べる
　（ 3 ）その会場までの行き方を調べる
　（ 4 ）その出席者に伝える

**- 手順を実行するための手続き群 -**
1. 忘年会出席者のリストを取得する機能
2. 出席者の情報（部署・会場・行き方）を取得する機能
3. 出席者へ忘年会会場への行き方を教えるプログラム
4. 1〜3を手順通りに実行する制御プログラム

	
このように、「社員を忘年会会場へ誘導する」という問題を、小さな要素に分解していきます（**機能分解**）。

ですが、実際にはこんなことしませんよね・・・。
「各部署の会場と行き方を出席者に連絡して、後は各自で来てください」で良いはずです。
各社員はもちろん自分の所属する部署を知っていますので、自分で会場と行き方を確認すれば良いのです。

## 構造化プログラミング的アプローチの欠点
それでは、構造化プログラミング的アプローチのどこが問題なのでしょうか？
### 制御プログラムに責任が集中し、変化に対応しづらい
機能分解した訳ですから、この分解した機能を正しい順序で呼び出す制御プログラムが必要になります。
この制御プログラムは、全ての機能を正しく制御するという大きな責任を課せられることとなります。

それでは、
「新入社員は買い出しをしてから会場に向かって！」となったらどうなるでしょうか？

出席者が新入社員かどうか確認する機能を追加して、
新入社員の場合は、買い出しに行ってから会場に行くように制御プログラムを変更して・・・

と、変更の影響範囲が広く、コードが複雑化しやすくなってしまいます。

ユーザ自身によって、もしくは技術の発展など環境の変化によって、**要求は常に変化**していきます。
この**要求の変更による影響を少なくし、より柔軟に対応できる**ようにと生み出されたのが、**オブジェクト指向**です。

## オブジェクト指向的アプローチ
構造化プログラミング的アプローチでは、機能に注目して問題を分解していきましたが、
オブジェクト指向的アプローチでは**責任**に注目して問題を分解していきます。

>「各部署の会場と行き方を出席者に連絡して、後は各自で来てください」

先程のこの考え方が、オブジェクト指向的アプローチになります。

幹事は会場に来てくださいと指示をするだけで、どのようにして会場に行くかは各社員に委ねられています。

この幹事や社員がオブジェクトにあたり、それぞれ以下のような責任を持っています。

- 幹事  
会場へ向かうよう、社員に告げる
- 社員  
所属する部署を知っている  
会場を知っている  
会場へ向かう

つまり、オブジェクトは**ある物事に対して責任を持つもの**になります。

機能ではなく、責任に注目して分解することで、
なぜ要求の変化により柔軟に対応できるようになるのでしょうか？

### オブジェクトを考える際の3つの観点
オブジェクトを考える際には、どのような観点で見ているかが重要になります。

- **概念レベル**：何に対して責任があるのか  
このレベルにおいてオブジェクトは、**責任の集合**となる
- **仕様レベル**：どのように使用されるのか  
このレベルにおいてオブジェクトは、**振る舞い（メソッド）の集合**となる
- **実装レベル**：自身の責任をどう全うするのか  
このレベルにおいてオブジェクトは、**データと処理**となる

この考え方により、
幹事は「社員が実際にどのように会場へ向かうのか」といった詳細（実装レベル）を知る必要はなく、
「会場へ向かう」という公開されたメソッド（仕様レベル）を持つ社員に対して、
「会場へ向かうよう指示をする（＝社員オブジェクトのメソッドを呼び出す）」（概念レベル）だけで良くなります。

### 凝集度と結合度
- **凝集度**
モジュール内の処理の関連性
高いほど、理解がしやすいコードなる

- **結合度**
モジュール同士の関連性
低いほど、要求の変更による影響を受けない

このように、高い凝集度、低い結合度のモジュールが求められます。

機能に注目して分解すると、高い凝集度にはなりますが、結合度が高く、ある機能への変更が、制御プログラムやその他の機能に思わぬ影響を与えてしまう可能性が高くなってしまいます。

責任に注目して分解することで、まず、大きい責任を持った制御プログラムは必要なくなります。
さらに、モジュールの呼び出し側は、呼び出したモジュールの実装の詳細を知る必要はないため、結合度は低くなります。

# まとめ
オブジェクト指向では、問題を責任に注目してオブジェクトに分解していきます。
そして、このオブジェクトには、概念・仕様・実装の3つの観点があり、概念レベルでオブジェクト同士がコミュニケーションをとることで、要求の変化による影響を最小化しています。

この章では、「オブジェクトはクラスという設計書に基づいて作られた実体である」というような、実装レベルだけの話ではなく、仕様レベル、概念レベルで捉えることの重要性が説明され、私自身実装レベルから考えていたなと感じました。

この書籍内では理論に重点を置いてデザインパターンが説明されていますので、
社内研修で取り入れることも視野に入れて、引き続き読み進めていきたいと思います！
KerasでトレーニングしないけどTensorBoardからGraphを見たいとき

「Kerasでモデルを**トレーニングすると**簡単にTensorboardで可視化できる」という記事はたくさんあるのに、トレーニング無しでやる方法がわからなかったのでやってみました。

要するに、「モデルを学習停止設定にしてfitしちゃえば、Keras備え付けのTensorboardコールバックが使えるんじゃね」という思いつきで、成功しました。

```python
from keras.models import load_model
from keras.callbacks import TensorBoard

model = load_model("PATH") # 好きなやり方でモデルをロード
model.trainable=False # modelの全要素について学習しない設定

tb_callback = TensorBoard(log_dir='./logs') # コールバックを用意

# 学習はしないけどcallbackを適用させるためにfit
prediction = model.predict([input_img]) # 学習しないので出力形式と一緒ならOK
model.fit([input_img], prediction, callbacks=[tb_callback])
# →Tensorboardでグラフを見る

```

Tensorflowでsession用意したりすれば綺麗には書けそうですが、これより長くなりそうなのでやめました。もしスッキリ簡潔に書ける方法があれば教えてください！
ISPC を aarch64 で動かす

漢なら ISPC を aarch64 で動かしたいですね!

やりましょう!

できました.

https://github.com/syoyo/ispc-aarch64/tree/aarch64

追記: ISPC が標準で aarch64 対応になりましたので, この repo はもう不要です.

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">🏆Achievement Unlocked🏆 I&#39;ve ported ISPC into AARCH64! 🎉🎉🎉🎉🎉🎉🎉🎉🎉😻😻😻😻😻😻😾😾😾😾😾🤩🤩🤩🤩㊗️㊗️㊗️㊗️㊗️㊗️㊗️💪💪💪 aobench runs 2.4x faster per core, 19x for 8 cores on AWS ARM instance! &gt; <a href="https://t.co/UirPxyJ90w">https://t.co/UirPxyJ90w</a> <a href="https://t.co/wcXK2Oqone">pic.twitter.com/wcXK2Oqone</a></p>&mdash; Syoyo Fujita ⚡️ No ray tracing No life (@syoyo) <a href="https://twitter.com/syoyo/status/1079775265394315268?ref_src=twsrc%5Etfw">2018年12月31日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ISPC は SPMD 形式のコードを SIMD を使う命令に変換し, プログラムの実行を高速にする言語的なツールです.

arm(32bit)は一応ありましたが, aarch64(64bit)はありませんでした.
昨今はスマホの ARM チップも 64bit が標準ですし, サーバ用も 64bit ですしので,  aarch64 対応してみました.

aobench でだいたいコアあたり 2.5 倍になりました.
(AWS EC2 の a1 ARM 8 スレッドインスタンスで確認)

## llvm intrinsics

ispc では, ビルトイン関数のいくつかを llvm intrinsics 直指定(.ll の ASCII 形式)で行っていますが, 既存の arm neon(32bit) と, aarch64 では op 名が変わっています.
(e.g. 逆平方根推定命令 vrsqrts -> frsqrts など)
とりあえず aobench が動くように最低限の修正をしましたが, 実際に使うには llvm のコードや aarch64 の命令セットを見ていろいろなおさないといけません.

### テスト

ispc のテストでは `FileCheck` を使っていますが, これは clang/llvm prebuilt パッケージには含まれていません. したがって ispc のテストを走らせるにはまず LLVM をソースからビルドする必要があります...(のでテストは動かしていない)

## TODO

* builtin intrinsics で未対応のものを直す
* テストをする
* 優秀な ispc 若人さまが, **人類史上最速で優秀な aarch64 ispc 若人さまへと昇華なされ**, 高速な aarch64 コードが生み出されるスキームを確立する旅に出たい.
Keep the spirit of C

# Keep the spirit of C

C 言語の規格書の中に "Keep the spirit of C" という、C の精神を要約した一節があります。
オリジナルは C89 のものであり、C11 ではその内容が更新されました。

# C89 の Keep the spirit of C

> Keep the spirit of C. The C89 Committee kept as a major goal to preserve the traditional spirit of C. There are many facets of the spirit of C, but the essence is a community sentiment of the underlying principles upon which the C language is based. Some of the facets of the spirit of C can be summarized in phrases like:
>
> * Trust the programmer.
> * Don't prevent the programmer from doing what needs to be done.
> * Keep the language small and simple.
> * Provide only one way to do an operation.
> * Make it fast, even if it is not guaranteed to be portable.
>
> from [www.open-std.org](http://www.open-std.org/) > [JTC1/SC22/WG14 - C](http://www.open-std.org/JTC1/SC22/WG14/) > [Rationale for International Standard Programming Languages C](http://www.open-std.org/JTC1/SC22/WG14/www/C99RationaleV5.10.pdf)

C の精神を保つ。C89 委員会は C の伝統的な精神を保つことを重要な目標として掲げました。C の精神には多くの側面がありますが、本質的には C 言語の原則を根底とするコミュニティ感情に基づくものです。C の精神のいくつかの側面は、以下のように言い表すことができます。

 * プログラマを信頼する。
 * プログラマがやろうとしていることを妨げてはならない。
 * 言語を小さくシンプルに保つ。
 * あることを行う方法は一つだけ提供する。
 * たとえポータビリティを損ねたとしても高速にする。

# C11 の Keep the spirit of C

> 6\. Keep the spirit of C. The Committee kept as a major goal to preserve the traditional spirit of C. There are many facets of the spirit of C, but the essence is a community sentiment of the underlying principles upon which the C language is based. For the Cx1 revision there is consensus to add a new facet f to the original list of facets. The new spirit of C can be summarized in phrases like:
>
> * (a) Trust the programmer.
> * (b) Don't prevent the programmer from doing what needs to be done.
> * (c) Keep the language small and simple.
> * (d) Provide only one way to do an operation.
> * (e) Make it fast, even if it is not guaranteed to be portable.
> * (f) Make support for safety and security demonstrable. 
>
> from [www.open-std.org](http://www.open-std.org/) > [JTC1/SC22/WG14 - C](http://www.open-std.org/JTC1/SC22/WG14/) > [C - The C1X Charter](http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1250.pdf)

6\. C の精神を保つ。委員会は伝統的な C の精神を保つことを重要な目標として掲げました。C の精神には多くの側面がありますが、本質的には C 言語の原則を根底とするコミュニティ感情に基づくものです。Cx1 版ではオリジナルのリストに (f) を加えた合意があります。新しい C の精神は以下のように要約できます。

 * プログラマを信頼する。
 * プログラマがやろうとしていることを妨げてはならない。
 * 言語を小さくシンプルに保つ。
 * あることを行う方法は一つだけ提供する。
 * たとえポータビリティを損ねたとしても高速にする。
 * 実証可能な安全性とセキュリティをサポートする。
RevertされたRuby 2.7の新機能メソッド参照演算子

## 2019/11/12 Revertされたので使えなくなりました

👋

https://github.com/ruby/ruby/commit/fb6a489af2765a3b56e301adf0019af6bbad6156
https://bugs.ruby-lang.org/issues/16275

## 以下、deprecated

`method`メソッドを短く書けるメソッド参照演算子の紹介です。
https://bugs.ruby-lang.org/issues/12125
https://github.com/ruby/ruby/commit/67c574736912003c377218153f9d3b9c0c96a17b

## `method`メソッドとは

メソッドを`Method`オブジェクトとして取り出せるべんりメソッド
https://docs.ruby-lang.org/ja/latest/method/Object/i/method.html

```rb
123.method(:to_s)
# => #<Method: Integer#to_s>
```

## `Method`オブジェクトとは

メソッドとレシーバーが対になったオブジェクトで`Proc`と同じように呼び出せる。
https://docs.ruby-lang.org/ja/latest/class/Method.html

```rb
meth = 123.method(:to_s)
# => #<Method: Integer#to_s>
meth.call
# => "123"
meth.call(16)
# => "7b"
```

## メソッド参照演算子

`.:`で`method`メソッドと同じようにメソッドを`Method`オブジェクトとして取り出せる。

```rb
123.:to_s
# => #<Method: Integer#to_s>
```

## `method`メソッドが上書きされていても`.:`なら`Method`オブジェクトを取り出せる

`method`メソッドが上書きされていてもメソッド参照演算子はメソッドを取り出せる。べんり。

```rb
class Object
  def method(*)
    nil
  end
end

123.method(:to_s)
# => nil

123.:to_s.call
# => "123"
```

Refinementsで上書きされていても大丈夫

```rb
using Module.new {
  refine(Object) do
    def method(*); end
  end
}
method(:puts)
# => nil
self.:puts
# => #<Method: main.puts>
```

`method`メソッド同様Refinementsで定義したメソッドは取り出せない

```rb
using Module.new {
  refine(Object) do
    def method(*); end
  end
}
self.:method.call(:puts).call(1)
# 1
```

## 単項演算子を取り出す場合

`method`メソッド同様`-@`/`+@`のような形で取り出せる

```rb
1.method(:-@).call
# => -1
1.:-@.call
# => -1
```

## べんりなのか

ブロックわたして何かする系の`Enumerable`的な処理書くときに便利そう。

```rb
[1,2,3].map(&2.:*)
# => [2, 4, 6]

["エロ"].any?(&"イエロー".:include?)
# => true

require "prime"
(1..10).select(&Prime.:prime?)
# => [2, 3, 5, 7]
```

## まとめ

trunkのrubyを入れるとすぐに`.:`を使えるのでべんりです。

## 2019/03/08 追記

よくある反応についての感想です。

### `.:`違和感ある

他言語ではメソッド呼び出しで`()`が必要だから`()`なしで参照が取れたりするけどRubyでは`()`省略できるのでそれではダメそう。
メソッド呼び出しの`.`の後ろに`:`1文字つけくわえるだけ、通常のメソッド呼び出しより1文字多いだけで参照とれるのはそこまで違和感がない気持ち。

### 記号多い

実際`{|x| y.foo(x) }`は記号6種類ぐらい使っているので`(&y.:foo)`は記号5種類、記号減ることもある。
ベクタグラフィックスのすすめ

#世の中の画像はラスタグラフィックスが多い

皆さん、画像ファイルの拡張子と言ったら何を思い浮かべますか……？

**png、gif、jpg……**
実はこれらの拡張子は**"ラスタグラフィックス"**という形式なんです。

|形式|拡張子|編集|
|:---|:---|:---|
|ラスタグラフィックス|png/gif/jpg|ペイント系|
|ベクタグラフィックス|svg|ドロー系|

一方、**"ベクタグラフィックス"**は
**svg**拡張子が該当します。

#そもそもラスタグラフィックスとベクタグラフィックスとはなんぞや

簡単に言うと
ラスタグラフィックスはキャンバスを構成するドット(点)に色をつける。
ベクタグラフィックスはキャンバスに点を置いて点と点を結び線に色をつける。

そのような手法です。

ロゴや文字のみの画像を使う場合はベクタグラフィックスで作ると良いと思います。
一方、写真はラスタグラフィックスが向いていると言えます。

これがラスタグラフィックスのイメージ。
![r.png](https://qiita-image-store.s3.amazonaws.com/0/213065/f0dfc0db-f3c1-785d-4569-dfb748e3b422.png)

こっちがベクタグラフィックスのイメージ。
![b.png](https://qiita-image-store.s3.amazonaws.com/0/213065/bd616f7d-93cb-2699-9d5f-06485286b835.png)


#実際に比べてみる

|比較画像|形式|
|:---:|:---|
|![as2_2.png](https://qiita-image-store.s3.amazonaws.com/0/213065/6cd2b132-e513-63e6-5144-15396e68b2a5.png)|ラスタ|
|![as](https://github.com/Kasugaccho/DungeonTemplateLibrary/raw/master/Picture/as_logo.svg?sanitize=true)|ベクタ|

実際に拡大して見てみてください。
ベクタグラフィックスのほうはいくら拡大しても荒くなりません。

#おわり

ベクタグラフィックスは綺麗。

![gaccho](https://github.com/Kasugaccho/DungeonTemplateLibrary/raw/master/Picture/gaccho_icon.svg?sanitize=true)
Hurry Coderと死の悲報 PART2

# とあるWeb制作会社の大晦日
ワイ「もうすぐや・・・」
ワイ「やっと仕事が納まるで・・・」
ワイ「けっきょく今年も**会社で年越し**になりそうやないか・・・」
ワイ「**どん兵衛**と**レッドブル**の差し入れがあったけど」
ワイ「差し入れより**人権が欲しい**わ・・・」
ワイ「けど、この修正で終わりや・・・」
ワイ「**今年最後のコミットや！！！**」

# しかし闇のクライアント現る
ワイ「**！？**」
ワイ「また**闇のクライアントはん**からメールが来たで・・・」
ワイ「また件名に**【悲報】**ついてるやん・・・」

> 本年もお世話になりました。
**今年最後のお願い**がございます。
**この一件だけ**お付き合いください。

ワイ「**お世話になりました**いうて」
ワイ「**その直後にお願い**してるやないか・・・」
ワイ「なにが**一件だけ**や・・・」
ワイ「もうヤケや・・・やったるで・・・」
ワイ「要件は何や・・・！」

> トップページの修正を4点ほどお願いいたします。

ワイ「**一件ちゃうやないかい！！！**」

> その4点の修正は、**それぞれ別の日に本番公開**をお願いします。

ワイ「それぞれ別の日・・・？面倒やな・・・」

> ただ、**4点とも修正した状態**を**テストサイト上で先に確認**させていただきたいのです。

ワイ「**！？**」
ワイ「どういうことや・・・」
ワイ「トップページに**4つの修正をする**」
ワイ「**本番公開日は4つともバラバラ**・・・」
ワイ「しかし、**4つとも修正した状態をテストサイト上で確認**したい・・・」

ワイ「つまり、**同じページに4つの修正をする**んやけど、**本番公開日はバラバラ**・・・？」

ワイ「アカンアカン、**突発的にベランダから飛び降りそう**や・・・」
ワイ「・・・**ウワアァァァァ〜〜〜！！！**」

ハリー先輩「**待てい！**」

# ハリー先輩とは
+ この会社で唯一のコーダー経験者
+ 忙し過ぎるため**ハリー・コーダー**の異名を持つ
+ 詳しくは[**こちら**](https://qiita.com/jzmstrjp/items/831d23536ae1310447e6)や[**こちら**](https://qiita.com/jzmstrjp/items/63dadd600526e9a8ac65)の記事を参照

# 死んだらアカン
ハリー先輩「**気を確かに持つんや**」

ワイ「そんな事いうても、**エライ指示**きてまっせ？」
ワイ「**同じページに4つの修正**をして、**バラバラの日にリリース**でっせ」
ワイ「**パラレルワールドでも無いと無理**ですわ」

ハリー先輩「ええこと言うやないか」
ハリー先輩「**その通り**やで」
ハリー先輩「**Gitでパラレルワールドを作ればええんや**」
ハリー先輩「修正1、2、3、4」
ハリー先輩「それぞれの修正のために」
ハリー先輩「**4つのブランチを切るんや**」
ハリー先輩「開発用のdevelopブランチから切ってくれな」

ワイ「分かりました」
ワイ「修正1用のブランチ、修正2用のブランチ・・・」
ワイ「4つブランチ切りました」

ハリー先輩「ほんで、**それぞれのブランチに1つずつ修正をする**んや」

ワイ「はい・・・」
ワイ「修正自体は軽微なもんなんで今やってまいますわ・・・」
ワイ「・・・できましたで」

ハリー先輩「ご苦労やで」

ワイ「でも、**テストサーバにデプロイできるのは1つのブランチだけ**でっせ？」
ワイ「**闇のクライアントはん**は**4つともテストサイトに反映せえ**言うてます・・・」

ハリー先輩「そう焦るんやない」
ハリー先輩「**4つのブランチを全てdevelopブランチにマージ**するんや」
ハリー先輩「そしてその**developブランチをテストサーバにデプロイ**するんや」

ワイ「はい・・・」
ワイ「修正1のブランチをdevelopブランチにマージ・・・」
ワイ「修正2、3、4のブランチもマージして・・・」
ワイ「そのdevelopブランチをテストサーバにデプロイ、と」

ハリー先輩「どや」
ハリー先輩「**4つの修正すべてがテストサイトに反映**されたやろ」

ワイ「**ほんまや**・・・」
ワイ「でも、マージしてしもうたら**本番公開するタイミングも一緒に**なってまうやないですか」

ハリー先輩「**大丈夫や**」
ハリー先輩「修正用の4つのブランチを、masterブランチに**1つずつマージしながら本番公開**すればええんや」

ワイ「・・・**なるほど！**」
ワイ「1つ目の修正をmasterブランチに取り込んで、本番公開・・・」
ワイ「次の修正を取り込んで、また本番公開・・・てことか」
ワイ「そんな使い方もできるんや・・・」
ワイ「これで何とかなりそうやな・・・」
ワイ「ほんまにおおきにです、ハリー先輩！！！」

ハリー先輩「ええで」
ハリー先輩「（**やっと俺に礼を言いおったわ**・・・）」

# そうこうしてるうちに年は明けていた
ハリー先輩「年が明けてもうたな・・・」

ワイ「今年もよろしくお願いしますわ」

ハリー先輩「おう、こちらこそよろしくやで」
ハリー先輩「今年はGitの本でも読んで勉強せえや？」

ワイ「そうでんな」
ワイ「本は大事でんな・・・」

ハリー先輩「ん？なんやそこにある本」

ワイ「ワイの勉強用ですわ」

ハリー先輩「おお、感心やな」
ハリー先輩「にしても、えらい分厚い本やないか」
ハリー先輩「まるで広辞苑・・・って**ほんまに広辞苑やないかい！！！**」

ワイ「技術書を読むにも、**まず書いてある言葉の意味が分からへん**ので・・・」

ハリー先輩「（**どうやって入社したんや・・・**）」

**〜おしまい〜**


# 追記
あけおめやで。
[**無職になった後のエピソード**](https://qiita.com/jzmstrjp/items/2b7edb45d3ca8f916d44)も読んでいってや？
Firebase Realtime Database (Kotlin) で子の数だけ繰り返し処理したいとき


#準備
https://qiita.com/Natsuki_on_Rails/items/c3d76b3fa2048f214aac

#実装

```kotlin
// ...

//①Firebase Databaseのインスタンスを取得
val database = FirebaseDatabase.getInstance()
//②リファレンスを取得
val myRef = database.getReference("hoge")
//③データを取得するお決まりのやつ（リスナーを用意して二つのメソッドをオーバーライド）
myRef.addValueEventListener(object : ValueEventListener {
    override fun onDataChange(dataSnapshot: DataSnapshot) {
        //④dataSnapshotに子供がいると↓こんな感じでループできる
        for (h in dataSnapshot.children){
            val value = h.getValue(Int::class.java)
        }
    }
    override fun onCancelled(error: DatabaseError) {
        // ...
    }
}
```
こんなかんじで書けば子供の数だけ処理できる。
【顕微鏡】Kenko-デジタル顕微鏡で遊んでみた♪II

昨夜のデジタル顕微鏡のソフトを長時間のパラパラ動画に対応させたので、考え方は汎用性高いので、まとめておこうと思う。

主な課題は以下の通りでした。
①長時間間隔で撮影すると、途中でモードを”ｓ”押して調整モードに入ろうとしても入れなくなる
②最悪、せっかくとった動画が応答なしで消えてしまう
###やったこと
※waitKeyの使い方はググってもあまり出てこないので、仕様の変更理由を記載する
①sleep()を止めて、waitKey()で待ち時間とする
　理由：sleepだとその間、入力が無視されてなかなか戻って来ない。一方、waitKeyはKey入力待ちとなっていて、Key入力と同時に処理を反映してくれる。
②どの程度時間が経過したかを画像に記載するようにした
　理由：表示が無いと動画を見てもどの程度の時間でその現象が起こったか分からない。
###コードは以下に置いた
【2019.1．2追記】動画の保存ファイル名がかぶると前のファイルを消してしまうので、タイムスタンプを追加した
[MicroScope/kenbikyo_KeyII.py](https://github.com/MuAuan/MicroScope/blob/master/kenbikyo_KeyII.py)
###コード解説
基本はあまり変わっていないが、時間の経過を示すため変数ｊを導入しました。
そして、fpsを正しく計算できるように、While文中ではfpsを計算した後に持ってきました。
そのため、最初のtimerをWhileの前に持ってきました。

```py
    s=0.1
    j=0
    timer = cv2.getTickCount()
```
fpsと経過時間timeをframeに書き込みました。

```py
    while True:
        ret, frame = cap.read()
        #sleep(s)
        fps = cv2.getTickFrequency() / (cv2.getTickCount() - timer);
        timer = cv2.getTickCount()
        # Display FPS on frame
        cv2.putText(frame, "FPS : " + str(int(1000*fps)), (100,50), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (50,170,50), 2);
        cv2.putText(frame, "time : " + str(int((j-1)*s)) + " s", (400,50), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (50,170,50), 2);
        #print(int(j*s),is_video)
        #j += 1
        cv2.imshow('test',frame)
```
そして、is_video=="True"の判定を最後に持ってきて、先に終了と動画撮影の判定を実施することとしました。

```py
        key = cv2.waitKey(int(s*1000))&0xff
        if key == ord('q'):   #113
            #cv2.destroyAllWindows()
            break
        elif key == ord('p'):
            s=60
            is_video = "True"
        elif key == ord('s'):
            s=0.1
            is_video = "False"    
        
        if is_video=="True":
            img_dst = cv2.resize(frame, (int(w), h))   #1280x960
            out.write(img_dst)
            print(int(j*s),is_video)
            j += 1
```
上記の変更により、安定して長時間の撮影でも撮影モードと調整モードの切り替えがスムーズに実施することができるようになりました。

###撮影した動画例
[デジタル顕微鏡による長時間動画撮影♪（画像サイズ６４０ｘ４８０）](https://youtu.be/bcOxt4QMvrk)
<a href="http://www.youtube.com/watch?feature=player_embedded&v=bcOxt4QMvrk" target="_blank"><img src="http://img.youtube.com/vi/bcOxt4QMvrk/0.jpg" 
 </a>
※画像をクリックするとYouTube動画につながります

###まとめ
・ロジックを変更して安定して長時間撮影できるようになった
・表示に経過時間を入れた

・種から芽がなかなか出ない
SwiftでClassだけでなくStructも積極的に使う方がコードの可読性が上がる話　その1

# はじめに
Qiita初投稿になります。2018年１月からプログラミングの学習を開始し、今までPython, Swift, Rubyを触ってきました。エンジニアとしてスキルアップしていくためにも、各言語の仕様を理解したコードがかけるようになりたいと考えていますのでアドバイス等いただけると嬉しいです。

## この記事の目的・背景
今までプライベートiOSアプリを開発していたが、Class以外にStructやEnumを積極的に使ってこなかったのでclass、struct、enumの比較とそれぞれどのような場面で使用できるかまとめてみます。今回はClassとStructの比較を主に書いてみます。

## ClassとStructの大きな違い
まず始めに、SwiftのClassとStructの大きな違いをおさらいしてみます。
・Classは継承可能だが、Structはできない
・Classインスタンスは参照型、Structは値型

```swift:SomeValue.swift
var someValue1 = SomeValue(value:20)
var someValue2 = someValue1
someValue2.setNewValue(value:21)
// Class (someValue1, someValue2どちらも変わる)
// someValue1.value = 21
// someValue2.value = 21

// Struct (someValue1の値は変化しない)
// someValue1.value = 20
// someValue2.value = 21
```
## letによるMutabilityが異なる

```swift:Mutability.swift
class Something {
    var mutableValue = 10
}
let immutableClass = Something()
// Cannot assign to value: 'immutableClass' is a 'let' constant エラー
// immutableClass = Something()
immutableClass.mutableValue = 20
// immutableClass.mutableValue => 20

struct SomeStructure {
    var immutableValue = 10
}

let immutableStruct = SomeStructure()

// immutableStruct = SomeStructure()
// Cannot assign to value: 'immutableClass' is a 'let' constant エラー

// immutableStruct.immutableValue = 20
// Cannot assign to property: 'immutableStruct' is a 'let' constant エラー
```
```let``` で定義すると、 Classのインスタンスはimmutableになりますが、プロパティはmutableのままになっています。一方、Structはデータをカプセル化して保持する役割がありますので、そのまま外部から値を変更しようとするとエラーになります。

## Struct内で定義したプロパティの値を変更するには、メソッドの前に ```mutating``` をつける
Struct内のプロパティの値を変更する際は、```mutating``` をメソッドの先頭につけることでプロパティの値を変更することが可能になります。

```swift:changePropertyInStruct.swift
struct SomeStructure {
    var value:Int
    
    init(value:Int) {
        self.value = value
    }
    
    mutating func addOne(){
        self.value += 1
    }  
// 下記のように、mutatingをつけないと、Left side of mutating operator isn't mutable: 'self' is immutable というえらエラーが発生する
//    func addTwo(){
//        self.value += 2
//    }
}

var something = SomeStructure(value: 1)
something.addOne()
// something.value => 2
```
## Structを使うメリット
1. クラスのように簡単に使える
2. クラスファイルが増えすぎない
3. データ自体に関する処理を任せることで構造がわかりやすくなる

・クラスのように簡単に使える
クラスを定義するときと同様にイニシャライザも使え、プロパティやメソッドの定義も簡単！

・クラスファイルが増えすぎない
クラス毎にファイルを分ける必要がなくなり、データに関する処理をStructファイルでまとめてしまったり、Controllerファイルに記載しても良いので他のクラスファイルと分離して管理することができます。

・データ自体に関する処理を任せることで構造がわかりやすくなる
<img width="970" alt="スクリーンショット 2019-01-20 23.44.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/343853/455d35a9-5917-0862-7d46-85319818900d.png">
図の様にコントローラーファイル、モデルファイル、Structファイルを用意し、それぞれ適切な役割(例えばStructに全てデータに関する変数と処理を書く)を与えることでコードの可読性が上がり、チームで開発する際に新規メンバーのキャッチアップも早くなりそうです。

## まとめ
Structはクラスの様に書くことができ、データを保持し、データの処理を行う関数をまとめるのに適しています。しかしながら、継承が存在せず、Struct単体では不便な点もあります。サブクラスのようなものを作成したい時には、Enumも同時に利用することで同様の機能を実装可能ですので、次回はEnumも利用したコードの可読性をあげる方法を考えてみようと思います。

最後まで読んでいただき、ありがとうございました！不明な点や間違いがありましたらコメントしていただけると嬉しいです〜！