OmniAICreator/Qiita-1.07M huggingface dataset:
Unity テキスト送り? 会話送り？(Textを1文字ずつ表示する)

以下のようなテキスト送りを実装しました。

https://youtu.be/b5jAfZgtKzk


ほぼこの方の書き方。
http://pafu-of-duck.hatenablog.com/entry/2017/06/14/101139

ただ、
1.テキストエリアをプッシュして進めたい
2.Update関数はできすだけ無くして、Main関数っぽいもので管理したい（その方が管理が楽だと思っています）

という思いがあるので強引に修正しています（いい書き方あれば教えてください）。

```c#:TextController.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class TextController : MonoBehaviour {

    public string[] sentences; // 文章を格納する
    [SerializeField] Text uiText;   // uiTextへの参照

    [SerializeField][Range(0.001f, 0.3f)]
    float intervalForCharDisplay = 0.05f;   // 1文字の表示にかける時間

    private int currentSentenceNum = 0; //現在表示している文章番号
    private string currentSentence = string.Empty;  // 現在の文字列
    private float timeUntilDisplay = 0;     // 表示にかかる時間
    private float timeBeganDisplay = 1;         // 文字列の表示を開始した時間
    private int lastUpdateCharCount = -1;       // 表示中の文字数


    void Start () {
        SetNextSentence ();
    }


    public void TextUpdate(bool _IsPush) {
        // 文章の表示完了 / 未完了
        if (IsDisplayComplete ()) {
            //最後の文章ではない & ボタンが押された
            if (currentSentenceNum < sentences.Length && _IsPush) {
                SetNextSentence ();
            }
            else if(currentSentenceNum >= sentences.Length){
            	currentSentenceNum = 0;
            }
        } else {
            if (_IsPush) {
                timeUntilDisplay = 0; //※1
            }
        }

        //表示される文字数を計算
        int displayCharCount = (int)(Mathf.Clamp01((Time.time - timeBeganDisplay) / timeUntilDisplay) * currentSentence.Length);
        //表示される文字数が表示している文字数と違う
        if (displayCharCount != lastUpdateCharCount) {
            uiText.text = currentSentence.Substring (0, displayCharCount);
            //表示している文字数の更新
            lastUpdateCharCount = displayCharCount;
        }
    }

    // 次の文章をセットする
    void SetNextSentence(){
        currentSentence = sentences [currentSentenceNum];
        timeUntilDisplay = currentSentence.Length * intervalForCharDisplay;
        timeBeganDisplay = Time.time;
        currentSentenceNum++;
        lastUpdateCharCount = 0;
    }

    bool IsDisplayComplete(){
        return Time.time > timeBeganDisplay + timeUntilDisplay; //※2
    }
}
```

こちらであらゆる管理を行う

```c#:GameMainSystem.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class GameMainSystem : MonoBehaviour {
	[SerializeField]
	TextController textController;

	bool IsTextPush = false;
    void Update(){
	    textController.TextUpdate(IsTextPush);
		IsTextPush = false;
    }
	public void PushText(){
		this.IsTextPush = true;
	}
}
```
Azure Data FactoryのSSIS IRのVNet配置とオンプレ接続

## Data FactoryのAzure-SSIS Integration Runtime
Data Factory v2になり、Azure-SSIS Integration Runtime (以降SSIS IR)という機能でSSISパッケージを実行できるようになった。これは既存のSSISパッケージをクラウド上でも使いたいときとか、SSISに慣れていてETLはSSISで実装したいですっていう場合に良い選択肢となる。
BI環境のLift & Shiftに適したサービスで、せっかくDWHをSQL Data WarehouseにしたりSSASをAzure Analysis Servicesにしてモダナイズしても、SSISどうするよってなるが、これをData Factoryに任せられるようになるよっていう感じだ。あとは、もともとSSISの開発に長けている人とか組織の場合、新規パッケージをSSIS IRを使ってホストするのもよさそう。
<img src="https://qiita-image-store.s3.amazonaws.com/0/144789/c84a1eb7-c387-93f7-4052-55e5ea4bec60.png" width=70%>
From: https://docs.microsoft.com/ja-jp/azure/data-factory/concepts-integration-runtime

## オンプレや他のVNetに接続するには
BI環境をLift & Shiftしても、もともとのデータソースとしてよくある業務のデータベースはオンプレにおいたままだったりするので、このSSIS IRからアクセスできるようにしないといけない(素直にアクセスさせるか、いろいろ制約が付くか、または完全にNGかは企業のポリシーによるが)。
SSIS IRをVNetやオンプレネットワークに接続できるようにするためには、SSIS IR自体をVNetに配置する必要がある。そのうえでVPNとかExpressRouteとかVNet Peeringとかを使って目的のネットワークと接続する。
https://docs.microsoft.com/ja-jp/azure/data-factory/join-azure-ssis-integration-runtime-virtual-network
パブリックサービスにしか接続しない場合はVNetに配置する必要はない (設定時に配置しないようにもできる)。

## 接続構成の例と設定時のポイント
以下のようなHub-Spokeトポロジを想定して、SSIS IRをVNetに配置してオンプレのDBをデータソースとしたETL処理を機能させる際のポイントをメモしておく。
<img src="https://qiita-image-store.s3.amazonaws.com/0/144789/678f94b4-2b03-60c3-265c-7348321db849.png" width=70%>

