OmniAICreator/Qiita-1.07M huggingface dataset:
Flutterの難読化とマップファイル生成のススメ

<img width="962" alt="Sentry上に表示された難読化されたDartコードのエラー" src="https://qiita-image-store.s3.amazonaws.com/0/27027/2e18d36f-d20a-d849-638b-07929319cc2e.png">

## Tr;dl

Flutterアプリのデプロイ時にDartコードを難読化すると、Sentry等のエラーレポートも難読化されてしまうので、難読化時にmapファイルも同時に作っておきましょう。

* "Flutter Meetup Tokyo #6"で使った資料: https://speakerdeck.com/matsue/flutterapurifalsenan-du-hua-toerarepoto-ios
* English version: https://medium.com/@waytoa/obfuscating-flutter-code-and-generate-map-files-for-ios-fdaf4a377ec4


## iOSアプリのDartコードを難読化する

Flutterのアプリリリースドキュメントには、Dartコードの難読化に関する記述があります。

* iOSアプリのリリースドキュメント: https://flutter.io/docs/deployment/ios
* Androidアプリのリリースドキュメント: https://flutter.io/docs/deployment/android
* Dartコードの難読化: https://github.com/flutter/flutter/wiki/Obfuscating-Dart-Code

iOSでは、以下の2ファイルを修正することになります。

* `<ProjectRoot>/packages/flutter_tools/bin/xcode_backend.sh`
* `<ProjectRoot>/ios/Flutter/Release.xcconfig`

ドキュメントに従って編集した後、 `fluuter buil ios` を実行し、ビルド結果に含まれる `App.framework` を見てみると難読化されていることが確認できます。

```
$ strings build/ios/Release-iphoneos/Runner.app/Frameworks/App.framework/App
...
get:_vxa@7048458x
get:_aLa@9040228x
get:_DLa@7048458x
...
```

難読化しなかった場合の、 `App.framework` はこのようになっていました。

```
$ strings build/ios/Release-iphoneos/Runner.app/Frameworks/App.framework/App
...
get:_count@7048458
get:_onData@9040228
get:_isSubscribed@7048458
...
```

難読化により、コード内の各種の名前は無意味な文字列に変更されていることが確認できました。

## Sentryによるエラートラッキング

この記事を書いているタイミングで、Crashlyticsに該当するサービスをFlutterで、となるとSentryを使うのが簡単です。

* Sentryを組み込む方法: https://flutter.io/docs/cookbook/maintenance/error-reporting

上記のドキュメントに従って設定した後は、以下のコードをFlutterで書いているコードのどこかに入れれば、クラッシュが正しくレポートされることの検証ができます。

``` Dart
throw new ArgumentError('Test error');
```

難読化前であれば、Sentryは以下のようにエラーをレポートしてくれます。

```
main.dart in SampleApp.build at line 48
```

しかし、難読化した後だとエラーは以下のようになります。

```
SEd in bZ.opa at line 48
```

開発している自分が読めなくなっている😇
このエラーの内容を読むため、 `<ProjectRoot>/ios/Flutter/Release.xcconfig` に `--save-obfuscation-map` オプションを追加します。

```
EXTRA_GEN_SNAPSHOT_OPTIONS=--obfuscate,--save-obfuscation-map=build/ios_dart_symbols_${FLUTTER_BUILD_NUMBER}.json
```

生成されたファイルを見れば、難読化されたエラーレポートの関数名等を知ることができます。

```
$ cat ios_dart_symbols_1.json
...
"_BuildJsonListener"、 "_ Gf"、
"CustomSymbolRenderer"、 "cs"、
"devicePixelRatio"、 "saa"、
...
```

## おわりに

今回、iOSのビルドを例にしましたが、Androidのビルドステップでも `--save-obfuscation-map` をつけることで、難読化されたマップファイルを生成することができます。

おそらく近いうちにFirebase CrashlyticsがFlutterを公式にサポートして、この辺りも楽にいい感じにやってくれるはずです。
それがリリースされるまでの間、Dartを難読化しつつSentryを利用する際は、mapファイルも生成しておきましょう🦆
Siv3DからOpenSiv3Dに乗り換えよう

# はじめに
こんにちわ。大乱闘に夢中で直前に必死こいて記事を書いているマホウです。
自分自身OpenSiv3Dを実際に触り始めたのは最近なのですが、導入は相変わらず簡単だったので
まだ、既存Siv3Dを使っている人や、これからOpenSiv3Dを始めてみようと思っている人への敷居下げにでもなれば良いかなと思います。

# OpenSiv3Dをはじめよう！

ちょっと前の話ですが、Siv3Dユーザーの知りあいが新規ゲームを開発していました。
この時期なら、OpenSiv3Dを使っているのかと思いましたが、聞いたところまだ既存のものを使っていました。
別の友人も既存Siv3Dで新しいゲームを作ろうとしていたり、意外とまだまだ移行していないユーザーは多そうです。

なんでやろ。。。

## なんとなくハードルが高い

- 学習コストがかかりそう
- 名前に*Open*って付いてるし、なんとなく難しそう(OpenXX系への敷居)(独断と偏見)

`Sound` と `Audio` など既存とOpenでclass名が変わっていたりインターフェースが変わっている部分が多少あるが、ほとんどSiv3Dライクのまま書くことができる。
そのため、既存ユーザーであれば、ほとんど学習コストもかからず始めることができるはず。
既存プロジェクトからの移行でも大改修とまではならないだろう。(大変ではありそう)

**OpenSiv3DにはSiv3Dのような手軽さはちゃんと継承されています！**


## 既存からOpenSiv3Dに移行されていない機能

現状、まだ手が届いていないところがあるため、それが理由で移行できないこともあるだろう。

移行されていない機能は`Siv3D.hpp`を見ればなんとなく確認できます。
例としてv0.3.0時点で以下の機能はなさそうだった(今はWindowsならv0.3.1がでている)

- 動画読み込み系
- 3D描画
- JSON読み込み/ZIP読み込み
- GUI
- 入力デバイス系
  - マイク
  - ペンタブ
  - Kinect
  - Tobii 
- などなど 

しかし、開発当初に比べればかなりの機能が使えるようになっていて、普通に2Dゲームくらいならだいたい実現できると思われる。
**むしろ、機能的な理由以外では既存から乗り換えない理由はないと思っています。**

作りたいものの実現に機能が足りてない場合だけ、既存を使用するでもよいかもしれませんね。

# 実際に導入してみよう

**びっくりするくらい簡単でした。**
とゆうか既存Siv3Dの頃から変わっていない簡単さ。
なので、導入も楽でした。

## 導入方法

導入の詳細は公式でまとめてあるので以下のページを読んだほうが早い。

