OmniAICreator/Qiita-1.07M huggingface dataset:
How much would it cost to develop an App like Ubereats, Zomato and Eat24? A Comprehensive Guide

It is midnight and you are busy working for an important project presentation scheduled in the morning. While working, you, out of the blue, crave for your favorite Italian Pizza. What will you do? You just have to pick your phone and order food online. Isn’t it so simple and convenient? You don’t have to move an inch while ordering your favorite dish from your favorite restaurant. A delivery boy will come with a fresh, hot and mouthwatering pizza at your doorsteps and all you need to do is to have it.
Know more: https://www.prismetric.com/cost-to-develop-food-delivery-app/
TrustedProxy, getClientIps などロードバランサ配下での挙動について

※この投稿はSymfony3.4.20で調べた内容を元に書いています。

## 本番リリースしたとたん絶対URLがhttpsにならない（焦 ##

ロードバランサー（SSLオフロード機能有効）配下にSymfonyのアプリケーションを配置してアプリケーション内でURLを生成したところ、URLがhttpで生成されてしまいました。

```php:IndexController.php
class IndexController extends Controller
{
    public function indexAction(Request $request)
    {
        $absoluteUrl = $this->generateUrl('ROUTE_NAME', [], UrlGeneratorInterface::ABSOLUTE_URL);
        // http://... になってしまった
    }
}
```

対応策は、web/app.phpで

```php:app.php
$request = Request::createFromGlobals();
Request::setTrustedProxies(
    ['CIDR表記'],
    Request::HEADER_X_FORWARDED_ALL
);
$response = $kernel->handle($request);
$response->send();
$kernel->terminate($request, $response);
```
をセットすることです。
ロードバランサー配下では、クライアントがロードバランサーへの接続に使用したプロトコルは$_SERVER['HTTPS']ではなく、X-Forwarded-Protoヘッダに記録されます。

そう、SymfonyはRequest::setTrustedProxies()を設定しさえすれば、HTTPS接続かを見る箇所を切り替えてくれるのです。なんと親切なんでしょう。

Symfonyのソースコードを眺めてみます。
Symfony\Component\HttpFoundation\Requestクラスに

```php:Request.php
    /**
     * Gets the request's scheme.
     *
     * @return string
     */
    public function getScheme()
    {
        return $this->isSecure() ? 'https' : 'http';
    }
```
isSecureの中身は

```php:Request.php
    public function isSecure()
    {
        if ($this->isFromTrustedProxy() && $proto = $this->getTrustedValues(self::HEADER_CLIENT_PROTO)) {
            return in_array(strtolower($proto[0]), array('https', 'on', 'ssl', '1'), true);
        }

        $https = $this->server->get('HTTPS');

        return !empty($https) && 'off' !== strtolower($https);
    }
```

Request::setTrustedProxies()の設定にひっかかれば、前半のif文の中の処理で動作しています。

## IPアドレスでも同じことが… ##

ロードバランサー配下では、クライアントがロードバランサーへの接続に使用したIPアドレスは$_SERVER['REMOTE_ADDR']ではなく、X-Forwarded-Forヘッダに記録されます。

Request::geClientIp()もきちんと対応してくれています。

```php:Request.php
    public function getClientIp()
    {
        $ipAddresses = $this->getClientIps();

        return $ipAddresses[0];
    }
    public function getClientIps()
    {
        $ip = $this->server->get('REMOTE_ADDR');

        if (!$this->isFromTrustedProxy()) {
            return array($ip);
        }

        return $this->getTrustedValues(self::HEADER_CLIENT_IP, $ip) ?: array($ip);
    }
```

getClientIp()は、getClientIps()で配列で返ってきたIPの先頭を返しています。
ということは、getClientIps()がIPアドレスを複数返すことがあるんです。

これはどういうケースかというと WAF → LB → アプリケーション のようにプロキシを2段かましたときに、X-Forwarded-Forに`IP1, IP2`のように記録されるからです。
SymfonyはこんなIPにもきっちり対応して、カンマでIPを分解して処理してくれています。
Pythonで複数のタンパク質のFASTA配列を、タンパク質ごとに.fastaファイル拡張子で保存する

今回は、Pythonを使ったスクレイピングによってタンパク質の配列をPDBから取得します。
>PDBのURL https://www.rcsb.org/

１つのタンパク質の情報を取得するだけなら直接PDBからダウンロードすれば問題ありません。各タンパク質のページのDisplay Filesをクリックして、FASTA Sequenceの部分のリンク先を保存することによってダウンロードできます。
ですが、一度に大量のタンパク質の配列を取得するのは手間も時間もかかりますね。
配列をダウンロードするためのページもあります。
> https://www.rcsb.org/pages/download_features#FASTA

このページでは、一度に大量のタンパク質の配列を取得することもできます。
しかし、Download Options:　でSingle FASTA File　を選択してしまうと配列が一つのテキストにまとめられてしまいます。
今回はタンパク質ごとにFASTAのファイルを取得することを目的としています。
Individual FASTA Files　を選択すればできるみたいですが、「開発元が未確認のため開けません。」と怒られてしまいました。
設定で許可するのが億劫だったので、Pythonでスクレイピングしました。
こうしてできたコードがコチラです。

```python
import urllib.request
import time
def fasta_get(PDB_ID):
    PROTEIN = PDB_ID.upper() #大文字にする
    url = 'https://www.rcsb.org/pdb/download/viewFastaFiles.do?structureIdList=' + PROTEIN +'&compressionType=uncompressed' #FASTA配列が掲載されているURLを取得
    urllib.request.urlretrieve(url, '../fasta/' + PROTEIN  + '.fasta') #得られた配列を.fasta拡張子で保存
    time.sleep(0.5) #サーバーの負担を考慮して一回ごとに時間を開ける
```

これで１つ前のディレクトリにfastaというディレクトリを作って実行すればそこに保存されます。
PDB_ID にはPDB IDを入れて下さい。
大文字で入れてください

予めPDB IDを格納したリストを作成しておいて、for文を回せば自動的にFASTA配列を保存してくれます。
コードは下記

```python
import urllib.request
import time
#list_PDB_ID はPDB_IDを格納したリスト
for ID in list_PDB_ID:
    fasta_get(ID)
```

本日の内容は以上です。
初投稿でした。
これからがんばります。
Google Driveのメニューが日本語にならない時の設定方法

# TL;DR

* Google Driveのメニューが英語になっている
* Settings から Languageを設定しようとすると、優先言語は日本語に設定されている
* しかし、Google Driveに戻るとメニューは英語
* 対処法は、一度言語を英語に設定してから、日本語に戻すこと

# どんなことが起きるか

Googleアカウントにおいて、言語を日本語に設定しているにもかかわらず、Google Driveのメニューが英語になっている。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/79744/597c2a1d-c4bf-80d5-8e4b-e855d6124042.png)

右上の歯車マークからSettingsを開く

![image.png](https://qiita-image-store.s3.amazonaws.com/0/79744/8824a0f0-620a-f674-76fc-b16c90e39f6d.png)

Languageの「Change language settings」を開くと、優先言語は日本語に設定されている。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/79744/f026c09e-53e8-5c78-8a45-3f28e0bd884c.png)

でも、「←」を押してGoogle Driveに戻るとメニューは英語のまま。

# 対処法

先の言語設定で、「他の言語を追加」を選ぶ。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/79744/bc7559a7-6061-4aa8-214d-3964f26ff088.png)

日本語以外の理解できる言語ならなんでも良いが、例えばEnglishのUnited Statesを選ぶ。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/79744/c95f8ff4-1dfa-eac9-d3f3-11e2c39b27b3.png)

英語が追加されたら、右の「↑」を押して、優先言語を英語にする。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/79744/e0e0e262-2ddc-bb5d-4945-23d1b3eec4b8.png)

表示が英語になったことを確認し、Google Driveに戻る。もちろん表示は英語のまま。

また歯車マークを押してSettingsからChange language settingsを開き、「日本語」の右にある「↑」をクリックすると、表示が日本語になる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/79744/104977b9-be19-1cc5-f60f-2f4624193150.png)

その状態でGoogle Driveに戻ると、メニューが日本語になる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/79744/55bc14ee-8b58-2f24-b0ee-2653a7425a3c.png)

一度メニューが日本語になったら、先程追加した英語設定を削除しても大丈夫だと思う(多分)。
Laravelで取りあえずメール送ってみるワンライナー

tinkerで下記を実行。

```php
Mail::raw('some text', function ($m) {$m->subject('test')->to('your-name@example.com');});
```

取りあえずメールが送られる

- 設定確認
- 疎通確認
- 迷惑メールチェック等に
raspberry pi 1でtensorflow lite その２

#概要

raspberry pi 1でtensorflow liteやってみた。
tfliteファイルの作り方を調査してみた。
４つの方法がある。

#環境

tensorflow 1.12

#tf.Sessionから作る。


```
import tensorflow as tf
import tensorflow.contrib.lite as lite

img = tf.placeholder(name = "img", dtype = tf.float32, shape = (1, 64, 64, 3))
var = tf.get_variable("weights", dtype = tf.float32, shape = (1, 64, 64, 3))
val = img + var
out = tf.identity(val, name = "out")
with tf.Session() as sess:
	sess.run(tf.global_variables_initializer())
	converter = lite.TFLiteConverter.from_session(sess, [img], [out])
	tflite_model = converter.convert()
	open("converted_model.tflite", "wb").write(tflite_model)
```