* SSIS IRを配置するネットワークにはGatewaySubnetとかSQL Database Managed Instanceとかの排他的なサブネットを選択できない。
* VNetに独自のDNSを使用している場合は注意が必要。Azureのパブリックサービスのホスト名が解決できない状態でデプロイすると不可解なエラーで止まる。この場合はAzureの再帰的リゾルバーのIPアドレス(168.63.129.16)をセカンダリDNSサーバーとして登録する。
* 意外といろいろな通信をする。NSGをかける際は [通信要件](https://docs.microsoft.com/ja-jp/azure/data-factory/join-azure-ssis-integration-runtime-virtual-network#subnet) を必ず確認。
* これはSSIS IRの場合に限らないが、VPN Gatewayを擁するHUB-VNETとVNetピアリングで接続した場合、ゲートウェイトランジット/リモートゲートウェイの設定が必要。具体的な方法は [ここ](https://docs.microsoft.com/ja-jp/azure/vpn-gateway/vpn-gateway-peering-gateway-transit) を参照。
* SSISのカタログDBをSQL Databaseにホストする場合で、サービスエンドポイントで保護したい場合は、SSISが所属しているVNetとの接続にする。
* 構成が完了し、SSISパッケージをデプロイして実行してうまくDBにつながらない場合に意外と原因を調べにくい。ネットワークの接続性確認のため、一時的にSSIS IRのサブネット内に仮想マシンを構築してpingとかDBアクセスのツール等を使って調べると良い。また、その仮想マシンのNICの[ effective routes](https://docs.microsoft.com/ja-jp/azure/virtual-network/diagnose-network-routing-problem) を確認するとそもそも経路あるんたっけ？っていうのがわかりやすい。
* SSISパッケージ内でデータソースの接続先を名前で設定している場合、SSIS IRでの実行時に解決できない場合がある。パッケージ自体を修正するか名前解決できるようにDNSを設定する。
UnityのGetCompornent<T>()でNull条件演算子が使えない

2018.3でC#6が昇格(?)して、便利になりました。

しかし

```cs
var r = GetComponent<Rigidbody>();
if(r != null)
{
    // Rigidbodyがアタッチされていないとここは通れらない
    r.AddForce(force, mode);
}

// 一方で・・・

GetComponent<Rigidbody>()?.AddForce(force, mode);
// MissingComponentException発生！
```

> ゲームオブジェクトに type がアタッチされている場合は type のタイプを使用してコンポーネントを返します。ない場合は null です
> https://docs.unity3d.com/ja/current/ScriptReference/Component.GetComponent.html

なんでやねん！

どうも`GetComponent<T>()`で帰ってくるnullは真正のnullではないみたいです。デバッカで見ると`{null}`となっています。
発生している例外も`NullRefarenceException`ではありません。

> C# 6で導入されたnull条件演算子(?.)ですが、以下の2つの式がほぼ同じ意味になります。
> `x != null ? x.M() : null`
> `x ?.M()`
> 「ほぼ」であって「完全に同じ」と言えないのは、==演算子を呼ぶか呼ばないかが変わってしまうせいです。 前者(自分で==を呼んでいるやつ)はオーバーロードされた==を呼び出しますが、 後者(?.を利用)は呼びません(直接nullかどうか調べます)。
> https://ufcpp.net/blog/2016/12/tipsnulloperation/

`==`がオーバロードされています。

# （追記）どうしてもnull条件演算子が使いたい！！

UnityObject版null -> 正真正銘のnullに変換する操作を拡張メソッドで隠蔽する方法があるそうです。

本来のnull条件演算子だけに比べると少し長くなってしまいますが、それでも`if(component!=null)`で囲むよりは幾分か短く書くことが出来ます。

```cs
public static T NullCast<T>(this T obj) where T : UnityEngine.Object
  => (obj != null) ? obj : (System.Object)null;

GetComponent<Rigidbody>().NullCast()?.AddForce(force, mode); // 推論が効くはず
```

詳細は@albireoさんのコメントを参照。（ありがとうございました！🙇🙇🙇）

# （追記）参考、この辺に詳しい話が書かれてますね

https://ufcpp.net/study/csharp/rm_nullusage.html#user-defined-null
ALB Authentication + Cognitの500エラーに対処する

#まとめ

* ALB Authentication + Cognitで認証しようとしたら500エラー
* ALBについているセキュリティグループのアウトバウンドに443ポートがなかった
* 443ポートを許可したらうまく行った

#経緯

ElasticBeanstalkのステージング環境にBasic認証的なことをする必要が出てきて、ebextentionに書いたら、間違えて本番環境にもBasic認証かけそうだな…と思い別の方法を探していました。
で、 https://dev.classmethod.jp/cloud/alb-cognito-user-pool/ を見つけて、これでEmailじゃなくusernameを使えばBasic認証っぽくできるじゃん、と思い実践してみることに。

#まず別のALBで試してみた

いきなりステージングにアクセスできなくなると困るので、別のALBを立てて期待通りに動作するか検証した。→結果うまく行った。

#いざステージングへ適用

Cognitのドメイン設定を変えてステージングのALBに適用
→username/passwordを入力！
→500 Internal server error...

#色々思案

1. もともとステージングへはセキュリティグループでアクセスできるIPを制限していたので、それがだめなのか？→認証かかっている状態で0.0.0.0を許可したが変化無し。
2. Cogentのドメイン設定ミスったか？→合ってそう
3. ...わからん

ググってもいい情報が当たらず、色々設定眺めていた結果、セキュリティグループのアウトバウンドに80ポートしか記述が無いことに気づく。
→ElasticBeanstalkで作成されたALBにはこの記載があるみたいです。ターゲットグループのポートだけってことなんでしょう。

#なぜダメなのか考察

（違ってたらご指摘いただけると嬉しいです）
ALBからCognitの方に認証情報を取得する際のリクエストがhttpsなんだと思いました。
別のALBでうまく行っていたのは、ElasticBeanstalkから作ったわけではなく、セキュリティグループもALBと一緒に作ったので（←これが良くなかった…）アウトバウンドに0.0.0.0がいたんですねー。

#対応

ALBのセキュリティグループに443ポートの0.0.0.0を追加してアクセスしたところ、うまく認証が機能しました。めでたしめでたし。

#あとがき

それにしてもALBってHTTPS転送もできたり、かなり便利になりましたね。とても助かります。
ラズパイのWiFi運用の為にpower managent機能をオフにする方法

ラズパイをデフォルト設定でwifi運用を始めると１日程度放置するとpingにも応答しない事象が発生します。
wifiのpower management機能が働き、wifiがオフになるためです。
wifi運用を考える時にはpower management機能をオフにする必要があります。

#環境
- Raspberry Pi 3 Model B
- OSバージョン

```shell-session
$ uname -a
Linux raspberrypi 4.14.79-v7  #1159 SMP Sun Nov 4 17:50:20 GMT 2018 armv7l GNU/Linux
$ grep -H "" /etc/*version ; grep -H "" /etc/*release
/etc/debian_version:9.6
/etc/os-release:PRETTY_NAME="Raspbian GNU/Linux 9 (stretch)"
/etc/os-release:NAME="Raspbian GNU/Linux"
/etc/os-release:VERSION_ID="9"
/etc/os-release:VERSION="9 (stretch)"
/etc/os-release:ID=raspbian
/etc/os-release:ID_LIKE=debian
/etc/os-release:HOME_URL="http://www.raspbian.org/"
/etc/os-release:SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
/etc/os-release:BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"
```

#設定変更
デフォルトの設定確認。

```shell-session
$ sudo iwconfig wlan0
wlan0     IEEE 802.11  ESSID:"xxxx"  
         Mode:Managed  Frequency:2.412 GHz  Access Point: 6C:E4:DA:xx:xx:xx  
         Bit Rate=72.2 Mb/s   Tx-Power=31 dBm  
         Retry short limit:7   RTS thr:off   Fragment thr:off
         Power Management:on
         Link Quality=45/70  Signal level=-65 dBm  
         Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
         Tx excessive retries:0  Invalid misc:0   Missed beacon:0
```

wifiのpower managementをオフにします。

```
$ sudo iwconfig wlan0 power off
$ sudo iwconfig wlan0
wlan0     IEEE 802.11  ESSID:"xxxx"  
          Mode:Managed  Frequency:2.412 GHz  Access Point: 6C:E4:DA:xx:xx:xx   
          Bit Rate=72.2 Mb/s   Tx-Power=31 dBm   
          Retry short limit:7   RTS thr:off   Fragment thr:off
          Encryption key:off
          Power Management:off
          Link Quality=63/70  Signal level=-47 dBm  
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:1  Invalid misc:0   Missed beacon:0
```

再起動するとまたオンになるので再起動後もオフになるように /etc/rc.local を編集します。

```shell:/etc/rc.local
#!/bin/sh -e
#
# rc.local
〜省略〜
# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
 printf "My IP address is %s\n" "$_IP"
fi

iwconfig wlan0 power off # wlan0 power management off <- 追記
exit 0
```

これで再起動してもwifiの power management 機能はオフになるのでwifi運用が可能になります。
RailsのDBに紐付かないModelでもActiveModel::Dirtyを使って要素の変更を検知したい

```rb
class Hoge
  include ActiveModel::Model
  include ActiveModel::Dirty

  def self.attributes
    [ :name, :address, :tel, :note ]
  end
  attr_accessor *self.attributes
  define_attribute_methods *self.attributes

  def initialize(args)
    args.each do |k,v|
      raise "unpermitted args:#{k}" unless self.class.attributes.index(k)
      self.send("#{k}=", v)
    end

    # 要素の変更検知
    self.class.attributes.each do |attribute_name|
      define_singleton_method("#{attribute_name}=") do |value|
        # self.class.send(:define_method, "#{attribute_name}=")でもOK
        self.send("#{attribute_name}_will_change!") unless value==self.send(attribute_name)
        super(value)
      end
    end
  end
end
```

使用例

```rb
# 初期化
> hoge = Hoge.new(name: 'yamada', tel: '090512221234')
=> #<Hoge:0x007f8f3b093b58 @name="yamada", @tel="090512221234">

# 変更なしとなることを確認
> hoge.changed?
=> false
> hoge.changes
=> {}

# 変更してみる
> hoge.tel = "08013456789"
=> "08013456789"

# 変更が検知される
> hoge.changed?
=> true
# 差分もバッチリ
> hoge.changes
=> {"tel"=>["090512221234", "08013456789"]}
```
matplotlib/seabornのグラフで日本語化ける問題

※AdventCalendar埋め投稿です。[Python その2](https://qiita.com/advent-calendar/2018/python_python)カレンダーの8日目、 @kirk3110 さんの代理として投稿します。もしご準備されていましたら取り下げますのでご連絡を。）


# やること
pythonのデファクトなグラフ化ライブラリmatplotlibとそのラッパーseabornを使ってグラフ作ると日本語が化けることがあるのでその対処法まとめです。
特にMacの環境では文字化けすることが多いと思います。


# 原因

1. 日本語フォントが入っていない
1. 日本語フォント入ってても設定ファイルで指定されていない
1. 日本語フォント設定してもキャッシュがあってなかなか反映されない

これらを一つずつ対応していきます。

# 対処
## 日本語フォント入れる
### ダウンロード
ここのを使ってる人が多いらしい。。。
https://ipafont.ipa.go.jp/
`ipaexg00301.zip`をダウンロードして、`ipaexg.ttf`を取得。

### matplotlibのfontフォルダに入れる

```py
import matplotlib as mpl
print(mpl.matplotlib_fname())
```

↑これで表示される所のに移動し、`font/ttf/`に入れます。
（`python/lib/site-packages/matplotlib/mpl-data`とかだと思いますが、pyenvなどの環境分離ツール使ってる場合は`~/.pyenv/...`配下だったりするので注意）


## seabornの設定ファイル変更
引き続き`site-packages/seaborn/rcmod.py`を編集

92行付近、のfont=""の部分を"IPAexGothic"にする

```py
def set(context="notebook", style="darkgrid", palette="deep",
        font="IPAexGothic", font_scale=1, color_codes=True, rc=None):
```

203行付近、font.familyも"IPAexGothic"にする

```py
"font.family": ["IPAexGothic"],
```

## matplotlibのキャッシュ消す

`~/.matplotlib/`にキャッシュやら何やらがあるので全部消しちゃう。
`rm -rf ~/.matplotlib/*`

あとは`import matplotlib`をやり直して日本語表示されたら成功です。


以上、ちょっとした小ネタでした。
可用性セット構成の仮想マシンを可用性ゾーン構成に変更する

##はじめに
[Availability Zones を用いたAzure IaaS サービスの構築](https://qiita.com/yy1106/items/d6a33aec122dd3094ce7) で可用性ゾーンについて投稿しましたが、関連して既存の可用性セット構成の仮想マシンを可用性ゾーン構成に変換するスクリプトを記載します。

##注意事項
・管理ディスク構成の仮想マシンを対象に可用性ゾーン構成の仮想マシンに変換します
・スクリプトを実行すると元の仮想マシンは削除されます
・元の仮想マシンに関連するリソース（ディスクなど）は残るので必要に応じて削除する必要があります

##Powerhsellスクリプト
処理のフローの通りです。

1.Azureサブスクリプションにログイン
2.変換する仮想マシンと変換先の可用性ゾーンを選択
3.仮想マシンを停止し削除
4.管理ディスクを可用性ゾーン構成の管理ディスクに変換
5.Standard パブリックIPアドレスを作成
6.可用性ゾーンに仮想マシンをデプロイ

```Powershell
#ログイン
Login-AzureRmAccount

#サブスクリプションを選択
$srcSub = Get-AzureRmSubscription | Out-GridView -Title "Select Your Subscription ..." -PassThru
Select-AzureRmSubscription  $srcSub.SubscriptionId

#仮想マシンを選択
$trgVM  = Get-AzureRmVM | Out-GridView -Title "Select Your Virtual Machine  ..." -PassThru
$location = $trgVM.Location
$ResourceGroup = $trgVM.ResourceGroupName

#リージョン、サイズに応じた Availability Zone を選択
$aznum = (Get-AzureRmComputeResourceSku | where {$_.Locations.Contains("$($location)")} | where {$_.Name.Contains("$($trgVM.HardwareProfile.VmSize)")}).LocationInfo.Zones | Out-GridView -Title "Select a AvailabilityZone ..." -PassThru  

#事前処理
$trgVM | Stop-AzureRmVM -Force #仮想マシンの停止
$trgVM | Remove-AzureRmVM  #仮想マシンを削除

#OSディスクのスナップショットを取得
$srcDisk =  Get-AzureRmResource -ResourceId  $trgVM.StorageProfile.OsDisk.ManagedDisk.Id
$snapshotConfig =  New-AzureRmSnapshotConfig -SourceUri $srcDisk.ResourceId -CreateOption Copy -Location $location
$snapshot = New-AzureRmSnapshot -Snapshot $snapshotConfig -SnapshotName "$($srcDisk.Name)_snapshot" -ResourceGroupName $ResourceGroup

#スナップショットから可用性ゾーン管理ディスクを作成
$config = New-AzureRmDiskConfig -CreateOption Copy -SourceResourceId $snapshot.Id -Location $location  -OsType $srcDisk.Properties.osType -Zone $aznum
$osDisk = New-AzureRmDisk -ResourceGroupName $ResourceGroup -DiskName "$($srcDisk.Name)_az" -Disk $config

#ネットワークリソースの作成
$srcNICi =  Get-AzureRmResource -ResourceId  $trgVM.NetworkProfile.NetworkInterfaces.Id
$srcNIC = Get-AzureRmNetworkInterface -ResourceGroupName $srcNICi.ResourceGroupName -Name $srcNICi.Name

#Standard パブリックIPアドレス（IPアドレスのSKUは変更できないため再作成）
$pip = New-AzureRmPublicIpAddress -ResourceGroupName $ResourceGroup -Location $location -Zone $aznum -AllocationMethod Static -IdleTimeoutInMinutes 4 -Name "newstandardPip"
$srcNIC.IpConfigurations | ForEach-Object { $_.PublicIpAddress = $null }
$srcNIC.IpConfigurations[-1].PublicIpAddress = $pip
Set-AzureRmNetworkInterface -NetworkInterface $srcNIC


#変換した可用性ゾーンの管理ディスクより仮想マシンの作成
$vmConfig = New-AzureRmVMConfig -VMName "$($trgVM.Name)Az" -VMSize "$($trgVM.HardwareProfile.VmSize)" -Zone $aznum  | Add-AzureRmVMNetworkInterface -Id $srcNIC.Id
if($osDisk.OsType -eq "Windows"){
    Set-AzureRmVMOSDisk -VM $vmConfig -Name $osDisk.Name -CreateOption "Attach" -ManagedDiskId $osDisk.Id -Windows
}else{
    Set-AzureRmVMOSDisk -VM $vmConfig -Name $osDisk.Name -CreateOption "Attach" -ManagedDiskId $osDisk.Id -Linux
}
New-AzureRmVM -ResourceGroupName $ResourceGroup -Location $location -VM $vmConfig
```
JuliaをインストールしてPlotsでグラフを表示する

# この記事について
なにやらJuliaという言語の1.0がリリースされたらしいのでちょっと触ってみました。
今回はJuliaでグラフを表示してみようと思います。
# 環境
Windows 10
Julia v1.0.3 https://julialang.org/
# とりあえずインストール
とりあえずJuliaの公式ページに飛びます（ URL https://julialang.org/ ）。
ダウンロードボタンをクリックしてダウンロードページに飛びます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/296240/aa102ea1-9347-1fe9-9692-7d25c544ae9c.png)
そして、Windows Self-Extracting Archive(.exe)の64bitをダウンロードします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/296240/1f8d3f60-157d-7f4d-01f2-fe97d2148976.png)
ダウンロードができたらインストールします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/296240/d3e80840-c89d-0d77-d9c3-f4c7969b6a28.png)
これは流れに乗ってポチポチするだけだったので省略します。
注意点としてはインストールするだけだとPATHが通ってないので環境変数の編集をしましょうということくらいです。
# とりあえず動作確認
コマンドプロンプトを起動してJuliaと打ち込みます。

```
>julia
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/296240/3a1926eb-bf30-ff6f-067d-bc3a9245a137.png)
↑間違えて1.0.2の画像を持ってきてしまっていました！後で修正しておきます。
とりあえずここまでできれば無事にJuliaの設定が終わったという事になります。
# Plotsを入れる
それではPlotsというパッケージを追加します。
この時の注意点としてはコマンドプロンプトを管理者権限で実行しておいてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/296240/2aa15a35-13cd-2c80-4147-f3a6d3f6a836.png)
今回のパッケージでは必要ありませんが、一部のパッケージを追加する際に、管理者権限がないことが原因でエラーが吐き出されることがあります。ご注意ください。**ちなみにImageViewとImageMagickの追加ではエラーが発生しました。**
ではJuliaを起動している状態で次のコードを実行します。

```julia:
import Pkg;
Pkg.add("Plots")
```
これでパッケージの追加が始まります。
結構時間がかかりますので、本でも読んで待ちましょう。

# 試しにSigmoid関数を書いてみる
サクサクテキトウに書いてみます。

```julia:Sigmoid.jl
# 開始値:ステップ:終了値
x = -5.0:0.1:5.0
# 関数
f(x) = 1 ./ (1 .+ exp.(-x))

y = f(x)

using Plots
plot(x, y)
# 画像保存
savefig("Sigmoid.png")
```
↓出力画像↓
![Sigmoid.png](https://qiita-image-store.s3.amazonaws.com/0/296240/fc76a66d-7a04-8844-6367-26f55cce46b0.png)
コマンド上で実行して確認する方法は知らないのでこれから調べてまとめます。
とりあえず今回はここまでで終わります！
LaravelでViewの日付フォーマットを変更する方法

#やりたいこと
2018-12-24 21:00:00と表示されるのを2018/12/24 21:00と表示されるようにしたい

#やり方

```sample.blade.php
<p>{{ $sample->date_time }}</p> // 2018-12-24 21:00:00
<p>{{ $sample->date_time->format('Y/m/d H:i') }}</p> // 2018/12/24 21:00
```

#おまけ

```sample.blade.php
<p>{{ $sample->date_time->format('Y/m/d') }}</p> // 2018-12-24 21:00
```
育休中のエンジニアの勉強方法

この記事は [NTTコミュニケーションズ Advent Calendar 2018](https://qiita.com/advent-calendar/2018/nttcom) の17日目です。

## はじめに

NTTコミュニケーションズでは、子が生まれてから3歳になるまで、最長3年の[育児休職](https://www.ntt.com/about-us/we-are-innovative/worklife.html)が公式制度として認められています。私自身もこの制度を利用して、実際に育休を取得しました。

育休取得時は、以下の思いを持っておりました。

- (当たり前ですが)基本は育児メイン
- 隙間時間で技術的な勉強
    - 職場復帰したときに、技術にキャッチアップできているように

育児休職中は、まとまった勉強時間を取るのが非常に難しくなります。また、Laptopに落ち着いて向き合える時間もありません。そこで、細切れの時間・行動の制約などを考慮しつつ、いかにインプットしていくか・勉強していくか、を考えることになります。

本記事では、個人的な経験の中から、細切れ時間の勉強方法・リソースとして特に良かったものを2つほど共有したいと思います。

## スマフォで動画

赤子と向き合うとわかるのですが、立って抱っこしてユラユラしていると寝るのだけど、ベッドに寝かすと起きてしまうケース[^1]があります。このような場合は、赤子を抱っこしつつ、テーブルや棚の上にスマフォを置いて、動画で勉強するのが良いです。

[^1]: 子供によってはバウンサーなども超効果的なので、そちらを使ったほうが良いケースも

その際、ケーブル付きのイヤフォンは邪魔なので、ワイヤレスのものを使いつつ、耳の片方だけ入れるなどして、周囲の音と講義の声が両方聴こえるようにして学習を進めます。（最近だとAirPodsなどのように、ケーブルレスなガジェットが良さそうです）

ちなみに、個人的には、以下のような動画コンテンツを見ていました。

- Youtubeにある[AWS Blackbeltの動画](https://www.youtube.com/user/AmazonWebServicesJP/videos)
    - AWSはサービス数が多く、こんなのあったんだという発見があります
- N予備校のコンテンツ
    - 個人的には、忘れてしまった数学の復習をしていました
- Udemyのコース
    - セール期間がよくあるので、そこで購入しておいたものを見ます。たとえば普段触らない言語とか面白いです

## 家事しつつPodcast

食器洗い(食洗機に入れる作業含む)や、洗濯を干している時間は、視覚情報を活用するのは難しいので、音のみの情報に頼ることになります。幸いなことに、技術系Podcastは消化しきれない数のPodcastが登場しており、その中からいくつかピックアップして、過去のエピソードを聞きました。

日本語の技術系Podcastは、[日本語Tech系Podcastいろいろ
](https://qiita.com/suginoy/items/dada11eef775b883320f)の記事が非常に参考になります。
Puppeteer on AWS Lambda のスクリーンショットで文字が豆腐になるので、ウェブフォントと絵文字フォントをインストール

## 状況
現在開発中の https://poiit.me で puppeteer のスクリーンショットを使って動的OGPをつくっています。
CSSで動的な画像をデザインできるし、一つ lambda 関数を作っておけば、いろんなところで応用ができるのでいいですね。

が、今回は絵文字が、豆腐になってしまったのでその対処法。

![yahsan2-ogp.jpg](https://qiita-image-store.s3.amazonaws.com/0/6531/6a6ea738-cf5e-15cb-4eb3-acb2dc85e5d8.jpeg)

## 参考記事
ベースはこちらの記事を参考にしました。
https://qiita.com/zyyx-matsushita/items/c33f79e33f242395019e

基本は参考Qiita をベースに対応できましたが、絵文字フォントがどこにあるのか結構探したので、備忘録的にメモ。

## 絵文字フォントダウンロードと設置
Google の Noto Color Emoji はこちらから ダウンロードできました。
https://www.google.com/get/noto/#noto-emoji-zsye-color

**他のダウンロード可能な絵文字フォントを知っていたら、是非ダウンロード場所教えてください！**

で、ダウンロードしたファイルを解凍し `/.font/NotoColorEmoji.ttf` に設置

## WEBフォント
こちらは絵文字以外のフォントについては、WEBフォントをつかっています。

screenshot を撮る前に head に追加してやれば反映されるはず。

``` js
        await page.evaluate(() => {
            var style = document.createElement('style')
            style.textContent = `
                @import url('//fonts.googleapis.com/css?family=M+PLUS+Rounded+1c|Roboto:300,400,500,700|Material+Icons');
                div, input, a, p{ font-family: "M PLUS Rounded 1c", sans-serif; };`
            document.head.appendChild(style);
            document.body.style.fontFamily = "'M PLUS Rounded 1c', sans-serif";     
        })
```

その後、長めに wait させたないとフォントが反映されていないことがあるので注意

```js
        await page.waitFor(3000);
```

こちらの記事を参考にしています。
https://qiita.com/chimame/items/04c9b45d8467cf32892f

## 関数実行

lambada で呼び出す関数で、フォントをサーバーにインストールする `fc-cache` コマンド実行してから、
puppeteer の screenshot などを実行すれば、ちゃんと絵文字が反映されているはずです。

アップロードすれば終了です。

![yahsan2-ogp-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/6531/54eae76b-6c6d-e567-d400-0c18bc462718.jpeg)

めでたし！

serverless を使ったベーシックな puppeteer on lambda は github に置いてあるので必要あれば。
https://github.com/yahsan2/puppeteer-example-on-serverless-lambda

この記事のフォント反映バージョンも要望あればで公開しますので、コメントください〜！

### poiit というサービスつくっています！

この記事がもし参考になれば、50円からサポートお願いします〜！
[![yahsan2-ogp-1.jpg](http://res.cloudinary.com/dcsqopmuq/image/upload/v1545924831/poiit-production/yahsan2/yahsan2-ogp.jpg "画像タイトル")](https://poiit.me/yahsan2/)
https://poiit.me/yahsan2/
flycheck で Emacs の Mode Line を光らせる

Syntax Error や Style Error が発生した時、瞬時に「あ、エラーした」と気付きたかったので作りました。
本体は [GitHub/flycheck-flash-mode-line](https://github.com/blue0513/flycheck-flash-mode-line) に置いておきます。

## What's This

flycheck がエラーを検出した時、Mode Line が一瞬だけ光ります。
デフォルトは赤色。

![flash2.gif](https://qiita-image-store.s3.amazonaws.com/0/144707/f0328b87-eae4-9256-6d0e-9812a3b9c54b.gif)

## Usage

[GitHub/flycheck-flash-mode-line](https://github.com/blue0513/flycheck-flash-mode-line) を `git clone` して、 `init.el` に以下を記述するだけ。

```elisp
(add-to-list 'load-path "YOUR PATH")
(require 'flycheck-flash-mode-line)

;; Minor Mode の起動
(flycheck-flash-mode-line t)
```

## Customize

色を変更したいときは、以下を記述してください。

```elisp
(setq ffml--mode-line-color "YOUR FAVORITE COLOR")

;; 例えば blue にする
;; (setq ffml--mode-line-color "blue")
```

---

#### 類似 package のすすめ

[flycheck-colo-mode-line](https://github.com/flycheck/flycheck-color-mode-line) というのがあります。
一瞬だけ光るのではなく、常に Mode Line の色が変化します。
![flycheck-color-mode-line-light-e.png](https://qiita-image-store.s3.amazonaws.com/0/144707/b40f938b-ac52-0570-ff8e-a6ffe4d69dcc.png)
GAS で呼び出し元のアカウントを判定して処理を振り分ける

社内システムやちょっとした Web アプリケーションを GAS で実装する際に、利用者の Google アカウントによって処理を振り分けたい時は [Session Class](https://developers.google.com/apps-script/reference/base/session) を使うと便利です。 

この一文で書きたいことを全て伝えてしまったのですが、この答えに辿り着くのに思いのほか時間が掛かってしまったので、記事にしたためておきます。

# Tutorial

以下では Web アプリケーションとして公開した GAS 上で、呼び出し元のクライアントの情報を取得する例を示します。

新規スクリプトを作成して以下を実装してください。

```javascript:getSessionInfo.gs
function doGet(e) {
  return makeSessionContent();
}

function makeSessionContent() {
  var result = {'Active User E-mail': Session.getActiveUser().getEmail(),
    'Active User Locale': Session.getActiveUserLocale(),
    'Effective User E-mail': Session.getEffectiveUser().getEmail(),
    'Script Time Zone': Session.getScriptTimeZone(),
    'Temporary Active User Key': Session.getTemporaryActiveUserKey()
  };

  var output = ContentService.createTextOutput(JSON.stringify(result));
  return output.setMimeType(ContentService.MimeType.JSON);
}
```

メニューから [公開] → [ウェブ アプリケーションとして導入…] をクリックし、表示されるダイアログのうち [次のユーザーとしてアプリケーションを実行:] を [ウェブ アプリケーションにアクセスしているユーザー] に、[アプリケーションにアクセスできるユーザー]を [全員] にしてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/135861/cecdbfaf-4fac-4cd9-86bf-1cf238bde66a.png)
上記を設定した後、左下の [導入] ボタンをクリックしてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/135861/01c7fae5-0401-a7df-060b-2f6b2e436715.png)
このようなダイアログが表示されるので、この URL をメモしておき、このスクリプトを作成した Google アカウント以外のアカウントで URL にアクセスし、Active User E-mail に現在ログインしているアカウントのメールアドレスが表示されているか確認してみてください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/135861/021159a7-6213-1097-2e26-9c1c5c76b666.png)
URL にアクセスした際、このようなダイアログが表示されます。
[無題のプロジェクト] として表示されているプロジェクト名は GAS のファイル名（デフォルトだとコード.gs）が反映されます。

右下の [REVIEW PERMISSIONS] のボタンをクリックして、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/135861/12d25db5-b404-703b-fcf2-98b0207f51db.png)
利用するアカウントを選択してください。

なお、[次のユーザーとしてアプリケーションを実行:] を [自分] とした場合は Active User E-mail は null になり、Effective User E-mail にスクリプトを作成したアカウントのメールアドレスが表示されます。

---
正直なところ getActiveUser() で USER オブジェクトを取得し、その唯一のメソッドである getEmail() を取得するくらいしかこの API の使い所はないと思いますし、ちゃんとユーザー管理をしたいのであればちゃんとした認証機能を利用/実装するべきだとは思います。[Auth0](https://auth0.com/jp/) とか便利ですよね。

それでも G Suite を導入している会社で社内システムを構築する場合など、手っ取り早く GAS で実装するのが楽ですし、ちょっとしたワークフローの開発などでは今回取り上げた [Session Class](https://developers.google.com/apps-script/reference/base/session) で利用者の メールアドレスだけ取得できれば十分、というケースは割合あるかと思います。

そのうちクラスごと deprecated になりそうな気もしますが・・・
メモ：「３０日でできる！OS自作入門 」24日目

## ウィンドウ操作

1) ウィンドウの切り替え
- F11 押したらシートの順番を一番上に (マウスはその上）
    - ちょっと OSX のF11 キーと干渉していた

2) ウィンドウの切り替え２　（マウスで）
- ウィンドウを上から探していて、範囲内なら一番上に持ってくるイメージ

3) ウィンドウの移動
- Drag & Drop の実装
- やっと、動かすことができた。フォーカス周りはもうちょっと

![スクリーンショット 2018-12-27 22.06.37.png](https://qiita-image-store.s3.amazonaws.com/0/109145/2e9a13c6-6b9a-5cd8-e5b2-ba6aa229ec31.png)

4) ウィンドウをマウスで閉じる
- コンソールから開いたものは閉じれた

5) アプリケーションのウィンドウも入力切り替え
- フォーカスあてられるようになりましたね
- キーのステートを 0, 1ではなく、シート単位に保存するように変更
- ウィンドウのタイトルの描画する関数を切り出し

![スクリーンショット 2018-12-27 22.11.48.png](https://qiita-image-store.s3.amazonaws.com/0/109145/705dd2cc-6833-8f96-6b6b-56d6eecf4ca2.png)

6) 入力ウィンドウをマウスで切り替え
- クリックしたときにキーがフォーカスされているウィンドウじゃなければ切り替え
- 大分操作的に自然になってきた

7) タイマ API
- アプリケーション側でタイマ作れるように API 化
- alloc, init, set, free を作成
- キッチンタイマできましたね。

![スクリーンショット 2018-12-27 22.22.52.png](https://qiita-image-store.s3.amazonaws.com/0/109145/3cf75b29-9325-0cf5-8780-92697bf6594d.png)

8) タイマのキャンセル
- タイマがキャンセル処理がないと、アプリケーションが終了した場合データの送りさきがなくなったりするため
- flag もう一個設けて自動キャンセルするかどうかを設定し
- タイマを全部なめて取り消しとFreeをする
- Enterキーでクローズは OK, マウスでのクローズはまだ終了処理されてなかった。。

今回は以上
Bitnami Redminのバックアップ & リストア

# バックアップ

* ファイル
　チケットやWikiに、添付されたファイルが格納されている。

　[方法]
　　filesフォルダをコピーする。
　　filesフォルダの場所：
　　　C:\Bitnami\redmine-4.0.0-0\apps\redmine\htdocs\files
   
* データベース
　添付ファイル以外の全ての情報が格納されている。
 
　[方法]
　　MySQLの場合：
  　　mysqldump -u MySQLユーザー名 -pMySQLパスワード Redmineデータベース名 > データ出力先ファイル名
    
　　※コマンドプロンプトでmysqldumpを使うために、環境変数のPathに下記を設定する。
　　　C:\Bitnami\redmine-4.0.0-0\mysql\bin
   　※windows スタートメニューの「Bitnami Rdmine Stackを使用する」でコマンドを実行しても良い。
　　※ＭySQLの設定は、下記を参照すればわかる。
 　　　C:\Bitnami\redmine-4.0.0-0\apps\redmine\htdocs\config\database.yml

# リストア
リストアする前に、バックアップ元と同一バージョンのRedmineをリストアPCにインストールしておく。

* ファイル
　[方法]
　　バックアップしておいたfilesフォルダを、リストアPCの所定の場所に配置する。
 
* データベース
　[方法]
　　MySQLの場合：
　　　mysql -u MySQLユーザー名 -pMySQLパスワード Redmineデータベース名 < ダンプデータファイル名

# 参考
* http://redmine.jp/faq/system_management/backup/
* http://guide.redmine.jp/RedmineBackupRestore/
* データベースの中をのぞく
　http://a1-style.net/redmine/mysql-setting/
* MySQL Connector/ODBCのインストール方法
　http://a1-style.net/redmine/mysql-odbc-install/
* [Microsoft Query] ExcelをMySQL(Redmine)に接続する方法
　http://a1-style.net/redmine/mysql-excel-odbc/
 　※接続できなかったら。。。
  　http://somenotes.seesaa.net/article/140067960.html
 　http://yosugi.hatenablog.jp/entry/2013/06/23/185240
pybox2d を python 3.6 以降の Windows にインストールする手順

## pybox2d とは　
幾何学計算をするために、2D 物理エンジンの Box2D の Python ラッパーである [pybox2d](https://github.com/pybox2d/pybox2d) を Python3 に導入しました。

## 環境
* 64 bit Windows (Win7, Win10 で動作確認）  
* python 3.6, 3.7
* Microsoft Visual Studio 14.0 の コンパイラが使える環境が構築済み

公式の手順に “Alternatively, install the correct version of Microsoft Visual Studio for your version of Python.” とだけ記載されている部分を具体的に実行した記録です。
python, swig は conda で入れていますが pybox2d は、setuptools でインストールしました。Box2D の testbed として pygame も pip でインストールしました。

## 手順

#### まず conda で別の環境を作りました

    > conda create -n py36box python=3.6
    > activate py36box

#### swig は conda で インストールし、cl コマンドのパスを通します

    (py36box) c:\pybox2d> conda install -c conda-forge swig 
    (py36box) c:\pybox2d> pushd "c:\Program Files (x86)\Microsoft Visual Studio 14.0\VC"
    (py36box) c:\Program Files (x86)\Microsoft Visual Studio 14.0\VC>vcvarsall.bat amd64
    (py36box) c:\Program Files (x86)\Microsoft Visual Studio 14.0\VC>cl  # cl あり
    Microsoft (R) C/C++ Optimizing Compiler Version 19.00.24210 for x64
    Copyright (C) Microsoft Corporation.  All rights reserved.
    
    usage: cl [ option... ] filename... [ /link linkoption... ]

#### ソースを取得して展開
https://github.com/pybox2d/pybox2d から pybox2d-master.zip をダウンロード。
pybox2d-master を展開した中でビルドする。ここでは、説明のため、c:\pybox2d フォルダに展開したことにする。

    (py36box) c:\pybox2d> python setup.py build 
    (py36box) c:\pybox2d> python setup.py install 
    (py36box) c:\pybox2d> python examples\hello.py     # モジュールのロードでエラーしないことの確認
    (py36box) c:\pybox2d> pip install pygame  # testbed の環境として pygame を導入。windows なら、これで大丈夫 
    (py36box) c:\pybox2d> python -m examples.web  # examples\web.py はこういう呼び出し方をしないと動かない（python の ―m オプション）

基本的には、[公式のインストール手順](https://github.com/pybox2d/pybox2d/blob/master/INSTALL.md#building-from-source-windows)に近いものの、MSYS や MinGW をインストールしない手順です。
setup.py を使ってインストールたり、pygame は pip で導入したり、と導入手段が首尾一貫しないのですが、pybox2d が動作する環境が得られました。
RailsアプリケーションでPostgreSQLへの問い合わせにTimeOutを設定する

RailsアプリでPostgreSQLを使用する場合のDBからのレスポンスが遅ければキャンセルする設定

```yaml:database.yml
defaults: &default
  adapter: postgresql
  encoding: unicode
  pool: 5
  # DBのレスポンスが指定したms以上返ってこない場合にエラーを出力してリクエストをキャンセル
  variables:
    statement_timeout: 5000

#=> ActiveRecord::StatementInvalid: PG::QueryCanceled: ERROR:  ステートメントのタイムアウトによりステートメントをキャンセルしています
```
○○_change,　○○_changed? メソッドの意味　

```three_goodthings_controller.rb
before, after = comment.message_change　
```

###これはどういう意味か？　
***モデルオブジェクト_changeで、そのモデルオブジェクトの変更前後の値を配列でもって来れる***
```before, after = comment.message_change　```
なのでこれて2つ代入できている。カラムの変更前後の値を。

***これはアクティブレコードのメソッド***

###他にもあるアクティブレコードのメソッド
***モデルオブジェクト.changed?***メソッドは、変更されていればtrue,違ったらfalseを返す。

*なお非推奨になっていく様子：https://qiita.com/kato2222/items/e14c529885f89e9113a3

参考：https://morizyun.github.io/ruby/active-record-attribute-was-change.html
http://yamakichi.hatenablog.com/entry/2016/12/13/224503
safe functionは未定義動作を許さないといったな、あれは嘘だ (タイトルは釣りです)

遅くなりましたすいません, これはD言語アドベントカレンダーの23日目の記事です.
この記事はほんとにチラシの裏であり得られるものなどなにひとつないのでポエムのつもりでごらんください.

D言語の言語仕様にはsafe functionというものがあります.

2018年12月27日時点の https://dlang.org/spec/function.html#function-safety の記述において, safe function の定義は

> Safe functions are functions that are statically checked to exhibit no possibility of undefined behavior.
> Undefined behavior is often used as a vector for malicious attacks.

となっています. ひらたくいうとsafe functionは未定義動作を踏まないことを保証してくれるそうです.

safe functionを定義するためには `@safe` という属性を関数に付与してやる必要があります.

以下のコードは `@safe` ではコンパイルできません.

```d
void func() @safe
{
    const x = 1;
    auto y = &x; // cannot take address of local `x` in `@safe` function.
}
```

safe function 内で許可されない操作は https://dlang.org/spec/function.html#safe-functions に一覧があります.
上の例だと `No taking the address of a local variable or function parameters` に抵触しているためコンパイルエラーとなります.

さて, このリストをみると未初期化変数の扱いに関する記述がないことに気がつきます.
実際に `@safe` 内で未初期化変数を使うコードを書いてみると, コンパイル・実行ともに可能でランダムな値が取得できます.

```d
int func() @safe
{
    int x = void;
    return x;
}
```

この挙動にすでにきづいた人がいて, チケットをすでにあげていました. https://issues.dlang.org/show_bug.cgi?id=18016
そしてどうやら議論の中で
「ポインタの未初期化変数は未定義動作として扱う(つまりsafe function内で記述することを許容しない)けど, 値の未初期化変数は `implementation defined` と定義して未定義動作から外すわ. 仕様もそういう感じに変更しとく」
などと, implementation defined なる概念になりました. (なので別にsafe functionは未定義動作を許容するようになったわけではないのです)

個人的にはこれを未定義動作ではないというのはちょっと無理があるかなとは思いますが, いろいろ考えてみても特に不便もないので別にいいかなという感想です.

まあこのコードがコンパイルエラーになるだけC言語よりはるかにマシでしょ, D言語使おう.

```d
void func() @safe
{
    int* x = void;
}
```
keras2.xでInput層を含んだModelをSequentialなModelに変換する

TL;DR
-------------------

Sequentialのコンストラクタ引数に`layers`があるので、ここに渡すとうまいこと行きます。

keras 2.2.4で確認。

### 例: kerasのVGG16実装(Functional)のModelをSequentialにする

``` py
from keras.models import Sequential
from keras.applications.vgg16 import VGG16

vgg16 = VGG16(weights='imagenet', include_top=False)
model = Sequential(layers=vgg16.layers) # <= ここ
```

変換というより層を移しているだけというほうがよいのかも。

ただ、Input層が無いモノには使えない。（必要になった場面がまだ無いので詳しく調べてないです…）
kerasのVGG16の例は、VGG16の内部でInput層を作っているので問題はない。
あと、[Sequential()のlayersプロパティはInputLayerを除外してしまう](https://github.com/keras-team/keras/blob/2.2.4/keras/engine/sequential.py#L100)ので、Sequential→Sequentialには使えない。多分。

意外と面倒ごと多いな？


### VGG16で転移学習したいときのスニペット


``` py
from keras.layers import Dense, GlobalAveragePooling2D, BatchNormalization
from keras.models import Sequential
from keras.applications.vgg16 import VGG16

classes=10

# 重み付きのVGG16のモデルを得る
vgg16 = VGG16(weights='imagenet', include_top=False)

# 転移学習のためVGG16のblock1～block4の部分を学習させないようにする
for layer in vgg16.layers[:15]:
    layer.trainable = False

model = Sequential(layers=vgg16.layers)
model.add(GlobalAveragePooling2D())
model.add(Dense(1024, activation='relu'))
model.add(Dense(1024, activation='relu'))
model.add(BatchNormalization())
model.add(Dense(classes, activation='softmax'))

# コンパイルしてサマリを出す
model.compile(optimizer='adam',
              loss='categorical_crossentropy',
              metrics=['accuracy'])
model.summary()

# 学習させる(以下省略)
```

inputとoutputのつじつまを合わせてModelインスタンスを作るやり方をよく見るのですが、inputとoutputに何を渡すかがこんがらがってしまうことがあり、私には理解が難しかった。
Sequentialの方が読むのが簡単なので、どんなモデルを使おうがSequentialで書きたかった。上記のコードは普通に上から下に読めてわかりやすいんじゃないかと思う。単純なモデルというのもあるけど。


調べてみたら[Sequentialのコンストラクタの引数に`layers`とあった](https://github.com/keras-team/keras/blob/2.2.4/keras/engine/sequential.py#L86)のでもしかして、と思い試したらできた。summaryを見た分には変化は無いので多分大丈夫でしょう…
MVVMでCommandBindingsを使う

#やりたいこと
コードビハインドを使わず、ApplicationCommands等の定義済みコマンドにViewModelのコマンドをバインドできるようにする。

#実装
ViewModelのコマンドと定義済みコマンドを関連づけるビヘイビアを作成する。

```c#:ビヘイビア
using System.Windows;
using System.Windows.Documents;
using System.Windows.Input;

namespace Sample {
    //コマンドごとに添付プロパティを実装する
    //以下はApplicationCommands.Newにバインドする例
    public static class AttachedCommandBindings {
        public static DependencyProperty NewCommandProperty
            = DependencyProperty.RegisterAttached(
                "NewCommand",
                typeof(ICommand),
                typeof(AttachedCommandBindings),
                new PropertyMetadata(null, OnNewCommandChanged)
            );

        public static void SetNewCommand(UIElement element, ICommand value)
            => element.SetValue(NewCommandProperty, value);

        public static ICommand GetNewCommand(UIElement element)
            => (ICommand)element.GetValue(NewCommandProperty);

        private static void OnNewCommandChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) {
            UIElement element = sender as UIElement;
            if (element == null)
                return;

            ICommand command = e.NewValue as ICommand;
            if (command == null)
                return;

            RegisterCommandBinding(element, ApplicationCommands.New, command);
        }

        private static void RegisterCommandBinding(UIElement element, RoutedUICommand routedCommand, ICommand command) {
            var binding = new CommandBinding(
                routedCommand,
                (sender1, e1) => command.Execute(null),
                (sender1, e1) => e1.CanExecute = command.CanExecute(null)
            );

            CommandManager.RegisterClassCommandBinding(element.GetType(), binding);

            element.CommandBindings.Add(binding);
        }
    }
}
```

#使い方

```xml:XAML
<Window x:Class="Sample.MainView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:Sample"
        Title="MainView" Height="300" Width="300"
        local:AttachedCommandBindings.NewCommand="{Binding NewCommand}">
    <Grid>
        <TextBox />
    </Grid>
</Window>
```
ネストされた連想配列から特定の鍵を持つ値を抜き出す

たとえばこんな配列があったとして

```php

$arr = [
    0 => [
        'id' => 0,
        'name' => 'Takeshi'],
    1 => [
        'id' => 1,
        'name' => 'Momoko'],
    ];
```
ここから `Takeshi`　と　`Momoko`　だけが欲しい。

そんなときPHPさんの`foreach` を使えば

```php

foreach ($arr[$index]['name'] as $value) {
    var_dump($value);
}
```
みたいな感じで書けるんじゃないかと思ったけど普通にダメだった。

正しい書き方はこう

```php
foreach ($arr as $index => $value) {
    var_dump($value['name']);
}
```
(自分用メモ)
数学の教科書の要約(1,2章)

研究で直交多項式近似を使う内容があったので，これを機に以前授業のために購入した教科書を復習しました．
読ませて頂いた本は金谷健一先生の"これなら分かる応用数学教室"です．

#一章
一章は最小二乗法から入力データをプロット点(選点)から関数やベクトルに拡張していく流れで進んでいく．

最小二乗法は複数の選点,関数，ベクトル（入力データ）に一次関数や二次関数，ある関数の線形結合などを当てはめる処理．
これを計算することで，求めた関数から入力データ以外のデータを再現可能．
最小二乗法を解き，当てはめる関数の係数を求めるには，入力データと当てはめる関数の差分の二乗和を最小化すればよい．
これは各係数についてその式を微分して求められるが，これを整理すると計算量がかかる正規方程式に帰着．
当てはめる関数が直交関数系（異なる関数の積の定積分が0になる）の場合，正規方程式を解く際に連立方程式を計算する必要がなく，各係数が簡単に求まる．

#二章
二章は一章で触れた直交関数系についてと，関数やベクトルなどでも内積やノルムの定義を満たすように一般化した計量空間，その定義を用いたシュミットの直交化という流れで進んでいく．

最小二乗法が簡単に求まる直交関数系に関して，関数の直交性を定義した直交関数系を列挙
例) ルジャンドル，チェビシェフ，エルミート，ラゲール等
特に後ろの三つは最小化の式に異なる重みをかけることで，ある部分をより良く近似しようとしている．

ベクトルだけでなく関数（元）にも内積やノルムなどを定義できる計量空間を定義．
計量空間には公理があり，各ベクトルや関数がその公理を満たしていれば，それらの元がある線形空間は計量空間であり，ノルムや内積を定義可能．

最小二乗法による近似解は，幾何学的には近似前の元から直交系の張る部分空間に直交射影した元と考えることができる．
つまり，近似前の元から近似解の元を引いた元は，その直交系全てと直交関係になる．まさにこれはシュミットの直交化
他の直交関数系の内積，ノルムの定義をシュミットの直交化に適用．

---
以上です．走り書きなので，あとで見返して編集し直します．
sqlCmdコマンドの-qオプションに注意

自分がはまったので、記載しときます。

-qオプションを使うとsqlCmd実行後もsqlCmd.exeがプロセスに残ります。
勿論、要件によっては、残ってくれないと困る場合もあるかも知れませんが、下記のようにファイル削除する必要がある場合、プロセスに残ったままだと出力したファイルが削除できなくて、困ります。（「sqlCmd.exeによってファイルは開かれているため、操作を完了できません」のメッセージ）

・SELECT結果をテキストとして出力して、一旦、終了
・出力したファイルは一定時間が経ったら削除したい

上記のようにファイル削除したい場合、-Q（大文字）を使うと、sqlCmd実行後にsqlCmdが終了してくれるので、プロセスにsqlCmd.exeが残りません。（ファイルが削除できる）
Solar Frontierの太陽光発電システムから発電・売買電・消費電力を取得する

Solar Frontierの太陽光発電システムの計測表示ユニット(KP-MU1P-SET-SS)から，発電，売買電，消費電力のデータを取得するAPIを調べたメモ．誰得．


# 初期設定

* 計測ユニットを家庭LANに組み込む．
  * 自分の環境では業者から引き渡された状態でAPモードに設定されていたので，STAモードにした．
* 計測ユニットに割り当てられたIPアドレスを調べておく．(計測ユニットのIPアドレス表示ボタンでわかる)

# 取得アドレス

`http://計測ユニットのIPアドレス/asyncquery.cgi?type=Navi`

例えば

```bash
$ curl http://10.0.0.1/asyncquery.cgi?type=Navi
```

結果 (本当は1行)

```json
{
    "dateTime": {
        "year": 2018,
        "month": 12,
        "day": 27,
        "hour": 16,
        "minute": 1,
        "second": 30
    },
    "msrInfo": {
        "pconMode": 2,
        "supVol": 0,
        "supTemp": 0,
        "supVolDisp": 1,
        "supTempDisp": 1,
        "pcsActiveCount": 1,
        "pConCommErr": 1,
        "sysInitState": 127
    },
    "attainment": 0,
    "isStartDateEventDisp": 1,
    "eventAnniversary": 0,
    "isEnergyEventDisp": 1,
    "eventAttainment": 0,
    "isAutoFirmwareUpdatedDisp": 0,
    "eventAutoFirmwareUpdated": 0,
    "returnCode": 0,
    "instantPower": {
        "pcsGeneratedPower": 914,
        "externalGeneratedPower": 0,
        "consumedPower": 2069,
        "tradedPower": 1155,
        "todayEnergy": 125,
        "totalEnergy": 120099
    },
    "scaleDaily": 4
}
```

うちはガス発電などは入れていないので，`externalGeneratedPower`は0．
`pcsGeneratedPower`，`consumedPower`，`tradedPower` が発電，消費電，売買電．

`/scripts/base.js` を解析すると`type`パラメータに渡す値が分かる．
カクヨム記法の変換処理を実装する

小説投稿サイトのカクヨムさんには、小説中の文章を装飾できるカクヨム記法というものがあります。
このカクヨム記法をHTML表現に変換する[ライブラリ](https://github.com/excoinc/exco-js-libs/tree/master/packages/kakuyomu-notation)を作ってみました。

[カクヨム記法について](https://kakuyomu.jp/help/entry/notation)

特殊な記法をすることでルビと傍点を付けられるというものですね。
HTMLとしては`<ruby>`や`<em>`に変換します。
面倒なのは漢字判定が必要になるところですが、Unicodeの漢字範囲を調べて正規表現で実現できます。

このユーティリティを作っている最中に文字列を`...`で展開すると文字の配列に展開できるという発見をしました。`...`でオブジェクトを展開するのはよく見ますがこんな使い方もあるとは。JavaScriptは奥が深いですね。。。

```js
const DOT_REGEX = /《《([^\n]{1,50}?)》》/g
const RUBY_REGEX = /[｜|]([^\n]{1,50}?)《([^\n]{1,20}?)》/g
const KANJI_RUBY_REGEX = /([\u2e80-\u2fdf\u3005\3007\303b\u4e00-\u9faf\u3400-\u4dbf\uf900-\ufaff]{1,50}?)《([^\n]{1,20}?)》/g

module.exports = function transformKakuyomuNotation (text) {
  text = text.replace(DOT_REGEX, function (match, p1){
    const text = [...p1].map(a => `<span>${a}</span>`).join('')
    return `<em class="emphasis">${text}</em>`
  })
  text = text.replace(RUBY_REGEX, function (match, p1, p2){
    return `<ruby><rb>${p1}</rb><rt>${p2}</rt></ruby>`
  })
  text = text.replace(KANJI_RUBY_REGEX, function (match, p1, p2){
    return `<ruby><rb>${p1}</rb><rt>${p2}</rt></ruby>`
  })
  return text
}
```

NPMパッケージも公開しています。

```
npm install @exco/kakuyomu-notatio
```
【Ruby】Seleniumでスクロールする方法のまとめ


## Seleniumのメソッドを使う
```
driver.find_element(:id, 'id-name').location_once_scrolled_into_view
```
## JavaScriptでスクロールする
```
driver.execute_script('window.scroll(0,1000);')
```
## tabキーを使う
あまり知られていないのがtabキーを使う方法です。
一番すっきり書けますね。
ただし`<a>`と`<input>`の要素にしか使えませんのでご注意を。

```
driver.find_element(:id, 'id-name').send_keys :tab
```
[rails] パラメータ取得方法 params, query_paramters, path_parameters

URLのgetパラメーターの有無を調べたかったのですが、こちらを使いました。↓

```ruby
request.query_parameters.any?
```

何をするかと言うと

```
/hoge/categories/7?color=RED
```
の`color=RED`をハッシュで取ってきてくれます。

こんな感じで使いました。↓

```ruby
if request.query_parameters.any?
  @hogehoge = "fizz"
else
  @hogehoge = "vazz"
end
```

##ついでに他のメソッド
&で繋がっていてもそのまま取ってきてくれます。

```
/categories/12?size=S&color=RED
```

```rb
{"size"=>"S", "color"=>"RED", "action"=>"show", "id"=>"12", "controller"=>"categories"}    # params
{"size"=>"S", "color"=>"RED"}                                 # request.query_parameters
{"action"=>"show", "id"=>"12", "controller"=>"categories"}  # request.path_parameters
Parameters: {"size"=>"S", "color"=>"RED", "id"=>"12"}       # log に出力されるやつ
```

最後に

```rb
link_to "次", next_path(request.query_parameters)
```


という使い方もできます。
まだ目grepで消耗してるの？テキストファイルの比較で？gitの差分みたいな Linuxのdiffコマンド使ってる？

gitなどのコアにも使われていると勝手に@yumainauraが想像してるコマンド。

# こんなテキストファイルを二個作る

text1

```
A
B
C
```

test2

```
B
C
D
```

#作成例

```
touch ~/tmp/text1; echo A > ~/tmp/text1; echo B > ~/tmp/text1; echo C > ~/tmp/text1;
touch ~/tmp/text2; echo B > ~/tmp/text2; echo C > ~/tmp/text2; echo D > ~/tmp/text2;
```

# Diff!

```diff
$ diff /tmp/text1 /tmp/text2
1c1
< C
---
> D
```

# いつも見慣れたプラスマーク、マイナスマークで出すにはこれ！

```diff
$ diff -u /tmp/text1 /tmp/text2
--- /tmp/text1	2018-12-27 19:13:19.000000000 +0900
+++ /tmp/text2	2018-12-27 19:13:34.000000000 +0900
@@ -1 +1 @@
-C
+D
```

Cが少なく
Dが多いことが分かる


[linux yumainaura - Google Search](https://www.google.com/search?q=linux+yumainaura&oq=linux+yumainaura&aqs=chrome..69i57j69i60j0j69i60j0l2.1817j0j7&sourceid=chrome&ie=UTF-8)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
EditorのEnumMaskFieldはEnumFlagsFieldになりました


いつの間にかObsoleteされてました。
https://docs.unity3d.com/ScriptReference/EditorGUILayout.EnumMaskField.html

中にも書いてますし多分使ったら警告出ますがEnumFlagsFieldへ移行しましょう。
Maskだと色々意味が多いですしね。
https://docs.unity3d.com/ScriptReference/EditorGUILayout.EnumFlagsField.html

```c#:
m_Flags = (ExampleFlagsEnum)EditorGUILayout.EnumFlagsField(m_Flags);
```
RDS(MySQL)をCSVで出力する際にAccess deniedになってしまう対処法

MySQLに接続して、SQL文の後に `INTO OUTFILE ... FIELDS TERMINATED BY ... OPTIONALLY ENCLOSED BY ...` 続けるとcsvファイルが取得できるとのことだったので試してみたが、 `ERROR 1045 (28000): Access denied for user` という書き込みエラーになってしまいました。

RDSの環境で実行していたのですが、RDSの場合は以下のようにするとcsv出力ができるみたいです。

```
mysql -h ${rdshostname} --port ${rdsport} -u ${username} -p${password}  ${databasename} --batch -e "${SQL}" | sed -e 's/^/"/g' | sed -e 's/$/"/g' | sed -e 's/\t/","/g' > /path/to/csv
```

## 参考
https://forums.aws.amazon.com/thread.jspa?threadID=41443
STLデータを4角メッシュモデルに変換してfusion360で編集してみる

おネットには沢山良いSTLファイルがゴロゴロ転がってます。

私は設計ツールとしてfusion360を使ってます。
で、巷に転がってるSTLをベースにちょちょっと編集して出力してみたいなー
なんてことがあったりします。
でもfusionでSTLファイルを直接編集するにはできなかったりします。（できる方法があるかもしれませんが・・）
ということで、fusionでも簡単ちんに編集できるよう4角メッシュモデルに変換する方法を紹介してみようと思います。
#1. なんか気になるSTLファイルをダウンロードする
今回はレゴのブロックモデルを使います。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/152276/aaa1f636-c883-6c6f-1ae4-fec38dd8bcf6.png)

#2. 4角メッシュモデルに変換するツールを用意する
今回はFreeCADを使ってみようと思います。
[ここ][link-1] からダウンロードします。
[link-1]:https://www.freecadweb.org/
結構大きなファイル（0.17は約400MB）なんで、余裕がある時にダウンロードしましょう。
ちなみに私の環境はWin64なんで、Windows-64bitを選んでます。

#3. FreeCADを使って4角メッシュモデルに変換する
やり方は[ここ][link-2] のページを参考にしました。
[link-2]:http://monoist.atmarkit.co.jp/mn/articles/1602/12/news011.html
- FreeCADでSTLを開く
![FreeCAD取り込み.png](https://qiita-image-store.s3.amazonaws.com/0/152276/d478a593-6411-50e7-8e94-83955b84f01e.png)

- メッシュから形状を作成
　ちょっと違いが分かりづらいかもしれませんが・・・
![FreeCADメッシュ.png](https://qiita-image-store.s3.amazonaws.com/0/152276/6e283114-281c-ad91-7dac-1403e2cab248.png)

- シェイプ（Solid）を作成
　またまた違いがわかりづらいのですが・・・
![FreeCADSolid.png](https://qiita-image-store.s3.amazonaws.com/0/152276/6dd14173-ff04-cc5a-8bea-e40fb06c1bcb.png)

- メッシュファイルをエクスポート
　下の絵みたいに、絵にするとちょっと間抜けな感じになりますが、
　エクスポートするファイルの種別（STEPファイルであること）がとても重要です。
　特にFreeCADではデフォルトがHtmlになっているので要注意です。
![FreeCADexport_file.png](https://qiita-image-store.s3.amazonaws.com/0/152276/b45a9bda-2d79-249c-486f-6dfcf8f99ac6.png)

#4. fusion360を使って4角メッシュモデルを編集する
fusionは4角メッシュモデルならソリッドモデルとして扱えるようです。
レゴブロックモデルからピン状のオブジェクトを出力してみます。

- まずはfusionのワークスペースにアップロードする
おー、ちゃんと面を認識してくれてますね。
STLのままだとこういうことができません。
これで色々好き勝手ができますね。
![fusion_import.png](https://qiita-image-store.s3.amazonaws.com/0/152276/f1d36393-5017-dc9a-a482-3b5a9f8b2a16.png)

- 必要な部分を切り出します
fusionのコマンド「修正」-「ボディを分割」を使って分割します。
![fusion_切り出し.png](https://qiita-image-store.s3.amazonaws.com/0/152276/81085180-67d0-8d42-dfb0-b5fc524451ce.png)

- いい感じに縮尺を変える
fusionのコマンド「修正」-「尺度」を使って縮尺を変えます。
今回はY座標方向（縦に伸ばす感じで）に縮尺を変えてみました。
（ちょっとだけ、プレス＆プルで加工もしてます）
![fusion縮尺変更.png](https://qiita-image-store.s3.amazonaws.com/0/152276/f2d37c2b-4c01-34df-f41a-cc5c9f7ecc83.png)


いい感じにピン状になりました。

#5. スライスツールでスライスする（出力データにする）
使ったツールはFlashPrintです。
今回はサポート材を使いませんでした。
いやー、モデルがちっさいですね。見づらいなー。
![flashprint.png](https://qiita-image-store.s3.amazonaws.com/0/152276/d34d3517-9560-458a-2d8b-691a028bddb3.png)


さてどうでしょう。うまいこと出力されるかな？

#6. 3Dプリンタ（Creator Pro）で出力する
今回は、出力素材にPLA（青色）を選んでみました。
![DSC_0028.JPG](https://qiita-image-store.s3.amazonaws.com/0/152276/926a07e0-7480-4228-8cab-f981242f8d21.jpeg)


他の出力設定はFlashPrintのデフォルト値です。

#7. こんなんでましたけど
実際に出力したモデルです。
ちょっとピンボケしてますが、ご容赦を。
![DSC_0027.JPG](https://qiita-image-store.s3.amazonaws.com/0/152276/ebe075e7-b278-ec20-d37d-e844f6fd8b99.jpeg)

出力中はこんな感じです。
![DSC_0025.JPG](https://qiita-image-store.s3.amazonaws.com/0/152276/79750363-0e28-5acb-86fd-ef131a975f9e.jpeg)


#8. 最後に
後半の3Dプリンタの部分は大分端折りましたが、
4角メッシュボディ化すると手元のCADツール（今回はfusion360）で編集できる事が分かりました。
翻ってネットには様々なSTLファイルが公開されてます。すごいモデルが沢山ありますよね。

今までは、これらの「わー、これすごいなー」的なモデル（STLファイル）を指をくわえて見てた状態でしたが、
STLファイルを取り込んで自分用にカスタマイズする事が出来るようになりました。
いい世の中になりましたねー。やったぜ父ちゃん。
サービスの自己定義の話。2019年間近。Qiitaは今どこへ向かっているのか？ @yumainaura

# プログラミングに関する知識を記録・共有するためのサービス？

[エンジニアにも役に立つ、MBAで学んだ基礎スキル 20選 - Qiita](https://qiita.com/sue738/items/97b602debf680183c4e7#comment-a29332702e32de17320c) のコメント 



>「Qiitaは「プログラミングに関する知識を記録・共有するためのサービス」です。
>　プログラマーが興味を持つものではなく、プログラミングに関する記事を投稿しましょう。」
>Qiitaは今どこへ向かっているのか？

# 昔

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/c03a1e27-6f61-6ddb-9d29-a4be79028029.png)

# 今

management
ui ux
サービスの話

などが枠を広げ始めている

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/f56f8ff0-6569-a296-76f5-e931f15e30f2.png)

# サービスの内容、ユーザー層、コンテンツの種類、使われ方が拡大したときに、サービスはどうするか

1.自己定義を変えない、枠はこのままにしておく、ただし定義に合わない記事を削除するしないなど、運用の問題はまた別
2.自己定義を変える、枠を広める、今の形に対応できるような憲法を見つける

# 実態に合わせて自己定義を変える、問い直すのは全然あり


![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/88b8a019-bcee-a68d-aa80-5e36912d8c1d.png)


# IMO

僕らはエンジニアリングという小さな枠に収まっていて良いの？

僕らはエンジニアはそもそもサービスをてがけて人を幸福にするために存在するんじゃないの？サービス論を語らなくて余韻p？

僕らはエンジニアリングするためのマネージメントには興味がないの？マネージメントなしに仕事ってできるの？幸福になれるの？


by [yumainaura サービス - Google Search](https://www.google.com/search?q=yumainaura+%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9&oq=yumainaura+%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9&aqs=chrome..69i57j69i60l3j69i59.4392j0j7&sourceid=chrome&ie=UTF-8)










<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
【自分メモ・随時更新】よく使うVimのコマンドまとめ


Vimを使っている際、毎回サイトに飛んで確認をしてしまうので、よく使うコマンドをまとめていきたいと思います。
ほぼこちらから引用しておりますのでご了承ください。：[知識0から始めるVim講座](https://qiita.com/JpnLavender/items/fabcc79b4ab0d52e1f6d)

今後も追加していきます。

##【レベル１】
開いたら毎回使うコマンド

####カーソルモード

| コマンド    　　　 |    　　　　効果　　 |   
|:-----------------|------------------:|
| a             　　|カーソルから１文字進めてinsertモードに入る |
| x             　　|カーソル直下の文字削除 |
| i             　　|カーソル直下からinsertモードに入る |           
|:w                |            上書き保存 |             
| :q             　|   実行中のタブを閉じる |                     
|:w                |            上書き保存 |             
| :wq             　|   上書きしてかつ閉じる |                     
| :e ファイル名     |   ファイル名を開く    |
| dd                 | カーソルがのった一行を削除 |      
 yyまたはY                 | ヤンク：カーソルがのった一行をコピー |    
 p                 | プット：カーソルがのった行の次の行に張り付け |    

####行番号の表示・非表示
表示：`:set number`

非表示：`set nonumber`

####現在のディレクトリを確認する
`:pwd`


##【レベル２】
最近使い始めた便利なコマンド

| コマンド    　　　 |    　　　　効果　　 |   
|:-----------------|------------------:|
| 3yyからのp           　　|３行ヤンク（コピー）&p（ペースト） |
| 3dd            　　|３行削除 |
|gg             　　|先頭行に移動 |
|V             　　|行ビジュアルモード |
|G             　　|最後の行に移動 |

※３行の行数はその時々で変更。          
※gg～V～Gとyy:ヤンクコマンド（コピー）を組み合わせると、全ての行をコピーできる。






##【レベル３】
上達したら追加します。