OmniAICreator/Qiita-1.07M huggingface dataset:
Pythonのテストを動かしてみた

とりあえずassertを使って動作確認をしてみる。
以下のサンプルコードを同一改装に保存する。



# テスト用サンプルコード

```py:sample_file1.py

def r_str(val):
    s = str(val)
    return s

def r_ch_str(val):
    s = str(val) + 'hgoe'
    return s

def r_true():
    return True

def r_false():
    return False

def raise_type_error():
    raise TypeError

```


# テストコード

```py:assert_test.py

import unittest
import sample_file1 as sf


# モジュール全体の初期化時に一度だけ読み込まれる
def setUpModule():
    print('set_up_module!')

# モジュール全体の終了時に一度だけ読み込まれる
def tearDownModule():
    print('tear_down_module!')

class TestAssert(unittest.TestCase):

    """
    初期設定
    """

    # テスト初期化時に一度だけ読み込まれる処理
    @classmethod
    def setUpClass(self):
        print('set_up_class!')

    # テスト終了時に一度だけ読み込まれる処理
    @classmethod
    def setUpClass(self):
        print('set_up_class!')

    # テスト単位の実行時に読み込まれる処理
    def setUp(self):
        print('set_up!')

        self.dummy_text = 'ダミーテキスト'
        self.dummy_num  = 0

    # テスト単位の実行時に読み込まれる処理
    def tearDown(self):
        print('tear_down!')


    """
    テスト開始
    """

    # assertEqual -> a == b
    def test_assert_equal(self):
        exam = self.dummy_text
        res  = sf.r_str(self.dummy_text)
        self.assertEqual(res, exam)

    # assertNotEqual -> a != b
    def test_assert_NotEqual(self):
        exam = self.dummy_text
        res  = sf.r_ch_str(self.dummy_text)
        self.assertNotEqual(res, exam)

    # assertTrue -> is True
    def test_assert_true(self):
        self.assertTrue(sf.r_true())

    # assertFalse -> is False
    def test_assert_false(self):
        self.assertFalse(sf.r_false())

    # assertRaises -> check ErrorType
    def test_assert_raises(self):
        self.assertRaises(TypeError, sf.raise_type_error)


if __name__ == '__main__':
    unittest.main()



```

# テスト実行方法

```zsh
$ python assert_test.py
```

# デバッグ方法（ブレイクポイント）
以下のコードを停止したい場所に埋め込む

```py
import pdb; pdb.set_trace()
```

```py:例

def r_str(val):
    s = str(val)
    import pdb; pdb.set_trace()
    return s

```

# 感想

とりあえずこれだけわかればテストがかけそう。
今後も記事をアップデートする予定。

# 参考