#freeze_graphなpbファイルから作る。


```
import tensorflow as tf
import tensorflow.contrib.lite as lite

graph_def_file = "/path/to/Downloads/mobilenet_v1_1.0_224/frozen_graph.pb"
input_arrays = ["input"]
output_arrays = ["MobilenetV1/Predictions/Softmax"]
converter = lite.TFLiteConverter.from_frozen_graph(graph_def_file, input_arrays, output_arrays)
tflite_model = converter.convert()
open("converted_model.tflite", "wb").write(tflite_model)
```

#高級APIのSavedModelから作る。


```
import tensorflow as tf
import tensorflow.contrib.lite as lite

converter = lite.TFLiteConverter.from_saved_model(saved_model_dir)
tflite_model = converter.convert()
open("converted_model.tflite", "wb").write(tflite_model)
```

#kerasモデルから作る。

```
import tensorflow as tf
import tensorflow.contrib.lite as lite

converter = lite.TFLiteConverter.from_keras_model_file("keras_model.h5")
tflite_model = converter.convert()
open("converted_model.tflite", "wb").write(tflite_model)
```

以上。
ServiceControlManager　イベントID　7000

お世話になっております。

```
Diagnostic Service Host サービスを、次のエラーが原因で開始できませんでした: 
サービスが適切に機能するために必要な特権が、サービス アカウント構成に存在しません。 サービス Microsoft 管理コンソール (MMC) スナップイン (services.msc) とローカル セキュリティ設定 MMC スナップイン (secpol.msc) を使って、サービス構成とアカウント構成を表示することができます。
```

とのエラーが出たのですが
どうやって解決して良いか不明なのでメモ失礼します。
Weekend Engineerのハッカソンで学んだこと等

