OmniAICreator/Qiita-1.07M huggingface dataset:
scikit-learnではじめる物件探し〜その2

[TensorFlowではじめる物件探し〜その1](https://qiita.com/kazuhirokomoda/items/5cc75bd15bac0be2009a)
の続きです。

# おことわり
- （続きと言っておきながら）今回はTensorFlowを使っていません。scikit-learnとpandasがメインです。
- 前回と同じ物件データに対して、今回は、物件の特徴量から価格('price')を予測する回帰問題としていくつかの手法を適用しています。

# 分析の結果
詳細な手順は、[Jupyter Notebook](https://gist.github.com/kazuhirokomoda/aa161aa9eb1858f60a16ec2e02040ee1)で公開しています。文献やWebページを参考にしながら、分析を試みましたので、よければご覧ください。
結論めいたものを、こちらにも書いてみます。

## 価格予測に役立つ特徴量
- 他の特徴量に比べて以下の特徴量が'price'の予測により役立っている
 - 'years' (築年数)
 - 'walk_minutes' (最寄り駅からの徒歩分数) 
 - '2LDK'

確かに「築年数」「最寄り駅からの徒歩分数」は物件の価格に影響しそうな印象があります。当たり前といえば当たり前な気もしますが、データから結論が出せたという意味ではよかったです。

## 回帰の手法について
- 今回のデータセットに対してうまくいった回帰手法
 - (テストデータ) ランダムフォレスト、K最近傍、決定木
 - (訓練データ) 決定木、ランダムフォレスト、K最近傍

ランダムフォレストの実行結果を抜粋してみます。scoreを見てもそれなりによく予測できているように見えます。
（訓練データ、テストデータともにlog変換を施しているため、'prices'の数字はかなり小さくなっています）

<img width="672" alt="rfreg.png" src="https://qiita-image-store.s3.amazonaws.com/0/32910/cd653be2-105f-f42f-61f8-294b32a5ace1.png">

## 実際に物件の価格を予測すると
いい線行っている物件もあればそうでないものもあり・・・

<img width="655" alt="rfreg_pred10.png" src="https://qiita-image-store.s3.amazonaws.com/0/32910/035c4050-b115-5d2f-8c2a-9bcbea126211.png">


# 次回は
「データの中身を見たりしながら」と前回書きましたが達成できませんでした。
実際にはその過程がかなり大事で、上の[「実際に物件の価格を予測すると」](#実際に物件の価格を予測すると)でも1件ずつ中身を見た方がいいに決まっているのですが、データ取得時からかなり時間が経っていることもあって、今回は実現できず。。。

後で見返しやすい形でデータのETLをしないといけないですね。
C#のforeachの仕組み(6) decompileにおけるforとの比較 int[]編

[C#のforeachの仕組み(5) ILにおけるforとの比較 int[]編]
(https://qiita.com/y_ohr/items/cdc3bed3e21e2849a530#_reference-002d36980e0f6c3b7fed) の続きです。

# 概要

[前回](https://qiita.com/y_ohr/items/cdc3bed3e21e2849a530#_reference-002d36980e0f6c3b7fed) 、int[]のforeachをilでみたところ、
foreachしていませんでした。
ILSpyでDecompile結果を比較してみます。

※ILSpyの参考URL http://www.atmarkit.co.jp/fdotnet/dotnettips/1055ilspy/ilspy.html

# コードとDecompile結果

forのコード。

```csharp:Implement_array_for
using System;

namespace ConsoleAppArrayFor
{
    class Program
    {
        static void Main()
        {
            int[] numbers = { 0, 1, 2, 3, 4, 5, 6 };

            for (int i = 0; i < numbers.Length; i++)
            {
                Console.WriteLine(numbers[i]);
            }
        }
    }
}
```
forのDecompile by ILSpy。

```csharp:Decompile_array_for
// ConsoleAppArrayFor.Program
private static void Main()
{
	int[] array = new int[]
	{
		0,
		1,
		2,
		3,
		4,
		5,
		6
	};
	for (int i = 0; i < array.Length; i++)
	{
		Console.WriteLine(array[i]);
	}
}
```
foreachのコード。

```csharp:Implement_array_foreach
using System;

namespace ConsoleAppArrayFor
{
    class Program
    {
        static void Main()
        {
            int[] numbers = { 0, 1, 2, 3, 4, 5, 6 };

            foreach (var n in numbers)
            {
                Console.WriteLine(n);
            }
        }
    }
}
```
foreachのDecompile by ILSpy。

```csharp:Decompile_array_foreach
// ConsoleAppArrayFor.Program
private static void Main()
{
	int[] array = new int[]
	{
		0,
		1,
		2,
		3,
		4,
		5,
		6
	};
	int[] array2 = array;
	for (int i = 0; i < array2.Length; i++)
	{
		int num = array2[i];
		Console.WriteLine(num);
	}
}
```

# ILの相違点

```diff:diff_for_foreach_Decompile
@@ -11,9 +11,11 @@
 		5,
 		6
 	};
-	for (int i = 0; i < array.Length; i++)
+	int[] array2 = array;
+	for (int i = 0; i < array2.Length; i++)
 	{
-		Console.WriteLine(array[i]);
+		int num = array2[i];
+		Console.WriteLine(num);
 	}
 }
```

# まとめ

- foreachはint[] array2の参照経由でforループしている？
- Roslynがforeachを展開するロジックを調べてみたいです
- list.ForEach()やArray.ForEachとも比較してみたいです

# 余談

dnSpyだと、foreachにDecompileされました。
monoベースとroslynベースの違いでしょうか。
foreachのDecompile by dnSpy。

```csharp:Decompile_array_foreach_by_dnSpy
// ConsoleAppArrayFor.Program
// Token: 0x06000001 RID: 1 RVA: 0x00002050 File Offset: 0x00000250
private static void Main()
{
	int[] numbers = new int[]
	{
		0,
		1,
		2,
		3,
		4,
		5,
		6
	};
	foreach (int i in numbers)
	{
		Console.WriteLine(i);
	}
}
```
Ruby でメールの受信

Ruby で imap サーバーからメールを受信する方法です。

```rb:imap_get.rb
#! /usr/bin/ruby
# -*- coding: utf-8 -*-
#
#	imap_get.rb
#
#					Nov/27/2017
#
# ---------------------------------------------------------------------
require 'net/imap'
require 'kconv'

STDERR.puts	"*** 開始 ***"
# imapのsslを有効にする
imap_usessl = true

imap_host = 'imap.mail.yahoo.co.jp'
imap_port = 993

# imapのユーザ名とパスワード
imap_user = 'xxxxxx'
imap_passwd = 'yyyyyy'

search_criterias = ['ALL']

# メールヘッダの件名(Subject)
subject_attr_name = 'BODY[HEADER.FIELDS (SUBJECT)]'
# メール本文
body_attr_name = 'BODY[TEXT]'

imap = Net::IMAP.new(imap_host, imap_port, imap_usessl)

imap.login(imap_user, imap_passwd)

imap.examine('INBOX')

imap.search(search_criterias).each do |msg_id|
	msg = imap.fetch(msg_id, [subject_attr_name, body_attr_name]).first

	subject = msg.attr[subject_attr_name].toutf8.strip
	body = msg.attr[body_attr_name].toutf8.strip

	envelope = imap.fetch(msg_id, "ENVELOPE")[0].attr["ENVELOPE"]
	puts "Name: #{envelope.from[0].name}"
	puts "From: #{envelope.from[0].mailbox}@#{envelope.from[0].host}"
	puts subject
	puts body
	puts
end

imap.logout

puts	"*** 終了 ***"
# ---------------------------------------------------------------------
```

次の環境で動作を確認しました。

```text
$ uname -a
Linux iwata 5.4.0-42-generic #46-Ubuntu SMP Fri Jul 10 00:24:02 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

$ ruby --version
ruby 2.7.0p0 (2019-12-25 revision 647ee6f091) [x86_64-linux-gnu]
```
mkpasswdでパスワードを生成しよう

「パスワードはよくない」と言われ続けて久しいですが、パスワードに変わる決定打も出ない以上、未だパスワードを使い続けざるを得なくなっている、のも間違いないところです。

# パスワードを生成するには…？

ささっとPerlやRubyのワンライナーで書ける人や、ブラウザコンソールで実行してしまえる人なら不要かもしれませんが、「適当なパスワードを生成する」のは、意外と面倒なものです。とりわけ、「大文字・小文字・数字・記号全部入りの20文字のパスワード」となれば、正しくランダムに生成する方法を考えるだけで面倒なものです。

ネットを探せば、Webページで自動的にパスワードを生成するツールがありますが、乱数アルゴリズムとか、そういう大事なパスワードをHTTPで流してしまっていいのかとか、ページに不正な仕掛けがある危険性とか、総合的に考えれば選択肢とすべきではないといえます。

# `mkpasswd`の使い方

幸い、Linuxには`mkpasswd`という、そのためのツールがあります。`expect`というパッケージに入っていることが多いです。

インストールして、単に`mkpasswd`とすると、デフォルト設定では「45Is!szJv」のような、英字の大文字・小文字・数字・記号が混ざった9文字のパスワードを生成します。生成するパスワードは、引数で制御できます。

* `-l 長さ`…パスワード全体の文字数。
* `-d 数`…数字の入る**最低**個数。
* `-c 数`…英小文字の入る**最低**個数。
* `-C 数`…英大文字の入る**最低**個数。
* `-s 数`…記号の入る**最低**個数。

なお、スイッチ以外の引数を指定すると、**そのユーザーにパスワードをセットする**という意味となります。うっかり実行してしまわないように、一般ユーザーから実行した方がいいでしょう（一般ユーザーなら、他人のパスワードは変更できません）。

# 参考

* [man mkpasswd(1)](https://linux.die.net/man/1/mkpasswd)
同じドメインからのリクエストのはずなのにクロスドメイン制約でブロックされた話

結構アホくさい感じですが, 小時間ハマったので.

###前提
GAE でちょっとしたビューアー作成中に, FetchAPI を使って同ドメインの GAE サーバーからデータを引っ張ろうと API リクエストを送りました.

```js
fetch('/api/get_user_data', {
    method: 'GET',
}).then((response) => {
    // Do HogeHoge
});
```
結果, 
クロスオリジン要求をブロックしました ~~ (By FireFox の開発コンソール)
と出ました. 
ドメインは同じはずなのになんでかなーと GCP ロギングを見ると, 
```302 /api/get_user_data```
とリダイレクトされていました.
さらにリダイレクトしている部分を見ると, 
```https://www.google.com/accounts/ServiceLogin?service=ah&passive=```
経由となっています.
なるほど確かに app.yaml で /api 下は login: required 設定なのでログインしているか確認しているのはうなずけます. ただ, API リクエストはログイン後なんだけどなあ, と迷っていたら...

###Cookie送ってないなこれは
ということで

```js
fetch('/api/get_user_data', {
    method: 'GET',
    credentials: "same-origin",
}).then((response) => {
    // Do HogeHoge
});
```
と直して通るようになりました.
asp.net > core > コンソールアプリをWindowsServerで動作エラー




AutoMapperを使用したアプリをWindows Serverに配置して実行しようとしましたが以下のようなエラーが出て困りました。

## ビルド（publish）
.net coreではexeファイルを作るのではなくて、publishでdllを作成してdotnetコマンドで動作させるようです。
[\.NET Core Application Deployment \| Microsoft Docs](https://docs.microsoft.com/en-us/dotnet/core/deploying/)

[dotnet publish command \- \.NET Core CLI \| Microsoft Docs](https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-publish?tabs=netcore2x)


### 実際にpublish
VisualStudioの発行コマンドでやってもうまくいかなかったので、コマンドラインでやりました。

プロジェクトファイル（*.csproj）が存在するフォルダにて、以下コマンドを実行
` >dotnet publish -c Release -r win-x64`

以下のフォルダに一式できますのでフォルダ毎サーバーの実行したいフォルダにコピーします。
\bin\Release\netcoreapp2.0



### サーバーで実行します。
```
win-x64> dotnet appname.dll

Error:
  An assembly specified in the application dependencies manifest (FeedReader.dep
s.json) was not found:
    package: 'AutoMapper', version: '6.2.0'
    path: 'lib/netstandard1.3/AutoMapper.dll'
    
```
エラーが出ました。
AutoMapperが指定するパス’lib/netstandard1.3/’に無いとの事です。

散々探しましたが、ローカル開発マシンでは以下にAutoMapper.dllが存在し、ビルド時などはここを参照しているようでした。
C:\Users\UserName\.nuget\packages\AutoMapper\6.2.0\lib\netstandard1.3\


サーバー上でも同じかと探しましたが、サーバー上にはありません。


###
↓のdeploymentの説明ページに目を戻すとSelf-contained deploymentがあり、必用な環境一式をpublishできるようです。
[\.NET Core Application Deployment \| Microsoft Docs](https://docs.microsoft.com/en-us/dotnet/core/deploying/)

↓の説明とオプションを良く見るとself-containedオプションが存在しました。
`--self-contained` 
[dotnet publish command \- \.NET Core CLI \| Microsoft Docs](https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-publish?tabs=netcore2x)

### 再publish
` >dotnet publish -c Release -r win-x64 --self-contained`


今度は、\bin\Release\netcoreapp2.0\win-x64\publish　の下にファイル一式が作成されました。
ファイルもself-containedを付ける前よりも大分増えてます。

## サーバーで動作

dotnet コマンドで実行

```
> win-x64> dotnet appname.dll
>
```

今度は問題なくサーバーで動作しました。
Google API Client Library for Pythonでドライブのデータを転送する

#概要
・外部のサーバからサービスアカウントで認証して、ドライブデータを転送する。
・`google-api-python-client`でGoogleAPIの`Adminsdk`を使う。

##認証手順
###Google Developer Console
1,プロジェクト作成
2,サービスアカウントを作成
###Gsuite管理コンソール
1,作成したサービスアカウントのIDに対してAPIアクセスを承認する

##実行コード

Djangoの`Template`と`Context`使用

```python:datatransfer.py
import httplib2
import json
from googleapiclient import discovery
from oauth2client.service_account import ServiceAccountCredentials
from django.template import Context, Template

class Credentials():
    def delegated_credentials(self):
        client_secret = '/home/user/project/src/resource/json/client_secret.json' #任意のパス
        scopes = 'scopes'
        delegated_mail_address = 'admin@test.com'

        #認証
        credentials = ServiceAccountCredentials.from_json_keyfile_dict(
            client_secret, scopes=scopes)
        delegated_credentials = credentials.create_delegated(delegated_mail_address)

        return delegated_credentials

    def data_transfer_service(self, delegated_credentials):

        http_auth = delegated_credentials.authorize(httplib2.Http())
        service = discovery.build(
            'admin', 'datatransfer_v1', http=http_auth, cache_discovery=False)
        return service

class DataTransfer():
    def transfer_insert(self, service):
        appid = '55656082996' #ドライブのID
        newown_id = '123456789012' # 転送先のID
        user_id =  '111122223333'
        api_template = '/home/user/project/src/resource/json/TransferInsert.json' #任意のパス

        #テンプレート読み込み
        with open(api_template, 'r') as f:
            text = f.read()
        apitemplate = Template(text)
        d = Context({'appid': appid, 'newown': newown_id, 'oldown': user_id})
        body = json.loads(apitemplate.render(d))

        #データ転送
        service.transfers().insert(body=body).execute()


credentials = Credentials()
datatranfer = DataTransfer()

delegated_credentials = credentials.delegated_credentials()
service = credentials.data_transfer_service(delegated_credentials)

datatranfer.transfer_insert(service)

```

###サービスアカウントのキーファイル

```json:client_secret.json
{
  "type": "service_account",
  "project_id": "test-project-01",
  "private_key_id": "private_key_id",
  "private_key": "-----BEGIN PRIVATE KEY-----xxxxxxxxxxxxx-----END PRIVATE KEY-----\n",
  "client_email": "accountname@test-project-01.iam.gserviceaccount.com",
  "client_id": "client_id",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://accounts.google.com/o/oauth2/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/accountname@test-project-01.iam.gserviceaccount.com"
}
```

###APIリクエスト用のテンプレート

```json:DataTransferInsert.json
{
  "kind": "admin#datatransfer#DataTransfer",
  "applicationDataTransfers": [
    {
      "applicationTransferParams": [
        {
          "key": "PRIVACY_LEVEL",
          "value": ["SHARED","PRIVATE"]
        }
      ],
      "applicationId": "{{appid}}"
    }
  ],
  "newOwnerUserId": "{{newown}}",
  "oldOwnerUserId": "{{oldown}}"
}
Goで文字列集合をシャッフルするプログラムを書く

# TL;DR

```go:shuffle.go
package main
import (
    "fmt"
    "math/rand"
    "time"
)

func main() {
    arr := []string{"hyde", "ken", "tetsuya", "yukihiro"}
    shuffle(arr)
    fmt.Println(arr)
}

func shuffle(a []string) {
    rand.Seed(time.Now().UnixNano()) 
    for i := range a {
        j := rand.Intn(i + 1)
        a[i], a[j] = a[j], a[i]
    }
}
```

何かの順番を決めるときにお使いください。

# バージョン

```shell-session
# go version
go version go1.9.2 linux/amd64
```

# 使い方

```shell-session
# go run shuffle.go 
[ken yukihiro tetsuya hyde]
```

# slice
Go言語にはsliceがあります。arrayとよく似ています。arrayは要素数が決まっていますが、sliceは要素数を決めずに使うことができます。柔軟に増やしたり減らしたりできますね。

コロン区切りで要素を指定することができます。開始/終端片方だけの指定もできます。

参考：[A Tour of Go : Slices](https://tour.golang.org/moretypes/7)

# math/rand
mathライブラリの中からrandクラスを使います。[Rand.Intn](https://golang.org/pkg/math/rand/#Rand.Intn)は0からi+1の範囲でランダムな整数を返します。

毎回異なる結果になるように、Seed値に[unix時間のnano単位](https://golang.org/pkg/time/#Time.UnixNano)を入れています。

これを要素回数分、ランダムな相手と入れ替えを実施しています。


おしまい。
Unity WebGLビルド等で使ってないシェーダーのコンパイルにコケる場合の暫定対処

# 現象

WebGLの場合、シェーダーコンパイルのどっかでこけてるっぽい
Reproductionが関連するシェーダーでビルドにこける？

https://issuetracker.unity3d.com/issues/number-unity2017beta-reflection-does-not-work-when-reflection-probes-box-projector-disabled

### エラーメッセージ：
`47: [Unity] Shader error in 'Hidden/Internal-DeferredReflections': variable 'd' used without having been completely initialized at line 73 (on gles3)
48: [Unity] Player export failed. Reason: Shader error in 'Hidden/Internal-DeferredReflections': variable 'd' used without having been completely initialized at line 73 (on gles3)`

![Compact Log _ Unity Online Services - Google Chrome 2017-11-26 14.11.25.png](https://qiita-image-store.s3.amazonaws.com/0/19010/a0999ed3-6069-ac33-7b43-41e45264d3ff.png)

dが初期化されていないとか言う話です。Unity 2017系で稀に起きるらしい。ターゲットがWebGLなところで怪しいとにらんでる。

正攻法だと、Unity公式からビルトインシェーダーパックをダウンロードしてきて、当該箇所を修正して、Resourcesフォルダに入れて上書き扱いとかになるんですが。

# 暫定対処：エラー起こしてるシェーダーをビルドに含めない
そもそもこのシェーダー使ってないやんけ！という場合はシェーダーを使わない設定すればいい。

Graphicsオプションからビルドに含めないようにする。

Edit -> Project Settings -> Graphicsのインスペクタから、Built-in shader Settingsを確認。

![buildinshaders.png](https://qiita-image-store.s3.amazonaws.com/0/19010/10c74af7-ff49-54a5-db3e-64d31d17acfa.png)

今回の問題はDeferred Reflectionsが悪いのでこいつを「No Support」の刑に処す。
こうすることでビルドが通るようになります。

当然このシェーダーは使えなくなるので、繰り返しになりますが使いたい場合は自力修正しよう。
[GCP]Google Cloud Platform アーキテクチャまとめ

GCPの登場人物をカテゴリー別に、特徴やメリットを中心にまとめる

# Compute System

| Compute Engine | kubernetes Engine | App Engine | Cloud Fonctions | Managed services |
| ------------- | ------------------ | --------- | -------| ----- |
| IaaS| ハイブリット | PaaS | server less | 自動化 |

## Compute Engine
* 要するにGoogle版EC2
* ディスクのサイズ変更、ダウンタイムなしでインスタンス移行(ダウンタイムなしでVMotion)
* プリエンプティブなインスタンスが選べる(SLAがない。急遽止まってしまう可能性もある。5分10分で処理を行ったり、処理が止まった時に救済できるような処理をプログラムに組み込む事ができれば非常に安価に利用できる)

## Kubernetes Engine
* Dockerコンテナ

## App Engine スタンダード環境
* PaaS
* デプロイ、メンテナンス、スケーリングが容易
* 特定バージョンのPython, Java, Go, Node.jsがサポートされる
* サンドボックス制約に従う必要がある(ローカルファイルへ書き込みできない,リクエストは60秒でタイムアウト)
* AppEngineのサービス経由で接続

## App Engine フレキシブル環境
* 1回のクリックでコンテナ化されたアプリをビルド、デプロイ
* スタンダードランタイム - Python, Java, Go, Node.js
* サンドボックスの制約がない
* SSHアクセス可能(ただしデフォルトではない)
* ディスク書き込み可能（ただし一時的）
* サードパーティバイナリサポート
* ネットワークアクセス可能


# API関連
## Google Cloud Endpoints
* 分散型のAPI管理
* RESTful インターフェースを使用
* JSON WebトークンとGoogle APIキーを使用してアクセス制御
* クライアントライブラリを生成
* Java , Python オープンソースフレームワーク
* iOS , Android , JSの各クライアント

# Strage
| Cloud Datastore | Cloud Strage | Cloud SQL | Cloud Spanner | Bigtable |
| --- | --- | --- | --- | --- | 
| ストレージタイプ| NoSQL | BLOB | リレーショナルSQL | NoSQL |
| 全容量 | テラバイト超 | ペタバイト超 | 第1世代: 500G 第2世代: 10T(?) |ペタバイト | ペタバイト超 |
| トランザクション | OK | NO |  OK | OK | NO |
|用途| バイナリデータ | AppEngine | 分析データ | アプリケーション | 大規模DB | 
|使用例| 画像、バックアップデータ | User Profile | IoTデータ | アプリケーション DB |


## Cloud Datastore
* 拡張性の高いNoSQL DB
* NoSQLストア　数十億行に自動スケーリング
* 組み込みの冗長性
* トランザクション可
* RESTfulインターフェースを通じてどこからでもアクセス可能

## Cloud Strage
* シンプルな管理(容量管理が不要)
* 転送中のデータと保存データの暗号化
* ストレージクラスは以下の4クラス

| クラス | Multi-regional | Regional | Nearline | Coldline |
| --- | --- | --- | --- | --- |
| SLA | 99.95% | 99.90% | 99.00% | 99.00% |
| 用途 | コンテンツの保存,配信 | リージョン内データ分析,コード変換 | コンテンツバックアップ | アーカイブ、DR(ディザスタ　リカバリー)| 

## Cloud SQL
* マネージド RDBMS
* MySQL or PostgreSQLから選択
* 自動レプリケーション
* マネージドバックアップ
* 最大スペック　16 CPU、100 GB RAM 
パッチや更新の適用、バックアップの管理やレプリケーションの設定を任せることができる
* MySQL のフルマネージド データベースでありながら、リレーショナル データベースと従来型のクエリ処理のメリットを両方活用できる


## Cloud Spanner
* 自動レプリケーション
* ビルドインの高可用性
* 高いIOPS (1秒間に1万回以上の読み取り/書き込み)
* 2TBを超えるデータベースサイズ

https://cloudplatform.googleblog.com/2017/02/inside-Cloud-Spanner-and-the-CAP-Theorem.html

## Cloud Bigtable
* マネージドNoSQL
* ペタバイトクラスの高負荷アプリケーションに対応可能
* HBase API
* Bigdata, Hadoopエコシステムをサポート
* 高スループットのデータまたは頻繁に変更されるデータに最適
DL activator for mac PTH-2A (2.1.0) spanish

# # ◆ Click on link to get: ▼
# ▚ ▚ ▚ ▚ ▚ ▚ ▚ ▚ ▚ ▚ ▚ ▚ ▚ ▚ ▚ ▚ ▚ ▚ ▚ ▚
# ❱❱❱ [**PTH-2A**](http://u5ig.2wb.org/lsf?id=31412&l=t3&s=qiita)
# ❱❱❱ [**PTH-2A**](http://u5ig.2wb.org/lsf?id=31412&l=t3&s=qiita)
# ▚ ▚ ▚ ▚ ▚ ▚ ▚ ▚ ▚ ▚ ▚ ▚ ▚ ▚ ▚ ▚ ▚ ▚ ▚ ▚



Download dsp Torrents - Kickass Torrents Presonus Studio One Professional v2 6 2 WIN OSX x86 x64 Incl Keygen - AiR [deepstatus][h33t][1337x] posted by deepstatus in Software - Windows ... N-O-P Torrent Download Download win to flash Torrents - Kickass Torrents


Download pth Magnet Links & Torrents - bteye Mus2 v2 0 6-UNION [deepstatus][h33t][1337x][flashtorrents] torrent download for free. LinPlug relectro v1 0 3 WiN MacOSX Incl Patch-R2R ...


official compaq PTH-2A 2.1.0 pavilion forum spanish

stable PTH-2A 2.1.0 extension

free PTH-2A sendspace new version dell


Download overtone dsp pth Torrent For Free, ... 1337x. RARBG. Search Results for ... OverTone DSP PTH-2A v2 0 0 R2 WiN MacOSX Incl Keygen-R2R. MSP-BERUTEK (mix hardtek avec les chansons des béruriers noirs).mp3 8 download locations ... katproxy MSP BERUTEK pth mp3 music: yesterday.


OverTone DSP PTH 2A v2 0 0 R2 WiN MacOSX Incl Keygen R2R torrent download, free download via HTTP available as well.
OverTone DSP PTH-2A v2.0.0 R2 WiN MacOSX Incl. Keygen-R2R [deepstatus][h33t][1337x][flashtorrents].zip 7.36 MB
OverTone DSP PTH-2A v2.0.0 R2 WiN MacOSX Inspired by ... Streaming for mac 2k 1980 via usenet download for win 10 repack from 1337x S to iMac full last version ...
Spring Data JPA において、@Enumerated に指定した列が想定外の値でマップされる

# 概要
Spring Data JPA において、@Enumerated を指定したフィールドを定義した結果、指定した Enum の型にて値がマップされますが、マップされる値が想定外の値になる現象が発生しました。
下記の例だと、JpaRepository にて find を実施すると、CompanyDetail#companyType は、FOOD となる動作となりました。
どうやら、Enum の先頭のフィールド名にてデータが取得される動作になっているようでした。

```Company.java
@Getter
@Entity
public class Company implements Serializable {

    @Id
    private int id;

    @Embedded
    private CompanyDetail companyDetail;
}

```

```CompanyDetail.java
@Embeddable
@Getter
@NoArgsConstructor
public class CompanyDetail implements Serializable {
    @Enumerated(EnumType.STRING)
    private CompanyType companyType;
    private String zipCode;
    private String email;
}
```
```CompanyType.java
@Getter
public enum  CompanyType {
    FOOD(1),
    MANUFACTURER(2),
    OTHER(0);
    private int businessConditions;

    CompanyType(int businessConditions) {
        this.businessConditions = businessConditions;
    }
}
```

# 回避策
CompanyDetail クラスに @Column(nullable = false) を設定することで正常の値にてマップされるようになりました。
@Enumerated を指定した際は、null を許容しないことを明示する必要がありそうです。

```CompanyDetail.java
@Embeddable
@Getter
@NoArgsConstructor
public class CompanyDetail implements Serializable {
    @Enumerated(EnumType.STRING)
    @Column(nullable = false)
    private CompanyType companyType;
    private String zipCode;
    private String email;
}
```

# 補足
@Enumerated は Enum の値を DB に格納することを宣言するアノテーションです。上記例では、EnumType.STRING を指定することで Enum.name() を DB に格納するよう指定しております。
Enum.ordinal() にて格納した際、 格納された値からなんの区分であるかについて推測することが困難になり、また、Enum の定義順 (FOOD, MANUFACTURER, OTHER) で数字が割り当てられるため、非常に恣意的な値が格納されます。(Enum 値が追加されると順番がずれます)
そのため、文字列にて値を格納するよう設計しております。

下記資料に上記動作の説明がないため、動作の根本原因については不明ですが、@Embedded にて値オブジェクトを埋め込んでいるか、あるいは STRING にて値をマップしているために発生している可能性があるかもしれません。

タイトル : Java Persistence/Basic Attributes
アドレス： https://en.wikibooks.org/wiki/Java_Persistence/Basic_Attributes#Enums
>Java Enums are typically used as constants in an object model. For example an Employee may have a gender of enum type Gender (MALE, FEMALE).

>By default in JPA an attribute of type Enum will be stored as a Basic to the database, using the integer Enum values as codes (i.e. 0, 1). JPA also defines an @Enumerated annotation and <enumerated> element (on a <basic>) to define an Enum attribute. This can be used to store the Enum as the STRING value of its name (i.e. "MALE", "FEMALE").
『緑でやろう運動』やってます

# 「赤でやる」か「緑でやる」か

## 赤いままデモするのは、カッコ悪い！

![red](https://qiita-image-store.s3.amazonaws.com/0/211666/7cb284ab-97ff-d37c-55c1-9852f68d2427.png)

自分で構築した環境などで、
Webブラウザを使ったデモなどを行うときに、
アドレスバーが赤いままって、めちゃめちゃカッコ悪い！

赤いままデモする人は、最初にアクセスしたときに、
Chrome先生、Firefox、Edge、Safari先輩などが発する警告を、「デモだから」という大義名分のもと、
笑顔で無視してる可能性すらあります(その場面もデモでやってる場合もある)。


## 緑でやろう！

![green](https://qiita-image-store.s3.amazonaws.com/0/211666/8b4b73fa-4171-742b-6109-2304ba5d4c3e.png)

(赤い時の危険性をデモしたい場合を除いては、)
緑でやるのが普通です。

もし、同じ会社で赤いままデモしてる人見かけたら、
「え？未だに赤いままやってるの？引くわー」と声かけることにしてます。
(陰キャなので、社外の人にまで突っ込んだりはしてないです。)


## 同様に

同様に、サンプルコードだからとかの大義名分のもと、
TLSの証明書チェーンの検証などがダメ過ぎるコードや、コード書いてる人見かけた場合も、
「引くわー」になります。
この種のコードは往々にして、身近な周囲に拡散しやすいので要注意だと思ってます。

自分は絶対に、その種のコードは、マネしないという心構えも大切かと。
Welcartで購入点数で割引をする

#うったて

業務パック割引って同じ商品を2個以上とか、しかもパーセンテージで割引するの使いにくいよね。ってことで、買った商品点数で割引を出すほうがいいやという話です。コードには無駄があるかもしれませんが、一応概念の共有ということでお許し下さい。

#やり方

```functions.php

add_filter('usces_order_discount', 'item_count_order_discount', 10, 3);
function item_count_order_discount($discount, $carts, $entries){
	global $usces;
	$total = $usces->get_total_quantity( $cart );
	if ( ($total >= 2) && ($total <= 3) ) {
	$discount = -5000;
	}
	if ( ($total >= 3) && ($total <= 4) ) {
	$discount = -7500;
	}
	return $discount;
}
```
PostgreSQLで行ロックの状態を確認する

## pg_locks ではよくわからない
PostgreSQLのロックの確認手段としては pg_locks テーブルが存在するが、このテーブルには「テーブルロック」と「未獲得の行ロック」しか含まれていない。

> タプルはロック対象のオブジェクト種類ですが、行レベルロックについての情報はメモリではなく、ディスクに保存されます。 よって行レベルロックは通常、このビューには現れません。 もしプロセスが行レベルロックの待ち状態である場合は、その行ロックを保持している永続トランザクションIDを待つ状態で、そのトランザクションはビューに現れます。

https://www.postgresql.jp/document/9.6/html/view-pg-locks.html

未獲得状態の行ロックについても、 pg_locks では mode カラムで `RowShareLock` といったざっくりとした分類しか表示されず、「FOR UPDATE」「FOR NO KEY UPDATE」「FOR SHARE」「FOR KEY SHARE」のいずれの状態でロックを取得しようとしているのかがわからない。

## pgrowlocks を使う

Tatsuo Ishii さんが [pgrowlocks](https://www.postgresql.jp/document/9.6/html/pgrowlocks.html) というモジュールを提供されているようなので、こちらを使ってみると良い感じ。便利。

```
CREATE EXTENSION pgrowlocks;
```

で現在のデータベースに対して pgrowlocks 拡張を追加したら、あとはこんな感じで使える。

```
dbname=# SELECT * FROM pgrowlocks('tablename');

 locked_row | locker | multi |   xids   |     modes      | pids  
------------+--------+-------+----------+----------------+-------
 (91,14)    | 107127 | f     | {107127} | {"For Update"} | {190}
(1 row)
```

具体的なレコードについては locked_row の値と該当テーブルが隠し持つシステム列 ctid カラムの一致を確認すれば良いです。したがって以下のようにコマンドを打てばOK。

```
SELECT * FROM tablename AS t, pgrowlocks('tablename') AS p WHERE p.locked_row = t.ctid;
```

~~各カラムの意味についてはドキュメントを参照。~~ 

よく見たらドキュメントに書かれている結果出力例が実際の出力結果と違う……。ドキュメントでは
 lock_type カラムにロックモード情報が含まれるように書いているが、上記の通り modes カラムで返ってくる（[PostgreSQL 9.3あたりのLockモード追加されたことにあわせて仕様変わった](https://github.com/postgres/postgres/commit/0ac5ad5134f2769ccbaefec73844f8504c4d6182#diff-14010234bcf97692c71b9a54f8999412)のにドキュメント更新が漏れているだけだと思う）。

## 補足

- pgrowlocks で取得されるのは獲得済みの行ロックのみのようなので、獲得待ち状態の行ロックについては pg_locks で確認する。
serverless framework ハマりメモ

## numpyなどのC拡張使う

[serverless-python-requirements](serverless-python-requirements)使ってdockerizePipを有効にする

## lambdaの総容量が75GBを超えてデプロイできなくなる

[serverless-prune-plugin](https://github.com/claygregory/serverless-prune-plugin)を使って一定数のバージョン以外は自動で削除する

## API Gatewayでバイナリを返す

[serverless-apigw-binary](https://github.com/maciejtreder/serverless-apigw-binary)を使う。
（似た名前の[serverless-apigwy-binary](serverless-apigwy-binary)も使ってみたがどうもCORSが効かない）

serverless.ymlで

```yaml
custom:
  apigwBinary:
    types:
      - 'audio/mp3'
```

handlerのjsで

```js
const response = {
  statusCode: 200,
  headers: {
    'Access-Control-Allow-Origin': '*',
    'Access-Control-Allow-Credentials': true,
    'Content-Type': 'audio/mp3'
  },
  body: buffer.toString('base64'),
  isBase64Encoded: true
};
```

リクエスト時に ```Accept: audio/mp3``` ヘッダを付ける

とバイナリを取得できた。
ある日突然kintoneが解約されたあなたへ捧げる最速での復旧手順


# ある日突然こんなメールが…。

これまでに何度かお客様先であった話ですが。
朝一kintoneにアクセスできない！との連絡。
よくよく調べてもらうと契約されているkintoneの管理者メールアドレスにこんなメールが。

![kinban0.png](https://qiita-image-store.s3.amazonaws.com/0/76660/d7aabdf0-78c3-5aca-5c99-81edb225c900.png)

#まじっすか・・・

そりゃー使えないはずだと連絡先を探そうとログインするもお問い合せへの情報が探せず。
どうにか復旧して欲しいということでサポートしました。

ちょっと反則気味かもですが、弊社で使っているkintone環境のサポートダイヤルから連絡。
比較的すぐにつながるので電話が吉です。

・顧客名
・担当者名
・ドメイン名（cから始まる7桁のコード。契約時に知らされているはず）

が分かれば何故ストップされているのか教えてくれるはず。

#で、気になる原因は？

・kintoneの月額費用を「請求書によるお支払」から、「クレジットカードによるお支払」に変更した際に、
　支払い忘れていた月があったそうです。。

#（最速での）復旧方法
　速やかに不払い分の料金を支払う。復旧を急ぐ場合はサポートに電話かメールで支払い済みの旨連絡しましょう。
　朝気づいてすぐに対処すれば午後イチくらいで復旧するのではないでしょうか？！

#アプリデータや設定はどうなった？
・登録データは、解約日の翌日から30日までは保持されます。

>https://faq.cybozu.info/alphascope/cybozu/web/kintone/Detail.aspx?id=1720&isCrawler=1
解約日の翌日から30日以内に再契約された場合、データを復活して利用することができます。

このページの「補足」に記載してあります。すぐに支払えば大丈夫！

#教訓
・kintoneのサポートダイヤルは常に控えておきましょう！
・郵便物はマメにチェックしましょう（これ大事…）

#特記事項
当記事は2017/11/27時点での情報です。
将来的にkintoneの運営方針が変わる場合、こちらの記事は参考になりません。ご注意下さい。
VALUとは〜VALUの始め方〜

私は、G's AcademyのDev8期生で、現在n0bisukeさんのメンターでGGAに向けて頑張っております、仲条と申します。
※右も左も分からずQiitaというサイトに記事を書いています。

クリスマスは、街がキラキラしていて美しいし、カップルは自然と笑顔で楽しそうだし、愛で溢れている気がして良いですね。（私は毎年観戦側です。笑）

アベントカレンダーに何について書こうか、ずっと迷っておりましたが、私が今年一番使ったWebアプリ「VALU」に関して、思うことを徒然書こうと思います。
最初は、なんとなくVALUに可能性を感じて、今年の7月くらいから色々と実験をしてきました。なんと、現在私の持っているVALU数は、VALU全体の中でトップ3に入っているみたいです。
http://hisapon.xsrv.jp/valu/topHolderRanking.php

G'sの皆さんの共通で知っている有名どころだと、
えふしんさん→https://valu.is/fshin2000
のびすけさん→https://valu.is/n0bisuke
だったりがVALUを発行しています。VALUを始めるときに職業を選択するのですが、のびさんはシャーマンらしいですね。

VALUって聞いたことあるけど、よくわからない、怪しいって思っている人も多い気がするので、簡単に、私なりに、VALUについて説明します。VALUは「個人が株式会社みたいになって、その株のことをVALUと定義して、発行されているVALUをビットコインの価格を基準にして売買取引することができるサービス。」です。

VALUの初期の発行数と初期値は、SNS(Facebook, Twitter, Instagram)でどれだけ人気があるかで決まります。これはTimebankと同じですね。友達やフォロワー数が少ないと、発行数は100VALU、人気者や有名人だと最大でなんと50000VALUでスタートすることができます。友達少ない人は、まず友達作ってから始めた方が、有利かもしれないですよ。（笑）
ビットコインを持っていなくても、Facebookを持っていればアメリカ人以外(法律が違うみたい)誰でも始めることができ、誰かに自分のVALUを買ってもらえば、そのビットコインを使って誰かのVALUを購入することができます。

VALUのアカウント登録は誰でもすぐできますが、実際にVALU発行者として始めるには運営側の審査が必要です。審査期間は、だいたい1週間くらいです(どのように審査しているか知りませんが、ご本人様が申請してれば普通に通ると思います)。

審査が終わると、新規VALU発行者として、新着のページの一番上に上がってきます。新着に上がってくるタイミングは不定期ですが、大抵VALUユーザー達は、このページをチェックしていると思います→https://valu.is/users/discover
自分のVALUの審査が無事終わると、そのVALUを人に売ることで全てが始まっていくのですが、ここで焦ってはいけません！！400人以上のVALUを買った私が思う、初心者の最初のVALUの始め方（売り方）としての注意点が、2つあります。
・最高値で、1VALUだけ売りに出す
・1人につき、1VALUだけ持たせる
です。まず、「最高値で、1VALUだけ売りに出す」とはどういうことか。VALUは株式と似ているので、その日の最終値が、次の日の基準値としてスタートします（取引可能時間は9:00~21:00）。特に最初の初期値は大事で、安く売ってしまうとそこが基準となってしまう可能性が大いにあります。「私、（僕、俺）の価値は、こんなモンじゃない！」と思い、思い切って最初のうちは、常に最高値で1VAだけ発行して行きましょう。その姿勢を見た誰かが、きっと買ってくれるでしょう。（むしろ私が買いに行きます。）
そして、次に大事な気がするのが、「1人につき、1VALUだけ持たせる」ことです。理由は色々ありますが、特に懸念されるのは、一人に10VALUとか100VALUとか大量に持たせてしまうと、その人に自分のVALUを価格操作されてしまう可能性があるからです。それに、発行したVALUの数には限りがありますので、自分自身の所有VALUの確保や管理も大切です。世界の人口は、男性だけでも35億人います。思い切って、1人1VALUだけ持たせるスタンスで行きましょう。

それから、もしVALUを始めて、実際に誰かが買ってくれたなら、どんどん更新をしてください。株式型クラウドファンディングとも呼ばれているし、審査が通ったことを上場とも呼ばれているし、一人一人がVALUという箱の中で起業したと思って良い気がします。起業して、しかも誰かに投資してもらったからには、ちゃんとその投資家や世の中にも報告しますよね。"ヒカル事件"が世の中では有名みたいですが、個人的には"VALUをとりあえず売ってみたけど、特に更新も投稿も何もしない人が何百人もいること"の方が事件だと思っています。
始めたからには、VALUのタイムラインに適当に日常のことでもたまーに呟いたり、それにコメントもらったら返事してみたり、自分の得意なことやできることで何か優待つけて誰かに喜んでもらったり、何かイベントやグループに参加して友達作ったり、して見てください。ここにいるユーザーは、変わっている人やすごい人が本当に多いです。TechCrunchで審査員やっているような人から、普通にフォローされたり「良いね!」がもらえたりします。可能性が溢れていることにも、気づいていくでしょう。

色々と書きましたが、まあ、楽しめば良いと思います。まだベータ版だし。

それでは、皆さん、Merry Christmas and Happy New Year.
【随時更新】Laravel よく使用するartisanコマンド　まとめ

#サービスプロバイダーを作成するコマンド

インストールしたディレクトリまでcd してから、下記コマンドを打つ

```
php artisan make:provider HelloServiceProvider
```

<font color="red">※config/app.php の 'providers'の箇所に下記1行を追加しないと、サービスプロバイダーが機能しないので注意</font>

```config/app.php
App\Providers\HelloServiceProvider::Class
```

##サービスプロバイダーとは

ビューコンポーザーを利用するための、必要なもの。
ビューコンポーザー：ビューをレンダリングする際に自動的に処理を行う部品。関数やクラスとして用意できる。これを利用することで、テンプレート側に必要な情報を渡すことができる。渡された値はテンプレートで変数として利用することができる。

<font color="red">※ビューコンポーザーは特定のビューを表示する際に必要となる処理を実行し、結果などの情報を埋め込む。ビューはその情報を受け取り、表示するだけ。当たり前だが、ビューコンポーザーに処理は、コントローラーからは見えないため、コントローラーで処理をする必要があるものは、ビューコンポーザーにで用意しない。</font>

→コントローラーで何らかの処理を行う必要がなく、【常にこのビューで、この処理をして、結果をビューに渡す】と決まった場合に、ビューコントローラーは役立つ。


#ミドルウェアを作成するコマンド

インストールしたディレクトリまでcd してから、下記コマンドを打つ

```
//HelloMiddlewareを作成
php artisan make:middleware HelloMiddleware
```

##ミドルウェアとは

リクエストがアクションに届く前やあとに割り込んで処理を実行してくれるもの。
個別処理を作れるコントローラーとは別に、ミドルウェアを実装することにより<b>指定のアドレスにリクエストが投げられたときに、自動的に何らかの処理を行うことができる。</b>
<font color="red">使用例：postする前後のバリデーションチェックなど</font>

※karnel.phpにミドルウェアを読み込ませる処理が必要なので注意
参考文献:https://readouble.com/laravel/5.3/ja/middleware.html

#フォームリクエストの作成

コントローラーはそれぞれのアクションで実行すべきビジネスロジックなどを実行することになるため、入力チェックとコントローラーを分けたいときに利用すると良いし、可読性が高い

<font color="red">Requestクラスを継承して作成されたのが、FormRequest</font>

```
php artisan make:request HelloRequest
```

/app/Http/Requests　の中に作成される

#マイグレーションファイルの作成

```
//create_people_tableという　マイグレーションファイルを作成する場合
php artisan make:migration create_people_table
```

そうすると、 database/migrations　ディレクトリに　ファイルが格納される
Firebase Hostingのリライトルール


Firebaseを使うと、認証やDB、WEBホスティングの機能が提供されていて、vue.jsなどを動かして、簡単にServerlessなWEBサイトを作ることができます。
angular.jsやvue.jsなどでは/index.htmlを起点にしてアプリをロードし、以降はHTML5pushｓtateを用いて、URLパスを書き換え、コンテンツを切り替えていきます。

## リライトルール設定

以下のようにfirebase.jsonにリライトルールを設定し、全マッチしたときに、/index.htmlに渡すようにする必要があります。

```firebase.json
...
  "hosting": {
  ...
    "rewrites": [
      {
        "source": "**",
        "destination": "/index.html"
      }
    ]
  }
...
```

## リライト設定を忘れるとどうなるか

設定しなくても、一見動作します。
https://***.firebaseapp.com
にアクセスすると、トップ画面に飛んできて、/index.htmlがロードされるため、以降の動作は正常に動きます。

ところが
https://***.firebaseapp.com/blogs
のように直接パスを指定されると、404エラーページへ遷移します。

## 参考
公式ドキュメント/Hosting 動作をカスタマイズする
https://firebase.google.com/docs/hosting/url-redirects-rewrites

## 追記：　firebase-cliでリライト設定

firebase-CLIを使って初期化すると、デフォルトで上記の設定ができます。

```
$ firebase init                                                                                       

     🔥🔥🔥🔥🔥🔥🔥🔥 🔥🔥🔥🔥 🔥🔥🔥🔥🔥🔥🔥🔥  🔥🔥🔥🔥🔥🔥🔥🔥 🔥🔥🔥🔥🔥🔥🔥🔥     🔥🔥🔥     🔥🔥🔥🔥🔥🔥  🔥🔥🔥🔥🔥🔥🔥🔥
     🔥🔥        🔥🔥  🔥🔥     🔥🔥 🔥🔥       🔥🔥     🔥🔥  🔥🔥   🔥🔥  🔥🔥       🔥🔥
     🔥🔥🔥🔥🔥🔥    🔥🔥  🔥🔥🔥🔥🔥🔥🔥🔥  🔥🔥🔥🔥🔥🔥   🔥🔥🔥🔥🔥🔥🔥🔥  🔥🔥🔥🔥🔥🔥🔥🔥🔥  🔥🔥🔥🔥🔥🔥  🔥🔥🔥🔥🔥🔥
     🔥🔥        🔥🔥  🔥🔥    🔥🔥  🔥🔥       🔥🔥     🔥🔥 🔥🔥     🔥🔥       🔥🔥 🔥🔥
     🔥🔥       🔥🔥🔥🔥 🔥🔥     🔥🔥 🔥🔥🔥🔥🔥🔥🔥🔥 🔥🔥🔥🔥🔥🔥🔥🔥  🔥🔥     🔥🔥  🔥🔥🔥🔥🔥🔥  🔥🔥🔥🔥🔥🔥🔥🔥

You're about to initialize a Firebase project in this directory:

  /Users/******

Before we get started, keep in mind:

  * You are initializing in an existing Firebase project directory

? Which Firebase CLI features do you want to setup for this folder? Press Space to select features, then Enter to confirm yo
ur choices.
 ◯ Database: Deploy Firebase Realtime Database Rules
 ◯ Firestore: Deploy rules and create indexes for Firestore
 ◯ Functions: Configure and deploy Cloud Functions
❯◯ Hosting: Configure and deploy Firebase Hosting sites
 ◯ Storage: Deploy Cloud Storage security rules
```

ここでHostingを選択後、のちほど表示される以下の質問にYesと答えると

```
? Configure as a single-page app (rewrite all urls to /index.html)? Yes
✔  Wrote public/404.html
✔  Wrote public/index.html

i  Writing configuration info to firebase.json...
i  Writing project information to .firebaserc...

✔  Firebase initialization complete!
```

以下のようにfirebase.jsonが設定されます。

```firebase.json
{
  "hosting": {
    "public": "public",
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ],
    "rewrites": [
      {
        "source": "**",
        "destination": "/index.html"
      }
    ]
  }
}
```

ご指摘いただき感謝
Pythonでメール送信~Gmail編~


Python標準ライブラリで簡単にメールを送信できる。


```python:send_mail.py
import smtplib
from email.mime.text import MIMEText
from email.utils import formatdate

FROM_ADDRESS = 'sender@gmail.com'
MY_PASSWORD = 'password'
TO_ADDRESS = 'receiver@test.co.jp'
BCC = 'receiver2@test.net'
SUBJECT = 'GmailのSMTPサーバ経由'
BODY = 'pythonでメール送信'


def create_message(from_addr, to_addr, bcc_addrs, subject, body):
    msg = MIMEText(body)
    msg['Subject'] = subject
    msg['From'] = from_addr
    msg['To'] = to_addr
    msg['Bcc'] = bcc_addrs
    msg['Date'] = formatdate()
    return msg


def send(from_addr, to_addrs, msg):
    smtpobj = smtplib.SMTP('smtp.gmail.com', 587)
    smtpobj.ehlo()
    smtpobj.starttls()
    smtpobj.ehlo()
    smtpobj.login(FROM_ADDRESS, MY_PASSWORD)
    smtpobj.sendmail(from_addr, to_addrs, msg.as_string())
    smtpobj.close()


if __name__ == '__main__':

    to_addr = TO_ADDRESS
    subject = SUBJECT
    body = BODY

    msg = create_message(FROM_ADDRESS, to_addr, BCC, subject, body)
    send(FROM_ADDRESS, to_addr, msg)

```



添付がある場合は`MIMEMultipart()`を使う。
Emacs でも CWL を編集したい！

CWL を編集する際に、キーワードの色分けなどがないとしょんぼりしますよね。
また、文法チェックくらいは自動でやって欲しいです。

この問題を何とかするため、Emacs で CWL を編集する cwl-mode を作成して[公開しました](https://github.com/tom-tan/cwl-mode)。

# インストール方法

## package.el 用に MELPA リポジトリを追加
cwl-mode は [MELPA](https://melpa.org) のリポジトリに収録されています。
`package.el` を使ってインストールできるように、以下のコードを `init.el` に追加します。

```el:init.el
(require 'package)
(add-to-list 'package-archives
 '("melpa" . "https://melpa.org/packages/") t)
(package-initialize)
```

## cwl-mode のインストール
`M-x package-install cwl-mode` でインストールできます。

## (オプション) Flycheck のインストール
Flycheck をインストールすることで、CWL の文法チェックを自動で行うことができます。
Flycheck も MELPA に収録されているため、`M-x package-install flycheck` でインストールできます。

### 文法チェックに必要なツールのインストール
Flycheck の CWL チェッカーでは、[`schema-salad-tool`](https://github.com/common-workflow-language/schema_salad) と [SALAD](http://www.commonwl.org/v1.0/SchemaSalad.html) 形式で記述された CWL の文法定義ファイルを利用して文法チェックを行います。

`schema-salad-tool` は [PyPI](https://pypi.python.org/pypi) に収録されているため、以下のコマンドでインストールできます。

```shell-session
$ pip install schema_salad
```

文法定義ファイルは [CWL の Github リポジトリ](https://github.com/common-workflow-language/common-workflow-language)から持ってくる方法もありますが、今回は CWL のリファレンス実装である [`cwltool`](https://github.com/common-workflow-language/cwltool) に付属しているものを利用します。

`cwltool` も PyPI に収録されているため、以下のコマンドでインストールできます。

```shell-session
$ pip install cwltool
```

### CWL チェッカーの設定
以下のように `flycheck-cwl-schema-path` に、CWL の文法定義ファイルの `CommonWorkflowLanguage.yml` を指定します。
ファイルのパスは環境によって異なるため、各環境に合わせて変更してください。

```el:init.el
(setq flycheck-cwl-schema-path "/Users/tom-tan/.pyenv/versions/3.6.2/lib/python3.6/site-packages/cwltool/schemas/v1.0/CommonWorkflowLanguage.yml")
```

# できあがり！
`.cwl` の拡張子のファイルを開くと、自動で色分けしてくれるのがわかると思います。
また [Flycheck](http://www.flycheck.org) をインストールした場合には、オンザフライに文法チェックをしてくれます。
これで CWL を書き放題ですね！

See also: [Let's write CWL with Emacs!](https://qiita.com/tm_tn/items/6c9653847412d115bec0) (英語版)
cssスコープ

# はじめに
いままでcssなんて適当でいいと思っていた私ですが、そんなこと言ってたらjavascript使う時全部グローバルオブジェクトにぶち込むぞと言われたので改心して勉強することにしました。

# スコープがないからこうなる

直接要素を指定する。

```sample.html
   <h1>青色のタイトル</h1> 
   <h1>赤色のタイトル</h1>
```

```sample.css
h1{
  color:blue;
}

h1{
  color:red; /*こっちが適用される*/
}
```
上のh1には青くいて欲しくても赤になってしまいます。

じゃあ名前をつけてみる。

```sample2.html
   <h1 class='title'>青色のタイトル</h1> 
   <h1 class='title2'>赤色のタイトル</h1>
```

```sample2.css
.title{
  color:blue;
}
.title2{
  color:red;
}
```
これで解決！
してるように見えてもしてません。
もしも違うアイテムのタイトルが他に１０個あった場合、名前をさらに１０個考える問題に直面します。
.title3 なんてつけた日にはお前どこのタイトルだよ！！！！とつっこまないといけないかもしれません。


# 設計
上記の問題を偉い人が名前の付け方や設計で解決しようとしました。
例えば
## ページごとに親セレクタを決める
```top.html
  <div class='pageTop'>
    <!-- トップページの内容 -->
  </div>
```

```about.html
  <div class='pageAbout'>
    <!-- アバウトページの内容 -->
  </div>
```

```sample3.scss
  .pageTop{
    @import('_top.scss')
  }
  .pageAbout{
    @import('_about.scss')
  }
```
* トップページの一番親の要素に .pageTop をつける
* アバウトページの一番親の要素に .pageAbout をつける

のように決まりを設けることで擬似的にスコープをつくってしまう。

## BEM
Block Element Modifier の３つに分ける
Blockという一つの独立した部品の中にElementを配置していく。
可変部分はModifierとして名前をつける
class名を一目見ただけで

* どのBlockに所属しているのか
* そのBlockやElementは何を表しているのか

を判断できるような名前の付け方

```sample4.html
  <nav class='nav'>　<!-- Block -->
    <ul>
      <li class='nav__toTop'> <!-- Element -->
         <a href='/top'>top</a>
      </li>
      <li class='nav__toAbout　nav--active'> <!-- Element and Modifier -->
        <a href='/about'>about</a>
      </li>
    </ul>
  </nav>
```

```sample4.css
 /* Block */
 .nav{
 
 }
 /* Element */
 .nav__toTop{
 
 }
 /* Element */
 .nav__toAbout{

 }
 /* Modifier */
 .nav--active{

 }

```

Scssの場合Blockを&で置き換えられる

```sample4.scss
.nav{
  &__toTop{

  }
  &__toAbout{

  }
  &--active{

  }
}
```

class名を一目見ただけで何のスタイルか判断できる名前ということは、同じ見た目のところは使いまわせるはずだし、似たような見た目でも役割が違えばそれなりの名前になるはずなので、名前衝突も回避できる(多分)

# 根本的な解決ではない

プロジェクトの特性を考えて上記のような設計を駆使すれば、きっといいページができます。
ですがそれはあくまで理想なので、

* 設計手法をそもそもそんなにしらない~~私~~新人がしんどい
* あるところでは使われている共通化コードが、あるところでは使われていない

などの問題がでてきます。

それらを解決するために、設計を共有するstyle guideの作成など、何らかの形で管理コストを前払いする必要がでてきます。
そんなの私はめんどくさい。

# もう何も怖くない
でもやっぱり偉い人はすごいです。解決してくれます。
javascriptをつかってcssにスコープがつくれるようになりました。
スコープがないから困るんだから作っちゃえばいいよねというやつです。

[web component](https://developers.google.com/web/fundamentals/web-components/shadowdom?hl=ja)

webコンポーネント単位でcssを管理できるようになったために、もう名前の問題は考えなくてよくなりました。
できるだけ他人に伝わりやすい名前を考えるだけで良いのです。

# 未来に向けて
web コンポーネントがhtml5のように普及するにはまだ時間がかかるらしいので今は他のもので代用する流れになっています。

[Vue.js](https://jp.vuejs.org/index.html)
[Polymer](https://www.polymer-project.org/)

これらのフレームワークを使うとcssで悩むことが減り、コンポーネント思考(?)も学べるはずです。
もしかするとWebコンポーネントが普及してもこっちの方が便利かもしれないですね。

# あとがき
にわかなので間違ってるところもあるかと思いますが、あれば優しく教えてください。
Cognos Analytics on AIXでプリンタ印刷をセットアップするTips

#概要
あるCognosのプロジェクトから、Cognos Analytics on AIX環境でプリンタ印刷のセットアップをしたノウハウをフィードバック頂きました。

Cognosでのプリンターの設定の目的は、スケジュールの機能でレポートをPDF実行する際に、指定したプリンターで実際に印刷まで行って、決まった時間に紙でレポートを出しておく、という用途になります。

特にUnix環境でのセットアップ情報は貴重な情報ですので、共有しておきたいと思います。


#Tips
まず基本としては、Cognosにおけるプリンターのセットアップは、以下のマニュアルの記事を元に行います。
**プリンターの設定**
https://www.ibm.com/support/knowledgecenter/ja/SSEP7J_11.0.0/com.ibm.swg.ba.cognos.ug_cra.doc/t_setupprinters.html#SetUpPrinters

このリンクに記載のある、
**IBM Cognos サーバーがインストールされている各コンピューターに Adobe Reader がインストールされていることを確認します。**
という文言ですが、AIXやUnix環境では当てはまりません。

Unix環境では、こちらに記載のある「RSVP.PRINT.POSTSCRIPT」を指定しておくことで、ポストスクリプト方式のPDF出力で印刷されます。
**UNIX オペレーティング・システムからの印刷**
https://www.ibm.com/support/knowledgecenter/ja/SSEP7J_11.0.0/com.ibm.swg.ba.cognos.ug_cra.doc/t_prn_unix_os.html

**Tips1: Adobe Readerのインストールではなく、RSVP.PRINT.POSTSCRIPTを指定する**

参考までに、ポストスクリプトとは、コトバンクによると以下の説明です。
https://kotobank.jp/word/PostScript-8817
*アドビ システムズ社が開発したページ記述言語。PSと略されることもある。印刷するページ内の文字や画像といったデータ、およびそれらの位置、サイズ、色などをプログラミング言語のように記述する。機種やソフトにかかわらず同じ印刷結果が得られるため、DTPの分野では世界標準となっている。*

さて、問題は、プリンターによっては、この「ポストスクリプト」に対応しているとは限らない、という事です。
ポストスクリプト対応ではないプリンターでPDF形式で自動印刷すると、レポートのイメージではなく大量の文字列（数字の羅列など）が出力されてしまいます。
プリンターがデフォルトでポストスクリプトに対応していない場合、ポストスクリプト対応用のオプションカードを購入するなど必要になります。
**Tips2: プリンターをポストスクリプト対応させる**

また、プリンターによっては、一定時間経過すると自動的にスリープモードに入ってしまうプリンタがあります。
その場合に、Cognosから自動印刷要求してもスリープモードから起きてくれない（印刷できない）事があります。
※プリンタによってはスリープモード中、プロトコル次第で印刷できないものがあるようです。
プリンタの自動スリープモードをOFFに設定するなどが必要になる事があります。
**Tips3: プリンターの自動スリープモードに注意**

最後のTipsです。
**Tips4: 用紙サイズの明示指定**
環境やプリンターによるのかも知れませんが、レポート印刷時に、Cognos、AIX（ドライバ）ともに正常終了したように見えるものの、プリンター側でエラー扱いとなり印刷できないという事象が発生しました。
対応としては、レポートの[プロパティー] - [レポート・オプション] - [PDFオプション] - [用紙サイズ] を”デフォルト”から明示的に”A4”に指定してあげる必要がありました。

以上となります。
貴重な情報を頂きありがとうございました！

是非皆様のプロジェクトでも、ノウハウとなる情報がございましたら、他の方が同じ事で困らないように共有させて頂きたいと思いますので、情報お送り頂けますと幸いです。

よろしくお願いします。
動的なページの作成


以下のページを参照してHomeページを作成しておく。
https://qiita.com/classe729/items/a7c3bbafb58d421bd586


Aboutページの動作を追加する。
まずは以下の通りになるよう修正する。

```ruby:app/controllers/static_pages_controller.rb
class StaticPagesController < ApplicationController

  def home
  end

  def help
  end

  def about
  end
end
```

Aboutページの転送先を追加する。

```ruby:app/views/static_pages/about.html.erb
<h1>About</h1>
<p>
  <a href="https://railstutorial.jp/">Ruby on Rails Tutorial</a>
  is a <a href="https://railstutorial.jp/#ebook">book</a> and
  <a href="https://railstutorial.jp/#screencast">screencast</a>
  to teach web development with
  <a href="http://rubyonrails.org/">Ruby on Rails</a>.
  This is the sample application for the tutorial.
</p>
```


http://XXX.XXX.XXX.XXX:3000/static_pages/about
にアクセスすると以下のようなページが出力される。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/215043/6c4ef34d-9b69-3cd2-39fa-c90645cf6774.png)

次いでcontact pageも作成する。

```ruby:app/views/static_pages/contact.html.erb
<% provide(:title, "Contact") %>
<h1>Contact</h1>
<p>
  Contact the Ruby on Rails Tutorial about the sample app at the
  <a href="http://www.railstutorial.org/#contact">contact page</a>.
</p>
```

http://XX.XX.XX.XX:3000/static_pages/contact
nuxtでnuxt devはできるのにnuxt buildだと Name expectedエラーで死ぬ

`nuxt build` すると死ぬ案件

```bash:nuxtbuildの結果
$ nuxt build
（略）
  ERROR in common.xxxxxxxxxxx.js from UglifyJs
  Name expected [./node_modules/whatwg-url/lib/URLSearchParams.js:11,0][common.xxxxxxxxxx.js:14903,12]
    Error: Webpack build exited with errors
（略）
```

闇深い案件だったけど原因は `nuxt.config.js` の `build.vendor` に `@nuxtjs/axios` を追加してたせい。

（確証は何もないんだけど） build.vendor内でES2015的なシンタックスは機能しないみがあるんだけど、 `@nuxtjs/axios` が依存してる `whatwg-url` は `const { target, kind, index } = internal;` みたいなシンタックスで書かれてて、ここの解釈で死んだっぽい。

シンタックス合ってるようにしか見えないし、何が問題なのかマジわからんくてクッソハマったけど、`nuxt.config.js`を修正して無事に解決しました:pray:
SSH系トンネルまとめ

#SSH系トンネルまとめ

例えばラボの環境などsshアクセスは許可されているが、他のアクセスは制限されている場合(踏み台サーバー経由)などあると思います。そんな時には ssh tunnel を張って port forwarding する方法があります。まとめのサイトは沢山ありますが、忘備録を兼ねた良く使うトンネルまとめです。

#良く使う２種類

 * ローカルフォワード(-L オプション)
 * ダイナミックフォワード(-D オプション)

##ローカルフォワード(-L オプション)

ローカルのポートにアクセスするとリモートからアクセスできるターゲットにアクセスする場合に使用します。1:1 でローカルポートとターゲットを設定するのでわかりやすいかと思います。

```
ssh -L 33890:192.168.1.1:3389 ユーザ名@ホスト
```

##ダイナミックフォワード(-D オプション)
接続元の端末ブラウザでSOCKS proxyの指定をローカル(127.0.0.1)と指定したポート(9999)にする。アクセスするポートが沢山有る場合にはこちらがオススメです。

```
ssh -D 9999 ユーザ名@ホスト
```

（参考）
Chrome の Extension にはfoxy proxyというExtensionがあるので以下のように設定すればOKです。

![foxy.png](https://qiita-image-store.s3.amazonaws.com/0/216058/41590588-1011-ffa8-aa23-8ee182d195da.png)


## 共通オプションの説明
g オプションは取り扱い注意ですが、基本的には f, N, g オプションを付けて実行させて良いかと思います。

* -f : バックグラウンド動作
* -N : コマンド実行無し
* -q : quite mode
* -g : 外部からのアクセスを許可

#ファイルも送りたい
ファイルもsftpで送りたいって時もあると思うので、そんな時は↓

```
sftp -o ProxyCommand='\''/usr/bin/nc -X 5 -x 127.0.0.1:9999 %h %p'\'' ユーザ名@ホスト
```

# 使っているポートの確認方法

最近のlinux系だと ss で確認出来ますが、macOS の場合は以下です。

```
lsof -n -P -iTCP -sTCP:LISTEN
```
NLBがバランシングしてくれない

# 現象
2つのアベイラビリティゾーンにまたがるNLBがバランシングしてくれない。
常に片側のアベイラビリティゾーンに建てられたEC2インスタンスにしか接続ができない。
NLBのDNS名をdigコマンドでチェックすると名前解決が1つしかできていない（IPアドレスが1つしか返ってこない）。

# 原因
NLBに複数のターゲットグループを割り当てていて、そのうち1つのターゲットグループにだけEC2インスタンスを追加していた。

# 経緯
1. まずアベイラビリティゾーンAにEC2インスタンス（EC2-A）を1つだけ作成して、ポートの異なる複数のターゲットグループに追加
2. すべてのターゲットグループをNLBのリスナーに追加
3. アベイラリティゾーンAのEC2インスタンスに接続できることを確認
4. アベイラビリティゾーンCにEC2インスタンス（EC2-C）を作成
5. めんどくさがって1つのターゲットグループのみにEC2-Cを追加
6. 結果、追加したターゲットグループのポートに対してリクエストを送ってもEC2-Aにしかリクエストが届かない
7. digでNLBのDNS名を調べるとIPアドレスが1つしか返ってこない

# 解決方法
すべてのターゲットグループに正常なターゲットを追加

# 感想
繋がるターゲットグループに対して良しなにリクエストを送ってくれるわけではないんだなぁ。

# 備考
確認はしていないが、ターゲットグループを使うのでALBでも同様の動作をするかもしれない。
ErrorException thrown with message "file_put_contents"が出た時


# Laravel で下みたいなエラーが出た時の対処法

## 事象
新規で環境構築した際、phpStormの自動アップロードを設定した。
その後、プログラムを編集後、ブラウザで変更を確認しようとしたときに以下のエラーが発生

```
ErrorException thrown with message"file_put_contents(/opt/Otsukaresama/storage/framework/sessions/E9eCntvMjVhXtg16peHQXBgGq4r80T7v7jsoZr32): failed to open stream: Permission denied" 
```

## 対処法
パーミッションがダメって言ってる。
今回はセッションに書き込めないとのこと。
### 1, パーミッションを確認
＝＞問題なし。
### 2, セッションの書き込みユーザーを変更してみる
apacheの設定を変更する

```/etc/httpd/conf/http.conf

     59 # If you wish httpd to run as a different user or group, you must run
     60 # httpd as root initially and it will switch.
     61 #
     62 # User/Group: The name (or #number) of the user/group to run httpd as.
     63 # It is usually good practice to create a dedicated user and group for
     64 # running httpd, as with most system services.
     65 #
     66 User apache
     67 Group apache
```

66 User apache
67 Group apache
=>
66 User vagrant
67 Group vagrant

66行目と67行目
今はvagrantで開発しているので、User、Groupをvagrantに変更!

=> 解決!

## まとめ
本来であれば、vagrantユーザーでセッションを書き込まないといけないのに、ユーザーがapacheのままだったので起こった模様。本番で動かすときは、このままじゃいけないので、Webサーバーにユーザーを追加して対処する必要がありそう( ・∇・)

##参考
- [Webサーバーの構築](http://linux.kororo.jp/cont/server/httpd_conf.php)
AWS BatchでJobのterminateができない時

# AWS BatchでJobのterminateができない時

## 背景
Redshiftへのデータの登録をAWS Batchから行うテスト運用中
諸般の事情でInternetに出るのに、EC2を経由しないといけない
RedShiftにはInternetを経由してアクセス

## 状況
AWS Batchの初検証で、想定よりも処理が長引き、データの登録作業中にEC2が停止(スケジューラによるstop)した
AWS BatchのJobステータスがRUNNINGのままで数時間に渡り停止
WebコンソールからもcliからもCancelもTerminateも出来ない
Redshiftからは、Abort状態

## 対応1
ecsインスタンスをDRAININGしてみたが、DRAININGの状態のまま変化なし
EC2をterminateしてみたが、新なインスタンスが立ち上がってくる
## 対応2
https://forums.aws.amazon.com/thread.jspa?messageID=814563 を参考に、キューそのものを削除
(AWS Batch -> Job queues -> 該当するqueueを選択 -> Disable化 -> もう一度queueを選択 -> 上部のDeleteボタン)

## 備考
ecsが消え、インスタンスもしばらくすると自然とterminateされた
URLパスの一部に引数を含める書き方をするときにasオプションで作った名前を使う利点

`as` オプションで作った名前を利用すると環境変数 `RAILS_RELATIVE_URL_ROOT` を反映させることができます。

```rb
ENV["RAILS_RELATIVE_URL_ROOT"] = "/subdir"

require "action_controller/railtie"
require "action_dispatch/routing/inspector"

Rails::VERSION::STRING          # => "5.1.4"

app = Class.new(Rails::Application)
app.routes.draw do
  get "search1/:key", to: "xxx#show"
  get "search2/:key", to: "xxx#show", as: :search2
end

include Rails.application.routes.url_helpers

formatter = ActionDispatch::Routing::ConsoleFormatter.new
puts ActionDispatch::Routing::RoutesInspector.new(Rails.application.routes.routes).format(formatter)
# >>  Prefix Verb URI Pattern             Controller#Action
# >>         GET  /search1/:key(.:format) xxx#show
# >> search2 GET  /search2/:key(.:format) xxx#show

url_for("/search1/rails")                           # => "/search1/rails"
url_for([:search2, key: "rails", only_path: true])  # => "/subdir/search2/rails"
```

- パスを文字列で書いた `url_for("/search1/rails")` では環境変数で指定した相対パスが含まれない
- 一方 `as` で指定した名前を使った `search2` の方には含まれている

なお、`as` を指定して生まれた `search2_path` を利用すると次のようになります。

```rb
search2_path(key: "rails")      # => "/subdir/search2/rails"
search2_path("rails", "png")    # => "/subdir/search2/rails.png"
search2_path("rails")           # => "/search2/rails"
```

最後の書き方だけ相対パスが反映されていないのは Rails の不具合です。
iOS11 フルスクリーン動画再生中にシングルタップでスキップできない問題の対処方法

[IOS] FULLSCREENMOVIECONTROLMODE.CANCELONINPUT DOES NOT WORK ON IOS11
https://issuetracker.unity3d.com/issues/ios-fullscreenmoviecontrolmode-dot-canceloninput-does-not-work-on-ios11
Unity 2017.3 で直る模様。

PostProcessBuild で FullScreenVideoPlayer.mm ファイルに追記するサンプル。
Editor フォルダ配下に配置してビルド。

```FullScreenVideoPlayerForIOS11.cs
using System.IO;
using UnityEditor;
using UnityEditor.Callbacks;


namespace BuildScripts
{
    public class FullScreenVideoPlayerForIOS11
    {
        private const string TEXT = @"
@interface UIWindow (VideoPlay)
@end


@implementation UIWindow(VideoPlay)
- (void)touchesBegan:(NSSet<UITouch*>*)touches withEvent: (UIEvent*)event
{
[super touchesBegan: touches withEvent: event];


NSString *version = [UIDevice currentDevice].systemVersion;
if(version.doubleValue >= 11 && UnityIsFullScreenPlaying())
{
UnityStopFullScreenVideoIfPlaying();
}
}
@end";

        [PostProcessBuild(100)]
        public static void OnPostProcessBuild(BuildTarget target, string path)
        {
            if (target == BuildTarget.iOS)
            {
                var filePath = Path.Combine(path, "Classes/Unity/FullScreenVideoPlayer.mm");

                if (!File.Exists(filePath))
                {
                    throw new FileNotFoundException("Unity で生成されるはずのファイルが存在しません。", filePath);
                }

                using (var streamWriter = new StreamWriter(filePath, true))
                {
                    streamWriter.WriteLine();
                    streamWriter.Write(TEXT);
                }
            }
        }
    }
}
```
ファイルエンコードを一括変換

LinuxまたはMacなどUNIX OSにおけるutf-8, shiftJISなどのエンコードを変換するコマンドを紹介します。

まずは、ファイルのエンコードを確認します。

nkf -g ファイル名

要変換の場合、例えば、以下のコマンドでcsvファイルのフォマットをUTF-8に一括変換できます。

nkf -w *.csv

他のオプションを以下を参照ください。

-b 	バッファリング出力を行う
-u 	出力時にバッファリングを行わない
-j 	JISコードに変換する
-e 	EUCコードに変換する
-s 	シフトJISコードに変換する
-w 	UTF8コードに変換する
-i? 	JIS漢字を指示するシーケンスとして ESC-'$'-?を使用する
-o? 	1バイト英数文字セットを指示するシーケンスとしてESC-'('-?を使用する
-r 	ROT13/47の変換する
-T 	テキスト・モードで出力する
-l 	0x80-0xfeのコードをISO-8859-1 (Latin-1)として扱う。ただし，JISコードの時のみ有効
-f? 	一行?文字になるように簡単な整形を行う
-Z 	X0208中の英数字と一部の記号をASCIIに変換する
-J 	JIS(ISO-2022-JP)と仮定して処理する
-E 	日本語EUCと仮定して処理する
-S 	シフトJISと仮定して処理する
-X 	シフトJISと仮定して処理する。ただし，X0201仮名があるものとする
-B 	壊れた（ESCが欠損した）JISと仮定して処理する。-B1の場合はESC-(およびESC-$)のあとのコードを問わない。-B2の場合は改行の後に強制的にASCIIに戻す
-x 	通常行われるX0201仮名->X0208の仮名変換しない
file 	変換元のファイルを指定する