- [26.4. unittest — ユニットテストフレームワーク](https://docs.python.jp/3/library/unittest.html#unittest.TestLoader.discover)
- [[Python2.7] unittest の使い方まとめ](https://qiita.com/koara-local/items/8c0b464e3f22c8a7cdc2)
【view】viを読み取り専用（readonly）で開く

設定ファイルの内容確認をしたい！
そうだ、viで設定ファイルを見てみよう！
・・・だけど、うっかり上書き更新したらどうしよう:disappointed_relieved:
そんな時に使うのが :arrow_down: 

# viewコマンド
```
# view xxx.conf
```
windowsだと、とりあえず「メモ帳」で開いてみる・・・そんな感じで、ファイルはなんでもviで開こうとする人も多いのでは？
そんな時、viじゃなくてviewを使うと、それだけで読み取り専用になります。
これで、うっかり上書き更新することもなくなりますね:cherries:

## メリット
- viの読み取りモードなので、viと同じコマンドが使える。

## デメリット

- 容量の大きな閲覧には適さない（ファイルの中身をすべてオープンするため）。
WordPressのdocker環境作成

### 0. 変数セット
```
$ MYSQL_CONTAINER='test-mysql'
$ WORDPRESS_CONTAINER='test-wordpress'
```

### 1. MySQL環境作成
```
$ docker run --name ${MYSQL_CONTAINER} \
-e MYSQL_ROOT_PASSWORD=password \
-e MYSQL_USER=wordpress \
-e MYSQL_PASSWORD=password \
-e MYSQL_DATABASE=wordpressdb \
-d mysql
```

### 2. WordPress環境作成
```
$ docker run --name ${WORDPRESS_CONTAINER} \
--link ${MYSQL_CONTAINER}:mysql \
-p 8080:80 -d wordpress
```

#### ホスト側のディレクトリをマウントする場合
ホスト側の /tmp/wptest というディレクトリをマウントする場合

```
$ PATH_OF_LOCALHOST="/tmp/wptest"
$ PATH_OF_CONTAINER="/tmp/wptest"
$ docker run --name ${WORDPRESS_CONTAINER} \
--link ${MYSQL_CONTAINER}:mysql \
-v ${PATH_OF_LOCALHOST}:${PATH_OF_CONTAINER} \
-p 8080:80 -d wordpress
```

### 3. 確認
```
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
d2xxxxxxd197        wordpress           "docker-entrypoint..."   33 seconds ago      Up 32 seconds       0.0.0.0:8080->80/tcp   some-wordpress
afxxxxxx20b2        mysql               "docker-entrypoint..."   2 minutes ago       Up 2 minutes        3306/tcp               wordpress-mysql
```

### 4. ブラウザから確認
http://localhost:8080/wp-admin/install.php

### (おまけ)起動したWordPressのコンテナにシェルで入る
```
$ docker exec -i -t ${WORDPRESS_CONTAINER} /bin/bash
```
[Rails]ActiveModelで違うColumn名でも同じvalidationルールを共有したい

# 同じvalidationルールだけど、違うColumn名でvalidationしたい状態

RailsでActiveModelを書いてると同じvalidationのルールだけど、カラム名が違うってことあると思います。例えば次の２つのModel `Foo`, `Bar` があるとします。

```rb:app/model/foo.rb
class Foo < ActiveModel::Base
  validates :phone_hoge, present: true, format: { with: /\A0\d{9,10}\Z/ }

  validates :column_piyo, present: true

  # ...
end
```

```rb:app/model/bar.rb
class Bar < ActiveModel::Base
  validates :phone_fuga, present: true, format: { with: /\A0\d{9,10}\Z/ }

  validates :column_toto, present: true

  # ...
end
```

この２つのModelでは `phone_hoge`, `phone_fuga` という２つのColumnがあり、そのどちらもが同じValidationルールを持っています。この２つのValidationルールを一緒に管理したい場合はどうすれば良いのでしょうか？

# CustomValidatorを作りましょう

`ActiveModel::Validator` を継承した新たなValidationClassをつくり、各Modelで `validates_with` でvalidateします。

```rb:app/model/validator/phone_validator.rb
class PhoneValidator < ActiveModel::Validator
  def validate(record)
    i18n_message_path = "activerecord.errors.models.#{record.class.name.underscore}.attributes.#{options[:column_name].to_s}.not_allow_format"

    unless present_checker(record[options[:column_name]])
      record.errors[options[:column_name]] << I18n.t(i18n_message_path + '.blank')
    end

    unless format_checker(record[options[:column_name]])
      record.errors[options[:column_name]] << I18n.t(i18n_message_path + '.not_allow_format')
    end
  end

  private

  def present_checker(str)
    return false if str.nil? || !str.is_a?(String)
    true
  end

  def format_checker(str)
    return false if (str =~ /\A0\d{9,10}\Z/).nil?
    true
  end
end
```

```rb:app/model/foo.rb
class Foo < ActiveModel::Base
  validates_with PhoneValidator, column_name: :phone_hoge

  validates :column_piyo, present: true

  # ...
end
```

```rb:app/model/bar.rb
class Bar < ActiveModel::Base
  validates_with PhoneValidator, column_name: :phone_fuga

  validates :column_toto, present: true

  # ...
end
```

# Ruleの表現がめんどくさいので、 `validates` を使ってCustomValidatorを作りたい人へ

このようなのはどうでしょう？　`CustomValidator`　内で宣言している `phone_validates` 自体は内部で `validates` を利用しているので、 `validates` が提供しているオプションをそのまま利用できます。

```rb:app/model/concern/custom_validator.rb
require 'active_support'

module CustomValidator
  extend ActiveSupport::Concern

  class_methods do
    def phone_validates(col_name, *options)
      arg = options.extract_options!
      send(
        :validates,
        col_name,
        presence: arg[:precense],
        format: { with: /\A0\d{9,10}\Z/ }
      )
    end
  end
end
```

```rb:app/model/foo.rb
class Foo < ActiveModel::Base
  include CustomValidator

  phone_validates :phone_hoge, precense: true

  validates :column_piyo, present: true

  # ...
end
```

```rb:app/model/bar.rb
class Bar < ActiveModel::Base
  include CustomValidator

  phone_validates :phone_fuga, precense: true

  validates :column_toto, present: true

  # ...
end
```

`validates` を違うColumn名で共通化したい人はこちらのほうが良いかもしれませんね。
UITableViewでtableView:heightForRowAt:メソッドが呼ばれない！

## `tableView:heightForRowAt:`メソッドが呼ばれない！

<img width="414" alt="96E9FA1E-F755-4555-B9D6-FE60EED7E081.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/38924/fa30e037-29ae-0f57-a7ee-c384743048ac.jpeg">

上のスクリーンショットのように、セルの高さがことなるテーブルビューをつくるときには、下記のように`tableView:heightForRowAt:`メソッドで動的に高さを変更します。

```Swift
	func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
		switch type {
		case .book:
			if books.count > 0  {
				return 150
			}
			return 60
		case .game:
			return 120
		}
	}
````

開発中のアプリでも動的にセルの高さを変更しようとしましたが、なぜかできませんでした。原因を調べてみると、`tableView:heightForRowAt:`メソッドが呼ばれていません。

## アップル公式リファレンスをしっかり読みましょう

なぜメソッドが呼ばれないのか？　あれこれ調べてみましたが、とても単純な理由で、tableViewのdelegateの設定をしてなかったからです。

`tableView:heightForRowAt:`メソッドは、名前と処理内容から想像してdataSourceのメソッドかと思い込んでいました。しかし、[アップル公式ドキュメント](https://developer.apple.com/documentation/uikit/uitableviewdelegate/1614998-tableview "アップル公式ドキュメント")をみてみると、バッチリ『Asks the delegate』と書いているではありませんか！

![1389D925-D3BC-476E-B5EF-EA47561D4BD5.png](https://qiita-image-store.s3.amazonaws.com/0/38924/426f86ac-af2f-c69c-5ae6-f5eedc208922.png)

というわけで、`UITableViewDelegate`を設定すると、無事に`tableView:heightForRowAt:`メソッドが呼ばれるようになりました（よかったよかった）。

テーブルビューをつかうときには、dataSourceとdelegateの両方を設定する場合がほとんだと思います。ですので、今回のような事態に陥ることはあまりないでしょう（今回は、開発中だったので、まずはdataSourceだけ実装していたために発生しました）。

とはいえ、この世界のだれかが同じ悲しみの沼にハマる可能性がゼロではありませんので、この記事をしたためました。

さいごにひとこと。
アップル公式リファレンスは、しっかり読みましょう＞自分。
（[アップル公式リファレンスと仲良くなって、目指せ楽々アプリ開発！](https://qiita.com/toshi586014/items/9f976ee159fe96cd680d "アップル公式リファレンスと仲良くなって、目指せ楽々アプリ開発！")っていう記事を書いているくらいなのに……。おはずかしい😱）
まれによく使う正規表現

# はじめに

- 登録フォーム作るときとかに使いそうな正規表現ネタのメモです
- 細かいルールは別途学んでください
- 動作確認はテキストエディタ（秀丸・サクラエディタ）のチェックしかしていません
- **メールアドレスの正規表現はRFCに準拠していません**


# まれによく使う正規表現

## 郵便番号

### 「-（ハイフン）」なしパターン（例：1234567）
```
^\d{7}$
```
とりあえず半角数字7桁ならOKの例です
○：1234567
×：123-4567
×：123456

### 「-（ハイフン）」ありパターン（例：123-4567）
```
^\d{3}-\d{4}$
```
「半角数字3桁」＋「-（ハイフン）」＋「半角数字4桁」の例です
○：123-4567
×：1234567
×：123-456

## 電話番号
### 「-（ハイフン）」なしパターン（例：0001112222）
```
^0\d{9,10}$
```
先頭が「0」で残り9桁または10桁の半角数字が続く例です

○：0001112222
×：000111222
×：9001112222

### 「-（ハイフン）」ありパターン（例：000-1111-2222）
```
^0\d{2,3}-\d{1,4}-\d{4}$
```
先頭が「0」＋「半角数字2から3桁」＋「-（ハイフン）」＋「半角数字1から4桁」＋「-（ハイフン）」＋「半角数字4桁」の例です

○：000-1111-2222
×：00000-1111-2222
×：000-11111-2222
×：000-1111-22222

### モバイル版「-（ハイフン）」ありパターン（例：080-1111-2222）
```
^(070|080|090)-\d{4}-\d{4}$
```
先頭が「070」or「080」or「090」のいずれか＋「-（ハイフン）」＋「半角数字4桁」＋「-（ハイフン）」＋「半角数字4桁」の例です

○：080-1111-2222
×：000-1111-2222
×：080-11111-2222


## メールアドレス

### 前提
使用可能文字と条件

- 半角英数字
- 記号（「.（ドット）」「-（ハイフン）」「_（アンダーバー）」）・・・他の記号は許容しません
- @（アットマーク）・・・1つだけあること

**「ダブルドット問題」**や**「@の直前のドット問題」**や**「使用可能記号問題」**は今回割愛します。


### いろいろとゆるいパターンです
```
^[a-zA-Z0-9-_\.]+@[a-zA-Z0-9-_\.]+$
```
○：hoge@hoge.com
○：h-o.g_e..@h-o.g_e..com
×：hogehoge.com
×：h!o!g!e@hoge.com

## 都道府県
※先頭から始まる都道府県の単語のみ検索です

```
^(東京都|北海道|(京都|大阪)府|.{2,3}県)$
```

○：京都府
○：神奈川県
×：東京都府
×：西東京都
×：神奈川県横浜市

# おわりに

普段使わないけれども、まれによく使う正規表現パターンをまとめました。
ここに寄稿するにあたって、再び勉強することができたのが一番の成果です。
Diffie-HellmanとForward Secrecy

SSLで使われる暗号化方式にもいろんなものがありますが、それぞれに違った特性を持っています。

# RSAによる鍵交換

かつて一般的に使われていたRSA鍵交換はシンプルな手法で、鍵の素材となる`pre_master_secret`を、サーバー側の公開鍵で暗号化するというものでした。これを復号化できるのは秘密鍵を持ったサーバサイドだけ…ということになって、普通に考えれば安全性は確保できます。

しかし、たとえばハートブリードのように、秘密鍵が漏洩してしまったとしたらどうでしょうか。また、NSAなど国家機関が暗号化後のデータをすべて保存していて、あとから流出なり計算なりで特定した秘密鍵を当てはめる攻撃をしたとしたらどうでしょうか。

このような場合も、暗号通信の安全性を確保できるようにする方法として、Forward Secrecyがあります。

# Diffie-Hellman鍵共有

RSA暗号は、離散対数問題（$a^b \bmod n$ はすぐに計算できるけど、逆に $a^x \equiv k \pmod{n}$ の$x$は容易に計算できない）を利用した公開鍵暗号ですが、Diffie-Hellman鍵共有は同じ離散対数問題を使って、鍵共有を実現するアルゴリズムです。

まず、暗号パラメーターとして、素数 $p$ と、その上で$g^n \bmod p$が0～p-1まで全パターンを取るような$g$を用意します（これは毎回使いまわしでも問題ありません）。

通信しようとするアリスとボブは、それぞれ0～p-1の範囲内で $a$と$b$という数を用意して、これは自分だけの秘密としておきます。そして、$A = g^a \bmod p$、$B = g^a \bmod p$を計算して、適当な通信路で相手に送信します。

受け取った側では、自分の秘密の値と相手から受け取った値を掛け合わせることで、同じ値を共有できます（$Ab \equiv aB \equiv g^{ab} \pmod{p}$）。一方で、この通信を傍聴していても、$A$と$B$からは同じ値を決めることができません。

なお、楕円曲線についても、同様な方法で「楕円曲線Diffie-Hellman鍵共有」が構築されています（詳細は省略します）。

# Forward Secrecy

このようなDiffie-Hellman鍵共有をSSLの中に取り入れるとどうなるでしょうか。鍵の共有には、もはや証明書の鍵は無関係となり、この通信の解読を行おうとすれば、「この通信の」ハンドシェイクなどから暗号鍵を割り出す必要が出てきます。このように、秘密保持を証明書などの固定的な鍵に頼らない暗号化方式を、Forward Secrecyといいます。

また、DSA、ECDSAなど、証明書の鍵が証明専用のものの場合も、暗号鍵は別にやり取りするForward Secrecyを使うしかありません。

## 欠点、実装上の問題

歴史的経緯もあって、DHEでは鍵交換が1024ビットしかなく弱くなってしまう設定や実装が広まっていたということがありましたが、これはきちっと設定すれば回避できます。あと、巨大な素数をハンドリングするDHEは通常のRSAと比べて鍵交換が遅くなる、ということもありましたが、ECDHEはあまり変わらないぐらいのスピードが出ます。
Rails rake 自作のタスクも含めて一覧表示


## rakeタスク一覧表示
コマンドは以下でOK。 
ただし自作したrakeファイルに```desc```がないと表示されない。 
どんなtaskがあるのか調査する際は注意。 

```ruby:コマンド
rake -T
```

- rakeファイルを自作するコマンド

```ruby:コマンド
rails g task rake_sample
```

- 自作したファイルは./lib/tasks配下に作成される

タスク一覧に表示させるように、```desc```を必ず記載しよう。

```ruby:./lib/tasks/rake_sample.rake
namespace :rake_sample do
  desc "rake_sample" #これがないとタスク一覧に表示されないので注意
  task :hoge do
    puts "test"
  end

  desc "hello"
  task :hello do
    puts "Hoge"
  end
end
```

- 結果確認

```text:タスク一覧に表示されることを確認
rake -T
rake task_sample:hello                  # hello
rake task_sample:test                   # test
```
Androidアプリ開発 初学者インストールセット

Androidアプリ開発１年生です。
PC買い替えたので、改めて開発PC(Surface Pro）必要ソフトのインストールです。
自分的最小構成は、JAVA、Android Studio、Git、GitHub で、
いろいろ迷子したけど、これだけで良かったんだなと、改めて思えました。
ホント、無駄に、いろいろ、心、迷子、しました。疲弊しました無駄に。
これからはシンプルに生きていきます。


Androidアプリ開発　初学者インストール

（１）<a url="http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html">JAVA インストール</a>
・画面中央ラジオボタン「Accept License Agreement」をチェック
・自分は Surface Pro (Windows10) なので「Windows x64」をダウンロード
・インストール

Androidアプリ開発といえばJAVAで選択肢は無いと思っていた昨年の自分。
でもでもIT業界の変化は速く、2017年にはKotlinが公式言語に加わりました。
モヤモヤして「Kotlin勉強したほうがいいかな…」とか数時間考え込みましたが、
まず、身の程をわきまえることにしました。
今ここにいるJAVAを大切に、一瞬一瞬を愛して生きていきたいと思います。
あとなんか調べてたらJAVA←→Kotlin変換とか、部分的にKotlinで記述とか、
シームレスに両方活用できる仕組みになってるみたいだったので、
勉強するとかしないとか考えないで、Kotlinのことは一旦忘れることにしました。

（２）<a url="https://developer.android.com/studio/index.html?hl=ja">Android Studio インストール</a>
・何はともあれダウンロード、インストール
・ダークなデザインが好きなら変更してテンション上げる（私は気分で変える）

　デザイン変更
　Settings > Appearance & Behavior > UI Options > Theme:
　「IntelliJ」→「Darcula」

（３）<a url="https://git-scm.com/download/win">Git インストール</a>
・Windowsユーザーのみ（Macには入ってるから不要）
・URLを開くと自動でダウンロードが始まる
・デフォルトでひたすらNextしてインストール

（４）<a url="https://github.com/">GitHub アカウント作成・接続</a>
・なくても開発できるけど、絶対後で気になるはずだから、最初に接続しておく。
・Freeプランでよし

　GitHubアカウント を Android Studio 3 に接続
　　Settings > Version Control > GitHub
　　　Host: github.com（デフォルト）
　　　Auth Type: 「Token」→「Password」
　　　Login: （ID）
　　　Password: （パスワード）
　　　Test→コネクション出来たらOK→今後は入力不要

以上！

あとは、Android開発に限らない感じですが画像制作用にPhotoshopCCを入れて完成。
準備が出来たので、新しい Surface Pro でも元気に勉強していきたいと思います♪
【ぶっちゃけiOSアプリ開発】手っ取り早くObjective-cを理解する | その1 ヘッダファイルと実装ファイル

細かいことや例外的なことは後回しでいいので、手っ取り早くobjective-cを理解して使い始めたいという人向けです。他言語を経験していることが前提です。
#ファイルの構成
ファイルには「.h」ヘッダファイルと「.m」実装ファイルがある。
書き方は以下の通り。

ヘッダファイルは@interface〜@endで囲む。

```objectivec:〜.h
#import ヘッダファイル

@interface クラス名 : スーパークラス

外部に公開する変数やメソッド

@end
```
実装ファイルは@implementation〜@endで囲む。

```objectivec:〜.m
#import ヘッダファイル

@implementation クラス名

変数やメソッドを実装

@end
```
##ヘッダファイル
外部に公開するものが無いときは、何も書かなくてよい。
ViewControllerの場合は必要になったときに書けばよい。なので、ヘッダファイルを理解していなくてもUIアプリは組める。

```objectivec:ViewController.h
#import <UIKit/UIKit.h>

@interface ViewController : UIViewController


@end
```
##実装ファイル
ViewControllerの例で。

```objectivec:ViewController.m
#import "ViewController.h"

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

@end
```
デフォルトでviewDidLoadメソッドとdidReceiveMemoryWarningメソッドが実装されている。このように、@implementation〜@endの間に実体を書く。
自分でメソッドを作りたかったらこの中に追記する。

> viewDidLoadメソッドはこの画面(ViewController)がつくられた時に呼び出されるメソッド。ViewControllerのメソッドについては別の記事で書く。

##ヘッダファイル（続き）
もう一度、ヘッダファイルの書き方。

```objectivec:〜.h
#import ヘッダファイル

@interface クラス名 : スーパークラス

外部に公開する変数やメソッド

@end
```
外部に公開するものがあるときは、@interface〜@endの間に書く。
###変数を公開する場合
QiitaTestという普通のクラスを作ったとして、公開する変数（プロパティ）を書く。

```objectivec:QiitaTest.h
#import <Foundation/Foundation.h>

@interface QiitaTest : NSObject

@property (nonatomic) NSInteger number; // 外部公開プロパティの宣言

@end
```
>※プロパティとは
本来objective-cではインスタンス変数にはsetter/getterというメソッドを使ってアクセスする必要があるが、setter/getterメソッドをいちいち実装するのが面倒なので@propertyを使う。
変数（プロパティ）へのアクセス方法は別の記事で説明する。

>※nonatomicとは
プロパティに特に制限を加えない場合はnonatomicを指定しておけばよい。書き込み禁止とか排他制御したい場合は別オプションを指定する。

###メソッドを公開する場合

```objectivec:QiitaTest.h
@interface QiitaTest : NSObject

@property NSInteger number;

- (void)testMethod; // 外部公開メソッドの宣言

@end
```
メソッドの書き方と呼び出し方は別の記事で説明する。

---
ぶっちゃけiOSアプリ開発は、アプリ開発にあたってとりあえず知っておくべきことをズバリ書きます。例外はありますのでご了承ください。
PYNQをGUIでリモートできなかった話

#前提
自己紹介：Linux初心者，Zynq初心者，投稿初心者(お手柔らかにお願いします)
ここでやりたいこと：PYNQにGUIでリモート接続
ホントにやりたいこと：PYNQを使ったFPGAプログラミング
→ユーザxilinx以下のディレクトリではなく管理者ディレクトリにアクセスして直接bnn.pyとか.vファイルをいじりたい
![explore_xilinx.png](https://qiita-image-store.s3.amazonaws.com/0/165289/2be156bc-e750-d4c8-1e21-2a94a2e9c9e6.png)
　　　　　　↑
このディレクトリの上にアクセスしたかった

#GUIだと何がいいのか
CUI：ディレクトリ構造考えながらコマンド叩く
→Nintendo64のスパーマリオ64で水中ステージで潜りっぱなしのごとくストレスフル

GUI：エクスプローラをポチポチできるので初心者も安心
→透明マリオでどこでもいける気分

※個人の感想です

#環境
クライアント側：デスクトップ OS：win10 64bit
ホスト側：PYNQ-Z1ボード　OS：ubuntu 15.10

#やったこと
1.vnc接続に挑戦
2.諦めてWinSCP

#1.vnc接続に挑戦

> sudo apt-get install vnc4server

結果...

> WARNING:The following packages cannnot be authenticated!

信頼してなくてもいいからインストールして欲しかったんですが...

> E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?

とのことです
apt-getをupdateしたりrpmインストール頑張ってyumから落とそうとしたりしたんですが，
まぁうまくいかなかったので...

#2.諦めてWinSCP
WinSCP，調べればわかりますが，一言でいうと“エクスプローラ的なUIでリモート接続できるやーつ”です
あー便利。

というわけで，ダメもとでログインしてみたら入れました
![WinSCP_PYNQ.png](https://qiita-image-store.s3.amazonaws.com/0/165289/d6d77316-dd9d-f970-7508-0360fc05690e.png)


そのうちGUI接続には再チャレンジしますが，ひとまずこれで◎

#追記
sudoユーザでログインしているわけではないので，ディレクトリの閲覧はできても操作はできません．
ということは！意味なさそう...ですが目に見えるほうが精神衛生上まだましかな，という感じです．
【WinSCPでsudo使う】みたいな話も多々あるので，それもそのうち挑戦してみます．
[Rails]ActiveModelの同一Column名の同一validationを複数Modelで共有する

# 同じColumn名で同じvalidationルールなのにバラバラに定義されている状態

RailsでActiveModelを書いてると同じColumn名の時同じValidationを使うのでDRYにしたいと思うことは誰しもあるでしょう。例えば次のような２つのModel `Foo`, `Bar` がある時です。

```rb:app/model/hoo.rb
class Foo < ActiveModel::Base
  validates :column_hoge, present: true
  validates :column_fuga, numericality: { only_integer: true }

  validates :column_piyo, present: true

  # ...
end
```

```rb:app/model/bar.rb
class Bar < ActiveModel::Base
  validates :column_hoge, present: true
  validates :column_fuga, numericality: { only_integer: true }

  validates :column_toto, present: true
  
  # ...
end
```

これらのモデルの `column_hoge`, `column_fuga` はColumn名も同一で、validationのルールも同一です。これらを一箇所で定義できたら素敵ですね。

# `ActiveSupport::Concern` を使って `validates` を共通化する

この場合は、 `ActiveSupport::Concern` でModelから共通の `validates` を抜き出しましょう。

```rb:app/model/concern/hoge_fuga_validator.rb
require 'active_support'

module HogeFugaValidator
  extend ActiveSupport::Concern

  included do
    validates :column_hoge, present: true
    validates :column_fuga, numericality: { only_integer: true }
  end
end
```

```rb:app/model/hoo.rb
class Foo < ActiveModel::Base
  include HogeFugaValidator

  validates :column_piyo, present: true

  # ...
end
```

```rb:app/model/bar.rb
class Bar < ActiveModel::Base
  include HogeFugaValidator

  validates :column_toto, present: true

  # ...
end
```

これで、自動的に各Modelの `column_hoge`, `column_fuga` がvalidationされます。
Winpython 64bit のQt Designerを動かすためのメモ

#Winpythonのインストール

以下からダウンロード＆インストール
https://winpython.github.io/

WinpythonがインストールされたフォルダにQt Designerがあるけど、そのままでは起動しない。ほんとにうんともすんとも言わない。(´・ω・`)

#pyqt5-toolsのインストール

以下からダウンロード
https://pypi.python.org/pypi/pyqt5-tools

WinPython Control Panel.exe を起動し、Add packegesをクリックし、ダウンロードしたpyqt5_tools-xxxxx.whlを指定する。
Install packegesのボタンがアクティブになったらクリックしインストール。

#Qt Designerの起動

でこんな感じ。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/156294/9d23718f-33c6-de8a-f231-0b91c2e47d91.png)
ルートディレクトリのGit管理削除法【備忘録】