WE代表の[渡辺大智さん](https://qiita.com/ahpjop)主催のハッカソンに参加してきました。
久々のチーム開発で学んだことや感じたことが多かったので、記録に残そうと思います。

# 概要
* オンライン参加可能のハッカソン  
参加者の内訳：オフライン11人、オンライン5人   
オンライン参加者とはDiscordでコミュニケーションをとる形式でした。
* チームの割り振り  
Python：計4チーム、Ruby on Rails：1チーム  
私はPython 4のチームで、メンバーは全員オフライン勢＆WEメンバーでした（まさかの全員内部）。
* 必須条件  
テーマ「クリスマス」、使用技術「Watson API」
* 開催期間と会場  
12/8（土）、12/9（日）の2日間 @渋谷のサポーターズさん

# スケジュール
## 全体
1日目
9:30：会場のサポーターズさんに集合
9:40：知的財産権の説明、テーマやチームの割り振りの確認等
10:00：各チームで作業を開始
23:00：会場から完全に退室


2日目（最終日）
9:00：会場が使用可能に（作業開始時間はチームごとに異なる）
18:00：作業終了、成果発表のプレゼン
19:00：審査員の方々からのコメント、結果発表
19:30：懇親会
21:00：解散

## チーム
1日目
10:00～12:00：アイデア出し
12:00～13:00：システムの処理フローを検討、役割分担
13:00：昼食後、各自開発開始
23:00：解散

2日目（最終日）
9:30：それぞれ作業再開
13:00：昼食
16:00：スライド作成に着手
18:00：成果発表へ

# 作品について
#### システム概要
「会話センシングによるBGM選曲」
<img width="664" alt="システム図.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/259787/6f620e36-e85e-e6a5-713b-672b1e39592c.jpeg">

これとは別に、以下のプログラムも実装しました。  

* 約400曲のクリスマスソングの歌詞をスクレイピングしてJSONファイルで保存する
* その歌詞を英語に翻訳して、感情分析を行う
* 感情分析の結果を、感情の種類別のディレクトリに保存する

#### 実装できた部分
* [自分の担当箇所（後述）](https://qiita.com/Mocchaso/items/251ab3b0efb9c4160c48/#自分の担当箇所)のうち、曲を再生する部分以外全て
* 約400曲のクリスマスソングの歌詞をスクレイピングしてJSONファイルで保存
* Speech to Text APIの導入

#### 間に合わなかった部分
* pyaudioを使い、実際の会話データからテキストを抽出する部分  
* Spotify APIでの検索結果から曲を再生する部分  
再生するデバイスの指定で正常にユーザ認証されず、時間内に解決しませんでした。

#### 自分の担当箇所
* 日本語のテキストを英語に翻訳する部分（Language Translator API）  
感情分析が日本語に対応していなかったため、急きょ英訳の処理を追加しました。
* 英語に翻訳された会話テキストを感情分析する部分（Tone Analyzer API）
* 感情分析結果のデータをディレクトリ別に自動で保存する部分
* Spotify APIを使い、会話の感情に合った曲を検索して再生する部分

# 良かった点
* アイデア出しをブレインストーミングで行ったこと  
こんな感じで、各メンバーのアイデアを体系的に整理することができました。
![アイデア出し_ブレインストーミング.jpg](https://qiita-image-store.s3.amazonaws.com/0/259787/e485521e-8af6-34bd-cfd7-514bf2615368.jpeg)
* 成果発表でスライドを準備したこと  
スライドを用意してプレゼンを行ったのは私たちのチームだけでした！
* それぞれの担当箇所の成果物をGitで共有したこと

# 反省点
* 成果発表までに、プログラムを実行できる段階にまで持って行くことができなかったこと。
* 自分の作業に集中しすぎたこと。  
メンバー同士で相談し合うことはありましたが、それでも少なかったと終わってから思いました。しつこいぐらい頻繁にメンバーのことを気にかけた方が良かった気がします。
* 分かりやすくコードを書こうとしすぎたこと。  
2日間と時間が限られているので、最適化はとりあえず二の次にするべきでした。
* Git管理の際、Macで必要なデータが.gitignoreに記載されていて不具合が生じたこと

# 結果
* 1位：Python 2チーム  
LINE履歴から最近の仲良し度を判定するシステム
* 3位：Python 1チーム  
LINE相手との会話カンペシステム（相手のツイートからどんなことを話したら良いかを提示してくれる）
* 3位：Python 3チーム  
クリスマップ（クリスマスツリーの写真の豪華度を判定するシステム）  
※最終的なゴール：Googleマップに、豪華度別のピンを置くところまで
* 5位：Python 4チーム  
会話センシングによるBGM選曲  
* 5位：Ruby on Railsチーム  
クリスマスプレゼントのレコメンドBot

# 審査員の方々のコメント
* あえて生活を不便にするようなものを作って人間と機械の上下関係を逆転させるなど、たまに発想を逆転させると面白い（のみさん）
* テクノロジーと実世界が密に繋がってる方が、リアリティがあって良い （野原さん）

# まとめ
Weekend Engineer代表の[渡辺さん](https://qiita.com/ahpjop)主催のハッカソンに参加してきました。
2日間で、会話センシングによるBGM選曲というシステムの開発に取り組ました。
時間内に完成せず結果は5位タイでしたが、役割分担やメンバーがお互いをカバーし合うことの大切さなど、結果以上に多くの学びがありました。
審査員の方々からのコメントでは、タメになるお話を伺うことができて刺激を受けました。
開発の楽しさを改めて感じた2日間でした。

主催の[渡辺さん](https://qiita.com/ahpjop)、会場提供のサポーターズさん、審査員を務めてくださったのみさん・野原さん、チームメンバーの[Shinさん](https://qiita.com/Taro000)・[中野さん](https://qiita.com/kageroupro44)、誠にありがとうございました！
Outlookで社外へのメール誤送信を防止する

#はじめに
社内あてに送ったメールに社外の人が含まれてるってよくありますよね。

・・・ぇ？無いですか。
そういうチェックが完璧な方は全然問題ないと思いますが、間違えて送ってしまうなんてことあると思います。
だってにんげんだもの。

そんな誤送信を防止する仕組みを考えてみました。

#参考にした記事
Outlookはよく使われているので、参考記事はそこそこ見つかりました。

[【誤送信防止】Outlookにて、社外秘メールの送り先に社外アドレスが含まれていないかチェック](https://qiita.com/mhara/items/fe15868e1e5e65bec14f)

[Outlookで宛先をチェック・制限するマクロ](http://magazine.re-web.org/outlook-atesakicheck/)

OutlookもVBAを動かすことができるので、送信のタイミングでドメインをチェックすれば社内・社外の判定ができそうです。

#LegacyExchangeDN (X.500)
と思ってさらっとマクロ改造して動かしたら、よくわからんアドレスが出てきました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/133206/e771e2bf-03b6-a933-f0a4-eba1f1782dc3.png)

Exchange環境下でのOutlookはSMTP形式(xxx@yyy.com)の一般的なメールアドレスではなく 
>/o=組織名/ou=管理グループ/cn=Recipients/cn=名前またはエイリアス

で示されるLegacyExchangeDNという形式で管理されるらしい。

[Exchange 環境における電子メール アドレス = LegacyExchangeDN](https://outlooklab.wordpress.com/2012/07/07/exchange-%E7%92%B0%E5%A2%83%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E9%9B%BB%E5%AD%90%E3%83%A1%E3%83%BC%E3%83%AB-%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9-legacyexchangedn/)

ということでExchange環境下も社内宛として、条件追加して以下の感じにマクロ作りました。


#コード
```vb
Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)

Const CHECK_DOMAIN = "xxx.com"  'ドメイン判定用
Const CHECK_EXCHANGE = "/o=exchangelabs/" 'LegacyExchangeDN判定用

Dim RECV_INFO As Object
For Each RECV_INFO In Item.Recipients
    Dim ATESAKI As String, DOMAIN As String, ATE_LIST As String
    If RECV_INFO.AddressEntry.Members Is Nothing Then
        'メールアドレス直接の場合
        ATESAKI = RECV_INFO.Address
        DOMAIN = LCase(Right(ATESAKI, Len(ATESAKI) - InStr(ATESAKI, "@")))
        If DOMAIN <> CHECK_DOMAIN Then
            If LCase(Left(ATESAKI, InStr(2, ATESAKI, "/"))) <> CHECK_EXCHANGE Then
                ATE_LIST = ATE_LIST & ATESAKI & vbCr
            End If
        End If
    Else
        '連絡先グループの場合
        Dim MEMBER As Object
        For Each MEMBER In RECV_INFO.AddressEntry.Members
            ATESAKI = MEMBER.Address
            DOMAIN = LCase(Right(ATESAKI, Len(ATESAKI) - InStr(ATESAKI, "@")))
            If DOMAIN <> CHECK_DOMAIN Then
                If LCase(Left(ATESAKI, InStr(2, ATESAKI, "/"))) <> CHECK_EXCHANGE Then
                    ATE_LIST = ATE_LIST & ATESAKI & vbCr
                End If
            End If
        Next MEMBER
    End If
Next RECV_INFO

If ATE_LIST <> "" Then
    Dim ALERT_MSG As String
    ALERT_MSG = "社外アドレス" & vbCr & vbCr & _
    ATE_LIST & vbCr & _
    "が含まれています。" & vbCr & "送信しますか？" & vbCr

    If MsgBox(ALERT_MSG, vbYesNo + vbExclamation) = vbYes Then

    Else
        Call MsgBox("キャンセルしました。")
        Cancel = True
    End If
End If

End Sub
```

#終わりに
![image.png](https://qiita-image-store.s3.amazonaws.com/0/133206/4bbd0740-5171-9ad0-c4a5-e7b8a9fc4c92.png)

先程のマクロを設定して社内ドメイン(Exchange含む)以外のアドレスに送信しようとすると、ポップアップでアラートを出してくれます。
これで気づかぬタイミングで社外に誤送信する事は減らせそうです。
tarコマンドの整理

# tarコマンド
## 概要
アーカイブファイルを作成するコマンド。
開発環境での差分を圧縮して、本番環境で展開することで本番反映などに利用できる。

## チートシート
### 圧縮
```
tar -czf NEW_ARCHIVE_FILE_NAME TARGET1 [TARGET2 TARGET3 ...]
```

### 展開
```
tar -xzf ARCHIVE_FILE_NAME
```

### 外部ファイルを参照して圧縮
#### 外部ファイル
```terminal:REFERENCE_FILE.txt

html/index.html
html/hoge.html
html/piyo.html
data/index.php
data/hoge.php
data/piyo.php
```
#### コマンド
```
tar -czf NEW_ARCHIVE_FILE_NAME -T REFERENCE_FILE.txt
```

## ひとこと
パーミッションを保って圧縮・展開を行う-pオプションというものが存在するようなのだが、
使い方がイマイチわからない。
知っている人いたら教えてください。
ローカル環境をスマホ実機(Android, iOS)で確認する方法

## 背景
業務でwebサイト(HTML,CSS,JS)を作成していて、PCのブラウザでデザイン(PC/SP)を確認しながら進めていました。
作業も終盤に差し掛かり、SPデザインの表示をスマホ実機を使用して確認したいとデザイナーから要望があった際にやったことのメモや詰まったことをまとめました。
※かなり簡単にできました。

## 目次
1.簡易的なwebサーバーの準備する
2.実機のブラウザにローカルホストのURLを入力する
3.詰まったこと


## 1.簡易的なwebサーバーの準備する
***http-server***というものがあります。
下記のような時に便利です。

webサイトにサーバーサイド（Ruby.PHP...etc)とかがなく
ちょっとした確認したいだけで、面倒な設定をやりたくない。

npmを使ってインストールできます。

```
npm install -g http-server　　　　　　// PCのグローバル環境にhttp-serverをインストール
```

これだけ。
続いて、作業しているディレクトリまで移動して。http-serverを立ち上げましょう。

```
$ cd [作業ディレクトリ]
$ http-server   // http-serverを立ち上げる
```
立ち上げるとポート番号やIPの情報が表示されます。こんな感じ↓
矢印のところに、IP（192.00.00.111みたいな)の情報がでてると思います。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/202225/3649e393-59d0-1864-6458-aae4466e1ae7.png)


## 2.実機のブラウザにローカルホストのURL入力する
スマホ（実機）でブラウザを開き。アドレスバーにURLを直に入力します。

> 例
> http://IP情報:ポート番号
> http://192.00.00.111:8080

これで、スマホ（実機）の画面にwebサイトが表示されると思います。

## 3.詰まったこと
wifiのルーターの設定でGuest用だと他の端末を認識できないみたいで
表示されませんでした。
wifiを切り替えたら表示されるようになりました。
ルーターの設定については、現場のネットワークの管理者に聞いて確認してみてください。

## 参考サイト
http-serverをインストールする際に、参考にしたサイト
https://utano.jp/entry/2018/02/npm-http-server/
Metalのシェーダーで転送した情報のうち、一部が欠ける

MetalでVertexShaderにマテリアルの情報を転送するために、以下のような構造体を定義してmakebufferしてからの、データをマッピングしたとき、２1個のマテリアル情報をセットしたのに、実際は17個分しか転送されなかった。

```
struct material
{
	float4 ambientColor;
	float4 diffuseColor;
	float4 specularColor;
	float specularPower;
};
```

以下のように構造体のByte数を無理やり16の倍数に変更すると正しく動作した。

```
struct material//計64Byte
{
	float4 ambientColor;// 4 * 4 = 16Byte
	float4 diffuseColor;// 4 * 4 = 16Byte
	float4 specularColor;// 4 * 4 = 16Byte
	float specularPower;// 4Byte
	float space1;// 4Byte
	float space2;// 4Byte
	float space3;// 4Byte
};
```

Metalへデータを転送するときに構造体を使用するときは、1つの構造体のByte数が16の倍数になるようにしないといけないみたいです。
AWS re:Invent 2018 Recap に参加して、個人的にさっそく使ってみたいと思ったサービスたち

# AWS re:Invent Recap とは
__AWS re:Invent__は、AWSが毎年12月頃に開催する、新サービスや新機能などの大々的な発表会イベント。
ラスベガスで開催され、いろいろな催し物などもあったりする盛大なAWS祭り。

Recapイベントは、スケジュールが合わない、会社から旅費が出ない、といった理由で現地のお祭りに参加できない人向け？に、
日本だと東京や大阪などの各地で、そのサマリーをお伝えしてくれるダイジェスト版なイベント。
半日がかりで、AWSのソリューションアーキテクトの方々が新サービスや新機能の概要を説明してくれる。

12/11に汐留で開催されたイベントは、立ち見が出るくらいたくさんの人がいた。

１アプリ開発者の目線から、使ってみたい！と思ったサービスを抜粋してメモっておく。

# Amazon Personalize
Amazon.comと同じアルゴリズムで簡単にレコメンド機能を使えるようになるサービス。
商品情報、ユーザー情報、購入履歴データをサービスに渡すだけで、
`getRecommendations()`的なAPIをすぐに使えるようになる。

ECサイトとか簡単にパワーアップできそう。

# Amazon Quantum Ledger Database (QLDB)
元帳データベースと表現されていた。
ブロックチェーンの仕組みを利用した、完全イミュータブルなデータベース。
１レコードの変遷が、前の状態のハッシュ値を保持していく形で、改竄不能な状態を実現。
データは追記のみで管理され、変更履歴が担保されるので、監査もどんとこい的な感じ。
SQLっぽい構文でアクセスし、トランザクションもサポート。

データの更新履歴とかをRDBで実装すると大変なので、それがとても楽になりそう。

添付の画像は、データの追加・更新・削除がどのように管理されるのかのイメージ。
![qldb.jpg](https://qiita-image-store.s3.amazonaws.com/0/263737/85c3dc89-7bcc-eac8-7851-f244d5081b85.jpeg)
（AWSイベントの公開資料より引用）

# Amazon Textract
OCRのパワーアップ版のような感じ。
ドキュメント、いわゆる帳票などの分析が主な用途。
テキスト抽出だけでなく、テーブルやフォーム、項目名と値のペアなど、いろいろな分析結果が取得できる。

注文書や請求書などを扱うような業務アプリに、とんでもなく便利な機能が付けられるかも。


# Amazon SageMaker Ground Truth
SageMaker自体は、機械学習の一連のプロセスをAWS上で行えるサービス。
機械学習の分野で`Ground Truth`とは、__真の正解__というような意味で、
この値を元に学習したり予測したりする。
このGround Truthを簡単に作成するための、GUI付きのSageMakerの拡張的なサービス。

Ground Truthの作成は、
例えば、ある画像に対して「この領域にあるのが車だよ」みたいなラベリングを
人間が手作業で行っていく感じ。

Amazon SageMaker Ground Truthなら、その作業人員もAWSがクラウドソーシングしてくれる。
自社で契約したベンダーや、社内などのプライベートなグループが作業することも可能。

日本語訳もされている分かり易いブログがあったので参考までに。
https://aws.amazon.com/jp/blogs/news/amazon-sagemaker-ground-truth/


# まとめ
全体的にAI・機械学習といった分野に力を入れている印象だった。
アップデート関連でも、
RestAPIでAuroraにアクセスできるData API for Aurora Serverlessや、
DynamoDBでトランザクション機能がサポートされるなど、
欲しいと思っていた機能がどんどんリリースされてきて、すごいな、と。

他にも、RoboMakerやDeepRacer、衛星用サービスGroundStationなんてのもあり、自動運転やら宇宙旅行やら、何でもAWSを使ってやる時代が来るのだろうか。
Pythonのasyncioではネストした同期関数の中でawaitを呼ぶことはできない

Pythonで以下の様な処理を考える。
f1は引数として関数を受け取り、文字列をprintしたあとにその関数を実行する。

（Python3.7.0で確認）

```py
import time

def f1(termination):
    print("[f1] start")
    termination()
    print("[f1] done")

def main():
    f1(lambda: time.sleep(1.0) )

main()

# 実行結果
# [f1] start
#  ... １秒まつ ...
# [f1] done
```

さて、この処理をasyncioを使って書き直してみる。次の様になる。

```py
import time,asyncio

def f1(termination):
    print("[f1] start")
    termination()
    print("[f1] done")

async def main():
    f1(lambda: time.sleep(1.0) )

asyncio.run(main())
```

ここでの変更点は

- `main`, `f1`の定義に `async` をつけ、coroutineを返す関数(coroutine function)にする。
- `main()`を呼ぶ部分を`asyncio.run(main())` で置き換える

の２つである。最初のコードと全く同じ様に動作する。

さて、ここでf1に引数で渡している関数の中で`await`したいとしよう。
実は次のように書くとうまくいかない。

```py
import time,asyncio

def f1(termination):
    print("[f1] start")
    termination()
    print("[f1] done")

async def main():
    f1(lambda: await asyncio.sleep(1.0) )

asyncio.run(main())
```

```
  File "nest2.py", line 9
    f1(lambda: await asyncio.sleep(1.0) )
              ^
SyntaxError: 'await' outside async function
```

これは、awaitを行なっているのが同期関数（普通のdefで定義された関数）の中だから。これを適切に動かすためには、以下の様にf1もcoroutineにする必要がある。

```py
import time,asyncio

async def f1(callback):      # asyncをつけた
    print("[f1] start")
    await callback()         # awaitをつけた
    print("[f1] done")

async def main():            # asyncをつけた
    async def callback():
        await asyncio.sleep(1.0)
    await f1( callback )     # awaitをつけた

asyncio.run(main())
```

f1が通常の（同期）関数の場合にはどんなに頑張ってもその配下で`await`を呼ぶことはPythonの文法的に不可能となっている。

`main`はcoroutineで、f1はその中でしか呼ばれないので必ずcoroutine内で呼ばれているのであるが、`def`を使った処理の中では`await`を呼ぶことはできない。

## この文法が問題になるケース

実はこの文法が問題になるケースがある。
上記のような簡単な場合は、おとなしくf1にも`async`をつければいいだけだが、f1が何重にもネストしているようなライブラリの関数だったとする。
その場合、ネストしている関数すべてに`async`をつけて、その呼び出し部分すべてに`await`をつけなくてはいけない。（例えば`"main"->"f1"->"f2"-> .... -> callback` と呼ばれる様な場合は、ネストしているすべての関数の変更が必要。）

（雑感）awaitがあるときにネストした先からイベントループに処理を戻せばよいので、処理系の実装上はできても良さそうなものだが、Pythonの文法をデザインする段階でこういう方針が取られたようだ。残念。javascriptの場合はPromise()が帰ってくるだけなのでネストした先でもawaitできる（と思う）
Amazon Linux AMI に SWAP を作るコマンド


毎回、毎回、超手抜きコマンド一覧です。

ひとまず 1GB。
変更したい場合は `count=1024` の部分を変更。単位は MB。

スワップファイルの保存先は `/swapfile` に設定。変更する場合は、各業の文字列を変更してください。

```
sudo dd if=/dev/zero of=/swapfile bs=1M count=1024
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
sudo sed -i -e "$ a /swapfile   swap        swap    defaults        0   0" /etc/fstab 
```

## SWAP ファイルを増量する方法

SWAP ファイルを作り直します。

```
sudo swapoff /swapfile
sudo dd if=/dev/zero of=/swapfile bs=1M count=2048
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
```
decomposeMatrixノードを使う

# 準備
decomposeMatrixはmatrixNodesというプラグインに含まれています。
ですのでloadPluginをする必要があります。
## matrixNode をloadする
```python:loadPlug.py
import pymel.core as pm
pm.loadPlugin("matrixNodes")
```

# 実際に使ってみる!

さて、decomposeMatrixはどんなことに使うことができるのでしょう？
数ある使用目的から、一つの例として説明していきます。

## 頭部matrixをdecomposeMatrixにコネクションしてみる
![2018-12-12_10h21_59.png](https://qiita-image-store.s3.amazonaws.com/0/324697/363dcf3c-4b2c-7f33-1fd7-abeb3cf94f64.png)

図のようなジョイントが存在している状態にて、
test_dMという名前のdecomposeMatrixを作成。

```
pm.createNode("decomposeMatrix", n="test_dM")
```

ノードエディターでは下の図のように
head_prxというノードのworldMatrixから"test_dM"(decomposeMatrix)ノードへコネクション
![2018-12-12_10h26_55.png](https://qiita-image-store.s3.amazonaws.com/0/324697/ad7f4fcc-114f-53bc-160f-49c041ece524.png)

head_posというlocatorを用意します
このノードに"test_dM"(decomposeMatrix)のoutputTranslateをコネクションしてみると...

![2018-12-12_11h24_31.png](https://qiita-image-store.s3.amazonaws.com/0/324697/3378c667-9c72-650d-a21d-8c8c3e8c610c.png)

head_posというlocatorがhead_prx(joint)と同じ位置になります。

初回は、locatorに対してコンストレインの代わりとして使える、といったお話でした！

初めての投稿でしたが、落ち度がないかすごく心配(ハラハラ...)。
ご指摘等ご意見ありましたらご連絡くださいませ。。。
[メモ]PowerPointで利用できるAzureのシンボル

2919/12/12追記:現在最新版は9/11更新です。
CosmosDBの惑星にハートっぽいマークがついています。
最近ポータル上のアイコンがあたらしくなったのでまた変わるかも！


Azureの提案の際にかっこいいアイコン使いたい。。

先輩たちみたいのようにカッコイイ構成図が作りたーーい！:panda_face:


こんな感じの構成図を作りたいけど画像ないとつらいです・・:sob:切実

![dmz-private.png](https://qiita-image-store.s3.amazonaws.com/0/297303/a5edf123-8eaa-6e71-4ac4-114f3add14d5.png)

みんな使っているのできっとどこかにあるはず・・
ということでお前はパワポエンジニアかと先輩バカにされながらｗ調査してみました(･◇･ゞ



# Azureのシンボル

聞く前にまずはネット検索。ということで検索してみると・・
ザクザク情報出てくるではないか！これQiitaに書く必要なくね？
と思いながらもQiitaの練習もかねてまとめますね。

- [Azure, AWS, etc.. のicon。構成図やプレゼン資料作りに使うやつ](https://qiita.com/nntsugu/items/0e10a34a6c0ff6922da4)

=>古い資料ですがAWSやChef etcのアイコンもあるのよいです。


#Azureシンボルのダウンロード方法

超簡単ですが、下記サイトからダウンロードできます。

- [Microsoft Azure、クラウドおよびエンタープライズ用シンボル/アイコン セット](https://docs.microsoft.com/ja-jp/azure/architecture/resources/diagrams)

- [Microsoft Azure, Cloud and Enterprise Symbol / Icon Set - Visio stencil, PowerPoint, PNG, SVG](https://www.microsoft.com/en-us/download/details.aspx?id=41937)



フォルダ内の```IMPORTANT CnESymbols Instructions v2.7.docx```に利用方法が記載されています。
利用可能なフォーマットは

- **Visio Stencil (.vss)**
  (透明背景と白背景が用意されています)
- **PNG**
- **SVG**

です。
PowerPoint file(.ppt)では提供されていません:cry:
Why?Visioなんてないしないと困っちゃいます:cold_sweat:

ではPPTで利用するにはどのように利用すればよいでしょうか?

# PPTで利用するには?

ドキュメントを読み進めるとPPTでの利用については下記記載がありPNG、SVGをドラッグ&ドロップで簡単にできるぜ！と書いてありました。

実際にドラッグ&ドロップすると簡単にできました:relaxed:

>**PowerPoint file (.ppt)** – We no longer ship a PowerPoint file because it is very easy to get the symbols into PowerPoint yourself. It’s likely faster to search for a symbol in a folder than through PowerPoint. You can also drag and drop symbols directly from Visio or the Visio stencil with the same effect. See instructions later in this document. 

これでカッコイイ提案書の作成に一歩近づきました💛
UnityのAssetからのImportPackageがないとき

Unityを学んでいたらよくある
「Asset>ImportPackageから～」という表記
うんうんと言って開いていると
![Unitydfas.png](https://qiita-image-store.s3.amazonaws.com/0/262130/cf447171-4a4f-ff04-267c-2e9ee4d316b1.png)

## ないじゃん！CustomPackageしかないじゃん！
となるので
調べてみました。

http://tsubakit1.hateblo.jp/entry/2015/06/26/232958
ここに
「Unity 2018.2?からなくなったぽいです。
この場合、AssetStoreから入手する必要がありそうです。」
と書かれていました
なるほど。そうしたらAssetStoreからダウンロードしよう

https://assetstore.unity.com/packages/essentials/asset-packs/standard-assets-32351
![sdafasd.png](https://qiita-image-store.s3.amazonaws.com/0/262130/96e949a4-5270-39d3-5532-25f883b51add.png)

多分これ

Add to my assetして、すべてimportをする
projectに入っているのを確認したら
![fsafas.PNG](https://qiita-image-store.s3.amazonaws.com/0/262130/777b9388-a0cb-728d-4c99-a5d54e573364.png)

これでOK
このファイルを何度も使いたいとき、ダウンロードしたUnityPackageのなかのAssetsの中にStandard Assetというものがある。それを「Unityのアセット集」みたいなファイルを作って保存すると何度もAssetStoreからダウンロードする必要がなくなる。
【EFCore2系】UseInMemoryDatabaseではTransactionが使えない

# 【EFCore】UseInMemoryDatabaseではTransactionが使えない
EntityFrameworkCoreの2系ではTransactionが張れない場合があります。
対象ライブラリ: Microsoft.EntityFrameworkCore 2系
https://www.nuget.org/packages/Microsoft.EntityFrameworkCore/

## 概要
タイトル通りの内容です。

## 発端
ユニットテストを組んでいた時、以下のようなメッセージと共に例外を吐きました。

```
Outcome: Failed
Error Message:
System.InvalidOperationException : 
Warning as error exception for warning 'Microsoft.EntityFrameworkCore.Database.Transaction.TransactionIgnoredWarning': 
Transactions are not supported by the in-memory store. 
See http://go.microsoft.com/fwlink/?LinkId=800142 To suppress this Exception use the DbContextOptionsBuilder.ConfigureWarnings API. 
ConfigureWarnings can be used when overriding the DbContext.OnConfiguring method or using AddDbContext on the application service provider.
Stack Trace: {以下スタックトレースのため省略}
```

## 分析
分析も何もなかったです。
全てメッセージに書かれていました。
かつ、ググったらIssueが出てきました。
https://github.com/aspnet/EntityFrameworkCore/issues/2866
原因は以下のコード、

```c#
options.UseInMemoryDatabase()
```
「UseInMemoryDatabaseではTransactionが使えない」みたいです。（タイトル回収）

## 解決方法
ConfigureWarningsを使用して対象のExceptionが吐かれないように出来ます。
（Transactionは張られないようです。）

```c#
options
    .UseInMemoryDatabase()
    .ConfigureWarnings(w => w.Ignore(InMemoryEventId.TransactionIgnoredWarning))
```

## まとめ
ロールバックに関するテストを行う場合は別途テスト用のデータベース環境を用意する必要があります。
ただ、それをテストする必要があるかは別問題。
AWS Cloud9のLambdaデプロイ先を東京リージョンに変更する方法

AWS Cloud9は2018年12月現在でも東京リージョンでリリースされていませんが、Cloud9のLambda連携機能を使う時のデプロイ先は、東京リージョンに変更できます。

Lambda関数をデプロイするリージョンは、IDEのPreferencesより変更できます。
この画面でAWS Regionを東京リージョンとすれば、例えばシンガポールリージョンの環境のIDEからでも、東京リージョンにLambda関数をデプロイできます。
# Lambdaデプロイ先を東京リージョンに変更
(1) 以下のメニューを開いて「Preferences」を押します。
![cloud9_tokyo0.png](https://qiita-image-store.s3.amazonaws.com/0/211986/fa5ea1f1-a158-e410-34c6-0540488458a5.png)
(2) 「AWS SETTING」の中にあるAWS Regionに、東京リージョンを選択します。
![cloud9_tokyo.png](https://qiita-image-store.s3.amazonaws.com/0/211986/6cabdfee-4e51-fd96-39b1-a27a057a747e.png)
以上で完了です。
# 参考文献
[AWS Cloud9 Integrated Development Environment (IDE) で AWS Lambda 関数を操作する > ステップ 4: Environment を正しい AWS リージョンに設定する](https://docs.aws.amazon.com/ja_jp/cloud9/latest/user-guide/lambda-functions.html#lambda-functions-prepare-region) - AWS公式ドキュメント
AWSでFreeBSDを使う(その２）

その１を変な所で切ってしまいましたが、その２です。

#その１での手順は、FreeBSDのAMIを選択する以外は、Linuxと変わりありません。

インスタンスの作成中となっていますが。あの画面から作成しましたになったのは見たことが無いです。(私がせっかちなのかもしれません)

<img width="804" alt="スクリーンショット 2018-12-12 14.34.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/46046/e947893b-944b-4707-e8af-34ae2ed9b26e.png">

EC2のダッシュボードで、リソースの表示に
この様になってるはずです。

この、実行中のインスタンスをクリックします。

<img width="829" alt="スクリーンショット 2018-12-12 14.39.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/46046/30f7de4b-f626-5455-68a3-4d2ab069d587.png">

この様な表示が見られるはずです。
このパブリックDNSの下の、IPV4パブリックIPにSSHします。

slogin ec2-user@xxx.xxx.xxx.xxx -i 秘密キーファイル 

で、接続できます。

この状態で、普通のFreeBSDサーバになります。

デフォルトでntpを参照する様になっていますので、時計が狂う心配はありません。

<img width="728" alt="スクリーンショット 2018-12-12 14.54.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/46046/6403bdaf-b99b-af0a-0164-b4a33b96917e.png">

インスタンスを作成した時につけられるパブリックIPは、再起動すると変わってしまいます。

そこで、固定IPをつけます。
<img width="1034" alt="スクリーンショット 2018-12-12 14.58.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/46046/2b5988eb-444b-8fb0-8e65-06235c872c7e.png">

Elastic IPと言うメニューを選択してください。

[新しいアドレスの割り当て]をクリックします。
<img width="1023" alt="スクリーンショット 2018-12-12 14.59.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/46046/a1bcfd50-24c6-1da1-4b65-b2ec60a87129.png">

[割り当て]をクリックします。
<img width="1018" alt="スクリーンショット 2018-12-12 15.00.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/46046/9601dd21-c915-87d4-10b0-842da489eb72.png">

ここで、固定IPアドレスが、発行されました。
しかし、発行されただけで、まだサーバーとは紐づいてはいません。

[閉じる]クリックします。
<img width="838" alt="スクリーンショット 2018-12-12 15.04.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/46046/7becd3b0-acf2-e1ac-5fc3-c2748d3b9c6a.png">

[アクション]をクリックします。

<img width="492" alt="スクリーンショット 2018-12-12 15.05.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/46046/2f58ca1f-e9ef-d8fb-3c2d-7d972913fa80.png">

アドレスの関連付けを選択します。

<img width="1028" alt="スクリーンショット 2018-12-12 15.06.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/46046/30c23d30-cc69-2387-1b26-91a04abcd906.png">

インスタンスを選択して、[関連付け]をクリックします。

<img width="1011" alt="スクリーンショット 2018-12-12 15.07.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/46046/01f20fbe-4762-d3c3-1f54-284a3e4eff41.png">

ここから先は、物理サーバにインストールしたのと同じ考えで問題ありません。
一緒に働くエンジニアに聞いてみた”フォトクリの魅力”（Photocreate Advent Calendar 14日目 ）

この記事は [Photocreate Advent Calendar 2018](https://qiita.com/advent-calendar/2018/photocreate) の 14日目です。
[スナップスナップ](https://snapsnap.jp/)のサービスデザインに携わっている@koiwaiです。

当社では多様な雇用形態のエンジニアが約20名働いています。（2018年12月現在）
働いているからこそ分かる、その会社の魅力ってありますよね。
今回は、仲間のエンジニアに、フォトクリエイトの魅力についてアンケート&インタビューしてみました。

##概要

1.アンケート結果”フォトクリの魅力 ベスト5”
2.インタビュー
　　〜雇用形態関係なく、裁量を持って仕事ができ、評価してもらえる〜
　　〜トレンドの技術に関われるチャンスが多い～
　　〜公私の責任を全うするための、自由な働き方を模索できる〜


##アンケート結果”フォトクリの魅力 ベスト5”
まずは、フォトクリエイトで働くエンジニアにアンケートを実施しました。
Q.フォトクリの魅力/働き続けているポイントは何ですか？

1位　自由な働き方を許容してもらえる
2位　雇用形態関係なく、自分の裁量で仕事ができる
3位　トレンドの技術に関われる機会がある
4位　人間関係がよい
5位　リスペクトできるエンジニアがいる

##インタビュー
アンケート結果の上位にランクインした内容について、2名が語ってくれました。

1人目は、責任感の強さと主体性のある仕事ぶりで周りからの信頼が厚い、サーバーサイドエンジニアのMさん。

### 〜雇用形態関係なく、裁量を持って仕事ができて評価してもらえる〜

@koiwai：
Mさんは2017年から業務委託としてジョインしたんですよね。
フォトクリに来て魅力に感じたことや、働き続けてくれているポイントを教えてもらえますか？

M：
1つは、雇用形態関係なく自分の裁量で仕事ができて、頑張れば評価してもらえるところですね。
例えば、他の会社では、業務委託は決められた時間内に確実に抑えることが重要で、与えられた作業の範囲外の仕事は認められないケースもあります。でも、フォトクリは「自分が対応できそうで他のエンジニアがやると時間がかかりそうな仕事」を先に拾って対応したり、プラスアルファの提案をすることも柔軟に受け入れてくれる風土があります。自分がやり遂げたい仕事があってパフォーマンスを出せば、それに応じて評価もしてくれます。業務委託の自分が全社表彰をしてもらえたのは驚きましたね。
意欲があって積極的な人にはやりがいのある会社だと思います。

@koiwai ：
確かに「社員と業務委託の方に垣根がない」ことは他のメンバーからもよく聞きますね。権限や責任は別の話として、顧客体験価値の向上を一緒に目指す仲間として雇用形態は特に関係ない、という風土がありますよね。

私もMさんと同じチームで仕事をさせてもらっていますが、いつも問題が起きた時のスピーディな対応や、課題に対して先回りして提案してくれる姿勢をとても信頼しています。
組織としてQCD(Quality Cost Delivery)の観点も重要視していますが、そのバランスが崩れない提案をしてくれるところや、普段の仕事ぶりでの信頼の厚いMさんだからこそ、きっと双方にとってWin-Winなのでしょうね。

### 〜トレンドの技術に関われるチャンスが多い～

M：
それから、流行っていたりこれから流行りそうな技術に関われるチャンスが多いのも、エンジニアにとって魅力を感じるポイントです。
Laravel・Nuxt.js（Vue.js）・Golang・AWS・Pythonなど…自分が関心を持っている技術を取り入れているプロジェクトが多く、アサインされたらその技術が身に付けられることも、フォトクリで働くのが面白いポイントですね。また、技術的な知見があり方針決定に関わる、複数の優秀なエンジニアの存在がいる環境も刺激的です。

---
続いて2人目は、派遣で入社後正社員登用され、数々の重要案件で活躍中のサーバーサイドエンジニアのK。自由な働き方の先駆者として様々なワークスタイルに挑戦していることについて話を聞きました。

### 〜公私の責任を全うするための、自由な働き方を模索できる〜

@koiwai：
私たちの組織の社員の大半は裁量労働制ですが、大体同じ時間帯に出社して勤務しているメンバーが多いですよね。そんな中、Kさんはここ1年くらいリモートワーク・時間前倒し出社など、様々なワークスタイルで仕事をしていますよね。
どんなきっかけがあったんですか？

K：
きっかけは、子どもを保育園に入れたばかりのタイミングに、妻が体調を崩して安静にしないといけなくなったためです。小さい子どもの世話は結構重労働なので、それをフォローしたかったんです。家族のケアの前後に、仕事ができたらいいなと思いました。

また以前から、プロジェクトのフェーズや仕事のボリュームによって、自分の力を最大限発揮できる場所・時間帯などを考えると、オフィスで仕事をするのが必ずしもベストではないのでは？と思っていたので、それを試したいとも思いました。

上司にリモートワークの相談をしたところ、家庭の状況を理解し、快く承諾してもらえてとてもありがたかったです。

@koiwai：
ただでさえ、妻の仕事復帰後1~2年目って、色んな問題が勃発して大変なご家庭が多いじゃないですか。そんな中、本当に大変でしたね…。
最近は、時間前倒しで早朝から出社していますよね。

K：
はい、リモートワークもメリット・デメリットがあるので、今は7:30～16:30で出社するスタイルで勤務をさせてもらっています。
妻の会社の退社時間だと保育園のお迎え時間に間に合わないんです。なので、比較的仕事内容や職場の理解の点で柔軟な対応ができる、僕がお迎えに行くことにしました。

お迎えに行って世話をして、妻が帰ってきた頃にバトンタッチして、家で残りの仕事をすることもあります。また、家族の体調不良で看病が必要な時などは、リモートワークをしたりと、状況に応じて切り替えています。

@koiwai：
Kさんと私は共働き子育て仲間としてよく情報交換をしている仲ですが、話を聞くたびに、かなり主体的に育児参加されていて本当にすごいなーと思っています。公私ともに踏ん張らなくてはならない時期に、家庭の状況変化に対応しつつ自身の仕事のパフォーマンスを維持できるよう、先駆者として働き方を模索している姿を、心から応援しています。

K：
それができるのも、上司や同僚の理解があるからこそですね。家庭でケア責任が生じた時に、自分の公私の責任を全うできる働き方を、状況に応じて柔軟に選べるのはうちの会社の魅力の1つだと思います。


##さいごに
いかがでしたか？
それぞれ大切にしたいことがあり、それを実現できる環境のある当社に魅力を感じている、2名の話をご紹介しました。

「こんな職場で働きたい」と思った方からの、[ご応募をお待ちしております。](https://recruit.photocreate.co.jp/entry/?utm_source=qiita&utm_medium=advc2018&utm_campaign=29ed83be82eea2b675f7)
ogr2ogrでMySQLにシェープファイルをインポートした際に発生したエラーは文字コードをUTF-8に変換することで回避出来ました

# はじめに
本記事は [FOSS4G Advent Calendar 2018](https://qiita.com/advent-calendar/2018/foss4g) の12日目です。

# FOSS4G 2018 TOKYO で発表した内容について
FOSS4G 2018 TOKYO で「[MySQL 8.0で強化されたGIS機能のご紹介と周辺ツールとの連携について](https://www.slideshare.net/yoyamasaki/mysql-80gis/)」という内容で発表しました。

この発表の中で、MySQL 8.0 のGIS機能について紹介したり、ogr2ogrを使ってMySQL 8.0へシェープファイルをインポートできることなどを紹介しました。

ただ、シェープファイルのインポート時に文字化けによるエラーが発生したケースもありましたので、その点について補足します。

# 前提
・MySQL 8.0
・GDAL 2.3.2

# MySQL 8.0へシェープファイルをインポートする手順
[こちらの発表資料](https://www.slideshare.net/yoyamasaki/mysql-80gis/29)のデモ手順を参照して下さい。

# インポート時にエラーが発生したシェープファイルの例
[e-Stat](https://www.e-stat.go.jp/)からダウンロードできるシェープフィルの「北海道全域」、「東京都全域」などのシェープファイルでエラーが発生しました。

「沖縄県全域」のシェープファイルでは、エラーが発生しませんでした。

[e-Stat](https://www.e-stat.go.jp/)からは、以下のリンクをたどることでシェープファイルをダウンロードできます。また、シェープファイルのダウンロード手順は、[こちらの動画](https://www.youtube.com/watch?v=2eBWFQizBjU)でも解説されています。

　■e-Statからシェープファイルをダウンロードする手順
　　地図で見る ⇒ 境界データダウンロード ⇒ 小地域 ⇒ 国税調査 ⇒ 2015年 ⇒ 小地域（町丁・字等別） ⇒ 世界測地系緯度経度・Shape形式

# エラーを回避する方法
MySQLへインポートしたいシェープファイルを一旦QGISで開き、文字コードをUTF-8に変換して保存することで、エラーを回避できました。なお、元のファイルの文字コードはSHIFT-JISでした。

# この関連するissue
この問題に関連するissueとして、以下を登録しました。

　ogr2ogr with MySQL 8 (Shape file import error) #1089
　https://github.com/OSGeo/gdal/issues/1089
Brainfuck 超入門

[LIFULL Advent Calendar 2018](https://qiita.com/advent-calendar/2018/lifull)の13日目です。

どんなことを書こうか悩んだ挙句、Brainf*ckの事でも書こうかなと思い立ちました。
なぜBrainf*ckなのかと言うと、面白いから。以上です。
特に深い理由もなくBrainf*ckのソースコードを書いて何かするのが楽しいので、
それを他の人にも共有できれば良いかなと

とりあえずBrainf*ckの入門書的なものを書こうと思います。
この記事を読んだみなさんがBrainf*ckへの興味を持ってくれると嬉しいです。

## Brainfuckとは
プログラミング言語です。
また、難解プログラミング言語(esolang)の代表格です。
Brainf*ckのように伏字で表記されることもあります。あんまりf*ckだらけになってもあれですしね。
後述しますが、実行できる命令が8種類しかありません。
~~実用性は皆無です。~~とても特徴的な言語です。

## 言語の仕様
さっそく実装に移りたいですが、その前に仕様を確認しましょう。
Brainfuckでは配列が用意され、その配列の要素を指すポインタと要素の値を操作していきます。
また、Brainfuckには以下の8種類の命令しかありません。
その他の文字は無視されます。
リファレンスを漁る必要がないですね。


| 文字 | 動作 |
| --- | --- |
| > | ポインタをインクリメント （右にずらす） |
| < | ポインタをデクリメント (左にずらす） |
| + | ポインタの値をインクリメント |
| - | ポインタの値をデクリメント | 
| . | ポインタの値を出力 |
| , | 入力から1バイト読み込んで、ポインタが指す値に代入 |
| [ | ポインタの指す値が0なら、後の]までジャンプ(要するにwhile) |
| ] | ポインタの指す値が0でなければ、前の[までジャンプ |

## 実行環境
まずはBrainfuckの実行環境です。
[こんなもの](https://fatiherikli.github.io/brainfuck-visualizer/)もあったりしますが、
おもむろに

```shell-session
$ brew install brainfuck
```

を実行します。
するとBrainfuckのインタプリタが使えるようになります。

インタプリタについての詳しいことは、↓です
https://github.com/fabianishere/brainfuck

さて、お待ちかねのソースコードを書きましょう。

## まずは簡単に`ABC`と出力するコードから

```none:abc.bf
++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++.+.+.>++++++++++.
```

そして実行

```shell-session
$ brainfuck abc.bf
ABC
```

簡単ですね。
簡単ですが、少し解説すると、
1行目は`+`が40文字あるので、ポインタの指す値を40回インクリメント
2行目も最初の方で`+`によって25回インクリメントしているので、
ポインタの指す値は65になっています。
その後の`.`によって出力されるので`A`が出力されます。(ASCIIコードの65は`A`です)
そして`+.`が連続で実行されるので`BC`が出力されます。
最後の方で`>`によってポインタを1つずらして(ポインタの指す値は0になります)、値を10回インクリメントして出力(改行を出力)しています。

## Hello World! してみる
さて、プログラミングといえばHello World!ですよね。
ということでやってみます。
上で書いたABCを出すコードは本当に入門というか効率が悪いコードだったので、
今度は`[]`を使って効率を考えてコードを書いてみます。

コードはこちら

```none:hello_world.bf
+++++++++[>++++++++>+++++++++++>+++>+<<<<-]>.>++.+++++++..+++.
>+++++.<<+++++++++++++++.>.+++.------.--------.>+.>+.
```
一気にBrainfuck感がでました。
そして実行結果

```shell-session
$ brainfuck hello_world.bf
Hello World!
```

ここまでくればもう立派なBrainfuckerですね。

Hello World!のコードを全部解説すると長くなるので、
`[]`についてだけ少し解説しようかと思います。
`[]`はwhile文に相当するものです。

次のコードがあったとします。

```
[+]
```
これをC言語で表現すると、

```c

while(*p) {
  (*p)++;
} 
```
このようになります。
要するに現在のポインタの指す値にインクリメントし続けるコードです。

次のコードはどうでしょう

```
+++[-]
```

これは、書き下すと少しわかりやすくなるかもしれません

```
+++
[
  -
]
```

C言語で書くと

```c
(*p)++;
(*p)++;
(*p)++;
while(*p) {
  (*p)--;
}
```
のように表せます、あってますかね？
動作の説明がしづらいですが、簡潔にまとめると、3回回るfor文です。

ここで、もう一度コードに戻りましょう。
もうどんなことをやっているのか読めるようになっているはず！

```none:hello_world.bf
+++++++++[>++++++++>+++++++++++>+++>+<<<<-]>.>++.+++++++..+++.
>+++++.<<+++++++++++++++.>.+++.------.--------.>+.>+.
```

1行目の`+++++++++[>++++++++>+++++++++++>+++>+<<<<-]`の部分で9回ループを回してその中でインクリメントすることで、9×N回のインクリメントを済ませます。
その後はよしなにして出力するだけですね。

## 最後に
Brainfuckの面白さを伝えきれていない感がありますが、大丈夫ですかね。
基本的な処理の流れさえわかってしまえば、パズルのように実装できるので、ハマると面白いです。
ぜひ皆さんもBrainfuckerになってみてください。

## 参考サイトとか
- https://fatiherikli.github.io/brainfuck-visualizer/
    - Brainfuckのインタプリタです
    - 動作の流れがとてもわかりやすいです
- https://esolangs.org/wiki/Brainfuck_algorithms
    - Brainfuckで実装したアルゴリズム集です
Cloud Shell環境を使ってCloud Shellのベースイメージを変更する

この記事は Google Cloud Platform その１ Advent Calendar 2018 の15日目の記事です。
なんだかんだでQiita初投稿となります(アドベントカレンダーが初って人も珍しい気が…)。

弊社内にてGCP上でAnsibleとTerraformを用いたハンズオンを実施している際、「AnsibleとTerraformをはじめからインストールしている環境が欲しい」という意見をいただきました。(内容については[弊社内ブログ](https://www.niandc.co.jp/sol/tech/date20181022_1701.php)にて公開しております。)
ハンズオンはCloud Shellを利用していましたので、いつの間にかアルファ版として実装されていたCloud Shell環境を利用してコンテナイメージを作成してみます。

# Cloud Shell環境の確認
Cloud Shellを開き、右上にあるアイコン一覧の一番左にあるモニターアイコンをクリックします。
![CloudShell環境1.PNG](https://qiita-image-store.s3.amazonaws.com/0/283423/127add07-c10a-08b2-b1e6-da038e64709a.png)

クリックするとCloud Shell環境の画面が新規タブでCloud Shell環境が開きます。
![CloudShell環境2.PNG](https://qiita-image-store.s3.amazonaws.com/0/283423/97a9ca20-db48-1767-37cf-1641e48534a3.png)


# Cloud Shellコンテナの作成
早速コンテナを作成します。
手順は以下の通りです。  

1. カスタムイメージの作成よりイメージを作成する
2. Dockerfileを編集する
3. イメージが作成されるので確認する

## カスタムイメージの作成よりイメージを作成する
「カスタムイメージの作成」から、「新しいカスタムイメージを作成」をクリックします。

![CloudShell環境2.5.PNG](https://qiita-image-store.s3.amazonaws.com/0/283423/6d02bb45-0bc2-7816-c455-314f982717af.png)


今回は以下のように作成します。

| 項目名 | 設定値 |
|:-:|:-:|
| イメージストレージ用のプロジェクト  | 作成するプロジェクト名  |
| イメージ名  | ansible_terraform  |

またチェックについては両方にチェックをつけ、「作成」ボタンをクリックします。

![CloudShell環境3.PNG](https://qiita-image-store.s3.amazonaws.com/0/283423/030f8159-bf94-9436-2d4b-975e9a3ab6e3.png)



※必要なAPIが許可されていない場合、「APIを有効にしてください」と表示されるため、APIを有効化します。

![CloudShell環境3-1.PNG](https://qiita-image-store.s3.amazonaws.com/0/283423/839b8113-8a29-c7c1-be48-35207a556ee2.png)


## Dockerfileを編集する
作成が終わると、gitリポジトリのクローンを確認されるため、続行をクリックしてリポジトリを作成します。
リポジトリ作成後、Dockerfileが表示されます。

![CloudShell環境4.PNG](https://qiita-image-store.s3.amazonaws.com/0/283423/13a76fc9-a8f0-3868-dc84-d54748493db8.png)


Dockerfile内に以下ソースを追加します。

```Dockerfile
RUN wget https://releases.hashicorp.com/terraform/0.11.8/terraform_0.11.8_linux_amd64.zip
RUN unzip terraform_0.11.8_linux_amd64.zip -d /usr/local/bin
RUN pip install ansible
```

作成後、gitリポジトリにaddします。

```bash
git add Dockerfile
git commit -m "edit Dockerfile"
git push origin master
```

pushすると、自動でCloud Buildが走ってDockerイメージを作成してくれます。すごいですね…。

![CloudShell環境6.PNG](https://qiita-image-store.s3.amazonaws.com/0/283423/f0cd3046-3de0-7071-7b5b-9753016e59e9.png)

作成は10分程度で終わります。作成終了後、Cloud Shell環境より[編集]をクリックします。
環境の編集にて、「プロジェクトからイメージを選択する」を選択します。

![CloudShell環境7.PNG](https://qiita-image-store.s3.amazonaws.com/0/283423/fa8214e4-8ef5-a596-8017-29454addb0c2.png)

イメージを選択から、先ほど作成したイメージを選択します。

![CloudShell環境8.PNG](https://qiita-image-store.s3.amazonaws.com/0/283423/5b8834a7-7ee9-6186-1de2-ecf91560273f.png)

  
先程作成したイメージを選択して、「保存」をクリックするとベースイメージが変更されます。
Cloud Shellコンソールを開いている場合はセッションを再起動してください表示されるため、再起動します。
再起動するとコンテナに接続しますが、結構長く接続中とでるためのんびり待っていると起動します。

起動後、イメージ内にAnsibleとTerraformがインストールされているか確認します。

![CloudShell環境9.PNG](https://qiita-image-store.s3.amazonaws.com/0/283423/8ddba3c4-16f2-fc9f-0857-6ebb1f64571d.png)


これでCloud Shell上にAnsibleとTerraformがインストールされたイメージの作成ができました。
Dockerfileを作成するだけでイメージが簡単に作成できるため、Cloud Shellを利用した研修を行うならかなりいいかもしれないです。
個人的 imagemin 設定方法 ver.2018

## お気持ち

フロントエンドにおける画像圧縮と言えば、 imagemin 一択である。
しかし、どの画像圧縮エンジンを使うのかとか、どの設定項目を使うのかとか、毎回悩みがちである。
そこで、個人的な設定をまとめておくことにした。

## 特徴

デフォルトと違う点は、以下の通り。

- jpegtran を mozjpeg に変えていること
- optipng を pngquant に変えていること

注意事項は、以下の通り。

- 開発環境では `disable` が `true` になるよう設定するべき
- `quality` は実際の画質を見ながら調節するべき


## 設定

```bash
$ npm i imagemin-mozjpeg --save-dev
```

```settings.js
const imageminMozjpeg = require('imagemin-mozjpeg')

module.exports = {
  disable: false,
  jpegtran: {
    enabled: false
  },
  optipng: {
    enabled: false
  },
  pngquant: {
    quality: '50-70',
    speed: 1,
    floyd: 0
  },
  gifscale: {
    interlaced: false
  },
  svgo: {
    plugins: [{ removeViewBox: false }]
  },
  plugins: [
    imageminMozjpeg({
      progressive: true,
      quality: 70
    })
  ]
}
```

以上。
dockerで立ち上げたrailsサーバでもBetter Errorsを使えるようにする

dockerコンテナ内で起動しているrailsで `exit` 記述してもBetter Errorsが動いてくれなかったので修正します。

解決方法
---
以下のconfigをつくってrails server再起動するだけ :ok_hand: 

```rb:config/environments/development.rb
if Rails.env.development?
  BetterErrors::Middleware.allow_ip! "0.0.0.0/0"
end
```

Better Errorsはdevelopmentでしか使っていないはずなのでenvで条件つけるの忘れないように。

ちなみに
---
docker-composeでrails serverを起動するときにbindingしていますよね。

```yml:docker-compose.yml
version: '3'
services:
  db:
    ...
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/rails
    ports:
      - "3000:3000"
    depends_on:
      - db
```

以上です :wave: 

参考
---
- [BetterErrors/better_errors: Better error page for Rack apps](https://github.com/BetterErrors/better_errors)
- [better_errors not working in a Docker container · Issue #270 · BetterErrors/better_errors](https://github.com/BetterErrors/better_errors/issues/270)
ラズパイにtmuxを入れてsshが途切れても作業を続ける

ラズパイにssh接続しながら時間がかかる作業中、Wifiが途切れると困る。

特に`sudo apt-get upgrade`を実行中に切断されると...

そういう時には`tmux`が便利！
という情報を見たのでラズパイでtmuxを試してみた。

# tmuxインストール

まず、ラズパイにssh接続する
以下コマンドでtmuxをインストールする

```
$ sudo apt-get install tmux -y
```

これでインストール完了

# tmux使い方

### tmux起動
```
$ tmux
```

こんな画面になった、これが起動画面らしい

<img width="1440" alt="スクリーンショット 2018-12-12 14.28.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/52227/59a16cc7-27c4-4474-ff2b-3e5736918808.png">

### tmux終了

入力するだけ

```
$ exit
```

## tmuxの実験

ラズパイに接続して、実際に長い作業中にターミナルを強制終了させる。
再度ラズパイにssh接続し、tmuxで作業再開できるか試してみる。

まず、ssh接続した状態でtmux起動し、`apt-get update`を実行させる。

```
$ tmux
$ sudo apt-get update
```

apt-get updateが実行中
<img width="1440" alt="スクリーンショット 2018-12-12 14.32.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/52227/c188e495-229c-28f7-caa6-b77bce68ebc8.png">

ここでターミナルを強制終了させる。
（`⌘+q` or ターミナルの☓を押すなど）

ターミナルを起動させて、ラズパイにssh接続する。

ここで`ps afx`すると、tmuxらしきプロセスが確認できた。

<img width="1440" alt="スクリーンショット 2018-12-12 14.33.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/52227/4c82f4b3-65ba-327a-1ff5-db123df73cdb.png">

このtmuxプロセスに接続するには`attach`コマンドを実行する。

```
$ tmux attach
```

そうすると、切断前の`apt-get update`コマンドが表示された。

<img width="1440" alt="スクリーンショット 2018-12-12 14.33.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/52227/1c166515-2141-a59d-d1da-ec4d91d45cb5.png">

# 感想
tmuxすごい、前の処理に接続した時にちょっと感動した。

今後ともtmuxをラズパイで活用していきたい。
Render and/or redirect were called multiple times in this action...の罠[Rails]

# **はじめに**
Railsでの開発において、`AbstractController::DoubleRenderError`には何度か遭遇したことがあるため、今回も問題なく解決できると思っていましたが、思わぬ落とし穴にハマってしまったので、エラーの原因と解決方法を共有したいと思います。

<img width="1220" alt="Action_Controller__Exception_caught.png" src="https://qiita-image-store.s3.amazonaws.com/0/269862/5726a063-708c-1976-5eaf-0604b9254ce0.png">

# **問題のコード**

```application_controller.rb
class ApplicationController < ActionController::Base
  .
  .
  def after_sign_in_path_for(resource)
    if # ある条件を設定してますが、コードでは割愛
      redirect_to hogehoge_path(resource) and return
  end
    user_path(resource)
  end
  .
  .
end
```

エラー内容は、アクションの中で複数回`render, redirect`メソッドを利用することはできませんと。また`and return`でメソッドから抜けてください、と示されています。
しかし、その通りに`and return`を記述してもエラーが消えることはありません。
僕はここでしばらくはまってしまいました。。。

ですが`redirect_to .. and return`を記述している`after_sign_in_path_for`は、ログイン後の遷移先ページを指定するメソッドであることを考えれば、**`after_sign_in_path_for`メソッドを使った時点でリダイレクト（遷移）は一回メソッド内で使われていることになります**。

よって、下記のようにコードを修正すればエラーは解決されます。

# **訂正コード**

```application_controller.rb
class ApplicationController < ActionController::Base
  .
  .
  def after_sign_in_path_for(resource)
    if # ある条件を設定してますが、コードでは割愛
      hogehoge_path(resource) and return
    else
      user_path(resource)
    end
  end
  .
  .
end
```

# **まとめ**
通常`Render and/or redirect were called multiple times in this action..`エラーに遭遇した時は`and return`を追記して、メソッドから抜けるよう指定してあげれば問題ないのですが、今回のような場面であれば注意が必要です。

- 制御構文を埋め込むことによりある条件の元ではリダイレクトさせたい、、つまり、その時`redirect_to`を使わなければいけないと錯覚（誤認）する時

今回得た教訓は
**`after_sign_in_path_for`メソッド内では、`redirect_to`は使えない。パスだけ記述する**。


# **おわりに**
同じエラーに遭遇し、この記事が役に立ったという方は、いいね、お願いします(^^)


# **Rails関連記事**
[正規表現まとめ（基礎）[Ruby編]](https://qiita.com/takuyanin/items/2918ffb3151dcfa88565)
[配列で利用できる主なメソッドをまとめてみた[Ruby編]](https://qiita.com/takuyanin/items/3ca4cd7067b7b9e7e9b6)
[Mysql2::Error: Duplicate entry for key.. エラーを撃退した話(validationの設定)](https://qiita.com/takuyanin/items/b28d5111447d4dedc39d)
[Rails5でJqueryを利用しようとして少しハマった件（Uncaught ReferenceError: $ is not defined）](https://qiita.com/takuyanin/items/24444ec3005098471f3b)
[change_columnでの設定はrollbackできない話(This migration uses change_column, which is not automatically reversible.)[Rails: migration]](https://qiita.com/takuyanin/items/6d51ffb4078a417fed35)
[sessionに保存されたHashを別アクションで利用しようとした際にデータ型の変更によりハマった件[Rails]](https://qiita.com/takuyanin/items/e794e8bdb46287a2a269)
[Railsでfacebookログイン認証機能を実装してみた + エラーの原因はバリデーションだった](https://qiita.com/takuyanin/items/5ebd5d9ac8a0baaa1a8e)
[csvファイルを作成し、初期データを挿入しよう[Rails]](https://qiita.com/takuyanin/items/fd183288d54d2b601df9)
[ArgumentError in ********Controller#send [Rails]](https://qiita.com/takuyanin/items/a14865fda34ff48f5e5a)
[Atom]vim-mode-plusでESCにキーマップを割り当てる

## Usage
vim-mode-plusプラグインを使っていてキーバインドを変えたい時は、
Atomの`menu -> keymap`を選択すると`keymap.cson`が開かれるので次の内容を記述する。

僕は次のように`ESC`に`jj`を対応させている。


```keymap.cson
'atom-text-editor.vim-mode-plus.insert-mode':
  'j j': 'vim-mode-plus:activate-normal-mode' # jj to escape
```

記述したら上書き保存する、。Atomの再起動は不要で反映されている事が確認できる



## 参考
- https://github.com/t9md/atom-vim-mode-plus/wiki/TIPS#escape-from-insert-mode-by-typing-jk-quickly
Vimの置換コマンドまとめ

Vimの置換コマンドに関する、個人的なまとめです。



# カーソル行上の文字列を置換
```text
:s/置換前/置換後/
```


# カーソル行以降の文字列を置換
```text
:,$s/置換前/置換後/
```


# ファイル上の文字列を置換
```text
:%s/置換前/置換後/
```


# 5~10行目の文字列を置換
```text
:5,10s/置換前/置換後/
```


# ビジュアルモードで選択した範囲内の文字列を置換
```text
:'<,'>s/置換前/置換後/
```

`'<,'>`は自動的に入力されます。


# よく使うオプション
- g : 複数の文字列を置換する。
- c : 置換する前に1つ1つ確認する。

コマンドの末尾に付加して使用する。


# 参考
http://motw.mods.jp/Vim/substitution.html
https://www.softel.co.jp/blogs/tech/archives/4977
django

DjangoのFormに動的な初期値を入れる
Python
DjangoのFormを表示する時の初期値の設定。
------------------------------------------------------------
forms.py
# coding: utf-8

from django import forms
from app.models import Order

class OrderForm(forms.ModelForm):
    name = forms.CharField(
        max_length = 200,
        initial = u'鈴木太郎',        # 初期値
    )

    class Meta:
        model = Order
------------------------------------------------------------
views.py

from django.shortcuts import get_object_or_404
from django.views.generic.simple import direct_to_template
from app.models import Order, Customer
from app.forms import OrderForm

def orderRegister(request):
    num = 1
    customer = get_object_or_404(Customer, id=num)
    form  = OrderForm(initial = {
        'name': customer.name})        # 初期値

    return direct_to_template(request, 'some.html',
        extra_context = {
            'form': form,
        },
    )