OmniAICreator/Qiita-1.07M huggingface dataset:
NanoPIでHDD/SSDを活用する

# はじめに
NanoPIにはNAS kit が存在し、簡単にHDD/SSD（以下単にSSD)を搭載できます。
現在、SSDから起動する方法は見つかっていませんが、固定領域を残し、可変領域をすべてSDDに移せばmicroSD（以下単にsd）はRead Onlyになり、書込み過多によるトラブルはなくなります。
FB [NanoPIの部屋](https://www.facebook.com/groups/131561651024605/)の成果物です。
[NanoPIでHDD/SSDをROOT partitionにする](https://qiita.com/maclineto/items/f277154e8a736096be22)にその後の成果をまとめました。どちらを適用するかはご自身で判断してください。
# Backup
ddrescueでSDをコピーします。

# 設定方法
## fdiskの実行
私は32GBのSSDを使いました。
fdiskで6つのパーティーションに分けました。

```
Device     Boot    Start      End  Sectors  Size Id Type
/dev/sda1           2048  8390655  8388608    4G 83 Linux
/dev/sda2        8390656 12584959  4194304    2G 83 Linux
/dev/sda3       12584960 46139391 33554432   16G 83 Linux
/dev/sda4       46139392 61865983 15726592  7.5G  5 Extended
/dev/sda5       46141440 50335743  4194304    2G 83 Linux
/dev/sda6       50337792 52434943  2097152    1G 83 Linux
/dev/sda7       52436992 61865983  9428992  4.5G 83 Linux
```
## mkfsとコピー

```
mkdir /a
mkfs -t ext4 /dev/sda1
mount /dev/sda1 /a
rsync -av /usr/* /a
umount /a
mkfs -t ext4 /dev/sda2
mount /dev/sda2 /a
rsync -av /mnt/* /a
umount /a
mkfs -t ext4 /dev/sda3
mount /dev/sda3 /a
rsync -av /var/* /a
umount /a
mkfs -t ext4 /dev/sda5
mount /dev/sda5 /a
rsync -av /home/* /a
umount /a
mkfs -t ext4 /dev/sda6
mount /dev/sda6 /a
rsync -av /root/* /a
umount /a
mkswap /dev/sda7

```
## /etc/fstab の変更
/dev/mmcblk0p1  /boot   vfat    defaults 0 0
/dev/sda1       /usr    ext4    defaults 0 1
/dev/sda2       /mnt    ext4    defaults 0 1
/dev/sda3       /var    ext4    defaults 0 1
/dev/sda5       /home   ext4    defaults 0 1
/dev/sda6       /root   ext4    defaults 0 1
/dev/sda7       none    swap    sw       0 0
tmpfs           /tmp    tmpfs   defaults 0 0
```
## 試験のための再起動
reboot
立ち上がってコマンドが実行できれば合格です。
df -h

```
Filesystem      Size  Used Avail Use% Mounted on
udev            231M     0  231M   0% /dev
tmpfs            49M  4.2M   45M   9% /run
/dev/mmcblk0p2  7.2G  115M  7.1G   2% /
/dev/sda1       3.9G  1.5G  2.3G  39% /usr
tmpfs           242M     0  242M   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs           242M     0  242M   0% /sys/fs/cgroup
tmpfs           242M     0  242M   0% /tmp
/dev/mmcblk0p1  100M   17M   83M  17% /boot
/dev/sda6       976M  8.8M  900M   1% /root
/dev/sda2       2.0G  519M  1.3G  29% /mnt
/dev/sda5       2.0G  243M  1.6G  14% /home
/dev/sda3        16G  726M   15G   5% /var
tmpfs            49M     0   49M   0% /run/user/0
```
# 不要データーの消去
ここまで来ればssdに移動したsdのデーターは不要です。

```
mount /dev/mmcblk0p1 /a
cd /a
rm -r usr
mkdir usr
rm -r mnt
mkdir mnt
rm -r var
mkdir var
rm -r home
mkdir home
rm -r root
mkdir root
```
rebootします。

# 結論
あっさりSSD Machineになりました。
【Javascript】覚書

#車輪置き場

###配列をまわして順番に値を取り出す
```javascript:Rotate.js
/**
 * 配列を回して順番に値を取り出す
 */
Rotate = function(arr){
    if(!(this instanceof Rotate)) {
        return new Rotate();
    }

    // private
    var _rotator = 0;
    var _arr = arr || [undefined];
    var _rotatormax = _arr.length;

    //public
    this.length = _arr.length;

    //public
    this.get = function(reload){
        var c = _arr[_rotator];
        if (true===reload) this.next();
        else if (false===reload) this.prev();
        return c;
    };
    this.next = function(i){
        if (i===undefined) i=1;
        _rotator = (_rotator+i)%_rotatormax;
        return this;
    };
    this.prev = function(i){
        if (i===undefined) i=1;
        _rotator = (_rotator+_rotatormax-i)%_rotatormax;
        return this;
    };
    this.getRotator = function(){
        return _rotator;
    };
};

```
```javascript:使用例
var x = new Rotate(["sora","A","ankimo"]);

console.log(x.get(true))
console.log(x.get())
console.log(x.get(true))
console.log(x.get(false))
console.log(x.get(false))
console.log(x.get(false))
```

###jQueryで条件分岐を実現する
```javascript:jquery.if.js
;(function($){
$.fn.extend({
  if:function(b, f1, f2){
    if(b){
      f1.call(this);
    }else{
      f2.call(this);
    }
    return this;
  },
  switch:function(c, opt){
    def = {default:function(){}};
    opt = $.extend(def,opt);
    
    if (c in opt){
      opt[c].call(this);
    } else {
      opt['default'].call(this);
    }
    return this;
  }
});
})(jQuery);
```




```javascript:使用例
$("a").if(true, 
  function(){console.log(this)},
  function(){alert("false")}
)
.switch("case1",{
  case1:function(){alert('case1')},
  default:function(){alert('default')}
});
質問です。

```<%= form_for :post, url: posts_path do |f| %>
<p>
  <%= f.text_field : title,placeholder: "enter title" %>
</p>
<p>
  <%= f.text_area : body, placeholder: "enter body text" %>
```

とういコードで

```/home/ec2-user/environment/myblog/app/views/posts/new.html.erb:4: syntax error, unexpected ':' buffer.append=( f.text_field : title,placeholder: "enter tit ^ /home/ec2-user/environment/myblog/app/views/posts/new.html.erb:7: syntax error, unexpected ':' _buffer.append=( f.text_area : body, placeholder: "enter bod ^```

と、エラーが出ました。
分かるかたはいらっしゃいますか？
クオーテーションのことだと思うのですが、、。。
Debian8 CUI時にビープ(beep)音を無効にする。

# 環境
環境 Debian8(32bit)
ThinkPad X40

# 理由
CLIにしたところ、コマンドの補完時[tab]に、候補がない場合にビープ音が鳴るのが気になったので無効にしたい。
(これ、もしかしたらx40だけの症状かも。。)

#作業
ファイルの末尾に追記する。
vi /etc/modprobe.d/blacklist.conf

```
# beep off
blacklist pcspkr
```

OS再起動すれば、有効になる。
雑な常時起動スクリプト

雑に特定のプロセスを常時起動させたかったので

`while true; do ps aux | grep 'python run.py' | grep -v grep; if [ $? -ne 0 ]; then python run.py; fi; sleep 5; done`

# やってること
* whileでループさせて監視させる
* psでプロセス一覧を取得してgrepで起動したコマンドを拾いあげて起動確認をしてる
* リターンコードが0以外だと多分止まってるので起動させる
sin・cosを使って円運動を作成する

三角関数なんて忘れてしまったのでメモ。

## sin・cosとは

sinもcosも数値(角度)を与えてあげると、数値に応じて**-1 〜 +1** までの数値を返してくれる便利なやつ。

sinとcosの違いは
`sin 0` が 0で、
`cos 0` が 1で始まるところ。

![alt](http://emath.a.la9.jp/ydir/Wiki/index.php?plugin=ref&page=Gsankaku&src=sincos01p.png)

周期は同じなので、これを利用して半径(`radius`)をかけると振幅する値が作れ、
それぞれxとyに指定すればクルクルまわる円運動が作れる。

初期位置だと回転してるときにマイナスにも行ってしまうので、
中心点(`center`)をさらに足して場所を調整する。

## JSで回転させたい

```js
const el = document.querySelector('div');
const center = 100;
const radius = 50;

setInterval(() => {
  const t = new Date().getTime() / 500;

  const x = center + (Math.cos(t) * radius);
  const y = center + (Math.sin(t) * radius);

  el.setAttribute('style', `top: ${x}px; left: ${y}px;`)
}, 10);
```

今回与えている数値は時間を元に作成していて、`new Date().getTime()`で取得できるのはミリ秒、これを500で割っている。
つまり0.5秒で1度変化する。

<p data-height="257" data-theme-id="15679" data-slug-hash="OvYmPm" data-default-tab="result" data-user="narikei" data-embed-version="2" data-pen-title="create circular motion using sin & cos" class="codepen">See the Pen <a href="https://codepen.io/narikei/pen/OvYmPm/">create circular motion using sin & cos</a> by なりたけいすけ (<a href="https://codepen.io/narikei">@narikei</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>


## 逆回転させたい
sinとcosを反対にすると、逆回転できる

<p data-height="300" data-theme-id="15679" data-slug-hash="EEzmyB" data-default-tab="result" data-user="narikei" data-embed-version="2" data-pen-title="create circular motion using sin & cos (reverse)" class="codepen">See the Pen <a href="https://codepen.io/narikei/pen/EEzmyB/">create circular motion using sin & cos (reverse)</a> by なりたけいすけ (<a href="https://codepen.io/narikei">@narikei</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
15行で試す 高機能グリッドとピボットテーブル(XamDataGrid, XamPivotGrid)

WPFのサードパーティー製品であるInfragistics WPFについて、
高機能グリッドや、ピボットなど魅力的なコントロールが数多く含まれています。
が、高機能ゆえに複雑な設定が必要では？と思われるかもしれませんが、
グリッドとピボットを機能あわせても最小限のコード量（約１５行）で動かすことができます！

#サンプルコード
```csharp:MainWindow.xaml.cs
        private void SettingDatas<T>(IEnumerable<T> datas)
        {
            // Gridへのデータソースを設定
            xamDataGrid.DataSource = datas;
            // Pivotに対するデータソースを設定
            FlatDataSource flatData = new FlatDataSource()
            {
                ItemsSource = datas,
                ConnectionSettings = new FlatDataConnectionSettings(){ ItemsSource = datas}
            };
            xamPivot.DataSource = flatData;
            xamPivotDataSelector.DataSource = flatData;
        }
```

```xml:MainWindow.xaml
        <igWPF:XamDataGrid x:Name="xamDataGrid">
            <igWPF:XamDataGrid.FieldSettings>
                <igWPF:FieldSettings AllowRecordFiltering="true" />
            </igWPF:XamDataGrid.FieldSettings>
        </igWPF:XamDataGrid>
        <ig:XamPivotGrid x:Name="xamPivot"/>
        <ig:Expander><ig:XamPivotDataSelector x:Name="xamPivotDataSelector" /></ig:Expander>
```

あとは表示したいデータを設定するのみ。

```csharp:
    // サンプルデータを設定
    SettingDatas<SampleData>(datas);
```

```csharp:
    public class SampleData
    {
        public DateTime Date { get; set; }
        public string Category { get; set; }
        public string Name { get; set; }
        public decimal Budget { get; set; }
        public decimal Actual { get; set; }
    }
```



## グリッドの操作
![グリッド.gif](https://qiita-image-store.s3.amazonaws.com/0/48623/277fb4f0-dad8-fa34-e731-8892c393a95f.gif)

## ピボットの操作
![ピボット.gif](https://qiita-image-store.s3.amazonaws.com/0/48623/315ca013-10c9-cddc-b5e9-4c38574111fe.gif)


サンプルコード含め、GitHubにコミットしています。
https://github.com/furugen/infragistics-wpf-xampivotgrid-001
※別途、Infragistics製品が必要となりますので、ご興味があればインストールしてお試しください。
https://jp.infragistics.com/products/wpf

次回はExcelのデータを読み込みや、チャート機能の連携に関する記事を書こうと思います。
（InfragisticsのExcelライブラリもかなり強力です！）
緯度経度から都市の名前を得る

Google Maps Geocoding API の リバースジオコーディング　の例です。

```py:reverse_geo.py
#! /usr/bin/python
# -*- coding: utf-8 -*-
#
#	reverse_geo.py
#
#						Apr/30/2019
#
# ------------------------------------------------------------------
import	os
import  sys
import  json
import  requests
from dotenv import load_dotenv
#
# ------------------------------------------------------------------
def parser_results(json_str):
	dict_aa = json.loads(json_str)
#
	city = ""
	pref = ""
	components = dict_aa['results'][0]['address_components']
	for it in range(len(components)):
		unit_aa = components[it]
		if (unit_aa['types'][0] == "locality"):
			city = unit_aa['short_name']
		elif (unit_aa['types'][0] == "administrative_area_level_1"):
			pref = unit_aa['short_name']
#
	return city,pref
# ------------------------------------------------------------------
def get_city_pref_proc(api_key,lat,lon):
	url_aa="https://maps.googleapis.com/maps/api/geocode/json?latlng="
	url=url_aa + str(lat) + "," + str(lon) + "&language=ja&key=" + api_key
	res = requests.get(url)
	json_str=res.text
	city,pref = parser_results(json_str)
	print(lat,lon,city,pref)
#
# ------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")
#
dotenv_path = '.env'
load_dotenv(dotenv_path)
api_key = os.environ.get("API_KEY")
#
get_city_pref_proc(api_key,43.08,141.35)
get_city_pref_proc(api_key,36.56,139.88)
get_city_pref_proc(api_key,35.91,139.66)
get_city_pref_proc(api_key,35.68,139.76)
get_city_pref_proc(api_key,35.16,136.90)
get_city_pref_proc(api_key,34.70,135.50)
get_city_pref_proc(api_key,33.59,130.42)
get_city_pref_proc(api_key,31.56,130.56)
get_city_pref_proc(api_key,26.21,127.68)
#
#
sys.stderr.write("*** 終了 ***\n")
# ------------------------------------------------------------------

```

API_KEY は置き換えて下さい。

```text:.env
API_KEY="***************************************"
```

実行結果

```text
$ ./reverse_geo.py 
*** 開始 ***
43.08 141.35 札幌市 北海道
36.56 139.88 宇都宮市 栃木県
35.91 139.66 さいたま市 埼玉県
35.68 139.76 千代田区 東京都
35.16 136.9 名古屋市 愛知県
34.7 135.5 大阪市 大阪府
33.59 130.42 福岡市 福岡県
31.56 130.56 鹿児島市 鹿児島県
26.21 127.68 那覇市 沖縄県
*** 終了 ***
```
HTMLメールを作成した時の備忘録

HTMLメールを作成してと言われた時に
気をつけたことをまとめました。

# 主流の書き方
HTMLメールは昔のIE対応ごとくメーラー独自のバグが非常に多いです。:innocent:
 
そのため
2018年4月現在のHTMLメール作成の主流は未だ**「テーブル組」**です。
HTMLのバージョンは
XHTML1.0やHTML4で作成するのが主流です。

# テーブル組の理由
メーラーは多くの種類存在していますが
CSSプロパティで指定できることは、メーラー毎に異なります。

以下参考URLで主流なメーラーのCSSを対応一覧がわかります。
The Ultimate Guide to CSS
https://www.campaignmonitor.com/css/

こちらに書いている通り
普段多用しているCSSがほぼ使用することが難しいです。
marginやpaddingなどレイアウトを構築する上でよく使うプロパティも使えないので
HTMLメールでは、
**CSSではなくテーブルでレイアウトし、装飾には幅広いメーラーで使えるCSSのみを使う。**
というのがポイントになります。

# その他コーディングする上で注意する点
テーブル組以外で注意する点は以下になります。

- 文字コードはISO-2022-JP（今回は送信に使用するツールで文字コード変換機能がついていたためUTF-8で作成）
- 画像、リンクパスなどは絶対パス
- brタグで空行を作ってはいけない。(br2つで空行を作ることができないメーラーが存在する。)
- CSSはインライン形式で指定（GmailなどWEBメールでstyleタグや外部CSSに対応していない。）
- 画像はjpgかgif（pngファイルは重いので使用しない。）


# 制作方法
今回のHTMLメール作成で使用したツール、導入したものを紹介します。

## タスクランナー（Gulp）
https://www.npmjs.com/package/gulp
タスクランナーで効率化を図りました。

### テンプレートエンジン（EJS）
https://www.npmjs.com/package/gulp-ejs
今回は毎月HTMLメールを配信する予定だったので
テンプレートエンジンでなるべく共通部分を流用できるようにした。
拡張の自由度が高いことを理由にEJSを選定。
table組で階層が深くなり可読性が悪くなることも
これで若干解消！

### CSS プリプロセッサ（Stylus）
https://www.npmjs.com/package/gulp-stylus
使い慣れていたためStylusを選定

### inlineCSS
https://www.npmjs.com/package/inline-css
CSSをHTMLファイルのStyle属性にインライン展開してくれるツール
HTMLメールはCSSはインライン形式にするのが望ましいが、
毎度htmlタグのstyle属性にcssを書いていると大変ですし
可読性も悪いのでこちらを採用。

stylusとinlineCSSは並列に処理はできないため
stylusで外部のCSSを作成後、inlineCSSでHTMLにインライン化するよう工夫が必要です。

###  画像圧縮（imagemin）
https://www.npmjs.com/package/imagemin
HTMLメールはファイルが重いと表示できないことがあるので、
なるべく画像は圧縮をかけて軽量化します。

## リセットCSS
メール用のリセットCSSは以下を参考にしました。
https://github.com/dudeonthehorse/normalize.email.css

## レスポンシブ対応
Outlookはmax-widthを指定しても反映されないため、
Outlookのみレスポンシブはせず、横幅固定のソリッドデザインで割り切る必要があります。

通常はレスポンシブ
Outlookのみソリッドデザインする例は以下になります。


```html:レスポンシブ対応しつつOutlook対策の例（横幅最大800px）

<!--[if gte mso 9]><table width="800" bgcolor="#FF0000" style="width:800px;"><tr><td><![endif]-->
<table bgcolor="#FF0000" style="max-width:800px;width:100%">
・
・
・
</table>
<!--[if gte mso 9]></td></tr></table><![endif]-->
```


## 検証ツール
PC用メーラーに加え、スマホ用のメーラーアプリなど
全てをチェックするのは大変です。
そのため、表示確認は以下サービスを利用しました。

Litmus
http://litmus.com/

こちらは有料なのですが
多くのメーラーを確認できるのでオススメです。


# まとめ
メーラーは様々な種類があるため、すべてを網羅して対応することは難しいです。
そのためコーディングはなるべくCSSを使わない設計が理想です。
動作保証のメーラーをどれにするかをクライアントやディレクターさんなどにはっきり決めてから
作業することでトラブルを回避できるので、
現状のHTMLメール制作の難しさしっかり説明することが大切だと思います。

それでは良きHTMLメールライフを。。。
Kaggle初心者向けPorto Seguro'sコンペ　おすすめKernel一覧

##導入
まだ、私は機械学習を学び始めて２ヶ月ぐらいです。
最近Kaggleで学んだ知識を実践しようと取り組んでおり、どういった学習方法がいいのかなーって調べていたら
<br/>
**「KaggleのKenel読むといいよ！！」**
<br/>

ってあったので見てみたのですが

**意味不明なコードで書かれたKernelばっかやん😡**

そういうわけでなんとかして、初心者向けの簡単なコードで書かれたカーネルを見つけたので紹介していこうと思います。

ちなみにコンペはtkm2261さんのYoutube動画の影響を受けてPorto Seguro'sをやってます。
このコンペはデータが綺麗で、自然言語処理の知識とかも入らないのでtitanicやった後はこのコンペをやることをおすすめします!

カーネルに関しては見つけ次第順次追加していく予定です。
もし、初心者におすすめのカーネルがあるよーって方はコメントしてくだされば追加するのでよろしくお願いします。m(__)m
##Kernel一覧

###Data Preparation & Exploration
* https://www.kaggle.com/bertcarremans/data-preparation-exploration

一通り学んだ後であれば容易に理解できると思います。一番おすすめ

###Resampling strategies for imbalanced datasets
* https://www.kaggle.com/rafjaa/resampling-strategies-for-imbalanced-datasets
不均衡なデータセットに対する手法がまとめられているので、おすすめ