- [Siv3D をはじめよう (OpenSiv3D Web サイト)](https://siv3d.github.io/ja-jp/)


1. C++開発環境をインストールする
2. OpenSiv3Dインストーラーをダウンロードしてインストールする
3. 導入終わり。
4. プロジェクトを立ち上げればサンプルコードがでてくる。
5. 作りたいもの作る。

**ね？　簡単でしょ？**

#### 実際のサンプルコード
実際のサンプルコードはこんなかんじでした。(コピペ)

```cpp:Main.cpp

# include <Siv3D.hpp> // OpenSiv3D v0.3.0

void Main()
{
	Graphics::SetBackground(ColorF(0.8, 0.9, 1.0));

	const Font font(60);

	const Texture textureCat(Emoji(U"🐈"), TextureDesc::Mipped);

	while (System::Update())
	{
		font(U"Hello, Siv3D!🐣").drawAt(Window::Center(), Palette::Black);

		font(Cursor::Pos()).draw(20, 500, ColorF(0.6));

		textureCat.resized(80).draw(700, 500);

		Circle(Cursor::Pos(), 60).draw(ColorF(1, 0, 0, 0.5));
	}
}

```
既存のSiv3Dユーザーならほんとど変わっていないことがよくわかるはず。
でも、既存と比べて楽しい画面になっていますよ！！

OpenSiv3Dなら`Emoji`使えます。 🐣🐣🐣🐣🐣🐣🐣🐣

## 新しいものを取り入れる姿勢

ちょっと話が変わります。

個人的に新規プロジェクトであれば、積極的に新しいものを取り入れていくと良いと思っていたりします。(理由がないなら)

Siv3Dに限った話ではないですが、新しいバージョンがでればやれることが増えたり、機能改善がされたり開発そのものもより良くなるでしょう。

既存Siv3DからOpenSiv3Dの場合は機能でみるとプラスだけでなくマイナスもあるので現段階では難しいところもあるかもしれませんが
それは時間の問題であって、いつかはOpenSiv3Dが既存Siv3Dの機能をカバーしきれる日がくるはず

また、新しいものを取り入れるっていう事がつまり学びになって自身の力の向上にもなります。


**OpenSiv3Dを始めるともれなくC++17も学べちゃう**

# まとめ

- OpenSiv3Dをはじめよう
  - 導入はとても簡単
  - Siv3Dとほぼ変わらず書ける
  - C++17も学べる
  - 既存から移行されていない機能はまだある
- 新しいものはどんどん取り入れていこう
- 大乱闘は面白い
クラススタイルVueコンポーネントの変数初期化を改善する

# 背景

TypeScript+vue-class-component環境でcreatedやmountedなどでstateを初期化する場合、クラスの初期化時に一旦stateにnullなどの値を入れる必要があります(これをしないとstateの変更が監視されません)。この時、本来nullが有り得ない場合でも型定義でnullなどを許容せざるを得ません。これを改善するために、Kotlinのlateinitを参考にしてデコレータを作ってみました。

```typescript

export const LateInit = createDecorator((options, key) => {
  options.mixins = [
    ...options.mixins || [],
    {
      data(this: Vue) {
        return {
          [key]: null
        }
      }
    }
  ]
}
```

コンポーネントでは以下のように使います。

```typescript

export default class SomeComponent extends Vue {
  @Lateinit
  windowWidth!: number

  mounted() {
    this.windowWidth = window.innerWidth
  }
}
```
正規表現にマッチした部分をExcelに書き出す + プロットする

# 概要

正規表現にマッチした部分をExcelに書き出す + プロットします。
参考:[python版](https://qiita.com/int_main_void/items/68f26a23a6e919f700f0)

![plot.gif](https://qiita-image-store.s3.amazonaws.com/0/34777/d649545b-8532-4ccc-f746-6fa92b9d5b71.gif)

# 使ったデータ

```plot.txt
(1,100)
(2,200)
(3,300)
(4,400)
(5,500)
```

# 使った正規表現

```
"\((\d),(\d{3})\)"
```

# コード 

`objExcel.Visible = False`にする場合は、スクリプトの最後で[Save/SaveAs→Close→Quit(→Set X=Nothing)の流れで閉じる](http://blog.livedoor.jp/midorityo/archives/50735275.html)ようにします。Quitを呼ばないと[Excel.exeが残ります](https://web.archive.org/web/20110405220235/https://technet.microsoft.com/ja-jp/scriptcenter/ff522015.aspx#8)。

[大してメモリ使わないし、サクッと終了する](https://qiita.com/int_main_void/items/8776cc4b9b05478273b3#%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%82%BD%E3%83%95%E3%83%88%E3%81%AE%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%81%A7quit%E3%82%92%E5%91%BC%E3%82%93%E3%81%A7%E3%81%AA%E3%81%84%E3%81%91%E3%81%A9)ならSet X = NothingはなくてもOKです。

```vb:plot.vbs
'------ 本題とあまり関係ない部分 ここから ----
' スクリプトにドロップされたファイル名を取得する。
If Wscript.Arguments.Count > 0 Then
    fname = Wscript.Arguments.Item(0)
Else
    WScript.Echo "テキストファイルをドロップしてください"
    WScript.Quit
End If

'オブジェクトの準備
Set objExcel = CreateObject("Excel.Application")        'Excel操作
Set objFso = CreateObject("Scripting.FileSystemObject") 'ファイル操作
Set objRegExp = CreateObject("VBScript.RegExp")         '正規表現
Set objWshshell = CreateObject("WScript.Shell")         'Windowsシェル操作

objExcel.Visible = True                  'Excelを見えるようにしておく(今回は手で閉じる,保存する)
objWshshell.AppActivate objExcel.Caption 'Excelを最前面にする

Set objSheet = objExcel.WorkBooks.Add().ActiveSheet 'アクティブなシートのオブジェクトを持っておく
'------ 本題とあまり関係ない部分 ここまで----

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' 正規表現にマッチした部分をExcelに書き出す + プロットする
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

' まずは、正規表現にマッチした部分をExcelに書き出す 
objSheet.Cells(1,1).Select                  'A1をアクティブセルにする
Set objInFile = objFSO.OpenTextFile(fname)  '入力のテキストファイルを開く
Do While objInFile.AtEndOfStream <> True

    str = objInFile.ReadLine ' 1行読む

    objRegExp.pattern = "\((\d),(\d{3})\)"  'パターン設定

    Set objMatchCol = objRegExp.Execute(str) '検索実行
    If objMatchCol.Count > 0 Then
        'マッチした場合
        'マッチした部分をさらに分解する
        Set objSubMatches = objMatchCol.Item(0).SubMatches

        'Excelに書き出す
        objSheet.Cells(objExcel.ActiveCell.Row, 1) = objSubMatches.item(0)
        objSheet.Cells(objExcel.ActiveCell.Row, 2) = objSubMatches.item(1)

        'セルを次の行に進めておく
        objSheet.Cells(objExcel.ActiveCell.Row+1,1).Select
    End If
Loop
objInFile.Close '入力のテキストファイルを閉じる

'次に、Excelに書き出したデータをプロットする
Set objChart = objSheet.ChartObjects.Add(120, 20, 200, 150) 'チャートオブジェクトを作る。
objChart.Chart.ChartType = 74                               '散布図にする。xlXYScatterLines(74) 
objChart.Chart.SetSourceData(objSheet.UsedRange)            'データソースに書き出した箇所を設定する
```

# 参考
[Regular Expression (RegExp) オブジェクト - msdn](https://msdn.microsoft.com/ja-jp/library/cc392403.aspx)
【設計時の見落とし】システム日付にまつわる話

# はじめに
これは[設計時の見落とし Advent Calendar](https://qiita.com/advent-calendar/2018/overlook)の8日目の記事となります。

業務アプリケーションの設計をするときに、見落としがちなところに焦点をあてて紹介します。 
下流工程からの手戻りを少なくして 双方の負担を減らしましょう。

以前、別ブログなどに書いた記事のQiita向けにリライトしてみようと思います。
今回はシステム日付にまつわる話を3つ挙げます。

# システム年月＋締日
当時のプロジェクトでは、私の方でコードレビュー＋検証をしておりました。

検証した画面は、締日(1～31)と得意先コード範囲を入力し帳票出力させるものでした。
そのプログラムを私の方で検証をしてみると「対象データがありません」とエラーになります。
ソースリストを見るとシステム年月＋締日となっており、仕様書もそのように記述されておりました。

そのプログラムは9月中に製造されておりテストデータも9月のみで作成されておりました。私が検証したのがちょうど月が変わった10月1日だったため、対象データが抽出されてこなかったわけです。

しかし、締日(1～31)だけしか入力項目が無いのでは、当月しか出力できないわけです。
特別な帳票というわけでは無いので、いつでも出力できるようにするべきです。

設計者に現象を伝え、年月項目を追加して初期値をシステム年月とするように提案しました。

# システム日付の統一
クライアントサーバーモデルで、関連した別テーブルの登録した日時にズレがあるということで改修したことがあります。

サーバー処理はデータベースのシステム日付、クライアント処理はPCのシステム日付を使用してデータが登録されておりました。
対象となったクライアント側PCの時刻にズレが生じていたことで発覚しましたが、そもそもそうならないように最初からシステム日付をサーバー側で統一するべきでした。

# 日付制限
システム日付を初期値にしカレンダーの入力日付制限として過去日または未来日を指定したらエラー扱いにする仕様がありました。

エラーにする仕様は別に問題ないのですが、これを素直にシステム日付を指定した仕様書にしてしまうと、開発中に日付が変わる度にテストデータの日付を毎回更新するなど非常にテストが面倒になります。
よって、システム日付を取得するラップ関数を別途作成し、テスト用に外部設定で日付を変更できるようにしました。
Xamarin.AndroidでTextViewに埋め込んだUrlリンクをタップした時の動作を置き換える

#背景と目的
- Xamarin.Androidで開発しているときに，Html#fromHtmlを使ってURLリンクを埋め込んだときに，Chromeとかではなく，Webviewとかを使って開きたかった．
- Javaの実装記事は@le_skambaさんの[記事](https://qiita.com/le_skamba/items/cca74696095cbbb65cc3) が参考になります．
- Xamarin.Androidはなかったので備忘録として．

#実装

実装の手順はJavaでの実装とほぼ同じです．
1. LinkMovementMethodを拡張する 
2. TextViewに拡張したLinkMovementMethodを指定してやる
手順はこれだけです．

実際のコードは次の通りです

**LinkMovementMethodを拡張する**

```C#
CustomLinkMovementMethod .cs

public class CustomLinkMovementMethod : Android.Text.Method.LinkMovementMethod
{
    public override bool OnTouchEvent(TextView widget, ISpannable buffer, MotionEvent e)
    {
        var action = e.Action;
        if(action == MotionEventActions.Down || action == MotionEventActions.Up)
        {
            int x = (int)e.GetX();
            int y = (int)e.GetY();

            x -= widget.TotalPaddingLeft;
            y -= widget.TotalPaddingTop;

            x += widget.ScrollX;
            y += widget.ScrollX;

            var layout = widget.Layout;
            int line = layout.GetLineForVertical(y);
            int off = layout.GetOffsetForHorizontal(line, x);

            Type type = typeof(ClickableSpan);
            var link = buffer.GetSpans(off, off,  Java.Lang.Class.FromType(type) );

            if(link.Length != 0)
            {
                if(action == MotionEventActions.Up)
                {
                    if(link[0] is URLSpan)
                    {
                        string url = ((URLSpan)link[0]).URL;
                        YourBrowser_Open();//ここで自由に調理してください
                    }
                }
                else  if(action == MotionEventActions.Down)
                {
                    Selection.SetSelection(buffer, buffer.GetSpanStart(link[0]), buffer.GetSpanEnd(link[0]));
                }
                return true;
            }
            else
            {
                Selection.RemoveSelection(buffer);
            }
            
        }
        return base.OnTouchEvent(widget, buffer, e);


    }
}
```

**TextViewのModementMethodに拡張したLinkMovementMethodを指定**

```C#
text.MovementMethod = new CustomLinkMovementMethod();
```

ほとんどJavaと同じですが，Java.Lang.Class.FromType(type) あたりは，Xamarin独特な無理矢理さを感じますね．．．．
is で型判定できるのはC#らしく，便利ですね．

# あとがき
技術ブログ自体初の投稿となりますので，これでいいのかドキドキしてます．
仕事では，もっぱらJava/Androidの開発がメインです．
趣味ではXamarin.Android，Xamarin.Formsで書くことが多く，まだまだ記事が少ないのが現状かなと感じています．
普及のためにも，足りないと感じる情報があれば投稿していこうと思います．
エンジニア歴半年のGit

#はじめに
文系未経験の社会人１年目がのらりくらりと生きているので「こんなん常識やろ！誰でもわかるわ！」と心で思いながら暖かく見ていただけると幸いです....

##Gitとは？？？？？？
バージョン管理ツールの一種
プログラムの編集結果を各自で保存することで
複数人が同時に同じファイルを編集したりできる

##Gitを使わない場合
ぼく「ここeachよりmapで回したほうがいいからmapに変更したろ！」
敵「間違えてコード全部消しちゃいました」
ぼく「仕事やめよ」
と取り返しのつかないことになってしまうかもしれない

##Gitを使った場合
ぼく「ここeachよりmapで回したほうがいいからmapに変更したろ！」
敵「間違えてコード全部消しちゃいました」
ぼく「各自で保存してあるからヘーキ！もとに戻そう」
と幸せになれる

##リモートリポジトリとローカルリポジトリ
リポジトリとは　貯蔵庫　＝　変更を蓄積するところ

####リモートリポジトリ
ネットワーク上に存在して、チーム全員が閲覧できる状態
githubとかbitbucketとか
![01_l.png](https://qiita-image-store.s3.amazonaws.com/0/239479/79fb20bf-6e07-0e38-3bf4-033b71ffb036.png)
![ダウンロード (1).jpeg](https://qiita-image-store.s3.amazonaws.com/0/239479/00af5154-b1d2-d0e8-c353-066407c2eef0.jpeg)


####ローカルリポジトリ
個人のPC内にあって、変更は自分しか分からない
git
![image_icon_git.png](https://qiita-image-store.s3.amazonaws.com/0/239479/e0acb115-8018-0f36-8349-01c4cd36cdbf.png)


##コミットとは
変更履歴のこと

##コミットの手順
1.変更を「ステージング」という土台にあげる
2.ステージングにあげた変更を確認
3.コミットを作る
4.コミットをGitのサーバーに「プッシュ」する
5.おわり

##よく使うコマンド
>git branch feature/自分の名前
git checkout feature/自分の名前
git add -p ファイルパス
git commit -m “コミット名”
git status
git push origin feature/自分の名前

##最後に
Sourcetreeばっかり使っててごめんなさい
正直CUIでGit全然してないです
誰か僕を叱ってください...

最後まで読んでいただきありがとうございます！
二週間で感じたGolangを覚えるコツ

# はじめに
仕事でGolangを書き始めて二週間くらい経ったので、新しくGolangを覚えるのにコツになりそうなところをまとめてみました

# tl;dr
* 自分の知っている言語との差分を知る
* コンパイラを意識する
* Golang本体のコードを読む

# 自分の知っている言語との差分を知る
どんな言語でも基本ですが、すでに習得している言語との差を意識するのが覚える第一歩かと思います。
今回勉強の参考にした『[スターティングGo言語](https://www.shoeisha.co.jp/book/detail/9784798142418)』ではさわりの部分などで、そういった視点が意識されており、入りやすかったです。

個人的には、Python, Javaの経験が長いのですが、CとJavaの経験がある程度役に立ったように思います。
* C言語: Golangが互換性を持っており、考え方のベースになっている。知ってるとポインタでつまづかなくて済む。
* Java: 構造体に対するメソッドはOOP的、構造体への構造体の埋め込みは継承に近いなど、OOPっぽい考え方で捉えやすい仕様がある。ただし、それに引っ張られすぎて、OOPっぽく実装するのは多分よくない。

# コンパイラを意識する
Golangの有名な特徴の一つに、コンパイルの早さがあります。
型推論を採用しながら驚異的にコンパイルが早いのは、コンパイラに気を使った言語仕様になっているからだと感じます。

パッケージの仕様に特にその部分を感じます。
`struct`に異なるパッケージの`interface`を設定できないのは、パッケージに仕様を閉じておきたいという意図を感じます。
パッケージの関連が複雑になると必然的にコンパイル時の処理(処理順など)にも跳ね返るため、前述のような意図があるのではという結論に達しました。

# Golang本体のコードを読む
https://github.com/golang/go
言語そのもののコードが困ったらすぐに確認できるのはGolangのいいところです。
実装上の勉強にもなりますし、気になる仕様があればすぐに確認できます。
標準的なライブラリで返り値が正しいのか、気になったらすぐにコードを読むことにしています。

# 最後に
以上のやり方で、小さいアプリを書く分にはそれほど困らない理解度にたどり着けたと思います。
Golangは軽量かつ高速に開発でき、コードの可読性の高さにはかなり好意的に感じています。
反面、よく指摘されるようにやや冗長なコードや他の言語ならできた痒いところに手が届かない感じが気になるのも事実です。
環境を問わないなどのGolangの良さを踏まえて、適切な場面で使っていきたいです。
返り値・スコープについて

#18.12.08　課題内容
課題：以下のコードを実行すると、ターミナルにはなんと表示されるでしょうか？

```ruby:
def rename(name)
  name = "#{name}::CAMP"
  return name
end

name = "TECH"
rename(name)
puts name
```

####自分の回答
表示：TECH::CAMP

理由：メソッドの呼び出し部分`rename(name)`が、戻り値`name="#{name}::CAMP"`に置き換わり、
`name="TECH"`が代入されているため。

####正解

表示：TECH
→メソッド定義内の`name = "#{name}::CAMP"`はメソッド外では使用できないため

####スコープについて

**メソッド内ではメソッド内で定義した変数しか使えない**
という変数のスコープという決まりがあります。


なので今回、メソッド内でnameに新しい文字列`name = "#{name}::CAMP"`が再代入されていますが、
それはそのメソッド内でしか使えません。

よって今回の`puts=name`の結果は、TECHになるとのこと
Bootstrap4のPopover内でjQueryのAutocompleteを使う

実装時に少々詰まったので備忘録。

## 必要なファイルを読み込ませる

```html:index.html
<head>
   <meta charset="utf-8">
	<title>sample</title>
    <link rel="stylesheet" href="jquery-ui.min.css"></script>
    <link rel="stylesheet" href="bootstrap.min.css">
    <link rel="stylesheet" href="style.css">
    <script type="text/javascript" src="jquery-3.3.1.min.js"></script>
    <script src="jquery-ui.min.js"></script>
    <script type="text/javascript" src="popper.min.js"></script>
    <script type="text/javascript" src="bootstrap.min.js"></script>
    <script type="text/javascript" src="script.js"></script>
</head>
```

## popoverを作成
```html:index.html
<body>
    <button type="button" class="btn btn-success" data-container="body" data-toggle="popover" data-placement="right" data-content="<p>プログラミング言語：</p><input type='text' id='language' name='name' style='width:200px;'>">ボタン</button>
</body>
```
```javascript:script.js
$('[data-toggle="popover"]').popover({
      html: true, // true:内容にHTMLタグ使用可
      container: 'body', //表示領域の大型化
      template:'<div class="popover" role="tooltip"><div class="arrow"></div><div class="popover-body"></div></div>'
})
```

## autocompleteを実装
```javascript:script.js
$(function () {
    var progLang = [
      "ActionScript",
      "AppleScript",
      "Asp",
      "BASIC",
      "C",
      "C++",
      "Clojure",
      "COBOL",
      "ColdFusion",
      "Erlang",
      "Fortran",
      "Groovy",
      "Haskell",
      "Java",
      "JavaScript",
      "Lisp",
      "Perl",
      "PHP",
      "Python",
      "Ruby",
      "Scala",
      "Scheme"
    ];

  $('[data-toggle="popover"]').popover({
      html: true, // true:内容にHTMLタグ使用可
      container: 'body', //表示領域の大型化
      template:'<div class="popover" role="tooltip"><div class="arrow"></div><div class="popover-body"></div></div>'
  }).on('shown.bs.popover', function(){
      // autocmplete
      $(document).on('keydown', function(e){
          $('#language').autocomplete({
              source: progLang, // 入力候補リスト
              autoFocus: true,
              delay: 500,
              minLength: 1
          });
      });
  });
});
```

##まとめ
popover内のテキストボックスは動的に生成されるものなので、
$(document).on(・・・　でないとjavascriptが動かない。っぽい。
Swift：macOSでテーマの切り替えを検出する

# はじめに
macOS MojaveになってからDark Modeが話題になっていますが，アプリを作る側としては，こちらへの対応で忙しいですね．
さて，ライトモードとダークモードのテーマ切り替えを検出する方法を見つけましたのでまとめておきます．
~~※Mojave以降のmacOSでないと動かないことに気づきました．~~

# ソース（Mojave以降，表示中のView向け）
```swift:NSViewのサブクラス
class customView: NSView {

    private var currentAppearance: NSAppearance.Name!

    required init?(coder decoder: NSCoder) {
        super.init(coder: decoder)
        currentAppearance = self.effectiveAppearance.name
    }
    
    override init(frame frameRect: NSRect) {
        super.init(frame: frameRect)
        currentAppearance = self.effectiveAppearance.name
    }

    override func viewDidChangeEffectiveAppearance() {
        if currentAppearance != self.effectiveAppearance.name {
            currentAppearance = self.effectiveAppearance.name
            //外観モードが切り替わった時の処理
        }
    }

}
```

# ソース（万能）
```swift:
let center = DistributedNotificationCenter.default()
let userDefaults = UserDefaults.standard

override func viewDidLoad() {
    let name = "AppleInterfaceThemeChangedNotification"
    center.addObserver(self, selector: #selector(self.refreshDarkMode(_:)),
                       name: NSNotification.Name(rawValue: name), object: nil)
}

@objc func refreshDarkMode(_ sender: NSNotification) {
    let currentStyle = userDefaults.string(forKey: "AppleInterfaceStyle") ?? "Light"
    Swift.print(currentStyle)
}
```
laravelで取得したいDBのtable名・where句・select句をメソッド内で直接指定せず、引数によって指定する

シンプルに書きました。
自分ではあまり経験がないと思っていて思いつきで汎用性があるかもというメソッドを書いてみました。
もっといいやり方や拡張があれば編集リクエストいただけますとうれしいです。

個人的はwhere句とかselectとか引数で渡したらそれがあるかないかでwhere句が加えられたら汎用性がでそうなきがします。

(2018/12/09追加しました。)

引数を配列で渡すようにするといいかもしれませんが、機会があれば。

こういうのを書かないと取得するテーブルによって同じようなメソッドができて嫌なんですよね。
全然わかっていないのですが、リポジトリパターンとか名前だけ知っていて、そういうのをやっていけばもっときれいに繰り返しをさけてかけるんですかね。

```php

<?php

$result = $this->hogeGet('hoge', 'fuga', 'piyo');


function hogeGet (string $table, string $where, string$select) : object
{
    $result[$table] = DB:table($table)->get();
    $query = DB:table($table);

    if (isset($where)) {
        $query->where("${where}");
    }

    if (isset($select)) {
        $query->select("${table}.${select)");
    }

    $result[$table]->get();
    return $result;
}
```

参考サイト
Laravel 5.5 データベース：クエリビルダ
https://readouble.com/laravel/5.5/ja/queries.html
日本全土の航空路や空港へのアプローチマップを手に入れよう！

#01_AIS JAPANを使おう。
Aeronautical information Service (AIS) JAPANでは、ユーザー登録さえすれば、日本全国の航空路や、空港の情報が無料で見ることができます。!
https://aisjapan.mlit.go.jp/Login.do
まずはアカウントを作成しましょう。
![AIP_JAPAN.PNG](https://qiita-image-store.s3.amazonaws.com/0/274029/ef3e21dc-3604-f477-ff68-af05a55f82d2.png)


アカウント作成後、AIPのタブを選択。
![01_ログイン画面.PNG](https://qiita-image-store.s3.amazonaws.com/0/274029/967d416f-f14c-8736-1db2-1e8738d9ce0d.png)

現在運用中のものには、Currentに ● がついています。
任意のバージョンを選択しましょう。
![02_date_virsion.PNG](https://qiita-image-store.s3.amazonaws.com/0/274029/cfd03402-4928-0ace-6f34-93cd94837a9e.png)


#02_航空路の確認方法
R-NAVの航路が表示されているマップの見方を説明します。
<font color="OrangeRed">
注意点！！！
英語と日本語がありますが、英語でないと航空路の情報が表示されません。こんな設定にしているの誰だよという感じですが。。。</font>

![03_home.PNG](https://qiita-image-store.s3.amazonaws.com/0/274029/27fa143c-e142-12d3-b1fb-87359c0637b2.png)

ENROUTE_01 東京以北の日本のマップ
ENROUTE_02 東京以南から九州のマップ
ENROUTE_03 九州から沖縄のマップ
となっています。

![04_enroute_chart.PNG](https://qiita-image-store.s3.amazonaws.com/0/274029/afabff0d-58a3-62ed-0584-933ed20b1dc1.png)


航空路、割とよくないですか？

![05_チャート.PNG](https://qiita-image-store.s3.amazonaws.com/0/274029/fb1b949d-aa00-f817-4ce8-9d132704f589.png)

#03_空港情報の確認方法

今回は羽田空港(RJTT)の空港マップを確認したいと思います。




アルファベット順に並んでます。
![06_airport_home.PNG](https://qiita-image-store.s3.amazonaws.com/0/274029/be6df23a-13b2-6823-54b5-ef1234765681.png)

羽田空港は、Tokyo INTL ということで "T" の項目に並んでおります。
![07_RJTT.PNG](https://qiita-image-store.s3.amazonaws.com/0/274029/2868ae47-cf53-2ce2-ae35-a57e3332098d.png)

空港のマップは一番下の CHARTS RELATED TO AN AERODROME(飛行場についてのマップ) を選択。
![08_RJTT2.PNG](https://qiita-image-store.s3.amazonaws.com/0/274029/f7e194fe-e275-fe6f-ecf3-44bf9b8f0ad5.png)

オレンジ色は羽田空港全体のマップです。
みどり色は離陸着陸のルートです。
![09_RJTT3.PNG](https://qiita-image-store.s3.amazonaws.com/0/274029/d9833f96-2849-c5fa-8373-1618309910a1.png)

Approach Chartを一つ見てみましょう。
どーん！！！
![10_RJTT_34R_RWY34R.PNG](https://qiita-image-store.s3.amazonaws.com/0/274029/30595d70-81e9-986d-e4ce-bb7de50a9214.png)


以上です。

自分の使う空港や航路を見てみると、飛行機に乗るのが楽しくなると思います。
ぜひ始めてみてください。
:airplane:
vimでMarkdownを編集したかったけど...

使ってる環境
Ubuntu18.04 LTS[^1]
Neovim
dein.vim

[^1]: バージョンとかはうろ覚え

## まえがき
vim初心者でも、Markdownを書きたいと思い、プラグインを探していた

## やりたかったこと
Markdownのリストを書いている際、自動的に`- * +`を入力してほしかった
ちょうどqiitaのエディタみたいに

## けど
どのプラグインを入れてみても、できなかった。
その上、どのプラグインも特に認識していない気がする。
他の便利系のプラグインはうまく認識している...

# ということで
だれか解決方法を教えてください。
[vimrcのgitのリポジトリ](https://github.com/Hansyo/dotfiles)
Vue.jsでセレクトされたデータを別のインプットボックスで表示する

セクレトされたデータを別のところのinput type="text"で表示するとき次ではだめだった。

```html

// だめな書き方
<input type="text" v-cloak value="@{{selected.hoge}}">

// これでできた
<input type="text" v-bind:value="selected.hoge">
```

Vue.js
クラスとスタイルのバインディング
https://jp.vuejs.org/v2/guide/class-and-style.html
ESLint v5.10.0

前 [v5.9.0] | 次 [v5.11.0]

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">ESLint v5.10.0 has been released: <a href="https://t.co/FnFkmrRQmH">https://t.co/FnFkmrRQmH</a></p>&mdash; ESLint (@geteslint) <a href="https://twitter.com/geteslint/status/1071293343525728256?ref_src=twsrc%5Etfw">December 8, 2018</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ESLint 5.10.0 がリリースされました。
小さな機能追加とバグ修正が行われました。

質問やバグ報告等ありましたら、お気軽にこちらまでお寄せください。

> 🏢 [日本語 Issue 管理リポジトリ](https://github.com/eslint/eslint-jp)
> 👫 [日本語サポート チャット](https://gitter.im/eslint/eslint-jp)
> 🏢 [本家リポジトリ](https://github.com/eslint/eslint)
> 👫 [本家サポート チャット](https://gitter.im/eslint/eslint)

# 🚀 本体への機能追加

特になし。

# 💡 新しいルール

特になし。

# 🔧 オプションが追加されたルール

## [#10919]: [padding-line-between-statements] multiline-const, multiline-let, multiline-var, singleline-const, singleline-let, and singleline-var

変数定義について、単一行か複数行にわたるかによって改行ルールを分けるためのオプションが追加されました。

```js
/*eslint padding-line-between-statements: [
    error,
    { prev: multiline-let, next: *, blankLine: always },
    { prev: singleline-let, next: *, blankLine: never },
] */

//✘ BAD
{
    let a = {
        foo: 1
    }
    let b = { foo: 1 } // Expected blank line before this statement.

    foo() // Unexpected blank line before this statement.
}

//✔ GOOD
{
    let a = {
        foo: 1
    }

    let b = { foo: 1 }
    foo()
}
```

> [Open online demo](https://eslint.org/demo/#eyJ0ZXh0IjoiLyplc2xpbnQgcGFkZGluZy1saW5lLWJldHdlZW4tc3RhdGVtZW50czogW1xyXG4gICAgZXJyb3IsXHJcbiAgICB7IHByZXY6IG11bHRpbGluZS1sZXQsIG5leHQ6ICosIGJsYW5rTGluZTogYWx3YXlzIH0sXHJcbiAgICB7IHByZXY6IHNpbmdsZWxpbmUtbGV0LCBuZXh0OiAqLCBibGFua0xpbmU6IG5ldmVyIH0sXHJcbl0gKi9cclxuXHJcbi8v4pyYIEJBRFxyXG57XHJcbiAgICBsZXQgYSA9IHtcclxuICAgICAgICBmb286IDFcclxuICAgIH1cclxuICAgIGxldCBiID0geyBmb286IDEgfSAvLyBFeHBlY3RlZCBibGFuayBsaW5lIGJlZm9yZSB0aGlzIHN0YXRlbWVudC5cclxuXHJcbiAgICBmb28oKSAvLyBVbmV4cGVjdGVkIGJsYW5rIGxpbmUgYmVmb3JlIHRoaXMgc3RhdGVtZW50LlxyXG59XHJcblxyXG4vL+KclCBHT09EXHJcbntcclxuICAgIGxldCBhID0ge1xyXG4gICAgICAgIGZvbzogMVxyXG4gICAgfVxyXG5cclxuICAgIGxldCBiID0geyBmb286IDEgfVxyXG4gICAgZm9vKClcclxufVxyXG4iLCJvcHRpb25zIjp7InBhcnNlck9wdGlvbnMiOnsiZWNtYVZlcnNpb24iOjksInNvdXJjZVR5cGUiOiJtb2R1bGUiLCJlY21hRmVhdHVyZXMiOnt9fSwicnVsZXMiOnt9LCJlbnYiOnt9fX0=)

# ✒️ `eslint --fix` をサポートしたルール

特になし。

# ⚠️ 非推奨になったルール

## [#11145]: [require-jsdoc] and [valid-jsdoc]

詳しくは『[ESLint の組み込み JSDoc サポートが終了します](https://qiita.com/mysticatea/items/09f9dd4ab2569cd4cd68)』をご覧下さい。

[v5.9.0]: http://qiita.com/mysticatea/items/3d8ef632205d6c51058c
[v5.11.0]: http://qiita.com/mysticatea/items/d843ec4f8efafb0d4623
[#9999]: https://github.com/eslint/eslint/issues/9999
[#10919]: https://github.com/eslint/eslint/issues/10919
[#11145]: https://github.com/eslint/eslint/issues/11145
[xxxx]: http://eslint.org/docs/rules/xxxx
[padding-line-between-statements]: http://eslint.org/docs/rules/padding-line-between-statements
[require-jsdoc]: http://eslint.org/docs/rules/require-jsdoc
[valid-jsdoc]: http://eslint.org/docs/rules/valid-jsdoc

<!-- 
![JSCS Icon](http://jscs.info/favicon.ico) JSCS 互換ルールです。
-->
JenkinsfileのslackSendの引数を、groovyのJsonBuilderを利用して簡潔に表現する

Jenkinsfileの`slackSend`内で`attachments`を指定する際にgroovyのJsonBuilderを利用すると見やすく書けるのですが、groovyを直接使うのに少し手間取ったのでメモしておきます。

# 実行環境
Jenkins 2.154
Pipeline Plugin 2.6

Pipelineジョブのセットアップやslackとの連携はすでに完了しているものとします。

# ビルド結果のSlack通知(attachments指定付き)
[slackSend](https://jenkins.io/doc/pipeline/steps/slack/): [attachments指定が必要な場合](https://api.slack.com/docs/message-attachments)があり、指定するパラメータが多いのでBuilderを使うと便利です。

```groovy:Jenkinsfile
#!groovy
import groovy.json.JsonBuilder

def attachmentPayload = [[
    fallback: "execution #${env.BUILD_NUMBER}",
    color: "#2eb886",
    pretext: "hogehoge",
    text: "fugafuga #${env.BUILD_NUMBER}",
]]

pipeline {
    agent any
    stages {
        stage('test') {
            steps {
                echo 'test stage'
            }
        }
    }
    post {
        always {
            echo 'TEST DONE'
            script {// ここだけscripted pipeline のsyntaxを適用する
                slackSend(channel: '#targetchannel', color: "#2eb886", attachments: new JsonBuilder(attachmentPayload).toString())
            }
        }
    }
}
```
# Groovyコードブロックの実行を許可する
上記のJenkinsfileを実行するとエラーになります。
`new groovy.json.JsonBuilder` を実行するためにはホワイトリストに登録してあげなければなりません。
`Administrators can ~` を押下するか、「Jenkinsの管理」->「In-process Script Approval」から登録します。

![スクリーンショット 2018-12-08 21.34.06.png](https://qiita-image-store.s3.amazonaws.com/0/66517/a4e9f504-bfa2-2095-52ae-1be15a8aa8f9.png)
図: ビルド実行ログ

![スクリーンショット 2018-12-08 21.13.53.png](https://qiita-image-store.s3.amazonaws.com/0/66517/e788d0c1-9ede-c0bb-5af2-e270267f3f84.png)
図: 実行を許可する処理を登録する画面
![スクリーンショット 2018-12-08 21.14.08.png](https://qiita-image-store.s3.amazonaws.com/0/66517/1af37cff-1037-274e-e2c7-7c90ab9a9283.png)
図: 実行を許可する処理を登録したあとの画面

## 実行結果
投稿できました! :tada:
<img width="192" alt="スクリーンショット 2018-12-08 21.19.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/66517/ad32bb47-e13b-c48a-9bdb-b0c7c9bec187.png">
i3-wmとstで満足した理由となぜdwmではないか

i3-wmとstで満足した理由となぜdwmではないか
========================================

My 環境
=================

- Arch Linux
- dwm (dynamic window manager) -> i3-wm
- dmenu (dynamic menu) -> i3-status
- st  (simple terminal)
- chromium-browser

Simple is best.
だが，dwmからi3-wmに移行した．
今回はその理由を解説していきたいと思う．


外せない欲求
=================

- ウィンドウマネージャの操作が簡単
- 端末はダイナミックにフォントサイズを変更できる
- 端末のフォントを選べる
- 日本語入出力が可能

特に軽い端末ほどダイナミックなフォントサイズ変更はできないことが多い．
(xtermはダイナミックにフォントサイズを変えれるけど，求めるものとなんか違うよね．．．)

(´・ω・)   < C を書くときは小さい文字でいいけど，nethackは大きい文字がいい...


i3-wm
==============
元々は，タイル型ウィンドウマネージャを使いたくてシンプルかつ軽量なdwmを使っていたんだ．
でも，プログラムをミスって大量のウィンドウが開いたときdwmはクラッシュするんだ．

タイル型ウィンドウマネージャと言えばxmodmapとかawesomeとかが有名だけど，設定が簡単かつdwmから簡単に乗り換えれそうなi3-wmを選択したんだ．

i3-wmのいいところ
---------------

- 大量のウィンドウを開いても落ちない．
- それぞれのタグごとに表示形式を変えられる
	- dwmだと一つのタブでフルスクリーンにして，他のタブに移るとその設定が引き継がれる．
- リロードコマンドがあって，ウィンドウをそのままにウィンドウマネージャだけを再起動し，設定の再読み込みが出来る．
- dmenuが使える．
	- dwmのdmenuは`alt + p`だがi3-wmのデフォルトは`alt + d`だ．
	- 意外とすぐになれる
- 設定ファイルが見やすい
- __`alt + enter`で端末が起動__
- vimiumも使えばほぼマウスに手を触れずに操作がすべて完結する
- __矢印キーを使わなくてもいい__
	- HHKB Professional2(US)だと矢印が打ちにくい．
	- だからHHKBだとvimのコマンドラインモードは使い辛い...


(´・ω・)< dwmがよく落たり設定がすべてのタブで共通なのが我慢出来なかった


st
====================

みんなはどんな端末エミュレータを使っているだろうか．
(´・ω・)はUbuntu時代からgnome-terminalを愛用していた．
 これのいいところは，

- フォントが簡単に変えられて
- ダイナミックにフォントサイズを変えられる
	- `ctrl + +/-`とか`ctrl + scroll`とか

(´・ω・)<nethackは大画面で楽しみたいからね

(´・ω・)  <でもね．gnomeいらないんだよ．


stのいいところ
-----------------------

- デフォルトでも十分満足できる見た目
	- 256color対応
	- xtermやurxvtみたいに初期状態でも汚くない
- 設定がとっても簡単
	- ただしArchLinuxなどコンパイルとインストールが簡単にできる系のディストリに限るが
	- `yay -G st`で取ってきてconfig.hをいじって`makepkg -si --skipchecksums`
	- シンプルなC言語でかかれているからすぐにいじれる
		- フォントは`fc-list`と`grep`で検索するとよい
		- 最近フォント選びに迷っている
- __こんだけシンプルなのに文字の拡大縮小がダイナミックに出来る__
	- `ctrl + space + PageUp/PageDown`
	- HHKBだと`PageUp/PageDown`は`Fn + l/.`に対応．まあそんなに頻繁に使わないしね．
	- つまり`ctrl + space + Fn + l/.`の四つ押し

(´・ω・)   みんなはどんなフォントを使ってる？

stの残念なところ
---------------------

[この記事](https://qiita.com/Pseudonym/items/8318dc788094265cef21)でも書いたけど， 
fcitxとかuim-ximがうまく動いてくれず，画面外に確定でない文字が表示される．

uim-fepだとうまくいけるのでそれを利用しつつ，
vimで日本語を使うと256colorschemeの相性のせいか点滅するという現象を回避するため，
NeoVimに移行．

顔文字が崩れるというバグに悩まされている今日この頃である．
顔文字やその横の台詞が崩れていたりおかしかったりしたらこのバグのせいである．

(´・ω・ )<こまっちゃ〜う〜な〜〜



chromium-browserを使う理由
=========================
このまま行くとブラウザもこの系列のsurfもしくはw3mを使うことになりそうだが，
そうはならなかった．

理由は単純でYouTubeの倍速と公国ブロックの拡張機能がないと効率が悪いからだ．

chromium-browserだとvimiumで大体事足りる．

事足りない場面
----------------

ほぼほぼvimiumが原因

- pdfやonetabの画面ではvimiumが機能しない
	- pdf viewer for vimiumもあるが使えたものではない
- たまに`ctrl + e`でURL入力になりマウスに渋々手を伸ばさざるを得ない
- デフォルトのキーバインドがvimからずれている上，自己流キーバインドもなかなか満足のいくものにならない
- ページ読み込みが遅いと隣のタブに移れない
	- なのにマウスだとすぐに移れる
- chromium-browserが遅い



追記
==============
- 最近`xargs`の強力さに気づきました．
	- 得に`xargs -P0 -I{}`にはよくお世話になります
C++ Coding Standards

#諸言
　学習履歴全体のリンク
　https://qiita.com/shigural/private/444b991293e5ab1b40af
#本文
##C++ Coding Standards
###組織とポリシーに関する問題
####0.些細なことにこだわるな
必要なことだけこだわろう。以下に例を示す
1.{}の書き方は統一されていればどうでも良い
2.スペースとタブは必要がなければどちらかを禁止する必要はない
3.ハンガリアン記法（変数名のはじめに型の名前を書く）はC++では不要である
4.return文は複数あっても良い
Git/GitHub/Visual Studioの導入

#諸言
　学習履歴全体のリンク
　https://qiita.com/shigural/private/444b991293e5ab1b40af
#本文
##Git/GitHub/Visual Studio
説明：Git/GitHubの使い方について習得する
###1.Gitの導入
　https://employment.en-japan.com/engineerhub/entry/2017/01/31/110000 に基づいたGit導入
###2.GitHubとの連携
https://www.ipentec.com/document/list/tag?q=TortoiseGit に基づいたGitHubとの連携
###3.各種プロジェクトの設定
###4. Visual Studioの最新版を導入。機能理解
- https://qiita.com/hart_edsf/items/4d1561751a96d145301a 
    - Ctrl + Shift + V：履歴を参照して貼り付け
    - F12：関数定義へ飛ぶ
    - Ctrl + -：直前のカーソル位置へ戻る
    - Ctrl + Shift + - ：次のカーソル位置へ進む
    - 表示→タスク一覧：タスクが出てくる。タスクはCtrl + K→Ctrl + Hで追加できる（タスク一覧の表示：ctrl+\→ctrl+t）
    - Ctrl + Shift + Space：現在入力中関数の引数を表示
    - Ctrl + Space：入力候補を表示

- https://sysken.org/blog/2436/
    - 2.フォントをConsolasに変更
    - 3.スクロールバーをマップモードに
    - 4.F10：ステップオーバー実行、F11：ステップイン実行、Shift + F11：ステップアウト
    - 5.分析→パフォーマンスと診断：ボトルネックの可視化
    - 8.Ctrl + K→Ctrl + C：選択部分をコメントアウト
    - Ctrl + K →Ctrl + U：選択部分のコメントアウト解除
    - 9. Alt+F12：定義をその場で表示

- https://www.ryobi.co.jp/column/visual-studio-tips1
    - 右クリック→名前の変更：該当変数の一括変更

- https://www.ryobi.co.jp/column/visual-studio-tips3 
    - メニュー→デバッグ→ウィンドウ→呼出履歴：関数の呼出履歴表示
 
- C++文法
    - http://www7b.biglobe.ne.jp/~robe/cpphtml/
        - do-while文 
        - 参照
    - 条件演算子
	- NOT演算子
        - 構造体の参照渡し 
        - 静的メンバ関数　http://cpp-lang.sevendays-study.com/day5.html 
        - 関数テンプレート http://cpp-lang.sevendays-study.com/ex-day3.html 
        - Set http://cpp-lang.sevendays-study.com/ex-day5.html 
        - 仮想関数・インターフェイス http://cpp-lang.sevendays-study.com/ex-day6.html 
        - 演算子のオーバーロード　http://cpp-lang.sevendays-study.com/ex-day7.html
非標本誤差についてまとめてみた

# はじめに
エンジニア？アナリスト？サイエンティスト？歴5ヶ月めの新卒社員が最近学んだことをちょっとずつまとめてみたもの。12回目の今日は、前回推測統計についてまとめたときにあまり詳しく触れられてなかった非標本誤差について復習してみました

これまでに書いた記事の最新3回分はこちら↓
[第9弾](https://qiita.com/icchy_sh33p/items/2103ee9607244aba73c7)
[第10弾](https://qiita.com/icchy_sh33p/items/5cae50134d0e3e3e455a)
[第11弾](https://qiita.com/icchy_sh33p/items/15a6d98aa292e773d71f)

ちょっとばかし、体調を崩してしまいました。遅い時間での更新でごめんなさい

# 標本誤差と非標本誤差
- 調査したい母集団のデータ数が多く、全体調査をすることができない場合、標本調査を実施
→母集団の一部のデータを抽出、その集団を「標本」として分析をする（[標本抽出理論](https://blog.si-media.biz/statistics2/)参照）
- 標本の誤差には、標本誤差と非標本誤差の2種類が存在
    - 標本誤差・・・標本抽出にともなうデータの誤差
    - 非標本誤差・・・標本誤差以外の誤差
→非標本誤差って具体的になんやねん・・・。具体的な例を列挙してみることに。

# 非標本誤差の種類
## 妥当ではない母集団
- 母集団が手間や費用を理由に、本来調べるべき母集団から標本を取っていないことを原因に発生するデータの誤差
- 例
    - 同じ環境での刺激提示の内容の違いによる差を検証したいのに、違う環境の集団を対照群として母集団にしてしまった（A群は芸術選択で音楽を専攻しているが、対照群は美術を専攻していたなど）
    - そもそも母集団が対象とすべきものと違った（エンジニア対象の調査を、周りにエンジニア職である対象となる集団がいなかったので営業職にしてしまうなど）
- 対策
   - 調査対象とする母集団が調査目的に即しているかを確認する

## 回答者の疲労
- データ収集の方法が質問紙やアンケートなどを中心に、対象となる回答者が途中で疲労感を感じることによって発生する誤差。心理学の場合、特に顕著に出やすい（身体的指標の測定においても影響が現れる可能性が大きいため）
- 例
    - 回答する質問数が多い
    - 質問内容の心理的負担が大きい
- 対策
    - 事前に使用する指標の疲労度を作成者や予備調査としてほかの人を対象にして測定する
    - 質問紙の回答を複数回に分割する（環境等の統制は別途必要）
など

## 社会的望ましさ
- 結果に対して、対象が社会的に望ましいと考えられる結果を気にするあまり、正直に答えないことによって発生する誤差
- 倫理観、価値観についての調査をする際に発生しやすい誤差
- 対策
    - 結果について、個人単位での開示をするかどうかなどの事前の説明（インフォームド・コンセント）を施す
    - その質問が調査に必要がない場合はその質問をはずしてしまう
など

## 質問文の不備
- 設定した質問に対し、対象者が意味を取り違えてしまうことによって発生する誤差
- 対策
    - 先行研究がある場合、大きな影響が発生しないのであれば文章を変更しない
    - 意味が正しく／わかりやすく伝わるか事前に検証する
    - 質問内容そのものが調査に即したものであるかの検討
など

## データ取得時に発生する不備
- データの入力時のミス、回答者の不在や回答拒否、回答し忘れた箇所（**欠損**という）があるなどによって発生する誤差
- 例
    - データ入力が1行ずれていた、転記ミス
    - 質問内容がセンシティブなものだったため、回答者が回答拒否の意思を示した
    - 欠損
- 対策
    - データ入力完了時に間違いがないか、ダブルチェックを行う
    - 欠損データは必要がなければ分析時に標本から取り除く
    - 回答終了時に欠損がないか確認を行う（ただし、事前説明が必要）
など

## データ取得時に影響を与えてしまう
- 例
    - 調査主体バイアス・・・調査主体（調査を企画・実施している組織）に対して対象が好意、あるいは敵意を持って回答していることにより、データに影響を与えてしまう場合
    - 調査員バイアス・・・担当の調査員が、対象にとって異性や顔なじみなどにより正直に答えづらい質問内容に対して信頼できる結果が得られにくいことによってデータに影響を与えてしまう場合
    - メイキングによる調査不正・・・じゅうぶんな数のデータが得られず、調査員が自分でデータを作成し、混ぜてしまうことでデータに影響を与えてしまう場合
- 対策
    - 事前に調査主体を明らかにする（マナーや対象の不安の解消も含む、調査主体バイアス）
    - 調査対象からデータを得る際に事前に担当の分担を明確にしておく（複数人で実施する場合／調査員バイアス）
    - メイキング防止（メイキング）
など

# 非標本誤差 まとめ
- 非標本誤差が発生するには理由がちゃんと存在する
- 非標本誤差は未然に防ぐことができるため、できる範囲で対処を事前に施しておく（ただし、それがかえって非標本誤差を生み出してしまう可能性も意識しておく必要あり）
- 調査結果が予測と違った場合、非標本誤差ができてしまうようなデータの取り方だったかを検証する必要がある（ただし、予測が誤りであった可能性を常に念頭に残しておく）
- 調査後も継続的に同じ内容の調査をする場合は、前回調査時の検証、考察をもとに適切なデータの取り方を再考する

# 感想
非標本誤差について今回は改めてまとめてみましたが、やっていくと卒論のときにこんなこと気をつけていたなぁとか、お世話になった先輩方や協力してくれたたくさんの同期や後輩は元気にしているかなぁとか。なかなか普段思い出さないことを思い出しました。
それと一緒に、今が改めて充実しているなぁ、とも感じるっていう。笑
人との出会いって本当に大切！（←雑）

今度、改めて旧友ともお酌をゆっくり酌み交わそうと思います
ではまたー^^
Googleの二要素認証をコマンド一発で済ませてくれるドットコンテナを作りました。

#【楽したい】
クラウド環境上にあるサーバーに入って何か作業をする際、マネジメントコンソールや踏み台サーバへのログインするために、わざわざスマホを出して手で打ち込むんでいる人居ませんか？
セキュリティは大事ですけど、面倒ですよね～。

そんなGoogleの二要素認証を、コマンド一発で楽にしてくれるコンテナを作成しました。
下記記載のDockerfileからビルド起動したあと、ホスト側でコマンドエイリアスを設定することで、認証用コマンドを生成できちゃいます。



```
Dockerfile
FROM ubuntu:trusty
MAINTAINER Kato Haruki
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get -y update 
RUN apt-get -y upgrade
ENV TZ Asia/Tokyo
RUN apt-get -y install sudo vim tar less oathtool
一応Gitにも挙げておきました。
https://github.com/katoharuki/container_for_google_auth
```


#以下設定の流れ

```
下記URLのDockerfileからビルド後、ホスト側にてちょろと設定したらおしまいです。
https://github.com/katoharuki/container_for_google_auth

[root@localhost ~]# cat ~/.bashrc
alias google_key='docker exec -t コンテナ名 oathtool --totp -d 6 --time-step-size=30s --base32 "トークン"'
alias aws-01='echo PIN`google_key`'
[root@localhost ~]# 
[root@localhost ~]# 
[root@localhost ~]# source ~/.bashrc
[root@localhost ~]# 
[root@localhost ~]# 二要素認証のワンタイムパスが出力される。
[root@localhost ~]# google_key
777777
[root@localhost ~]# 
[root@localhost ~]# 
[root@localhost ~]# PIN付きもいける。
[root@localhost ~]# aws-01
PIN777777
```

#備考
UbuntuのDockerfileを作るとき、以下のようなエラーメッセージも出ました。  

```
■エラーメッセージ
debconf: unable to initialize frontend: Dialog
debconf: (TERM is not set, so the dialog frontend is not usable.)
debconf: falling back to frontend: Readline
debconf: unable to initialize frontend: Readline
debconf: (This frontend requires a controlling tty.)
debconf: falling back to frontend: Teletype
dpkg-preconfigure: unable to re-open stdin:
```

`(TERM is not set, so the dialog frontend is not usable.)`
なにやら、フロントエンドからなんかしてあげないといけない模様。 `-y` つけてもダメな時ってあるんですね〜。
こういう時には、Docsに頼る。

>第5章 インストールシステムの起動
https://www.debian.org/releases/sarge/s390/ch05s02.html.ja  

なにやら、インストーラで使うユーザインタフェースを制御する環境変数を入れると解決できる模様です。 
下記環境変数を与えてあげることで、インタラクティブを回避できるようになり、一発でビルドが通るようになりました〜。
`DEBIAN_FRONTEND=noninteractive `


#<参考>
Ubuntu Weekly Recipe：第508回　Ubuntuでコマンドラインからワンタイムパスワードを扱う #gihyojp
https://gihyo.jp/admin/serial/01/ubuntu-recipe/0508
エンジニアとして生きていくために役立つ技術書以外の書籍9冊

# はじめに
　エンジニアとして生きていくには、技術以外にも、知っていた方が良いことがいくつかあると思いますが、関連する書籍を紹介します。

# マインド

-  [Team Geek ―Googleのギークたちはいかにしてチームを作るのか][1]
「HRTの原則」大事です。
[1]:https://www.amazon.co.jp/gp/product/4873116309

-  [エンジニアの成長戦略][2]
[2]:https://www.amazon.co.jp/gp/product/4534054939

# マネジメント

-  [エンジニアのためのマネジメントキャリアパス ―テックリードからCTOまでマネジメントスキル向上ガイド][3]
ポジション別にマネジメントスキルをまとまってます。及川さんの前書きが秀逸です。
[3]:https://www.amazon.co.jp/gp/product/4873118484

# ビジネススキル

-  [Hacking Growth グロースハック完全読本][4]
[4]:https://www.amazon.co.jp/gp/product/4822255824

-  [OKR(オーケーアール) シリコンバレー式で大胆な目標を達成する方法][5]
高い目標を意識することの大切さ
[5]:https://www.amazon.co.jp/gp/product/4822255646

-  [エンジニアのための時間管理術][6]
新入社員の時に読んでいたら、きっと仕事がはかどっただろう。
[6]:https://www.amazon.co.jp/gp/product/4873113075

-  [エンジニアのためのWord再入門講座 美しくメンテナンス性の高い開発ドキュメントの作り方][7]
[7]:https://www.amazon.co.jp/gp/product/4798117137

-  [エンジニアのためのExcel再入門講座][8]
[8]:https://www.amazon.co.jp/gp/product/4798119474

-  [エンジニアのためのPowerPoint再入門講座 伝えたいことが確実に届く“硬派な資料”の作り方][9]
エンジニアも、仕様書やプレゼン資料の作成などで、Officeツールは使うことが多いと思うので紹介。
[9]:https://www.amazon.co.jp/gp/product/4798119458

# おわりに
　英語の本は別途ご紹介したいと思います。
clouderizerを試してみた

[こちらの記事](https://towardsdatascience.com/kaggle-on-google-colab-easiest-way-to-transfer-datasets-and-remote-bash-e54c64054faa)で紹介されていたclouderizerというサービスを試しに使ってみた。
気になったところをまとめてみる。


# clouderizerとは
機械学習や深層学習用のプロジェクトを始める際の面倒な環境設定や実験環境などを簡単に構築できるようなプロジェクトテンプレートを提供してくれるサービス。
[clouderizer](https://clouderizer.com/)より


## 特徴
### 簡単にMLProject用のテンプレートを準備できる
<img src="https://qiita-image-store.s3.amazonaws.com/0/40310/e60918de-5d84-011f-fa1c-ea8d524a236e.png" width=50%>
<img src="https://qiita-image-store.s3.amazonaws.com/0/40310/64c4bee4-5ddf-bb03-7797-be24c5b1d6be.png" width=50%>
<img src="https://qiita-image-store.s3.amazonaws.com/0/40310/877af546-c596-ddc2-b38d-53cac1dc0884.png" width=50%>

### AWSやGCPをホストとして利用できる、また**Googlecolaboratory**も利用可
<img src="https://qiita-image-store.s3.amazonaws.com/0/40310/044a4c7d-fb9a-cde9-4103-3b314495b309.png" width=50%>
<img src="https://qiita-image-store.s3.amazonaws.com/0/40310/e52f02b0-79eb-fe26-d445-fa6afcaef11b.png" width=50%>

### KaggleAPIと連携できる
<img src="https://qiita-image-store.s3.amazonaws.com/0/40310/08bf14c4-1606-e15c-2f92-da5737ec3f5c.png" width=50%>
<img src="https://qiita-image-store.s3.amazonaws.com/0/40310/6c8ef0eb-ff48-7f06-238f-2b7076d0e01c.png" width=50%>



### 学習途中経過をダッシュボードで確認可能、また途中で止めても再開可能
<img src="https://qiita-image-store.s3.amazonaws.com/0/40310/f165865e-12a1-2328-efb5-c2d7f5bee989.png" width=50%>
<img src="https://qiita-image-store.s3.amazonaws.com/0/40310/470aee7d-49a7-c32f-936f-fcbd1cdab138.png" width=50%>


## 気になった点
### 有料サービスだった
<img src="https://qiita-image-store.s3.amazonaws.com/0/40310/2b0608a0-c157-5257-b42b-20b0b8411640.png" width=50%>
<img src="https://qiita-image-store.s3.amazonaws.com/0/40310/d646a553-914a-1afe-2e06-2a08448193bc.png" width=50%>

### その他
- プロジェクトの規模が大きくなった場合は有用かもしれない
- Kaggleにガチで取り組むなら便利かなと、ガチで取り組まないなら不要
- テンプレート機能は便利、ただ現状種類が少ない（2018/12/08現在13種類）



# 参考
- [Towards Data Science - Kaggle Competition on Google Colab — how to easily import datasets and local files and access remote terminal](https://towardsdatascience.com/kaggle-on-google-colab-easiest-way-to-transfer-datasets-and-remote-bash-e54c64054faa)
- [clouderizer](https://clouderizer.com/)
- [clouderizer - automatically-download-kaggle-datasets](https://help.clouderizer.com/getting-started-with-clouderizer-projects/project/automatically-download-kaggle-datasets)
Vue.jsで深い連想配列の値をwatchしたい場合

深い連想配列の値をwatchしたい場合は、こうする。


```javascript

var data = {
    hogedData: {
        fugaData: '', // これの変更をwatchしてイベントを起こしたいとする
        piypData: ''
    }
}

var vue = new Vue({
    data: data,
    watch: {
       hogeData: {
            handler(val) {
                console.log(val); // この辺に、functionを書くとfugaDataの変更を感知して起動できる
            },
            deep:true
   }
})
```

参考サイト
Vue.js API
https://jp.vuejs.org/v2/api/#vm-options
Goでの Mysql接続から構造体へのデータ割り当てまで

## GoでのMsql接続
GoにはDB接続のための標準パッケージが用意されています。
https://golang.org/pkg/database/sql/

加えて、mysqlのドライバが用意されているので、それをgo getしておきます。

```
go get "github.com/go-sql-driver/mysql"
```

## Mysql接続からデータを引っ張ってくるまで

今回は、ローカルにあらかじめ用意しておいた、IDと名前があるだけの簡単なuserデータベースにアクセスしてみます。

データベース名：gosample
テーブル名：users
<img width="262" alt="スクリーンショット 2018-12-08 20.52.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/260824/e3f624a5-5f37-c6a7-3393-d4534b00d602.png">

```go
package main

import (
	"database/sql" //ここでパッケージをimport
	"fmt"
	"log"

	_ "github.com/go-sql-driver/mysql" //コード内で直接参照するわけではないが、依存関係のあるパッケージには最初にアンダースコア_をつける

)

//引っ張ってきたデータを割り当てるための構造体を用意
type Person struct {
	ID   int
	Name string
}

func main() {

	//mysqlへ接続。ドライバ名（mysql）と、ユーザー名・データソース(ここではgosample)を指定。
	db, err := sql.Open("mysql", "root@/gosample")
	log.Println("Connected to mysql.")

	//接続でエラーが発生した場合の処理
	if err != nil {
		log.Fatal(err)
	}
	defer db.Close()

	//データベースへクエリを送信。引っ張ってきたデータがrowsに入る。
	rows, err := db.Query("SELECT * FROM users")
	defer rows.Close()
	if err != nil {
		panic(err.Error())
	}

	//レコード一件一件をあらかじめ用意しておいた構造体に当てはめていく。
	for rows.Next() {
		var person Person //構造体Person型の変数personを定義
		err := rows.Scan(&person.ID, &person.Name)

		if err != nil {
			panic(err.Error())
		}
		fmt.Println(person.ID, person.Name) //結果　1 yamada 2 suzuki

	}
}

```

##参考
Golang MySQL Tutorial
https://tutorialedge.net/golang/golang-mysql-tutorial/
【プログラミング研修お題】あなたならどう解く？線のオーバーラップを判定する

自社の勉強会で試したプログラミング研修のコンテンツです。
評判がよかったので手直しして公開することにしました。
https://github.com/5zm/case-1-line-is-overlap


![slide1.JPG](https://qiita-image-store.s3.amazonaws.com/0/195748/e6662d2a-71c0-0a8c-1e85-55ee3e367ffc.jpeg)

お題を簡単に説明すると「２つの線が重なる（オーバーラップする）かどうか判定する」処理を実装するものです。
JUnitのテストクラスも用意しているので、参加者は未実装のメソッドを実装するだけです。

実装した後に以下の観点で他の人を実装を見て議論したりします。

* ロジックの分かりやすさ　⇒　保守性
* ステップ数（実行行数）　⇒　保守性、性能（フットプリント）
* 平均処理時間　⇒　性能（レスポンスタイム）

```java:src/main/java/com/example/training/LineUtils.java
package com.example.training;

public class LineUtils {

    public static boolean isOverlap(Line l1, Line l2) {
        // TODO : implements here
        return false;
    }
}
```

お題の詳細は以下のスライドを参照ねがいます。

![slide2.JPG](https://qiita-image-store.s3.amazonaws.com/0/195748/827fb041-ae6c-b3a5-e1ff-85ffc3a17d34.jpeg)

![slide3.JPG](https://qiita-image-store.s3.amazonaws.com/0/195748/4539de23-4e39-2d0d-92ff-02cfcf7d1a13.jpeg)

![slide4.JPG](https://qiita-image-store.s3.amazonaws.com/0/195748/8ece69b8-459f-bcf6-f4fc-9afe43629951.jpeg)

![slide5.JPG](https://qiita-image-store.s3.amazonaws.com/0/195748/79a98f9c-6bd0-1ed4-a0f2-a400bdc38209.jpeg)

![slide6.JPG](https://qiita-image-store.s3.amazonaws.com/0/195748/dd5ec339-27b9-917c-7421-f9d48968ec8f.jpeg)

著者の回答は次回の記事で公開したいと思います。
コメントにみなさんの解答を頂けると幸いです。

**(2018/12/9 追記)
解答編を公開しました。実装した後にぜひご覧ください。**

[（新人必見）【解答編】【プログラミング研修お題】あなたならどう解く？線のオーバーラップを判定する](https://qiita.com/5zm/items/bdc2e4bc7b25718f7dd9)
Fusion360モデリングバトル所感

# はじめに
これは[NCC Advent Calendar 2018](https://qiita.com/advent-calendar/2018/ncc)の8日目の記事です。

Fusion360の話だけです。
問題解説ではありません。

# モデリングバトルや！
[Fusion360 BASEさん](https://fusion360.3dworks.co.jp/)で開催されていますね。
「たくさんイベントがあってわいわいしてるので、たまには参加しよう」と思ってガチで参戦しています。
現在総合順位2位です！わ～い！:clap:

### ところでモデリングバトルってなんぞや。
三面図を見て、その立体をモデリングする速さを競う大会です。

- 三面図が3つ出されるので全部モデリング
- モデリングした3Dモデルの体積の小数点第1位を四捨五入
- 3つの体積の合計を専用フォームに入力する
- はやかった上位10人に順位に応じてポイント付与
- 合計ポイントで競います！

Fusion360以外のツールでつくると失格です。
詳しいことはこちら
[モデリングバトル 「FUSION BASE」予選開催！](https://fusion360.3dworks.co.jp/2018/11/21/modeling-battle-2/)

### 現在第2回仮予選まで開催されました
全4回の仮予選。第2回まで開催されました。あと2回ですね～
現在の順位はこちら
[第2回モデリングバトル仮予選　結果発表！](https://fusion360.3dworks.co.jp/2018/12/07/result-2/)

ここまで参加した所感について書こうと思います。


# 事前練習
三面図を読むことには自信があったつもりでしたが、モデリングするとなるとしんどかった…
ご存知の通りモデリングは立体のイメージがはっきり正確に描けていないとできませんから、三面図を正確に読みとる練習が必要でした。
~~いつもなんとなくでモデリングしてたツケだわ！~~

第1回仮予選が11/29でした。1週間前から毎日三面図とにらめっこしてました。
ちなみに三面図から体積を出す問題は、[テルえもんクエスト](https://fusion360.3dworks.co.jp/tag/%E3%83%86%E3%83%AB%E3%81%88%E3%82%82%E3%82%93%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88/)という名前で同サイトに多数投稿されています。ご参考までに。

# 出陣！
### 第1回仮予選
11/29に開催されました。問題はこちら
[第一回仮予選！モデリングバトル予選大会](https://fusion360.3dworks.co.jp/2018/11/29/modeling-battle-4/)

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">本日21:00からは、モデリングバトル予選大会の第一回です！<br>練習問題が難しすぎるという感じた方もご安心ください！<br>本題はもう少し簡単です！！<a href="https://t.co/8xAdOGn00o">https://t.co/8xAdOGn00o</a> <a href="https://t.co/RH1zcsGe3w">https://t.co/RH1zcsGe3w</a></p>&mdash; Fusion BASE (@Fusion_BASE) <a href="https://twitter.com/Fusion_BASE/status/1068068915484360705?ref_src=twsrc%5Etfw">2018年11月29日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
この言葉通り、第1回は超手加減してくださいました。~~どう見てもLEGO~~

2問目は右側面図を見ながらちまちまやっていくしかなさそうですね… ショートカットできそうなところはなさそうです。
1問目と3問目が勝敗をわけた気がします。
特に1問目はこれパターンですかね？ うまく活用するとめちゃくちゃはやくとけますよね。
私はおつむが小さいので、対称軸を考えるよりちまちま作ったほうがはやそうだったのでちまちましました…
あと**シェル**コマンド大好き芸人の私が喜ぶ問題でした。

個人的に第1回は悔いしかないです。もっと上に行けたはず。
敗因の1つは先述のパターンが活用できなかったこと。
もう1つはFusion360が1問目の途中で落ちたこと。Fusion360は動作を停止しました。**今日は耐えろよ！**

### 第2回仮予選
12/6に開催されました。問題はこちら
[第二回仮予選！モデリングバトル予選大会](https://fusion360.3dworks.co.jp/2018/12/06/modeling-battle-5/)

急に難易度が上がってきてビビりました…
第1回が簡単で完全に舐め腐ってましたごめんなさい。

1問目が難しかった…

- 傾いた円柱をどうつくるのか
- 「C」型の先端の構造をはやく見抜けるか

がポイントに思います。特に後者は細かいので、よく見ようとしてディスプレイに顔をぶつけました。
あと、こういう曲面が嫌な感じに影響してくるbody同士の合成には**境界塗り潰し**を使ってしまいます。もっといい方法があるんでしょうか…？

第2問と第3問はR(半径)とΦ(直径)が混在していましたね…「これが俗にいうBADUIか…」と思ってました。
3問目の`R2.5`と`Φ2.5`に気づけなくて時間ロスした人は私だけではないはず。

# 問題がよい
[テルえもんクエスト](https://fusion360.3dworks.co.jp/tag/%E3%83%86%E3%83%AB%E3%81%88%E3%82%82%E3%82%93%E3%82%AF%E3%82%A8%E3%82%B9%E3%83%88/)もそうですが、この問題たちは**初心者の入門に最適**だと感じています。
立体のイメージを持つ練習になるのももちろんですが、**基本的なコマンドを網羅している**ように感じます。
スケッチの作成だけでなく、面の構築やブーリアン演算による立体の合成も身につくので、よい教材になるように思いました。

~~NCC勉強会の課題にしま～す~~


# みんな参加しよう！
次回は**12/13(木)21:00～**です！
私も本気で1位狙いに行くのでみんなでわいわいしましょう:clap: