OmniAICreator/Qiita-1.07M huggingface dataset:
[React Native] URL Schemeを使用する

React NativeでURL Schemeを使って任意のComponentを表示する方法を紹介します。

# ネイティブ側設定
ネイティブの設定はReact Nativeを使わない場合と同じです。
`myapp://open` から始まるURL Schemeを使用する場合は以下のように設定します。

## Android
AndroidManifest.xmlのMainActivityの`activity`タグ内の要素として以下の`intent-filter`要素を追加します。

```
<intent-filter>
  <action android:name="android.intent.action.VIEW" />
  <category android:name="android.intent.category.DEFAULT" />
  <category android:name="android.intent.category.BROWSABLE" />
  <data
    android:host="open"
    android:scheme="myapp" />
</intent-filter>
```

## iOS
Xcodeでプロジェクトを開き, 左のツリーのプロジェクトのルートを選択、Infoをクリックし、一番下のURL Typesを追加します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/18273/5238ee27-9ad6-11ed-aa81-c67fd0ea036d.png)

またAppDelegate.mに以下のコードを追記します。

```
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
  return [RCTLinkingManager application:application openURL:url
                      sourceApplication:sourceApplication annotation:annotation];
}

// ユニバーサルリンク使うならこっちも (https://developer.apple.com/library/prerelease/ios/documentation/General/Conceptual/AppSearch/UniversalLinks.html).
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity
 restorationHandler:(void (^)(NSArray * _Nullable))restorationHandler
{
  return [RCTLinkingManager application:application
                   continueUserActivity:userActivity
                     restorationHandler:restorationHandler];
}
```

# React Native側
App.jsのような最初に起動するコンポーネントに以下のコードを追加します。
iosとandroidでURLの取得方法が異なります。そのためプラットフォームによって分岐しています。

```
  componentDidMount () {
    if (Platform.OS === 'android') {
      // androidはこのタイミングで起動されたURLを取得できる
      Linking.getInitialURL()
        .then(url => {
          if (url) {
            this.openFromUrlScheme(url)
          }
        })
        .catch(e => {
          console.log(e)
        })
    } else if (Platform.OS === 'ios') {
      // iosの場合はハンドラを経由する必要があるので追加
      Linking.addEventListener('url', this.handleOpenURL)
    }
  }

  componentWillUnmount () {
    Linking.removeEventListener('url', this.handleOpenURL)
  }

  handleOpenURL = event => {
    if (event.url) {
      this.openFromUrlScheme(event.url)
    }
  }

  // 
  openFromUrlScheme = url => {
    console.log(url)
    const parsedUrl = parse(url, true)
    if (parsedUrl.protocol === 'myapp:') {
　　　　　　　　　　　　// 任意の画面を開く処理
      // この例はreact-native-router-fluxでdebugMenuシーンを開くためのコード
      Actions.debugMenu()
    }
  }

  componentWillUnmount () {
    Linking.removeEventListener('url', this.handleOpenURL)
  }

  handleOpenURL = event => {
    if (event.url) {
      this.openFromUrlScheme(event.url)
    }
  }

  // 
  openFromUrlScheme = url => {
    console.log(url)
    const parsedUrl = parse(url, true)
    if (parsedUrl.protocol === 'myapp:') {
　　　　　　　　　　　　// 任意の画面を開く処理
      // この例はreact-native-router-fluxでdebugMenuシーンを開くためのコード
      Actions.debugMenu()
    }
  }
```

参考
https://medium.com/react-native-training/deep-linking-your-react-native-app-d87c39a1ad5e
C++ Builder XE4 > デザイン > TShapeに似た見た目をTPanelで行うには

```txt:動作環境
C++ Builder XE4
```

### 概要

凡例の作成としてTShape上にコンポーネント(TLabelやTShape)を配置しようとしていた。
TShape上には配置はできない。

TShapeに似た見た目をTPanelで行うには下記のような設定になりそうだ。

- BevelKind: bkTile
- BevelOuter: bvNone
- BevelWidth: 1
- BorderStyle: bsNone
- BorderWidth: 0
- color: clWhite
- ParentBackground: false

下記、左はTPanel(設定変更後)で右はTShape (デフォルト設定)。
![2018-12-27_09h15_52.png](https://qiita-image-store.s3.amazonaws.com/0/32870/aef06c1d-47d3-1211-a298-8916fa646f4d.png)

外枠の太さは少し違う。

- BorderStyle: bsSingleのようにすると、くぼんだ感じになる
force cli : グローバルセットの設定を取る

#はじめに
sandbox環境で作ったグローバルセットを本番環境に移す時の備忘録です。

#グローバルセットの抽出
```
$force fetch -t GlobalValueSet -d 保存先
$Not done yet: Queued  Will check again in five seconds.
$Exported to 保存先
$cd 保存先
$ls
$globalValueSets/
$cd globalValueSets
$supplier_stock_type.globalValueSet  unit_code.globalValueSet
```
個別にインポートする場合はpackage.xmlが必要になります。
また、個別に階層を作ってあげないといけないです。

ということで、個別にアップするにはimportでない方法がいいのかもしれません。
社長兼エンジニアさんの「アンチ技術偏重主義」に完全同意 BY @yumainaura  RT @yutakarai QT @takapon_jp #多動力 #100年時代 #ライフシフト

#この一言に完全同意

https://twitter.com/yutakarai さんのプロフィールより

#@yumainaura

技術記事を書かなさすぎてやばい。最近の比率は1:9ぐらい。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/95add8ea-f8b8-a8f4-27af-6c933b455e71.png)

#UI UXに興味関心のあるエンジニアが周囲にいなさすぎる

Qiitaに書いても反応が薄いので、全エンジニア的問題_

#サービスコンセプト、テーマ、会社のミッションに興味のあるエンジニアが周りにいなさすぎる

Qiitaに書いても‥以下略

#多動力の時代

エンジニア兼
社長兼
デザイナー兼
Youtuber兼
Twitter兼
Tiktoker兼
サービス設計者兼
プロダクトマネージャー兼
Qiitaポエマー兼
アーティスト兼
エンジニア

#そんな人にワタシハナリタイ

あなたはどうですか？

#アイデンティティをひとつに決めるな

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/19674058-a4c7-c377-9773-80eff8de1998.png)

Shiftキーを押せ！たくさん

#でもエンジニアリングがんばろう

ホームグラウンド大事。


エンジニア要素が少ないのでdockerやらruby勉強し直しやらしていく。大阪IT交流会でもトークする！スクラムフェスにも参加する！2019年はひやくのとし。


# Ruby

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/a193f142-246d-f2e3-1596-0a367f8839c4.png)

#ビギナーズマインド

エンジニアならジョブズは好きでしょうか？Apple信者の方？
![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/4b27e695-bdb5-ffd1-25d4-f9b666be80ea.png)
瞑想・マインドフルネスはエンジニアの必須技術になってほしい未来のjapan











<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
【ReactNative】環境構築（macユーザ向け）