Git学習して間もない頃に、Googleドライブ直下やusername直下で`git init`してて激重のまま何ヶ月も過ごした思い出があります。
今後同じような犠牲者を未然に防がねばと記載いたします。
→完全備忘録です。

### 現象
<img width="162" alt="スクリーンショット 2017-11-25 16.36.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/179505/0e11148d-5b7f-18d3-37c7-7f6bf83f0bd7.png">

finderのルートディレクトリのキャプチャですが、自分は何を思ったかGoogleドライブ、書類(Documents)ディレクトリ直下でgit管理を行なっていたのです。
下記のように。

```bash:git
$ cd ~/Documents
$ git init

$cd Google\ ドライブ
$ git init
```
といった風な具合にgit管理を行なっていました。
無知って恐ろしい...

### これの何がいけないのか
**とにかく重い**
コマンド操作がはちゃめちゃに遅かったです。
`git status`エンター押して1秒後に結果みたいな。
普段vscodeを使っているのですが、vscodeのaddする前って(~~ステージング状態？~~ワークツリー)の現状をお知らせしてくれる機能があって、それがいつも99以上ってなってたんですよね。
99以上は表示されませんがおそらく1000件以上スタンバッテた思われます。　　

### 解決法
対象のディレクトリへ移動後下記コマンド
`git -rm .git`
結局のところ.gitが全てを統括しているのでこの子さえ削除してしまえばgit管理から解放されるとのこと。

