OmniAICreator/Qiita-1.07M huggingface dataset:
Flask + jQuery(ajax)でページ遷移せずにform入力データを送る

Flask（PythonのWebフレームワーク）とjQueryのajaxを使って、formの内容を非同期通信で送る方法です。

## クライアント側
### HTML

```html
<form class='ajax_submit' method="post" action="/toPostURL">
  <input type="text" name="username">
  <input type="text" name="age">
  <button>Submit</button>
</form>
```

### jQuery
```javascript
$('.button').on('click', function(){
  $.ajax({
    url: $(this).parent('form').attr('action'),
    type: 'post',
    data: $(this).parent('form').serialize()
  });
});
```

`serialize()`により、指定したform内の値が`username=[入力値]&age=[入力値]`のように変換される。便利だ。

※submitボタンを`type='submit'`なんかで指定している場合は、`event.preventDefault();`で本来のPOST機能の取り消す処理を忘れずに！


## サーバー側
### Python

```python
@app.route('/toPostURL', methods=['POST'])
def get_user_info():
    username =  request.form['username'];
    age = request.form['age'];
    response = Response()
    response.status_code = 200
    return response
```

## 実装環境
Flask : 0.12.2
Python : 3.5.2


## お世話になったページ
[Python Flask jQuery Ajax POST](http://codehandbook.org/python-flask-jquery-ajax-post/)
ブラザー　ネットワークプリンタ（MFC-490CN）は、  Raspberry Pi 搭載らしい

#はじめに
Qiita に、ハード屋の俺が書くことはないと思っていたが、
色々見ていると、俺もやったことある～・・・と自分のBlogを思い出し、
Linkを張ってみる。

#ハードウェア
RaspberryPi3：初めてのラズパイです。
microSD card：16GB class10（PCから書き込みます）
microUSB cable：電源用
無線LAN環境：家庭内LAN
PC：Windows7 ～


#表題、何言っているか判らないだろうナ。
以下、参照
「2016年04月18日
ネットワークプリンタをデバッグ？！」 http://dxvacation.com/article/436829883.html

> Welcome. Type <return>, enter password at # prompt
> #
> #
> Brother NC-180w Command Console
> Copyright(C) 1999-2008 Brother Industries,Ltd.
> KASAGO TCP/IP Copyright (c) 1997 Elmic WESCOM, Inc.
> Copyright(C) 1983-1998 PACIFIC SOFTWORKS INC.
> Interface 1 : NC-170h, Ethernet 10/100BASE-TX (Inactive)
> Interface 2 : NC-180w, IEEE 802.11b/g (Active)
> Interface 2 is selected for configuration
> Type HELP for command list
> Enter username> raspberrypi

<snip>

> Local> SH
> ENET Ethernet Parameters
> FRee Memory Available
> FTP FTP Parameters
> IF Interface functions
> IP LPD/TCP/Telnet Parameters
> LLMNR Linklocal Multicast Name Resolution Parameters
> LLTD Link Layer Topology Discovery Parameters
> LOAd Firmware update Parameters
> LPD LPD Protocol Parameters
> MDNS mDNS Parameters
> NETBIos NetBIOS Parameters
> NETSCan Network scan Parameters
> PCFAX PC fax receive Parameters
> PORT Port Parameters
> RAWPort RAWPort Parameters
> REMOTESEtup Remote Setup Parameters
> SERVEr Server Parameters
> SERVIce Service Parameters
> SNMP SNMP Parameters
> TELnet Telnet Parameters
> TEStpage Print test Page
> TFtp TFTP Parameters
> VErsion Server Version
> WLan WLan functions
> WEBServices Web Services Parameters
> Local>

#そこに至るまで

1. [Raspberry Pi（初めの一歩）](http://dxvacation.com/article/436707934.html)

2. [Raspberry Pi（OSを入れる）](http://dxvacation.com/article/436708085.html)

3. [Raspberry Pi（Terminalソフト）](http://dxvacation.com/article/436834576.html)

4. **[ネットワークプリンタをデバッグ？！](http://dxvacation.com/article/436829883.html)**

5. [Raspberry Pi（有線LANでSSH）](http://dxvacation.com/article/436860455.html)

6. [Raspberry Pi（無線LANでSSH）](http://dxvacation.com/article/436923679.html)

#言い訳
この記事は、
・Qiitaの投稿の練習
・Markdown記法の練習です
SierraとHigh Sierraのバンドルソフトウェアの比較

取り急ぎよく使うもののみ

| path | Sierra (10.12.6) | High Sierra (10.13) |
|----|--------|-------------|
|/bin/bash|3.2.57|3.2.57|
|/usr/bin/perl|5.18.2|5.18.2|
|/usr/bin/php|5.6.30|7.1.7|
|/usr/bin/python|2.7.10|2.7.10|
|/usr/bin/ruby|2.0.0p648|2.3.3p222|
|/usr/bin/emacs|22.1.1|22.1.1|
|/usr/bin/vim|7.4|8.0|
|/usr/bin/git|2.11.0|2.13.5|
cakephp3 mysql 今日の日付のデータを取得

cakephp2 の時はもっと簡単にできたのに。
というのことで、cakephp3 + mysql で 今日のデータを取得する裏技を教えます。


created が今日の10日前より古いデータを取得

```

$date = new \DateTime();

$time = [
    'end' => $date->modify('-10 days')->format('Y-m-d 23:59:59')
];


$res = $this->Kankeis->find()
    ->where([
        'created <' => $time['end']
    ])
    ->first();



```


created が今日の10日前より新しいデータを取得

```

$date = new \DateTime();

$time = [
    'end' => $date->modify('-10 days')->format('Y-m-d 23:59:59')
];


$res = $this->Kankeis->find()
    ->where([
        'created >' => $time['end']
    ])
    ->first();



```




created が X 日前から Y日までのデータを取得
cakephp3 コード

```

$date = new \DateTime();

$time = [
    'start' => $date->format('Y-m-d 00:00:00'),
    'end' => $date->format('Y-m-d 23:59:59')
];

$res = $this->Kankeis->find()
    ->where([
        'created BETWEEN :start AND :end'
    ])
    ->bind(':start', $time['start'], 'datetime')
    ->bind(':end',   $time['end'], 'datetime')
    ->first();

pr($res);



```


実行後のログ

```
SELECT 
  Kankeis.id AS `Kankeis__id`, 
  Kankeis.social_id AS `Kankeis__social_id`, 
  Kankeis.target_social_id AS `Kankeis__target_social_id`, 
  Kankeis.omoi AS `Kankeis__omoi`, 
  Kankeis.created AS `Kankeis__created` 
FROM 
  kankeis Kankeis 
WHERE 
  (
    social_id = 1234 
    AND created BETWEEN '2017-09-26 00:00:00' 
    AND '2017-09-26 23:59:59'
  ) 
LIMIT 
  1

```


おまけ

```

$time = [

            'end' => $date->modify('-30 minutes')->format('Y-m-d H:i:s')//30分前
//            'end' => $date->modify('-1 hours')->format('Y-m-d H:i:s')//１時間前
        ];

```

解説
- 日時情報は php で取得しておく
- 'created BETWEEN :start AND :end' と bind を駆使する


DateTimeの使い方は詳しく
https://qiita.com/re-24/items/c3ed814f2e1ee0f8e811

にまとめられています。
ぜひご参考になすってください。

以上です。
C#で循環リストを利用してランダムな無限っぽいリストを作る。

# C#で循環リスト

通常のリストを循環リストにする。

```csharp
/// <summary>
/// 循環リスト
/// </summary>
/// <typeparam name="T"></typeparam>
class InfiniteList<T> : IEnumerable<T>
{
    private readonly List<T> _list;

    public InfiniteList(IEnumerable<T> source)
    {
        _list = source.ToList();
    }

    public IEnumerator<T> GetEnumerator()
    {
        while (true)
        {
            foreach (T val in _list)
            {
                yield return val;
            }
        }
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return this.GetEnumerator();
    }
}

class Program
{
    static void Main(string[] args)
    {
        // 単純な循環リスト
        int[] a12345 = { 1, 2, 3, 4, 5 };
        InfiniteList<int> infiniteInt = new InfiniteList<int>(a12345);
        foreach(var x in infiniteInt.Take(20))
        {
            Console.WriteLine(x);
        }

        // ランダムな値を返す関数のリストにすればランダムな無限リストが得られる
        var rnd = new Random();
        Func<int>[] r = { () => rnd.Next() };
        InfiniteList<Func<int>> infiniteFunc = new InfiniteList<Func<int>>(r);
        foreach(var f in infiniteFunc.Take(20))
        {
            Console.WriteLine(f());
        }
    }
}
```

# 実行結果

```
1
2
3
4
5
1
2
3
4
5
1
2
3
4
5
1
2
3
4
5
1907137116
495422201
112043150
962297659
728376374
1593775114
1232326859
437976340
1500446889
1646938930
1574476665
1872560263
198735725
1398558555
917918457
3743234
1411914095
1404301363
2043674725
644393754
```

こんな感じの拡張メソッドを用意しておけばメソッドチェーンもできますね。

```csharp
public static IEnumerable<T> Infinite<T>(this IEnumerable<T> source) =>
        new InfiniteList<T>(source);
```
【Laravel5.4】色々なバリデーション方法

- 以下に記すのは実際に挙動を確認したものでリーダブルより若干わかりやすく書いているつもりです  
 **が、間違っているかもしれませんので基本はリーダブルを参照してください。**
   - [バリデーション 5.4 Laravel](https://readouble.com/laravel/5.4/ja/validation.html)

## 必須項目
**required**
  
## ～の場合は必須項目にする（例：×を選択した人はある項目を必須にする）
**required_if**

```php
// 例：company項目の値がqiitaの場合は対象の項目を必須にする
required_if:company,qiita,
```
  
## ～に値がある場合は～も必須項目にする
**required_with**

```php
// 例：company項目に値が入力されている場合は対象のemployee_id項目も必須にする
required_with:company,employee_id,
```
  
  
## 任意項目（空白を許可する）
**nullable**
  
## メールアドレスのフォーマットチェック
**email**
  
## 最小入力文字数のチェック
**min:数字**
  
## 最大入力文字数のチェック
**max:数字**
  
## 入力桁数のチェック
**digits_between|最小値,最大値**

```php
// 例：1桁以上3桁以下で入力させたい場合
digits_between:1,3
```
  
## 再入力欄との整合性チェック
**confirmed**
※このバリデーションを使用する際は再入力項目の名前を**～_confirmation**のように命名しないと使えません

```php
// 例：パスワード項目で再入力欄を設ける場合
'password'              => 'required|confirmed',
'password_confirmation' => 'required',
```

## 正規表現
**regex:/[正規表現]/**

```php
// 例：半角英数字のみ許可する場合
regex:/^[a-zA-Z0-9]+$/
```
  
## 数値チェック
**numeric**

## 項目が有効（disabled属性なし）の時、必須
**sometimes**  
※逆にdisabled属性ありの場合は通ってしまうのであんまり使わない方がいいかもしれません・・・
（**required_if**の方がいいかもしれません）


※また追加していく予定です。
対象ファイルを特定のcommit時点の状態に戻す


## commit番号の確認
```
git log
```
戻したい時点のcommit番号を確認する。


## ファイルの内容を戻す
```
git status

// 対象のファイルの状態をcommit番号の時点に戻す
git checkout {commit番号} {ファイル}

// 戻ってたらいいな
git status
```
SDKMANでGradleをバージョン指定

自分用のメモ。
現場によってbuild.gradleが4系非対応のことがあるので。
SDKMAN(旧gvm)を使用してバージョン指定してインストール。

# 方法

[Gradle公式](https://gradle.org/install/)を参考。
3系の最新の3.5.1をインストール。

```
curl -s api.sdkman.io | bash
source .sdkman/bin/sdkman-init.sh
sdk list gradle
sdk install gradle 3.5.1
```
「Remote debugger is in a background tab which may cause apps to perform slowly. ...」を表示しない方法

[元ネタ](https://stackoverflow.com/questions/35309385/how-do-you-hide-the-warnings-in-react-native-ios-simulator)。

[ドキュメント](https://facebook.github.io/react-native/releases/0.25/docs/debugging.html#yellowbox-redbox)にも書いてた。

以下のコードを、App.js などに適当な箇所に追記。

```js
console.ignoredYellowBox = [
  'Remote debugger is in a background tab which may cause apps to perform slowly. Fix this by foregrounding the tab (or opening it in a separate window).',
];
```
react-fontawesomeなのかreact-faなのかreact-iconsなのか


## 背景

Material-UI (v1.0.0-beta.11)を使っていて、SPAでよくあるPOSTしたタイミングでスピナーを回すUIを作成したのだが、どうやら、 `CircularProgress` コンポーネントがメモリリークしてしまっているようで、iPhoneのsafariで画面が固まる現象に遭遇した。

[Progress - Material-UI](https://material-ui-1dab0.firebaseapp.com/demos/progress/)

[[CircularProgress] Only works with Chrome · Issue #5524 · callemall/material-ui](https://github.com/callemall/material-ui/issues/5524)

もちろん、beta版を使用していて、バグが含まれることも承知の上なので、スピナーのUIをMaterial UIにこだわる必要もない、かつ、致命的なバグなので、スピナーのUIはFont AwesomeのSpinnerアイコンを回転させることで対応することにした。

そこで、React環境にFont Awesomeを導入するためのパッケージをいくつか比較した。いかにコストをかけずに、スピナーを回せるかという視点で導入を判断した。

## react-font-awesome: ★400+

[danawoodman/react-fontawesome: A React Font Awesome component.](https://github.com/danawoodman/react-fontawesome)

結局これを導入した。

`font-awesome.min.css` ファイルを別途読み込ませれば、下記のI/Fでアイコンを使える。spinプロパティが用意されていて、このプロパティを付与すれば、アイコンが回転する。

```js:sample
<FontAwesome
  name='spinner'
  size='2x'
  spin
/>
```

## react-fa: ★400+

[andreypopp/react-fa: Font Awesome icons as React components](https://github.com/andreypopp/react-fa)

こちらは、webpack.configにloaderを足して、アイコンを読み込む。別プロジェクトで導入していたことがあったが、今回はなるべくwebpack.configを触りたくなかったので、導入を見送った。

こちらもspinプロパティが用意されている。


## react-icons: ★1200+

[gorangajic/react-icons: svg react icons of popular icon packs](https://github.com/gorangajic/react-icons)

Font awesomeの他に、Material、Typiconsも使えるが、正直、Font Awesomeだけで十分なので、YAGNI原則に従って、見送った。

あと、spinプロパティが実装されておらず、自分でcssで回してね、とのことだったので、そこも見送った要因となった。

[Spinning icons · Issue #52 · gorangajic/react-icons](https://github.com/gorangajic/react-icons/issues/52)

## その他
Material UIのバグはissueに挙がっていたので、そのうち対応されるかと思う。Material UIのIconsも少し使い勝手が悪いので、一緒にreact-fontawesomeに乗り換えたい所感を抱いている。
pandasのtips

# pandasの効率的な書き方

## なるべくforを使わない

pandasのベースはnumpyなので、numpyのテクニックが有効です。

例として、下記の表xの行の積の和を求めたいとします。

```py3:jupyter
x = pd.DataFrame(np.random.rand(100000,3),columns=list('abc'))
x[:3] # 先頭3行
```

<table>
  <thead>
    <tr>
      <th></th>
      <th>a</th>
      <th>b</th>
      <th>c</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>0.902417</td>
      <td>0.443804</td>
      <td>0.678391</td>
    </tr>
    <tr>
      <th>1</th>
      <td>0.873176</td>
      <td>0.405184</td>
      <td>0.845241</td>
    </tr>
    <tr>
      <th>2</th>
      <td>0.050312</td>
      <td>0.040537</td>
      <td>0.686412</td>
    </tr>
  </tbody>
</table>

下記のように for を使うことなく計算できます。

```py3:jupyter
%%time
print((x.a*x.b*x.c).sum())
>>>
12501.777226525046
Wall time: 7 ms
```


## DataFrameやSeriesを通して頻繁にアクセスしない

先ほどの例で、forで**行ベースで計算しないといけない場合**も、工夫次第で高速化できます。
行ベースで、よく使うのは、iterrows() でしょう。

```py3:jupyter
%%time
s = 0
for _,r in x.iterrows():
    s += r.a*r.b*r.c
print(s)
>>>
12501.7772265
Wall time: 5.71 s
```

forを使わない場合より 3桁遅いです。
DataFrameは、列(Series)で構成されているので、各Seriesをzipにした方が、まだ高速です。

```py3:jupyter
%%time
s = 0
for a,b,c in zip(x.a,x.b,x.c):
    s += a*b*c
print(s)
>>>
12501.7772265
Wall time: 111 ms
```

次によく使うのは、index参照でしょう。

```py3:jupyter
%%time
s = 0
for i in range(len(x)):
    s += x.a[i]*x.b[i]*x.c[i]
print(s)
>>>
12501.7772265
Wall time: 4.59 s
```

速度的には、iterrows()と同じくらいです。
Seriesを通すと遅いので、先にlistにすると高速化できます。

```py3:jupyter
%%time
s = 0
a,b,c = x.a.tolist(),x.b.tolist(),x.c.tolist()
for i in range(len(x)):
    s += a[i]*b[i]*c[i]
print(s)
>>>
12501.777226525046
Wall time: 66 ms
```

以上
１ヶ月足らずでWebサービスを立ち上げた際に導入したRubyGemまとめ

## はじめに

題意の通り、１ヶ月足らずでWebサービスを立ち上げたので、その際に導入したRubyGemをまとめます。
Rails5の利用が前提となります。
ちなみに、フロントエンド、サーバーサイド、インフラの全領域を一人でカバーして１ヶ月足らずでリリースできました。
ひとえにこれもRubyOnRailsの生産性の高さによるものだと思います。
似たようなことをこれからしようという方の参考になれば幸いです。
そのWebサービスはこちらにあります。　→　https://www.libarta.ml

## 導入したGem

| Gem | 説明 |
|:-----------|:------------|
|slim-rails|独自のマークアップ記法により、コード量を削減します。更にパフォーマンスの向上も見込めます。|
|bootstrap-sass|今風なUIをサクッと作れます。Sassでスタイルシートのコードが美しくなります。|
|bcrypt|主にパスワードの暗号化に使います。|
|carrierwave  mini_magick  fog|画像のアップローダーの実装に使います。|
|kaminari  bootstrap-kaminari-views|Bootstrapのデザインを反映したページネーション機能の実装に使います。|
|simple_form|整ったフォームをサクッと作れます。|
|nested_form|モデルのネストに合わせたフォームをサクッと作れます。|
|font-awesome-rails|クラスを付けるだけで今風なアイコンを使えます。これだけで欲しいアイコンは大体揃います。|
|enum_help|enumをI18n対応させます。|
|ransack|シンプルな検索機能ならこれで十分です。|
|config|定数の管理に使います。|
|aws-ses|インフラにAWSを使っているので、メール送信のために必要でした。|
|slack-notifier|バグなどをSlackに通知させているので、これを使います。|
|meta-tags|基本的なSEO対策はこれで済ませました。|
|jquery-turbolinks|turbolinksの不具合を治す時に使いました。|
|exception_notification|例外を通知させる時に使います。|
|chosen-rails|検索可能なセレクトボックスをサクッと実装できます。|
|twitter|公式アカウントの運用に使っています。|
|whenever|cronタスクの設定に使います。|
|rake|cronタスクでrakeタスクを実行させる時に使いました。|
|unicorn|Nginxと組み合わせてアプリケーション・サーバーの構築をしました。|
|google-analytics-rails|Google Analyticsを入れる時に使いました。|
|rspec  rspec-rails  factory_girl_rails|テストはこれらを使って書いています。|
|capistrano  capistrano-bundler  capistrano-rails  capistrano-rbenv|コマンド一つでデプロイができるようにするために使いました。|
|faker|ダミーデータを作ります。|
|guard-rspec|ターミナル上で自動でテストが走るようにできます。|
|i18n_generators|アプリケーションの日本語化（多言語化）に使います。|
|annotate|DBやルーティングの情報をソースコード上のコメントとしてまとめてくれます。|
|capybara|ブラウザを操作する統合テストを書く時に使います。|
|database_cleaner|テスト環境のデータの削除に使います。|
|launchy|capybaraでのテスト中に現在のページを開きたいときはこれ。|
|selenium-webdriver|capybaraでのテストでJavaScriptを動作させる時に使いました。|
|rails-controller-testing|Rails5でのテストではこれがないとうまく動作しないということがありました。|

あとはデフォルトのGemで事足りました。それでは良きRailsライフを！
Swift 4の魅力の一面を3行で表す

先日 Swift 4 がリリースされました。みんな注目しているのは `Codable` など劇的にコーディングが楽になる新機能だと思いますが、ちょっとした便利な小技もあります。

そんな、 Swift 4 の小技の魅力の一面を 3 行にぎゅっと詰め込んだコードを思い付いたので紹介します。

```swift
// User の Array から、 team ごとの人数を集計する
let teamToCount: [String: Int] = users.reduce(into: [:]) { teamToCount, user in
  teamToCount[user.team, default: 0] += 1
}
```

これは、 `User` の `Array` を `team` ごとに集計するコードで、次の二つの新 API を使っています。

- `Dictionary` の `subscript(_:default:)` （[リファレンス](https://developer.apple.com/documentation/swift/dictionary/2894528-subscript)）
- `Sequence` の `reduce(into:_:)` （[リファレンス](https://developer.apple.com/documentation/swift/sequence/2926337-reduce)）

## Swift 3だと

もし、 Swift 3 で同じことを書こうとすると次のようなコードになるでしょう。

```swift
// Swift 3 の場合
var teamToCount: [String: Int] = [:]
for user in users {
  let team = user.team
  if let count = teamToCount[team] {
    teamToCount[team] = count + 1
  } else {
    teamToCount[team] = 1
  }
}
```

長いですね・・・。しかも、 `teamToCount` が無駄に `var` になってしまいました。

## ちょっとした解説

どうして Swift 3 だと長くなってしまうかと言うと、 `Dictionary` の `subscript` を使おうとした部分で、キーに対応した値が存在しないケースを別で扱わないといけないからです。 `Dictionary` を使った集計というのは（少なくとも僕は）よく書く処理であり、他の言語を書いている場合も含めてストレスフルなパターンの一つです。それを、 `default` 値を与えられるようにし、 `+=` と組み合わせて使えるというのが素晴らしいところです。

また、 `Sequence` から何かを組み立てるときに `reduce` は便利ですが、 Swift 3 までは `Dictionary` を `reduce` で組み立てる良い方法がありませんでした。新しい `reduce(into:_:)` は `inout` な引数を持つ関数を渡すというアイデアでその点を見事に解決しています。

それぞれの API の詳しい説明は次の投稿を御覧ください。

- `Dictionary` の `subscript(_:default:)`: [Swift4.0でDictionaryが大幅にパワーアップした](https://qiita.com/hanawat/items/341a6f7843f4e19780b5#subscript_default) by @hanawat
- `Sequence` の `reduce(into:_:)`: [Swift 4の新しいreduceが素晴らしいので紹介する](https://qiita.com/koher/items/17636e95e18e529e5b9b) by @koher

`group(by:)` 的なメソッドがあればもっと簡単なんじゃないかという考え方もありますが、よりプリミティブで汎用性が高く、使い勝手の良い道具が用意されて、それを組み合わせてこれまで面倒だったケースに対応できたというところが僕が感動した点です。

## 動作するコード全体

検証用に書いた動作するコードの全体です。そのまま実行できます。

```swift
// 型の準備
struct User {
  var team: String
}

// 値の準備
let users = [
  User(team: "A"),
  User(team: "B"),
  User(team: "B"),
  User(team: "A"),
  User(team: "C"),
  User(team: "A"),
  User(team: "C"),
  User(team: "B"),
  User(team: "D"),
  User(team: "A"),
]

// 集計
let teamToCount: [String: Int] = users.reduce(into: [:]) { teamToCount, user in
  teamToCount[user.team, default: 0] += 1
}

// 出力
for (team, count) in (teamToCount.sorted { $0.key < $1.key }) {
  print("\(team): \(count)")
}
```
Redox OS Kernelのコーディングガイドラインが示唆に富んでいたのでメモ


# はじめに
- Redox OS とは
    Rustで書かれたフルスクラッチのマイクロカーネルOS。OSだけでなく、エコシステム（エディタ、ビルドツールもろもろ）、GUIもRustで書くと言うなかなか壮大なプロジェクト。なお、まだドライバが不十分なため主に仮想環境で動く。
    https://www.redox-os.org/jp/
    https://github.com/redox-os/redox

- Redox OS kernelとは
    醜くなっていくカーネルをリライトする内部プロジェクト。
    https://github.com/redox-os/kernel

# README.mdの拙訳
※1.誤訳、指摘等あればコメントでぜひ。あと、一部わからないところや推測した箇所は[hoge]で付記してあります。
※2.20170927にREADME.mdが改変され以下の文言は削除されています。目的を達成したようです。なお、削除される前の原文は[20170327に改稿されたバージョン](https://github.com/redox-os/kernel/tree/0ae08c52f6d7096815f048ca668b5789f067758b)です。

## 理由(Why?)


[Redox]カーネルは最初に書いた者しかバグを発見・修正することが出来ないほど急激に汚くなっている。幸いなことに、Redoxカーネルは比較的小さいためこのプロジェクトには数ヶ月しかかからないだろう。

## 目標(What?)


新たなるカーネルは以下の要求において明確でなければならない。

正しさ：何よりも、カーネルは正しくなくてはならない。ハック禁止、小さくてクールなショートカットに見えたとしても、後に容赦ないバックスラッシュ[バックラッシュにかけた洒落?コメントアウトされるということだろうか]をもたらすだろう。正しさと冗長性を保とう。

可読性とドキュメント：コード品質は高く、（全ての！）APIドキュメントと瑣末でない点に関しての注意深いコメントを含む詳細なドキュメントが付随すべきだ。

パフォーマンス：出来るならやろう。

## ガイドライン(Guidlines)

### 腐った家は腐った土台の上に建てられる(A rotten house is built on a rotten foundation.)

自分を騙すのはやめよう。醜いコードに逆戻りなんて嫌だろう。最初から正しい方法でコードを書き、正しい方法で書き終えたときのみ次に移るように確認しよう。

### コメント(Comments)

全ての箇所にコメントを書くのをためらってはならない。


### 文書(Documentations)

すべての公開物はAPIドキュメントも含むべきだ。

### デバッグアサーション(Debug Assertions)

デバッグアサーションの乱用はバグを捕捉するのに素晴らしい方法だし、是非ともお勧めしたい。

### 静的チェック(Static checking)

Rustは素晴しく安全な抽象化機構を作るためにたくさんの型システムが用意されている。機会があればいつでもそれを使うべきだ。

非安全[な状態]は回避されるべきだ。もし幾つかの例外的な状況でそれが引き起こされるなら、アサーションを挿入せよ。カーネルも例外ではない。セキュリティ脆弱性よりカーネルパニックの方がマシだ。

もし到達し得ない状態がある（もしくはあるべきだ）が、[その状態が]不安定で、UB[Undefined Behavior (未定義動作)]につながるような場合、関数のスタートにアサーションを置け。

### 落ち着いて(Be gentle)

できるだけ早くたくさんコードを書こうとしてはならない。時間を取って注意深く。

### コミット(Commits)


わかりやすいコミットをしよう。わかりやすいコミットを自分に強いるひとつの方法として、 [git に]-m フラグを渡さないというものがある。そうするとエディタがポップアップするので、長いコミットメッセージを書くのに便利だろう。

# 所感

- カーネルコーディングならではのガイドラインだが、最初から良いコードを書こうと強く意識するのはどのレイヤーのコーディングでも重要だと思った

- アサーションをガンガン挿入するのは特にテストの書きようがないレガシーコードのリファクタリングに応用できる。

- まだ実用段階にないカーネルをリライティングするところに意識の高さが伺える（というか今しか出来ないのか）。

- 実際、システムコールのソースは素人目にも何をしているのか追えるくらいに平易。（ https://github.com/redox-os/kernel/blob/master/src/syscall/fs.rs ）

- 訳についてご教授下さった方に感謝します。
Raspbianのインストールと初期設定

# はじめに
初めての投稿です．Raspberry Pi 2にRaspbianをインストールして，初期設定をするまでの流れをまとめました．
似たような記事はかなり昔からたくさん存在していますが，最近Raspbianの再インストールをすることが多かったため自分用のメモとして記事を書いてみました．分かりにくい部分もあると思いますが，ご容赦ください．

# Raspbianのインストール
## Raspbianのダウンロード
今回はNOOBSを利用してRaspberry Pi 2にRaspbianをインストールします．
NOOBSは簡単にOSをインストールすることのできるインストーラです．

NOOBSは，Raspberry Piの公式サイトからダウンロードできます．
[Download NOONS for Raspberry Pi](https://www.raspberrypi.org/downloads/noobs/)

NOOBSとNOOBS Liteの2種類がありますが，NOOBSの方はオフラインインストールもオンラインのネットワーク経由のインストールもできて，Liteの方はネットワークインストールしかできないようです．
特に理由がなければ，NOOBSの方で良いと思います．

## Raspbianのインストール
ダウンロードしたNOOBSのzipファイルを解凍して，中のファイルを全部micro SDのルートディレクトリにコピーします．

最初にmicro SDをフォーマットしておくと良いです．
micro SDのフォーマットは，「[SDメモリカードフォーマッター](https://www.sdcard.org/jp/downloads/formatter_4/)」などのフリーソフトでできると思います．

次に，micro SDをRaspberry Piに挿入してRaspberry Piを起動します．
Raspberry Piには電源スイッチなどは存在しなく，電源を繋ぐと起動します．
Raspberry Pi起動前に，キーボード，マウス，HDMIのディスプレイやLANケーブルも接続してください．

Raspberry Piの電源を入れると，自動的にNOOBSのインストーラが起動するので，
　１．Raspbianにチェックを入れる．
　２．LanguageでJapanを選択する．
このように設定して，installボタンをクリックします．

少し待つと，Raspbianのインストールが完了します．
接続したディスプレイに「OS Installed Successfully」と表示されれば成功です．

また，OSの再インストールをしたい場合は，接続したキーボードのShiftキーを押しながらRaspberry Piを起動することでNOOBSのOSインストール画面を再度表示できるようです．

# Raspbianの初期設定
Raspbianで最初にやっておいた方が良い初期設定をいくつか紹介します．

## ユーザー名とパスワードの変更
Raspbianでは，最初はユーザー名がpi，パスワードがraspberryに設定されています．このままだと誰でもログインできてしまいそうなので，ユーザー名とパスワードを変更します．
piユーザーを削除してから新しく自分用のアカウントを作成する方法もありますが，piユーザーにデフォルトで設定されている権限などを引き継ぐために，今回はpiユーザーを削除せずにpiユーザーのユーザー名とパスワードを変更して自分用のアカウントにしたいと思います．

さて，現在はpiユーザーでログインしています．piユーザーとしてログインしたままpiユーザーのユーザー名を変更することはできないので，仮のアカウントtmpを作ってログインし，そちらからpiユーザーのアカウントを変更していきます．

```bash
$ sudo useradd -M tmp   　　　　　　  # 仮のアカウントtmpの作成
$ sudo gpasswd -a tmp sudo　　　　　　 # tmpユーザーをsudoグループに追加
$ sudo passwd tmp         　　　　　　 # tmpユーザーのパスワードを設定
$ exit                    　　　　　　 # ログアウト
```

次に，tmpユーザーでログインして，

```bash
$ sudo usermod -l pira pi            # ユーザー名をpiからpiraに変更
$ sudo usermod -d /home/pira -m pira # ホームディレクトリを変更 
$ sudo groupmod -n pira pi           # グループを変更
$ exit                               # ログアウト
```

（piraのところは任意のユーザー名に変更してください．）

最後に，

```bash
$ sudo userdel tmp                   # tmpユーザーの削除
```

これで，piユーザーのユーザー名を変更できました．

次にパスワードを変更します．

```bash
$ sudo passwd pira
```

ついでにrootのパスワードの初期のものから変更しておきましょう．

```bash
$ sudo passwd root
```

## フォルダ名の変更
Raspbianを日本語環境でインストールすると，ユーザーのフォルダ名が「ドキュメント」「ダウンロード」「写真」のように日本語表記になります．
Linuxターミナルの利便性を十分に発揮するために，これらを「Documents」「Downloads」「Pictures」のような英語表記に変更したいと思います．

```bash
$ sudo apt-get install xdg-user-dirs-gtk
$ LANG=C xdg-user-dirs-gtk-update
```

以下のコマンドで，無事にユーザーのフォルダ名が英語表記に変更できたことが確認できます．

```bash
$ ls $HOME
```

## ターミナル上での大文字小文字の無視
上のフォルダ名変更と同様に，Linuxターミナルを便利に使うためにターミナル上で大文字と小文字の違いを無視するように設定します．

```bash
$ vi ~/.inputrc
```

「.inputrc」に下記を追記します．

```.inputrc
set completion-ignore-case on
```

ターミナルに次のコマンドを入力して，onと表示されたらOKです．

```bash
$ bind -v | grep completion-ignore-case
```

## パッケージの更新
最後に，パッケージを最新のものに更新します．

```bash
$ sudo apt-get update
$ sudo apt-get upgrade
```

# 終わりに
閲覧ありがとうございました．無事にRaspberry PiにRaspbianをインストールして，初期設定をすることが出来ました．
Raspberry Piは色々な使い方ができて楽しいです．
【R】 頻出英単語のカウント

データソース
・期間
【Project livewire】2014/6/1~2017/09/24
https://response.jp/article/2015/03/07/246027.html

・言語
英語

・メディア
twitter
forum
youtube
blog

方針
1.とりあえずtwitterでデータ収集
2.Rで単語の頻度表を作成
Rpackageの
[languageR],[tm]
をインストール

http://langstat.hatenablog.com/entry/20161212/1481499779

library(tm)
corpus.cleaned<-removeNumbers(word.vector.lower)
corpus.cleaned<-removePunctuantion(corpus.cleaned)
not.blank<-which(corpus.cleaned != "")
corpus.cleaned<-corpus.cleaned[not.blank]
freq.list<-table(corpus.cleaned)
sorted.freq.list<-sort(freq.list,decreasing=TRUE)
sorted.table<-paste(names(sorted.freq.list),sorted.freq.listsep=": ")
head(sorted,table,200)

corpus.cleaned.2<-removeWords(corpus.cleaned,c("the","and"))
not.blank<-which(corpus.cleaned.2 != "")
freq.list.2<-table(corpus.cleaned.2)

http://langstat.hatenablog.com/entry/20170202/1485961200
Ruby の `?` がつくメソッドの返り値を逆にする

エイプリルフールの時にネタで考えたやつです。

```rb
klasses = ObjectSpace.each_object(Module).reject(&:singleton_class?).sort_by(&:to_s)

methods = {}

klasses.reject! do |k|
  methods[k] = k.instance_methods(false).select { |m| m.to_s.end_with?('?') } - [:respond_to?]
  methods[k].empty?
end

klasses.each do |k|
  k.class_eval(
    methods[k].map do |name|
      <<-EOF
      alias_method "_#{name}", :#{name}

      def #{name}(*args, &block)
        !_#{name}(*args, &block)
      end
      EOF
    end.join("\n")
  )
end

p (1..10).include?(3)     #=> false
p (1..10).include?(100)   #=> true
p [1, 2, 3].all?(&:odd?)  #=> true
p [1, 2, 3].any?(&:odd?)  #=> false
```

各 Class, Moduleから最後に `?` がつくメソッドを探し出して、返り値を反転させるようにメソッドを上書きしています。

`respond_to?` は書き換えると通常動作に大きく影響を与えてプログラムが落ちてしまったので除外しています。

## Gem にしてみました

`lier` という名前でリリースしました。Module を refinements 出来るようになったのが 2.4 からなのでバージョンが 2.4以上の ruby でしか動かない gem になっています。（:warning: 本番環境で動かさないでください）

https://github.com/siman-man/lier
Rails5でActionCableを使うときはSocketIOで接続できない!!

# Rails5でActionCableを使うときはSocketIOで接続できない!!
![download.jpg](https://qiita-image-store.s3.amazonaws.com/0/62822/87b5a2fc-1cc2-a8a3-ff9f-7a4b67489ba2.jpeg)


以前、ActionCableとswift3でwebSocketでチャットアプリを作ったのですが、そのときに

ActionCableが、**faye系**だったことを知らなかったのが１番ハマりました。
ちゃんと、fayeで接続するとうまくいきました。
SocketIO Clientで検証しても繋がらなかったです。

## WebSocketの種類
- Socket.IO
- Engine.IO
- Faye
- Primus
- WAMP

このへんの種類があるそうなのでご注意ください。
[Scala]case classのコンストラクタを隠蔽する


## この記事はなに？

case classを使いながらコンストラクタを隠蔽してファクトリー経由で生成するように強制したい。
ここでいう"コンストラクタ"は`new`で生成する通常コンストラクタに加えてcase classで自動生成される`apply`も対象としている。

## まとめ

- `sealed abstract case class`を使う
    - [こちらのコメント](https://qiita.com/petitviolet/items/b6af2877f64ebe8fe312#comment-08e2ffe396177bf5a252)をご参照下さい(@aoiroaoino さんありがとうございます)
- きっちり隠蔽したければcase classは諦めてclassを使う
    - 全部自前で実装するなら
- コードレビューで頑張れるならcase class使う
    - `copy`とかが欲しければこちら
- 色々と頑張れるならメタプロ

## case classについて

Scalaのcase classは非常に便利で、`apply`や`unapply`を自動で生やしてくれる。

```scala
case class User (id: Int, name: String)
```

case classについては普通にコンストラクタ経由でも`apply`経由でも生成できる。

```scala
val alice = new User(1, "alice")
val bob = User.apply(2, "bob")
```

ちなみに`scala -Xprint:typer`で生成される`apply`メソッドを見てみると以下のようになっている。  
単にnewしてるだけ。

```scala
case <synthetic> def apply(id: Int, name: String): User = new User(id, name);
```

## コンストラクタを隠す

### コンストラクタをprivateにする

classはコンストラクタの前に`private`をつけるとコンストラクタを隠蔽できる。

```scala
case class User private (id: Int, name: String)
```

こうするとコンストラクタは隠せるのでnew出来ない。

```scala
val alice = new User(1, "alice")
```

エラーメッセージはこんな感じ。
> scala> new User(1, "alice")
<console>:14: error: constructor User in class User cannot be accessed in object $iw  
       new User(1, "alice")


が、`User.apply`は生成されているので自由に生成できてしまう。

```scala
val bob = User.apply(2, "bob")
```

### applyをoverrideしてprivateにする

コンストラクタをprivateにするのとあわせて、case classで自動生成される`apply`を明示的にprivateとして実装してみる。

```scala
case class User private (id: Int, name: String)
object User { private def apply(id: Int, name: String) = ??? }
```

こうすると

```scala
val alice = new User(1, "alice")
val bob = User.apply(2, "bob")
```

どちらもコンパイルエラーとなってめでたし。
...とはならず、`User`クラスにフィールドが増えた場合などに`apply`のシグネチャを変更し忘れるとすり抜けてしまう。

```scala
// ageが増えた
case class User private (id: Int, name: String, age: Int)
// ↓は先ほどと同じ
object User { private def apply(id: Int, name: String) = ??? }
```

こうなると、以下のようになる

```scala
// これはコンパイルエラー
// val alice = new User(1, "alice")
// こちらは動く
val bob = User.apply(2, "bob", 20)
```

コードレビューで人間が目で見て頑張って防ぐこととなる。

### じゃあどうする？

case classを諦めてclassを使う。

```scala
class User private (id: Int, name: String)
```

とするだけでコンストラクタは適切に隠蔽できる。  
case classの`unapply`とか`copy`とか、そのあたりの便利さとクラス定義としての厳密さのどちらを取るかはチーム次第、というありきたりな結論。

### (番外編)applyを自動でprivateにする

人間が頑張るんじゃなくて自動でやりたい。
そうなるとメタプログラミングの出番。

自動で`apply`を生成して`private`にしてくれるやつを作ってみた。  
[scala-acase/NoApply.scala](https://github.com/petitviolet/scala-acase/blob/0588564b1c84864a95bf8c374b270c9cc259fdfa/acase/src/main/scala/net/petitviolet/meta/acase/NoApply.scala)

`@NoApply`アノテーションを付与する。

```scala
@NoApply case class User private (id: Int, name: String)
```

そうすると

```scala
// どちらもコンパイルエラーになる
// new User(1, "alice")
// User.apply(2, "bob")
```

のどちらもコンパイルが通らなくなる。
なので、意図通りにファクトリー経由での生成を強制できる。

```scala
@NoApply case class User private (id: Int, name: String)

object User {
  def create(name: String) = apply(Random.nextInt(100), name)
}

User.create("alice") // User(xxx, "alice")
```

ここまでやるかどうかも、チーム次第。
ansible-containerでdocker for mac上のdockerにコンテナを作成する

ansibleでdockerコンテナを作成する場合、docker_serviceを使う方法などいくつか方法がありますが、そのひとつにansible-containerを使ってdockerコンテナを作成する方法があったので試しました。

# 環境
+ docker for mac
+ ansible-container 0.9.2(0.9.1はうまくいかないので注意)

# ansible-containerのインストール

```
$ pip install ansible-container[docker]
```

# ソースコード

作成するのは以下のファイルです。

+ container.yml

```yaml:container.yml
version: "2"
settings:
  conductor_base: centos:7

services:
  db:
    from: "mysql:latest"
    ports:
      - "13306:3306"
    environment:
      MYSQL_MAJOR: 5.7
      MYSQL_VERSION: 5.7.17
      MYSQL_DATABASE: sample
      MYSQL_USER: sample
      MYSQL_PASSWORD: password
      MYSQL_ROOT_PASSWORD: password
registries: {}
```

# 実行

```
$ ansible-container build
$ ansible-container run
```

# 確認

`$ docker images`

	REPOSITORY                             TAG                 IMAGE ID            CREATED             SIZE
	ansible-container-mac-conductor        latest              857cec771999        6 minutes ago       445MB
	mysql                                  latest              b4e78b89b999        6 days ago          412MB
	ansible/container-conductor-centos-7   0.9.2               3d2f4f23d999        9 days ago          445MB

---

`$ docker ps`

	CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                     NAMES
	b22d184d3999        mysql:latest        "docker-entrypoint..."   4 minutes ago       Up 4 minutes        0.0.0.0:13306->3306/tcp   ansiblecontainermac_db_1

---

これでdocker上にコンテナが立ち上がっていることを確認できました。

[github サンプル](https://github.com/va034600/sample-server/tree/master/ansible/ansible-container-mac)
macOS High SierraのインストールUSBの作成

# はじめに
macOS High SierraのUSBメモリを使ったインストールメディアを作成する。

# 必要なもの
+ macOS High Sierra
+ 16GB以上のUSBメモリ(できるだけ高速なもの)  //8GBは未検証


# 手順
### 1.『macOS High Sierra』をApp Storeからダウンロードする。（完了すると、/Applicationsフォルダに保存される。）

![スクリーンショット 2017-09-26 8.17.52.png](https://qiita-image-store.s3.amazonaws.com/0/54439/4afddf37-d078-f189-8d28-13831b4509ab.png)



### 2. 『ディスクユーティリティ.app』でUSBメモリの名前を『Untitled』にして、USBメモリを消去する。

![スクリーンショット 2017-09-26 8.16.46.png](https://qiita-image-store.s3.amazonaws.com/0/54439/dc290b08-c8a6-ee5d-775d-a57a66d2a989.png)


### 3. USBメモリのマウントを確認する。
次のコマンドを実行して先ほど作成したUSBメモリをマウントしていることを確認する。

```
$ ls /Volumes/
```

![スクリーンショット 2017-09-26 8.22.34.png](https://qiita-image-store.s3.amazonaws.com/0/54439/ff5438a6-945b-a983-a903-ba091ba21e11.png)



### 4. インストールUSBメディアを作成する。
次のコマンドを実行してインストールUSBメディアを作成する。

```
$ sudo /Applications/Install\ macOS\ High\ Sierra.app/Contents/Resources/createinstallmedia --volume /Volumes/Untitled --applicationpath "/Applications/Install macOS High Sierra.app"
```

(--applicationpathは指定しなくともできるようです）

![スクリーンショット 2017-09-26 8.30.13.png](https://qiita-image-store.s3.amazonaws.com/0/54439/9b44ba26-518c-9d63-a884-369b4d53c160.png)


# 関連
Appleオフィシャル https://support.apple.com/en-us/HT201372
イチローは日本プロ野球で生涯打率１位の選手よりもすごいのかベイズ統計で検証する

# イチローは日本プロ野球で生涯打率１位の選手よりもすごいのかベイズ統計で検証する

<img width="892" alt="ichiro-leron.png" src="https://qiita-image-store.s3.amazonaws.com/0/87725/f9cb2ce8-f10d-77b5-4993-77fdfe394b45.png">


[Photo](https://commons.wikimedia.org/wiki/File:Ichirostl2017.jpg) by Johnmaxmena2 [CC BY](https://creativecommons.org/licenses/by-sa/4.0/deed.en) / 出典 [www.jiji.com](http://www.jiji.com/news/handmade/topic/d4_bb/usa197-img255.jpg)
 
  
日本プロ野球の選手で生涯打率で一番は誰でしょうか？私は単純にアメリカのメジャーでも活躍されているイチロー選手だと思ったのですが、実は公式の日本プロ野球の生涯打率ランキングトップはロッテで活躍した[L リー選手](https://ja.wikipedia.org/wiki/レロン・リー)で、イチロー選手の名前は載っていません。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/87725/7e5db966-6d59-fd2b-e7e1-6fd80c81ad04.png)

というのも、キャリアの途中でメジャーに移籍したイチロー選手は、前述のランキングに公認されるための規定である、日本プロ野球での生涯打数4000には届いていないためです。[こちら](http://www2u.biglobe.ne.jp/~akichan/rank3.htm)に2000打数以上の選手の打率ランキングのデータがあるのですが、これを以下のように可視化するとイチロー選手を含む何人かの、日本での生涯打数が4000に届かない選手が先ほどトップであった、L リー選手よりも非公式ながら打率が高いのがわかります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/87725/09e5e986-5df2-3d87-4b65-08163548571d.png)

オレンジの選手は4000打数に届いていない選手です。

打数がある程度以上大きくないと運に左右されて真の実力が見えてこないから、ランキングには打数の規定がある、というのはリーズナブルな考えだと思いますが、打数は少し少なくても打率のより高いイチロー選手と、打数がある上で打率の高いL リー選手、真の実力を比べた場合どちらがより良かったといえるのでしょうか？実はこういう質問に、ベイズ統計を使ったA/Bテストの手法を応用して答えることができます。

ベイズ統計では、例えば「プロ野球選手の打率だったら普通はこんなものだろう」という事前知識から分かる確率分布をスタート地点として、そこに実際に得られたデータを追加していくことで、この確率分布を修正していく、というアプローチをとります。データを入れる前の確率分布をPrior、データによって修正されたバージョンの確率分布をPosteriorと呼びます。
ExploratoryのA/Bテストアナリティクスビューをつかって、イチロー選手とリー選手の実例で、これを見ていきましょう。

まず、野球選手の打率というものは、2割から3割5分の間に分布し、平均すると2割7分ほどであるという事前知識から、Priorの分布を以下のように設定します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/87725/47ea860a-63f7-e020-239d-6afc1033ae8e.png)

そこにイチロー選手とリー選手の打数と打率のデータを入れると、Posteriorとして、二人の真の実力（真の打率）の確率分布を見ることが出来ます。Aがイチロー選手、Bがリー選手です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/87725/de1b3d66-e1a9-78e3-009a-40cc9027aadb.png)

どちらが優れているかを確率分布で表すとこのようになります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/87725/6acd0260-a75b-4314-2bda-c76492393251.png)



数値で言うと、99.84%の確率で、イチロー選手の方が高い真の打率を持っているであろうと言えることになります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/87725/09b6d1af-0ce5-59c1-1283-d5da139e7380.png)

さすがにイチロー選手ほど打ちまくれば、記録のルール上は打数が規定に達していなくても、ベイズ統計的にはすでに打率の実力が一番であることは証明されている、という結果になりました。

ベイズ統計を使ったA/Bテストに興味のある方は、[こちら](https://www.youtube.com/watch?v=zILHctOFqxM)に弊社CEO西田によるHow-toを含めた紹介ビデオがあるのでよかったら見てみてください。


-----


## データ分析をさらに学んでみたいという方へ

今年10月に、Exploratory社がシリコンバレーで行っている研修プログラムを日本向けにした、[データサイエンス・ブートキャンプ](https://exploratory.io/training-jp?utm_campaign=md_batting&utm_medium=md&utm_source=md)の第3回目が東京で行われます。上記のようなデータサイエンスの手法を、プログラミングなしで学んでみたい方、そういった手法を日々のビジネスに活かしてみたい方はぜひこの機会に、参加を検討してみてはいかがでしょうか。[こちら](https://exploratory.io/training-jp?utm_campaign=md_batting&utm_medium=md&utm_source=md)に詳しい情報がありますのでぜひご覧ください。
jQuery UIを公式リファレンスを見ながらいじってみた

liタグを並び替える処理を実装する時に初めてjQueryUiを使ったので、実装の仕方と気になったところをまとめました。

##公式リファレンスの見方

https://jqueryui.com/

左サイドバーに各機能名が書いてあり、リンク先にデモページがあります。
デモの少し下にある`view source`を押すとソースが見れます。

基本的にはこのソースをhtmlに貼り付ければそのまま動くと思います。

また、`API documentation`を押すと各機能ごとのオプションやメソッド一覧ページに飛ぶので、そこを見ながらいじっていきます。

##sortableの使い方

デモページ : https://jqueryui.com/sortable/
から`view source`を貼り付けたら動きました。
ただ、分かりやすいように一時的に必要最小限にしてみました。

```sort.html
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<ul id="sortable">
  <li>gori</li>
  <li>bosu</li>
  <li>megane</li>
</ul>
<script>
$(function(){
  $("#sortable").sortable();
});
</script>
```

上の二行でjqueryとjquery-uiを読み込んで、 あとはulの中のliをソートできるという処理です。
かなりコンパクトになりました。

##オプションを色々試してみる

APIドキュメント : http://api.jqueryui.com/sortable/
を参考に設定してみます。

###items(Options)

オプションです。要素内のどの項目をソート可能にするかを指定できます。

```diff:sort.html
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<ul id="sortable">
- <li>gori</li>
- <li>bosu</li>
+ <li class="item">gori</li>
+ <li class="item">bosu</li>
  <li>megane</li>
</ul>
<script>
$(function(){
  $("#sortable").sortable({
+   items: ".item"
  });
});
</script>
```

これでitemクラスを振ったliだけソート可能になりました。


###axis(Options)

オプションです。xかyを設定してドラッグ可能な方向を指定できます。

```diff:sort.html
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<ul id="sortable">
  <li class="item">gori</li>
  <li class="item">bosu</li>
  <li>megane</li>
</ul>
<script>
$(function(){
  $("#sortable").sortable({
    items: ".item",
+   axis: "y"
  });
});
</script>
```

これで縦のみの動きになりました。横に動かそうと思っても全く動きません。


###destroy(Methods)

メソッドです。ソート可能な機能を完全に削除します。

```diff:sort.html
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<ul id="sortable">
  <li class="item">gori</li>
  <li class="item">bosu</li>
  <li>megane</li>
</ul>
<script>
$(function(){
  $("#sortable").sortable({
    items: ".item",
    axis: "y"
  });
+ $("#sortable").sortable("destroy");
});
</script>
```

これで全くソートできなくなりました。 ある条件でソートさせないようにする時に使えそうです。


###change(Events)

イベントです。ソートしてDOMの位置が変更された場合に実行されます。

```diff:sort.html
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<ul id="sortable">
  <li class="item">gori</li>
  <li class="item">bosu</li>
  <li>megane</li>
</ul>
<script>
$(function(){
  $("#sortable").sortable({
    items: ".item",
    axis: "y",
+   change: function(event, ui){
+     console.log("sort!!");
+   }
  });
- $("#sortable").sortable("destroy");
});
</script>
```

これでソートしてliの位置が入れ替わった瞬間にconsole.logが出力されました。
簡単にイベントの設定も行えるので、かなり便利ですね。

引数として渡しているeventとuiは渡さなくても動きます。
ただ、DOMの位置情報など様々なデータが入っているので、色々使えそうです。


##まとめ

jQuery UIの中の1機能だけ使いましたが、これだけでもかなりの量のオプションやメソッド、イベントがあります。
使いたい機能をリファレンスでさくっと調べて使いこなせるようになれば、色々捗ると思いました。
oracle アラートログのパス

いつもアラートログのパスを忘れてしまうのでメモ。

# 環境
* Red Hat Enterprise Linux Server release 6.6
* oracle12cR2

# アラートログディレクトリ
*  /u01/app/oracle/diag/rdbms/[sid_連番]/[sid]/trace/

※[sid_連番]→ex)sid_01

# アラートログファイル名
* alert_[sid].log
「FizzBuzzクイズ」をRで書くと

話題の「[FizzBuzzクイズ](https://qiita.com/sumim/items/f26902f2b813c075a619)」というものに挑戦した。
皆さんRubyで書かれているが、自分の大好きなR言語で書いた。
趣旨がずれている気がしないでもない。

```r
library(magrittr)

FizzBuzz <- function() {
  n <- NULL
  
  func_maker <- function(m, word) {
    function(x) {
      if (is.numeric(x)) {
        n <<- x
        if (n %% m == 0) return(word)
        return(n)
      }
      if (n %% m == 0) return(paste(x, word, sep=""))
      return(x)
    }
  }
  
  fizz <- func_maker(3, "Fizz")
  buzz <- func_maker(5, "Buzz")
  pezz <- func_maker(7, "Pezz")
  
  environment()
}
FB <- FizzBuzz()
attach(FB)
```

## 動作確認

```r
1 %>% fizz %>% buzz  ## [1] 1
3 %>% fizz %>% buzz  ## [1] "Fizz"
5 %>% fizz %>% buzz  ## [1] "Buzz"
15 %>% fizz %>% buzz ## [1] "FizzBuzz"
15 %>% buzz %>% fizz ## [1] "BuzzFizz"
 
7 %>% fizz %>% buzz %>% pezz   ## [1] "Pezz"
21 %>% fizz %>% buzz %>% pezz  ## [1] "FizzPezz"
35 %>% fizz %>% buzz %>% pezz  ## [1] "BuzzPezz"
105 %>% fizz %>% buzz %>% pezz ## [1] "FizzBuzzPezz"
105 %>% fizz %>% pezz %>% buzz ## [1] "FizzPezzBuzz"
105 %>% pezz %>% buzz %>% fizz ## [1] "PezzBuzzFizz"

1 %>% fizz %>% buzz %>% pezz   ## [1] 1
3 %>% fizz %>% buzz %>% pezz   ## [1] "Fizz"
5 %>% fizz %>% buzz %>% pezz   ## [1] "Buzz"
15 %>% fizz %>% buzz %>% pezz  ## [1] "FizzBuzz"
15 %>% buzz %>% fizz %>% pezz  ## [1] "BuzzFizz"
104 %>% fizz %>% buzz %>% pezz ## [1] 104
```

## 要件確認

* ここで求めているのはメソッドの返値（文字列もしくは数値そのまま）であり、標準出力等への出力ではない。 ==> ok.
* グローバル変数は使わないことが望ましい。 ==> 環境内に共有の変数を置く方式・・・ギリギリアウト？
* 余力があれば、7の倍数を与えると"Pezz"を返し、かつfizzやbuzzと同様に振る舞うpezzメソッドの追加拡張を実際に試し、それが最小限のコード変更で可能であるように設計や枠組みの工夫があればなお良い。 ==> 一応、１行で追加可能


## 感想

* 結局、引数の型で場合分けする方法しか思いつかなかった。
* 拡張しやすいように（Pezzの追加）、関数生成器を定義した。これはR言語では常套手段だと思う。
RaspberryPi Raspbian ヘッドレスインストール（Stretch編）

#はじめに
- 備忘的な記事です。
- ラスパイになるべく接続しないでセットアップしたい。（電源のみ）

ここは ちょっと古い Stretch編 です。Buster編は以下を参照。

https://qiita.com/nori-dev-akg/items/38c2dfb108edb0d73908

#ハードウェア
- RaspberryPi3：初めてのラズパイです。ホントは「Zero W」が欲しいですがまだ品薄で高いので
- microSD card：16GB class10【Amazon.co.jp限定】（PCから書き込みます）
- microUSB cable：電源用
- 無線LAN環境：家庭内LAN
- PC：Windows7 ～

#ソフトウェア
- Raspbian：RASPBIAN STRETCH WITH DESKTOP(Release date:2017-09-07)
- Win32DiskImager：OSイメージ書き込みツール

#OSイメージの書き込み
1. まず Raspbianを[本家](https://www.raspberrypi.org/downloads/raspbian/)からダウンロード。30分弱掛かりました。気長に待ちます。
2. ダウンロードしたファイルを解凍：イメージファイル(2017-09-07-raspbian-stretch.img)。
3. Win32DiskImagerを使ってイメージファイルをmicroSDに書き込み。（Win32DiskImagerの取得と使い方はGoogle先生で）

# SSH
Raspbian のデフォルトはSSHが無効なのだが、イメージのルートに"ssh"というファイルを置けば有効になるのでOSイメージの書き込みが完了したら、エクスプローラでイメージのルートで右クリック「新規作成」－「テキスト文書」－ファイル名を「ssh」(拡張子なし)。中身は空でよい。

# 無線LAN接続
無線LAN設定も有線接続無しでできる仕組みがRaspbianには予め用意されている。これもイメージのルートに"wpa_supplicant.conf"という設定ファイルを置いておけばやってくれる。ただDHCPのみしか見つからない。固定IPもやってくれる方法があればいいんだけど。

```wpa_supplicant.conf
country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
    ssid="SSID名"
    psk="暗号化キー"
}
```

# RaspberryPi 起動
microSD を RaspberryPi に挿して、 電源用microUSBを繋いで起動！
RaspberryPi の赤LEDが点灯、緑LEDがチカチカしたら多分OK！

# RaspberryPi 探し
1. macOSの方は、 「ssh pi@raspberrypi.local」で raspberry で OK。# いいな～mac。
2. Windows に iTunes が入ってる。TeraTermPro で raspberrypi.local, SSH2, pi/raspberry で OK。
3. [NetEnum](http://www.e-realize.com/netenum.html)を使う。MACアドレスとベンダー名をONで。
4. ルータのモニタ機能。各ルータの設定などに払い出し中のIPアドレスをモニタする機能。（私はこれで）
5. コマンドプロンプトで 「arp -a」（知らなかった・・・）

DHCPの自動IP割当なのでIPアドレスが分からない。上記のいずれかでIPアドレス取得もしくはssh接続できれば完了です。
MACアドレスは、B8-27 からがラズパイ。RaspberryPiの初期ユーザー/パスワードは pi/raspberry。

# 初期設定
ここまでくれば後は、TeraTermPro で初期設定。初期設定はお好みがあるので他のサイトにいっぱいあります。

# おわりに
さて何をするかな。
Python2.7学習メモ

[みんなのAI講座 ゼロからPythonで学ぶ人工知能と機械学習](https://www.udemy.com/learning-ai/)で機械学習の勉強を始めました。普段はC#を使っているので、pythonはさっぱりわかりません。ということで、学習したことを整理する意味も込めて記事を書いていきます。

**タイトルにも書いてあるように、python3ではなくpython2を使っていきます。**
2020年でサポートが終わるかも？大丈夫だ問題ない(｀・ω・´)

コードは以下のフォーマットで書きます。

```
ここにコードを書く
（空行）
=====出力結果=====
ここに出力結果を書く
```



# 標準出力
- 毎度恒例のハローワールドさんを表示したい！

```
print "Hello World"

=====出力結果=====
Hello World
```
シンプルでいいですね。セミコロンは要らない(*'▽')


- 日本語を表示したい場合は...  

```
# coding: utf-8
print "こんにちは"

=====出力結果=====
こんにちは
```
`# coding: utf-8`を書かないといけません。これを書かないと、コメント文（後述）で日本語を使った場合でもエラーになります。書いておくと安心なので、毎回書いておきます。



# 変数（数値）の宣言と代入


- 変数を宣言して、数値を代入しよう

```
# coding: utf-8
a = 2
print a

=====出力結果=====
2
```
`a = 2`だけで、変数の宣言も、値の代入も済んでしまいます。


- 変数に数値を足そう

```
# coding: utf-8
a = 2
b = a + 3
print b

=====出力結果=====
5
```
変数bに、変数aの値と数値3を足したものを代入して、出力しています。


- 二項演算子も使えるよ

```
# coding: utf-8
a = 2
a += 3
print a

=====出力結果=====
5
```
`a = a + 3`と書かなくても、`a += 3`というお馴染みの表記が使えます。


- 変数（数値）どうしを足そう

```
# coding: utf-8
a = 2
b = 5
c = a + b
print c

=====出力結果=====
7
```
変数cに、変数aの値と変数bの値を足したものを代入して、出力しています。



# 変数（文字列）の宣言と代入


- 変数を宣言して、文字列を代入しよう
 
```
# coding: utf-8
s = "abc"
print s

=====出力結果=====
abc
```
数値のときと同じですね。文字列は`" "`で囲みましょう。


- 変数に文字列を連結しよう

```
# coding: utf-8
s = "abc"
t = s + "de"
print t

=====出力結果=====
abcde
```
連結は`+`を使います。


- 文字列でも二項演算子が使えるよ（+=だけ）

```
# coding: utf-8
s = "abc"
s += "de"
print s

=====出力結果=====
abcde
```


- 変数（文字列）どうしを連結しよう

```
# coding: utf-8
s = "abc"
t = "de"
u = s + t
print u

=====出力結果=====
abcde
```

# 続きはまた今度
次は、四則演算、乱数、文字列操作あたりを書きたいです（願望）
SlackのIncoming Webhooksを使って外部から通知するためのシェルスクリプトのサンプル

Incoming Webhooks　の Slack アプリケーションを使って Slack に通知を送るためのサンプルシェルスクリプト。

## Require

- [Incoming Webhooks | Slack](https://api.slack.com/incoming-webhooks)
- bash

## Sample Code

```shell:slack-notify.sh
#!/bin/bash

URL="https://hooks.slack.com/services/*********/*********/************************"

CHANNEL='#test_channel'
USERNAME='test-bot'
ICON=':sushi:'
MESSAGE='```'$@'```'

PAYLOAD="payload={
    \"channel\": \"${CHANNEL}\",
    \"username\": \"${USERNAME}\",
    \"icon_emoji\": \"${ICON}\",
    \"text\": \"${HEAD}${MESSAGE}\"
}"

curl -s -S -X POST --data-urlencode "${PAYLOAD}" ${URL} > /dev/null
```

Incoming Webhooks の設定で、投稿する対象のチャンネルを設定し、Slack APIを利用するための URL の取得します。シェルスクリプトでその URL とチャンネルをセットします。
合わせて、投稿するユーザ名とアイコン、このシェルスクリプトの引数をメッセージとして変数に格納するようにしています。

## Usage

```
$ ./slack-notify.sh test
```

引数の内容を、指定したチャンネルへ、指定したユーザ名とアイコンで、投稿します。
react-navigationとreact-native-orientationを組み合わせて特定のページの画面向きを固定する

## 実現したいこと

- react-navigationを使ったアプリで特定のページのみ画面を横向き固定にしたい
- 戻るボタンで戻ってきたような場面でもちゃんと指定した通りに固定させたい

## 実現方法

- 画面の向き固定にはreact-native-orientationを使う
  - https://github.com/yamill/react-native-orientation

### react-native-orientationのメソッド

- lockToPortrait()
  - 縦向きにロックする
- lockToLandscape()
  - 横向きにロックする
- lockToLandscapeLeft()
  - 左辺が下に来るように横向きにロックする
- lockToLandscapeRight()
  - 右辺が下に来るように横向きにロックする
- unlockAllOrientations()
  - ロックを解除する

### react-navigationとの連携

- 遷移の度に呼ばれるonNavigationStateChangeを活用してページ遷移ごとに処理をはさむ
- 横向き固定にしたい画面のリストを持っておき、リストに含まれる画面に遷移した場合画面をロックする

### サンプル

- A->B->Cの順に遷移する3つのページがある
- AとCは縦固定、Bは横固定にするサンプル

```js:index.ios.js/index.android.js
import React from 'react';
import { AppRegistry } from 'react-native';
import AppNavigator from './app/navigators/AppNavigator';
import { onNavigationStateChange } from './app/utils/Utils';

// onNavigationStateChange属性に渡した関数はページ遷移が行われるたび(=stateが更新される度)に呼ばれます
const ReactNativeSample = () => <AppNavigator onNavigationStateChange={onNavigationStateChange} />

AppRegistry.registerComponent('ReactNativeSample', () => ReactNativeSample);
```

```js:app/navigators/AppNavigator.js
import { StackNavigator } from 'react-navigation'
import SampleAScreen from '../containers/SampleAScreen'
import SampleBScreen from '../containers/SampleBScreen'
import SampleCScreen from '../containers/SampleCScreen'

const AppNavigator = StackNavigator({
  SampleA: { screen: SampleAScreen },
  SampleB: { screen: SampleBScreen },
  SampleC: { screen: SampleCScreen },
})

// 横向き固定したい画面リスト
export const landscapeOrientationScreens = ['SampleB']
export default AppNavigator
```

```js:app/utils/Utils.js
import Orientation from 'react-native-orientation';
import { landscapeOrientationScreens } from '../navigators/AppNavigator';

const handleOrientation = (currentRouteName) => {
  // 受け取った引数が横向き固定したいリストに含まれていたら横向きにロック、そうでなかったら縦向きにロック
  landscapeOrientationScreens.includes(currentRouteName) ?
    Orientation.lockToLandscapeLeft() :
    Orientation. lockToPortrait();
}

// ページ遷移する度に呼ばれる
export const onNavigationStateChange = (prevState, currentState) => {
  const routes = currentState.routes;
  const currentRouteName = routes[routes.length - 1].routeName;
  // 遷移後の画面名を引数に渡す
  handleOrientation(currentRouteName);
}
```

- こんな感じで画面Bだけ横向き固定されている

![orientation.gif](https://qiita-image-store.s3.amazonaws.com/0/175213/2b71be99-72a0-d1c2-34c8-6498f0682fc9.gif)

---

## 追記

- このサンプルだと最初のページで画面固定がきいていなかった
- index.android.js, index.ios.jsのcomponentWillMountにOrientation. lockToPortrait()を書いておけば対応できる
ちょっとずつ読むドメイン駆動設計 第ニ部 モデル駆動設計の構成要素 第四章 ドメインを隔離する7

[レイヤアーキテクチャ・DI](https://qiita.com/YasuhiroKimesawa/items/367d0ab40433cfe2d57a)
[ヘキサゴナルアーキテクチャ](https://qiita.com/YasuhiroKimesawa/items/46e547aadaa8402f724e)
[オニオンアーキテクチャ](https://qiita.com/YasuhiroKimesawa/items/7218a59505d3a12a7411)
と見てきました。
さらに他の選択肢について

# 他の選択肢 [クリーンアーキテクチャ](https://8thlight.com/blog/uncle-bob/2012/08/13/the-clean-architecture.html)

![クリーン (1).png](https://qiita-image-store.s3.amazonaws.com/0/150455/66f9b585-2401-cde6-6dc2-25b1f2571875.png)

Robert Martinが2012年に提唱したアーキテクチャ。


[日本語訳](http://blog.tai2.net/the_clean_architecture.html)されている方がいらっしゃいました。ありがたい。

そちらを読んでもらうと分かる通り、前回までのヘキサゴナルアーキテクチャやオニオンアーキテクチャなどを参考に作られたものとのことです。

　やはり、

- 外側が内側に依存します。
- DIが必要です。
- 層は必ずしも４層である必要はありません。

難しくないのと、技術的な複雑さにも対応できるバランスの取れたアーキテクチャだと思います。

やはりここでも大事なのは、**ドメインを隔離すること**ですね。

## 実際のところ
このように、ドメインを隔離するアーキテクチャを見てきましたが、実際に適用するのは大変な場合があります。
例えば、Railsを使えば、モデルはActiveRecordですのでRDBのDBに影響されます。Railsでなくても、例えば、Javaの便利なORMであるDoda2もモデル側にDoda2のアノテーションが割り込みます。

> 外側の円で使われているデータフォーマットを内側の円で使うべきではない。とくに、それらのフォーマットが、外側の円でフレームワークによって生成されているのであれば。外側の円のどんなものも、内側の円に影響を与えるべきではないのだ。(クリーンアーキテクチャ 日本語訳より)

これを守るために冗長にDTOを使って、オブジェクトtoオブジェクトの変換が必要になったりすることもあるかもしれません。

そういう意味でも、アーキテクチャの選択とともに、[先日の記事](https://qiita.com/YasuhiroKimesawa/items/e0cb333a652063c167e3)の通り、どうフレームワークを選択するかも大事になると思います。
主要なライセンスの簡易まとめ

|                   |GPL v2.0     |GPL v3.0     |LGPL v2.1    |LGPL v3.0    |BSD 3-Clause |BSD 2-Clause |MIT          |Apache v2.0  |
|:------------------|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|:-----------:|
| **著作権表示**    |必須         |必須         |必須         |必須         |必須         |必須         |必須         |必須         |
| **コピーレフト**  |○           |○           |×           |×           |×           |×           |×           |×           |
| **保証**          |無保証       |無保証       |無保証       |無保証       |無保証       |無保証         |無保証       |無保証       |
| **複製**          |許可         |許可         |許可         |許可         |許可         |許可         |許可         |許可         |
| **改変**          |許可         |許可         |許可         |許可         |許可         |許可         |許可         |許可         |
| **頒布**          |許可         |許可         |許可         |許可         |許可         |許可         |許可         |許可         |
| **ソース公開**    |必須(※1)    |必須(※1)    |必須(※2)    |必須(※2)    |必要なし     |必要なし     |必要なし     |必要なし     |
| **個人利用**      |許可         |許可         |許可         |許可         |許可         |許可         |許可         |許可         |
| **商用利用**      |許可         |許可         |許可         |許可         |許可         |許可         |許可         |許可         |
| **特許利用**      |許可         |許可         |-            |許可         |-            |-            |-            |許可         |
※1 動的リンクの場合は公開義務はないという見解もある
※2 動的リンクの場合は公開義務はない

各種サイトやWikipediaなどを流し読み
原文(翻訳含む)は読んでいないので間違っている可能性あり。