# 前提
この記事の主な位置付けは[ReactNative勉強会](https://r-n.connpass.com/)に参加する方々が、勉強会にてスムーズにもくもくできるように事前準備資料です。

ただ、もちろんReactNativeの環境構築をしたいどなたが見ても意味のあるように書いていますので、ご参考にしてくださると幸いです。

# 公式と少し違くない？って思った人へ
[公式サイト](https://facebook.github.io/react-native/docs/getting-started)では、[Expo](https://expo.io/)を使うための環境構築について解説されています。
個人的にExpoはすごく便利で好きですが、Expoを使わない開発ケースをよく拝見するので、今回の記事ではReactNativeを素のまま使うことを前提としています。

# React Nativeとは
JavaScriptでモバイルアプリを開発できるフレームワークです。
[Monaca](https://ja.monaca.io/)や[Ionic](https://ionicframework.com/)などのハイブリッドアプリと違い、**ネイティブアプリのUI Component使って描画する**ので、UXはネイティブアプリのそれと変わりません。

※ハイブリッドアプリはWebViewという機能を使って画面を描画するので、いわゆる`サクサク・ニュルニュルした動き`は実現できません。

# 環境構築手順
1. HomeBrewをインストール
2. Xcodeをインストール
3. Node.jsをインストール
4. Watchmanをインストール
5. react-native-cliをインストール

※iOSアプリの開発がメインな前提です。Androidアプリも作りたい方は[AndroidStudio](https://developer.android.com/studio/)のインストールも必要です。

## 1.HomeBewをインストール
[公式サイト](https://brew.sh/)

Mac用のパッケージマネジメントツールです。これ一本で大抵のパッケージをインストール・管理できるので開発者なら大体入れておいてると思います。
公式にある通り、

```
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```
とするとインストールできます。

## 2. Xcodeをインストール
iOSアプリ開発の統合開発環境です。iOSアプリを開発するのには必須になります。
[App Store](https://itunes.apple.com/jp/app/xcode/id497799835)からインストールできます。

## 3. Node.jsをインストール
[公式サイト](https://nodejs.org/ja/)

JavaScriptをサーバサイドで動かすための環境です。API開発にもメジャーに使われています。
先ほどインストールした`homebrew`を使ってインストールします。

```
brew install node
```

※nodeと共に、`npm`コマンドも使用できるようになります。

## 4. Watchmanをインストール
[公式サイト](https://facebook.github.io/watchman/)

ファイル監視ツールです。ファイル内容の変更（つまりソースを書いたり）などを感知して何かしらのアクションをトリガー（実行）できます。

```
brew install watchman
```

でインストールできます。

watchmanに関しては意識して使うことはほぼないです。ReactNativeの実行と共に動いて、色んなことをよしなにしてくれます。

## 5. react-native-cliをインストール
`cli = command line interface`
です。
公式サイトではないですが、[このページ](https://facebook.github.io/react-native/docs/understanding-cli)で公式が詳しく解説しています。

先ほどNode.jsをインストールしているので、`npm`コマンドが使えるはずです。

```
npm install -g react-native-cli
```

でインストールできます。

以上で、環境構築は完了です！
わからないこと等あったら
https://twitter.com/kangyoosam
までメンション・DMするか、[勉強会](https://r-n.connpass.com/)に来てくだされば答えます！

# 【追記】手始めにプロジェクトを作ってみよう

## アプリ作成
```
react-native init hogeapp
```
と打つと、hogeappというアプリを作成できます（アプリ名はもちろん後で変えられます）

## Simulatorで起動
Xcodeをインストールした際に、Simulatorという、**Mac上で動くiPhoneやiPadの仮想環境**のようなものがインストールされています。

```
react-native run-ios
```
とすると、
こんな感じでSimulatorが立ち上がります。

ソースコードを変更して`Cmd + R`するとリロードされて変更が反映されるかと思います。

# 実際に本番で動いてるコードを見てみたいという方へ
[CodePicks](https://github.com/KangYoosam/CodePicks)というアプリをオープンソースで公開しています。現状大したことないアプリですが、よく使う技術（ルーティング・状態管理など）は大体踏襲しているので、初心者にとっては動かしてソースを眺めるだけで参考になるかと思います。
勉強会等で少しずつ改善していく予定です。

CodePicksについては[こちら](https://qiita.com/kangyoosam/items/446122ab685617e02501)に書いているのでご参考になれば幸いです。

# 参考
もう少しいじってみたいという方は[この辺の記事](https://qiita.com/naodroid/items/dcd3e7eb8454d5ae9a54#js%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E5%9F%BA%E6%9C%AC%E6%A7%8B%E6%88%90)が参考になるかと思います。
世にも奇妙なUI UX 押せそうで押せないTwitterのアンケート @yumainaura #クリック #できない

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/9100c67a-440f-e069-c93d-d3ae68912a0d.png)

タイムラインで押せなかった。

昔は「下線だけ引かれていて、押せない、リンクのようでリンクでないやつ」があったもんじゃ。

#あなたも押せない何かを作ってませんか？

押せそうなものは、押せるように。

クリックできそうなものは、できるように。

by [yumainaura ui ux - Google Search](https://www.google.co.jp/search?q=yumainaura+ui+ux&oq=yumainaura+ui+ux&aqs=chrome..69i57j69i61j69i60l2j69i64l2.4617j0j7&sourceid=chrome&ie=UTF-8)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
#tiktok に学ぶ。画像作成ジェネレーター系サービスの拡散ならウォーターマークを入れるのが最強では？@yumainaura #UI #UX

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/a5cb7edf-2cb2-4c76-fe61-d5a12f1da7c8.png)

すごい！

でも惜しいと思ったこと。

どのサービスが使われているかが分からない。

ユーザーが画像だけ拡散した時に、どんなサービスを使ったかを忘れてしまう。

#対策

ウォーターマークを入れる。

#tiktok

拡散しようとすると自動でロゴが入っている。

自分のユーザー名も入っているから、サービスだけの宣伝にはならない！！

ユーザーもサービスも療法😆嬉しい両方！わー！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/eb96cf5e-14f4-da09-cff1-a122ecbf40e3.png)

以上！

[tiktokとYoutubeって何が違うの？おっさんエンジニアでも分かるようにざっくり説明。 - Qiita](https://qiita.com/YumaInaura/items/7c8793ae103c82b90575)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
#UI #UX #Twitter #脳内メイカー #みたいな #興味 #関心 #大文字 #小文字 #Web #サービス #whotwi @yumainaura

https://twitter.com/ino_dev/status/1078064308741758977

#Webエンジニアの人がTwitterで教えてくれた‥！

https://twitter.com/ino_dev/status/1078064308741758977

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/220a6cdf-cbe2-7051-f361-dd8bd5aeaead.png)

#これだ！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/7f0b5a68-610c-65cc-2c4b-fc6fcf595faf.png)

#分析中

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/7bf09f74-27a0-7b4e-bac9-2f0dff40ed54.png)

#1分経過

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/b6323066-a8a1-335e-73ba-3af952bfc04a.png)

# URL


https://ja.whotwi.com/

https://ja.whotwi.com/yumainaura

# ja. 取ると？

https://whotwi.com/

https://ja.whotwi.com/ にリダイレクトされる

どの仕組みだろう

ブラウザの言語を見ている？もしくは日本語版だけ？

# Google Speed Insights にかける

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/dd302c8c-2917-f4fa-e6ef-3e313deca52e.png)

# 速度は遅いっぽい


体感そんなに気にならなかったけど？

Googleはあくまで目安

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/b708ec9d-ca37-fbd4-038a-f6d76b535b13.png)

#他の結果

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/2a26e633-27a4-e411-417f-591e0e0cbbc2.png)

#オフスクリーン画像の遅延読み込みとは

気になる。
ヘルプは英語版だけ？
あとで調べてみたい。

>オフスクリーン画像の遅延読み込み
>1.98 s
>オフスクリーンの非表示の画像は、クリティカルなリソースをすべて読み込んだ後に遅れて読み込むようにして、インタラクティブになるまでの時間を短縮することをご検討ください。Learn more.


![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/162fd608-8d06-390b-7810-4ec3d0021a2a.png)

#まだまだロード中。

待ち時間はドキワク勉強タイムにしよう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/093408a0-a782-e7b4-1811-6e1e13d56a1d.png)

なにも編集せず、下へ下へと、Qiitaをフロー形式で書いていくストックのテスト。

#なぜみんな、そんなに編集したがるのか？

編集度の高さが莫大なコストであることに気付いているのだろうか？

#決してバックスペースキーも、上キーもvimのKもJも押さない世界の夢を見る

すべてがフロートして下に流れてゆく

そんなサービスアプリケーションの夢を見る

#キーボードのバックスペースを削り取ってしまえば良い

MacBookを物理で改造する必要性が出てきそうだ

#まだまだローディング中

手記はここで途切れている

#結果は？

夕方確認

#もちろん

非同期処理のはず。

それなら放置でOK。

非同期じゃなかったら死ぬ。

インポートの長いサービス、処理の長いサービスは当たり前だけど非同期で作ろう。

#ブラウザには「くるくるアイコン」を表示しよう

どうやら止まった様子？

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/88af6e75-670e-132d-edce-3d68314046c2.png)

#どん！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/7c54fba7-685a-66cb-f047-7e83872154ad.png)

#他のタブが動線になっているのがにくい

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/6684fd34-6984-22e3-52e2-a14f50bbdbb1.png)

#アイキャッチ‥なんだっけ‥ファビコンが横に連なってパーセンテージになっているデザインがやばい‥！！！！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/04db121b-1c39-f442-e90d-9051c86382cf.png)

#グラフィカルなやつってどこよ？

下の方にあった。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/9333f53b-a9e2-160c-6854-6a7d107663cf.png)

#ちょっと下すぎない？

一番グラフィカルな奴はこれでしょ！！

#@inodevさんありがとう！！！

Vim Rails の記事が人気みたいです！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/924ef1ee-5b26-1b6b-599a-fb4d7c0b63e6.png)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Atom で文字コードを UTF-8 に変更する方法

# Atom で文字コードを UTF-8 に変更する方法
How to change character code to UTF-8 from another code such as Shift_JIS with the Atom.

21世紀のハック可能なエディタ [Atom](https://atom.io, "21世紀のハック可能なエディタAtom") で文字コード変換について検索すると `convert-to-utf8` を利用する、と教えられます。  
間違っていないのですが、 同時に `auto-encoding` パッケージを利用しているとうまく変換できないのでその辺りの事を書いておきます。

# はじめに
MS-Windowsユーザからテキストファイルを頂くと、未だに  

```
Content-Type: text/plin; charset="Shift_JIS"
```

となっています。このままでも良いのですが、`Shift_JIS` には致命的な弱点、文字コードの2バイト目に各種のプログラミング言語の制御コードに良く使われる `¥`(0x5C)を利用した漢字が割当てられています。このため、例えば正規表現の検索などの処理を行う際に問題となります。  

`Shift_JIS`コードには、他にも問題となるコードを多く含んでいます。詳しく知りたい方は、
[Shift_JISのダメ文字](https://sites.google.com/site/fudist/Home/grep/sjis-damemoji-jp, "Shift_JISのダメ文字") などを参考にしてください。  

[Atom](https://atom.io, "21世紀のハック可能なエディタAtom") エディタを利用して

- 最新の MS-Windows から頂いた `Shft_JIS` コードで記述されたファイル
- ちょっと前の UNiX系から頂いた `EUC-JP` コードで記述されたファイル

などを `UTF-8` コードに変換する方法です。

## 準備するもの

1. [Atom](https://atom.io, "21世紀のハック可能なエディタAtom") エディタ
1. UTF-8 に変換する Shift_JIS コードなどのテキストファイル

## 事前準備
変換には `convert-to-utf8` パッケージを利用するのでインストールします。  
インストール方法は、2種類

* Settings を利用する方法
* apm を利用する方法

`apm` を利用する場合は、コマンドラインで以下を実行します。

```shell
$ apm install convert-to-utf8
```

### `auto-encoding` の無効化
`auto-encoding` は、ファイルを開いた際に自動的に Shift_JIS や EUC-JP などの文字コードを判別し、文字化けから解放してくれます。文字コードを変換する必要がなければ、とても便利な拡張モジュールです。  
ところが、文字コードを自動判別する `auto-encoding` パッケージを利用していると、変換がうまく機能しないので、無効化もしくは削除します。  

無効化は

```shell
$ apm disable auto-encoding
```

削除は

```shell
$ apm remove auto-encoding
```

有効化されているパッケージは、次のコマンドで確認できます。  

```shell
$ apm list --installed --enabled
```

## UTF-8 変換の手順
手順は、以下の通りです。  

1. ファイルを開く
1. 文字コードを `UTF-8` に変換する
1. ファイルを保存する

少し詳しく説明します。

### ファイルを開く
変換するファイルを開きます。
`auto-encoding` を利用していないので `Shift_JIS`コード等のファイルを開くと､ **文字化け** 状態となります。  

### 文字コードを `UTF-8` に変換する
’Packages’ メニューから 'ConvertToUTF8' を選び、ファイルの文字コードを選択します。  
選択した文字コードが正しければ、**文字化け** が解消され、内容が読める状態になります。  

指定した文字コードが間違っていたら、**文字化け** は解消されません。  
このような時は、慌てずに `Undo`(Edit -> Undo ⌘Z)しましょう。  

### ファイルを保存する
正しく文字コードが `UTF-8` に変換されたら、まずは保存し、作業を続けましょう。

### 変換が必要ない場合
文字コードを変換せずに、そのまま作業を続ける場合は、正しいエンコーディングを指定する必要があります。

'Edit' メニューから 'Select Encoding'(⌃⇧U)を選び、リストの中から文字コードを選択してください。

## おまけ
実は、`nkf` を使えば、双方向変換、行末の改行コードの変換まで一発で行えます。
`convert-to-utf8` の利点は、ファイル名を変えずに編集中のファイルの文字コードを変更できる事です。


### UTF-8 を Shift_JIS に変換する
わがままな MS-Windows の利用者にファイルを差し上げると、  
「読めない」とか「文字が化ける」  
と言われる場合は、

```shell
$ file convert-character-code.md
convert-character-code.md: UTF-8 Unicode text
```
なファイルを文字コードを `Shift_JIS` に変換し、  
行末の改行コードを `LF` から `CRLF` に変更して渡し直す必要があります。

残念ながら `convert-to-utf8` は、逆方向の変換が出来ません。  
このような場合は `nkf`(Network Kanji Filter) を使います。

```shell
$ nkf -WsOLw convert-character-code.md convert-character-code_sjis.md
```

オプションの意味は、

- UTF-8 を Shift_JIS に変換 `Ws`
- 出力ファイル名を指定 `O`
- 行末の改行コードを CRLF に変換 `Lw`

`nkf` を使えば、_Shift_JIS_ から _UTF-8_ への変換も出来ます。詳しくは、

```shell
$ nkf --help
```
または

```shell
$ man nkf
```
で確認してください。

`nkf` は標準コマンドでは無いので `macOS` ユーザならば、[Homebrew](https://brew.sh/index_ja, "macOS用パッケージマネージャー") を利用してインストールできます。

```shell
$ brew install nkf
```
Quaternionなど

回転系で非常によくまとまってる記事。

Quaternion.ToAngleAxis
はかなり使い勝手が良さそう。

「ある任意の軸に対して、何度回転させる」

かを設定できる。

そして、
transform.position = rot * transform.position ;
とすると、任意の角度回転できる。
update内でやれば、ずっと回ってくれる。

http://unitylab.wiki.fc2.com/wiki/%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%92%E5%95%8F%E3%82%8F%E3%81%9A%E5%9B%9E%E8%BB%A2%E6%93%8D%E4%BD%9C%E3%81%AB%E9%96%A2%E4%BF%82%E3%81%99%E3%82%8B%E9%96%A2%E6%95%B0
idiormで条件付きで並び替えをする方法


idiormを使っていて取り出したデータに対して、CASE式を使って条件付けで並び替えをしたい場合、
どうしたら良いか調べても見つからなかったので、まとめてみました。

例として、以下のような商品テーブルがあったとします。

■商品テーブル(テーブル名：item_table)

| id         | category_id | name        | price        | stock        |
|:-----------|------------:|------------:|:------------:|:------------:|
|1           |1            |商品1         | 1000         | 0           |
|2           |1            |商品2         | 2000         | 1           |
|3           |2            |商品3         | 3000         | 0           |
|4           |2            |商品4         | 1000         | 0           |
|5           |2            |商品5         | 1000         | 3           |

■各カラムの説明
id：商品ID
category_id:商品が属しているカテゴリーのID
name:商品名
price:価格
stock:在庫数

この商品テーブルを、カテゴリーIDが"2"で、売り切れ(在庫数はが0)の商品は、
他の商品よりも後に取得したいといった場合、以下の方法で取得できます。


```php
$items = ORM::for_table('item_table')
    ->select('name')
    ->orderByExpr('CASE WHEN category_id = 2 AND stock = 0 THEN 0 ELSE 1 END DESC')
    ->findArray();
```
```php:取得できる配列
array(5) {
  [0]=>
  array(1) {
    ["name"]=>
    string(7) "商品1"
  }
  [1]=>
  array(1) {
    ["name"]=>
    string(7) "商品2"
  }
  [2]=>
  array(1) {
    ["name"]=>
    string(7) "商品5"
  }
  [3]=>
  array(1) {
    ["name"]=>
    string(7) "商品3"
  }
  [4]=>
  array(1) {
    ["name"]=>
    string(7) "商品4"
  }
}
```

また、上記方法で並び替えたデータに対して、価格の昇順で並び替えを行いたい場合、
`orderByExpr`の記述の後に通常の`orderByAsc`を追加してあげると対応できます。

```php
$items = ORM::for_table('item_table')
    ->select('name')
    ->select('price')
    ->orderByExpr('CASE WHEN category_id = 2 AND stock = 0 THEN 0 ELSE 1 END DESC')
    ->orderByAsc('price')
    ->findArray();
```

```php:取得できる配列

array(5) {
  [0]=>
  array(2) {
    ["name"]=>
    string(7) "商品1"
    ["price"]=>
    int(1000)
  }
  [1]=>
  array(2) {
    ["name"]=>
    string(7) "商品5"
    ["price"]=>
    int(1000)
  }
  [2]=>
  array(2) {
    ["name"]=>
    string(7) "商品2"
    ["price"]=>
    int(2000)
  }
  [3]=>
  array(2) {
    ["name"]=>
    string(7) "商品4"
    ["price"]=>
    int(1000)
  }
  [4]=>
  array(2) {
    ["name"]=>
    string(7) "商品3"
    ["price"]=>
    int(3000)
  }
}
  ```


意外と使う機会もありそうなので、誰かのお役に立てれば幸いです。
Google Calendar Android アプリで追加しているはずのカレンダーが見れない時

# TL;DR
「ハンバーガーメニュー」 > 「設定」 > 各 Google アカウントの「もっと見る」 > 表示させたい「カレンダー名」 > 「同期」 を ON

# 経緯

会社で GSuite を使い始めたので予定の管理・共有を Cybozu から Google Calendar に乗り換えたのだが、
Web で追加したはずのカレンダーが Android アプリで表示されなかったので設定を掘って調べてみた。

※ もっと書きたいんだけど、時間なかった。。。
ChromeOS　キーボードショートカット

よく使うショートカットキー
##F1〜F12キー
`ランチャー + 1〜=`
##タスクマネージャー
`ランチャー + esc`
##Deleteキー
`alt + backspace`
##ウィンドウ操作
###左に固定
`alt + [`
###右に固定
`alt + ]`
###最大化
`alt + =`
###最小化
`alt + -`
###スクリーンショット
`ctrl + □||`
###スクリーンショット（範囲指定）
`ctrl + shift + □||`
###ダウンロードフォルダを開く
`alt + shift + m`
##Chrome
###開発者ツール表示
`ctrl + shift + c`
##テキストエディタ
###行頭に移動
`ctrl + <`
###行末に移動
`ctrl + >`
UnityでBlenderファイルをインポートするときに、アニメーションが付いてこない時

# TL;DR

![IMAG0012.jpg](https://qiita-image-store.s3.amazonaws.com/0/280975/90705958-53e5-4393-c64b-86f4e40e4837.jpeg)

# アニメーションがインポートされない

Blenderのドープシートでアニメーションをモリモリ作っては、Unityに喰わせていたのですが、何故か途中からインポートされなくなってしまいました。

Blender側で色々弄っても一向にインポートされず…
体感一時間ほどハマりました…(´；ω；｀)

# マニュアルでインポートする

![IMAG0012.jpg](https://qiita-image-store.s3.amazonaws.com/0/280975/90705958-53e5-4393-c64b-86f4e40e4837.jpeg)

こちら、BlenderファイルにフォーカスするとしたときのインスペクタのAnimationタブのSSです。「＋」を押してインポートするアニメーションを追加し、追加されたアニメーションにフォーカスして、下に表示されるSourceTakeをBlender側で指定したAnimarionClip名にします！

![a.gif](https://qiita-image-store.s3.amazonaws.com/0/280975/e49a5777-d38d-9b47-42c4-8139c17f73e4.gif)

OK！
触らないで動くっていうロマン

こんにちわ。ひろみちゃんです。
メリークリスマス！（遅
![17773_411555162247680_1855825762_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/312673/8a55d030-1b0e-ea2d-9c52-46c8410b86f3.jpeg)

Seeed UG Advent Calendar 2018の21日目を今頃書きます。
言い訳させてください。やりたい事がなかなか出来なかったんです。
なので今回は出来なかった事を書きます。
それならもっと早く載せれただろって突っ込む人はキライです。

まず今回はこれ使おうと思ったんです。

![P_20181222_114525.jpg](https://qiita-image-store.s3.amazonaws.com/0/312673/5ad1bc99-c0fc-469e-2e7a-f14849d949b5.jpeg)
![P_20181222_114514.jpg](https://qiita-image-store.s3.amazonaws.com/0/312673/ad1d5e03-eaed-a100-77bc-2438182bedce.jpeg)

[ジェスチャーセンサーですね。](https://www.seeedstudio.com/Grove-Gesture-PAJ7620U-p-2463.html)
これ9種類のジェスチャーを拾ってくれるんですけど、結構精度高くて良さげ。
手で触らないで何か動かす事が出来る…。
これと組み合わせようと考えました。

tibit赤外線の写真
![tibbit27.png](https://qiita-image-store.s3.amazonaws.com/0/312673/a20a39bc-290b-dc33-f24d-a4d822dc1c18.png)
![P_20181223_042602.jpg](https://qiita-image-store.s3.amazonaws.com/0/312673/4ec20d89-ca02-eaa3-357e-36be8b68c69b.jpeg)

[そうです。赤外線センサーです。](https://tibbo-pi.co-works.co.jp/item/tibbit_block/irray_transceiver/)

これを組み合わせて
![P_20181227_061828.jpg](https://qiita-image-store.s3.amazonaws.com/0/312673/8afc7090-62d5-9b07-bb15-1efe4c0924b9.jpeg)
リモコン動かせたらワクワクしますよね？
するんですよ。これがロマン。

しかし…。

[チュートリアル](https://tibbo-pi.co-works.co.jp/tutorial/26_remote_control_decoder/)見ながらノード組んで
![2018-09-05_10h54_39.png](https://qiita-image-store.s3.amazonaws.com/0/312673/fba58b68-d659-54bd-3b14-7f4f9f307c29.png)
ひとつひとつ赤外線データ取ってみるものの…。

**何も取れない**

ショックですよ。ここはまた後で調べたいと思いますが、照明系は取れるんですよ。
テレビやHDレコーダー、サーバ等は無理。でもうちは東〇のみで構成されているので、（なぜ〇芝かは嫁チョイスで昔CMが福山雅治だったからという理由）もしかしたら他メーカーだと取れるのかも。

そんなとこでブログはまたチャレンジして更新したいと思います。
![P_20181223_061226.jpg](https://qiita-image-store.s3.amazonaws.com/0/312673/f09274c9-0167-f07e-2bab-7cf849384436.jpeg)
![P_20181223_061221.jpg](https://qiita-image-store.s3.amazonaws.com/0/312673/7c0407fa-1c01-7582-0ed9-b017055be39b.jpeg)

とりあえずジェスチャーで色が変わるってとこまでは実装できたしょぼい写真でお別れです。

ほんと遅れたうえにこんなオチですいません。
続報に期待してください。
まだ #MacBook で #図面作成 #お絵かき できず消耗 してるの？ #iPad #タブレット より #紙 #ホワイトボード と #ペン と #PhotoBooth でしょ！ @yumaunaura

```
# サーバー構成図 #ドメイン#絵 #図 #作成
```

# 紙のノートやホワイトボードを用意

# 書く！

# PhotoBooth用意

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/723df975-e44f-d45e-34b6-0468ed1718b9.png)

# カウントダウン

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/54387537-5196-a33f-9b41-d5f916a6a73a.png)


#撮影！

#からのスクショ

Command + Control + Shift + 4

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/bdb53a0f-280c-a54c-3049-28b9308da3c9.png)

# Qiitaなどにペーストで貼り付け

#NGテイク

邪魔しないで‥！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/4dc9129e-84f7-5f63-4215-4a993ebbe302.png)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
初投稿

卒業研究でどっぷり機械学習プログラミングにハマってしまいました。
半分趣味でやっている機械学習プログラミング関連の内容を適当に書いていければと思っています…

AIに触れ始めてまだ1年経ってない初心者ですが、しばらくは知識の整理として使わせていただきます。

将来的にはKagglerになってみたい気持ちもあります。

どんな感じで文章書いたらいいかわからないので、今回はこのあたりで。
#Facbook #テキストエリア #狭い #広げる #代替手段 #ノート #SNS #選び方 #UI #UX @yumainaura

# サービス継続性の高いSNSに情報をアウトプットしたい

# だが感想は‥UI最悪、遅い‥トレードオフを考える

# 試してみた結果

https://www.facebook.com/notes/yumainaura-%E3%81%84%E3%81%AA%E3%81%86%E3%82%89%E3%82%86%E3%81%86%E3%81%BE-%E7%A8%B2%E6%B5%A6%E6%82%A0%E9%A6%AC/users-really-want-to-know-shortcutkey-hey-googlechrome-extension-developers-ui-u/362125287671964/

# はじまりは？

# Facebookにノート機能があると気付いた

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/1b9f2fe7-b909-286d-9d22-39c193dc25f1.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/cce0f1a5-d08d-071d-9bb6-23bd48f6bb22.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/5fa1b6a7-c5d0-fd5a-2cd1-512188d14d66.png)


![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/b4ec19a1-6982-fd08-8a01-4849ca78fd2f.png)

# POST後

# 自分ではてぶしてGoogle検索対策、SEO

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/9aa142d1-9144-58a3-2e08-a17de878259c.png)

# Twitterでシェアは当たり前

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/f784c510-7844-2fa3-478a-41ffdb902e37.png)

# タイトルの謎の (1)

ぜんぜん関係ない新着通知の未読数らしい。

# FacebookのWeb UIって‥

どれだけつらいの








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Gitで追跡外のビルド成果物などをクリーンしたかった

# 結論

```
$ git clean -xfd
```

これだけ

## Why?

dotnet coreで開発をしていて、現在のワーキングディレクトリ内に
ゴミが溜まってきたな・・・と思って`dotnet clean`
したんだけど、`bin/*`とか`obj/*`とかが消えてくれなかったので、
一回まっさらにしてみたかった。

## オプションについて一応解説

- `-d` : ディレクトリを削除対象に含める
- `-f` : ファイルを強制的に削除する
- `-x` : .gitignoreで追跡対象外になっているファイルを含める（これを知らなかった）

## 実行は自己責任でお願いします。
#Users really want to know #ShortcutKey Hey #GoogleChrome #extension #developers #UI #UX

GoogleChrome 拡張作る人はストアに「ショートカットキー」を大文字で表示してほしい！!

#Overview

like this

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/76938747-1b15-6d4a-d8c1-a1bb9402e764.png)

# Do not make your users surrender use your application

あなたの潜在ユーザーがアプリケーションを使うことを諦めませんように。








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
仕事ができないおっさん派遣エンジニアになったらどう生きればいいのか

#仕事ができないおっさんエンジニアになったらどう生きればいいのか
まず若くもない、技術や業務にも長けてない、半年や1年という短いスパンで現場を入れ替わりし、
ほぼ雑用程度の仕事しかしてこなかったエンジニアの方々は多いのではないかと思います。そんな働き方では将来性ありませんよね。
短いスパンで入れ替わる理由は人それぞれですが、大きく分類するに3つあげられると思います。
##求められる仕事が大きくなり自分から逃げ出した
年齢もそれなりにいって、現場にもそこそこいれば当然求められる仕事や成果も大きくなります。そんな自分に引け目を感じて、ついつい逃げ腰になることもあるでしょう。現場からエンジニアへのあたりも強くなります。当然耐えられなくなったら病は心身を蝕みます。
今現在IT技術者の派遣の需要はあるため首都圏に限り、いくらでも現場があると思いますがそれに甘えてコロコロ現場を変えていつの間にかおっさんになってしまったというのはありがちです。
##理由はわからないが短期で切られる
これは致命的な気がしますが、このタイプは鈍感力が秀でている方が多いのではないでしょうか。もしかしたら現場でキレる癖がある人が多いかもしれません。使い勝手が悪いエンジニアは敬遠されがちです。しかしそのスタンスは本来あるべき姿なので貫いてください。
##その他理由
3つ目は理由が思い浮かばなかったので割愛させていただきます。皆様、胸に手を当て思い当たる節を探してください。

#で、結局どう生きればいいか
我が国にはセーフティネットというものが存在しております。失業保険しかり、生活保護しかり、それらをうまく活用すれば働かなくても生きていけます。それらに頼りたくない場合は他人に迷惑をかけながら、
もしくは現場でいじめられながら働くしかありません。しかしせっかく生まれてきたのですから、辛く惨めな思いをしながら生きるのはしんどいですよね。
働かなくても良いぐらい財産があれば別ですが、大半の人は財産なんてたかが知れています。
やはり生活保護がおすすめです。おわり
猫でもわかる for Civic Tech

この記事は[Code for CATアドベントカレンダー2018](https://qiita.com/advent-calendar/2018/codeforcat)の22日め、いわゆる22（ニャンニャン）日にこれを書いている。
![45633462_2198683763475519_6495848940951306240_n.png](https://qiita-image-store.s3.amazonaws.com/0/45780/296c6631-8932-daf1-8455-294ec6a7251a.png)

自己紹介）本業は広告のアートディレクションやWeb・アプリサービスのUI/UXカイゼンといったところで、クライアント企業からのお題でドラフトを描いたり、ワイヤーフレームや実行デザインでの成果物担当。業務でほとんどコードは書かず。

シビックテックに関連の最初のきっかけは、2014年に福島県浪江町主催[「浪江町住民のタブレット活用を考えるハッカソン」](https://codeforjapan.doorkeeper.jp/events/11114)に参加し、チームでプロトタイプを作る機会があった（UIとgifアニ担当）。完成度はさておき、エンジニアさんとモノやサービスを作り上げるスピード重視の圧縮された時間が忘れられない経験に。ただ役割分担して作るだけではなくて課題についての議論や共有が重要であると思っている。

そんな可能性を感じていながら、ブリゲードの地域属性に悩んでいたところ、なんと地域カテゴリでない“猫好き”という要素がひっかかってきた。（ふだん道を歩いていても、自装の猫センサーにひっかかってしまう猫は少なくないので、そこは自覚している。）

##地域猫のためにできること
**“Code for CAT”は、地域猫を地域の資産であると捉え、殺処分（収容数）ゼロを目指している団体の活動を支援するために、IT技術を活用した、持続可能な仕組みを開発し、継続的な支援を行っていきます。**

さて、困ったぞ。Civic Techの “Tech”のハナシについていくために猫の手を借りるとしよう。少しは習ったことのあるオブジェクト指向のおさらいだ。

##猫本のお告げ

[猫でもわかるC#プログラミング 第3版](https://www.amazon.co.jp/dp/4797385634/ref=cm_sw_r_cp_ep_dp_0zsiCbG8M108W)
![51fE7qKU5hL._SX343_BO1,204,203,200_.jpg](https://qiita-image-store.s3.amazonaws.com/0/45780/4622b6d5-932d-6587-174e-8b65701b6689.jpeg)
ちなみに「サルでもわかる」「ハトでもわかる」という技術書もググると検出される。「猫でもわかる」の何が優れているかというと、オブジェクト指向の解説でにおいて出てくるデータの塊を、なんでも「猫」にたとえているところがサイコーだ！！！個体ごとに顔つき、毛の色、体重ボリュームといった特性(instance)があるので、オブジェクト名で括ると１個体でデータがまとまって扱いやすい（図１）。ニャーと鳴く、おしっこする、じゃれるなどどんな振舞いをするか、(operation)もオブジェクトに括ることができる。
![catobject.png](https://qiita-image-store.s3.amazonaws.com/0/45780/7db73af4-6336-f119-335a-f52502441991.png)
図１）

*何のためにオブジェクト指向があり、どのように使うのか？*についてはQiitaを引くとごまんと記事がでてくるので詳しくは書かない（書けない）。あくまで説明のひとナメにすぎぬが、３匹の友猫にご登場いただき「猫にもわかる」改め**「猫なら分かる」**ではないだろうかー。
##Code for つづく
SQLの種類とデータの追加・取り出し

今週はSQLを勉強しました。
SQLの種類とデータの取り出しについてご紹介します。

###SQL
SQL（Structured Query Language）は、データベースを操作する言語です。
SQLは、DDL、DML、DCLの3種類に大別できます。

#####DDL
DDL(Data Definition Language)は、データベースの生成や削除、変更を行うコマンドです。


#####DML
DML(Data Manipulation Language)は、データベースのテーブルに対して、データの取得、追加、更新、削除を行うコマンドです。

#####DCL
DCL(Data Control Language)は、データベースのユーザー権限の管理や、データのトランザクション（処理のまとまり）の制御を行うコマンドです。


####データベースの生成

自動連番ID、商品名(文)、個数(整数)が入った商品データベースを作成します。

```
CREATE TABLE shouhin (
  id INT PRIMARY KEY AUTO_INGREMENT,
  name TEXT NOT NULL,
  count INT  NOT NULL,
);
```

| id      |       name |    count  |
|:-----------------|------------------:|:------------------:|

このような、列のみでデータが1つも入っていないテーブルがつくられます。

####データの追加・確認

```
INSERT INTO shouhin(name, count)
VALUE('みかん',　100), ('ぶどう', '20'), ('いちご', '50');
SELECT * FROM shouhin;
```

| id      |       name |    count|
|:-----------------|------------------:|:------------------:|
| 1         |              みかん |        100       |
| 2         |            ぶどう |       20       |
|3             |              いちご |        50        |

#####条件を指定して検索

個数が30以上のデータを取り出します。

```
SELECT *　FROM　shouhin WHERE count >= 30;
```

| id      |       name |    count|
|:-----------------|------------------:|:------------------:|
| 1         |              みかん |        100       |
| 3         |           いちご |       50     |



#####サブクエリ
SELECT文をWHERE内で使った場合のSELECT文をサブクエリといいます。
例えば、個数が最も多い商品名を表示します。

```
SELECT name FROM shouhin WHERE count =  
(SELECT MAX(count)　FROM shouhin;
```

ご覧いただきありがとうございました。
過去の難案件 Tronのリプレイスの独自OS作成

#はじまり
知人から あんたOS作れるよね？
小さなOS開発してる案件があるんだけど　やらない？
大丈夫　専門の社員がいて、そのお手伝いだから
C言語できるよね？

単価も悪くないし、組み込み系もやってみたかったので OKした

#背景
知人とはネットゲームで知り合った友達だ
不思議なことに私はネットゲーム上で仕事をもらうことが多々ある
最大手車メーカーのネットワーク管理をしているという知り合いから仕事もらったこともあるし
知人と知り合った当時　私は趣味でカーネルを作っていた
といっても ブートストラップして 16ビットプロテクトモードにジャンプし 32ビットモードにジャンプし
あとはデバイスドライバが手に入らず　VGAで色々と表示したり、マルチタスクを最低限実装したりメモリや割り込み
ホントお遊びOSであるが
その話を真に受けて OS開発者として呼ばれた

ぶっちゃけ　下記の本を読んでそのまま実装すればいいのだ

https://www.amazon.co.jp/%E8%A9%B3%E8%A7%A3-Linux%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB-%E7%AC%AC3%E7%89%88-Daniel-Bovet/dp/487311313X/ref=sr_1_1?ie=UTF8&qid=1546186293&sr=8-1&keywords=LINUX%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB

#現場
実際に現場にいった。某 組み込み機器の最大手の大きな会社のプロジェクトだった
今まではTronOSで作っていたが、時代が複雑になり
6連装CDチェンジャー、データ焼く人が増えたからCD-DA以外にも対応してね
ディスクアットワンス以外も マルチセッション、パケットライトにも対応してね
Wav以外にもmp3、wmaにも対応してね・・・
ハードディスク内蔵。フォーマットはEXT4で・・

TronはリアルタイムOSとして素晴らしいのだけど弱点として
上記のような複雑な処理が得意ではなかった

じゃあ　自分たちでOS作ろう！あわよくば組み込みOSのシェアを取ろう！とろんからとろう！

というノリでスタートしたプロジェクトである（私ならTronに拡張してプロジェクトに貢献するんだが・・・）


#実際
CPU型番はいわないが　16ビットのよくある組込み用CPUだった
どこまで出来ているのか聞いたら　まだ開発に入れてません　とのことだった
試作コードをみたら I/Oポートに対して データをIN/OUTしているだけで
デバイスの初期化、最低限の動作をしたのみで、カーネルらしきものは何もなかった

しかし最大の問題はそこではなかった

本来は自社OSが完成間近で、それを見越して OSを使ったアプリケーションチームが3ヶ月後にやってきて
開発が始まり
15ヶ月後には 製品が完成するはずであった

OSが完成しない！ アプリケーションチームが仕事出来なくなる！！

#裏技の発明
OS開発チームには1名 メカレベルが理解できる人がいて　あとは雑魚だった
が、私と彼の2名で頑張っても、3ヶ月でアプリケーション開発開始に持っていく事は出来ない
みんな諦めていたところ

>先にエミュつくろうぜ！

との私の発言で 3ヶ月でエミュを作った。
APIの設計はなんとか終わっていたからだ。

そしてそのエミュは、本番OSのテストにも利用されることになったし
アプリケーションのデバッグにも利用され、かなり有用であった

#カーネル作ろうぜ！
エミュを作り　とりあえずの開発が進まないというピンチは切り抜けたが
スケジュールが1年ちかく押してる事は変わらない
あと半年でカーネル完成させなければ　実機テストに入れない

ので　急ピッチで開発がはじまった

その大手メーカーでは　厳しいカースト制がひかれていて
役員は　屋根付きの駐車場に停められる、大きな個室とフカフカの椅子が与えられ
社員は 会社の前の駐車場にとめられる（新入社員は離れた駐車場） 駅からマイクロバスも利用可能。エアコンのきいた建物に明るい照明、普通の机椅子が与えられ
外注は　車通勤不可。マイクロバス乗車拒否 歩いてこい。エアコンの聞かないプレハブで　電気も暗く 安いクッションのない椅子に 電子レンジや給湯使用不可能

私は外注で入ったが　社内のカーネルチームだったので
社員と同じ環境で開発が出来た
また　マイクロバスに乗車するのも許された

そこでタスクを切って作業開始した
##タスク管理、割り込み
もともとRTOSを前提としたシステムである
が、タイムスライシングを基本としたシステムも考えたが
用途を考え、あまりマルチタスクで行う必要がなく
協調性マルチタスクをベースにすることにした
割り込み必要タスクは タイマーなりI/Oの割り込みにより、最優先でタスクスイッチる
一般的なタスクは 1秒だかかなり大きな時間専有可能（自主的に開放）
ぶっちゃけ 組み込み系なので　シングルタスクなので　このぐらいで大丈夫

##メモリ管理
やはりBuddyアロケータを使った。ほんとこれは簡単で速くてすばらしい

##I/O管理＆DMA
DMA関連は作らざるを得なかったが
I/Oの泥臭い部分は　単純にマンパワーでなんとかなるので
能力の足りない人たちに割り振った

##フォーマット
ファイルフォーマット関連は　もうひとりの優秀エンジニアに作ってもらった
CDや読み込みファイルは デバイスの機能として対応してくれたので（メーカー様マジ感謝）
なんとかなった
（これがなんとかなるなら　Tronでよかったんじゃないか・・）

#OS完成
なんとかギリギリでOSをリリースすることができた
OSといっても　カーネルむき出しなんだけどね

#趣味OSと比べて
趣味OSは80686なのでCPUにプロテクトモードがありセグメンテーション ページングがあるが、それらがなく16ビットモードで動くので非常に楽だった
プロテクトモードもあるが今回は使わなかったので非常に楽

趣味OSはちゃんとしたマルチタスクでタスクディスパッチを行っていたが
協調性マルチタスクなので　そのあたりが非常に楽

趣味OSには画面出力、コンソール入力、簡単なシェル　とあったが、それらがないので圧倒的余裕
wxPythonでテキスト入力を取得するGUIを作る

# 目的
wxPythonモジュールを用いてテキスト入力を受け付けるウィンドウを作る。

**作者はwxPython歴1時間強なので最適な手法であることは保証しない**

## 真の目的（）
- Python3では`input()`を用いればコマンドラインからユーザのテキスト入力を受けられる。
- ところがPython2ではこれは`input_raw()`という関数でなくてはいけない。

Python2系でもPython3系でも使えるGUIのテキスト取得手法がほしいなぁという背景があったりした。


# ソースコード
`TextCtrl`というWidgetがあるらしいが，公式の[Wiki？](http://zetcode.com/wxpython/dialogs/)に使い方の説明がなかったのでノリで書いた。

[Reference](https://wxpython.org/Phoenix/docs/html/wx.TextCtrl.html)はある。あるがこれだと経験1時間の初心者では組み方のイメージがわかない。

なんやかんやあってClass実装だがこんな感じにできた。
以下の記事さんのおかげで大変助かりました。ありがとうございました。
https://nippori30.hatenablog.com/entry/2017/09/24/220000

```Python
import wx


class GUIinput:
    def __init__(self):
        self.frame = wx.Frame(None, -1, "textbox")
        self.frame.SetTitle('Write Text Here')
        panel_ui = wx.Panel(self.frame, -1, pos=(50, 50), size=(100, 50)) 

        # message
        self.frame.label = wx.StaticText(panel_ui, -1, 'Write some message here', pos=(10, 10))
        # text box
        self.frame.box = wx.TextCtrl(panel_ui, -1, pos=(10, 30),style=wx.TE_PROCESS_ENTER)
        self.frame.box.Bind(wx.EVT_TEXT_ENTER, self.Clicked) #text enter

        # button        
        btn = wx.Button(panel_ui, -1, 'OK', pos=(10, 60))
        btn.Bind(wx.EVT_BUTTON, self.Clicked)

        self.frame.Show(True)
    
    def Clicked(self,event):
        self.text = self.frame.box.GetValue()
        self.frame.Close(True)


app = wx.App()
frame = GUIinput()
app.SetTopWindow(frame.frame)
app.MainLoop()

print(frame.text)
```
## 見た目

なんかサイズ指定とか位置指定がガバイ。

Objectの高さの間隔は大体20~30pixでやればいいと思う。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/188863/0b062fa2-1834-5198-d32c-f8063909ab57.png)

## 疑問

- クラス実装じゃなきゃダメなのか
- もっと簡単にできないのか
- GUI手動で配置できないのか…
AWS 認定 Big Data - Specialty に合格しました(2018/12)

# はじめに

周りにSAPro保有者が増えてきたので、
ちょっと違うものでも取ろうかなという受験動機で申し込み、無事合格できました。
本試験に関してあまり記事もないので、いくつかの情報をシェアしようと思います。

なお、試験時間は170分で65問に回答、
2018年12月時点で模擬試験の提供は無し(これが本当に辛い！！)、という試験条件でした。

最終的に点数の内訳はこういった感じでした。
62%でも合格になるのですね。(だいぶギリギリ・・・)

総合成績： 62%

分野別の成績 :
1.0  Collection: 50%
2.0  Storage: 77%
3.0  Processing: 37%
4.0  Analysis: 62%
5.0  Visualization: 85%
6.0  Data Security: 60%

# 現状

AWS歴4年ちょい。

保有資格は下記＋ベンダ系をちょこちょこ
- ソリューションアーキテクト プロフェッショナル
- DevOpsエンジニア プロフェッショナル

普段の仕事は、中〜大規模Webのアーキテクト & インフラエンジニア

Bigdata系でいうと、Redshiftはそれなりに触ったことあり、
Athenaはログ解析でよく使う、QuickSightとESSは触ったことなし、
DynamoDBはそれなりに、Kinesis/EMRはほぼノータッチという感じです。

# やったこと

1. [試験ガイド](https://d1.awsstatic.com/training-and-certification/docs-bigdata-spec/AWS%20Certified%20Big%20Data%20-%20Specialty%20Exam%20Guide%20000%20v1.2%20JPN.pdf) の斜め読み  
→抽象的すぎてほぼよくわからず
2. サンプル問題の消化  
→なんだかんだで50%くらいの正答率、焦りを感じる
3. 試験ガイド内のリンクを回遊  
→ **[このページ](https://aws.amazon.com/training/course-descriptions/bigdata/)** でやっと関連ソリューションのキーワードを発見  
4. BlackBeltを読む  
→年末の色々を言い訳にKinesis分しか読めず・・・
5. 当日を迎える  

最終的に学習に費やせたのは3~4時間だと思います。

勉強しようと息巻いてCloudGuruも契約したのですが、
最初のTutorial以降進める時間を確保できず・・・
$30を無駄にしました。(先ほど解約しました)

# 所感

NDAがあるので詳細には触れられませんが、
概ね試験ガイドに関連するキーワードが満遍なく出題されていたように思います。

結果の内訳を見るとDataProcessingの正答率が低かったです。

BigDataにおいては、**「データ投入→一時蓄積→加工→最終蓄積→分析」**が基本となります。

自分は、「**一時蓄積→加工**」部分について、
**"何をトリガに" ・ "誰が処理する"** あたりのデザインパターンの理解が
圧倒的に足りていなかったように思いました。


試験ガイドだけ見ると、「抽象的すぎてよくわからん！」となると思いますが、
関連リンクまでしっかり読みこんで備えれば、きっと合格につながると思います。
特に、**各ソリューションを使った場合のデザインパターン**は、
なるべく多く頭に入れておいたほうがよさそうです。

また、ソリューションアーキテクト プロフェッショナルをお持ちの場合は、
オーバーラップする箇所がそれなりにあるので、学習コストは低いように思います。

受験される方の何らかの力になれば幸いです。
intellijでRemoteデバッグ

# 背景
JavaのRemoteデバッグの仕方をずっと知らなかった


# 解決!!

## リモートで以下のコマンドでJavaを実行

```
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8888 -jar your.jar
```


## ローカルのintellijの設定

Edit Configurationから上記で指定したポートとhostを書く(この場合は`8888`)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/7059/5b5c6874-e6a7-e066-7f79-e68a93e9411f.png)


# デバッグ
ブレイクポイントをintellij上で設定して(RemoteではしらせるJavaと同じコードがintellij上にも必要)走らせれば、ローカルと同じようにデバッグができる！

便利！
Go の継続行

こんにちは。
Go では下記の文字が行末ならば継続行として解釈してくれます。

- カンマ
- ```=``` や ```+``` などの演算子
- opening parenthesis or brace or bracket

####応用
応用例として下記では行末の closing brace を継続行とさせる目的で、カンマを付加しています。このように最終要素の後ろに冗長なカンマの付加が許されます。

```go
worker := makeWorker(
		func(x T) {
			...
		},
	)
```
さもないと ```syntax error: unexpected newline, expecting comma or )``` というエラーとなります。
エクセルでファイルを開いたときに自作のリボンのタブをアクティブにする

# やりたいこと
エクセルのリボンに自作のタブを追加し、ファイルを開いたときにアクティブなシートに対応したタブをアクティブにしたい。
例）アクティブシートがAの時はタブAを、Bの時はタブBをアクティブにする

# 結論
スレッドを使って非同期にウェイトをいれた後、対応するタブをアクティブにする

# 試したこと
関連しそうなイベントとしては、
- ThisWorkbook#Open
- Ribbon#Load
- WorkSheet#Activate
があった。

「WorkSheet#Activate」は、ファイルのオープン時にはそもそも発生しないので除外。
「ThisWorkbook#Open」発生時はリボンがまだ登録されていないのでダメ。
「Ribbon#Load」がよさそうですが、このタイミングでもまだリボンが生成されていないようで失敗。
リボンのLoadが完了したときに発生するイベントがあればいいのだけど、どうもないみたい。

しょうがないので、非同期で、登録が終わったころに目的のタブをアクティブにするようにしたところ、無事動いた。

# コード
```C#
using System.Threading.Tasks;

namespace MyApp
{
  public partial class MyRibbon
  {
    private void MyRibbon_Load(object sender, RibbonUIEventArgs e)
    {
      ActivateTabAsync();
    }
    private async void ActivateTabAsync()
    {
      // 適当なウェイトかける
      await Task.Delay(500);
      var sheet = (Excel.Worksheet)Globals.ThisWorkbook.ActiveSheet;
      if (sheet.Index == Globals.SheetA.Index)
      {
        RibbonUI.ActivateTab("tabA");
      }
      else if (sheet.Index == Globals.SheetB.Index)
      {
        RibbonUI.ActivateTab("tabB");
      }
    }
  }
}
```


# 環境
- Excel 2010
- C# 4.0.0.0
- .NET Framework 4.5.2
データをサーバー側に配置する-Express MongoDB を使って簡単なアプリを作る

##クロス投稿に切り替え
次回からは、Qrunch側のみにUpする予定でしたが、アクセス数がだいぶ違うので　私のモチベーションUPの為に、今回もクロス投稿に切り替えました。(笑)

## 前回の記事
[Express MongoDB を使って簡単なアプリを作る](https://atoris1192.qrunch.io/entries/p3XkCjD0PH3r9iFs)
前回の記事で、おみくじが引けるようになったのですが、改ざんが容易に出来てしまいますので、占いの結果のみをサーバーからもらうように変更したいと思います。



サーバー側は、`routes/index.js` で作って行きます。　`main.js`で作った配列を持ってきます。

簡単に説明しますと、`/` にアクセスすると、`index.pug` を参照します。
`/api/random` にアクセスすると配列から一個値をランダムで取り出し,`json`形式で値を返します。



```js
var express = require('express');
var router = express.Router();

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { title: 'Express' });
});
router.get('/api/random', (req, res, next) => {
  const items = [ '大吉', '中吉', '末吉', '凶']
  const random = Math.floor(Math.random()*items.length)
  const item = {
    item: items[random]
  }
  res.json(item)
})

module.exports = router;
```
---
ブラウザーのURL欄から、アクセスしてみます。

<img width="423" alt="27-1.png" src="https://qiita-image-store.s3.amazonaws.com/0/131175/6dc317f1-baef-c249-d976-fecec3338c68.png">


リロードをすると、値がランダムに変わるので、これをフロント側で取得すれば良さそうです。

`/api/random`の値を取得をするには、httpリクエストを扱える`fetch`を使います。

`fetch`を使って`/api/random`にアクセスすると返り値は、プロミス値として返ってきます。具体的には、正常なら`then`にエラーなら`catch`に返ってきます。　`then`のデータは、数珠つなぎで処理を渡していけます。
`fetch`については、[別の記事](https://atoris1192.qrunch.io/entries/QvscpqrBoG0mxmZ6)で紹介していますので、よければ見ていってください。

---

`javascripts/main.js`

```js

document.addEventListener('DOMContentLoaded', () => {
  'use strict'

  const btn = document.querySelector('#btn')

  btn.addEventListener('click', () => {
    // const items = [ '大吉', '中吉', '末吉', '凶']
    // const random = Math.floor(Math.random()*items.length)
    // btn.textContent = items[random]

    const url = 'http://localhost:3000/api/random'
    fetch(url)
      .then(res => {
        return res.json()
      })
      .then(result => {
        btn.textContent = result.item
        console.log(result.item)
      })
      .catch(err => {
        console.error(err)
      })
  })
})
```

サーバー側で、json形式で投げていますが、`fetch`で受けると、`json`データ以外のデータも渡ってきますので、改めてレスポンスを`res.json()`で必要なデータを取得しています。
このデータは、サーバー側から取得していますので、デベロッパーツールでの改ざんは出来ません。

今回は、ここまでにしたいと思います。
次回は、MongoDBにデータをいれて、データを操作できるようにしたいと思います。

`MongoDB`は、すでに使える前提ですので、まだの場合検索してインストールをしていただければと思います。

## ここまでのコード
コミット: step2.0
コードは、`github`にもupしていますので、うまく動かない方は覗いてみてください。`https://github.com/atoris1192/omikujiExpress2`

```sh
git reset --hard e0ce2a91e2e2f
git pull origin master
git reset --hard e87b2fc88c47
```
【Googleログイン自動化】Python×seleniumでGoogleにログインする

#はじめに

WebスクレイピングやWebクロールで、ログイン処理を自動化したい人向けです。
ここでは、Googleアカウントのログインの自動化について取り上げます。

#環境

- MacOS High Sierra 10.13.4
- Python 3.7.1
- chromedriver 2.45

#準備
- **chromedriver**は[こちら](http://chromedriver.chromium.org/downloads)からダウンロードします。
（Windowsの場合、ファイル名は**chromedriver.exe**となります。）

- Pythonファイルと**chromedriver**は、同じフォルダ内に置きます。
（同じフォルダに置きたくない場合は、PATHを通すやり方もあります。）

##seleniumのインストール

ターミナル上で`pip`を実行し、**selenium**をインストールします。
※Windowsの場合は、コマンドプロンプト上で実行。

```python:
# 当方のMac
pip3 install selenium
# Windows
pip install selenium
```

#プログラミング

```python:test.py
import time
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

def start_chrome():
    # chromedriverのPATHを指定（Pythonファイルと同じフォルダの場合）
    driver_path = './chromedriver'

    # Chrome起動
    #driver = webdriver.Chrome(driver_path)
    driver = webdriver.Chrome(executable_path=driver_path)
    driver.maximize_window() # 画面サイズ最大化

    # GoogleログインURL
    url = 'https://www.google.com/accounts?hl=ja-JP'
    driver.get(url)

    return driver

def login_google(driver):

    #ログイン情報
    login_id = "【GoogleアカウントのログインID（メールアドレス）を入力してください。】"
    login_pw = "【Googleアカウントのパスワードを入力してください。】"

    #最大待機時間（秒）
    wait_time = 30

    ### IDを入力
    login_id_xpath = '//*[@id="identifierNext"]'
    # xpathの要素が見つかるまで待機します。
    WebDriverWait(driver, wait_time).until(EC.presence_of_element_located((By.XPATH, login_id_xpath)))
    driver.find_element_by_name("identifier").send_keys(login_id)
    driver.find_element_by_xpath(login_id_xpath).click()

    ### パスワードを入力
    login_pw_xpath = '//*[@id="passwordNext"]'
    # xpathの要素が見つかるまで待機します。
    WebDriverWait(driver, wait_time).until(EC.presence_of_element_located((By.XPATH, login_pw_xpath)))
    driver.find_element_by_name("password").send_keys(login_pw)
    time.sleep(1) # クリックされずに処理が終わるのを防ぐために追加。
    driver.find_element_by_xpath(login_pw_xpath).click()

if __name__ == '__main__':
    # Chromeを起動
    driver = start_chrome()

    # Googleにログイン
    login_google(driver)
```

#実行
それぞれの環境でPythonファイルを実行してください。
（例）
Mac：ターミナル etc.
Windows：コマンドプロンプト、IDLE、etc.

#解説

ほぼ、コメントに書いてある通りです。

IDとパスワードを入力するテキストボックスの要素は、それぞれの**name**要素を指定してます。
「次へ」のボタンの要素はxpathを指定してクリックしてます。

`WebDriverWait`を使うことで、指定したxpathが画面に表示されるまで待機させます。

ですが、パスワードのクリックがなぜかうまくいきませんでした。
なので、仕方なく、`time.sleep(1)`を入れたという次第です。

#結果

Pythonファイルを実行後、自動でGoogleアカウントでログインできればOKです。

#参考

[python × seleniumでID/PASS入力必要な画面に自動ログインしてみた](https://qiita.com/shota-nekoneko/items/64bbd0c2f534d20e7b77)

#著者のプログラミングスキル
- 2018年9月からPython独学スタート。
- Pythonを使った個人開発（スクレイピング・クロール系）がメイン。
- PHP, GAS, Amazon MWSAPI, Webフレームワーク、サーバー周りも勉強中。
gemの依存関係ネットワークを描画してみた

gemの依存関係を描画してみた。ひとまず画像だけ貼っておく。

----

記事を見た方へ
データの準備、描画方法の解説、さらに細分化した各クラスタの解説等は、需要があれば書きます。もし気になる方がいましたらコメント欄にてご連絡ください。

----

まずは全体図。4つほど主要なクラスタがあることが分かる。

![スクリーンショット 2018-12-26 23.53.44.png](https://qiita-image-store.s3.amazonaws.com/0/33011/c23ff450-6a64-f4d0-b75f-6bbdc8d54388.png)

左から2つめの大きいクラスタを拡大してみた図。activerecordが目立つのは分かるが、他が何なのかは密集しすぎていてよく分からない。さらに分解してみる。

![スクリーンショット 2018-12-26 23.56.20.png](https://qiita-image-store.s3.amazonaws.com/0/33011/7cff9c94-c46a-b675-5155-db4a03439b63.png)

分解した結果、xxx_railsクラスタ、activerecordクラスタ、rspec_railsクラスタがあることが分かる。

![スクリーンショット 2018-12-26 23.57.40.png](https://qiita-image-store.s3.amazonaws.com/0/33011/cbee7ffe-0cae-7da0-e439-4b39325425fb.png)

全然大したことやってないけど、今回はここまで。

## 参考リンク

- [Cytoscape](https://cytoscape.org/)
- [Libraries.io Open Data](https://libraries.io/data)
Apache Solr 7.6 + SolrJ で形態素解析の詳しい結果を取得する（英語）

# 概要

自然言語処理の結果を管理コンソールで見る方法は多く紹介されているが、Javaでコールする方法が見つからなかったので調べました。
管理コンソールではAnalysisのページでVerbose Outputとすると同様の結果を得られます。

# コード

```java
package hello.solr;

import java.util.ArrayList;
import java.util.HashMap;

import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
import org.apache.solr.client.solrj.request.DocumentAnalysisRequest;
import org.apache.solr.common.SolrInputDocument;
import org.apache.solr.common.SolrInputField;
import org.apache.solr.common.util.NamedList;
import org.apache.solr.common.util.SimpleOrderedMap;

public class HelloAnalysisEnglishSimple {

	@SuppressWarnings({ "unchecked", "rawtypes" })
	static public void main(String[] args) throws Exception {

		String fieldName = "field_text_opennlp";
		String coreName = "core_nlp";
		String text = "Hello, I'm a data engineer of Nissan Motor.";

		HashMap<String, SolrInputField> fields = new HashMap<String, SolrInputField>();

		// Document
		SolrInputDocument doc = new SolrInputDocument(fields);
		{
			// Document Field
			doc.setField("id", "0");
			doc.setField(fieldName, text);
		}

		// Request
		DocumentAnalysisRequest request = new DocumentAnalysisRequest();
		request.addDocument(doc);

		String solrLocation = "http://localhost:8983/solr/" + coreName;

		// NLP Client
		SolrClient client = new HttpSolrClient.Builder(solrLocation).build();

		// NLP Response
		NamedList<Object> response = client.request(request);

		// Get analysis response
		NamedList<Object> analysis = (NamedList<Object>) response
				.get("analysis");

		SimpleOrderedMap f = ((SimpleOrderedMap) ((SimpleOrderedMap) analysis
				.getVal(0)).get(fieldName));

		SimpleOrderedMap index = (SimpleOrderedMap) f.get("index");

		NamedList nlpResult = (NamedList) index.getVal(0);

		ArrayList wordListPOS = (ArrayList) nlpResult
				.get("org.apache.lucene.analysis.opennlp.OpenNLPPOSFilter");

		for (int n = 0; n < wordListPOS.size(); n++) {
			SimpleOrderedMap wordPOS = (SimpleOrderedMap) wordListPOS.get(n);
			System.err.println("text='" + wordPOS.get("text") + "',type='"
					+ wordPOS.get("type") + "'");
		}

	}
}
```

#結果

```
text='Hello',type='UH'
text=',',type=','
text='I',type='PRP'
text=''m',type='VBP'
text='a',type='DT'
text='data',type='NN'
text='engineer',type='NN'
text='of',type='IN'
text='Nissan',type='NNP'
text='Motor',type='NNP'
text='.',type='.'
```

### 補足
Typeの値については以下を参照。
https://www.ibm.com/support/knowledgecenter/ja/SS5RWK_3.5.0/com.ibm.discovery.es.ta.doc/iiysspostagset.htm
Pythonでreadlines()は本当に全行を一度に読み込むのか確認してみた

readlines()は全体を読むらしいので確認してみる。
メモリ使用量を確認すればすぐわかる。

# 実験

まずは1GBのファイルを作成

```pl:make_dummy.pl
#!/usr/bin/perl
use strict;
use warnings;

open my $fh, '>', 'dummy.dat';
for (1..1024*1024) {
        print $fh 'x' x 1023 . "\n"
}
close $fh;
```

```py:read_dummy.py
#!/usr/bin/python36
# vim: set expandtab ts=4 :

counter = 0
with open('dummy.dat', mode='r') as f:
    if 1:
        for line in f: # 一行ずつ読む
            tmp = line
            counter += 1
    if 0:
        for line in f.readlines(): # 全行読み込んでから一行ずつ
            tmp = line
            counter +=1

print("counter={}".format(counter))
```

# 結果

```
// for line in f:の場合
/usr/bin/time -f "\n%M" ./read_dummy.py
counter=1048576
5744

// for line in f.readlines():の場合
/usr/bin/time -f "\n%M" ./read_dummy.py
counter=1048576
845092     ←　巨大！
```

# 結論

大きなファイルを読むときはreadlines()は使わないようにしましょう。


# 参考

[Pythonでファイルを一行ずつ読み込む \- Qiita](https://qiita.com/ymko/items/835083617e527c14521e)

[Pythonでファイルを読み込むスマートなやり方 \- oinume journal](https://oinume.hatenablog.com/entry/wp/418)
>fileが\_\_iter__()とnext()を実装しているおかげ。詳しくはPEP-234に詳しく書いてある。 

[プロセスが使ったメモリー量を調べる \- Qiita](https://qiita.com/ymko/items/de0ee7b6607fc7892d5d)