`git rm`や`git rm -r`でファイルやディレクトリを削除するのかと思っていましたが、こちらは.git管理下の中でのことらしいです。
Hello Python 🐍

### 目的

Pythonを勉強したい！！
というわけですこしづつ形にしていこうと思います！！

### 環境について

普段はMacを用いて、仕事やコードを書いています。
したがって標準で入っているPythonは2.7系です。

```
### MacのPython環境

$ python --version
Python 2.7.10
```

ただ、Python2系はサポートは2020年までが公式で発表されています。([wikipedia](https://ja.wikipedia.org/wiki/Python))
今から始めるのであれば、Python3系をやっていくのがいいでしょう。
勿論2系のコードがたくさんあるので、2系からでも間違いではないですが、まずは自分で0から書けるようになれるように3系を使っていこうかと思います。

Pythonを複数バージョン扱うにはいくつか方法がありますが、今回はDockerを使用して環境を作っていきます。
前提として手元のMacに[Docker for Mac](https://docs.docker.com/docker-for-mac/install/#download-docker-for-mac)がインストールされているとします。

**Dockerfile**

```
FROM python:3.6.2-stretch

RUN apt-get update
RUN apt-get install -y vim python-pip

RUN pip install ipython
```

上記のDockerfileを用いてdockerコンテナを作ってログインします。

```
$ export TAG=py-3
$ docker build . --tag ${TAG}
$ docker run --rm -it -v $(cd `dirname $0`; pwd)/src:/opt -w /opt --name="from-${TAG}" ${TAG} /bin/bash
```

+ コンテナ内でPythonのバージョンを確認する

    ```
    # python --version
    Python 3.6.2
    # pip --version
    pip 9.0.1 from /usr/local/lib/python3.6/site-packages (python 3.6)
    ```

これで、Pythonの環境が整いました。
これから少しづつPythonを触っていきたいと思います！！
OSError Failed to create queueが出る原因


#原因
指定したqueueを別のものが使っているのが原因．queueでbindeできるのは１つまで．

よくあるミスとしては，プログラムを終了するときにctr+cではなくctr+zで停止したとかとか．

#対処法
今bindしているやつを解除してあげれば良い．これで解決．


もしbindしているものがctr+zで停止したプログラムならctr+cとかを使って終了させてやれば良い．停止したプログラムは「jobsコマンド」で確認できる．起動は「fg jobsで一番左にある番号」．　

```
>>>jobs
[1]+  Stopped                 test.py

>>>fg 1
test.py
```

その後，bindしているプログラム（今起動したやつ）を終了させてやればOK．

#参考
https://stackoverflow.com/questions/37383456/netfilterqueue-implementation
iOS SafariでReactVRを二眼モード

webvr-polyfill を使うとiOSブラウザでも確認できる模様．
https://github.com/googlevr/webvr-polyfill

プロジェクトルートでwebvr-polyfillをinstall

```bash
npm install -save webvr-polyfill
```

webvr-polyfillをimport

```js:client.js
// Auto-generated content.
// This file contains the boilerplate to set up your React app.
// If you want to modify your application, start in "index.vr.js"

// Auto-generated content.
import {VRInstance} from 'react-vr-web';
import 'webvr-polyfill';
```

initに```WebVRPolyfill.InstallWebVRSpecShim();```の一行を追加

```js:client.js
function init(bundle, parent, options) {
  WebVRPolyfill.InstallWebVRSpecShim();
  const vr = new VRInstance(bundle, 'rvr_sample', parent, {
    // Add custom options here
    ...options,
  });
  vr.render = function() {
    // Any custom behavior you want to perform on each frame goes here
  };
  // Begin the animation loop
  vr.start();
  return vr;
}
```

デプロイして実機確認

<img width="375" alt="IMG_7735.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/77159/6369a8d5-8e95-ac13-e311-0d6535ea0f2a.png">

Cardboardのインストラクションが表示されれば成功．
画面縦向きのロックがされている場合は外して，横向きにすると

![IMG_7736.PNG](https://qiita-image-store.s3.amazonaws.com/0/77159/347101d5-4a24-d538-e6f5-4030ff040a76.png)
バレルディストーションがかかった二眼モードに移行できます．

iOS Safari, Chromeにて確認．
ChromeだとURLバーが表示されるのでデフォルトフルスクリーンになるSafariがいいかも．

#demo
https://shalman.github.io/react-vr-sample/dist/

# ref
https://medium.com/front-end-hacking/make-reactvr-work-on-ios-devices-d2ca10c7f1a4
Golang で カルマンフィルタ

はじめに
--------------------
- 以前作ったこれ（[pythonで時系列フィルタするパッケージをつくった](https://qiita.com/ryskiwt/items/4112209be778de2f0f6a)） の kalman filter を、 golang に移植した
- `gonum/matrix` 使えば割と簡単にできた
- golangでのグラフプロット用ライブラリ `gonum/plot` とかもちょっと触れて面白かった
- filter実装した時点で<font color="red">さほど速くない</font>ことが分かったので、平滑化は書かずに途中で終了

リポジトリ
--------------------
とりあえずつくったとこまで公開

- https://github.com/ryskiwt/go-kalman

サンプルコード
--------------------

```go
package main

import (
	"math"
	"math/rand"

	kalman "github.com/ryskiwt/go-kalman"

	"github.com/gonum/matrix/mat64"
	"gonum.org/v1/plot"
	"gonum.org/v1/plot/plotter"
	"gonum.org/v1/plot/plotutil"
	"gonum.org/v1/plot/vg"
)

func main() {

	//
	// kalman filter
	//

	sstd := 0.000001
	ostd := 0.1

	// ２次トレンドモデル
	filter, err := kalman.New(&kalman.Config{
		F: mat64.NewDense(2, 2, []float64{2, -1, 1, 0}),
		G: mat64.NewDense(2, 1, []float64{1, 0}),
		Q: mat64.NewDense(1, 1, []float64{sstd}),
		H: mat64.NewDense(1, 2, []float64{1, 0}),
		R: mat64.NewDense(1, 1, []float64{ostd}),
	})
	if err != nil {
		panic(err)
	}

	// 10000個サンプル生成
	n := 10000
	s := mat64.NewDense(1, n, nil)
	x, dx := 0.0, 0.01
	xary := make([]float64, 0, n)
	yaryOrig := make([]float64, 0, n)

	// sin波 + ガウスノイズ
	for i := 0; i < n; i++ {
		y := math.Sin(x) + 0.1*(rand.NormFloat64()-0.5)
		s.Set(0, i, y)
		x += dx

		xary = append(xary, x)
		yaryOrig = append(yaryOrig, y)
	}

	// フィルタ実行
	filtered := filter.Filter(s)
	yaryFilt := mat64.Row(nil, 0, filtered)

	//
	// plot
	//

	p, err := plot.New()
	if err != nil {
		panic(err)
	}

	err = plotutil.AddLinePoints(p,
		"Original", generatePoints(xary, yaryOrig),
		"Filtered", generatePoints(xary, yaryFilt),
	)
	if err != nil {
		panic(err)
	}

	// Save the plot to a PNG file.
	if err := p.Save(16*vg.Inch, 4*vg.Inch, "sample.png"); err != nil {
		panic(err)
	}
}

func generatePoints(x []float64, y []float64) plotter.XYs {
	pts := make(plotter.XYs, len(x))

	for i := range pts {
		pts[i].X = x[i]
		pts[i].Y = y[i]
	}

	return pts
}
```

![sample.png](https://qiita-image-store.s3.amazonaws.com/0/111801/08f2bfeb-58a4-b2e5-9288-4e6b738c8b6d.png)
[Node.js] 無料で簡単にウェブアプリを公開できるサービス「Glitch」を使ってみた！

<img src="https://qiita-image-store.s3.amazonaws.com/0/134076/e9c2f34e-443b-879a-ae14-912f0ce65976.png" width=70%>

## Glitchとは
GlitchはNode.jsのアプリを公開するためのサービスです。
Node.jsでウェブアプリを公開しようとすると、サーバーの設定したりドメインを取得したり…とても複雑です。
Glitchは、あなたの創造性を試すことだけに集中できます。
Glitchは、あの有名なプロジェクト管理ツールのTrelloをつくったFogCreekSoftware社によって開発が進められています！
アプリを公開するためだけでなく、オンラインのEditorなどもついていい感じです。

## 使ってみる
これまでAWSやさくらインターネットなどを使っていましたが、Glitchはずば抜けて簡単です。
まずは[Glitch](https://glitch.com)にアクセスします。

### 新しいプロジェクトの作成[^1]
右上の①[Sign in]ボタンからログインします。
FacebookかGitHubが選べますが、後々GitHubからソースコードを取得することを考えたらGitHubの方が良いでしょう。
次に②[Start a New Project]から[Create a Node App]を選択してNode.jsのアプリケーションを作成します。
![howto_1_edited2.png](https://qiita-image-store.s3.amazonaws.com/0/134076/eaa5b95a-c1bf-cab9-f166-0adc096e7969.png)


### アプリの実行
左上の③の箇所からプロジェクト名を変更できます。
④の[Show live]ボタンを押すとアプリが実行できます。
サンプルアプリは簡単なタスク管理ツールみたいです。
テキストを入力してSubmitボタンを押すとタスク一覧に表示されますね。
![howto_2.png](https://qiita-image-store.s3.amazonaws.com/0/134076/548c61a7-b7c6-35ac-bd6a-10f0616060d3.png)

## GitHubからのソースコード反映
Glitch上でコーディングを進めていってもいいですが、普段からGitでバージョン管理をしていてGitHubにあるアプリケーションを公開したい人もいるかと思います。
### Node.js でHelloWorld
まずはGitHubで空のプロジェクトを作成し、ローカルにcloneします。
usernameとreponameは適宜変えてください。

```bash
git clone https://github.com/username/reponame.git
cd reponame
```
続いてNode.js関する初期設定を行います。
今回はNode.jsとnpmはインストール済みということで話を進めていきます。
packagenameやdescriptionが聞かれますが、ここは全部エンターキーを押してスルーでOKでしょう。

```bash
npm init
```
続いてソースを書いていきます。
リクエストがあると、"Hello World"という文字列を返すだけのプログラムです。


```index.js
var http = require('http');
http.createServer(function (request, response) {
  response.writeHead(200, {'Content-Type': 'text/plain'});
  response.end('Hello World\n');
}).listen(3000);

console.log('Server running at http://127.0.0.1:3000');
```

```bash
node index.js
```
プログラムを実行し、Chromeで
http://127.0.0.1:3000/ 
を開いてみましょう。
ブラウザ上にHelloWorldと表示されればOKです。
最後に実行スクリプトを登録しておきましょう。
package.jsonを開き、下記のように登録しておきます。
こうするとことで```npm start```だけで今後実行できるようになります。
Glitchはどうやら```npm start```をきっかけにアプリケーションをスタートさせるような仕組みになっていたようなので、この作業は必須になります。

```package.json
"scripts" : {
    "start": "node index.js"
  }
```

ここまでできたらGitHubにpushしておきましょう。

### GitHub→Glitchへの反映
Glitchのソースコード編集画面から、メニューを開き、[Advanced Options]を選択します。
メニューが表示されますので、⑤[Grant access]でGitHubにアクセスする権限を与えましょう。
次に⑥[Import from GitHub]を選択して、GitHubからソースを取り込みます。
ポップアップメニューが開きますので、[ユーザー名/レポジトリ名]を入力します。
ソースが取り込めたら、[Show]ボタンを押して実行します。
![howto_3.png](https://qiita-image-store.s3.amazonaws.com/0/134076/e75c73f3-b966-e029-c963-a58d43e20bab.png)
![howto_4.png](https://qiita-image-store.s3.amazonaws.com/0/134076/7919c124-9365-c531-097f-f0df28c3408e.png)


## まとめ
* GlitchはNode.jsのアプリを公開するためのサービス
* Glitchは簡単にウェブアプリを公開できる
* Glitchは無料で利用できる

[^1]: この記事は2017年に執筆されたため、現在ではトップページのUIが変わっております。ご了承ください。
Mac + Python + Anaconda を利用してTensorFlowを動かしてみる

# 動作環境

- Mac OSX
- pyenv
- anaconda3-5.0.0（Python 3.6）

## 環境構築は以下のサイト参照
[Mac + Python + Anaconda を使用した機械学習用の環境構築](https://qiita.com/yoshiokaCB/items/92e22ca9739f7a4d46a4)


# TensorFlow インストール

```zsh
$ mkdir tensorflow-test
$ virtualenv --system-site-packages tensorflow-test
$ cd tensorflow-test
$ source bin/activate
$ conda search tensorflow

Fetching package metadata ...........
r-tensorflow                 0.8.2                  r3.4.1_0  defaults
                             1.4              r342h38ebd79_0  defaults
tensorflow                   1.1.0               np112py27_0  defaults
                             1.1.0               np112py35_0  defaults
                             1.1.0               np112py36_0  defaults

$ conda install tensorflow

$ pip list | grep tensor

tensorflow (1.1.0)

```

インストールが確認できればOKです！

# Tensorflowを実行してみる

以下のファイルをローカルに作成します。（後ほどjupyterに貼り付けるコードです）

```py:hello_world.py

import tensorflow as tf
hello = tf.constant('Hello, TensorFlow!')
sess = tf.Session()
print(sess.run(hello))

a = tf.constant(100)
b = tf.constant(321)
print(sess.run(a + b))

```

## Jupyter を使用して動作確認

```zsh
$ jupyter notebook
```

コマンドを実行するとブラウザが立ち上がり、以下のような画面が表示されます。

![スクリーンショット 2017-11-25 15.17.43.png](https://qiita-image-store.s3.amazonaws.com/0/29570/11f73ab1-7c09-23fe-a752-d8f7291a9c49.png)

画面右側にある「New」をクリックし、「Python3」をクリックしてください。

入力画面が表示されるので ` hello_world.py ` で入力したソースをコピペし、shift + enter でソースコードを実行してください。

![スクリーンショット 2017-11-25 15.26.27.png](https://qiita-image-store.s3.amazonaws.com/0/29570/054d544e-9533-d56e-0532-c2bd5b92dfa6.png)


これでTensorFlowの動作確認は終わりです！
次回はこの環境を使用してTensorFlowのチュートリアルを行います。
仮想環境で稼働しているArch Linuxでsambaを使ってみた

#仮想環境で稼働しているArch linuxでsambaを使ってみた

##概要
今回、サーバの勉強の一環として仮想環境で稼働しているArch linuxにsambaを入れて動かしてみました。

その時の行動についてまとめたいと思います。

##環境
Windows8
VirtualBox 5.2.0
Arch Linux 4.13.11-1
Samba　4.7.1

##詳細

###仮想環境の設定
sambaをインストールする前に、仮想環境の設定を少しだけ変更します。

####アダプターの追加
VirtualBoxを起動させて、メニュー画面から設定を選びます。

![設定選択.JPG](https://qiita-image-store.s3.amazonaws.com/0/195114/5808e934-8c37-2953-1b39-691e2149b597.jpeg)

設定を選んだら以下の画像のようにネットワークにアダプター２を追加します。
![ネットワーク設定.JPG](https://qiita-image-store.s3.amazonaws.com/0/195114/db9c7294-18c6-a973-8545-c260cbb8c012.jpeg)

**※ちなみに実行中の状態だとアダプターは追加できないので追加する時は電源をオフにしてください。**

アダプター２を追加したら仮想環境の設定は終わりです。


###sambaを使ってみる

####sambaのインストール
まずは、公式のリポジトリからsambaをインストールしましょう。

```bash:コマンド
pacman -S samba
```

####sambaの設定ファイルを持ってくる
pacman -S sambaコマンドだけでは、.confファイル(設定ファイル)が入りません。そのために外部から持ってくる必要があります。

```bash:コマンド
wget "https://git.samba.org/samba.git/?p=samba.git;a=blob_plain;f=examples/smb.conf.default;hb=HEAD" -O /etc/samba/smb.conf
```
####sambaの設定ファイルに書き込み

これから、設定ファイルに共有するフォルダの情報を書き込みます。
設定ファイルを開いたら**一番最後の行**に書き込んでください。
書き込む情報については、以下のサイトを参考にさせていただきました。
https://www.server-world.info/query?os=CentOS_5&p=samba

今回は、viを使って書き込みましょう。

```bash:コマンド
vi /etc/samba/smb.conf
```

```:書き込み内容
[share]
    path = /home/share
    writable = yes
    guest ok = yes
    guest only = yes
    created mode = 0777
    directory mode = 0777
    share modes = yes
```

書き込んだ内容が不安な方は以下のコマンドを実行して確かめてみてください。


```bash:コマンド
testparm /etc/samba/smb.conf
```
少しでも間違えていると、Error loading servicesと出力してくれるので大変便利です。

####共有するフォルダとファイルの作成

先ほどの設定に記述した共有フォルダを作成します。

```bash:コマンド
mkdir /home/share
```

テスト用に共有するファイルも作成しておきましょう。

```bash:コマンド
touch /home/share/test
```

####sambaユーザの追加
sambaにユーザを追加するには、linuxの方にもユーザを追加する必要があります。
今回は、testuserという名前のユーザを追加したいと思います。

では、linuxの方のユーザ登録を済ませましょう。

```bash:コマンド
useradd testuser
```

testuserのパスワードを設定します。

```bash:コマンド
passwd testuser
```

次に、sambaのユーザの登録とパスワードを設定します。
以下のコマンドを使用すると一度に登録できて便利です。

```bash:コマンド
smbpasswd -a testuser
```

登録されたのか確認してみましょう。

```bash:コマンド
pdbedit -L
```
```bash:コマンドプロンプトの表示
testuser:1000:
```
しっかりと登録されていました。

####sambaサービスの起動

sambaを動かすには、nmbdとsmbdサービスを起動します。

```:コマンド
systemctl start nmbd.service
systemctl start smbd.service
```

起動した際に自動で動かしたい場合にはenableに設定しておきます。

```:コマンド
systemctl enable nmbd.service
systemctl enable smbd.service
```
enableになっているかどうかは以下のコマンドで確認できます。

```:コマンド
systemctl list-unit-files
```
####sambaにアクセスするためのIPアドレスを調べる
Windows側からsambaにアクセスするためのIPアドレスを調べます。

```:コマンド
ip addr
```
ここで、仮想環境の設定で行ったアダプターの追加が効いてきます。表示された３番目の設定を使います。
私の場合、192.168.56.101でした。

####Windows側からアクセスしてみる

ブラウザのURLを入力する場所に以下のアドレスを入力します。

```:
\\先ほど調べたIPアドレス(私の場合192.168.56.101)\share
```

すると、ユーザとパスワード入力画面が出現します。
ここで、先ほど登録したtestuserのアカウントを使ってください。

入力し、接続に成功すると以下の画面が出現します。
ブラウザによって表示が変わるので注意してください。(ちなみに、下のはFirefoxです)

![ブラウザ.JPG](https://qiita-image-store.s3.amazonaws.com/0/195114/6e91e464-fc83-4e74-0de3-929d2eb07ca1.jpeg)

しっかりとshareフォルダの中が見ることができます。
またテスト用に作成したtestファイルも存在します。


以上です。
[小ネタ]Docker で UDPをやってみる

小ネタというかやってみた時のメモですが、既にあるありがたい Image を使っただけです。

[mendhak/udp-listener](https://hub.docker.com/r/mendhak/udp-listener/)

この README に書いてある通りやればOKです。

```bash
# Pull する
$docker pull mendhak/udp-listener

# docker run する.UDP は 5005 ポート
$docker run -p 0.0.0.0:5005:5005 -p 0.0.0.0:5005:5005/udp --name udp-listener mendhak/udp-listener
```

これでコンテナがフォアグラウンドで起動するので別ターミナルで `nc` コマンドで確認。

```bash
$nc -u localhost 5005
(任意の文字を入力)
```

入力した文字がコンテナが起動しているターミナルで標準出力されて確認できます。
Github のコードを見ると Python のコードを実行して UDP で受け付けた情報を標準出力しているようです。

[ docker-udp-listener/udplistener.py
](https://github.com/mendhak/docker-udp-listener/blob/master/udplistener.py)

`nc` コマンドの localhost という部分を IP アドレスやホスト名にして別のサーバーの UDP 接続についても確認可能。

もし、動作がうまくいかない場合には切り分けとして `nc` コマンドで簡易UDPサーバーを立てるのも良い。

```bash
$ nc -lu <port>
```

以下に記載があり、参考にさせて頂きました。

[UDPの疎通確認はtracerouteよりncが便利](https://qiita.com/mokrai/items/f6e4c0ff626103ebf324)
自分用インフラの用語とコマンドのメモ

# 目的
**自分用のメモ**

## プロビジョニング
起動時に自動的に実行される一連の処理のこと

## オーケストレーション
コンピュータシステム/ミドルウェア/サービスの配備/設定/管理の自動化
例: ECS、Kubernetes

## シンボリックリンクの貼り方
```$ ln -s from_path to_path```

## ファイル・ディレクトリ検索の仕方
```$ find [開始ディレクトリ(省略した場合カレントディレクトリ)] [オプション]```

* ホームディレクトリ以下にある**hoge**を含むファイル・ディレクトリを検索する
```$ find ~ -name *hoge*```

* ホームディレクトリ以下にある2.4時間以内に更新された**hoge**を含むファイル・ディレクトリを検索する
```$ find ~ -name *hoge* -mtime -0.1```

## 起動メッセージの確認コマンド
```$ dmesg```

## コマンドの実行ファイルの場所を表示
```$ which```
```$ whereis```
goenvでgolangをインストールする

Go言語のversion管理を行うツール
pyenvのGo版みたいなもの

# goenvでGoのインストールを行う
```bash
$ brew install goenv

$ vim ~/.zshrc
# Go
export GOPATH=$HOME/go
export GOENV_ROOT=$HOME/.goenv
export PATH=bin:$GOENV_ROOT/bin:$GOPATH/bin:$PATH
eval "$(goenv init -)"

$ source ~/.zshrc

$ goenv install -l
Available versions:
  1.2.2
  1.3.0
〜省略〜

$ goenv install 1.9.2 # 最新版のインストール
$ goenv global 1.9.2
$ goenv versions
* 1.9.2 (set by /Users/name/.goenv/version)
```

Goのバイナリは`/Users/name/.goenv/versions/1.9.2/bin`にある


# おまけ
Intellij IDEAのSDKに今回インストールしたgoを指定したい場合、隠しフォルダのままだと指定できないので以下のようにしたりすると選択できるようになる

```bash
$ ln -s ~/.goenv ~/goenv
```
動的計画法を利用したプログラミング

動的計画法を少し勉強したのでメモ

## 動的計画法とは ... 
結構ざっくりですが…
動的計画法(Dynamic Programming)というアルゴリズムは部分問題の結果を記録しながら解いていくアルゴリズムでDPとか言われます。
(Wikipediaは[こちら](https://ja.wikipedia.org/wiki/%E5%8B%95%E7%9A%84%E8%A8%88%E7%94%BB%E6%B3%95))

以前に計算したことがあるやつはその値を利用して無駄な計算を省こうぜ、みたいな理解をしています。


## 例
フィボナッチ数列を例題でよく見るので実際に実装してみてみます。
ちなみにフィボナッチ数列は

```
f(0) = 0
f(1) = 1
f(2) = f(1) + f(0)
...
f(n) = f(n-1) + f(n-2)
```

みたいな数列です。
まず再帰を使った方法です。

```fib.cpp
#include <iostream>
int fib(unsigned int n){
  if (n == 0) return 0;
  if (n == 1) return 1;
  return fib(n - 1) + fib(n - 2);
}
int main(){
  int n;
  std::cin >> n;
  std::cout << fib(n) << std::endl;
  return 0;
}
```

こんな感じでかけると思うのですが n が多いと(書くのが)大変なので`n = 5`を考えると

```
  fib(5) 
= fib(4) + fib(3) 
= (fib(3) + fib(2)) + (fib(2) + fib(1)) 
= ((fib(2) + fib(1)) + (fib(1) + fib(0))) + ((fib(1) + fib(0)) + fib(1)) 
= (((fib(1) + fib(0)) + fib(1)) + (fib(1) + fib(0))) + ((fib(1) + fib(0)) + fib(1)) 

```

n = 5でも以前やったことがあって結果がわかっているような計算を何度かしています。
それが n = 10とか100とかになると思うと…

ということでDP！
`main`とかは同じなので省略します。

```dp.cpp
int fib(int n){
  int memo[n+1];
  memo[0] = 0,memo[1] = 1;
  for(int i = 2;i <= n;i++){
    memo[i] = memo[i-1] + memo[i-2];
  }
  return memo[n];
} 
```


↓みたいな感じで計算していきます。

```
memo(0) = 0
memo(1) = 1
memo(2) = 1 (= memo(1) + memo(0))
memo(3) = 2 (= memo(2) + memo(1))
memo(4) = 3 (= memo(3) + memo(2))
memo(5) = 5 (= memo(4) + memo(3))
```

以前に計算した値を利用してやっているので随分無駄がなくなった感じがしますね。

あとメモ化とかいうのもあります。
これも計算結果をメモして再利用する方法です。

```memo.cpp
#define N 10000

int memo[N];
bool isOK[N];

int fib(int n){
  if(isOK[n]) {
    return memo[n];
  } else {
    isOK[n] = true;
    return memo[n] = fib(n-1) + fib(n-2);
  }
}

int main(){

  // 入力とか

  memo[0] = 0,memo[1] = 1;
  isOK[0] = isOK[1] = true;
  cout << fib(n) << endl;
  return 0;
}
```

計算済みかどうかを`isOK`という`bool型`の配列で記憶して計算済みならその数値を、
まだなら計算結果を`memo`に、`isOK`を`true`にします。

実行速度はだいぶ変わってくるので覚えておくといいことがあるかもしれません。
*上記のプログラムは`int型`で記述しましたが、値によってはオーバーフローするので`long long`を使用したり、また欲しい型に適宜変更して利用してください。

今後は探索アルゴリズムとかも勉強したい。
nuxt.js で vue-i18n を使えるようにする (YAMLでの記述)

■ 2018-10-27 追記 Nuxt2 への対応について記載しました。

基本的には、ドキュメント通りでOK (日本語版がちと古くなっていたので、英語版参照)

https://nuxtjs.org/guide/plugins

vue-i18n インストール

```
yarn add vue-i18n
```

plugins を作る VueI18n を読み込む。ここでやらないと、 `asyncData` / `fetch` で使うことができない。

```js:plugins/i18n.js
import Vue from 'vue'
import VueI18n from 'vue-i18n'

Vue.use(VueI18n)

export default ({ app }) => {
  app.i18n = new VueI18n({
    // とりあえず locale は 日本語に
    locale: 'ja'
  })
}
```

nuxt.config の設定を変更する

```js:nuxt.config.js
module.exports = {
  build: {
    vendor: ['vue-i18n']
  },
  plugins: ['~/plugins/i18n.js']
}
```

## `<i18n>` を vue ファイルで書けるようにする


vue-i18n のドキュメントを読むと、vueファイル中に <i18n> ブロックを記述し、この中に翻訳情報を記すことができるらしい。

[ドキュメント](https://kazupon.github.io/vue-i18n/en/sfc.html)

しかし、これをやるには vue ファイルのビルド方法を変えてやる必要がある。ついでに、翻訳データはYAMLで記述したい。

必要なローダーを用意

```
yarn add -D yaml-loader　@kazupon/vue-i18n-loader
```

vue-loader の設定を上書きする （注: こちらは Nuxt1.xのやりかたです。2系は追記参照）

```js:nuxt.config.js
module.exports = {
  build: {
    extend (config) {
      const vueLoader = config.module.rules.find((r) => {
        return r.loader === 'vue-loader'
      })
      vueLoader.options.preLoaders = vueLoader.options.preLoaders || {}
      vueLoader.options.preLoaders.i18n = 'yaml-loader'
      vueLoader.options.loaders.i18n = '@kazupon/vue-i18n-loader'
    }
  }
}
```

【追記 Nuxt2 以降の場合 2018/10/27】

Nuxt2系の場合、vue-loaderのバージョンが上がり、カスタムタグの指定方法が変わっている。

```js:nuxt.config.js
module.exports = {
  build: {
    extend (config) {
       config.module.rules.push({
        resourceQuery: /blockType=i18n/,
        type: 'javascript/auto',
        loader: ['@kazupon/vue-i18n-loader', 'yaml-loader']
      })
    }
  }
}
```

【追記ここまで】

これで、*.vue ファイルに `<i18n>` ブロックを記述することができる。
ページ単位で、翻訳データを管理することが出来るのでよい。

```html
<i18n>
ja:
  "Sign in": "ログイン"
</i18n>

<template>
  <div>
    {{ $t('Sign in') }}
  </div>
</template>
```

また、将来的に翻訳する人と開発する人を分けたりする構想がある場合は、以下のように別ファイルに逃した方がよいかもしれない。

```html
<i18n src="~i18n/login.en.yml"></i18n>
<i18n src="~i18n/login.ja.yml"></i18n>

<template>
  <div>
    {{ $t('Sign in') }}
  </div>
</template>
```
git-lfsでたくさんのファイルを扱う

[git-lfsは大容量のファイルを扱うもので多量のファイルを扱うものではない](https://qiita.com/crifff/items/32ffc824f69ed5632217)

cloneだけではなく、pullやmergeでも適用できました。

```
GIT_LFS_SKIP_SMUDGE=1 git pull
git lfs pull
```

```
GIT_LFS_SKIP_SMUDGE=1 git merge hogeBrach
git lfs pull
```

ちゃんと計測してないですが、私の環境だと100倍くらい違いました。
Mac + Python + Anaconda を使用した機械学習用の環境構築

# 前提
- Mac OSX
- brew がインストールされていること


# Python インストール
```bash

# Pythonのバージョン管理ソフトのインストール
$ brew install pyenv

# インストール可能なバージョンの確認
$ pyenv install -l

# 2系インストール
$ pyenv install 2.7.14

# 3系インストール
$ pyenv install 3.6.3

# 機械学習用にanacondaをインストール
$ pyenv install anaconda3-5.0.0

```


### 環境パスを設定（zsh）

```zsh:~/.zshrc

$ export PYENV_ROOT="$HOME/.pyenv"
$ export PATH="$PYENV_ROOT/bin:$PATH"
$ eval "$(pyenv init -)"

```

### Python の初期設定

```zsh
$ pyenv global 3.6.3
$ python -V
Python 3.6.3
```


# Anacondaの初期設定（機械学習を利用するための準備）

### 作業でイレクトリ準備

```zsh
$ mkdir anaconda && cd anaconda
$ pyenv local anaconda3-5.0.0
```

### Anacondaでtensorflowの環境構築（pyenv使用する場合）

```zsh
$ mkdir python-sample

# システムのパッケージを使用する（Anacondaでインストールされたパッケージもまとめてインストールする）
$ virtualenv --system-site-packages ./python-sample
$ cd python-sample

# 有効化
$ source bin/activate

# 解除
$ source deactivate
```


---


## 番外編（よくある設定サンプル）
### AnacondaでTensorFlowの環境構築（pyenv使用しない場合）

```zsh
# anacondaのライブラリを使えるようにするには引数の最後に"anaconda"を追記しておく
$ conda create --name [任意の名称] python=3.6 anaconda

# 使用法
$ source activate [任意の名称]

# エラーが出る場合はpyenvを使用して有効化する
$ pyenv local [任意の名称]

# 解除
$ source deactivate

```

---

# Anacondaを使用しない通常のプロジェクトの場合の設定方法

```zsh
$ mkdir python-sample
$ pyenv local 3.6.x

# システムのパッケージを使用しない
$ virtualenv --no-site-packages ./python-sample

$ cd python-sample

# 有効化
$ source bin/activate

# 解除
$ source deactivate
```


# その他

複数のプロジェクトで共通してライブラリーを使用する場合は、全体で使用できるようにpyenvで追加した方が便利

```zsh
# システム全体で使用する環境を作る方法
$ pyenv virtualenv 3.6.1 new_3.6.1
$ pyenv local new_3.6.1
```

# 次回
[Mac + Python + Anaconda を利用してTensorFlowを動かしてみる](https://qiita.com/yoshiokaCB/items/ac8f0dabbdc6eea0d561)
sqlでプライマリキーをまとめてUPDATEする

sqlでプライマリキーをまとめてUPDATEする時、クエリの書き方によってはプライマリキーが重複してエラーになってしまう。
ここでは、SQL ServerとMySQLについてのクエリを書く。

テーブルデータ（処理前）

|id(PRIMARY KEY)  |name  |
|---|---|
|1  |name_1  |
|2  |name_2  |
|3  |name_3  |
|4  |name_4  |
|5  |name_5  |

テーブルデータ（処理後）

|id(PRIMARY KEY)  |name  |
|---|---|
|2  |name_1  |
|3  |name_2  |
|4  |name_3  |
|5  |name_4  |
|6  |name_5  |

MySQLの場合は、ORDER BYを使用してidを降り順に設定する。
（5→6, 4→5, ・・・, 1→2の処理順）
設定しないとidが重複してエラーになる。

````MySQL.sql
UPDATE tbSample SET id = id + 1
ORDER BY id DESC
````

SQLServerの場合は、そのまま書けばよい。
自動でやってくれるっぽい。
逆にORDER BYを書くとエラーになる。

````SQLServer.sql
UPDATE tbSample SET id = id + 1
````
ラズパイがSSHに繋がらないときに疑うこと

# ラズパイがSSHに繋がらないときに疑うこと
Raspberry pi 3 model Bを買ってSSH接続しようとしてハマったことを残しておきます。
OSにはRaspbianのデスクトップ付きを使いました。
https://www.raspberrypi.org/downloads/raspbian/

宅内のWifiに接続し、キーボード日本語化や時刻設定まで済ませました。
同一Wifiに接続しているWindows10端末からSSHしようとして、なぜか繋がらない現象が発生しました。
ググっていろいろ調べたことを共有します。

## 本当にWifiにつながっているか？
OSにWifiの設定をしたつもりが、実はつながっていないことは稀にあります。
まずはOS側で`curl -Iv https://www.google.com`みたいコマンドで、インターネット接続を確認します。
これがNGなら、`ip a`や`ifconfig`でIPアドレスが取れているかを確認します。
標準で127.0.0.1や127.0.1.1が出て来るかもしれませんが、これらは無視です。
192.168.x.xみたいのがない場合は、Wifi接続にミスっているかもしれません。
（宅内WifiのほとんどはクラスCだと思いますが、もし敢えてクラスAやクラスBを指定している場合は、10.x.x.xや172.x.x.xになります）

Raspberry pi 3は標準でWifiが用意されていますが、Wifi countryを設定する必要があります。
これはJapanにしましょう。
http://ykubot.com/2017/01/17/raspberry-pi-3-initialize/

あとは、PCやタブレットをWifiにつなげたとき同様、SSIDやキーの入力ミス、Wifi接続数の上限を疑いましょう。

## Raspbian OSは標準でSSHがオフ
Raspbian OSは2016年末以降、SSHが標準でオフになっています。
以下の手順で、これをオンにします。
https://qiita.com/Halhira/items/1da2ae543217be26988a
http://ykubot.com/2017/01/17/raspberry-pi-3-initialize/

## SSH接続端末は同一ネットワークにいるか？
同一Wifiなら同一ネットワークにいるでしょうが（むしろ違うネットワークを設定する技術力があるなら、こんなことで困ることはないでしょう）、一応確認しておきましょう。
Raspberry piでは`ip a`、WindowsではPowershellを起動し、`ipconfig`でIPアドレスを確認します。
おそらく、192.168.10.1と192.168.10.2のような連続値が自動で設定されていると思います。

## Raspberry piのユーザ名とパスワードは間違っていないか？
デフォルトでpi/raspberryが設定されていますが、"rapsberry"を打ち間違えていないか、確認しましょう。

## SSH以外はつながるか？
とりあえずpingします。
Raspberry pi　→　Raspberry pi：OK
Windows　→　Windows：OK
Raspberry pi　→　Windows：NG
Windows　→　Raspberry pi：NG

なんと、Raspberry piとWindows間でPingが通りません。
同一ネットワーク上にあるはずなので、パケットをロスします。
Raspberry piにはufwは入れていません。基本的にポートは開放されているはずです。

ここまでくれば、だいぶ原因が絞り込めてきた気がします。

# Wifiが端末間接続を拒否している？
実はWifiには端末間接続を拒否する機能があります。
プライバシーセパレータとかAPアイソレーションとか呼ばれるものですが、Wifiにつながっている端末どうしがお互いに接続しないよう、保護されています。
公衆Wifiや無線Wifiだと必ず有効化されていると思いますが、公衆Wifiにつなげたスマホに見知らぬ人からアクセスされないようにする機能です。
http://e-words.jp/w/%E3%83%97%E3%83%A9%E3%82%A4%E3%83%90%E3%82%B7%E3%83%BC%E3%82%BB%E3%83%91%E3%83%AC%E3%83%BC%E3%82%BF.html

宅内Wifiでも同様に、これが有効化されていると、端末どうし、WindowsとRaspberry piどうしで接続することはできません。
無効化（端末間接続の許可）の方法はWifi端末次第ですが、私の場合はこれが原因でRaspberry piにSSH接続できませんでした。

ちなみに、この設定でコケるのはRaspberry piに限りません。
最近Google Homeを買ったのですが、端末間接続を拒否されていると、初期設定ができずに積みます。
気をつけましょう。
AtCoderをゆっくり解く ABC079B編

[問題はこちら](https://abc079.contest.atcoder.jp/tasks/abc079_b)

この問題も、標準入力から整数を1つだけ受け取ります。

```php
<?php
    fscanf(STDIN, "%d", $N);
```

リュカ数を、再帰呼び出しで計算してみましょう。

再帰呼び出しとは、関数自身を呼び出して処理を行う手法です。

\$L[0]は、2です。
\$L[1]は、1です。
\$L[i]は、\$L[i-1]と\$L[i-2]を足したものです。

これをそのまま、実装して行きます。

```php
    function calcL($n) {
        switch ($n) {
            case 0:
                return 2;
                break;
            case 1:
                return 1;
                break;
            default:
                return calcL($n - 1) + calcL($n - 2);
        }
    }
```

完成しました。それでは、paiza.ioで試しに実行してみます。
やってみると、入力例2の「86」でタイムアウトになってしまいます。
なぜでしょうか？
これは、calcL(86)実行時にcalcL(85)とcalcL(84)が呼び出され、calcL(85)の処理でcalcL(84)とcalcL(83)が呼び出され……となるのですが、1回計算されたcalcL(84)などがあったとしても、それを無視してまた別にcalcL(84)の計算をしようとするので、膨大な量の計算が発生してしまうからです。

……という訳で、一度計算した結果はとっておき、それを利用するように改造します。

```php
    function calcL($n) {
        global $array;
        $array[0] = 2;
        $array[1] = 1;
        if (isset($array[$n])) {
            return $array[$n];
        } else {
            $array[$n] = calcL($n - 1) + calcL($n - 2);
            return $array[$n];
        }
    }
```

関数のローカル変数は再帰呼び出しの際にスコープの違いにより参照されなくなってしまいますので、グローバルの変数（配列） `$array` を設定しています。

さきほどのプログラムでは1分経っても答えは返ってきませんが、改造した方のプログラムでは、0.03秒ほどで計算結果が表示されます。

[paiza.ioでのURL](https://paiza.io/projects/YLFzUNhx4pJ-WkAgUdkidQ)

[AtCoderでの実行結果](https://beta.atcoder.jp/contests/abc079/submissions/1804927)
HSP3.5 HGIMG4 で2Dビューポート表示

# HSP3.5 HGIMG4 で2Dマップを拡大したり縮小したりする

HSP3.5 HGIMG4 では、やや機能限定ではありますがオフスクリーン(レンダーターゲット)が使用できるようになりました。これを用いてやや広めのマップを窓から覗いたような表現などが可能です。
buffer をオフスクリーンとして生成するには buffer の第4引数に screen_offscreen を指定します。
サンプルコードは以下になります。
ソースコードファイルはインストールフォルダが C:\hsp35 の場合、C:\hsp35\sample\hgimg4 フォルダに保存してください。

```
#include "hgimg4.as"

#const EG_CALC GPDRAW_OPT_OBJUPDATE
#const EG_DRAW2D (GPDRAW_OPT_DRAW2D | GPDRAW_OPT_DRAW2D_LATE)
#const EG_DRAW3D (GPDRAW_OPT_DRAWSCENE | GPDRAW_OPT_DRAWSCENE_LATE)

#const WID_TV 3
#const WID_DOT 4
#const WID_WIDE 5

#module
#defcfunc sgn double x
	if x == 0.0 {
		return 0.0
	}
	if x < 0.0 {
		return -1.0
	}
	return 1.0
#global

	sx = ginfo(26)
	sy = ginfo(27)

	map_w = 2048
	map_h = 2048

	gpreset
	setcls CLSMODE_NONE

	celload dirinfo(5) + "\\hsptv_img.png", WID_TV
	celdiv WID_TV, 64,64

	celload dirinfo(5) + "\\tamadot.png", WID_DOT
	celdiv WID_DOT, 64,64, 32,32

// 珠音
	dim evs, 16
	c = 0

	repeat 16
		i = cnt

		newevent ev
		repeat 4
			index = cnt + i * 4
			event_prmset ev, PRMSET_SPRCELID,index
			event_wait ev, 15
		loop
		event_jump ev, 0

		evs.c = ev
		c ++
	loop

	gpspr id, WID_DOT, 0
	setevent id, evs.1
	tama = id	

// マップ配列
	xnum = map_w / 64
	ynum = map_h / 64
	num = xnum * ynum
	dim vxpos,num
	dim vypos,num
	dim vcelid,num

	c = 0
	repeat ynum
		i = cnt
		repeat xnum
			j = cnt

			index = 16 + limit(rnd(21) - 14, 0,6)
			if i == 0 | i == ynum - 1 | j == 0 | j == xnum - 1 {
				index = 16 + 7
			}
			
			//gpspr id, WID_TV, index
			vxpos.c = j * 64
			vypos.c = i * 64
			vcelid.c = index

			c++
		loop
	loop

	buffer WID_WIDE, map_w,map_h, screen_offscreen
	celdiv WID_WIDE, map_w,map_h, map_w/2, map_h/2

	cx = double(map_w / 2)
	cy = double(map_h / 2)
	vr = 1.0

	repeat
		getreq fps, SYSREQ_FPS
		getreq ts, SYSREQ_TIMER

		gsel 0
		mx = mousex
		my = mousey

		dx = double(mx - sx / 2)
		dy = double(my - sy / 2)
		cx += sgn(dx)
		cy += sgn(dy)
		cx = limitf(cx, 96, map_w - 96)
		cy = limitf(cy, 96, map_h - 96)

		setpos tama, cx,cy, 0


		gsel WID_WIDE
		redraw 0
		gpdraw EG_CALC

		celputm vxpos, vypos, vcelid, WID_TV, num
		gpdraw EG_DRAW2D
		redraw 1

		vr = sin(double(ts) * 0.0005) * 0.2 + 0.8

		gsel 0
		redraw 0
		color 0xff,0xcc,0x66
		boxf

		pos - (cx - map_w / 2) * vr + sx/2, - (cy - map_h / 2) * vr + sy/2
		celput WID_WIDE,0, vr,vr

		pos 16,16
		color 0,0,0
		font "",48
		mes strf("%2d [fps]", fps)
		redraw 1
		await 1000/60
	loop
```

マウスカーソルの位置で上下左右に移動します。

|実行結果1|
|:-:|
|![z06map1.png](https://qiita-image-store.s3.amazonaws.com/0/213145/513a2f07-39de-71a9-079f-4ffd19be8ea2.png)|
|広い範囲が表示されている状態|

拡大率は時間経過で勝手に変化するようになっています。

|実行結果2|
|:-:|
|![z06map2.png](https://qiita-image-store.s3.amazonaws.com/0/213145/2861d0a5-9e98-29aa-5ff5-fd874dad7a4f.png)|
|狭い範囲が表示されている状態|

主に 3D 向けの HGIMG4 ですがスプライトなども活用して 3D と 2D のハイブリッドで様々な表現できるようにどんどん進化していくのではないかと期待されます。
Gitのケース別の使い方

# 目的

gitでこういうことが起こった時、こうしたいときどうするかをまとめる。

# レポジトリから履歴とかは消してコードをコピーしたい

## 想定ケース

コードのみを持ってきてそれまでの過程とかは無視したい。また元のレポジトリと全く別管理で動かしたい。

```
# cloneしてくる

git clone git@github.com:a.git hoge

# 一度削除してgitを入れ直す
rm -rf .git
git init

# pushしなおす

git add .
git commit -m "Initial commit"
git remote add origin git@github.com:b.git
git push
```